[PATCH 6/6] SATA PIIX: Blacklist system that spins off disks during ACPI power off

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Rafael J. Wysocki
Date: Monday, September 29, 2008 - 3:18 pm

From: Rafael J. Wysocki <rjw@sisk.pl>

SATA PIIX: Blacklist system that spins off disks during ACPI power off

Some notebooks from HP have the problem that their BIOSes attempt to
spin down hard drives before entering ACPI system states S4 and S5.
This leads to a yo-yo effect during system power-off shutdown and the
last phase of hibernation when the disk is first spun down by the
kernel and then almost immediately turned on and off by the BIOS.
This, in turn, may result in shortening the disk's life times.

To prevent this from happening we can blacklist the affected systems
using DMI information.

Blacklist HP 2510p that uses the ata_piix driver.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 drivers/ata/ata_piix.c |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Index: linux-2.6/drivers/ata/ata_piix.c
===================================================================
--- linux-2.6.orig/drivers/ata/ata_piix.c
+++ linux-2.6/drivers/ata/ata_piix.c
@@ -1449,6 +1449,32 @@ static void piix_iocfg_bit18_quirk(struc
 	}
 }
 
+static bool piix_broken_system_poweroff(struct pci_dev *pdev)
+{
+	static const struct dmi_system_id broken_systems[] = {
+		{
+			.ident = "HP Compaq 2510p",
+			.matches = {
+				DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+				DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 2510p"),
+			},
+			/* PCI slot number of the controller */
+			.driver_data = (void *)0x1FUL,
+		},
+
+		{ }	/* terminate list */
+	};
+	const struct dmi_system_id *dmi = dmi_first_match(broken_systems);
+
+	if (dmi) {
+		unsigned long slot = (unsigned long)dmi->driver_data;
+		/* apply the quirk only to on-board controllers */
+		return slot == PCI_SLOT(pdev->devfn);
+	}
+
+	return false;
+}
+
 /**
  *	piix_init_one - Register PIIX ATA PCI device with kernel services
  *	@pdev: PCI device to register
@@ -1484,6 +1510,14 @@ static int __devinit piix_init_one(struc
 	if (!in_module_init)
 		return -ENODEV;
 
+	if (piix_broken_system_poweroff(pdev)) {
+		piix_port_info[ent->driver_data].flags |=
+				ATA_FLAG_NO_POWEROFF_SPINDOWN |
+					ATA_FLAG_NO_HIBERNATE_SPINDOWN;
+		dev_info(&pdev->dev, "quirky BIOS, skipping spindown "
+				"on poweroff and hibernation\n");
+	}
+
 	port_info[0] = piix_port_info[ent->driver_data];
 	port_info[1] = piix_port_info[ent->driver_data];
 

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Regression: SATA disk double spin-off during hibernation o ..., Rafael J. Wysocki, (Thu Aug 28, 3:02 pm)
Re: Regression: SATA disk double spin-off during hibernati ..., Rafael J. Wysocki, (Fri Aug 29, 3:41 am)
[PATCH] SATA: Blacklist systems that spin off disks during ..., Rafael J. Wysocki, (Sat Sep 6, 10:23 am)
Re: [PATCH] SATA: Blacklist systems that spin off disks du ..., Rafael J. Wysocki, (Sun Sep 14, 5:00 pm)
[PATCH 0/6] SATA: Blacklist systems that spin off disks du ..., Rafael J. Wysocki, (Mon Sep 29, 3:06 pm)
[PATCH 1/6] Hibernation: Introduce new system state for th ..., Rafael J. Wysocki, (Mon Sep 29, 3:10 pm)
[PATCH 2/6] DMI: Introduce dmi_first_match to make the int ..., Rafael J. Wysocki, (Mon Sep 29, 3:13 pm)
[PATCH 3/6] SATA: Blacklisting of systems that spin off di ..., Rafael J. Wysocki, (Mon Sep 29, 3:14 pm)
[PATCH 4/6] SATA AHCI: Blacklist system that spins off dis ..., Rafael J. Wysocki, (Mon Sep 29, 3:15 pm)
[PATCH 5/6] SATA Sil: Blacklist system that spins off disk ..., Rafael J. Wysocki, (Mon Sep 29, 3:16 pm)
[PATCH 6/6] SATA PIIX: Blacklist system that spins off dis ..., Rafael J. Wysocki, (Mon Sep 29, 3:18 pm)