浏览代码

[libata ahci] Isolate Intel-ism, add JMicron JMB360 support

Isolate some PCI config register bitbanging to Intel hardware, as it
should have been all along.

Add support for JMicron JMB360.
Jeff Garzik 19 年之前
父节点
当前提交
bd12097c74
共有 1 个文件被更改,包括 13 次插入4 次删除
  1. 13 4
      drivers/scsi/ahci.c

+ 13 - 4
drivers/scsi/ahci.c

@@ -286,6 +286,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
 	  board_ahci }, /* ICH8M */
 	  board_ahci }, /* ICH8M */
 	{ PCI_VENDOR_ID_INTEL, 0x282a, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	{ PCI_VENDOR_ID_INTEL, 0x282a, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_ahci }, /* ICH8M */
 	  board_ahci }, /* ICH8M */
+	{ 0x197b, 0x2360, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* JMicron JMB360 */
 	{ }	/* terminate list */
 	{ }	/* terminate list */
 };
 };
 
 
@@ -802,7 +804,6 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
 	struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
 	struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
 	void __iomem *mmio = probe_ent->mmio_base;
 	void __iomem *mmio = probe_ent->mmio_base;
 	u32 tmp, cap_save;
 	u32 tmp, cap_save;
-	u16 tmp16;
 	unsigned int i, j, using_dac;
 	unsigned int i, j, using_dac;
 	int rc;
 	int rc;
 	void __iomem *port_mmio;
 	void __iomem *port_mmio;
@@ -836,9 +837,13 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
 	writel(0xf, mmio + HOST_PORTS_IMPL);
 	writel(0xf, mmio + HOST_PORTS_IMPL);
 	(void) readl(mmio + HOST_PORTS_IMPL);	/* flush */
 	(void) readl(mmio + HOST_PORTS_IMPL);	/* flush */
 
 
-	pci_read_config_word(pdev, 0x92, &tmp16);
-	tmp16 |= 0xf;
-	pci_write_config_word(pdev, 0x92, tmp16);
+	if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
+		u16 tmp16;
+
+		pci_read_config_word(pdev, 0x92, &tmp16);
+		tmp16 |= 0xf;
+		pci_write_config_word(pdev, 0x92, tmp16);
+	}
 
 
 	hpriv->cap = readl(mmio + HOST_CAP);
 	hpriv->cap = readl(mmio + HOST_CAP);
 	hpriv->port_map = readl(mmio + HOST_PORTS_IMPL);
 	hpriv->port_map = readl(mmio + HOST_PORTS_IMPL);
@@ -1082,6 +1087,10 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (have_msi)
 	if (have_msi)
 		hpriv->flags |= AHCI_FLAG_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 */
 	/* initialize adapter */
 	rc = ahci_host_init(probe_ent);
 	rc = ahci_host_init(probe_ent);
 	if (rc)
 	if (rc)