Re: 2.6.16-rc4 libata + AHCI patched for suspend fails on ICH6

From: Randy.Dunlap
Date: Tue Feb 21 2006 - 18:05:34 EST


On Tue, 21 Feb 2006, Ariel Garcia wrote:

> Hi Randy, Jens,
>
> > > The first thing to try is to add the acpi addon from Randy and see if
> > > that helps at all. Looking at the log, the first command we issue
> > > after resume times out which smells a lot like an unlock command
> > > missing (which is typically in the GTF list from acpi).
> >
> > Ariel-
> > These patches (for 2.6.16-rc3) are at
> >http://www.xenotime.net/linux/SATA/2.6.16-rc3/libata-rollup-2616-rc3.patch
> > in case you didn't find them yet.
>
> yes, thanks! i had found them, but i hadn't reported yet because it didn't
> work (exactly the same output as w/o the patch) and i wanted to enable
> your new debugging functionality to get some additional feedback.
>
> So at least now (printk=255) i can see that there seems to be an error
> _before_ the suspend, just when loading the GTFs (whatever they are ;-)

The ACPI "_GTF" method "gets taskfiles" (=> GTF). Taskfiles
are one or more arrays of ATA-interface registers.

> do_drive_get_GTF: ERR: ata_dev_present: 0, PORT_DISABLED: 0
> ata_acpi_exec_tfs: get_GTF error (-19)
> ata_acpi_exec_tfs: ret=-19
>
> but no extra debugging output after the suspend/restart. Does that help?
> dmesg output attached.

The "error" is only for the second drive (ix=1, which you don't have,
right?). I guess I need to disable that message.

Please add this additional patch (attached) (credit: SUSE) and
let us know if it helps. Meanwhile I will check the resume
path to see if I notice anything that is missing.

--
~Randy--- linux-2.6.15/drivers/acpi/pci_link.c.orig 2006-02-14 13:51:44.009176954 +0100
+++ linux-2.6.15/drivers/acpi/pci_link.c 2006-02-15 13:32:45.659221867 +0100
@@ -803,6 +803,7 @@ static int irqrouter_resume(struct sys_d
struct list_head *node = NULL;
struct acpi_pci_link *link = NULL;

+ printk(KERN_DEBUG "irqrouter_resume: ENTER\n");
ACPI_FUNCTION_TRACE("irqrouter_resume");

acpi_in_resume = 1;
@@ -815,6 +816,7 @@ static int irqrouter_resume(struct sys_d
acpi_pci_link_resume(link);
}
acpi_in_resume = 0;
+ printk(KERN_DEBUG "irqrouter_resume: EXIT\n");
return_VALUE(0);
}

--- linux-2.6.15/drivers/scsi/libata-core.c.orig 2006-02-16 12:29:49.805524922 +0100
+++ linux-2.6.15/drivers/scsi/libata-core.c 2006-02-16 12:31:45.191603849 +0100
@@ -4296,13 +4296,17 @@ static int ata_start_drive(struct ata_po
*/
int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
{
+ printk(KERN_DEBUG "ata%d: resume device\n", ap->id);
+
+ WARN_ON (irqs_disabled());
+
+ if (!ata_dev_present(dev))
+ return 0;
+ ata_acpi_exec_tfs(ap);
if (ap->flags & ATA_FLAG_SUSPENDED) {
ap->flags &= ~ATA_FLAG_SUSPENDED;
ata_set_mode(ap);
}
- if (!ata_dev_present(dev))
- return 0;
- ata_acpi_exec_tfs(ap);
if (dev->class == ATA_DEV_ATA)
ata_start_drive(ap, dev);

@@ -4318,6 +4322,7 @@ int ata_device_resume(struct ata_port *a
*/
int ata_device_suspend(struct ata_port *ap, struct ata_device *dev)
{
+ printk(KERN_DEBUG "ata%d: suspend device\n", ap->id);
if (!ata_dev_present(dev))
return 0;
if (dev->class == ATA_DEV_ATA)
@@ -5098,6 +5103,7 @@ int pci_test_config_bits(struct pci_dev

int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state)
{
+ dev_printk(KERN_DEBUG, &pdev->dev, "suspend PCI device\n");
pci_save_state(pdev);
pci_disable_device(pdev);
pci_set_power_state(pdev, PCI_D3hot);
@@ -5106,6 +5112,7 @@ int ata_pci_device_suspend(struct pci_de

int ata_pci_device_resume(struct pci_dev *pdev)
{
+ dev_printk(KERN_DEBUG, &pdev->dev, "resume PCI device\n");
pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
pci_enable_device(pdev);