Skip to contentSkip to conversation

ata_piix: verify SIDPR access before enabling it

PATCH Applied Tejun Heo 2 participants 2 messages May 1, 2008 – May 6, 2008 libata

lore
Share & tools
lore

Tejun Heo

author
#0 lore raw

PATCH 1/1 ata_piix: verify SIDPR access before enabling it

On certain configurations (certain macbooks), even though all the conditions for SIDPR access described in the datasheet are met, actually reading those registers just returns 0 and have no effect on write. Verify SIDPR is actually working before enabling it.

This is reported by Ryan Roth in bz#10512.

---
Apple did another weird thing with ich8m in addition to the weird lockup on second port enable and SIDPR causes drive misdetection. This one probably should go to -stable too.

Thanks.

drivers/ata/ata_piix.c | 25 +++++++++++++++++++++++++

1 file changed, 25 insertions(+)
drivers/ata/ata_piix.c +0 -0
index ea2c764..a9027b8 100644
@@ -1348,6 +1348,8 @@ static void __devinit piix_init_sidpr(struct ata_host *host)
{
	struct pci_dev *pdev = to_pci_dev(host->dev);
	struct piix_host_priv *hpriv = host->private_data;
+	struct ata_device *dev0 = &host->ports[0]->link.device[0];
+	u32 scontrol;
	int i;

	/* check for availability */
@@ -1366,6 +1368,29 @@ static void __devinit piix_init_sidpr(struct ata_host *host)
		return;

	hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR];

+
+ /* SCR access via SIDPR doesn't work on some configurations.
+ * Give it a test drive by inhibiting power save modes which
+ * we'll do anyway.
+ */
+ scontrol = piix_sidpr_read(dev0, SCR_CONTROL);
+
+ /* if IPM is already 3, SCR access is probably working. Don't
+ * un-inhibit power save modes as BIOS might have inhibited
+ * them for a reason.
+ */
+ if ((scontrol & 0xf00) != 0x300) {
+ scontrol |= 0x300;
+ piix_sidpr_write(dev0, SCR_CONTROL, scontrol);
+ scontrol = piix_sidpr_read(dev0, SCR_CONTROL);
+
+ if ((scontrol & 0xf00) != 0x300) {
+ dev_printk(KERN_INFO, host->dev, "SCR access via "
+ "SIDPR is available but doesn't work\n");
+ return;
+ }
+ }
+

	host->ports[0]->ops = &piix_sidpr_sata_ops;
	host->ports[1]->ops = &piix_sidpr_sata_ops;
}
Applied
#1 lore raw
Quoted 14 lines · Tejun Heo

On certain configurations (certain macbooks), even though all the conditions for SIDPR access described in the datasheet are met, actually reading those registers just returns 0 and have no effect on write. Verify SIDPR is actually working before enabling it.

This is reported by Ryan Roth in bz#10512.

---
Apple did another weird thing with ich8m in addition to the weird lockup on second port enable and SIDPR causes drive misdetection. This one probably should go to -stable too.

Quoted 4 lines

Thanks.

drivers/ata/ata_piix.c | 25 +++++++++++++++++++++++++

1 file changed, 25 insertions(+)

applied