diff options
Diffstat (limited to 'drivers/ata/ahci.c')
| -rw-r--r-- | drivers/ata/ahci.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index ec1221879f9a..c44d11237db4 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -63,6 +63,8 @@ enum board_ids { | |||
| 63 | 63 | ||
| 64 | /* board IDs for specific chipsets in alphabetical order */ | 64 | /* board IDs for specific chipsets in alphabetical order */ |
| 65 | board_ahci_mcp65, | 65 | board_ahci_mcp65, |
| 66 | board_ahci_mcp77, | ||
| 67 | board_ahci_mcp89, | ||
| 66 | board_ahci_mv, | 68 | board_ahci_mv, |
| 67 | board_ahci_sb600, | 69 | board_ahci_sb600, |
| 68 | board_ahci_sb700, /* for SB700 and SB800 */ | 70 | board_ahci_sb700, /* for SB700 and SB800 */ |
| @@ -72,9 +74,7 @@ enum board_ids { | |||
| 72 | board_ahci_mcp_linux = board_ahci_mcp65, | 74 | board_ahci_mcp_linux = board_ahci_mcp65, |
| 73 | board_ahci_mcp67 = board_ahci_mcp65, | 75 | board_ahci_mcp67 = board_ahci_mcp65, |
| 74 | board_ahci_mcp73 = board_ahci_mcp65, | 76 | board_ahci_mcp73 = board_ahci_mcp65, |
| 75 | board_ahci_mcp77 = board_ahci, | 77 | board_ahci_mcp79 = board_ahci_mcp77, |
| 76 | board_ahci_mcp79 = board_ahci, | ||
| 77 | board_ahci_mcp89 = board_ahci, | ||
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 80 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
| @@ -135,7 +135,24 @@ static const struct ata_port_info ahci_port_info[] = { | |||
| 135 | /* by chipsets */ | 135 | /* by chipsets */ |
| 136 | [board_ahci_mcp65] = | 136 | [board_ahci_mcp65] = |
| 137 | { | 137 | { |
| 138 | AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ), | 138 | AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP | |
| 139 | AHCI_HFLAG_YES_NCQ), | ||
| 140 | .flags = AHCI_FLAG_COMMON, | ||
| 141 | .pio_mask = ATA_PIO4, | ||
| 142 | .udma_mask = ATA_UDMA6, | ||
| 143 | .port_ops = &ahci_ops, | ||
| 144 | }, | ||
| 145 | [board_ahci_mcp77] = | ||
| 146 | { | ||
| 147 | AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP), | ||
| 148 | .flags = AHCI_FLAG_COMMON, | ||
| 149 | .pio_mask = ATA_PIO4, | ||
| 150 | .udma_mask = ATA_UDMA6, | ||
| 151 | .port_ops = &ahci_ops, | ||
| 152 | }, | ||
| 153 | [board_ahci_mcp89] = | ||
| 154 | { | ||
| 155 | AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA), | ||
| 139 | .flags = AHCI_FLAG_COMMON, | 156 | .flags = AHCI_FLAG_COMMON, |
| 140 | .pio_mask = ATA_PIO4, | 157 | .pio_mask = ATA_PIO4, |
| 141 | .udma_mask = ATA_UDMA6, | 158 | .udma_mask = ATA_UDMA6, |
| @@ -1103,12 +1120,13 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1103 | /* prepare host */ | 1120 | /* prepare host */ |
| 1104 | if (hpriv->cap & HOST_CAP_NCQ) { | 1121 | if (hpriv->cap & HOST_CAP_NCQ) { |
| 1105 | pi.flags |= ATA_FLAG_NCQ; | 1122 | pi.flags |= ATA_FLAG_NCQ; |
| 1106 | /* Auto-activate optimization is supposed to be supported on | 1123 | /* |
| 1107 | all AHCI controllers indicating NCQ support, but it seems | 1124 | * Auto-activate optimization is supposed to be |
| 1108 | to be broken at least on some NVIDIA MCP79 chipsets. | 1125 | * supported on all AHCI controllers indicating NCQ |
| 1109 | Until we get info on which NVIDIA chipsets don't have this | 1126 | * capability, but it seems to be broken on some |
| 1110 | issue, if any, disable AA on all NVIDIA AHCIs. */ | 1127 | * chipsets including NVIDIAs. |
| 1111 | if (pdev->vendor != PCI_VENDOR_ID_NVIDIA) | 1128 | */ |
| 1129 | if (!(hpriv->flags & AHCI_HFLAG_NO_FPDMA_AA)) | ||
| 1112 | pi.flags |= ATA_FLAG_FPDMA_AA; | 1130 | pi.flags |= ATA_FLAG_FPDMA_AA; |
| 1113 | } | 1131 | } |
| 1114 | 1132 | ||
