ahci: make NO_NCQ handling more consistent
ahci_save_initial_config() is responsible for reading, screening the host CAP register and storing the modified result into hpriv->cap for the rest of the driver. Move ATA_FLAG_NO_NCQ handling into ahci_save_initial_config(). It's more consistent this way and the rest of the driver can always refer to hpriv->cap to determine configured capability. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
da3dbb17a0
commit
274c1fde5c
|
@ -545,13 +545,19 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
hpriv->saved_cap = cap = readl(mmio + HOST_CAP);
|
hpriv->saved_cap = cap = readl(mmio + HOST_CAP);
|
||||||
hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
|
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)) {
|
if ((cap & HOST_CAP_64) && (pi->flags & AHCI_FLAG_32BIT_ONLY)) {
|
||||||
dev_printk(KERN_INFO, &pdev->dev,
|
dev_printk(KERN_INFO, &pdev->dev,
|
||||||
"controller can't do 64bit DMA, forcing 32bit\n");
|
"controller can't do 64bit DMA, forcing 32bit\n");
|
||||||
cap &= ~HOST_CAP_64;
|
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 */
|
/* fixup zero port_map */
|
||||||
if (!port_map) {
|
if (!port_map) {
|
||||||
port_map = (1 << ahci_nr_ports(cap)) - 1;
|
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);
|
ahci_save_initial_config(pdev, &pi, hpriv);
|
||||||
|
|
||||||
/* prepare host */
|
/* 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;
|
pi.flags |= ATA_FLAG_NCQ;
|
||||||
|
|
||||||
host = ata_host_alloc_pinfo(&pdev->dev, ppi, fls(hpriv->port_map));
|
host = ata_host_alloc_pinfo(&pdev->dev, ppi, fls(hpriv->port_map));
|
||||||
|
|
Loading…
Reference in New Issue