Skip to content

Commit cbff002

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 b3708c2 commit cbff002

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
@@ -405,6 +405,7 @@ struct brcmf_pciedev_info {
405405
wait_queue_head_t mbdata_resp_wait;
406406
bool mbdata_completed;
407407
bool irq_allocated;
408+
bool have_msi;
408409
bool wowl_enabled;
409410
u8 dma_idx_sz;
410411
void *idxbuf;
@@ -992,6 +993,11 @@ static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg)
992993
brcmf_dbg(PCIE, "Enter\n");
993994
return IRQ_WAKE_THREAD;
994995
}
996+
997+
/* mailboxint is cleared by the firmware in MSI mode */
998+
if (devinfo->have_msi)
999+
return IRQ_WAKE_THREAD;
1000+
9951001
return IRQ_NONE;
9961002
}
9971003

@@ -1009,12 +1015,12 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
10091015
status);
10101016
if (status & devinfo->reginfo->int_fn0)
10111017
brcmf_pcie_handle_mb_data(devinfo);
1012-
if (status & devinfo->reginfo->int_d2h_db) {
1013-
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1014-
brcmf_proto_msgbuf_rx_trigger(
1015-
&devinfo->pdev->dev);
1016-
}
10171018
}
1019+
if (devinfo->have_msi || status & devinfo->reginfo->int_d2h_db) {
1020+
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1021+
brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev);
1022+
}
1023+
10181024
brcmf_pcie_bus_console_read(devinfo, false);
10191025
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
10201026
brcmf_pcie_intr_enable(devinfo);
@@ -1032,7 +1038,10 @@ static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
10321038

10331039
brcmf_dbg(PCIE, "Enter\n");
10341040

1035-
pci_enable_msi(pdev);
1041+
devinfo->have_msi = pci_enable_msi(pdev) >= 0;
1042+
if (devinfo->have_msi)
1043+
brcmf_dbg(PCIE, "MSI enabled\n");
1044+
10361045
if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr,
10371046
brcmf_pcie_isr_thread, IRQF_SHARED,
10381047
"brcmf_pcie_intr", devinfo)) {

0 commit comments

Comments
 (0)