diff options
author | Quinn Tran <quinn.tran@cavium.com> | 2018-07-18 17:29:53 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-07-19 22:02:34 -0400 |
commit | 45235022da9925b2b070c0139629233173e50089 (patch) | |
tree | c56da4f3859f68342f6d21d9f2c5d972f0b50d9c | |
parent | efa93f48fa9d423fda166bc3b6c0cbb09682492e (diff) |
scsi: qla2xxx: Fix driver unload by shutting down chip
Use chip shutdown at the start of unload to stop all DMA + traffic and
bring down the laser. This prevents any link activities from triggering the
driver to be re-engaged.
Fixes: 4b60c82736d0 ("scsi: qla2xxx: Add fw_started flags to qpair")
Cc: <stable@vger.kernel.org> #4.16
Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 44 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 3 |
5 files changed, 34 insertions, 28 deletions
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 9fa5a2557f2c..7756106d4555 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -631,6 +631,9 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) | |||
631 | unsigned long flags; | 631 | unsigned long flags; |
632 | fc_port_t *fcport = NULL; | 632 | fc_port_t *fcport = NULL; |
633 | 633 | ||
634 | if (!vha->hw->flags.fw_started) | ||
635 | return; | ||
636 | |||
634 | /* Setup to process RIO completion. */ | 637 | /* Setup to process RIO completion. */ |
635 | handle_cnt = 0; | 638 | handle_cnt = 0; |
636 | if (IS_CNA_CAPABLE(ha)) | 639 | if (IS_CNA_CAPABLE(ha)) |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 7e875f575229..f0ec13d48bf3 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -4220,6 +4220,9 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
4220 | mbx_cmd_t *mcp = &mc; | 4220 | mbx_cmd_t *mcp = &mc; |
4221 | struct qla_hw_data *ha = vha->hw; | 4221 | struct qla_hw_data *ha = vha->hw; |
4222 | 4222 | ||
4223 | if (!ha->flags.fw_started) | ||
4224 | return QLA_SUCCESS; | ||
4225 | |||
4223 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3, | 4226 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3, |
4224 | "Entered %s.\n", __func__); | 4227 | "Entered %s.\n", __func__); |
4225 | 4228 | ||
@@ -4289,6 +4292,9 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
4289 | mbx_cmd_t *mcp = &mc; | 4292 | mbx_cmd_t *mcp = &mc; |
4290 | struct qla_hw_data *ha = vha->hw; | 4293 | struct qla_hw_data *ha = vha->hw; |
4291 | 4294 | ||
4295 | if (!ha->flags.fw_started) | ||
4296 | return QLA_SUCCESS; | ||
4297 | |||
4292 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6, | 4298 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6, |
4293 | "Entered %s.\n", __func__); | 4299 | "Entered %s.\n", __func__); |
4294 | 4300 | ||
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 2c1aaf9b7a00..aa727d07b702 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -152,10 +152,12 @@ int | |||
152 | qla24xx_disable_vp(scsi_qla_host_t *vha) | 152 | qla24xx_disable_vp(scsi_qla_host_t *vha) |
153 | { | 153 | { |
154 | unsigned long flags; | 154 | unsigned long flags; |
155 | int ret; | 155 | int ret = QLA_SUCCESS; |
156 | fc_port_t *fcport; | 156 | fc_port_t *fcport; |
157 | 157 | ||
158 | ret = qla24xx_control_vp(vha, VCE_COMMAND_DISABLE_VPS_LOGO_ALL); | 158 | if (vha->hw->flags.fw_started) |
159 | ret = qla24xx_control_vp(vha, VCE_COMMAND_DISABLE_VPS_LOGO_ALL); | ||
160 | |||
159 | atomic_set(&vha->loop_state, LOOP_DOWN); | 161 | atomic_set(&vha->loop_state, LOOP_DOWN); |
160 | atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); | 162 | atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); |
161 | list_for_each_entry(fcport, &vha->vp_fcports, list) | 163 | list_for_each_entry(fcport, &vha->vp_fcports, list) |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index acc27808963c..2cd2e5ccce15 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -303,6 +303,7 @@ static void qla2x00_free_device(scsi_qla_host_t *); | |||
303 | static int qla2xxx_map_queues(struct Scsi_Host *shost); | 303 | static int qla2xxx_map_queues(struct Scsi_Host *shost); |
304 | static void qla2x00_destroy_deferred_work(struct qla_hw_data *); | 304 | static void qla2x00_destroy_deferred_work(struct qla_hw_data *); |
305 | 305 | ||
306 | |||
306 | struct scsi_host_template qla2xxx_driver_template = { | 307 | struct scsi_host_template qla2xxx_driver_template = { |
307 | .module = THIS_MODULE, | 308 | .module = THIS_MODULE, |
308 | .name = QLA2XXX_DRIVER_NAME, | 309 | .name = QLA2XXX_DRIVER_NAME, |
@@ -3603,6 +3604,8 @@ qla2x00_remove_one(struct pci_dev *pdev) | |||
3603 | 3604 | ||
3604 | base_vha = pci_get_drvdata(pdev); | 3605 | base_vha = pci_get_drvdata(pdev); |
3605 | ha = base_vha->hw; | 3606 | ha = base_vha->hw; |
3607 | ql_log(ql_log_info, base_vha, 0xb079, | ||
3608 | "Removing driver\n"); | ||
3606 | 3609 | ||
3607 | /* Indicate device removal to prevent future board_disable and wait | 3610 | /* Indicate device removal to prevent future board_disable and wait |
3608 | * until any pending board_disable has completed. */ | 3611 | * until any pending board_disable has completed. */ |
@@ -3625,6 +3628,21 @@ qla2x00_remove_one(struct pci_dev *pdev) | |||
3625 | } | 3628 | } |
3626 | qla2x00_wait_for_hba_ready(base_vha); | 3629 | qla2x00_wait_for_hba_ready(base_vha); |
3627 | 3630 | ||
3631 | if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) { | ||
3632 | if (ha->flags.fw_started) | ||
3633 | qla2x00_abort_isp_cleanup(base_vha); | ||
3634 | } else if (!IS_QLAFX00(ha)) { | ||
3635 | if (IS_QLA8031(ha)) { | ||
3636 | ql_dbg(ql_dbg_p3p, base_vha, 0xb07e, | ||
3637 | "Clearing fcoe driver presence.\n"); | ||
3638 | if (qla83xx_clear_drv_presence(base_vha) != QLA_SUCCESS) | ||
3639 | ql_dbg(ql_dbg_p3p, base_vha, 0xb079, | ||
3640 | "Error while clearing DRV-Presence.\n"); | ||
3641 | } | ||
3642 | |||
3643 | qla2x00_try_to_stop_firmware(base_vha); | ||
3644 | } | ||
3645 | |||
3628 | qla2x00_wait_for_sess_deletion(base_vha); | 3646 | qla2x00_wait_for_sess_deletion(base_vha); |
3629 | 3647 | ||
3630 | /* | 3648 | /* |
@@ -3648,14 +3666,6 @@ qla2x00_remove_one(struct pci_dev *pdev) | |||
3648 | 3666 | ||
3649 | qla2x00_delete_all_vps(ha, base_vha); | 3667 | qla2x00_delete_all_vps(ha, base_vha); |
3650 | 3668 | ||
3651 | if (IS_QLA8031(ha)) { | ||
3652 | ql_dbg(ql_dbg_p3p, base_vha, 0xb07e, | ||
3653 | "Clearing fcoe driver presence.\n"); | ||
3654 | if (qla83xx_clear_drv_presence(base_vha) != QLA_SUCCESS) | ||
3655 | ql_dbg(ql_dbg_p3p, base_vha, 0xb079, | ||
3656 | "Error while clearing DRV-Presence.\n"); | ||
3657 | } | ||
3658 | |||
3659 | qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); | 3669 | qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); |
3660 | 3670 | ||
3661 | qla2x00_dfs_remove(base_vha); | 3671 | qla2x00_dfs_remove(base_vha); |
@@ -3715,24 +3725,6 @@ qla2x00_free_device(scsi_qla_host_t *vha) | |||
3715 | qla2x00_stop_timer(vha); | 3725 | qla2x00_stop_timer(vha); |
3716 | 3726 | ||
3717 | qla25xx_delete_queues(vha); | 3727 | qla25xx_delete_queues(vha); |
3718 | |||
3719 | if (ha->flags.fce_enabled) | ||
3720 | qla2x00_disable_fce_trace(vha, NULL, NULL); | ||
3721 | |||
3722 | if (ha->eft) | ||
3723 | qla2x00_disable_eft_trace(vha); | ||
3724 | |||
3725 | if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) { | ||
3726 | if (ha->flags.fw_started) | ||
3727 | qla2x00_abort_isp_cleanup(vha); | ||
3728 | } else { | ||
3729 | if (ha->flags.fw_started) { | ||
3730 | /* Stop currently executing firmware. */ | ||
3731 | qla2x00_try_to_stop_firmware(vha); | ||
3732 | ha->flags.fw_started = 0; | ||
3733 | } | ||
3734 | } | ||
3735 | |||
3736 | vha->flags.online = 0; | 3728 | vha->flags.online = 0; |
3737 | 3729 | ||
3738 | /* turn-off interrupts on the card */ | 3730 | /* turn-off interrupts on the card */ |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 04458eb19d38..4499c787165f 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -1880,6 +1880,9 @@ qla24xx_beacon_off(struct scsi_qla_host *vha) | |||
1880 | if (IS_P3P_TYPE(ha)) | 1880 | if (IS_P3P_TYPE(ha)) |
1881 | return QLA_SUCCESS; | 1881 | return QLA_SUCCESS; |
1882 | 1882 | ||
1883 | if (!ha->flags.fw_started) | ||
1884 | return QLA_SUCCESS; | ||
1885 | |||
1883 | ha->beacon_blink_led = 0; | 1886 | ha->beacon_blink_led = 0; |
1884 | 1887 | ||
1885 | if (IS_QLA2031(ha) || IS_QLA27XX(ha)) | 1888 | if (IS_QLA2031(ha) || IS_QLA27XX(ha)) |