mac80211: brcmfmac: backport fixes for 4.7 and 4.8
[openwrt.git] / package / kernel / mac80211 / patches / 350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch
1 From: Jaap Jan Meijer <jjmeijer88@gmail.com>
2 Date: Thu, 12 May 2016 18:25:08 +0200
3 Subject: [PATCH] brcmfmac: add fallback for devices that do not report
4  per-chain values
5
6 If brcmf_cfg80211_get_station fails to determine the RSSI from the
7 per-chain values get the value individually as a fallback.
8
9 Fixes: 1f0dc59a6de9 ("brcmfmac: rework .get_station() callback")
10 Signed-off-by: Jaap Jan Meijer <jjmeijer88@gmail.com>
11 Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
12 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
13 ---
14
15 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
16 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
17 @@ -2480,12 +2480,14 @@ brcmf_cfg80211_get_station(struct wiphy
18                            const u8 *mac, struct station_info *sinfo)
19  {
20         struct brcmf_if *ifp = netdev_priv(ndev);
21 +       struct brcmf_scb_val_le scb_val;
22         s32 err = 0;
23         struct brcmf_sta_info_le sta_info_le;
24         u32 sta_flags;
25         u32 is_tdls_peer;
26         s32 total_rssi;
27         s32 count_rssi;
28 +       int rssi;
29         u32 i;
30  
31         brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
32 @@ -2569,6 +2571,20 @@ brcmf_cfg80211_get_station(struct wiphy
33                         sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
34                         total_rssi /= count_rssi;
35                         sinfo->signal = total_rssi;
36 +               } else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
37 +                       &ifp->vif->sme_state)) {
38 +                       memset(&scb_val, 0, sizeof(scb_val));
39 +                       err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI,
40 +                                                    &scb_val, sizeof(scb_val));
41 +                       if (err) {
42 +                               brcmf_err("Could not get rssi (%d)\n", err);
43 +                               goto done;
44 +                       } else {
45 +                               rssi = le32_to_cpu(scb_val.val);
46 +                               sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
47 +                               sinfo->signal = rssi;
48 +                               brcmf_dbg(CONN, "RSSI %d dBm\n", rssi);
49 +                       }
50                 }
51         }
52  done: