diff options
| -rw-r--r-- | drivers/ata/ahci.c | 9 | ||||
| -rw-r--r-- | drivers/ata/ahci.h | 1 |
2 files changed, 9 insertions, 1 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index e45b18ee04c3..f6b3e31f63cd 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -1164,7 +1164,7 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host) | |||
| 1164 | #endif | 1164 | #endif |
| 1165 | 1165 | ||
| 1166 | static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, | 1166 | static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, |
| 1167 | struct ahci_host_priv *hpriv) | 1167 | struct ahci_host_priv *hpriv) |
| 1168 | { | 1168 | { |
| 1169 | int nvec; | 1169 | int nvec; |
| 1170 | 1170 | ||
| @@ -1189,6 +1189,13 @@ static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, | |||
| 1189 | else if (nvec < 0) | 1189 | else if (nvec < 0) |
| 1190 | goto intx; | 1190 | goto intx; |
| 1191 | 1191 | ||
| 1192 | /* fallback to single MSI mode if the controller enforced MRSM mode */ | ||
| 1193 | if (readl(hpriv->mmio + HOST_CTL) & HOST_MRSM) { | ||
| 1194 | pci_disable_msi(pdev); | ||
| 1195 | printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n"); | ||
| 1196 | goto single_msi; | ||
| 1197 | } | ||
| 1198 | |||
| 1192 | return nvec; | 1199 | return nvec; |
| 1193 | 1200 | ||
| 1194 | single_msi: | 1201 | single_msi: |
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 51af275b3388..b5eb886da226 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h | |||
| @@ -94,6 +94,7 @@ enum { | |||
| 94 | /* HOST_CTL bits */ | 94 | /* HOST_CTL bits */ |
| 95 | HOST_RESET = (1 << 0), /* reset controller; self-clear */ | 95 | HOST_RESET = (1 << 0), /* reset controller; self-clear */ |
| 96 | HOST_IRQ_EN = (1 << 1), /* global IRQ enable */ | 96 | HOST_IRQ_EN = (1 << 1), /* global IRQ enable */ |
| 97 | HOST_MRSM = (1 << 2), /* MSI Revert to Single Message */ | ||
| 97 | HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ | 98 | HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ |
| 98 | 99 | ||
| 99 | /* HOST_CAP bits */ | 100 | /* HOST_CAP bits */ |
