[SCSI] pm80xx: Display controller BIOS version.
authorAnand Kumar Santhanam <AnandKumar.Santhanam@pmcs.com>
Wed, 18 Sep 2013 07:24:41 +0000 (12:54 +0530)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 25 Oct 2013 08:58:14 +0000 (09:58 +0100)
Signed-off-by: Anandkumar.Santhanam@pmcs.com
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/pm8001/pm8001_ctl.c
drivers/scsi/pm8001/pm8001_ctl.h

index d99f41c2ca13b927c66d34036937d3443b29f862..5a19e1930b4b48bd70e96557b2ba9f69ad72c374 100644 (file)
@@ -308,6 +308,39 @@ static ssize_t pm8001_ctl_aap_log_show(struct device *cdev,
        return str - buf;
 }
 static DEVICE_ATTR(aap_log, S_IRUGO, pm8001_ctl_aap_log_show, NULL);
+/**
+ * pm8001_ctl_bios_version_show - Bios version Display
+ * @cdev:pointer to embedded class device
+ * @buf:the buffer returned
+ * A sysfs 'read-only' shost attribute.
+ */
+static ssize_t pm8001_ctl_bios_version_show(struct device *cdev,
+       struct device_attribute *attr, char *buf)
+{
+       struct Scsi_Host *shost = class_to_shost(cdev);
+       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+       char *str = buf;
+       void *virt_addr;
+       int bios_index;
+       DECLARE_COMPLETION_ONSTACK(completion);
+       struct pm8001_ioctl_payload payload;
+
+       pm8001_ha->nvmd_completion = &completion;
+       payload.minor_function = 7;
+       payload.offset = 0;
+       payload.length = 4096;
+       payload.func_specific = kzalloc(4096, GFP_KERNEL);
+       PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload);
+       wait_for_completion(&completion);
+       virt_addr = pm8001_ha->memoryMap.region[NVMD].virt_ptr;
+       for (bios_index = BIOSOFFSET; bios_index < BIOS_OFFSET_LIMIT;
+               bios_index++)
+               str += sprintf(str, "%c",
+                       *((u8 *)((u8 *)virt_addr+bios_index)));
+       return str - buf;
+}
+static DEVICE_ATTR(bios_version, S_IRUGO, pm8001_ctl_bios_version_show, NULL);
 /**
  * pm8001_ctl_aap_log_show - IOP event log
  * @cdev: pointer to embedded class device
@@ -609,6 +642,7 @@ struct device_attribute *pm8001_host_attrs[] = {
        &dev_attr_sas_spec_support,
        &dev_attr_logging_level,
        &dev_attr_host_sas_address,
+       &dev_attr_bios_version,
        NULL,
 };
 
index 63ad4aa0c4222b0240068e7168af6f9ea79c3dd2..c6d8fdd3b9b9594679e7902a17a4a422ba7201d3 100644 (file)
@@ -45,6 +45,8 @@
 #define HEADER_LEN                     28
 #define SIZE_OFFSET                    16
 
+#define BIOSOFFSET                     56
+#define BIOS_OFFSET_LIMIT              61
 
 #define FLASH_OK                        0x000000
 #define FAIL_OPEN_BIOS_FILE             0x000100