@@ -5016,6 +5016,7 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
lrbp->in_use = false;
lrbp->compl_time_stamp = ktime_get();
cmd = lrbp->cmd;
+ ufshcd_vops_compl_xfer_req(hba, index, (cmd) ? true : false);
if (cmd) {
ufshcd_add_command_trace(hba, index, "complete");
result = ufshcd_transfer_rsp_status(hba, lrbp);
@@ -310,7 +310,7 @@ struct ufs_pwr_mode_info {
* is carried out to allow vendor spesific capabilities
* to be set.
* @setup_xfer_req: called before any transfer request is issued
- * to set some things
+ * @compl_xfer_req: called when any transfer request is completed
* @setup_task_mgmt: called before any task management request is issued
* to set some things
* @hibern8_notify: called around hibern8 enter/exit
@@ -341,6 +341,7 @@ struct ufs_hba_variant_ops {
struct ufs_pa_layer_attr *,
struct ufs_pa_layer_attr *);
void (*setup_xfer_req)(struct ufs_hba *, int, bool);
+ void (*compl_xfer_req)(struct ufs_hba *hba, int tag, bool is_scsi);
void (*setup_task_mgmt)(struct ufs_hba *, int, u8);
void (*hibern8_notify)(struct ufs_hba *, enum uic_cmd_dme,
enum ufs_notify_change_status);
@@ -1166,6 +1167,13 @@ static inline void ufshcd_vops_setup_xfer_req(struct ufs_hba *hba, int tag,
return hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);
}
+static inline void ufshcd_vops_compl_xfer_req(struct ufs_hba *hba,
+ int tag, bool is_scsi)
+{
+ if (hba->vops && hba->vops->compl_xfer_req)
+ hba->vops->compl_xfer_req(hba, tag, is_scsi);
+}
+
static inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba *hba,
int tag, u8 tm_function)
{