Message ID | 20190829082701.1715-1-zajec5@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 82f93cf46d6007ffa003b2d4a2834563b6b84d21 |
Delegated to: | Kalle Valo |
Headers | show |
Series | [-next] brcmfmac: get chip's default RAM info during PCIe setup | expand |
Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > Getting RAM info just once per driver's lifetime (during chip > recognition) is not enough as it may get adjusted later (depending on > the used firmware). Subsequent inits may load different firmwares so a > full RAM recognition is required on every PCIe setup. This is especially > important since implementing hardware reset on a firmware crash. > > Moreover calling brcmf_chip_get_raminfo() makes sure that RAM core is > up. It's important as having BCMA_CORE_SYS_MEM down on BCM4366 was > resulting in firmware failing to initialize and following error: > [ 65.657546] brcmfmac 0000:01:00.0: brcmf_pcie_download_fw_nvram: Invalid shared RAM address 0x04000001 > > This change makes brcmf_chip_get_raminfo() call during chip recognition > redundant for PCIe devices but SDIO and USB still need it and it's a > very small overhead anyway. > > Fixes: 4684997d9eea ("brcmfmac: reset PCIe bus on a firmware crash") > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Patch applied to wireless-drivers-next.git, thanks. 82f93cf46d60 brcmfmac: get chip's default RAM info during PCIe setup
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c index 1ec48c4f4d4a..dd586a96b57a 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c @@ -696,8 +696,10 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) return 0; } -static int brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci) +int brcmf_chip_get_raminfo(struct brcmf_chip *pub) { + struct brcmf_chip_priv *ci = container_of(pub, struct brcmf_chip_priv, + pub); struct brcmf_core_priv *mem_core; struct brcmf_core *mem; @@ -979,7 +981,7 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci) brcmf_chip_set_passive(&ci->pub); } - return brcmf_chip_get_raminfo(ci); + return brcmf_chip_get_raminfo(&ci->pub); } static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h index 206d7695d57a..7b00f6a59e89 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h @@ -69,6 +69,7 @@ struct brcmf_buscore_ops { void (*activate)(void *ctx, struct brcmf_chip *chip, u32 rstvec); }; +int brcmf_chip_get_raminfo(struct brcmf_chip *pub); struct brcmf_chip *brcmf_chip_attach(void *ctx, const struct brcmf_buscore_ops *ops); void brcmf_chip_detach(struct brcmf_chip *chip); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c index 8d0e74416643..7ac945369762 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -1770,6 +1770,12 @@ static void brcmf_pcie_setup(struct device *dev, int ret, nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len; kfree(fwreq); + ret = brcmf_chip_get_raminfo(devinfo->ci); + if (ret) { + brcmf_err(bus, "Failed to get RAM info\n"); + goto fail; + } + /* Some of the firmwares have the size of the memory of the device * defined inside the firmware. This is because part of the memory in * the device is shared and the devision is determined by FW. Parse