diff -purN v2.6.12-rc4/drivers/scsi/ata_piix.c libata-rc4/drivers/scsi/ata_piix.c --- v2.6.12-rc4/drivers/scsi/ata_piix.c 2005-04-28 11:01:54.000000000 -0400 +++ libata-rc4/drivers/scsi/ata_piix.c 2005-05-13 13:30:39.000000000 -0400 @@ -228,6 +228,7 @@ static struct ata_port_info piix_port_in .sht = &piix_sht, .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | + ATA_FLAG_NO_UDELAY | ATA_FLAG_SLAVE_POSS, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ diff -purN v2.6.12-rc4/include/linux/libata.h libata-rc4/include/linux/libata.h --- v2.6.12-rc4/include/linux/libata.h 2005-04-06 17:28:10.000000000 -0400 +++ libata-rc4/include/linux/libata.h 2005-05-13 13:32:15.000000000 -0400 @@ -113,6 +113,7 @@ enum { ATA_FLAG_MMIO = (1 << 6), /* use MMIO, not PIO */ ATA_FLAG_SATA_RESET = (1 << 7), /* use COMRESET */ ATA_FLAG_PIO_DMA = (1 << 8), /* PIO cmds via DMA */ + ATA_FLAG_NO_UDELAY = (1 << 9), /* don't udelay on port access */ ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ @@ -469,7 +470,8 @@ static inline u8 ata_chk_status(struct a static inline void ata_pause(struct ata_port *ap) { ata_altstatus(ap); - ndelay(400); + if (!(ap->flags & ATA_FLAG_NO_UDELAY)) + ndelay(400); } static inline u8 ata_busy_wait(struct ata_port *ap, unsigned int bits, @@ -478,7 +480,8 @@ static inline u8 ata_busy_wait(struct at u8 status; do { - udelay(10); + if (!(ap->flags & ATA_FLAG_NO_UDELAY)) + udelay(10); status = ata_chk_status(ap); max--; } while ((status & bits) && (max > 0));