Message ID | 20230214092423.15175-1-marcan@marcan.st |
---|---|
State | New |
Headers | show |
Series | BCM4387 / Apple M1 platform support | expand |
Hector Martin <marcan@marcan.st> wrote: > At least on BCM4387, the D11 cores are held in reset on cold startup and > firmware expects to release reset itself. Just assert reset here and let > firmware deassert it. Premature deassertion results in the firmware > failing to initialize properly some of the time, with strange AXI bus > errors. > > Also, BCM4387 has 3 cores, up from 2. The logic for handling that is in > brcmf_chip_ai_resetcore(), but since we aren't using that any more, just > handle it here. > > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> > Signed-off-by: Hector Martin <marcan@marcan.st> 10 patches applied to wireless-next.git, thanks. 3c7c07ca7ab1 wifi: brcmfmac: chip: Only disable D11 cores; handle an arbitrary number 098e0b105ce1 wifi: brcmfmac: chip: Handle 1024-unit sizes for TCM blocks 398ce273d6b1 wifi: brcmfmac: cfg80211: Add support for scan params v2 d75ef1f81e42 wifi: brcmfmac: feature: Add support for setting feats based on WLC version a96202acaea4 wifi: brcmfmac: cfg80211: Add support for PMKID_V3 operations 89b89e52153f wifi: brcmfmac: cfg80211: Pass the PMK in binary instead of hex 117ace4014cc wifi: brcmfmac: pcie: Add IDs/properties for BCM4387 dd7e55401fec wifi: brcmfmac: common: Add support for downloading TxCap blobs 75102b7543ed wifi: brcmfmac: pcie: Load and provide TxCap blobs 5b3ee9987f58 wifi: brcmfmac: common: Add support for external calibration blobs
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c index 8073f31be27d..a6239051404b 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c @@ -1292,15 +1292,18 @@ static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip) static inline void brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip) { + int i; struct brcmf_core *core; brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4); - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211); - brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET | - D11_BCMA_IOCTL_PHYCLOCKEN, - D11_BCMA_IOCTL_PHYCLOCKEN, - D11_BCMA_IOCTL_PHYCLOCKEN); + /* Disable the cores only and let the firmware enable them. + * Releasing reset ourselves breaks BCM4387 in weird ways. + */ + for (i = 0; (core = brcmf_chip_get_d11core(&chip->pub, i)); i++) + brcmf_chip_coredisable(core, D11_BCMA_IOCTL_PHYRESET | + D11_BCMA_IOCTL_PHYCLOCKEN, + D11_BCMA_IOCTL_PHYCLOCKEN); } static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec)