Files

36 lines
1.2 KiB
C
Raw Permalink Normal View History

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);