@@ -1171,7 +1171,7 @@ static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports,
if (hpriv->flags & AHCI_HFLAG_NO_MSI)
goto intx;
- nvec = pci_msi_vec_count(pdev);
+ nvec = 8;
if (nvec < 0)
goto intx;
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Cc: linux-ide@vger.kernel.org
---
drivers/ata/ahci.c | 11 ++++++++++-
drivers/ata/ahci.h | 1 +
2 files changed, 11 insertions(+), 1 deletions(-)
@@ -1164,7 +1164,7 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host)
#endif
static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports,
- struct ahci_host_priv *hpriv)
+ struct ahci_host_priv *hpriv)
{
int nvec;
@@ -1189,6 +1189,15 @@ static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports,
else if (nvec < 0)
goto intx;
+ /*
+ * Fallback to single MSI mode if the controller enforced MRSM mode
+ */
+ if (readl(hpriv->mmio + HOST_CTL) & HOST_MRSM) {
+ pci_disable_msi(pdev);
+ printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n");
+ goto single_msi;
+ }
+
return nvec;
single_msi:
@@ -94,6 +94,7 @@ enum {
/* HOST_CTL bits */
HOST_RESET = (1 << 0), /* reset controller; self-clear */
HOST_IRQ_EN = (1 << 1), /* global IRQ enable */
+ HOST_MRSM = (1 << 2), /* MSI Revert to Single Message */
HOST_AHCI_EN = (1 << 31), /* AHCI enabled */
/* HOST_CAP bits */