[PATCH v8 3/3] ufs: core: add a quirk for MediaTek SDB mode aborted
Bart Van Assche
bvanassche at acm.org
Mon Sep 23 11:15:28 PDT 2024
On 9/23/24 1:03 AM, peter.wang at mediatek.com wrote:
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index b5c7bc50a27e..b42079c3d634 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -5404,7 +5404,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
> }
> break;
> case OCS_ABORTED:
> - result |= DID_ABORT << 16;
> + if (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)
> + result |= DID_REQUEUE << 16;
> + else
> + result |= DID_ABORT << 16;
> dev_warn(hba->dev,
> "OCS aborted from controller = %x for tag %d\n",
> ocs, lrbp->task_tag);
I think the approach of this patch is racy: the cmd->result assignment
by ufshcd_transfer_rsp_status() races with the cmd->result assignment by
ufshcd_abort_one(). How about addressing this race as follows?
* In ufshcd_compl_one_cqe(), if the OCS_ABORTED status is encountered,
set a completion.
* In the code that aborts SCSI commands, for MediaTek controllers only,
wait for that completion (based on a quirk).
* Instead of introducing an if-statement in
ufshcd_transfer_rsp_status(), rely on the cmd->result value assigned
by ufshcd_abort_one().
Thanks,
Bart.
More information about the Linux-mediatek
mailing list