diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_os.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 5866a7c706a8..9f91f1a20542 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -366,6 +366,12 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | |||
366 | goto qc_fail_command; | 366 | goto qc_fail_command; |
367 | } | 367 | } |
368 | 368 | ||
369 | /* Close window on fcport/rport state-transitioning. */ | ||
370 | if (!*(fc_port_t **)rport->dd_data) { | ||
371 | cmd->result = DID_IMM_RETRY << 16; | ||
372 | goto qc_fail_command; | ||
373 | } | ||
374 | |||
369 | if (atomic_read(&fcport->state) != FCS_ONLINE) { | 375 | if (atomic_read(&fcport->state) != FCS_ONLINE) { |
370 | if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || | 376 | if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || |
371 | atomic_read(&ha->loop_state) == LOOP_DEAD) { | 377 | atomic_read(&ha->loop_state) == LOOP_DEAD) { |
@@ -421,6 +427,12 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | |||
421 | goto qc24_fail_command; | 427 | goto qc24_fail_command; |
422 | } | 428 | } |
423 | 429 | ||
430 | /* Close window on fcport/rport state-transitioning. */ | ||
431 | if (!*(fc_port_t **)rport->dd_data) { | ||
432 | cmd->result = DID_IMM_RETRY << 16; | ||
433 | goto qc24_fail_command; | ||
434 | } | ||
435 | |||
424 | if (atomic_read(&fcport->state) != FCS_ONLINE) { | 436 | if (atomic_read(&fcport->state) != FCS_ONLINE) { |
425 | if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || | 437 | if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || |
426 | atomic_read(&ha->loop_state) == LOOP_DEAD) { | 438 | atomic_read(&ha->loop_state) == LOOP_DEAD) { |
@@ -513,7 +525,7 @@ qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, struct scsi_cmnd *cmd) | |||
513 | * Success (Adapter is online) : 0 | 525 | * Success (Adapter is online) : 0 |
514 | * Failed (Adapter is offline/disabled) : 1 | 526 | * Failed (Adapter is offline/disabled) : 1 |
515 | */ | 527 | */ |
516 | static int | 528 | int |
517 | qla2x00_wait_for_hba_online(scsi_qla_host_t *ha) | 529 | qla2x00_wait_for_hba_online(scsi_qla_host_t *ha) |
518 | { | 530 | { |
519 | int return_status; | 531 | int return_status; |
@@ -1312,6 +1324,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) | |||
1312 | ha->ports = MAX_BUSES; | 1324 | ha->ports = MAX_BUSES; |
1313 | ha->init_cb_size = sizeof(init_cb_t); | 1325 | ha->init_cb_size = sizeof(init_cb_t); |
1314 | ha->mgmt_svr_loop_id = MANAGEMENT_SERVER; | 1326 | ha->mgmt_svr_loop_id = MANAGEMENT_SERVER; |
1327 | ha->link_data_rate = LDR_UNKNOWN; | ||
1328 | ha->optrom_size = OPTROM_SIZE_2300; | ||
1315 | 1329 | ||
1316 | /* Assign ISP specific operations. */ | 1330 | /* Assign ISP specific operations. */ |
1317 | ha->isp_ops.pci_config = qla2100_pci_config; | 1331 | ha->isp_ops.pci_config = qla2100_pci_config; |
@@ -1339,6 +1353,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) | |||
1339 | ha->isp_ops.write_nvram = qla2x00_write_nvram_data; | 1353 | ha->isp_ops.write_nvram = qla2x00_write_nvram_data; |
1340 | ha->isp_ops.fw_dump = qla2100_fw_dump; | 1354 | ha->isp_ops.fw_dump = qla2100_fw_dump; |
1341 | ha->isp_ops.ascii_fw_dump = qla2100_ascii_fw_dump; | 1355 | ha->isp_ops.ascii_fw_dump = qla2100_ascii_fw_dump; |
1356 | ha->isp_ops.read_optrom = qla2x00_read_optrom_data; | ||
1357 | ha->isp_ops.write_optrom = qla2x00_write_optrom_data; | ||
1342 | if (IS_QLA2100(ha)) { | 1358 | if (IS_QLA2100(ha)) { |
1343 | host->max_id = MAX_TARGETS_2100; | 1359 | host->max_id = MAX_TARGETS_2100; |
1344 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; | 1360 | ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; |
@@ -1364,7 +1380,12 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) | |||
1364 | ha->isp_ops.intr_handler = qla2300_intr_handler; | 1380 | ha->isp_ops.intr_handler = qla2300_intr_handler; |
1365 | ha->isp_ops.fw_dump = qla2300_fw_dump; | 1381 | ha->isp_ops.fw_dump = qla2300_fw_dump; |
1366 | ha->isp_ops.ascii_fw_dump = qla2300_ascii_fw_dump; | 1382 | ha->isp_ops.ascii_fw_dump = qla2300_ascii_fw_dump; |
1383 | ha->isp_ops.beacon_on = qla2x00_beacon_on; | ||
1384 | ha->isp_ops.beacon_off = qla2x00_beacon_off; | ||
1385 | ha->isp_ops.beacon_blink = qla2x00_beacon_blink; | ||
1367 | ha->gid_list_info_size = 6; | 1386 | ha->gid_list_info_size = 6; |
1387 | if (IS_QLA2322(ha) || IS_QLA6322(ha)) | ||
1388 | ha->optrom_size = OPTROM_SIZE_2322; | ||
1368 | } else if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { | 1389 | } else if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { |
1369 | host->max_id = MAX_TARGETS_2200; | 1390 | host->max_id = MAX_TARGETS_2200; |
1370 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | 1391 | ha->mbx_count = MAILBOX_REGISTER_COUNT; |
@@ -1400,7 +1421,13 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) | |||
1400 | ha->isp_ops.write_nvram = qla24xx_write_nvram_data; | 1421 | ha->isp_ops.write_nvram = qla24xx_write_nvram_data; |
1401 | ha->isp_ops.fw_dump = qla24xx_fw_dump; | 1422 | ha->isp_ops.fw_dump = qla24xx_fw_dump; |
1402 | ha->isp_ops.ascii_fw_dump = qla24xx_ascii_fw_dump; | 1423 | ha->isp_ops.ascii_fw_dump = qla24xx_ascii_fw_dump; |
1424 | ha->isp_ops.read_optrom = qla24xx_read_optrom_data; | ||
1425 | ha->isp_ops.write_optrom = qla24xx_write_optrom_data; | ||
1426 | ha->isp_ops.beacon_on = qla24xx_beacon_on; | ||
1427 | ha->isp_ops.beacon_off = qla24xx_beacon_off; | ||
1428 | ha->isp_ops.beacon_blink = qla24xx_beacon_blink; | ||
1403 | ha->gid_list_info_size = 8; | 1429 | ha->gid_list_info_size = 8; |
1430 | ha->optrom_size = OPTROM_SIZE_24XX; | ||
1404 | } | 1431 | } |
1405 | host->can_queue = ha->request_q_length + 128; | 1432 | host->can_queue = ha->request_q_length + 128; |
1406 | 1433 | ||
@@ -1657,11 +1684,13 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *ha, fc_port_t *fcport, | |||
1657 | spin_lock_irqsave(&fcport->rport_lock, flags); | 1684 | spin_lock_irqsave(&fcport->rport_lock, flags); |
1658 | fcport->drport = rport; | 1685 | fcport->drport = rport; |
1659 | fcport->rport = NULL; | 1686 | fcport->rport = NULL; |
1687 | *(fc_port_t **)rport->dd_data = NULL; | ||
1660 | spin_unlock_irqrestore(&fcport->rport_lock, flags); | 1688 | spin_unlock_irqrestore(&fcport->rport_lock, flags); |
1661 | set_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags); | 1689 | set_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags); |
1662 | } else { | 1690 | } else { |
1663 | spin_lock_irqsave(&fcport->rport_lock, flags); | 1691 | spin_lock_irqsave(&fcport->rport_lock, flags); |
1664 | fcport->rport = NULL; | 1692 | fcport->rport = NULL; |
1693 | *(fc_port_t **)rport->dd_data = NULL; | ||
1665 | spin_unlock_irqrestore(&fcport->rport_lock, flags); | 1694 | spin_unlock_irqrestore(&fcport->rport_lock, flags); |
1666 | fc_remote_port_delete(rport); | 1695 | fc_remote_port_delete(rport); |
1667 | } | 1696 | } |
@@ -2066,6 +2095,8 @@ qla2x00_mem_free(scsi_qla_host_t *ha) | |||
2066 | ha->fw_dumped = 0; | 2095 | ha->fw_dumped = 0; |
2067 | ha->fw_dump_reading = 0; | 2096 | ha->fw_dump_reading = 0; |
2068 | ha->fw_dump_buffer = NULL; | 2097 | ha->fw_dump_buffer = NULL; |
2098 | |||
2099 | vfree(ha->optrom_buffer); | ||
2069 | } | 2100 | } |
2070 | 2101 | ||
2071 | /* | 2102 | /* |
@@ -2314,6 +2345,9 @@ qla2x00_do_dpc(void *data) | |||
2314 | if (!ha->interrupts_on) | 2345 | if (!ha->interrupts_on) |
2315 | ha->isp_ops.enable_intrs(ha); | 2346 | ha->isp_ops.enable_intrs(ha); |
2316 | 2347 | ||
2348 | if (test_and_clear_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags)) | ||
2349 | ha->isp_ops.beacon_blink(ha); | ||
2350 | |||
2317 | ha->dpc_active = 0; | 2351 | ha->dpc_active = 0; |
2318 | } /* End of while(1) */ | 2352 | } /* End of while(1) */ |
2319 | 2353 | ||
@@ -2491,6 +2525,12 @@ qla2x00_timer(scsi_qla_host_t *ha) | |||
2491 | atomic_read(&ha->loop_down_timer))); | 2525 | atomic_read(&ha->loop_down_timer))); |
2492 | } | 2526 | } |
2493 | 2527 | ||
2528 | /* Check if beacon LED needs to be blinked */ | ||
2529 | if (ha->beacon_blink_led == 1) { | ||
2530 | set_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags); | ||
2531 | start_dpc++; | ||
2532 | } | ||
2533 | |||
2494 | /* Schedule the DPC routine if needed */ | 2534 | /* Schedule the DPC routine if needed */ |
2495 | if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || | 2535 | if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || |
2496 | test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || | 2536 | test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || |
@@ -2499,6 +2539,7 @@ qla2x00_timer(scsi_qla_host_t *ha) | |||
2499 | start_dpc || | 2539 | start_dpc || |
2500 | test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) || | 2540 | test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) || |
2501 | test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) || | 2541 | test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) || |
2542 | test_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags) || | ||
2502 | test_bit(RELOGIN_NEEDED, &ha->dpc_flags)) && | 2543 | test_bit(RELOGIN_NEEDED, &ha->dpc_flags)) && |
2503 | ha->dpc_wait && !ha->dpc_active) { | 2544 | ha->dpc_wait && !ha->dpc_active) { |
2504 | 2545 | ||