[SCSI] qla2xxx: Add VPD sysfs attribute.
authorandrew.vasquez@qlogic.com <andrew.vasquez@qlogic.com>
Thu, 9 Mar 2006 22:27:34 +0000 (14:27 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sun, 12 Mar 2006 15:39:55 +0000 (09:39 -0600)
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_fw.h
drivers/scsi/qla2xxx/qla_init.c

index 2b9e329a240c33ee3fab0fbf97bcfada51b26c7f..488b3d16427bc5af9140df6b9e77ee73120f5805 100644 (file)
@@ -308,6 +308,61 @@ static struct bin_attribute sysfs_optrom_ctl_attr = {
        .write = qla2x00_sysfs_write_optrom_ctl,
 };
 
+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;
+
+       if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))
+               return -ENOTSUPP;
+
+       /* 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;
+
+       if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))
+               return -ENOTSUPP;
+
+       /* 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,
+};
+
 void
 qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha)
 {
@@ -318,6 +373,7 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha)
        sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr);
        sysfs_create_bin_file(&host->shost_gendev.kobj,
            &sysfs_optrom_ctl_attr);
+       sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_vpd_attr);
 }
 
 void
@@ -330,6 +386,7 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha)
        sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr);
        sysfs_remove_bin_file(&host->shost_gendev.kobj,
            &sysfs_optrom_ctl_attr);
+       sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_vpd_attr);
 
        if (ha->beacon_blink_led == 1)
                ha->isp_ops.beacon_off(ha);
index e1a7769008eef0338d81e663e75c5b1b1bb495cf..20798f93d8da4b9ac68f4415ea103cc47f337bed 100644 (file)
@@ -2344,6 +2344,8 @@ typedef struct scsi_qla_host {
        /* NVRAM configuration data */
        uint16_t        nvram_size;
        uint16_t        nvram_base;
+       uint16_t        vpd_size;
+       uint16_t        vpd_base;
 
        uint16_t        loop_reset_delay;
        uint8_t         retry_count;
index 9fb562aa4acce62382b1ec1e6d18c9014def9312..1ee58ad2f4ddc0a1729def96f0c2a538c799a35a 100644 (file)
@@ -759,7 +759,7 @@ struct device_reg_24xx {
 #define FA_NVRAM_FUNC0_ADDR    0x80
 #define FA_NVRAM_FUNC1_ADDR    0x180
 
-#define FA_NVRAM_VPD_SIZE      0x80
+#define FA_NVRAM_VPD_SIZE      0x200
 #define FA_NVRAM_VPD0_ADDR     0x00
 #define FA_NVRAM_VPD1_ADDR     0x100
                                        /*
index 3bc3e1749f32781714015a6bfbb983f7c5636997..71b6bcc181f9a12cdc95a8adc06e58d278b1ecb4 100644 (file)
@@ -3263,8 +3263,12 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        /* Determine NVRAM starting address. */
        ha->nvram_size = sizeof(struct nvram_24xx);
        ha->nvram_base = FA_NVRAM_FUNC0_ADDR;
-       if (PCI_FUNC(ha->pdev->devfn))
+       ha->vpd_size = FA_NVRAM_VPD_SIZE;
+       ha->vpd_base = FA_NVRAM_VPD0_ADDR;
+       if (PCI_FUNC(ha->pdev->devfn)) {
                ha->nvram_base = FA_NVRAM_FUNC1_ADDR;
+               ha->vpd_base = FA_NVRAM_VPD1_ADDR;
+       }
 
        /* Get NVRAM data and calculate checksum. */
        dptr = (uint32_t *)nv;