diff options
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 94 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 66 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 8 |
4 files changed, 52 insertions, 118 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 285c8e8ff1a0..7b18a6c7b7eb 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -390,7 +390,7 @@ static struct sysfs_entry { | |||
390 | { "optrom_ctl", &sysfs_optrom_ctl_attr, }, | 390 | { "optrom_ctl", &sysfs_optrom_ctl_attr, }, |
391 | { "vpd", &sysfs_vpd_attr, 1 }, | 391 | { "vpd", &sysfs_vpd_attr, 1 }, |
392 | { "sfp", &sysfs_sfp_attr, 1 }, | 392 | { "sfp", &sysfs_sfp_attr, 1 }, |
393 | { 0 }, | 393 | { NULL }, |
394 | }; | 394 | }; |
395 | 395 | ||
396 | void | 396 | void |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 08cb5e3fb553..a823f0bc519d 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -59,9 +59,6 @@ int | |||
59 | qla2x00_initialize_adapter(scsi_qla_host_t *ha) | 59 | qla2x00_initialize_adapter(scsi_qla_host_t *ha) |
60 | { | 60 | { |
61 | int rval; | 61 | int rval; |
62 | uint8_t restart_risc = 0; | ||
63 | uint8_t retry; | ||
64 | uint32_t wait_time; | ||
65 | 62 | ||
66 | /* Clear adapter flags. */ | 63 | /* Clear adapter flags. */ |
67 | ha->flags.online = 0; | 64 | ha->flags.online = 0; |
@@ -104,87 +101,15 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha) | |||
104 | 101 | ||
105 | qla_printk(KERN_INFO, ha, "Verifying loaded RISC code...\n"); | 102 | qla_printk(KERN_INFO, ha, "Verifying loaded RISC code...\n"); |
106 | 103 | ||
107 | retry = 10; | 104 | if (qla2x00_isp_firmware(ha) != QLA_SUCCESS) { |
108 | /* | 105 | rval = ha->isp_ops.chip_diag(ha); |
109 | * Try to configure the loop. | 106 | if (rval) |
110 | */ | 107 | return (rval); |
111 | do { | 108 | rval = qla2x00_setup_chip(ha); |
112 | restart_risc = 0; | 109 | if (rval) |
113 | 110 | return (rval); | |
114 | /* If firmware needs to be loaded */ | ||
115 | if (qla2x00_isp_firmware(ha) != QLA_SUCCESS) { | ||
116 | if ((rval = ha->isp_ops.chip_diag(ha)) == QLA_SUCCESS) { | ||
117 | rval = qla2x00_setup_chip(ha); | ||
118 | } | ||
119 | } | ||
120 | |||
121 | if (rval == QLA_SUCCESS && | ||
122 | (rval = qla2x00_init_rings(ha)) == QLA_SUCCESS) { | ||
123 | check_fw_ready_again: | ||
124 | /* | ||
125 | * Wait for a successful LIP up to a maximum | ||
126 | * of (in seconds): RISC login timeout value, | ||
127 | * RISC retry count value, and port down retry | ||
128 | * value OR a minimum of 4 seconds OR If no | ||
129 | * cable, only 5 seconds. | ||
130 | */ | ||
131 | rval = qla2x00_fw_ready(ha); | ||
132 | if (rval == QLA_SUCCESS) { | ||
133 | clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); | ||
134 | |||
135 | /* Issue a marker after FW becomes ready. */ | ||
136 | qla2x00_marker(ha, 0, 0, MK_SYNC_ALL); | ||
137 | |||
138 | /* | ||
139 | * Wait at most MAX_TARGET RSCNs for a stable | ||
140 | * link. | ||
141 | */ | ||
142 | wait_time = 256; | ||
143 | do { | ||
144 | clear_bit(LOOP_RESYNC_NEEDED, | ||
145 | &ha->dpc_flags); | ||
146 | rval = qla2x00_configure_loop(ha); | ||
147 | |||
148 | if (test_and_clear_bit(ISP_ABORT_NEEDED, | ||
149 | &ha->dpc_flags)) { | ||
150 | restart_risc = 1; | ||
151 | break; | ||
152 | } | ||
153 | |||
154 | /* | ||
155 | * If loop state change while we were | ||
156 | * discoverying devices then wait for | ||
157 | * LIP to complete | ||
158 | */ | ||
159 | |||
160 | if (atomic_read(&ha->loop_state) != | ||
161 | LOOP_READY && retry--) { | ||
162 | goto check_fw_ready_again; | ||
163 | } | ||
164 | wait_time--; | ||
165 | } while (!atomic_read(&ha->loop_down_timer) && | ||
166 | retry && | ||
167 | wait_time && | ||
168 | (test_bit(LOOP_RESYNC_NEEDED, | ||
169 | &ha->dpc_flags))); | ||
170 | |||
171 | if (wait_time == 0) | ||
172 | rval = QLA_FUNCTION_FAILED; | ||
173 | } else if (ha->device_flags & DFLG_NO_CABLE) | ||
174 | /* If no cable, then all is good. */ | ||
175 | rval = QLA_SUCCESS; | ||
176 | } | ||
177 | } while (restart_risc && retry--); | ||
178 | |||
179 | if (rval == QLA_SUCCESS) { | ||
180 | clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); | ||
181 | qla2x00_marker(ha, 0, 0, MK_SYNC_ALL); | ||
182 | ha->marker_needed = 0; | ||
183 | |||
184 | ha->flags.online = 1; | ||
185 | } else { | ||
186 | DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); | ||
187 | } | 111 | } |
112 | rval = qla2x00_init_rings(ha); | ||
188 | 113 | ||
189 | return (rval); | 114 | return (rval); |
190 | } | 115 | } |
@@ -2208,8 +2133,7 @@ qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport) | |||
2208 | 2133 | ||
2209 | atomic_set(&fcport->state, FCS_ONLINE); | 2134 | atomic_set(&fcport->state, FCS_ONLINE); |
2210 | 2135 | ||
2211 | if (ha->flags.init_done) | 2136 | qla2x00_reg_remote_port(ha, fcport); |
2212 | qla2x00_reg_remote_port(ha, fcport); | ||
2213 | } | 2137 | } |
2214 | 2138 | ||
2215 | void | 2139 | void |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 208607be78c7..cbe0cad83b68 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -95,6 +95,8 @@ MODULE_PARM_DESC(ql2xqfullrampup, | |||
95 | */ | 95 | */ |
96 | static int qla2xxx_slave_configure(struct scsi_device * device); | 96 | static int qla2xxx_slave_configure(struct scsi_device * device); |
97 | static int qla2xxx_slave_alloc(struct scsi_device *); | 97 | static int qla2xxx_slave_alloc(struct scsi_device *); |
98 | static int qla2xxx_scan_finished(struct Scsi_Host *, unsigned long time); | ||
99 | static void qla2xxx_scan_start(struct Scsi_Host *); | ||
98 | static void qla2xxx_slave_destroy(struct scsi_device *); | 100 | static void qla2xxx_slave_destroy(struct scsi_device *); |
99 | static int qla2x00_queuecommand(struct scsi_cmnd *cmd, | 101 | static int qla2x00_queuecommand(struct scsi_cmnd *cmd, |
100 | void (*fn)(struct scsi_cmnd *)); | 102 | void (*fn)(struct scsi_cmnd *)); |
@@ -124,6 +126,8 @@ static struct scsi_host_template qla2x00_driver_template = { | |||
124 | 126 | ||
125 | .slave_alloc = qla2xxx_slave_alloc, | 127 | .slave_alloc = qla2xxx_slave_alloc, |
126 | .slave_destroy = qla2xxx_slave_destroy, | 128 | .slave_destroy = qla2xxx_slave_destroy, |
129 | .scan_finished = qla2xxx_scan_finished, | ||
130 | .scan_start = qla2xxx_scan_start, | ||
127 | .change_queue_depth = qla2x00_change_queue_depth, | 131 | .change_queue_depth = qla2x00_change_queue_depth, |
128 | .change_queue_type = qla2x00_change_queue_type, | 132 | .change_queue_type = qla2x00_change_queue_type, |
129 | .this_id = -1, | 133 | .this_id = -1, |
@@ -287,7 +291,7 @@ qla24xx_pci_info_str(struct scsi_qla_host *ha, char *str) | |||
287 | return str; | 291 | return str; |
288 | } | 292 | } |
289 | 293 | ||
290 | char * | 294 | static char * |
291 | qla2x00_fw_version_str(struct scsi_qla_host *ha, char *str) | 295 | qla2x00_fw_version_str(struct scsi_qla_host *ha, char *str) |
292 | { | 296 | { |
293 | char un_str[10]; | 297 | char un_str[10]; |
@@ -325,7 +329,7 @@ qla2x00_fw_version_str(struct scsi_qla_host *ha, char *str) | |||
325 | return (str); | 329 | return (str); |
326 | } | 330 | } |
327 | 331 | ||
328 | char * | 332 | static char * |
329 | qla24xx_fw_version_str(struct scsi_qla_host *ha, char *str) | 333 | qla24xx_fw_version_str(struct scsi_qla_host *ha, char *str) |
330 | { | 334 | { |
331 | sprintf(str, "%d.%02d.%02d ", ha->fw_major_version, | 335 | sprintf(str, "%d.%02d.%02d ", ha->fw_major_version, |
@@ -634,7 +638,7 @@ qla2x00_block_error_handler(struct scsi_cmnd *cmnd) | |||
634 | * Note: | 638 | * Note: |
635 | * Only return FAILED if command not returned by firmware. | 639 | * Only return FAILED if command not returned by firmware. |
636 | **************************************************************************/ | 640 | **************************************************************************/ |
637 | int | 641 | static int |
638 | qla2xxx_eh_abort(struct scsi_cmnd *cmd) | 642 | qla2xxx_eh_abort(struct scsi_cmnd *cmd) |
639 | { | 643 | { |
640 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); | 644 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); |
@@ -771,7 +775,7 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t) | |||
771 | * SUCCESS/FAILURE (defined as macro in scsi.h). | 775 | * SUCCESS/FAILURE (defined as macro in scsi.h). |
772 | * | 776 | * |
773 | **************************************************************************/ | 777 | **************************************************************************/ |
774 | int | 778 | static int |
775 | qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) | 779 | qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) |
776 | { | 780 | { |
777 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); | 781 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); |
@@ -902,7 +906,7 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha) | |||
902 | * SUCCESS/FAILURE (defined as macro in scsi.h). | 906 | * SUCCESS/FAILURE (defined as macro in scsi.h). |
903 | * | 907 | * |
904 | **************************************************************************/ | 908 | **************************************************************************/ |
905 | int | 909 | static int |
906 | qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) | 910 | qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) |
907 | { | 911 | { |
908 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); | 912 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); |
@@ -963,7 +967,7 @@ eh_bus_reset_done: | |||
963 | * | 967 | * |
964 | * Note: | 968 | * Note: |
965 | **************************************************************************/ | 969 | **************************************************************************/ |
966 | int | 970 | static int |
967 | qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) | 971 | qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) |
968 | { | 972 | { |
969 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); | 973 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); |
@@ -1366,6 +1370,29 @@ qla24xx_disable_intrs(scsi_qla_host_t *ha) | |||
1366 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1370 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1367 | } | 1371 | } |
1368 | 1372 | ||
1373 | static void | ||
1374 | qla2xxx_scan_start(struct Scsi_Host *shost) | ||
1375 | { | ||
1376 | scsi_qla_host_t *ha = (scsi_qla_host_t *)shost->hostdata; | ||
1377 | |||
1378 | set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); | ||
1379 | set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); | ||
1380 | set_bit(RSCN_UPDATE, &ha->dpc_flags); | ||
1381 | } | ||
1382 | |||
1383 | static int | ||
1384 | qla2xxx_scan_finished(struct Scsi_Host *shost, unsigned long time) | ||
1385 | { | ||
1386 | scsi_qla_host_t *ha = (scsi_qla_host_t *)shost->hostdata; | ||
1387 | |||
1388 | if (!ha->host) | ||
1389 | return 1; | ||
1390 | if (time > ha->loop_reset_delay * HZ) | ||
1391 | return 1; | ||
1392 | |||
1393 | return atomic_read(&ha->loop_state) == LOOP_READY; | ||
1394 | } | ||
1395 | |||
1369 | /* | 1396 | /* |
1370 | * PCI driver interface | 1397 | * PCI driver interface |
1371 | */ | 1398 | */ |
@@ -1377,10 +1404,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1377 | struct Scsi_Host *host; | 1404 | struct Scsi_Host *host; |
1378 | scsi_qla_host_t *ha; | 1405 | scsi_qla_host_t *ha; |
1379 | unsigned long flags = 0; | 1406 | unsigned long flags = 0; |
1380 | unsigned long wait_switch = 0; | ||
1381 | char pci_info[20]; | 1407 | char pci_info[20]; |
1382 | char fw_str[30]; | 1408 | char fw_str[30]; |
1383 | fc_port_t *fcport; | ||
1384 | struct scsi_host_template *sht; | 1409 | struct scsi_host_template *sht; |
1385 | 1410 | ||
1386 | if (pci_enable_device(pdev)) | 1411 | if (pci_enable_device(pdev)) |
@@ -1631,30 +1656,19 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1631 | 1656 | ||
1632 | ha->isp_ops.enable_intrs(ha); | 1657 | ha->isp_ops.enable_intrs(ha); |
1633 | 1658 | ||
1634 | /* v2.19.5b6 */ | ||
1635 | /* | ||
1636 | * Wait around max loop_reset_delay secs for the devices to come | ||
1637 | * on-line. We don't want Linux scanning before we are ready. | ||
1638 | * | ||
1639 | */ | ||
1640 | for (wait_switch = jiffies + (ha->loop_reset_delay * HZ); | ||
1641 | time_before(jiffies,wait_switch) && | ||
1642 | !(ha->device_flags & (DFLG_NO_CABLE | DFLG_FABRIC_DEVICES)) | ||
1643 | && (ha->device_flags & SWITCH_FOUND) ;) { | ||
1644 | |||
1645 | qla2x00_check_fabric_devices(ha); | ||
1646 | |||
1647 | msleep(10); | ||
1648 | } | ||
1649 | |||
1650 | pci_set_drvdata(pdev, ha); | 1659 | pci_set_drvdata(pdev, ha); |
1660 | |||
1651 | ha->flags.init_done = 1; | 1661 | ha->flags.init_done = 1; |
1662 | ha->flags.online = 1; | ||
1663 | |||
1652 | num_hosts++; | 1664 | num_hosts++; |
1653 | 1665 | ||
1654 | ret = scsi_add_host(host, &pdev->dev); | 1666 | ret = scsi_add_host(host, &pdev->dev); |
1655 | if (ret) | 1667 | if (ret) |
1656 | goto probe_failed; | 1668 | goto probe_failed; |
1657 | 1669 | ||
1670 | scsi_scan_host(host); | ||
1671 | |||
1658 | qla2x00_alloc_sysfs_attr(ha); | 1672 | qla2x00_alloc_sysfs_attr(ha); |
1659 | 1673 | ||
1660 | qla2x00_init_host_attr(ha); | 1674 | qla2x00_init_host_attr(ha); |
@@ -1669,10 +1683,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1669 | ha->flags.enable_64bit_addressing ? '+': '-', ha->host_no, | 1683 | ha->flags.enable_64bit_addressing ? '+': '-', ha->host_no, |
1670 | ha->isp_ops.fw_version_str(ha, fw_str)); | 1684 | ha->isp_ops.fw_version_str(ha, fw_str)); |
1671 | 1685 | ||
1672 | /* Go with fc_rport registration. */ | ||
1673 | list_for_each_entry(fcport, &ha->fcports, list) | ||
1674 | qla2x00_reg_remote_port(ha, fcport); | ||
1675 | |||
1676 | return 0; | 1686 | return 0; |
1677 | 1687 | ||
1678 | probe_failed: | 1688 | probe_failed: |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index c71dbd5bd543..15390ad87456 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -449,7 +449,7 @@ nvram_data_to_access_addr(uint32_t naddr) | |||
449 | return FARX_ACCESS_NVRAM_DATA | naddr; | 449 | return FARX_ACCESS_NVRAM_DATA | naddr; |
450 | } | 450 | } |
451 | 451 | ||
452 | uint32_t | 452 | static uint32_t |
453 | qla24xx_read_flash_dword(scsi_qla_host_t *ha, uint32_t addr) | 453 | qla24xx_read_flash_dword(scsi_qla_host_t *ha, uint32_t addr) |
454 | { | 454 | { |
455 | int rval; | 455 | int rval; |
@@ -490,7 +490,7 @@ qla24xx_read_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, | |||
490 | return dwptr; | 490 | return dwptr; |
491 | } | 491 | } |
492 | 492 | ||
493 | int | 493 | static int |
494 | qla24xx_write_flash_dword(scsi_qla_host_t *ha, uint32_t addr, uint32_t data) | 494 | qla24xx_write_flash_dword(scsi_qla_host_t *ha, uint32_t addr, uint32_t data) |
495 | { | 495 | { |
496 | int rval; | 496 | int rval; |
@@ -512,7 +512,7 @@ qla24xx_write_flash_dword(scsi_qla_host_t *ha, uint32_t addr, uint32_t data) | |||
512 | return rval; | 512 | return rval; |
513 | } | 513 | } |
514 | 514 | ||
515 | void | 515 | static void |
516 | qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id, | 516 | qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id, |
517 | uint8_t *flash_id) | 517 | uint8_t *flash_id) |
518 | { | 518 | { |
@@ -537,7 +537,7 @@ qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id, | |||
537 | } | 537 | } |
538 | } | 538 | } |
539 | 539 | ||
540 | int | 540 | static int |
541 | qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, | 541 | qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, |
542 | uint32_t dwords) | 542 | uint32_t dwords) |
543 | { | 543 | { |