| From stable-bounces@linux.kernel.org Fri Jul 18 16:37:37 2008 |
| From: Alan Cox <alan@lxorguk.ukuu.org.uk> |
| Date: Fri, 18 Jul 2008 19:13:02 -0400 |
| Subject: pata_atiixp: Don't disable |
| To: stable@kernel.org |
| Cc: Jeff Garzik <jgarzik@redhat.com> |
| Message-ID: <20080718191302.141610a8@redhat.com> |
| |
| From: Alan Cox <alan@lxorguk.ukuu.org.uk> |
| |
| Commit 05177f178efe1459d2d0ac05430027ba201889a4 upstream |
| |
| pata_atiixp: Don't disable |
| |
| A couple of distributions (Fedora, Ubuntu) were having weird problems with the |
| ATI IXP series PATA controllers being reported as simplex. At the heart of |
| the problem is that both distros ignored the recommendations to load pata_acpi |
| and ata_generic *AFTER* specific host drivers. |
| |
| The underlying cause however is that if you D3 and then D0 an ATI IXP it |
| helpfully throws away some configuration and won't let you rewrite it. |
| |
| Add checks to ata_generic and pata_acpi to pin ATIIXP devices. Possibly the |
| real answer here is to quirk them and pin them, but right now we can't do that |
| before they've been pcim_enable()'d by a driver. |
| |
| I'm indebted to David Gero for this. His bug report not only reported the |
| problem but identified the cause correctly and he had tested the right values |
| to prove what was going on |
| |
| [If you backport this for 2.6.24 you will need to pull in the 2.6.25 |
| removal of the bogus WARN_ON() in pcim_enagle] |
| |
| Signed-off-by: Alan Cox <alan@redhat.com> |
| Tested-by: David Gero <davidg@havidave.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| |
| --- |
| drivers/ata/ata_generic.c | 6 ++++++ |
| drivers/ata/pata_acpi.c | 6 ++++++ |
| 2 files changed, 12 insertions(+) |
| |
| --- a/drivers/ata/ata_generic.c |
| +++ b/drivers/ata/ata_generic.c |
| @@ -193,6 +193,12 @@ static int ata_generic_init_one(struct p |
| if (dev->vendor == PCI_VENDOR_ID_AL) |
| ata_pci_clear_simplex(dev); |
| |
| + if (dev->vendor == PCI_VENDOR_ID_ATI) { |
| + int rc = pcim_enable_device(dev); |
| + if (rc < 0) |
| + return rc; |
| + pcim_pin_device(dev); |
| + } |
| return ata_pci_init_one(dev, ppi); |
| } |
| |
| --- a/drivers/ata/pata_acpi.c |
| +++ b/drivers/ata/pata_acpi.c |
| @@ -314,6 +314,12 @@ static int pacpi_init_one (struct pci_de |
| .port_ops = &pacpi_ops, |
| }; |
| const struct ata_port_info *ppi[] = { &info, NULL }; |
| + if (pdev->vendor == PCI_VENDOR_ID_ATI) { |
| + int rc = pcim_enable_device(pdev); |
| + if (rc < 0) |
| + return rc; |
| + pcim_pin_device(pdev); |
| + } |
| return ata_pci_init_one(pdev, ppi); |
| } |
| |