Skip to content

Commit 4daa9f1

Browse files
committed
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 <[email protected]>
1 parent 2e095bb commit 4daa9f1

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
@@ -404,6 +404,7 @@ struct brcmf_pciedev_info {
404404
wait_queue_head_t mbdata_resp_wait;
405405
bool mbdata_completed;
406406
bool irq_allocated;
407+
bool have_msi;
407408
bool wowl_enabled;
408409
u8 dma_idx_sz;
409410
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)