Преглед изворни кода

mac80211: update to wireless-testing 2013-02-22

SVN-Revision: 35753
Felix Fietkau пре 12 година
родитељ
комит
e526c7bc17
36 измењених фајлова са 374 додато и 3162 уклоњено
  1. 3 0
      Config.in
  2. 3 2
      package/mac80211/Makefile
  3. 2 2
      package/mac80211/patches/002-disable_ssb_build.patch
  4. 1 1
      package/mac80211/patches/130-mesh_pathtbl_backport.patch
  5. 218 2948
      package/mac80211/patches/300-pending_work.patch
  6. 1 1
      package/mac80211/patches/310-ap_scan.patch
  7. 1 1
      package/mac80211/patches/401-ath9k_blink_default.patch
  8. 1 1
      package/mac80211/patches/403-ath_regd_optional.patch
  9. 2 2
      package/mac80211/patches/405-regd_no_assoc_hints.patch
  10. 1 1
      package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  11. 3 3
      package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
  12. 2 2
      package/mac80211/patches/420-ath5k_disable_fast_cc.patch
  13. 2 2
      package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  14. 2 2
      package/mac80211/patches/501-ath9k-eeprom_endianess.patch
  15. 1 1
      package/mac80211/patches/502-ath9k_ahb_init.patch
  16. 10 10
      package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  17. 1 1
      package/mac80211/patches/513-mac80211_reduce_txqueuelen.patch
  18. 3 3
      package/mac80211/patches/520-mac80211_cur_txpower.patch
  19. 2 2
      package/mac80211/patches/521-ath9k_cur_txpower.patch
  20. 42 33
      package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch
  21. 19 19
      package/mac80211/patches/523-mac80211_configure_antenna_gain.patch
  22. 1 1
      package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch
  23. 7 7
      package/mac80211/patches/530-ath9k_extra_leds.patch
  24. 6 6
      package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch
  25. 0 71
      package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch
  26. 6 6
      package/mac80211/patches/553-ath9k_debugfs_diag.patch
  27. 2 2
      package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch
  28. 5 5
      package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
  29. 1 1
      package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch
  30. 1 1
      package/mac80211/patches/606-rt2x00_no_realign.patch
  31. 2 2
      package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
  32. 2 2
      package/mac80211/patches/608-add_platform_data_mac_addr.patch
  33. 8 8
      package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
  34. 7 7
      package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
  35. 1 1
      package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
  36. 5 5
      package/mac80211/patches/850-brcmsmac-start-adding-support-for-core-rev-28.patch

+ 3 - 0
Config.in

@@ -293,6 +293,9 @@ menu "Global build settings"
 		bool "Enable printk timestamps"
 		bool "Enable printk timestamps"
 		default y
 		default y
 
 
+	config KERNEL_RELAY
+		bool
+
 	#
 	#
 	# CGROUP support symbols
 	# CGROUP support symbols
 	#
 	#

+ 3 - 2
package/mac80211/Makefile

@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
 
 
 PKG_NAME:=mac80211
 PKG_NAME:=mac80211
 
 
-PKG_VERSION:=2013-01-07
+PKG_VERSION:=2013-02-22
 PKG_RELEASE:=1
 PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_MD5SUM:=bc4924720ebd8f3fcd9588e3c0f4db1c
+PKG_MD5SUM:=de1a03ca1f72748d4523672c8facbf7e
 
 
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@@ -385,6 +385,7 @@ define KernelPackage/ath/config
 
 
 	config PACKAGE_ATH_DEBUG
 	config PACKAGE_ATH_DEBUG
 		bool "Atheros wireless debugging"
 		bool "Atheros wireless debugging"
+		select KERNEL_RELAY
 		help
 		help
 		  Say Y, if you want to debug atheros wireless drivers.
 		  Say Y, if you want to debug atheros wireless drivers.
 		  Right now only ath9k makes use of this.
 		  Right now only ath9k makes use of this.

+ 2 - 2
package/mac80211/patches/002-disable_ssb_build.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 --- a/config.mk
 +++ b/config.mk
 +++ b/config.mk
-@@ -354,7 +354,8 @@ export CONFIG_IPW2200_QOS=y
+@@ -364,7 +364,8 @@ export CONFIG_IPW2200_QOS=y
  # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
  # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
  endif #CONFIG_WIRELESS_EXT
  endif #CONFIG_WIRELESS_EXT
  
  
@@ -10,7 +10,7 @@
  # Sonics Silicon Backplane
  # Sonics Silicon Backplane
  export CONFIG_SSB_SPROM=y
  export CONFIG_SSB_SPROM=y
  
  
-@@ -367,7 +368,7 @@ endif #CONFIG_PCMCIA
+@@ -377,7 +378,7 @@ endif #CONFIG_PCMCIA
  # export CONFIG_SSB_DEBUG=y
  # export CONFIG_SSB_DEBUG=y
  export CONFIG_SSB_DRIVER_PCICORE=y
  export CONFIG_SSB_DRIVER_PCICORE=y
  export CONFIG_B43_SSB=y
  export CONFIG_B43_SSB=y

+ 1 - 1
package/mac80211/patches/130-mesh_pathtbl_backport.patch

@@ -1,6 +1,6 @@
 --- a/net/mac80211/mesh_pathtbl.c
 --- a/net/mac80211/mesh_pathtbl.c
 +++ b/net/mac80211/mesh_pathtbl.c
 +++ b/net/mac80211/mesh_pathtbl.c
-@@ -813,7 +813,6 @@ static void table_flush_by_iface(struct 
+@@ -818,7 +818,6 @@ static void table_flush_by_iface(struct 
  	struct hlist_node *p;
  	struct hlist_node *p;
  	int i;
  	int i;
  
  

+ 218 - 2948
package/mac80211/patches/300-pending_work.patch

@@ -1,6 +1,117 @@
+--- a/drivers/net/wireless/ath/ath9k/common.h
++++ b/drivers/net/wireless/ath/ath9k/common.h
+@@ -27,7 +27,7 @@
+ #define WME_MAX_BA              WME_BA_BMP_SIZE
+ #define ATH_TID_MAX_BUFS        (2 * WME_MAX_BA)
+ 
+-#define ATH_RSSI_DUMMY_MARKER   0x127
++#define ATH_RSSI_DUMMY_MARKER   127
+ #define ATH_RSSI_LPF_LEN 		10
+ #define RSSI_LPF_THRESHOLD		-20
+ #define ATH_RSSI_EP_MULTIPLIER     (1<<7)
+--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
++++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+@@ -1067,15 +1067,19 @@ static bool ath9k_rx_prepare(struct ath9
+ 
+ 	last_rssi = priv->rx.last_rssi;
+ 
+-	if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
+-		rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi,
+-						     ATH_RSSI_EP_MULTIPLIER);
++	if (ieee80211_is_beacon(hdr->frame_control) &&
++	    !is_zero_ether_addr(common->curbssid) &&
++	    ether_addr_equal(hdr->addr3, common->curbssid)) {
++		s8 rssi = rxbuf->rxstatus.rs_rssi;
+ 
+-	if (rxbuf->rxstatus.rs_rssi < 0)
+-		rxbuf->rxstatus.rs_rssi = 0;
++		if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
++			rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER);
+ 
+-	if (ieee80211_is_beacon(fc))
+-		priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi;
++		if (rssi < 0)
++			rssi = 0;
++
++		priv->ah->stats.avgbrssi = rssi;
++	}
+ 
+ 	rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp);
+ 	rx_status->band = hw->conf.channel->band;
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -185,7 +185,7 @@ struct ieee80211_hdr {
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+ 	u8 addr4[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_hdr_3addr {
+ 	__le16 frame_control;
+@@ -194,7 +194,7 @@ struct ieee80211_hdr_3addr {
+ 	u8 addr2[6];
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_qos_hdr {
+ 	__le16 frame_control;
+@@ -204,7 +204,7 @@ struct ieee80211_qos_hdr {
+ 	u8 addr3[6];
+ 	__le16 seq_ctrl;
+ 	__le16 qos_ctrl;
+-} __packed;
++} __packed __aligned(2);
+ 
+ /**
+  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
+@@ -581,7 +581,7 @@ struct ieee80211s_hdr {
+ 	__le32 seqnum;
+ 	u8 eaddr1[6];
+ 	u8 eaddr2[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ /* Mesh flags */
+ #define MESH_FLAGS_AE_A4 	0x1
+@@ -875,7 +875,7 @@ struct ieee80211_mgmt {
+ 			} u;
+ 		} __packed action;
+ 	} u;
+-} __packed;
++} __packed __aligned(2);
+ 
+ /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
+ #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
+@@ -906,20 +906,20 @@ struct ieee80211_rts {
+ 	__le16 duration;
+ 	u8 ra[6];
+ 	u8 ta[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_cts {
+ 	__le16 frame_control;
+ 	__le16 duration;
+ 	u8 ra[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ struct ieee80211_pspoll {
+ 	__le16 frame_control;
+ 	__le16 aid;
+ 	u8 bssid[6];
+ 	u8 ta[6];
+-} __packed;
++} __packed __aligned(2);
+ 
+ /* TDLS */
+ 
 --- a/net/mac80211/agg-rx.c
 --- a/net/mac80211/agg-rx.c
 +++ b/net/mac80211/agg-rx.c
 +++ b/net/mac80211/agg-rx.c
-@@ -203,6 +203,8 @@ static void ieee80211_send_addba_resp(st
+@@ -204,6 +204,8 @@ static void ieee80211_send_addba_resp(st
  		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
  		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
  	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
  	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
  		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
  		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
@@ -21,7 +132,7 @@
  		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
  		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
  	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
  	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
  		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
  		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
-@@ -520,6 +521,7 @@ int ieee80211_start_tx_ba_session(struct
+@@ -527,6 +528,7 @@ int ieee80211_start_tx_ba_session(struct
  	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
  	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
  	    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
  	    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
  	    sdata->vif.type != NL80211_IFTYPE_AP &&
  	    sdata->vif.type != NL80211_IFTYPE_AP &&
@@ -35,8 +146,8 @@
  	test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
  	test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
  
  
  	int res = scnprintf(buf, sizeof(buf),
  	int res = scnprintf(buf, sizeof(buf),
--			    "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
-+			    "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+-			    "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
++			    "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  			    TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
  			    TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
  			    TEST(PS_DRIVER), TEST(AUTHORIZED),
  			    TEST(PS_DRIVER), TEST(AUTHORIZED),
  			    TEST(SHORT_PREAMBLE),
  			    TEST(SHORT_PREAMBLE),
@@ -47,7 +158,7 @@
  			    TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
  			    TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
 --- a/net/mac80211/iface.c
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -501,7 +501,6 @@ int ieee80211_do_open(struct wireless_de
+@@ -436,7 +436,6 @@ int ieee80211_do_open(struct wireless_de
  	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  	struct net_device *dev = wdev->netdev;
  	struct net_device *dev = wdev->netdev;
  	struct ieee80211_local *local = sdata->local;
  	struct ieee80211_local *local = sdata->local;
@@ -55,7 +166,7 @@
  	u32 changed = 0;
  	u32 changed = 0;
  	int res;
  	int res;
  	u32 hw_reconf_flags = 0;
  	u32 hw_reconf_flags = 0;
-@@ -658,30 +657,8 @@ int ieee80211_do_open(struct wireless_de
+@@ -595,30 +594,8 @@ int ieee80211_do_open(struct wireless_de
  
  
  	set_bit(SDATA_STATE_RUNNING, &sdata->state);
  	set_bit(SDATA_STATE_RUNNING, &sdata->state);
  
  
@@ -87,7 +198,7 @@
  
  
  	/*
  	/*
  	 * set_multicast_list will be invoked by the networking core
  	 * set_multicast_list will be invoked by the networking core
-@@ -1066,6 +1043,72 @@ static void ieee80211_if_setup(struct ne
+@@ -1022,6 +999,72 @@ static void ieee80211_if_setup(struct ne
  	dev->destructor = free_netdev;
  	dev->destructor = free_netdev;
  }
  }
  
  
@@ -141,7 +252,7 @@
 +
 +
 +	if (elems.ht_cap_elem)
 +	if (elems.ht_cap_elem)
 +		ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
 +		ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
-+				elems.ht_cap_elem, &sta->sta.ht_cap);
++				elems.ht_cap_elem, sta);
 +
 +
 +	if (elems.wmm_param)
 +	if (elems.wmm_param)
 +		set_sta_flag(sta, WLAN_STA_WME);
 +		set_sta_flag(sta, WLAN_STA_WME);
@@ -160,7 +271,7 @@
  static void ieee80211_iface_work(struct work_struct *work)
  static void ieee80211_iface_work(struct work_struct *work)
  {
  {
  	struct ieee80211_sub_if_data *sdata =
  	struct ieee80211_sub_if_data *sdata =
-@@ -1170,6 +1213,9 @@ static void ieee80211_iface_work(struct 
+@@ -1126,6 +1169,9 @@ static void ieee80211_iface_work(struct 
  				break;
  				break;
  			ieee80211_mesh_rx_queued_mgmt(sdata, skb);
  			ieee80211_mesh_rx_queued_mgmt(sdata, skb);
  			break;
  			break;
@@ -172,7 +283,7 @@
  			break;
  			break;
 --- a/net/mac80211/rx.c
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -2350,6 +2350,7 @@ ieee80211_rx_h_action(struct ieee80211_r
+@@ -2365,6 +2365,7 @@ ieee80211_rx_h_action(struct ieee80211_r
  		    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
  		    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
  		    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
  		    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
  		    sdata->vif.type != NL80211_IFTYPE_AP &&
  		    sdata->vif.type != NL80211_IFTYPE_AP &&
@@ -180,7 +291,7 @@
  		    sdata->vif.type != NL80211_IFTYPE_ADHOC)
  		    sdata->vif.type != NL80211_IFTYPE_ADHOC)
  			break;
  			break;
  
  
-@@ -2655,14 +2656,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
+@@ -2692,14 +2693,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
  
  
  	if (!ieee80211_vif_is_mesh(&sdata->vif) &&
  	if (!ieee80211_vif_is_mesh(&sdata->vif) &&
  	    sdata->vif.type != NL80211_IFTYPE_ADHOC &&
  	    sdata->vif.type != NL80211_IFTYPE_ADHOC &&
@@ -198,7 +309,7 @@
  		break;
  		break;
  	case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
  	case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
  	case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
  	case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
-@@ -2987,10 +2989,16 @@ static int prepare_for_handlers(struct i
+@@ -3028,10 +3030,16 @@ static int prepare_for_handlers(struct i
  		}
  		}
  		break;
  		break;
  	case NL80211_IFTYPE_WDS:
  	case NL80211_IFTYPE_WDS:
@@ -227,7 +338,7 @@
   * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the
   * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the
   *	IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next
   *	IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next
   *	frame to this station is transmitted.
   *	frame to this station is transmitted.
-@@ -64,7 +63,6 @@ enum ieee80211_sta_info_flags {
+@@ -66,7 +65,6 @@ enum ieee80211_sta_info_flags {
  	WLAN_STA_AUTHORIZED,
  	WLAN_STA_AUTHORIZED,
  	WLAN_STA_SHORT_PREAMBLE,
  	WLAN_STA_SHORT_PREAMBLE,
  	WLAN_STA_WME,
  	WLAN_STA_WME,
@@ -235,2963 +346,122 @@
  	WLAN_STA_CLEAR_PS_FILT,
  	WLAN_STA_CLEAR_PS_FILT,
  	WLAN_STA_MFP,
  	WLAN_STA_MFP,
  	WLAN_STA_BLOCK_BA,
  	WLAN_STA_BLOCK_BA,
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -314,7 +314,6 @@ struct ath_rx {
- 	u32 *rxlink;
- 	u32 num_pkts;
- 	unsigned int rxfilter;
--	spinlock_t rxbuflock;
- 	struct list_head rxbuf;
- 	struct ath_descdma rxdma;
- 	struct ath_rx_edma rx_edma[ATH9K_RX_QUEUE_MAX];
-@@ -324,7 +323,6 @@ struct ath_rx {
- 
- int ath_startrecv(struct ath_softc *sc);
- bool ath_stoprecv(struct ath_softc *sc);
--void ath_flushrecv(struct ath_softc *sc);
- u32 ath_calcrxfilter(struct ath_softc *sc);
- int ath_rx_init(struct ath_softc *sc, int nbufs);
- void ath_rx_cleanup(struct ath_softc *sc);
-@@ -334,9 +332,8 @@ void ath_txq_lock(struct ath_softc *sc, 
- void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq);
- void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq);
- void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq);
--bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx);
--void ath_draintxq(struct ath_softc *sc,
--		     struct ath_txq *txq, bool retry_tx);
-+bool ath_drain_all_txq(struct ath_softc *sc);
-+void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq);
- void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an);
- void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an);
- void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq);
-@@ -641,7 +638,6 @@ void ath_ant_comb_update(struct ath_soft
- enum sc_op_flags {
- 	SC_OP_INVALID,
- 	SC_OP_BEACONS,
--	SC_OP_RXFLUSH,
- 	SC_OP_ANI_RUN,
- 	SC_OP_PRIM_STA_VIF,
- 	SC_OP_HW_RESET,
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -147,6 +147,7 @@ static struct ath_buf *ath9k_beacon_gene
- 				 skb->len, DMA_TO_DEVICE);
- 		dev_kfree_skb_any(skb);
- 		bf->bf_buf_addr = 0;
-+		bf->bf_mpdu = NULL;
- 	}
- 
- 	skb = ieee80211_beacon_get(hw, vif);
-@@ -198,7 +199,7 @@ static struct ath_buf *ath9k_beacon_gene
- 		if (sc->nvifs > 1) {
- 			ath_dbg(common, BEACON,
- 				"Flushing previous cabq traffic\n");
--			ath_draintxq(sc, cabq, false);
-+			ath_draintxq(sc, cabq);
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1848,9 +1848,24 @@ netdev_tx_t ieee80211_subif_start_xmit(s
  		}
  		}
- 	}
- 
-@@ -359,7 +360,6 @@ void ath9k_beacon_tasklet(unsigned long 
- 		return;
- 
- 	bf = ath9k_beacon_generate(sc->hw, vif);
--	WARN_ON(!bf);
- 
- 	if (sc->beacon.bmisscnt != 0) {
- 		ath_dbg(common, BSTUCK, "resume beacon xmit after %u misses\n",
---- a/drivers/net/wireless/ath/ath9k/debug.c
-+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -861,7 +861,6 @@ static ssize_t read_file_recv(struct fil
- 	RXS_ERR("RX-LENGTH-ERR", rx_len_err);
- 	RXS_ERR("RX-OOM-ERR", rx_oom_err);
- 	RXS_ERR("RX-RATE-ERR", rx_rate_err);
--	RXS_ERR("RX-DROP-RXFLUSH", rx_drop_rxflush);
- 	RXS_ERR("RX-TOO-MANY-FRAGS", rx_too_many_frags_err);
- 
- 	PHY_ERR("UNDERRUN ERR", ATH9K_PHYERR_UNDERRUN);
---- a/drivers/net/wireless/ath/ath9k/debug.h
-+++ b/drivers/net/wireless/ath/ath9k/debug.h
-@@ -216,7 +216,6 @@ struct ath_tx_stats {
-  * @rx_oom_err:  No. of frames dropped due to OOM issues.
-  * @rx_rate_err:  No. of frames dropped due to rate errors.
-  * @rx_too_many_frags_err:  Frames dropped due to too-many-frags received.
-- * @rx_drop_rxflush: No. of frames dropped due to RX-FLUSH.
-  * @rx_beacons:  No. of beacons received.
-  * @rx_frags:  No. of rx-fragements received.
-  */
-@@ -235,7 +234,6 @@ struct ath_rx_stats {
- 	u32 rx_oom_err;
- 	u32 rx_rate_err;
- 	u32 rx_too_many_frags_err;
--	u32 rx_drop_rxflush;
- 	u32 rx_beacons;
- 	u32 rx_frags;
- };
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -182,7 +182,7 @@ static void ath_restart_work(struct ath_
- 	ath_start_ani(sc);
- }
- 
--static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush)
-+static bool ath_prepare_reset(struct ath_softc *sc)
- {
- 	struct ath_hw *ah = sc->sc_ah;
- 	bool ret = true;
-@@ -196,20 +196,12 @@ static bool ath_prepare_reset(struct ath
- 	ath9k_debug_samp_bb_mac(sc);
- 	ath9k_hw_disable_interrupts(ah);
- 
--	if (!ath_stoprecv(sc))
-+	if (!ath_drain_all_txq(sc))
- 		ret = false;
- 
--	if (!ath_drain_all_txq(sc, retry_tx))
-+	if (!ath_stoprecv(sc))
- 		ret = false;
- 
--	if (!flush) {
--		if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
--			ath_rx_tasklet(sc, 1, true);
--		ath_rx_tasklet(sc, 1, false);
--	} else {
--		ath_flushrecv(sc);
--	}
--
- 	return ret;
- }
- 
-@@ -255,18 +247,17 @@ static bool ath_complete_reset(struct at
- 	return true;
- }
  
  
--static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan,
--			      bool retry_tx)
-+static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
- {
- 	struct ath_hw *ah = sc->sc_ah;
- 	struct ath_common *common = ath9k_hw_common(ah);
- 	struct ath9k_hw_cal_data *caldata = NULL;
- 	bool fastcc = true;
--	bool flush = false;
- 	int r;
- 
- 	__ath_cancel_work(sc);
- 
-+	tasklet_disable(&sc->intr_tq);
- 	spin_lock_bh(&sc->sc_pcu_lock);
- 
- 	if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) {
-@@ -276,11 +267,10 @@ static int ath_reset_internal(struct ath
- 
- 	if (!hchan) {
- 		fastcc = false;
--		flush = true;
- 		hchan = ah->curchan;
- 	}
- 
--	if (!ath_prepare_reset(sc, retry_tx, flush))
-+	if (!ath_prepare_reset(sc))
- 		fastcc = false;
- 
- 	ath_dbg(common, CONFIG, "Reset to %u MHz, HT40: %d fastcc: %d\n",
-@@ -302,6 +292,8 @@ static int ath_reset_internal(struct ath
- 
- out:
- 	spin_unlock_bh(&sc->sc_pcu_lock);
-+	tasklet_enable(&sc->intr_tq);
-+
- 	return r;
- }
- 
-@@ -319,7 +311,7 @@ static int ath_set_channel(struct ath_so
- 	if (test_bit(SC_OP_INVALID, &sc->sc_flags))
- 		return -EIO;
- 
--	r = ath_reset_internal(sc, hchan, false);
-+	r = ath_reset_internal(sc, hchan);
- 
- 	return r;
- }
-@@ -549,23 +541,21 @@ chip_reset:
- #undef SCHED_INTR
- }
- 
--static int ath_reset(struct ath_softc *sc, bool retry_tx)
-+static int ath_reset(struct ath_softc *sc)
- {
--	int r;
-+	int i, r;
- 
- 	ath9k_ps_wakeup(sc);
- 
--	r = ath_reset_internal(sc, NULL, retry_tx);
-+	r = ath_reset_internal(sc, NULL);
- 
--	if (retry_tx) {
--		int i;
--		for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
--			if (ATH_TXQ_SETUP(sc, i)) {
--				spin_lock_bh(&sc->tx.txq[i].axq_lock);
--				ath_txq_schedule(sc, &sc->tx.txq[i]);
--				spin_unlock_bh(&sc->tx.txq[i].axq_lock);
--			}
--		}
-+	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
-+		if (!ATH_TXQ_SETUP(sc, i))
-+			continue;
+ 		if (!is_multicast_ether_addr(skb->data)) {
++			struct sta_info *next_hop;
++			bool mpp_lookup = true;
++
+ 			mpath = mesh_path_lookup(sdata, skb->data);
+-			if (!mpath)
++			if (mpath) {
++				mpp_lookup = false;
++				next_hop = rcu_dereference(mpath->next_hop);
++				if (!next_hop ||
++				    !(mpath->flags & (MESH_PATH_ACTIVE |
++						      MESH_PATH_RESOLVING)))
++					mpp_lookup = true;
++			}
 +
 +
-+		spin_lock_bh(&sc->tx.txq[i].axq_lock);
-+		ath_txq_schedule(sc, &sc->tx.txq[i]);
-+		spin_unlock_bh(&sc->tx.txq[i].axq_lock);
- 	}
- 
- 	ath9k_ps_restore(sc);
-@@ -586,7 +576,7 @@ void ath_reset_work(struct work_struct *
- {
- 	struct ath_softc *sc = container_of(work, struct ath_softc, hw_reset_work);
- 
--	ath_reset(sc, true);
-+	ath_reset(sc);
- }
- 
- /**********************/
-@@ -804,7 +794,7 @@ static void ath9k_stop(struct ieee80211_
- 		ath9k_hw_cfg_gpio_input(ah, ah->led_pin);
- 	}
- 
--	ath_prepare_reset(sc, false, true);
-+	ath_prepare_reset(sc);
- 
- 	if (sc->rx.frag) {
- 		dev_kfree_skb_any(sc->rx.frag);
-@@ -1731,11 +1721,11 @@ static void ath9k_flush(struct ieee80211
- 	if (drop) {
- 		ath9k_ps_wakeup(sc);
- 		spin_lock_bh(&sc->sc_pcu_lock);
--		drain_txq = ath_drain_all_txq(sc, false);
-+		drain_txq = ath_drain_all_txq(sc);
- 		spin_unlock_bh(&sc->sc_pcu_lock);
- 
- 		if (!drain_txq)
--			ath_reset(sc, false);
-+			ath_reset(sc);
- 
- 		ath9k_ps_restore(sc);
- 		ieee80211_wake_queues(hw);
-@@ -1835,6 +1825,9 @@ static u32 fill_chainmask(u32 cap, u32 n
- 
- static bool validate_antenna_mask(struct ath_hw *ah, u32 val)
- {
-+	if (AR_SREV_9300_20_OR_LATER(ah))
-+		return true;
++			if (mpp_lookup)
+ 				mppath = mpp_path_lookup(sdata, skb->data);
 +
 +
- 	switch (val & 0x7) {
- 	case 0x1:
- 	case 0x3:
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -248,8 +248,6 @@ rx_init_fail:
- 
- static void ath_edma_start_recv(struct ath_softc *sc)
- {
--	spin_lock_bh(&sc->rx.rxbuflock);
--
- 	ath9k_hw_rxena(sc->sc_ah);
- 
- 	ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_HP,
-@@ -261,8 +259,6 @@ static void ath_edma_start_recv(struct a
- 	ath_opmode_init(sc);
- 
- 	ath9k_hw_startpcureceive(sc->sc_ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL));
--
--	spin_unlock_bh(&sc->rx.rxbuflock);
- }
- 
- static void ath_edma_stop_recv(struct ath_softc *sc)
-@@ -279,8 +275,6 @@ int ath_rx_init(struct ath_softc *sc, in
- 	int error = 0;
- 
- 	spin_lock_init(&sc->sc_pcu_lock);
--	spin_lock_init(&sc->rx.rxbuflock);
--	clear_bit(SC_OP_RXFLUSH, &sc->sc_flags);
++			if (mppath && mpath)
++				mesh_path_del(mpath->sdata, mpath->dst);
+ 		}
  
  
- 	common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 +
- 			     sc->sc_ah->caps.rx_status_len;
-@@ -438,7 +432,6 @@ int ath_startrecv(struct ath_softc *sc)
- 		return 0;
+ 		/*
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -554,16 +554,9 @@ static int nl80211_msg_put_channel(struc
+ 	if ((chan->flags & IEEE80211_CHAN_NO_IBSS) &&
+ 	    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IBSS))
+ 		goto nla_put_failure;
+-	if (chan->flags & IEEE80211_CHAN_RADAR) {
+-		u32 time = elapsed_jiffies_msecs(chan->dfs_state_entered);
+-		if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
+-			goto nla_put_failure;
+-		if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
+-				chan->dfs_state))
+-			goto nla_put_failure;
+-		if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, time))
+-			goto nla_put_failure;
+-	}
++	if ((chan->flags & IEEE80211_CHAN_RADAR) &&
++	    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
++		goto nla_put_failure;
+ 	if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
+ 	    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
+ 		goto nla_put_failure;
+@@ -900,9 +893,6 @@ static int nl80211_put_iface_combination
+ 		    nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
+ 				c->max_interfaces))
+ 			goto nla_put_failure;
+-		if (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
+-				c->radar_detect_widths))
+-			goto nla_put_failure;
+ 
+ 		nla_nest_end(msg, nl_combi);
  	}
  	}
- 
--	spin_lock_bh(&sc->rx.rxbuflock);
- 	if (list_empty(&sc->rx.rxbuf))
- 		goto start_recv;
- 
-@@ -459,26 +452,31 @@ start_recv:
- 	ath_opmode_init(sc);
- 	ath9k_hw_startpcureceive(ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL));
- 
--	spin_unlock_bh(&sc->rx.rxbuflock);
--
- 	return 0;
- }
- 
-+static void ath_flushrecv(struct ath_softc *sc)
-+{
-+	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
-+		ath_rx_tasklet(sc, 1, true);
-+	ath_rx_tasklet(sc, 1, false);
-+}
-+
- bool ath_stoprecv(struct ath_softc *sc)
- {
- 	struct ath_hw *ah = sc->sc_ah;
- 	bool stopped, reset = false;
- 
--	spin_lock_bh(&sc->rx.rxbuflock);
- 	ath9k_hw_abortpcurecv(ah);
- 	ath9k_hw_setrxfilter(ah, 0);
- 	stopped = ath9k_hw_stopdmarecv(ah, &reset);
- 
-+	ath_flushrecv(sc);
-+
- 	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
- 		ath_edma_stop_recv(sc);
- 	else
- 		sc->rx.rxlink = NULL;
--	spin_unlock_bh(&sc->rx.rxbuflock);
- 
- 	if (!(ah->ah_flags & AH_UNPLUGGED) &&
- 	    unlikely(!stopped)) {
-@@ -490,15 +488,6 @@ bool ath_stoprecv(struct ath_softc *sc)
- 	return stopped && !reset;
+@@ -914,48 +904,6 @@ nla_put_failure:
+ 	return -ENOBUFS;
  }
  }
  
  
--void ath_flushrecv(struct ath_softc *sc)
+-#ifdef CONFIG_PM
+-static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
+-					struct sk_buff *msg)
 -{
 -{
--	set_bit(SC_OP_RXFLUSH, &sc->sc_flags);
--	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
--		ath_rx_tasklet(sc, 1, true);
--	ath_rx_tasklet(sc, 1, false);
--	clear_bit(SC_OP_RXFLUSH, &sc->sc_flags);
--}
+-	const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan.tcp;
+-	struct nlattr *nl_tcp;
 -
 -
- static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
- {
- 	/* Check whether the Beacon frame has DTIM indicating buffered bc/mc */
-@@ -735,6 +724,7 @@ static struct ath_buf *ath_get_next_rx_b
- 			return NULL;
- 	}
- 
-+	list_del(&bf->list);
- 	if (!bf->bf_mpdu)
- 		return bf;
- 
-@@ -1050,16 +1040,12 @@ int ath_rx_tasklet(struct ath_softc *sc,
- 		dma_type = DMA_FROM_DEVICE;
- 
- 	qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP;
--	spin_lock_bh(&sc->rx.rxbuflock);
- 
- 	tsf = ath9k_hw_gettsf64(ah);
- 	tsf_lower = tsf & 0xffffffff;
- 
- 	do {
- 		bool decrypt_error = false;
--		/* If handling rx interrupt and flush is in progress => exit */
--		if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags) && (flush == 0))
--			break;
- 
- 		memset(&rs, 0, sizeof(rs));
- 		if (edma)
-@@ -1102,15 +1088,6 @@ int ath_rx_tasklet(struct ath_softc *sc,
- 
- 		ath_debug_stat_rx(sc, &rs);
- 
--		/*
--		 * If we're asked to flush receive queue, directly
--		 * chain it back at the queue without processing it.
--		 */
--		if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags)) {
--			RX_STAT_INC(rx_drop_rxflush);
--			goto requeue_drop_frag;
--		}
+-	if (!tcp)
+-		return 0;
 -
 -
- 		memset(rxs, 0, sizeof(struct ieee80211_rx_status));
- 
- 		rxs->mactime = (tsf & ~0xffffffffULL) | rs.rs_tstamp;
-@@ -1245,19 +1222,18 @@ requeue_drop_frag:
- 			sc->rx.frag = NULL;
- 		}
- requeue:
-+		list_add_tail(&bf->list, &sc->rx.rxbuf);
-+		if (flush)
-+			continue;
-+
- 		if (edma) {
--			list_add_tail(&bf->list, &sc->rx.rxbuf);
- 			ath_rx_edma_buf_link(sc, qtype);
- 		} else {
--			list_move_tail(&bf->list, &sc->rx.rxbuf);
- 			ath_rx_buf_link(sc, bf);
--			if (!flush)
--				ath9k_hw_rxena(ah);
-+			ath9k_hw_rxena(ah);
- 		}
- 	} while (1);
- 
--	spin_unlock_bh(&sc->rx.rxbuflock);
+-	nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
+-	if (!nl_tcp)
+-		return -ENOBUFS;
 -
 -
- 	if (!(ah->imask & ATH9K_INT_RXEOL)) {
- 		ah->imask |= (ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
- 		ath9k_hw_set_interrupts(ah);
---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-@@ -4586,14 +4586,14 @@ static int ar9003_hw_cal_pier_get(struct
- 	return 0;
- }
- 
--static int ar9003_hw_power_control_override(struct ath_hw *ah,
--					    int frequency,
--					    int *correction,
--					    int *voltage, int *temperature)
-+static void ar9003_hw_power_control_override(struct ath_hw *ah,
-+					     int frequency,
-+					     int *correction,
-+					     int *voltage, int *temperature)
- {
--	int tempSlope = 0;
-+	int temp_slope = 0, temp_slope1 = 0, temp_slope2 = 0;
- 	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
--	int f[8], t[8], i;
-+	int f[8], t[8], t1[3], t2[3], i;
- 
- 	REG_RMW(ah, AR_PHY_TPC_11_B0,
- 		(correction[0] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
-@@ -4624,38 +4624,108 @@ static int ar9003_hw_power_control_overr
- 	 * enable temperature compensation
- 	 * Need to use register names
- 	 */
--	if (frequency < 4000)
--		tempSlope = eep->modalHeader2G.tempSlope;
--	else if ((eep->baseEepHeader.miscConfiguration & 0x20) != 0) {
--		for (i = 0; i < 8; i++) {
--			t[i] = eep->base_ext1.tempslopextension[i];
--			f[i] = FBIN2FREQ(eep->calFreqPier5G[i], 0);
--		}
--		tempSlope = ar9003_hw_power_interpolate((s32) frequency,
--							f, t, 8);
--	} else if (eep->base_ext2.tempSlopeLow != 0) {
--		t[0] = eep->base_ext2.tempSlopeLow;
--		f[0] = 5180;
--		t[1] = eep->modalHeader5G.tempSlope;
--		f[1] = 5500;
--		t[2] = eep->base_ext2.tempSlopeHigh;
--		f[2] = 5785;
--		tempSlope = ar9003_hw_power_interpolate((s32) frequency,
--							f, t, 3);
--	} else
--		tempSlope = eep->modalHeader5G.tempSlope;
-+	if (frequency < 4000) {
-+		temp_slope = eep->modalHeader2G.tempSlope;
-+	} else {
-+		if (AR_SREV_9550(ah)) {
-+			t[0] = eep->base_ext1.tempslopextension[2];
-+			t1[0] = eep->base_ext1.tempslopextension[3];
-+			t2[0] = eep->base_ext1.tempslopextension[4];
-+			f[0] = 5180;
-+
-+			t[1] = eep->modalHeader5G.tempSlope;
-+			t1[1] = eep->base_ext1.tempslopextension[0];
-+			t2[1] = eep->base_ext1.tempslopextension[1];
-+			f[1] = 5500;
-+
-+			t[2] = eep->base_ext1.tempslopextension[5];
-+			t1[2] = eep->base_ext1.tempslopextension[6];
-+			t2[2] = eep->base_ext1.tempslopextension[7];
-+			f[2] = 5785;
-+
-+			temp_slope = ar9003_hw_power_interpolate(frequency,
-+								 f, t, 3);
-+			temp_slope1 = ar9003_hw_power_interpolate(frequency,
-+								   f, t1, 3);
-+			temp_slope2 = ar9003_hw_power_interpolate(frequency,
-+								   f, t2, 3);
-+
-+			goto tempslope;
-+		}
-+
-+		if ((eep->baseEepHeader.miscConfiguration & 0x20) != 0) {
-+			for (i = 0; i < 8; i++) {
-+				t[i] = eep->base_ext1.tempslopextension[i];
-+				f[i] = FBIN2FREQ(eep->calFreqPier5G[i], 0);
-+			}
-+			temp_slope = ar9003_hw_power_interpolate((s32) frequency,
-+								 f, t, 8);
-+		} else if (eep->base_ext2.tempSlopeLow != 0) {
-+			t[0] = eep->base_ext2.tempSlopeLow;
-+			f[0] = 5180;
-+			t[1] = eep->modalHeader5G.tempSlope;
-+			f[1] = 5500;
-+			t[2] = eep->base_ext2.tempSlopeHigh;
-+			f[2] = 5785;
-+			temp_slope = ar9003_hw_power_interpolate((s32) frequency,
-+								 f, t, 3);
-+		} else {
-+			temp_slope = eep->modalHeader5G.tempSlope;
-+		}
-+	}
- 
--	REG_RMW_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM, tempSlope);
-+tempslope:
-+	if (AR_SREV_9550(ah)) {
-+		/*
-+		 * AR955x has tempSlope register for each chain.
-+		 * Check whether temp_compensation feature is enabled or not.
-+		 */
-+		if (eep->baseEepHeader.featureEnable & 0x1) {
-+			if (frequency < 4000) {
-+				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+					      AR_PHY_TPC_19_ALPHA_THERM,
-+					      eep->base_ext2.tempSlopeLow);
-+				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-+					      AR_PHY_TPC_19_ALPHA_THERM,
-+					      temp_slope);
-+				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-+					      AR_PHY_TPC_19_ALPHA_THERM,
-+					      eep->base_ext2.tempSlopeHigh);
-+			} else {
-+				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+					      AR_PHY_TPC_19_ALPHA_THERM,
-+					      temp_slope);
-+				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-+					      AR_PHY_TPC_19_ALPHA_THERM,
-+					      temp_slope1);
-+				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-+					      AR_PHY_TPC_19_ALPHA_THERM,
-+					      temp_slope2);
-+			}
-+		} else {
-+			/*
-+			 * If temp compensation is not enabled,
-+			 * set all registers to 0.
-+			 */
-+			REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+				      AR_PHY_TPC_19_ALPHA_THERM, 0);
-+			REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-+				      AR_PHY_TPC_19_ALPHA_THERM, 0);
-+			REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-+				      AR_PHY_TPC_19_ALPHA_THERM, 0);
-+		}
-+	} else {
-+		REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+			      AR_PHY_TPC_19_ALPHA_THERM, temp_slope);
-+	}
- 
- 	if (AR_SREV_9462_20(ah))
- 		REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
--			      AR_PHY_TPC_19_B1_ALPHA_THERM, tempSlope);
-+			      AR_PHY_TPC_19_B1_ALPHA_THERM, temp_slope);
- 
- 
- 	REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE,
- 		      temperature[0]);
+-	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
+-			tcp->data_payload_max))
+-		return -ENOBUFS;
 -
 -
--	return 0;
- }
- 
- /* Apply the recorded correction values. */
---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -68,7 +68,7 @@ static const int m2ThreshExt_off = 127;
- static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)
- {
- 	u16 bMode, fracMode = 0, aModeRefSel = 0;
--	u32 freq, channelSel = 0, reg32 = 0;
-+	u32 freq, chan_frac, div, channelSel = 0, reg32 = 0;
- 	struct chan_centers centers;
- 	int loadSynthChannel;
- 
-@@ -77,9 +77,6 @@ static int ar9003_hw_set_channel(struct 
- 
- 	if (freq < 4800) {     /* 2 GHz, fractional mode */
- 		if (AR_SREV_9330(ah)) {
--			u32 chan_frac;
--			u32 div;
+-	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
+-			tcp->data_payload_max))
+-		return -ENOBUFS;
 -
 -
- 			if (ah->is_clk_25mhz)
- 				div = 75;
- 			else
-@@ -89,34 +86,40 @@ static int ar9003_hw_set_channel(struct 
- 			chan_frac = (((freq * 4) % div) * 0x20000) / div;
- 			channelSel = (channelSel << 17) | chan_frac;
- 		} else if (AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
--			u32 chan_frac;
+-	if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
+-		return -ENOBUFS;
 -
 -
- 			/*
--			 * freq_ref = 40 / (refdiva >> amoderefsel); where refdiva=1 and amoderefsel=0
-+			 * freq_ref = 40 / (refdiva >> amoderefsel);
-+			 * where refdiva=1 and amoderefsel=0
- 			 * ndiv = ((chan_mhz * 4) / 3) / freq_ref;
- 			 * chansel = int(ndiv), chanfrac = (ndiv - chansel) * 0x20000
- 			 */
- 			channelSel = (freq * 4) / 120;
- 			chan_frac = (((freq * 4) % 120) * 0x20000) / 120;
- 			channelSel = (channelSel << 17) | chan_frac;
--		} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {
-+		} else if (AR_SREV_9340(ah)) {
- 			if (ah->is_clk_25mhz) {
--				u32 chan_frac;
+-	if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
+-				sizeof(*tcp->tok), tcp->tok))
+-		return -ENOBUFS;
 -
 -
- 				channelSel = (freq * 2) / 75;
- 				chan_frac = (((freq * 2) % 75) * 0x20000) / 75;
- 				channelSel = (channelSel << 17) | chan_frac;
--			} else
-+			} else {
- 				channelSel = CHANSEL_2G(freq) >> 1;
--		} else
-+			}
-+		} else if (AR_SREV_9550(ah)) {
-+			if (ah->is_clk_25mhz)
-+				div = 75;
-+			else
-+				div = 120;
-+
-+			channelSel = (freq * 4) / div;
-+			chan_frac = (((freq * 4) % div) * 0x20000) / div;
-+			channelSel = (channelSel << 17) | chan_frac;
-+		} else {
- 			channelSel = CHANSEL_2G(freq);
-+		}
- 		/* Set to 2G mode */
- 		bMode = 1;
- 	} else {
- 		if ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) &&
- 		    ah->is_clk_25mhz) {
--			u32 chan_frac;
+-	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
+-			tcp->data_interval_max))
+-		return -ENOBUFS;
 -
 -
