brcmfmac: send mailbox interrupt twice for specific hardware device
authorWright Feng <Wright.Feng@cypress.com>
Fri, 26 Apr 2019 03:12:32 +0000 (03:12 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 26 Apr 2019 12:00:53 +0000 (15:00 +0300)
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 <wright.feng@cypress.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c

index fd3968fd158e95e6bcc55fb6884b4d26e138f2d2..d7d3e93461736f2a88ed5b42c431c6ae328dd063 100644 (file)
@@ -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;
 }