diff options
author | Tejun Heo <htejun@gmail.com> | 2007-09-23 00:19:55 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:44 -0400 |
commit | 6949b9148d3656afc13a2ccc06d13c071ec71bdc (patch) | |
tree | fc8021205536a67e7701ad413767a412449e51f7 | |
parent | 417a1a6d3d7abad4c5288135f640e6e38e7a65c5 (diff) |
ahci: implement AHCI_HFLAG_NO_PMP
Of course some controllers lie about PMP support. Black list them.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | drivers/ata/ahci.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 35ede5c31b9f..af7bf2679088 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -176,6 +176,7 @@ enum { | |||
176 | AHCI_HFLAG_32BIT_ONLY = (1 << 3), /* force 32bit */ | 176 | AHCI_HFLAG_32BIT_ONLY = (1 << 3), /* force 32bit */ |
177 | AHCI_HFLAG_MV_PATA = (1 << 4), /* PATA port */ | 177 | AHCI_HFLAG_MV_PATA = (1 << 4), /* PATA port */ |
178 | AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */ | 178 | AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */ |
179 | AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */ | ||
179 | 180 | ||
180 | /* ap->flags bits */ | 181 | /* ap->flags bits */ |
181 | AHCI_FLAG_NO_HOTPLUG = (1 << 24), /* ignore PxSERR.DIAG.N */ | 182 | AHCI_FLAG_NO_HOTPLUG = (1 << 24), /* ignore PxSERR.DIAG.N */ |
@@ -357,7 +358,7 @@ static const struct ata_port_info ahci_port_info[] = { | |||
357 | }, | 358 | }, |
358 | /* board_ahci_vt8251 */ | 359 | /* board_ahci_vt8251 */ |
359 | { | 360 | { |
360 | AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ), | 361 | AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP), |
361 | .flags = AHCI_FLAG_COMMON, | 362 | .flags = AHCI_FLAG_COMMON, |
362 | .link_flags = AHCI_LFLAG_COMMON | ATA_LFLAG_HRST_TO_RESUME, | 363 | .link_flags = AHCI_LFLAG_COMMON | ATA_LFLAG_HRST_TO_RESUME, |
363 | .pio_mask = 0x1f, /* pio0-4 */ | 364 | .pio_mask = 0x1f, /* pio0-4 */ |
@@ -376,7 +377,7 @@ static const struct ata_port_info ahci_port_info[] = { | |||
376 | /* board_ahci_sb600 */ | 377 | /* board_ahci_sb600 */ |
377 | { | 378 | { |
378 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | | 379 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | |
379 | AHCI_HFLAG_32BIT_ONLY), | 380 | AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_PMP), |
380 | .flags = AHCI_FLAG_COMMON, | 381 | .flags = AHCI_FLAG_COMMON, |
381 | .link_flags = AHCI_LFLAG_COMMON, | 382 | .link_flags = AHCI_LFLAG_COMMON, |
382 | .pio_mask = 0x1f, /* pio0-4 */ | 383 | .pio_mask = 0x1f, /* pio0-4 */ |
@@ -578,6 +579,12 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
578 | cap &= ~HOST_CAP_NCQ; | 579 | cap &= ~HOST_CAP_NCQ; |
579 | } | 580 | } |
580 | 581 | ||
582 | if ((cap && HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) { | ||
583 | dev_printk(KERN_INFO, &pdev->dev, | ||
584 | "controller can't do PMP, turning off CAP_PMP\n"); | ||
585 | cap &= ~HOST_CAP_PMP; | ||
586 | } | ||
587 | |||
581 | /* | 588 | /* |
582 | * Temporary Marvell 6145 hack: PATA port presence | 589 | * Temporary Marvell 6145 hack: PATA port presence |
583 | * is asserted through the standard AHCI port | 590 | * is asserted through the standard AHCI port |