Message ID | 20240724135126.1786126-1-vamshigajjela@google.com |
---|---|
State | New |
Headers | show |
Series | scsi: ufs: core: Fix hba->last_dme_cmd_tstamp timestamp updating logic | expand |
On 7/24/24 6:51 AM, Vamshi Gajjela wrote: > The ufshcd_add_delay_before_dme_cmd() always introduces a delay of > MIN_DELAY_BEFORE_DME_CMDS_US between DME commands even when it's not > required. The delay is added when the UFS host controller supplies the > quirk UFSHCD_QUIRK_DELAY_BEFORE_DME_CMDS. > > Fix the logic to update hba->last_dme_cmd_tstamp to ensure subsequent > DME commands have the correct delay in the range of 0 to > MIN_DELAY_BEFORE_DME_CMDS_US. > > Update the timestamp at the end of the function to ensure it captures > the latest time after any necessary delay has been applied. > > Signed-off-by: Vamshi Gajjela <vamshigajjela@google.com> > Fixes: cad2e03d8607 ("ufs: add support to allow non standard behaviours (quirks)") > Cc: stable@vger.kernel.org > --- > drivers/ufs/core/ufshcd.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c > index dc757ba47522..406bda1585f6 100644 > --- a/drivers/ufs/core/ufshcd.c > +++ b/drivers/ufs/core/ufshcd.c > @@ -4090,11 +4090,16 @@ static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba) > min_sleep_time_us = > MIN_DELAY_BEFORE_DME_CMDS_US - delta; > else > - return; /* no more delay required */ > + min_sleep_time_us = 0; /* no more delay required */ > } > > - /* allow sleep for extra 50us if needed */ > - usleep_range(min_sleep_time_us, min_sleep_time_us + 50); > + if (min_sleep_time_us > 0) { > + /* allow sleep for extra 50us if needed */ > + usleep_range(min_sleep_time_us, min_sleep_time_us + 50); > + } > + > + /* update the last_dme_cmd_tstamp */ > + hba->last_dme_cmd_tstamp = ktime_get(); > } Reviewed-by: Bart Van Assche <bvanassche@acm.org>
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index dc757ba47522..406bda1585f6 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -4090,11 +4090,16 @@ static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba) min_sleep_time_us = MIN_DELAY_BEFORE_DME_CMDS_US - delta; else - return; /* no more delay required */ + min_sleep_time_us = 0; /* no more delay required */ } - /* allow sleep for extra 50us if needed */ - usleep_range(min_sleep_time_us, min_sleep_time_us + 50); + if (min_sleep_time_us > 0) { + /* allow sleep for extra 50us if needed */ + usleep_range(min_sleep_time_us, min_sleep_time_us + 50); + } + + /* update the last_dme_cmd_tstamp */ + hba->last_dme_cmd_tstamp = ktime_get(); } /**
The ufshcd_add_delay_before_dme_cmd() always introduces a delay of MIN_DELAY_BEFORE_DME_CMDS_US between DME commands even when it's not required. The delay is added when the UFS host controller supplies the quirk UFSHCD_QUIRK_DELAY_BEFORE_DME_CMDS. Fix the logic to update hba->last_dme_cmd_tstamp to ensure subsequent DME commands have the correct delay in the range of 0 to MIN_DELAY_BEFORE_DME_CMDS_US. Update the timestamp at the end of the function to ensure it captures the latest time after any necessary delay has been applied. Signed-off-by: Vamshi Gajjela <vamshigajjela@google.com> Fixes: cad2e03d8607 ("ufs: add support to allow non standard behaviours (quirks)") Cc: stable@vger.kernel.org --- drivers/ufs/core/ufshcd.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)