summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/553-ath9k_no_node_rssi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/553-ath9k_no_node_rssi.patch')
-rw-r--r--package/mac80211/patches/553-ath9k_no_node_rssi.patch145
1 files changed, 145 insertions, 0 deletions
diff --git a/package/mac80211/patches/553-ath9k_no_node_rssi.patch b/package/mac80211/patches/553-ath9k_no_node_rssi.patch
new file mode 100644
index 000000000..599148533
--- /dev/null
+++ b/package/mac80211/patches/553-ath9k_no_node_rssi.patch
@@ -0,0 +1,145 @@
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -271,7 +271,6 @@ struct ath_node {
+ struct ath_atx_ac ac[WME_NUM_AC];
+ u16 maxampdu;
+ u8 mpdudensity;
+- int last_rssi;
+ };
+
+ #define AGGR_CLEANUP BIT(1)
+@@ -666,6 +665,7 @@ struct ath_wiphy {
+ bool idle;
+ int chan_idx;
+ int chan_is_ht;
++ int last_rssi;
+ };
+
+ void ath9k_tasklet(unsigned long data);
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -553,7 +553,6 @@ static void ath_node_attach(struct ath_s
+ an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
+ sta->ht_cap.ampdu_factor);
+ an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
+- an->last_rssi = ATH_RSSI_DUMMY_MARKER;
+ }
+ }
+
+@@ -822,9 +821,11 @@ static u32 ath_get_extchanmode(struct at
+ }
+
+ static void ath9k_bss_assoc_info(struct ath_softc *sc,
++ struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_bss_conf *bss_conf)
+ {
++ struct ath_wiphy *aphy = hw->priv;
+ struct ath_hw *ah = sc->sc_ah;
+ struct ath_common *common = ath9k_hw_common(ah);
+
+@@ -848,6 +849,7 @@ static void ath9k_bss_assoc_info(struct
+ ath_beacon_config(sc, vif);
+
+ /* Reset rssi stats */
++ aphy->last_rssi = ATH_RSSI_DUMMY_MARKER;
+ sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
+
+ sc->sc_flags |= SC_OP_ANI_RUN;
+@@ -1969,7 +1971,7 @@ static void ath9k_bss_info_changed(struc
+ if (changed & BSS_CHANGED_ASSOC) {
+ ath_print(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
+ bss_conf->assoc);
+- ath9k_bss_assoc_info(sc, vif, bss_conf);
++ ath9k_bss_assoc_info(sc, hw, vif, bss_conf);
+ }
+
+ mutex_unlock(&sc->mutex);
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -960,36 +960,23 @@ static void ath9k_process_rssi(struct at
+ struct ieee80211_hdr *hdr,
+ struct ath_rx_status *rx_stats)
+ {
++ struct ath_wiphy *aphy = hw->priv;
+ struct ath_hw *ah = common->ah;
+- struct ieee80211_sta *sta;
+- struct ath_node *an;
+- int last_rssi = ATH_RSSI_DUMMY_MARKER;
++ int last_rssi;
+ __le16 fc;
+
+- fc = hdr->frame_control;
++ if (ah->opmode != NL80211_IFTYPE_STATION)
++ return;
+
+- rcu_read_lock();
+- /*
+- * XXX: use ieee80211_find_sta! This requires quite a bit of work
+- * under the current ath9k virtual wiphy implementation as we have
+- * no way of tying a vif to wiphy. Typically vifs are attached to
+- * at least one sdata of a wiphy on mac80211 but with ath9k virtual
+- * wiphy you'd have to iterate over every wiphy and each sdata.
+- */
+- if (is_multicast_ether_addr(hdr->addr1))
+- sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, NULL);
+- else
+- sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, hdr->addr1);
++ fc = hdr->frame_control;
++ if (!ieee80211_is_beacon(fc) ||
++ compare_ether_addr(hdr->addr3, common->curbssid))
++ return;
+
+- if (sta) {
+- an = (struct ath_node *) sta->drv_priv;
+- if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
+- !rx_stats->rs_moreaggr)
+- ATH_RSSI_LPF(an->last_rssi, rx_stats->rs_rssi);
+- last_rssi = an->last_rssi;
+- }
+- rcu_read_unlock();
++ if (rx_stats->rs_rssi != ATH9K_RSSI_BAD && !rx_stats->rs_moreaggr)
++ ATH_RSSI_LPF(aphy->last_rssi, rx_stats->rs_rssi);
+
++ last_rssi = aphy->last_rssi;
+ if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
+ rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
+ ATH_RSSI_EP_MULTIPLIER);
+@@ -997,8 +984,7 @@ static void ath9k_process_rssi(struct at
+ rx_stats->rs_rssi = 0;
+
+ /* Update Beacon RSSI, this is used by ANI. */
+- if (ieee80211_is_beacon(fc))
+- ah->stats.avgbrssi = rx_stats->rs_rssi;
++ ah->stats.avgbrssi = rx_stats->rs_rssi;
+ }
+
+ /*
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -729,6 +729,7 @@ int ath9k_init_device(u16 devid, struct
+ const struct ath_bus_ops *bus_ops)
+ {
+ struct ieee80211_hw *hw = sc->hw;
++ struct ath_wiphy *aphy = hw->priv;
+ struct ath_common *common;
+ struct ath_hw *ah;
+ int error = 0;
+@@ -781,6 +782,7 @@ int ath9k_init_device(u16 devid, struct
+ INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
+ INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
+ sc->wiphy_scheduler_int = msecs_to_jiffies(500);
++ aphy->last_rssi = ATH_RSSI_DUMMY_MARKER;
+
+ ath_init_leds(sc);
+ ath_start_rfkill_poll(sc);
+--- a/drivers/net/wireless/ath/ath9k/virtual.c
++++ b/drivers/net/wireless/ath/ath9k/virtual.c
+@@ -107,6 +107,7 @@ int ath9k_wiphy_add(struct ath_softc *sc
+ aphy->sc = sc;
+ aphy->hw = hw;
+ sc->sec_wiphy[i] = aphy;
++ aphy->last_rssi = ATH_RSSI_DUMMY_MARKER;
+ spin_unlock_bh(&sc->wiphy_lock);
+
+ memcpy(addr, common->macaddr, ETH_ALEN);