aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch')
-rw-r--r--package/kernel/mac80211/patches/350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch b/package/kernel/mac80211/patches/350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch
new file mode 100644
index 0000000000..7b299d54d2
--- /dev/null
+++ b/package/kernel/mac80211/patches/350-0001-brcmfmac-add-fallback-for-devices-that-do-not-report.patch
@@ -0,0 +1,52 @@
+From: Jaap Jan Meijer <jjmeijer88@gmail.com>
+Date: Thu, 12 May 2016 18:25:08 +0200
+Subject: [PATCH] brcmfmac: add fallback for devices that do not report
+ per-chain values
+
+If brcmf_cfg80211_get_station fails to determine the RSSI from the
+per-chain values get the value individually as a fallback.
+
+Fixes: 1f0dc59a6de9 ("brcmfmac: rework .get_station() callback")
+Signed-off-by: Jaap Jan Meijer <jjmeijer88@gmail.com>
+Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -2480,12 +2480,14 @@ brcmf_cfg80211_get_station(struct wiphy
+ const u8 *mac, struct station_info *sinfo)
+ {
+ struct brcmf_if *ifp = netdev_priv(ndev);
++ struct brcmf_scb_val_le scb_val;
+ s32 err = 0;
+ struct brcmf_sta_info_le sta_info_le;
+ u32 sta_flags;
+ u32 is_tdls_peer;
+ s32 total_rssi;
+ s32 count_rssi;
++ int rssi;
+ u32 i;
+
+ brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
+@@ -2569,6 +2571,20 @@ brcmf_cfg80211_get_station(struct wiphy
+ sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
+ total_rssi /= count_rssi;
+ sinfo->signal = total_rssi;
++ } else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
++ &ifp->vif->sme_state)) {
++ memset(&scb_val, 0, sizeof(scb_val));
++ err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI,
++ &scb_val, sizeof(scb_val));
++ if (err) {
++ brcmf_err("Could not get rssi (%d)\n", err);
++ goto done;
++ } else {
++ rssi = le32_to_cpu(scb_val.val);
++ sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
++ sinfo->signal = rssi;
++ brcmf_dbg(CONN, "RSSI %d dBm\n", rssi);
++ }
+ }
+ }
+ done: