]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
brcmfmac: fix setting of station info chains bitmask
authorAlvin Šipraga <ALSI@bang-olufsen.dk>
Thu, 6 May 2021 13:20:12 +0000 (13:20 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 14:59:52 +0000 (16:59 +0200)
[ Upstream commit feb45643762172110cb3a44f99dd54304f33b711 ]

The sinfo->chains field is a bitmask for filled values in chain_signal
and chain_signal_avg, not a count. Treat it as such so that the driver
can properly report per-chain RSSI information.

Before (MIMO mode):

  $ iw dev wlan0 station dump
      ...
      signal: -51 [-51] dBm

After (MIMO mode):

  $ iw dev wlan0 station dump
      ...
      signal: -53 [-53, -54] dBm

Fixes: cae355dc90db ("brcmfmac: Add RSSI information to get_station.")
Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210506132010.3964484-1-alsi@bang-olufsen.dk
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

index f4405d7861b69761a12c03e83186edd1d211e854..afa75cb83221f151216431c649d8eb01fc2ac36d 100644 (file)
@@ -2838,6 +2838,7 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
                count_rssi = 0;
                for (i = 0; i < BRCMF_ANT_MAX; i++) {
                        if (sta_info_le.rssi[i]) {
+                               sinfo->chains |= BIT(count_rssi);
                                sinfo->chain_signal_avg[count_rssi] =
                                        sta_info_le.rssi[i];
                                sinfo->chain_signal[count_rssi] =
@@ -2848,8 +2849,6 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
                }
                if (count_rssi) {
                        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
-                       sinfo->chains = count_rssi;
-
                        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
                        total_rssi /= count_rssi;
                        sinfo->signal = total_rssi;