Commit 7b786bcb authored by Martin Michlmayr's avatar Martin Michlmayr Committed by Ben Hutchings

drivers/scsi/atp870u.c: fix bad use of udelay

commit 0f6d93aa upstream.

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

This is because udelay is defined on ARM, roughly speaking, as

	#define udelay(n) ((n) > 2000 ? __bad_udelay() : \
		__const_udelay((n) * ((2199023U*HZ)>>11)))

The argument to __const_udelay is the number of jiffies to wait divided
by 4, but this does not work unless the multiplication does not
overflow, and that is what the build error is designed to prevent.  The
intended behavior can be achieved by using mdelay to call udelay
multiple times in a loop.

[jrnieder@gmail.com: adding context]
Signed-off-by: default avatarMartin Michlmayr <tbm@cyrius.com>
Signed-off-by: default avatarJonathan Nieder <jrnieder@gmail.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 78333ac7
...@@ -1174,7 +1174,16 @@ static void tscam(struct Scsi_Host *host) ...@@ -1174,7 +1174,16 @@ static void tscam(struct Scsi_Host *host)
outw(val, tmport); outw(val, tmport);
outb(2, 0x80); outb(2, 0x80);
TCM_SYNC: 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 ? */ if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */
outw(0, tmport--); outw(0, tmport--);
outb(0, tmport); outb(0, tmport);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment