For PCIE wireless device with core revision less than 14, device may miss
PCIE to System Backplane Interrupt via PCIEtoSBMailbox. So add sending
mail box interrupt twice as a hardware workaround.

Signed-off-by: Wright Feng <[email protected]>
---
v2: add comment and check for PCIE core revision
v3: fix compile error
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index fd3968f..d7d3e93 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -675,6 +675,7 @@ static int
 brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data)
 {
        struct brcmf_pcie_shared_info *shared;
+       struct brcmf_core *core;
        u32 addr;
        u32 cur_htod_mb_data;
        u32 i;
@@ -698,7 +699,11 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info 
*devinfo, u32 htod_mb_data)
 
        brcmf_pcie_write_tcm32(devinfo, addr, htod_mb_data);
        pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
-       pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
+
+       /* Send mailbox interrupt twice as a hardware workaround */
+       core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2);
+       if (core->rev <= 13)
+               pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
 
        return 0;
 }
-- 
2.1.0

Reply via email to