From: Willy Tarreau Date: Sat, 25 Nov 2006 20:49:21 +0000 (+0100) Subject: [PATCH] ps2esdi: typo may cause premature timeout X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=8f9ef6ad57f199f566bec80cb93bde0153604471;p=linux-kernel-docs%2Flinux-2.4.36.git [PATCH] ps2esdi: typo may cause premature timeout The stop condition in the following statement causes an immediate break out of the loop because ESDI_TIMEOUT=0xf000 and the result of the !(inb()) expression can only be either 0 or 1, which means that i never gets counted down. for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); The obvious cause is the use of "i & !" instead of "i && !". This was already fixed in 2.6. Signed-off-by: Willy Tarreau --- diff --git a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c index 291b9b98..08583c44 100644 --- a/drivers/block/ps2esdi.c +++ b/drivers/block/ps2esdi.c @@ -741,7 +741,7 @@ static void ps2esdi_geometry_int_handler(u_int int_ret_code) drive_num = int_ret_code >> 5; switch (int_ret_code & 0xf) { case INT_CMD_COMPLETE: - for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); + for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) { printk("%s: timeout reading status word\n", DEVICE_NAME); outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN); @@ -876,7 +876,7 @@ static void ps2esdi_normal_interrupt_handler(u_int int_ret_code) break; case INT_CMD_COMPLETE: - for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); + for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--); if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) { printk("%s: timeout reading status word\n", DEVICE_NAME); outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);