From: John W. Linville <linville@tuxdriver.com>
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-Tag: firefly_0821_release~176^2~5751^2~78^2^2~160
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=861bca265e7808e2493590843b8585f6943af16f;p=firefly-linux-kernel-4.4.55.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;