[PATCH/RFC v2] [SCSI] atp870u: Fix bad use of udelay
Andrew Morton
akpm at linux-foundation.org
Tue Apr 24 17:18:50 EDT 2012
On Tue, 24 Apr 2012 02:49:16 -0500
Jonathan Nieder <jrnieder at gmail.com> wrote:
> From: Martin Michlmayr <tbm at cyrius.com>
>
> The ACARD driver calls udelay() with a value > 2000, which leads to
> to the following compilation error on ARM:
> ERROR: "__bad_udelay" [drivers/scsi/atp870u.ko] undefined!
> make[1]: *** [__modpost] Error 1
>
> ...
>
> --- a/drivers/scsi/atp870u.c
> +++ b/drivers/scsi/atp870u.c
> @@ -1173,7 +1173,16 @@ wait_io1:
> outw(val, tmport);
> outb(2, 0x80);
> TCM_SYNC:
> - udelay(0x800);
> + /*
> + * The funny division into multiple delays is to accomodate
> + * arches like ARM where udelay() multiplies its argument by
> + * a large number to initialize a loop counter. To avoid
> + * overflow, the maximum supported udelay is 2000 microseconds.
> + *
> + * XXX it would be more polite to find a way to use msleep()
> + */
> + mdelay(2);
> + udelay(48);
> if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */
> outw(0, tmport--);
> outb(0, tmport);
Fair enough, I say. Looking at this driver, I do think it's best to
minimally fix the build and then tiptoe away very delicately lest
something explode.
That being said, I'm glad the kernel has a function called "fun_scam".
More information about the linux-arm-kernel
mailing list