Skip to content

Commit 3c8d762

Browse files
marcanjannau
authored andcommitted
wifi: brcmfmac: Handle PCIe MSI properly
On newer firmwares under at least certain conditions, MSI mode does not leave interrupt flags set (they are cleared by the firmware). Handle this by always checking for ring data when we get an MSI, regardless of whether any IRQ flags were set. Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent d255aad commit 3c8d762

1 file changed

Lines changed: 15 additions & 6 deletions

File tree

  • drivers/net/wireless/broadcom/brcm80211/brcmfmac

drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ struct brcmf_pciedev_info {
403403
wait_queue_head_t mbdata_resp_wait;
404404
bool mbdata_completed;
405405
bool irq_allocated;
406+
bool have_msi;
406407
bool wowl_enabled;
407408
u8 dma_idx_sz;
408409
void *idxbuf;
@@ -988,6 +989,11 @@ static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg)
988989
brcmf_dbg(PCIE, "Enter\n");
989990
return IRQ_WAKE_THREAD;
990991
}
992+
993+
/* mailboxint is cleared by the firmware in MSI mode */
994+
if (devinfo->have_msi)
995+
return IRQ_WAKE_THREAD;
996+
991997
return IRQ_NONE;
992998
}
993999

@@ -1005,12 +1011,12 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
10051011
status);
10061012
if (status & devinfo->reginfo->int_fn0)
10071013
brcmf_pcie_handle_mb_data(devinfo);
1008-
if (status & devinfo->reginfo->int_d2h_db) {
1009-
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1010-
brcmf_proto_msgbuf_rx_trigger(
1011-
&devinfo->pdev->dev);
1012-
}
10131014
}
1015+
if (devinfo->have_msi || status & devinfo->reginfo->int_d2h_db) {
1016+
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1017+
brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev);
1018+
}
1019+
10141020
brcmf_pcie_bus_console_read(devinfo, false);
10151021
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
10161022
brcmf_pcie_intr_enable(devinfo);
@@ -1028,7 +1034,10 @@ static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
10281034

10291035
brcmf_dbg(PCIE, "Enter\n");
10301036

1031-
pci_enable_msi(pdev);
1037+
devinfo->have_msi = pci_enable_msi(pdev) >= 0;
1038+
if (devinfo->have_msi)
1039+
brcmf_dbg(PCIE, "MSI enabled\n");
1040+
10321041
if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr,
10331042
brcmf_pcie_isr_thread, IRQF_SHARED,
10341043
"brcmf_pcie_intr", devinfo)) {

0 commit comments

Comments
 (0)