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
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 (file)
index 0000000..7b299d5
--- /dev/null
@@ -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: