* [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to avoid overflow
@ 2012-11-26 8:35 Haijun Zhang
2012-11-26 8:35 ` [PATCH] Use u64 to calculate the timeout value " Haijun Zhang
2012-11-26 9:12 ` [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 " Anton Vorontsov
0 siblings, 2 replies; 5+ messages in thread
From: Haijun Zhang @ 2012-11-26 8:35 UTC (permalink / raw)
To: linux-mmc; +Cc: Haijun Zhang, Jerry Huang, Anton Vorontsov, Chris Ball
Convert the cmd_timeou_ms to u64 to avoid overflow
Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
Signed-off-by: Haijun Zhang <Haijun.Zhang@freescale.com>
CC: Anton Vorontsov <cbouatmailru@gmail.com>
CC: Chris Ball <cjb@laptop.org>
---
drivers/mmc/card/block.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 21056b9..51903de 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -469,7 +469,8 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
* mrq.data = NULL;
* cmd.cmd_timeout = idata->ic.cmd_timeout_ms;
*/
- data.timeout_ns = idata->ic.cmd_timeout_ms * 1000000;
+ data.timeout_ns = (u64)idata->ic.cmd_timeout_ms *
+ 1000000;
}
mrq.data = &data;
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH] Use u64 to calculate the timeout value to avoid overflow
2012-11-26 8:35 [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to avoid overflow Haijun Zhang
@ 2012-11-26 8:35 ` Haijun Zhang
2012-11-26 9:09 ` Anton Vorontsov
2012-11-26 9:12 ` [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 " Anton Vorontsov
1 sibling, 1 reply; 5+ messages in thread
From: Haijun Zhang @ 2012-11-26 8:35 UTC (permalink / raw)
To: linux-mmc; +Cc: Haijun Zhang, Jerry Huang, Anton Vorontsov, Chris Ball
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@freescale.com>
Signed-off-by: Haijun Zhang <Haijun.Zhang@freescale.com>
CC: Anton Vorontsov <cbouatmailru@gmail.com>
CC: Chris Ball <cjb@laptop.org>
---
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
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] Use u64 to calculate the timeout value to avoid overflow
2012-11-26 8:35 ` [PATCH] Use u64 to calculate the timeout value " Haijun Zhang
@ 2012-11-26 9:09 ` Anton Vorontsov
0 siblings, 0 replies; 5+ messages in thread
From: Anton Vorontsov @ 2012-11-26 9:09 UTC (permalink / raw)
To: Haijun Zhang; +Cc: linux-mmc, Jerry Huang, Chris Ball
On Mon, Nov 26, 2012 at 04:35:59PM +0800, Haijun Zhang wrote:
> As data timeout_ns use u64 to avoid overflow.
> So we use macro div_u64 to perform a division.
[...]
> --- 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)));
Why do you need u32 cast here?..
Thanks,
Anton.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to avoid overflow
2012-11-26 8:35 [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to avoid overflow Haijun Zhang
2012-11-26 8:35 ` [PATCH] Use u64 to calculate the timeout value " Haijun Zhang
@ 2012-11-26 9:12 ` Anton Vorontsov
2012-11-26 9:35 ` Zhang Haijun-B42677
1 sibling, 1 reply; 5+ messages in thread
From: Anton Vorontsov @ 2012-11-26 9:12 UTC (permalink / raw)
To: Haijun Zhang; +Cc: linux-mmc, Jerry Huang, Chris Ball
On Mon, Nov 26, 2012 at 04:35:58PM +0800, Haijun Zhang wrote:
> Convert the cmd_timeou_ms to u64 to avoid overflow
>
> Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> Signed-off-by: Haijun Zhang <Haijun.Zhang@freescale.com>
Reviewed-by: Anton Vorontsov <cbouatmailru@gmail.com>
But I think you should merge the two patches...
Thanks,
> CC: Chris Ball <cjb@laptop.org>
> ---
> drivers/mmc/card/block.c | 3 ++-
> 1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index 21056b9..51903de 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -469,7 +469,8 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
> * mrq.data = NULL;
> * cmd.cmd_timeout = idata->ic.cmd_timeout_ms;
> */
> - data.timeout_ns = idata->ic.cmd_timeout_ms * 1000000;
> + data.timeout_ns = (u64)idata->ic.cmd_timeout_ms *
> + 1000000;
> }
>
> mrq.data = &data;
> --
> 1.7.0.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to avoid overflow
2012-11-26 9:12 ` [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 " Anton Vorontsov
@ 2012-11-26 9:35 ` Zhang Haijun-B42677
0 siblings, 0 replies; 5+ messages in thread
From: Zhang Haijun-B42677 @ 2012-11-26 9:35 UTC (permalink / raw)
To: Anton Vorontsov
Cc: linux-mmc@vger.kernel.org, Huang Changming-R66093, Chris Ball
Hi, Anton
This patch was for public C file. That was for different Host controller.
I think let them standalone will be better.
The u32 conversion will be removed.
Thanks.
Regards
Haijun.
> -----Original Message-----
> From: Anton Vorontsov [mailto:cbouatmailru@gmail.com]
> Sent: Monday, November 26, 2012 5:12 PM
> To: Zhang Haijun-B42677
> Cc: linux-mmc@vger.kernel.org; Huang Changming-R66093; Chris Ball
> Subject: Re: [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to
> avoid overflow
>
> On Mon, Nov 26, 2012 at 04:35:58PM +0800, Haijun Zhang wrote:
> > Convert the cmd_timeou_ms to u64 to avoid overflow
> >
> > Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> > Signed-off-by: Haijun Zhang <Haijun.Zhang@freescale.com>
>
> Reviewed-by: Anton Vorontsov <cbouatmailru@gmail.com>
>
> But I think you should merge the two patches...
>
> Thanks,
>
> > CC: Chris Ball <cjb@laptop.org>
> > ---
> > drivers/mmc/card/block.c | 3 ++-
> > 1 files changed, 2 insertions(+), 1 deletions(-)
> >
> > diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index
> > 21056b9..51903de 100644
> > --- a/drivers/mmc/card/block.c
> > +++ b/drivers/mmc/card/block.c
> > @@ -469,7 +469,8 @@ static int mmc_blk_ioctl_cmd(struct block_device
> *bdev,
> > * mrq.data = NULL;
> > * cmd.cmd_timeout = idata->ic.cmd_timeout_ms;
> > */
> > - data.timeout_ns = idata->ic.cmd_timeout_ms * 1000000;
> > + data.timeout_ns = (u64)idata->ic.cmd_timeout_ms *
> > + 1000000;
> > }
> >
> > mrq.data = &data;
> > --
> > 1.7.0.4
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-11-26 9:35 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-26 8:35 [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 to avoid overflow Haijun Zhang
2012-11-26 8:35 ` [PATCH] Use u64 to calculate the timeout value " Haijun Zhang
2012-11-26 9:09 ` Anton Vorontsov
2012-11-26 9:12 ` [PATCH] Powerpc eSDHC: Convert the cmd_timeou_ms to u64 " Anton Vorontsov
2012-11-26 9:35 ` Zhang Haijun-B42677
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).