|
@@ -193,6 +193,8 @@ enum {
|
|
|
ATA_FLAG_ACPI_SATA | ATA_FLAG_AN |
|
|
|
ATA_FLAG_IPM,
|
|
|
AHCI_LFLAG_COMMON = ATA_LFLAG_SKIP_D2H_BSY,
|
|
|
+
|
|
|
+ ICH_MAP = 0x90, /* ICH MAP register */
|
|
|
};
|
|
|
|
|
|
struct ahci_cmd_hdr {
|
|
@@ -2273,6 +2275,22 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
+ if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
|
|
|
+ (pdev->device == 0x2652 || pdev->device == 0x2653)) {
|
|
|
+ u8 map;
|
|
|
+
|
|
|
+ /* ICH6s share the same PCI ID for both piix and ahci
|
|
|
+ * modes. Enabling ahci mode while MAP indicates
|
|
|
+ * combined mode is a bad idea. Yield to ata_piix.
|
|
|
+ */
|
|
|
+ pci_read_config_byte(pdev, ICH_MAP, &map);
|
|
|
+ if (map & 0x3) {
|
|
|
+ dev_printk(KERN_INFO, &pdev->dev, "controller is in "
|
|
|
+ "combined mode, can't enable AHCI mode\n");
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
|
|
|
if (!hpriv)
|
|
|
return -ENOMEM;
|