On Fri, 2019-08-30 at 15:24 -0700, Himanshu Madhani wrote:
> From: Quinn Tran <qut...@marvell.com>
> 
> Login session was stucked on cable pull. When FW is in the middle
> PRLI PENDING + driver is in Initiator mode, driver fail to
> check back with FW to see if the PRLI has completed. This patch
> would re-check with FW again to make sure PRLI would complete before
> pushing forward with relogin.
> 
> Signed-off-by: Quinn Tran <qut...@marvell.com>
> Signed-off-by: Himanshu Madhani <hmadh...@marvell.com>
> ---
>  drivers/scsi/qla2xxx/qla_init.c | 23 +++++++++++------------
>  1 file changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index 8161f08f3a4d..2bbadcf60295 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -808,6 +808,15 @@ static void 
> qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
>                       fcport->fw_login_state = current_login_state;
>                       fcport->d_id = id;
>                       switch (current_login_state) {
> +                     case DSC_LS_PRLI_PEND:
> +                             /*
> +                              * In the middle of PRLI. Let it finish.
> +                              * Allow relogin code to recheck state again
> +                              * with GNL. Push disc_state back to DELETED
> +                              * so GNL can go out again
> +                              */
> +                             fcport->disc_state = DSC_DELETED;
> +                             break;
>                       case DSC_LS_PRLI_COMP:
>                               if ((e->prli_svc_param_word_3[0] & BIT_4) == 0)
>                                       fcport->port_type = FCT_INITIATOR;
> @@ -1474,7 +1483,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
> *vha, fc_port_t *fcport)
>       u64 wwn;
>       u16 sec;
>  
> -     ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x20d8,
> +     ql_dbg(ql_dbg_disc, vha, 0x20d8,
>           "%s %8phC DS %d LS %d P %d fl %x confl %p rscn %d|%d login %d lid 
> %d scan %d\n",
>           __func__, fcport->port_name, fcport->disc_state,
>           fcport->fw_login_state, fcport->login_pause, fcport->flags,
> @@ -1485,6 +1494,7 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host 
> *vha, fc_port_t *fcport)
>               return 0;
>  
>       if ((fcport->loop_id != FC_NO_LOOP_ID) &&
> +         qla_dual_mode_enabled(vha) &&
>           ((fcport->fw_login_state == DSC_LS_PLOGI_PEND) ||
>            (fcport->fw_login_state == DSC_LS_PRLI_PEND)))
>               return 0;
> @@ -1674,17 +1684,6 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha,
>           fcport->last_login_gen, fcport->login_gen,
>           fcport->flags);
>  
> -     if ((fcport->fw_login_state == DSC_LS_PLOGI_PEND) ||
> -         (fcport->fw_login_state == DSC_LS_PRLI_PEND))
> -             return;
> -
> -     if (fcport->fw_login_state == DSC_LS_PLOGI_COMP) {
> -             if (time_before_eq(jiffies, fcport->plogi_nack_done_deadline)) {
> -                     set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
> -                     return;
> -             }
> -     }
> -
>       if (fcport->last_rscn_gen != fcport->rscn_gen) {
>               ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gnl\n",
>                   __func__, __LINE__, fcport->port_name);

Reviewed-by: Ewan D. Milne <emi...@redhat.com>

Reply via email to