scsi: qla2xxx: Fix device reconnect in loop topology
authorArun Easi <aeasi@marvell.com>
Mon, 10 Jan 2022 05:02:11 +0000 (21:02 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 25 Jan 2022 04:57:31 +0000 (23:57 -0500)
A device logout in loop topology initiates a device connection teardown
which loses the FW device handle. In loop topo, the device handle is not
regrabbed leading to device login failures and eventually to loss of the
device. Fix this by taking the main login path that does it.

Link: https://lore.kernel.org/r/20220110050218.3958-11-njavali@marvell.com
Cc: stable@vger.kernel.org
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Arun Easi <aeasi@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_os.c

index ac25d2bfa90b92fb2739d620e06031a990eab4b2..24322eb0157150d2cc724da4bbc9710a703e50ad 100644 (file)
@@ -974,6 +974,9 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
                                set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
                        }
                        break;
+               case ISP_CFG_NL:
+                       qla24xx_fcport_handle_login(vha, fcport);
+                       break;
                default:
                        break;
                }
@@ -1563,6 +1566,11 @@ static void qla_chk_n2n_b4_login(struct scsi_qla_host *vha, fc_port_t *fcport)
        u8 login = 0;
        int rc;
 
+       ql_dbg(ql_dbg_disc, vha, 0x307b,
+           "%s %8phC DS %d LS %d lid %d retries=%d\n",
+           __func__, fcport->port_name, fcport->disc_state,
+           fcport->fw_login_state, fcport->loop_id, fcport->login_retry);
+
        if (qla_tgt_mode_enabled(vha))
                return;
 
@@ -5604,6 +5612,13 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
                        memcpy(fcport->node_name, new_fcport->node_name,
                            WWN_SIZE);
                        fcport->scan_state = QLA_FCPORT_FOUND;
+                       if (fcport->login_retry == 0) {
+                               fcport->login_retry = vha->hw->login_retry_count;
+                               ql_dbg(ql_dbg_disc, vha, 0x2135,
+                                   "Port login retry %8phN, lid 0x%04x retry cnt=%d.\n",
+                                   fcport->port_name, fcport->loop_id,
+                                   fcport->login_retry);
+                       }
                        found++;
                        break;
                }
index 7d515930611232f09b4d06f7cf8434052dcdd140..88bff825aa5e237bc66c4e27200225aa58d6c443 100644 (file)
@@ -5540,6 +5540,11 @@ void qla2x00_relogin(struct scsi_qla_host *vha)
                                        memset(&ea, 0, sizeof(ea));
                                        ea.fcport = fcport;
                                        qla24xx_handle_relogin_event(vha, &ea);
+                               } else if (vha->hw->current_topology ==
+                                        ISP_CFG_NL &&
+                                       IS_QLA2XXX_MIDTYPE(vha->hw)) {
+                                       (void)qla24xx_fcport_handle_login(vha,
+                                                                       fcport);
                                } else if (vha->hw->current_topology ==
                                    ISP_CFG_NL) {
                                        fcport->login_retry--;