summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@hraefn.swansea.linux.org.uk>2006-07-06 04:58:20 +0200
committerJeff Garzik <jeff@garzik.org>2006-07-06 04:58:20 +0200
commit9545b5781cfa822ea1528bc65965dbace0c39a5d (patch)
tree0bcac2ee9005fda9cf25003c8da00c99d322c25a
parent[PATCH] libata-core.c: restore configuration boot messages in ata_dev_configu... (diff)
downloadlinux-9545b5781cfa822ea1528bc65965dbace0c39a5d.tar.xz
linux-9545b5781cfa822ea1528bc65965dbace0c39a5d.zip
[PATCH] ahci: Ensure that we don't grab both functions
When we force the chip into dual fn mode so we get PATA and AHCI we must be sure we don't then do anything dumb like try and grab both with the AHCI driver. Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to '')
-rw-r--r--drivers/scsi/ahci.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c
index 7447ba0374e8..77e7202a0eba 100644
--- a/drivers/scsi/ahci.c
+++ b/drivers/scsi/ahci.c
@@ -1323,6 +1323,17 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if (!printed_version++)
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
+ /* JMicron-specific fixup: make sure we're in AHCI mode */
+ /* This is protected from races with ata_jmicron by the pci probe
+ locking */
+ if (pdev->vendor == PCI_VENDOR_ID_JMICRON) {
+ /* AHCI enable, AHCI on function 0 */
+ pci_write_config_byte(pdev, 0x41, 0xa1);
+ /* Function 1 is the PATA controller */
+ if (PCI_FUNC(pdev->devfn))
+ return -ENODEV;
+ }
+
rc = pci_enable_device(pdev);
if (rc)
return rc;
@@ -1378,10 +1389,6 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if (have_msi)
hpriv->flags |= AHCI_FLAG_MSI;
- /* JMicron-specific fixup: make sure we're in AHCI mode */
- if (pdev->vendor == 0x197b)
- pci_write_config_byte(pdev, 0x41, 0xa1);
-
/* initialize adapter */
rc = ahci_host_init(probe_ent);
if (rc)