[PATCH] libata: flush COMRESET set and clear

Updated patch to fix erroneous flush of COMRESET set and missing flush
of COMRESET clear. Created a new routine scr_write_flush() to try to
prevent this in the future. Also, this patch is based on libata-2.6
instead of the previous libata-dev-2.6 based patch.

Signed-off-by: Brett Russ <russb@emc.com>

Index: libata-2.6/drivers/scsi/libata-core.c
===================================================================

authored by

Brett Russ and committed by
Jeff Garzik
cdcca89e 21b1ed74

+10 -3
+3 -3
drivers/scsi/libata-core.c
··· 1253 1253 unsigned long timeout = jiffies + (HZ * 5); 1254 1254 1255 1255 if (ap->flags & ATA_FLAG_SATA_RESET) { 1256 - scr_write(ap, SCR_CONTROL, 0x301); /* issue phy wake/reset */ 1257 - scr_read(ap, SCR_STATUS); /* dummy read; flush */ 1256 + /* issue phy wake/reset */ 1257 + scr_write_flush(ap, SCR_CONTROL, 0x301); 1258 1258 udelay(400); /* FIXME: a guess */ 1259 1259 } 1260 - scr_write(ap, SCR_CONTROL, 0x300); /* issue phy wake/clear reset */ 1260 + scr_write_flush(ap, SCR_CONTROL, 0x300); /* phy wake/clear reset */ 1261 1261 1262 1262 /* wait for phy to become ready, if necessary */ 1263 1263 do {
+7
include/linux/libata.h
··· 584 584 ap->ops->scr_write(ap, reg, val); 585 585 } 586 586 587 + static inline void scr_write_flush(struct ata_port *ap, unsigned int reg, 588 + u32 val) 589 + { 590 + ap->ops->scr_write(ap, reg, val); 591 + (void) ap->ops->scr_read(ap, reg); 592 + } 593 + 587 594 static inline unsigned int sata_dev_present(struct ata_port *ap) 588 595 { 589 596 return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;