[PATCH] Use u64 to calculate the timeout value to avoid overflow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As data timeout_ns use u64 to avoid overflow.
So we use macro div_u64 to perform a division.
Below C file modified:
 - drivers/mmc/host/atmel-mci.c
 - drivers/mmc/host/bfin_sdh.c
 - drivers/mmc/host/davinci_mmc.c
 - drivers/mmc/host/mmci.c
 - drivers/mmc/host/mvsdio.c
 - drivers/mmc/host/mxs-mmc.c
 - drivers/mmc/host/omap.c
 - drivers/mmc/host/tifm_sd.c
 - drivers/mmc/host/wbsd.c

Signed-off-by: Jerry Huang <Chang-Ming.Huang@xxxxxxxxxxxxx>
Signed-off-by: Haijun Zhang <Haijun.Zhang@xxxxxxxxxxxxx>
CC: Anton Vorontsov <cbouatmailru@xxxxxxxxx>
CC: Chris Ball <cjb@xxxxxxxxxx>
---
 drivers/mmc/host/atmel-mci.c   |    7 +++----
 drivers/mmc/host/bfin_sdh.c    |    2 +-
 drivers/mmc/host/davinci_mmc.c |    4 ++--
 drivers/mmc/host/mmci.c        |    2 +-
 drivers/mmc/host/mvsdio.c      |    2 +-
 drivers/mmc/host/mxs-mmc.c     |    4 ++--
 drivers/mmc/host/omap.c        |    2 +-
 drivers/mmc/host/tifm_sd.c     |    4 ++--
 drivers/mmc/host/wbsd.c        |    2 +-
 9 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
index ddf096e..0f74d37 100644
--- a/drivers/mmc/host/atmel-mci.c
+++ b/drivers/mmc/host/atmel-mci.c
@@ -593,17 +593,16 @@ static void atmci_timeout_timer(unsigned long data)
 	tasklet_schedule(&host->tasklet);
 }
 
-static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host,
-					unsigned int ns)
+static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host, u64 ns)
 {
 	/*
 	 * It is easier here to use us instead of ns for the timeout,
 	 * it prevents from overflows during calculation.
 	 */
-	unsigned int us = DIV_ROUND_UP(ns, 1000);
+	u64 us = DIV_ROUND_UP_ULL(ns, 1000);
 
 	/* Maximum clock frequency is host->bus_hz/2 */
-	return us * (DIV_ROUND_UP(host->bus_hz, 2000000));
+	return (u32)(us * (DIV_ROUND_UP_ULL(host->bus_hz, 2000000)));
 }
 
 static void atmci_set_timeout(struct atmel_mci *host,
diff --git a/drivers/mmc/host/bfin_sdh.c b/drivers/mmc/host/bfin_sdh.c
index b9b463e..88e0abb 100644
--- a/drivers/mmc/host/bfin_sdh.c
+++ b/drivers/mmc/host/bfin_sdh.c
@@ -143,7 +143,7 @@ static int sdh_setup_data(struct sdh_host *host, struct mmc_data *data)
 	bfin_write_SDH_DATA_CTL(data_ctl);
 	/* the time of a host clock period in ns */
 	cycle_ns = 1000000000 / (host->sclk / (2 * (host->clk_div + 1)));
-	timeout = data->timeout_ns / cycle_ns;
+	timeout = div_u64(data->timeout_ns, cycle_ns);
 	timeout += data->timeout_clks;
 	bfin_write_SDH_DATA_TIMER(timeout);
 	SSYNC();
diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index 2063677..a48b475 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -568,10 +568,10 @@ mmc_davinci_prepare_data(struct mmc_davinci_host *host, struct mmc_request *req)
 		(data->flags & MMC_DATA_STREAM) ? "stream" : "block",
 		(data->flags & MMC_DATA_WRITE) ? "write" : "read",
 		data->blocks, data->blksz);
