Patchwork ATA: Don't powerdown Compaq Triflex IDE device on suspend

login
register
mail settings
Submitter Mikulas Patocka
Date May 15, 2011, 8:33 p.m.
Message ID <alpine.DEB.2.00.1105152232390.12411@artax.karlin.mff.cuni.cz>
Download mbox | patch
Permalink /patch/95664/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Mikulas Patocka - May 15, 2011, 8:33 p.m.
Don't powerdown Compaq Triflex IDE device on suspend

This fixes APM suspend on Compaq Armada 7400.
APM BIOS doesn't suspend if IDE is powered down when suspending.
The Triflex controller is found only on old Compaq boards,
so this patch will hopefully have no side effects.

Signed-off-by: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>

---
 drivers/ata/pata_triflex.c |   23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

Index: linux-2.6.39-rc7-libata/drivers/ata/pata_triflex.c
===================================================================
--- linux-2.6.39-rc7-libata.orig/drivers/ata/pata_triflex.c	2011-05-09 21:04:22.000000000 +0200
+++ linux-2.6.39-rc7-libata/drivers/ata/pata_triflex.c	2011-05-15 16:13:31.000000000 +0200
@@ -210,13 +210,34 @@  static const struct pci_device_id trifle
 	{ },
 };
 
+#ifdef CONFIG_PM
+static int triflex_ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
+{
+	struct ata_host *host = dev_get_drvdata(&pdev->dev);
+	int rc = 0;
+
+	rc = ata_host_suspend(host, mesg);
+	if (rc)
+		return rc;
+
+	/*
+	 * We must not disable or powerdown the device.
+	 * APM bios refuses to suspend if IDE is not accessible.
+	 */
+	pci_save_state(pdev);
+
+	return 0;
+}
+
+#endif
+
 static struct pci_driver triflex_pci_driver = {
 	.name 		= DRV_NAME,
 	.id_table	= triflex,
 	.probe 		= triflex_init_one,
 	.remove		= ata_pci_remove_one,
 #ifdef CONFIG_PM
-	.suspend	= ata_pci_device_suspend,
+	.suspend	= triflex_ata_pci_device_suspend,
 	.resume		= ata_pci_device_resume,
 #endif
 };