Skip to content

Commit 1cc1ece

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 8ebc28a commit 1cc1ece

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
@@ -401,6 +401,7 @@ struct brcmf_pciedev_info {
401401
wait_queue_head_t mbdata_resp_wait;
402402
bool mbdata_completed;
403403
bool irq_allocated;
404+
bool have_msi;
404405
bool wowl_enabled;
405406
u8 dma_idx_sz;
406407
void *idxbuf;
@@ -985,6 +986,11 @@ static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg)
985986
brcmf_dbg(PCIE, "Enter\n");
986987
return IRQ_WAKE_THREAD;
987988
}
989+
990+
/* mailboxint is cleared by the firmware in MSI mode */
991+
if (devinfo->have_msi)
992+
return IRQ_WAKE_THREAD;
993+
988994
return IRQ_NONE;
989995
}
990996

@@ -1002,12 +1008,12 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
10021008
status);
10031009
if (status & devinfo->reginfo->int_fn0)
10041010
brcmf_pcie_handle_mb_data(devinfo);
1005-
if (status & devinfo->reginfo->int_d2h_db) {
1006-
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1007-
brcmf_proto_msgbuf_rx_trigger(
1008-
&devinfo->pdev->dev);
1009-
}
10101011
}
1012+
if (devinfo->have_msi || status & devinfo->reginfo->int_d2h_db) {
1013+
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1014+
brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev);
1015+
}
1016+
10111017
brcmf_pcie_bus_console_read(devinfo, false);
10121018
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
10131019
brcmf_pcie_intr_enable(devinfo);
@@ -1025,7 +1031,10 @@ static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
10251031

10261032
brcmf_dbg(PCIE, "Enter\n");
10271033

1028-
pci_enable_msi(pdev);
1034+
devinfo->have_msi = pci_enable_msi(pdev) >= 0;
1035+
if (devinfo->have_msi)
1036+
brcmf_dbg(PCIE, "MSI enabled\n");
1037+
10291038
if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr,
10301039
brcmf_pcie_isr_thread, IRQF_SHARED,
10311040
"brcmf_pcie_intr", devinfo)) {

0 commit comments

Comments
 (0)