From: John W. Linville Date: Wed, 12 Jun 2013 18:35:23 +0000 (-0400) Subject: Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=861bca265e7808e2493590843b8585f6943af16f;p=openwrt%2Fstaging%2Fblogic.git Merge branch 'master' of git://git./linux/kernel/git/linville/wireless Conflicts: drivers/net/wireless/ath/ath9k/Kconfig net/mac80211/iface.c --- 861bca265e7808e2493590843b8585f6943af16f diff --cc drivers/net/wireless/ath/ath9k/Kconfig index ec33c8007b29,3c2cbc9d6295..760ab3fe09e2 --- a/drivers/net/wireless/ath/ath9k/Kconfig +++ b/drivers/net/wireless/ath/ath9k/Kconfig @@@ -84,13 -84,25 +84,17 @@@ config ATH9K_DFS_CERTIFIE developed. At this point enabling this option won't do anything except increase code size. - config ATH9K_RATE_CONTROL -config ATH9K_MAC_DEBUG - bool "Atheros MAC statistics" - depends on ATH9K_DEBUGFS - default y - ---help--- - This option enables collection of statistics for Rx/Tx status - data and some other MAC related statistics - + config ATH9K_LEGACY_RATE_CONTROL bool "Atheros ath9k rate control" depends on ATH9K - default y + default n ---help--- Say Y, if you want to use the ath9k specific rate control - module instead of minstrel_ht. + module instead of minstrel_ht. Be warned that there are various + issues with the ath9k RC and minstrel is a more robust algorithm. + Note that even if this option is selected, "ath9k_rate_control" + has to be passed to mac80211 using the module parameter, + ieee80211_default_rc_algo. config ATH9K_HTC tristate "Atheros HTC based wireless cards support" diff --cc drivers/net/wireless/ath/ath9k/main.c index cc5a98b8d187,5092ecae7706..e5b186b04b29 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@@ -1686,9 -1687,10 +1686,10 @@@ static int ath9k_ampdu_action(struct ie u16 tid, u16 *ssn, u8 buf_size) { struct ath_softc *sc = hw->priv; + bool flush = false; int ret = 0; - local_bh_disable(); + mutex_lock(&sc->mutex); switch (action) { case IEEE80211_AMPDU_RX_START: diff --cc net/mac80211/iface.c index 7cabaf261fed,98d20c0f6fed..a2a8250e2f84 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@@ -159,10 -159,10 +159,11 @@@ static int ieee80211_change_mtu(struct return 0; } - static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr, -static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr) ++static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, + bool check_dup) { - struct ieee80211_sub_if_data *sdata; + struct ieee80211_local *local = sdata->local; + struct ieee80211_sub_if_data *iter; u64 new, mask, tmp; u8 *m; int ret = 0; @@@ -180,16 -180,16 +181,19 @@@ ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); + if (!check_dup) + return ret; mutex_lock(&local->iflist_mtx); - list_for_each_entry(sdata, &local->interfaces, list) { - if (sdata->vif.type == NL80211_IFTYPE_MONITOR && - !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) + list_for_each_entry(iter, &local->interfaces, list) { + if (iter == sdata) continue; - m = sdata->vif.addr; - if (iter->vif.type == NL80211_IFTYPE_MONITOR) ++ if (iter->vif.type == NL80211_IFTYPE_MONITOR && ++ !(iter->u.mntr_flags & MONITOR_FLAG_ACTIVE)) + continue; + + m = iter->vif.addr; tmp = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); @@@ -214,11 -213,7 +218,11 @@@ static int ieee80211_change_mac(struct if (ieee80211_sdata_running(sdata)) return -EBUSY; - ret = ieee80211_verify_mac(sdata, sa->sa_data); + if (sdata->vif.type == NL80211_IFTYPE_MONITOR && + !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) + check_dup = false; + - ret = ieee80211_verify_mac(sdata->local, sa->sa_data, check_dup); ++ ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); if (ret) return ret;