summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_attr.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c82
1 files changed, 66 insertions, 16 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 92b3e13e906..fee0c493775 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -50,7 +50,7 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off,
ha->host_no);
vfree(ha->fw_dump_buffer);
- if (!IS_QLA24XX(ha) && !IS_QLA25XX(ha))
+ if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))
free_pages((unsigned long)ha->fw_dump,
ha->fw_dump_order);
@@ -64,7 +64,7 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off,
if ((ha->fw_dump || ha->fw_dumped) && !ha->fw_dump_reading) {
ha->fw_dump_reading = 1;
- if (IS_QLA24XX(ha) || IS_QLA25XX(ha))
+ if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
dump_size = FW_DUMP_SIZE_24XX;
else {
dump_size = FW_DUMP_SIZE_1M;
@@ -138,7 +138,7 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj, char *buf, loff_t off,
return 0;
/* Checksum NVRAM. */
- if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) {
+ if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
uint32_t *iter;
uint32_t chksum;
@@ -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);
@@ -450,9 +507,6 @@ qla2x00_zio_show(struct class_device *cdev, char *buf)
int len = 0;
switch (ha->zio_mode) {
- case QLA_ZIO_MODE_5:
- len += snprintf(buf + len, PAGE_SIZE-len, "Mode 5\n");
- break;
case QLA_ZIO_MODE_6:
len += snprintf(buf + len, PAGE_SIZE-len, "Mode 6\n");
break;
@@ -470,20 +524,16 @@ qla2x00_zio_store(struct class_device *cdev, const char *buf, size_t count)
int val = 0;
uint16_t zio_mode;
+ if (!IS_ZIO_SUPPORTED(ha))
+ return -ENOTSUPP;
+
if (sscanf(buf, "%d", &val) != 1)
return -EINVAL;
- switch (val) {
- case 1:
- zio_mode = QLA_ZIO_MODE_5;
- break;
- case 2:
+ if (val)
zio_mode = QLA_ZIO_MODE_6;
- break;
- default:
+ else
zio_mode = QLA_ZIO_DISABLED;
- break;
- }
/* Update per-hba values and queue a reset. */
if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) {
@@ -750,7 +800,7 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
pfc_host_stat = &ha->fc_host_stat;
memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics));
- if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) {
+ if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf,
sizeof(stat_buf) / 4, mb_stat);
} else {