On Sat 23 Apr 07:02 PDT 2022, Manivannan Sadhasivam wrote: > In ufs_qcom_dev_ref_clk_ctrl(), it was noted that the ref_clk needs to be > stable for at least 1us. Even though there is wmb() to make sure the write > gets "completed", there is no guarantee that the write actually reached > the UFS device. There is a good chance that the write could be stored in > a Write Buffer (WB). In that case, even though the CPU waits for 1us, the > ref_clk might not be stable for that period. > > So lets do a readl() to make sure that the previous write has reached the > UFS device before udelay(). > > Also, the wmb() after writel_relaxed is not really needed. Both writel and > readl are ordered on all architectures and the CPU won't speculate > instructions after readl() due to the in-built control dependency with > read value on weakly ordered architectures. So it can be safely removed. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: f06fcc7155dc ("scsi: ufs-qcom: add QUniPro hardware support and power optimizations") > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> Reviewed-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> > --- > drivers/scsi/ufs/ufs-qcom.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c > index 6ee33cc0ad09..f47a16b7cff5 100644 > --- a/drivers/scsi/ufs/ufs-qcom.c > +++ b/drivers/scsi/ufs/ufs-qcom.c > @@ -687,8 +687,11 @@ static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_qcom_host *host, bool enable) > > writel_relaxed(temp, host->dev_ref_clk_ctrl_mmio); > > - /* ensure that ref_clk is enabled/disabled before we return */ > - wmb(); > + /* > + * Make sure the write to ref_clk reaches the destination and > + * not stored in a Write Buffer (WB). > + */ > + readl(host->dev_ref_clk_ctrl_mmio); > > /* > * If we call hibern8 exit after this, we need to make sure that > -- > 2.25.1 >