-static ssize_t
-qla2x00_sysfs_read_vpd(struct kobject *kobj, char *buf, loff_t off,
- size_t count)
-{
- struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
- struct device, kobj)));
- unsigned long flags;
-
- if (!capable(CAP_SYS_ADMIN) || off != 0)
- return 0;
-
- /* Read NVRAM. */
- spin_lock_irqsave(&ha->hardware_lock, flags);
- ha->isp_ops.read_nvram(ha, (uint8_t *)buf, ha->vpd_base, ha->vpd_size);
- spin_unlock_irqrestore(&ha->hardware_lock, flags);
-
- return ha->vpd_size;
-}
-
-static ssize_t
-qla2x00_sysfs_write_vpd(struct kobject *kobj, char *buf, loff_t off,
- size_t count)
-{
- struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
- struct device, kobj)));
- unsigned long flags;
-
- if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size)
- return 0;
-
- /* Write NVRAM. */
- spin_lock_irqsave(&ha->hardware_lock, flags);
- ha->isp_ops.write_nvram(ha, (uint8_t *)buf, ha->vpd_base, count);
- spin_unlock_irqrestore(&ha->hardware_lock, flags);
-
- return count;
-}
-
-static struct bin_attribute sysfs_vpd_attr = {
- .attr = {
- .name = "vpd",
- .mode = S_IRUSR | S_IWUSR,
- .owner = THIS_MODULE,
- },
- .size = 0,
- .read = qla2x00_sysfs_read_vpd,
- .write = qla2x00_sysfs_write_vpd,
-};
-
-static ssize_t
-qla2x00_sysfs_read_sfp(struct kobject *kobj, char *buf, loff_t off,
- size_t count)
-{
- struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
- struct device, kobj)));
- uint16_t iter, addr, offset;
- int rval;
-
- if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2)
- return 0;
-
- addr = 0xa0;
- for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE;
- iter++, offset += SFP_BLOCK_SIZE) {
- if (iter == 4) {
- /* Skip to next device address. */
- addr = 0xa2;
- offset = 0;
- }
-
- rval = qla2x00_read_sfp(ha, ha->sfp_data_dma, addr, offset,
- SFP_BLOCK_SIZE);
- if (rval != QLA_SUCCESS) {
- qla_printk(KERN_WARNING, ha,
- "Unable to read SFP data (%x/%x/%x).\n", rval,
- addr, offset);
- count = 0;
- break;
- }
- memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE);
- buf += SFP_BLOCK_SIZE;
- }
-
- return count;
-}
-
-static struct bin_attribute sysfs_sfp_attr = {
- .attr = {
- .name = "sfp",
- .mode = S_IRUSR | S_IWUSR,
- .owner = THIS_MODULE,
- },
- .size = SFP_DEV_SIZE * 2,
- .read = qla2x00_sysfs_read_sfp,
-};
-