]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: ufs: core: Requeue aborted request
authorPeter Wang <peter.wang@mediatek.com>
Tue, 1 Oct 2024 09:19:17 +0000 (17:19 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 16 Oct 2024 02:07:32 +0000 (22:07 -0400)
After the SQ cleanup fix, the CQ will receive a response with the
corresponding tag marked as OCS: ABORTED. To align with the behavior of
Legacy SDB mode, the handling of OCS: ABORTED has been changed to match
that of OCS_INVALID_COMMAND_STATUS (SDB), with both returning a SCSI
result of DID_REQUEUE.

Furthermore, the workaround implemented before the SQ cleanup fix can be
removed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable@vger.kernel.org
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Link: https://lore.kernel.org/r/20241001091917.6917-3-peter.wang@mediatek.com
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index 6a71ebf953e2b930176371dc07e4892997d85356..f845166dc0d7d159e2641c7699dc58a75163ac24 100644 (file)
@@ -5416,10 +5416,12 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
                }
                break;
        case OCS_ABORTED:
-               result |= DID_ABORT << 16;
-               break;
        case OCS_INVALID_COMMAND_STATUS:
                result |= DID_REQUEUE << 16;
+               dev_warn(hba->dev,
+                               "OCS %s from controller for tag %d\n",
+                               (ocs == OCS_ABORTED ? "aborted" : "invalid"),
+                               lrbp->task_tag);
                break;
        case OCS_INVALID_CMD_TABLE_ATTR:
        case OCS_INVALID_PRDT_ATTR:
@@ -6465,26 +6467,12 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
        struct scsi_device *sdev = cmd->device;
        struct Scsi_Host *shost = sdev->host;
        struct ufs_hba *hba = shost_priv(shost);
-       struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-       struct ufs_hw_queue *hwq;
-       unsigned long flags;
 
        *ret = ufshcd_try_to_abort_task(hba, tag);
        dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
                hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
                *ret ? "failed" : "succeeded");
 
-       /* Release cmd in MCQ mode if abort succeeds */
-       if (hba->mcq_enabled && (*ret == 0)) {
-               hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-               if (!hwq)
-                       return 0;
-               spin_lock_irqsave(&hwq->cq_lock, flags);
-               if (ufshcd_cmd_inflight(lrbp->cmd))
-                       ufshcd_release_scsi_cmd(hba, lrbp);
-               spin_unlock_irqrestore(&hwq->cq_lock, flags);
-       }
-
        return *ret == 0;
 }