-	dev_dbg(mmc_dev(host->mmc), "  DTO %d cycles + %d ns\n",
+	dev_dbg(mmc_dev(host->mmc), "  DTO %d cycles + %lld ns\n",
 		data->timeout_clks, data->timeout_ns);
 	timeout = data->timeout_clks +
-		(data->timeout_ns / host->ns_in_one_cycle);
+		div_u64(data->timeout_ns, host->ns_in_one_cycle);
 	if (timeout > 0xffff)
 		timeout = 0xffff;
 
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index edc3e9b..09fe317 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -632,7 +632,7 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
 	host->size = data->blksz * data->blocks;
 	data->bytes_xfered = 0;
 
-	clks = (unsigned long long)data->timeout_ns * host->cclk;
+	clks = data->timeout_ns * host->cclk;
 	do_div(clks, 1000000000UL);
 
 	timeout = data->timeout_clks + (unsigned int)clks;
diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index de4c20b..3badc4f 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -92,7 +92,7 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data)
 	}
 
 	/* If timeout=0 then maximum timeout index is used. */
-	tmout = DIV_ROUND_UP(data->timeout_ns, host->ns_per_clk);
+	tmout = DIV_ROUND_UP_ULL(data->timeout_ns, host->ns_per_clk);
 	tmout += data->timeout_clks;
 	tmout_index = fls(tmout - 1) - 12;
 	if (tmout_index < 0)
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index 206fe49..9f3617b 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -331,7 +331,7 @@ out:
 		 "%s: failed to prep dma\n", __func__);
 }
 
-static unsigned short mxs_ns_to_ssp_ticks(unsigned clock_rate, unsigned ns)
+static unsigned short mxs_ns_to_ssp_ticks(unsigned clock_rate, u64 ns)
 {
 	const unsigned int ssp_timeout_mul = 4096;
 	/*
@@ -339,7 +339,7 @@ static unsigned short mxs_ns_to_ssp_ticks(unsigned clock_rate, unsigned ns)
 	 * and might overflow
 	 */
 	const unsigned int clock_per_ms = clock_rate / 1000;
-	const unsigned int ms = ns / 1000;
+	const unsigned int ms = div_u64(ns, 1000);
 	const unsigned int ticks = ms * clock_per_ms;
 	const unsigned int ssp_ticks = ticks / ssp_timeout_mul;
 
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
index 48ad361..daf0636 100644
--- a/drivers/mmc/host/omap.c
+++ b/drivers/mmc/host/omap.c
@@ -921,7 +921,7 @@ static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_reque
 	u16 reg;
 
 	cycle_ns = 1000000000 / host->current_slot->fclk_freq;
-	timeout = req->data->timeout_ns / cycle_ns;
+	timeout = div_u64(req->data->timeout_ns, cycle_ns);
 	timeout += req->data->timeout_clks;
 
 	/* Check if we need to use timeout multiplier register */
diff --git a/drivers/mmc/host/tifm_sd.c b/drivers/mmc/host/tifm_sd.c
index 43d9628..4552d2b 100644
--- a/drivers/mmc/host/tifm_sd.c
+++ b/drivers/mmc/host/tifm_sd.c
@@ -599,8 +599,8 @@ static void tifm_sd_set_data_timeout(struct tifm_sd *host,
 	if (fixed_timeout)
 		return;
 
-	data_timeout += data->timeout_ns /
-			((1000000000UL / host->clk_freq) * host->clk_div);
+	data_timeout += div_u64(data->timeout_ns,
+			((1000000000UL / host->clk_freq) * host->clk_div));
 
 	if (data_timeout < 0xffff) {
 		writel(data_timeout, sock->addr + SOCK_MMCSD_DATA_TO);
diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c
index 64acd9c..dc31295 100644
--- a/drivers/mmc/host/wbsd.c
+++ b/drivers/mmc/host/wbsd.c
@@ -558,7 +558,7 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data)
 		wbsd_write_index(host, WBSD_IDX_TAAC, 127);
 	else {
 		wbsd_write_index(host, WBSD_IDX_TAAC,
-			data->timeout_ns / 1000000);
+			div_u64(data->timeout_ns, 1000000));
 	}
 
 	if (data->timeout_clks > 255)
-- 
1.7.0.4


--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux