diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index ab697dbd0404..10f35b7f474a 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -2563,6 +2563,8 @@ 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); + ufshcd_prepare_lrbp_crypto(cmd->request, lrbp); lrbp->req_abort_skip = false; diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 72eaa9f93b94..377b7bcd0c3c 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -284,6 +284,7 @@ struct ufs_pwr_mode_info { * @program_key: program or evict an inline encryption key * @fill_prdt: called after initializing the standard PRDT fields so that any * variant-specific PRDT fields can be initialized too + * @prepare_command: called when receiving a request in the first place */ struct ufs_hba_variant_ops { const char *name; @@ -321,6 +322,8 @@ struct ufs_hba_variant_ops { const union ufs_crypto_cfg_entry *cfg, int slot); int (*fill_prdt)(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, unsigned int segments); + void (*prepare_command)(struct ufs_hba *hba, + struct request *rq, struct ufshcd_lrb *lrbp); }; /* clock gating state */ @@ -1214,6 +1217,13 @@ static inline int ufshcd_vops_fill_prdt(struct ufs_hba *hba, return 0; } +static inline void 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); +} + extern struct ufs_pm_lvl_states ufs_pm_lvl_states[]; /*