Browse Source

mac80211: update to wireless-testing 2011-10-05 + pending patches

SVN-Revision: 28392
Felix Fietkau 14 years ago
parent
commit
adfeb00e5a
47 changed files with 10546 additions and 4221 deletions
  1. 4 4
      package/mac80211/Makefile
  2. 1 1
      package/mac80211/patches/001-disable_b44.patch
  3. 1 1
      package/mac80211/patches/002-disable_rfkill.patch
  4. 3 3
      package/mac80211/patches/005-disable_ssb_build.patch
  5. 1 1
      package/mac80211/patches/006-disable_bcma_build.patch
  6. 2 2
      package/mac80211/patches/007-remove_misc_drivers.patch
  7. 1 1
      package/mac80211/patches/010-no_pcmcia.patch
  8. 1 1
      package/mac80211/patches/011-no_sdio.patch
  9. 4 2
      package/mac80211/patches/013-disable_b43_nphy.patch
  10. 2 2
      package/mac80211/patches/015-remove-rt2x00-options.patch
  11. 1 1
      package/mac80211/patches/110-disable_usb_compat.patch
  12. 10449 1946
      package/mac80211/patches/300-pending_work.patch
  13. 0 720
      package/mac80211/patches/310-ibss_ht.patch
  14. 1 1
      package/mac80211/patches/400-ath_move_debug_code.patch
  15. 1 1
      package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch
  16. 2 2
      package/mac80211/patches/406-regd_no_assoc_hints.patch
  17. 2 2
      package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  18. 2 2
      package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  19. 1 1
      package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
  20. 2 2
      package/mac80211/patches/511-ath9k_increase_bcbuf.patch
  21. 7 7
      package/mac80211/patches/513-ath9k_channelbw_debugfs.patch
  22. 3 3
      package/mac80211/patches/520-mac80211_minstrel_ht_aggr_delay.patch
  23. 1 1
      package/mac80211/patches/522-mac80211_reduce_txqueuelen.patch
  24. 9 9
      package/mac80211/patches/523-minstrel_ht_optimize.patch
  25. 2 2
      package/mac80211/patches/530-mac80211_cur_txpower.patch
  26. 2 2
      package/mac80211/patches/531-ath9k_cur_txpower.patch
  27. 7 7
      package/mac80211/patches/540-ath9k_limit_qlen.patch
  28. 6 6
      package/mac80211/patches/541-ath9k_sw_retry_reduce.patch
  29. 1 1
      package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch
  30. 2 2
      package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch
  31. 0 93
      package/mac80211/patches/551-ath9k_fix_keymiss_handling.patch
  32. 20 20
      package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch
  33. 0 37
      package/mac80211/patches/552-ath9k_fix_phyerror.patch
  34. 0 96
      package/mac80211/patches/561-mac80211_tx_status.patch
  35. 0 121
      package/mac80211/patches/562-ath9k_tx_status.patch
  36. 0 27
      package/mac80211/patches/570-ath9k_tx_stop_failure_debug.patch
  37. 0 124
      package/mac80211/patches/571-ath9k_reset_debug.patch
  38. 0 41
      package/mac80211/patches/572-ath9k_fix_tx_retry.patch
  39. 0 51
      package/mac80211/patches/573-ath9k_fix_tx_flush_bar.patch
  40. 0 155
      package/mac80211/patches/580-ath9k_cleanup_set_interrupt.patch
  41. 0 627
      package/mac80211/patches/581-ath9k_cleanup_txpower_handling.patch
  42. 0 34
      package/mac80211/patches/582-ath9k_remove_current_rd_ext.patch
  43. 0 54
      package/mac80211/patches/583-ath9k_remove_eep_reg_1.patch
  44. 1 1
      package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch
  45. 1 1
      package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
  46. 2 2
      package/mac80211/patches/800-b43-gpio-mask-module-option.patch
  47. 1 1
      package/mac80211/patches/810-b43_no_pio.patch

+ 4 - 4
package/mac80211/Makefile

@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=2011-09-14
+PKG_VERSION:=2011-10-05
 PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_MD5SUM:=a5627e6079e8d0f0baf7045141503a3d
+PKG_MD5SUM:=328dd4c42fb5baa2d96c78009b11af7e
 
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@@ -627,7 +627,7 @@ define KernelPackage/iwlagn
   $(call KernelPackage/mac80211/Default)
   DEPENDS:= +kmod-mac80211 @PCI_SUPPORT
   TITLE:=Intel AGN Wireless support
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlagn.$(LINUX_KMOD_SUFFIX)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlwifi.$(LINUX_KMOD_SUFFIX)
   AUTOLOAD:=$(call AutoLoad,60,iwlagn)
   MENU:=1
 endef
@@ -1165,7 +1165,7 @@ MAKE_OPTS:= \
 	CONFIG_LIB80211_CRYPT_WEP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
 	CONFIG_LIB80211_CRYPT_CCMP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
 	CONFIG_LIB80211_CRYPT_TKIP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \
-	CONFIG_IWLAGN=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \
+	CONFIG_IWLWIFI=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \
 	CONFIG_IWLWIFI_LEGACY=$(if $(CONFIG_PACKAGE_kmod-iwl-legacy),m) \
 	CONFIG_COMPAT_IWL4965=$(if $(CONFIG_PACKAGE_kmod-iwl4965),m) \
 	CONFIG_IWL3945=$(if $(CONFIG_PACKAGE_kmod-iwl3945),m) \

+ 1 - 1
package/mac80211/patches/001-disable_b44.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -340,8 +340,8 @@ CONFIG_B43_BCMA_PIO=y
+@@ -339,8 +339,8 @@ CONFIG_B43_BCMA_PIO=y
  
  CONFIG_P54_PCI=m
  

+ 1 - 1
package/mac80211/patches/002-disable_rfkill.patch

@@ -9,7 +9,7 @@
  
  ifeq ($(CONFIG_MAC80211),y)
  $(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular")
-@@ -642,10 +642,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
+@@ -640,10 +640,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
  # We need the backported rfkill module on kernel < 2.6.31.
  # In more recent kernel versions use the in kernel rfkill module.
  ifdef CONFIG_COMPAT_KERNEL_2_6_31

+ 3 - 3
package/mac80211/patches/005-disable_ssb_build.patch

@@ -18,7 +18,7 @@
  else
  include $(KLIB_BUILD)/.config
  endif
-@@ -316,7 +315,8 @@ CONFIG_IPW2200_QOS=y
+@@ -315,7 +314,8 @@ CONFIG_IPW2200_QOS=y
  # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
  endif #CONFIG_WIRELESS_EXT
  
@@ -28,7 +28,7 @@
  # Sonics Silicon Backplane
  CONFIG_SSB_SPROM=y
  
-@@ -329,7 +329,7 @@ endif #CONFIG_PCMCIA
+@@ -328,7 +328,7 @@ endif #CONFIG_PCMCIA
  # CONFIG_SSB_DEBUG=y
  CONFIG_SSB_DRIVER_PCICORE=y
  CONFIG_B43_SSB=y
@@ -37,7 +37,7 @@
  
  CONFIG_BCMA=m
  CONFIG_BCMA_BLOCKIO=y
-@@ -538,7 +538,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv
+@@ -537,7 +537,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv
  
  ifdef CONFIG_MMC
  

+ 1 - 1
package/mac80211/patches/006-disable_bcma_build.patch

@@ -10,7 +10,7 @@
  ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),)
 --- a/config.mk
 +++ b/config.mk
-@@ -331,12 +331,12 @@ CONFIG_SSB_DRIVER_PCICORE=y
+@@ -330,12 +330,12 @@ CONFIG_SSB_DRIVER_PCICORE=y
  CONFIG_B43_SSB=y
  endif #__CONFIG_SSB
  

+ 2 - 2
package/mac80211/patches/007-remove_misc_drivers.patch

@@ -9,7 +9,7 @@
  endif #CONFIG_STAGING
  
  # mac80211 test driver
-@@ -368,13 +368,13 @@ endif #CONFIG_CRC_ITU_T
+@@ -367,13 +367,13 @@ endif #CONFIG_CRC_ITU_T
  CONFIG_MWL8K=m
  
  # Ethernet drivers go here
@@ -28,7 +28,7 @@
  endif #CONFIG_COMPAT_KERNEL_2_6_27
  
  ifdef CONFIG_WIRELESS_EXT
-@@ -435,21 +435,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
+@@ -434,21 +434,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
  # Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER
  # it also requires new RNDIS_HOST and CDC_ETHER modules which we add
  ifdef CONFIG_COMPAT_KERNEL_2_6_29

+ 1 - 1
package/mac80211/patches/010-no_pcmcia.patch

@@ -9,7 +9,7 @@
  else
  include $(KLIB_BUILD)/.config
  endif
-@@ -248,7 +248,7 @@ CONFIG_B43=m
+@@ -247,7 +247,7 @@ CONFIG_B43=m
  CONFIG_B43_HWRNG=y
  CONFIG_B43_PCI_AUTOSELECT=y
  ifdef CONFIG_PCMCIA

+ 1 - 1
package/mac80211/patches/011-no_sdio.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -521,7 +521,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
+@@ -520,7 +520,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
  
  ifdef CONFIG_MMC
  

+ 4 - 2
package/mac80211/patches/013-disable_b43_nphy.patch

@@ -1,11 +1,13 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -254,7 +254,7 @@ ifdef CONFIG_MAC80211_LEDS
+@@ -253,8 +253,8 @@ ifdef CONFIG_MAC80211_LEDS
  CONFIG_B43_LEDS=y
  endif #CONFIG_MAC80211_LEDS
  CONFIG_B43_PHY_LP=y
 -CONFIG_B43_PHY_N=y
+-CONFIG_B43_PHY_HT=y
 +# CONFIG_B43_PHY_N=y
- # CONFIG_B43_PHY_HT=y
++# CONFIG_B43_PHY_HT=y
  # CONFIG_B43_PHY_LCN=y
  # CONFIG_B43_FORCE_PIO=y
+ # CONFIG_B43_DEBUG=y

+ 2 - 2
package/mac80211/patches/015-remove-rt2x00-options.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -330,7 +330,7 @@ CONFIG_RTL8180=m
+@@ -329,7 +329,7 @@ CONFIG_RTL8180=m
  
  CONFIG_ADM8211=m
  
@@ -9,7 +9,7 @@
  CONFIG_RT2400PCI=m
  CONFIG_RT2500PCI=m
  ifdef CONFIG_CRC_CCITT
-@@ -470,7 +470,7 @@ CONFIG_RT2800USB_RT35XX=y
+@@ -469,7 +469,7 @@ CONFIG_RT2800USB_RT35XX=y
  # CONFIG_RT2800USB_RT53XX=y
  CONFIG_RT2800USB_UNKNOWN=y
  endif #CONFIG_CRC_CCITT

+ 1 - 1
package/mac80211/patches/110-disable_usb_compat.patch

@@ -33,7 +33,7 @@
  #endif
 --- a/config.mk
 +++ b/config.mk
-@@ -456,7 +456,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
+@@ -455,7 +455,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
  # This activates a threading fix for usb urb.
  # this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351
  # This fix will be included in some stable releases.

File diff suppressed because it is too large
+ 10449 - 1946
package/mac80211/patches/300-pending_work.patch


+ 0 - 720
package/mac80211/patches/310-ibss_ht.patch

