scsi: qedf: Honor status qualifier in FCP_RSP per spec
authorJaved Hasan <jhasan@marvell.com>
Thu, 16 Apr 2020 08:43:09 +0000 (01:43 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 17 Apr 2020 21:55:25 +0000 (17:55 -0400)
Handle scope and qualifier on SAM_STAT_TASK_SET_FULL or SAM_STAT_BUSY

[mkp: added braces to fix sparse complaint]

Link: https://lore.kernel.org/r/20200416084314.18851-5-skashyap@marvell.com
Signed-off-by: Javed Hasan <jhasan@marvell.com>
Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedf/qedf_io.c

index 64c176980752c40752c0f09c1dff4003c76d4a94..0f6a15c1a04b32a7ae0bbd8bb47d444ec83f6dc5 100644 (file)
@@ -1138,6 +1138,8 @@ void qedf_scsi_completion(struct qedf_ctx *qedf, struct fcoe_cqe *cqe,
        int refcount;
        u16 scope, qualifier = 0;
        u8 fw_residual_flag = 0;
+       unsigned long flags = 0;
+       u16 chk_scope = 0;
 
        if (!io_req)
                return;
@@ -1271,16 +1273,8 @@ void qedf_scsi_completion(struct qedf_ctx *qedf, struct fcoe_cqe *cqe,
                                /* Lower 14 bits */
                                qualifier = fcp_rsp->retry_delay_timer & 0x3FFF;
 
-                               if (qedf_retry_delay &&
-                                   scope > 0 && qualifier > 0 &&
-                                   qualifier <= 0x3FEF) {
-                                       /* Check we don't go over the max */
-                                       if (qualifier > QEDF_RETRY_DELAY_MAX)
-                                               qualifier =
-                                                   QEDF_RETRY_DELAY_MAX;
-                                       fcport->retry_delay_timestamp =
-                                           jiffies + (qualifier * HZ / 10);
-                               }
+                               if (qedf_retry_delay)
+                                       chk_scope = 1;
                                /* Record stats */
                                if (io_req->cdb_status ==
                                    SAM_STAT_TASK_SET_FULL)
@@ -1291,6 +1285,36 @@ void qedf_scsi_completion(struct qedf_ctx *qedf, struct fcoe_cqe *cqe,
                }
                if (io_req->fcp_resid)
                        scsi_set_resid(sc_cmd, io_req->fcp_resid);
+
+               if (chk_scope == 1) {
+                       if ((scope == 1 || scope == 2) &&
+                           (qualifier > 0 && qualifier <= 0x3FEF)) {
+                               /* Check we don't go over the max */
+                               if (qualifier > QEDF_RETRY_DELAY_MAX) {
+                                       qualifier = QEDF_RETRY_DELAY_MAX;
+                                       QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_IO,
+                                                 "qualifier = %d\n",
+                                                 (fcp_rsp->retry_delay_timer &
+                                                 0x3FFF));
+                               }
+                               QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_IO,
+                                         "Scope = %d and qualifier = %d",
+                                         scope, qualifier);
+                               /*  Take fcport->rport_lock to
+                                *  update the retry_delay_timestamp
+                                */
+                               spin_lock_irqsave(&fcport->rport_lock, flags);
+                               fcport->retry_delay_timestamp =
+                                       jiffies + (qualifier * HZ / 10);
+                               spin_unlock_irqrestore(&fcport->rport_lock,
+                                                      flags);
+
+                       } else {
+                               QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_IO,
+                                         "combination of scope = %d and qualifier = %d is not handled in qedf.\n",
+                                         scope, qualifier);
+                       }
+               }
                break;
        default:
                QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_IO, "fcp_status=%d.\n",