diff --git a/sys/dev/bhnd/bhndb/bhndb_pci.c b/sys/dev/bhnd/bhndb/bhndb_pci.c index 0cdcba1d..7b6ae0f3 100644 --- a/sys/dev/bhnd/bhndb/bhndb_pci.c +++ b/sys/dev/bhnd/bhndb/bhndb_pci.c @@ -195,6 +195,16 @@ static struct bhndb_pci_quirk bhndb_pci_quirks[] = { static struct bhndb_pci_quirk bhndb_pcie_quirks[] = { /* All PCIe-G1 core revisions require the SRSH work-around */ BHNDB_PCI_QUIRK(HWREV_ANY, BHNDB_PCI_QUIRK_SRSH_WAR), + + /* + * BCM43224 (and other Broadcom PCIe-G1 endpoints) do not have MSI + * delivered on some host platforms (e.g. NVIDIA MCP89 based Apple + * MacBook Air); force legacy INTx instead. + */ + { { BHND_MATCH_CHIP_ID(BCM43224) }, + { BHND_MATCH_ANY }, + BHNDB_PCI_QUIRK_NO_MSI }, + BHNDB_PCI_QUIRK_END }; @@ -327,6 +337,13 @@ bhndb_pci_alloc_msi(struct bhndb_pci_softc *sc, int *msi_count) { int error, count; + /* MSI disabled by bridge quirk? */ + if (sc->pci_quirks & BHNDB_PCI_QUIRK_NO_MSI) { + device_printf(sc->dev, "MSI disabled by quirk; using INTx on " + "%s\n", device_get_nameunit(sc->parent)); + return (ENXIO); + } + /* Is MSI available? */ if (pci_msi_count(sc->parent) < BHNDB_PCI_MSI_COUNT) return (ENXIO);