aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-09-23 00:19:55 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-12 14:55:44 -0400
commit6949b9148d3656afc13a2ccc06d13c071ec71bdc (patch)
treefc8021205536a67e7701ad413767a412449e51f7
parent417a1a6d3d7abad4c5288135f640e6e38e7a65c5 (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.c11
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