- 			channelSel = freq / 75;
- 			chan_frac = ((freq % 75) * 0x20000) / 75;
- 			channelSel = (channelSel << 17) | chan_frac;
-@@ -586,32 +589,19 @@ static void ar9003_hw_init_bb(struct ath
- 	ath9k_hw_synth_delay(ah, chan, synthDelay);
- }
- 
--static void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx)
-+void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx)
- {
--	switch (rx) {
--	case 0x5:
-+	if (ah->caps.tx_chainmask == 5 || ah->caps.rx_chainmask == 5)
- 		REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP,
- 			    AR_PHY_SWAP_ALT_CHAIN);
--	case 0x3:
--	case 0x1:
--	case 0x2:
--	case 0x7:
--		REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx);
--		REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx);
--		break;
--	default:
--		break;
--	}
-+
-+	REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx);
-+	REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx);
- 
- 	if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && (tx == 0x7))
--		REG_WRITE(ah, AR_SELFGEN_MASK, 0x3);
--	else
--		REG_WRITE(ah, AR_SELFGEN_MASK, tx);
-+		tx = 3;
- 
--	if (tx == 0x5) {
--		REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP,
--			    AR_PHY_SWAP_ALT_CHAIN);
--	}
-+	REG_WRITE(ah, AR_SELFGEN_MASK, tx);
- }
- 
- /*
---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
-@@ -1028,7 +1028,7 @@
- #define AR_PHY_TPC_5_B2          (AR_SM2_BASE + 0x208)
- #define AR_PHY_TPC_6_B2          (AR_SM2_BASE + 0x20c)
- #define AR_PHY_TPC_11_B2         (AR_SM2_BASE + 0x220)
--#define AR_PHY_PDADC_TAB_2       (AR_SM2_BASE + 0x240)
-+#define AR_PHY_TPC_19_B2         (AR_SM2_BASE + 0x240)
- #define AR_PHY_TX_IQCAL_STATUS_B2   (AR_SM2_BASE + 0x48c)
- #define AR_PHY_TX_IQCAL_CORR_COEFF_B2(_i)    (AR_SM2_BASE + 0x450 + ((_i) << 2))
- 
---- a/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h
-@@ -23,16 +23,16 @@
- static const u32 ar955x_1p0_radio_postamble[][5] = {
- 	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
- 	{0x00016098, 0xd2dd5554, 0xd2dd5554, 0xd28b3330, 0xd28b3330},
--	{0x0001609c, 0x0a566f3a, 0x0a566f3a, 0x06345f2a, 0x06345f2a},
--	{0x000160ac, 0xa4647c00, 0xa4647c00, 0xa4646800, 0xa4646800},
--	{0x000160b0, 0x01885f52, 0x01885f52, 0x04accf3a, 0x04accf3a},
--	{0x00016104, 0xb7a00001, 0xb7a00001, 0xb7a00001, 0xb7a00001},
-+	{0x0001609c, 0x0a566f3a, 0x0a566f3a, 0x0a566f3a, 0x0a566f3a},
-+	{0x000160ac, 0xa4647c00, 0xa4647c00, 0x24647c00, 0x24647c00},
-+	{0x000160b0, 0x01885f52, 0x01885f52, 0x01885f52, 0x01885f52},
-+	{0x00016104, 0xb7a00000, 0xb7a00000, 0xb7a00001, 0xb7a00001},
- 	{0x0001610c, 0xc0000000, 0xc0000000, 0xc0000000, 0xc0000000},
- 	{0x00016140, 0x10804008, 0x10804008, 0x10804008, 0x10804008},
--	{0x00016504, 0xb7a00001, 0xb7a00001, 0xb7a00001, 0xb7a00001},
-+	{0x00016504, 0xb7a00000, 0xb7a00000, 0xb7a00001, 0xb7a00001},
- 	{0x0001650c, 0xc0000000, 0xc0000000, 0xc0000000, 0xc0000000},
- 	{0x00016540, 0x10804008, 0x10804008, 0x10804008, 0x10804008},
--	{0x00016904, 0xb7a00001, 0xb7a00001, 0xb7a00001, 0xb7a00001},
-+	{0x00016904, 0xb7a00000, 0xb7a00000, 0xb7a00001, 0xb7a00001},
- 	{0x0001690c, 0xc0000000, 0xc0000000, 0xc0000000, 0xc0000000},
- 	{0x00016940, 0x10804008, 0x10804008, 0x10804008, 0x10804008},
- };
-@@ -69,15 +69,15 @@ static const u32 ar955x_1p0_baseband_pos
- 	{0x0000a204, 0x005c0ec0, 0x005c0ec4, 0x005c0ec4, 0x005c0ec0},
- 	{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
- 	{0x0000a22c, 0x07e26a2f, 0x07e26a2f, 0x01026a2f, 0x01026a2f},
--	{0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b},
-+	{0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b},
- 	{0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff},
- 	{0x0000a238, 0xffb01018, 0xffb01018, 0xffb01018, 0xffb01018},
- 	{0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
- 	{0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
- 	{0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002},
--	{0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e},
-+	{0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01010e0e, 0x01010e0e},
- 	{0x0000a260, 0x0a021501, 0x0a021501, 0x3a021501, 0x3a021501},
--	{0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
-+	{0x0000a264, 0x00000e0e, 0x00000e0e, 0x01000e0e, 0x01000e0e},
- 	{0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b},
- 	{0x0000a284, 0x00000000, 0x00000000, 0x00000010, 0x00000010},
- 	{0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110},
-@@ -125,7 +125,7 @@ static const u32 ar955x_1p0_radio_core[]
- 	{0x00016094, 0x00000000},
- 	{0x000160a0, 0x0a108ffe},
- 	{0x000160a4, 0x812fc370},
--	{0x000160a8, 0x423c8000},
-+	{0x000160a8, 0x423c8100},
- 	{0x000160b4, 0x92480080},
- 	{0x000160c0, 0x006db6d0},
- 	{0x000160c4, 0x6db6db60},
-@@ -134,7 +134,7 @@ static const u32 ar955x_1p0_radio_core[]
- 	{0x00016100, 0x11999601},
- 	{0x00016108, 0x00080010},
- 	{0x00016144, 0x02084080},
--	{0x00016148, 0x000080c0},
-+	{0x00016148, 0x00008040},
- 	{0x00016280, 0x01800804},
- 	{0x00016284, 0x00038dc5},
- 	{0x00016288, 0x00000000},
-@@ -178,7 +178,7 @@ static const u32 ar955x_1p0_radio_core[]
- 	{0x00016500, 0x11999601},
- 	{0x00016508, 0x00080010},
- 	{0x00016544, 0x02084080},
--	{0x00016548, 0x000080c0},
-+	{0x00016548, 0x00008040},
- 	{0x00016780, 0x00000000},
- 	{0x00016784, 0x00000000},
- 	{0x00016788, 0x00400705},
-@@ -218,7 +218,7 @@ static const u32 ar955x_1p0_radio_core[]
- 	{0x00016900, 0x11999601},
- 	{0x00016908, 0x00080010},
- 	{0x00016944, 0x02084080},
--	{0x00016948, 0x000080c0},
-+	{0x00016948, 0x00008040},
- 	{0x00016b80, 0x00000000},
- 	{0x00016b84, 0x00000000},
- 	{0x00016b88, 0x00400705},
-@@ -245,9 +245,9 @@ static const u32 ar955x_1p0_radio_core[]
- 
- static const u32 ar955x_1p0_modes_xpa_tx_gain_table[][9] = {
- 	/* Addr      5G_HT20_L   5G_HT40_L   5G_HT20_M   5G_HT40_M   5G_HT20_H   5G_HT40_H   2G_HT40     2G_HT20  */
--	{0x0000a2dc, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xfffd5aaa, 0xfffd5aaa},
--	{0x0000a2e0, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xfffe9ccc, 0xfffe9ccc},
--	{0x0000a2e4, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xffffe0f0, 0xffffe0f0},
-+	{0x0000a2dc, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xfffd5aaa, 0xfffd5aaa},
-+	{0x0000a2e0, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffe9ccc, 0xfffe9ccc},
-+	{0x0000a2e4, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffffe0f0, 0xffffe0f0},
- 	{0x0000a2e8, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xfffcff00, 0xfffcff00},
- 	{0x0000a410, 0x000050de, 0x000050de, 0x000050de, 0x000050de, 0x000050de, 0x000050de, 0x000050da, 0x000050da},
- 	{0x0000a500, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000},
-@@ -256,63 +256,63 @@ static const u32 ar955x_1p0_modes_xpa_tx
- 	{0x0000a50c, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c00000b, 0x0c000006, 0x0c000006},
- 	{0x0000a510, 0x1000000d, 0x1000000d, 0x1000000d, 0x1000000d, 0x1000000d, 0x1000000d, 0x0f00000a, 0x0f00000a},
- 	{0x0000a514, 0x14000011, 0x14000011, 0x14000011, 0x14000011, 0x14000011, 0x14000011, 0x1300000c, 0x1300000c},
--	{0x0000a518, 0x19004008, 0x19004008, 0x19004008, 0x19004008, 0x18004008, 0x18004008, 0x1700000e, 0x1700000e},
--	{0x0000a51c, 0x1d00400a, 0x1d00400a, 0x1d00400a, 0x1d00400a, 0x1c00400a, 0x1c00400a, 0x1b000064, 0x1b000064},
--	{0x0000a520, 0x230020a2, 0x230020a2, 0x210020a2, 0x210020a2, 0x200020a2, 0x200020a2, 0x1f000242, 0x1f000242},
--	{0x0000a524, 0x2500006e, 0x2500006e, 0x2500006e, 0x2500006e, 0x2400006e, 0x2400006e, 0x23000229, 0x23000229},
--	{0x0000a528, 0x29022221, 0x29022221, 0x28022221, 0x28022221, 0x27022221, 0x27022221, 0x270002a2, 0x270002a2},
--	{0x0000a52c, 0x2d00062a, 0x2d00062a, 0x2c00062a, 0x2c00062a, 0x2a00062a, 0x2a00062a, 0x2c001203, 0x2c001203},
--	{0x0000a530, 0x340220a5, 0x340220a5, 0x320220a5, 0x320220a5, 0x2f0220a5, 0x2f0220a5, 0x30001803, 0x30001803},
--	{0x0000a534, 0x380022c5, 0x380022c5, 0x350022c5, 0x350022c5, 0x320022c5, 0x320022c5, 0x33000881, 0x33000881},
--	{0x0000a538, 0x3b002486, 0x3b002486, 0x39002486, 0x39002486, 0x36002486, 0x36002486, 0x38001809, 0x38001809},
--	{0x0000a53c, 0x3f00248a, 0x3f00248a, 0x3d00248a, 0x3d00248a, 0x3a00248a, 0x3a00248a, 0x3a000814, 0x3a000814},
--	{0x0000a540, 0x4202242c, 0x4202242c, 0x4102242c, 0x4102242c, 0x3f02242c, 0x3f02242c, 0x3f001a0c, 0x3f001a0c},
--	{0x0000a544, 0x490044c6, 0x490044c6, 0x460044c6, 0x460044c6, 0x420044c6, 0x420044c6, 0x43001a0e, 0x43001a0e},
--	{0x0000a548, 0x4d024485, 0x4d024485, 0x4a024485, 0x4a024485, 0x46024485, 0x46024485, 0x46001812, 0x46001812},
--	{0x0000a54c, 0x51044483, 0x51044483, 0x4e044483, 0x4e044483, 0x4a044483, 0x4a044483, 0x49001884, 0x49001884},
--	{0x0000a550, 0x5404a40c, 0x5404a40c, 0x5204a40c, 0x5204a40c, 0x4d04a40c, 0x4d04a40c, 0x4d001e84, 0x4d001e84},
--	{0x0000a554, 0x57024632, 0x57024632, 0x55024632, 0x55024632, 0x52024632, 0x52024632, 0x50001e69, 0x50001e69},
--	{0x0000a558, 0x5c00a634, 0x5c00a634, 0x5900a634, 0x5900a634, 0x5600a634, 0x5600a634, 0x550006f4, 0x550006f4},
--	{0x0000a55c, 0x5f026832, 0x5f026832, 0x5d026832, 0x5d026832, 0x5a026832, 0x5a026832, 0x59000ad3, 0x59000ad3},
--	{0x0000a560, 0x6602b012, 0x6602b012, 0x6202b012, 0x6202b012, 0x5d02b012, 0x5d02b012, 0x5e000ad5, 0x5e000ad5},
--	{0x0000a564, 0x6e02d0e1, 0x6e02d0e1, 0x6802d0e1, 0x6802d0e1, 0x6002d0e1, 0x6002d0e1, 0x61001ced, 0x61001ced},
--	{0x0000a568, 0x7202b4c4, 0x7202b4c4, 0x6c02b4c4, 0x6c02b4c4, 0x6502b4c4, 0x6502b4c4, 0x660018d4, 0x660018d4},
--	{0x0000a56c, 0x75007894, 0x75007894, 0x70007894, 0x70007894, 0x6b007894, 0x6b007894, 0x660018d4, 0x660018d4},
--	{0x0000a570, 0x7b025c74, 0x7b025c74, 0x75025c74, 0x75025c74, 0x70025c74, 0x70025c74, 0x660018d4, 0x660018d4},
--	{0x0000a574, 0x8300bcb5, 0x8300bcb5, 0x7a00bcb5, 0x7a00bcb5, 0x7600bcb5, 0x7600bcb5, 0x660018d4, 0x660018d4},
--	{0x0000a578, 0x8a04dc74, 0x8a04dc74, 0x7f04dc74, 0x7f04dc74, 0x7c04dc74, 0x7c04dc74, 0x660018d4, 0x660018d4},
--	{0x0000a57c, 0x8a04dc74, 0x8a04dc74, 0x7f04dc74, 0x7f04dc74, 0x7c04dc74, 0x7c04dc74, 0x660018d4, 0x660018d4},
-+	{0x0000a518, 0x1700002b, 0x1700002b, 0x1700002b, 0x1700002b, 0x1600002b, 0x1600002b, 0x1700000e, 0x1700000e},
-+	{0x0000a51c, 0x1b00002d, 0x1b00002d, 0x1b00002d, 0x1b00002d, 0x1a00002d, 0x1a00002d, 0x1b000064, 0x1b000064},
-+	{0x0000a520, 0x20000031, 0x20000031, 0x1f000031, 0x1f000031, 0x1e000031, 0x1e000031, 0x1f000242, 0x1f000242},
-+	{0x0000a524, 0x24000051, 0x24000051, 0x23000051, 0x23000051, 0x23000051, 0x23000051, 0x23000229, 0x23000229},
-+	{0x0000a528, 0x27000071, 0x27000071, 0x27000071, 0x27000071, 0x26000071, 0x26000071, 0x270002a2, 0x270002a2},
-+	{0x0000a52c, 0x2b000092, 0x2b000092, 0x2b000092, 0x2b000092, 0x2b000092, 0x2b000092, 0x2c001203, 0x2c001203},
-+	{0x0000a530, 0x3000028c, 0x3000028c, 0x2f00028c, 0x2f00028c, 0x2e00028c, 0x2e00028c, 0x30001803, 0x30001803},
-+	{0x0000a534, 0x34000290, 0x34000290, 0x33000290, 0x33000290, 0x32000290, 0x32000290, 0x33000881, 0x33000881},
-+	{0x0000a538, 0x37000292, 0x37000292, 0x36000292, 0x36000292, 0x35000292, 0x35000292, 0x38001809, 0x38001809},
-+	{0x0000a53c, 0x3b02028d, 0x3b02028d, 0x3a02028d, 0x3a02028d, 0x3902028d, 0x3902028d, 0x3a000814, 0x3a000814},
-+	{0x0000a540, 0x3f020291, 0x3f020291, 0x3e020291, 0x3e020291, 0x3d020291, 0x3d020291, 0x3f001a0c, 0x3f001a0c},
-+	{0x0000a544, 0x44020490, 0x44020490, 0x43020490, 0x43020490, 0x42020490, 0x42020490, 0x43001a0e, 0x43001a0e},
-+	{0x0000a548, 0x48020492, 0x48020492, 0x47020492, 0x47020492, 0x46020492, 0x46020492, 0x46001812, 0x46001812},
-+	{0x0000a54c, 0x4c020692, 0x4c020692, 0x4b020692, 0x4b020692, 0x4a020692, 0x4a020692, 0x49001884, 0x49001884},
-+	{0x0000a550, 0x50020892, 0x50020892, 0x4f020892, 0x4f020892, 0x4e020892, 0x4e020892, 0x4d001e84, 0x4d001e84},
-+	{0x0000a554, 0x53040891, 0x53040891, 0x53040891, 0x53040891, 0x52040891, 0x52040891, 0x50001e69, 0x50001e69},
-+	{0x0000a558, 0x58040893, 0x58040893, 0x57040893, 0x57040893, 0x56040893, 0x56040893, 0x550006f4, 0x550006f4},
-+	{0x0000a55c, 0x5c0408b4, 0x5c0408b4, 0x5a0408b4, 0x5a0408b4, 0x5a0408b4, 0x5a0408b4, 0x59000ad3, 0x59000ad3},
-+	{0x0000a560, 0x610408b6, 0x610408b6, 0x5e0408b6, 0x5e0408b6, 0x5e0408b6, 0x5e0408b6, 0x5e000ad5, 0x5e000ad5},
-+	{0x0000a564, 0x670408f6, 0x670408f6, 0x620408f6, 0x620408f6, 0x620408f6, 0x620408f6, 0x61001ced, 0x61001ced},
-+	{0x0000a568, 0x6a040cf6, 0x6a040cf6, 0x66040cf6, 0x66040cf6, 0x66040cf6, 0x66040cf6, 0x660018d4, 0x660018d4},
-+	{0x0000a56c, 0x6d040d76, 0x6d040d76, 0x6a040d76, 0x6a040d76, 0x6a040d76, 0x6a040d76, 0x660018d4, 0x660018d4},
-+	{0x0000a570, 0x70060db6, 0x70060db6, 0x6e060db6, 0x6e060db6, 0x6e060db6, 0x6e060db6, 0x660018d4, 0x660018d4},
-+	{0x0000a574, 0x730a0df6, 0x730a0df6, 0x720a0df6, 0x720a0df6, 0x720a0df6, 0x720a0df6, 0x660018d4, 0x660018d4},
-+	{0x0000a578, 0x770a13f6, 0x770a13f6, 0x760a13f6, 0x760a13f6, 0x760a13f6, 0x760a13f6, 0x660018d4, 0x660018d4},
-+	{0x0000a57c, 0x770a13f6, 0x770a13f6, 0x760a13f6, 0x760a13f6, 0x760a13f6, 0x760a13f6, 0x660018d4, 0x660018d4},
- 	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
- 	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
- 	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x03804000, 0x03804000},
--	{0x0000a610, 0x04c08c01, 0x04c08c01, 0x04808b01, 0x04808b01, 0x04808a01, 0x04808a01, 0x0300ca02, 0x0300ca02},
--	{0x0000a614, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00000e04, 0x00000e04},
--	{0x0000a618, 0x04010c01, 0x04010c01, 0x03c10b01, 0x03c10b01, 0x03810a01, 0x03810a01, 0x03014000, 0x03014000},
--	{0x0000a61c, 0x03814e05, 0x03814e05, 0x03414d05, 0x03414d05, 0x03414d05, 0x03414d05, 0x00000000, 0x00000000},
--	{0x0000a620, 0x04010303, 0x04010303, 0x03c10303, 0x03c10303, 0x03810303, 0x03810303, 0x00000000, 0x00000000},
--	{0x0000a624, 0x03814e05, 0x03814e05, 0x03414d05, 0x03414d05, 0x03414d05, 0x03414d05, 0x03014000, 0x03014000},
--	{0x0000a628, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x00c0c000, 0x03804c05, 0x03804c05},
--	{0x0000a62c, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x00c0c303, 0x0701de06, 0x0701de06},
--	{0x0000a630, 0x03418000, 0x03418000, 0x03018000, 0x03018000, 0x02c18000, 0x02c18000, 0x07819c07, 0x07819c07},
--	{0x0000a634, 0x03815004, 0x03815004, 0x03414f04, 0x03414f04, 0x03414e04, 0x03414e04, 0x0701dc07, 0x0701dc07},
--	{0x0000a638, 0x03005302, 0x03005302, 0x02c05202, 0x02c05202, 0x02805202, 0x02805202, 0x0701dc07, 0x0701dc07},
--	{0x0000a63c, 0x04c09302, 0x04c09302, 0x04809202, 0x04809202, 0x04809202, 0x04809202, 0x0701dc07, 0x0701dc07},
--	{0x0000b2dc, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xfffd5aaa, 0xfffd5aaa},
--	{0x0000b2e0, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xfffe9ccc, 0xfffe9ccc},
--	{0x0000b2e4, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xffffe0f0, 0xffffe0f0},
-+	{0x0000a60c, 0x02c04b01, 0x02c04b01, 0x02c04b01, 0x02c04b01, 0x02c04b01, 0x02c04b01, 0x03804000, 0x03804000},
-+	{0x0000a610, 0x04008b01, 0x04008b01, 0x04008b01, 0x04008b01, 0x03c08b01, 0x03c08b01, 0x0300ca02, 0x0300ca02},
-+	{0x0000a614, 0x05811403, 0x05811403, 0x05411303, 0x05411303, 0x05411303, 0x05411303, 0x00000e04, 0x00000e04},
-+	{0x0000a618, 0x05811604, 0x05811604, 0x05411504, 0x05411504, 0x05411504, 0x05411504, 0x03014000, 0x03014000},
-+	{0x0000a61c, 0x05811604, 0x05811604, 0x05411504, 0x05411504, 0x05411504, 0x05411504, 0x00000000, 0x00000000},
-+	{0x0000a620, 0x05811604, 0x05811604, 0x05411504, 0x05411504, 0x05411504, 0x05411504, 0x00000000, 0x00000000},
-+	{0x0000a624, 0x05811604, 0x05811604, 0x05411504, 0x05411504, 0x05411504, 0x05411504, 0x03014000, 0x03014000},
-+	{0x0000a628, 0x05811604, 0x05811604, 0x05411504, 0x05411504, 0x05411504, 0x05411504, 0x03804c05, 0x03804c05},
-+	{0x0000a62c, 0x06815604, 0x06815604, 0x06415504, 0x06415504, 0x06015504, 0x06015504, 0x0701de06, 0x0701de06},
-+	{0x0000a630, 0x07819a05, 0x07819a05, 0x07419905, 0x07419905, 0x07019805, 0x07019805, 0x07819c07, 0x07819c07},
-+	{0x0000a634, 0x07819e06, 0x07819e06, 0x07419d06, 0x07419d06, 0x07019c06, 0x07019c06, 0x0701dc07, 0x0701dc07},
-+	{0x0000a638, 0x07819e06, 0x07819e06, 0x07419d06, 0x07419d06, 0x07019c06, 0x07019c06, 0x0701dc07, 0x0701dc07},
-+	{0x0000a63c, 0x07819e06, 0x07819e06, 0x07419d06, 0x07419d06, 0x07019c06, 0x07019c06, 0x0701dc07, 0x0701dc07},
-+	{0x0000b2dc, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xfffd5aaa, 0xfffd5aaa},
-+	{0x0000b2e0, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffe9ccc, 0xfffe9ccc},
-+	{0x0000b2e4, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffffe0f0, 0xffffe0f0},
- 	{0x0000b2e8, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xfffcff00, 0xfffcff00},
--	{0x0000c2dc, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xffffaaaa, 0xfffd5aaa, 0xfffd5aaa},
--	{0x0000c2e0, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xffffcccc, 0xfffe9ccc, 0xfffe9ccc},
--	{0x0000c2e4, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xfffff0f0, 0xffffe0f0, 0xffffe0f0},
-+	{0x0000c2dc, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xffff6aaa, 0xfffd5aaa, 0xfffd5aaa},
-+	{0x0000c2e0, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffdcccc, 0xfffe9ccc, 0xfffe9ccc},
-+	{0x0000c2e4, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffe3b0f0, 0xffffe0f0, 0xffffe0f0},
- 	{0x0000c2e8, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xffffff00, 0xfffcff00, 0xfffcff00},
- 	{0x00016044, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x010002d4, 0x010002d4},
--	{0x00016048, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x66482401, 0x66482401},
-+	{0x00016048, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401},
- 	{0x00016280, 0x01801e84, 0x01801e84, 0x01801e84, 0x01801e84, 0x01801e84, 0x01801e84, 0x01808e84, 0x01808e84},
- 	{0x00016444, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x010002d4, 0x010002d4},
--	{0x00016448, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x66482401, 0x66482401},
-+	{0x00016448, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401},
- 	{0x00016844, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x056db2d4, 0x010002d4, 0x010002d4},
--	{0x00016848, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x62482401, 0x66482401, 0x66482401},
-+	{0x00016848, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401},
- };
- 
- static const u32 ar955x_1p0_mac_core[][2] = {
-@@ -846,7 +846,7 @@ static const u32 ar955x_1p0_baseband_cor
- 	{0x0000a44c, 0x00000001},
- 	{0x0000a450, 0x00010000},
- 	{0x0000a458, 0x00000000},
--	{0x0000a644, 0x3fad9d74},
-+	{0x0000a644, 0xbfad9d74},
- 	{0x0000a648, 0x0048060a},
- 	{0x0000a64c, 0x00003c37},
- 	{0x0000a670, 0x03020100},
-@@ -1277,7 +1277,7 @@ static const u32 ar955x_1p0_modes_fast_c
- 	{0x0000801c, 0x148ec02b, 0x148ec057},
- 	{0x00008318, 0x000044c0, 0x00008980},
- 	{0x00009e00, 0x0372131c, 0x0372131c},
--	{0x0000a230, 0x0000000b, 0x00000016},
-+	{0x0000a230, 0x0000400b, 0x00004016},
- 	{0x0000a254, 0x00000898, 0x00001130},
- };
- 
---- a/drivers/net/wireless/ath/ath9k/htc_hst.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_hst.c
-@@ -347,6 +347,8 @@ void ath9k_htc_txcompletion_cb(struct ht
- 			endpoint->ep_callbacks.tx(endpoint->ep_callbacks.priv,
- 						  skb, htc_hdr->endpoint_id,
- 						  txok);
-+		} else {
-+			kfree_skb(skb);
- 		}
- 	}
- 
---- a/net/wireless/reg.c
-+++ b/net/wireless/reg.c
-@@ -142,8 +142,8 @@ static void rcu_free_regdom(const struct
- 
- static struct regulatory_request *get_last_request(void)
- {
--	return rcu_dereference_protected(last_request,
--					 lockdep_is_held(&reg_mutex));
-+	return rcu_dereference_check(last_request,
-+				     lockdep_is_held(&reg_mutex));
- }
- 
- /* Used to queue up regulatory hints */
-@@ -1125,7 +1125,9 @@ static bool is_ht40_allowed(struct ieee8
- 	if (chan->flags & IEEE80211_CHAN_DISABLED)
- 		return false;
- 	/* This would happen when regulatory rules disallow HT40 completely */
--	return !(chan->flags & IEEE80211_CHAN_NO_HT40);
-+	if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
-+		return false;
-+	return true;
- }
- 
- static void reg_process_ht_flags_channel(struct wiphy *wiphy,
-@@ -1850,7 +1852,7 @@ static void restore_regulatory_settings(
- 	mutex_lock(&cfg80211_mutex);
- 	mutex_lock(&reg_mutex);
- 
--	reset_regdomains(true, cfg80211_world_regdom);
-+	reset_regdomains(true, &world_regdom);
- 	restore_alpha2(alpha2, reset_user);
- 
- 	/*
-@@ -2251,14 +2253,21 @@ int set_regdom(const struct ieee80211_re
- 
- int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env)
- {
--	struct regulatory_request *lr = get_last_request();
-+	struct regulatory_request *lr;
-+	u8 alpha2[2];
-+	bool add = false;
- 
-+	rcu_read_lock();
-+	lr = get_last_request();
- 	if (lr && !lr->processed) {
--		if (add_uevent_var(env, "COUNTRY=%c%c",
--				   lr->alpha2[0], lr->alpha2[1]))
--			return -ENOMEM;
-+		memcpy(alpha2, lr->alpha2, 2);
-+		add = true;
- 	}
-+	rcu_read_unlock();
- 
-+	if (add)
-+		return add_uevent_var(env, "COUNTRY=%c%c",
-+				      alpha2[0], alpha2[1]);
- 	return 0;
- }
- 
---- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
-@@ -967,7 +967,7 @@ static bool ar9003_hw_init_cal(struct at
- 	struct ath9k_hw_cal_data *caldata = ah->caldata;
- 	bool txiqcal_done = false, txclcal_done = false;
- 	bool is_reusable = true, status = true;
--	bool run_rtt_cal = false, run_agc_cal;
-+	bool run_rtt_cal = false, run_agc_cal, sep_iq_cal = false;
- 	bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT);
- 	u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL |
- 					  AR_PHY_AGC_CONTROL_FLTR_CAL   |
-@@ -977,6 +977,8 @@ static bool ar9003_hw_init_cal(struct at
- 					  AR_PHY_CL_TAB_1,
- 					  AR_PHY_CL_TAB_2 };
- 
-+	ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
-+
- 	if (rtt) {
- 		if (!ar9003_hw_rtt_restore(ah, chan))
- 			run_rtt_cal = true;
-@@ -1013,7 +1015,8 @@ static bool ar9003_hw_init_cal(struct at
- 		}
- 	}
- 
--	if (!(ah->enabled_cals & TX_IQ_CAL))
-+	if ((IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan)) ||
-+	    !(ah->enabled_cals & TX_IQ_CAL))
- 		goto skip_tx_iqcal;
- 
- 	/* Do Tx IQ Calibration */
-@@ -1033,21 +1036,22 @@ static bool ar9003_hw_init_cal(struct at
- 			REG_CLR_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0,
- 				    AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL);
- 		txiqcal_done = run_agc_cal = true;
--		goto skip_tx_iqcal;
--	} else if (caldata && !caldata->done_txiqcal_once)
-+	} else if (caldata && !caldata->done_txiqcal_once) {
- 		run_agc_cal = true;
-+		sep_iq_cal = true;
-+	}
- 
-+skip_tx_iqcal:
- 	if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal)
- 		ar9003_mci_init_cal_req(ah, &is_reusable);
- 
--	if (!(IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan))) {
-+	if (sep_iq_cal) {
- 		txiqcal_done = ar9003_hw_tx_iq_cal_run(ah);
- 		REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
- 		udelay(5);
- 		REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
- 	}
- 
--skip_tx_iqcal:
- 	if (run_agc_cal || !(ah->ah_flags & AH_FASTCC)) {
- 		/* Calibrate the AGC */
- 		REG_WRITE(ah, AR_PHY_AGC_CONTROL,
---- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-@@ -744,6 +744,186 @@ static const u32 ar9300Modes_high_ob_db_
- 	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
- };
- 
-+static const u32 ar9300Modes_mixed_ob_db_tx_gain_table_2p2[][5] = {
-+	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+	{0x0000a2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352},
-+	{0x0000a2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584},
-+	{0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800},
-+	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-+	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-+	{0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
-+	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
-+	{0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
-+	{0x0000a514, 0x1c000223, 0x1c000223, 0x11000400, 0x11000400},
-+	{0x0000a518, 0x21002220, 0x21002220, 0x15000402, 0x15000402},
-+	{0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404},
-+	{0x0000a520, 0x2b022220, 0x2b022220, 0x1b000603, 0x1b000603},
-+	{0x0000a524, 0x2f022222, 0x2f022222, 0x1f000a02, 0x1f000a02},
-+	{0x0000a528, 0x34022225, 0x34022225, 0x23000a04, 0x23000a04},
-+	{0x0000a52c, 0x3a02222a, 0x3a02222a, 0x26000a20, 0x26000a20},
-+	{0x0000a530, 0x3e02222c, 0x3e02222c, 0x2a000e20, 0x2a000e20},
-+	{0x0000a534, 0x4202242a, 0x4202242a, 0x2e000e22, 0x2e000e22},
-+	{0x0000a538, 0x4702244a, 0x4702244a, 0x31000e24, 0x31000e24},
-+	{0x0000a53c, 0x4b02244c, 0x4b02244c, 0x34001640, 0x34001640},
-+	{0x0000a540, 0x4e02246c, 0x4e02246c, 0x38001660, 0x38001660},
-+	{0x0000a544, 0x52022470, 0x52022470, 0x3b001861, 0x3b001861},
-+	{0x0000a548, 0x55022490, 0x55022490, 0x3e001a81, 0x3e001a81},
-+	{0x0000a54c, 0x59022492, 0x59022492, 0x42001a83, 0x42001a83},
-+	{0x0000a550, 0x5d022692, 0x5d022692, 0x44001c84, 0x44001c84},
-+	{0x0000a554, 0x61022892, 0x61022892, 0x48001ce3, 0x48001ce3},
-+	{0x0000a558, 0x65024890, 0x65024890, 0x4c001ce5, 0x4c001ce5},
-+	{0x0000a55c, 0x69024892, 0x69024892, 0x50001ce9, 0x50001ce9},
-+	{0x0000a560, 0x6e024c92, 0x6e024c92, 0x54001ceb, 0x54001ceb},
-+	{0x0000a564, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a568, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a56c, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a570, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a574, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a578, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a57c, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec},
-+	{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
-+	{0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
-+	{0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
-+	{0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200},
-+	{0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202},
-+	{0x0000a594, 0x1c800223, 0x1c800223, 0x11800400, 0x11800400},
-+	{0x0000a598, 0x21802220, 0x21802220, 0x15800402, 0x15800402},
-+	{0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404},
-+	{0x0000a5a0, 0x2b822220, 0x2b822220, 0x1b800603, 0x1b800603},
-+	{0x0000a5a4, 0x2f822222, 0x2f822222, 0x1f800a02, 0x1f800a02},
-+	{0x0000a5a8, 0x34822225, 0x34822225, 0x23800a04, 0x23800a04},
-+	{0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x26800a20, 0x26800a20},
-+	{0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2a800e20, 0x2a800e20},
-+	{0x0000a5b4, 0x4282242a, 0x4282242a, 0x2e800e22, 0x2e800e22},
-+	{0x0000a5b8, 0x4782244a, 0x4782244a, 0x31800e24, 0x31800e24},
-+	{0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x34801640, 0x34801640},
-+	{0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x38801660, 0x38801660},
-+	{0x0000a5c4, 0x52822470, 0x52822470, 0x3b801861, 0x3b801861},
-+	{0x0000a5c8, 0x55822490, 0x55822490, 0x3e801a81, 0x3e801a81},
-+	{0x0000a5cc, 0x59822492, 0x59822492, 0x42801a83, 0x42801a83},
-+	{0x0000a5d0, 0x5d822692, 0x5d822692, 0x44801c84, 0x44801c84},
-+	{0x0000a5d4, 0x61822892, 0x61822892, 0x48801ce3, 0x48801ce3},
-+	{0x0000a5d8, 0x65824890, 0x65824890, 0x4c801ce5, 0x4c801ce5},
-+	{0x0000a5dc, 0x69824892, 0x69824892, 0x50801ce9, 0x50801ce9},
-+	{0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x54801ceb, 0x54801ceb},
-+	{0x0000a5e4, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a5e8, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a5ec, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a5f0, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a5f4, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a5f8, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a5fc, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec},
-+	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000},
-+	{0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501},
-+	{0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501},
-+	{0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03},
-+	{0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04},
-+	{0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04},
-+	{0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
-+	{0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
-+	{0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
-+	{0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
-+	{0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005},
-+	{0x0000b2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352},
-+	{0x0000b2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584},
-+	{0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800},
-+	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x0000c2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352},
-+	{0x0000c2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584},
-+	{0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800},
-+	{0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x00016044, 0x012492d4, 0x012492d4, 0x056db2e4, 0x056db2e4},
-+	{0x00016048, 0x66480001, 0x66480001, 0x8e480001, 0x8e480001},
-+	{0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+	{0x00016444, 0x012492d4, 0x012492d4, 0x056db2e4, 0x056db2e4},
-+	{0x00016448, 0x66480001, 0x66480001, 0x8e480001, 0x8e480001},
-+	{0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+	{0x00016844, 0x012492d4, 0x012492d4, 0x056db2e4, 0x056db2e4},
-+	{0x00016848, 0x66480001, 0x66480001, 0x8e480001, 0x8e480001},
-+	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+};
-+
-+static const u32 ar9300Modes_type5_tx_gain_table_2p2[][5] = {
-+	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+	{0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
-+	{0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
-+	{0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
-+	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-+	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-+	{0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
-+	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
-+	{0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202},
-+	{0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400},
-+	{0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402},
-+	{0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404},
-+	{0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603},
-+	{0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02},
-+	{0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04},
-+	{0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20},
-+	{0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20},
-+	{0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22},
-+	{0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24},
-+	{0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640},
-+	{0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660},
-+	{0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861},
-+	{0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81},
-+	{0x0000a54c, 0x5e08442e, 0x5e08442e, 0x47001a83, 0x47001a83},
-+	{0x0000a550, 0x620a4431, 0x620a4431, 0x4a001c84, 0x4a001c84},
-+	{0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3},
-+	{0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5},
-+	{0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9},
-+	{0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb},
-+	{0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
-+	{0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
-+	{0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
-+	{0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000},
-+	{0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501},
-+	{0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501},
-+	{0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03},
-+	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
-+	{0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04},
-+	{0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
-+	{0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
-+	{0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
-+	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
-+	{0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
-+	{0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
-+	{0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
-+	{0x00016048, 0x65240001, 0x65240001, 0x66480001, 0x66480001},
-+	{0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+	{0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
-+	{0x00016448, 0x65240001, 0x65240001, 0x66480001, 0x66480001},
-+	{0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+	{0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
-+	{0x00016848, 0x65240001, 0x65240001, 0x66480001, 0x66480001},
-+	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+};
-+
- static const u32 ar9300Common_rx_gain_table_2p2[][2] = {
- 	/* Addr      allmodes  */
- 	{0x0000a000, 0x00010000},
---- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
-@@ -507,28 +507,59 @@ static void ar9003_tx_gain_table_mode4(s
- 	else if (AR_SREV_9580(ah))
- 		INIT_INI_ARRAY(&ah->iniModesTxGain,
- 			ar9580_1p0_mixed_ob_db_tx_gain_table);
-+	else
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9300Modes_mixed_ob_db_tx_gain_table_2p2);
-+}
-+
-+static void ar9003_tx_gain_table_mode5(struct ath_hw *ah)
-+{
-+	if (AR_SREV_9485_11(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9485Modes_green_ob_db_tx_gain_1_1);
-+	else if (AR_SREV_9340(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9340Modes_ub124_tx_gain_table_1p0);
-+	else if (AR_SREV_9580(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9580_1p0_type5_tx_gain_table);
-+	else if (AR_SREV_9300_22(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9300Modes_type5_tx_gain_table_2p2);
-+}
-+
-+static void ar9003_tx_gain_table_mode6(struct ath_hw *ah)
-+{
-+	if (AR_SREV_9340(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0);
-+	else if (AR_SREV_9485_11(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9485Modes_green_spur_ob_db_tx_gain_1_1);
-+	else if (AR_SREV_9580(ah))
-+		INIT_INI_ARRAY(&ah->iniModesTxGain,
-+			ar9580_1p0_type6_tx_gain_table);
- }
- 
-+typedef void (*ath_txgain_tab)(struct ath_hw *ah);
-+
- static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
- {
--	switch (ar9003_hw_get_tx_gain_idx(ah)) {
--	case 0:
--	default:
--		ar9003_tx_gain_table_mode0(ah);
--		break;
--	case 1:
--		ar9003_tx_gain_table_mode1(ah);
--		break;
--	case 2:
--		ar9003_tx_gain_table_mode2(ah);
--		break;
--	case 3:
--		ar9003_tx_gain_table_mode3(ah);
--		break;
--	case 4:
--		ar9003_tx_gain_table_mode4(ah);
--		break;
--	}
-+	static const ath_txgain_tab modes[] = {
-+		ar9003_tx_gain_table_mode0,
-+		ar9003_tx_gain_table_mode1,
-+		ar9003_tx_gain_table_mode2,
-+		ar9003_tx_gain_table_mode3,
-+		ar9003_tx_gain_table_mode4,
-+		ar9003_tx_gain_table_mode5,
-+		ar9003_tx_gain_table_mode6,
-+	};
-+	int idx = ar9003_hw_get_tx_gain_idx(ah);
-+
-+	if (idx >= ARRAY_SIZE(modes))
-+		idx = 0;
-+
-+	modes[idx](ah);
- }
- 
- static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
-@@ -673,7 +704,7 @@ void ar9003_hw_attach_ops(struct ath_hw 
- 	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
- 	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
- 
--	priv_ops->init_mode_regs = ar9003_hw_init_mode_regs;
-+	ar9003_hw_init_mode_regs(ah);
- 	priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
- 
- 	ops->config_pci_powersave = ar9003_hw_configpcipowersave;
---- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
-@@ -1172,6 +1172,106 @@ static const u32 ar9340Modes_mixed_ob_db
- 	{0x00016448, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266},
- };
- 
-+static const u32 ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0[][5] = {
-+	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+	{0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03eaac5a, 0x03eaac5a},
-+	{0x0000a2e0, 0x0000f800, 0x0000f800, 0x03f330ac, 0x03f330ac},
-+	{0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03fc3f00, 0x03fc3f00},
-+	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ffc000, 0x03ffc000},
-+	{0x0000a394, 0x00000444, 0x00000444, 0x00000404, 0x00000404},
-+	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-+	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a504, 0x06000003, 0x06000003, 0x02000001, 0x02000001},
-+	{0x0000a508, 0x0a000020, 0x0a000020, 0x05000003, 0x05000003},
-+	{0x0000a50c, 0x10000023, 0x10000023, 0x0a000005, 0x0a000005},
-+	{0x0000a510, 0x16000220, 0x16000220, 0x0e000201, 0x0e000201},
-+	{0x0000a514, 0x1c000223, 0x1c000223, 0x11000203, 0x11000203},
-+	{0x0000a518, 0x21002220, 0x21002220, 0x14000401, 0x14000401},
-+	{0x0000a51c, 0x27002223, 0x27002223, 0x18000403, 0x18000403},
-+	{0x0000a520, 0x2b022220, 0x2b022220, 0x1b000602, 0x1b000602},
-+	{0x0000a524, 0x2f022222, 0x2f022222, 0x1f000802, 0x1f000802},
-+	{0x0000a528, 0x34022225, 0x34022225, 0x21000620, 0x21000620},
-+	{0x0000a52c, 0x3a02222a, 0x3a02222a, 0x25000820, 0x25000820},
-+	{0x0000a530, 0x3e02222c, 0x3e02222c, 0x29000822, 0x29000822},
-+	{0x0000a534, 0x4202242a, 0x4202242a, 0x2d000824, 0x2d000824},
-+	{0x0000a538, 0x4702244a, 0x4702244a, 0x30000828, 0x30000828},
-+	{0x0000a53c, 0x4b02244c, 0x4b02244c, 0x3400082a, 0x3400082a},
-+	{0x0000a540, 0x4e02246c, 0x4e02246c, 0x38000849, 0x38000849},
-+	{0x0000a544, 0x5302266c, 0x5302266c, 0x3b000a2c, 0x3b000a2c},
-+	{0x0000a548, 0x5702286c, 0x5702286c, 0x3e000e2b, 0x3e000e2b},
-+	{0x0000a54c, 0x5c02486b, 0x5c02486b, 0x42000e2d, 0x42000e2d},
-+	{0x0000a550, 0x61024a6c, 0x61024a6c, 0x4500124a, 0x4500124a},
-+	{0x0000a554, 0x66026a6c, 0x66026a6c, 0x4900124c, 0x4900124c},
-+	{0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x4c00126c, 0x4c00126c},
-+	{0x0000a55c, 0x7002708c, 0x7002708c, 0x4f00128c, 0x4f00128c},
-+	{0x0000a560, 0x7302b08a, 0x7302b08a, 0x52001290, 0x52001290},
-+	{0x0000a564, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a568, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a56c, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a570, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a574, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a578, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a57c, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292},
-+	{0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
-+	{0x0000a584, 0x06800003, 0x06800003, 0x02800001, 0x02800001},
-+	{0x0000a588, 0x0a800020, 0x0a800020, 0x05800003, 0x05800003},
-+	{0x0000a58c, 0x10800023, 0x10800023, 0x0a800005, 0x0a800005},
-+	{0x0000a590, 0x16800220, 0x16800220, 0x0e800201, 0x0e800201},
-+	{0x0000a594, 0x1c800223, 0x1c800223, 0x11800203, 0x11800203},
-+	{0x0000a598, 0x21820220, 0x21820220, 0x14800401, 0x14800401},
-+	{0x0000a59c, 0x27820223, 0x27820223, 0x18800403, 0x18800403},
-+	{0x0000a5a0, 0x2b822220, 0x2b822220, 0x1b800602, 0x1b800602},
-+	{0x0000a5a4, 0x2f822222, 0x2f822222, 0x1f800802, 0x1f800802},
-+	{0x0000a5a8, 0x34822225, 0x34822225, 0x21800620, 0x21800620},
-+	{0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x25800820, 0x25800820},
-+	{0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x29800822, 0x29800822},
-+	{0x0000a5b4, 0x4282242a, 0x4282242a, 0x2d800824, 0x2d800824},
-+	{0x0000a5b8, 0x4782244a, 0x4782244a, 0x30800828, 0x30800828},
-+	{0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x3480082a, 0x3480082a},
-+	{0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x38800849, 0x38800849},
-+	{0x0000a5c4, 0x5382266c, 0x5382266c, 0x3b800a2c, 0x3b800a2c},
-+	{0x0000a5c8, 0x5782286c, 0x5782286c, 0x3e800e2b, 0x3e800e2b},
-+	{0x0000a5cc, 0x5c84286b, 0x5c84286b, 0x42800e2d, 0x42800e2d},
-+	{0x0000a5d0, 0x61842a6c, 0x61842a6c, 0x4580124a, 0x4580124a},
-+	{0x0000a5d4, 0x66862a6c, 0x66862a6c, 0x4980124c, 0x4980124c},
-+	{0x0000a5d8, 0x6b862e6c, 0x6b862e6c, 0x4c80126c, 0x4c80126c},
-+	{0x0000a5dc, 0x7086308c, 0x7086308c, 0x4f80128c, 0x4f80128c},
-+	{0x0000a5e0, 0x738a308a, 0x738a308a, 0x52801290, 0x52801290},
-+	{0x0000a5e4, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a5e8, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a5ec, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a5f0, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a5f4, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a5f8, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a5fc, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292},
-+	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a614, 0x01404000, 0x01404000, 0x01404501, 0x01404501},
-+	{0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
-+	{0x0000a61c, 0x02008802, 0x02008802, 0x01404501, 0x01404501},
-+	{0x0000a620, 0x0300cc03, 0x0300cc03, 0x03c0cf02, 0x03c0cf02},
-+	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03c0cf03, 0x03c0cf03},
-+	{0x0000a628, 0x0300cc03, 0x0300cc03, 0x04011004, 0x04011004},
-+	{0x0000a62c, 0x03810c03, 0x03810c03, 0x05419405, 0x05419405},
-+	{0x0000a630, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506},
-+	{0x0000a634, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506},
-+	{0x0000a638, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506},
-+	{0x0000a63c, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506},
-+	{0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03eaac5a, 0x03eaac5a},
-+	{0x0000b2e0, 0x0000f800, 0x0000f800, 0x03f330ac, 0x03f330ac},
-+	{0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03fc3f00, 0x03fc3f00},
-+	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ffc000, 0x03ffc000},
-+	{0x00016044, 0x022492db, 0x022492db, 0x022492db, 0x022492db},
-+	{0x00016048, 0x24925666, 0x24925666, 0x24925266, 0x24925266},
-+	{0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015},
-+	{0x00016288, 0xf0318000, 0xf0318000, 0xf0318000, 0xf0318000},
-+	{0x00016444, 0x022492db, 0x022492db, 0x022492db, 0x022492db},
-+	{0x00016448, 0x24925666, 0x24925666, 0x24925266, 0x24925266},
-+};
-+
- static const u32 ar9340_1p0_mac_core[][2] = {
- 	/* Addr      allmodes  */
- 	{0x00000008, 0x00000000},
---- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h
-@@ -260,6 +260,79 @@ static const u32 ar9485Modes_high_power_
- 	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
- };
- 
-+static const u32 ar9485Modes_green_ob_db_tx_gain_1_1[][5] = {
-+	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+	{0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003},
-+	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
-+	{0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000},
-+	{0x0000a500, 0x00022200, 0x00022200, 0x00000006, 0x00000006},
-+	{0x0000a504, 0x05062002, 0x05062002, 0x03000201, 0x03000201},
-+	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x06000203, 0x06000203},
-+	{0x0000a50c, 0x11062202, 0x11062202, 0x0a000401, 0x0a000401},
-+	{0x0000a510, 0x17022e00, 0x17022e00, 0x0e000403, 0x0e000403},
-+	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x12000405, 0x12000405},
-+	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x15000604, 0x15000604},
-+	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x18000605, 0x18000605},
-+	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x1c000a04, 0x1c000a04},
-+	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x21000a06, 0x21000a06},
-+	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x29000a24, 0x29000a24},
-+	{0x0000a52c, 0x41023e85, 0x41023e85, 0x2f000e21, 0x2f000e21},
-+	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x31000e20, 0x31000e20},
-+	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x33000e20, 0x33000e20},
-+	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62},
-+	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63},
-+	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65},
-+	{0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66},
-+	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645},
-+	{0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865},
-+	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86},
-+	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9},
-+	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb},
-+	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
-+	{0x0000b500, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b504, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b508, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b50c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b510, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b514, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b518, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b51c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b520, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b524, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b528, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b52c, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a},
-+	{0x0000b530, 0x0000003a, 0x0000003a, 0x0000003a, 0x0000003a},
-+	{0x0000b534, 0x0000004a, 0x0000004a, 0x0000004a, 0x0000004a},
-+	{0x0000b538, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b53c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b540, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b544, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b548, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b54c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b550, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b554, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b558, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b55c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b560, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b564, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b568, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b56c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b570, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b574, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b578, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b57c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db},
-+	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
-+};
-+
- static const u32 ar9485Modes_high_ob_db_tx_gain_1_1[][5] = {
- 	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
- 	{0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
-@@ -450,6 +523,79 @@ static const u32 ar9485Modes_low_ob_db_t
- 
- #define ar9485_modes_lowest_ob_db_tx_gain_1_1 ar9485Modes_low_ob_db_tx_gain_1_1
- 
-+static const u32 ar9485Modes_green_spur_ob_db_tx_gain_1_1[][5] = {
-+	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+	{0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003},
-+	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
-+	{0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000},
-+	{0x0000a500, 0x00022200, 0x00022200, 0x00000006, 0x00000006},
-+	{0x0000a504, 0x05062002, 0x05062002, 0x03000201, 0x03000201},
-+	{0x0000a508, 0x0c002e00, 0x0c002e00, 0x07000203, 0x07000203},
-+	{0x0000a50c, 0x11062202, 0x11062202, 0x0a000401, 0x0a000401},
-+	{0x0000a510, 0x17022e00, 0x17022e00, 0x0e000403, 0x0e000403},
-+	{0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x12000405, 0x12000405},
-+	{0x0000a518, 0x25020ec0, 0x25020ec0, 0x14000406, 0x14000406},
-+	{0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1800040a, 0x1800040a},
-+	{0x0000a520, 0x2f001f04, 0x2f001f04, 0x1c000460, 0x1c000460},
-+	{0x0000a524, 0x35001fc4, 0x35001fc4, 0x22000463, 0x22000463},
-+	{0x0000a528, 0x3c022f04, 0x3c022f04, 0x26000465, 0x26000465},
-+	{0x0000a52c, 0x41023e85, 0x41023e85, 0x2e0006e0, 0x2e0006e0},
-+	{0x0000a530, 0x48023ec6, 0x48023ec6, 0x310006e0, 0x310006e0},
-+	{0x0000a534, 0x4d023f01, 0x4d023f01, 0x330006e0, 0x330006e0},
-+	{0x0000a538, 0x53023f4b, 0x53023f4b, 0x3e0008e3, 0x3e0008e3},
-+	{0x0000a53c, 0x5a027f09, 0x5a027f09, 0x410008e5, 0x410008e5},
-+	{0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x430008e6, 0x430008e6},
-+	{0x0000a544, 0x6502feca, 0x6502feca, 0x4a0008ec, 0x4a0008ec},
-+	{0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4e0008f1, 0x4e0008f1},
-+	{0x0000a54c, 0x7203feca, 0x7203feca, 0x520008f3, 0x520008f3},
-+	{0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x54000eed, 0x54000eed},
-+	{0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x58000ef1, 0x58000ef1},
-+	{0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5c000ef3, 0x5c000ef3},
-+	{0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x60000ef5, 0x60000ef5},
-+	{0x0000a560, 0x900fff0b, 0x900fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000a564, 0x960fffcb, 0x960fffcb, 0x62000ef6, 0x62000ef6},
-+	{0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6},
-+	{0x0000b500, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b504, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b508, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b50c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b510, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b514, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b518, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b51c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b520, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b524, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b528, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
-+	{0x0000b52c, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a},
-+	{0x0000b530, 0x0000003a, 0x0000003a, 0x0000003a, 0x0000003a},
-+	{0x0000b534, 0x0000004a, 0x0000004a, 0x0000004a, 0x0000004a},
-+	{0x0000b538, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b53c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b540, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b544, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b548, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b54c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b550, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b554, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b558, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b55c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b560, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b564, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b568, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b56c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b570, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b574, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b578, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x0000b57c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
-+	{0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db},
-+	{0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
-+};
-+
- static const u32 ar9485_1_1[][2] = {
- 	/* Addr      allmodes  */
- 	{0x0000a580, 0x00000000},
---- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
-@@ -685,6 +685,82 @@ static const u32 ar9580_1p0_mixed_ob_db_
- 
- #define ar9580_1p0_high_ob_db_tx_gain_table ar9300Modes_high_ob_db_tx_gain_table_2p2
- 
-+#define ar9580_1p0_type5_tx_gain_table ar9300Modes_type5_tx_gain_table_2p2
-+
-+static const u32 ar9580_1p0_type6_tx_gain_table[][5] = {
-+	/* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+	{0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
-+	{0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
-+	{0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
-+	{0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-+	{0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-+	{0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
-+	{0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
-+	{0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202},
-+	{0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400},
-+	{0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402},
-+	{0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404},
-+	{0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603},
-+	{0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02},
-+	{0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04},
-+	{0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20},
-+	{0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20},
-+	{0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22},
-+	{0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24},
-+	{0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640},
-+	{0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660},
-+	{0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861},
-+	{0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81},
-+	{0x0000a54c, 0x5e08442e, 0x5e08442e, 0x47001a83, 0x47001a83},
-+	{0x0000a550, 0x620a4431, 0x620a4431, 0x4a001c84, 0x4a001c84},
-+	{0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3},
-+	{0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5},
-+	{0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9},
-+	{0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb},
-+	{0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
-+	{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+	{0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
-+	{0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
-+	{0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
-+	{0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000},
-+	{0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501},
-+	{0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501},
-+	{0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03},
-+	{0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
-+	{0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04},
-+	{0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
-+	{0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
-+	{0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
-+	{0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
-+	{0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
-+	{0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
-+	{0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
-+	{0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+	{0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
-+	{0x00016048, 0x61200001, 0x61200001, 0x66480001, 0x66480001},
-+	{0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+	{0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
-+	{0x00016448, 0x61200001, 0x61200001, 0x66480001, 0x66480001},
-+	{0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+	{0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
-+	{0x00016848, 0x61200001, 0x61200001, 0x66480001, 0x66480001},
-+	{0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
-+};
-+
- static const u32 ar9580_1p0_soc_preamble[][2] = {
- 	/* Addr      allmodes  */
- 	{0x000040a4, 0x00a0c1c9},
---- a/drivers/net/wireless/ath/ath9k/reg.h
-+++ b/drivers/net/wireless/ath/ath9k/reg.h
-@@ -789,6 +789,7 @@
- #define AR_SREV_REVISION_9271_11	1
- #define AR_SREV_VERSION_9300		0x1c0
- #define AR_SREV_REVISION_9300_20	2 /* 2.0 and 2.1 */
-+#define AR_SREV_REVISION_9300_22	3
- #define AR_SREV_VERSION_9330		0x200
- #define AR_SREV_REVISION_9330_10	0
- #define AR_SREV_REVISION_9330_11	1
-@@ -869,6 +870,9 @@
- 	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9300))
- #define AR_SREV_9300_20_OR_LATER(_ah) \
- 	((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9300)
-+#define AR_SREV_9300_22(_ah) \
-+	(AR_SREV_9300(ah) && \
-+	 ((_ah)->hw_version.macRev == AR_SREV_REVISION_9300_22))
- 
- #define AR_SREV_9330(_ah) \
- 	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9330))
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -199,11 +199,11 @@ static u32 ieee80211_config_ht_tx(struct
- 	case NL80211_CHAN_WIDTH_40:
- 		if (sdata->vif.bss_conf.chandef.chan->center_freq >
- 				sdata->vif.bss_conf.chandef.center_freq1 &&
--		    chan->flags & IEEE80211_CHAN_NO_HT40PLUS)
-+		    chan->flags & IEEE80211_CHAN_NO_HT40MINUS)
- 			disable_40 = true;
- 		if (sdata->vif.bss_conf.chandef.chan->center_freq <
- 				sdata->vif.bss_conf.chandef.center_freq1 &&
--		    chan->flags & IEEE80211_CHAN_NO_HT40MINUS)
-+		    chan->flags & IEEE80211_CHAN_NO_HT40PLUS)
- 			disable_40 = true;
- 		break;
- 	default:
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -18,6 +18,7 @@
- #include "hw-ops.h"
- #include "../regd.h"
- #include "ar9002_phy.h"
-+#include "ar5008_initvals.h"
- 
- /* All code below is for AR5008, AR9001, AR9002 */
- 
-@@ -43,23 +44,16 @@ static const int m2ThreshLowExt_off = 12
- static const int m1ThreshExt_off = 127;
- static const int m2ThreshExt_off = 127;
- 
-+static const struct ar5416IniArray bank0 = STATIC_INI_ARRAY(ar5416Bank0);
-+static const struct ar5416IniArray bank1 = STATIC_INI_ARRAY(ar5416Bank1);
-+static const struct ar5416IniArray bank2 = STATIC_INI_ARRAY(ar5416Bank2);
-+static const struct ar5416IniArray bank3 = STATIC_INI_ARRAY(ar5416Bank3);
-+static const struct ar5416IniArray bank7 = STATIC_INI_ARRAY(ar5416Bank7);
- 
--static void ar5008_rf_bank_setup(u32 *bank, struct ar5416IniArray *array,
--				 int col)
--{
--	int i;
+-	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
+-			tcp->wake_payload_max))
+-		return -ENOBUFS;
 -
 -
--	for (i = 0; i < array->ia_rows; i++)
--		bank[i] = INI_RA(array, i, col);
+-	nla_nest_end(msg, nl_tcp);
+-	return 0;
 -}
 -}
+-#endif
 -
 -
--
--#define REG_WRITE_RF_ARRAY(iniarray, regData, regWr) \
--	ar5008_write_rf_array(ah, iniarray, regData, &(regWr))
--
--static void ar5008_write_rf_array(struct ath_hw *ah, struct ar5416IniArray *array,
--				  u32 *data, unsigned int *writecnt)
-+static void ar5008_write_bank6(struct ath_hw *ah, unsigned int *writecnt)
+ static int nl80211_send_wiphy(struct sk_buff *msg, u32 portid, u32 seq, int flags,
+ 			      struct cfg80211_registered_device *dev)
  {
  {
-+	struct ar5416IniArray *array = &ah->iniBank6;
-+	u32 *data = ah->analogBank6Data;
- 	int r;
+@@ -1330,9 +1278,6 @@ static int nl80211_send_wiphy(struct sk_
+ 				goto nla_put_failure;
+ 		}
  
  
- 	ENABLE_REGWRITE_BUFFER(ah);
-@@ -165,7 +159,7 @@ static void ar5008_hw_force_bias(struct 
- 	ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, tmp_reg, 3, 181, 3);
- 
- 	/* write Bank 6 with new params */
--	REG_WRITE_RF_ARRAY(&ah->iniBank6, ah->analogBank6Data, reg_writes);
-+	ar5008_write_bank6(ah, &reg_writes);
- }
- 
- /**
-@@ -469,31 +463,16 @@ static void ar5008_hw_spur_mitigate(stru
-  */
- static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah)
- {
--#define ATH_ALLOC_BANK(bank, size) do { \
--		bank = devm_kzalloc(ah->dev, sizeof(u32) * size, GFP_KERNEL); \
--		if (!bank) \
--			goto error; \
--	} while (0);
--
--	struct ath_common *common = ath9k_hw_common(ah);
-+	int size = ah->iniBank6.ia_rows * sizeof(u32);
- 
- 	if (AR_SREV_9280_20_OR_LATER(ah))
- 	    return 0;
- 
--	ATH_ALLOC_BANK(ah->analogBank0Data, ah->iniBank0.ia_rows);
--	ATH_ALLOC_BANK(ah->analogBank1Data, ah->iniBank1.ia_rows);
--	ATH_ALLOC_BANK(ah->analogBank2Data, ah->iniBank2.ia_rows);
--	ATH_ALLOC_BANK(ah->analogBank3Data, ah->iniBank3.ia_rows);
--	ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows);
--	ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows);
--	ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows);
--	ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows);
-+	ah->analogBank6Data = devm_kzalloc(ah->dev, size, GFP_KERNEL);
-+	if (!ah->analogBank6Data)
-+		return -ENOMEM;
- 
- 	return 0;
--#undef ATH_ALLOC_BANK
--error:
--	ath_err(common, "Cannot allocate RF banks\n");
--	return -ENOMEM;
- }
- 
- 
-@@ -517,6 +496,7 @@ static bool ar5008_hw_set_rf_regs(struct
- 	u32 ob5GHz = 0, db5GHz = 0;
- 	u32 ob2GHz = 0, db2GHz = 0;
- 	int regWrites = 0;
-+	int i;
- 
- 	/*
- 	 * Software does not need to program bank data
-@@ -529,25 +509,8 @@ static bool ar5008_hw_set_rf_regs(struct
- 	/* Setup rf parameters */
- 	eepMinorRev = ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV);
- 
--	/* Setup Bank 0 Write */
--	ar5008_rf_bank_setup(ah->analogBank0Data, &ah->iniBank0, 1);
--
--	/* Setup Bank 1 Write */
--	ar5008_rf_bank_setup(ah->analogBank1Data, &ah->iniBank1, 1);
--
--	/* Setup Bank 2 Write */
--	ar5008_rf_bank_setup(ah->analogBank2Data, &ah->iniBank2, 1);
+-		if (nl80211_send_wowlan_tcp_caps(dev, msg))
+-			goto nla_put_failure;
 -
 -
--	/* Setup Bank 6 Write */
--	ar5008_rf_bank_setup(ah->analogBank3Data, &ah->iniBank3,
--		      modesIndex);
--	{
--		int i;
--		for (i = 0; i < ah->iniBank6TPC.ia_rows; i++) {
--			ah->analogBank6Data[i] =
--			    INI_RA(&ah->iniBank6TPC, i, modesIndex);
--		}
--	}
-+	for (i = 0; i < ah->iniBank6.ia_rows; i++)
-+		ah->analogBank6Data[i] = INI_RA(&ah->iniBank6, i, modesIndex);
- 
- 	/* Only the 5 or 2 GHz OB/DB need to be set for a mode */
- 	if (eepMinorRev >= 2) {
-@@ -568,22 +531,13 @@ static bool ar5008_hw_set_rf_regs(struct
- 		}
+ 		nla_nest_end(msg, nl_wowlan);
  	}
  	}
- 
--	/* Setup Bank 7 Setup */
--	ar5008_rf_bank_setup(ah->analogBank7Data, &ah->iniBank7, 1);
--
- 	/* Write Analog registers */
--	REG_WRITE_RF_ARRAY(&ah->iniBank0, ah->analogBank0Data,
--			   regWrites);
--	REG_WRITE_RF_ARRAY(&ah->iniBank1, ah->analogBank1Data,
--			   regWrites);
--	REG_WRITE_RF_ARRAY(&ah->iniBank2, ah->analogBank2Data,
--			   regWrites);
--	REG_WRITE_RF_ARRAY(&ah->iniBank3, ah->analogBank3Data,
--			   regWrites);
--	REG_WRITE_RF_ARRAY(&ah->iniBank6TPC, ah->analogBank6Data,
--			   regWrites);
--	REG_WRITE_RF_ARRAY(&ah->iniBank7, ah->analogBank7Data,
--			   regWrites);
-+	REG_WRITE_ARRAY(&bank0, 1, regWrites);
-+	REG_WRITE_ARRAY(&bank1, 1, regWrites);
-+	REG_WRITE_ARRAY(&bank2, 1, regWrites);
-+	REG_WRITE_ARRAY(&bank3, modesIndex, regWrites);
-+	ar5008_write_bank6(ah, &regWrites);
-+	REG_WRITE_ARRAY(&bank7, 1, regWrites);
- 
- 	return true;
- }
---- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
-@@ -23,13 +23,13 @@
- 
- /* General hardware code for the A5008/AR9001/AR9002 hadware families */
- 
--static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
-+static int ar9002_hw_init_mode_regs(struct ath_hw *ah)
- {
- 	if (AR_SREV_9271(ah)) {
- 		INIT_INI_ARRAY(&ah->iniModes, ar9271Modes_9271);
- 		INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271);
- 		INIT_INI_ARRAY(&ah->iniModes_9271_ANI_reg, ar9271Modes_9271_ANI_reg);
--		return;
-+		return 0;
- 	}
- 
- 	if (ah->config.pcie_clock_req)
-@@ -67,12 +67,10 @@ static void ar9002_hw_init_mode_regs(str
- 	} else if (AR_SREV_9100_OR_LATER(ah)) {
- 		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100);
- 		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100);
--		INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100);
- 		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100);
- 	} else {
- 		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes);
- 		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common);
--		INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC);
- 		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac);
- 	}
- 
-@@ -80,20 +78,11 @@ static void ar9002_hw_init_mode_regs(str
- 		/* Common for AR5416, AR913x, AR9160 */
- 		INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain);
- 
--		INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0);
--		INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1);
--		INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2);
--		INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3);
--		INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7);
--
--		/* Common for AR5416, AR9160 */
--		if (!AR_SREV_9100(ah))
--			INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6);
--
- 		/* Common for AR913x, AR9160 */
- 		if (!AR_SREV_5416(ah))
--			INIT_INI_ARRAY(&ah->iniBank6TPC,
--				      ar5416Bank6TPC_9100);
-+			INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6TPC_9100);
-+		else
-+			INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6TPC);
- 	}
- 
- 	/* iniAddac needs to be modified for these chips */
-@@ -104,7 +93,7 @@ static void ar9002_hw_init_mode_regs(str
- 
- 		data = devm_kzalloc(ah->dev, size, GFP_KERNEL);
- 		if (!data)
--			return;
-+			return -ENOMEM;
- 
- 		memcpy(data, addac->ia_array, size);
- 		addac->ia_array = data;
-@@ -120,6 +109,7 @@ static void ar9002_hw_init_mode_regs(str
- 		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
- 		       ar9287Common_japan_2484_cck_fir_coeff_9287_1_1);
- 	}
-+	return 0;
- }
- 
- static void ar9280_20_hw_init_rxgain_ini(struct ath_hw *ah)
-@@ -415,7 +405,10 @@ int ar9002_hw_attach_ops(struct ath_hw *
- 	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
- 	int ret;
- 
--	priv_ops->init_mode_regs = ar9002_hw_init_mode_regs;
-+	ret = ar9002_hw_init_mode_regs(ah);
-+	if (ret)
-+		return ret;
-+
- 	priv_ops->init_mode_gain_regs = ar9002_hw_init_mode_gain_regs;
- 
- 	ops->config_pci_powersave = ar9002_hw_configpcipowersave;
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -54,11 +54,6 @@ static void ath9k_hw_init_cal_settings(s
- 	ath9k_hw_private_ops(ah)->init_cal_settings(ah);
- }
- 
--static void ath9k_hw_init_mode_regs(struct ath_hw *ah)
--{
--	ath9k_hw_private_ops(ah)->init_mode_regs(ah);
--}
--
- static u32 ath9k_hw_compute_pll_control(struct ath_hw *ah,
- 					struct ath9k_channel *chan)
- {
-@@ -208,7 +203,7 @@ void ath9k_hw_synth_delay(struct ath_hw 
- 	udelay(hw_delay + BASE_ACTIVATE_DELAY);
- }
- 
--void ath9k_hw_write_array(struct ath_hw *ah, struct ar5416IniArray *array,
-+void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
- 			  int column, unsigned int *writecnt)
- {
- 	int r;
-@@ -554,10 +549,8 @@ static int ath9k_hw_post_init(struct ath
- 		ah->eep_ops->get_eeprom_ver(ah),
- 		ah->eep_ops->get_eeprom_rev(ah));
- 
--	if (ah->config.enable_ani) {
--		ath9k_hw_ani_setup(ah);
-+	if (ah->config.enable_ani)
- 		ath9k_hw_ani_init(ah);
--	}
- 
- 	return 0;
- }
-@@ -670,8 +663,6 @@ static int __ath9k_hw_init(struct ath_hw
- 	if (!AR_SREV_9300_20_OR_LATER(ah))
- 		ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
- 
--	ath9k_hw_init_mode_regs(ah);
--
- 	if (!ah->is_pciexpress)
- 		ath9k_hw_disablepcie(ah);
- 
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -599,7 +599,6 @@ struct ath_hw_radar_conf {
-  * @init_cal_settings: setup types of calibrations supported
-  * @init_cal: starts actual calibration
-  *
-- * @init_mode_regs: Initializes mode registers
-  * @init_mode_gain_regs: Initialize TX/RX gain registers
-  *
-  * @rf_set_freq: change frequency
-@@ -618,7 +617,6 @@ struct ath_hw_private_ops {
- 	void (*init_cal_settings)(struct ath_hw *ah);
- 	bool (*init_cal)(struct ath_hw *ah, struct ath9k_channel *chan);
- 
--	void (*init_mode_regs)(struct ath_hw *ah);
- 	void (*init_mode_gain_regs)(struct ath_hw *ah);
- 	void (*setup_calibration)(struct ath_hw *ah,
- 				  struct ath9k_cal_list *currCal);
-@@ -810,14 +808,7 @@ struct ath_hw {
- 	struct ath_hw_ops ops;
- 
- 	/* Used to program the radio on non single-chip devices */
--	u32 *analogBank0Data;
--	u32 *analogBank1Data;
--	u32 *analogBank2Data;
--	u32 *analogBank3Data;
- 	u32 *analogBank6Data;
--	u32 *analogBank6TPCData;
--	u32 *analogBank7Data;
--	u32 *bank6Temp;
- 
- 	int coverage_class;
- 	u32 slottime;
-@@ -826,10 +817,6 @@ struct ath_hw {
- 	/* ANI */
- 	u32 proc_phyerr;
- 	u32 aniperiod;
--	int totalSizeDesired[5];
--	int coarse_high[5];
--	int coarse_low[5];
--	int firpwr[5];
- 	enum ath9k_ani_cmd ani_function;
- 	u32 ani_skip_count;
- 
-@@ -852,14 +839,8 @@ struct ath_hw {
- 
- 	struct ar5416IniArray iniModes;
- 	struct ar5416IniArray iniCommon;
--	struct ar5416IniArray iniBank0;
- 	struct ar5416IniArray iniBB_RfGain;
--	struct ar5416IniArray iniBank1;
--	struct ar5416IniArray iniBank2;
--	struct ar5416IniArray iniBank3;
- 	struct ar5416IniArray iniBank6;
--	struct ar5416IniArray iniBank6TPC;
--	struct ar5416IniArray iniBank7;
- 	struct ar5416IniArray iniAddac;
- 	struct ar5416IniArray iniPcieSerdes;
- #ifdef CONFIG_PM_SLEEP
-@@ -975,7 +956,7 @@ void ath9k_hw_setantenna(struct ath_hw *
- void ath9k_hw_synth_delay(struct ath_hw *ah, struct ath9k_channel *chan,
- 			  int hw_delay);
- bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout);
--void ath9k_hw_write_array(struct ath_hw *ah, struct ar5416IniArray *array,
-+void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
- 			  int column, unsigned int *writecnt);
- u32 ath9k_hw_reverse_bits(u32 val, u32 n);
- u16 ath9k_hw_computetxtime(struct ath_hw *ah,
-@@ -1062,6 +1043,7 @@ void ar9003_paprd_setup_gain_table(struc
- int ar9003_paprd_init_table(struct ath_hw *ah);
- bool ar9003_paprd_is_done(struct ath_hw *ah);
- bool ar9003_is_paprd_enabled(struct ath_hw *ah);
-+void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx);
- 
- /* Hardware family op attach helpers */
- int ar5008_hw_attach_phy_ops(struct ath_hw *ah);
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1677,10 +1677,10 @@ netdev_tx_t ieee80211_monitor_start_xmit
- 			chanctx_conf =
- 				rcu_dereference(tmp_sdata->vif.chanctx_conf);
- 	}
--	if (!chanctx_conf)
--		goto fail_rcu;
--
--	chan = chanctx_conf->def.chan;
-+	if (chanctx_conf)
-+		chan = chanctx_conf->def.chan;
-+	else
-+		chan = local->_oper_channel;
- 
- 	/*
- 	 * Frame injection is not allowed if beaconing is not allowed
---- a/drivers/net/wireless/ath/ath9k/ani.c
-+++ b/drivers/net/wireless/ath/ath9k/ani.c
-@@ -152,7 +152,8 @@ static void ath9k_hw_set_ofdm_nil(struct
- 	ath_dbg(common, ANI, "**** ofdmlevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
- 		aniState->ofdmNoiseImmunityLevel,
- 		immunityLevel, BEACON_RSSI(ah),
--		aniState->rssiThrLow, aniState->rssiThrHigh);
-+		ATH9K_ANI_RSSI_THR_LOW,
-+		ATH9K_ANI_RSSI_THR_HIGH);
- 
- 	if (!scan)
- 		aniState->ofdmNoiseImmunityLevel = immunityLevel;
-@@ -173,7 +174,7 @@ static void ath9k_hw_set_ofdm_nil(struct
- 
- 	weak_sig = entry_ofdm->ofdm_weak_signal_on;
- 	if (ah->opmode == NL80211_IFTYPE_STATION &&
--	    BEACON_RSSI(ah) <= aniState->rssiThrHigh)
-+	    BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_HIGH)
- 		weak_sig = true;
- 
- 	if (aniState->ofdmWeakSigDetect != weak_sig)
-@@ -216,11 +217,11 @@ static void ath9k_hw_set_cck_nil(struct 
- 
- 	ath_dbg(common, ANI, "**** ccklevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
- 		aniState->cckNoiseImmunityLevel, immunityLevel,
--		BEACON_RSSI(ah), aniState->rssiThrLow,
--		aniState->rssiThrHigh);
-+		BEACON_RSSI(ah), ATH9K_ANI_RSSI_THR_LOW,
-+		ATH9K_ANI_RSSI_THR_HIGH);
- 
- 	if (ah->opmode == NL80211_IFTYPE_STATION &&
--	    BEACON_RSSI(ah) <= aniState->rssiThrLow &&
-+	    BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_LOW &&
- 	    immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)
- 		immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI;
- 
-@@ -418,9 +419,6 @@ void ath9k_hw_ani_monitor(struct ath_hw 
- 		return;
- 
- 	aniState = &ah->curchan->ani;
--	if (WARN_ON(!aniState))
--		return;
--
- 	if (!ath9k_hw_ani_read_counters(ah))
- 		return;
- 
-@@ -489,23 +487,6 @@ void ath9k_hw_disable_mib_counters(struc
- }
- EXPORT_SYMBOL(ath9k_hw_disable_mib_counters);
- 
--void ath9k_hw_ani_setup(struct ath_hw *ah)
--{
--	int i;
--
--	static const int totalSizeDesired[] = { -55, -55, -55, -55, -62 };
--	static const int coarseHigh[] = { -14, -14, -14, -14, -12 };
--	static const int coarseLow[] = { -64, -64, -64, -64, -70 };
--	static const int firpwr[] = { -78, -78, -78, -78, -80 };
--
--	for (i = 0; i < 5; i++) {
--		ah->totalSizeDesired[i] = totalSizeDesired[i];
--		ah->coarse_high[i] = coarseHigh[i];
--		ah->coarse_low[i] = coarseLow[i];
--		ah->firpwr[i] = firpwr[i];
--	}
--}
--
- void ath9k_hw_ani_init(struct ath_hw *ah)
- {
- 	struct ath_common *common = ath9k_hw_common(ah);
-@@ -531,8 +512,6 @@ void ath9k_hw_ani_init(struct ath_hw *ah
- 
- 		ani->ofdmsTurn = true;
- 
--		ani->rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH;
--		ani->rssiThrLow = ATH9K_ANI_RSSI_THR_LOW;
- 		ani->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG;
- 		ani->cckNoiseImmunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;
- 		ani->ofdmNoiseImmunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
---- a/drivers/net/wireless/ath/ath9k/ani.h
-+++ b/drivers/net/wireless/ath/ath9k/ani.h
-@@ -104,7 +104,6 @@ struct ath9k_ani_default {
- };
- 
- struct ar5416AniState {
--	struct ath9k_channel *c;
- 	u8 noiseImmunityLevel;
- 	u8 ofdmNoiseImmunityLevel;
- 	u8 cckNoiseImmunityLevel;
-@@ -113,15 +112,9 @@ struct ar5416AniState {
- 	u8 spurImmunityLevel;
- 	u8 firstepLevel;
- 	u8 ofdmWeakSigDetect;
--	u8 cckWeakSigThreshold;
- 	u32 listenTime;
--	int32_t rssiThrLow;
--	int32_t rssiThrHigh;
- 	u32 ofdmPhyErrCount;
- 	u32 cckPhyErrCount;
--	int16_t pktRssi[2];
--	int16_t ofdmErrRssi[2];
--	int16_t cckErrRssi[2];
- 	struct ath9k_ani_default iniDef;
- };
- 
-@@ -147,7 +140,6 @@ struct ar5416Stats {
- 
- void ath9k_enable_mib_counters(struct ath_hw *ah);
- void ath9k_hw_disable_mib_counters(struct ath_hw *ah);
--void ath9k_hw_ani_setup(struct ath_hw *ah);
- void ath9k_hw_ani_init(struct ath_hw *ah);
- 
- #endif /* ANI_H */
---- a/drivers/net/wireless/ath/ath9k/calib.h
-+++ b/drivers/net/wireless/ath/ath9k/calib.h
-@@ -33,6 +33,12 @@ struct ar5416IniArray {
- 	u32 ia_columns;
- };
- 
-+#define STATIC_INI_ARRAY(array) {			\
-+		.ia_array = (u32 *)(array),		\
-+		.ia_rows = ARRAY_SIZE(array),		\
-+		.ia_columns = ARRAY_SIZE(array[0]),	\
-+	}
-+
- #define INIT_INI_ARRAY(iniarray, array) do {	\
- 		(iniarray)->ia_array = (u32 *)(array);		\
- 		(iniarray)->ia_rows = ARRAY_SIZE(array);	\
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -378,7 +378,7 @@ static void ath_tx_count_frames(struct a
- 
- static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
- 				 struct ath_buf *bf, struct list_head *bf_q,
--				 struct ath_tx_status *ts, int txok, bool retry)
-+				 struct ath_tx_status *ts, int txok)
- {
- 	struct ath_node *an = NULL;
- 	struct sk_buff *skb;
-@@ -490,7 +490,7 @@ static void ath_tx_complete_aggr(struct 
- 		} else if (!isaggr && txok) {
- 			/* transmit completion */
- 			acked_cnt++;
--		} else if ((tid->state & AGGR_CLEANUP) || !retry) {
-+		} else if (tid->state & AGGR_CLEANUP) {
- 			/*
- 			 * cleanup in progress, just fail
- 			 * the un-acked sub-frames
-@@ -604,6 +604,37 @@ static void ath_tx_complete_aggr(struct 
- 		ath9k_queue_reset(sc, RESET_TYPE_TX_ERROR);
- }
- 
-+static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
-+{
-+    struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
-+    return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
-+}
-+
-+static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
-+				  struct ath_tx_status *ts, struct ath_buf *bf,
-+				  struct list_head *bf_head)
-+{
-+	bool txok, flush;
-+
-+	txok = !(ts->ts_status & ATH9K_TXERR_MASK);
-+	flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
-+	txq->axq_tx_inprogress = false;
-+
-+	txq->axq_depth--;
-+	if (bf_is_ampdu_not_probing(bf))
-+		txq->axq_ampdu_depth--;
-+
-+	if (!bf_isampdu(bf)) {
-+		if (!flush)
-+			ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
-+		ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok);
-+	} else
-+		ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok);
-+
-+	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) && !flush)
-+		ath_txq_schedule(sc, txq);
-+}
-+
- static bool ath_lookup_legacy(struct ath_buf *bf)
- {
- 	struct sk_buff *skb;
-@@ -1331,23 +1362,6 @@ void ath_tx_aggr_resume(struct ath_softc
- /* Queue Management */
- /********************/
- 
--static void ath_txq_drain_pending_buffers(struct ath_softc *sc,
--					  struct ath_txq *txq)
--{
--	struct ath_atx_ac *ac, *ac_tmp;
--	struct ath_atx_tid *tid, *tid_tmp;
--
--	list_for_each_entry_safe(ac, ac_tmp, &txq->axq_acq, list) {
--		list_del(&ac->list);
--		ac->sched = false;
--		list_for_each_entry_safe(tid, tid_tmp, &ac->tid_q, list) {
--			list_del(&tid->list);
--			tid->sched = false;
--			ath_tid_drain(sc, txq, tid);
--		}
--	}
--}
--
- struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype)
- {
- 	struct ath_hw *ah = sc->sc_ah;
-@@ -1470,14 +1484,8 @@ int ath_cabq_update(struct ath_softc *sc
- 	return 0;
- }
- 
--static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
--{
--    struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
--    return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
--}
--
- static void ath_drain_txq_list(struct ath_softc *sc, struct ath_txq *txq,
--			       struct list_head *list, bool retry_tx)
-+			       struct list_head *list)
- {
- 	struct ath_buf *bf, *lastbf;
- 	struct list_head bf_head;
-@@ -1499,16 +1507,7 @@ static void ath_drain_txq_list(struct at
- 
- 		lastbf = bf->bf_lastbf;
- 		list_cut_position(&bf_head, list, &lastbf->list);
--
--		txq->axq_depth--;
--		if (bf_is_ampdu_not_probing(bf))
--			txq->axq_ampdu_depth--;
--
--		if (bf_isampdu(bf))
--			ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0,
--					     retry_tx);
--		else
--			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0);
-+		ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head);
- 	}
- }
- 
-@@ -1518,7 +1517,7 @@ static void ath_drain_txq_list(struct at
-  * This assumes output has been stopped and
-  * we do not need to block ath_tx_tasklet.
-  */
--void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx)
-+void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq)
- {
- 	ath_txq_lock(sc, txq);
- 
-@@ -1526,8 +1525,7 @@ void ath_draintxq(struct ath_softc *sc, 
- 		int idx = txq->txq_tailidx;
- 
- 		while (!list_empty(&txq->txq_fifo[idx])) {
--			ath_drain_txq_list(sc, txq, &txq->txq_fifo[idx],
--					   retry_tx);
-+			ath_drain_txq_list(sc, txq, &txq->txq_fifo[idx]);
- 
- 			INCR(idx, ATH_TXFIFO_DEPTH);
- 		}
-@@ -1536,16 +1534,12 @@ void ath_draintxq(struct ath_softc *sc, 
- 
- 	txq->axq_link = NULL;
- 	txq->axq_tx_inprogress = false;
--	ath_drain_txq_list(sc, txq, &txq->axq_q, retry_tx);
--
--	/* flush any pending frames if aggregation is enabled */
--	if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) && !retry_tx)
--		ath_txq_drain_pending_buffers(sc, txq);
-+	ath_drain_txq_list(sc, txq, &txq->axq_q);
- 
- 	ath_txq_unlock_complete(sc, txq);
- }
- 
--bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
-+bool ath_drain_all_txq(struct ath_softc *sc)
- {
- 	struct ath_hw *ah = sc->sc_ah;
- 	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-@@ -1581,7 +1575,7 @@ bool ath_drain_all_txq(struct ath_softc 
- 		 */
- 		txq = &sc->tx.txq[i];
- 		txq->stopped = false;
--		ath_draintxq(sc, txq, retry_tx);
-+		ath_draintxq(sc, txq);
- 	}
- 
- 	return !npend;
-@@ -2175,28 +2169,6 @@ static void ath_tx_rc_status(struct ath_
- 	tx_info->status.rates[tx_rateindex].count = ts->ts_longretry + 1;
- }
- 
--static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
--				  struct ath_tx_status *ts, struct ath_buf *bf,
--				  struct list_head *bf_head)
--{
--	int txok;
--
--	txq->axq_depth--;
--	txok = !(ts->ts_status & ATH9K_TXERR_MASK);
--	txq->axq_tx_inprogress = false;
--	if (bf_is_ampdu_not_probing(bf))
--		txq->axq_ampdu_depth--;
--
--	if (!bf_isampdu(bf)) {
--		ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
--		ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok);
--	} else
--		ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true);
--
--	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
--		ath_txq_schedule(sc, txq);
--}
--
- static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
- {
- 	struct ath_hw *ah = sc->sc_ah;
---- a/net/mac80211/rc80211_minstrel.c
-+++ b/net/mac80211/rc80211_minstrel.c
-@@ -494,6 +494,33 @@ minstrel_free_sta(void *priv, struct iee
- 	kfree(mi);
- }
- 
-+static void
-+minstrel_init_cck_rates(struct minstrel_priv *mp)
-+{
-+	static const int bitrates[4] = { 10, 20, 55, 110 };
-+	struct ieee80211_supported_band *sband;
-+	int i, j;
-+
-+	sband = mp->hw->wiphy->bands[IEEE80211_BAND_2GHZ];
-+	if (!sband)
-+		return;
-+
-+	for (i = 0, j = 0; i < sband->n_bitrates; i++) {
-+		struct ieee80211_rate *rate = &sband->bitrates[i];
-+
-+		if (rate->flags & IEEE80211_RATE_ERP_G)
-+			continue;
-+
-+		for (j = 0; j < ARRAY_SIZE(bitrates); j++) {
-+			if (rate->bitrate != bitrates[j])
-+				continue;
-+
-+			mp->cck_rates[j] = i;
-+			break;
-+		}
-+	}
-+}
-+
- static void *
- minstrel_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
- {
-@@ -539,6 +566,8 @@ minstrel_alloc(struct ieee80211_hw *hw, 
- 			S_IRUGO | S_IWUGO, debugfsdir, &mp->fixed_rate_idx);
  #endif
  #endif
- 
-+	minstrel_init_cck_rates(mp);
-+
- 	return mp;
- }
- 
---- a/net/mac80211/rc80211_minstrel.h
-+++ b/net/mac80211/rc80211_minstrel.h
-@@ -79,6 +79,8 @@ struct minstrel_priv {
- 	unsigned int lookaround_rate;
- 	unsigned int lookaround_rate_mrr;
- 
-+	u8 cck_rates[4];
-+
- #ifdef CONFIG_MAC80211_DEBUGFS
- 	/*
- 	 * enable fixed rate processing per RC
---- a/net/mac80211/rc80211_minstrel_ht.c
-+++ b/net/mac80211/rc80211_minstrel_ht.c
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2010 Felix Fietkau <[email protected]>
-+ * Copyright (C) 2010-2013 Felix Fietkau <[email protected]>
-  *
-  * This program is free software; you can redistribute it and/or modify
-  * it under the terms of the GNU General Public License version 2 as
-@@ -63,6 +63,30 @@
- 	}								\
- }
- 
-+#define CCK_DURATION(_bitrate, _short, _len)		\
-+	(10 /* SIFS */ +				\
-+	 (_short ? 72 + 24 : 144 + 48 ) +		\
-+	 (8 * (_len + 4) * 10) / (_bitrate))
-+
-+#define CCK_ACK_DURATION(_bitrate, _short)			\
-+	(CCK_DURATION((_bitrate > 10 ? 20 : 10), false, 60) +	\
-+	 CCK_DURATION(_bitrate, _short, AVG_PKT_SIZE))
-+
-+#define CCK_DURATION_LIST(_short)			\
-+	CCK_ACK_DURATION(10, _short),			\
-+	CCK_ACK_DURATION(20, _short),			\
-+	CCK_ACK_DURATION(55, _short),			\
-+	CCK_ACK_DURATION(110, _short)
-+
-+#define CCK_GROUP						\
-+	[MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS] = {	\
-+		.streams = 0,					\
-+		.duration = {					\
-+			CCK_DURATION_LIST(false),		\
-+			CCK_DURATION_LIST(true)			\
-+		}						\
-+	}
-+
- /*
-  * To enable sufficiently targeted rate sampling, MCS rates are divided into
-  * groups, based on the number of streams and flags (HT40, SGI) that they
-@@ -95,8 +119,13 @@ const struct mcs_group minstrel_mcs_grou
- #if MINSTREL_MAX_STREAMS >= 3
- 	MCS_GROUP(3, 1, 1),
- #endif
-+
-+	/* must be last */
-+	CCK_GROUP
- };
- 
-+#define MINSTREL_CCK_GROUP	(ARRAY_SIZE(minstrel_mcs_groups) - 1)
-+
- static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES];
- 
- /*
-@@ -119,6 +148,29 @@ minstrel_ht_get_group_idx(struct ieee802
- 			 !!(rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH));
- }
- 
-+struct minstrel_rate_stats *
-+minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
-+		      struct ieee80211_tx_rate *rate)
-+{
-+	int group, idx;
-+
-+	if (rate->flags & IEEE80211_TX_RC_MCS) {
-+		group = minstrel_ht_get_group_idx(rate);
-+		idx = rate->idx % MCS_GROUP_RATES;
-+	} else {
-+		group = MINSTREL_CCK_GROUP;
-+
-+		for (idx = 0; idx < ARRAY_SIZE(mp->cck_rates); idx++)
-+			if (rate->idx == mp->cck_rates[idx])
-+				break;
-+
-+		/* short preamble */
-+		if (!(mi->groups[group].supported & BIT(idx)))
-+			idx += 4;
-+	}
-+	return &mi->groups[group].rates[idx];
-+}
-+
- static inline struct minstrel_rate_stats *
- minstrel_get_ratestats(struct minstrel_ht_sta *mi, int index)
- {
-@@ -159,7 +211,7 @@ static void
- minstrel_ht_calc_tp(struct minstrel_ht_sta *mi, int group, int rate)
- {
- 	struct minstrel_rate_stats *mr;
--	unsigned int usecs;
-+	unsigned int usecs = 0;
- 
- 	mr = &mi->groups[group].rates[rate];
- 
-@@ -168,7 +220,9 @@ minstrel_ht_calc_tp(struct minstrel_ht_s
- 		return;
- 	}
- 
--	usecs = mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len);
-+	if (group != MINSTREL_CCK_GROUP)
-+		usecs = mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len);
-+
- 	usecs += minstrel_mcs_groups[group].duration[rate];
- 	mr->cur_tp = MINSTREL_TRUNC((1000000 / usecs) * mr->probability);
- }
-@@ -231,10 +285,6 @@ minstrel_ht_update_stats(struct minstrel
- 			if (!mr->cur_tp)
- 				continue;
- 
--			/* ignore the lowest rate of each single-stream group */
--			if (!i && minstrel_mcs_groups[group].streams == 1)
--				continue;
--
- 			if ((mr->cur_tp > cur_prob_tp && mr->probability >
- 			     MINSTREL_FRAC(3, 4)) || mr->probability > cur_prob) {
- 				mg->max_prob_rate = index;
-@@ -297,7 +347,7 @@ minstrel_ht_update_stats(struct minstrel
- }
- 
- static bool
--minstrel_ht_txstat_valid(struct ieee80211_tx_rate *rate)
-+minstrel_ht_txstat_valid(struct minstrel_priv *mp, struct ieee80211_tx_rate *rate)
- {
- 	if (rate->idx < 0)
- 		return false;
-@@ -305,7 +355,13 @@ minstrel_ht_txstat_valid(struct ieee8021
- 	if (!rate->count)
- 		return false;
- 
--	return !!(rate->flags & IEEE80211_TX_RC_MCS);
-+	if (rate->flags & IEEE80211_TX_RC_MCS)
-+		return true;
-+
-+	return rate->idx == mp->cck_rates[0] ||
-+	       rate->idx == mp->cck_rates[1] ||
-+	       rate->idx == mp->cck_rates[2] ||
-+	       rate->idx == mp->cck_rates[3];
- }
- 
- static void
-@@ -390,7 +446,6 @@ minstrel_ht_tx_status(void *priv, struct
- 	struct minstrel_rate_stats *rate, *rate2;
- 	struct minstrel_priv *mp = priv;
- 	bool last;
--	int group;
- 	int i;
- 
- 	if (!msp->is_ht)
-@@ -419,13 +474,12 @@ minstrel_ht_tx_status(void *priv, struct
- 	if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
- 		mi->sample_packets += info->status.ampdu_len;
- 
--	last = !minstrel_ht_txstat_valid(&ar[0]);
-+	last = !minstrel_ht_txstat_valid(mp, &ar[0]);
- 	for (i = 0; !last; i++) {
- 		last = (i == IEEE80211_TX_MAX_RATES - 1) ||
--		       !minstrel_ht_txstat_valid(&ar[i + 1]);
-+		       !minstrel_ht_txstat_valid(mp, &ar[i + 1]);
- 
--		group = minstrel_ht_get_group_idx(&ar[i]);
--		rate = &mi->groups[group].rates[ar[i].idx % 8];
-+		rate = minstrel_ht_get_stats(mp, mi, &ar[i]);
- 
- 		if (last)
- 			rate->success += info->status.ampdu_ack_len;
-@@ -451,7 +505,8 @@ minstrel_ht_tx_status(void *priv, struct
- 
- 	if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) {
- 		minstrel_ht_update_stats(mp, mi);
--		if (!(info->flags & IEEE80211_TX_CTL_AMPDU))
-+		if (!(info->flags & IEEE80211_TX_CTL_AMPDU) &&
-+		    mi->max_prob_rate / MCS_GROUP_RATES != MINSTREL_CCK_GROUP)
- 			minstrel_aggr_check(sta, skb);
- 	}
- }
-@@ -467,6 +522,7 @@ minstrel_calc_retransmit(struct minstrel
- 	unsigned int ctime = 0;
- 	unsigned int t_slot = 9; /* FIXME */
- 	unsigned int ampdu_len = MINSTREL_TRUNC(mi->avg_ampdu_len);
-+	unsigned int overhead = 0, overhead_rtscts = 0;
- 
- 	mr = minstrel_get_ratestats(mi, index);
- 	if (mr->probability < MINSTREL_FRAC(1, 10)) {
-@@ -488,9 +544,14 @@ minstrel_calc_retransmit(struct minstrel
- 	ctime += (t_slot * cw) >> 1;
- 	cw = min((cw << 1) | 1, mp->cw_max);
- 
-+	if (index / MCS_GROUP_RATES != MINSTREL_CCK_GROUP) {
-+		overhead = mi->overhead;
-+		overhead_rtscts = mi->overhead_rtscts;
-+	}
-+
- 	/* Total TX time for data and Contention after first 2 tries */
--	tx_time = ctime + 2 * (mi->overhead + tx_time_data);
--	tx_time_rtscts = ctime + 2 * (mi->overhead_rtscts + tx_time_data);
-+	tx_time = ctime + 2 * (overhead + tx_time_data);
-+	tx_time_rtscts = ctime + 2 * (overhead_rtscts + tx_time_data);
- 
- 	/* See how many more tries we can fit inside segment size */
- 	do {
-@@ -499,8 +560,8 @@ minstrel_calc_retransmit(struct minstrel
- 		cw = min((cw << 1) | 1, mp->cw_max);
- 
- 		/* Total TX time after this try */
--		tx_time += ctime + mi->overhead + tx_time_data;
--		tx_time_rtscts += ctime + mi->overhead_rtscts + tx_time_data;
-+		tx_time += ctime + overhead + tx_time_data;
-+		tx_time_rtscts += ctime + overhead_rtscts + tx_time_data;
- 
- 		if (tx_time_rtscts < mp->segment_size)
- 			mr->retry_count_rtscts++;
-@@ -530,9 +591,16 @@ minstrel_ht_set_rate(struct minstrel_pri
- 	else
- 		rate->count = mr->retry_count;
- 
--	rate->flags = IEEE80211_TX_RC_MCS | group->flags;
-+	rate->flags = 0;
- 	if (rtscts)
- 		rate->flags |= IEEE80211_TX_RC_USE_RTS_CTS;
-+
-+	if (index / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
-+		rate->idx = mp->cck_rates[index % ARRAY_SIZE(mp->cck_rates)];
-+		return;
-+	}
-+
-+	rate->flags |= IEEE80211_TX_RC_MCS | group->flags;
- 	rate->idx = index % MCS_GROUP_RATES + (group->streams - 1) * MCS_GROUP_RATES;
- }
- 
-@@ -596,6 +664,22 @@ minstrel_get_sample_rate(struct minstrel
- }
- 
- static void
-+minstrel_ht_check_cck_shortpreamble(struct minstrel_priv *mp,
-+				    struct minstrel_ht_sta *mi, bool val)
-+{
-+	u8 supported = mi->groups[MINSTREL_CCK_GROUP].supported;
-+
-+	if (!supported || !mi->cck_supported_short)
-+		return;
-+
-+	if (supported & (mi->cck_supported_short << (val * 4)))
-+		return;
-+
-+	supported ^= mi->cck_supported_short | (mi->cck_supported_short << 4);
-+	mi->groups[MINSTREL_CCK_GROUP].supported = supported;
-+}
-+
-+static void
- minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
-                      struct ieee80211_tx_rate_control *txrc)
- {
-@@ -614,6 +698,7 @@ minstrel_ht_get_rate(void *priv, struct 
- 		return mac80211_minstrel.get_rate(priv, sta, &msp->legacy, txrc);
- 
- 	info->flags |= mi->tx_flags;
-+	minstrel_ht_check_cck_shortpreamble(mp, mi, txrc->short_preamble);
- 
- 	/* Don't use EAPOL frames for sampling on non-mrr hw */
- 	if (mp->hw->max_rates == 1 &&
-@@ -687,6 +772,30 @@ minstrel_ht_get_rate(void *priv, struct 
- }
- 
- static void
-+minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
-+		       struct ieee80211_supported_band *sband,
-+		       struct ieee80211_sta *sta)
-+{
-+	int i;
-+
-+	if (sband->band != IEEE80211_BAND_2GHZ)
-+		return;
-+
-+	mi->cck_supported = 0;
-+	mi->cck_supported_short = 0;
-+	for (i = 0; i < 4; i++) {
-+		if (!rate_supported(sta, sband->band, mp->cck_rates[i]))
-+			continue;
-+
-+		mi->cck_supported |= BIT(i);
-+		if (sband->bitrates[i].flags & IEEE80211_RATE_SHORT_PREAMBLE)
-+			mi->cck_supported_short |= BIT(i);
-+	}
-+
-+	mi->groups[MINSTREL_CCK_GROUP].supported = mi->cck_supported;
-+}
-+
-+static void
- minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
-                         struct ieee80211_sta *sta, void *priv_sta)
- {
-@@ -706,7 +815,7 @@ minstrel_ht_update_caps(void *priv, stru
- 		goto use_legacy;
- 
- 	BUILD_BUG_ON(ARRAY_SIZE(minstrel_mcs_groups) !=
--		MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS);
-+		MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS + 1);
- 
- 	msp->is_ht = true;
- 	memset(mi, 0, sizeof(*mi));
-@@ -742,6 +851,11 @@ minstrel_ht_update_caps(void *priv, stru
- 		u16 req = 0;
- 
- 		mi->groups[i].supported = 0;
-+		if (i == MINSTREL_CCK_GROUP) {
-+			minstrel_ht_update_cck(mp, mi, sband, sta);
-+			continue;
-+		}
-+
- 		if (minstrel_mcs_groups[i].flags & IEEE80211_TX_RC_SHORT_GI) {
- 			if (minstrel_mcs_groups[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
- 				req |= IEEE80211_HT_CAP_SGI_40;
---- a/net/mac80211/rc80211_minstrel_ht.h
-+++ b/net/mac80211/rc80211_minstrel_ht.h
-@@ -107,8 +107,11 @@ struct minstrel_ht_sta {
- 	/* current MCS group to be sampled */
- 	u8 sample_group;
- 
-+	u8 cck_supported;
-+	u8 cck_supported_short;
-+
- 	/* MCS rate group info and statistics */
--	struct minstrel_mcs_group_data groups[MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS];
-+	struct minstrel_mcs_group_data groups[MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS + 1];
- };
- 
- struct minstrel_ht_sta_priv {
---- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
-+++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
-@@ -15,13 +15,76 @@
- #include "rc80211_minstrel.h"
- #include "rc80211_minstrel_ht.h"
- 
-+static char *
-+minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
-+{
-+	unsigned int max_mcs = MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS;
-+	const struct mcs_group *mg;
-+	unsigned int j, tp, prob, eprob;
-+	char htmode = '2';
-+	char gimode = 'L';
-+
-+	if (!mi->groups[i].supported)
-+		return p;
-+
-+	mg = &minstrel_mcs_groups[i];
-+	if (mg->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
-+		htmode = '4';
-+	if (mg->flags & IEEE80211_TX_RC_SHORT_GI)
-+		gimode = 'S';
-+
-+	for (j = 0; j < MCS_GROUP_RATES; j++) {
-+		struct minstrel_rate_stats *mr = &mi->groups[i].rates[j];
-+		static const int bitrates[4] = { 10, 20, 55, 110 };
-+		int idx = i * MCS_GROUP_RATES + j;
-+
-+		if (!(mi->groups[i].supported & BIT(j)))
-+			continue;
-+
-+		if (i == max_mcs)
-+			p += sprintf(p, "CCK/%cP   ", j < 4 ? 'L' : 'S');
-+		else
-+			p += sprintf(p, "HT%c0/%cGI ", htmode, gimode);
-+
-+		*(p++) = (idx == mi->max_tp_rate) ? 'T' : ' ';
-+		*(p++) = (idx == mi->max_tp_rate2) ? 't' : ' ';
-+		*(p++) = (idx == mi->max_prob_rate) ? 'P' : ' ';
-+
-+		if (i == max_mcs) {
-+			int r = bitrates[j % 4];
-+			p += sprintf(p, " %2u.%1uM", r / 10, r % 10);
-+		} else {
-+			p += sprintf(p, " MCS%-2u", (mg->streams - 1) *
-+					 MCS_GROUP_RATES + j);
-+		}
-+
-+		tp = mr->cur_tp / 10;
-+		prob = MINSTREL_TRUNC(mr->cur_prob * 1000);
-+		eprob = MINSTREL_TRUNC(mr->probability * 1000);
-+
-+		p += sprintf(p, "      %6u.%1u   %6u.%1u    %6u.%1u    "
-+				"%3u            %3u(%3u)  %8llu    %8llu\n",
-+				tp / 10, tp % 10,
-+				eprob / 10, eprob % 10,
-+				prob / 10, prob % 10,
-+				mr->retry_count,
-+				mr->last_success,
-+				mr->last_attempts,
-+				(unsigned long long)mr->succ_hist,
-+				(unsigned long long)mr->att_hist);
-+	}
-+
-+	return p;
-+}
-+
- static int
- minstrel_ht_stats_open(struct inode *inode, struct file *file)
- {
- 	struct minstrel_ht_sta_priv *msp = inode->i_private;
- 	struct minstrel_ht_sta *mi = &msp->ht;
- 	struct minstrel_debugfs_info *ms;
--	unsigned int i, j, tp, prob, eprob;
-+	unsigned int i;
-+	unsigned int max_mcs = MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS;
- 	char *p;
- 	int ret;
- 
-@@ -38,50 +101,13 @@ minstrel_ht_stats_open(struct inode *ino
- 
- 	file->private_data = ms;
- 	p = ms->buf;
--	p += sprintf(p, "type      rate     throughput  ewma prob   this prob  "
--			"this succ/attempt   success    attempts\n");
--	for (i = 0; i < MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS; i++) {
--		char htmode = '2';
--		char gimode = 'L';
--
--		if (!mi->groups[i].supported)
--			continue;
--
--		if (minstrel_mcs_groups[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
--			htmode = '4';
--		if (minstrel_mcs_groups[i].flags & IEEE80211_TX_RC_SHORT_GI)
--			gimode = 'S';
--
--		for (j = 0; j < MCS_GROUP_RATES; j++) {
--			struct minstrel_rate_stats *mr = &mi->groups[i].rates[j];
--			int idx = i * MCS_GROUP_RATES + j;
-+	p += sprintf(p, "type         rate     throughput  ewma prob   this prob  "
-+			"retry   this succ/attempt   success    attempts\n");
- 
--			if (!(mi->groups[i].supported & BIT(j)))
--				continue;
-+	p = minstrel_ht_stats_dump(mi, max_mcs, p);
-+	for (i = 0; i < max_mcs; i++)
-+		p = minstrel_ht_stats_dump(mi, i, p);
- 
--			p += sprintf(p, "HT%c0/%cGI ", htmode, gimode);
--
--			*(p++) = (idx == mi->max_tp_rate) ? 'T' : ' ';
--			*(p++) = (idx == mi->max_tp_rate2) ? 't' : ' ';
--			*(p++) = (idx == mi->max_prob_rate) ? 'P' : ' ';
--			p += sprintf(p, "MCS%-2u", (minstrel_mcs_groups[i].streams - 1) *
--					MCS_GROUP_RATES + j);
--
--			tp = mr->cur_tp / 10;
--			prob = MINSTREL_TRUNC(mr->cur_prob * 1000);
--			eprob = MINSTREL_TRUNC(mr->probability * 1000);
--
--			p += sprintf(p, "  %6u.%1u   %6u.%1u   %6u.%1u        "
--					"%3u(%3u)   %8llu    %8llu\n",
--					tp / 10, tp % 10,
--					eprob / 10, eprob % 10,
--					prob / 10, prob % 10,
--					mr->last_success,
--					mr->last_attempts,
--					(unsigned long long)mr->succ_hist,
--					(unsigned long long)mr->att_hist);
--		}
--	}
- 	p += sprintf(p, "\nTotal packet count::    ideal %d      "
- 			"lookaround %d\n",
- 			max(0, (int) mi->total_packets - (int) mi->sample_packets),
---- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
-@@ -1067,15 +1067,19 @@ static bool ath9k_rx_prepare(struct ath9
- 
- 	last_rssi = priv->rx.last_rssi;
- 
--	if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
--		rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi,
--						     ATH_RSSI_EP_MULTIPLIER);
-+	if (ieee80211_is_beacon(hdr->frame_control) &&
-+	    !is_zero_ether_addr(common->curbssid) &&
-+	    ether_addr_equal(hdr->addr3, common->curbssid)) {
-+		s8 rssi = rxbuf->rxstatus.rs_rssi;
- 
--	if (rxbuf->rxstatus.rs_rssi < 0)
--		rxbuf->rxstatus.rs_rssi = 0;
-+		if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
-+			rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER);
- 
--	if (ieee80211_is_beacon(fc))
--		priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi;
-+		if (rssi < 0)
-+			rssi = 0;
-+
-+		priv->ah->stats.avgbrssi = rssi;
-+	}
- 
- 	rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp);
- 	rx_status->band = hw->conf.channel->band;
---- a/drivers/net/wireless/ath/ath9k/common.h
-+++ b/drivers/net/wireless/ath/ath9k/common.h
-@@ -27,7 +27,7 @@
- #define WME_MAX_BA              WME_BA_BMP_SIZE
- #define ATH_TID_MAX_BUFS        (2 * WME_MAX_BA)
- 
--#define ATH_RSSI_DUMMY_MARKER   0x127
-+#define ATH_RSSI_DUMMY_MARKER   127
- #define ATH_RSSI_LPF_LEN 		10
- #define RSSI_LPF_THRESHOLD		-20
- #define ATH_RSSI_EP_MULTIPLIER     (1<<7)

+ 1 - 1
package/mac80211/patches/310-ap_scan.patch

@@ -1,6 +1,6 @@
 --- a/net/mac80211/cfg.c
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1953,7 +1953,7 @@ static int ieee80211_scan(struct wiphy *
+@@ -2009,7 +2009,7 @@ static int ieee80211_scan(struct wiphy *
  		 * the  frames sent while scanning on other channel will be
  		 * the  frames sent while scanning on other channel will be
  		 * lost)
  		 * lost)
  		 */
  		 */

+ 1 - 1
package/mac80211/patches/401-ath9k_blink_default.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -45,7 +45,7 @@ int ath9k_modparam_nohwcrypt;
+@@ -46,7 +46,7 @@ int ath9k_modparam_nohwcrypt;
  module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
  module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
  MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
  MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
  
  

+ 1 - 1
package/mac80211/patches/403-ath_regd_optional.patch

@@ -33,7 +33,7 @@
  	if (!wiphy->bands[IEEE80211_BAND_5GHZ])
  	if (!wiphy->bands[IEEE80211_BAND_5GHZ])
  		return;
  		return;
  
  
-@@ -507,6 +519,10 @@ ath_regd_init_wiphy(struct ath_regulator
+@@ -505,6 +517,10 @@ ath_regd_init_wiphy(struct ath_regulator
  {
  {
  	const struct ieee80211_regdomain *regd;
  	const struct ieee80211_regdomain *regd;
  
  

+ 2 - 2
package/mac80211/patches/405-regd_no_assoc_hints.patch

@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -1719,6 +1719,8 @@ void regulatory_hint_11d(struct wiphy *w
+@@ -1730,6 +1730,8 @@ void regulatory_hint_11d(struct wiphy *w
  	enum environment_cap env = ENVIRON_ANY;
  	enum environment_cap env = ENVIRON_ANY;
  	struct regulatory_request *request, *lr;
  	struct regulatory_request *request, *lr;
  
  
@@ -9,7 +9,7 @@
  	mutex_lock(&reg_mutex);
  	mutex_lock(&reg_mutex);
  	lr = get_last_request();
  	lr = get_last_request();
  
  
-@@ -1915,6 +1917,7 @@ static void restore_regulatory_settings(
+@@ -1926,6 +1928,7 @@ static void restore_regulatory_settings(
  
  
  void regulatory_hint_disconnect(void)
  void regulatory_hint_disconnect(void)
  {
  {

+ 1 - 1
package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -722,6 +722,7 @@ static const struct ieee80211_iface_limi
+@@ -727,6 +727,7 @@ static const struct ieee80211_iface_limi
  #endif
  #endif
  				 BIT(NL80211_IFTYPE_AP) |
  				 BIT(NL80211_IFTYPE_AP) |
  				 BIT(NL80211_IFTYPE_P2P_GO) },
  				 BIT(NL80211_IFTYPE_P2P_GO) },

+ 3 - 3
package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

@@ -18,7 +18,7 @@
  		goto end;
  		goto end;
 --- a/drivers/net/wireless/ath/ath5k/base.c
 --- a/drivers/net/wireless/ath/ath5k/base.c
 +++ b/drivers/net/wireless/ath/ath5k/base.c
 +++ b/drivers/net/wireless/ath/ath5k/base.c
-@@ -1867,7 +1867,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
+@@ -1868,7 +1868,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
  	}
  	}
  
  
  	if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
  	if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
@@ -27,7 +27,7 @@
  			ah->opmode == NL80211_IFTYPE_MESH_POINT) {
  			ah->opmode == NL80211_IFTYPE_MESH_POINT) {
  		u64 tsf = ath5k_hw_get_tsf64(ah);
  		u64 tsf = ath5k_hw_get_tsf64(ah);
  		u32 tsftu = TSF_TO_TU(tsf);
  		u32 tsftu = TSF_TO_TU(tsf);
-@@ -1953,7 +1953,7 @@ ath5k_beacon_update_timers(struct ath5k_
+@@ -1954,7 +1954,7 @@ ath5k_beacon_update_timers(struct ath5k_
  
  
  	intval = ah->bintval & AR5K_BEACON_PERIOD;
  	intval = ah->bintval & AR5K_BEACON_PERIOD;
  	if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
  	if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
@@ -36,7 +36,7 @@
  		intval /= ATH_BCBUF;	/* staggered multi-bss beacons */
  		intval /= ATH_BCBUF;	/* staggered multi-bss beacons */
  		if (intval < 15)
  		if (intval < 15)
  			ATH5K_WARN(ah, "intval %u is too low, min 15\n",
  			ATH5K_WARN(ah, "intval %u is too low, min 15\n",
-@@ -2417,6 +2417,7 @@ static const struct ieee80211_iface_limi
+@@ -2418,6 +2418,7 @@ static const struct ieee80211_iface_limi
  				 BIT(NL80211_IFTYPE_MESH_POINT) |
  				 BIT(NL80211_IFTYPE_MESH_POINT) |
  #endif
  #endif
  				 BIT(NL80211_IFTYPE_AP) },
  				 BIT(NL80211_IFTYPE_AP) },

+ 2 - 2
package/mac80211/patches/420-ath5k_disable_fast_cc.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/reset.c
 --- a/drivers/net/wireless/ath/ath5k/reset.c
 +++ b/drivers/net/wireless/ath/ath5k/reset.c
 +++ b/drivers/net/wireless/ath/ath5k/reset.c
-@@ -1156,6 +1156,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
+@@ -1158,6 +1158,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
  	tsf_lo = 0;
  	tsf_lo = 0;
  	mode = 0;
  	mode = 0;
  
  
@@ -8,7 +8,7 @@
  	/*
  	/*
  	 * Sanity check for fast flag
  	 * Sanity check for fast flag
  	 * Fast channel change only available
  	 * Fast channel change only available
-@@ -1163,6 +1164,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
+@@ -1165,6 +1166,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
  	 */
  	 */
  	if (fast && (ah->ah_radio != AR5K_RF2413) &&
  	if (fast && (ah->ah_radio != AR5K_RF2413) &&
  	(ah->ah_radio != AR5K_RF5413))
  	(ah->ah_radio != AR5K_RF5413))

+ 2 - 2
package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1717,6 +1717,53 @@ void ath9k_get_et_stats(struct ieee80211
+@@ -2003,6 +2003,53 @@ void ath9k_get_et_stats(struct ieee80211
  	WARN_ON(i != ATH9K_SSTATS_LEN);
  	WARN_ON(i != ATH9K_SSTATS_LEN);
  }
  }
  
  
@@ -54,7 +54,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  int ath9k_init_debug(struct ath_hw *ah)
  {
  {
  	struct ath_common *common = ath9k_hw_common(ah);
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -1734,6 +1781,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2020,6 +2067,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
  
  	ath9k_dfs_init_debug(sc);
  	ath9k_dfs_init_debug(sc);
  
  

+ 2 - 2
package/mac80211/patches/501-ath9k-eeprom_endianess.patch

@@ -71,7 +71,7 @@
  
  
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -700,6 +700,7 @@ enum ath_cal_list {
+@@ -740,6 +740,7 @@ enum ath_cal_list {
  #define AH_USE_EEPROM   0x1
  #define AH_USE_EEPROM   0x1
  #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
  #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
  #define AH_FASTCC       0x4
  #define AH_FASTCC       0x4
@@ -81,7 +81,7 @@
  	struct ath_ops reg_ops;
  	struct ath_ops reg_ops;
 --- a/drivers/net/wireless/ath/ath9k/init.c
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -582,6 +582,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s
  		ah->is_clk_25mhz = pdata->is_clk_25mhz;
  		ah->is_clk_25mhz = pdata->is_clk_25mhz;
  		ah->get_mac_revision = pdata->get_mac_revision;
  		ah->get_mac_revision = pdata->get_mac_revision;
  		ah->external_reset = pdata->external_reset;
  		ah->external_reset = pdata->external_reset;

+ 1 - 1
package/mac80211/patches/502-ath9k_ahb_init.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -955,23 +955,23 @@ static int __init ath9k_init(void)
+@@ -965,23 +965,23 @@ static int __init ath9k_init(void)
  		goto err_out;
  		goto err_out;
  	}
  	}
  
  

+ 10 - 10
package/mac80211/patches/512-ath9k_channelbw_debugfs.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -670,6 +670,7 @@ struct ath_softc {
+@@ -690,6 +690,7 @@ struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct ieee80211_hw *hw;
  	struct device *dev;
  	struct device *dev;
  
  
@@ -8,9 +8,9 @@
  	struct survey_info *cur_survey;
  	struct survey_info *cur_survey;
  	struct survey_info survey[ATH9K_NUM_CHANNELS];
  	struct survey_info survey[ATH9K_NUM_CHANNELS];
  
  
-@@ -742,6 +743,7 @@ struct ath_softc {
- #endif
- };
+@@ -894,6 +895,7 @@ struct fft_sample_ht20 {
+ 	u8 data[SPECTRAL_HT20_NUM_BINS];
+ } __packed;
  
  
 +int ath9k_config(struct ieee80211_hw *hw, u32 changed);
 +int ath9k_config(struct ieee80211_hw *hw, u32 changed);
  void ath9k_tasklet(unsigned long data);
  void ath9k_tasklet(unsigned long data);
@@ -18,7 +18,7 @@
  
  
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1764,6 +1764,50 @@ static const struct file_operations fops
+@@ -2050,6 +2050,50 @@ static const struct file_operations fops
  	.owner = THIS_MODULE
  	.owner = THIS_MODULE
  };
  };
  
  
@@ -69,7 +69,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  int ath9k_init_debug(struct ath_hw *ah)
  {
  {
  	struct ath_common *common = ath9k_hw_common(ah);
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -1783,6 +1827,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2069,6 +2113,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
  
  	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
  	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
  			    &fops_eeprom);
  			    &fops_eeprom);
@@ -80,8 +80,8 @@
  	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
  	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- a/drivers/net/wireless/ath/ath9k/main.c
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1065,7 +1065,7 @@ static void ath9k_disable_ps(struct ath_
- 	ath_dbg(common, PS, "PowerSave disabled\n");
+@@ -1131,7 +1131,7 @@ int ath9k_spectral_scan_config(struct ie
+ 	return 0;
  }
  }
  
  
 -static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 -static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
@@ -89,7 +89,7 @@
  {
  {
  	struct ath_softc *sc = hw->priv;
  	struct ath_softc *sc = hw->priv;
  	struct ath_hw *ah = sc->sc_ah;
  	struct ath_hw *ah = sc->sc_ah;
-@@ -1119,9 +1119,11 @@ static int ath9k_config(struct ieee80211
+@@ -1185,9 +1185,11 @@ static int ath9k_config(struct ieee80211
  
  
  	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
  	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
  		struct ieee80211_channel *curchan = hw->conf.channel;
  		struct ieee80211_channel *curchan = hw->conf.channel;
@@ -101,7 +101,7 @@
  
  
  		if (ah->curchan)
  		if (ah->curchan)
  			old_pos = ah->curchan - &ah->channels[0];
  			old_pos = ah->curchan - &ah->channels[0];
-@@ -1164,7 +1166,23 @@ static int ath9k_config(struct ieee80211
+@@ -1230,7 +1232,23 @@ static int ath9k_config(struct ieee80211
  			memset(&sc->survey[pos], 0, sizeof(struct survey_info));
  			memset(&sc->survey[pos], 0, sizeof(struct survey_info));
  		}
  		}
  
  

+ 1 - 1
package/mac80211/patches/513-mac80211_reduce_txqueuelen.patch

@@ -1,6 +1,6 @@
 --- a/net/mac80211/iface.c
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -1033,6 +1033,7 @@ static const struct net_device_ops ieee8
+@@ -989,6 +989,7 @@ static const struct net_device_ops ieee8
  static void ieee80211_if_setup(struct net_device *dev)
  static void ieee80211_if_setup(struct net_device *dev)
  {
  {
  	ether_setup(dev);
  	ether_setup(dev);

+ 3 - 3
package/mac80211/patches/520-mac80211_cur_txpower.patch

@@ -1,6 +1,6 @@
 --- a/include/net/mac80211.h
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1508,6 +1508,7 @@ struct ieee80211_hw {
+@@ -1554,6 +1554,7 @@ struct ieee80211_hw {
  	u8 max_tx_aggregation_subframes;
  	u8 max_tx_aggregation_subframes;
  	u8 offchannel_tx_hw_queue;
  	u8 offchannel_tx_hw_queue;
  	u8 radiotap_mcs_details;
  	u8 radiotap_mcs_details;
@@ -10,7 +10,7 @@
  };
  };
 --- a/net/mac80211/cfg.c
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2133,7 +2133,9 @@ static int ieee80211_get_tx_power(struct
+@@ -2190,7 +2190,9 @@ static int ieee80211_get_tx_power(struct
  	struct ieee80211_local *local = wiphy_priv(wiphy);
  	struct ieee80211_local *local = wiphy_priv(wiphy);
  	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  
  
@@ -23,7 +23,7 @@
  		*dbm = sdata->vif.bss_conf.txpower;
  		*dbm = sdata->vif.bss_conf.txpower;
 --- a/net/mac80211/main.c
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -167,6 +167,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -166,6 +166,7 @@ static u32 ieee80211_hw_conf_chan(struct
  
  
  	if (local->hw.conf.power_level != power) {
  	if (local->hw.conf.power_level != power) {
  		changed |= IEEE80211_CONF_CHANGE_POWER;
  		changed |= IEEE80211_CONF_CHANGE_POWER;

+ 2 - 2
package/mac80211/patches/521-ath9k_cur_txpower.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1189,6 +1189,8 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1255,6 +1255,8 @@ int ath9k_config(struct ieee80211_hw *hw
  			return -EINVAL;
  			return -EINVAL;
  		}
  		}
  
  
@@ -9,7 +9,7 @@
  		/*
  		/*
  		 * The most recent snapshot of channel->noisefloor for the old
  		 * The most recent snapshot of channel->noisefloor for the old
  		 * channel is only available after the hardware reset. Copy it to
  		 * channel is only available after the hardware reset. Copy it to
-@@ -1203,6 +1205,7 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1274,6 +1276,7 @@ int ath9k_config(struct ieee80211_hw *hw
  		sc->config.txpowlimit = 2 * conf->power_level;
  		sc->config.txpowlimit = 2 * conf->power_level;
  		ath9k_cmn_update_txpow(ah, sc->curtxpow,
  		ath9k_cmn_update_txpow(ah, sc->curtxpow,
  				       sc->config.txpowlimit, &sc->curtxpow);
  				       sc->config.txpowlimit, &sc->curtxpow);

+ 42 - 33
package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch

@@ -1,6 +1,6 @@
 --- a/include/net/mac80211.h
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -816,6 +816,9 @@ enum mac80211_rx_flags {
+@@ -839,6 +839,9 @@ enum mac80211_rx_flags {
   * @signal: signal strength when receiving this frame, either in dBm, in dB or
   * @signal: signal strength when receiving this frame, either in dBm, in dB or
   *	unspecified depending on the hardware capabilities flags
   *	unspecified depending on the hardware capabilities flags
   *	@IEEE80211_HW_SIGNAL_*
   *	@IEEE80211_HW_SIGNAL_*
@@ -10,7 +10,7 @@
   * @antenna: antenna used
   * @antenna: antenna used
   * @rate_idx: index of data rate into band's supported rates or MCS index if
   * @rate_idx: index of data rate into band's supported rates or MCS index if
   *	HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
   *	HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
-@@ -847,6 +850,8 @@ struct ieee80211_rx_status {
+@@ -870,6 +873,8 @@ struct ieee80211_rx_status {
  	u8 band;
  	u8 band;
  	u8 antenna;
  	u8 antenna;
  	s8 signal;
  	s8 signal;
@@ -21,7 +21,7 @@
  	u8 vendor_radiotap_oui[3];
  	u8 vendor_radiotap_oui[3];
 --- a/net/mac80211/sta_info.h
 --- a/net/mac80211/sta_info.h
 +++ b/net/mac80211/sta_info.h
 +++ b/net/mac80211/sta_info.h
-@@ -335,6 +335,11 @@ struct sta_info {
+@@ -342,6 +342,11 @@ struct sta_info {
  	int last_signal;
  	int last_signal;
  	struct ewma avg_signal;
  	struct ewma avg_signal;
  	int last_ack_signal;
  	int last_ack_signal;
@@ -35,7 +35,7 @@
  
  
 --- a/net/mac80211/rx.c
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -1375,6 +1375,7 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1383,6 +1383,7 @@ ieee80211_rx_h_sta_process(struct ieee80
  	struct sk_buff *skb = rx->skb;
  	struct sk_buff *skb = rx->skb;
  	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -43,7 +43,7 @@
  
  
  	if (!sta)
  	if (!sta)
  		return RX_CONTINUE;
  		return RX_CONTINUE;
-@@ -1425,6 +1426,19 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1433,6 +1434,19 @@ ieee80211_rx_h_sta_process(struct ieee80
  		ewma_add(&sta->avg_signal, -status->signal);
  		ewma_add(&sta->avg_signal, -status->signal);
  	}
  	}
  
  
@@ -65,7 +65,7 @@
  	 * exchange sequence.
  	 * exchange sequence.
 --- a/net/mac80211/sta_info.c
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -356,6 +356,8 @@ struct sta_info *sta_info_alloc(struct i
+@@ -353,6 +353,8 @@ struct sta_info *sta_info_alloc(struct i
  	do_posix_clock_monotonic_gettime(&uptime);
  	do_posix_clock_monotonic_gettime(&uptime);
  	sta->last_connected = uptime.tv_sec;
  	sta->last_connected = uptime.tv_sec;
  	ewma_init(&sta->avg_signal, 1024, 8);
  	ewma_init(&sta->avg_signal, 1024, 8);
@@ -76,25 +76,25 @@
  		kfree(sta);
  		kfree(sta);
 --- a/include/net/cfg80211.h
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -653,6 +653,8 @@ struct station_parameters {
-  * @STATION_INFO_STA_FLAGS: @sta_flags filled
-  * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled
-  * @STATION_INFO_T_OFFSET: @t_offset filled
+@@ -721,6 +721,8 @@ struct station_parameters {
+  * @STATION_INFO_LOCAL_PM: @local_pm filled
+  * @STATION_INFO_PEER_PM: @peer_pm filled
+  * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled
 + * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled
 + * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled
 + * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled
 + * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled
   */
   */
  enum station_info_flags {
  enum station_info_flags {
  	STATION_INFO_INACTIVE_TIME	= 1<<0,
  	STATION_INFO_INACTIVE_TIME	= 1<<0,
-@@ -676,6 +678,8 @@ enum station_info_flags {
- 	STATION_INFO_STA_FLAGS		= 1<<18,
- 	STATION_INFO_BEACON_LOSS_COUNT	= 1<<19,
- 	STATION_INFO_T_OFFSET		= 1<<20,
-+	STATION_INFO_CHAIN_SIGNAL	= 1<<21,
-+	STATION_INFO_CHAIN_SIGNAL_AVG	= 1<<22,
+@@ -749,6 +751,8 @@ enum station_info_flags {
+ 	STATION_INFO_NONPEER_PM		= 1<<23,
+ 	STATION_INFO_RX_BYTES64		= 1<<24,
+ 	STATION_INFO_TX_BYTES64		= 1<<25,
++	STATION_INFO_CHAIN_SIGNAL	= 1<<26,
++	STATION_INFO_CHAIN_SIGNAL_AVG	= 1<<27,
  };
  };
  
  
  /**
  /**
-@@ -769,6 +773,9 @@ struct sta_bss_parameters {
+@@ -842,6 +846,9 @@ struct sta_bss_parameters {
   *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
   *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
   * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
   * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
   *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
   *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
@@ -104,7 +104,7 @@
   * @txrate: current unicast bitrate from this station
   * @txrate: current unicast bitrate from this station
   * @rxrate: current unicast bitrate to this station
   * @rxrate: current unicast bitrate to this station
   * @rx_packets: packets received from this station
   * @rx_packets: packets received from this station
-@@ -801,6 +808,11 @@ struct station_info {
+@@ -877,6 +884,11 @@ struct station_info {
  	u8 plink_state;
  	u8 plink_state;
  	s8 signal;
  	s8 signal;
  	s8 signal_avg;
  	s8 signal_avg;
@@ -135,7 +135,7 @@
  	u8 rs_num_delims;
  	u8 rs_num_delims;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -936,6 +936,7 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -937,6 +937,7 @@ static int ath9k_rx_skb_preprocess(struc
  				   bool *decrypt_error)
  				   bool *decrypt_error)
  {
  {
  	struct ath_hw *ah = common->ah;
  	struct ath_hw *ah = common->ah;
@@ -143,7 +143,7 @@
  
  
  	/*
  	/*
  	 * everything but the rate is checked here, the rate check is done
  	 * everything but the rate is checked here, the rate check is done
-@@ -961,6 +962,20 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -962,6 +963,20 @@ static int ath9k_rx_skb_preprocess(struc
  	if (rx_stats->rs_moreaggr)
  	if (rx_stats->rs_moreaggr)
  		rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  		rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  
  
@@ -164,6 +164,15 @@
  	return 0;
  	return 0;
  }
  }
  
  
+@@ -1070,7 +1085,7 @@ static int ath_process_fft(struct ath_so
+ 	fft_sample.tlv.length = __cpu_to_be16(length);
+ 
+ 	fft_sample.freq = __cpu_to_be16(ah->curchan->chan->center_freq);
+-	fft_sample.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
++	fft_sample.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
+ 	fft_sample.noise = ah->noise;
+ 
+ 	switch (len - SPECTRAL_HT20_TOTAL_DATA_LEN) {
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 @@ -475,12 +475,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
 @@ -475,12 +475,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
@@ -227,7 +236,7 @@
  	if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
  	if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -938,12 +938,12 @@ void ath_debug_stat_rx(struct ath_softc 
+@@ -940,12 +940,12 @@ void ath_debug_stat_rx(struct ath_softc 
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  	spin_lock(&sc->debug.samp_lock);
  	spin_lock(&sc->debug.samp_lock);
  	RX_SAMP_DBG(jiffies) = jiffies;
  	RX_SAMP_DBG(jiffies) = jiffies;
@@ -248,19 +257,19 @@
  	RX_SAMP_DBG(rate) = rs->rs_rate;
  	RX_SAMP_DBG(rate) = rs->rs_rate;
 --- a/include/uapi/linux/nl80211.h
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -1838,6 +1838,8 @@ enum nl80211_sta_bss_param {
-  * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
-  * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
-  * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64)
+@@ -1918,6 +1918,8 @@ enum nl80211_sta_bss_param {
+  * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode
+  * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards
+  *	non-peer STA
 + * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU
 + * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU
 + * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average
 + * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average
   * @__NL80211_STA_INFO_AFTER_LAST: internal
   * @__NL80211_STA_INFO_AFTER_LAST: internal
   * @NL80211_STA_INFO_MAX: highest possible station info attribute
   * @NL80211_STA_INFO_MAX: highest possible station info attribute
   */
   */
-@@ -1862,6 +1864,8 @@ enum nl80211_sta_info {
- 	NL80211_STA_INFO_STA_FLAGS,
- 	NL80211_STA_INFO_BEACON_LOSS,
- 	NL80211_STA_INFO_T_OFFSET,
+@@ -1947,6 +1949,8 @@ enum nl80211_sta_info {
+ 	NL80211_STA_INFO_NONPEER_PM,
+ 	NL80211_STA_INFO_RX_BYTES64,
+ 	NL80211_STA_INFO_TX_BYTES64,
 +	NL80211_STA_INFO_CHAIN_SIGNAL,
 +	NL80211_STA_INFO_CHAIN_SIGNAL,
 +	NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
 +	NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
  
  
@@ -268,7 +277,7 @@
  	__NL80211_STA_INFO_AFTER_LAST,
  	__NL80211_STA_INFO_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -2910,6 +2910,32 @@ static bool nl80211_put_sta_rate(struct 
+@@ -3082,6 +3082,32 @@ static bool nl80211_put_sta_rate(struct 
  	return true;
  	return true;
  }
  }
  
  
@@ -301,7 +310,7 @@
  static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,
  static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,
  				int flags,
  				int flags,
  				struct cfg80211_registered_device *rdev,
  				struct cfg80211_registered_device *rdev,
-@@ -2971,6 +2997,18 @@ static int nl80211_send_station(struct s
+@@ -3153,6 +3179,18 @@ static int nl80211_send_station(struct s
  	default:
  	default:
  		break;
  		break;
  	}
  	}
@@ -322,7 +331,7 @@
  					  NL80211_STA_INFO_TX_BITRATE))
  					  NL80211_STA_INFO_TX_BITRATE))
 --- a/net/mac80211/cfg.c
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -435,6 +435,7 @@ static void sta_set_sinfo(struct sta_inf
+@@ -445,6 +445,7 @@ static void sta_set_sinfo(struct sta_inf
  	struct ieee80211_sub_if_data *sdata = sta->sdata;
  	struct ieee80211_sub_if_data *sdata = sta->sdata;
  	struct ieee80211_local *local = sdata->local;
  	struct ieee80211_local *local = sdata->local;
  	struct timespec uptime;
  	struct timespec uptime;
@@ -330,7 +339,7 @@
  
  
  	sinfo->generation = sdata->local->sta_generation;
  	sinfo->generation = sdata->local->sta_generation;
  
  
-@@ -474,6 +475,17 @@ static void sta_set_sinfo(struct sta_inf
+@@ -484,6 +485,17 @@ static void sta_set_sinfo(struct sta_inf
  			sinfo->signal = (s8)sta->last_signal;
  			sinfo->signal = (s8)sta->last_signal;
  		sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
  		sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
  	}
  	}

+ 19 - 19
package/mac80211/patches/523-mac80211_configure_antenna_gain.patch

@@ -1,6 +1,6 @@
 --- a/include/net/mac80211.h
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -955,6 +955,7 @@ enum ieee80211_smps_mode {
+@@ -978,6 +978,7 @@ enum ieee80211_smps_mode {
   *
   *
   * @power_level: requested transmit power (in dBm), backward compatibility
   * @power_level: requested transmit power (in dBm), backward compatibility
   *	value only that is set to the minimum of all interfaces
   *	value only that is set to the minimum of all interfaces
@@ -8,7 +8,7 @@
   *
   *
   * @channel: the channel to tune to
   * @channel: the channel to tune to
   * @channel_type: the channel (HT) type
   * @channel_type: the channel (HT) type
-@@ -976,6 +977,7 @@ struct ieee80211_conf {
+@@ -1000,6 +1001,7 @@ struct ieee80211_conf {
  	u32 flags;
  	u32 flags;
  	int power_level, dynamic_ps_timeout;
  	int power_level, dynamic_ps_timeout;
  	int max_sleep_period;
  	int max_sleep_period;
@@ -18,8 +18,8 @@
  	u8 ps_dtim_period;
  	u8 ps_dtim_period;
 --- a/net/mac80211/ieee80211_i.h
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1144,6 +1144,7 @@ struct ieee80211_local {
- 	bool disable_dynamic_ps;
+@@ -1116,6 +1116,7 @@ struct ieee80211_local {
+ 	int dynamic_ps_forced_timeout;
  
  
  	int user_power_level; /* in dBm, for all interfaces */
  	int user_power_level; /* in dBm, for all interfaces */
 +	int user_antenna_gain; /* in dBi */
 +	int user_antenna_gain; /* in dBi */
@@ -28,9 +28,9 @@
  
  
 --- a/include/uapi/linux/nl80211.h
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -1580,6 +1580,8 @@ enum nl80211_attrs {
- 	NL80211_ATTR_P2P_CTWINDOW,
- 	NL80211_ATTR_P2P_OPPPS,
+@@ -1654,6 +1654,8 @@ enum nl80211_attrs {
+ 	NL80211_ATTR_STA_CAPABILITY,
+ 	NL80211_ATTR_STA_EXT_CAPABILITY,
  
  
 +	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +
 +
@@ -39,15 +39,15 @@
  	__NL80211_ATTR_AFTER_LAST,
  	__NL80211_ATTR_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -365,6 +365,7 @@ static const struct nla_policy nl80211_p
- 	[NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
- 	[NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
- 	[NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
+@@ -370,6 +370,7 @@ static const struct nla_policy nl80211_p
+ 	[NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
+ 	[NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
+ 	[NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
 +	[NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
 +	[NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
  };
  };
  
  
  /* policy for the key attributes */
  /* policy for the key attributes */
-@@ -1652,6 +1653,22 @@ static int nl80211_set_wiphy(struct sk_b
+@@ -1706,6 +1707,22 @@ static int nl80211_set_wiphy(struct sk_b
  			goto bad_res;
  			goto bad_res;
  	}
  	}
  
  
@@ -72,7 +72,7 @@
  		u32 tx_ant, rx_ant;
  		u32 tx_ant, rx_ant;
 --- a/net/mac80211/cfg.c
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2155,6 +2155,19 @@ static int ieee80211_get_tx_power(struct
+@@ -2212,6 +2212,19 @@ static int ieee80211_get_tx_power(struct
  	return 0;
  	return 0;
  }
  }
  
  
@@ -92,7 +92,7 @@
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  				  const u8 *addr)
  				  const u8 *addr)
  {
  {
-@@ -3278,6 +3291,7 @@ struct cfg80211_ops mac80211_config_ops 
+@@ -3369,6 +3382,7 @@ struct cfg80211_ops mac80211_config_ops 
  	.set_wiphy_params = ieee80211_set_wiphy_params,
  	.set_wiphy_params = ieee80211_set_wiphy_params,
  	.set_tx_power = ieee80211_set_tx_power,
  	.set_tx_power = ieee80211_set_tx_power,
  	.get_tx_power = ieee80211_get_tx_power,
  	.get_tx_power = ieee80211_get_tx_power,
@@ -102,7 +102,7 @@
  	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
  	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
 --- a/include/net/cfg80211.h
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -1693,6 +1693,7 @@ struct cfg80211_gtk_rekey_data {
+@@ -1862,6 +1862,7 @@ struct cfg80211_gtk_rekey_data {
   *	(as advertised by the nl80211 feature flag.)
   *	(as advertised by the nl80211 feature flag.)
   * @get_tx_power: store the current TX power into the dbm variable;
   * @get_tx_power: store the current TX power into the dbm variable;
   *	return 0 if successful
   *	return 0 if successful
@@ -110,7 +110,7 @@
   *
   *
   * @set_wds_peer: set the WDS peer for a WDS interface
   * @set_wds_peer: set the WDS peer for a WDS interface
   *
   *
-@@ -1893,6 +1894,7 @@ struct cfg80211_ops {
+@@ -2071,6 +2072,7 @@ struct cfg80211_ops {
  				enum nl80211_tx_power_setting type, int mbm);
  				enum nl80211_tx_power_setting type, int mbm);
  	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
  	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
  				int *dbm);
  				int *dbm);
@@ -120,7 +120,7 @@
  				const u8 *addr);
  				const u8 *addr);
 --- a/net/mac80211/main.c
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -102,7 +102,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
  	struct ieee80211_sub_if_data *sdata;
  	struct ieee80211_sub_if_data *sdata;
  	struct ieee80211_channel *chan;
  	struct ieee80211_channel *chan;
  	u32 changed = 0;
  	u32 changed = 0;
@@ -129,7 +129,7 @@
  	enum nl80211_channel_type channel_type;
  	enum nl80211_channel_type channel_type;
  	u32 offchannel_flag;
  	u32 offchannel_flag;
  	bool scanning = false;
  	bool scanning = false;
-@@ -165,8 +165,21 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -164,8 +164,21 @@ static u32 ieee80211_hw_conf_chan(struct
  	}
  	}
  	rcu_read_unlock();
  	rcu_read_unlock();
  
  
@@ -152,7 +152,7 @@
  		local->hw.cur_power_level = power;
  		local->hw.cur_power_level = power;
  		local->hw.conf.power_level = power;
  		local->hw.conf.power_level = power;
  	}
  	}
-@@ -582,6 +595,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
+@@ -612,6 +625,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
  					 IEEE80211_RADIOTAP_MCS_HAVE_BW;
  					 IEEE80211_RADIOTAP_MCS_HAVE_BW;
  	local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
  	local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
  					 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
  					 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;

+ 1 - 1
package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch

@@ -21,7 +21,7 @@
  	if (ant_gain > max_gain)
  	if (ant_gain > max_gain)
 --- a/drivers/net/wireless/ath/ath9k/main.c
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1201,7 +1201,10 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1272,7 +1272,10 @@ int ath9k_config(struct ieee80211_hw *hw
  	}
  	}
  
  
  	if (changed & IEEE80211_CONF_CHANGE_POWER) {
  	if (changed & IEEE80211_CONF_CHANGE_POWER) {

+ 7 - 7
package/mac80211/patches/530-ath9k_extra_leds.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -548,6 +548,9 @@ struct ath9k_wow_pattern {
+@@ -551,6 +551,9 @@ struct ath9k_wow_pattern {
  void ath_init_leds(struct ath_softc *sc);
  void ath_init_leds(struct ath_softc *sc);
  void ath_deinit_leds(struct ath_softc *sc);
  void ath_deinit_leds(struct ath_softc *sc);
  void ath_fill_led_pin(struct ath_softc *sc);
  void ath_fill_led_pin(struct ath_softc *sc);
@@ -10,8 +10,8 @@
  #else
  #else
  static inline void ath_init_leds(struct ath_softc *sc)
  static inline void ath_init_leds(struct ath_softc *sc)
  {
  {
-@@ -666,6 +669,13 @@ struct ath9k_vif_iter_data {
- 	int nadhocs;   /* number of adhoc vifs */
+@@ -686,6 +689,13 @@ enum spectral_mode {
+ 	SPECTRAL_CHANSCAN,
  };
  };
  
  
 +struct ath_led {
 +struct ath_led {
@@ -24,7 +24,7 @@
  struct ath_softc {
  struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct ieee80211_hw *hw;
  	struct device *dev;
  	struct device *dev;
-@@ -707,9 +717,8 @@ struct ath_softc {
+@@ -727,9 +737,8 @@ struct ath_softc {
  	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  
  
  #ifdef CONFIG_MAC80211_LEDS
  #ifdef CONFIG_MAC80211_LEDS
@@ -162,7 +162,7 @@
  void ath_fill_led_pin(struct ath_softc *sc)
  void ath_fill_led_pin(struct ath_softc *sc)
 --- a/drivers/net/wireless/ath/ath9k/init.c
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -865,7 +865,7 @@ int ath9k_init_device(u16 devid, struct 
+@@ -870,7 +870,7 @@ int ath9k_init_device(u16 devid, struct 
  
  
  #ifdef CONFIG_MAC80211_LEDS
  #ifdef CONFIG_MAC80211_LEDS
  	/* must be initialized before ieee80211_register_hw */
  	/* must be initialized before ieee80211_register_hw */
@@ -173,7 +173,7 @@
  #endif
  #endif
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1196,6 +1196,61 @@ static const struct file_operations fops
+@@ -1482,6 +1482,61 @@ static const struct file_operations fops
  	.llseek = default_llseek,
  	.llseek = default_llseek,
  };
  };
  
  
@@ -235,7 +235,7 @@
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  
  
  void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
  void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
-@@ -1829,6 +1884,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2115,6 +2170,10 @@ int ath9k_init_debug(struct ath_hw *ah)
  			    &fops_eeprom);
  			    &fops_eeprom);
  	debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
  	debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
  			    sc, &fops_chanbw);
  			    sc, &fops_chanbw);

+ 6 - 6
package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch

@@ -1,6 +1,6 @@
 --- a/net/mac80211/ieee80211_i.h
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -764,6 +764,8 @@ struct ieee80211_sub_if_data {
+@@ -739,6 +739,8 @@ struct ieee80211_sub_if_data {
  
  
  	/* bitmap of allowed (non-MCS) rate indexes for rate control */
  	/* bitmap of allowed (non-MCS) rate indexes for rate control */
  	u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
  	u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
@@ -11,7 +11,7 @@
  	union {
  	union {
 --- a/net/mac80211/cfg.c
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2328,9 +2328,20 @@ static int ieee80211_set_bitrate_mask(st
+@@ -2386,9 +2386,20 @@ static int ieee80211_set_bitrate_mask(st
  	}
  	}
  
  
  	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
  	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
@@ -34,7 +34,7 @@
  	return 0;
  	return 0;
 --- a/include/net/mac80211.h
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -3985,7 +3985,7 @@ void ieee80211_send_bar(struct ieee80211
+@@ -4091,7 +4091,7 @@ void ieee80211_send_bar(struct ieee80211
   *	(deprecated; this will be removed once drivers get updated to use
   *	(deprecated; this will be removed once drivers get updated to use
   *	rate_idx_mask)
   *	rate_idx_mask)
   * @rate_idx_mask: user-requested (legacy) rate mask
   * @rate_idx_mask: user-requested (legacy) rate mask
@@ -43,7 +43,7 @@
   * @bss: whether this frame is sent out in AP or IBSS mode
   * @bss: whether this frame is sent out in AP or IBSS mode
   */
   */
  struct ieee80211_tx_rate_control {
  struct ieee80211_tx_rate_control {
-@@ -3997,7 +3997,7 @@ struct ieee80211_tx_rate_control {
+@@ -4103,7 +4103,7 @@ struct ieee80211_tx_rate_control {
  	bool rts, short_preamble;
  	bool rts, short_preamble;
  	u8 max_rate_idx;
  	u8 max_rate_idx;
  	u32 rate_idx_mask;
  	u32 rate_idx_mask;
@@ -54,7 +54,7 @@
  
  
 --- a/net/mac80211/tx.c
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -636,9 +636,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
+@@ -641,9 +641,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
  		txrc.max_rate_idx = -1;
  		txrc.max_rate_idx = -1;
  	else
  	else
  		txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
  		txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
@@ -69,7 +69,7 @@
  	txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
  	txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
  		    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
  		    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
  		    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
  		    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
-@@ -2502,8 +2504,6 @@ struct sk_buff *ieee80211_beacon_get_tim
+@@ -2505,8 +2507,6 @@ struct sk_buff *ieee80211_beacon_get_tim
  		txrc.max_rate_idx = -1;
  		txrc.max_rate_idx = -1;
  	else
  	else
  		txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
  		txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;

+ 0 - 71
package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch

@@ -1,71 +0,0 @@
---- a/include/linux/ieee80211.h
-+++ b/include/linux/ieee80211.h
-@@ -180,7 +180,7 @@ struct ieee80211_hdr {
- 	u8 addr3[6];
- 	__le16 seq_ctrl;
- 	u8 addr4[6];
--} __packed;
-+} __packed __aligned(2);
- 
- struct ieee80211_hdr_3addr {
- 	__le16 frame_control;
-@@ -189,7 +189,7 @@ struct ieee80211_hdr_3addr {
- 	u8 addr2[6];
- 	u8 addr3[6];
- 	__le16 seq_ctrl;
--} __packed;
-+} __packed __aligned(2);
- 
- struct ieee80211_qos_hdr {
- 	__le16 frame_control;
-@@ -199,7 +199,7 @@ struct ieee80211_qos_hdr {
- 	u8 addr3[6];
- 	__le16 seq_ctrl;
- 	__le16 qos_ctrl;
--} __packed;
-+} __packed __aligned(2);
- 
- /**
-  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
-@@ -576,7 +576,7 @@ struct ieee80211s_hdr {
- 	__le32 seqnum;
- 	u8 eaddr1[6];
- 	u8 eaddr2[6];
--} __packed;
-+} __packed __aligned(2);
- 
- /* Mesh flags */
- #define MESH_FLAGS_AE_A4 	0x1
-@@ -839,7 +839,7 @@ struct ieee80211_mgmt {
- 			} u;
- 		} __packed action;
- 	} u;
--} __packed;
-+} __packed __aligned(2);
- 
- /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
- #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
-@@ -870,20 +870,20 @@ struct ieee80211_rts {
- 	__le16 duration;
- 	u8 ra[6];
- 	u8 ta[6];
--} __packed;
-+} __packed __aligned(2);
- 
- struct ieee80211_cts {
- 	__le16 frame_control;
- 	__le16 duration;
- 	u8 ra[6];
--} __packed;
-+} __packed __aligned(2);
- 
- struct ieee80211_pspoll {
- 	__le16 frame_control;
- 	__le16 aid;
- 	u8 bssid[6];
- 	u8 ta[6];
--} __packed;
-+} __packed __aligned(2);
- 
- /* TDLS */
- 

+ 6 - 6
package/mac80211/patches/553-ath9k_debugfs_diag.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1863,6 +1863,50 @@ static const struct file_operations fops
+@@ -2149,6 +2149,50 @@ static const struct file_operations fops
  };
  };
  
  
  
  
@@ -51,7 +51,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  int ath9k_init_debug(struct ath_hw *ah)
  {
  {
  	struct ath_common *common = ath9k_hw_common(ah);
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -1888,6 +1932,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2174,6 +2218,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  	debugfs_create_file("gpio_led", S_IWUSR,
  	debugfs_create_file("gpio_led", S_IWUSR,
  			   sc->debug.debugfs_phy, sc, &fops_gpio_led);
  			   sc->debug.debugfs_phy, sc, &fops_gpio_led);
  #endif
  #endif
@@ -62,7 +62,7 @@
  	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
  	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -499,6 +499,12 @@ enum {
+@@ -500,6 +500,12 @@ enum {
  	ATH9K_RESET_COLD,
  	ATH9K_RESET_COLD,
  };
  };
  
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
  struct ath9k_hw_version {
  	u32 magic;
  	u32 magic;
  	u16 devid;
  	u16 devid;
-@@ -738,6 +744,8 @@ struct ath_hw {
+@@ -778,6 +784,8 @@ struct ath_hw {
  	u32 rfkill_polarity;
  	u32 rfkill_polarity;
  	u32 ah_flags;
  	u32 ah_flags;
  
  
@@ -84,7 +84,7 @@
  	bool reset_power_on;
  	bool reset_power_on;
  	bool htc_reset_init;
  	bool htc_reset_init;
  
  
-@@ -988,6 +996,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
+@@ -1041,6 +1049,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  
  
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
@@ -125,7 +125,7 @@
  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
 --- a/drivers/net/wireless/ath/ath9k/main.c
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -462,6 +462,11 @@ irqreturn_t ath_isr(int irq, void *dev)
+@@ -459,6 +459,11 @@ irqreturn_t ath_isr(int irq, void *dev)
  	ath9k_hw_getisr(ah, &status);	/* NB: clears ISR too */
  	ath9k_hw_getisr(ah, &status);	/* NB: clears ISR too */
  	status &= ah->imask;	/* discard unasked-for bits */
  	status &= ah->imask;	/* discard unasked-for bits */
  
  

+ 2 - 2
package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch

@@ -48,7 +48,7 @@
  	    AR_SREV_9285(ah) ||
  	    AR_SREV_9285(ah) ||
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -908,6 +908,8 @@ struct ath_hw {
+@@ -961,6 +961,8 @@ struct ath_hw {
  	bool is_clk_25mhz;
  	bool is_clk_25mhz;
  	int (*get_mac_revision)(void);
  	int (*get_mac_revision)(void);
  	int (*external_reset)(void);
  	int (*external_reset)(void);
@@ -59,7 +59,7 @@
  };
  };
 --- a/drivers/net/wireless/ath/ath9k/init.c
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -582,6 +582,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s
  		ah->is_clk_25mhz = pdata->is_clk_25mhz;
  		ah->is_clk_25mhz = pdata->is_clk_25mhz;
  		ah->get_mac_revision = pdata->get_mac_revision;
  		ah->get_mac_revision = pdata->get_mac_revision;
  		ah->external_reset = pdata->external_reset;
  		ah->external_reset = pdata->external_reset;

+ 5 - 5
package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

@@ -101,7 +101,7 @@
 +}
 +}
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -561,6 +561,7 @@ struct rt2x00lib_ops {
+@@ -559,6 +559,7 @@ struct rt2x00lib_ops {
  			       const u8 *data, const size_t len);
  			       const u8 *data, const size_t len);
  	int (*load_firmware) (struct rt2x00_dev *rt2x00dev,
  	int (*load_firmware) (struct rt2x00_dev *rt2x00dev,
  			      const u8 *data, const size_t len);
  			      const u8 *data, const size_t len);
@@ -109,7 +109,7 @@
  
  
  	/*
  	/*
  	 * Device initialization/deinitialization handlers.
  	 * Device initialization/deinitialization handlers.
-@@ -721,6 +722,7 @@ enum rt2x00_capability_flags {
+@@ -719,6 +720,7 @@ enum rt2x00_capability_flags {
  	REQUIRE_SW_SEQNO,
  	REQUIRE_SW_SEQNO,
  	REQUIRE_HT_TX_DESC,
  	REQUIRE_HT_TX_DESC,
  	REQUIRE_PS_AUTOWAKE,
  	REQUIRE_PS_AUTOWAKE,
@@ -117,7 +117,7 @@
  
  
  	/*
  	/*
  	 * Capabilities
  	 * Capabilities
-@@ -990,6 +992,11 @@ struct rt2x00_dev {
+@@ -988,6 +990,11 @@ struct rt2x00_dev {
  	const struct firmware *fw;
  	const struct firmware *fw;
  
  
  	/*
  	/*
@@ -244,7 +244,7 @@
  	.get_entry_state	= rt2800pci_get_entry_state,
  	.get_entry_state	= rt2800pci_get_entry_state,
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -1214,6 +1214,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+@@ -1314,6 +1314,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
  
  
  	rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  	rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  
  
@@ -255,7 +255,7 @@
  	/*
  	/*
  	 * Initialize work.
  	 * Initialize work.
  	 */
  	 */
-@@ -1338,6 +1342,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
+@@ -1438,6 +1442,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
  	 */
  	 */
  	if (rt2x00dev->drv_data)
  	if (rt2x00dev->drv_data)
  		kfree(rt2x00dev->drv_data);
  		kfree(rt2x00dev->drv_data);

+ 1 - 1
package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 --- a/config.mk
 +++ b/config.mk
 +++ b/config.mk
-@@ -630,6 +630,7 @@ export CONFIG_RT2X00=y
+@@ -640,6 +640,7 @@ export CONFIG_RT2X00=y
  export CONFIG_RT2X00_LIB=m
  export CONFIG_RT2X00_LIB=m
  export CONFIG_RT2800_LIB=m
  export CONFIG_RT2800_LIB=m
  export CONFIG_RT2X00_LIB_FIRMWARE=y
  export CONFIG_RT2X00_LIB_FIRMWARE=y

+ 1 - 1
package/mac80211/patches/606-rt2x00_no_realign.patch

@@ -24,7 +24,7 @@ Helmut
 
 
 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
-@@ -151,36 +151,14 @@ void rt2x00queue_align_frame(struct sk_b
+@@ -162,36 +162,14 @@ void rt2x00queue_align_frame(struct sk_b
  void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
  void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
  {
  {
  	unsigned int payload_length = skb->len - header_length;
  	unsigned int payload_length = skb->len - header_length;

+ 2 - 2
package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch

@@ -12,7 +12,7 @@
  #endif /* _RT2X00_PLATFORM_H */
  #endif /* _RT2X00_PLATFORM_H */
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -842,6 +842,22 @@ static int rt2x00lib_probe_hw_modes(stru
+@@ -939,6 +939,22 @@ static int rt2x00lib_probe_hw_modes(stru
  	unsigned int num_rates;
  	unsigned int num_rates;
  	unsigned int i;
  	unsigned int i;
  
  
@@ -37,7 +37,7 @@
  		num_rates += 4;
  		num_rates += 4;
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -426,6 +426,7 @@ struct hw_mode_spec {
+@@ -424,6 +424,7 @@ struct hw_mode_spec {
  	unsigned int supported_bands;
  	unsigned int supported_bands;
  #define SUPPORT_BAND_2GHZ	0x00000001
  #define SUPPORT_BAND_2GHZ	0x00000001
  #define SUPPORT_BAND_5GHZ	0x00000002
  #define SUPPORT_BAND_5GHZ	0x00000002

+ 2 - 2
package/mac80211/patches/608-add_platform_data_mac_addr.patch

@@ -10,7 +10,7 @@
  	int disable_5ghz;
  	int disable_5ghz;
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -833,6 +833,18 @@ static void rt2x00lib_rate(struct ieee80
+@@ -930,6 +930,18 @@ static void rt2x00lib_rate(struct ieee80
  		entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
  		entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
  }
  }
  
  
@@ -31,7 +31,7 @@
  {
  {
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -1294,6 +1294,7 @@ static inline void rt2x00debug_dump_fram
+@@ -1314,6 +1314,7 @@ static inline void rt2x00debug_dump_fram
   */
   */
  u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
  u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
  			 struct ieee80211_vif *vif);
  			 struct ieee80211_vif *vif);

+ 8 - 8
package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2250,15 +2250,18 @@ static void rt2800_config_channel(struct
+@@ -2249,15 +2249,18 @@ static void rt2800_config_channel(struct
  	/*
  	/*
  	 * Change BBP settings
  	 * Change BBP settings
  	 */
  	 */
@@ -22,7 +22,7 @@
  		rt2800_bbp_write(rt2x00dev, 86, 0);
  		rt2800_bbp_write(rt2x00dev, 86, 0);
  	}
  	}
  
  
-@@ -3671,6 +3674,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -3670,6 +3673,7 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 120, 0x50);
  		rt2800_bbp_write(rt2x00dev, 120, 0x50);
  
  
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
@@ -30,7 +30,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 128, 0x12);
  		rt2800_bbp_write(rt2x00dev, 128, 0x12);
-@@ -3977,6 +3981,12 @@ static void rt2800_init_rfcsr_3290(struc
+@@ -3976,6 +3980,12 @@ static void rt2800_init_rfcsr_3290(struc
  
  
  static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  {
  {
@@ -43,7 +43,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
  	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
  	rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
  	rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
  	rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
  	rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
-@@ -4010,15 +4020,30 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -4009,15 +4019,30 @@ static void rt2800_init_rfcsr_3352(struc
  	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
@@ -77,7 +77,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
-@@ -4026,15 +4051,20 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -4025,15 +4050,20 @@ static void rt2800_init_rfcsr_3352(struc
  	rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
  	rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
  	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
  	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
  	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
@@ -107,7 +107,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
-@@ -4950,7 +4980,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -4949,7 +4979,8 @@ static int rt2800_init_eeprom(struct rt2
  	/*
  	/*
  	 * Detect if this device has Bluetooth co-existence.
  	 * Detect if this device has Bluetooth co-existence.
  	 */
  	 */
@@ -117,7 +117,7 @@
  		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  
  
  	/*
  	/*
-@@ -4979,6 +5010,22 @@ static int rt2800_init_eeprom(struct rt2
+@@ -4978,6 +5009,22 @@ static int rt2800_init_eeprom(struct rt2
  					EIRP_MAX_TX_POWER_LIMIT)
  					EIRP_MAX_TX_POWER_LIMIT)
  		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  
  
@@ -203,7 +203,7 @@
   * EEPROM frequency
   * EEPROM frequency
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -742,6 +742,8 @@ enum rt2x00_capability_flags {
+@@ -740,6 +740,8 @@ enum rt2x00_capability_flags {
  	CAPABILITY_DOUBLE_ANTENNA,
  	CAPABILITY_DOUBLE_ANTENNA,
  	CAPABILITY_BT_COEXIST,
  	CAPABILITY_BT_COEXIST,
  	CAPABILITY_VCO_RECALIBRATION,
  	CAPABILITY_VCO_RECALIBRATION,

+ 7 - 7
package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -5170,6 +5170,27 @@ static const struct rf_channel rf_vals_3
+@@ -5169,6 +5169,27 @@ static const struct rf_channel rf_vals_3
  	{173, 0x61, 0, 9},
  	{173, 0x61, 0, 9},
  };
  };
  
  
@@ -28,7 +28,7 @@
  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  {
  {
  	struct hw_mode_spec *spec = &rt2x00dev->spec;
  	struct hw_mode_spec *spec = &rt2x00dev->spec;
-@@ -5248,7 +5269,6 @@ static int rt2800_probe_hw_mode(struct r
+@@ -5246,7 +5267,6 @@ static int rt2800_probe_hw_mode(struct r
  		   rt2x00_rf(rt2x00dev, RF3022) ||
  		   rt2x00_rf(rt2x00dev, RF3022) ||
  		   rt2x00_rf(rt2x00dev, RF3290) ||
  		   rt2x00_rf(rt2x00dev, RF3290) ||
  		   rt2x00_rf(rt2x00dev, RF3320) ||
  		   rt2x00_rf(rt2x00dev, RF3320) ||
@@ -36,7 +36,7 @@
  		   rt2x00_rf(rt2x00dev, RF5360) ||
  		   rt2x00_rf(rt2x00dev, RF5360) ||
  		   rt2x00_rf(rt2x00dev, RF5370) ||
  		   rt2x00_rf(rt2x00dev, RF5370) ||
  		   rt2x00_rf(rt2x00dev, RF5372) ||
  		   rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -5256,6 +5276,12 @@ static int rt2800_probe_hw_mode(struct r
+@@ -5254,6 +5274,12 @@ static int rt2800_probe_hw_mode(struct r
  		   rt2x00_rf(rt2x00dev, RF5392)) {
  		   rt2x00_rf(rt2x00dev, RF5392)) {
  		spec->num_channels = 14;
  		spec->num_channels = 14;
  		spec->channels = rf_vals_3x;
  		spec->channels = rf_vals_3x;
@@ -49,7 +49,7 @@
  	} else if (rt2x00_rf(rt2x00dev, RF3052)) {
  	} else if (rt2x00_rf(rt2x00dev, RF3052)) {
  		spec->supported_bands |= SUPPORT_BAND_5GHZ;
  		spec->supported_bands |= SUPPORT_BAND_5GHZ;
  		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
  		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
-@@ -5349,6 +5375,19 @@ static int rt2800_probe_hw_mode(struct r
+@@ -5347,6 +5373,19 @@ static int rt2800_probe_hw_mode(struct r
  	return 0;
  	return 0;
  }
  }
  
  
@@ -69,7 +69,7 @@
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  {
  {
  	int retval;
  	int retval;
-@@ -5374,6 +5413,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -5372,6 +5411,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  
  
  	/*
  	/*
@@ -87,7 +87,7 @@
  	retval = rt2800_probe_hw_mode(rt2x00dev);
  	retval = rt2800_probe_hw_mode(rt2x00dev);
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -421,6 +421,7 @@ static inline struct rt2x00_intf* vif_to
+@@ -419,6 +419,7 @@ static inline struct rt2x00_intf* vif_to
   * @channels: Device/chipset specific channel values (See &struct rf_channel).
   * @channels: Device/chipset specific channel values (See &struct rf_channel).
   * @channels_info: Additional information for channels (See &struct channel_info).
   * @channels_info: Additional information for channels (See &struct channel_info).
   * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
   * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
@@ -95,7 +95,7 @@
   */
   */
  struct hw_mode_spec {
  struct hw_mode_spec {
  	unsigned int supported_bands;
  	unsigned int supported_bands;
-@@ -437,6 +438,7 @@ struct hw_mode_spec {
+@@ -435,6 +436,7 @@ struct hw_mode_spec {
  	const struct channel_info *channels_info;
  	const struct channel_info *channels_info;
  
  
  	struct ieee80211_sta_ht_cap ht;
  	struct ieee80211_sta_ht_cap ht;

+ 1 - 1
package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/mwl8k.c
 --- a/drivers/net/wireless/mwl8k.c
 +++ b/drivers/net/wireless/mwl8k.c
 +++ b/drivers/net/wireless/mwl8k.c
-@@ -5389,6 +5389,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
+@@ -5497,6 +5497,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
  MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
  MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
  
  
  static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
  static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {

+ 5 - 5
package/mac80211/patches/850-brcmsmac-start-adding-support-for-core-rev-28.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -98,6 +98,7 @@ static struct bcma_device_id brcms_corei
+@@ -99,6 +99,7 @@ static struct bcma_device_id brcms_corei
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
@@ -10,7 +10,7 @@
  MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
  MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -719,7 +719,7 @@ static void brcms_c_ucode_bsinit(struct 
+@@ -717,7 +717,7 @@ static void brcms_c_ucode_bsinit(struct 
  	brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
  	brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
  
  
  	/* do band-specific ucode IHR, SHM, and SCR inits */
  	/* do band-specific ucode IHR, SHM, and SCR inits */
@@ -19,7 +19,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
  			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
  		else
  		else
-@@ -2266,7 +2266,7 @@ static void brcms_ucode_download(struct 
+@@ -2257,7 +2257,7 @@ static void brcms_ucode_download(struct 
  	if (wlc_hw->ucode_loaded)
  	if (wlc_hw->ucode_loaded)
  		return;
  		return;
  
  
@@ -28,7 +28,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band)) {
  		if (BRCMS_ISNPHY(wlc_hw->band)) {
  			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
  			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
  					  ucode->bcm43xx_16_mimosz);
  					  ucode->bcm43xx_16_mimosz);
-@@ -3217,7 +3217,7 @@ static void brcms_b_coreinit(struct brcm
+@@ -3207,7 +3207,7 @@ static void brcms_b_coreinit(struct brcm
  
  
  	sflags = bcma_aread32(core, BCMA_IOST);
  	sflags = bcma_aread32(core, BCMA_IOST);
  
  
@@ -37,7 +37,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
  			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
  		else
  		else
-@@ -5674,6 +5674,8 @@ static bool brcms_c_chipmatch_soc(struct
+@@ -5663,6 +5663,8 @@ static bool brcms_c_chipmatch_soc(struct
  
  
  	if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
  	if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
  		return true;
  		return true;