@@ -1,720 +0,0 @@
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -1101,6 +1101,7 @@ struct cfg80211_ibss_params {
- 	u8 *ssid;
- 	u8 *bssid;
- 	struct ieee80211_channel *channel;
-+	enum nl80211_channel_type channel_type;
- 	u8 *ie;
- 	u8 ssid_len, ie_len;
- 	u16 beacon_interval;
-@@ -2612,6 +2613,12 @@ struct cfg80211_bss *cfg80211_get_bss(st
- 				      const u8 *bssid,
- 				      const u8 *ssid, size_t ssid_len,
- 				      u16 capa_mask, u16 capa_val);
-+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy,
-+					  struct ieee80211_channel *channel,
-+					  const u8 *bssid,
-+					  const u8 *ssid, size_t ssid_len,
-+					  u16 capa_mask, u16 capa_val,
-+				       enum nl80211_channel_type channel_type);
- static inline struct cfg80211_bss *
- cfg80211_get_ibss(struct wiphy *wiphy,
- 		  struct ieee80211_channel *channel,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -4539,13 +4539,41 @@ static int nl80211_join_ibss(struct sk_b
- 		ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
- 	}
- 
--	ibss.channel = ieee80211_get_channel(wiphy,
--		nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
-+	if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
-+		enum nl80211_channel_type channel_type;
-+
-+		channel_type = nla_get_u32(
-+			info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
-+		if (channel_type != NL80211_CHAN_NO_HT &&
-+		    channel_type != NL80211_CHAN_HT20 &&
-+		    channel_type != NL80211_CHAN_HT40PLUS &&
-+		    channel_type != NL80211_CHAN_HT40MINUS)
-+			return -EINVAL;
-+		ibss.channel_type = channel_type;
-+	} else {
-+		ibss.channel_type = NL80211_CHAN_NO_HT;
-+	}
-+
-+	ibss.channel = rdev_freq_to_chan(rdev,
-+		nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
-+		ibss.channel_type);
- 	if (!ibss.channel ||
-+	    ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
- 	    ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
--	    ibss.channel->flags & IEEE80211_CHAN_DISABLED)
-+	    ibss.channel->flags & IEEE80211_CHAN_RADAR)
- 		return -EINVAL;
- 
-+	/* Both channels should be able to initiate communication */
-+	if ((ibss.channel_type == NL80211_CHAN_HT40PLUS ||
-+	     ibss.channel_type == NL80211_CHAN_HT40MINUS) &&
-+	    !can_beacon_sec_chan(&rdev->wiphy, ibss.channel,
-+				 ibss.channel_type)) {
-+		printk(KERN_DEBUG
-+		       "cfg80211: Secondary channel not "
-+		       "allowed to initiate communication\n");
-+		return -EINVAL;
-+	}
-+
- 	ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
- 	ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
- 
---- a/net/wireless/chan.c
-+++ b/net/wireless/chan.c
-@@ -44,7 +44,7 @@ rdev_freq_to_chan(struct cfg80211_regist
- 	return chan;
- }
- 
--static bool can_beacon_sec_chan(struct wiphy *wiphy,
-+bool can_beacon_sec_chan(struct wiphy *wiphy,
- 				struct ieee80211_channel *chan,
- 				enum nl80211_channel_type channel_type)
- {
-@@ -75,6 +75,7 @@ static bool can_beacon_sec_chan(struct w
- 
- 	return true;
- }
-+EXPORT_SYMBOL(can_beacon_sec_chan);
- 
- int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
- 		      struct wireless_dev *wdev, int freq,
---- a/net/wireless/core.h
-+++ b/net/wireless/core.h
-@@ -439,6 +439,9 @@ cfg80211_can_add_interface(struct cfg802
- struct ieee80211_channel *
- rdev_freq_to_chan(struct cfg80211_registered_device *rdev,
- 		  int freq, enum nl80211_channel_type channel_type);
-+bool can_beacon_sec_chan(struct wiphy *wiphy,
-+				struct ieee80211_channel *chan,
-+				enum nl80211_channel_type channel_type);
- int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
- 		      struct wireless_dev *wdev, int freq,
- 		      enum nl80211_channel_type channel_type);
---- a/net/wireless/scan.c
-+++ b/net/wireless/scan.c
-@@ -365,6 +365,19 @@ struct cfg80211_bss *cfg80211_get_bss(st
- 				      const u8 *ssid, size_t ssid_len,
- 				      u16 capa_mask, u16 capa_val)
- {
-+	/* call HT version with no HT requirements */
-+	return cfg80211_get_bss_ht(wiphy, channel, bssid, ssid, ssid_len,
-+				   capa_mask, capa_val, NL80211_CHAN_NO_HT);
-+}
-+EXPORT_SYMBOL(cfg80211_get_bss);
-+
-+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy,
-+				      struct ieee80211_channel *channel,
-+				      const u8 *bssid,
-+				      const u8 *ssid, size_t ssid_len,
-+				      u16 capa_mask, u16 capa_val,
-+				      enum nl80211_channel_type require_ht)
-+{
- 	struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy);
- 	struct cfg80211_internal_bss *bss, *res = NULL;
- 	unsigned long now = jiffies;
-@@ -374,8 +387,26 @@ struct cfg80211_bss *cfg80211_get_bss(st
- 	list_for_each_entry(bss, &dev->bss_list, list) {
- 		if ((bss->pub.capability & capa_mask) != capa_val)
- 			continue;
--		if (channel && bss->pub.channel != channel)
--			continue;
-+		if (channel) {
-+			if (bss->pub.channel != channel)
-+				continue;
-+			if (require_ht != NL80211_CHAN_NO_HT) {
-+				struct ieee80211_ht_info *ht_info;
-+				ht_info = (struct ieee80211_ht_info *)
-+					ieee80211_bss_get_ie(&bss->pub,
-+						       WLAN_EID_HT_INFORMATION);
-+				if (!ht_info)
-+					continue;
-+				if (require_ht == NL80211_CHAN_HT40MINUS &&
-+					      !(ht_info->ht_param &
-+					      IEEE80211_HT_PARAM_CHA_SEC_BELOW))
-+					continue;
-+				if (require_ht == NL80211_CHAN_HT40PLUS &&
-+					      !(ht_info->ht_param &
-+					      IEEE80211_HT_PARAM_CHA_SEC_ABOVE))
-+					continue;
-+			}
-+		}
- 		/* Don't get expired BSS structs */
- 		if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
- 		    !atomic_read(&bss->hold))
-@@ -392,7 +423,7 @@ struct cfg80211_bss *cfg80211_get_bss(st
- 		return NULL;
- 	return &res->pub;
- }
--EXPORT_SYMBOL(cfg80211_get_bss);
-+EXPORT_SYMBOL(cfg80211_get_bss_ht);
- 
- struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy,
- 				       struct ieee80211_channel *channel,
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -465,6 +465,7 @@ struct ieee80211_if_ibss {
- 	u8 ssid_len, ie_len;
- 	u8 *ie;
- 	struct ieee80211_channel *channel;
-+	enum nl80211_channel_type channel_type;
- 
- 	unsigned long ibss_join_req;
- 	/* probe response/beacon for IBSS */
-@@ -1090,6 +1091,7 @@ void ieee80211_ibss_notify_scan_complete
- void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata);
- struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
- 					u8 *bssid, u8 *addr, u32 supp_rates,
-+					struct ieee80211_ht_cap *ht_cap,
- 					gfp_t gfp);
- int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
- 			struct cfg80211_ibss_params *params);
-@@ -1343,6 +1345,12 @@ void ieee80211_recalc_smps(struct ieee80
- size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
- 			  const u8 *ids, int n_ids, size_t offset);
- size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
-+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband,
-+			       u16 cap);
-+u8 *ieee80211_ie_build_ht_info(u8 *pos,
-+				struct ieee80211_sta_ht_cap *ht_cap,
-+				struct ieee80211_channel *channel,
-+				enum nl80211_channel_type channel_type);
- 
- /* internal work items */
- void ieee80211_work_init(struct ieee80211_local *local);
-@@ -1371,6 +1379,8 @@ ieee80211_get_channel_mode(struct ieee80
- bool ieee80211_set_channel_type(struct ieee80211_local *local,
- 				struct ieee80211_sub_if_data *sdata,
- 				enum nl80211_channel_type chantype);
-+enum nl80211_channel_type ieee80211_ht_info_to_channel_type(
-+					struct ieee80211_ht_info *ht_info);
- 
- #ifdef CONFIG_MAC80211_NOINLINE
- #define debug_noinline noinline
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -839,23 +839,8 @@ int ieee80211_build_preq_ies(struct ieee
- 		offset = noffset;
- 	}
- 
--	if (sband->ht_cap.ht_supported) {
--		u16 cap = sband->ht_cap.cap;
--		__le16 tmp;
--
--		*pos++ = WLAN_EID_HT_CAPABILITY;
--		*pos++ = sizeof(struct ieee80211_ht_cap);
--		memset(pos, 0, sizeof(struct ieee80211_ht_cap));
--		tmp = cpu_to_le16(cap);
--		memcpy(pos, &tmp, sizeof(u16));
--		pos += sizeof(u16);
--		*pos++ = sband->ht_cap.ampdu_factor |
--			 (sband->ht_cap.ampdu_density <<
--				IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
--		memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
--		pos += sizeof(sband->ht_cap.mcs);
--		pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
--	}
-+	if (sband->ht_cap.ht_supported)
-+		pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap);
- 
- 	/*
- 	 * If adding more here, adjust code in main.c
-@@ -1378,3 +1363,100 @@ void ieee80211_disable_rssi_reports(stru
- 	_ieee80211_enable_rssi_reports(sdata, 0, 0);
- }
- EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
-+
-+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband,
-+			       u16 cap)
-+{
-+	__le16 tmp;
-+
-+	*pos++ = WLAN_EID_HT_CAPABILITY;
-+	*pos++ = sizeof(struct ieee80211_ht_cap);
-+	memset(pos, 0, sizeof(struct ieee80211_ht_cap));
-+
-+	/* capability flags */
-+	tmp = cpu_to_le16(cap);
-+	memcpy(pos, &tmp, sizeof(u16));
-+	pos += sizeof(u16);
-+
-+	/* AMPDU parameters */
-+	*pos++ = sband->ht_cap.ampdu_factor |
-+		 (sband->ht_cap.ampdu_density <<
-+			IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
-+
-+	/* MCS set */
-+	memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
-+	pos += sizeof(sband->ht_cap.mcs);
-+
-+	/* extended capabilities */
-+	pos += sizeof(__le16);
-+
-+	/* BF capabilities */
-+	pos += sizeof(__le32);
-+
-+	/* antenna selection */
-+	pos += sizeof(u8);
-+
-+	return pos;
-+}
-+
-+u8 *ieee80211_ie_build_ht_info(u8 *pos,
-+				struct ieee80211_sta_ht_cap *ht_cap,
-+				struct ieee80211_channel *channel,
-+				enum nl80211_channel_type channel_type)
-+{
-+	struct ieee80211_ht_info *ht_info;
-+	/* Build HT Information */
-+	*pos++ = WLAN_EID_HT_INFORMATION;
-+	*pos++ = sizeof(struct ieee80211_ht_info);
-+	ht_info = (struct ieee80211_ht_info *)pos;
-+	ht_info->control_chan =
-+			ieee80211_frequency_to_channel(channel->center_freq);
-+	switch (channel_type) {
-+	case NL80211_CHAN_HT40MINUS:
-+		ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
-+		break;
-+	case NL80211_CHAN_HT40PLUS:
-+		ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
-+		break;
-+	case NL80211_CHAN_HT20:
-+	default:
-+		ht_info->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
-+		break;
-+	}
-+	if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
-+		ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
-+	ht_info->operation_mode = 0x0000;
-+	ht_info->stbc_param = 0x0000;
-+
-+	/* It seems that Basic MCS set and Supported MCS set
-+	   are identical for the first 10 bytes */
-+	memset(&ht_info->basic_set, 0, 16);
-+	memcpy(&ht_info->basic_set, &ht_cap->mcs, 10);
-+
-+	return pos + sizeof(struct ieee80211_ht_info);
-+}
-+
-+enum nl80211_channel_type ieee80211_ht_info_to_channel_type(
-+					struct ieee80211_ht_info *ht_info)
-+{
-+	enum nl80211_channel_type channel_type;
-+
-+	if (!ht_info)
-+		return NL80211_CHAN_NO_HT;
-+
-+	switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
-+	case IEEE80211_HT_PARAM_CHA_SEC_NONE:
-+		channel_type = NL80211_CHAN_HT20;
-+		break;
-+	case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
-+		channel_type = NL80211_CHAN_HT40PLUS;
-+		break;
-+	case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
-+		channel_type = NL80211_CHAN_HT40MINUS;
-+		break;
-+	default:
-+		channel_type = NL80211_CHAN_NO_HT;
-+	}
-+
-+	return channel_type;
-+}
---- a/net/mac80211/work.c
-+++ b/net/mac80211/work.c
-@@ -118,7 +118,6 @@ static void ieee80211_add_ht_ie(struct s
- 	u8 *pos;
- 	u32 flags = channel->flags;
- 	u16 cap = sband->ht_cap.cap;
--	__le16 tmp;
- 
- 	if (!sband->ht_cap.ht_supported)
- 		return;
-@@ -169,34 +168,8 @@ static void ieee80211_add_ht_ie(struct s
- 	}
- 
- 	/* reserve and fill IE */
--
- 	pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
--	*pos++ = WLAN_EID_HT_CAPABILITY;
--	*pos++ = sizeof(struct ieee80211_ht_cap);
--	memset(pos, 0, sizeof(struct ieee80211_ht_cap));
--
--	/* capability flags */
--	tmp = cpu_to_le16(cap);
--	memcpy(pos, &tmp, sizeof(u16));
--	pos += sizeof(u16);
--
--	/* AMPDU parameters */
--	*pos++ = sband->ht_cap.ampdu_factor |
--		 (sband->ht_cap.ampdu_density <<
--			IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
--
--	/* MCS set */
--	memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
--	pos += sizeof(sband->ht_cap.mcs);
--
--	/* extended capabilities */
--	pos += sizeof(__le16);
--
--	/* BF capabilities */
--	pos += sizeof(__le32);
--
--	/* antenna selection */
--	pos += sizeof(u8);
-+	ieee80211_ie_build_ht_cap(pos, sband, cap);
- }
- 
- static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -82,6 +82,8 @@ static void ieee80211_send_addba_request
- 		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
- 	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
- 		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
-+	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
-+		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
- 
- 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
- 					  IEEE80211_STYPE_ACTION);
-@@ -399,7 +401,8 @@ int ieee80211_start_tx_ba_session(struct
- 	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
- 	    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
- 	    sdata->vif.type != NL80211_IFTYPE_AP &&
--	    sdata->vif.type != NL80211_IFTYPE_WDS)
-+	    sdata->vif.type != NL80211_IFTYPE_WDS &&
-+	    sdata->vif.type != NL80211_IFTYPE_ADHOC)
- 		return -EINVAL;
- 
- 	if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) {
---- a/net/mac80211/ht.c
-+++ b/net/mac80211/ht.c
-@@ -199,6 +199,8 @@ void ieee80211_send_delba(struct ieee802
- 		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
- 	else if (sdata->vif.type == NL80211_IFTYPE_STATION)
- 		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
-+	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
-+		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
- 
- 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
- 					  IEEE80211_STYPE_ACTION);
---- a/net/mac80211/ibss.c
-+++ b/net/mac80211/ibss.c
-@@ -35,6 +35,76 @@
- 
- #define IEEE80211_IBSS_MAX_STA_ENTRIES 128
- 
-+static bool ieee80211_can_use_ext_chan(struct ieee80211_sub_if_data *sdata,
-+				       struct ieee80211_channel *channel,
-+				       enum nl80211_channel_type channel_type)
-+{
-+	/* check if we are legally allowed to use HT extension channel */
-+	if ((channel_type == NL80211_CHAN_HT40PLUS) ||
-+			(channel_type == NL80211_CHAN_HT40MINUS)) {
-+		int sec_freq = channel->center_freq +
-+			     (channel_type == NL80211_CHAN_HT40PLUS ? 20 : -20);
-+		struct ieee80211_channel *sec_chan =
-+			     ieee80211_get_channel(sdata->wdev.wiphy, sec_freq);
-+		if (!sec_chan || sec_chan->flags & (IEEE80211_CHAN_DISABLED |
-+					   IEEE80211_CHAN_PASSIVE_SCAN |
-+					   IEEE80211_CHAN_NO_IBSS |
-+					   IEEE80211_CHAN_RADAR)) {
-+			return false;
-+		}
-+	}
-+	return true;
-+}
-+
-+static void ieee80211_update_ht_elems(struct ieee80211_sub_if_data *sdata,
-+				      struct ieee80211_mgmt *mgmt,
-+				      struct ieee80211_ht_info *ht_info)
-+{
-+	struct ieee80211_local *local = sdata->local;
-+	struct ieee80211_supported_band *sband =
-+			local->hw.wiphy->bands[local->oper_channel->band];
-+	enum nl80211_channel_type channel_type =
-+			ieee80211_ht_info_to_channel_type(ht_info);
-+
-+	if (!ieee80211_can_use_ext_chan(sdata, local->oper_channel, channel_type))
-+		channel_type = NL80211_CHAN_HT20;
-+
-+	if (channel_type != local->_oper_channel_type) {
-+		struct sk_buff *skb = rcu_dereference_protected(
-+				sdata->u.ibss.presp,
-+				lockdep_is_held(&ifibss->mtx));
-+		struct sk_buff *nskb;
-+		u8 *ht_ie;
-+
-+		/* update HT IE. If not yet existing, create one */
-+		nskb = skb_copy(skb, GFP_ATOMIC);
-+		ht_ie = (u8 *)cfg80211_find_ie(WLAN_EID_HT_CAPABILITY,
-+					       (const u8 *)(nskb->data + 24 +
-+							sizeof(mgmt->u.beacon)),
-+					       nskb->len - 24 -
-+							sizeof(mgmt->u.beacon));
-+		if (!ht_ie)
-+			ht_ie = skb_put(nskb, 4 +
-+					      sizeof(struct ieee80211_ht_cap) +
-+					      sizeof(struct ieee80211_ht_info));
-+
-+		ht_ie = ieee80211_ie_build_ht_cap(ht_ie, sband,
-+						  sband->ht_cap.cap);
-+		ht_ie = ieee80211_ie_build_ht_info(ht_ie, &sband->ht_cap,
-+					     local->oper_channel, channel_type);
-+		rcu_assign_pointer(sdata->u.ibss.presp, nskb);
-+		kfree_skb(skb);
-+
-+		if(!ieee80211_set_channel_type(local, sdata, channel_type)) {
-+			channel_type = NL80211_CHAN_HT20;
-+			WARN_ON(!ieee80211_set_channel_type(local, sdata,
-+							    channel_type));
-+		}
-+
-+		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
-+	}
-+
-+}
- 
- static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
- 					struct ieee80211_mgmt *mgmt,
-@@ -64,6 +134,7 @@ static void ieee80211_rx_mgmt_auth_ibss(
- static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
- 				      const u8 *bssid, const int beacon_int,
- 				      struct ieee80211_channel *chan,
-+				      enum nl80211_channel_type channel_type,
- 				      const u32 basic_rates,
- 				      const u16 capability, u64 tsf)
- {
-@@ -104,8 +175,17 @@ static void __ieee80211_sta_join_ibss(st
- 
- 	sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
- 
-+	/* entering a legacy IBSS. Use given HT configuration. */
-+	if (channel_type == NL80211_CHAN_NO_HT)
-+		channel_type = ifibss->channel_type;
- 	local->oper_channel = chan;
--	WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT));
-+
-+	/* if phy is on a different extension channel, setting ht40 will fail */
-+	if (!ieee80211_set_channel_type(local, sdata, channel_type)) {
-+		channel_type = NL80211_CHAN_HT20;
-+		WARN_ON(!ieee80211_set_channel_type(local, sdata,
-+				                                 channel_type));
-+	}
- 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
- 
- 	sband = local->hw.wiphy->bands[chan->band];
-@@ -171,6 +251,18 @@ static void __ieee80211_sta_join_ibss(st
- 		memcpy(skb_put(skb, ifibss->ie_len),
- 		       ifibss->ie, ifibss->ie_len);
- 
-+	/* add HT capability and information IEs */
-+	if (channel_type != NL80211_CHAN_NO_HT && sband->ht_cap.ht_supported) {
-+		pos = skb_put(skb, 4 +
-+				   sizeof(struct ieee80211_ht_cap) +
-+				   sizeof(struct ieee80211_ht_info));
-+		pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap);
-+		pos = ieee80211_ie_build_ht_info(pos,
-+						 &sband->ht_cap,
-+						 chan,
-+						 channel_type);
-+	}
-+
- 	if (local->hw.queues >= 4) {
- 		pos = skb_put(skb, 9);
- 		*pos++ = WLAN_EID_VENDOR_SPECIFIC;
-@@ -219,6 +311,8 @@ static void ieee80211_sta_join_ibss(stru
- 	u32 basic_rates;
- 	int i, j;
- 	u16 beacon_int = cbss->beacon_interval;
-+	const u8 *ht_info_ie;
-+	enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
- 
- 	lockdep_assert_held(&sdata->u.ibss.mtx);
- 
-@@ -242,9 +336,23 @@ static void ieee80211_sta_join_ibss(stru
- 		}
- 	}
- 
-+	ht_info_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_INFORMATION);
-+	if (ht_info_ie)
-+		channel_type = ieee80211_ht_info_to_channel_type(
-+			(struct ieee80211_ht_info *) (ht_info_ie + 2));
-+
-+	if (!ieee80211_can_use_ext_chan(sdata, cbss->channel, channel_type)) {
-+		channel_type = NL80211_CHAN_HT20;
-+#ifdef CONFIG_MAC80211_IBSS_DEBUG
-+		printk(KERN_DEBUG "%s: IBSS not allowed on secondary channel\n",
-+		       sdata->name);
-+#endif
-+	}
-+
- 	__ieee80211_sta_join_ibss(sdata, cbss->bssid,
- 				  beacon_int,
- 				  cbss->channel,
-+				  channel_type,
- 				  basic_rates,
- 				  cbss->capability,
- 				  cbss->tsf);
-@@ -310,11 +418,24 @@ static void ieee80211_rx_bss_info(struct
- 			} else
- 				sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
- 						mgmt->sa, supp_rates,
--						GFP_ATOMIC);
-+						elems->ht_cap_elem, GFP_ATOMIC);
- 		}
- 
--		if (sta && elems->wmm_info)
--			set_sta_flags(sta, WLAN_STA_WME);
-+		if (sta) {
-+			if (elems->wmm_info)
-+				set_sta_flags(sta, WLAN_STA_WME);
-+
-+			/* remote station uses ht */
-+			if (elems->ht_info_elem) {
-+				ieee80211_update_ht_elems(sdata, mgmt,
-+							  elems->ht_info_elem);
-+				ieee80211_ht_cap_ie_to_sta_ht_cap(
-+						local->hw.wiphy->bands[
-+						     local->oper_channel->band],
-+						elems->ht_cap_elem,
-+						&sta->sta.ht_cap);
-+			}
-+		}
- 
- 		rcu_read_unlock();
- 	}
-@@ -404,7 +525,7 @@ static void ieee80211_rx_bss_info(struct
- 		ieee80211_sta_join_ibss(sdata, bss);
- 		supp_rates = ieee80211_sta_get_rates(local, elems, band);
- 		ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
--				       supp_rates, GFP_KERNEL);
-+				    supp_rates, elems->ht_cap_elem, GFP_KERNEL);
- 	}
- 
-  put_bss:
-@@ -417,7 +538,8 @@ static void ieee80211_rx_bss_info(struct
-  * must be callable in atomic context.
-  */
- struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
--					u8 *bssid,u8 *addr, u32 supp_rates,
-+					u8 *bssid, u8 *addr, u32 supp_rates,
-+					struct ieee80211_ht_cap *ht_cap,
- 					gfp_t gfp)
- {
- 	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
-@@ -458,6 +580,11 @@ struct sta_info *ieee80211_ibss_add_sta(
- 	sta->sta.supp_rates[band] = supp_rates |
- 			ieee80211_mandatory_rates(local, band);
- 
-+	/* fill in ht rates */
-+	if (ht_cap)
-+		ieee80211_ht_cap_ie_to_sta_ht_cap(local->hw.wiphy->bands[band],
-+				ht_cap, &sta->sta.ht_cap);
-+
- 	rate_control_rate_init(sta);
- 
- 	/* If it fails, maybe we raced another insertion? */
-@@ -556,8 +683,8 @@ static void ieee80211_sta_create_ibss(st
- 		sdata->drop_unencrypted = 0;
- 
- 	__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
--				  ifibss->channel, ifibss->basic_rates,
--				  capability, 0);
-+				  ifibss->channel, ifibss->channel_type,
-+				  ifibss->basic_rates, capability, 0);
- }
- 
- /*
-@@ -594,10 +721,10 @@ static void ieee80211_sta_find_ibss(stru
- 		chan = ifibss->channel;
- 	if (!is_zero_ether_addr(ifibss->bssid))
- 		bssid = ifibss->bssid;
--	cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
-+	cbss = cfg80211_get_bss_ht(local->hw.wiphy, chan, bssid,
- 				ifibss->ssid, ifibss->ssid_len,
- 				WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
--				capability);
-+				capability, ifibss->channel_type);
- 
- 	if (cbss) {
- 		struct ieee80211_bss *bss;
-@@ -896,10 +1023,15 @@ int ieee80211_ibss_join(struct ieee80211
- 	struct sk_buff *skb;
- 
- 	skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
--			    36 /* bitrates */ +
--			    34 /* SSID */ +
--			    3  /* DS params */ +
--			    4  /* IBSS params */ +
-+			    sizeof(struct ieee80211_hdr_3addr) +
-+			    12 /* struct ieee80211_mgmt.u.beacon */ +
-+			    2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
-+			    2 + 8 /* max Supported Rates */ +
-+			    3 /* max DS params */ +
-+			    4 /* IBSS params */ +
-+			    2 + (IEEE80211_MAX_SUPP_RATES - 8) +
-+			    2 + sizeof(struct ieee80211_ht_cap) +
-+			    2 + sizeof(struct ieee80211_ht_info) +
- 			    params->ie_len);
- 	if (!skb)
- 		return -ENOMEM;
-@@ -920,13 +1052,15 @@ int ieee80211_ibss_join(struct ieee80211
- 	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
- 
- 	sdata->u.ibss.channel = params->channel;
-+	sdata->u.ibss.channel_type = params->channel_type;
- 	sdata->u.ibss.fixed_channel = params->channel_fixed;
- 
- 	/* fix ourselves to that channel now already */
- 	if (params->channel_fixed) {
- 		sdata->local->oper_channel = params->channel;
--		WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata,
--						    NL80211_CHAN_NO_HT));
-+		if(!ieee80211_set_channel_type(sdata->local, sdata,
-+					       params->channel_type))
-+			return -EINVAL;
- 	}
- 
- 	if (params->ie) {
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2164,7 +2164,8 @@ ieee80211_rx_h_action(struct ieee80211_r
- 		if (sdata->vif.type != NL80211_IFTYPE_STATION &&
- 		    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
- 		    sdata->vif.type != NL80211_IFTYPE_AP &&
--		    sdata->vif.type != NL80211_IFTYPE_WDS)
-+		    sdata->vif.type != NL80211_IFTYPE_WDS &&
-+		    sdata->vif.type != NL80211_IFTYPE_ADHOC)
- 			break;
- 
- 		/* verify action_code is present */
-@@ -2699,7 +2700,8 @@ static int prepare_for_handlers(struct i
- 			else
- 				rate_idx = status->rate_idx;
- 			rx->sta = ieee80211_ibss_add_sta(sdata, bssid,
--					hdr->addr2, BIT(rate_idx), GFP_ATOMIC);
-+					hdr->addr2, BIT(rate_idx), NULL,
-+								GFP_ATOMIC);
- 		}
- 		break;
- 	case NL80211_IFTYPE_MESH_POINT:
---- a/net/mac80211/agg-rx.c
-+++ b/net/mac80211/agg-rx.c
-@@ -182,6 +182,8 @@ static void ieee80211_send_addba_resp(st
- 		memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
- 	else if (sdata->vif.type == NL80211_IFTYPE_WDS)
- 		memcpy(mgmt->bssid, da, ETH_ALEN);
-+	else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
-+		memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
- 
- 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
- 					  IEEE80211_STYPE_ACTION);

