[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20241122210346.2848578-1-alexthreed@gmail.com>
Date: Sat, 23 Nov 2024 00:03:46 +0300
From: Alex Shumsky <alexthreed@...il.com>
To: linux-wireless@...r.kernel.org
Cc: Alex Shumsky <alexthreed@...il.com>,
Alexey Berezhok <a@...repo.ru>,
Alvin Šipraga <ALSI@...g-olufsen.dk>,
Arend van Spriel <arend.vanspriel@...adcom.com>,
Hector Martin <marcan@...can.st>,
Janne Grunau <j@...nau.net>,
Kalle Valo <kvalo@...nel.org>,
Kees Cook <kees@...nel.org>,
Neal Gompa <neal@...pa.dev>,
Wolfram Sang <wsa+renesas@...g-engineering.com>,
brcm80211-dev-list.pdl@...adcom.com,
brcm80211@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: [PATCH] brcmfmac: fix RSSI report in AP mode
After commit 9a1590934d9a ("brcmfmac: correctly report average RSSI in
station info") it is required from firmware to provide rx_lastpkt_rssi.
If this field is not provided brcmfmac doesn't report any RSSI at all.
Unfortunately some firmwares doesn't provide it. One example is firmware
for BCM43455 found in Raspbberry Pi.
See https://github.com/raspberrypi/linux/issues/4574
Fix it by falling back to rssi field if rx_lastpkt_rssi is not provided
(like it was before 9a1590934d9a).
Fixes: 9a1590934d9a ("brcmfmac: correctly report average RSSI in station info")
Signed-off-by: Alex Shumsky <alexthreed@...il.com>
---
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 349aa3439502..8fc10858e936 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -3125,6 +3125,7 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
s32 total_rssi = 0;
s32 count_rssi = 0;
int rssi;
+ int rx_lastpkt_rssi;
u32 i;
brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
@@ -3190,15 +3191,16 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
}
for (i = 0; i < BRCMF_ANT_MAX; i++) {
- if (sta_info_le.rssi[i] == 0 ||
- sta_info_le.rx_lastpkt_rssi[i] == 0)
+ if (sta_info_le.rssi[i] == 0)
continue;
+ rx_lastpkt_rssi = sta_info_le.rx_lastpkt_rssi[i] != 0 ?
+ sta_info_le.rx_lastpkt_rssi[i] :
+ sta_info_le.rssi[i];
sinfo->chains |= BIT(count_rssi);
- sinfo->chain_signal[count_rssi] =
- sta_info_le.rx_lastpkt_rssi[i];
+ sinfo->chain_signal[count_rssi] = rx_lastpkt_rssi;
sinfo->chain_signal_avg[count_rssi] =
sta_info_le.rssi[i];
- total_rssi += sta_info_le.rx_lastpkt_rssi[i];
+ total_rssi += rx_lastpkt_rssi;
total_rssi_avg += sta_info_le.rssi[i];
count_rssi++;
}
--
2.34.1
Powered by blists - more mailing lists