Skip to content

Commit 8a095f3

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 5a028aa commit 8a095f3

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
@@ -406,6 +406,7 @@ struct brcmf_pciedev_info {
406406
wait_queue_head_t mbdata_resp_wait;
407407
bool mbdata_completed;
408408
bool irq_allocated;
409+
bool have_msi;
409410
bool wowl_enabled;
410411
u8 dma_idx_sz;
411412
void *idxbuf;
@@ -990,6 +991,11 @@ static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg)
990991
brcmf_dbg(PCIE, "Enter\n");
991992
return IRQ_WAKE_THREAD;
992993
}
994+
995+
/* mailboxint is cleared by the firmware in MSI mode */
996+
if (devinfo->have_msi)
997+
return IRQ_WAKE_THREAD;
998+
993999
return IRQ_NONE;
9941000
}
9951001

@@ -1007,12 +1013,12 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
10071013
status);
10081014
if (status & devinfo->reginfo->int_fn0)
10091015
brcmf_pcie_handle_mb_data(devinfo);
1010-
if (status & devinfo->reginfo->int_d2h_db) {
1011-
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1012-
brcmf_proto_msgbuf_rx_trigger(
1013-
&devinfo->pdev->dev);
1014-
}
10151016
}
1017+
if (devinfo->have_msi || status & devinfo->reginfo->int_d2h_db) {
1018+
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
1019+
brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev);
1020+
}
1021+
10161022
brcmf_pcie_bus_console_read(devinfo, false);
10171023
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
10181024
brcmf_pcie_intr_enable(devinfo);
@@ -1030,7 +1036,10 @@ static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
10301036

10311037
brcmf_dbg(PCIE, "Enter\n");
10321038

1033-
pci_enable_msi(pdev);
1039+
devinfo->have_msi = pci_enable_msi(pdev) >= 0;
1040+
if (devinfo->have_msi)
1041+
brcmf_dbg(PCIE, "MSI enabled\n");
1042+
10341043
if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr,
10351044
brcmf_pcie_isr_thread, IRQF_SHARED,
10361045
"brcmf_pcie_intr", devinfo)) {

0 commit comments

Comments
 (0)