]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/qla2xxx/qla_attr.c
[SCSI] qla2xxx: Refactor set-HBA-model/description code.
[linux-2.6-omap-h63xx.git] / drivers / scsi / qla2xxx / qla_attr.c
index ee75a71f3c6608be7a4eb314284e127c6f999d03..78a5867bf515ba81d9db63b01c212901d66d5200 100644 (file)
@@ -379,21 +379,37 @@ static struct bin_attribute sysfs_sfp_attr = {
        .read = qla2x00_sysfs_read_sfp,
 };
 
+static struct sysfs_entry {
+       char *name;
+       struct bin_attribute *attr;
+       int is4GBp_only;
+} bin_file_entries[] = {
+       { "fw_dump", &sysfs_fw_dump_attr, },
+       { "nvram", &sysfs_nvram_attr, },
+       { "optrom", &sysfs_optrom_attr, },
+       { "optrom_ctl", &sysfs_optrom_ctl_attr, },
+       { "vpd", &sysfs_vpd_attr, 1 },
+       { "sfp", &sysfs_sfp_attr, 1 },
+       { NULL },
+};
+
 void
 qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha)
 {
        struct Scsi_Host *host = ha->host;
+       struct sysfs_entry *iter;
+       int ret;
 
-       sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
-       sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
-       sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr);
-       sysfs_create_bin_file(&host->shost_gendev.kobj,
-           &sysfs_optrom_ctl_attr);
-       if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
-               sysfs_create_bin_file(&host->shost_gendev.kobj,
-                   &sysfs_vpd_attr);
-               sysfs_create_bin_file(&host->shost_gendev.kobj,
-                   &sysfs_sfp_attr);
+       for (iter = bin_file_entries; iter->name; iter++) {
+               if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)))
+                       continue;
+
+               ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
+                   iter->attr);
+               if (ret)
+                       qla_printk(KERN_INFO, ha,
+                           "Unable to create sysfs %s binary attribute "
+                           "(%d).\n", iter->name, ret);
        }
 }
 
@@ -401,17 +417,14 @@ void
 qla2x00_free_sysfs_attr(scsi_qla_host_t *ha)
 {
        struct Scsi_Host *host = ha->host;
+       struct sysfs_entry *iter;
+
+       for (iter = bin_file_entries; iter->name; iter++) {
+               if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)))
+                       continue;
 
-       sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr);
-       sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
-       sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr);
-       sysfs_remove_bin_file(&host->shost_gendev.kobj,
-           &sysfs_optrom_ctl_attr);
-       if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
-               sysfs_remove_bin_file(&host->shost_gendev.kobj,
-                   &sysfs_vpd_attr);
                sysfs_remove_bin_file(&host->shost_gendev.kobj,
-                   &sysfs_sfp_attr);
+                   iter->attr);
        }
 
        if (ha->beacon_blink_led == 1)
@@ -640,6 +653,43 @@ qla2x00_beacon_store(struct class_device *cdev, const char *buf,
        return count;
 }
 
+static ssize_t
+qla2x00_optrom_bios_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1],
+           ha->bios_revision[0]);
+}
+
+static ssize_t
+qla2x00_optrom_efi_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1],
+           ha->efi_revision[0]);
+}
+
+static ssize_t
+qla2x00_optrom_fcode_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1],
+           ha->fcode_revision[0]);
+}
+
+static ssize_t
+qla2x00_optrom_fw_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n",
+           ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2],
+           ha->fw_revision[3]);
+}
+
 static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show,
        NULL);
 static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
@@ -656,6 +706,14 @@ static CLASS_DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show,
     qla2x00_zio_timer_store);
 static CLASS_DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show,
     qla2x00_beacon_store);
+static CLASS_DEVICE_ATTR(optrom_bios_version, S_IRUGO,
+    qla2x00_optrom_bios_version_show, NULL);
+static CLASS_DEVICE_ATTR(optrom_efi_version, S_IRUGO,
+    qla2x00_optrom_efi_version_show, NULL);
+static CLASS_DEVICE_ATTR(optrom_fcode_version, S_IRUGO,
+    qla2x00_optrom_fcode_version_show, NULL);
+static CLASS_DEVICE_ATTR(optrom_fw_version, S_IRUGO,
+    qla2x00_optrom_fw_version_show, NULL);
 
 struct class_device_attribute *qla2x00_host_attrs[] = {
        &class_device_attr_driver_version,
@@ -670,6 +728,10 @@ struct class_device_attribute *qla2x00_host_attrs[] = {
        &class_device_attr_zio,
        &class_device_attr_zio_timer,
        &class_device_attr_beacon,
+       &class_device_attr_optrom_bios_version,
+       &class_device_attr_optrom_efi_version,
+       &class_device_attr_optrom_fcode_version,
+       &class_device_attr_optrom_fw_version,
        NULL,
 };