From 044cc6c8ec311c4ddeebfcc31c53dea282de70b7 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Thu, 9 Mar 2006 14:27:13 -0800 Subject: [SCSI] qla2xxx: Add ISP54xx support. Chip is similar in form to our ISP24xx offering. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_attr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers/scsi/qla2xxx/qla_attr.c') diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 92b3e13e9061..2b9e329a240c 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; @@ -750,7 +750,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 { -- cgit v1.2.3 From 6f6417905cf272337a9762e1f92a1fffa651fcd3 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Thu, 9 Mar 2006 14:27:34 -0800 Subject: [SCSI] qla2xxx: Add VPD sysfs attribute. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_attr.c | 57 +++++++++++++++++++++++++++++++++++++++++ drivers/scsi/qla2xxx/qla_def.h | 2 ++ drivers/scsi/qla2xxx/qla_fw.h | 2 +- drivers/scsi/qla2xxx/qla_init.c | 6 ++++- 4 files changed, 65 insertions(+), 2 deletions(-) (limited to 'drivers/scsi/qla2xxx/qla_attr.c') diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 2b9e329a240c..488b3d16427b 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -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); diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index e1a7769008ee..20798f93d8da 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -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; diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index 9fb562aa4acc..1ee58ad2f4dd 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h @@ -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 /* diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 3bc3e1749f32..71b6bcc181f9 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -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; -- cgit v1.2.3 From 4a59f71d7f0d6dd433fd509584352cdd7c62e877 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Thu, 9 Mar 2006 14:27:39 -0800 Subject: [SCSI] qla2xxx: Further restrict ZIO mode support. Only support ZIO mode 6 on specific ISP types. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_attr.c | 17 +++++------------ drivers/scsi/qla2xxx/qla_def.h | 3 ++- drivers/scsi/qla2xxx/qla_init.c | 4 ++++ drivers/scsi/qla2xxx/qla_os.c | 5 +++++ 4 files changed, 16 insertions(+), 13 deletions(-) (limited to 'drivers/scsi/qla2xxx/qla_attr.c') diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 488b3d16427b..fee0c493775b 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -507,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; @@ -527,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) { diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 20798f93d8da..53508f3c4ae9 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -762,7 +762,6 @@ typedef struct { #define PD_STATE_WAIT_PORT_LOGOUT_ACK 11 -#define QLA_ZIO_MODE_5 (BIT_2 | BIT_0) #define QLA_ZIO_MODE_6 (BIT_2 | BIT_1) #define QLA_ZIO_DISABLED 0 #define QLA_ZIO_DEFAULT_TIMER 2 @@ -2238,6 +2237,7 @@ typedef struct scsi_qla_host { #define DT_ISP5432 BIT_10 #define DT_ISP_LAST (DT_ISP5432 << 1) +#define DT_ZIO_SUPPORTED BIT_28 #define DT_OEM_001 BIT_29 #define DT_ISP2200A BIT_30 #define DT_EXTENDED_IDS BIT_31 @@ -2260,6 +2260,7 @@ typedef struct scsi_qla_host { #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) #define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) +#define IS_ZIO_SUPPORTED(ha) ((ha)->device_type & DT_ZIO_SUPPORTED) #define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001) #define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 71b6bcc181f9..ebc7c2498067 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1659,6 +1659,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) ~(BIT_3 | BIT_2 | BIT_1 | BIT_0); ha->flags.process_response_queue = 0; if (ha->zio_mode != QLA_ZIO_DISABLED) { + ha->zio_mode = QLA_ZIO_MODE_6; + DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer " "delay (%d us).\n", ha->host_no, ha->zio_mode, ha->zio_timer * 100)); @@ -3474,6 +3476,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) ~(BIT_3 | BIT_2 | BIT_1 | BIT_0)); ha->flags.process_response_queue = 0; if (ha->zio_mode != QLA_ZIO_DISABLED) { + ha->zio_mode = QLA_ZIO_MODE_6; + DEBUG2(printk("scsi(%ld): ZIO mode %d enabled; timer delay " "(%d us).\n", ha->host_no, ha->zio_mode, ha->zio_timer * 100)); diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 4dc08d94ebec..0fc89ac6a51b 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -1161,12 +1161,15 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) break; case PCI_DEVICE_ID_QLOGIC_ISP2300: ha->device_type |= DT_ISP2300; + ha->device_type |= DT_ZIO_SUPPORTED; break; case PCI_DEVICE_ID_QLOGIC_ISP2312: ha->device_type |= DT_ISP2312; + ha->device_type |= DT_ZIO_SUPPORTED; break; case PCI_DEVICE_ID_QLOGIC_ISP2322: ha->device_type |= DT_ISP2322; + ha->device_type |= DT_ZIO_SUPPORTED; if (ha->pdev->subsystem_vendor == 0x1028 && ha->pdev->subsystem_device == 0x0170) ha->device_type |= DT_OEM_001; @@ -1179,9 +1182,11 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) break; case PCI_DEVICE_ID_QLOGIC_ISP2422: ha->device_type |= DT_ISP2422; + ha->device_type |= DT_ZIO_SUPPORTED; break; case PCI_DEVICE_ID_QLOGIC_ISP2432: ha->device_type |= DT_ISP2432; + ha->device_type |= DT_ZIO_SUPPORTED; break; case PCI_DEVICE_ID_QLOGIC_ISP5422: ha->device_type |= DT_ISP5422; -- cgit v1.2.3