+ 1 - 1
package/mac80211/patches/400-ath_move_debug_code.patch

@@ -11,7 +11,7 @@
 +		debug.o
 --- a/drivers/net/wireless/ath/ath.h
 +++ b/drivers/net/wireless/ath/ath.h
-@@ -274,13 +274,6 @@ void ath_dbg(struct ath_common *common, 
+@@ -272,13 +272,6 @@ void ath_dbg(struct ath_common *common, 
  #endif /* CONFIG_ATH_DEBUG */
  
  /** Returns string describing opmode, or NULL if unknown mode. */

+ 1 - 1
package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch

@@ -8,7 +8,7 @@
  #include <asm/unaligned.h>
  
  #include "hw.h"
-@@ -460,8 +461,16 @@ static int ath9k_hw_init_macaddr(struct 
+@@ -464,8 +465,16 @@ static int ath9k_hw_init_macaddr(struct 
  		common->macaddr[2 * i] = eeval >> 8;
  		common->macaddr[2 * i + 1] = eeval & 0xff;
  	}

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

@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -1653,6 +1653,8 @@ void regulatory_hint_11d(struct wiphy *w
+@@ -1654,6 +1654,8 @@ void regulatory_hint_11d(struct wiphy *w
  	enum environment_cap env = ENVIRON_ANY;
  	struct regulatory_request *request;
  
@@ -9,7 +9,7 @@
  	mutex_lock(&reg_mutex);
  
  	if (unlikely(!last_request))
-@@ -1859,6 +1861,8 @@ static void restore_regulatory_settings(
+@@ -1860,6 +1862,8 @@ static void restore_regulatory_settings(
  
  void regulatory_hint_disconnect(void)
  {

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

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1473,15 +1473,6 @@ static int ath9k_add_interface(struct ie
+@@ -1486,15 +1486,6 @@ static int ath9k_add_interface(struct ie
  		}
  	}
  
@@ -16,7 +16,7 @@
  	ath_dbg(common, ATH_DBG_CONFIG,
  		"Attach a VIF of type: %d\n", vif->type);
  
-@@ -1507,15 +1498,6 @@ static int ath9k_change_interface(struct
+@@ -1520,15 +1511,6 @@ static int ath9k_change_interface(struct
  	mutex_lock(&sc->mutex);
  	ath9k_ps_wakeup(sc);
  

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

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1585,6 +1585,53 @@ static const struct file_operations fops
+@@ -1610,6 +1610,53 @@ static const struct file_operations fops
  };
  
  
@@ -54,7 +54,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -1643,6 +1690,9 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1668,6 +1715,9 @@ int ath9k_init_debug(struct ath_hw *ah)
  	debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
  			   sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
  

+ 1 - 1
package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1674,8 +1674,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -1714,8 +1714,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  	REG_WRITE(ah, AR_OBS, 8);
  
  	if (ah->config.rx_intr_mitigation) {

+ 2 - 2
package/mac80211/patches/511-ath9k_increase_bcbuf.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -363,7 +363,7 @@ struct ath_vif {
+@@ -364,7 +364,7 @@ struct ath_vif {
   * number of beacon intervals, the game's up.
   */
  #define BSTUCK_THRESH           	9
@@ -11,7 +11,7 @@
  #define IEEE80211_MS_TO_TU(x)           (((x) * 1000) / 1024)
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -382,8 +382,8 @@ static void ath9k_hw_init_config(struct 
+@@ -387,8 +387,8 @@ static void ath9k_hw_init_config(struct 
  {
  	int i;
  

+ 7 - 7
package/mac80211/patches/513-ath9k_channelbw_debugfs.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -585,6 +585,7 @@ struct ath_softc {
+@@ -587,6 +587,7 @@ struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
  
@@ -10,7 +10,7 @@
  	struct survey_info *cur_survey;
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1693,6 +1693,9 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1718,6 +1718,9 @@ int ath9k_init_debug(struct ath_hw *ah)
  	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
  			    &fops_eeprom);
  
@@ -22,7 +22,7 @@
  	sc->debug.sampidx = 0;
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1636,9 +1636,10 @@ static int ath9k_config(struct ieee80211
+@@ -1649,9 +1649,10 @@ static int ath9k_config(struct ieee80211
  
  	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
  		struct ieee80211_channel *curchan = hw->conf.channel;
@@ -34,7 +34,7 @@
  		unsigned long flags;
  
  		if (ah->curchan)
-@@ -1691,7 +1692,23 @@ static int ath9k_config(struct ieee80211
+@@ -1704,7 +1705,23 @@ static int ath9k_config(struct ieee80211
  			memset(&sc->survey[pos], 0, sizeof(struct survey_info));
  		}
  
@@ -61,9 +61,9 @@
  			return -EINVAL;
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1509,6 +1509,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
- 	    (AR_SREV_9300_20_OR_LATER(ah) && IS_CHAN_5GHZ(chan)))
- 		bChannelChange = false;
+@@ -1548,6 +1548,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+ 	    caldata->rtt_hist.num_readings)
+ 		allow_fbs = true;
  
 +	if (!ah->curchan || ((ah->curchan->channelFlags ^ chan->channelFlags) &
 +	    (CHANNEL_HALF | CHANNEL_QUARTER)))

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

@@ -1,6 +1,6 @@
 --- a/net/mac80211/rc80211_minstrel_ht.c
 +++ b/net/mac80211/rc80211_minstrel_ht.c
-@@ -355,10 +355,12 @@ minstrel_downgrade_rate(struct minstrel_
+@@ -357,10 +357,12 @@ minstrel_downgrade_rate(struct minstrel_
  }
  
  static void
@@ -14,7 +14,7 @@
  	u16 tid;
  
  	if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
-@@ -374,6 +376,12 @@ minstrel_aggr_check(struct minstrel_priv
+@@ -376,6 +378,12 @@ minstrel_aggr_check(struct minstrel_priv
  	if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
  		return;
  
@@ -27,7 +27,7 @@
  	ieee80211_start_tx_ba_session(pubsta, tid, 5000);
  }
  
-@@ -453,7 +461,7 @@ minstrel_ht_tx_status(void *priv, struct
+@@ -455,7 +463,7 @@ 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))

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

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

+ 9 - 9
package/mac80211/patches/560-minstrel_ht_optimize.patch → package/mac80211/patches/523-minstrel_ht_optimize.patch

@@ -40,7 +40,7 @@
  /*
   * Update rate statistics and select new primary rates
   *
-@@ -292,6 +307,7 @@ minstrel_ht_update_stats(struct minstrel
+@@ -294,6 +309,7 @@ minstrel_ht_update_stats(struct minstrel
  		}
  	}
  
@@ -48,7 +48,7 @@
  	mi->stats_update = jiffies;
  }
  
-@@ -330,8 +346,8 @@ minstrel_next_sample_idx(struct minstrel
+@@ -332,8 +348,8 @@ minstrel_next_sample_idx(struct minstrel
  }
  
  static void
@@ -59,7 +59,7 @@
  {
  	int group, orig_group;
  
-@@ -350,6 +366,7 @@ minstrel_downgrade_rate(struct minstrel_
+@@ -352,6 +368,7 @@ minstrel_downgrade_rate(struct minstrel_
  			*idx = mi->groups[group].max_tp_rate;
  		else
  			*idx = mi->groups[group].max_tp_rate2;
@@ -67,7 +67,7 @@
  		break;
  	}
  }
-@@ -450,13 +467,13 @@ minstrel_ht_tx_status(void *priv, struct
+@@ -452,13 +469,13 @@ minstrel_ht_tx_status(void *priv, struct
  	if (rate->attempts > 30 &&
  	    MINSTREL_FRAC(rate->success, rate->attempts) <
  	    MINSTREL_FRAC(20, 100))
@@ -83,7 +83,7 @@
  
  	if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) {
  		minstrel_ht_update_stats(mp, mi);
-@@ -521,7 +538,6 @@ minstrel_calc_retransmit(struct minstrel
+@@ -523,7 +540,6 @@ minstrel_calc_retransmit(struct minstrel
  static void
  minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
                       struct ieee80211_tx_rate *rate, int index,
@@ -91,7 +91,7 @@
                       bool sample, bool rtscts)
  {
  	const struct mcs_group *group = &minstrel_mcs_groups[index / MCS_GROUP_RATES];
-@@ -609,6 +625,7 @@ minstrel_ht_get_rate(void *priv, struct 
+@@ -611,6 +627,7 @@ minstrel_ht_get_rate(void *priv, struct 
  	struct minstrel_priv *mp = priv;
  	int sample_idx;
  	bool sample = false;
@@ -99,7 +99,7 @@
  
  	if (rate_control_send_low(sta, priv_sta, txrc))
  		return;
-@@ -634,11 +651,10 @@ minstrel_ht_get_rate(void *priv, struct 
+@@ -636,11 +653,10 @@ minstrel_ht_get_rate(void *priv, struct 
  	if (sample_idx >= 0) {
  		sample = true;
  		minstrel_ht_set_rate(mp, mi, &ar[0], sample_idx,
@@ -113,7 +113,7 @@
  	}
  
  	if (mp->hw->max_rates >= 3) {
-@@ -648,33 +664,27 @@ minstrel_ht_get_rate(void *priv, struct 
+@@ -650,33 +666,27 @@ minstrel_ht_get_rate(void *priv, struct 
  		 * max_tp_rate -> max_tp_rate2 -> max_prob_rate by default.
  		 */
  		if (sample_idx >= 0)
@@ -157,7 +157,7 @@
  
  	mi->total_packets++;
  
-@@ -766,6 +776,7 @@ minstrel_ht_update_caps(void *priv, stru
+@@ -768,6 +778,7 @@ minstrel_ht_update_caps(void *priv, stru
  	if (!n_supported)
  		goto use_legacy;
  

+ 2 - 2
package/mac80211/patches/530-mac80211_cur_txpower.patch

@@ -1,6 +1,6 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -798,7 +798,7 @@ enum ieee80211_smps_mode {
+@@ -813,7 +813,7 @@ enum ieee80211_smps_mode {
   */
  struct ieee80211_conf {
  	u32 flags;
@@ -11,7 +11,7 @@
  	u16 listen_interval;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1568,7 +1568,7 @@ static int ieee80211_get_tx_power(struct
+@@ -1597,7 +1597,7 @@ static int ieee80211_get_tx_power(struct
  {
  	struct ieee80211_local *local = wiphy_priv(wiphy);
  

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

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1714,6 +1714,8 @@ static int ath9k_config(struct ieee80211
+@@ -1727,6 +1727,8 @@ static int ath9k_config(struct ieee80211
  			return -EINVAL;
  		}
  
@@ -9,7 +9,7 @@
  		/*
  		 * The most recent snapshot of channel->noisefloor for the old
  		 * channel is only available after the hardware reset. Copy it to
-@@ -1731,6 +1733,7 @@ static int ath9k_config(struct ieee80211
+@@ -1744,6 +1746,7 @@ static int ath9k_config(struct ieee80211
  		ath9k_cmn_update_txpow(ah, sc->curtxpow,
  				       sc->config.txpowlimit, &sc->curtxpow);
  		ath9k_ps_restore(sc);

+ 7 - 7
package/mac80211/patches/540-ath9k_limit_qlen.patch

@@ -20,7 +20,7 @@
  	spinlock_t txbuflock;
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1654,6 +1654,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1679,6 +1679,10 @@ int ath9k_init_debug(struct ath_hw *ah)
  			    sc, &fops_wiphy);
  	debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc,
  			    &fops_xmit);
@@ -57,7 +57,7 @@
  	while (bf) {
  		u16 seqno = bf->bf_state.seqno;
  
-@@ -816,6 +826,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_
+@@ -821,6 +831,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_
  			ath_tx_addto_baw(sc, tid, seqno);
  		bf->bf_state.ndelim = ndelim;
  
@@ -65,7 +65,7 @@
  		__skb_unlink(skb, &tid->buf_q);
  		list_add_tail(&bf->list, bf_q);
  		if (bf_prev)
-@@ -1693,6 +1704,8 @@ static void ath_tx_send_ampdu(struct ath
+@@ -1687,6 +1698,8 @@ static void ath_tx_send_ampdu(struct ath
  	/* Add sub-frame to BAW */
  	ath_tx_addto_baw(sc, tid, bf->bf_state.seqno);
  
@@ -74,7 +74,7 @@
  	/* Queue to h/w without aggregation */
  	TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw);
  	bf->bf_lastbf = bf;
-@@ -1821,23 +1834,13 @@ error:
+@@ -1815,23 +1828,13 @@ error:
  
  /* FIXME: tx power */
  static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb,
@@ -100,7 +100,7 @@
  
  	if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) {
  		/*
-@@ -1872,6 +1875,7 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -1866,6 +1869,7 @@ int ath_tx_start(struct ieee80211_hw *hw
  	struct ieee80211_vif *vif = info->control.vif;
  	struct ath_softc *sc = hw->priv;
  	struct ath_txq *txq = txctl->txq;
@@ -108,7 +108,7 @@
  	int padpos, padsize;
  	int frmlen = skb->len + FCS_LEN;
  	int q;
-@@ -1916,6 +1920,24 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -1908,6 +1912,24 @@ int ath_tx_start(struct ieee80211_hw *hw
  
  	setup_frame_info(hw, skb, frmlen);
  
@@ -133,7 +133,7 @@
  	/*
  	 * At this point, the vif, hw_key and sta pointers in the tx control
  	 * info are no longer valid (overwritten by the ath_frame_info data.
-@@ -1930,7 +1952,7 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -1922,7 +1944,7 @@ int ath_tx_start(struct ieee80211_hw *hw
  	}
  	spin_unlock_bh(&txq->axq_lock);
  

+ 6 - 6
package/mac80211/patches/541-ath9k_sw_retry_reduce.patch

@@ -23,7 +23,7 @@
 @@ -382,6 +385,7 @@ static void ath_tx_complete_aggr(struct 
  	int nframes;
  	u8 tidno;
- 	bool clear_filter;
+ 	bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
 +	int i, retries;
  
  	skb = bf->bf_mpdu;
@@ -39,19 +39,19 @@
  	rcu_read_lock();
  
  	sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2);
-@@ -475,7 +483,8 @@ static void ath_tx_complete_aggr(struct 
+@@ -476,7 +484,8 @@ static void ath_tx_complete_aggr(struct 
+ 				txpending = 1;
  			} else if (fi->retries < ATH_MAX_SW_RETRIES) {
- 				if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
- 				    !an->sleeping)
+ 				if (txok || !an->sleeping)
 -					ath_tx_set_retry(sc, txq, bf->bf_mpdu);
 +					ath_tx_set_retry(sc, txq, bf->bf_mpdu,
 +							 retries);
  
- 				clear_filter = true;
  				txpending = 1;
+ 			} else {
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -540,7 +540,7 @@ struct ath_ant_comb {
+@@ -542,7 +542,7 @@ struct ath_ant_comb {
  #define DEFAULT_CACHELINE       32
  #define ATH_REGCLASSIDS_MAX     10
  #define ATH_CABQ_READY_TIME     80      /* % of beacon interval */

+ 1 - 1
package/mac80211/patches/550-ath9k_ar9280_cold_reset.patch → package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1371,10 +1371,16 @@ static bool ath9k_hw_set_reset_reg(struc
+@@ -1381,10 +1381,16 @@ static bool ath9k_hw_set_reset_reg(struc
  static bool ath9k_hw_chip_reset(struct ath_hw *ah,
  				struct ath9k_channel *chan)
  {

+ 2 - 2
package/mac80211/patches/590-ath9k_debug_remove_packet_rssi.patch → package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -954,34 +954,6 @@ static ssize_t read_file_recv(struct fil
+@@ -963,34 +963,6 @@ static ssize_t read_file_recv(struct fil
  			"%18s : %10u\n", "DECRYPT BUSY ERR",
  			sc->debug.stats.rxstats.decrypt_busy_err);
  
@@ -35,7 +35,7 @@
  	PHY_ERR("UNDERRUN", ATH9K_PHYERR_UNDERRUN);
  	PHY_ERR("TIMING", ATH9K_PHYERR_TIMING);
  	PHY_ERR("PARITY", ATH9K_PHYERR_PARITY);
-@@ -1058,16 +1030,6 @@ void ath_debug_stat_rx(struct ath_softc 
+@@ -1067,16 +1039,6 @@ void ath_debug_stat_rx(struct ath_softc 
  		RX_PHY_ERR_INC(phyerr);
  	}
  

+ 0 - 93
package/mac80211/patches/551-ath9k_fix_keymiss_handling.patch

@@ -1,93 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -525,8 +525,8 @@ int ath9k_hw_process_rxdesc_edma(struct 
- 			rxs->rs_status |= ATH9K_RXERR_DECRYPT;
- 		else if (rxsp->status11 & AR_MichaelErr)
- 			rxs->rs_status |= ATH9K_RXERR_MIC;
--		else if (rxsp->status11 & AR_KeyMiss)
--			rxs->rs_status |= ATH9K_RXERR_DECRYPT;
-+		if (rxsp->status11 & AR_KeyMiss)
-+			rxs->rs_status |= ATH9K_RXERR_KEYMISS;
- 	}
- 
- 	return 0;
---- a/drivers/net/wireless/ath/ath9k/mac.c
-+++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -620,8 +620,8 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
- 			rs->rs_status |= ATH9K_RXERR_DECRYPT;
- 		else if (ads.ds_rxstatus8 & AR_MichaelErr)
- 			rs->rs_status |= ATH9K_RXERR_MIC;
--		else if (ads.ds_rxstatus8 & AR_KeyMiss)
--			rs->rs_status |= ATH9K_RXERR_DECRYPT;
-+		if (ads.ds_rxstatus8 & AR_KeyMiss)
-+			rs->rs_status |= ATH9K_RXERR_KEYMISS;
- 	}
- 
- 	return 0;
---- a/drivers/net/wireless/ath/ath9k/mac.h
-+++ b/drivers/net/wireless/ath/ath9k/mac.h
-@@ -181,6 +181,7 @@ struct ath_htc_rx_status {
- #define ATH9K_RXERR_FIFO          0x04
- #define ATH9K_RXERR_DECRYPT       0x08
- #define ATH9K_RXERR_MIC           0x10
-+#define ATH9K_RXERR_KEYMISS       0x20
- 
- #define ATH9K_RX_MORE             0x01
- #define ATH9K_RX_MORE_AGGR        0x02
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -826,7 +826,8 @@ static bool ath9k_rx_accept(struct ath_c
- 		test_bit(rx_stats->rs_keyix, common->tkip_keymap);
- 	strip_mic = is_valid_tkip && ieee80211_is_data(fc) &&
- 		!(rx_stats->rs_status &
--		(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC));
-+		(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC |
-+		 ATH9K_RXERR_KEYMISS));
- 
- 	if (!rx_stats->rs_datalen)
- 		return false;
-@@ -854,6 +855,8 @@ static bool ath9k_rx_accept(struct ath_c
- 	 * descriptors.
- 	 */
- 	if (rx_stats->rs_status != 0) {
-+		u8 status_mask;
-+
- 		if (rx_stats->rs_status & ATH9K_RXERR_CRC) {
- 			rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
- 			mic_error = false;
-@@ -861,7 +864,8 @@ static bool ath9k_rx_accept(struct ath_c
- 		if (rx_stats->rs_status & ATH9K_RXERR_PHY)
- 			return false;
- 
--		if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
-+		if ((rx_stats->rs_status & ATH9K_RXERR_DECRYPT) ||
-+		    (!is_mc && (rx_stats->rs_status & ATH9K_RXERR_KEYMISS))) {
- 			*decrypt_error = true;
- 			mic_error = false;
- 		}
-@@ -871,17 +875,14 @@ static bool ath9k_rx_accept(struct ath_c
- 		 * decryption and MIC failures. For monitor mode,
- 		 * we also ignore the CRC error.
- 		 */
--		if (ah->is_monitoring) {
--			if (rx_stats->rs_status &
--			    ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
--			      ATH9K_RXERR_CRC))
--				return false;
--		} else {
--			if (rx_stats->rs_status &
--			    ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
--				return false;
--			}
--		}
-+		status_mask = ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
-+			      ATH9K_RXERR_KEYMISS;
-+
-+		if (ah->is_monitoring)
-+			status_mask |= ATH9K_RXERR_CRC;
-+
-+		if (rx_stats->rs_status & ~status_mask)
-+			return false;
- 	}
- 
- 	/*

+ 20 - 20
package/mac80211/patches/591-ath9k_per_chain_signal_strength.patch → package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch

@@ -1,6 +1,6 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -666,6 +666,9 @@ enum mac80211_rx_flags {
+@@ -681,6 +681,9 @@ enum mac80211_rx_flags {
   * @mactime: value in microseconds of the 64-bit Time Synchronization Function
   * 	(TSF) timer when the first data symbol (MPDU) arrived at the hardware.
   * @band: the active band when this frame was received
@@ -10,7 +10,7 @@
   * @freq: frequency the radio was tuned to when receiving this frame, in MHz
   * @signal: signal strength when receiving this frame, either in dBm, in dB or
   *	unspecified depending on the hardware capabilities flags
-@@ -679,6 +682,10 @@ enum mac80211_rx_flags {
+@@ -694,6 +697,10 @@ enum mac80211_rx_flags {
  struct ieee80211_rx_status {
  	u64 mactime;
  	enum ieee80211_band band;
@@ -23,7 +23,7 @@
  	int antenna;
 --- a/net/mac80211/sta_info.h
 +++ b/net/mac80211/sta_info.h
-@@ -292,6 +292,11 @@ struct sta_info {
+@@ -300,6 +300,11 @@ struct sta_info {
  	unsigned long rx_dropped;
  	int last_signal;
  	struct ewma avg_signal;
@@ -37,7 +37,7 @@
  
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -1169,6 +1169,7 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1244,6 +1244,7 @@ ieee80211_rx_h_sta_process(struct ieee80
  	struct sk_buff *skb = rx->skb;
  	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -45,7 +45,7 @@
  
  	if (!sta)
  		return RX_CONTINUE;
-@@ -1211,6 +1212,19 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1286,6 +1287,19 @@ ieee80211_rx_h_sta_process(struct ieee80
  	sta->last_signal = status->signal;
  	ewma_add(&sta->avg_signal, -status->signal);
  
@@ -67,7 +67,7 @@
  	 * exchange sequence.
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -295,6 +295,8 @@ struct sta_info *sta_info_alloc(struct i
+@@ -304,6 +304,8 @@ struct sta_info *sta_info_alloc(struct i
  	do_posix_clock_monotonic_gettime(&uptime);
  	sta->last_connected = uptime.tv_sec;
  	ewma_init(&sta->avg_signal, 1024, 8);
@@ -78,7 +78,7 @@
  		kfree(sta);
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -481,6 +481,8 @@ struct station_parameters {
+@@ -497,6 +497,8 @@ struct station_parameters {
   * @STATION_INFO_BSS_PARAM: @bss_param filled
   * @STATION_INFO_CONNECTED_TIME: @connected_time filled
   * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled
@@ -87,7 +87,7 @@
   */
  enum station_info_flags {
  	STATION_INFO_INACTIVE_TIME	= 1<<0,
-@@ -500,7 +502,9 @@ enum station_info_flags {
+@@ -516,7 +518,9 @@ enum station_info_flags {
  	STATION_INFO_RX_BITRATE		= 1<<14,
  	STATION_INFO_BSS_PARAM          = 1<<15,
  	STATION_INFO_CONNECTED_TIME	= 1<<16,
@@ -98,7 +98,7 @@
  };
  
  /**
-@@ -580,6 +584,9 @@ struct sta_bss_parameters {
+@@ -596,6 +600,9 @@ struct sta_bss_parameters {
   * @plink_state: mesh peer link state
   * @signal: signal strength of last received packet in dBm
   * @signal_avg: signal strength average in dBm
@@ -108,7 +108,7 @@
   * @txrate: current unicast bitrate from this station
   * @rxrate: current unicast bitrate to this station
   * @rx_packets: packets received from this station
-@@ -609,6 +616,11 @@ struct station_info {
+@@ -625,6 +632,11 @@ struct station_info {
  	u8 plink_state;
  	s8 signal;
  	s8 signal_avg;
@@ -139,7 +139,7 @@
  	u8 rs_num_delims;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -983,6 +983,7 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -981,6 +981,7 @@ static int ath9k_rx_skb_preprocess(struc
  				   bool *decrypt_error)
  {
  	struct ath_hw *ah = common->ah;
@@ -147,7 +147,7 @@
  
  	memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
  
-@@ -1008,6 +1009,20 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -1006,6 +1007,20 @@ static int ath9k_rx_skb_preprocess(struc
  	rx_status->antenna = rx_stats->rs_antenna;
  	rx_status->flag |= RX_FLAG_MACTIME_MPDU;
  
@@ -168,7 +168,7 @@
  	return 0;
  }
  
-@@ -1538,14 +1553,14 @@ static void ath_ant_comb_scan(struct ath
+@@ -1536,14 +1551,14 @@ static void ath_ant_comb_scan(struct ath
  	struct ath_ant_comb *antcomb = &sc->ant_comb;
  	int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
  	int curr_main_set;
@@ -250,7 +250,7 @@
  	if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1032,12 +1032,12 @@ void ath_debug_stat_rx(struct ath_softc 
+@@ -1041,12 +1041,12 @@ void ath_debug_stat_rx(struct ath_softc 
  
  	spin_lock(&sc->debug.samp_lock);
  	RX_SAMP_DBG(jiffies) = jiffies;
@@ -271,7 +271,7 @@
  	RX_SAMP_DBG(rate) = rs->rs_rate;
 --- a/include/linux/nl80211.h
 +++ b/include/linux/nl80211.h
-@@ -1497,6 +1497,8 @@ enum nl80211_sta_bss_param {
+@@ -1548,6 +1548,8 @@ enum nl80211_sta_bss_param {
   * @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute
   *     containing info as possible, see &enum nl80211_sta_bss_param
   * @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected
@@ -280,7 +280,7 @@
   * @__NL80211_STA_INFO_AFTER_LAST: internal
   * @NL80211_STA_INFO_MAX: highest possible station info attribute
   */
-@@ -1518,6 +1520,8 @@ enum nl80211_sta_info {
+@@ -1569,6 +1571,8 @@ enum nl80211_sta_info {
  	NL80211_STA_INFO_RX_BITRATE,
  	NL80211_STA_INFO_BSS_PARAM,
  	NL80211_STA_INFO_CONNECTED_TIME,
@@ -291,7 +291,7 @@
  	__NL80211_STA_INFO_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -2238,6 +2238,33 @@ nla_put_failure:
+@@ -2257,6 +2257,33 @@ nla_put_failure:
  	return false;
  }
  
@@ -325,7 +325,7 @@
  static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
  				int flags, struct net_device *dev,
  				const u8 *mac_addr, struct station_info *sinfo)
-@@ -2284,6 +2311,18 @@ static int nl80211_send_station(struct s
+@@ -2303,6 +2330,18 @@ static int nl80211_send_station(struct s
  	if (sinfo->filled & STATION_INFO_SIGNAL_AVG)
  		NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG,
  			   sinfo->signal_avg);
@@ -346,7 +346,7 @@
  					  NL80211_STA_INFO_TX_BITRATE))
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -329,6 +329,7 @@ static void sta_set_sinfo(struct sta_inf
+@@ -330,6 +330,7 @@ static void sta_set_sinfo(struct sta_inf
  {
  	struct ieee80211_sub_if_data *sdata = sta->sdata;
  	struct timespec uptime;
@@ -354,7 +354,7 @@
  
  	sinfo->generation = sdata->local->sta_generation;
  
-@@ -363,6 +364,17 @@ static void sta_set_sinfo(struct sta_inf
+@@ -364,6 +365,17 @@ static void sta_set_sinfo(struct sta_inf
  		sinfo->signal = (s8)sta->last_signal;
  		sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
  	}

+ 0 - 37
package/mac80211/patches/552-ath9k_fix_phyerror.patch

@@ -1,37 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -425,12 +425,9 @@ void ath_rx_cleanup(struct ath_softc *sc
- 
- u32 ath_calcrxfilter(struct ath_softc *sc)
- {
--#define	RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR)
--
- 	u32 rfilt;
- 
--	rfilt = (ath9k_hw_getrxfilter(sc->sc_ah) & RX_FILTER_PRESERVE)
--		| ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST
-+	rfilt = ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST
- 		| ATH9K_RX_FILTER_MCAST;
- 
- 	if (sc->rx.rxfilter & FIF_PROBE_REQ)
---- a/drivers/net/wireless/ath/ath9k/ani.c
-+++ b/drivers/net/wireless/ath/ath9k/ani.c
-@@ -502,9 +502,6 @@ static void ath9k_ani_reset_old(struct a
- 		ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR,
- 				     ATH9K_ANI_CCK_WEAK_SIG_THR);
- 
--		ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) |
--				     ATH9K_RX_FILTER_PHYERR);
--
- 		ath9k_ani_restart(ah);
- 		return;
- 	}
-@@ -525,8 +522,6 @@ static void ath9k_ani_reset_old(struct a
- 		ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
- 				     aniState->firstepLevel);
- 
--	ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) &
--			     ~ATH9K_RX_FILTER_PHYERR);
- 	ath9k_ani_restart(ah);
- 
- 	ENABLE_REGWRITE_BUFFER(ah);

+ 0 - 96
package/mac80211/patches/561-mac80211_tx_status.patch

@@ -1,96 +0,0 @@
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -2370,6 +2370,25 @@ static inline int ieee80211_sta_ps_trans
- void ieee80211_sta_set_tim(struct ieee80211_sta *sta);
- 
- /**
-+ * ieee80211_tx_status_sta - transmit status callback
-+ *
-+ * Call this function for all transmitted frames after they have been
-+ * transmitted. It is permissible to not call this function for
-+ * multicast frames but this can affect statistics.
-+ *
-+ * This function may not be called in IRQ context. Calls to this function
-+ * for a single hardware must be synchronized against each other. Calls
-+ * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
-+ * may not be mixed for a single hardware.
-+ *
-+ * @hw: the hardware the frame was transmitted by
-+ * @skb: the frame that was transmitted, owned by mac80211 after this call
-+ * @sta: station for which the tx status is provided
-+ */
-+void ieee80211_tx_status_sta(struct ieee80211_hw *hw, struct sk_buff *skb,
-+			     struct ieee80211_sta *sta);
-+
-+/**
-  * ieee80211_tx_status - transmit status callback
-  *
-  * Call this function for all transmitted frames after they have been
-@@ -2384,8 +2403,11 @@ void ieee80211_sta_set_tim(struct ieee80
-  * @hw: the hardware the frame was transmitted by
-  * @skb: the frame that was transmitted, owned by mac80211 after this call
-  */
--void ieee80211_tx_status(struct ieee80211_hw *hw,
--			 struct sk_buff *skb);
-+static inline void ieee80211_tx_status(struct ieee80211_hw *hw,
-+				       struct sk_buff *skb)
-+{
-+	ieee80211_tx_status_sta(hw, skb, NULL);
-+}
- 
- /**
-  * ieee80211_tx_status_ni - transmit status callback (in process context)
---- a/net/mac80211/status.c
-+++ b/net/mac80211/status.c
-@@ -202,7 +202,8 @@ static void ieee80211_set_bar_pending(st
-  */
- #define STA_LOST_PKT_THRESHOLD	50
- 
--void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
-+void ieee80211_tx_status_sta(struct ieee80211_hw *hw, struct sk_buff *skb,
-+			     struct ieee80211_sta *pubsta)
- {
- 	struct sk_buff *skb2;
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-@@ -214,7 +215,7 @@ void ieee80211_tx_status(struct ieee8021
- 	struct ieee80211_tx_status_rtap_hdr *rthdr;
- 	struct ieee80211_sub_if_data *sdata;
- 	struct net_device *prev_dev = NULL;
--	struct sta_info *sta, *tmp;
-+	struct sta_info *sta = NULL, *tmp, *tmp2;
- 	int retry_count = -1, i;
- 	int rates_idx = -1;
- 	bool send_to_cooked;
-@@ -244,11 +245,19 @@ void ieee80211_tx_status(struct ieee8021
- 	sband = local->hw.wiphy->bands[info->band];
- 	fc = hdr->frame_control;
- 
--	for_each_sta_info(local, hdr->addr1, sta, tmp) {
--		/* skip wrong virtual interface */
--		if (memcmp(hdr->addr2, sta->sdata->vif.addr, ETH_ALEN))
--			continue;
-+	if (!pubsta) {
-+		for_each_sta_info(local, hdr->addr1, tmp, tmp2) {
-+			/* skip wrong virtual interface */
-+			if (memcmp(hdr->addr2, tmp->sdata->vif.addr, ETH_ALEN))
-+				continue;
-+
-+			sta = tmp;
-+		}
-+	} else {
-+		sta = container_of(pubsta, struct sta_info, sta);
-+	}
- 
-+	if (sta) {
- 		acked = !!(info->flags & IEEE80211_TX_STAT_ACK);
- 		if (!acked && test_sta_flags(sta, WLAN_STA_PS_STA)) {
- 			/*
-@@ -497,7 +506,7 @@ void ieee80211_tx_status(struct ieee8021
- 	rcu_read_unlock();
- 	dev_kfree_skb(skb);
- }
--EXPORT_SYMBOL(ieee80211_tx_status);
-+EXPORT_SYMBOL(ieee80211_tx_status_sta);
- 
- void ieee80211_report_low_ack(struct ieee80211_sta *pubsta, u32 num_packets)
- {

+ 0 - 121
package/mac80211/patches/562-ath9k_tx_status.patch

@@ -1,121 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -50,10 +50,12 @@ static u16 bits_per_symbol[][2] = {
- static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
- 			       struct ath_atx_tid *tid, struct sk_buff *skb);
- static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
--			    int tx_flags, struct ath_txq *txq);
-+			    int tx_flags, struct ath_txq *txq,
-+			    struct ieee80211_sta *sta);
- static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
- 				struct ath_txq *txq, struct list_head *bf_q,
--				struct ath_tx_status *ts, int txok, int sendbar);
-+				struct ath_tx_status *ts, int txok, int sendbar,
-+				struct ieee80211_sta *sta);
- static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
- 			     struct list_head *head, bool internal);
- static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
-@@ -172,7 +174,8 @@ static void ath_tx_flush_tid(struct ath_
- 		if (bf && fi->retries) {
- 			list_add_tail(&bf->list, &bf_head);
- 			ath_tx_update_baw(sc, tid, bf->bf_state.seqno);
--			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 1);
-+			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0,
-+				1, NULL);
- 		} else {
- 			ath_tx_send_normal(sc, txq, NULL, skb);
- 		}
-@@ -239,7 +242,7 @@ static void ath_tid_drain(struct ath_sof
- 
- 		if (!bf) {
- 			spin_unlock(&txq->axq_lock);
--			ath_tx_complete(sc, skb, ATH_TX_ERROR, txq);
-+			ath_tx_complete(sc, skb, ATH_TX_ERROR, txq, NULL);
- 			spin_lock(&txq->axq_lock);
- 			continue;
- 		}
-@@ -250,7 +253,7 @@ static void ath_tid_drain(struct ath_sof
- 			ath_tx_update_baw(sc, tid, bf->bf_state.seqno);
- 
- 		spin_unlock(&txq->axq_lock);
--		ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0);
-+		ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0, NULL);
- 		spin_lock(&txq->axq_lock);
- 	}
- 
-@@ -412,7 +415,7 @@ static void ath_tx_complete_aggr(struct 
- 				list_move_tail(&bf->list, &bf_head);
- 
- 			ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
--				0, 0);
-+				0, 0, NULL);
- 
- 			bf = bf_next;
- 		}
-@@ -520,7 +523,7 @@ static void ath_tx_complete_aggr(struct 
- 			}
- 
- 			ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
--				!txfail, sendbar);
-+				!txfail, sendbar, sta);
- 		} else {
- 			/* retry the un-acked ones */
- 			if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) {
-@@ -540,7 +543,8 @@ static void ath_tx_complete_aggr(struct 
- 
- 						ath_tx_complete_buf(sc, bf, txq,
- 								    &bf_head,
--								    ts, 0, 1);
-+								    ts, 0, 1,
-+								    sta);
- 						break;
- 					}
- 
-@@ -1465,7 +1469,8 @@ static void ath_drain_txq_list(struct at
- 			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, 0);
-+			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0,
-+				NULL);
- 		spin_lock_bh(&txq->axq_lock);
- 	}
- }
-@@ -1970,7 +1975,8 @@ int ath_tx_start(struct ieee80211_hw *hw
- /*****************/
- 
- static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
--			    int tx_flags, struct ath_txq *txq)
-+			    int tx_flags, struct ath_txq *txq,
-+			    struct ieee80211_sta *sta)
- {
- 	struct ieee80211_hw *hw = sc->hw;
- 	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
-@@ -2028,7 +2034,8 @@ static void ath_tx_complete(struct ath_s
- 
- static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
- 				struct ath_txq *txq, struct list_head *bf_q,
--				struct ath_tx_status *ts, int txok, int sendbar)
-+				struct ath_tx_status *ts, int txok, int sendbar,
-+				struct ieee80211_sta *sta)
- {
- 	struct sk_buff *skb = bf->bf_mpdu;
- 	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
-@@ -2056,7 +2063,7 @@ static void ath_tx_complete_buf(struct a
- 			complete(&sc->paprd_complete);
- 	} else {
- 		ath_debug_stat_tx(sc, bf, ts, txq, tx_flags);
--		ath_tx_complete(sc, skb, tx_flags, txq);
-+		ath_tx_complete(sc, skb, tx_flags, txq, sta);
- 	}
- 	/* At this point, skb (bf->bf_mpdu) is consumed...make sure we don't
- 	 * accidentally reference it later.
-@@ -2145,7 +2152,7 @@ static void ath_tx_process_buffer(struct
- 
- 	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, 0);
-+		ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0, NULL);
- 	} else
- 		ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true);
- 

+ 0 - 27
package/mac80211/patches/570-ath9k_tx_stop_failure_debug.patch

@@ -1,27 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -1512,7 +1512,8 @@ bool ath_drain_all_txq(struct ath_softc 
- 	struct ath_hw *ah = sc->sc_ah;
- 	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
- 	struct ath_txq *txq;
--	int i, npend = 0;
-+	int i;
-+	u32 npend = 0;
- 
- 	if (sc->sc_flags & SC_OP_INVALID)
- 		return true;
-@@ -1524,11 +1525,12 @@ bool ath_drain_all_txq(struct ath_softc 
- 		if (!ATH_TXQ_SETUP(sc, i))
- 			continue;
- 
--		npend += ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum);
-+		if (ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum))
-+			npend |= BIT(i);
- 	}
- 
- 	if (npend)
--		ath_err(common, "Failed to stop TX DMA!\n");
-+		ath_err(common, "Failed to stop TX DMA, queues=%08x!\n", npend);
- 
- 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
- 		if (!ATH_TXQ_SETUP(sc, i))

+ 0 - 124
package/mac80211/patches/571-ath9k_reset_debug.patch

@@ -1,124 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/debug.h
-+++ b/drivers/net/wireless/ath/ath9k/debug.h
-@@ -25,8 +25,10 @@ struct ath_buf;
- 
- #ifdef CONFIG_ATH9K_DEBUGFS
- #define TX_STAT_INC(q, c) sc->debug.stats.txstats[q].c++
-+#define RESET_STAT_INC(sc, type) sc->debug.stats.reset[type]++
- #else
- #define TX_STAT_INC(q, c) do { } while (0)
-+#define RESET_STAT_INC(sc, type) do { } while (0)
- #endif
- 
- #ifdef CONFIG_ATH9K_DEBUGFS
-@@ -171,10 +173,21 @@ struct ath_rx_stats {
- 	u8 rs_antenna;
- };
- 
-+enum ath_reset_type {
-+	RESET_TYPE_BB_HANG,
-+	RESET_TYPE_BB_WATCHDOG,
-+	RESET_TYPE_FATAL_INT,
-+	RESET_TYPE_TX_ERROR,
-+	RESET_TYPE_TX_HANG,
-+	RESET_TYPE_PLL_HANG,
-+	__RESET_TYPE_MAX
-+};
-+
- struct ath_stats {
- 	struct ath_interrupt_stats istats;
- 	struct ath_tx_stats txstats[ATH9K_NUM_TX_QUEUES];
- 	struct ath_rx_stats rxstats;
-+	u32 reset[__RESET_TYPE_MAX];
- };
- 
- #define ATH_DBG_MAX_SAMPLES	10
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -679,6 +679,16 @@ void ath9k_tasklet(unsigned long data)
- 
- 	if ((status & ATH9K_INT_FATAL) ||
- 	    (status & ATH9K_INT_BB_WATCHDOG)) {
-+#ifdef CONFIG_ATH9K_DEBUGFS
-+		enum ath_reset_type type;
-+
-+		if (status & ATH9K_INT_FATAL)
-+			type = RESET_TYPE_FATAL_INT;
-+		else
-+			type = RESET_TYPE_BB_WATCHDOG;
-+
-+		RESET_STAT_INC(sc, type);
-+#endif
- 		ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
- 		goto out;
- 	}
-@@ -995,8 +1005,10 @@ void ath_hw_check(struct work_struct *wo
- 	ath_dbg(common, ATH_DBG_RESET, "Possible baseband hang, "
- 		"busy=%d (try %d)\n", busy, sc->hw_busy_count + 1);
- 	if (busy >= 99) {
--		if (++sc->hw_busy_count >= 3)
-+		if (++sc->hw_busy_count >= 3) {
-+			RESET_STAT_INC(sc, RESET_TYPE_BB_HANG);
- 			ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
-+		}
- 
- 	} else if (busy >= 0)
- 		sc->hw_busy_count = 0;
-@@ -1016,6 +1028,7 @@ static void ath_hw_pll_rx_hang_check(str
- 			/* Rx is hung for more than 500ms. Reset it */
- 			ath_dbg(common, ATH_DBG_RESET,
- 				"Possible RX hang, resetting");
-+			RESET_STAT_INC(sc, RESET_TYPE_PLL_HANG);
- 			ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
- 			count = 0;
- 		}
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -587,8 +587,10 @@ static void ath_tx_complete_aggr(struct 
- 
- 	rcu_read_unlock();
- 
--	if (needreset)
-+	if (needreset) {
-+		RESET_STAT_INC(sc, RESET_TYPE_TX_ERROR);
- 		ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
-+	}
- }
- 
- static bool ath_lookup_legacy(struct ath_buf *bf)
-@@ -2270,6 +2272,7 @@ static void ath_tx_complete_poll_work(st
- 	if (needreset) {
- 		ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
- 			"tx hung, resetting the chip\n");
-+		RESET_STAT_INC(sc, RESET_TYPE_TX_HANG);
- 		ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
- 	}
- 
---- a/drivers/net/wireless/ath/ath9k/debug.c
-+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -523,9 +523,22 @@ static ssize_t read_file_wiphy(struct fi
- 	if (tmp & ATH9K_RX_FILTER_PHYRADAR)
- 		len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR");
- 	if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL)
--		len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL\n");
--	else
--		len += snprintf(buf + len, sizeof(buf) - len, "\n");
-+		len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL");
-+
-+	len += snprintf(buf + len, sizeof(buf) - len,
-+		       "\n\nReset causes:\n"
-+		       "  baseband hang: %d\n"
-+		       "  baseband watchdog: %d\n"
-+		       "  fatal hardware error interrupt: %d\n"
-+		       "  tx hardware error: %d\n"
-+		       "  tx path hang: %d\n"
-+		       "  pll rx hang: %d\n",
-+		       sc->debug.stats.reset[RESET_TYPE_BB_HANG],
-+		       sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG],
-+		       sc->debug.stats.reset[RESET_TYPE_FATAL_INT],
-+		       sc->debug.stats.reset[RESET_TYPE_TX_ERROR],
-+		       sc->debug.stats.reset[RESET_TYPE_TX_HANG],
-+		       sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
- 
- 	if (len > sizeof(buf))
- 		len = sizeof(buf);

+ 0 - 41
package/mac80211/patches/572-ath9k_fix_tx_retry.patch

@@ -1,41 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -387,7 +387,6 @@ static void ath_tx_complete_aggr(struct 
- 	struct ath_frame_info *fi;
- 	int nframes;
- 	u8 tidno;
--	bool clear_filter;
- 	int i, retries;
- 
- 	skb = bf->bf_mpdu;
-@@ -484,12 +483,10 @@ static void ath_tx_complete_aggr(struct 
- 				 */
- 				txfail = 1;
- 			} else if (fi->retries < ATH_MAX_SW_RETRIES) {
--				if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
--				    !an->sleeping)
-+				if (txok || !an->sleeping)
- 					ath_tx_set_retry(sc, txq, bf->bf_mpdu,
- 							 retries);
- 
--				clear_filter = true;
- 				txpending = 1;
- 			} else {
- 				txfail = 1;
-@@ -568,11 +565,13 @@ static void ath_tx_complete_aggr(struct 
- 			ieee80211_sta_set_tim(sta);
- 
- 		spin_lock_bh(&txq->axq_lock);
--		if (clear_filter)
--			tid->ac->clear_ps_filter = true;
- 		skb_queue_splice(&bf_pending, &tid->buf_q);
--		if (!an->sleeping)
-+		if (!an->sleeping) {
- 			ath_tx_queue_tid(txq, tid);
-+
-+			if (ts->ts_status & ATH9K_TXERR_FILT)
-+				tid->ac->clear_ps_filter = true;
-+		}
- 		spin_unlock_bh(&txq->axq_lock);
- 	}
- 

+ 0 - 51
package/mac80211/patches/573-ath9k_fix_tx_flush_bar.patch

@@ -1,51 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/mac.h
-+++ b/drivers/net/wireless/ath/ath9k/mac.h
-@@ -75,9 +75,10 @@
- #define ATH9K_TXERR_XTXOP          0x08
- #define ATH9K_TXERR_TIMER_EXPIRED  0x10
- #define ATH9K_TX_ACKED		   0x20
-+#define ATH9K_TX_FLUSH		   0x40
- #define ATH9K_TXERR_MASK						\
- 	(ATH9K_TXERR_XRETRY | ATH9K_TXERR_FILT | ATH9K_TXERR_FIFO |	\
--	 ATH9K_TXERR_XTXOP | ATH9K_TXERR_TIMER_EXPIRED)
-+	 ATH9K_TXERR_XTXOP | ATH9K_TXERR_TIMER_EXPIRED | ATH9K_TX_FLUSH)
- 
- #define ATH9K_TX_BA                0x01
- #define ATH9K_TX_PWRMGMT           0x02
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -388,6 +388,7 @@ static void ath_tx_complete_aggr(struct 
- 	int nframes;
- 	u8 tidno;
- 	int i, retries;
-+	bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
- 
- 	skb = bf->bf_mpdu;
- 	hdr = (struct ieee80211_hdr *)skb->data;
-@@ -482,6 +483,8 @@ static void ath_tx_complete_aggr(struct 
- 				 * the un-acked sub-frames
- 				 */
- 				txfail = 1;
-+			} else if (flush) {
-+				txpending = 1;
- 			} else if (fi->retries < ATH_MAX_SW_RETRIES) {
- 				if (txok || !an->sleeping)
- 					ath_tx_set_retry(sc, txq, bf->bf_mpdu,
-@@ -540,7 +543,8 @@ static void ath_tx_complete_aggr(struct 
- 
- 						ath_tx_complete_buf(sc, bf, txq,
- 								    &bf_head,
--								    ts, 0, 1,
-+								    ts, 0,
-+								    !flush,
- 								    sta);
- 						break;
- 					}
-@@ -1446,6 +1450,7 @@ static void ath_drain_txq_list(struct at
- 	struct ath_tx_status ts;
- 
- 	memset(&ts, 0, sizeof(ts));
-+	ts.ts_status = ATH9K_TX_FLUSH;
- 	INIT_LIST_HEAD(&bf_head);
- 
- 	while (!list_empty(list)) {

+ 0 - 155
package/mac80211/patches/580-ath9k_cleanup_set_interrupt.patch

@@ -1,155 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -515,7 +515,7 @@ static void ath_beacon_config_ap(struct 
- 	sc->sc_flags |= SC_OP_TSF_RESET;
- 	ath9k_beacon_init(sc, nexttbtt, intval);
- 	sc->beacon.bmisscnt = 0;
--	ath9k_hw_set_interrupts(ah, ah->imask);
-+	ath9k_hw_set_interrupts(ah);
- 	ath9k_hw_enable_interrupts(ah);
- }
- 
-@@ -643,7 +643,7 @@ static void ath_beacon_config_sta(struct
- 	ath9k_hw_set_sta_beacon_timers(ah, &bs);
- 	ah->imask |= ATH9K_INT_BMISS;
- 
--	ath9k_hw_set_interrupts(ah, ah->imask);
-+	ath9k_hw_set_interrupts(ah);
- 	ath9k_hw_enable_interrupts(ah);
- }
- 
-@@ -679,7 +679,7 @@ static void ath_beacon_config_adhoc(stru
- 	ath9k_beacon_init(sc, nexttbtt, intval);
- 	sc->beacon.bmisscnt = 0;
- 
--	ath9k_hw_set_interrupts(ah, ah->imask);
-+	ath9k_hw_set_interrupts(ah);
- 	ath9k_hw_enable_interrupts(ah);
- }
- 
-@@ -821,11 +821,11 @@ void ath9k_set_beaconing_status(struct a
- 	if (status) {
- 		/* Re-enable beaconing */
- 		ah->imask |= ATH9K_INT_SWBA;
--		ath9k_hw_set_interrupts(ah, ah->imask);
-+		ath9k_hw_set_interrupts(ah);
- 	} else {
- 		/* Disable SWBA interrupt */
- 		ah->imask &= ~ATH9K_INT_SWBA;
--		ath9k_hw_set_interrupts(ah, ah->imask);
-+		ath9k_hw_set_interrupts(ah);
- 		tasklet_kill(&sc->bcon_tasklet);
- 		ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq);
- 	}
---- a/drivers/net/wireless/ath/ath9k/gpio.c
-+++ b/drivers/net/wireless/ath/ath9k/gpio.c
-@@ -151,7 +151,7 @@ static void ath9k_gen_timer_start(struct
- 	if ((ah->imask & ATH9K_INT_GENTIMER) == 0) {
- 		ath9k_hw_disable_interrupts(ah);
- 		ah->imask |= ATH9K_INT_GENTIMER;
--		ath9k_hw_set_interrupts(ah, ah->imask);
-+		ath9k_hw_set_interrupts(ah);
- 		ath9k_hw_enable_interrupts(ah);
- 	}
- }
-@@ -166,7 +166,7 @@ static void ath9k_gen_timer_stop(struct 
- 	if (timer_table->timer_mask.val == 0) {
- 		ath9k_hw_disable_interrupts(ah);
- 		ah->imask &= ~ATH9K_INT_GENTIMER;
--		ath9k_hw_set_interrupts(ah, ah->imask);
-+		ath9k_hw_set_interrupts(ah);
- 		ath9k_hw_enable_interrupts(ah);
- 	}
- }
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -273,7 +273,7 @@ static bool ath_complete_reset(struct at
- 
- 	ath9k_cmn_update_txpow(ah, sc->curtxpow,
- 			       sc->config.txpowlimit, &sc->curtxpow);
--	ath9k_hw_set_interrupts(ah, ah->imask);
-+	ath9k_hw_set_interrupts(ah);
- 	ath9k_hw_enable_interrupts(ah);
- 
- 	if (!(sc->sc_flags & (SC_OP_OFFCHANNEL)) && start) {
-@@ -833,7 +833,7 @@ irqreturn_t ath_isr(int irq, void *dev)
- 
- 	if (status & ATH9K_INT_RXEOL) {
- 		ah->imask &= ~(ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
--		ath9k_hw_set_interrupts(ah, ah->imask);
-+		ath9k_hw_set_interrupts(ah);
- 	}
- 
- 	if (status & ATH9K_INT_MIB) {
-@@ -1409,7 +1409,7 @@ static void ath9k_calculate_summary_stat
- 		ah->imask &= ~ATH9K_INT_TSFOOR;
- 	}
- 
--	ath9k_hw_set_interrupts(ah, ah->imask);
-+	ath9k_hw_set_interrupts(ah);
- 
- 	/* Set up ANI */
- 	if (iter_data.naps > 0) {
-@@ -1566,7 +1566,7 @@ static void ath9k_enable_ps(struct ath_s
- 	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
- 		if ((ah->imask & ATH9K_INT_TIM_TIMER) == 0) {
- 			ah->imask |= ATH9K_INT_TIM_TIMER;
--			ath9k_hw_set_interrupts(ah, ah->imask);
-+			ath9k_hw_set_interrupts(ah);
- 		}
- 		ath9k_hw_setrxabort(ah, 1);
- 	}
-@@ -1586,7 +1586,7 @@ static void ath9k_disable_ps(struct ath_
- 				  PS_WAIT_FOR_TX_ACK);
- 		if (ah->imask & ATH9K_INT_TIM_TIMER) {
- 			ah->imask &= ~ATH9K_INT_TIM_TIMER;
--			ath9k_hw_set_interrupts(ah, ah->imask);
-+			ath9k_hw_set_interrupts(ah);
- 		}
- 	}
- 
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -1974,7 +1974,7 @@ requeue:
- 
- 	if (!(ah->imask & ATH9K_INT_RXEOL)) {
- 		ah->imask |= (ATH9K_INT_RXEOL | ATH9K_INT_RXORN);
--		ath9k_hw_set_interrupts(ah, ah->imask);
-+		ath9k_hw_set_interrupts(ah);
- 	}
- 
- 	return 0;
---- a/drivers/net/wireless/ath/ath9k/mac.c
-+++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -827,9 +827,9 @@ void ath9k_hw_enable_interrupts(struct a
- }
- EXPORT_SYMBOL(ath9k_hw_enable_interrupts);
- 
--void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
-+void ath9k_hw_set_interrupts(struct ath_hw *ah)
- {
--	enum ath9k_int omask = ah->imask;
-+	enum ath9k_int ints = ah->imask;
- 	u32 mask, mask2;
- 	struct ath9k_hw_capabilities *pCap = &ah->caps;
- 	struct ath_common *common = ath9k_hw_common(ah);
-@@ -837,7 +837,7 @@ void ath9k_hw_set_interrupts(struct ath_
- 	if (!(ints & ATH9K_INT_GLOBAL))
- 		ath9k_hw_disable_interrupts(ah);
- 
--	ath_dbg(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints);
-+	ath_dbg(common, ATH_DBG_INTERRUPT, "New interrupt mask 0x%x\n", ints);
- 
- 	mask = ints & ATH9K_INT_COMMON;
- 	mask2 = 0;
---- a/drivers/net/wireless/ath/ath9k/mac.h
-+++ b/drivers/net/wireless/ath/ath9k/mac.h
-@@ -735,7 +735,7 @@ int ath9k_hw_beaconq_setup(struct ath_hw
- 
- /* Interrupt Handling */
- bool ath9k_hw_intrpend(struct ath_hw *ah);
--void ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints);
-+void ath9k_hw_set_interrupts(struct ath_hw *ah);
- void ath9k_hw_enable_interrupts(struct ath_hw *ah);
- void ath9k_hw_disable_interrupts(struct ath_hw *ah);
- 

+ 0 - 627
package/mac80211/patches/581-ath9k_cleanup_txpower_handling.patch

@@ -1,627 +0,0 @@
---- a/drivers/net/wireless/ath/ath.h
-+++ b/drivers/net/wireless/ath/ath.h
-@@ -71,7 +71,6 @@ struct ath_regulatory {
- 	char alpha2[2];
- 	u16 country_code;
- 	u16 max_power_level;
--	u32 tp_scale;
- 	u16 current_rd;
- 	u16 current_rd_ext;
- 	int16_t power_limit;
---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-@@ -3040,6 +3040,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(st
- 		return (pBase->miscConfiguration >> 0x3) & 0x1;
- 	case EEP_ANT_DIV_CTL1:
- 		return eep->base_ext1.ant_div_control;
-+	case EEP_ANTENNA_GAIN_5G:
-+		return eep->modalHeader5G.antennaGain;
-+	case EEP_ANTENNA_GAIN_2G:
-+		return eep->modalHeader2G.antennaGain;
- 	default:
- 		return 0;
- 	}
-@@ -4727,20 +4731,14 @@ static u16 ar9003_hw_get_max_edge_power(
- static void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah,
- 					       struct ath9k_channel *chan,
- 					       u8 *pPwrArray, u16 cfgCtl,
--					       u8 twiceAntennaReduction,
--					       u8 twiceMaxRegulatoryPower,
-+					       u8 antenna_reduction,
- 					       u16 powerLimit)
- {
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	struct ath_common *common = ath9k_hw_common(ah);
- 	struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep;
- 	u16 twiceMaxEdgePower = MAX_RATE_POWER;
--	static const u16 tpScaleReductionTable[5] = {
--		0, 3, 6, 9, MAX_RATE_POWER
--	};
- 	int i;
--	int16_t  twiceLargestAntenna;
--	u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
-+	u16 scaledPower = 0, minCtlPower;
- 	static const u16 ctlModesFor11a[] = {
- 		CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
- 	};
-@@ -4758,28 +4756,7 @@ static void ar9003_hw_set_power_per_rate
- 	bool is2ghz = IS_CHAN_2GHZ(chan);
- 
- 	ath9k_hw_get_channel_centers(ah, chan, &centers);
--
--	/* Compute TxPower reduction due to Antenna Gain */
--	if (is2ghz)
--		twiceLargestAntenna = pEepData->modalHeader2G.antennaGain;
--	else
--		twiceLargestAntenna = pEepData->modalHeader5G.antennaGain;
--
--	twiceLargestAntenna = (int16_t)min((twiceAntennaReduction) -
--				twiceLargestAntenna, 0);
--
--	/*
--	 * scaledPower is the minimum of the user input power level
--	 * and the regulatory allowed power level
--	 */
--	maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
--
--	if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
--		maxRegAllowedPower -=
--			(tpScaleReductionTable[(regulatory->tp_scale)] * 2);
--	}
--
--	scaledPower = min(powerLimit, maxRegAllowedPower);
-+	scaledPower = powerLimit - antenna_reduction;
- 
- 	/*
- 	 * Reduce scaled Power by number of chains active to get
-@@ -4966,7 +4943,6 @@ static inline u8 mcsidx_to_tgtpwridx(uns
- static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
- 					struct ath9k_channel *chan, u16 cfgCtl,
- 					u8 twiceAntennaReduction,
--					u8 twiceMaxRegulatoryPower,
- 					u8 powerLimit, bool test)
- {
- 	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
-@@ -5019,7 +4995,6 @@ static void ath9k_hw_ar9300_set_txpower(
- 	ar9003_hw_set_power_per_rate_table(ah, chan,
- 					   targetPowerValT2, cfgCtl,
- 					   twiceAntennaReduction,
--					   twiceMaxRegulatoryPower,
- 					   powerLimit);
- 
- 	if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) {
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -429,7 +429,6 @@ static void ath9k_hw_init_defaults(struc
- 
- 	regulatory->country_code = CTRY_DEFAULT;
- 	regulatory->power_limit = MAX_RATE_POWER;
--	regulatory->tp_scale = ATH9K_TP_SCALE_MAX;
- 
- 	ah->hw_version.magic = AR5416_MAGIC;
- 	ah->hw_version.subvendorid = 0;
-@@ -1396,9 +1395,7 @@ static bool ath9k_hw_chip_reset(struct a
- static bool ath9k_hw_channel_change(struct ath_hw *ah,
- 				    struct ath9k_channel *chan)
- {
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	struct ath_common *common = ath9k_hw_common(ah);
--	struct ieee80211_channel *channel = chan->chan;
- 	u32 qnum;
- 	int r;
- 
-@@ -1423,14 +1420,7 @@ static bool ath9k_hw_channel_change(stru
- 		return false;
- 	}
- 	ath9k_hw_set_clockrate(ah);
--
--	ah->eep_ops->set_txpower(ah, chan,
--			     ath9k_regd_get_ctl(regulatory, chan),
--			     channel->max_antenna_gain * 2,
--			     channel->max_power * 2,
--			     min((u32) MAX_RATE_POWER,
--			     (u32) regulatory->power_limit), false);
--
-+	ath9k_hw_apply_txpower(ah, chan);
- 	ath9k_hw_rfbus_done(ah);
- 
- 	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
-@@ -2466,23 +2456,56 @@ bool ath9k_hw_disable(struct ath_hw *ah)
- }
- EXPORT_SYMBOL(ath9k_hw_disable);
- 
-+static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)
-+{
-+	enum eeprom_param gain_param;
-+
-+	if (IS_CHAN_2GHZ(chan))
-+		gain_param = EEP_ANTENNA_GAIN_2G;
-+	else
-+		gain_param = EEP_ANTENNA_GAIN_5G;
-+
-+	return ah->eep_ops->get_eeprom(ah, gain_param);
-+}
-+
-+void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan)
-+{
-+	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
-+	struct ieee80211_channel *channel;
-+	int chan_pwr, new_pwr, max_gain;
-+	int ant_gain, ant_reduction = 0;
-+
-+	if (!chan)
-+		return;
-+
-+	channel = chan->chan;
-+	chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
-+	new_pwr = min_t(int, chan_pwr, reg->power_limit);
-+	max_gain = chan_pwr - new_pwr + channel->max_antenna_gain * 2;
-+
-+	ant_gain = get_antenna_gain(ah, chan);
-+	if (ant_gain > max_gain)
-+		ant_reduction = ant_gain - max_gain;
-+
-+	ah->eep_ops->set_txpower(ah, chan,
-+				 ath9k_regd_get_ctl(reg, chan),
-+				 ant_reduction, new_pwr, false);
-+}
-+
- void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
- {
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
-+	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
- 	struct ath9k_channel *chan = ah->curchan;
- 	struct ieee80211_channel *channel = chan->chan;
--	int reg_pwr = min_t(int, MAX_RATE_POWER, limit);
--	int chan_pwr = channel->max_power * 2;
- 
-+	reg->power_limit = min_t(int, limit, MAX_RATE_POWER);
- 	if (test)
--		reg_pwr = chan_pwr = MAX_RATE_POWER;
-+		channel->max_power = MAX_RATE_POWER / 2;
- 
--	regulatory->power_limit = reg_pwr;
-+	ath9k_hw_apply_txpower(ah, chan);
- 
--	ah->eep_ops->set_txpower(ah, chan,
--				 ath9k_regd_get_ctl(regulatory, chan),
--				 channel->max_antenna_gain * 2,
--				 chan_pwr, reg_pwr, test);
-+	if (test)
-+		channel->max_power = DIV_ROUND_UP(reg->max_power_level, 2);
- }
- EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
- 
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -389,14 +389,6 @@ enum ath9k_power_mode {
- 	ATH9K_PM_UNDEFINED
- };
- 
--enum ath9k_tp_scale {
--	ATH9K_TP_SCALE_MAX = 0,
--	ATH9K_TP_SCALE_50,
--	ATH9K_TP_SCALE_25,
--	ATH9K_TP_SCALE_12,
--	ATH9K_TP_SCALE_MIN
--};
--
- enum ser_reg_mode {
- 	SER_REG_MODE_OFF = 0,
- 	SER_REG_MODE_ON = 1,
-@@ -964,6 +956,7 @@ void ath9k_hw_htc_resetinit(struct ath_h
- /* PHY */
- void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
- 				   u32 *coef_mantissa, u32 *coef_exponent);
-+void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan);
- 
- /*
-  * Code Specific to AR5008, AR9001 or AR9002,
---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-@@ -350,6 +350,8 @@ static u32 ath9k_hw_4k_get_eeprom(struct
- 		return pModal->antdiv_ctl1;
- 	case EEP_TXGAIN_TYPE:
- 		return pBase->txGainType;
-+	case EEP_ANTENNA_GAIN_2G:
-+		return pModal->antennaGainCh[0];
- 	default:
- 		return 0;
- 	}
-@@ -462,8 +464,7 @@ static void ath9k_hw_set_4k_power_per_ra
- 						 struct ath9k_channel *chan,
- 						 int16_t *ratesArray,
- 						 u16 cfgCtl,
--						 u16 AntennaReduction,
--						 u16 twiceMaxRegulatoryPower,
-+						 u16 antenna_reduction,
- 						 u16 powerLimit)
- {
- #define CMP_TEST_GRP \
-@@ -472,20 +473,16 @@ static void ath9k_hw_set_4k_power_per_ra
- 	|| (((cfgCtl & ~CTL_MODE_M) | (pCtlMode[ctlMode] & CTL_MODE_M)) == \
- 	    ((pEepData->ctlIndex[i] & CTL_MODE_M) | SD_NO_CTL))
- 
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	int i;
--	int16_t twiceLargestAntenna;
- 	u16 twiceMinEdgePower;
- 	u16 twiceMaxEdgePower = MAX_RATE_POWER;
--	u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
-+	u16 scaledPower = 0, minCtlPower;
- 	u16 numCtlModes;
- 	const u16 *pCtlMode;
- 	u16 ctlMode, freq;
- 	struct chan_centers centers;
- 	struct cal_ctl_data_4k *rep;
- 	struct ar5416_eeprom_4k *pEepData = &ah->eeprom.map4k;
--	static const u16 tpScaleReductionTable[5] =
--		{ 0, 3, 6, 9, MAX_RATE_POWER };
- 	struct cal_target_power_leg targetPowerOfdm, targetPowerCck = {
- 		0, { 0, 0, 0, 0}
- 	};
-@@ -503,19 +500,7 @@ static void ath9k_hw_set_4k_power_per_ra
- 
- 	ath9k_hw_get_channel_centers(ah, chan, &centers);
- 
--	twiceLargestAntenna = pEepData->modalHeader.antennaGainCh[0];
--	twiceLargestAntenna = (int16_t)min(AntennaReduction -
--					   twiceLargestAntenna, 0);
--
--	maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
--	if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
--		maxRegAllowedPower -=
--			(tpScaleReductionTable[(regulatory->tp_scale)] * 2);
--	}
--
--	scaledPower = min(powerLimit, maxRegAllowedPower);
--	scaledPower = max((u16)0, scaledPower);
--
-+	scaledPower = powerLimit - antenna_reduction;
- 	numCtlModes = ARRAY_SIZE(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40;
- 	pCtlMode = ctlModesFor11g;
- 
-@@ -671,7 +656,6 @@ static void ath9k_hw_4k_set_txpower(stru
- 				    struct ath9k_channel *chan,
- 				    u16 cfgCtl,
- 				    u8 twiceAntennaReduction,
--				    u8 twiceMaxRegulatoryPower,
- 				    u8 powerLimit, bool test)
- {
- 	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
-@@ -691,7 +675,6 @@ static void ath9k_hw_4k_set_txpower(stru
- 	ath9k_hw_set_4k_power_per_rate_table(ah, chan,
- 					     &ratesArray[0], cfgCtl,
- 					     twiceAntennaReduction,
--					     twiceMaxRegulatoryPower,
- 					     powerLimit);
- 
- 	ath9k_hw_set_4k_power_cal_table(ah, chan);
---- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
-@@ -336,6 +336,9 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
- 			return pBase->tempSensSlopePalOn;
- 		else
- 			return 0;
-+	case EEP_ANTENNA_GAIN_2G:
-+		return max_t(u8, pModal->antennaGainCh[0],
-+				 pModal->antennaGainCh[1]);
- 	default:
- 		return 0;
- 	}
-@@ -554,8 +557,7 @@ static void ath9k_hw_set_ar9287_power_pe
- 						     struct ath9k_channel *chan,
- 						     int16_t *ratesArray,
- 						     u16 cfgCtl,
--						     u16 AntennaReduction,
--						     u16 twiceMaxRegulatoryPower,
-+						     u16 antenna_reduction,
- 						     u16 powerLimit)
- {
- #define CMP_CTL \
-@@ -569,12 +571,8 @@ static void ath9k_hw_set_ar9287_power_pe
- #define REDUCE_SCALED_POWER_BY_TWO_CHAIN     6
- #define REDUCE_SCALED_POWER_BY_THREE_CHAIN   10
- 
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	u16 twiceMaxEdgePower = MAX_RATE_POWER;
--	static const u16 tpScaleReductionTable[5] =
--		{ 0, 3, 6, 9, MAX_RATE_POWER };
- 	int i;
--	int16_t twiceLargestAntenna;
- 	struct cal_ctl_data_ar9287 *rep;
- 	struct cal_target_power_leg targetPowerOfdm = {0, {0, 0, 0, 0} },
- 				    targetPowerCck = {0, {0, 0, 0, 0} };
-@@ -582,7 +580,7 @@ static void ath9k_hw_set_ar9287_power_pe
- 				    targetPowerCckExt = {0, {0, 0, 0, 0} };
- 	struct cal_target_power_ht targetPowerHt20,
- 				    targetPowerHt40 = {0, {0, 0, 0, 0} };
--	u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
-+	u16 scaledPower = 0, minCtlPower;
- 	static const u16 ctlModesFor11g[] = {
- 		CTL_11B, CTL_11G, CTL_2GHT20,
- 		CTL_11B_EXT, CTL_11G_EXT, CTL_2GHT40
-@@ -597,24 +595,7 @@ static void ath9k_hw_set_ar9287_power_pe
- 	tx_chainmask = ah->txchainmask;
- 
- 	ath9k_hw_get_channel_centers(ah, chan, &centers);
--
--	/* Compute TxPower reduction due to Antenna Gain */
--	twiceLargestAntenna = max(pEepData->modalHeader.antennaGainCh[0],
--				  pEepData->modalHeader.antennaGainCh[1]);
--	twiceLargestAntenna = (int16_t)min((AntennaReduction) -
--					   twiceLargestAntenna, 0);
--
--	/*
--	 * scaledPower is the minimum of the user input power level
--	 * and the regulatory allowed power level.
--	 */
--	maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
--
--	if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX)
--		maxRegAllowedPower -=
--			(tpScaleReductionTable[(regulatory->tp_scale)] * 2);
--
--	scaledPower = min(powerLimit, maxRegAllowedPower);
-+	scaledPower = powerLimit - antenna_reduction;
- 
- 	/*
- 	 * Reduce scaled Power by number of chains active
-@@ -815,7 +796,6 @@ static void ath9k_hw_set_ar9287_power_pe
- static void ath9k_hw_ar9287_set_txpower(struct ath_hw *ah,
- 					struct ath9k_channel *chan, u16 cfgCtl,
- 					u8 twiceAntennaReduction,
--					u8 twiceMaxRegulatoryPower,
- 					u8 powerLimit, bool test)
- {
- 	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
-@@ -834,7 +814,6 @@ static void ath9k_hw_ar9287_set_txpower(
- 	ath9k_hw_set_ar9287_power_per_rate_table(ah, chan,
- 						 &ratesArray[0], cfgCtl,
- 						 twiceAntennaReduction,
--						 twiceMaxRegulatoryPower,
- 						 powerLimit);
- 
- 	ath9k_hw_set_ar9287_power_cal_table(ah, chan);
---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
-@@ -400,6 +400,7 @@ static u32 ath9k_hw_def_get_eeprom(struc
- 	struct ar5416_eeprom_def *eep = &ah->eeprom.def;
- 	struct modal_eep_header *pModal = eep->modalHeader;
- 	struct base_eep_header *pBase = &eep->baseEepHeader;
-+	int band = 0;
- 
- 	switch (param) {
- 	case EEP_NFTHRESH_5:
-@@ -467,6 +468,14 @@ static u32 ath9k_hw_def_get_eeprom(struc
- 			return pBase->pwr_table_offset;
- 		else
- 			return AR5416_PWR_TABLE_OFFSET_DB;
-+	case EEP_ANTENNA_GAIN_2G:
-+		band = 1;
-+		/* fall through */
-+	case EEP_ANTENNA_GAIN_5G:
-+		return max_t(u8, max_t(u8,
-+			pModal[band].antennaGainCh[0],
-+			pModal[band].antennaGainCh[1]),
-+			pModal[band].antennaGainCh[2]);
- 	default:
- 		return 0;
- 	}
-@@ -986,21 +995,15 @@ static void ath9k_hw_set_def_power_per_r
- 						  struct ath9k_channel *chan,
- 						  int16_t *ratesArray,
- 						  u16 cfgCtl,
--						  u16 AntennaReduction,
--						  u16 twiceMaxRegulatoryPower,
-+						  u16 antenna_reduction,
- 						  u16 powerLimit)
- {
- #define REDUCE_SCALED_POWER_BY_TWO_CHAIN     6  /* 10*log10(2)*2 */
- #define REDUCE_SCALED_POWER_BY_THREE_CHAIN   9 /* 10*log10(3)*2 */
- 
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	struct ar5416_eeprom_def *pEepData = &ah->eeprom.def;
- 	u16 twiceMaxEdgePower = MAX_RATE_POWER;
--	static const u16 tpScaleReductionTable[5] =
--		{ 0, 3, 6, 9, MAX_RATE_POWER };
--
- 	int i;
--	int16_t twiceLargestAntenna;
- 	struct cal_ctl_data *rep;
- 	struct cal_target_power_leg targetPowerOfdm, targetPowerCck = {
- 		0, { 0, 0, 0, 0}
-@@ -1012,7 +1015,7 @@ static void ath9k_hw_set_def_power_per_r
- 	struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = {
- 		0, {0, 0, 0, 0}
- 	};
--	u16 scaledPower = 0, minCtlPower, maxRegAllowedPower;
-+	u16 scaledPower = 0, minCtlPower;
- 	static const u16 ctlModesFor11a[] = {
- 		CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
- 	};
-@@ -1031,27 +1034,7 @@ static void ath9k_hw_set_def_power_per_r
- 
- 	ath9k_hw_get_channel_centers(ah, chan, &centers);
- 
--	twiceLargestAntenna = max(
--		pEepData->modalHeader
--			[IS_CHAN_2GHZ(chan)].antennaGainCh[0],
--		pEepData->modalHeader
--			[IS_CHAN_2GHZ(chan)].antennaGainCh[1]);
--
--	twiceLargestAntenna = max((u8)twiceLargestAntenna,
--				  pEepData->modalHeader
--				  [IS_CHAN_2GHZ(chan)].antennaGainCh[2]);
--
--	twiceLargestAntenna = (int16_t)min(AntennaReduction -
--					   twiceLargestAntenna, 0);
--
--	maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna;
--
--	if (regulatory->tp_scale != ATH9K_TP_SCALE_MAX) {
--		maxRegAllowedPower -=
--			(tpScaleReductionTable[(regulatory->tp_scale)] * 2);
--	}
--
--	scaledPower = min(powerLimit, maxRegAllowedPower);
-+	scaledPower = powerLimit - antenna_reduction;
- 
- 	switch (ar5416_get_ntxchains(tx_chainmask)) {
- 	case 1:
-@@ -1256,7 +1239,6 @@ static void ath9k_hw_def_set_txpower(str
- 				    struct ath9k_channel *chan,
- 				    u16 cfgCtl,
- 				    u8 twiceAntennaReduction,
--				    u8 twiceMaxRegulatoryPower,
- 				    u8 powerLimit, bool test)
- {
- #define RT_AR_DELTA(x) (ratesArray[x] - cck_ofdm_delta)
-@@ -1278,7 +1260,6 @@ static void ath9k_hw_def_set_txpower(str
- 	ath9k_hw_set_def_power_per_rate_table(ah, chan,
- 					       &ratesArray[0], cfgCtl,
- 					       twiceAntennaReduction,
--					       twiceMaxRegulatoryPower,
- 					       powerLimit);
- 
- 	ath9k_hw_set_def_power_cal_table(ah, chan);
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -763,10 +763,8 @@ static void ar5008_hw_set_channel_regs(s
- static int ar5008_hw_process_ini(struct ath_hw *ah,
- 				 struct ath9k_channel *chan)
- {
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	struct ath_common *common = ath9k_hw_common(ah);
- 	int i, regWrites = 0;
--	struct ieee80211_channel *channel = chan->chan;
- 	u32 modesIndex, freqIndex;
- 
- 	switch (chan->chanmode) {
-@@ -903,14 +901,7 @@ static int ar5008_hw_process_ini(struct 
- 	ar5008_hw_set_channel_regs(ah, chan);
- 	ar5008_hw_init_chain_masks(ah);
- 	ath9k_olc_init(ah);
--
--	/* Set TX power */
--	ah->eep_ops->set_txpower(ah, chan,
--				 ath9k_regd_get_ctl(regulatory, chan),
--				 channel->max_antenna_gain * 2,
--				 channel->max_power * 2,
--				 min((u32) MAX_RATE_POWER,
--				 (u32) regulatory->power_limit), false);
-+	ath9k_hw_apply_txpower(ah, chan);
- 
- 	/* Write analog registers */
- 	if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) {
---- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c
-@@ -19,7 +19,6 @@
- 
- void ar9003_paprd_enable(struct ath_hw *ah, bool val)
- {
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	struct ath9k_channel *chan = ah->curchan;
- 	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
- 
-@@ -54,13 +53,7 @@ void ar9003_paprd_enable(struct ath_hw *
- 
- 	if (val) {
- 		ah->paprd_table_write_done = true;
--
--		ah->eep_ops->set_txpower(ah, chan,
--				ath9k_regd_get_ctl(regulatory, chan),
--				chan->chan->max_antenna_gain * 2,
--				chan->chan->max_power * 2,
--				min((u32) MAX_RATE_POWER,
--				(u32) regulatory->power_limit), false);
-+		ath9k_hw_apply_txpower(ah, chan);
- 	}
- 
- 	REG_RMW_FIELD(ah, AR_PHY_PAPRD_CTRL0_B0,
---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -628,9 +628,7 @@ static void ar9003_hw_prog_ini(struct at
- static int ar9003_hw_process_ini(struct ath_hw *ah,
- 				 struct ath9k_channel *chan)
- {
--	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
- 	unsigned int regWrites = 0, i;
--	struct ieee80211_channel *channel = chan->chan;
- 	u32 modesIndex;
- 
- 	switch (chan->chanmode) {
-@@ -683,14 +681,7 @@ static int ar9003_hw_process_ini(struct 
- 	ar9003_hw_override_ini(ah);
- 	ar9003_hw_set_channel_regs(ah, chan);
- 	ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
--
--	/* Set TX power */
--	ah->eep_ops->set_txpower(ah, chan,
--				 ath9k_regd_get_ctl(regulatory, chan),
--				 channel->max_antenna_gain * 2,
--				 channel->max_power * 2,
--				 min((u32) MAX_RATE_POWER,
--				 (u32) regulatory->power_limit), false);
-+	ath9k_hw_apply_txpower(ah, chan);
- 
- 	return 0;
- }
---- a/drivers/net/wireless/ath/ath9k/common.c
-+++ b/drivers/net/wireless/ath/ath9k/common.c
-@@ -161,10 +161,12 @@ EXPORT_SYMBOL(ath9k_cmn_count_streams);
- void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow,
- 			    u16 new_txpow, u16 *txpower)
- {
--	if (cur_txpow != new_txpow) {
-+	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
-+
-+	if (reg->power_limit != new_txpow) {
- 		ath9k_hw_set_txpowerlimit(ah, new_txpow, false);
- 		/* read back in case value is clamped */
--		*txpower = ath9k_hw_regulatory(ah)->power_limit;
-+		*txpower = reg->max_power_level;
- 	}
- }
- EXPORT_SYMBOL(ath9k_cmn_update_txpow);
---- a/drivers/net/wireless/ath/ath9k/eeprom.h
-+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
-@@ -253,7 +253,9 @@ enum eeprom_param {
- 	EEP_PAPRD,
- 	EEP_MODAL_VER,
- 	EEP_ANT_DIV_CTL1,
--	EEP_CHAIN_MASK_REDUCE
-+	EEP_CHAIN_MASK_REDUCE,
-+	EEP_ANTENNA_GAIN_2G,
-+	EEP_ANTENNA_GAIN_5G
- };
- 
- enum ar5416_rates {
-@@ -657,8 +659,7 @@ struct eeprom_ops {
- 	void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan);
- 	void (*set_txpower)(struct ath_hw *hw, struct ath9k_channel *chan,
- 			   u16 cfgCtl, u8 twiceAntennaReduction,
--			   u8 twiceMaxRegulatoryPower, u8 powerLimit,
--			   bool test);
-+			   u8 powerLimit, bool test);
- 	u16 (*get_spur_channel)(struct ath_hw *ah, u16 i, bool is2GHz);
- };
- 
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -626,7 +626,6 @@ static void ath9k_init_band_txpower(stru
- 	struct ieee80211_supported_band *sband;
- 	struct ieee80211_channel *chan;
- 	struct ath_hw *ah = sc->sc_ah;
--	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
- 	int i;
- 
- 	sband = &sc->sbands[band];
-@@ -635,7 +634,6 @@ static void ath9k_init_band_txpower(stru
- 		ah->curchan = &ah->channels[chan->hw_value];
- 		ath9k_cmn_update_ichannel(ah->curchan, chan, NL80211_CHAN_HT20);
- 		ath9k_hw_set_txpowerlimit(ah, MAX_RATE_POWER, true);
--		chan->max_power = reg->max_power_level / 2;
- 	}
- }
- 

+ 0 - 34
package/mac80211/patches/582-ath9k_remove_current_rd_ext.patch

@@ -1,34 +0,0 @@
---- a/drivers/net/wireless/ath/ath.h
-+++ b/drivers/net/wireless/ath/ath.h
-@@ -72,7 +72,6 @@ struct ath_regulatory {
- 	u16 country_code;
- 	u16 max_power_level;
- 	u16 current_rd;
--	u16 current_rd_ext;
- 	int16_t power_limit;
- 	struct reg_dmn_pair_mapping *regpair;
- };
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2047,11 +2047,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw
- 	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
- 	regulatory->current_rd = eeval;
- 
--	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_1);
--	if (AR_SREV_9285_12_OR_LATER(ah))
--		eeval |= AR9285_RDEXT_DEFAULT;
--	regulatory->current_rd_ext = eeval;
--
- 	if (ah->opmode != NL80211_IFTYPE_AP &&
- 	    ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
- 		if (regulatory->current_rd == 0x64 ||
---- a/drivers/net/wireless/ath/carl9170/main.c
-+++ b/drivers/net/wireless/ath/carl9170/main.c
-@@ -1912,7 +1912,6 @@ static int carl9170_parse_eeprom(struct 
- 		ar->hw->channel_change_time = 80 * 1000;
- 
- 	regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
--	regulatory->current_rd_ext = le16_to_cpu(ar->eeprom.reg_domain[1]);
- 
- 	/* second part of wiphy init */
- 	SET_IEEE80211_PERM_ADDR(ar->hw, ar->eeprom.mac_address);

+ 0 - 54
package/mac80211/patches/583-ath9k_remove_eep_reg_1.patch

@@ -1,54 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
-@@ -415,8 +415,6 @@ static u32 ath9k_hw_def_get_eeprom(struc
- 		return get_unaligned_be16(pBase->macAddr + 4);
- 	case EEP_REG_0:
- 		return pBase->regDmn[0];
--	case EEP_REG_1:
--		return pBase->regDmn[1];
- 	case EEP_OP_CAP:
- 		return pBase->deviceCap;
- 	case EEP_OP_MODE:
---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-@@ -322,8 +322,6 @@ static u32 ath9k_hw_4k_get_eeprom(struct
- 		return get_unaligned_be16(pBase->macAddr + 4);
- 	case EEP_REG_0:
- 		return pBase->regDmn[0];
--	case EEP_REG_1:
--		return pBase->regDmn[1];
- 	case EEP_OP_CAP:
- 		return pBase->deviceCap;
- 	case EEP_OP_MODE:
---- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
-@@ -308,8 +308,6 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
- 		return get_unaligned_be16(pBase->macAddr + 4);
- 	case EEP_REG_0:
- 		return pBase->regDmn[0];
--	case EEP_REG_1:
--		return pBase->regDmn[1];
- 	case EEP_OP_CAP:
- 		return pBase->deviceCap;
- 	case EEP_OP_MODE:
---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-@@ -3014,8 +3014,6 @@ static u32 ath9k_hw_ar9300_get_eeprom(st
- 		return get_unaligned_be16(eep->macAddr + 4);
- 	case EEP_REG_0:
- 		return le16_to_cpu(pBase->regDmn[0]);
--	case EEP_REG_1:
--		return le16_to_cpu(pBase->regDmn[1]);
- 	case EEP_OP_CAP:
- 		return pBase->deviceCap;
- 	case EEP_OP_MODE:
---- a/drivers/net/wireless/ath/ath9k/eeprom.h
-+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
-@@ -225,7 +225,6 @@ enum eeprom_param {
- 	EEP_MAC_MID,
- 	EEP_MAC_LSW,
- 	EEP_REG_0,
--	EEP_REG_1,
- 	EEP_OP_CAP,
- 	EEP_OP_MODE,
- 	EEP_RF_SILENT,

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

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

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

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

+ 2 - 2
package/mac80211/patches/800-b43-gpio-mask-module-option.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/b43/b43.h
 +++ b/drivers/net/wireless/b43/b43.h
-@@ -753,6 +753,7 @@ struct b43_wldev {
+@@ -791,6 +791,7 @@ struct b43_wldev {
  	bool qos_enabled;		/* TRUE, if QoS is used. */
  	bool hwcrypto_enabled;		/* TRUE, if HW crypto acceleration is enabled. */
  	bool use_pio;			/* TRUE if next init should use PIO */
@@ -22,7 +22,7 @@
  static int modparam_bad_frames_preempt;
  module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
  MODULE_PARM_DESC(bad_frames_preempt,
-@@ -2679,10 +2684,10 @@ static int b43_gpio_init(struct b43_wlde
+@@ -2686,10 +2691,10 @@ static int b43_gpio_init(struct b43_wlde
  		    & ~B43_MACCTL_GPOUTSMSK);
  
  	b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK)

+ 1 - 1
package/mac80211/patches/810-b43_no_pio.patch

@@ -11,7 +11,7 @@
  b43-$(CONFIG_B43_PCMCIA)	+= pcmcia.o
 --- a/drivers/net/wireless/b43/main.c
 +++ b/drivers/net/wireless/b43/main.c
-@@ -1886,9 +1886,11 @@ static void b43_do_interrupt_thread(stru
+@@ -1893,9 +1893,11 @@ static void b43_do_interrupt_thread(stru
  			       dma_reason[4], dma_reason[5]);
  			b43err(dev->wl, "This device does not support DMA "
  			       "on your system. It will now be switched to PIO.\n");

Some files were not shown because too many files changed in this diff