blob: a52d9f069badfd1f1382e62a269f047c135f5a70 [file] [log] [blame]
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Stanley Chu <stanley.chu@mediatek.com>
Date: Tue, 10 Nov 2020 16:16:18 +0800
Subject: ANDROID: scsi: ufs: Allow prepare_command to return error code
Allow variant function "prepare_command" to return error
code. This is useful for vendors to halt or retry command
execution if needed.
Signed-off-by: Stanley Chu <Stanley.Chu@mediatek.com>
Bug: 172874931
Change-Id: Ibe327ab39b83644a1c5a29d821f01c08eb7ea6f1
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
---
drivers/scsi/ufs/ufshcd.c | 7 ++++++-
drivers/scsi/ufs/ufshcd.h | 7 ++++---
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -2612,7 +2612,12 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
lrbp->lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun);
lrbp->intr_cmd = !ufshcd_is_intr_aggr_allowed(hba) ? true : false;
- ufshcd_vops_prepare_command(hba, cmd->request, lrbp);
+ err = ufshcd_vops_prepare_command(hba, cmd->request, lrbp);
+ if (err) {
+ lrbp->cmd = NULL;
+ ufshcd_release(hba);
+ goto out;
+ }
ufshcd_prepare_lrbp_crypto(cmd->request, lrbp);
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -368,7 +368,7 @@ struct ufs_hba_variant_ops {
enum ufs_event_type evt, void *data);
int (*fill_prdt)(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
unsigned int segments);
- void (*prepare_command)(struct ufs_hba *hba,
+ int (*prepare_command)(struct ufs_hba *hba,
struct request *rq, struct ufshcd_lrb *lrbp);
int (*update_sysfs)(struct ufs_hba *hba);
void (*send_command)(struct ufs_hba *hba, struct ufshcd_lrb *lrbp);
@@ -1287,11 +1287,12 @@ static inline int ufshcd_vops_fill_prdt(struct ufs_hba *hba,
return 0;
}
-static inline void ufshcd_vops_prepare_command(struct ufs_hba *hba,
+static inline int ufshcd_vops_prepare_command(struct ufs_hba *hba,
struct request *rq, struct ufshcd_lrb *lrbp)
{
if (hba->vops && hba->vops->prepare_command)
- hba->vops->prepare_command(hba, rq, lrbp);
+ return hba->vops->prepare_command(hba, rq, lrbp);
+ return 0;
}
static inline int ufshcd_vops_update_sysfs(struct ufs_hba *hba)