scsi: ufs-mediatek: Fix imprecise waiting time for ref-clk control
authorStanley Chu <stanley.chu@mediatek.com>
Mon, 1 Jun 2020 10:46:42 +0000 (18:46 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 16 Jun 2020 03:06:39 +0000 (23:06 -0400)
Currently ref-clk control timeout is implemented by jiffies. However
jiffies is not accurate enough thus "false timeout" may happen.

Use more accurate delay mechanism instead, i.e. ktime.

Link: https://lore.kernel.org/r/20200601104646.15436-2-stanley.chu@mediatek.com
Reviewed-by: Andy Teng <andy.teng@mediatek.com>
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufs-mediatek.c
drivers/scsi/ufs/ufs-mediatek.h

index d56ce8d97d4e8642ed666fd79c0515c138b5434b..523ee55739212ad257776b86366a229e339102e7 100644 (file)
@@ -120,7 +120,7 @@ static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, bool on)
 {
        struct ufs_mtk_host *host = ufshcd_get_variant(hba);
        struct arm_smccc_res res;
-       unsigned long timeout;
+       ktime_t timeout, time_checked;
        u32 value;
 
        if (host->ref_clk_enabled == on)
@@ -135,8 +135,9 @@ static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, bool on)
        }
 
        /* Wait for ack */
-       timeout = jiffies + msecs_to_jiffies(REFCLK_REQ_TIMEOUT_MS);
+       timeout = ktime_add_us(ktime_get(), REFCLK_REQ_TIMEOUT_US);
        do {
+               time_checked = ktime_get();
                value = ufshcd_readl(hba, REG_UFS_REFCLK_CTRL);
 
                /* Wait until ack bit equals to req bit */
@@ -144,7 +145,7 @@ static int ufs_mtk_setup_ref_clk(struct ufs_hba *hba, bool on)
                        goto out;
 
                usleep_range(100, 200);
-       } while (time_before(jiffies, timeout));
+       } while (ktime_before(time_checked, timeout));
 
        dev_err(hba->dev, "missing ack of refclk req, reg: 0x%x\n", value);
 
index 5bbd3e9cbae2abbb48b92fa57e0d06b0721bd240..fc42dcbfd8001ea54a7233e42afe841b0dc43a95 100644 (file)
@@ -28,7 +28,7 @@
 #define REFCLK_REQUEST              BIT(0)
 #define REFCLK_ACK                  BIT(1)
 
-#define REFCLK_REQ_TIMEOUT_MS       3
+#define REFCLK_REQ_TIMEOUT_US       3000
 
 /*
  * Vendor specific pre-defined parameters