]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: qla2xxx: Fix device reconnect in loop topology
authorArun Easi <aeasi@marvell.com>
Mon, 10 Jan 2022 05:02:11 +0000 (21:02 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:06:45 +0000 (14:06 +0200)
commit 8ad4be3d15cf144b5834bdb00d5bbe4050938dc7 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_os.c

index c6c49577a88f6146ead7036ac5cfee880c001af5..8f596bad3f2b390bb2973a1cdab6ce70c4eff73a 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 c4b4b4496399144d289756acd2b7e7aba4a0c7b0..d782c96f339b36c888ce3f6aba6b8b87d387d886 100644 (file)
@@ -5532,6 +5532,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--;