aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuinn Tran <quinn.tran@cavium.com>2018-07-18 17:29:53 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2018-07-19 22:02:34 -0400
commit45235022da9925b2b070c0139629233173e50089 (patch)
treec56da4f3859f68342f6d21d9f2c5d972f0b50d9c
parentefa93f48fa9d423fda166bc3b6c0cbb09682492e (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.c3
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c6
-rw-r--r--drivers/scsi/qla2xxx/qla_mid.c6
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c44
-rw-r--r--drivers/scsi/qla2xxx/qla_sup.c3
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
152qla24xx_disable_vp(scsi_qla_host_t *vha) 152qla24xx_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 *);
303static int qla2xxx_map_queues(struct Scsi_Host *shost); 303static int qla2xxx_map_queues(struct Scsi_Host *shost);
304static void qla2x00_destroy_deferred_work(struct qla_hw_data *); 304static void qla2x00_destroy_deferred_work(struct qla_hw_data *);
305 305
306
306struct scsi_host_template qla2xxx_driver_template = { 307struct 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))