Any feedback on this? On Wed, Mar 10, 2010 at 03:32:30PM -0500, Matthew Garrett wrote: > According to section 10.3.1 of the AHCI spec, PxCMD.ST must not be set > unless there's a device attached. Following this saves us a measurable > quantity of power and does not impair hotplug support. Based on a patch > by Kristen Carlson Accardi. > > Signed-off-by: Matthew Garrett <mjg@xxxxxxxxxx> > Cc: Kristen Carlson Accardi <kristen.c.accardi@xxxxxxxxx> > --- > drivers/ata/ahci.c | 19 +++++++++++++++++++ > 1 files changed, 19 insertions(+), 0 deletions(-) > > diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c > index 6bd930b..ff08317 100644 > --- a/drivers/ata/ahci.c > +++ b/drivers/ata/ahci.c > @@ -1016,11 +1016,30 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) > return -EINVAL; > } > > +static int ahci_is_device_present(struct ata_port *ap) > +{ > + void __iomem *port_mmio = ahci_port_base(ap); > + u8 status = readl(port_mmio + PORT_TFDATA) & 0xff; > + > + /* Make sure PxTFD.STS.BSY and PxTFD.STS.DRQ are 0 */ > + if (status & (ATA_BUSY | ATA_DRQ)) > + return 0; > + > + /* Make sure PxSSTS.DET is 3h */ > + status = readl(port_mmio + PORT_SCR_STAT) & 0xf; > + if (status != 3) > + return 0; > + return 1; > +} > + > static void ahci_start_engine(struct ata_port *ap) > { > void __iomem *port_mmio = ahci_port_base(ap); > u32 tmp; > > + if (!ahci_is_device_present(ap)) > + return; > + > /* start DMA */ > tmp = readl(port_mmio + PORT_CMD); > tmp |= PORT_CMD_START; > -- > 1.6.6.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ide" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Matthew Garrett | mjg59@xxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html