diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-10-16 02:30:30 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-10-16 02:30:30 +0000 |
commit | cbe6c66638efddd36b0bb71f46dd5f5689a3e045 (patch) | |
tree | 7fc287bd3cfab8f40a0baaf8e6d80aa0a530401d /package/mac80211/patches/553-ath9k_no_node_rssi.patch | |
parent | fdb67f01dfbe2d6c79f7433f55baef1786d74d0c (diff) |
mac80211: update to wireless-testing 2010-10-15, add a few ath9k fixes and performance enhancements
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@23470 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/patches/553-ath9k_no_node_rssi.patch')
-rw-r--r-- | package/mac80211/patches/553-ath9k_no_node_rssi.patch | 145 |
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 0000000000..5991485338 --- /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); |