aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorMartin Michlmayr <tbm@cyrius.com>2012-10-04 20:11:25 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-10-05 14:04:37 -0400
commit0f6d93aa9d96cc9022b51bd10d462b03296be146 (patch)
tree85776a4c9b1602646405fd7f5f4c336824b2b0f6 /drivers/scsi
parent82e54a6aaf8aec971fb16afa3a4404e238a1b98b (diff)
drivers/scsi/atp870u.c: fix bad use of udelay
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: Martin Michlmayr <tbm@cyrius.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Cc: James Bottomley <James.Bottomley@HansenPartnership.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/atp870u.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
index 68ce08552f69..a540162ac59c 100644
--- a/drivers/scsi/atp870u.c
+++ b/drivers/scsi/atp870u.c
@@ -1173,7 +1173,16 @@ wait_io1:
1173 outw(val, tmport); 1173 outw(val, tmport);
1174 outb(2, 0x80); 1174 outb(2, 0x80);
1175TCM_SYNC: 1175TCM_SYNC:
1176 udelay(0x800); 1176 /*
1177 * The funny division into multiple delays is to accomodate
1178 * arches like ARM where udelay() multiplies its argument by
1179 * a large number to initialize a loop counter. To avoid
1180 * overflow, the maximum supported udelay is 2000 microseconds.
1181 *
1182 * XXX it would be more polite to find a way to use msleep()
1183 */
1184 mdelay(2);
1185 udelay(48);
1177 if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */ 1186 if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */
1178 outw(0, tmport--); 1187 outw(0, tmport--);
1179 outb(0, tmport); 1188 outb(0, tmport);