@@ -5405,9 +5405,15 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
break;
case OCS_ABORTED:
result |= DID_ABORT << 16;
+ dev_warn(hba->dev,
+ "OCS aborted from controller for tag %d\n",
+ lrbp->task_tag);
break;
case OCS_INVALID_COMMAND_STATUS:
result |= DID_REQUEUE << 16;
+ dev_warn(hba->dev,
+ "OCS invaild from controller for tag %d\n",
+ lrbp->task_tag);
break;
case OCS_INVALID_CMD_TABLE_ATTR:
case OCS_INVALID_PRDT_ATTR:
@@ -5526,6 +5532,18 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
ufshcd_update_monitor(hba, lrbp);
ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
+
+ /*
+ * Ignore MCQ OCS: ABORTED posted by the host controller.
+ * This makes the behavior of MCQ mode consistent with that
+ * of legacy SDB mode.
+ */
+ if (hba->mcq_enabled) {
+ ocs = ufshcd_get_tr_ocs(lrbp, cqe);
+ if (ocs == OCS_ABORTED)
+ return;
+ }
+
ufshcd_release_scsi_cmd(hba, lrbp);
/* Do not touch lrbp after scsi done */
scsi_done(cmd);
@@ -6486,8 +6504,11 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
if (!hwq)
return 0;
spin_lock_irqsave(&hwq->cq_lock, flags);
- if (ufshcd_cmd_inflight(lrbp->cmd))
+ if (ufshcd_cmd_inflight(lrbp->cmd)) {
+ set_host_byte(lrbp->cmd, DID_REQUEUE);
ufshcd_release_scsi_cmd(hba, lrbp);
+ scsi_done(lrbp->cmd);
+ }
spin_unlock_irqrestore(&hwq->cq_lock, flags);
}