On Fri, 29 Sep 2006 03:13:53 +0100 Matthew Garrett <mjg59@xxxxxxxxxxxxx> wrote: > This may be paranoia, but: > > If I'm reading the code right (I may well not be), you seem to be > evaulating _GTF before _SDD. The spec (9.9.1.1) claims that _SDD should > be evaulated before _GTF - we had a couple of bug reports against an > earlier version of the patch that may have been due to that, but I never > had a chance to chase them down properly. > > -- > Matthew Garrett | mjg59@xxxxxxxxxxxxx You are right, that was happening. this patch fixes the issue: Subject: libata: change order of sdd/gtf execution Make the sdd call come before gtf. _SDD is used to provide input to the _GTF file, so it should be executed first. Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@xxxxxxxxx> --- drivers/ata/libata-core.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) --- 2.6-mm.orig/drivers/ata/libata-core.c +++ 2.6-mm/drivers/ata/libata-core.c @@ -1404,6 +1404,16 @@ int ata_dev_configure(struct ata_device ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n", __FUNCTION__, ap->id, dev->devno); + /* set _SDD */ + rc = ata_acpi_push_id(ap, dev->devno); + if (rc) { + ata_dev_printk(dev, KERN_WARNING, "failed to set _SDD(%d)\n", + rc); + } + + /* retrieve and execute the ATA task file of _GTF */ + ata_acpi_exec_tfs(ap); + /* print device capabilities */ if (ata_msg_probe(ap)) ata_dev_printk(dev, KERN_DEBUG, @@ -1556,14 +1566,6 @@ int ata_dev_configure(struct ata_device if (ap->ops->dev_config) ap->ops->dev_config(ap, dev); - /* set _SDD */ - rc = ata_acpi_push_id(ap, dev->devno); - if (rc) { - ata_dev_printk(dev, KERN_WARNING, "failed to set _SDD(%d)\n", - rc); - goto err_out_nosup; - } - if (ata_msg_probe(ap)) ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n", __FUNCTION__, ata_chk_status(ap)); @@ -1609,9 +1611,6 @@ int ata_bus_probe(struct ata_port *ap) /* reset and determine device classes */ ap->ops->phy_reset(ap); - /* retrieve and execute the ATA task file of _GTF */ - ata_acpi_exec_tfs(ap); - for (i = 0; i < ATA_MAX_DEVICES; i++) { dev = &ap->device[i]; - 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