summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch')
-rw-r--r--package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch44
1 files changed, 44 insertions, 0 deletions
diff --git a/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch b/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch
new file mode 100644
index 000000000..b6d88b0ba
--- /dev/null
+++ b/package/mac80211/patches/580-mac80211_ignore_bad_signal_values.patch
@@ -0,0 +1,44 @@
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -659,6 +659,8 @@ ieee80211_tx_info_clear_status(struct ie
+ * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
+ * @RX_FLAG_40MHZ: HT40 (40 MHz) was used
+ * @RX_FLAG_SHORT_GI: Short guard interval was used
++ * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present.
++ * Valid only for data frames (mainly A-MPDU)
+ */
+ enum mac80211_rx_flags {
+ RX_FLAG_MMIC_ERROR = 1<<0,
+@@ -672,6 +674,7 @@ enum mac80211_rx_flags {
+ RX_FLAG_HT = 1<<9,
+ RX_FLAG_40MHZ = 1<<10,
+ RX_FLAG_SHORT_GI = 1<<11,
++ RX_FLAG_NO_SIGNAL_VAL = 1<<12,
+ };
+
+ /**
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -176,7 +176,8 @@ ieee80211_add_rx_radiotap_header(struct
+ pos += 2;
+
+ /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */
+- if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
++ if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM &&
++ !(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
+ *pos = status->signal;
+ rthdr->it_present |=
+ cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
+@@ -1309,8 +1310,10 @@ ieee80211_rx_h_sta_process(struct ieee80
+
+ sta->rx_fragments++;
+ sta->rx_bytes += rx->skb->len;
+- sta->last_signal = status->signal;
+- ewma_add(&sta->avg_signal, -status->signal);
++ if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
++ sta->last_signal = status->signal;
++ ewma_add(&sta->avg_signal, -status->signal);
++ }
+
+ if (status->chains) {
+ sta->chains = status->chains;