|
@@ -545,13 +545,19 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
|
|
hpriv->saved_cap = cap = readl(mmio + HOST_CAP);
|
|
|
hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
|
|
|
|
|
|
- /* some chips lie about 64bit support */
|
|
|
+ /* some chips have errata preventing 64bit use */
|
|
|
if ((cap & HOST_CAP_64) && (pi->flags & AHCI_FLAG_32BIT_ONLY)) {
|
|
|
dev_printk(KERN_INFO, &pdev->dev,
|
|
|
"controller can't do 64bit DMA, forcing 32bit\n");
|
|
|
cap &= ~HOST_CAP_64;
|
|
|
}
|
|
|
|
|
|
+ if ((cap & HOST_CAP_NCQ) && (pi->flags & AHCI_FLAG_NO_NCQ)) {
|
|
|
+ dev_printk(KERN_INFO, &pdev->dev,
|
|
|
+ "controller can't do NCQ, turning off CAP_NCQ\n");
|
|
|
+ cap &= ~HOST_CAP_NCQ;
|
|
|
+ }
|
|
|
+
|
|
|
/* fixup zero port_map */
|
|
|
if (!port_map) {
|
|
|
port_map = (1 << ahci_nr_ports(cap)) - 1;
|
|
@@ -1822,7 +1828,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
ahci_save_initial_config(pdev, &pi, hpriv);
|
|
|
|
|
|
/* prepare host */
|
|
|
- if (!(pi.flags & AHCI_FLAG_NO_NCQ) && (hpriv->cap & HOST_CAP_NCQ))
|
|
|
+ if (hpriv->cap & HOST_CAP_NCQ)
|
|
|
pi.flags |= ATA_FLAG_NCQ;
|
|
|
|
|
|
host = ata_host_alloc_pinfo(&pdev->dev, ppi, fls(hpriv->port_map));
|