summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal Sidhwaney <nealsid@gmail.com>2023-06-03 02:00:23 -0400
committerKalle Valo <kvalo@kernel.org>2023-06-08 19:00:00 +0300
commitf8f912bf69a021c8cfff23e69e59c7c975a47c1a (patch)
tree64bae774f5eb865234512b119cf5b740d2b3c769
parent5883fc2ef8573649ee6a63968ae82e679766b878 (diff)
downloadlinux-f8f912bf69a021c8cfff23e69e59c7c975a47c1a.tar.gz
linux-f8f912bf69a021c8cfff23e69e59c7c975a47c1a.tar.bz2
linux-f8f912bf69a021c8cfff23e69e59c7c975a47c1a.zip
wifi: brcmfmac: Detect corner error case earlier with log
In brcmf_chip_recognition(), the return value from an MMIO read is interpreted as various fields without checking if it failed, which is harmless today, as the interpreted fields are checked for validity a few lines below. However, in corner cases (on my MacbookPro 14,1, sometimes after waking from sleep or soft reboot), when this happens, it causes the logging to be misleading, because the message indicates an unsupported chip type ("brcmfmac: brcmf_chip_recognition: chip backplane type 15 is not supported"). This patch detects this case slightly earlier and logs an appropriate message, with the same return result as is the case today. Signed-off-by: Neal Sidhwaney <nealsid@gmail.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20230603060021.57225-1-nealsid@gmail.com
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index 9f9bf08a70bb..2ef92ef25517 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -972,6 +972,7 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci)
u32 regdata;
u32 socitype;
int ret;
+ const u32 READ_FAILED = 0xFFFFFFFF;
/* Get CC core rev
* Chipid is assume to be at offset 0 from SI_ENUM_BASE
@@ -980,6 +981,11 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci)
*/
regdata = ci->ops->read32(ci->ctx,
CORE_CC_REG(ci->pub.enum_base, chipid));
+ if (regdata == READ_FAILED) {
+ brcmf_err("MMIO read failed: 0x%08x\n", regdata);
+ return -ENODEV;
+ }
+
ci->pub.chip = regdata & CID_ID_MASK;
ci->pub.chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT;
socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT;