rendered paste bodydiff -ur linux-2.6.18-old/drivers/scsi/libata-core.c linux-2.6.18/drivers/scsi/libata-core.c--- linux-2.6.18-old/drivers/scsi/libata-core.c 2006-09-20 05:42:06.000000000 +0200+++ linux-2.6.18/drivers/scsi/libata-core.c 2006-10-16 10:47:24.000000000 +0200@@ -2271,11 +2271,15 @@ * Sleep until ATA Status register bit BSY clears, * or a timeout occurs. *- * LOCKING: None.+ * LOCKING:+ * Kernel thread context (may sleep).+ *+ * RETURNS:+ * 0 on success, -errno otherwise. */-unsigned int ata_busy_sleep (struct ata_port *ap,- unsigned long tmout_pat, unsigned long tmout)+int ata_busy_sleep (struct ata_port *ap,+ unsigned long tmout_pat, unsigned long tmout) { unsigned long timer_start, timeout; u8 status;@@ -2283,25 +2287,30 @@ status = ata_busy_wait(ap, ATA_BUSY, 300); timer_start = jiffies; timeout = timer_start + tmout_pat;- while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) {+ while (status != 0xff && (status & ATA_BUSY) &&+ time_before(jiffies, timeout)) { msleep(50); status = ata_busy_wait(ap, ATA_BUSY, 3); }- if (status & ATA_BUSY)+ if (status != 0xff && (status & ATA_BUSY)) ata_port_printk(ap, KERN_WARNING, "port is slow to respond, please be patient\n"); timeout = timer_start + tmout;- while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) {+ while (status != 0xff && (status & ATA_BUSY) &&+ time_before(jiffies, timeout)) { msleep(50); status = ata_chk_status(ap); }+ if (status == 0xff)+ return -ENODEV;+ if (status & ATA_BUSY) { ata_port_printk(ap, KERN_ERR, "port failed to respond " "(%lu secs)\n", tmout / HZ);- return 1;+ return -EBUSY; } return 0;@@ -2392,10 +2401,8 @@ * the bus shows 0xFF because the odd clown forgets the D7 * pulldown resistor. */- if (ata_check_status(ap) == 0xFF) {- ata_port_printk(ap, KERN_ERR, "SRST failed (status 0xFF)\n");- return AC_ERR_OTHER;- }+ if (ata_check_status(ap) == 0xFF)+ return 0; ata_bus_post_reset(ap, devmask);diff -ur linux-2.6.18-old/include/linux/libata.h linux-2.6.18/include/linux/libata.h--- linux-2.6.18-old/include/linux/libata.h 2006-09-20 05:42:06.000000000 +0200+++ linux-2.6.18/include/linux/libata.h 2006-10-16 10:59:40.000000000 +0200@@ -702,9 +702,8 @@ pm_message_t mesg); extern void ata_host_set_resume(struct ata_host_set *host_set); extern int ata_ratelimit(void);-extern unsigned int ata_busy_sleep(struct ata_port *ap,- unsigned long timeout_pat,- unsigned long timeout);+extern int ata_busy_sleep(struct ata_port *ap,+ unsigned long timeout_pat, unsigned long timeout); extern void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data, unsigned long delay); extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,@@ -1019,7 +1018,7 @@ udelay(10); status = ata_chk_status(ap); max--;- } while ((status & bits) && (max > 0));+ } while (status != 0xff && (status & bits) && (max > 0)); return status; }@@ -1040,7 +1039,7 @@ { u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);- if (status & (ATA_BUSY | ATA_DRQ)) {+ if (status != 0xff && (status & (ATA_BUSY | ATA_DRQ))) { unsigned long l = ap->ioaddr.status_addr; if (ata_msg_warn(ap)) printk(KERN_WARNING "ATA: abnormal status 0x%X on port 0x%lX\n",