scsi: lpfc: Fix unexpected error messages during RSCN handling
authorJames Smart <jsmart2021@gmail.com>
Tue, 5 Nov 2019 00:57:01 +0000 (16:57 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 6 Nov 2019 05:04:04 +0000 (00:04 -0500)
During heavy RCN activity and log_verbose = 0 we see these messages:

  2754 PRLI failure DID:521245 Status:x9/xb2c00, data: x0
  0231 RSCN timeout Data: x0 x3
  0230 Unexpected timeout, hba link state x5

This is due to delayed RSCN activity.

Correct by avoiding the timeout thus the messages by restarting the
discovery timeout whenever an rscn is received.

Filter PRLI responses such that severity depends on whether expected for
the configuration or not. For example, PRLI errors on a fabric will be
informational (they are expected), but Point-to-Point errors are not
necessarily expected so they are raised to an error level.

Link: https://lore.kernel.org/r/20191105005708.7399-5-jsmart2021@gmail.com
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_els.c

index 9a1b7f3..9a570c1 100644 (file)
@@ -2236,6 +2236,7 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
        struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
        IOCB_t *irsp;
        struct lpfc_nodelist *ndlp;
+       char *mode;
 
        /* we pass cmdiocb to state machine which needs rspiocb as well */
        cmdiocb->context_un.rsp_iocb = rspiocb;
@@ -2273,8 +2274,17 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
                        goto out;
                }
 
+               /* If we don't send GFT_ID to Fabric, a PRLI error
+                * could be expected.
+                */
+               if ((vport->fc_flag & FC_FABRIC) ||
+                   (vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH))
+                       mode = KERN_ERR;
+               else
+                       mode = KERN_INFO;
+
                /* PRLI failed */
-               lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
+               lpfc_printf_vlog(vport, mode, LOG_ELS,
                                 "2754 PRLI failure DID:%06X Status:x%x/x%x, "
                                 "data: x%x\n",
                                 ndlp->nlp_DID, irsp->ulpStatus,
@@ -6465,7 +6475,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
        uint32_t payload_len, length, nportid, *cmd;
        int rscn_cnt;
        int rscn_id = 0, hba_id = 0;
-       int i;
+       int i, tmo;
 
        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
        lp = (uint32_t *) pcmd->virt;
@@ -6571,6 +6581,13 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
 
                spin_lock_irq(shost->host_lock);
                vport->fc_flag |= FC_RSCN_DEFERRED;
+
+               /* Restart disctmo if its already running */
+               if (vport->fc_flag & FC_DISC_TMO) {
+                       tmo = ((phba->fc_ratov * 3) + 3);
+                       mod_timer(&vport->fc_disctmo,
+                                 jiffies + msecs_to_jiffies(1000 * tmo));
+               }
                if ((rscn_cnt < FC_MAX_HOLD_RSCN) &&
                    !(vport->fc_flag & FC_RSCN_DISCOVERY)) {
                        vport->fc_flag |= FC_RSCN_MODE;