]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: brcmfmac: support CQM RSSI notification with older firmware
authorJohn Keeping <john@metanate.com>
Tue, 24 Jan 2023 10:42:48 +0000 (10:42 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:11:08 +0000 (23:11 +0900)
[ Upstream commit ec52d77d077529f198fd874c550a26b9cc86a331 ]

Using the BCM4339 firmware from linux-firmware (version "BCM4339/2 wl0:
Sep  5 2019 11:05:52 version 6.37.39.113 (r722271 CY)" from
cypress/cyfmac4339-sdio.bin) the RSSI respose is only 4 bytes, which
results in an error being logged.

It seems that older devices send only the RSSI field and neither SNR nor
noise is included.  Handle this by accepting a 4 byte message and
reading only the RSSI from it.

Fixes: 7dd56ea45a66 ("brcmfmac: add support for CQM RSSI notifications")
Signed-off-by: John Keeping <john@metanate.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230124104248.2917465-1-john@metanate.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

index b8c99bfce963a3520b7cea898ca20826b658738f..d17bb22422f48ed27286d138ae1721f26c7fd8f1 100644 (file)
@@ -6494,18 +6494,20 @@ static s32 brcmf_notify_rssi(struct brcmf_if *ifp,
 {
        struct brcmf_cfg80211_vif *vif = ifp->vif;
        struct brcmf_rssi_be *info = data;
-       s32 rssi, snr, noise;
+       s32 rssi, snr = 0, noise = 0;
        s32 low, high, last;
 
-       if (e->datalen < sizeof(*info)) {
+       if (e->datalen >= sizeof(*info)) {
+               rssi = be32_to_cpu(info->rssi);
+               snr = be32_to_cpu(info->snr);
+               noise = be32_to_cpu(info->noise);
+       } else if (e->datalen >= sizeof(rssi)) {
+               rssi = be32_to_cpu(*(__be32 *)data);
+       } else {
                brcmf_err("insufficient RSSI event data\n");
                return 0;
        }
 
-       rssi = be32_to_cpu(info->rssi);
-       snr = be32_to_cpu(info->snr);
-       noise = be32_to_cpu(info->noise);
-
        low = vif->cqm_rssi_low;
        high = vif->cqm_rssi_high;
        last = vif->cqm_rssi_last;