From 02b4f0c51b483b34b31328e6bc99af9af961d1a2 Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Fri, 18 Apr 2014 18:37:29 +0200
Subject: [PATCH] Update upstream modules

This updates OpenWRT and rebases our patches.

Furthermore, the mac80211 module is removed as currently the Attitude Adjustment
main repo has a newer version (and some fixes that aren't in the backport repo).

Also, update odhcp6c from Barrier Breaker.
---
 modules                                       |    15 +-
 ...Update-odhcp6c-from-Barrier-Breaker.patch} |   129 +-
 ...Remove-hostapd-and-mac80211-packages.patch | 21949 ----------------
 ...atest-git-add-UCI-config-path-patch.patch} |     0
 ...el-support-for-the-TL-WDR3500-board.patch} |     0
 ...-space-support-for-TL-WDR3500-board.patch} |     0
 ...uild-image-for-the-TL-WDR3500-board.patch} |     0
 ...ch-configuration-for-the-TL-WDR3500.patch} |     0
 ...add-diag-support-for-the-TL-WDR3500.patch} |     0
 ...ic-suffix-of-the-TL-WDR3500-USB-LED.patch} |     0
 ...ix-USB-power-GPIO-on-the-TL-WDR3500.patch} |     0
 ...ED-configuration-for-the-WL-WRD3500.patch} |     0
 ...fix-ethernet-LEDs-on-the-TL-WDR3500.patch} |     0
 ...PIO-output-select-values-for-AR934x.patch} |     0
 ...80211-ath9k-add-support-for-QCA953x.patch} |     6 +-
 15 files changed, 114 insertions(+), 21985 deletions(-)
 rename patches/openwrt/{0003-Update-odhcp6c-to-latest-git-master.patch => 0003-Update-odhcp6c-from-Barrier-Breaker.patch} (50%)
 delete mode 100644 patches/openwrt/0006-Remove-hostapd-and-mac80211-packages.patch
 rename patches/openwrt/{0007-netifd-update-to-latest-git-add-UCI-config-path-patch.patch => 0006-netifd-update-to-latest-git-add-UCI-config-path-patch.patch} (100%)
 rename patches/openwrt/{0008-ar71xx-add-kernel-support-for-the-TL-WDR3500-board.patch => 0007-ar71xx-add-kernel-support-for-the-TL-WDR3500-board.patch} (100%)
 rename patches/openwrt/{0009-ar71xx-add-user-space-support-for-TL-WDR3500-board.patch => 0008-ar71xx-add-user-space-support-for-TL-WDR3500-board.patch} (100%)
 rename patches/openwrt/{0010-ar71xx-build-image-for-the-TL-WDR3500-board.patch => 0009-ar71xx-build-image-for-the-TL-WDR3500-board.patch} (100%)
 rename patches/openwrt/{0011-ar71xx-add-default-switch-configuration-for-the-TL-WDR3500.patch => 0010-ar71xx-add-default-switch-configuration-for-the-TL-WDR3500.patch} (100%)
 rename patches/openwrt/{0012-ar71xx-add-diag-support-for-the-TL-WDR3500.patch => 0011-ar71xx-add-diag-support-for-the-TL-WDR3500.patch} (100%)
 rename patches/openwrt/{0013-ar71xx-remove-numeric-suffix-of-the-TL-WDR3500-USB-LED.patch => 0012-ar71xx-remove-numeric-suffix-of-the-TL-WDR3500-USB-LED.patch} (100%)
 rename patches/openwrt/{0014-ar71xx-fix-USB-power-GPIO-on-the-TL-WDR3500.patch => 0013-ar71xx-fix-USB-power-GPIO-on-the-TL-WDR3500.patch} (100%)
 rename patches/openwrt/{0015-ar71xx-add-default-LED-configuration-for-the-WL-WRD3500.patch => 0014-ar71xx-add-default-LED-configuration-for-the-WL-WRD3500.patch} (100%)
 rename patches/openwrt/{0016-ar71xx-fix-ethernet-LEDs-on-the-TL-WDR3500.patch => 0015-ar71xx-fix-ethernet-LEDs-on-the-TL-WDR3500.patch} (100%)
 rename patches/openwrt/{0017-ar71xx-add-GPIO-output-select-values-for-AR934x.patch => 0016-ar71xx-add-GPIO-output-select-values-for-AR934x.patch} (100%)
 rename patches/{packages/mac80211/0001-mac80211-ath9k-add-support-for-QCA953x.patch => openwrt/0017-mac80211-ath9k-add-support-for-QCA953x.patch} (95%)

diff --git a/modules b/modules
index 940f7d761..174a6a9ca 100644
--- a/modules
+++ b/modules
@@ -1,16 +1,13 @@
-GLUON_FEEDS='openwrt mac80211 gluon routing luci'
+GLUON_FEEDS='openwrt gluon routing luci'
 
-OPENWRT_REPO=git://nbd.name/attitude_adjustment.git
-OPENWRT_COMMIT=c00de5a631d0a60b8264e1f97049149cbd100cd8
+OPENWRT_REPO=git://git.openwrt.org/12.09/openwrt.git
+OPENWRT_COMMIT=bccb82223911823bf4ab040997757708b002a75f
 
-PACKAGES_OPENWRT_REPO=git://nbd.name/packages_12.09.git
-PACKAGES_OPENWRT_COMMIT=c67cd451ac28058a4992ba9eb2eb5551f6cd1adb
-
-PACKAGES_MAC80211_REPO=git://nbd.name/aa-mac80211.git
-PACKAGES_MAC80211_COMMIT=a92ce773680046eeb755f6b7c7af41fb6bdd7342
+PACKAGES_OPENWRT_REPO=git://git.openwrt.org/12.09/packages.git
+PACKAGES_OPENWRT_COMMIT=381bbea65989b63e30f43ab87e51b042325bbff3
 
 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git
-PACKAGES_GLUON_COMMIT=c7911677c381b325cc49d23ce03a14b4297b463d
+PACKAGES_GLUON_COMMIT=2ced9d31f75624a7b02067e167cb34d77c4f9eb8
 
 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git
 PACKAGES_ROUTING_COMMIT=0e4201a983df967e88e6ce5451f5f5f99bab2370
diff --git a/patches/openwrt/0003-Update-odhcp6c-to-latest-git-master.patch b/patches/openwrt/0003-Update-odhcp6c-from-Barrier-Breaker.patch
similarity index 50%
rename from patches/openwrt/0003-Update-odhcp6c-to-latest-git-master.patch
rename to patches/openwrt/0003-Update-odhcp6c-from-Barrier-Breaker.patch
index 8361b3a15..906a0b869 100644
--- a/patches/openwrt/0003-Update-odhcp6c-to-latest-git-master.patch
+++ b/patches/openwrt/0003-Update-odhcp6c-from-Barrier-Breaker.patch
@@ -1,9 +1,9 @@
 From: Matthias Schiffer <mschiffer@universe-factory.net>
 Date: Sat, 11 Jan 2014 11:47:58 +0100
-Subject: Update odhcp6c to latest git master
+Subject: Update odhcp6c from Barrier Breaker
 
 diff --git a/package/odhcp6c/Makefile b/package/odhcp6c/Makefile
-index e37b72e..ed51b98 100644
+index e767064..f18e7fa 100644
 --- a/package/odhcp6c/Makefile
 +++ b/package/odhcp6c/Makefile
 @@ -8,26 +8,37 @@
@@ -11,15 +11,16 @@ index e37b72e..ed51b98 100644
  
  PKG_NAME:=odhcp6c
 -PKG_VERSION:=2013-10-02
-+PKG_VERSION:=2014-01-11
- PKG_RELEASE=$(PKG_SOURCE_VERSION)
+-PKG_RELEASE=$(PKG_SOURCE_VERSION)-1
++PKG_VERSION:=2014-04-09
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
  
  PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
  PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
  PKG_SOURCE_URL:=git://github.com/sbyx/odhcp6c.git
  PKG_SOURCE_PROTO:=git
 -PKG_SOURCE_VERSION:=357ecc1f5163bc7f74c64f4bca387e8d44a2eac5
-+PKG_SOURCE_VERSION:=8152153cb9c5b09862bf0c8a0d1005fa8dfdf262
++PKG_SOURCE_VERSION:=6bbd2b0208fc17b6566595bfdfef2ff1d012d143
  PKG_MAINTAINER:=Steven Barth <steven@midlink.org>
  
  include $(INCLUDE_DIR)/package.mk
@@ -49,10 +50,10 @@ index e37b72e..ed51b98 100644
  	$(INSTALL_DIR) $(1)/usr/sbin/
  	$(INSTALL_BIN) $(PKG_BUILD_DIR)/odhcp6c $(1)/usr/sbin/
 diff --git a/package/odhcp6c/files/dhcpv6.script b/package/odhcp6c/files/dhcpv6.script
-index 324a823..8bcf766 100755
+index 324a823..d228014 100755
 --- a/package/odhcp6c/files/dhcpv6.script
 +++ b/package/odhcp6c/files/dhcpv6.script
-@@ -64,23 +64,28 @@ setup_interface () {
+@@ -64,23 +64,34 @@ setup_interface () {
  		entry="${entry#*,}"
  		local metric="${entry%%,*}"
  
@@ -61,13 +62,17 @@ index 324a823..8bcf766 100755
 +			proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid"
 +		else
 +			proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "::/128"
-+			for prefix in $PREFIXES; do
++			for prefix in $PREFIXES $ADDRESSES; do
 +				local paddr="${prefix%%,*}"
 +				proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "$paddr"
 +			done
 +		fi
  	done
  
++	proto_add_data
++	[ -n "$CER" ] && json_add_string cer "$CER"
++	proto_close_data
++
  	proto_send_update "$INTERFACE"
  
  	if [ -n "$AFTR_IP " -a -n "$IFACE_DSLITE" ]; then
@@ -88,25 +93,47 @@ index 324a823..8bcf766 100755
 +		json_add_string proto "dslite"
 +		json_add_string peeraddr "$AFTR_IP"
 +		json_add_string tunlink "$INTERFACE"
++		[ -n "$ZONE_DSLITE" ] && json_add_string zone "$ZONE_DSLITE"
++		[ -n "$IFACE_DSLITE_DELEGATE" ] && json_add_boolean delegate "$IFACE_DSLITE_DELEGATE"
 +		json_close_object
 +		ubus call network add_dynamic "$(json_dump)"
  	fi
  
  	# TODO: $SNTP_IP $SIP_IP $SNTP_FQDN $SIP_DOMAIN
 diff --git a/package/odhcp6c/files/dhcpv6.sh b/package/odhcp6c/files/dhcpv6.sh
-index bf6cd9a..0638d28 100755
+index bf6cd9a..90a8371 100755
 --- a/package/odhcp6c/files/dhcpv6.sh
 +++ b/package/odhcp6c/files/dhcpv6.sh
-@@ -10,18 +10,20 @@ proto_dhcpv6_init_config() {
- 	proto_config_add_string "clientid"
- 	proto_config_add_string "reqopts"
- 	proto_config_add_string "noslaaconly"
-+	proto_config_add_string "forceprefix"
- 	proto_config_add_string "norelease"
- 	proto_config_add_string "ip6prefix"
- 	proto_config_add_string "iface_dslite"
- 	proto_config_add_string "ifaceid"
-+	proto_config_add_string "sourcerouting"
+@@ -5,23 +5,31 @@
+ init_proto "$@"
+ 
+ proto_dhcpv6_init_config() {
+-	proto_config_add_string "reqaddress"
+-	proto_config_add_string "reqprefix"
+-	proto_config_add_string "clientid"
+-	proto_config_add_string "reqopts"
+-	proto_config_add_string "noslaaconly"
+-	proto_config_add_string "norelease"
+-	proto_config_add_string "ip6prefix"
+-	proto_config_add_string "iface_dslite"
+-	proto_config_add_string "ifaceid"
++	renew_handler=1
++
++	proto_config_add_string 'reqaddress:or("try","force","none")'
++	proto_config_add_string 'reqprefix:or("auto","no",range(0, 64))'
++	proto_config_add_string clientid
++	proto_config_add_string 'reqopts:list(uinteger)'
++	proto_config_add_string 'noslaaconly:bool'
++	proto_config_add_string 'forceprefix:bool'
++	proto_config_add_string 'norelease:bool'
++	proto_config_add_string 'ip6prefix:ip6addr'
++	proto_config_add_string iface_dslite
++	proto_config_add_string zone_dslite
++	proto_config_add_string 'ifaceid:ip6addr'
++	proto_config_add_string 'sourcerouting:bool'
++	proto_config_add_string "userclass"
++	proto_config_add_string "vendorclass"
++	proto_config_add_boolean delegate
  }
  
  proto_dhcpv6_setup() {
@@ -115,12 +142,12 @@ index bf6cd9a..0638d28 100755
  
 -	local reqaddress reqprefix clientid reqopts noslaaconly norelease ip6prefix iface_dslite ifaceid
 -	json_get_vars reqaddress reqprefix clientid reqopts noslaaconly norelease ip6prefix iface_dslite ifaceid
-+	local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite ifaceid sourcerouting
-+	json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite ifaceid sourcerouting
++	local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite ifaceid sourcerouting userclass vendorclass delegate zone_dslite
++	json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite ifaceid sourcerouting userclass vendorclass delegate zone_dslite
  
  
  	# Configure
-@@ -35,6 +37,8 @@ proto_dhcpv6_setup() {
+@@ -35,16 +43,25 @@ proto_dhcpv6_setup() {
  
  	[ "$noslaaconly" = "1" ] && append opts "-S"
  
@@ -129,11 +156,65 @@ index bf6cd9a..0638d28 100755
  	[ "$norelease" = "1" ] && append opts "-k"
  
  	[ -n "$ifaceid" ] && append opts "-i$ifaceid"
-@@ -45,6 +49,7 @@ proto_dhcpv6_setup() {
+ 
++	[ -n "$vendorclass" ] && append opts "-V$vendorclass"
++
++	[ -n "$userclass" ] && append opts "-u$userclass"
++
+ 	for opt in $reqopts; do
+ 		append opts "-r$opt"
+ 	done
  
  	[ -n "$ip6prefix" ] && proto_export "USERPREFIX=$ip6prefix"
  	[ -n "$iface_dslite" ] && proto_export "IFACE_DSLITE=$iface_dslite"
-+	[ "$sourcerouting" = "1" ] && proto_export "SOURCE_ROUTING=1"
++	[ "$sourcerouting" != "0" ] && proto_export "SOURCE_ROUTING=1"
++	[ "$delegate" = "0" ] && proto_export "IFACE_DSLITE_DELEGATE=0"
++	[ -n "$zone_dslite" ] && proto_export "ZONE_DSLITE=$zone_dslite"
  
  	proto_export "INTERFACE=$config"
  	proto_run_command "$config" odhcp6c \
+@@ -52,6 +69,13 @@ proto_dhcpv6_setup() {
+ 		$opts $iface
+ }
+ 
++proto_dhcpv6_renew() {
++	local interface="$1"
++	# SIGUSR1 forces odhcp6c to renew its lease
++	local sigusr1="$(kill -l SIGUSR1)"
++	[ -n "$sigusr1" ] && proto_kill_command "$interface" $sigusr1
++}
++
+ proto_dhcpv6_teardown() {
+ 	local interface="$1"
+ 	proto_kill_command "$interface"
+diff --git a/package/odhcp6c/patches/001-fix-integer-overflow-after-50-days.patch b/package/odhcp6c/patches/001-fix-integer-overflow-after-50-days.patch
+deleted file mode 100644
+index 292d023..0000000
+--- a/package/odhcp6c/patches/001-fix-integer-overflow-after-50-days.patch
++++ /dev/null
+@@ -1,25 +0,0 @@
+-From 5b98f902f616bd9b96a2128587bc6995555a43c1 Mon Sep 17 00:00:00 2001
+-From: Steven Barth <steven@midlink.org>
+-Date: Fri, 7 Mar 2014 10:33:49 +0100
+-Subject: [PATCH] fix integer overflow after 50 days (thx Hauke Mehrtens)
+-
+----
+- src/odhcp6c.c |    2 +-
+- 1 file changed, 1 insertion(+), 1 deletion(-)
+-
+-diff --git a/src/odhcp6c.c b/src/odhcp6c.c
+-index 3c6b3b0..ba11ced 100644
+---- a/src/odhcp6c.c
+-+++ b/src/odhcp6c.c
+-@@ -470,7 +470,7 @@ uint64_t odhcp6c_get_milli_time(void)
+- {
+- 	struct timespec t = {0, 0};
+- 	syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &t);
+--	return t.tv_sec * 1000 + t.tv_nsec / 1000000;
+-+	return ((uint64_t)t.tv_sec) * 1000 + ((uint64_t)t.tv_nsec) / 1000000;
+- }
+- 
+- 
+--- 
+-1.7.10.4
+-
diff --git a/patches/openwrt/0006-Remove-hostapd-and-mac80211-packages.patch b/patches/openwrt/0006-Remove-hostapd-and-mac80211-packages.patch
deleted file mode 100644
index 626373104..000000000
--- a/patches/openwrt/0006-Remove-hostapd-and-mac80211-packages.patch
+++ /dev/null
@@ -1,21949 +0,0 @@
-From: Matthias Schiffer <mschiffer@universe-factory.net>
-Date: Sat, 11 Jan 2014 17:28:18 +0100
-Subject: Remove hostapd and mac80211 packages
-
-diff --git a/package/hostapd/Config.in b/package/hostapd/Config.in
-deleted file mode 100644
-index b39be38..0000000
---- a/package/hostapd/Config.in
-+++ /dev/null
-@@ -1,47 +0,0 @@
--# wpa_supplicant config
--config WPA_SUPPLICANT_NO_TIMESTAMP_CHECK
--	bool "Disable timestamp check"
--	depends on PACKAGE_wpa-supplicant || PACKAGE_wpa-supplicant-mini || PACKAGE_wpad || PACKAGE_wpad-mini
--	default n
--	help
--	  This disables the timestamp check for certificates in wpa_supplicant
--	  Useful for devices without RTC that cannot reliably get the real date/time
--
--choice
--	prompt "Choose TLS provider"
--	default WPA_SUPPLICANT_INTERNAL
--	depends on PACKAGE_wpa-supplicant || PACKAGE_wpad
--
--config WPA_SUPPLICANT_INTERNAL
--	bool "internal"
--
--config WPA_SUPPLICANT_OPENSSL
--	bool "openssl"
--	select PACKAGE_libopenssl
--
--endchoice
--
--config WPA_RFKILL_SUPPORT
--	bool "Add rfkill support"
--	depends on PACKAGE_wpa-supplicant || PACKAGE_wpa-supplicant-mini || PACKAGE_wpad || PACKAGE_wpad-mini
--	default n
--
--config WPA_MSG_MIN_PRIORITY
--	int "Minimum debug message priority"
--	default 3
--	help
--	  Useful values are:
--	    0 = all messages
--		1 = raw message dumps
--		2 = most debugging messages
--		3 = info messages
--		4 = warnings
--		5 = errors
--
--config DRIVER_WEXT_SUPPORT
--	bool
--	default n
--
--config DRIVER_11N_SUPPORT
--	bool
--	default n
-diff --git a/package/hostapd/Makefile b/package/hostapd/Makefile
-deleted file mode 100644
-index b4dc242..0000000
---- a/package/hostapd/Makefile
-+++ /dev/null
-@@ -1,356 +0,0 @@
--#
--# Copyright (C) 2006-2012 OpenWrt.org
--#
--# This is free software, licensed under the GNU General Public License v2.
--# See /LICENSE for more information.
--#
--
--include $(TOPDIR)/rules.mk
--
--PKG_NAME:=hostapd
--PKG_VERSION:=20131120
--PKG_RELEASE:=1
--PKG_REV:=594516b4c28a94ca686b17f1e463dfd6712b75a7
--
--PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
--PKG_SOURCE_URL:=git://w1.fi/srv/git/hostap.git
--PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
--PKG_SOURCE_VERSION:=$(PKG_REV)
--PKG_SOURCE_PROTO:=git
--# PKG_MIRROR_MD5SUM:=4e7c1f97edd7514535056fce54ae053a
--
--PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
--
--PKG_BUILD_PARALLEL:=1
--
--PKG_BUILD_DEPENDS:= \
--	PACKAGE_kmod-madwifi:madwifi \
--
--PKG_CONFIG_DEPENDS:= \
--	CONFIG_WPA_SUPPLICANT_NO_TIMESTAMP_CHECK \
--	CONFIG_PACKAGE_kmod-ath9k \
--	CONFIG_PACKAGE_kmod-mac80211 \
--	CONFIG_PACKAGE_kmod-madwifi \
--	CONFIG_PACKAGE_hostapd \
--	CONFIG_PACKAGE_hostapd-mini \
--	CONFIG_PACKAGE_kmod-hostap \
--	CONFIG_WPA_RFKILL_SUPPORT \
--	CONFIG_DRIVER_WEXT_SUPPORT \
--	CONFIG_DRIVER_11N_SUPPORT
--
--LOCAL_TYPE=$(strip \
--		$(if $(findstring wpad,$(BUILD_VARIANT)),wpad, \
--		$(if $(findstring supplicant,$(BUILD_VARIANT)),supplicant, \
--		hostapd \
--	)))
--LOCAL_VARIANT=$(patsubst wpad-%,%,$(patsubst supplicant-%,%,$(BUILD_VARIANT)))
--
--ifeq ($(LOCAL_TYPE),supplicant)
--  ifeq ($(LOCAL_VARIANT),full)
--    PKG_CONFIG_DEPENDS += \
--		CONFIG_WPA_SUPPLICANT_INTERNAL \
--		CONFIG_WPA_SUPPLICANT_OPENSSL
--  endif
--endif
--
--PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
--
--include $(INCLUDE_DIR)/package.mk
--
--STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPA_MSG_MIN_PRIORITY)
--
--ifneq ($(CONFIG_DRIVER_11N_SUPPORT),)
--  HOSTAPD_IEEE80211N:=y
--endif
--
--DRIVER_MAKEOPTS= \
--	CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-mac80211) \
--	CONFIG_DRIVER_MADWIFI=$(CONFIG_PACKAGE_kmod-madwifi) \
--	CONFIG_DRIVER_HOSTAP=$(CONFIG_PACKAGE_kmod-hostap) \
--	CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
--	CONFIG_IEEE80211W=$(CONFIG_PACKAGE_kmod-ath9k) \
--	CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \
--	$(if $(CONFIG_WPA_RFKILL_SUPPORT),NEED_RFKILL=y)
--
--ifneq ($(LOCAL_TYPE),hostapd)
--  ifdef CONFIG_WPA_SUPPLICANT_OPENSSL
--    ifeq ($(LOCAL_VARIANT),full)
--      DRIVER_MAKEOPTS += CONFIG_TLS=openssl
--      TARGET_LDFLAGS += -lcrypto -lssl
--    endif
--  endif
--  ifdef CONFIG_WPA_SUPPLICANT_NO_TIMESTAMP_CHECK
--    TARGET_CFLAGS += -DNO_TIMESTAMP_CHECK
--  endif
--  DRIVER_MAKEOPTS += \
--	CONFIG_DRIVER_ROBOSWITCH=$(CONFIG_PACKAGE_kmod-switch)
--endif
--
--DRV_DEPENDS:=+PACKAGE_kmod-mac80211:libnl-tiny @(!TARGET_avr32||BROKEN)
--
--define Package/hostapd/Default
--  SECTION:=net
--  CATEGORY:=Network
--  TITLE:=IEEE 802.1x Authenticator
--  URL:=http://hostap.epitest.fi/
--  DEPENDS:=$(DRV_DEPENDS) +libubus
--endef
--
--define Package/hostapd
--$(call Package/hostapd/Default)
--  TITLE+= (full)
--  VARIANT:=full
--endef
--
--define Package/hostapd/description
-- This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS
-- Authenticator.
--endef
--
--define Package/hostapd-mini
--$(call Package/hostapd/Default)
--  TITLE+= (WPA-PSK only)
--  VARIANT:=mini
--endef
--
--define Package/hostapd-mini/description
-- This package contains a minimal IEEE 802.1x/WPA Authenticator (WPA-PSK only).
--endef
--
--define Package/hostapd-utils
--  $(call Package/hostapd/Default)
--  TITLE+= (utils)
--  DEPENDS:=@PACKAGE_hostapd||PACKAGE_hostapd-mini||PACKAGE_wpad||PACKAGE_wpad-mini
--endef
--
--define Package/hostapd-utils/description
-- This package contains a command line utility to control the
-- IEEE 802.1x/WPA/EAP/RADIUS Authenticator.
--endef
--
--define Package/wpad/Default
--  SECTION:=net
--  CATEGORY:=Network
--  TITLE:=IEEE 802.1x Authenticator/Supplicant
--  URL:=http://hostap.epitest.fi/
--endef
--
--define Package/wpad
--$(call Package/wpad/Default)
--  TITLE+= (full)
--  DEPENDS:=$(DRV_DEPENDS) +WPA_SUPPLICANT_OPENSSL:libopenssl +libubus
--  VARIANT:=wpad-full
--endef
--
--define Package/wpad/description
-- This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS
-- Authenticator and Supplicant
--endef
--
--define Package/wpad-mini
--$(call Package/wpad/Default)
--  TITLE+= (WPA-PSK only)
--  DEPENDS:=$(DRV_DEPENDS) +libubus
--  VARIANT:=wpad-mini
--endef
--
--define Package/wpad-mini/description
-- This package contains a minimal IEEE 802.1x/WPA Authenticator and Supplicant (WPA-PSK only).
--endef
--
--define Package/wpa-supplicant
--  SECTION:=net
--  CATEGORY:=Network
--  TITLE:=WPA Supplicant
--  URL:=http://hostap.epitest.fi/wpa_supplicant/
--  DEPENDS:=$(DRV_DEPENDS) +WPA_SUPPLICANT_OPENSSL:libopenssl
--  VARIANT:=supplicant-full
--endef
--
--define Package/wpa-supplicant/Description
--  WPA Supplicant
--endef
--
--define Package/wpa-supplicant/config
--	source "$(SOURCE)/Config.in"
--endef
--
--define Package/wpa-supplicant-p2p
--  $(Package/wpa-supplicant)
--  TITLE:=WPA Supplicant (with Wi-Fi P2P support)
--  DEPENDS:=$(DRV_DEPENDS)
--  VARIANT:=supplicant-p2p
--endef
--
--define Package/wpa-supplicant-p2p/Description
--  WPA Supplicant (with Wi-Fi P2P support)
--endef
--
--define Package/wpa-supplicant-mini
--  $(Package/wpa-supplicant)
--  TITLE:=WPA Supplicant (minimal version)
--  DEPENDS:=$(DRV_DEPENDS)
--  VARIANT:=supplicant-mini
--endef
--
--define Package/wpa-supplicant-mini/Description
--  WPA Supplicant (minimal version)
--endef
--
--define Package/wpa-cli
--  SECTION:=net
--  CATEGORY:=Network
--  DEPENDS:=@PACKAGE_wpa-supplicant||PACKAGE_wpa-supplicant-p2p||PACKAGE_wpad-mini||PACKAGE_wpad
--  TITLE:=WPA Supplicant command line interface
--endef
--
--define Package/wpa-cli/Description
--  WPA Supplicant control utility
--endef
--
--ifneq ($(wildcard $(PKG_BUILD_DIR)/.config_*),$(subst .configured_,.config_,$(STAMP_CONFIGURED)))
--  define Build/Configure/rebuild
--	$(FIND) $(PKG_BUILD_DIR) -name \*.o -or -name \*.a | $(XARGS) rm -f
--	rm -f $(PKG_BUILD_DIR)/hostapd/hostapd
--	rm -f $(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant
--	rm -f $(PKG_BUILD_DIR)/.config_*
--	touch $(subst .configured_,.config_,$(STAMP_CONFIGURED))
--  endef
--endif
--
--define Build/Configure
--	$(Build/Configure/rebuild)
--	$(if $(wildcard ./files/hostapd-$(LOCAL_VARIANT).config), \
--		$(CP) ./files/hostapd-$(LOCAL_VARIANT).config $(PKG_BUILD_DIR)/hostapd/.config \
--	)
--	$(CP) ./files/wpa_supplicant-$(LOCAL_VARIANT).config $(PKG_BUILD_DIR)/wpa_supplicant/.config
--endef
--
--TARGET_CPPFLAGS := \
--	-I$(STAGING_DIR)/usr/include/libnl-tiny \
--	-I$(PKG_BUILD_DIR)/src/crypto \
--	$(TARGET_CPPFLAGS) \
--	-I$(CURDIR)/madwifi \
--	-DCONFIG_LIBNL20 \
--	-D_GNU_SOURCE \
--	$(if $(CONFIG_WPA_MSG_MIN_PRIORITY),-DCONFIG_MSG_MIN_PRIORITY=$(CONFIG_WPA_MSG_MIN_PRIORITY))
--
--TARGET_CFLAGS += -ffunction-sections -fdata-sections
--TARGET_LDFLAGS += -Wl,--gc-sections
--ifeq ($(findstring supplicant,$(BUILD_VARIANT)),)
--  TARGET_LDFLAGS += -lubox -lubus
--endif
--
--ifdef CONFIG_PACKAGE_kmod-mac80211
--  TARGET_LDFLAGS += -lm -lnl-tiny
--endif
--
--define Build/RunMake
--	CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
--	$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \
--		$(TARGET_CONFIGURE_OPTS) \
--		$(DRIVER_MAKEOPTS) \
--		LIBS="$(TARGET_LDFLAGS)" \
--		LIBS_c="" \
--		BCHECK= \
--		$(2)
--endef
--
--define Build/Compile/wpad
--	echo ` \
--		$(call Build/RunMake,hostapd,-s MULTICALL=1 dump_cflags); \
--		$(call Build/RunMake,wpa_supplicant,-s MULTICALL=1 dump_cflags) | \
--		sed -e 's,-n ,,g' -e 's,$(TARGET_CFLAGS),,' \
--	` > $(PKG_BUILD_DIR)/.cflags
--	+$(call Build/RunMake,hostapd, \
--		CFLAGS="$$$$(cat $(PKG_BUILD_DIR)/.cflags)" \
--		MULTICALL=1 \
--		hostapd_cli hostapd_multi.a \
--	)
--	+$(call Build/RunMake,wpa_supplicant, \
--		CFLAGS="$$$$(cat $(PKG_BUILD_DIR)/.cflags)" \
--		MULTICALL=1 \
--		wpa_cli wpa_supplicant_multi.a \
--	)
--	$(TARGET_CC) -o $(PKG_BUILD_DIR)/wpad \
--		$(TARGET_CFLAGS) \
--		./files/multicall.c \
--		$(PKG_BUILD_DIR)/hostapd/hostapd_multi.a \
--		$(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant_multi.a \
--		$(TARGET_LDFLAGS)
--endef
--
--define Build/Compile/hostapd
--	$(call Build/RunMake,hostapd, \
--		hostapd hostapd_cli \
--	)
--endef
--
--define Build/Compile/supplicant
--	$(call Build/RunMake,wpa_supplicant, \
--		wpa_cli wpa_supplicant \
--	)
--endef
--
--define Build/Compile
--	$(Build/Compile/$(LOCAL_TYPE))
--endef
--
--define Install/hostapd
--	$(INSTALL_DIR) $(1)/lib/wifi
--	$(INSTALL_DATA) ./files/hostapd.sh $(1)/lib/wifi/hostapd.sh
--	$(INSTALL_DIR) $(1)/usr/sbin
--endef
--
--define Install/supplicant
--	$(INSTALL_DIR) $(1)/lib/wifi
--	$(INSTALL_DATA) ./files/wpa_supplicant.sh $(1)/lib/wifi/wpa_supplicant.sh
--	$(INSTALL_DIR) $(1)/usr/sbin
--endef
--
--define Package/hostapd/install
--	$(call Install/hostapd,$(1))
--	$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd $(1)/usr/sbin/
--endef
--Package/hostapd-mini/install = $(Package/hostapd/install)
--
--ifneq ($(LOCAL_TYPE),supplicant)
--  define Package/hostapd-utils/install
--	$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/rc.button
--	$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_cli $(1)/usr/sbin/
--	$(INSTALL_BIN) ./files/wps-hotplug.sh $(1)/etc/rc.button/wps
--  endef
--endif
--
--define Package/wpad/install
--	$(call Install/hostapd,$(1))
--	$(call Install/supplicant,$(1))
--	$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpad $(1)/usr/sbin/
--	ln -sf wpad $(1)/usr/sbin/hostapd
--	ln -sf wpad $(1)/usr/sbin/wpa_supplicant
--endef
--Package/wpad-mini/install = $(Package/wpad/install)
--
--define Package/wpa-supplicant/install
--	$(call Install/supplicant,$(1))
--	$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant $(1)/usr/sbin/
--endef
--Package/wpa-supplicant-mini/install = $(Package/wpa-supplicant/install)
--Package/wpa-supplicant-p2p/install = $(Package/wpa-supplicant/install)
--
--ifneq ($(LOCAL_TYPE),hostapd)
--  define Package/wpa-cli/install
--	$(INSTALL_DIR) $(1)/usr/sbin
--	$(CP) $(PKG_BUILD_DIR)/wpa_supplicant/wpa_cli $(1)/usr/sbin/
--  endef
--endif
--
--$(eval $(call BuildPackage,hostapd))
--$(eval $(call BuildPackage,hostapd-mini))
--$(eval $(call BuildPackage,wpad))
--$(eval $(call BuildPackage,wpad-mini))
--$(eval $(call BuildPackage,wpa-supplicant))
--$(eval $(call BuildPackage,wpa-supplicant-mini))
--$(eval $(call BuildPackage,wpa-supplicant-p2p))
--$(eval $(call BuildPackage,wpa-cli))
--$(eval $(call BuildPackage,hostapd-utils))
-diff --git a/package/hostapd/files/hostapd-full.config b/package/hostapd/files/hostapd-full.config
-deleted file mode 100644
-index bc999c0..0000000
---- a/package/hostapd/files/hostapd-full.config
-+++ /dev/null
-@@ -1,169 +0,0 @@
--# Example hostapd build time configuration
--#
--# This file lists the configuration options that are used when building the
--# hostapd binary. All lines starting with # are ignored. Configuration option
--# lines must be commented out complete, if they are not to be included, i.e.,
--# just setting VARIABLE=n is not disabling that variable.
--#
--# This file is included in Makefile, so variables like CFLAGS and LIBS can also
--# be modified from here. In most cass, these lines should use += in order not
--# to override previous values of the variables.
--
--# Driver interface for Host AP driver
--CONFIG_DRIVER_HOSTAP=y
--
--# Driver interface for wired authenticator
--CONFIG_DRIVER_WIRED=y
--
--# Driver interface for madwifi driver
--CONFIG_DRIVER_MADWIFI=y
--#CFLAGS += -I../../madwifi # change to the madwifi source directory
--
--# Driver interface for Prism54 driver
--#CONFIG_DRIVER_PRISM54=y
--
--# Driver interface for drivers using the nl80211 kernel interface
--CONFIG_DRIVER_NL80211=y
--# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be
--# shipped with your distribution yet. If that is the case, you need to build
--# newer libnl version and point the hostapd build to use it.
--#LIBNL=/usr/src/libnl
--#CFLAGS += -I$(LIBNL)/include
--#LIBS += -L$(LIBNL)/lib
--
--# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
--#CONFIG_DRIVER_BSD=y
--#CFLAGS += -I/usr/local/include
--#LIBS += -L/usr/local/lib
--
--# Driver interface for no driver (e.g., RADIUS server only)
--#CONFIG_DRIVER_NONE=y
--
--# IEEE 802.11F/IAPP
--CONFIG_IAPP=y
--
--# WPA2/IEEE 802.11i RSN pre-authentication
--CONFIG_RSN_PREAUTH=y
--
--# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
--CONFIG_PEERKEY=y
--
--# IEEE 802.11w (management frame protection)
--# This version is an experimental implementation based on IEEE 802.11w/D1.0
--# draft and is subject to change since the standard has not yet been finalized.
--# Driver support is also needed for IEEE 802.11w.
--#CONFIG_IEEE80211W=y
--
--# Integrated EAP server
--CONFIG_EAP=y
--
--# EAP-MD5 for the integrated EAP server
--CONFIG_EAP_MD5=y
--
--# EAP-TLS for the integrated EAP server
--CONFIG_EAP_TLS=y
--
--# EAP-MSCHAPv2 for the integrated EAP server
--CONFIG_EAP_MSCHAPV2=y
--
--# EAP-PEAP for the integrated EAP server
--CONFIG_EAP_PEAP=y
--
--# EAP-GTC for the integrated EAP server
--CONFIG_EAP_GTC=y
--
--# EAP-TTLS for the integrated EAP server
--CONFIG_EAP_TTLS=y
--
--# EAP-SIM for the integrated EAP server
--#CONFIG_EAP_SIM=y
--
--# EAP-AKA for the integrated EAP server
--#CONFIG_EAP_AKA=y
--
--# EAP-AKA' for the integrated EAP server
--# This requires CONFIG_EAP_AKA to be enabled, too.
--#CONFIG_EAP_AKA_PRIME=y
--
--# EAP-PAX for the integrated EAP server
--#CONFIG_EAP_PAX=y
--
--# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK)
--#CONFIG_EAP_PSK=y
--
--# EAP-SAKE for the integrated EAP server
--#CONFIG_EAP_SAKE=y
--
--# EAP-GPSK for the integrated EAP server
--#CONFIG_EAP_GPSK=y
--# Include support for optional SHA256 cipher suite in EAP-GPSK
--#CONFIG_EAP_GPSK_SHA256=y
--
--# EAP-FAST for the integrated EAP server
--# Note: Default OpenSSL package does not include support for all the
--# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL,
--# the OpenSSL library must be patched (openssl-0.9.9-session-ticket.patch)
--# to add the needed functions.
--#CONFIG_EAP_FAST=y
--
--# Wi-Fi Protected Setup (WPS)
--CONFIG_WPS=y
--CONFIG_WPS2=y
--# Enable UPnP support for external WPS Registrars
--#CONFIG_WPS_UPNP=y
--
--# EAP-IKEv2
--#CONFIG_EAP_IKEV2=y
--
--# Trusted Network Connect (EAP-TNC)
--#CONFIG_EAP_TNC=y
--
--# PKCS#12 (PFX) support (used to read private key and certificate file from
--# a file that usually has extension .p12 or .pfx)
--CONFIG_PKCS12=y
--
--# RADIUS authentication server. This provides access to the integrated EAP
--# server from external hosts using RADIUS.
--#CONFIG_RADIUS_SERVER=y
--
--# Build IPv6 support for RADIUS operations
--CONFIG_IPV6=y
--
--# IEEE Std 802.11r-2008 (Fast BSS Transition)
--CONFIG_IEEE80211R=y
--
--# Use the hostapd's IEEE 802.11 authentication (ACL), but without
--# the IEEE 802.11 Management capability (e.g., madwifi or FreeBSD/net80211)
--#CONFIG_DRIVER_RADIUS_ACL=y
--
--# IEEE 802.11n (High Throughput) support
--CONFIG_IEEE80211N=y
--
--# Remove debugging code that is printing out debug messages to stdout.
--# This can be used to reduce the size of the hostapd considerably if debugging
--# code is not needed.
--#CONFIG_NO_STDOUT_DEBUG=y
--
--# Remove support for RADIUS accounting
--#CONFIG_NO_ACCOUNTING=y
--
--# Remove support for RADIUS
--#CONFIG_NO_RADIUS=y
--
--# Remove support for VLANs
--#CONFIG_NO_VLAN=y
--
--CONFIG_TLS=internal
--CONFIG_INTERNAL_LIBTOMMATH=y
--CONFIG_INTERNAL_AES=y
--NEED_AES_DEC=y
--
--CONFIG_NO_RANDOM_POOL=y
--CONFIG_NO_DUMP_STATE=y
--
--CONFIG_WPS=y
--CONFIG_FULL_DYNAMIC_VLAN=y
--
--CONFIG_ACS=y
--
--CONFIG_UBUS=y
-diff --git a/package/hostapd/files/hostapd-mini.config b/package/hostapd/files/hostapd-mini.config
-deleted file mode 100644
-index 01a04cb..0000000
---- a/package/hostapd/files/hostapd-mini.config
-+++ /dev/null
-@@ -1,162 +0,0 @@
--# Example hostapd build time configuration
--#
--# This file lists the configuration options that are used when building the
--# hostapd binary. All lines starting with # are ignored. Configuration option
--# lines must be commented out complete, if they are not to be included, i.e.,
--# just setting VARIABLE=n is not disabling that variable.
--#
--# This file is included in Makefile, so variables like CFLAGS and LIBS can also
--# be modified from here. In most cass, these lines should use += in order not
--# to override previous values of the variables.
--
--# Driver interface for Host AP driver
--CONFIG_DRIVER_HOSTAP=y
--
--# Driver interface for wired authenticator
--CONFIG_DRIVER_WIRED=y
--
--# Driver interface for madwifi driver
--CONFIG_DRIVER_MADWIFI=y
--#CFLAGS += -I../../madwifi # change to the madwifi source directory
--
--# Driver interface for Prism54 driver
--#CONFIG_DRIVER_PRISM54=y
--
--# Driver interface for drivers using the nl80211 kernel interface
--CONFIG_DRIVER_NL80211=y
--# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be
--# shipped with your distribution yet. If that is the case, you need to build
--# newer libnl version and point the hostapd build to use it.
--#LIBNL=/usr/src/libnl
--#CFLAGS += -I$(LIBNL)/include
--#LIBS += -L$(LIBNL)/lib
--
--# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
--#CONFIG_DRIVER_BSD=y
--#CFLAGS += -I/usr/local/include
--#LIBS += -L/usr/local/lib
--
--# Driver interface for no driver (e.g., RADIUS server only)
--#CONFIG_DRIVER_NONE=y
--
--# IEEE 802.11F/IAPP
--# CONFIG_IAPP=y
--
--# WPA2/IEEE 802.11i RSN pre-authentication
--CONFIG_RSN_PREAUTH=y
--
--# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
--CONFIG_PEERKEY=y
--
--# IEEE 802.11w (management frame protection)
--# This version is an experimental implementation based on IEEE 802.11w/D1.0
--# draft and is subject to change since the standard has not yet been finalized.
--# Driver support is also needed for IEEE 802.11w.
--#CONFIG_IEEE80211W=y
--
--# Integrated EAP server
--#CONFIG_EAP=y
--
--# EAP-MD5 for the integrated EAP server
--#CONFIG_EAP_MD5=y
--
--# EAP-TLS for the integrated EAP server
--#CONFIG_EAP_TLS=y
--
--# EAP-MSCHAPv2 for the integrated EAP server
--#CONFIG_EAP_MSCHAPV2=y
--
--# EAP-PEAP for the integrated EAP server
--#CONFIG_EAP_PEAP=y
--
--# EAP-GTC for the integrated EAP server
--#CONFIG_EAP_GTC=y
--
--# EAP-TTLS for the integrated EAP server
--#CONFIG_EAP_TTLS=y
--
--# EAP-SIM for the integrated EAP server
--#CONFIG_EAP_SIM=y
--
--# EAP-AKA for the integrated EAP server
--#CONFIG_EAP_AKA=y
--
--# EAP-AKA' for the integrated EAP server
--# This requires CONFIG_EAP_AKA to be enabled, too.
--#CONFIG_EAP_AKA_PRIME=y
--
--# EAP-PAX for the integrated EAP server
--#CONFIG_EAP_PAX=y
--
--# EAP-PSK for the integrated EAP server (this is _not_ needed for WPA-PSK)
--#CONFIG_EAP_PSK=y
--
--# EAP-SAKE for the integrated EAP server
--#CONFIG_EAP_SAKE=y
--
--# EAP-GPSK for the integrated EAP server
--#CONFIG_EAP_GPSK=y
--# Include support for optional SHA256 cipher suite in EAP-GPSK
--#CONFIG_EAP_GPSK_SHA256=y
--
--# EAP-FAST for the integrated EAP server
--# Note: Default OpenSSL package does not include support for all the
--# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL,
--# the OpenSSL library must be patched (openssl-0.9.9-session-ticket.patch)
--# to add the needed functions.
--#CONFIG_EAP_FAST=y
--
--# Wi-Fi Protected Setup (WPS)
--#CONFIG_WPS=y
--# Enable UPnP support for external WPS Registrars
--#CONFIG_WPS_UPNP=y
--
--# EAP-IKEv2
--#CONFIG_EAP_IKEV2=y
--
--# Trusted Network Connect (EAP-TNC)
--#CONFIG_EAP_TNC=y
--
--# PKCS#12 (PFX) support (used to read private key and certificate file from
--# a file that usually has extension .p12 or .pfx)
--#CONFIG_PKCS12=y
--
--# RADIUS authentication server. This provides access to the integrated EAP
--# server from external hosts using RADIUS.
--#CONFIG_RADIUS_SERVER=y
--
--# Build IPv6 support for RADIUS operations
--#CONFIG_IPV6=y
--
--# IEEE Std 802.11r-2008 (Fast BSS Transition)
--#CONFIG_IEEE80211R=y
--
--# Use the hostapd's IEEE 802.11 authentication (ACL), but without
--# the IEEE 802.11 Management capability (e.g., madwifi or FreeBSD/net80211)
--#CONFIG_DRIVER_RADIUS_ACL=y
--
--# IEEE 802.11n (High Throughput) support
--CONFIG_IEEE80211N=y
--
--# Remove debugging code that is printing out debug messages to stdout.
--# This can be used to reduce the size of the hostapd considerably if debugging
--# code is not needed.
--#CONFIG_NO_STDOUT_DEBUG=y
--
--# Remove support for RADIUS accounting
--CONFIG_NO_ACCOUNTING=y
--
--# Remove support for RADIUS
--CONFIG_NO_RADIUS=y
--
--# Remove support for VLANs
--#CONFIG_NO_VLAN=y
--
--CONFIG_TLS=internal
--
--CONFIG_NO_RANDOM_POOL=y
--CONFIG_NO_DUMP_STATE=y
--
--CONFIG_ACS=y
--
--CONFIG_UBUS=y
-diff --git a/package/hostapd/files/hostapd.sh b/package/hostapd/files/hostapd.sh
-deleted file mode 100644
-index b55b63d..0000000
---- a/package/hostapd/files/hostapd.sh
-+++ /dev/null
-@@ -1,357 +0,0 @@
--hostapd_set_bss_options() {
--	local var="$1"
--	local vif="$2"
--	local enc wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wps_possible
--
--	config_get enc "$vif" encryption "none"
--	config_get wep_rekey        "$vif" wep_rekey        # 300
--	config_get wpa_group_rekey  "$vif" wpa_group_rekey  # 300
--	config_get wpa_pair_rekey   "$vif" wpa_pair_rekey   # 300
--	config_get wpa_master_rekey "$vif" wpa_master_rekey # 640
--	config_get_bool ap_isolate "$vif" isolate 0
--	config_get_bool disassoc_low_ack "$vif" disassoc_low_ack 1
--	config_get max_num_sta "$vif" max_num_sta 0
--	config_get max_inactivity "$vif" max_inactivity 0
--	config_get_bool preamble "$vif" short_preamble 1
--
--	config_get device "$vif" device
--	config_get hwmode "$device" hwmode
--	config_get phy "$device" phy
--
--	append "$var" "ctrl_interface=/var/run/hostapd-$phy" "$N"
--
--	if [ "$ap_isolate" -gt 0 ]; then
--		append "$var" "ap_isolate=$ap_isolate" "$N"
--	fi
--	if [ "$max_num_sta" -gt 0 ]; then
--		append "$var" "max_num_sta=$max_num_sta" "$N"
--	fi
--	if [ "$max_inactivity" -gt 0 ]; then
--		append "$var" "ap_max_inactivity=$max_inactivity" "$N"
--	fi
--	append "$var" "disassoc_low_ack=$disassoc_low_ack" "$N"
--	if [ "$preamble" -gt 0 ]; then
--		append "$var" "preamble=$preamble" "$N"
--	fi
--
--	# Examples:
--	# psk-mixed/tkip 	=> WPA1+2 PSK, TKIP
--	# wpa-psk2/tkip+aes	=> WPA2 PSK, CCMP+TKIP
--	# wpa2/tkip+aes 	=> WPA2 RADIUS, CCMP+TKIP
--	# ...
--
--	# TODO: move this parsing function somewhere generic, so that
--	# later it can be reused by drivers that don't use hostapd
--
--	# crypto defaults: WPA2 vs WPA1
--	case "$enc" in
--		wpa2*|*psk2*)
--			wpa=2
--			crypto="CCMP"
--		;;
--		*mixed*)
--			wpa=3
--			crypto="CCMP TKIP"
--		;;
--		*)
--			wpa=1
--			crypto="TKIP"
--		;;
--	esac
--
--	# explicit override for crypto setting
--	case "$enc" in
--		*tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip) crypto="CCMP TKIP";;
--		*aes|*ccmp) crypto="CCMP";;
--		*tkip) crypto="TKIP";;
--	esac
--
--	# enforce CCMP for 11ng and 11na
--	case "$hwmode:$crypto" in
--		*ng:TKIP|*na:TKIP) crypto="CCMP TKIP";;
--	esac
--
--	# use crypto/auth settings for building the hostapd config
--	case "$enc" in
--		none)
--			wps_possible=1
--			wpa=0
--			crypto=
--			# Here we make the assumption that if we're in open mode
--			# with WPS enabled, we got to be in unconfigured state.
--			wps_not_configured=1
--		;;
--		*psk*)
--			config_get psk "$vif" key
--			if [ ${#psk} -eq 64 ]; then
--				append "$var" "wpa_psk=$psk" "$N"
--			else
--				append "$var" "wpa_passphrase=$psk" "$N"
--			fi
--			wps_possible=1
--			[ -n "$wpa_group_rekey"  ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N"
--			[ -n "$wpa_pair_rekey"   ] && append "$var" "wpa_ptk_rekey=$wpa_pair_rekey"    "$N"
--			[ -n "$wpa_master_rekey" ] && append "$var" "wpa_gmk_rekey=$wpa_master_rekey"  "$N"
--		;;
--		*wpa*|*8021x*)
--			# required fields? formats?
--			# hostapd is particular, maybe a default configuration for failures
--			config_get auth_server "$vif" auth_server
--			[ -z "$auth_server" ] && config_get auth_server "$vif" server
--			append "$var" "auth_server_addr=$auth_server" "$N"
--			config_get auth_port "$vif" auth_port
--			[ -z "$auth_port" ] && config_get auth_port "$vif" port
--			auth_port=${auth_port:-1812}
--			append "$var" "auth_server_port=$auth_port" "$N"
--			config_get auth_secret "$vif" auth_secret
--			[ -z "$auth_secret" ] && config_get auth_secret "$vif" key
--			append "$var" "auth_server_shared_secret=$auth_secret" "$N"
--			# You don't really want to enable this unless you are doing
--			# some corner case testing or are using OpenWrt as a work around
--			# for some systematic issues.
--			config_get_bool auth_cache "$vif" auth_cache 0
--			config_get rsn_preauth "$vif" rsn_preauth
--			[ "$auth_cache" -gt 0 ] || [[ "$rsn_preauth" = 1 ]] || append "$var" "disable_pmksa_caching=1" "$N"
--			[ "$auth_cache" -gt 0 ] || [[ "$rsn_preauth" = 1 ]] || append "$var" "okc=0" "$N"
--			config_get acct_server "$vif" acct_server
--			[ -n "$acct_server" ] && append "$var" "acct_server_addr=$acct_server" "$N"
--			config_get acct_port "$vif" acct_port
--			[ -n "$acct_port" ] && acct_port=${acct_port:-1813}
--			[ -n "$acct_port" ] && append "$var" "acct_server_port=$acct_port" "$N"
--			config_get acct_secret "$vif" acct_secret
--			[ -n "$acct_secret" ] && append "$var" "acct_server_shared_secret=$acct_secret" "$N"
--			config_get eap_reauth_period "$vif" eap_reauth_period
--			[ -n "$eap_reauth_period" ] && append "$var" "eap_reauth_period=$eap_reauth_period" "$N"
--			config_get dae_client "$vif" dae_client
--			config_get dae_secret "$vif" dae_secret
--			[ -n "$dae_client" -a -n "$dae_secret" ] && {
--				config_get dae_port  "$vif" dae_port
--				append "$var" "radius_das_port=${dae_port:-3799}" "$N"
--				append "$var" "radius_das_client=$dae_client $dae_secret" "$N"
--			}
--			config_get nasid "$vif" nasid
--			append "$var" "nas_identifier=$nasid" "$N"
--			append "$var" "eapol_key_index_workaround=1" "$N"
--			append "$var" "ieee8021x=1" "$N"
--			append "$var" "wpa_key_mgmt=WPA-EAP" "$N"
--			[ -n "$wpa_group_rekey"  ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N"
--			[ -n "$wpa_pair_rekey"   ] && append "$var" "wpa_ptk_rekey=$wpa_pair_rekey"    "$N"
--			[ -n "$wpa_master_rekey" ] && append "$var" "wpa_gmk_rekey=$wpa_master_rekey"  "$N"
--		;;
--		*wep*)
--			config_get key "$vif" key
--			key="${key:-1}"
--			case "$key" in
--				[1234])
--					for idx in 1 2 3 4; do
--						local zidx
--						zidx=$(($idx - 1))
--						config_get ckey "$vif" "key${idx}"
--						[ -n "$ckey" ] && \
--							append "$var" "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N"
--					done
--					append "$var" "wep_default_key=$((key - 1))"  "$N"
--				;;
--				*)
--					append "$var" "wep_key0=$(prepare_key_wep "$key")" "$N"
--					append "$var" "wep_default_key=0" "$N"
--					[ -n "$wep_rekey" ] && append "$var" "wep_rekey_period=$wep_rekey" "$N"
--				;;
--			esac
--			case "$enc" in
--				*shared*)
--					auth_algs=2
--				;;
--				*mixed*)
--					auth_algs=3
--				;;
--			esac
--			wpa=0
--			crypto=
--		;;
--		*)
--			wpa=0
--			crypto=
--		;;
--	esac
--	append "$var" "auth_algs=${auth_algs:-1}" "$N"
--	append "$var" "wpa=$wpa" "$N"
--	[ -n "$crypto" ] && append "$var" "wpa_pairwise=$crypto" "$N"
--	[ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N"
--
--	config_get ssid "$vif" ssid
--	config_get bridge "$vif" bridge
--	config_get ieee80211d "$vif" ieee80211d
--	config_get iapp_interface "$vif" iapp_interface
--
--	config_get_bool wps_pbc "$vif" wps_pushbutton 0
--	config_get_bool wps_label "$vif" wps_label 0
--
--	config_get config_methods "$vif" wps_config
--	[ "$wps_pbc" -gt 0 ] && append config_methods push_button
--
--	[ -n "$wps_possible" -a -n "$config_methods" ] && {
--		config_get device_type "$vif" wps_device_type "6-0050F204-1"
--		config_get device_name "$vif" wps_device_name "OpenWrt AP"
--		config_get manufacturer "$vif" wps_manufacturer "openwrt.org"
--		config_get wps_pin "$vif" wps_pin "12345670"
--
--		config_get_bool ext_registrar "$vif" ext_registrar 0
--		[ "$ext_registrar" -gt 0 -a -n "$bridge" ] && append "$var" "upnp_iface=$bridge" "$N"
--
--		append "$var" "eap_server=1" "$N"
--		append "$var" "ap_pin=$wps_pin" "$N"
--		append "$var" "wps_state=${wps_not_configured:-2}" "$N"
--		append "$var" "ap_setup_locked=0" "$N"
--		append "$var" "device_type=$device_type" "$N"
--		append "$var" "device_name=$device_name" "$N"
--		append "$var" "manufacturer=$manufacturer" "$N"
--		append "$var" "config_methods=$config_methods" "$N"
--	}
--
--	append "$var" "ssid=$ssid" "$N"
--	[ -n "$bridge" ] && append "$var" "bridge=$bridge" "$N"
--	[ -n "$ieee80211d" ] && append "$var" "ieee80211d=$ieee80211d" "$N"
--	[ -n "$iapp_interface" ] && append "$var" iapp_interface=$(uci_get_state network "$iapp_interface" ifname "$iapp_interface") "$N"
--
--	if [ "$wpa" -ge "2" ]
--	then
--		# RSN -> allow preauthentication. You have two
--		# options, rsn_preauth for production or rsn_preauth_testing
--		# for validation / testing.
--		if [ -n "$bridge" -a "$rsn_preauth" = 1 ]
--		then
--			append "$var" "rsn_preauth=1" "$N"
--			append "$var" "rsn_preauth_interfaces=$bridge" "$N"
--			append "$var" "okc=1" "$N"
--		else
--			# RSN preauthentication testings hould disable
--			# Opportunistic Key Caching (okc) as otherwise the PMKSA
--			# entry for a test could come from the Opportunistic Key Caching
--			config_get rsn_preauth_testing "$vif" rsn_preauth_testing
--			if [ -n "$bridge" -a "$rsn_preauth_testing" = 1 ]
--			then
--				append "$var" "rsn_preauth=1" "$N"
--				append "$var" "rsn_preauth_interfaces=$bridge" "$N"
--				append "$var" "okc=0" "$N"
--			fi
--		fi
--
--		# RSN -> allow management frame protection
--		config_get ieee80211w "$vif" ieee80211w
--		case "$ieee80211w" in
--			[012])
--				append "$var" "ieee80211w=$ieee80211w" "$N"
--				[ "$ieee80211w" -gt "0" ] && {
--					config_get ieee80211w_max_timeout "$vif" ieee80211w_max_timeout
--					config_get ieee80211w_retry_timeout "$vif" ieee80211w_retry_timeout
--					[ -n "$ieee80211w_max_timeout" ] && \
--						append "$var" "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N"
--					[ -n "$ieee80211w_retry_timeout" ] && \
--						append "$var" "assoc_sa_query_retry_timeout=$ieee80211w_retry_timeout" "$N"
--				}
--			;;
--		esac
--	fi
--
--	config_get macfile "$vif" macfile
--	config_get maclist "$vif" maclist
--	if [ -z "$macfile" ]
--	then
--		# if no macfile has been specified, fallback to the default name
--		# and truncate file to avoid aggregating entries over time
--		macfile="/var/run/hostapd-$ifname.maclist"
--		echo "" > "$macfile"
--	else
--		if [ -n "$maclist" ]
--		then
--			# to avoid to overwrite the original file, make a copy
--			# before appending the entries specified by the maclist
--			# option
--			cp $macfile $macfile.maclist
--			macfile=$macfile.maclist
--		fi
--	fi
--
--	if [ -n "$maclist" ]
--	then
--		for mac in $maclist; do
--			echo "$mac" >> $macfile
--		done
--	fi
--
--	config_get macfilter "$vif" macfilter
--	case "$macfilter" in
--		allow)
--			append "$var" "macaddr_acl=1" "$N"
--			append "$var" "accept_mac_file=$macfile" "$N"
--			;;
--		deny)
--			append "$var" "macaddr_acl=0" "$N"
--			append "$var" "deny_mac_file=$macfile" "$N"
--			;;
--	esac
--}
--
--hostapd_set_log_options() {
--	local var="$1"
--	local cfg="$2"
--	local log_level log_80211 log_8021x log_radius log_wpa log_driver log_iapp log_mlme
--
--	config_get log_level "$cfg" log_level 2
--
--	config_get_bool log_80211  "$cfg" log_80211  1
--	config_get_bool log_8021x  "$cfg" log_8021x  1
--	config_get_bool log_radius "$cfg" log_radius 1
--	config_get_bool log_wpa    "$cfg" log_wpa    1
--	config_get_bool log_driver "$cfg" log_driver 1
--	config_get_bool log_iapp   "$cfg" log_iapp   1
--	config_get_bool log_mlme   "$cfg" log_mlme   1
--
--	local log_mask=$((       \
--		($log_80211  << 0) | \
--		($log_8021x  << 1) | \
--		($log_radius << 2) | \
--		($log_wpa    << 3) | \
--		($log_driver << 4) | \
--		($log_iapp   << 5) | \
--		($log_mlme   << 6)   \
--	))
--
--	append "$var" "logger_syslog=$log_mask" "$N"
--	append "$var" "logger_syslog_level=$log_level" "$N"
--	append "$var" "logger_stdout=$log_mask" "$N"
--	append "$var" "logger_stdout_level=$log_level" "$N"
--}
--
--hostapd_setup_vif() {
--	local vif="$1"
--	local driver="$2"
--	local ifname device channel hwmode
--
--	hostapd_cfg=
--
--	config_get ifname "$vif" ifname
--	config_get device "$vif" device
--	config_get channel "$device" channel
--	config_get hwmode "$device" hwmode
--
--	hostapd_set_log_options hostapd_cfg "$device"
--	hostapd_set_bss_options hostapd_cfg "$vif"
--
--	case "$hwmode" in
--		*bg|*gdt|*gst|*fh) hwmode=g;;
--		*adt|*ast) hwmode=a;;
--	esac
--	[ "$channel" = auto ] && channel=
--	[ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device"
--	cat > /var/run/hostapd-$ifname.conf <<EOF
--driver=$driver
--interface=$ifname
--${hwmode:+hw_mode=${hwmode#11}}
--${channel:+channel=$channel}
--$hostapd_cfg
--EOF
--	hostapd -P /var/run/wifi-$ifname.pid -B /var/run/hostapd-$ifname.conf
--}
--
-diff --git a/package/hostapd/files/multicall.c b/package/hostapd/files/multicall.c
-deleted file mode 100644
-index c8e814b..0000000
---- a/package/hostapd/files/multicall.c
-+++ /dev/null
-@@ -1,28 +0,0 @@
--#include <stdio.h>
--#include <string.h>
--#include <stdbool.h>
--
--extern int hostapd_main(int argc, char **argv);
--extern int wpa_supplicant_main(int argc, char **argv);
--
--int main(int argc, char **argv)
--{
--	bool restart = false;
--	const char *prog = argv[0];
--
--restart:
--	if (strstr(argv[0], "hostapd"))
--		return hostapd_main(argc, argv);
--	else if (strstr(argv[0], "wpa_supplicant"))
--		return wpa_supplicant_main(argc, argv);
--
--	if (!restart && argc > 1) {
--		argv++;
--		argc--;
--		restart = true;
--		goto restart;
--	}
--
--	fprintf(stderr, "Invalid command.\nUsage: %s wpa_supplicant|hostapd [<arguments>]\n", prog);
--	return 255;
--}
-diff --git a/package/hostapd/files/wpa_supplicant-full.config b/package/hostapd/files/wpa_supplicant-full.config
-deleted file mode 100644
-index bbfaa73..0000000
---- a/package/hostapd/files/wpa_supplicant-full.config
-+++ /dev/null
-@@ -1,409 +0,0 @@
--# Example wpa_supplicant build time configuration
--#
--# This file lists the configuration options that are used when building the
--# hostapd binary. All lines starting with # are ignored. Configuration option
--# lines must be commented out complete, if they are not to be included, i.e.,
--# just setting VARIABLE=n is not disabling that variable.
--#
--# This file is included in Makefile, so variables like CFLAGS and LIBS can also
--# be modified from here. In most cases, these lines should use += in order not
--# to override previous values of the variables.
--
--
--# Uncomment following two lines and fix the paths if you have installed OpenSSL
--# or GnuTLS in non-default location
--#CFLAGS += -I/usr/local/openssl/include
--#LIBS += -L/usr/local/openssl/lib
--
--# Some Red Hat versions seem to include kerberos header files from OpenSSL, but
--# the kerberos files are not in the default include path. Following line can be
--# used to fix build issues on such systems (krb5.h not found).
--#CFLAGS += -I/usr/include/kerberos
--
--# Example configuration for various cross-compilation platforms
--
--#### sveasoft (e.g., for Linksys WRT54G) ######################################
--#CC=mipsel-uclibc-gcc
--#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
--#CFLAGS += -Os
--#CPPFLAGS += -I../src/include -I../../src/router/openssl/include
--#LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
--###############################################################################
--
--#### openwrt (e.g., for Linksys WRT54G) #######################################
--#CC=mipsel-uclibc-gcc
--#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
--#CFLAGS += -Os
--#CPPFLAGS=-I../src/include -I../openssl-0.9.7d/include \
--#	-I../WRT54GS/release/src/include
--#LIBS = -lssl
--###############################################################################
--
--
--# Driver interface for Host AP driver
--CONFIG_DRIVER_HOSTAP=y
--
--# Driver interface for Agere driver
--#CONFIG_DRIVER_HERMES=y
--# Change include directories to match with the local setup
--#CFLAGS += -I../../hcf -I../../include -I../../include/hcf
--#CFLAGS += -I../../include/wireless
--
--# Driver interface for madwifi driver
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_MADWIFI=y
--# Set include directory to the madwifi source tree
--#CFLAGS += -I../../madwifi
--
--# Driver interface for ndiswrapper
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_NDISWRAPPER=y
--
--# Driver interface for Atmel driver
--# CONFIG_DRIVER_ATMEL=y
--
--# Driver interface for old Broadcom driver
--# Please note that the newer Broadcom driver ("hybrid Linux driver") supports
--# Linux wireless extensions and does not need (or even work) with the old
--# driver wrapper. Use CONFIG_DRIVER_WEXT=y with that driver.
--#CONFIG_DRIVER_BROADCOM=y
--# Example path for wlioctl.h; change to match your configuration
--#CFLAGS += -I/opt/WRT54GS/release/src/include
--
--# Driver interface for Intel ipw2100/2200 driver
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_IPW=y
--
--# Driver interface for Ralink driver
--#CONFIG_DRIVER_RALINK=y
--
--# Driver interface for generic Linux wireless extensions
--CONFIG_DRIVER_WEXT=y
--
--# Driver interface for Linux drivers using the nl80211 kernel interface
--CONFIG_DRIVER_NL80211=y
--
--# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
--#CONFIG_DRIVER_BSD=y
--#CFLAGS += -I/usr/local/include
--#LIBS += -L/usr/local/lib
--#LIBS_p += -L/usr/local/lib
--#LIBS_c += -L/usr/local/lib
--
--# Driver interface for Windows NDIS
--#CONFIG_DRIVER_NDIS=y
--#CFLAGS += -I/usr/include/w32api/ddk
--#LIBS += -L/usr/local/lib
--# For native build using mingw
--#CONFIG_NATIVE_WINDOWS=y
--# Additional directories for cross-compilation on Linux host for mingw target
--#CFLAGS += -I/opt/mingw/mingw32/include/ddk
--#LIBS += -L/opt/mingw/mingw32/lib
--#CC=mingw32-gcc
--# By default, driver_ndis uses WinPcap for low-level operations. This can be
--# replaced with the following option which replaces WinPcap calls with NDISUIO.
--# However, this requires that WZC is disabled (net stop wzcsvc) before starting
--# wpa_supplicant.
--# CONFIG_USE_NDISUIO=y
--
--# Driver interface for development testing
--#CONFIG_DRIVER_TEST=y
--
--# Include client MLME (management frame processing) for test driver
--# This can be used to test MLME operations in hostapd with the test interface.
--# space.
--#CONFIG_CLIENT_MLME=y
--
--# Driver interface for wired Ethernet drivers
--CONFIG_DRIVER_WIRED=y
--
--# Driver interface for the Broadcom RoboSwitch family
--#CONFIG_DRIVER_ROBOSWITCH=y
--
--# Driver interface for no driver (e.g., WPS ER only)
--#CONFIG_DRIVER_NONE=y
--
--# Enable IEEE 802.1X Supplicant (automatically included if any EAP method is
--# included)
--CONFIG_IEEE8021X_EAPOL=y
--
--# EAP-MD5
--CONFIG_EAP_MD5=y
--
--# EAP-MSCHAPv2
--CONFIG_EAP_MSCHAPV2=y
--
--# EAP-TLS
--CONFIG_EAP_TLS=y
--
--# EAL-PEAP
--CONFIG_EAP_PEAP=y
--
--# EAP-TTLS
--CONFIG_EAP_TTLS=y
--
--# EAP-FAST
--# Note: Default OpenSSL package does not include support for all the
--# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL,
--# the OpenSSL library must be patched (openssl-0.9.8d-tls-extensions.patch)
--# to add the needed functions.
--#CONFIG_EAP_FAST=y
--
--# EAP-GTC
--CONFIG_EAP_GTC=y
--
--# EAP-OTP
--CONFIG_EAP_OTP=y
--
--# EAP-SIM (enable CONFIG_PCSC, if EAP-SIM is used)
--#CONFIG_EAP_SIM=y
--
--# EAP-PSK (experimental; this is _not_ needed for WPA-PSK)
--#CONFIG_EAP_PSK=y
--
--# EAP-PAX
--#CONFIG_EAP_PAX=y
--
--# LEAP
--CONFIG_EAP_LEAP=y
--
--# EAP-AKA (enable CONFIG_PCSC, if EAP-AKA is used)
--#CONFIG_EAP_AKA=y
--
--# EAP-AKA' (enable CONFIG_PCSC, if EAP-AKA' is used).
--# This requires CONFIG_EAP_AKA to be enabled, too.
--#CONFIG_EAP_AKA_PRIME=y
--
--# Enable USIM simulator (Milenage) for EAP-AKA
--#CONFIG_USIM_SIMULATOR=y
--
--# EAP-SAKE
--#CONFIG_EAP_SAKE=y
--
--# EAP-GPSK
--#CONFIG_EAP_GPSK=y
--# Include support for optional SHA256 cipher suite in EAP-GPSK
--#CONFIG_EAP_GPSK_SHA256=y
--
--# EAP-TNC and related Trusted Network Connect support (experimental)
--#CONFIG_EAP_TNC=y
--
--# Wi-Fi Protected Setup (WPS)
--CONFIG_WPS=y
--
--# EAP-IKEv2
--#CONFIG_EAP_IKEV2=y
--
--# PKCS#12 (PFX) support (used to read private key and certificate file from
--# a file that usually has extension .p12 or .pfx)
--CONFIG_PKCS12=y
--
--# Smartcard support (i.e., private key on a smartcard), e.g., with openssl
--# engine.
--CONFIG_SMARTCARD=y
--
--# PC/SC interface for smartcards (USIM, GSM SIM)
--# Enable this if EAP-SIM or EAP-AKA is included
--#CONFIG_PCSC=y
--
--# Development testing
--#CONFIG_EAPOL_TEST=y
--
--# Select control interface backend for external programs, e.g, wpa_cli:
--# unix = UNIX domain sockets (default for Linux/*BSD)
--# udp = UDP sockets using localhost (127.0.0.1)
--# named_pipe = Windows Named Pipe (default for Windows)
--# y = use default (backwards compatibility)
--# If this option is commented out, control interface is not included in the
--# build.
--CONFIG_CTRL_IFACE=y
--
--# Include support for GNU Readline and History Libraries in wpa_cli.
--# When building a wpa_cli binary for distribution, please note that these
--# libraries are licensed under GPL and as such, BSD license may not apply for
--# the resulting binary.
--#CONFIG_READLINE=y
--
--# Remove debugging code that is printing out debug message to stdout.
--# This can be used to reduce the size of the wpa_supplicant considerably
--# if debugging code is not needed. The size reduction can be around 35%
--# (e.g., 90 kB).
--#CONFIG_NO_STDOUT_DEBUG=y
--
--# Remove WPA support, e.g., for wired-only IEEE 802.1X supplicant, to save
--# 35-50 kB in code size.
--#CONFIG_NO_WPA=y
--
--# Remove WPA2 support. This allows WPA to be used, but removes WPA2 code to
--# save about 1 kB in code size when building only WPA-Personal (no EAP support)
--# or 6 kB if building for WPA-Enterprise.
--#CONFIG_NO_WPA2=y
--
--# Remove IEEE 802.11i/WPA-Personal ASCII passphrase support
--# This option can be used to reduce code size by removing support for
--# converting ASCII passphrases into PSK. If this functionality is removed, the
--# PSK can only be configured as the 64-octet hexstring (e.g., from
--# wpa_passphrase). This saves about 0.5 kB in code size.
--#CONFIG_NO_WPA_PASSPHRASE=y
--
--# Disable scan result processing (ap_mode=1) to save code size by about 1 kB.
--# This can be used if ap_scan=1 mode is never enabled.
--#CONFIG_NO_SCAN_PROCESSING=y
--
--# Select configuration backend:
--# file = text file (e.g., wpa_supplicant.conf; note: the configuration file
--#	path is given on command line, not here; this option is just used to
--#	select the backend that allows configuration files to be used)
--# winreg = Windows registry (see win_example.reg for an example)
--CONFIG_BACKEND=file
--
--# Remove configuration write functionality (i.e., to allow the configuration
--# file to be updated based on runtime configuration changes). The runtime
--# configuration can still be changed, the changes are just not going to be
--# persistent over restarts. This option can be used to reduce code size by
--# about 3.5 kB.
--#CONFIG_NO_CONFIG_WRITE=y
--
--# Remove support for configuration blobs to reduce code size by about 1.5 kB.
--#CONFIG_NO_CONFIG_BLOBS=y
--
--# Select program entry point implementation:
--# main = UNIX/POSIX like main() function (default)
--# main_winsvc = Windows service (read parameters from registry)
--# main_none = Very basic example (development use only)
--#CONFIG_MAIN=main
--
--# Select wrapper for operatins system and C library specific functions
--# unix = UNIX/POSIX like systems (default)
--# win32 = Windows systems
--# none = Empty template
--#CONFIG_OS=unix
--
--# Select event loop implementation
--# eloop = select() loop (default)
--# eloop_win = Windows events and WaitForMultipleObject() loop
--# eloop_none = Empty template
--#CONFIG_ELOOP=eloop
--
--# Select layer 2 packet implementation
--# linux = Linux packet socket (default)
--# pcap = libpcap/libdnet/WinPcap
--# freebsd = FreeBSD libpcap
--# winpcap = WinPcap with receive thread
--# ndis = Windows NDISUIO (note: requires CONFIG_USE_NDISUIO=y)
--# none = Empty template
--#CONFIG_L2_PACKET=linux
--
--# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
--CONFIG_PEERKEY=y
--
--# IEEE 802.11w (management frame protection)
--# This version is an experimental implementation based on IEEE 802.11w/D1.0
--# draft and is subject to change since the standard has not yet been finalized.
--# Driver support is also needed for IEEE 802.11w.
--CONFIG_IEEE80211W=y
--
--# Select TLS implementation
--# openssl = OpenSSL (default)
--# gnutls = GnuTLS (needed for TLS/IA, see also CONFIG_GNUTLS_EXTRA)
--# internal = Internal TLSv1 implementation (experimental)
--# none = Empty template
--CONFIG_TLS=internal
--
--# Whether to enable TLS/IA support, which is required for EAP-TTLSv1.
--# You need CONFIG_TLS=gnutls for this to have any effect. Please note that
--# even though the core GnuTLS library is released under LGPL, this extra
--# library uses GPL and as such, the terms of GPL apply to the combination
--# of wpa_supplicant and GnuTLS if this option is enabled. BSD license may not
--# apply for distribution of the resulting binary.
--#CONFIG_GNUTLS_EXTRA=y
--
--# If CONFIG_TLS=internal is used, additional library and include paths are
--# needed for LibTomMath. Alternatively, an integrated, minimal version of
--# LibTomMath can be used. See beginning of libtommath.c for details on benefits
--# and drawbacks of this option.
--CONFIG_INTERNAL_LIBTOMMATH=y
--#ifndef CONFIG_INTERNAL_LIBTOMMATH
--#LTM_PATH=/usr/src/libtommath-0.39
--#CFLAGS += -I$(LTM_PATH)
--#LIBS += -L$(LTM_PATH)
--#LIBS_p += -L$(LTM_PATH)
--#endif
--# At the cost of about 4 kB of additional binary size, the internal LibTomMath
--# can be configured to include faster routines for exptmod, sqr, and div to
--# speed up DH and RSA calculation considerably
--CONFIG_INTERNAL_LIBTOMMATH_FAST=y
--
--# Include NDIS event processing through WMI into wpa_supplicant/wpasvc.
--# This is only for Windows builds and requires WMI-related header files and
--# WbemUuid.Lib from Platform SDK even when building with MinGW.
--#CONFIG_NDIS_EVENTS_INTEGRATED=y
--#PLATFORMSDKLIB="/opt/Program Files/Microsoft Platform SDK/Lib"
--
--# Add support for old DBus control interface
--# (fi.epitest.hostap.WPASupplicant)
--#CONFIG_CTRL_IFACE_DBUS=y
--
--# Add support for new DBus control interface
--# (fi.w1.hostap.wpa_supplicant1)
--#CONFIG_CTRL_IFACE_DBUS_NEW=y
--
--# Add introspection support for new DBus control interface
--#CONFIG_CTRL_IFACE_DBUS_INTRO=y
--
--# Add support for loading EAP methods dynamically as shared libraries.
--# When this option is enabled, each EAP method can be either included
--# statically (CONFIG_EAP_<method>=y) or dynamically (CONFIG_EAP_<method>=dyn).
--# Dynamic EAP methods are build as shared objects (eap_*.so) and they need to
--# be loaded in the beginning of the wpa_supplicant configuration file
--# (see load_dynamic_eap parameter in the example file) before being used in
--# the network blocks.
--#
--# Note that some shared parts of EAP methods are included in the main program
--# and in order to be able to use dynamic EAP methods using these parts, the
--# main program must have been build with the EAP method enabled (=y or =dyn).
--# This means that EAP-TLS/PEAP/TTLS/FAST cannot be added as dynamic libraries
--# unless at least one of them was included in the main build to force inclusion
--# of the shared code. Similarly, at least one of EAP-SIM/AKA must be included
--# in the main build to be able to load these methods dynamically.
--#
--# Please also note that using dynamic libraries will increase the total binary
--# size. Thus, it may not be the best option for targets that have limited
--# amount of memory/flash.
--#CONFIG_DYNAMIC_EAP_METHODS=y
--
--# IEEE Std 802.11r-2008 (Fast BSS Transition)
--#CONFIG_IEEE80211R=y
--
--# Add support for writing debug log to a file (/tmp/wpa_supplicant-log-#.txt)
--#CONFIG_DEBUG_FILE=y
--
--# Enable privilege separation (see README 'Privilege separation' for details)
--#CONFIG_PRIVSEP=y
--
--# Enable mitigation against certain attacks against TKIP by delaying Michael
--# MIC error reports by a random amount of time between 0 and 60 seconds
--#CONFIG_DELAYED_MIC_ERROR_REPORT=y
--
--# Enable tracing code for developer debugging
--# This tracks use of memory allocations and other registrations and reports
--# incorrect use with a backtrace of call (or allocation) location.
--#CONFIG_WPA_TRACE=y
--# For BSD, comment out these.
--#LIBS += -lexecinfo
--#LIBS_p += -lexecinfo
--#LIBS_c += -lexecinfo
--
--# Use libbfd to get more details for developer debugging
--# This enables use of libbfd to get more detailed symbols for the backtraces
--# generated by CONFIG_WPA_TRACE=y.
--#CONFIG_WPA_TRACE_BFD=y
--# For BSD, comment out these.
--#LIBS += -lbfd -liberty -lz
--#LIBS_p += -lbfd -liberty -lz
--#LIBS_c += -lbfd -liberty -lz
--
--CONFIG_NO_RANDOM_POOL=y
--NEED_80211_COMMON=y
--
--CONFIG_IBSS_RSN=y
-diff --git a/package/hostapd/files/wpa_supplicant-mini.config b/package/hostapd/files/wpa_supplicant-mini.config
-deleted file mode 100644
-index a33e6f0..0000000
---- a/package/hostapd/files/wpa_supplicant-mini.config
-+++ /dev/null
-@@ -1,407 +0,0 @@
--# Example wpa_supplicant build time configuration
--#
--# This file lists the configuration options that are used when building the
--# hostapd binary. All lines starting with # are ignored. Configuration option
--# lines must be commented out complete, if they are not to be included, i.e.,
--# just setting VARIABLE=n is not disabling that variable.
--#
--# This file is included in Makefile, so variables like CFLAGS and LIBS can also
--# be modified from here. In most cases, these lines should use += in order not
--# to override previous values of the variables.
--
--
--# Uncomment following two lines and fix the paths if you have installed OpenSSL
--# or GnuTLS in non-default location
--#CFLAGS += -I/usr/local/openssl/include
--#LIBS += -L/usr/local/openssl/lib
--
--# Some Red Hat versions seem to include kerberos header files from OpenSSL, but
--# the kerberos files are not in the default include path. Following line can be
--# used to fix build issues on such systems (krb5.h not found).
--#CFLAGS += -I/usr/include/kerberos
--
--# Example configuration for various cross-compilation platforms
--
--#### sveasoft (e.g., for Linksys WRT54G) ######################################
--#CC=mipsel-uclibc-gcc
--#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
--#CFLAGS += -Os
--#CPPFLAGS += -I../src/include -I../../src/router/openssl/include
--#LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
--###############################################################################
--
--#### openwrt (e.g., for Linksys WRT54G) #######################################
--#CC=mipsel-uclibc-gcc
--#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
--#CFLAGS += -Os
--#CPPFLAGS=-I../src/include -I../openssl-0.9.7d/include \
--#	-I../WRT54GS/release/src/include
--#LIBS = -lssl
--###############################################################################
--
--
--# Driver interface for Host AP driver
--CONFIG_DRIVER_HOSTAP=y
--
--# Driver interface for Agere driver
--#CONFIG_DRIVER_HERMES=y
--# Change include directories to match with the local setup
--#CFLAGS += -I../../hcf -I../../include -I../../include/hcf
--#CFLAGS += -I../../include/wireless
--
--# Driver interface for madwifi driver
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_MADWIFI=y
--# Set include directory to the madwifi source tree
--#CFLAGS += -I../../madwifi
--
--# Driver interface for ndiswrapper
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_NDISWRAPPER=y
--
--# Driver interface for Atmel driver
--# CONFIG_DRIVER_ATMEL=y
--
--# Driver interface for old Broadcom driver
--# Please note that the newer Broadcom driver ("hybrid Linux driver") supports
--# Linux wireless extensions and does not need (or even work) with the old
--# driver wrapper. Use CONFIG_DRIVER_WEXT=y with that driver.
--#CONFIG_DRIVER_BROADCOM=y
--# Example path for wlioctl.h; change to match your configuration
--#CFLAGS += -I/opt/WRT54GS/release/src/include
--
--# Driver interface for Intel ipw2100/2200 driver
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_IPW=y
--
--# Driver interface for Ralink driver
--#CONFIG_DRIVER_RALINK=y
--
--# Driver interface for generic Linux wireless extensions
--CONFIG_DRIVER_WEXT=y
--
--# Driver interface for Linux drivers using the nl80211 kernel interface
--CONFIG_DRIVER_NL80211=y
--
--# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
--#CONFIG_DRIVER_BSD=y
--#CFLAGS += -I/usr/local/include
--#LIBS += -L/usr/local/lib
--#LIBS_p += -L/usr/local/lib
--#LIBS_c += -L/usr/local/lib
--
--# Driver interface for Windows NDIS
--#CONFIG_DRIVER_NDIS=y
--#CFLAGS += -I/usr/include/w32api/ddk
--#LIBS += -L/usr/local/lib
--# For native build using mingw
--#CONFIG_NATIVE_WINDOWS=y
--# Additional directories for cross-compilation on Linux host for mingw target
--#CFLAGS += -I/opt/mingw/mingw32/include/ddk
--#LIBS += -L/opt/mingw/mingw32/lib
--#CC=mingw32-gcc
--# By default, driver_ndis uses WinPcap for low-level operations. This can be
--# replaced with the following option which replaces WinPcap calls with NDISUIO.
--# However, this requires that WZC is disabled (net stop wzcsvc) before starting
--# wpa_supplicant.
--# CONFIG_USE_NDISUIO=y
--
--# Driver interface for development testing
--#CONFIG_DRIVER_TEST=y
--
--# Include client MLME (management frame processing) for test driver
--# This can be used to test MLME operations in hostapd with the test interface.
--# space.
--#CONFIG_CLIENT_MLME=y
--
--# Driver interface for wired Ethernet drivers
--CONFIG_DRIVER_WIRED=y
--
--# Driver interface for the Broadcom RoboSwitch family
--#CONFIG_DRIVER_ROBOSWITCH=y
--
--# Driver interface for no driver (e.g., WPS ER only)
--#CONFIG_DRIVER_NONE=y
--
--# Enable IEEE 802.1X Supplicant (automatically included if any EAP method is
--# included)
--# CONFIG_IEEE8021X_EAPOL=y
--
--# EAP-MD5
--# CONFIG_EAP_MD5=y
--
--# EAP-MSCHAPv2
--# CONFIG_EAP_MSCHAPV2=y
--
--# EAP-TLS
--# CONFIG_EAP_TLS=y
--
--# EAL-PEAP
--# CONFIG_EAP_PEAP=y
--
--# EAP-TTLS
--# CONFIG_EAP_TTLS=y
--
--# EAP-FAST
--# Note: Default OpenSSL package does not include support for all the
--# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL,
--# the OpenSSL library must be patched (openssl-0.9.8d-tls-extensions.patch)
--# to add the needed functions.
--#CONFIG_EAP_FAST=y
--
--# EAP-GTC
--# CONFIG_EAP_GTC=y
--
--# EAP-OTP
--# CONFIG_EAP_OTP=y
--
--# EAP-SIM (enable CONFIG_PCSC, if EAP-SIM is used)
--#CONFIG_EAP_SIM=y
--
--# EAP-PSK (experimental; this is _not_ needed for WPA-PSK)
--#CONFIG_EAP_PSK=y
--
--# EAP-PAX
--#CONFIG_EAP_PAX=y
--
--# LEAP
--# CONFIG_EAP_LEAP=y
--
--# EAP-AKA (enable CONFIG_PCSC, if EAP-AKA is used)
--#CONFIG_EAP_AKA=y
--
--# EAP-AKA' (enable CONFIG_PCSC, if EAP-AKA' is used).
--# This requires CONFIG_EAP_AKA to be enabled, too.
--#CONFIG_EAP_AKA_PRIME=y
--
--# Enable USIM simulator (Milenage) for EAP-AKA
--#CONFIG_USIM_SIMULATOR=y
--
--# EAP-SAKE
--#CONFIG_EAP_SAKE=y
--
--# EAP-GPSK
--#CONFIG_EAP_GPSK=y
--# Include support for optional SHA256 cipher suite in EAP-GPSK
--#CONFIG_EAP_GPSK_SHA256=y
--
--# EAP-TNC and related Trusted Network Connect support (experimental)
--#CONFIG_EAP_TNC=y
--
--# Wi-Fi Protected Setup (WPS)
--#CONFIG_WPS=y
--
--# EAP-IKEv2
--#CONFIG_EAP_IKEV2=y
--
--# PKCS#12 (PFX) support (used to read private key and certificate file from
--# a file that usually has extension .p12 or .pfx)
--# CONFIG_PKCS12=y
--
--# Smartcard support (i.e., private key on a smartcard), e.g., with openssl
--# engine.
--# CONFIG_SMARTCARD=y
--
--# PC/SC interface for smartcards (USIM, GSM SIM)
--# Enable this if EAP-SIM or EAP-AKA is included
--#CONFIG_PCSC=y
--
--# Development testing
--#CONFIG_EAPOL_TEST=y
--
--# Select control interface backend for external programs, e.g, wpa_cli:
--# unix = UNIX domain sockets (default for Linux/*BSD)
--# udp = UDP sockets using localhost (127.0.0.1)
--# named_pipe = Windows Named Pipe (default for Windows)
--# y = use default (backwards compatibility)
--# If this option is commented out, control interface is not included in the
--# build.
--CONFIG_CTRL_IFACE=y
--
--# Include support for GNU Readline and History Libraries in wpa_cli.
--# When building a wpa_cli binary for distribution, please note that these
--# libraries are licensed under GPL and as such, BSD license may not apply for
--# the resulting binary.
--#CONFIG_READLINE=y
--
--# Remove debugging code that is printing out debug message to stdout.
--# This can be used to reduce the size of the wpa_supplicant considerably
--# if debugging code is not needed. The size reduction can be around 35%
--# (e.g., 90 kB).
--#CONFIG_NO_STDOUT_DEBUG=y
--
--# Remove WPA support, e.g., for wired-only IEEE 802.1X supplicant, to save
--# 35-50 kB in code size.
--#CONFIG_NO_WPA=y
--
--# Remove WPA2 support. This allows WPA to be used, but removes WPA2 code to
--# save about 1 kB in code size when building only WPA-Personal (no EAP support)
--# or 6 kB if building for WPA-Enterprise.
--#CONFIG_NO_WPA2=y
--
--# Remove IEEE 802.11i/WPA-Personal ASCII passphrase support
--# This option can be used to reduce code size by removing support for
--# converting ASCII passphrases into PSK. If this functionality is removed, the
--# PSK can only be configured as the 64-octet hexstring (e.g., from
--# wpa_passphrase). This saves about 0.5 kB in code size.
--#CONFIG_NO_WPA_PASSPHRASE=y
--
--# Disable scan result processing (ap_mode=1) to save code size by about 1 kB.
--# This can be used if ap_scan=1 mode is never enabled.
--#CONFIG_NO_SCAN_PROCESSING=y
--
--# Select configuration backend:
--# file = text file (e.g., wpa_supplicant.conf; note: the configuration file
--#	path is given on command line, not here; this option is just used to
--#	select the backend that allows configuration files to be used)
--# winreg = Windows registry (see win_example.reg for an example)
--CONFIG_BACKEND=file
--
--# Remove configuration write functionality (i.e., to allow the configuration
--# file to be updated based on runtime configuration changes). The runtime
--# configuration can still be changed, the changes are just not going to be
--# persistent over restarts. This option can be used to reduce code size by
--# about 3.5 kB.
--#CONFIG_NO_CONFIG_WRITE=y
--
--# Remove support for configuration blobs to reduce code size by about 1.5 kB.
--#CONFIG_NO_CONFIG_BLOBS=y
--
--# Select program entry point implementation:
--# main = UNIX/POSIX like main() function (default)
--# main_winsvc = Windows service (read parameters from registry)
--# main_none = Very basic example (development use only)
--#CONFIG_MAIN=main
--
--# Select wrapper for operatins system and C library specific functions
--# unix = UNIX/POSIX like systems (default)
--# win32 = Windows systems
--# none = Empty template
--#CONFIG_OS=unix
--
--# Select event loop implementation
--# eloop = select() loop (default)
--# eloop_win = Windows events and WaitForMultipleObject() loop
--# eloop_none = Empty template
--#CONFIG_ELOOP=eloop
--
--# Select layer 2 packet implementation
--# linux = Linux packet socket (default)
--# pcap = libpcap/libdnet/WinPcap
--# freebsd = FreeBSD libpcap
--# winpcap = WinPcap with receive thread
--# ndis = Windows NDISUIO (note: requires CONFIG_USE_NDISUIO=y)
--# none = Empty template
--#CONFIG_L2_PACKET=linux
--
--# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
--# CONFIG_PEERKEY=y
--
--# IEEE 802.11w (management frame protection)
--# This version is an experimental implementation based on IEEE 802.11w/D1.0
--# draft and is subject to change since the standard has not yet been finalized.
--# Driver support is also needed for IEEE 802.11w.
--#CONFIG_IEEE80211W=y
--
--# Select TLS implementation
--# openssl = OpenSSL (default)
--# gnutls = GnuTLS (needed for TLS/IA, see also CONFIG_GNUTLS_EXTRA)
--# internal = Internal TLSv1 implementation (experimental)
--# none = Empty template
--CONFIG_TLS=internal
--
--# Whether to enable TLS/IA support, which is required for EAP-TTLSv1.
--# You need CONFIG_TLS=gnutls for this to have any effect. Please note that
--# even though the core GnuTLS library is released under LGPL, this extra
--# library uses GPL and as such, the terms of GPL apply to the combination
--# of wpa_supplicant and GnuTLS if this option is enabled. BSD license may not
--# apply for distribution of the resulting binary.
--#CONFIG_GNUTLS_EXTRA=y
--
--# If CONFIG_TLS=internal is used, additional library and include paths are
--# needed for LibTomMath. Alternatively, an integrated, minimal version of
--# LibTomMath can be used. See beginning of libtommath.c for details on benefits
--# and drawbacks of this option.
--#CONFIG_INTERNAL_LIBTOMMATH=y
--#ifndef CONFIG_INTERNAL_LIBTOMMATH
--#LTM_PATH=/usr/src/libtommath-0.39
--#CFLAGS += -I$(LTM_PATH)
--#LIBS += -L$(LTM_PATH)
--#LIBS_p += -L$(LTM_PATH)
--#endif
--# At the cost of about 4 kB of additional binary size, the internal LibTomMath
--# can be configured to include faster routines for exptmod, sqr, and div to
--# speed up DH and RSA calculation considerably
--#CONFIG_INTERNAL_LIBTOMMATH_FAST=y
--
--# Include NDIS event processing through WMI into wpa_supplicant/wpasvc.
--# This is only for Windows builds and requires WMI-related header files and
--# WbemUuid.Lib from Platform SDK even when building with MinGW.
--#CONFIG_NDIS_EVENTS_INTEGRATED=y
--#PLATFORMSDKLIB="/opt/Program Files/Microsoft Platform SDK/Lib"
--
--# Add support for old DBus control interface
--# (fi.epitest.hostap.WPASupplicant)
--#CONFIG_CTRL_IFACE_DBUS=y
--
--# Add support for new DBus control interface
--# (fi.w1.hostap.wpa_supplicant1)
--#CONFIG_CTRL_IFACE_DBUS_NEW=y
--
--# Add introspection support for new DBus control interface
--#CONFIG_CTRL_IFACE_DBUS_INTRO=y
--
--# Add support for loading EAP methods dynamically as shared libraries.
--# When this option is enabled, each EAP method can be either included
--# statically (CONFIG_EAP_<method>=y) or dynamically (CONFIG_EAP_<method>=dyn).
--# Dynamic EAP methods are build as shared objects (eap_*.so) and they need to
--# be loaded in the beginning of the wpa_supplicant configuration file
--# (see load_dynamic_eap parameter in the example file) before being used in
--# the network blocks.
--#
--# Note that some shared parts of EAP methods are included in the main program
--# and in order to be able to use dynamic EAP methods using these parts, the
--# main program must have been build with the EAP method enabled (=y or =dyn).
--# This means that EAP-TLS/PEAP/TTLS/FAST cannot be added as dynamic libraries
--# unless at least one of them was included in the main build to force inclusion
--# of the shared code. Similarly, at least one of EAP-SIM/AKA must be included
--# in the main build to be able to load these methods dynamically.
--#
--# Please also note that using dynamic libraries will increase the total binary
--# size. Thus, it may not be the best option for targets that have limited
--# amount of memory/flash.
--#CONFIG_DYNAMIC_EAP_METHODS=y
--
--# IEEE Std 802.11r-2008 (Fast BSS Transition)
--#CONFIG_IEEE80211R=y
--
--# Add support for writing debug log to a file (/tmp/wpa_supplicant-log-#.txt)
--#CONFIG_DEBUG_FILE=y
--
--# Enable privilege separation (see README 'Privilege separation' for details)
--#CONFIG_PRIVSEP=y
--
--# Enable mitigation against certain attacks against TKIP by delaying Michael
--# MIC error reports by a random amount of time between 0 and 60 seconds
--#CONFIG_DELAYED_MIC_ERROR_REPORT=y
--
--# Enable tracing code for developer debugging
--# This tracks use of memory allocations and other registrations and reports
--# incorrect use with a backtrace of call (or allocation) location.
--#CONFIG_WPA_TRACE=y
--# For BSD, comment out these.
--#LIBS += -lexecinfo
--#LIBS_p += -lexecinfo
--#LIBS_c += -lexecinfo
--
--# Use libbfd to get more details for developer debugging
--# This enables use of libbfd to get more detailed symbols for the backtraces
--# generated by CONFIG_WPA_TRACE=y.
--#CONFIG_WPA_TRACE_BFD=y
--# For BSD, comment out these.
--#LIBS += -lbfd -liberty -lz
--#LIBS_p += -lbfd -liberty -lz
--#LIBS_c += -lbfd -liberty -lz
--
--CONFIG_NO_RANDOM_POOL=y
--NEED_80211_COMMON=y
-diff --git a/package/hostapd/files/wpa_supplicant-p2p.config b/package/hostapd/files/wpa_supplicant-p2p.config
-deleted file mode 100644
-index 82e0bf0..0000000
---- a/package/hostapd/files/wpa_supplicant-p2p.config
-+++ /dev/null
-@@ -1,412 +0,0 @@
--# Example wpa_supplicant build time configuration
--#
--# This file lists the configuration options that are used when building the
--# hostapd binary. All lines starting with # are ignored. Configuration option
--# lines must be commented out complete, if they are not to be included, i.e.,
--# just setting VARIABLE=n is not disabling that variable.
--#
--# This file is included in Makefile, so variables like CFLAGS and LIBS can also
--# be modified from here. In most cases, these lines should use += in order not
--# to override previous values of the variables.
--
--
--# Uncomment following two lines and fix the paths if you have installed OpenSSL
--# or GnuTLS in non-default location
--#CFLAGS += -I/usr/local/openssl/include
--#LIBS += -L/usr/local/openssl/lib
--
--# Some Red Hat versions seem to include kerberos header files from OpenSSL, but
--# the kerberos files are not in the default include path. Following line can be
--# used to fix build issues on such systems (krb5.h not found).
--#CFLAGS += -I/usr/include/kerberos
--
--# Example configuration for various cross-compilation platforms
--
--#### sveasoft (e.g., for Linksys WRT54G) ######################################
--#CC=mipsel-uclibc-gcc
--#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
--#CFLAGS += -Os
--#CPPFLAGS += -I../src/include -I../../src/router/openssl/include
--#LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
--###############################################################################
--
--#### openwrt (e.g., for Linksys WRT54G) #######################################
--#CC=mipsel-uclibc-gcc
--#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
--#CFLAGS += -Os
--#CPPFLAGS=-I../src/include -I../openssl-0.9.7d/include \
--#	-I../WRT54GS/release/src/include
--#LIBS = -lssl
--###############################################################################
--
--
--# Driver interface for Host AP driver
--CONFIG_DRIVER_HOSTAP=y
--
--# Driver interface for Agere driver
--#CONFIG_DRIVER_HERMES=y
--# Change include directories to match with the local setup
--#CFLAGS += -I../../hcf -I../../include -I../../include/hcf
--#CFLAGS += -I../../include/wireless
--
--# Driver interface for madwifi driver
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_MADWIFI=y
--# Set include directory to the madwifi source tree
--#CFLAGS += -I../../madwifi
--
--# Driver interface for ndiswrapper
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_NDISWRAPPER=y
--
--# Driver interface for Atmel driver
--# CONFIG_DRIVER_ATMEL=y
--
--# Driver interface for old Broadcom driver
--# Please note that the newer Broadcom driver ("hybrid Linux driver") supports
--# Linux wireless extensions and does not need (or even work) with the old
--# driver wrapper. Use CONFIG_DRIVER_WEXT=y with that driver.
--#CONFIG_DRIVER_BROADCOM=y
--# Example path for wlioctl.h; change to match your configuration
--#CFLAGS += -I/opt/WRT54GS/release/src/include
--
--# Driver interface for Intel ipw2100/2200 driver
--# Deprecated; use CONFIG_DRIVER_WEXT=y instead.
--#CONFIG_DRIVER_IPW=y
--
--# Driver interface for Ralink driver
--#CONFIG_DRIVER_RALINK=y
--
--# Driver interface for generic Linux wireless extensions
--CONFIG_DRIVER_WEXT=y
--
--# Driver interface for Linux drivers using the nl80211 kernel interface
--CONFIG_DRIVER_NL80211=y
--
--# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
--#CONFIG_DRIVER_BSD=y
--#CFLAGS += -I/usr/local/include
--#LIBS += -L/usr/local/lib
--#LIBS_p += -L/usr/local/lib
--#LIBS_c += -L/usr/local/lib
--
--# Driver interface for Windows NDIS
--#CONFIG_DRIVER_NDIS=y
--#CFLAGS += -I/usr/include/w32api/ddk
--#LIBS += -L/usr/local/lib
--# For native build using mingw
--#CONFIG_NATIVE_WINDOWS=y
--# Additional directories for cross-compilation on Linux host for mingw target
--#CFLAGS += -I/opt/mingw/mingw32/include/ddk
--#LIBS += -L/opt/mingw/mingw32/lib
--#CC=mingw32-gcc
--# By default, driver_ndis uses WinPcap for low-level operations. This can be
--# replaced with the following option which replaces WinPcap calls with NDISUIO.
--# However, this requires that WZC is disabled (net stop wzcsvc) before starting
--# wpa_supplicant.
--# CONFIG_USE_NDISUIO=y
--
--# Driver interface for development testing
--#CONFIG_DRIVER_TEST=y
--
--# Include client MLME (management frame processing) for test driver
--# This can be used to test MLME operations in hostapd with the test interface.
--# space.
--#CONFIG_CLIENT_MLME=y
--
--# Driver interface for wired Ethernet drivers
--CONFIG_DRIVER_WIRED=y
--
--# Driver interface for the Broadcom RoboSwitch family
--#CONFIG_DRIVER_ROBOSWITCH=y
--
--# Driver interface for no driver (e.g., WPS ER only)
--#CONFIG_DRIVER_NONE=y
--
--# Enable IEEE 802.1X Supplicant (automatically included if any EAP method is
--# included)
--CONFIG_IEEE8021X_EAPOL=y
--
--# EAP-MD5
--CONFIG_EAP_MD5=y
--
--# EAP-MSCHAPv2
--CONFIG_EAP_MSCHAPV2=y
--
--# EAP-TLS
--CONFIG_EAP_TLS=y
--
--# EAL-PEAP
--CONFIG_EAP_PEAP=y
--
--# EAP-TTLS
--CONFIG_EAP_TTLS=y
--
--# EAP-FAST
--# Note: Default OpenSSL package does not include support for all the
--# functionality needed for EAP-FAST. If EAP-FAST is enabled with OpenSSL,
--# the OpenSSL library must be patched (openssl-0.9.8d-tls-extensions.patch)
--# to add the needed functions.
--#CONFIG_EAP_FAST=y
--
--# EAP-GTC
--CONFIG_EAP_GTC=y
--
--# EAP-OTP
--CONFIG_EAP_OTP=y
--
--# EAP-SIM (enable CONFIG_PCSC, if EAP-SIM is used)
--#CONFIG_EAP_SIM=y
--
--# EAP-PSK (experimental; this is _not_ needed for WPA-PSK)
--#CONFIG_EAP_PSK=y
--
--# EAP-PAX
--#CONFIG_EAP_PAX=y
--
--# LEAP
--CONFIG_EAP_LEAP=y
--
--# EAP-AKA (enable CONFIG_PCSC, if EAP-AKA is used)
--#CONFIG_EAP_AKA=y
--
--# EAP-AKA' (enable CONFIG_PCSC, if EAP-AKA' is used).
--# This requires CONFIG_EAP_AKA to be enabled, too.
--#CONFIG_EAP_AKA_PRIME=y
--
--# Enable USIM simulator (Milenage) for EAP-AKA
--#CONFIG_USIM_SIMULATOR=y
--
--# EAP-SAKE
--#CONFIG_EAP_SAKE=y
--
--# EAP-GPSK
--#CONFIG_EAP_GPSK=y
--# Include support for optional SHA256 cipher suite in EAP-GPSK
--#CONFIG_EAP_GPSK_SHA256=y
--
--# EAP-TNC and related Trusted Network Connect support (experimental)
--#CONFIG_EAP_TNC=y
--
--# Wi-Fi Protected Setup (WPS)
--CONFIG_WPS=y
--
--# EAP-IKEv2
--#CONFIG_EAP_IKEV2=y
--
--# PKCS#12 (PFX) support (used to read private key and certificate file from
--# a file that usually has extension .p12 or .pfx)
--CONFIG_PKCS12=y
--
--# Smartcard support (i.e., private key on a smartcard), e.g., with openssl
--# engine.
--CONFIG_SMARTCARD=y
--
--# PC/SC interface for smartcards (USIM, GSM SIM)
--# Enable this if EAP-SIM or EAP-AKA is included
--#CONFIG_PCSC=y
--
--# Development testing
--#CONFIG_EAPOL_TEST=y
--
--# Select control interface backend for external programs, e.g, wpa_cli:
--# unix = UNIX domain sockets (default for Linux/*BSD)
--# udp = UDP sockets using localhost (127.0.0.1)
--# named_pipe = Windows Named Pipe (default for Windows)
--# y = use default (backwards compatibility)
--# If this option is commented out, control interface is not included in the
--# build.
--CONFIG_CTRL_IFACE=y
--
--# Include support for GNU Readline and History Libraries in wpa_cli.
--# When building a wpa_cli binary for distribution, please note that these
--# libraries are licensed under GPL and as such, BSD license may not apply for
--# the resulting binary.
--#CONFIG_READLINE=y
--
--# Remove debugging code that is printing out debug message to stdout.
--# This can be used to reduce the size of the wpa_supplicant considerably
--# if debugging code is not needed. The size reduction can be around 35%
--# (e.g., 90 kB).
--#CONFIG_NO_STDOUT_DEBUG=y
--
--# Remove WPA support, e.g., for wired-only IEEE 802.1X supplicant, to save
--# 35-50 kB in code size.
--#CONFIG_NO_WPA=y
--
--# Remove WPA2 support. This allows WPA to be used, but removes WPA2 code to
--# save about 1 kB in code size when building only WPA-Personal (no EAP support)
--# or 6 kB if building for WPA-Enterprise.
--#CONFIG_NO_WPA2=y
--
--# Remove IEEE 802.11i/WPA-Personal ASCII passphrase support
--# This option can be used to reduce code size by removing support for
--# converting ASCII passphrases into PSK. If this functionality is removed, the
--# PSK can only be configured as the 64-octet hexstring (e.g., from
--# wpa_passphrase). This saves about 0.5 kB in code size.
--#CONFIG_NO_WPA_PASSPHRASE=y
--
--# Disable scan result processing (ap_mode=1) to save code size by about 1 kB.
--# This can be used if ap_scan=1 mode is never enabled.
--#CONFIG_NO_SCAN_PROCESSING=y
--
--# Select configuration backend:
--# file = text file (e.g., wpa_supplicant.conf; note: the configuration file
--#	path is given on command line, not here; this option is just used to
--#	select the backend that allows configuration files to be used)
--# winreg = Windows registry (see win_example.reg for an example)
--CONFIG_BACKEND=file
--
--# Remove configuration write functionality (i.e., to allow the configuration
--# file to be updated based on runtime configuration changes). The runtime
--# configuration can still be changed, the changes are just not going to be
--# persistent over restarts. This option can be used to reduce code size by
--# about 3.5 kB.
--#CONFIG_NO_CONFIG_WRITE=y
--
--# Remove support for configuration blobs to reduce code size by about 1.5 kB.
--#CONFIG_NO_CONFIG_BLOBS=y
--
--# Select program entry point implementation:
--# main = UNIX/POSIX like main() function (default)
--# main_winsvc = Windows service (read parameters from registry)
--# main_none = Very basic example (development use only)
--#CONFIG_MAIN=main
--
--# Select wrapper for operatins system and C library specific functions
--# unix = UNIX/POSIX like systems (default)
--# win32 = Windows systems
--# none = Empty template
--#CONFIG_OS=unix
--
--# Select event loop implementation
--# eloop = select() loop (default)
--# eloop_win = Windows events and WaitForMultipleObject() loop
--# eloop_none = Empty template
--#CONFIG_ELOOP=eloop
--
--# Select layer 2 packet implementation
--# linux = Linux packet socket (default)
--# pcap = libpcap/libdnet/WinPcap
--# freebsd = FreeBSD libpcap
--# winpcap = WinPcap with receive thread
--# ndis = Windows NDISUIO (note: requires CONFIG_USE_NDISUIO=y)
--# none = Empty template
--#CONFIG_L2_PACKET=linux
--
--# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
--CONFIG_PEERKEY=y
--
--# IEEE 802.11w (management frame protection)
--# This version is an experimental implementation based on IEEE 802.11w/D1.0
--# draft and is subject to change since the standard has not yet been finalized.
--# Driver support is also needed for IEEE 802.11w.
--CONFIG_IEEE80211W=y
--
--# Select TLS implementation
--# openssl = OpenSSL (default)
--# gnutls = GnuTLS (needed for TLS/IA, see also CONFIG_GNUTLS_EXTRA)
--# internal = Internal TLSv1 implementation (experimental)
--# none = Empty template
--CONFIG_TLS=internal
--
--# Whether to enable TLS/IA support, which is required for EAP-TTLSv1.
--# You need CONFIG_TLS=gnutls for this to have any effect. Please note that
--# even though the core GnuTLS library is released under LGPL, this extra
--# library uses GPL and as such, the terms of GPL apply to the combination
--# of wpa_supplicant and GnuTLS if this option is enabled. BSD license may not
--# apply for distribution of the resulting binary.
--#CONFIG_GNUTLS_EXTRA=y
--
--# If CONFIG_TLS=internal is used, additional library and include paths are
--# needed for LibTomMath. Alternatively, an integrated, minimal version of
--# LibTomMath can be used. See beginning of libtommath.c for details on benefits
--# and drawbacks of this option.
--CONFIG_INTERNAL_LIBTOMMATH=y
--#ifndef CONFIG_INTERNAL_LIBTOMMATH
--#LTM_PATH=/usr/src/libtommath-0.39
--#CFLAGS += -I$(LTM_PATH)
--#LIBS += -L$(LTM_PATH)
--#LIBS_p += -L$(LTM_PATH)
--#endif
--# At the cost of about 4 kB of additional binary size, the internal LibTomMath
--# can be configured to include faster routines for exptmod, sqr, and div to
--# speed up DH and RSA calculation considerably
--CONFIG_INTERNAL_LIBTOMMATH_FAST=y
--
--# Include NDIS event processing through WMI into wpa_supplicant/wpasvc.
--# This is only for Windows builds and requires WMI-related header files and
--# WbemUuid.Lib from Platform SDK even when building with MinGW.
--#CONFIG_NDIS_EVENTS_INTEGRATED=y
--#PLATFORMSDKLIB="/opt/Program Files/Microsoft Platform SDK/Lib"
--
--# Add support for old DBus control interface
--# (fi.epitest.hostap.WPASupplicant)
--#CONFIG_CTRL_IFACE_DBUS=y
--
--# Add support for new DBus control interface
--# (fi.w1.hostap.wpa_supplicant1)
--#CONFIG_CTRL_IFACE_DBUS_NEW=y
--
--# Add introspection support for new DBus control interface
--#CONFIG_CTRL_IFACE_DBUS_INTRO=y
--
--# Add support for loading EAP methods dynamically as shared libraries.
--# When this option is enabled, each EAP method can be either included
--# statically (CONFIG_EAP_<method>=y) or dynamically (CONFIG_EAP_<method>=dyn).
--# Dynamic EAP methods are build as shared objects (eap_*.so) and they need to
--# be loaded in the beginning of the wpa_supplicant configuration file
--# (see load_dynamic_eap parameter in the example file) before being used in
--# the network blocks.
--#
--# Note that some shared parts of EAP methods are included in the main program
--# and in order to be able to use dynamic EAP methods using these parts, the
--# main program must have been build with the EAP method enabled (=y or =dyn).
--# This means that EAP-TLS/PEAP/TTLS/FAST cannot be added as dynamic libraries
--# unless at least one of them was included in the main build to force inclusion
--# of the shared code. Similarly, at least one of EAP-SIM/AKA must be included
--# in the main build to be able to load these methods dynamically.
--#
--# Please also note that using dynamic libraries will increase the total binary
--# size. Thus, it may not be the best option for targets that have limited
--# amount of memory/flash.
--#CONFIG_DYNAMIC_EAP_METHODS=y
--
--# IEEE Std 802.11r-2008 (Fast BSS Transition)
--#CONFIG_IEEE80211R=y
--
--# Add support for writing debug log to a file (/tmp/wpa_supplicant-log-#.txt)
--#CONFIG_DEBUG_FILE=y
--
--# Enable privilege separation (see README 'Privilege separation' for details)
--#CONFIG_PRIVSEP=y
--
--# Enable mitigation against certain attacks against TKIP by delaying Michael
--# MIC error reports by a random amount of time between 0 and 60 seconds
--#CONFIG_DELAYED_MIC_ERROR_REPORT=y
--
--# Enable tracing code for developer debugging
--# This tracks use of memory allocations and other registrations and reports
--# incorrect use with a backtrace of call (or allocation) location.
--#CONFIG_WPA_TRACE=y
--# For BSD, comment out these.
--#LIBS += -lexecinfo
--#LIBS_p += -lexecinfo
--#LIBS_c += -lexecinfo
--
--# Use libbfd to get more details for developer debugging
--# This enables use of libbfd to get more detailed symbols for the backtraces
--# generated by CONFIG_WPA_TRACE=y.
--#CONFIG_WPA_TRACE_BFD=y
--# For BSD, comment out these.
--#LIBS += -lbfd -liberty -lz
--#LIBS_p += -lbfd -liberty -lz
--#LIBS_c += -lbfd -liberty -lz
--
--CONFIG_NO_RANDOM_POOL=y
--NEED_80211_COMMON=y
--
--CONFIG_IBSS_RSN=y
--
--CONFIG_P2P=y
--CONFIG_AP=y
-diff --git a/package/hostapd/files/wpa_supplicant.sh b/package/hostapd/files/wpa_supplicant.sh
-deleted file mode 100644
-index bd86801..0000000
---- a/package/hostapd/files/wpa_supplicant.sh
-+++ /dev/null
-@@ -1,194 +0,0 @@
--wpa_supplicant_setup_vif() {
--	local vif="$1"
--	local driver="$2"
--	local key="$key"
--	local options="$3"
--	local freq=""
--	local ht="$5"
--	local ap_scan=""
--	local scan_ssid="1"
--	[ -n "$4" ] && freq="frequency=$4"
--
--	config_get enc "$vif" encryption
--	config_get key "$vif" key
--
--	local net_cfg bridge
--	config_get bridge "$vif" bridge
--	[ -z "$bridge" ] && {
--		net_cfg="$(find_net_config "$vif")"
--		[ -z "$net_cfg" ] || bridge="$(bridge_interface "$net_cfg")"
--		config_set "$vif" bridge "$bridge"
--	}
--
--	local mode ifname wds modestr=""
--	config_get mode "$vif" mode
--	config_get ifname "$vif" ifname
--	config_get_bool wds "$vif" wds 0
--	[ -z "$bridge" ] || [ "$mode" = ap ] || [ "$mode" = sta -a $wds -eq 1 ] || {
--		echo "wpa_supplicant_setup_vif($ifname): Refusing to bridge $mode mode interface"
--		return 1
--	}
--	[ "$mode" = "adhoc" ] && {
--		modestr="mode=1"
--		scan_ssid="0"
--		ap_scan="ap_scan=2"
--	}
--
--	key_mgmt='NONE'
--	case "$enc" in
--		*none*) ;;
--		*wep*)
--			config_get key "$vif" key
--			key="${key:-1}"
--			case "$key" in
--				[1234])
--					for idx in 1 2 3 4; do
--						local zidx
--						zidx=$(($idx - 1))
--						config_get ckey "$vif" "key${idx}"
--						[ -n "$ckey" ] && \
--							append "wep_key${zidx}" "wep_key${zidx}=$(prepare_key_wep "$ckey")"
--					done
--					wep_tx_keyidx="wep_tx_keyidx=$((key - 1))"
--				;;
--				*)
--					wep_key0="wep_key0=$(prepare_key_wep "$key")"
--					wep_tx_keyidx="wep_tx_keyidx=0"
--				;;
--			esac
--		;;
--		*psk*)
--			key_mgmt='WPA-PSK'
--			# if you want to use PSK with a non-nl80211 driver you
--			# have to use WPA-NONE and wext driver for wpa_s
--			[ "$mode" = "adhoc" -a "$driver" != "nl80211" ] && {
--				key_mgmt='WPA-NONE'
--				driver='wext'
--			}
--			if [ ${#key} -eq 64 ]; then
--				passphrase="psk=${key}"
--			else
--				passphrase="psk=\"${key}\""
--			fi
--			case "$enc" in
--				*psk2*)
--					proto='proto=RSN'
--					config_get ieee80211w "$vif" ieee80211w
--				;;
--				*psk*)
--					proto='proto=WPA'
--				;;
--			esac
--		;;
--		*wpa*|*8021x*)
--			proto='proto=WPA2'
--			key_mgmt='WPA-EAP'
--			config_get ieee80211w "$vif" ieee80211w
--			config_get ca_cert "$vif" ca_cert
--			config_get eap_type "$vif" eap_type
--			ca_cert=${ca_cert:+"ca_cert=\"$ca_cert\""}
--			case "$eap_type" in
--				tls)
--					pairwise='pairwise=CCMP'
--					group='group=CCMP'
--					config_get identity "$vif" identity
--					config_get client_cert "$vif" client_cert
--					config_get priv_key "$vif" priv_key
--					config_get priv_key_pwd "$vif" priv_key_pwd
--					identity="identity=\"$identity\""
--					client_cert="client_cert=\"$client_cert\""
--					priv_key="private_key=\"$priv_key\""
--					priv_key_pwd="private_key_passwd=\"$priv_key_pwd\""
--				;;
--				peap|ttls)
--					config_get auth "$vif" auth
--					config_get identity "$vif" identity
--					config_get password "$vif" password
--					phase2="phase2=\"auth=${auth:-MSCHAPV2}\""
--					identity="identity=\"$identity\""
--					password="${password:+password=\"$password\"}"
--				;;
--			esac
--			eap_type="eap=$(echo $eap_type | tr 'a-z' 'A-Z')"
--		;;
--	esac
--
--	case "$ieee80211w" in
--		[012])
--			ieee80211w="ieee80211w=$ieee80211w"
--		;;
--	esac
--
--	local fixed_freq bssid1 beacon_int brates mrate
--	config_get ifname "$vif" ifname
--	config_get bridge "$vif" bridge
--	config_get ssid "$vif" ssid
--	config_get bssid "$vif" bssid
--	bssid1=${bssid:+"bssid=$bssid"}
--	beacon_int=${beacon_int:+"beacon_int=$beacon_int"}
--
--	local br brval brsub brstr
--	[ -n "$basic_rate_list" ] && {
--		for br in $basic_rate_list; do
--			brval="$(($br / 1000))"
--			brsub="$((($br / 100) % 10))"
--			[ "$brsub" -gt 0 ] && brval="$brval.$brsub"
--			[ -n "$brstr" ] && brstr="$brstr,"
--			brstr="$brstr$brval"
--		done
--		brates=${basic_rate_list:+"rates=$brstr"}
--	}
--
--	local mcval=""
--	[ -n "$mcast_rate" ] && {
--		mcval="$(($mcast_rate / 1000))"
--		mcsub="$(( ($mcast_rate / 100) % 10 ))"
--		[ "$mcsub" -gt 0 ] && mcval="$mcval.$mcsub"
--		mrate=${mcast_rate:+"mcast_rate=$mcval"}
--	}
--
--	local ht_str
--	[ -n "$ht" ] && ht_str="htmode=$ht"
--
--	rm -rf /var/run/wpa_supplicant-$ifname
--	cat > /var/run/wpa_supplicant-$ifname.conf <<EOF
--ctrl_interface=/var/run/wpa_supplicant-$ifname
--$ap_scan
--network={
--	$modestr
--	scan_ssid=$scan_ssid
--	ssid="$ssid"
--	$bssid1
--	key_mgmt=$key_mgmt
--	$proto
--	$freq
--	${fixed:+"fixed_freq=1"}
--	$beacon_int
--	$brates
--	$mrate
--	$ht_str
--	$ieee80211w
--	$passphrase
--	$pairwise
--	$group
--	$eap_type
--	$ca_cert
--	$client_cert
--	$priv_key
--	$priv_key_pwd
--	$phase2
--	$identity
--	$password
--	$wep_key0
--	$wep_key1
--	$wep_key2
--	$wep_key3
--	$wep_tx_keyidx
--}
--EOF
--	if [ -n "$proto" -o "$key_mgmt" == "NONE" ]; then
--		wpa_supplicant ${bridge:+ -b $bridge} -B -P "/var/run/wifi-${ifname}.pid" -D ${driver:-wext} -i "$ifname" -c /var/run/wpa_supplicant-$ifname.conf $options
--	else
--		return 0
--	fi
--}
-diff --git a/package/hostapd/files/wps-hotplug.sh b/package/hostapd/files/wps-hotplug.sh
-deleted file mode 100644
-index 058264a..0000000
---- a/package/hostapd/files/wps-hotplug.sh
-+++ /dev/null
-@@ -1,8 +0,0 @@
--#!/bin/sh
--
--if [ "$ACTION" = "pressed" -a "$BUTTON" = "wps" ]; then
--	for dir in /var/run/hostapd*; do
--		[ -d "$dir" ] || continue
--		hostapd_cli -p "$dir" wps_pbc
--	done
--fi
-diff --git a/package/hostapd/madwifi/include/compat.h b/package/hostapd/madwifi/include/compat.h
-deleted file mode 100644
-index 09e6397..0000000
---- a/package/hostapd/madwifi/include/compat.h
-+++ /dev/null
-@@ -1,209 +0,0 @@
--/*-
-- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
-- * All rights reserved.
-- *
-- * Redistribution and use in source and binary forms, with or without
-- * modification, are permitted provided that the following conditions
-- * are met:
-- * 1. Redistributions of source code must retain the above copyright
-- *    notice, this list of conditions and the following disclaimer,
-- *    without modification.
-- * 2. Redistributions in binary form must reproduce at minimum a disclaimer
-- *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
-- *    redistribution must be conditioned upon including a substantially
-- *    similar Disclaimer requirement for further binary redistribution.
-- * 3. Neither the names of the above-listed copyright holders nor the names
-- *    of any contributors may be used to endorse or promote products derived
-- *    from this software without specific prior written permission.
-- *
-- * Alternatively, this software may be distributed under the terms of the
-- * GNU General Public License ("GPL") version 2 as published by the Free
-- * Software Foundation.
-- *
-- * NO WARRANTY
-- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-- * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
-- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-- * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
-- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-- * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-- * THE POSSIBILITY OF SUCH DAMAGES.
-- *
-- * $Id: compat.h 3310 2008-01-30 20:23:49Z mentor $
-- */
--#ifndef _ATH_COMPAT_H_
--#define _ATH_COMPAT_H_
--
--/* Compatibility with older Linux kernels */
--#ifdef __KERNEL__
--#include <linux/types.h>
--#include <linux/time.h>
--#include <linux/netdevice.h>
--#endif
--
--#if !defined(__KERNEL__) || !defined (__bitwise)
--#define __le16 u_int16_t
--#define __le32 u_int32_t
--#define __le64 u_int64_t
--#define __be16 u_int16_t
--#define __be32 u_int32_t
--#define __be64 u_int64_t
--#define __force
--#endif
--
--#ifndef container_of
--#define container_of(ptr, type, member) ({				\
--	    const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
--	    (type *)( (char *)__mptr - offsetof(type,member) );})
--#endif
--
--#ifndef list_for_each_entry_reverse
--#define list_for_each_entry_reverse(pos, head, member)			\
--	for (pos = list_entry((head)->prev, typeof(*pos), member);	\
--	     prefetch(pos->member.prev), &pos->member != (head); 	\
--	     pos = list_entry(pos->member.prev, typeof(*pos), member))
--#endif
--
--#ifndef NETDEV_TX_OK
--#define NETDEV_TX_OK    0
--#define NETDEV_TX_BUSY  1
--#endif
--
--/*
-- * BSD/Linux compatibility shims.  These are used mainly to
-- * minimize differences when importing necesary BSD code.
-- */
--#define	NBBY	8			/* number of bits/byte */
--
--/* roundup() appears in Linux 2.6.18 */
--#include <linux/kernel.h>
--#ifndef roundup
--#define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))  /* to any y */
--#endif
--
--#define	howmany(x, y)	(((x)+((y)-1))/(y))
--
--/* Bit map related macros. */
--#define	setbit(a,i)	((a)[(i)/NBBY] |= 1<<((i)%NBBY))
--#define	clrbit(a,i)	((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
--#define	isset(a,i)	((a)[(i)/NBBY] & (1<<((i)%NBBY)))
--#define	isclr(a,i)	(((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
--
--#ifndef __packed
--#define	__packed	__attribute__((__packed__))
--#endif
--
--#define	__offsetof(t,m)	offsetof(t,m)
--
--#ifndef ALIGNED_POINTER
--/*
-- * ALIGNED_POINTER is a boolean macro that checks whether an address
-- * is valid to fetch data elements of type t from on this architecture.
-- * This does not reflect the optimal alignment, just the possibility
-- * (within reasonable limits). 
-- *
-- */
--#define ALIGNED_POINTER(p,t)	1
--#endif
--
--#ifdef __KERNEL__
--#define	KASSERT(exp, msg) do {			\
--	if (unlikely(!(exp))) {			\
--		printk msg;			\
--		BUG();				\
--	}					\
--} while (0)
--#endif /* __KERNEL__ */
--
--/*
-- * NetBSD/FreeBSD defines for file version.
-- */
--#define	__FBSDID(_s)
--#define	__KERNEL_RCSID(_n,_s)
--
--/*
-- * Fixes for Linux API changes
-- */
--#ifdef __KERNEL__
--
--#include <linux/version.h>
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
--#define AUTOCONF_INCLUDED 1
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
--#define ATH_REGISTER_SYSCTL_TABLE(t) register_sysctl_table(t, 1)
--#else
--#define ATH_REGISTER_SYSCTL_TABLE(t) register_sysctl_table(t)
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
--#define __user
--#define __kernel
--#define __iomem
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
--typedef int gfp_t;
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
--static inline int timeval_compare(struct timeval *lhs, struct timeval *rhs)
--{
--	if (lhs->tv_sec < rhs->tv_sec)
--		return -1;
--	if (lhs->tv_sec > rhs->tv_sec)
--		return 1;
--	return lhs->tv_usec - rhs->tv_usec;
--}
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
--#define IRQF_SHARED SA_SHIRQ
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27)
--#define netdev_priv(_netdev) ((_netdev)->priv)
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
--#define skb_end_pointer(_skb) ((_skb)->end)
--#define skb_tail_pointer(_skb) ((_skb)->tail)
--#define skb_set_network_header(_skb, _offset) \
--	do { (_skb)->nh.raw = (_skb)->data + (_offset); } while(0)
--#define skb_reset_network_header(_skb) \
--	do { (_skb)->nh.raw = (_skb)->data; } while(0)
--#define skb_mac_header(_skb) ((_skb)->mac.raw)
--#define skb_reset_mac_header(_skb) \
--	do { (_skb)->mac.raw = (_skb)->data; } while(0)
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
--#define CTL_AUTO -2
--#define DEV_ATH 9
--#else
--#define CTL_AUTO CTL_UNNUMBERED
--#define DEV_ATH CTL_UNNUMBERED
--#endif
--
--/* __skb_append got a third parameter in 2.6.14 */
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
--#define __skb_queue_after(_list, _old, _new)	__skb_append(_old, _new)
--#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
--#define __skb_queue_after(_list, _old, _new)	__skb_append(_old, _new, _list)
--#endif
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
--#define CTLNAME(x)	.ctl_name	= x,
--#else
--#define CTLNAME(x)
--#endif
--
--#endif /* __KERNEL__ */
--
--#endif /* _ATH_COMPAT_H_ */
-diff --git a/package/hostapd/madwifi/net80211/_ieee80211.h b/package/hostapd/madwifi/net80211/_ieee80211.h
-deleted file mode 100644
-index 2d2a06f..0000000
---- a/package/hostapd/madwifi/net80211/_ieee80211.h
-+++ /dev/null
-@@ -1,325 +0,0 @@
--/*-
-- * Copyright (c) 2001 Atsushi Onoe
-- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
-- * All rights reserved.
-- *
-- * Redistribution and use in source and binary forms, with or without
-- * modification, are permitted provided that the following conditions
-- * are met:
-- * 1. Redistributions of source code must retain the above copyright
-- *    notice, this list of conditions and the following disclaimer.
-- * 2. Redistributions in binary form must reproduce the above copyright
-- *    notice, this list of conditions and the following disclaimer in the
-- *    documentation and/or other materials provided with the distribution.
-- * 3. The name of the author may not be used to endorse or promote products
-- *    derived from this software without specific prior written permission.
-- *
-- * Alternatively, this software may be distributed under the terms of the
-- * GNU General Public License ("GPL") version 2 as published by the Free
-- * Software Foundation.
-- *
-- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- *
-- * $Id: _ieee80211.h 3207 2008-01-18 21:25:05Z mtaylor $
-- */
--#ifndef _NET80211__IEEE80211_H_
--#define _NET80211__IEEE80211_H_
--
--enum ieee80211_phytype {
--	IEEE80211_T_DS,			/* direct sequence spread spectrum */
--	IEEE80211_T_FH,			/* frequency hopping */
--	IEEE80211_T_OFDM,		/* frequency division multiplexing */
--	IEEE80211_T_TURBO,		/* high rate OFDM, aka turbo mode */
--};
--#define	IEEE80211_T_CCK	IEEE80211_T_DS	/* more common nomenclature */
--
--/* XXX: not really a mode; there are really multiple PHYs */
--enum ieee80211_phymode {
--	IEEE80211_MODE_AUTO	= 0,	/* autoselect */
--	IEEE80211_MODE_11A	= 1,	/* 5GHz, OFDM */
--	IEEE80211_MODE_11B	= 2,	/* 2GHz, CCK */
--	IEEE80211_MODE_11G	= 3,	/* 2GHz, OFDM */
--	IEEE80211_MODE_FH	= 4,	/* 2GHz, GFSK */
--	IEEE80211_MODE_TURBO_A	= 5,	/* 5GHz, OFDM, 2x clock dynamic turbo */
--	IEEE80211_MODE_TURBO_G	= 6,	/* 2GHz, OFDM, 2x clock  dynamic turbo*/
--};
--#define	IEEE80211_MODE_MAX	(IEEE80211_MODE_TURBO_G+1)
--
--enum ieee80211_opmode {
--	IEEE80211_M_STA		= 1,	/* infrastructure station */
--	IEEE80211_M_IBSS 	= 0,	/* IBSS (adhoc) station */
--	IEEE80211_M_AHDEMO	= 3,	/* Old lucent compatible adhoc demo */
--	IEEE80211_M_HOSTAP	= 6,	/* Software Access Point */
--	IEEE80211_M_MONITOR	= 8,	/* Monitor mode */
--	IEEE80211_M_WDS		= 2	/* WDS link */
--};
--
--/*
-- * True if this mode will send beacon on a regular interval, like AP
-- * or IBSS
-- */
--#define IEEE80211_IS_MODE_BEACON(_opmode) \
--	((_opmode == IEEE80211_M_IBSS) || \
--	 (_opmode == IEEE80211_M_HOSTAP))
--
--/*
-- * True if this mode must behave like a DFS master, ie do Channel
-- * Check Availability and In Service Monitoring. We need to make sure
-- * that all modes cannot send data without being authorized. Such
-- * enforcement is not done in monitor mode however.
-- */
--
--#define IEEE80211_IS_MODE_DFS_MASTER(_opmode) \
--	((_opmode == IEEE80211_M_IBSS) || \
--	 (_opmode == IEEE80211_M_AHDEMO) || \
--	 (_opmode == IEEE80211_M_HOSTAP) || \
--	 (_opmode == IEEE80211_M_WDS))
--
--/*
-- * 802.11g protection mode.
-- */
--enum ieee80211_protmode {
--	IEEE80211_PROT_NONE	= 0,	/* no protection */
--	IEEE80211_PROT_CTSONLY	= 1,	/* CTS to self */
--	IEEE80211_PROT_RTSCTS	= 2,	/* RTS-CTS */
--};
--
--/*
-- * Authentication mode.
-- */
--enum ieee80211_authmode {
--	IEEE80211_AUTH_NONE	= 0,
--	IEEE80211_AUTH_OPEN	= 1,	/* open */
--	IEEE80211_AUTH_SHARED	= 2,	/* shared-key */
--	IEEE80211_AUTH_8021X	= 3,	/* 802.1x */
--	IEEE80211_AUTH_AUTO	= 4,	/* auto-select/accept */
--	/* NB: these are used only for ioctls */
--	IEEE80211_AUTH_WPA	= 5,	/* WPA/RSN w/ 802.1x/PSK */
--};
--
--/*
-- * Roaming mode is effectively who controls the operation
-- * of the 802.11 state machine when operating as a station.
-- * State transitions are controlled either by the driver
-- * (typically when management frames are processed by the
-- * hardware/firmware), the host (auto/normal operation of
-- * the 802.11 layer), or explicitly through ioctl requests
-- * when applications like wpa_supplicant want control.
-- */
--enum ieee80211_roamingmode {
--	IEEE80211_ROAMING_DEVICE= 0,	/* driver/hardware control */
--	IEEE80211_ROAMING_AUTO	= 1,	/* 802.11 layer control */
--	IEEE80211_ROAMING_MANUAL= 2,	/* application control */
--};
--
--/*
-- * Scanning mode controls station scanning work; this is
-- * used only when roaming mode permits the host to select
-- * the bss to join/channel to use.
-- */
--enum ieee80211_scanmode {
--	IEEE80211_SCAN_DEVICE	= 0,	/* driver/hardware control */
--	IEEE80211_SCAN_BEST	= 1,	/* 802.11 layer selects best */
--	IEEE80211_SCAN_FIRST	= 2,	/* take first suitable candidate */
--};
--
--enum ieee80211_scanflags {
--	IEEE80211_NOSCAN_DEFAULT = (1 << 0),
--	IEEE80211_NOSCAN_SET     = (1 << 1),
--};
--
--/*
-- * Channels are specified by frequency and attributes.
-- */
--struct ieee80211_channel {
--	u_int16_t ic_freq;	/* setting in MHz */
--	u_int16_t ic_flags;	/* see below */
--	u_int8_t ic_ieee;	/* IEEE channel number */
--	int8_t ic_maxregpower;	/* maximum regulatory tx power in dBm */
--	int8_t ic_maxpower;	/* maximum tx power in dBm */
--	int8_t ic_minpower;	/* minimum tx power in dBm */
--	u_int8_t ic_scanflags;
--	u_int8_t ic_idletime; /* phy idle time in % */
--};
--
--#define	IEEE80211_CHAN_MAX	255
--#define	IEEE80211_CHAN_BYTES	32	/* howmany(IEEE80211_CHAN_MAX, NBBY) */
--#define	IEEE80211_CHAN_ANY	0xffff	/* token for ``any channel'' */
--#define	IEEE80211_CHAN_ANYC 	((struct ieee80211_channel *) IEEE80211_CHAN_ANY)
--
--#define	IEEE80211_RADAR_CHANCHANGE_TBTT_COUNT	0
--#define IEEE80211_DEFAULT_CHANCHANGE_TBTT_COUNT	3
--
--#define	IEEE80211_RADAR_TEST_MUTE_CHAN	36	/* Move to channel 36 for mute test */
--
--/* bits 0-3 are for private use by drivers */
--/* channel attributes */
--#define	IEEE80211_CHAN_TURBO	0x0010	/* Turbo channel */
--#define	IEEE80211_CHAN_CCK	0x0020	/* CCK channel */
--#define	IEEE80211_CHAN_OFDM	0x0040	/* OFDM channel */
--#define	IEEE80211_CHAN_2GHZ	0x0080	/* 2 GHz spectrum channel. */
--#define	IEEE80211_CHAN_5GHZ	0x0100	/* 5 GHz spectrum channel */
--#define	IEEE80211_CHAN_PASSIVE	0x0200	/* Only passive scan allowed */
--#define	IEEE80211_CHAN_DYN	0x0400	/* Dynamic CCK-OFDM channel */
--#define	IEEE80211_CHAN_GFSK	0x0800	/* GFSK channel (FHSS PHY) */
--#define IEEE80211_CHAN_RADAR	0x1000	/* Radar found on channel */
--#define	IEEE80211_CHAN_STURBO	0x2000	/* 11a static turbo channel only */
--#define	IEEE80211_CHAN_HALF	0x4000	/* Half rate channel */
--#define	IEEE80211_CHAN_QUARTER	0x8000	/* Quarter rate channel */
--
--/*
-- * Useful combinations of channel characteristics.
-- */
--#define	IEEE80211_CHAN_FHSS \
--	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK)
--#define	IEEE80211_CHAN_A \
--	(IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
--#define	IEEE80211_CHAN_B \
--	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK)
--#define	IEEE80211_CHAN_PUREG \
--	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)
--#define	IEEE80211_CHAN_G \
--	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
--#define IEEE80211_CHAN_108A \
--	(IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
--#define	IEEE80211_CHAN_108G \
--	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
--#define	IEEE80211_CHAN_ST \
--	(IEEE80211_CHAN_108A | IEEE80211_CHAN_STURBO)
--
--#define	IEEE80211_CHAN_ALL \
--	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_GFSK | \
--	 IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN)
--#define	IEEE80211_CHAN_ALLTURBO \
--	(IEEE80211_CHAN_ALL | IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)
--
--#define	IEEE80211_IS_CHAN_FHSS(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS)
--#define	IEEE80211_IS_CHAN_A(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A)
--#define	IEEE80211_IS_CHAN_B(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B)
--#define	IEEE80211_IS_CHAN_PUREG(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG)
--#define	IEEE80211_IS_CHAN_G(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G)
--#define	IEEE80211_IS_CHAN_ANYG(_c) \
--	(IEEE80211_IS_CHAN_PUREG(_c) || IEEE80211_IS_CHAN_G(_c))
--#define	IEEE80211_IS_CHAN_ST(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_ST) == IEEE80211_CHAN_ST)
--#define	IEEE80211_IS_CHAN_108A(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_108A) == IEEE80211_CHAN_108A)
--#define	IEEE80211_IS_CHAN_108G(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_108G) == IEEE80211_CHAN_108G)
--
--#define	IEEE80211_IS_CHAN_2GHZ(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_2GHZ) != 0)
--#define	IEEE80211_IS_CHAN_5GHZ(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_5GHZ) != 0)
--#define	IEEE80211_IS_CHAN_OFDM(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_OFDM) != 0)
--#define	IEEE80211_IS_CHAN_CCK(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_CCK) != 0)
--#define	IEEE80211_IS_CHAN_GFSK(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_GFSK) != 0)
--#define	IEEE80211_IS_CHAN_TURBO(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_TURBO) != 0)
--#define	IEEE80211_IS_CHAN_STURBO(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_STURBO) != 0)
--#define	IEEE80211_IS_CHAN_DTURBO(_c) \
--	(((_c)->ic_flags & \
--	(IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)) == IEEE80211_CHAN_TURBO)
--#define	IEEE80211_IS_CHAN_HALF(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_HALF) != 0)
--#define	IEEE80211_IS_CHAN_QUARTER(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_QUARTER) != 0)
--
--#define	IEEE80211_IS_CHAN_RADAR(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_RADAR) != 0)
--#define	IEEE80211_IS_CHAN_PASSIVE(_c) \
--	(((_c)->ic_flags & IEEE80211_CHAN_PASSIVE) != 0)
--#define	IEEE80211_ARE_CHANS_SAME_MODE(_a, _b) \
--	(((_a)->ic_flags & IEEE80211_CHAN_ALLTURBO) == ((_b)->ic_flags & IEEE80211_CHAN_ALLTURBO))
--
--/* ni_chan encoding for FH phy */
--#define	IEEE80211_FH_CHANMOD		80
--#define	IEEE80211_FH_CHAN(set,pat)	(((set) - 1) * IEEE80211_FH_CHANMOD + (pat))
--#define	IEEE80211_FH_CHANSET(chan)	((chan) / IEEE80211_FH_CHANMOD + 1)
--#define	IEEE80211_FH_CHANPAT(chan)	((chan) % IEEE80211_FH_CHANMOD)
--
--/*
-- * Spectrum Management (IEEE 802.11h-2003)
-- */
--
--/* algorithm for (re)association based on supported channels
-- * (the one mentioned in 11.6.1 as out of scope of .11h) */
--enum ieee80211_sc_algorithm {
--	IEEE80211_SC_NONE,
--	/*
--	 * Do not disallow anyone from associating. When needed, channel will
--	 * be switched to the most suitable channel, no matter client stations
--	 * support it or not.
--	 */
--
--	IEEE80211_SC_LOOSE,
--	/*
--	 * Do not disallow anyone from associating. When needed, channel will
--	 * be switched to a suitable channel, which will be chosen taking
--	 * ni->ni_suppchans and ic->ic_sc_sldg under consideration.
--	 */
--
--	IEEE80211_SC_TIGHT,
--	/*
--	 * Allow to associate if there are at least ic->ic_mincom channels
--	 * common to the associating station and all of the already associated
--	 * stations. If the number of new common channels is less than
--	 * required, consider disassociating some other STAs. Such a
--	 * disassociation will be performed if (and only if) the association we
--	 * are currently considering would be then possible and the count of
--	 * the resultant set of common channels (ic_chan_nodes[i] ==
--	 * ic_cn_total) would increase by some amount. Whether the number of
--	 * the new channels that could be gained is enough to sacrifice a
--	 * number of STAs is determined by the ic->ic_slcg parameter.
--	 */
--
--	IEEE80211_SC_STRICT
--	/*
--	 * Basically the same behavior as IEEE80211_SC_TIGHT, except that if a
--	 * station does not specify Supported Channels, then it is denied to
--	 * associate.
--	 */
--};
--
--/*
-- * 802.11 rate set.
-- */
--#define	IEEE80211_RATE_SIZE	8		/* 802.11 standard */
--#define	IEEE80211_RATE_MAXSIZE	15		/* max rates we'll handle */
--#define	IEEE80211_SANITISE_RATESIZE(_rsz) \
--	((_rsz > IEEE80211_RATE_MAXSIZE) ? IEEE80211_RATE_MAXSIZE : _rsz)
--
--struct ieee80211_rateset {
--	u_int8_t rs_nrates;
--	u_int8_t rs_rates[IEEE80211_RATE_MAXSIZE];
--};
--
--struct ieee80211_roam {
--	int8_t rssi11a;		/* rssi thresh for 11a bss */
--	int8_t rssi11b;		/* for 11g sta in 11b bss */
--	int8_t rssi11bOnly;	/* for 11b sta */
--	u_int8_t pad1;
--	u_int8_t rate11a;	/* rate thresh for 11a bss */
--	u_int8_t rate11b;	/* for 11g sta in 11b bss */
--	u_int8_t rate11bOnly;	/* for 11b sta */
--	u_int8_t pad2;
--};
--#endif /* _NET80211__IEEE80211_H_ */
-diff --git a/package/hostapd/madwifi/net80211/ieee80211.h b/package/hostapd/madwifi/net80211/ieee80211.h
-deleted file mode 100644
-index a39d4b9..0000000
---- a/package/hostapd/madwifi/net80211/ieee80211.h
-+++ /dev/null
-@@ -1,997 +0,0 @@
--/*-
-- * Copyright (c) 2001 Atsushi Onoe
-- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
-- * All rights reserved.
-- *
-- * Redistribution and use in source and binary forms, with or without
-- * modification, are permitted provided that the following conditions
-- * are met:
-- * 1. Redistributions of source code must retain the above copyright
-- *    notice, this list of conditions and the following disclaimer.
-- * 2. Redistributions in binary form must reproduce the above copyright
-- *    notice, this list of conditions and the following disclaimer in the
-- *    documentation and/or other materials provided with the distribution.
-- * 3. The name of the author may not be used to endorse or promote products
-- *    derived from this software without specific prior written permission.
-- *
-- * Alternatively, this software may be distributed under the terms of the
-- * GNU General Public License ("GPL") version 2 as published by the Free
-- * Software Foundation.
-- *
-- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- *
-- * $Id: ieee80211.h 3268 2008-01-26 20:48:11Z mtaylor $
-- */
--#ifndef _NET80211_IEEE80211_H_
--#define _NET80211_IEEE80211_H_
--
--/*
-- * 802.11 protocol definitions.
-- */
--
--#define	IEEE80211_ADDR_LEN		6		/* size of 802.11 address */
--/* is 802.11 address multicast/broadcast? */
--#define	IEEE80211_IS_MULTICAST(_a)	(*(_a) & 0x01)
--
--/* IEEE 802.11 PLCP header */
--struct ieee80211_plcp_hdr {
--	u_int16_t i_sfd;
--	u_int8_t i_signal;
--	u_int8_t i_service;
--	u_int16_t i_length;
--	u_int16_t i_crc;
--} __packed;
--
--#define IEEE80211_PLCP_SFD      0xF3A0
--#define IEEE80211_PLCP_SERVICE  0x00
--
--/*
-- * generic definitions for IEEE 802.11 frames
-- */
--struct ieee80211_frame {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_addr1[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr2[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr3[IEEE80211_ADDR_LEN];
--	u_int8_t i_seq[2];
--	/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
--	/* see below */
--} __packed;
--
--struct ieee80211_qosframe {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_addr1[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr2[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr3[IEEE80211_ADDR_LEN];
--	u_int8_t i_seq[2];
--	u_int8_t i_qos[2];
--	/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
--	/* see below */
--} __packed;
--
--struct ieee80211_qoscntl {
--	u_int8_t i_qos[2];
--};
--
--struct ieee80211_frame_addr4 {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_addr1[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr2[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr3[IEEE80211_ADDR_LEN];
--	u_int8_t i_seq[2];
--	u_int8_t i_addr4[IEEE80211_ADDR_LEN];
--} __packed;
--
--
--struct ieee80211_qosframe_addr4 {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_addr1[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr2[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr3[IEEE80211_ADDR_LEN];
--	u_int8_t i_seq[2];
--	u_int8_t i_addr4[IEEE80211_ADDR_LEN];
--	u_int8_t i_qos[2];
--} __packed;
--
--struct ieee80211_ctlframe_addr2 {
--	u_int8_t i_fc[2];
--	__le16 i_aidordur; /* AID or duration */
--	u_int8_t i_addr1[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr2[IEEE80211_ADDR_LEN];
--} __packed;
--
--#define	IEEE80211_FC0_VERSION_MASK		0x03
--#define	IEEE80211_FC0_VERSION_SHIFT		0
--#define	IEEE80211_FC0_VERSION_0			0x00
--#define	IEEE80211_FC0_TYPE_MASK			0x0c
--#define	IEEE80211_FC0_TYPE_SHIFT		2
--#define	IEEE80211_FC0_TYPE_MGT			0x00
--#define	IEEE80211_FC0_TYPE_CTL			0x04
--#define	IEEE80211_FC0_TYPE_DATA			0x08
--
--#define	IEEE80211_FC0_SUBTYPE_MASK		0xf0
--#define	IEEE80211_FC0_SUBTYPE_SHIFT		4
--/* for TYPE_MGT */
--#define	IEEE80211_FC0_SUBTYPE_ASSOC_REQ		0x00
--#define	IEEE80211_FC0_SUBTYPE_ASSOC_RESP	0x10
--#define	IEEE80211_FC0_SUBTYPE_REASSOC_REQ	0x20
--#define	IEEE80211_FC0_SUBTYPE_REASSOC_RESP	0x30
--#define	IEEE80211_FC0_SUBTYPE_PROBE_REQ		0x40
--#define	IEEE80211_FC0_SUBTYPE_PROBE_RESP	0x50
--#define	IEEE80211_FC0_SUBTYPE_BEACON		0x80
--#define	IEEE80211_FC0_SUBTYPE_ATIM		0x90
--#define	IEEE80211_FC0_SUBTYPE_DISASSOC		0xa0
--#define	IEEE80211_FC0_SUBTYPE_AUTH		0xb0
--#define	IEEE80211_FC0_SUBTYPE_DEAUTH		0xc0
--#define IEEE80211_FC0_SUBTYPE_ACTION		0xd0
--/* for TYPE_CTL */
--#define	IEEE80211_FC0_SUBTYPE_PS_POLL		0xa0
--#define	IEEE80211_FC0_SUBTYPE_RTS		0xb0
--#define	IEEE80211_FC0_SUBTYPE_CTS		0xc0
--#define	IEEE80211_FC0_SUBTYPE_ACK		0xd0
--#define	IEEE80211_FC0_SUBTYPE_CF_END		0xe0
--#define	IEEE80211_FC0_SUBTYPE_CF_END_ACK	0xf0
--/* for TYPE_DATA (bit combination) */
--#define	IEEE80211_FC0_SUBTYPE_DATA		0x00
--#define	IEEE80211_FC0_SUBTYPE_CF_ACK		0x10
--#define	IEEE80211_FC0_SUBTYPE_CF_POLL		0x20
--#define	IEEE80211_FC0_SUBTYPE_CF_ACPL		0x30
--#define	IEEE80211_FC0_SUBTYPE_NODATA		0x40
--#define	IEEE80211_FC0_SUBTYPE_CFACK		0x50
--#define	IEEE80211_FC0_SUBTYPE_CFPOLL		0x60
--#define	IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK	0x70
--#define	IEEE80211_FC0_SUBTYPE_QOS		0x80
--#define	IEEE80211_FC0_SUBTYPE_QOS_NULL		0xc0
--
--#define	IEEE80211_FC1_DIR_MASK			0x03
--#define	IEEE80211_FC1_DIR_NODS			0x00	/* STA->STA */
--#define	IEEE80211_FC1_DIR_TODS			0x01	/* STA->AP  */
--#define	IEEE80211_FC1_DIR_FROMDS		0x02	/* AP ->STA */
--#define	IEEE80211_FC1_DIR_DSTODS		0x03	/* AP ->AP  */
--
--#define	IEEE80211_FC1_MORE_FRAG			0x04
--#define	IEEE80211_FC1_RETRY			0x08
--#define	IEEE80211_FC1_PWR_MGT			0x10
--#define	IEEE80211_FC1_MORE_DATA			0x20
--#define	IEEE80211_FC1_PROT			0x40
--#define	IEEE80211_FC1_ORDER			0x80
--
--#define	IEEE80211_SEQ_FRAG_MASK			0x000f
--#define	IEEE80211_SEQ_FRAG_SHIFT		0
--#define	IEEE80211_SEQ_SEQ_MASK			0xfff0
--#define	IEEE80211_SEQ_SEQ_SHIFT			4
--
--#define	IEEE80211_NWID_LEN			32
--
--#define	IEEE80211_QOS_TXOP			0x00ff
--/* bit 8 is reserved */
--#define	IEEE80211_QOS_ACKPOLICY			0x60
--#define	IEEE80211_QOS_ACKPOLICY_S		5
--#define	IEEE80211_QOS_EOSP			0x10
--#define	IEEE80211_QOS_EOSP_S			4
--#define	IEEE80211_QOS_TID			0x0f
--
--#define IEEE80211_FRM_HAS_BODY(_wh)			\
--	(((_wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) !=	\
--			IEEE80211_FC0_TYPE_CTL)
--
--/*
-- * Country/Region Codes from MS WINNLS.H
-- * Numbering from ISO 3166
-- * XXX belongs elsewhere
-- */
--enum CountryCode {
--	CTRY_ALBANIA              = 8,       /* Albania */
--	CTRY_ALGERIA              = 12,      /* Algeria */
--	CTRY_ARGENTINA            = 32,      /* Argentina */
--	CTRY_ARMENIA              = 51,      /* Armenia */
--	CTRY_AUSTRALIA            = 36,      /* Australia */
--	CTRY_AUSTRIA              = 40,      /* Austria */
--	CTRY_AZERBAIJAN           = 31,      /* Azerbaijan */
--	CTRY_BAHRAIN              = 48,      /* Bahrain */
--	CTRY_BELARUS              = 112,     /* Belarus */
--	CTRY_BELGIUM              = 56,      /* Belgium */
--	CTRY_BELIZE               = 84,      /* Belize */
--	CTRY_BOLIVIA              = 68,      /* Bolivia */
--	CTRY_BRAZIL               = 76,      /* Brazil */
--	CTRY_BRUNEI_DARUSSALAM    = 96,      /* Brunei Darussalam */
--	CTRY_BULGARIA             = 100,     /* Bulgaria */
--	CTRY_CANADA               = 124,     /* Canada */
--	CTRY_CHILE                = 152,     /* Chile */
--	CTRY_CHINA                = 156,     /* People's Republic of China */
--	CTRY_COLOMBIA             = 170,     /* Colombia */
--	CTRY_COSTA_RICA           = 188,     /* Costa Rica */
--	CTRY_CROATIA              = 191,     /* Croatia */
--	CTRY_CYPRUS               = 196,
--	CTRY_CZECH                = 203,     /* Czech Republic */
--	CTRY_DENMARK              = 208,     /* Denmark */
--	CTRY_DOMINICAN_REPUBLIC   = 214,     /* Dominican Republic */
--	CTRY_ECUADOR              = 218,     /* Ecuador */
--	CTRY_EGYPT                = 818,     /* Egypt */
--	CTRY_EL_SALVADOR          = 222,     /* El Salvador */
--	CTRY_ESTONIA              = 233,     /* Estonia */
--	CTRY_FAEROE_ISLANDS       = 234,     /* Faeroe Islands */
--	CTRY_FINLAND              = 246,     /* Finland */
--	CTRY_FRANCE               = 250,     /* France */
--	CTRY_FRANCE2              = 255,     /* France2 */
--	CTRY_GEORGIA              = 268,     /* Georgia */
--	CTRY_GERMANY              = 276,     /* Germany */
--	CTRY_GREECE               = 300,     /* Greece */
--	CTRY_GUATEMALA            = 320,     /* Guatemala */
--	CTRY_HONDURAS             = 340,     /* Honduras */
--	CTRY_HONG_KONG            = 344,     /* Hong Kong S.A.R., P.R.C. */
--	CTRY_HUNGARY              = 348,     /* Hungary */
--	CTRY_ICELAND              = 352,     /* Iceland */
--	CTRY_INDIA                = 356,     /* India */
--	CTRY_INDONESIA            = 360,     /* Indonesia */
--	CTRY_IRAN                 = 364,     /* Iran */
--	CTRY_IRAQ                 = 368,     /* Iraq */
--	CTRY_IRELAND              = 372,     /* Ireland */
--	CTRY_ISRAEL               = 376,     /* Israel */
--	CTRY_ITALY                = 380,     /* Italy */
--	CTRY_JAMAICA              = 388,     /* Jamaica */
--	CTRY_JAPAN                = 392,     /* Japan */
--	CTRY_JAPAN1               = 393,     /* Japan (JP1) */
--	CTRY_JAPAN2               = 394,     /* Japan (JP0) */
--	CTRY_JAPAN3               = 395,     /* Japan (JP1-1) */
--	CTRY_JAPAN4               = 396,     /* Japan (JE1) */
--	CTRY_JAPAN5               = 397,     /* Japan (JE2) */
--	CTRY_JAPAN6               = 399,	 /* Japan (JP6) */
--	CTRY_JAPAN7               = 900,	 /* Japan */
--	CTRY_JAPAN8               = 901,	 /* Japan */
--	CTRY_JAPAN9               = 902,	 /* Japan */
--	CTRY_JAPAN10	      = 903,	 /* Japan */
--	CTRY_JAPAN11	      = 904,	 /* Japan */
--	CTRY_JAPAN12	      = 905,	 /* Japan */
--	CTRY_JAPAN13	      = 906,	 /* Japan */
--	CTRY_JAPAN14	      = 907,	 /* Japan */
--	CTRY_JAPAN15	      = 908,	 /* Japan */
--	CTRY_JAPAN16	      = 909,	 /* Japan */
--	CTRY_JAPAN17	      = 910,	 /* Japan */
--	CTRY_JAPAN18	      = 911,	 /* Japan */
--	CTRY_JAPAN19	      = 912,	 /* Japan */
--	CTRY_JAPAN20	      = 913,	 /* Japan */
--	CTRY_JAPAN21	      = 914,	 /* Japan */
--	CTRY_JAPAN22	      = 915,	 /* Japan */
--	CTRY_JAPAN23	      = 916,	 /* Japan */
--	CTRY_JAPAN24	      = 917,	 /* Japan */
--	CTRY_JAPAN25	      = 918,	 /* Japan */
--	CTRY_JAPAN26	      = 919,	 /* Japan */
--	CTRY_JAPAN27	      = 920,	 /* Japan */
--	CTRY_JAPAN28	      = 921,	 /* Japan */
--	CTRY_JAPAN29	      = 922,	 /* Japan */
--	CTRY_JAPAN30	      = 923,	 /* Japan */
--	CTRY_JAPAN31	      = 924,	 /* Japan */
--	CTRY_JAPAN32	      = 925,	 /* Japan */
--	CTRY_JAPAN33	      = 926,	 /* Japan */
--	CTRY_JAPAN34	      = 927,	 /* Japan */
--	CTRY_JAPAN35	      = 928,	 /* Japan */
--	CTRY_JAPAN36	      = 929,	 /* Japan */
--	CTRY_JAPAN37	      = 930,	 /* Japan */
--	CTRY_JAPAN38	      = 931,	 /* Japan */
--	CTRY_JAPAN39	      = 932,	 /* Japan */
--	CTRY_JAPAN40	      = 933,	 /* Japan */
--	CTRY_JAPAN41	      = 934,	 /* Japan */
--	CTRY_JAPAN42	      = 935,	 /* Japan */
--	CTRY_JAPAN43	      = 936,	 /* Japan */
--	CTRY_JAPAN44	      = 937,	 /* Japan */
--	CTRY_JAPAN45	      = 938,	 /* Japan */
--	CTRY_JAPAN46	      = 939,	 /* Japan */
--	CTRY_JAPAN47	      = 940,	 /* Japan */
--	CTRY_JAPAN48	      = 941,	 /* Japan */
--	CTRY_JORDAN               = 400,     /* Jordan */
--	CTRY_KAZAKHSTAN           = 398,     /* Kazakhstan */
--	CTRY_KENYA                = 404,     /* Kenya */
--	CTRY_KOREA_NORTH          = 408,     /* North Korea */
--	CTRY_KOREA_ROC            = 410,     /* South Korea */
--	CTRY_KOREA_ROC2           = 411,     /* South Korea */
--	CTRY_KUWAIT               = 414,     /* Kuwait */
--	CTRY_LATVIA               = 428,     /* Latvia */
--	CTRY_LEBANON              = 422,     /* Lebanon */
--	CTRY_LIBYA                = 434,     /* Libya */
--	CTRY_LIECHTENSTEIN        = 438,     /* Liechtenstein */
--	CTRY_LITHUANIA            = 440,     /* Lithuania */
--	CTRY_LUXEMBOURG           = 442,     /* Luxembourg */
--	CTRY_MACAU                = 446,     /* Macau */
--	CTRY_MACEDONIA            = 807,     /* the Former Yugoslav Republic of Macedonia */
--	CTRY_MALAYSIA             = 458,     /* Malaysia */
--	CTRY_MEXICO               = 484,     /* Mexico */
--	CTRY_MONACO               = 492,     /* Principality of Monaco */
--	CTRY_MOROCCO              = 504,     /* Morocco */
--	CTRY_NETHERLANDS          = 528,     /* Netherlands */
--	CTRY_NEW_ZEALAND          = 554,     /* New Zealand */
--	CTRY_NICARAGUA            = 558,     /* Nicaragua */
--	CTRY_NORWAY               = 578,     /* Norway */
--	CTRY_OMAN                 = 512,     /* Oman */
--	CTRY_PAKISTAN             = 586,     /* Islamic Republic of Pakistan */
--	CTRY_PANAMA               = 591,     /* Panama */
--	CTRY_PARAGUAY             = 600,     /* Paraguay */
--	CTRY_PERU                 = 604,     /* Peru */
--	CTRY_PHILIPPINES          = 608,     /* Republic of the Philippines */
--	CTRY_POLAND               = 616,     /* Poland */
--	CTRY_PORTUGAL             = 620,     /* Portugal */
--	CTRY_PUERTO_RICO          = 630,     /* Puerto Rico */
--	CTRY_QATAR                = 634,     /* Qatar */
--	CTRY_ROMANIA              = 642,     /* Romania */
--	CTRY_RUSSIA               = 643,     /* Russia */
--	CTRY_SAUDI_ARABIA         = 682,     /* Saudi Arabia */
--	CTRY_SINGAPORE            = 702,     /* Singapore */
--	CTRY_SLOVAKIA             = 703,     /* Slovak Republic */
--	CTRY_SLOVENIA             = 705,     /* Slovenia */
--	CTRY_SOUTH_AFRICA         = 710,     /* South Africa */
--	CTRY_SPAIN                = 724,     /* Spain */
--	CTRY_SWEDEN               = 752,     /* Sweden */
--	CTRY_SWITZERLAND          = 756,     /* Switzerland */
--	CTRY_SYRIA                = 760,     /* Syria */
--	CTRY_TAIWAN               = 158,     /* Taiwan */
--	CTRY_THAILAND             = 764,     /* Thailand */
--	CTRY_TRINIDAD_Y_TOBAGO    = 780,     /* Trinidad y Tobago */
--	CTRY_TUNISIA              = 788,     /* Tunisia */
--	CTRY_TURKEY               = 792,     /* Turkey */
--	CTRY_UAE                  = 784,     /* U.A.E. */
--	CTRY_UKRAINE              = 804,     /* Ukraine */
--	CTRY_UNITED_KINGDOM       = 826,     /* United Kingdom */
--	CTRY_UNITED_STATES        = 840,     /* United States */
--	CTRY_UNITED_STATES_FCC49  = 842,     /* United States (Public Safety)*/
--	CTRY_URUGUAY              = 858,     /* Uruguay */
--	CTRY_UZBEKISTAN           = 860,     /* Uzbekistan */
--	CTRY_VENEZUELA            = 862,     /* Venezuela */
--	CTRY_VIET_NAM             = 704,     /* Viet Nam */
--	CTRY_YEMEN                = 887,     /* Yemen */
--	CTRY_ZIMBABWE             = 716      /* Zimbabwe */
--};
--
--/* 
-- * Generic information element
-- */
--struct ieee80211_ie {
--	u_int8_t id;
--	u_int8_t len;
--	u_int8_t info[0];
--} __packed;
--
--/* 
-- * Country information element.
-- */
--#define IEEE80211_COUNTRY_MAX_TRIPLETS (83)
--struct ieee80211_ie_country {
--	u_int8_t country_id;
--	u_int8_t country_len;
--	u_int8_t country_str[3];
--	u_int8_t country_triplet[IEEE80211_COUNTRY_MAX_TRIPLETS * 3];
--} __packed;
--
--/*
-- * Power Constraint information element.
-- */
--struct ieee80211_ie_pwrcnstr {
--	u_int8_t pc_id;			/* IEEE80211_ELEMID_PWRCNSTR */
--	u_int8_t pc_len;		/* == 2 */
--	u_int8_t pc_lpc;		/* Local Power Constraint [dB] */
--} __packed;
--
--/*
-- * Power Capability information element.
-- */
--struct ieee80211_ie_pwrcap {
--	u_int8_t pc_id;			/* IEEE80211_ELEMID_PWRCAP */
--	u_int8_t pc_len;		/* == 2 */
--	int8_t pc_mintxpow;		/* Minimum Transmit Power Capability [dBm] */
--	int8_t pc_maxtxpow;		/* Maximum Transmit Power Capability [dBm] */
--} __packed;
--
--/*
-- * Supported Channels information element.
-- */
--#define IEEE80211_SUPPCHAN_MAX_PAIRS (127)
--struct ieee80211_ie_sc {
--	u_int8_t sc_id;			/* IEEE80211_ELEMID_SUPPCHAN */
--	u_int8_t sc_len;		/* == 2 * number of sc_subband elements */
--	struct {
--		u_int8_t sc_first;	/* First Channel Number */
--		u_int8_t sc_number;	/* Number of Channels */
--	} __packed sc_subband[IEEE80211_SUPPCHAN_MAX_PAIRS];
--} __packed;
--
--/*
-- * Channel Switch Announcement information element.
-- */
--struct ieee80211_ie_csa {
--	u_int8_t csa_id;	/* IEEE80211_ELEMID_CHANSWITCHANN */
--	u_int8_t csa_len;	/* == 3 */
--	u_int8_t csa_mode;	/* Channel Switch Mode: 1 == stop transmission until CS */
--	u_int8_t csa_chan;	/* New Channel Number */
--	u_int8_t csa_count;	/* TBTTs until Channel Switch happens */
--} __packed;
--
--/* minimal Channel Switch Count in the initial announcement */
--#define IEEE80211_CSA_PROTECTION_PERIOD 3
--
--/* maximum allowed deviance of measurement of intervals between CSA in Beacons */
--#define IEEE80211_CSA_SANITY_THRESHOLD 100
--
--
--/* does frame have QoS sequence control data */
--#define	IEEE80211_QOS_HAS_SEQ(wh) \
--	(((wh)->i_fc[0] & \
--	  (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == \
--	  (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS))
--
--#define WME_QOSINFO_COUNT	0x0f  /* Mask for Param Set Count field */
--/*
-- * WME/802.11e information element.
-- */
--struct ieee80211_ie_wme {
--	u_int8_t wme_id;		/* IEEE80211_ELEMID_VENDOR */
--	u_int8_t wme_len;	/* length in bytes */
--	u_int8_t wme_oui[3];	/* 0x00, 0x50, 0xf2 */
--	u_int8_t wme_type;	/* OUI type */
--	u_int8_t wme_subtype;	/* OUI subtype */
--	u_int8_t wme_version;	/* spec revision */
--	u_int8_t wme_info;	/* QoS info */
--} __packed;
--
--/*
-- * WME/802.11e Tspec Element
-- */
--struct ieee80211_wme_tspec {
--	u_int8_t ts_id;
--	u_int8_t ts_len;
--	u_int8_t ts_oui[3];
--	u_int8_t ts_oui_type;
--	u_int8_t ts_oui_subtype;
--	u_int8_t ts_version;
--	u_int8_t ts_tsinfo[3];
--	u_int8_t ts_nom_msdu[2];
--	u_int8_t ts_max_msdu[2];
--	u_int8_t ts_min_svc[4];
--	u_int8_t ts_max_svc[4];
--	u_int8_t ts_inactv_intv[4];
--	u_int8_t ts_susp_intv[4];
--	u_int8_t ts_start_svc[4];
--	u_int8_t ts_min_rate[4];
--	u_int8_t ts_mean_rate[4];
--	u_int8_t ts_max_burst[4];
--	u_int8_t ts_min_phy[4];
--	u_int8_t ts_peak_rate[4];
--	u_int8_t ts_delay[4];
--	u_int8_t ts_surplus[2];
--	u_int8_t ts_medium_time[2];
--} __packed;
--
--/*
-- * WME AC parameter field
-- */
--
--struct ieee80211_wme_acparams {
--	u_int8_t acp_aci_aifsn;
--	u_int8_t acp_logcwminmax;
--	u_int16_t acp_txop;
--} __packed;
--
--#define IEEE80211_WME_PARAM_LEN 24
--#define WME_NUM_AC		4	/* 4 AC categories */
--
--#define WME_PARAM_ACI		0x60	/* Mask for ACI field */
--#define WME_PARAM_ACI_S		5	/* Shift for ACI field */
--#define WME_PARAM_ACM		0x10	/* Mask for ACM bit */
--#define WME_PARAM_ACM_S		4	/* Shift for ACM bit */
--#define WME_PARAM_AIFSN		0x0f	/* Mask for aifsn field */
--#define WME_PARAM_AIFSN_S	0	/* Shift for aifsn field */
--#define WME_PARAM_LOGCWMIN	0x0f	/* Mask for CwMin field (in log) */
--#define WME_PARAM_LOGCWMIN_S	0	/* Shift for CwMin field */
--#define WME_PARAM_LOGCWMAX	0xf0	/* Mask for CwMax field (in log) */
--#define WME_PARAM_LOGCWMAX_S	4	/* Shift for CwMax field */
--
--#define WME_AC_TO_TID(_ac) (       \
--	((_ac) == WME_AC_VO) ? 6 : \
--	((_ac) == WME_AC_VI) ? 5 : \
--	((_ac) == WME_AC_BK) ? 1 : \
--	0)
--
--#define TID_TO_WME_AC(_tid) (      \
--	((_tid) < 1) ? WME_AC_BE : \
--	((_tid) < 3) ? WME_AC_BK : \
--	((_tid) < 6) ? WME_AC_VI : \
--	WME_AC_VO)
--
--/*
-- * WME Parameter Element
-- */
--
--struct ieee80211_wme_param {
--	u_int8_t param_id;
--	u_int8_t param_len;
--	u_int8_t param_oui[3];
--	u_int8_t param_oui_type;
--	u_int8_t param_oui_sybtype;
--	u_int8_t param_version;
--	u_int8_t param_qosInfo;
--	u_int8_t param_reserved;
--	struct ieee80211_wme_acparams	params_acParams[WME_NUM_AC];
--} __packed;
--
--/*
-- * WME U-APSD qos info field defines
-- */
--#define WME_CAPINFO_UAPSD_EN			0x00000080
--#define WME_CAPINFO_UAPSD_VO			0x00000001
--#define WME_CAPINFO_UAPSD_VI			0x00000002
--#define WME_CAPINFO_UAPSD_BK			0x00000004
--#define WME_CAPINFO_UAPSD_BE			0x00000008
--#define WME_CAPINFO_UAPSD_ACFLAGS_SHIFT		0
--#define WME_CAPINFO_UAPSD_ACFLAGS_MASK		0xF
--#define WME_CAPINFO_UAPSD_MAXSP_SHIFT		5
--#define WME_CAPINFO_UAPSD_MAXSP_MASK		0x3
--#define WME_CAPINFO_IE_OFFSET			8
--#define WME_UAPSD_MAXSP(_qosinfo)					\
--		(((_qosinfo) >> WME_CAPINFO_UAPSD_MAXSP_SHIFT) & 	\
--		 WME_CAPINFO_UAPSD_MAXSP_MASK)
--#define WME_UAPSD_AC_ENABLED(_ac, _qosinfo)				\
--		((1 << (3 - (_ac))) & (					\
--		 ((_qosinfo) >> WME_CAPINFO_UAPSD_ACFLAGS_SHIFT) &	\
--		 WME_CAPINFO_UAPSD_ACFLAGS_MASK))
--
--/*
-- * Atheros Advanced Capability information element.
-- */
--struct ieee80211_ie_athAdvCap {
--	u_int8_t athAdvCap_id;		/* IEEE80211_ELEMID_VENDOR */
--	u_int8_t athAdvCap_len;		/* length in bytes */
--	u_int8_t athAdvCap_oui[3];	/* 0x00, 0x03, 0x7f */
--	u_int8_t athAdvCap_type;	/* OUI type */
--	u_int8_t athAdvCap_subtype;	/* OUI subtype */
--	u_int8_t athAdvCap_version;	/* spec revision */
--	u_int8_t athAdvCap_capability;	/* Capability info */
--	u_int16_t athAdvCap_defKeyIndex;
--} __packed;
--
--/*
-- * Atheros XR information element.
-- */
--struct ieee80211_xr_param {
--	u_int8_t param_id;
--	u_int8_t param_len;
--	u_int8_t param_oui[3];
--	u_int8_t param_oui_type;
--	u_int8_t param_oui_sybtype;
--	u_int8_t param_version;
--	u_int8_t param_Info;
--	u_int8_t param_base_bssid[IEEE80211_ADDR_LEN];
--	u_int8_t param_xr_bssid[IEEE80211_ADDR_LEN];
--	u_int16_t param_xr_beacon_interval;
--	u_int8_t param_base_ath_capability;
--	u_int8_t param_xr_ath_capability;
--} __packed;
--
--/* Atheros capabilities */
--#define IEEE80211_ATHC_TURBOP	0x0001		/* Turbo Prime */
--#define IEEE80211_ATHC_COMP	0x0002		/* Compression */
--#define IEEE80211_ATHC_FF	0x0004		/* Fast Frames */
--#define IEEE80211_ATHC_XR	0x0008		/* Xtended Range support */
--#define IEEE80211_ATHC_AR	0x0010		/* Advanced Radar support */
--#define IEEE80211_ATHC_BURST	0x0020		/* Bursting - not negotiated */
--#define IEEE80211_ATHC_WME	0x0040		/* CWMin tuning */
--#define IEEE80211_ATHC_BOOST	0x0080		/* Boost */
--
--/*
-- * Management Notification Frame
-- */
--struct ieee80211_mnf {
--	u_int8_t mnf_category;
--	u_int8_t mnf_action;
--	u_int8_t mnf_dialog;
--	u_int8_t mnf_status;
--} __packed;
--#define	MNF_SETUP_REQ	0
--#define	MNF_SETUP_RESP	1
--#define	MNF_TEARDOWN	2
--
--/*
-- * Control frames.
-- */
--struct ieee80211_frame_min {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_addr1[IEEE80211_ADDR_LEN];
--	u_int8_t i_addr2[IEEE80211_ADDR_LEN];
--	/* FCS */
--} __packed;
--
--struct ieee80211_frame_rts {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_ra[IEEE80211_ADDR_LEN];
--	u_int8_t i_ta[IEEE80211_ADDR_LEN];
--	/* FCS */
--} __packed;
--
--struct ieee80211_frame_cts {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_ra[IEEE80211_ADDR_LEN];
--	/* FCS */
--} __packed;
--
--struct ieee80211_frame_ack {
--	u_int8_t i_fc[2];
--	__le16 i_dur;
--	u_int8_t i_ra[IEEE80211_ADDR_LEN];
--	/* FCS */
--} __packed;
--
--struct ieee80211_frame_pspoll {
--	u_int8_t i_fc[2];
--	u_int8_t i_aid[2];
--	u_int8_t i_bssid[IEEE80211_ADDR_LEN];
--	u_int8_t i_ta[IEEE80211_ADDR_LEN];
--	/* FCS */
--} __packed;
--
--struct ieee80211_frame_cfend {		/* NB: also CF-End+CF-Ack */
--	u_int8_t i_fc[2];
--	__le16 i_dur;	/* should be zero */
--	u_int8_t i_ra[IEEE80211_ADDR_LEN];
--	u_int8_t i_bssid[IEEE80211_ADDR_LEN];
--	/* FCS */
--} __packed;
--
--/*
-- * BEACON management packets
-- *
-- *	octet timestamp[8]
-- *	octet beacon interval[2]
-- *	octet capability information[2]
-- *	information element
-- *		octet elemid
-- *		octet length
-- *		octet information[length]
-- */
--
--typedef u_int8_t *ieee80211_mgt_beacon_t;
--
--#define	IEEE80211_BEACON_INTERVAL(beacon) \
--	((beacon)[8] | ((beacon)[9] << 8))
--#define	IEEE80211_BEACON_CAPABILITY(beacon) \
--	((beacon)[10] | ((beacon)[11] << 8))
--
--#define	IEEE80211_CAPINFO_ESS			0x0001
--#define	IEEE80211_CAPINFO_IBSS			0x0002
--#define	IEEE80211_CAPINFO_CF_POLLABLE		0x0004
--#define	IEEE80211_CAPINFO_CF_POLLREQ		0x0008
--#define	IEEE80211_CAPINFO_PRIVACY		0x0010
--#define	IEEE80211_CAPINFO_SHORT_PREAMBLE	0x0020
--#define	IEEE80211_CAPINFO_PBCC			0x0040
--#define	IEEE80211_CAPINFO_CHNL_AGILITY		0x0080
--/* bits 8-9 are reserved (8 now for spectrum management) */
--#define IEEE80211_CAPINFO_SPECTRUM_MGMT		0x0100
--#define	IEEE80211_CAPINFO_SHORT_SLOTTIME	0x0400
--#define	IEEE80211_CAPINFO_RSN			0x0800
--/* bit 12 is reserved */
--#define	IEEE80211_CAPINFO_DSSSOFDM		0x2000
--/* bits 14-15 are reserved */
--
--/*
-- * 802.11i/WPA information element (maximally sized).
-- */
--struct ieee80211_ie_wpa {
--	u_int8_t wpa_id;			/* IEEE80211_ELEMID_VENDOR */
--	u_int8_t wpa_len;		/* length in bytes */
--	u_int8_t wpa_oui[3];		/* 0x00, 0x50, 0xf2 */
--	u_int8_t wpa_type;		/* OUI type */
--	u_int16_t wpa_version;		/* spec revision */
--	u_int32_t wpa_mcipher[1];	/* multicast/group key cipher */
--	u_int16_t wpa_uciphercnt;	/* # pairwise key ciphers */
--	u_int32_t wpa_uciphers[8];	/* ciphers */
--	u_int16_t wpa_authselcnt;	/* authentication selector cnt*/
--	u_int32_t wpa_authsels[8];	/* selectors */
--	u_int16_t wpa_caps;		/* 802.11i capabilities */
--	u_int16_t wpa_pmkidcnt;		/* 802.11i pmkid count */
--	u_int16_t wpa_pmkids[8];	/* 802.11i pmkids */
--} __packed;
--
--/*
-- * Management information element payloads.
-- */
--
--enum {
--	IEEE80211_ELEMID_SSID		= 0,
--	IEEE80211_ELEMID_RATES		= 1,
--	IEEE80211_ELEMID_FHPARMS	= 2,
--	IEEE80211_ELEMID_DSPARMS	= 3,
--	IEEE80211_ELEMID_CFPARMS	= 4,
--	IEEE80211_ELEMID_TIM		= 5,
--	IEEE80211_ELEMID_IBSSPARMS	= 6,
--	IEEE80211_ELEMID_COUNTRY	= 7,
--	IEEE80211_ELEMID_HOPPATRNPARMS  = 8,
--	IEEE80211_ELEMID_HOPPATRNTABLE  = 9,
--	IEEE80211_ELEMID_REQINFO	= 10,
--	IEEE80211_ELEMID_QBSSLOAD       = 11,
--	IEEE80211_ELEMID_EDCAPARAM      = 12,
--	IEEE80211_ELEMID_TSPEC		= 13,
--	IEEE80211_ELEMID_TRAFCLASS      = 14,
--	IEEE80211_ELEMID_SCHEDULE       = 15,
--	IEEE80211_ELEMID_CHALLENGE	= 16,
--	/* 17-31 reserved for challenge text extension */
--	IEEE80211_ELEMID_PWRCNSTR	= 32,
--	IEEE80211_ELEMID_PWRCAP		= 33,
--	IEEE80211_ELEMID_TPCREQ		= 34,
--	IEEE80211_ELEMID_TPCREP		= 35,
--	IEEE80211_ELEMID_SUPPCHAN	= 36,
--	IEEE80211_ELEMID_CHANSWITCHANN	= 37,
--	IEEE80211_ELEMID_MEASREQ	= 38,
--	IEEE80211_ELEMID_MEASREP	= 39,
--	IEEE80211_ELEMID_QUIET		= 40,
--	IEEE80211_ELEMID_IBSSDFS	= 41,
--	IEEE80211_ELEMID_ERP		= 42,
--	IEEE80211_ELEMID_TSDELAY	= 43,
--	IEEE80211_ELEMID_TCLASSPROC     = 44,
--	IEEE80211_ELEMID_QOS		= 46,
--	IEEE80211_ELEMID_RSN		= 48,
--	/* 49 reserved */
--	IEEE80211_ELEMID_XRATES		= 50,
--	/* 128-129 proprietary elements used by Agere chipsets */
--	IEEE80211_ELEMID_AGERE1		= 128,
--	IEEE80211_ELEMID_AGERE2		= 129,
--	IEEE80211_ELEMID_TPC		= 150,
--	IEEE80211_ELEMID_CCKM		= 156,
--	IEEE80211_ELEMID_VENDOR		= 221,	/* vendor private */
--};
--
--#define IEEE80211_CHANSWITCHANN_BYTES 	5
--#define BITCTL_BUFD_MCAST       	1
--#define BITCTL_BUFD_UCAST_AID_MASK 	((u_int8_t)~(BITCTL_BUFD_MCAST))
--#define BITCTL_BUFD_UCAST_AID_SHIFT 	1
--
--struct ieee80211_tim_ie {
--	u_int8_t	tim_ie;			/* IEEE80211_ELEMID_TIM */
--	u_int8_t	tim_len;
--	u_int8_t	tim_count;		/* DTIM count */
--	u_int8_t	tim_period;		/* DTIM period */
--	u_int8_t	tim_bitctl;		/* bitmap control */
--	u_int8_t	tim_bitmap[1];		/* variable-length bitmap */
--} __packed;
--
--struct ieee80211_country_ie {
--	u_int8_t	ie;			/* IEEE80211_ELEMID_COUNTRY */
--	u_int8_t	len;
--	u_int8_t	cc[3];			/* ISO CC+(I)ndoor/(O)utdoor */
--	struct {
--		u_int8_t schan;			/* starting channel */
--		u_int8_t nchan;			/* number channels */
--		u_int8_t maxtxpwr;		/* tx power cap */
--	} __packed band[4];			/* up to 4 sub bands */
--} __packed;
--
--#define IEEE80211_CHALLENGE_LEN		128
--
--#define IEEE80211_SUPPCHAN_LEN		26
--
--#define	IEEE80211_RATE_BASIC		0x80
--#define	IEEE80211_RATE_VAL		0x7f
--
--/* EPR information element flags */
--#define	IEEE80211_ERP_NON_ERP_PRESENT	0x01
--#define	IEEE80211_ERP_USE_PROTECTION	0x02
--#define	IEEE80211_ERP_LONG_PREAMBLE	0x04
--
--/* Atheros private advanced capabilities info */
--#define	ATHEROS_CAP_TURBO_PRIME		0x01
--#define	ATHEROS_CAP_COMPRESSION		0x02
--#define	ATHEROS_CAP_FAST_FRAME		0x04
--/* bits 3-6 reserved */
--#define	ATHEROS_CAP_BOOST		0x80
--
--#define	ATH_OUI			0x7f0300		/* Atheros OUI */
--#define	ATH_OUI_TYPE		0x01
--#define	ATH_OUI_SUBTYPE		0x01
--#define	ATH_OUI_VERSION		0x00
--#define	ATH_OUI_TYPE_XR		0x03
--#define	ATH_OUI_SUBTYPE_XR	0x01
--#define	ATH_OUI_VER_XR		0x00
--
--#define	WPA_OUI			0xf25000
--#define	WPA_OUI_TYPE		0x01
--#define	WPA_VERSION		1		/* current supported version */
--
--#define	WPA_CSE_NULL		0x00
--#define	WPA_CSE_WEP40		0x01
--#define	WPA_CSE_TKIP		0x02
--#define	WPA_CSE_CCMP		0x04
--#define	WPA_CSE_WEP104		0x05
--
--#define	WPA_ASE_NONE		0x00
--#define	WPA_ASE_8021X_UNSPEC	0x01
--#define	WPA_ASE_8021X_PSK	0x02
--
--#define	RSN_OUI			0xac0f00
--#define	RSN_VERSION		1		/* current supported version */
--
--#define	RSN_CSE_NULL		0x00
--#define	RSN_CSE_WEP40		0x01
--#define	RSN_CSE_TKIP		0x02
--#define	RSN_CSE_WRAP		0x03
--#define	RSN_CSE_CCMP		0x04
--#define	RSN_CSE_WEP104		0x05
--
--#define	RSN_ASE_NONE		0x00
--#define	RSN_ASE_8021X_UNSPEC	0x01
--#define	RSN_ASE_8021X_PSK	0x02
--
--#define	RSN_CAP_PREAUTH		0x01
--
--#define	WME_OUI			0xf25000
--#define	WME_OUI_TYPE		0x02
--#define	WME_INFO_OUI_SUBTYPE	0x00
--#define	WME_PARAM_OUI_SUBTYPE	0x01
--#define	WME_VERSION		1
--
--/* WME stream classes */
--#define	WME_AC_BE	0		/* best effort */
--#define	WME_AC_BK	1		/* background */
--#define	WME_AC_VI	2		/* video */
--#define	WME_AC_VO	3		/* voice */
--
--/*
-- * AUTH management packets
-- *
-- *	octet algo[2]
-- *	octet seq[2]
-- *	octet status[2]
-- *	octet chal.id
-- *	octet chal.length
-- *	octet chal.text[253]
-- */
--
--typedef u_int8_t *ieee80211_mgt_auth_t;
--
--#define	IEEE80211_AUTH_ALGORITHM(auth) \
--	((auth)[0] | ((auth)[1] << 8))
--#define	IEEE80211_AUTH_TRANSACTION(auth) \
--	((auth)[2] | ((auth)[3] << 8))
--#define	IEEE80211_AUTH_STATUS(auth) \
--	((auth)[4] | ((auth)[5] << 8))
--
--#define	IEEE80211_AUTH_ALG_OPEN		0x0000
--#define	IEEE80211_AUTH_ALG_SHARED	0x0001
--#define	IEEE80211_AUTH_ALG_LEAP		0x0080
--
--enum {
--	IEEE80211_AUTH_OPEN_REQUEST		= 1,
--	IEEE80211_AUTH_OPEN_RESPONSE		= 2,
--};
--
--enum {
--	IEEE80211_AUTH_SHARED_REQUEST		= 1,
--	IEEE80211_AUTH_SHARED_CHALLENGE		= 2,
--	IEEE80211_AUTH_SHARED_RESPONSE		= 3,
--	IEEE80211_AUTH_SHARED_PASS		= 4,
--};
--
--/*
-- * Reason codes
-- *
-- * Unlisted codes are reserved
-- */
--
--enum {
--	IEEE80211_REASON_UNSPECIFIED		= 1,
--	IEEE80211_REASON_AUTH_EXPIRE		= 2,
--	IEEE80211_REASON_AUTH_LEAVE		= 3,
--	IEEE80211_REASON_ASSOC_EXPIRE		= 4,
--	IEEE80211_REASON_ASSOC_TOOMANY		= 5,
--	IEEE80211_REASON_NOT_AUTHED		= 6,
--	IEEE80211_REASON_NOT_ASSOCED		= 7,
--	IEEE80211_REASON_ASSOC_LEAVE		= 8,
--	IEEE80211_REASON_ASSOC_NOT_AUTHED	= 9,
--
--	IEEE80211_REASON_PWRCAP_UNACCEPTABLE	= 10,
--	IEEE80211_REASON_SUPPCHAN_UNACCEPTABLE	= 11,
--	IEEE80211_REASON_RSN_REQUIRED		= 11,
--	IEEE80211_REASON_RSN_INCONSISTENT	= 12,
--	IEEE80211_REASON_IE_INVALID		= 13,
--	IEEE80211_REASON_MIC_FAILURE		= 14,
--
--	IEEE80211_STATUS_SUCCESS		= 0,
--	IEEE80211_STATUS_UNSPECIFIED		= 1,
--	IEEE80211_STATUS_CAPINFO		= 10,
--	IEEE80211_STATUS_NOT_ASSOCED		= 11,
--	IEEE80211_STATUS_OTHER			= 12,
--	IEEE80211_STATUS_ALG			= 13,
--	IEEE80211_STATUS_SEQUENCE		= 14,
--	IEEE80211_STATUS_CHALLENGE		= 15,
--	IEEE80211_STATUS_TIMEOUT		= 16,
--	IEEE80211_STATUS_TOOMANY		= 17,
--	IEEE80211_STATUS_BASIC_RATE		= 18,
--	IEEE80211_STATUS_SP_REQUIRED		= 19,
--	IEEE80211_STATUS_PBCC_REQUIRED		= 20,
--	IEEE80211_STATUS_CA_REQUIRED		= 21,
--	IEEE80211_STATUS_SM_REQUIRED		= 22,
--	IEEE80211_STATUS_PWRCAP_UNACCEPTABLE	= 23,
--	IEEE80211_STATUS_SUPPCHAN_UNACCEPTABLE	= 24,
--	IEEE80211_STATUS_TOO_MANY_STATIONS	= 22,
--	IEEE80211_STATUS_RATES			= 23,
--	IEEE80211_STATUS_SHORTSLOT_REQUIRED	= 25,
--	IEEE80211_STATUS_DSSSOFDM_REQUIRED	= 26,
--};
--
--#define	IEEE80211_WEP_KEYLEN		5	/* 40bit */
--#define	IEEE80211_WEP_IVLEN		3	/* 24bit */
--#define	IEEE80211_WEP_KIDLEN		1	/* 1 octet */
--#define	IEEE80211_WEP_CRCLEN		4	/* CRC-32 */
--#define	IEEE80211_WEP_NKID		4	/* number of key ids */
--
--/*
-- * 802.11i defines an extended IV for use with non-WEP ciphers.
-- * When the EXTIV bit is set in the key id byte an additional
-- * 4 bytes immediately follow the IV for TKIP.  For CCMP the
-- * EXTIV bit is likewise set but the 8 bytes represent the
-- * CCMP header rather than IV+extended-IV.
-- */
--#define	IEEE80211_WEP_EXTIV		0x20
--#define	IEEE80211_WEP_EXTIVLEN		4	/* extended IV length */
--#define	IEEE80211_WEP_MICLEN		8	/* trailing MIC */
--
--#define	IEEE80211_CRC_LEN		4
--
--/*
-- * Maximum acceptable MTU is:
-- *	IEEE80211_MAX_LEN - WEP overhead - CRC -
-- *		QoS overhead - RSN/WPA overhead
-- * Min is arbitrarily chosen > IEEE80211_MIN_LEN.  The default
-- * mtu is Ethernet-compatible; it's set by ether_ifattach.
-- */
--#define	IEEE80211_MTU_MAX		2290
--#define	IEEE80211_MTU_MIN		32
--
--#define	IEEE80211_MAX_LEN		(2300 + IEEE80211_CRC_LEN + \
--	(IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
--#define	IEEE80211_ACK_LEN \
--	(sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
--#define	IEEE80211_MIN_LEN \
--	(sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
--
--/*
-- * The 802.11 spec says at most 2007 stations may be
-- * associated at once.  For most APs this is way more
-- * than is feasible so we use a default of 128.  This
-- * number may be overridden by the driver and/or by
-- * user configuration.
-- */
--#define	IEEE80211_AID_MAX		2007
--#define	IEEE80211_AID_DEF		128
--
--#define	IEEE80211_AID(b)	((b) &~ 0xc000)
--
--/* 
-- * RTS frame length parameters.  The default is specified in
-- * the 802.11 spec.  The max may be wrong for jumbo frames.
-- */
--#define	IEEE80211_RTS_DEFAULT		512
--#define	IEEE80211_RTS_MIN		1
--#define	IEEE80211_RTS_MAX		2346
--
--/* 
-- * Regulatory extension identifier for country IE.
-- */
--#define IEEE80211_REG_EXT_ID		201
--
--/*
-- * IEEE 802.11 timer synchronization function (TSF) timestamp length
-- */
--#define IEEE80211_TSF_LEN		8
--
--#endif /* _NET80211_IEEE80211_H_ */
-diff --git a/package/hostapd/madwifi/net80211/ieee80211_crypto.h b/package/hostapd/madwifi/net80211/ieee80211_crypto.h
-deleted file mode 100644
-index b34f359..0000000
---- a/package/hostapd/madwifi/net80211/ieee80211_crypto.h
-+++ /dev/null
-@@ -1,207 +0,0 @@
--/*-
-- * Copyright (c) 2001 Atsushi Onoe
-- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
-- * All rights reserved.
-- *
-- * Redistribution and use in source and binary forms, with or without
-- * modification, are permitted provided that the following conditions
-- * are met:
-- * 1. Redistributions of source code must retain the above copyright
-- *    notice, this list of conditions and the following disclaimer.
-- * 2. Redistributions in binary form must reproduce the above copyright
-- *    notice, this list of conditions and the following disclaimer in the
-- *    documentation and/or other materials provided with the distribution.
-- * 3. The name of the author may not be used to endorse or promote products
-- *    derived from this software without specific prior written permission.
-- *
-- * Alternatively, this software may be distributed under the terms of the
-- * GNU General Public License ("GPL") version 2 as published by the Free
-- * Software Foundation.
-- *
-- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- *
-- * $Id: ieee80211_crypto.h 3068 2007-12-21 17:46:02Z mentor $
-- */
--#ifndef _NET80211_IEEE80211_CRYPTO_H_
--#define _NET80211_IEEE80211_CRYPTO_H_
--
--/*
-- * 802.11 protocol crypto-related definitions.
-- */
--#define	IEEE80211_KEYBUF_SIZE	16
--#define	IEEE80211_MICBUF_SIZE	(8 + 8)		/* space for both TX & RX keys */
--#define IEEE80211_TID_SIZE	17		/* total number of TIDs */
--
--/*
-- * Old WEP-style key.  Deprecated.
-- */
--struct ieee80211_wepkey {
--	u_int wk_len;				/* key length in bytes */
--	u_int8_t wk_key[IEEE80211_KEYBUF_SIZE];
--};
--
--struct ieee80211_cipher;
--
--/*
-- * Crypto key state.  There is sufficient room for all supported
-- * ciphers (see below).  The underlying ciphers are handled
-- * separately through loadable cipher modules that register with
-- * the generic crypto support.  A key has a reference to an instance
-- * of the cipher; any per-key state is hung off wk_private by the
-- * cipher when it is attached.  Ciphers are automatically called
-- * to detach and cleanup any such state when the key is deleted.
-- *
-- * The generic crypto support handles encap/decap of cipher-related
-- * frame contents for both hardware- and software-based implementations.
-- * A key requiring software crypto support is automatically flagged and
-- * the cipher is expected to honor this and do the necessary work.
-- * Ciphers such as TKIP may also support mixed hardware/software
-- * encrypt/decrypt and MIC processing.
-- */
--
--typedef u_int16_t ieee80211_keyix_t;
--
--/* XXX pack better? */
--/* XXX 48-bit rsc/tsc */
--struct ieee80211_key {
--	u_int8_t wk_keylen;		/* key length in bytes */
--	u_int8_t wk_flags;
--#define	IEEE80211_KEY_XMIT	0x01	/* key used for xmit */
--#define	IEEE80211_KEY_RECV	0x02	/* key used for recv */
--#define	IEEE80211_KEY_GROUP	0x04	/* key used for WPA group operation */
--#define	IEEE80211_KEY_SWCRYPT	0x10	/* host-based encrypt/decrypt */
--#define	IEEE80211_KEY_SWMIC	0x20	/* host-based enmic/demic */
--	ieee80211_keyix_t wk_keyix;	/* key index */
--	u_int8_t wk_key[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
--#define	wk_txmic	wk_key+IEEE80211_KEYBUF_SIZE+0	/* XXX can't () right */
--#define	wk_rxmic	wk_key+IEEE80211_KEYBUF_SIZE+8	/* XXX can't () right */
--	u_int64_t wk_keyrsc[IEEE80211_TID_SIZE];	/* key receive sequence counter */
--	u_int64_t wk_keytsc;		/* key transmit sequence counter */
--	const struct ieee80211_cipher *wk_cipher;
--	void *wk_private;		/* private cipher state */
--};
--#define	IEEE80211_KEY_COMMON 		/* common flags passed in by apps */\
--	(IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV | IEEE80211_KEY_GROUP)
--
--/*
-- * NB: these values are ordered carefully; there are lots of
-- * of implications in any reordering.  In particular beware
-- * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY.
-- */
--#define	IEEE80211_CIPHER_WEP		0
--#define	IEEE80211_CIPHER_TKIP		1
--#define	IEEE80211_CIPHER_AES_OCB	2
--#define	IEEE80211_CIPHER_AES_CCM	3
--#define	IEEE80211_CIPHER_CKIP		5
--#define	IEEE80211_CIPHER_NONE		6	/* pseudo value */
--
--#define	IEEE80211_CIPHER_MAX		(IEEE80211_CIPHER_NONE + 1)
--
--#define	IEEE80211_KEYIX_NONE	((ieee80211_keyix_t)-1)
--
--#if defined(__KERNEL__) || defined(_KERNEL)
--
--struct ieee80211com;
--struct ieee80211vap;
--struct ieee80211_node;
--struct sk_buff;
--
--void ieee80211_crypto_attach(struct ieee80211com *);
--void ieee80211_crypto_detach(struct ieee80211com *);
--void ieee80211_crypto_vattach(struct ieee80211vap *);
--void ieee80211_crypto_vdetach(struct ieee80211vap *);
--int ieee80211_crypto_newkey(struct ieee80211vap *, int, int,
--	struct ieee80211_key *);
--int ieee80211_crypto_delkey(struct ieee80211vap *, struct ieee80211_key *,
--	struct ieee80211_node *);
--int ieee80211_crypto_setkey(struct ieee80211vap *, struct ieee80211_key *,
--	const u_int8_t macaddr[IEEE80211_ADDR_LEN], struct ieee80211_node *);
--void ieee80211_crypto_delglobalkeys(struct ieee80211vap *);
--
--/*
-- * Template for a supported cipher.  Ciphers register with the
-- * crypto code and are typically loaded as separate modules
-- * (the null cipher is always present).
-- * XXX may need refcnts
-- */
--struct ieee80211_cipher {
--	const char *ic_name;		/* printable name */
--	u_int ic_cipher;		/* IEEE80211_CIPHER_* */
--	u_int ic_header;		/* size of privacy header (bytes) */
--	u_int ic_trailer;		/* size of privacy trailer (bytes) */
--	u_int ic_miclen;		/* size of mic trailer (bytes) */
--	void *(*ic_attach)(struct ieee80211vap *, struct ieee80211_key *);
--	void (*ic_detach)(struct ieee80211_key *);
--	int (*ic_setkey)(struct ieee80211_key *);
--	int (*ic_encap)(struct ieee80211_key *, struct sk_buff *, u_int8_t);
--	int (*ic_decap)(struct ieee80211_key *, struct sk_buff *, int);
--	int (*ic_enmic)(struct ieee80211_key *, struct sk_buff *, int);
--	int (*ic_demic)(struct ieee80211_key *, struct sk_buff *, int, int);
--};
--extern const struct ieee80211_cipher ieee80211_cipher_none;
--
--void ieee80211_crypto_register(const struct ieee80211_cipher *);
--void ieee80211_crypto_unregister(const struct ieee80211_cipher *);
--int ieee80211_crypto_available(struct ieee80211vap*, u_int);
--
--struct ieee80211_key *ieee80211_crypto_encap(struct ieee80211_node *,
--	struct sk_buff *);
--struct ieee80211_key *ieee80211_crypto_decap(struct ieee80211_node *,
--	struct sk_buff *, int);
--
--/*
-- * Check and remove any MIC.
-- */
--static __inline int
--ieee80211_crypto_demic(struct ieee80211vap *vap, struct ieee80211_key *k,
--	struct sk_buff *skb, int hdrlen, int force)
--{
--	const struct ieee80211_cipher *cip = k->wk_cipher;
--	return (cip->ic_miclen > 0 ? cip->ic_demic(k, skb, hdrlen, force) : 1);
--}
--
--/*
-- * Add any MIC.
-- */
--static __inline int
--ieee80211_crypto_enmic(struct ieee80211vap *vap, struct ieee80211_key *k,
--	struct sk_buff *skb, int force)
--{
--	const struct ieee80211_cipher *cip = k->wk_cipher;
--	return (cip->ic_miclen > 0 ? cip->ic_enmic(k, skb, force) : 1);
--}
--
--/* 
-- * Reset key state to an unused state.  The crypto
-- * key allocation mechanism ensures other state (e.g.
-- * key data) is properly setup before a key is used.
-- */
--static __inline void
--ieee80211_crypto_resetkey(struct ieee80211vap *vap, struct ieee80211_key *k,
--	ieee80211_keyix_t ix)
--{
--	k->wk_cipher = &ieee80211_cipher_none;;
--	k->wk_private = k->wk_cipher->ic_attach(vap, k);
--	k->wk_keyix = ix;
--	k->wk_flags = IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV;
--}
--
--/*
-- * Crypto-related notification methods.
-- */
--void ieee80211_notify_replay_failure(struct ieee80211vap *,
--	const struct ieee80211_frame *, const struct ieee80211_key *,
--	u_int64_t rsc);
--void ieee80211_notify_michael_failure(struct ieee80211vap *,
--	const struct ieee80211_frame *, ieee80211_keyix_t keyix);
--#endif /* defined(__KERNEL__) || defined(_KERNEL) */
--#endif /* _NET80211_IEEE80211_CRYPTO_H_ */
-diff --git a/package/hostapd/madwifi/net80211/ieee80211_ioctl.h b/package/hostapd/madwifi/net80211/ieee80211_ioctl.h
-deleted file mode 100644
-index 204303b..0000000
---- a/package/hostapd/madwifi/net80211/ieee80211_ioctl.h
-+++ /dev/null
-@@ -1,715 +0,0 @@
--/*-
-- * Copyright (c) 2001 Atsushi Onoe
-- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
-- * All rights reserved.
-- *
-- * Redistribution and use in source and binary forms, with or without
-- * modification, are permitted provided that the following conditions
-- * are met:
-- * 1. Redistributions of source code must retain the above copyright
-- *    notice, this list of conditions and the following disclaimer.
-- * 2. Redistributions in binary form must reproduce the above copyright
-- *    notice, this list of conditions and the following disclaimer in the
-- *    documentation and/or other materials provided with the distribution.
-- * 3. The name of the author may not be used to endorse or promote products
-- *    derived from this software without specific prior written permission.
-- *
-- * Alternatively, this software may be distributed under the terms of the
-- * GNU General Public License ("GPL") version 2 as published by the Free
-- * Software Foundation.
-- *
-- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-- *
-- * $Id: ieee80211_ioctl.h 3314 2008-01-30 23:50:16Z mtaylor $
-- */
--#ifndef _NET80211_IEEE80211_IOCTL_H_
--#define _NET80211_IEEE80211_IOCTL_H_
--
--/*
-- * IEEE 802.11 ioctls.
-- */
--#include <net80211/_ieee80211.h>
--#include <net80211/ieee80211.h>
--#include <net80211/ieee80211_crypto.h>
--
--/*
-- * Per/node (station) statistics available when operating as an AP.
-- */
--struct ieee80211_nodestats {
--	u_int32_t ns_rx_data;		/* rx data frames */
--	u_int32_t ns_rx_mgmt;		/* rx management frames */
--	u_int32_t ns_rx_ctrl;		/* rx control frames */
--	u_int32_t ns_rx_ucast;		/* rx unicast frames */
--	u_int32_t ns_rx_mcast;		/* rx multi/broadcast frames */
--	u_int64_t ns_rx_bytes;		/* rx data count (bytes) */
--	u_int64_t ns_rx_beacons;		/* rx beacon frames */
--	u_int32_t ns_rx_proberesp;	/* rx probe response frames */
--
--	u_int32_t ns_rx_dup;		/* rx discard because it's a dup */
--	u_int32_t ns_rx_noprivacy;	/* rx w/ wep but privacy off */
--	u_int32_t ns_rx_wepfail;		/* rx wep processing failed */
--	u_int32_t ns_rx_demicfail;	/* rx demic failed */
--	u_int32_t ns_rx_decap;		/* rx decapsulation failed */
--	u_int32_t ns_rx_defrag;		/* rx defragmentation failed */
--	u_int32_t ns_rx_disassoc;	/* rx disassociation */
--	u_int32_t ns_rx_deauth;		/* rx deauthentication */
--	u_int32_t ns_rx_decryptcrc;	/* rx decrypt failed on crc */
--	u_int32_t ns_rx_unauth;		/* rx on unauthorized port */
--	u_int32_t ns_rx_unencrypted;	/* rx unecrypted w/ privacy */
--
--	u_int32_t ns_tx_data;		/* tx data frames */
--	u_int32_t ns_tx_mgmt;		/* tx management frames */
--	u_int32_t ns_tx_ucast;		/* tx unicast frames */
--	u_int32_t ns_tx_mcast;		/* tx multi/broadcast frames */
--	u_int64_t ns_tx_bytes;		/* tx data count (bytes) */
--	u_int32_t ns_tx_probereq;	/* tx probe request frames */
--	u_int32_t ns_tx_uapsd;		/* tx on uapsd queue */
--
--	u_int32_t ns_tx_novlantag;	/* tx discard due to no tag */
--	u_int32_t ns_tx_vlanmismatch;	/* tx discard due to of bad tag */
--
--	u_int32_t ns_tx_eosplost;	/* uapsd EOSP retried out */
--
--	u_int32_t ns_ps_discard;		/* ps discard due to of age */
--
--	u_int32_t ns_uapsd_triggers;	/* uapsd triggers */
--
--	/* MIB-related state */
--	u_int32_t ns_tx_assoc;		/* [re]associations */
--	u_int32_t ns_tx_assoc_fail;	/* [re]association failures */
--	u_int32_t ns_tx_auth;		/* [re]authentications */
--	u_int32_t ns_tx_auth_fail;	/* [re]authentication failures*/
--	u_int32_t ns_tx_deauth;		/* deauthentications */
--	u_int32_t ns_tx_deauth_code;	/* last deauth reason */
--	u_int32_t ns_tx_disassoc;	/* disassociations */
--	u_int32_t ns_tx_disassoc_code;	/* last disassociation reason */
--	u_int32_t ns_psq_drops;		/* power save queue drops */
--};
--
--/*
-- * Summary statistics.
-- */
--struct ieee80211_stats {
--	u_int32_t is_rx_badversion;	/* rx frame with bad version */
--	u_int32_t is_rx_tooshort;	/* rx frame too short */
--	u_int32_t is_rx_wrongbss;	/* rx from wrong bssid */
--	u_int32_t is_rx_dup;		/* rx discard due to it's a dup */
--	u_int32_t is_rx_wrongdir;	/* rx w/ wrong direction */
--	u_int32_t is_rx_mcastecho;	/* rx discard due to of mcast echo */
--	u_int32_t is_rx_mcastdisabled;	/* rx discard due to of mcast disabled */
--	u_int32_t is_rx_notassoc;	/* rx discard due to sta !assoc */
--	u_int32_t is_rx_noprivacy;	/* rx w/ wep but privacy off */
--	u_int32_t is_rx_unencrypted;	/* rx w/o wep and privacy on */
--	u_int32_t is_rx_wepfail;		/* rx wep processing failed */
--	u_int32_t is_rx_decap;		/* rx decapsulation failed */
--	u_int32_t is_rx_mgtdiscard;	/* rx discard mgt frames */
--	u_int32_t is_rx_ctl;		/* rx discard ctrl frames */
--	u_int32_t is_rx_beacon;		/* rx beacon frames */
--	u_int32_t is_rx_rstoobig;	/* rx rate set truncated */
--	u_int32_t is_rx_elem_missing;	/* rx required element missing*/
--	u_int32_t is_rx_elem_toobig;	/* rx element too big */
--	u_int32_t is_rx_elem_toosmall;	/* rx element too small */
--	u_int32_t is_rx_elem_unknown;	/* rx element unknown */
--	u_int32_t is_rx_badchan;		/* rx frame w/ invalid chan */
--	u_int32_t is_rx_chanmismatch;	/* rx frame chan mismatch */
--	u_int32_t is_rx_nodealloc;	/* rx frame dropped */
--	u_int32_t is_rx_ssidmismatch;	/* rx frame ssid mismatch  */
--	u_int32_t is_rx_auth_unsupported;/* rx w/ unsupported auth alg */
--	u_int32_t is_rx_auth_fail;	/* rx sta auth failure */
--	u_int32_t is_rx_auth_countermeasures;/* rx auth discard due to CM */
--	u_int32_t is_rx_assoc_bss;	/* rx assoc from wrong bssid */
--	u_int32_t is_rx_assoc_notauth;	/* rx assoc w/o auth */
--	u_int32_t is_rx_assoc_capmismatch;/* rx assoc w/ cap mismatch */
--	u_int32_t is_rx_assoc_norate;	/* rx assoc w/ no rate match */
--	u_int32_t is_rx_assoc_badwpaie;	/* rx assoc w/ bad WPA IE */
--	u_int32_t is_rx_assoc_badscie;	/* rx assoc w/ bad SC IE */
--	u_int32_t is_rx_deauth;		/* rx deauthentication */
--	u_int32_t is_rx_disassoc;	/* rx disassociation */
--	u_int32_t is_rx_badsubtype;	/* rx frame w/ unknown subtype*/
--	u_int32_t is_rx_nobuf;		/* rx failed for lack of buf */
--	u_int32_t is_rx_decryptcrc;	/* rx decrypt failed on crc */
--	u_int32_t is_rx_ahdemo_mgt;	/* rx discard ahdemo mgt frame*/
--	u_int32_t is_rx_bad_auth;	/* rx bad auth request */
--	u_int32_t is_rx_unauth;		/* rx on unauthorized port */
--	u_int32_t is_rx_badkeyid;	/* rx w/ incorrect keyid */
--	u_int32_t is_rx_ccmpreplay;	/* rx seq# violation (CCMP) */
--	u_int32_t is_rx_ccmpformat;	/* rx format bad (CCMP) */
--	u_int32_t is_rx_ccmpmic;		/* rx MIC check failed (CCMP) */
--	u_int32_t is_rx_tkipreplay;	/* rx seq# violation (TKIP) */
--	u_int32_t is_rx_tkipformat;	/* rx format bad (TKIP) */
--	u_int32_t is_rx_tkipmic;		/* rx MIC check failed (TKIP) */
--	u_int32_t is_rx_tkipicv;		/* rx ICV check failed (TKIP) */
--	u_int32_t is_rx_badcipher;	/* rx failed due to of key type */
--	u_int32_t is_rx_nocipherctx;	/* rx failed due to key !setup */
--	u_int32_t is_rx_acl;		/* rx discard due to of acl policy */
--	u_int32_t is_rx_ffcnt;		/* rx fast frames */
--	u_int32_t is_rx_badathtnl;   	/* driver key alloc failed */
--	u_int32_t is_tx_nobuf;		/* tx failed for lack of buf */
--	u_int32_t is_tx_nonode;		/* tx failed for no node */
--	u_int32_t is_tx_unknownmgt;	/* tx of unknown mgt frame */
--	u_int32_t is_tx_badcipher;	/* tx failed due to of key type */
--	u_int32_t is_tx_nodefkey;	/* tx failed due to no defkey */
--	u_int32_t is_tx_noheadroom;	/* tx failed due to no space */
--	u_int32_t is_tx_ffokcnt;		/* tx fast frames sent success */
--	u_int32_t is_tx_fferrcnt;	/* tx fast frames sent success */
--	u_int32_t is_scan_active;	/* active scans started */
--	u_int32_t is_scan_passive;	/* passive scans started */
--	u_int32_t is_node_timeout;	/* nodes timed out inactivity */
--	u_int32_t is_node_fdisassoc;	/* forced node disassociation */
--	u_int32_t is_crypto_nomem;	/* no memory for crypto ctx */
--	u_int32_t is_crypto_tkip;	/* tkip crypto done in s/w */
--	u_int32_t is_crypto_tkipenmic;	/* tkip en-MIC done in s/w */
--	u_int32_t is_crypto_tkipdemic;	/* tkip de-MIC done in s/w */
--	u_int32_t is_crypto_tkipcm;	/* tkip counter measures */
--	u_int32_t is_crypto_ccmp;	/* ccmp crypto done in s/w */
--	u_int32_t is_crypto_wep;		/* wep crypto done in s/w */
--	u_int32_t is_crypto_setkey_cipher;/* cipher rejected key */
--	u_int32_t is_crypto_setkey_nokey;/* no key index for setkey */
--	u_int32_t is_crypto_delkey;	/* driver key delete failed */
--	u_int32_t is_crypto_badcipher;	/* unknown cipher */
--	u_int32_t is_crypto_nocipher;	/* cipher not available */
--	u_int32_t is_crypto_attachfail;	/* cipher attach failed */
--	u_int32_t is_crypto_swfallback;	/* cipher fallback to s/w */
--	u_int32_t is_crypto_keyfail;	/* driver key alloc failed */
--	u_int32_t is_crypto_enmicfail;	/* en-MIC failed */
--	u_int32_t is_ibss_capmismatch;	/* merge failed-cap mismatch */
--	u_int32_t is_ibss_norate;	/* merge failed-rate mismatch */
--	u_int32_t is_ps_unassoc;		/* ps-poll for unassoc. sta */
--	u_int32_t is_ps_badaid;		/* ps-poll w/ incorrect aid */
--	u_int32_t is_ps_qempty;		/* ps-poll w/ nothing to send */
--};
--
--/*
-- * Max size of optional information elements.  We artificially
-- * constrain this; it's limited only by the max frame size (and
-- * the max parameter size of the wireless extensions).
-- */
--#define	IEEE80211_MAX_OPT_IE	256
--
--/*
-- * WPA/RSN get/set key request.  Specify the key/cipher
-- * type and whether the key is to be used for sending and/or
-- * receiving.  The key index should be set only when working
-- * with global keys (use IEEE80211_KEYIX_NONE for ``no index'').
-- * Otherwise a unicast/pairwise key is specified by the bssid
-- * (on a station) or mac address (on an ap).  They key length
-- * must include any MIC key data; otherwise it should be no
-- more than IEEE80211_KEYBUF_SIZE.
-- */
--struct ieee80211req_key {
--	u_int8_t ik_type;		/* key/cipher type */
--	u_int8_t ik_pad;
--	ieee80211_keyix_t ik_keyix;	/* key index */
--	u_int8_t ik_keylen;		/* key length in bytes */
--	u_int8_t ik_flags;
--/* NB: IEEE80211_KEY_XMIT and IEEE80211_KEY_RECV defined elsewhere */
--#define	IEEE80211_KEY_DEFAULT	0x80	/* default xmit key */
--	u_int8_t ik_macaddr[IEEE80211_ADDR_LEN];
--	u_int64_t ik_keyrsc;		/* key receive sequence counter */
--	u_int64_t ik_keytsc;		/* key transmit sequence counter */
--	u_int8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
--};
--
--/*
-- * Delete a key either by index or address.  Set the index
-- * to IEEE80211_KEYIX_NONE when deleting a unicast key.
-- */
--struct ieee80211req_del_key {
--	/* NB: This is different to ieee80211_keyix_t, but this is OK as 
--	 * values are unique over the low order bits. */
--	u_int8_t idk_keyix;	/* key index */
--	u_int8_t idk_macaddr[IEEE80211_ADDR_LEN];
--};
--
--/*
-- * MLME state manipulation request.  IEEE80211_MLME_ASSOC
-- * only makes sense when operating as a station.  The other
-- * requests can be used when operating as a station or an
-- * ap (to effect a station).
-- */
--struct ieee80211req_mlme {
--	u_int8_t im_op;			/* operation to perform */
--#define	IEEE80211_MLME_ASSOC		1	/* associate station */
--#define	IEEE80211_MLME_DISASSOC		2	/* disassociate station */
--#define	IEEE80211_MLME_DEAUTH		3	/* deauthenticate station */
--#define	IEEE80211_MLME_AUTHORIZE	4	/* authorize station */
--#define	IEEE80211_MLME_UNAUTHORIZE	5	/* unauthorize station */
--#define IEEE80211_MLME_CLEAR_STATS	6	/* clear station statistic */
--	u_int8_t im_ssid_len;		/* length of optional ssid */
--	u_int16_t im_reason;		/* 802.11 reason code */
--	u_int8_t im_macaddr[IEEE80211_ADDR_LEN];
--	u_int8_t im_ssid[IEEE80211_NWID_LEN];
--};
--
--/* 
-- * MAC ACL operations.
-- */
--enum {
--	IEEE80211_MACCMD_POLICY_OPEN	= 0,	/* set policy: no ACLs */
--	IEEE80211_MACCMD_POLICY_ALLOW	= 1,	/* set policy: allow traffic */
--	IEEE80211_MACCMD_POLICY_DENY	= 2,	/* set policy: deny traffic */
--	IEEE80211_MACCMD_FLUSH		= 3,	/* flush ACL database */
--	IEEE80211_MACCMD_DETACH		= 4,	/* detach ACL policy */
--};
--
--/*
-- * Set the active channel list.  Note this list is
-- * intersected with the available channel list in
-- * calculating the set of channels actually used in
-- * scanning.
-- */
--struct ieee80211req_chanlist {
--	u_int8_t ic_channels[IEEE80211_CHAN_BYTES];
--};
--
--/*
-- * Get the active channel list info.
-- */
--struct ieee80211req_chaninfo {
--	u_int ic_nchans;
--	struct ieee80211_channel ic_chans[IEEE80211_CHAN_MAX];
--};
--
--/*
-- * Retrieve the WPA/RSN information element for an associated station.
-- */
--struct ieee80211req_wpaie {
--	u_int8_t	wpa_macaddr[IEEE80211_ADDR_LEN];
--	u_int8_t	wpa_ie[IEEE80211_MAX_OPT_IE];
--	u_int8_t	rsn_ie[IEEE80211_MAX_OPT_IE];
--};
--
--/*
-- * Retrieve per-node statistics.
-- */
--struct ieee80211req_sta_stats {
--	union {
--		/* NB: explicitly force 64-bit alignment */
--		u_int8_t macaddr[IEEE80211_ADDR_LEN];
--		u_int64_t pad;
--	} is_u;
--	struct ieee80211_nodestats is_stats;
--};
--
--/*
-- * Station information block; the mac address is used
-- * to retrieve other data like stats, unicast key, etc.
-- */
--struct ieee80211req_sta_info {
--	u_int16_t isi_len;		/* length (mult of 4) */
--	u_int16_t isi_freq;		/* MHz */
--	u_int16_t isi_flags;		/* channel flags */
--	u_int16_t isi_state;		/* state flags */
--	u_int8_t isi_authmode;		/* authentication algorithm */
--	u_int8_t isi_rssi;
--	int8_t isi_noise;
--	u_int16_t isi_capinfo;		/* capabilities */
--	u_int8_t isi_athflags;		/* Atheros capabilities */
--	u_int8_t isi_erp;		/* ERP element */
--	u_int8_t isi_macaddr[IEEE80211_ADDR_LEN];
--	u_int8_t isi_nrates;		/* negotiated rates */
--	u_int8_t isi_rates[IEEE80211_RATE_MAXSIZE];
--	u_int8_t isi_txrate;		/* index to isi_rates[] */
--	u_int16_t isi_ie_len;		/* IE length */
--	u_int16_t isi_associd;		/* assoc response */
--	u_int16_t isi_txpower;		/* current tx power */
--	u_int16_t isi_vlan;		/* vlan tag */
--	u_int16_t isi_txseqs[17];	/* seq to be transmitted */
--	u_int16_t isi_rxseqs[17];	/* seq previous for qos frames*/
--	u_int16_t isi_inact;		/* inactivity timer */
--	u_int8_t isi_uapsd;		/* UAPSD queues */
--	u_int8_t isi_opmode;		/* sta operating mode */
--
--	/* XXX frag state? */
--	/* variable length IE data */
--};
--
--enum {
--	IEEE80211_STA_OPMODE_NORMAL,
--	IEEE80211_STA_OPMODE_XR
--};
--
--/*
-- * Retrieve per-station information; to retrieve all
-- * specify a mac address of ff:ff:ff:ff:ff:ff.
-- */
--struct ieee80211req_sta_req {
--	union {
--		/* NB: explicitly force 64-bit alignment */
--		u_int8_t macaddr[IEEE80211_ADDR_LEN];
--		u_int64_t pad;
--	} is_u;
--	struct ieee80211req_sta_info info[1];	/* variable length */
--};
--
--/*
-- * Get/set per-station tx power cap.
-- */
--struct ieee80211req_sta_txpow {
--	u_int8_t	it_macaddr[IEEE80211_ADDR_LEN];
--	u_int8_t	it_txpow;
--};
--
--/*
-- * WME parameters are set and return using i_val and i_len.
-- * i_val holds the value itself.  i_len specifies the AC
-- * and, as appropriate, then high bit specifies whether the
-- * operation is to be applied to the BSS or ourself.
-- */
--#define	IEEE80211_WMEPARAM_SELF	0x0000		/* parameter applies to self */
--#define	IEEE80211_WMEPARAM_BSS	0x8000		/* parameter applies to BSS */
--#define	IEEE80211_WMEPARAM_VAL	0x7fff		/* parameter value */
--
--/*
-- * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS.
-- */
--struct ieee80211req_scan_result {
--	u_int16_t isr_len;		/* length (mult of 4) */
--	u_int16_t isr_freq;		/* MHz */
--	u_int16_t isr_flags;		/* channel flags */
--	u_int8_t isr_noise;
--	u_int8_t isr_rssi;
--	u_int8_t isr_intval;		/* beacon interval */
--	u_int16_t isr_capinfo;		/* capabilities */
--	u_int8_t isr_erp;		/* ERP element */
--	u_int8_t isr_bssid[IEEE80211_ADDR_LEN];
--	u_int8_t isr_nrates;
--	u_int8_t isr_rates[IEEE80211_RATE_MAXSIZE];
--	u_int8_t isr_ssid_len;		/* SSID length */
--	u_int8_t isr_ie_len;		/* IE length */
--	u_int8_t isr_pad[5];
--	/* variable length SSID followed by IE data */
--};
--
--#ifdef __FreeBSD__
--/*
-- * FreeBSD-style ioctls.
-- */
--/* the first member must be matched with struct ifreq */
--struct ieee80211req {
--	char i_name[IFNAMSIZ];	/* if_name, e.g. "wi0" */
--	u_int16_t i_type;	/* req type */
--	int16_t 	i_val;		/* Index or simple value */
--	int16_t 	i_len;		/* Index or simple value */
--	void *i_data;		/* Extra data */
--};
--#define	SIOCS80211		 _IOW('i', 234, struct ieee80211req)
--#define	SIOCG80211		_IOWR('i', 235, struct ieee80211req)
--#define	SIOCG80211STATS		_IOWR('i', 236, struct ifreq)
--#define	SIOC80211IFCREATE	_IOWR('i', 237, struct ifreq)
--#define	SIOC80211IFDESTROY	 _IOW('i', 238, struct ifreq)
--
--#define IEEE80211_IOC_SSID		1
--#define IEEE80211_IOC_NUMSSIDS		2
--#define IEEE80211_IOC_WEP		3
--#define 	IEEE80211_WEP_NOSUP		-1
--#define 	IEEE80211_WEP_OFF		0
--#define 	IEEE80211_WEP_ON		1
--#define 	IEEE80211_WEP_MIXED		2
--#define IEEE80211_IOC_WEPKEY		4
--#define IEEE80211_IOC_NUMWEPKEYS	5
--#define IEEE80211_IOC_WEPTXKEY		6
--#define IEEE80211_IOC_AUTHMODE		7
--#define IEEE80211_IOC_STATIONNAME	8
--#define IEEE80211_IOC_CHANNEL		9
--#define IEEE80211_IOC_POWERSAVE		10
--#define 	IEEE80211_POWERSAVE_NOSUP	-1
--#define 	IEEE80211_POWERSAVE_OFF		0
--#define 	IEEE80211_POWERSAVE_CAM		1
--#define 	IEEE80211_POWERSAVE_PSP		2
--#define 	IEEE80211_POWERSAVE_PSP_CAM	3
--#define 	IEEE80211_POWERSAVE_ON		IEEE80211_POWERSAVE_CAM
--#define IEEE80211_IOC_POWERSAVESLEEP	11
--#define	IEEE80211_IOC_RTSTHRESHOLD	12
--#define IEEE80211_IOC_PROTMODE		13
--#define 	IEEE80211_PROTMODE_OFF		0
--#define 	IEEE80211_PROTMODE_CTS		1
--#define 	IEEE80211_PROTMODE_RTSCTS	2
--#define	IEEE80211_IOC_TXPOWER		14	/* global tx power limit */
--#define	IEEE80211_IOC_BSSID		15
--#define	IEEE80211_IOC_ROAMING		16	/* roaming mode */
--#define	IEEE80211_IOC_PRIVACY		17	/* privacy invoked */
--#define	IEEE80211_IOC_DROPUNENCRYPTED	18	/* discard unencrypted frames */
--#define	IEEE80211_IOC_WPAKEY		19
--#define	IEEE80211_IOC_DELKEY		20
--#define	IEEE80211_IOC_MLME		21
--#define	IEEE80211_IOC_OPTIE		22	/* optional info. element */
--#define	IEEE80211_IOC_SCAN_REQ		23
--#define	IEEE80211_IOC_SCAN_RESULTS	24
--#define	IEEE80211_IOC_COUNTERMEASURES	25	/* WPA/TKIP countermeasures */
--#define	IEEE80211_IOC_WPA		26	/* WPA mode (0,1,2) */
--#define	IEEE80211_IOC_CHANLIST		27	/* channel list */
--#define	IEEE80211_IOC_WME		28	/* WME mode (on, off) */
--#define	IEEE80211_IOC_HIDESSID		29	/* hide SSID mode (on, off) */
--#define IEEE80211_IOC_APBRIDGE		30	/* AP inter-sta bridging */
--#define	IEEE80211_IOC_MCASTCIPHER	31	/* multicast/default cipher */
--#define	IEEE80211_IOC_MCASTKEYLEN	32	/* multicast key length */
--#define	IEEE80211_IOC_UCASTCIPHERS	33	/* unicast cipher suites */
--#define	IEEE80211_IOC_UCASTCIPHER	34	/* unicast cipher */
--#define	IEEE80211_IOC_UCASTKEYLEN	35	/* unicast key length */
--#define	IEEE80211_IOC_DRIVER_CAPS	36	/* driver capabilities */
--#define	IEEE80211_IOC_KEYMGTALGS	37	/* key management algorithms */
--#define	IEEE80211_IOC_RSNCAPS		38	/* RSN capabilities */
--#define	IEEE80211_IOC_WPAIE		39	/* WPA information element */
--#define	IEEE80211_IOC_STA_STATS		40	/* per-station statistics */
--#define	IEEE80211_IOC_MACCMD		41	/* MAC ACL operation */
--#define	IEEE80211_IOC_TXPOWMAX		43	/* max tx power for channel */
--#define	IEEE80211_IOC_STA_TXPOW		44	/* per-station tx power limit */
--#define	IEEE80211_IOC_STA_INFO		45	/* station/neighbor info */
--#define	IEEE80211_IOC_WME_CWMIN		46	/* WME: ECWmin */
--#define	IEEE80211_IOC_WME_CWMAX		47	/* WME: ECWmax */
--#define	IEEE80211_IOC_WME_AIFS		48	/* WME: AIFSN */
--#define	IEEE80211_IOC_WME_TXOPLIMIT	49	/* WME: txops limit */
--#define	IEEE80211_IOC_WME_ACM		50	/* WME: ACM (bss only) */
--#define	IEEE80211_IOC_WME_ACKPOLICY	51	/* WME: ACK policy (!bss only)*/
--#define	IEEE80211_IOC_DTIM_PERIOD	52	/* DTIM period (beacons) */
--#define	IEEE80211_IOC_BEACON_INTERVAL	53	/* beacon interval (ms) */
--#define	IEEE80211_IOC_ADDMAC		54	/* add sta to MAC ACL table */
--#define	IEEE80211_IOC_SETMAC		55	/* set interface wds mac addr */
--#define	IEEE80211_IOC_FF		56	/* ATH fast frames (on, off) */
--#define	IEEE80211_IOC_TURBOP		57	/* ATH turbo' (on, off) */
--#define	IEEE80211_IOC_APPIEBUF		58	/* IE in the management frame */
--#define	IEEE80211_IOC_FILTERFRAME	59	/* management frame filter */
--
--/*
-- * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS.
-- */
--struct ieee80211req_scan_result {
--	u_int16_t isr_len;		/* length (mult of 4) */
--	u_int16_t isr_freq;		/* MHz */
--	u_int16_t isr_flags;		/* channel flags */
--	u_int8_t isr_noise;
--	u_int8_t isr_rssi;
--	u_int8_t isr_intval;		/* beacon interval */
--	u_int16_t isr_capinfo;		/* capabilities */
--	u_int8_t isr_erp;		/* ERP element */
--	u_int8_t isr_bssid[IEEE80211_ADDR_LEN];
--	u_int8_t isr_nrates;
--	u_int8_t isr_rates[IEEE80211_RATE_MAXSIZE];
--	u_int8_t isr_ssid_len;		/* SSID length */
--	u_int8_t isr_ie_len;		/* IE length */
--	u_int8_t isr_pad[5];
--	/* variable length SSID followed by IE data */
--};
--
--#endif /* __FreeBSD__ */
--
--#ifdef __linux__
--/*
-- * Wireless Extensions API, private ioctl interfaces.
-- *
-- * NB: Even-numbered ioctl numbers have set semantics and are privileged!
-- *     (regardless of the incorrect comment in wireless.h!)
-- */
--#ifdef __KERNEL__
--#include <linux/if.h>
--#endif
--/* The maximum size of a iwpriv structure is IW_PRIV_SIZE_MASK, which was 
-- * exceeded for some time by chaninfo ioctl.  These macros change the size 
-- * encoding for anything larger than IW_PRIV_SIZE_MASK from bytes to 4-byte
-- * multiples so that the padded size fits under IW_PRIV_SIZE_MASK. */
--#define IW_PRIV_BLOB_LENGTH_ENCODING(_SIZE) \
--	(((_SIZE) == ((_SIZE) & IW_PRIV_SIZE_MASK)) ? \
--		(_SIZE) : \
--		(((_SIZE) / sizeof(uint32_t)) + \
--			(((_SIZE) == (((_SIZE) / sizeof(uint32_t)) * sizeof(int))) ? \
--				0 : 1)))
--#define IW_PRIV_BLOB_TYPE_ENCODING(_SIZE) \
--	(((_SIZE) == ((_SIZE) & IW_PRIV_SIZE_MASK)) ? \
--		(IW_PRIV_TYPE_BYTE | (_SIZE)) : \
--		(IW_PRIV_TYPE_INT  | IW_PRIV_BLOB_LENGTH_ENCODING((_SIZE))))
--
--#define	IEEE80211_IOCTL_SETPARAM	(SIOCIWFIRSTPRIV+0)
--#define	IEEE80211_IOCTL_GETPARAM	(SIOCIWFIRSTPRIV+1)
--#define	IEEE80211_IOCTL_SETMODE		(SIOCIWFIRSTPRIV+2)
--#define	IEEE80211_IOCTL_GETMODE		(SIOCIWFIRSTPRIV+3)
--#define	IEEE80211_IOCTL_SETWMMPARAMS	(SIOCIWFIRSTPRIV+4)
--#define	IEEE80211_IOCTL_GETWMMPARAMS	(SIOCIWFIRSTPRIV+5)
--#define	IEEE80211_IOCTL_SETCHANLIST	(SIOCIWFIRSTPRIV+6)
--#define	IEEE80211_IOCTL_GETCHANLIST	(SIOCIWFIRSTPRIV+7)
--#define	IEEE80211_IOCTL_CHANSWITCH	(SIOCIWFIRSTPRIV+8)
--#define	IEEE80211_IOCTL_GET_APPIEBUF	(SIOCIWFIRSTPRIV+9)
--#define	IEEE80211_IOCTL_SET_APPIEBUF	(SIOCIWFIRSTPRIV+10)
--#define	IEEE80211_IOCTL_READREG		(SIOCIWFIRSTPRIV+11)
--#define	IEEE80211_IOCTL_FILTERFRAME	(SIOCIWFIRSTPRIV+12)
--#define	IEEE80211_IOCTL_GETCHANINFO	(SIOCIWFIRSTPRIV+13)
--#define	IEEE80211_IOCTL_SETOPTIE	(SIOCIWFIRSTPRIV+14)
--#define	IEEE80211_IOCTL_GETOPTIE	(SIOCIWFIRSTPRIV+15)
--#define	IEEE80211_IOCTL_SETMLME		(SIOCIWFIRSTPRIV+16)
--#define	IEEE80211_IOCTL_RADAR		(SIOCIWFIRSTPRIV+17)
--#define	IEEE80211_IOCTL_SETKEY		(SIOCIWFIRSTPRIV+18)
--#define	IEEE80211_IOCTL_WRITEREG	(SIOCIWFIRSTPRIV+19)
--#define	IEEE80211_IOCTL_DELKEY		(SIOCIWFIRSTPRIV+20)
--#define	IEEE80211_IOCTL_HALMAP		(SIOCIWFIRSTPRIV+21)
--#define	IEEE80211_IOCTL_ADDMAC		(SIOCIWFIRSTPRIV+22)
--#define	IEEE80211_IOCTL_DELMAC		(SIOCIWFIRSTPRIV+24)
--#define	IEEE80211_IOCTL_WDSADDMAC	(SIOCIWFIRSTPRIV+25)
--#define	IEEE80211_IOCTL_WDSSETMAC	(SIOCIWFIRSTPRIV+26)
--#define	IEEE80211_IOCTL_KICKMAC		(SIOCIWFIRSTPRIV+30)
--#define	IEEE80211_IOCTL_SETSCANLIST	(SIOCIWFIRSTPRIV+31)
--
--enum {
--	IEEE80211_WMMPARAMS_CWMIN       = 1,
--	IEEE80211_WMMPARAMS_CWMAX       = 2,
--	IEEE80211_WMMPARAMS_AIFS       	= 3,
--	IEEE80211_WMMPARAMS_TXOPLIMIT	= 4,
--	IEEE80211_WMMPARAMS_ACM		= 5,
--	IEEE80211_WMMPARAMS_NOACKPOLICY	= 6,
--};
--enum {
--	IEEE80211_PARAM_TURBO			= 1,	/* turbo mode */
--	IEEE80211_PARAM_MODE			= 2,	/* phy mode (11a, 11b, etc.) */
--	IEEE80211_PARAM_AUTHMODE		= 3,	/* authentication mode */
--	IEEE80211_PARAM_PROTMODE		= 4,	/* 802.11g protection */
--	IEEE80211_PARAM_MCASTCIPHER		= 5,	/* multicast/default cipher */
--	IEEE80211_PARAM_MCASTKEYLEN		= 6,	/* multicast key length */
--	IEEE80211_PARAM_UCASTCIPHERS		= 7,	/* unicast cipher suites */
--	IEEE80211_PARAM_UCASTCIPHER		= 8,	/* unicast cipher */
--	IEEE80211_PARAM_UCASTKEYLEN		= 9,	/* unicast key length */
--	IEEE80211_PARAM_WPA			= 10,	/* WPA mode (0,1,2) */
--	IEEE80211_PARAM_ROAMING			= 12,	/* roaming mode */
--	IEEE80211_PARAM_PRIVACY			= 13,	/* privacy invoked */
--	IEEE80211_PARAM_COUNTERMEASURES		= 14,	/* WPA/TKIP countermeasures */
--	IEEE80211_PARAM_DROPUNENCRYPTED		= 15,	/* discard unencrypted frames */
--	IEEE80211_PARAM_DRIVER_CAPS		= 16,	/* driver capabilities */
--	IEEE80211_PARAM_MACCMD			= 17,	/* MAC ACL operation */
--	IEEE80211_PARAM_WMM			= 18,	/* WMM mode (on, off) */
--	IEEE80211_PARAM_HIDESSID		= 19,	/* hide SSID mode (on, off) */
--	IEEE80211_PARAM_APBRIDGE    		= 20,   /* AP inter-sta bridging */
--	IEEE80211_PARAM_KEYMGTALGS		= 21,	/* key management algorithms */
--	IEEE80211_PARAM_RSNCAPS			= 22,	/* RSN capabilities */
--	IEEE80211_PARAM_INACT			= 23,	/* station inactivity timeout */
--	IEEE80211_PARAM_INACT_AUTH		= 24,	/* station auth inact timeout */
--	IEEE80211_PARAM_INACT_INIT		= 25,	/* station init inact timeout */
--	IEEE80211_PARAM_ABOLT			= 26,	/* Atheros Adv. Capabilities */
--	IEEE80211_PARAM_INACT_TICK		= 27,	/* station inactivity timer tick (seconds) */
--	IEEE80211_PARAM_DTIM_PERIOD		= 28,	/* DTIM period (beacons) */
--	IEEE80211_PARAM_BEACON_INTERVAL		= 29,	/* beacon interval (ms) */
--	IEEE80211_PARAM_DOTH			= 30,	/* 11.h is on/off */
--	IEEE80211_PARAM_PWRTARGET		= 31,	/* Current Channel Pwr Constraint */
--	IEEE80211_PARAM_GENREASSOC		= 32,	/* Generate a reassociation request */
--	IEEE80211_PARAM_COMPRESSION		= 33,	/* compression */
--	IEEE80211_PARAM_FF			= 34,	/* fast frames support  */
--	IEEE80211_PARAM_XR			= 35,	/* XR support */
--	IEEE80211_PARAM_BURST			= 36,	/* burst mode */
--	IEEE80211_PARAM_PUREG			= 37,	/* pure 11g (no 11b stations) */
--	IEEE80211_PARAM_AR			= 38,	/* AR support */
--	IEEE80211_PARAM_WDS			= 39,	/* Enable 4 address processing */
--	IEEE80211_PARAM_BGSCAN			= 40,	/* bg scanning (on, off) */
--	IEEE80211_PARAM_BGSCAN_IDLE		= 41,	/* bg scan idle threshold */
--	IEEE80211_PARAM_BGSCAN_INTERVAL		= 42,	/* bg scan interval */
--	IEEE80211_PARAM_MCAST_RATE		= 43,	/* Multicast Tx Rate */
--	IEEE80211_PARAM_COVERAGE_CLASS		= 44,	/* coverage class */
--	IEEE80211_PARAM_COUNTRY_IE		= 45,	/* enable country IE */
--	IEEE80211_PARAM_SCANVALID		= 46,	/* scan cache valid threshold */
--	IEEE80211_PARAM_ROAM_RSSI_11A		= 47,	/* rssi threshold in 11a */
--	IEEE80211_PARAM_ROAM_RSSI_11B		= 48,	/* rssi threshold in 11b */
--	IEEE80211_PARAM_ROAM_RSSI_11G		= 49,	/* rssi threshold in 11g */
--	IEEE80211_PARAM_ROAM_RATE_11A		= 50,	/* tx rate threshold in 11a */
--	IEEE80211_PARAM_ROAM_RATE_11B		= 51,	/* tx rate threshold in 11b */
--	IEEE80211_PARAM_ROAM_RATE_11G		= 52,	/* tx rate threshold in 11g */
--	IEEE80211_PARAM_UAPSDINFO		= 53,	/* value for qos info field */
--	IEEE80211_PARAM_SLEEP			= 54,	/* force sleep/wake */
--	IEEE80211_PARAM_QOSNULL			= 55,	/* force sleep/wake */
--	IEEE80211_PARAM_PSPOLL			= 56,	/* force ps-poll generation (sta only) */
--	IEEE80211_PARAM_EOSPDROP		= 57,	/* force uapsd EOSP drop (ap only) */
--	IEEE80211_PARAM_MARKDFS			= 58,	/* mark a dfs interference channel when found */
--	IEEE80211_PARAM_REGCLASS		= 59,	/* enable regclass ids in country IE */
--	IEEE80211_PARAM_DROPUNENC_EAPOL		= 60,	/* drop unencrypted eapol frames */
--	IEEE80211_PARAM_SHPREAMBLE		= 61,	/* Short Preamble */
--	IEEE80211_PARAM_DUMPREGS		= 62,	/* Pretty printed dump of Atheros hardware registers */
--	IEEE80211_PARAM_DOTH_ALGORITHM		= 63,	/* spectrum management algorithm */
--	IEEE80211_PARAM_DOTH_MINCOM   		= 64,	/* minimum number of common channels */
--	IEEE80211_PARAM_DOTH_SLCG		= 65,	/* permil of Stations Lost per Channel Gained */
--	IEEE80211_PARAM_DOTH_SLDG		= 66,	/* permil of Stations Lost per rssi Db Gained */
--	IEEE80211_PARAM_TXCONT			= 67,	/* continuous transmit mode (boolean) */
--	IEEE80211_PARAM_TXCONT_RATE		= 68,	/* continuous transmit mode data rate (in mbit/sec) - will use closest match from current rate table */
--	IEEE80211_PARAM_TXCONT_POWER		= 69,	/* power level in units of 0.5dBm */
--	IEEE80211_PARAM_DFS_TESTMODE		= 70,	/* do not perform DFS actions (i.e. markng DFS and channel change on interference), just report them via debug. */
--	IEEE80211_PARAM_DFS_CACTIME		= 71,	/* how long do we wait for chan availability
--							   scans ?
--							   FCC requires 60s, so that is the default. */
--	IEEE80211_PARAM_DFS_EXCLPERIOD		= 72,	/* DFS no-occupancy limit - how long do we stay
--							   off a channel once radar is detected?
--							   FCC requires 30m, so that is the default. */
--	IEEE80211_PARAM_BEACON_MISS_THRESH	= 73,	/* Beacon miss threshold (in beacons) */
--	IEEE80211_PARAM_BEACON_MISS_THRESH_MS	= 74,	/* Beacon miss threshold (in ms) */
--	IEEE80211_PARAM_MAXRATE			= 75,	/* Maximum rate (by table index) */
--	IEEE80211_PARAM_MINRATE			= 76,	/* Minimum rate (by table index) */
--	IEEE80211_PARAM_PROTMODE_RSSI		= 77,	/* RSSI Threshold for enabling protection mode */
--	IEEE80211_PARAM_PROTMODE_TIMEOUT	= 78,	/* Timeout for expiring protection mode */
--	IEEE80211_PARAM_BGSCAN_THRESH		= 79,	/* bg scan rssi threshold */
--	IEEE80211_PARAM_RSSI_DIS_THR	= 80,	/* rssi threshold for disconnection */
--	IEEE80211_PARAM_RSSI_DIS_COUNT	= 81,	/* counter for rssi threshold */
--	IEEE80211_PARAM_WDS_SEP			= 82,	/* move wds stations into separate interfaces */
--	IEEE80211_PARAM_MAXASSOC		= 83,	/* maximum associated stations */
--	IEEE80211_PARAM_PROBEREQ		= 84,	/* enable handling of probe requests */
--	IEEE80211_PARAM_BEACON_TXP		= 85,	/* set beacon tx power */
--};
--
--#define	SIOCG80211STATS			(SIOCDEVPRIVATE+2)
--/* NB: require in+out parameters so cannot use wireless extensions, yech */
--#define	IEEE80211_IOCTL_GETKEY		(SIOCDEVPRIVATE+3)
--#define	IEEE80211_IOCTL_GETWPAIE	(SIOCDEVPRIVATE+4)
--#define	IEEE80211_IOCTL_STA_STATS	(SIOCDEVPRIVATE+5)
--#define	IEEE80211_IOCTL_STA_INFO	(SIOCDEVPRIVATE+6)
--#define	SIOC80211IFCREATE		(SIOCDEVPRIVATE+7)
--#define	SIOC80211IFDESTROY	 	(SIOCDEVPRIVATE+8)
--#define	IEEE80211_IOCTL_SCAN_RESULTS	(SIOCDEVPRIVATE+9)
--
--struct ieee80211_clone_params {
--	char icp_name[IFNAMSIZ];		/* device name */
--	u_int16_t icp_opmode;			/* operating mode */
--	u_int16_t icp_flags;			/* see below */
--#define	IEEE80211_CLONE_BSSID	0x0001		/* allocate unique mac/bssid */
--#define	IEEE80211_NO_STABEACONS	0x0002		/* Do not setup the station beacon timers */
--};
--
--/* APPIEBUF related definitions */
--
--/* Management frame type to which application IE is added */
--enum {
--	IEEE80211_APPIE_FRAME_BEACON		= 0,
--	IEEE80211_APPIE_FRAME_PROBE_REQ		= 1,
--	IEEE80211_APPIE_FRAME_PROBE_RESP	= 2,
--	IEEE80211_APPIE_FRAME_ASSOC_REQ		= 3,
--	IEEE80211_APPIE_FRAME_ASSOC_RESP	= 4,
--	IEEE80211_APPIE_NUM_OF_FRAME		= 5
--};
--
--struct ieee80211req_getset_appiebuf {
--	u_int32_t	app_frmtype;		/* management frame type for which buffer is added */
--	u_int32_t	app_buflen;		/* application-supplied buffer length */
--	u_int8_t	app_buf[0];		/* application-supplied IE(s) */
--};
--
--/* Flags ORed by application to set filter for receiving management frames */
--enum {
--	IEEE80211_FILTER_TYPE_BEACON		= 1<<0,
--	IEEE80211_FILTER_TYPE_PROBE_REQ		= 1<<1,
--	IEEE80211_FILTER_TYPE_PROBE_RESP	= 1<<2,
--	IEEE80211_FILTER_TYPE_ASSOC_REQ		= 1<<3,
--	IEEE80211_FILTER_TYPE_ASSOC_RESP	= 1<<4,
--	IEEE80211_FILTER_TYPE_AUTH		= 1<<5,
--	IEEE80211_FILTER_TYPE_DEAUTH		= 1<<6,
--	IEEE80211_FILTER_TYPE_DISASSOC		= 1<<7,
--	IEEE80211_FILTER_TYPE_ALL		= 0xFF	/* used to check the valid filter bits */
--};
--
--struct ieee80211req_set_filter {
--	u_int32_t app_filterype;		/* management frame filter type */
--};
--
--
--#endif /* __linux__ */
--
--#endif /* _NET80211_IEEE80211_IOCTL_H_ */
-diff --git a/package/hostapd/patches/100-madwifi_key_fixes.patch b/package/hostapd/patches/100-madwifi_key_fixes.patch
-deleted file mode 100644
-index dcd6d10..0000000
---- a/package/hostapd/patches/100-madwifi_key_fixes.patch
-+++ /dev/null
-@@ -1,34 +0,0 @@
----- a/src/drivers/driver_madwifi.c
--+++ b/src/drivers/driver_madwifi.c
--@@ -450,7 +450,9 @@ wpa_driver_madwifi_set_key(const char *i
-- 
-- 	memset(&wk, 0, sizeof(wk));
-- 	wk.ik_type = cipher;
---	wk.ik_flags = IEEE80211_KEY_RECV | IEEE80211_KEY_XMIT;
--+	wk.ik_flags = IEEE80211_KEY_RECV;
--+	if (set_tx)
--+		wk.ik_flags |= IEEE80211_KEY_XMIT;
-- 	if (addr == NULL || is_broadcast_ether_addr(addr)) {
-- 		memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);
-- 		wk.ik_keyix = key_idx;
--@@ -462,6 +464,20 @@ wpa_driver_madwifi_set_key(const char *i
-- 	wk.ik_keylen = key_len;
-- 	memcpy(wk.ik_keydata, key, key_len);
-- 
--+#ifdef WORDS_BIGENDIAN
--+#define WPA_KEY_RSC_LEN 8
--+	{
--+		size_t i;
--+		u8 tmp[WPA_KEY_RSC_LEN];
--+		os_memset(tmp, 0, sizeof(tmp));
--+		for (i = 0; i < seq_len; i++)
--+			tmp[WPA_KEY_RSC_LEN - i - 1] = seq[i];
--+		os_memcpy(&wk.ik_keyrsc, tmp, WPA_KEY_RSC_LEN);
--+	}
--+#else /* WORDS_BIGENDIAN */
--+	os_memcpy(&wk.ik_keyrsc, seq, seq_len);
--+#endif /* WORDS_BIGENDIAN */
--+
-- 	ret = set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk));
-- 	if (ret < 0) {
-- 		wpa_printf(MSG_DEBUG, "%s: Failed to set key (addr %s"
-diff --git a/package/hostapd/patches/110-bool_fix.patch b/package/hostapd/patches/110-bool_fix.patch
-deleted file mode 100644
-index 9f82b0b..0000000
---- a/package/hostapd/patches/110-bool_fix.patch
-+++ /dev/null
-@@ -1,14 +0,0 @@
----- a/src/ap/ieee802_1x.c
--+++ b/src/ap/ieee802_1x.c
--@@ -1933,9 +1933,9 @@ void ieee802_1x_notify_pre_auth(struct e
-- }
-- 
-- 
---static const char * bool_txt(Boolean bool)
--+static const char * bool_txt(Boolean bool_val)
-- {
---	return bool ? "TRUE" : "FALSE";
--+	return bool_val ? "TRUE" : "FALSE";
-- }
-- 
-- 
-diff --git a/package/hostapd/patches/120-daemonize_fix.patch b/package/hostapd/patches/120-daemonize_fix.patch
-deleted file mode 100644
-index 20a1eb3..0000000
---- a/package/hostapd/patches/120-daemonize_fix.patch
-+++ /dev/null
-@@ -1,97 +0,0 @@
----- a/src/utils/os_unix.c
--+++ b/src/utils/os_unix.c
--@@ -9,6 +9,7 @@
-- #include "includes.h"
-- 
-- #include <time.h>
--+#include <fcntl.h>
-- 
-- #ifdef ANDROID
-- #include <sys/capability.h>
--@@ -154,59 +155,46 @@ int os_gmtime(os_time_t t, struct os_tm 
-- 	return 0;
-- }
-- 
---
---#ifdef __APPLE__
---#include <fcntl.h>
---static int os_daemon(int nochdir, int noclose)
--+int os_daemonize(const char *pid_file)
-- {
---	int devnull;
--+	int pid = 0, i, devnull;
-- 
---	if (chdir("/") < 0)
---		return -1;
--+#if defined(__uClinux__) || defined(__sun__)
--+	return -1;
--+#else /* defined(__uClinux__) || defined(__sun__) */
-- 
---	devnull = open("/dev/null", O_RDWR);
---	if (devnull < 0)
--+#ifndef __APPLE__
--+	pid = fork();
--+	if (pid < 0)
-- 		return -1;
--+#endif
-- 
---	if (dup2(devnull, STDIN_FILENO) < 0) {
---		close(devnull);
---		return -1;
--+	if (pid > 0) {
--+		if (pid_file) {
--+			FILE *f = fopen(pid_file, "w");
--+			if (f) {
--+				fprintf(f, "%u\n", pid);
--+				fclose(f);
--+			}
--+		}
--+		_exit(0);
-- 	}
-- 
---	if (dup2(devnull, STDOUT_FILENO) < 0) {
---		close(devnull);
--+	if (setsid() < 0)
-- 		return -1;
---	}
-- 
---	if (dup2(devnull, STDERR_FILENO) < 0) {
---		close(devnull);
--+	if (chdir("/") < 0)
-- 		return -1;
---	}
---
---	return 0;
---}
---#else /* __APPLE__ */
---#define os_daemon daemon
---#endif /* __APPLE__ */
-- 
---
---int os_daemonize(const char *pid_file)
---{
---#if defined(__uClinux__) || defined(__sun__)
---	return -1;
---#else /* defined(__uClinux__) || defined(__sun__) */
---	if (os_daemon(0, 0)) {
---		perror("daemon");
--+	devnull = open("/dev/null", O_RDWR);
--+	if (devnull < 0)
-- 		return -1;
---	}
-- 
---	if (pid_file) {
---		FILE *f = fopen(pid_file, "w");
---		if (f) {
---			fprintf(f, "%u\n", getpid());
---			fclose(f);
---		}
---	}
--+	for (i = 0; i <= STDERR_FILENO; i++)
--+		dup2(devnull, i);
--+
--+	if (devnull > 2)
--+		close(devnull);
-- 
-- 	return -0;
-- #endif /* defined(__uClinux__) || defined(__sun__) */
-diff --git a/package/hostapd/patches/130-wds_sta_del_fix.patch b/package/hostapd/patches/130-wds_sta_del_fix.patch
-deleted file mode 100644
-index 06b6906..0000000
---- a/package/hostapd/patches/130-wds_sta_del_fix.patch
-+++ /dev/null
-@@ -1,13 +0,0 @@
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -9083,8 +9083,8 @@ static int i802_set_wds_sta(void *priv, 
-- 					name);
-- 
-- 		i802_set_sta_vlan(priv, addr, bss->ifname, 0);
---		return wpa_driver_nl80211_if_remove(priv, WPA_IF_AP_VLAN,
---						    name);
--+		nl80211_remove_iface(drv, if_nametoindex(name));
--+		return 0;
-- 	}
-- }
-- 
-diff --git a/package/hostapd/patches/200-multicall.patch b/package/hostapd/patches/200-multicall.patch
-deleted file mode 100644
-index 2289f51..0000000
---- a/package/hostapd/patches/200-multicall.patch
-+++ /dev/null
-@@ -1,246 +0,0 @@
----- a/hostapd/Makefile
--+++ b/hostapd/Makefile
--@@ -14,6 +14,7 @@ CFLAGS += -I../src/utils
-- # CFLAGS += -DUSE_KERNEL_HEADERS -I/usr/src/linux/include
-- 
-- -include .config
--+-include $(if $(MULTICALL), ../wpa_supplicant/.config)
-- 
-- ifndef CONFIG_OS
-- ifdef CONFIG_NATIVE_WINDOWS
--@@ -200,10 +201,14 @@ ifdef CONFIG_IEEE80211AC
-- CFLAGS += -DCONFIG_IEEE80211AC
-- endif
-- 
--+ifndef MULTICALL
--+CFLAGS += -DNO_SUPPLICANT
--+endif
--+
-- include ../src/drivers/drivers.mak
---OBJS += $(DRV_AP_OBJS)
---CFLAGS += $(DRV_AP_CFLAGS)
---LDFLAGS += $(DRV_AP_LDFLAGS)
--+OBJS += $(sort $(DRV_AP_OBJS) $(if $(MULTICALL),$(DRV_WPA_OBJS)))
--+CFLAGS += $(DRV_AP_CFLAGS) $(if $(MULTICALL),$(DRV_WPA_CFLAGS))
--+LDFLAGS += $(DRV_AP_LDFLAGS) $(if $(MULTICALL),$(DRV_WPA_LDFLAGS))
-- LIBS += $(DRV_AP_LIBS)
-- 
-- ifdef CONFIG_L2_PACKET
--@@ -890,6 +895,12 @@ install: all
-- 
-- BCHECK=../src/drivers/build.hostapd
-- 
--+hostapd_multi.a: $(BCHECK) $(OBJS)
--+	$(Q)$(CC) -c -o hostapd_multi.o -Dmain=hostapd_main $(CFLAGS) main.c
--+	@$(E) "  CC " $<
--+	@rm -f $@
--+	@$(AR) cr $@ hostapd_multi.o $(OBJS)
--+
-- hostapd: $(BCHECK) $(OBJS)
-- 	$(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
-- 	@$(E) "  LD " $@
--@@ -928,6 +939,12 @@ HOBJS += ../src/crypto/aes-internal.o
-- HOBJS += ../src/crypto/aes-internal-enc.o
-- endif
-- 
--+dump_cflags:
--+	@echo -n $(CFLAGS) " "
--+
--+dump_ldflags:
--+	@echo -n $(LDFLAGS) $(LIBS) $(EXTRALIBS) " "
--+
-- nt_password_hash: $(NOBJS)
-- 	$(Q)$(CC) $(LDFLAGS) -o nt_password_hash $(NOBJS) $(LIBS_n)
-- 	@$(E) "  LD " $@
----- a/wpa_supplicant/Makefile
--+++ b/wpa_supplicant/Makefile
--@@ -14,6 +14,7 @@ CFLAGS += -I../src
-- CFLAGS += -I../src/utils
-- 
-- -include .config
--+-include $(if $(MULTICALL),../hostapd/.config)
-- 
-- BINALL=wpa_supplicant wpa_cli
-- 
--@@ -727,6 +728,10 @@ ifdef CONFIG_DYNAMIC_EAP_METHODS
-- CFLAGS += -DCONFIG_DYNAMIC_EAP_METHODS
-- LIBS += -ldl -rdynamic
-- endif
--+else
--+  ifdef MULTICALL
--+    OBJS += ../src/eap_common/eap_common.o
--+  endif
-- endif
-- 
-- ifdef CONFIG_AP
--@@ -735,9 +740,11 @@ NEED_EAP_COMMON=y
-- NEED_RSN_AUTHENTICATOR=y
-- CFLAGS += -DCONFIG_AP
-- OBJS += ap.o
--+ifndef MULTICALL
-- CFLAGS += -DCONFIG_NO_RADIUS
-- CFLAGS += -DCONFIG_NO_ACCOUNTING
-- CFLAGS += -DCONFIG_NO_VLAN
--+endif
-- OBJS += ../src/ap/hostapd.o
-- OBJS += ../src/ap/wpa_auth_glue.o
-- OBJS += ../src/ap/utils.o
--@@ -799,10 +806,18 @@ endif
-- ifdef CONFIG_HS20
-- OBJS += ../src/ap/hs20.o
-- endif
--+else
--+  ifdef MULTICALL
--+    OBJS += ../src/eap_server/eap_server.o
--+    OBJS += ../src/eap_server/eap_server_identity.o
--+    OBJS += ../src/eap_server/eap_server_methods.o
--+  endif
-- endif
-- 
-- ifdef NEED_RSN_AUTHENTICATOR
--+ifndef MULTICALL
-- CFLAGS += -DCONFIG_NO_RADIUS
--+endif
-- NEED_AES_WRAP=y
-- OBJS += ../src/ap/wpa_auth.o
-- OBJS += ../src/ap/wpa_auth_ie.o
--@@ -1551,6 +1566,12 @@ wpa_priv: $(BCHECK) $(OBJS_priv)
-- 
-- $(OBJS_c) $(OBJS_t) $(OBJS_t2) $(OBJS) $(BCHECK) $(EXTRA_progs): .config
-- 
--+wpa_supplicant_multi.a: .config $(BCHECK) $(OBJS) $(EXTRA_progs)
--+	$(Q)$(CC) -c -o wpa_supplicant_multi.o -Dmain=wpa_supplicant_main $(CFLAGS) main.c
--+	@$(E) "  CC " $<
--+	@rm -f $@
--+	@$(AR) cr $@ wpa_supplicant_multi.o $(OBJS)
--+
-- wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
-- 	$(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
-- 	@$(E) "  LD " $@
--@@ -1625,6 +1646,12 @@ eap_eke.so: ../src/eap_peer/eap_eke.c ..
-- %@.service: %.service.arg.in
-- 	sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
-- 
--+dump_cflags:
--+	@echo -n $(CFLAGS) " "
--+
--+dump_ldflags:
--+	@echo -n $(LDFLAGS) $(LIBS) $(EXTRALIBS) " "
--+
-- wpa_supplicant.exe: wpa_supplicant
-- 	mv -f $< $@
-- wpa_cli.exe: wpa_cli
----- a/src/drivers/driver.h
--+++ b/src/drivers/driver.h
--@@ -4079,8 +4079,8 @@ union wpa_event_data {
--  * Driver wrapper code should call this function whenever an event is received
--  * from the driver.
--  */
---void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
---			  union wpa_event_data *data);
--+extern void (*wpa_supplicant_event)(void *ctx, enum wpa_event_type event,
--+				    union wpa_event_data *data);
-- 
-- 
-- /*
----- a/src/ap/drv_callbacks.c
--+++ b/src/ap/drv_callbacks.c
--@@ -844,8 +844,8 @@ static void hostapd_event_dfs_nop_finish
-- #endif /* NEED_AP_MLME */
-- 
-- 
---void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
---			  union wpa_event_data *data)
--+void hostapd_wpa_event(void *ctx, enum wpa_event_type event,
--+		       union wpa_event_data *data)
-- {
-- 	struct hostapd_data *hapd = ctx;
-- #ifndef CONFIG_NO_STDOUT_DEBUG
----- a/wpa_supplicant/wpa_priv.c
--+++ b/wpa_supplicant/wpa_priv.c
--@@ -817,8 +817,8 @@ static void wpa_priv_send_ft_response(st
-- }
-- 
-- 
---void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
---			  union wpa_event_data *data)
--+static void supplicant_event(void *ctx, enum wpa_event_type event,
--+			     union wpa_event_data *data)
-- {
-- 	struct wpa_priv_interface *iface = ctx;
-- 
--@@ -960,6 +960,7 @@ int main(int argc, char *argv[])
-- 	if (os_program_init())
-- 		return -1;
-- 
--+	wpa_supplicant_event = supplicant_event;
-- 	wpa_priv_fd_workaround();
-- 
-- 	for (;;) {
----- a/wpa_supplicant/events.c
--+++ b/wpa_supplicant/events.c
--@@ -2710,8 +2710,8 @@ static void wpa_supplicant_update_channe
-- }
-- 
-- 
---void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
---			  union wpa_event_data *data)
--+void supplicant_event(void *ctx, enum wpa_event_type event,
--+		      union wpa_event_data *data)
-- {
-- 	struct wpa_supplicant *wpa_s = ctx;
-- 
----- a/wpa_supplicant/wpa_supplicant.c
--+++ b/wpa_supplicant/wpa_supplicant.c
--@@ -3138,6 +3138,9 @@ static void wpa_supplicant_deinit_iface(
-- 	os_free(wpa_s);
-- }
-- 
--+extern void supplicant_event(void *ctx, enum wpa_event_type event,
--+			     union wpa_event_data *data);
--+
-- 
-- /**
--  * wpa_supplicant_add_iface - Add a new network interface
--@@ -3329,6 +3332,7 @@ struct wpa_global * wpa_supplicant_init(
-- 	wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
-- #endif /* CONFIG_NO_WPA_MSG */
-- 
--+	wpa_supplicant_event = supplicant_event;
-- 	wpa_debug_open_file(params->wpa_debug_file_path);
-- 	if (params->wpa_debug_syslog)
-- 		wpa_debug_open_syslog();
----- a/hostapd/main.c
--+++ b/hostapd/main.c
--@@ -511,6 +511,9 @@ static int hostapd_get_ctrl_iface_group(
-- 	return 0;
-- }
-- 
--+void hostapd_wpa_event(void *ctx, enum wpa_event_type event,
--+                       union wpa_event_data *data);
--+
-- 
-- int main(int argc, char *argv[])
-- {
--@@ -541,6 +544,7 @@ int main(int argc, char *argv[])
-- 	interfaces.global_iface_name = NULL;
-- 	interfaces.global_ctrl_sock = -1;
-- 
--+	wpa_supplicant_event = hostapd_wpa_event;
-- 	for (;;) {
-- 		c = getopt(argc, argv, "b:Bde:f:hKP:Ttvg:G:");
-- 		if (c < 0)
----- a/src/drivers/drivers.c
--+++ b/src/drivers/drivers.c
--@@ -7,7 +7,11 @@
--  */
-- 
-- #include "includes.h"
--+#include "common.h"
--+#include "driver.h"
-- 
--+void (*wpa_supplicant_event)(void *ctx, enum wpa_event_type event,
--+			     union wpa_event_data *data);
-- 
-- #ifdef CONFIG_DRIVER_WEXT
-- extern struct wpa_driver_ops wpa_driver_wext_ops; /* driver_wext.c */
-diff --git a/package/hostapd/patches/300-noscan.patch b/package/hostapd/patches/300-noscan.patch
-deleted file mode 100644
-index 17e7661..0000000
---- a/package/hostapd/patches/300-noscan.patch
-+++ /dev/null
-@@ -1,32 +0,0 @@
----- a/hostapd/config_file.c
--+++ b/hostapd/config_file.c
--@@ -2412,6 +2412,8 @@ static int hostapd_config_fill(struct ho
-- 			}
-- #endif /* CONFIG_IEEE80211W */
-- #ifdef CONFIG_IEEE80211N
--+		} else if (os_strcmp(buf, "noscan") == 0) {
--+			conf->noscan = atoi(pos);
-- 		} else if (os_strcmp(buf, "ieee80211n") == 0) {
-- 			conf->ieee80211n = atoi(pos);
-- 		} else if (os_strcmp(buf, "ht_capab") == 0) {
----- a/src/ap/ap_config.h
--+++ b/src/ap/ap_config.h
--@@ -527,6 +527,7 @@ struct hostapd_config {
-- 
-- 	int ht_op_mode_fixed;
-- 	u16 ht_capab;
--+	int noscan;
-- 	int ieee80211n;
-- 	int secondary_channel;
-- 	int require_ht;
----- a/src/ap/hw_features.c
--+++ b/src/ap/hw_features.c
--@@ -577,7 +577,7 @@ static int ieee80211n_check_40mhz(struct
-- {
-- 	struct wpa_driver_scan_params params;
-- 
---	if (!iface->conf->secondary_channel)
--+	if (!iface->conf->secondary_channel || iface->conf->noscan)
-- 		return 0; /* HT40 not used */
-- 
-- 	hostapd_set_state(iface, HAPD_IFACE_HT_SCAN);
-diff --git a/package/hostapd/patches/310-rescan_immediately.patch b/package/hostapd/patches/310-rescan_immediately.patch
-deleted file mode 100644
-index 043f07c..0000000
---- a/package/hostapd/patches/310-rescan_immediately.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/wpa_supplicant/wpa_supplicant.c
--+++ b/wpa_supplicant/wpa_supplicant.c
--@@ -2488,7 +2488,7 @@ static struct wpa_supplicant * wpa_suppl
-- 	if (wpa_s == NULL)
-- 		return NULL;
-- 	wpa_s->scan_req = INITIAL_SCAN_REQ;
---	wpa_s->scan_interval = 5;
--+	wpa_s->scan_interval = 1;
-- 	wpa_s->new_connection = 1;
-- 	wpa_s->parent = wpa_s;
-- 	wpa_s->sched_scanning = 0;
-diff --git a/package/hostapd/patches/320-optional_rfkill.patch b/package/hostapd/patches/320-optional_rfkill.patch
-deleted file mode 100644
-index 7ec51b1..0000000
---- a/package/hostapd/patches/320-optional_rfkill.patch
-+++ /dev/null
-@@ -1,261 +0,0 @@
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -254,7 +254,9 @@ struct wpa_driver_nl80211_data {
-- 	int if_removed;
-- 	int if_disabled;
-- 	int ignore_if_down_event;
--+#ifdef CONFIG_RFKILL
-- 	struct rfkill_data *rfkill;
--+#endif
-- 	struct wpa_driver_capa capa;
-- 	u8 *extended_capa, *extended_capa_mask;
-- 	unsigned int extended_capa_len;
--@@ -3630,7 +3632,7 @@ static int wpa_driver_nl80211_init_nl(st
-- 	return 0;
-- }
-- 
---
--+#ifdef CONFIG_RFKILL
-- static void wpa_driver_nl80211_rfkill_blocked(void *ctx)
-- {
-- 	wpa_printf(MSG_DEBUG, "nl80211: RFKILL blocked");
--@@ -3652,6 +3654,7 @@ static void wpa_driver_nl80211_rfkill_un
-- 	}
-- 	/* rtnetlink ifup handler will report interface as enabled */
-- }
--+#endif /* CONFIG_RFKILL */
-- 
-- 
-- static void wpa_driver_nl80211_handle_eapol_tx_status(int sock,
--@@ -3740,7 +3743,9 @@ static void * wpa_driver_nl80211_drv_ini
-- 					  const u8 *set_addr)
-- {
-- 	struct wpa_driver_nl80211_data *drv;
--+#ifdef CONFIG_RFKILL
-- 	struct rfkill_config *rcfg;
--+#endif
-- 	struct i802_bss *bss;
-- 
-- 	if (global_priv == NULL)
--@@ -3778,6 +3783,7 @@ static void * wpa_driver_nl80211_drv_ini
-- 	if (nl80211_init_bss(bss))
-- 		goto failed;
-- 
--+#ifdef CONFIG_RFKILL
-- 	rcfg = os_zalloc(sizeof(*rcfg));
-- 	if (rcfg == NULL)
-- 		goto failed;
--@@ -3790,6 +3796,7 @@ static void * wpa_driver_nl80211_drv_ini
-- 		wpa_printf(MSG_DEBUG, "nl80211: RFKILL status not available");
-- 		os_free(rcfg);
-- 	}
--+#endif /* CONFIG_RFKILL */
-- 
-- 	if (linux_iface_up(drv->global->ioctl_sock, ifname) > 0)
-- 		drv->start_iface_up = 1;
--@@ -4116,10 +4123,12 @@ static void nl80211_mgmt_unsubscribe(str
-- }
-- 
-- 
--+#ifdef CONFIG_RFKILL
-- static void wpa_driver_nl80211_send_rfkill(void *eloop_ctx, void *timeout_ctx)
-- {
-- 	wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
-- }
--+#endif /* CONFIG_RFKILL */
-- 
-- 
-- static void nl80211_del_p2pdev(struct i802_bss *bss)
--@@ -4246,13 +4255,16 @@ wpa_driver_nl80211_finish_drv_init(struc
-- 	}
-- 
-- 	if (linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 1)) {
--+#ifdef CONFIG_RFKILL
-- 		if (rfkill_is_blocked(drv->rfkill)) {
-- 			wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
-- 				   "interface '%s' due to rfkill",
-- 				   bss->ifname);
-- 			drv->if_disabled = 1;
-- 			send_rfkill_event = 1;
---		} else {
--+		} else
--+#endif
--+		{
-- 			wpa_printf(MSG_ERROR, "nl80211: Could not set "
-- 				   "interface '%s' UP", bss->ifname);
-- 			return -1;
--@@ -4268,8 +4280,10 @@ wpa_driver_nl80211_finish_drv_init(struc
-- 		return -1;
-- 
-- 	if (send_rfkill_event) {
--+#ifdef CONFIG_RFKILL
-- 		eloop_register_timeout(0, 0, wpa_driver_nl80211_send_rfkill,
-- 				       drv, drv->ctx);
--+#endif
-- 	}
-- 
-- 	return 0;
--@@ -4347,7 +4361,9 @@ static void wpa_driver_nl80211_deinit(st
-- 
-- 	netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, 0,
-- 			       IF_OPER_UP);
--+#ifdef CONFIG_RFKILL
-- 	rfkill_deinit(drv->rfkill);
--+#endif
-- 
-- 	eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
-- 
----- a/src/drivers/driver_wext.c
--+++ b/src/drivers/driver_wext.c
--@@ -740,7 +740,7 @@ static void wpa_driver_wext_event_rtm_de
-- 	}
-- }
-- 
---
--+#ifdef CONFIG_RFKILL
-- static void wpa_driver_wext_rfkill_blocked(void *ctx)
-- {
-- 	wpa_printf(MSG_DEBUG, "WEXT: RFKILL blocked");
--@@ -762,7 +762,7 @@ static void wpa_driver_wext_rfkill_unblo
-- 	}
-- 	/* rtnetlink ifup handler will report interface as enabled */
-- }
---
--+#endif /* CONFIG_RFKILL */
-- 
-- static void wext_get_phy_name(struct wpa_driver_wext_data *drv)
-- {
--@@ -808,7 +808,9 @@ void * wpa_driver_wext_init(void *ctx, c
-- {
-- 	struct wpa_driver_wext_data *drv;
-- 	struct netlink_config *cfg;
--+#ifdef CONFIG_RFKILL
-- 	struct rfkill_config *rcfg;
--+#endif
-- 	char path[128];
-- 	struct stat buf;
-- 
--@@ -843,6 +845,7 @@ void * wpa_driver_wext_init(void *ctx, c
-- 		goto err2;
-- 	}
-- 
--+#ifdef CONFIG_RFKILL
-- 	rcfg = os_zalloc(sizeof(*rcfg));
-- 	if (rcfg == NULL)
-- 		goto err3;
--@@ -855,6 +858,7 @@ void * wpa_driver_wext_init(void *ctx, c
-- 		wpa_printf(MSG_DEBUG, "WEXT: RFKILL status not available");
-- 		os_free(rcfg);
-- 	}
--+#endif /* CONFIG_RFKILL */
-- 
-- 	drv->mlme_sock = -1;
-- 
--@@ -872,7 +876,9 @@ void * wpa_driver_wext_init(void *ctx, c
-- 	return drv;
-- 
-- err3:
--+#ifdef CONFIG_RFKILL
-- 	rfkill_deinit(drv->rfkill);
--+#endif
-- 	netlink_deinit(drv->netlink);
-- err2:
-- 	close(drv->ioctl_sock);
--@@ -882,10 +888,12 @@ err1:
-- }
-- 
-- 
--+#ifdef CONFIG_RFKILL
-- static void wpa_driver_wext_send_rfkill(void *eloop_ctx, void *timeout_ctx)
-- {
-- 	wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
-- }
--+#endif /* CONFIG_RFKILL */
-- 
-- 
-- static int wpa_driver_wext_finish_drv_init(struct wpa_driver_wext_data *drv)
--@@ -893,13 +901,16 @@ static int wpa_driver_wext_finish_drv_in
-- 	int send_rfkill_event = 0;
-- 
-- 	if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1) < 0) {
--+#ifdef CONFIG_RFKILL
-- 		if (rfkill_is_blocked(drv->rfkill)) {
-- 			wpa_printf(MSG_DEBUG, "WEXT: Could not yet enable "
-- 				   "interface '%s' due to rfkill",
-- 				   drv->ifname);
-- 			drv->if_disabled = 1;
-- 			send_rfkill_event = 1;
---		} else {
--+		} else
--+#endif
--+		{
-- 			wpa_printf(MSG_ERROR, "WEXT: Could not set "
-- 				   "interface '%s' UP", drv->ifname);
-- 			return -1;
--@@ -947,8 +958,10 @@ static int wpa_driver_wext_finish_drv_in
-- 			       1, IF_OPER_DORMANT);
-- 
-- 	if (send_rfkill_event) {
--+#ifdef CONFIG_RFKILL
-- 		eloop_register_timeout(0, 0, wpa_driver_wext_send_rfkill,
-- 				       drv, drv->ctx);
--+#endif
-- 	}
-- 
-- 	return 0;
--@@ -978,7 +991,9 @@ void wpa_driver_wext_deinit(void *priv)
-- 
-- 	netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
-- 	netlink_deinit(drv->netlink);
--+#ifdef CONFIG_RFKILL
-- 	rfkill_deinit(drv->rfkill);
--+#endif
-- 
-- 	if (drv->mlme_sock >= 0)
-- 		eloop_unregister_read_sock(drv->mlme_sock);
----- a/src/drivers/drivers.mak
--+++ b/src/drivers/drivers.mak
--@@ -25,7 +25,6 @@ NEED_SME=y
-- NEED_AP_MLME=y
-- NEED_NETLINK=y
-- NEED_LINUX_IOCTL=y
---NEED_RFKILL=y
-- 
-- ifdef CONFIG_LIBNL32
--   DRV_LIBS += -lnl-3
--@@ -109,7 +108,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT
-- CONFIG_WIRELESS_EXTENSION=y
-- NEED_NETLINK=y
-- NEED_LINUX_IOCTL=y
---NEED_RFKILL=y
-- endif
-- 
-- ifdef CONFIG_DRIVER_NDIS
--@@ -135,7 +133,6 @@ endif
-- ifdef CONFIG_WIRELESS_EXTENSION
-- DRV_WPA_CFLAGS += -DCONFIG_WIRELESS_EXTENSION
-- DRV_WPA_OBJS += ../src/drivers/driver_wext.o
---NEED_RFKILL=y
-- endif
-- 
-- ifdef NEED_NETLINK
--@@ -148,6 +145,7 @@ endif
-- 
-- ifdef NEED_RFKILL
-- DRV_OBJS += ../src/drivers/rfkill.o
--+DRV_WPA_CFLAGS += -DCONFIG_RFKILL
-- endif
-- 
-- ifdef CONFIG_VLAN_NETLINK
----- a/src/drivers/driver_wext.h
--+++ b/src/drivers/driver_wext.h
--@@ -22,7 +22,9 @@ struct wpa_driver_wext_data {
-- 	int ifindex2;
-- 	int if_removed;
-- 	int if_disabled;
--+#ifdef CONFIG_RFKILL
-- 	struct rfkill_data *rfkill;
--+#endif
-- 	u8 *assoc_req_ies;
-- 	size_t assoc_req_ies_len;
-- 	u8 *assoc_resp_ies;
-diff --git a/package/hostapd/patches/330-nl80211_fix_set_freq.patch b/package/hostapd/patches/330-nl80211_fix_set_freq.patch
-deleted file mode 100644
-index a505a60..0000000
---- a/package/hostapd/patches/330-nl80211_fix_set_freq.patch
-+++ /dev/null
-@@ -1,20 +0,0 @@
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -6860,7 +6860,7 @@ static int wpa_driver_nl80211_set_freq(s
-- 
-- 	nl80211_cmd(drv, msg, 0, NL80211_CMD_SET_WIPHY);
-- 
---	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
--+	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
-- 	if (nl80211_put_freq_params(msg, freq) < 0)
-- 		goto nla_put_failure;
-- 
--@@ -11322,7 +11322,7 @@ static int nl80211_switch_channel(void *
-- 		return -ENOMEM;
-- 
-- 	nl80211_cmd(drv, msg, 0, NL80211_CMD_CHANNEL_SWITCH);
---	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
--+	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
-- 	NLA_PUT_U32(msg, NL80211_ATTR_CH_SWITCH_COUNT, settings->cs_count);
-- 	ret = nl80211_put_freq_params(msg, &settings->freq_params);
-- 	if (ret)
-diff --git a/package/hostapd/patches/340-reload_freq_change.patch b/package/hostapd/patches/340-reload_freq_change.patch
-deleted file mode 100644
-index 9316794..0000000
---- a/package/hostapd/patches/340-reload_freq_change.patch
-+++ /dev/null
-@@ -1,29 +0,0 @@
----- a/src/ap/hostapd.c
--+++ b/src/ap/hostapd.c
--@@ -72,6 +72,16 @@ static void hostapd_reload_bss(struct ho
-- #endif /* CONFIG_NO_RADIUS */
-- 
-- 	ssid = &hapd->conf->ssid;
--+
--+	hostapd_set_freq(hapd, hapd->iconf->hw_mode, hapd->iface->freq,
--+			 hapd->iconf->channel,
--+			 hapd->iconf->ieee80211n,
--+			 hapd->iconf->ieee80211ac,
--+			 hapd->iconf->secondary_channel,
--+			 hapd->iconf->vht_oper_chwidth,
--+			 hapd->iconf->vht_oper_centr_freq_seg0_idx,
--+			 hapd->iconf->vht_oper_centr_freq_seg1_idx);
--+
-- 	if (!ssid->wpa_psk_set && ssid->wpa_psk && !ssid->wpa_psk->next &&
-- 	    ssid->wpa_passphrase_set && ssid->wpa_passphrase) {
-- 		/*
--@@ -172,6 +182,9 @@ int hostapd_reload_config(struct hostapd
-- 	oldconf = hapd->iconf;
-- 	iface->conf = newconf;
-- 
--+	if (iface->conf->channel)
--+		iface->freq = hostapd_hw_get_freq(hapd, iface->conf->channel);
--+
-- 	for (j = 0; j < iface->num_bss; j++) {
-- 		hapd = iface->bss[j];
-- 		hapd->iconf = newconf;
-diff --git a/package/hostapd/patches/350-nl80211_del_beacon_bss.patch b/package/hostapd/patches/350-nl80211_del_beacon_bss.patch
-deleted file mode 100644
-index 885922c..0000000
---- a/package/hostapd/patches/350-nl80211_del_beacon_bss.patch
-+++ /dev/null
-@@ -1,50 +0,0 @@
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -4290,18 +4290,20 @@ wpa_driver_nl80211_finish_drv_init(struc
-- }
-- 
-- 
---static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
--+static int wpa_driver_nl80211_del_bss_beacon(struct i802_bss *bss)
-- {
--+	struct wpa_driver_nl80211_data *drv = bss->drv;
-- 	struct nl_msg *msg;
-- 
-- 	msg = nlmsg_alloc();
-- 	if (!msg)
-- 		return -ENOMEM;
-- 
--+	bss->beacon_set = 0;
-- 	wpa_printf(MSG_DEBUG, "nl80211: Remove beacon (ifindex=%d)",
---		   drv->ifindex);
--+		   bss->ifindex);
-- 	nl80211_cmd(drv, msg, 0, NL80211_CMD_DEL_BEACON);
---	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
--+	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
-- 
-- 	return send_and_recv_msgs(drv, msg, NULL, NULL);
--  nla_put_failure:
--@@ -4309,6 +4311,15 @@ static int wpa_driver_nl80211_del_beacon
-- 	return -ENOBUFS;
-- }
-- 
--+static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
--+{
--+	struct i802_bss *bss;
--+
--+	for (bss = drv->first_bss; bss; bss = bss->next)
--+		wpa_driver_nl80211_del_bss_beacon(bss);
--+
--+	return 0;
--+}
-- 
-- /**
--  * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
--@@ -9911,7 +9922,6 @@ static int wpa_driver_nl80211_stop_ap(vo
-- 	if (!is_ap_interface(drv->nlmode))
-- 		return -1;
-- 	wpa_driver_nl80211_del_beacon(drv);
---	bss->beacon_set = 0;
-- 	return 0;
-- }
-- 
-diff --git a/package/hostapd/patches/360-ctrl_iface_reload.patch b/package/hostapd/patches/360-ctrl_iface_reload.patch
-deleted file mode 100644
-index 170d4f2..0000000
---- a/package/hostapd/patches/360-ctrl_iface_reload.patch
-+++ /dev/null
-@@ -1,98 +0,0 @@
----- a/hostapd/ctrl_iface.c
--+++ b/hostapd/ctrl_iface.c
--@@ -34,6 +34,7 @@
-- #include "wps/wps.h"
-- #include "config_file.h"
-- #include "ctrl_iface.h"
--+#include "config_file.h"
-- 
-- 
-- struct wpa_ctrl_dst {
--@@ -44,6 +45,7 @@ struct wpa_ctrl_dst {
-- 	int errors;
-- };
-- 
--+static char *reload_opts = NULL;
-- 
-- static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
-- 				    const char *buf, size_t len);
--@@ -153,6 +155,68 @@ static int hostapd_ctrl_iface_new_sta(st
-- 	return 0;
-- }
-- 
--+static int hostapd_ctrl_iface_set_down(struct hostapd_data *hapd)
--+{
--+	if (hapd->driver->stop_ap)
--+		hapd->driver->stop_ap(hapd->drv_priv);
--+	return 0;
--+}
--+
--+static char *get_option(char *opt, char *str)
--+{
--+	int len = strlen(str);
--+
--+	if (!strncmp(opt, str, len))
--+		return opt + len;
--+	else
--+		return NULL;
--+}
--+
--+static struct hostapd_config *hostapd_ctrl_iface_config_read(const char *fname)
--+{
--+	struct hostapd_config *conf;
--+	char *opt, *val;
--+
--+	conf = hostapd_config_read(fname);
--+	if (!conf)
--+		return NULL;
--+
--+	for (opt = strtok(reload_opts, " ");
--+	     opt;
--+		 opt = strtok(NULL, " ")) {
--+
--+		if ((val = get_option(opt, "channel=")))
--+			conf->channel = atoi(val);
--+		else if ((val = get_option(opt, "ht_capab=")))
--+			conf->ht_capab = atoi(val);
--+		else if ((val = get_option(opt, "ht_capab_mask=")))
--+			conf->ht_capab &= atoi(val);
--+		else if ((val = get_option(opt, "sec_chan=")))
--+			conf->secondary_channel = atoi(val);
--+		else if ((val = get_option(opt, "hw_mode=")))
--+			conf->hw_mode = atoi(val);
--+		else if ((val = get_option(opt, "ieee80211n=")))
--+			conf->ieee80211n = atoi(val);
--+		else
--+			break;
--+	}
--+
--+	return conf;
--+}
--+
--+static int hostapd_ctrl_iface_update(struct hostapd_data *hapd, char *txt)
--+{
--+	struct hostapd_config * (*config_read_cb)(const char *config_fname);
--+	struct hostapd_iface *iface = hapd->iface;
--+
--+	config_read_cb = iface->interfaces->config_read_cb;
--+	iface->interfaces->config_read_cb = hostapd_ctrl_iface_config_read;
--+	reload_opts = txt;
--+
--+	hostapd_reload_config(iface);
--+
--+	iface->interfaces->config_read_cb = config_read_cb;
--+}
-- 
-- #ifdef CONFIG_IEEE80211W
-- #ifdef NEED_AP_MLME
--@@ -1199,6 +1263,10 @@ static void hostapd_ctrl_iface_receive(i
-- 				reply_len += res;
-- 		}
-- #endif /* CONFIG_NO_RADIUS */
--+	} else if (os_strcmp(buf, "DOWN") == 0) {
--+		hostapd_ctrl_iface_set_down(hapd);
--+	} else if (os_strncmp(buf, "UPDATE ", 7) == 0) {
--+		hostapd_ctrl_iface_update(hapd, buf + 7);
-- 	} else if (os_strcmp(buf, "STA-FIRST") == 0) {
-- 		reply_len = hostapd_ctrl_iface_sta_first(hapd, reply,
-- 							 reply_size);
-diff --git a/package/hostapd/patches/370-ap_sta_support.patch b/package/hostapd/patches/370-ap_sta_support.patch
-deleted file mode 100644
-index a3d0572..0000000
---- a/package/hostapd/patches/370-ap_sta_support.patch
-+++ /dev/null
-@@ -1,222 +0,0 @@
----- a/wpa_supplicant/wpa_supplicant_i.h
--+++ b/wpa_supplicant/wpa_supplicant_i.h
--@@ -96,6 +96,11 @@ struct wpa_interface {
-- 	const char *ifname;
-- 
-- 	/**
--+	 * hostapd_ctrl - path to hostapd control socket for notification
--+	 */
--+	const char *hostapd_ctrl;
--+
--+	/**
-- 	 * bridge_ifname - Optional bridge interface name
-- 	 *
-- 	 * If the driver interface (ifname) is included in a Linux bridge
--@@ -325,6 +330,8 @@ struct wpa_supplicant {
-- #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
-- 	char bridge_ifname[16];
-- 
--+	struct wpa_ctrl *hostapd;
--+
-- 	char *confname;
-- 	char *confanother;
-- 	struct wpa_config *conf;
----- a/wpa_supplicant/Makefile
--+++ b/wpa_supplicant/Makefile
--@@ -13,6 +13,10 @@ PKG_CONFIG ?= pkg-config
-- CFLAGS += -I../src
-- CFLAGS += -I../src/utils
-- 
--+ifdef MULTICALL
--+CFLAGS += -DMULTICALL
--+endif
--+
-- -include .config
-- -include $(if $(MULTICALL),../hostapd/.config)
-- 
--@@ -76,6 +80,8 @@ OBJS_c = wpa_cli.o ../src/common/wpa_ctr
-- OBJS_c += ../src/utils/wpa_debug.o
-- OBJS_c += ../src/utils/common.o
-- 
--+OBJS += ../src/common/wpa_ctrl.o
--+
-- ifndef CONFIG_OS
-- ifdef CONFIG_NATIVE_WINDOWS
-- CONFIG_OS=win32
----- a/wpa_supplicant/wpa_supplicant.c
--+++ b/wpa_supplicant/wpa_supplicant.c
--@@ -109,6 +109,46 @@ extern int wpa_debug_show_keys;
-- extern int wpa_debug_timestamp;
-- extern struct wpa_driver_ops *wpa_drivers[];
-- 
--+static int hostapd_stop(struct wpa_supplicant *wpa_s)
--+{
--+	const char *cmd = "DOWN";
--+	char buf[256];
--+	int len = sizeof(buf);
--+
--+	if (wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL) < 0) {
--+		wpa_printf(MSG_ERROR, "\nFailed to stop hostapd AP interfaces\n");
--+		return -1;
--+	}
--+	return 0;
--+}
--+
--+static int hostapd_reload(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
--+{
--+	char *cmd = NULL;
--+	char buf[256];
--+	int len = sizeof(buf);
--+	enum hostapd_hw_mode hw_mode;
--+	u8 channel;
--+	int ret;
--+
--+	if (!bss)
--+		return;
--+
--+	hw_mode = ieee80211_freq_to_chan(bss->freq, &channel);
--+	if (asprintf(&cmd, "UPDATE channel=%d sec_chan=0 hw_mode=%d ieee80211n=%d",
--+		     channel, hw_mode, !!bss->ht_capab) < 0)
--+		return -1;
--+
--+	ret = wpa_ctrl_request(wpa_s->hostapd, cmd, os_strlen(cmd), buf, &len, NULL);
--+	free(cmd);
--+
--+	if (ret < 0) {
--+		wpa_printf(MSG_ERROR, "\nFailed to reload hostapd AP interfaces\n");
--+		return -1;
--+	}
--+	return 0;
--+}
--+
-- /* Configure default/group WEP keys for static WEP */
-- int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
-- {
--@@ -685,8 +725,12 @@ void wpa_supplicant_set_state(struct wpa
-- #endif /* CONFIG_P2P */
-- 
-- 		sme_sched_obss_scan(wpa_s, 1);
--+		if (wpa_s->hostapd)
--+			hostapd_reload(wpa_s, wpa_s->current_bss);
-- 	} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
-- 		   state == WPA_ASSOCIATED) {
--+		if (wpa_s->hostapd)
--+			hostapd_stop(wpa_s);
-- 		wpa_s->new_connection = 1;
-- 		wpa_drv_set_operstate(wpa_s, 0);
-- #ifndef IEEE8021X_EAPOL
--@@ -2906,6 +2950,20 @@ static int wpa_supplicant_init_iface(str
-- 			   sizeof(wpa_s->bridge_ifname));
-- 	}
-- 
--+	if (iface->hostapd_ctrl) {
--+		char *cmd = "DOWN";
--+		char buf[256];
--+		int len = sizeof(buf);
--+
--+		wpa_s->hostapd = wpa_ctrl_open(iface->hostapd_ctrl);
--+		if (!wpa_s->hostapd) {
--+			wpa_printf(MSG_ERROR, "\nFailed to connect to hostapd\n");
--+			return -1;
--+		}
--+		if (hostapd_stop(wpa_s) < 0)
--+			return -1;
--+	}
--+
-- 	/* RSNA Supplicant Key Management - INITIALIZE */
-- 	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
-- 	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
--@@ -3125,6 +3183,11 @@ static void wpa_supplicant_deinit_iface(
-- 	if (terminate)
-- 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
-- 
--+	if (wpa_s->hostapd) {
--+		wpa_ctrl_close(wpa_s->hostapd);
--+		wpa_s->hostapd = NULL;
--+	}
--+
-- 	if (wpa_s->ctrl_iface) {
-- 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
-- 		wpa_s->ctrl_iface = NULL;
----- a/wpa_supplicant/bss.c
--+++ b/wpa_supplicant/bss.c
--@@ -11,6 +11,7 @@
-- #include "utils/common.h"
-- #include "utils/eloop.h"
-- #include "common/ieee802_11_defs.h"
--+#include "common/ieee802_11_common.h"
-- #include "drivers/driver.h"
-- #include "wpa_supplicant_i.h"
-- #include "config.h"
--@@ -245,6 +246,9 @@ static void calculate_update_time(const 
-- static void wpa_bss_copy_res(struct wpa_bss *dst, struct wpa_scan_res *src,
-- 			     struct os_time *fetch_time)
-- {
--+	struct ieee80211_ht_capabilities *capab;
--+	struct ieee802_11_elems elems;
--+
-- 	dst->flags = src->flags;
-- 	os_memcpy(dst->bssid, src->bssid, ETH_ALEN);
-- 	dst->freq = src->freq;
--@@ -255,6 +259,12 @@ static void wpa_bss_copy_res(struct wpa_
-- 	dst->level = src->level;
-- 	dst->tsf = src->tsf;
-- 
--+	memset(&elems, 0, sizeof(elems));
--+	ieee802_11_parse_elems((u8 *) (src + 1), src->ie_len, &elems, 0);
--+	capab = (struct ieee80211_ht_capabilities *) elems.ht_capabilities;
--+	if (capab)
--+		dst->ht_capab = le_to_host16(capab->ht_capabilities_info);
--+
-- 	calculate_update_time(fetch_time, src->age, &dst->last_update);
-- }
-- 
----- a/wpa_supplicant/main.c
--+++ b/wpa_supplicant/main.c
--@@ -27,7 +27,7 @@ static void usage(void)
-- 	       "  wpa_supplicant [-BddhKLqqstuvW] [-P<pid file>] "
-- 	       "[-g<global ctrl>] \\\n"
-- 	       "        [-G<group>] \\\n"
---	       "        -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] "
--+	       "        -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-H<hostapd path>] "
-- 	       "[-p<driver_param>] \\\n"
-- 	       "        [-b<br_ifname>] [-f<debug file>] [-e<entropy file>] "
-- 	       "\\\n"
--@@ -72,6 +72,7 @@ static void usage(void)
-- #endif /* CONFIG_DEBUG_LINUX_TRACING */
-- 	printf("  -t = include timestamp in debug messages\n"
-- 	       "  -h = show this help text\n"
--+		   "  -H = connect to a hostapd instance to manage state changes\n"
-- 	       "  -L = show license (BSD)\n"
-- 	       "  -o = override driver parameter for new interfaces\n"
-- 	       "  -O = override ctrl_interface parameter for new interfaces\n"
--@@ -160,7 +161,7 @@ int main(int argc, char *argv[])
-- 
-- 	for (;;) {
-- 		c = getopt(argc, argv,
---			   "b:Bc:C:D:de:f:g:G:hi:I:KLNo:O:p:P:qsTtuvW");
--+			   "b:Bc:C:D:de:f:g:G:hH:i:I:KLNo:O:p:P:qsTtuvW");
-- 		if (c < 0)
-- 			break;
-- 		switch (c) {
--@@ -207,6 +208,9 @@ int main(int argc, char *argv[])
-- 			usage();
-- 			exitcode = 0;
-- 			goto out;
--+		case 'H':
--+			iface->hostapd_ctrl = optarg;
--+			break;
-- 		case 'i':
-- 			iface->ifname = optarg;
-- 			break;
----- a/wpa_supplicant/bss.h
--+++ b/wpa_supplicant/bss.h
--@@ -69,6 +69,8 @@ struct wpa_bss {
-- 	u8 ssid[32];
-- 	/** Length of SSID */
-- 	size_t ssid_len;
--+	/** HT caapbilities */
--+	u16 ht_capab;
-- 	/** Frequency of the channel in MHz (e.g., 2412 = channel 1) */
-- 	int freq;
-- 	/** Beacon interval in TUs (host byte order) */
-diff --git a/package/hostapd/patches/380-disable_ctrl_iface_mib.patch b/package/hostapd/patches/380-disable_ctrl_iface_mib.patch
-deleted file mode 100644
-index 27f21bd..0000000
---- a/package/hostapd/patches/380-disable_ctrl_iface_mib.patch
-+++ /dev/null
-@@ -1,168 +0,0 @@
----- a/hostapd/Makefile
--+++ b/hostapd/Makefile
--@@ -144,6 +144,9 @@ endif
-- ifdef CONFIG_NO_CTRL_IFACE
-- CFLAGS += -DCONFIG_NO_CTRL_IFACE
-- else
--+ifdef CONFIG_CTRL_IFACE_MIB
--+CFLAGS += -DCONFIG_CTRL_IFACE_MIB
--+endif
-- OBJS += ctrl_iface.o
-- OBJS += ../src/ap/ctrl_iface_ap.o
-- endif
----- a/hostapd/ctrl_iface.c
--+++ b/hostapd/ctrl_iface.c
--@@ -1234,6 +1234,7 @@ static void hostapd_ctrl_iface_receive(i
-- 	} else if (os_strcmp(buf, "STATUS") == 0) {
-- 		reply_len = hostapd_ctrl_iface_status(hapd, reply,
-- 						      reply_size);
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 	} else if (os_strcmp(buf, "MIB") == 0) {
-- 		reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
-- 		if (reply_len >= 0) {
--@@ -1263,10 +1264,12 @@ static void hostapd_ctrl_iface_receive(i
-- 				reply_len += res;
-- 		}
-- #endif /* CONFIG_NO_RADIUS */
--+#endif
-- 	} else if (os_strcmp(buf, "DOWN") == 0) {
-- 		hostapd_ctrl_iface_set_down(hapd);
-- 	} else if (os_strncmp(buf, "UPDATE ", 7) == 0) {
-- 		hostapd_ctrl_iface_update(hapd, buf + 7);
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 	} else if (os_strcmp(buf, "STA-FIRST") == 0) {
-- 		reply_len = hostapd_ctrl_iface_sta_first(hapd, reply,
-- 							 reply_size);
--@@ -1276,6 +1279,7 @@ static void hostapd_ctrl_iface_receive(i
-- 	} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
-- 		reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply,
-- 							reply_size);
--+#endif
-- 	} else if (os_strcmp(buf, "ATTACH") == 0) {
-- 		if (hostapd_ctrl_iface_attach(hapd, &from, fromlen))
-- 			reply_len = -1;
----- a/wpa_supplicant/Makefile
--+++ b/wpa_supplicant/Makefile
--@@ -778,6 +778,9 @@ ifdef CONFIG_WNM
-- OBJS += ../src/ap/wnm_ap.o
-- endif
-- ifdef CONFIG_CTRL_IFACE
--+ifdef CONFIG_CTRL_IFACE_MIB
--+CFLAGS += -DCONFIG_CTRL_IFACE_MIB
--+endif
-- OBJS += ../src/ap/ctrl_iface_ap.o
-- endif
-- 
----- a/wpa_supplicant/ctrl_iface.c
--+++ b/wpa_supplicant/ctrl_iface.c
--@@ -5262,6 +5262,7 @@ char * wpa_supplicant_ctrl_iface_process
-- 			reply_len = -1;
-- 	} else if (os_strncmp(buf, "NOTE ", 5) == 0) {
-- 		wpa_printf(MSG_INFO, "NOTE: %s", buf + 5);
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 	} else if (os_strcmp(buf, "MIB") == 0) {
-- 		reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size);
-- 		if (reply_len >= 0) {
--@@ -5273,6 +5274,7 @@ char * wpa_supplicant_ctrl_iface_process
-- 			else
-- 				reply_len += res;
-- 		}
--+#endif
-- 	} else if (os_strncmp(buf, "STATUS", 6) == 0) {
-- 		reply_len = wpa_supplicant_ctrl_iface_status(
-- 			wpa_s, buf + 6, reply, reply_size);
--@@ -5687,6 +5689,7 @@ char * wpa_supplicant_ctrl_iface_process
-- 		reply_len = wpa_supplicant_ctrl_iface_bss(
-- 			wpa_s, buf + 4, reply, reply_size);
-- #ifdef CONFIG_AP
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 	} else if (os_strcmp(buf, "STA-FIRST") == 0) {
-- 		reply_len = ap_ctrl_iface_sta_first(wpa_s, reply, reply_size);
-- 	} else if (os_strncmp(buf, "STA ", 4) == 0) {
--@@ -5695,6 +5698,7 @@ char * wpa_supplicant_ctrl_iface_process
-- 	} else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) {
-- 		reply_len = ap_ctrl_iface_sta_next(wpa_s, buf + 9, reply,
-- 						   reply_size);
--+#endif
-- 	} else if (os_strncmp(buf, "DEAUTHENTICATE ", 15) == 0) {
-- 		if (ap_ctrl_iface_sta_deauthenticate(wpa_s, buf + 15))
-- 			reply_len = -1;
----- a/src/ap/ctrl_iface_ap.c
--+++ b/src/ap/ctrl_iface_ap.c
--@@ -20,6 +20,7 @@
-- #include "ctrl_iface_ap.h"
-- #include "ap_drv_ops.h"
-- 
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 
-- static int hostapd_get_sta_conn_time(struct sta_info *sta,
-- 				     char *buf, size_t buflen)
--@@ -129,6 +130,7 @@ int hostapd_ctrl_iface_sta_next(struct h
-- 	return hostapd_ctrl_iface_sta_mib(hapd, sta->next, buf, buflen);
-- }
-- 
--+#endif
-- 
-- #ifdef CONFIG_P2P_MANAGER
-- static int p2p_manager_disconnect(struct hostapd_data *hapd, u16 stype,
--@@ -423,3 +425,4 @@ int hostapd_parse_csa_settings(const cha
-- 
-- 	return 0;
-- }
--+
----- a/src/ap/ieee802_1x.c
--+++ b/src/ap/ieee802_1x.c
--@@ -1938,6 +1938,7 @@ static const char * bool_txt(Boolean boo
-- 	return bool_val ? "TRUE" : "FALSE";
-- }
-- 
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 
-- int ieee802_1x_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen)
-- {
--@@ -2090,6 +2091,7 @@ int ieee802_1x_get_mib_sta(struct hostap
-- 	return len;
-- }
-- 
--+#endif
-- 
-- static void ieee802_1x_finished(struct hostapd_data *hapd,
-- 				struct sta_info *sta, int success)
----- a/src/ap/wpa_auth.c
--+++ b/src/ap/wpa_auth.c
--@@ -2708,6 +2708,7 @@ static const char * wpa_bool_txt(int boo
-- 	return bool ? "TRUE" : "FALSE";
-- }
-- 
--+#ifdef CONFIG_CTRL_IFACE_MIB
-- 
-- #define RSN_SUITE "%02x-%02x-%02x-%d"
-- #define RSN_SUITE_ARG(s) \
--@@ -2852,7 +2853,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
-- 
-- 	return len;
-- }
---
--+#endif
-- 
-- void wpa_auth_countermeasures_start(struct wpa_authenticator *wpa_auth)
-- {
----- a/src/rsn_supp/wpa.c
--+++ b/src/rsn_supp/wpa.c
--@@ -1844,6 +1844,8 @@ static u32 wpa_key_mgmt_suite(struct wpa
-- }
-- 
-- 
--+#ifdef CONFIG_CTRL_IFACE_MIB
--+
-- #define RSN_SUITE "%02x-%02x-%02x-%d"
-- #define RSN_SUITE_ARG(s) \
-- ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, ((s) >> 8) & 0xff, (s) & 0xff
--@@ -1927,6 +1929,7 @@ int wpa_sm_get_mib(struct wpa_sm *sm, ch
-- 
-- 	return (int) len;
-- }
--+#endif
-- #endif /* CONFIG_CTRL_IFACE */
-- 
-- 
-diff --git a/package/hostapd/patches/390-wpa_ie_cap_workaround.patch b/package/hostapd/patches/390-wpa_ie_cap_workaround.patch
-deleted file mode 100644
-index 00a3222..0000000
---- a/package/hostapd/patches/390-wpa_ie_cap_workaround.patch
-+++ /dev/null
-@@ -1,56 +0,0 @@
----- a/src/common/wpa_common.c
--+++ b/src/common/wpa_common.c
--@@ -959,6 +959,31 @@ const char * wpa_key_mgmt_txt(int key_mg
-- }
-- 
-- 
--+static void wpa_fixup_wpa_ie_rsn(u8 *assoc_ie, const u8 *wpa_msg_ie,
--+				 size_t rsn_ie_len)
--+{
--+	int pos, count;
--+
--+	pos = sizeof(struct rsn_ie_hdr) + RSN_SELECTOR_LEN;
--+	if (rsn_ie_len < pos + 2)
--+		return;
--+
--+	count = WPA_GET_LE16(wpa_msg_ie + pos);
--+	pos += 2 + count * RSN_SELECTOR_LEN;
--+	if (rsn_ie_len < pos + 2)
--+		return;
--+
--+	count = WPA_GET_LE16(wpa_msg_ie + pos);
--+	pos += 2 + count * RSN_SELECTOR_LEN;
--+	if (rsn_ie_len < pos + 2)
--+		return;
--+
--+	if (!assoc_ie[pos] && !assoc_ie[pos + 1] &&
--+	    (wpa_msg_ie[pos] || wpa_msg_ie[pos + 1]))
--+		memcpy(&assoc_ie[pos], &wpa_msg_ie[pos], 2);
--+}
--+
--+
-- int wpa_compare_rsn_ie(int ft_initial_assoc,
-- 		       const u8 *ie1, size_t ie1len,
-- 		       const u8 *ie2, size_t ie2len)
--@@ -966,8 +991,19 @@ int wpa_compare_rsn_ie(int ft_initial_as
-- 	if (ie1 == NULL || ie2 == NULL)
-- 		return -1;
-- 
---	if (ie1len == ie2len && os_memcmp(ie1, ie2, ie1len) == 0)
---		return 0; /* identical IEs */
--+	if (ie1len == ie2len) {
--+		u8 *ie_tmp;
--+
--+		if (os_memcmp(ie1, ie2, ie1len) == 0)
--+			return 0; /* identical IEs */
--+
--+		ie_tmp = alloca(ie1len);
--+		memcpy(ie_tmp, ie1, ie1len);
--+		wpa_fixup_wpa_ie_rsn(ie_tmp, ie2, ie1len);
--+
--+		if (os_memcmp(ie_tmp, ie2, ie1len) == 0)
--+			return 0; /* only mismatch in RSN capabilties */
--+	}
-- 
-- #ifdef CONFIG_IEEE80211R
-- 	if (ft_initial_assoc) {
-diff --git a/package/hostapd/patches/400-terminate_on_setup_failure.patch b/package/hostapd/patches/400-terminate_on_setup_failure.patch
-deleted file mode 100644
-index 0d9065a..0000000
---- a/package/hostapd/patches/400-terminate_on_setup_failure.patch
-+++ /dev/null
-@@ -1,85 +0,0 @@
----- a/src/ap/hostapd.c
--+++ b/src/ap/hostapd.c
--@@ -1103,13 +1103,8 @@ int hostapd_setup_interface_complete(str
-- 	size_t j;
-- 	u8 *prev_addr;
-- 
---	if (err) {
---		wpa_printf(MSG_ERROR, "Interface initialization failed");
---		hostapd_set_state(iface, HAPD_IFACE_DISABLED);
---		if (iface->interfaces && iface->interfaces->terminate_on_error)
---			eloop_terminate();
---		return -1;
---	}
--+	if (err)
--+		goto error;
-- 
-- 	wpa_printf(MSG_DEBUG, "Completing interface initialization");
-- 	if (iface->conf->channel) {
--@@ -1140,7 +1135,7 @@ int hostapd_setup_interface_complete(str
-- 				     hapd->iconf->vht_oper_centr_freq_seg1_idx)) {
-- 			wpa_printf(MSG_ERROR, "Could not set channel for "
-- 				   "kernel driver");
---			return -1;
--+			goto error;
-- 		}
-- 	}
-- 
--@@ -1151,7 +1146,7 @@ int hostapd_setup_interface_complete(str
-- 			hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211,
-- 				       HOSTAPD_LEVEL_WARNING,
-- 				       "Failed to prepare rates table.");
---			return -1;
--+			goto error;
-- 		}
-- 	}
-- 
--@@ -1159,14 +1154,14 @@ int hostapd_setup_interface_complete(str
-- 	    hostapd_set_rts(hapd, hapd->iconf->rts_threshold)) {
-- 		wpa_printf(MSG_ERROR, "Could not set RTS threshold for "
-- 			   "kernel driver");
---		return -1;
--+		goto error;
-- 	}
-- 
-- 	if (hapd->iconf->fragm_threshold > -1 &&
-- 	    hostapd_set_frag(hapd, hapd->iconf->fragm_threshold)) {
-- 		wpa_printf(MSG_ERROR, "Could not set fragmentation threshold "
-- 			   "for kernel driver");
---		return -1;
--+		goto error;
-- 	}
-- 
-- 	prev_addr = hapd->own_addr;
--@@ -1176,7 +1171,7 @@ int hostapd_setup_interface_complete(str
-- 		if (j)
-- 			os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN);
-- 		if (hostapd_setup_bss(hapd, j == 0))
---			return -1;
--+			goto error;
-- 		if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0)
-- 			prev_addr = hapd->own_addr;
-- 	}
--@@ -1191,7 +1186,7 @@ int hostapd_setup_interface_complete(str
-- 	if (hostapd_driver_commit(hapd) < 0) {
-- 		wpa_printf(MSG_ERROR, "%s: Failed to commit driver "
-- 			   "configuration", __func__);
---		return -1;
--+		goto error;
-- 	}
-- 
-- 	/*
--@@ -1216,6 +1211,13 @@ int hostapd_setup_interface_complete(str
-- 		iface->interfaces->terminate_on_error--;
-- 
-- 	return 0;
--+
--+error:
--+	wpa_printf(MSG_ERROR, "Interface initialization failed");
--+	hostapd_set_state(iface, HAPD_IFACE_DISABLED);
--+	if (iface->interfaces && iface->interfaces->terminate_on_error)
--+		eloop_terminate();
--+	return -1;
-- }
-- 
-- 
-diff --git a/package/hostapd/patches/410-bring_down_interface.patch b/package/hostapd/patches/410-bring_down_interface.patch
-deleted file mode 100644
-index 31033a0..0000000
---- a/package/hostapd/patches/410-bring_down_interface.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -8480,12 +8480,7 @@ static int wpa_driver_nl80211_set_mode(s
-- 			/* Try to set the mode again while the interface is
-- 			 * down */
-- 			ret = nl80211_set_mode(drv, drv->ifindex, nlmode);
---			if (ret == -EACCES)
---				break;
---			res = i802_set_iface_flags(bss, 1);
---			if (res && !ret)
---				ret = -1;
---			else if (ret != -EBUSY)
--+			if (ret != -EBUSY)
-- 				break;
-- 		} else
-- 			wpa_printf(MSG_DEBUG, "nl80211: Failed to set "
--@@ -8498,6 +8493,8 @@ static int wpa_driver_nl80211_set_mode(s
-- 			   "interface is down");
-- 		drv->nlmode = nlmode;
-- 		drv->ignore_if_down_event = 1;
--+		if (i802_set_iface_flags(bss, 1))
--+			ret = -1;
-- 	}
-- 
-- done:
-diff --git a/package/hostapd/patches/420-fix_wps_pin_crash.patch b/package/hostapd/patches/420-fix_wps_pin_crash.patch
-deleted file mode 100644
-index 130bd53..0000000
---- a/package/hostapd/patches/420-fix_wps_pin_crash.patch
-+++ /dev/null
-@@ -1,12 +0,0 @@
----- a/hostapd/ctrl_iface.c
--+++ b/hostapd/ctrl_iface.c
--@@ -480,6 +480,9 @@ static int hostapd_ctrl_iface_wps_ap_pin
-- 	char *pos;
-- 	const char *pin_txt;
-- 
--+	if (!hapd->wps)
--+		return -1;
--+
-- 	pos = os_strchr(txt, ' ');
-- 	if (pos)
-- 		*pos++ = '\0';
-diff --git a/package/hostapd/patches/430-wps_single_auth_enc_type.patch b/package/hostapd/patches/430-wps_single_auth_enc_type.patch
-deleted file mode 100644
-index 6e86658..0000000
---- a/package/hostapd/patches/430-wps_single_auth_enc_type.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
----- a/src/ap/wps_hostapd.c
--+++ b/src/ap/wps_hostapd.c
--@@ -1069,11 +1069,9 @@ int hostapd_init_wps(struct hostapd_data
-- 
-- 		if (conf->rsn_pairwise & WPA_CIPHER_CCMP)
-- 			wps->encr_types |= WPS_ENCR_AES;
---		if (conf->rsn_pairwise & WPA_CIPHER_TKIP)
--+		else if (conf->rsn_pairwise & WPA_CIPHER_TKIP)
-- 			wps->encr_types |= WPS_ENCR_TKIP;
---	}
---
---	if (conf->wpa & WPA_PROTO_WPA) {
--+	} else if (conf->wpa & WPA_PROTO_WPA) {
-- 		if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK)
-- 			wps->auth_types |= WPS_AUTH_WPAPSK;
-- 		if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X)
--@@ -1081,7 +1079,7 @@ int hostapd_init_wps(struct hostapd_data
-- 
-- 		if (conf->wpa_pairwise & WPA_CIPHER_CCMP)
-- 			wps->encr_types |= WPS_ENCR_AES;
---		if (conf->wpa_pairwise & WPA_CIPHER_TKIP)
--+		else if (conf->wpa_pairwise & WPA_CIPHER_TKIP)
-- 			wps->encr_types |= WPS_ENCR_TKIP;
-- 	}
-- 
-diff --git a/package/hostapd/patches/440-dynamic_20_40_mhz.patch b/package/hostapd/patches/440-dynamic_20_40_mhz.patch
-deleted file mode 100644
-index 905ec2c..0000000
---- a/package/hostapd/patches/440-dynamic_20_40_mhz.patch
-+++ /dev/null
-@@ -1,206 +0,0 @@
----- a/hostapd/config_file.c
--+++ b/hostapd/config_file.c
--@@ -2422,6 +2422,10 @@ static int hostapd_config_fill(struct ho
-- 					   "ht_capab", line);
-- 				errors++;
-- 			}
--+		} else if (os_strcmp(buf, "dynamic_ht40") == 0) {
--+			conf->dynamic_ht40 = atoi(pos);
--+			if (conf->dynamic_ht40 == 1)
--+				conf->dynamic_ht40 = 1500;
-- 		} else if (os_strcmp(buf, "require_ht") == 0) {
-- 			conf->require_ht = atoi(pos);
-- 		} else if (os_strcmp(buf, "obss_interval") == 0) {
----- a/src/ap/ap_config.h
--+++ b/src/ap/ap_config.h
--@@ -531,6 +531,7 @@ struct hostapd_config {
-- 	int ieee80211n;
-- 	int secondary_channel;
-- 	int require_ht;
--+	int dynamic_ht40;
-- 	int obss_interval;
-- 	u32 vht_capab;
-- 	int ieee80211ac;
----- a/src/ap/hostapd.c
--+++ b/src/ap/hostapd.c
--@@ -23,6 +23,7 @@
-- #include "beacon.h"
-- #include "iapp.h"
-- #include "ieee802_1x.h"
--+#include "ieee802_11.h"
-- #include "ieee802_11_auth.h"
-- #include "vlan_init.h"
-- #include "wpa_auth.h"
--@@ -332,6 +333,7 @@ static void hostapd_cleanup(struct hosta
-- static void hostapd_cleanup_iface_partial(struct hostapd_iface *iface)
-- {
-- 	wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface);
--+	hostapd_deinit_ht(iface);
-- 	hostapd_free_hw_features(iface->hw_features, iface->num_hw_features);
-- 	iface->hw_features = NULL;
-- 	os_free(iface->current_rates);
----- a/src/ap/hostapd.h
--+++ b/src/ap/hostapd.h
--@@ -326,6 +326,9 @@ struct hostapd_iface {
-- 	/* Overlapping BSS information */
-- 	int olbc_ht;
-- 
--+	int force_20mhz;
--+	struct os_time last_20mhz_trigger;
--+
-- 	u16 ht_op_mode;
-- 
-- 	/* surveying helpers */
----- a/src/ap/ieee802_11.c
--+++ b/src/ap/ieee802_11.c
--@@ -1538,6 +1538,9 @@ static void handle_beacon(struct hostapd
-- 					     sizeof(mgmt->u.beacon)), &elems,
-- 				      0);
-- 
--+	if (!elems.ht_capabilities)
--+		hostapd_trigger_20mhz(hapd->iface);
--+
-- 	ap_list_process_beacon(hapd->iface, mgmt, &elems, fi);
-- }
-- 
----- a/src/ap/ieee802_11.h
--+++ b/src/ap/ieee802_11.h
--@@ -82,4 +82,17 @@ int hostapd_update_time_adv(struct hosta
-- void hostapd_client_poll_ok(struct hostapd_data *hapd, const u8 *addr);
-- u8 * hostapd_eid_bss_max_idle_period(struct hostapd_data *hapd, u8 *eid);
-- 
--+#ifdef CONFIG_IEEE80211N
--+void hostapd_trigger_20mhz(struct hostapd_iface *iface);
--+void hostapd_deinit_ht(struct hostapd_iface *iface);
--+
--+#else
--+static inline void hostapd_deinit_ht(struct hostapd_iface *iface)
--+{
--+}
--+static inline void hostapd_trigger_20mhz(struct hostapd_iface *iface)
--+{
--+}
--+#endif /* CONFIG_IEEE80211N */
--+
-- #endif /* IEEE802_11_H */
----- a/src/ap/ieee802_11_ht.c
--+++ b/src/ap/ieee802_11_ht.c
--@@ -20,9 +20,11 @@
-- #include "drivers/driver.h"
-- #include "hostapd.h"
-- #include "ap_config.h"
--+#include "ap_drv_ops.h"
-- #include "sta_info.h"
-- #include "beacon.h"
-- #include "ieee802_11.h"
--+#include "utils/eloop.h"
-- 
-- 
-- u8 * hostapd_eid_ht_capabilities(struct hostapd_data *hapd, u8 *eid)
--@@ -86,12 +88,15 @@ u8 * hostapd_eid_ht_operation(struct hos
-- 
-- 	oper->control_chan = hapd->iconf->channel;
-- 	oper->operation_mode = host_to_le16(hapd->iface->ht_op_mode);
---	if (hapd->iconf->secondary_channel == 1)
---		oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE |
---			HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH;
---	if (hapd->iconf->secondary_channel == -1)
---		oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW |
---			HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH;
--+
--+	if (!hapd->iface->force_20mhz) {
--+		if (hapd->iconf->secondary_channel == 1)
--+			oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE |
--+				HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH;
--+		if (hapd->iconf->secondary_channel == -1)
--+			oper->ht_param |= HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW |
--+				HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH;
--+	}
-- 
-- 	pos += sizeof(*oper);
-- 
--@@ -286,3 +291,84 @@ void hostapd_get_ht_capab(struct hostapd
-- 
-- 	neg_ht_cap->ht_capabilities_info = host_to_le16(cap);
-- }
--+
--+static void hostapd_set_force_20mhz(struct hostapd_iface *iface);
--+
--+static void hostapd_restore_40mhz(void *eloop_data, void *user_ctx)
--+{
--+	struct hostapd_iface *iface = eloop_data;
--+	struct os_time time;
--+	int timeout;
--+
--+	if (!iface->last_20mhz_trigger.sec)
--+	    return;
--+
--+	os_get_time(&time);
--+	timeout = iface->last_20mhz_trigger.sec + iface->conf->dynamic_ht40 -
--+		  time.sec;
--+
--+	if (timeout > 0) {
--+		eloop_register_timeout(timeout, 0, hostapd_restore_40mhz,
--+				       iface, NULL);
--+		return;
--+	}
--+
--+	iface->last_20mhz_trigger.sec = 0;
--+	iface->last_20mhz_trigger.usec = 0;
--+
--+	iface->force_20mhz = 0;
--+	hostapd_set_force_20mhz(iface);
--+}
--+
--+static void hostapd_set_force_20mhz(struct hostapd_iface *iface)
--+{
--+	int secondary_channel;
--+	int i;
--+
--+	ieee802_11_set_beacons(iface);
--+
--+	for (i = 0; i < iface->num_bss; i++) {
--+		struct hostapd_data *hapd = iface->bss[i];
--+
--+		if (iface->force_20mhz)
--+			secondary_channel = 0;
--+		else
--+			secondary_channel = hapd->iconf->secondary_channel;
--+
--+		if (hostapd_set_freq(hapd, hapd->iconf->hw_mode, iface->freq,
--+				     hapd->iconf->channel,
--+				     hapd->iconf->ieee80211n,
--+				     hapd->iconf->ieee80211ac,
--+				     secondary_channel,
--+				     hapd->iconf->vht_oper_chwidth,
--+				     hapd->iconf->vht_oper_centr_freq_seg0_idx,
--+				     hapd->iconf->vht_oper_centr_freq_seg1_idx)) {
--+			wpa_printf(MSG_ERROR, "Could not set channel for "
--+				   "kernel driver");
--+		}
--+	}
--+}
--+
--+void hostapd_deinit_ht(struct hostapd_iface *iface)
--+{
--+	eloop_cancel_timeout(hostapd_restore_40mhz, iface, NULL);
--+}
--+
--+void hostapd_trigger_20mhz(struct hostapd_iface *iface)
--+{
--+	if (!iface->conf->dynamic_ht40)
--+		return;
--+
--+	if (!iface->force_20mhz) {
--+		iface->force_20mhz = 1;
--+		hostapd_set_force_20mhz(iface);
--+	}
--+
--+	if (!iface->last_20mhz_trigger.sec) {
--+		eloop_cancel_timeout(hostapd_restore_40mhz, iface, NULL);
--+		eloop_register_timeout(iface->conf->dynamic_ht40, 0,
--+				       hostapd_restore_40mhz, iface, NULL);
--+	}
--+
--+	os_get_time(&iface->last_20mhz_trigger);
--+}
-diff --git a/package/hostapd/patches/450-limit_debug_messages.patch b/package/hostapd/patches/450-limit_debug_messages.patch
-deleted file mode 100644
-index aaea941..0000000
---- a/package/hostapd/patches/450-limit_debug_messages.patch
-+++ /dev/null
-@@ -1,213 +0,0 @@
----- a/src/utils/wpa_debug.c
--+++ b/src/utils/wpa_debug.c
--@@ -201,7 +201,7 @@ void wpa_debug_close_linux_tracing(void)
--  *
--  * Note: New line '\n' is added to the end of the text when printing to stdout.
--  */
---void wpa_printf(int level, const char *fmt, ...)
--+void _wpa_printf(int level, const char *fmt, ...)
-- {
-- 	va_list ap;
-- 
--@@ -248,8 +248,8 @@ void wpa_printf(int level, const char *f
-- }
-- 
-- 
---static void _wpa_hexdump(int level, const char *title, const u8 *buf,
---			 size_t len, int show)
--+void _wpa_hexdump(int level, const char *title, const u8 *buf,
--+		  size_t len, int show)
-- {
-- 	size_t i;
-- 
--@@ -375,20 +375,9 @@ static void _wpa_hexdump(int level, cons
-- #endif /* CONFIG_ANDROID_LOG */
-- }
-- 
---void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len)
---{
---	_wpa_hexdump(level, title, buf, len, 1);
---}
---
---
---void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len)
---{
---	_wpa_hexdump(level, title, buf, len, wpa_debug_show_keys);
---}
-- 
---
---static void _wpa_hexdump_ascii(int level, const char *title, const u8 *buf,
---			       size_t len, int show)
--+void _wpa_hexdump_ascii(int level, const char *title, const u8 *buf,
--+			size_t len, int show)
-- {
-- 	size_t i, llen;
-- 	const u8 *pos = buf;
--@@ -495,19 +484,6 @@ static void _wpa_hexdump_ascii(int level
-- }
-- 
-- 
---void wpa_hexdump_ascii(int level, const char *title, const u8 *buf, size_t len)
---{
---	_wpa_hexdump_ascii(level, title, buf, len, 1);
---}
---
---
---void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf,
---			   size_t len)
---{
---	_wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys);
---}
---
---
-- #ifdef CONFIG_DEBUG_FILE
-- static char *last_path = NULL;
-- #endif /* CONFIG_DEBUG_FILE */
--@@ -591,7 +567,7 @@ void wpa_msg_register_ifname_cb(wpa_msg_
-- }
-- 
-- 
---void wpa_msg(void *ctx, int level, const char *fmt, ...)
--+void _wpa_msg(void *ctx, int level, const char *fmt, ...)
-- {
-- 	va_list ap;
-- 	char *buf;
--@@ -625,7 +601,7 @@ void wpa_msg(void *ctx, int level, const
-- }
-- 
-- 
---void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
--+void _wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
-- {
-- 	va_list ap;
-- 	char *buf;
----- a/src/utils/wpa_debug.h
--+++ b/src/utils/wpa_debug.h
--@@ -43,6 +43,17 @@ int wpa_debug_open_file(const char *path
-- int wpa_debug_reopen_file(void);
-- void wpa_debug_close_file(void);
-- 
--+/* internal */
--+void _wpa_hexdump(int level, const char *title, const u8 *buf,
--+		  size_t len, int show);
--+void _wpa_hexdump_ascii(int level, const char *title, const u8 *buf,
--+			size_t len, int show);
--+extern int wpa_debug_show_keys;
--+
--+#ifndef CONFIG_MSG_MIN_PRIORITY
--+#define CONFIG_MSG_MIN_PRIORITY 0
--+#endif
--+
-- /**
--  * wpa_debug_printf_timestamp - Print timestamp for debug output
--  *
--@@ -63,9 +74,15 @@ void wpa_debug_print_timestamp(void);
--  *
--  * Note: New line '\n' is added to the end of the text when printing to stdout.
--  */
---void wpa_printf(int level, const char *fmt, ...)
--+void _wpa_printf(int level, const char *fmt, ...)
-- PRINTF_FORMAT(2, 3);
-- 
--+#define wpa_printf(level, ...)						\
--+	do {								\
--+		if (level >= CONFIG_MSG_MIN_PRIORITY)			\
--+			_wpa_printf(level, __VA_ARGS__);		\
--+	} while(0)
--+
-- /**
--  * wpa_hexdump - conditional hex dump
--  * @level: priority level (MSG_*) of the message
--@@ -77,7 +94,13 @@ PRINTF_FORMAT(2, 3);
--  * output may be directed to stdout, stderr, and/or syslog based on
--  * configuration. The contents of buf is printed out has hex dump.
--  */
---void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len);
--+static inline void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len)
--+{
--+	if (level < CONFIG_MSG_MIN_PRIORITY)
--+		return;
--+
--+	_wpa_hexdump(level, title, buf, len, 1);
--+}
-- 
-- static inline void wpa_hexdump_buf(int level, const char *title,
-- 				   const struct wpabuf *buf)
--@@ -99,7 +122,13 @@ static inline void wpa_hexdump_buf(int l
--  * like wpa_hexdump(), but by default, does not include secret keys (passwords,
--  * etc.) in debug output.
--  */
---void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len);
--+static inline void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len)
--+{
--+	if (level < CONFIG_MSG_MIN_PRIORITY)
--+		return;
--+
--+	_wpa_hexdump(level, title, buf, len, wpa_debug_show_keys);
--+}
-- 
-- static inline void wpa_hexdump_buf_key(int level, const char *title,
-- 				       const struct wpabuf *buf)
--@@ -121,8 +150,14 @@ static inline void wpa_hexdump_buf_key(i
--  * the hex numbers and ASCII characters (for printable range) are shown. 16
--  * bytes per line will be shown.
--  */
---void wpa_hexdump_ascii(int level, const char *title, const u8 *buf,
---		       size_t len);
--+static inline void wpa_hexdump_ascii(int level, const char *title,
--+				     const u8 *buf, size_t len)
--+{
--+	if (level < CONFIG_MSG_MIN_PRIORITY)
--+		return;
--+
--+	_wpa_hexdump_ascii(level, title, buf, len, 1);
--+}
-- 
-- /**
--  * wpa_hexdump_ascii_key - conditional hex dump, hide keys
--@@ -138,8 +173,14 @@ void wpa_hexdump_ascii(int level, const 
--  * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by
--  * default, does not include secret keys (passwords, etc.) in debug output.
--  */
---void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf,
---			   size_t len);
--+static inline void wpa_hexdump_ascii_key(int level, const char *title,
--+					 const u8 *buf, size_t len)
--+{
--+	if (level < CONFIG_MSG_MIN_PRIORITY)
--+		return;
--+
--+	_wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys);
--+}
-- 
-- /*
--  * wpa_dbg() behaves like wpa_msg(), but it can be removed from build to reduce
--@@ -174,7 +215,12 @@ void wpa_hexdump_ascii_key(int level, co
--  *
--  * Note: New line '\n' is added to the end of the text when printing to stdout.
--  */
---void wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4);
--+void _wpa_msg(void *ctx, int level, const char *fmt, ...) PRINTF_FORMAT(3, 4);
--+#define wpa_msg(ctx, level, ...)					\
--+	do {								\
--+		if (level >= CONFIG_MSG_MIN_PRIORITY)			\
--+			_wpa_msg(ctx, level, __VA_ARGS__);		\
--+	} while(0)
-- 
-- /**
--  * wpa_msg_ctrl - Conditional printf for ctrl_iface monitors
--@@ -188,8 +234,13 @@ void wpa_msg(void *ctx, int level, const
--  * attached ctrl_iface monitors. In other words, it can be used for frequent
--  * events that do not need to be sent to syslog.
--  */
---void wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
--+void _wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
-- PRINTF_FORMAT(3, 4);
--+#define wpa_msg_ctrl(ctx, level, ...)					\
--+	do {								\
--+		if (level >= CONFIG_MSG_MIN_PRIORITY)			\
--+			_wpa_msg_ctrl(ctx, level, __VA_ARGS__);		\
--+	} while(0)
-- 
-- /**
--  * wpa_msg_global - Global printf for ctrl_iface monitors
-diff --git a/package/hostapd/patches/460-indicate-features.patch b/package/hostapd/patches/460-indicate-features.patch
-deleted file mode 100644
-index 7a44da1..0000000
---- a/package/hostapd/patches/460-indicate-features.patch
-+++ /dev/null
-@@ -1,82 +0,0 @@
----- a/hostapd/main.c
--+++ b/hostapd/main.c
--@@ -14,6 +14,7 @@
-- 
-- #include "utils/common.h"
-- #include "utils/eloop.h"
--+#include "utils/build_features.h"
-- #include "crypto/random.h"
-- #include "crypto/tls.h"
-- #include "common/version.h"
--@@ -546,7 +547,7 @@ int main(int argc, char *argv[])
-- 
-- 	wpa_supplicant_event = hostapd_wpa_event;
-- 	for (;;) {
---		c = getopt(argc, argv, "b:Bde:f:hKP:Ttvg:G:");
--+		c = getopt(argc, argv, "b:Bde:f:hKP:Ttg:G:v::");
-- 		if (c < 0)
-- 			break;
-- 		switch (c) {
--@@ -583,6 +584,8 @@ int main(int argc, char *argv[])
-- 			break;
-- #endif /* CONFIG_DEBUG_LINUX_TRACING */
-- 		case 'v':
--+			if (optarg)
--+				exit(!has_feature(optarg));
-- 			show_version();
-- 			exit(1);
-- 			break;
----- a/wpa_supplicant/main.c
--+++ b/wpa_supplicant/main.c
--@@ -12,6 +12,7 @@
-- #endif /* __linux__ */
-- 
-- #include "common.h"
--+#include "build_features.h"
-- #include "wpa_supplicant_i.h"
-- #include "driver_i.h"
-- #include "p2p_supplicant.h"
--@@ -161,7 +162,7 @@ int main(int argc, char *argv[])
-- 
-- 	for (;;) {
-- 		c = getopt(argc, argv,
---			   "b:Bc:C:D:de:f:g:G:hH:i:I:KLNo:O:p:P:qsTtuvW");
--+			   "b:Bc:C:D:de:f:g:G:hH:i:I:KLNo:O:p:P:qsTtuv::W");
-- 		if (c < 0)
-- 			break;
-- 		switch (c) {
--@@ -259,8 +260,12 @@ int main(int argc, char *argv[])
-- 			break;
-- #endif /* CONFIG_DBUS */
-- 		case 'v':
---			printf("%s\n", wpa_supplicant_version);
---			exitcode = 0;
--+			if (optarg) {
--+				exitcode = !has_feature(optarg);
--+			} else {
--+				printf("%s\n", wpa_supplicant_version);
--+				exitcode = 0;
--+			}
-- 			goto out;
-- 		case 'W':
-- 			params.wait_for_monitor++;
----- /dev/null
--+++ b/src/utils/build_features.h
--@@ -0,0 +1,17 @@
--+#ifndef BUILD_FEATURES_H
--+#define BUILD_FEATURES_H
--+
--+static inline int has_feature(const char *feat)
--+{
--+#ifdef IEEE8021X_EAPOL
--+	if (!strcmp(feat, "eap"))
--+		return 1;
--+#endif
--+#ifdef IEEE80211N
--+	if (!strcmp(feat, "11n"))
--+		return 1;
--+#endif
--+	return 0;
--+}
--+
--+#endif /* BUILD_FEATURES_H */
-diff --git a/package/hostapd/patches/470-hostapd_cli_ifdef.patch b/package/hostapd/patches/470-hostapd_cli_ifdef.patch
-deleted file mode 100644
-index 5ac0fdd..0000000
---- a/package/hostapd/patches/470-hostapd_cli_ifdef.patch
-+++ /dev/null
-@@ -1,50 +0,0 @@
----- a/hostapd/hostapd_cli.c
--+++ b/hostapd/hostapd_cli.c
--@@ -67,7 +67,6 @@ static const char *commands_help =
-- #ifdef CONFIG_IEEE80211W
-- "   sa_query <addr>      send SA Query to a station\n"
-- #endif /* CONFIG_IEEE80211W */
---#ifdef CONFIG_WPS
-- "   wps_pin <uuid> <pin> [timeout] [addr]  add WPS Enrollee PIN\n"
-- "   wps_check_pin <PIN>  verify PIN checksum\n"
-- "   wps_pbc              indicate button pushed to initiate PBC\n"
--@@ -80,7 +79,6 @@ static const char *commands_help =
-- "   wps_ap_pin <cmd> [params..]  enable/disable AP PIN\n"
-- "   wps_config <SSID> <auth> <encr> <key>  configure AP\n"
-- "   wps_get_status       show current WPS status\n"
---#endif /* CONFIG_WPS */
-- "   get_config           show current configuration\n"
-- "   help                 show this usage help\n"
-- "   interface [ifname]   show interfaces/select interface\n"
--@@ -352,7 +350,6 @@ static int hostapd_cli_cmd_sa_query(stru
-- #endif /* CONFIG_IEEE80211W */
-- 
-- 
---#ifdef CONFIG_WPS
-- static int hostapd_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc,
-- 				   char *argv[])
-- {
--@@ -578,7 +575,6 @@ static int hostapd_cli_cmd_wps_config(st
-- 			 ssid_hex, argv[1]);
-- 	return wpa_ctrl_command(ctrl, buf);
-- }
---#endif /* CONFIG_WPS */
-- 
-- 
-- static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc,
--@@ -903,7 +899,6 @@ static struct hostapd_cli_cmd hostapd_cl
-- #ifdef CONFIG_IEEE80211W
-- 	{ "sa_query", hostapd_cli_cmd_sa_query },
-- #endif /* CONFIG_IEEE80211W */
---#ifdef CONFIG_WPS
-- 	{ "wps_pin", hostapd_cli_cmd_wps_pin },
-- 	{ "wps_check_pin", hostapd_cli_cmd_wps_check_pin },
-- 	{ "wps_pbc", hostapd_cli_cmd_wps_pbc },
--@@ -917,7 +912,6 @@ static struct hostapd_cli_cmd hostapd_cl
-- 	{ "wps_ap_pin", hostapd_cli_cmd_wps_ap_pin },
-- 	{ "wps_config", hostapd_cli_cmd_wps_config },
-- 	{ "wps_get_status", hostapd_cli_cmd_wps_get_status },
---#endif /* CONFIG_WPS */
-- 	{ "disassoc_imminent", hostapd_cli_cmd_disassoc_imminent },
-- 	{ "ess_disassoc", hostapd_cli_cmd_ess_disassoc },
-- 	{ "get_config", hostapd_cli_cmd_get_config },
-diff --git a/package/hostapd/patches/471-wpa_cli_ifdef.patch b/package/hostapd/patches/471-wpa_cli_ifdef.patch
-deleted file mode 100644
-index cc84444..0000000
---- a/package/hostapd/patches/471-wpa_cli_ifdef.patch
-+++ /dev/null
-@@ -1,13 +0,0 @@
----- a/wpa_supplicant/wpa_cli.c
--+++ b/wpa_supplicant/wpa_cli.c
--@@ -26,6 +26,10 @@
-- #endif /* ANDROID */
-- 
-- 
--+#ifndef CONFIG_P2P
--+#define CONFIG_P2P
--+#endif
--+
-- static const char *wpa_cli_version =
-- "wpa_cli v" VERSION_STR "\n"
-- "Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi> and contributors";
-diff --git a/package/hostapd/patches/480-max_num_sta_probe.patch b/package/hostapd/patches/480-max_num_sta_probe.patch
-deleted file mode 100644
-index e5ca8b4..0000000
---- a/package/hostapd/patches/480-max_num_sta_probe.patch
-+++ /dev/null
-@@ -1,13 +0,0 @@
----- a/src/ap/beacon.c
--+++ b/src/ap/beacon.c
--@@ -501,6 +501,10 @@ void handle_probe_req(struct hostapd_dat
-- 		return;
-- 	}
-- 
--+	if (!sta && hapd->num_sta >= hapd->conf->max_num_sta)
--+		wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " ignored,"
--+			   " too many connected stations.", MAC2STR(mgmt->sa));
--+
-- #ifdef CONFIG_INTERWORKING
-- 	if (elems.interworking && elems.interworking_len >= 1) {
-- 		u8 ant = elems.interworking[0] & 0x0f;
-diff --git a/package/hostapd/patches/490-scan_wait.patch b/package/hostapd/patches/490-scan_wait.patch
-deleted file mode 100644
-index 61715d6..0000000
---- a/package/hostapd/patches/490-scan_wait.patch
-+++ /dev/null
-@@ -1,66 +0,0 @@
----- a/hostapd/main.c
--+++ b/hostapd/main.c
--@@ -33,6 +33,8 @@
-- extern int wpa_debug_level;
-- extern int wpa_debug_show_keys;
-- extern int wpa_debug_timestamp;
--+static int daemonize = 0;
--+static char *pid_file = NULL;
-- 
-- extern struct wpa_driver_ops *wpa_drivers[];
-- 
--@@ -147,6 +149,14 @@ static void hostapd_logger_cb(void *ctx,
-- }
-- #endif /* CONFIG_NO_HOSTAPD_LOGGER */
-- 
--+static void hostapd_setup_complete_cb(void *ctx)
--+{
--+	if (daemonize && os_daemonize(pid_file)) {
--+		perror("daemon");
--+		return;
--+	}
--+	daemonize = 0;
--+}
-- 
-- /**
--  * hostapd_driver_init - Preparate driver interface
--@@ -165,6 +175,8 @@ static int hostapd_driver_init(struct ho
-- 		return -1;
-- 	}
-- 
--+	hapd->setup_complete_cb = hostapd_setup_complete_cb;
--+
-- 	/* Initialize the driver interface */
-- 	if (!(b[0] | b[1] | b[2] | b[3] | b[4] | b[5]))
-- 		b = NULL;
--@@ -381,8 +393,6 @@ static void hostapd_global_deinit(const 
-- #endif /* CONFIG_NATIVE_WINDOWS */
-- 
-- 	eap_server_unregister_methods();
---
---	os_daemonize_terminate(pid_file);
-- }
-- 
-- 
--@@ -408,11 +418,6 @@ static int hostapd_global_run(struct hap
-- 	}
-- #endif /* EAP_SERVER_TNC */
-- 
---	if (daemonize && os_daemonize(pid_file)) {
---		perror("daemon");
---		return -1;
---	}
---
-- 	eloop_run();
-- 
-- 	return 0;
--@@ -521,8 +526,7 @@ int main(int argc, char *argv[])
-- 	struct hapd_interfaces interfaces;
-- 	int ret = 1;
-- 	size_t i, j;
---	int c, debug = 0, daemonize = 0;
---	char *pid_file = NULL;
--+	int c, debug = 0;
-- 	const char *log_file = NULL;
-- 	const char *entropy_file = NULL;
-- 	char **bss_config = NULL, **tmp_bss;
-diff --git a/package/hostapd/patches/500-wpa_supplicant-add-new-config-params-to-be-used-with.patch b/package/hostapd/patches/500-wpa_supplicant-add-new-config-params-to-be-used-with.patch
-deleted file mode 100644
-index 544151e..0000000
---- a/package/hostapd/patches/500-wpa_supplicant-add-new-config-params-to-be-used-with.patch
-+++ /dev/null
-@@ -1,209 +0,0 @@
--From 4bb69d15477e0f2b00e166845341dc933de47c58 Mon Sep 17 00:00:00 2001
--From: Antonio Quartulli <ordex@autistici.org>
--Date: Sun, 3 Jun 2012 18:22:56 +0200
--Subject: [PATCHv2 601/602] wpa_supplicant: add new config params to be used
-- with the ibss join command
--
--Signed-hostap: Antonio Quartulli <ordex@autistici.org>
-----
-- src/drivers/driver.h            |    6 +++
-- wpa_supplicant/config.c         |   96 +++++++++++++++++++++++++++++++++++++++
-- wpa_supplicant/config_ssid.h    |    6 +++
-- wpa_supplicant/wpa_supplicant.c |   23 +++++++---
-- 4 files changed, 124 insertions(+), 7 deletions(-)
--
----- a/src/drivers/driver.h
--+++ b/src/drivers/driver.h
--@@ -19,6 +19,7 @@
-- 
-- #define WPA_SUPPLICANT_DRIVER_VERSION 4
-- 
--+#include "drivers/nl80211_copy.h"
-- #include "common/defs.h"
-- #include "utils/list.h"
-- 
--@@ -404,6 +405,11 @@ struct wpa_driver_associate_params {
-- 	 */
-- 	int freq;
-- 
--+	int beacon_interval;
--+	int fixed_freq;
--+	unsigned char rates[NL80211_MAX_SUPP_RATES];
--+	int mcast_rate;
--+
-- 	/**
-- 	 * bg_scan_period - Background scan period in seconds, 0 to disable
-- 	 * background scan, or -1 to indicate no change to default driver
----- a/wpa_supplicant/config.c
--+++ b/wpa_supplicant/config.c
--@@ -14,6 +14,7 @@
-- #include "rsn_supp/wpa.h"
-- #include "eap_peer/eap.h"
-- #include "p2p/p2p.h"
--+#include "drivers/nl80211_copy.h"
-- #include "config.h"
-- 
-- 
--@@ -1512,6 +1513,97 @@ static char * wpa_config_write_psk_list(
-- 
-- #endif /* CONFIG_P2P */
-- 
--+static int wpa_config_parse_mcast_rate(const struct parse_data *data,
--+				       struct wpa_ssid *ssid, int line,
--+				       const char *value)
--+{
--+	ssid->mcast_rate = (int)(strtod(value, NULL) * 10);
--+
--+	return 0;
--+}
--+
--+#ifndef NO_CONFIG_WRITE
--+static char * wpa_config_write_mcast_rate(const struct parse_data *data,
--+					  struct wpa_ssid *ssid)
--+{
--+	char *value;
--+	int res;
--+
--+	if (!ssid->mcast_rate == 0)
--+		return NULL;
--+
--+	value = os_malloc(6); /* longest: 300.0 */
--+	if (value == NULL)
--+		return NULL;
--+	res = os_snprintf(value, 5, "%.1f", (double)ssid->mcast_rate / 10);
--+	if (res < 0) {
--+		os_free(value);
--+		return NULL;
--+	}
--+	return value;
--+}
--+#endif /* NO_CONFIG_WRITE */
--+
--+static int wpa_config_parse_rates(const struct parse_data *data,
--+				  struct wpa_ssid *ssid, int line,
--+				  const char *value)
--+{
--+	int i;
--+	char *pos, *r, *sptr, *end;
--+	double rate;
--+
--+	pos = (char *)value;
--+	r = strtok_r(pos, ",", &sptr);
--+	i = 0;
--+	while (pos && i < NL80211_MAX_SUPP_RATES) {
--+		rate = 0.0;
--+		if (r)
--+			rate = strtod(r, &end);
--+		ssid->rates[i] = rate * 2;
--+		if (*end != '\0' || rate * 2 != ssid->rates[i])
--+			return 1;
--+
--+		i++;
--+		r = strtok_r(NULL, ",", &sptr);
--+	}
--+
--+	return 0;
--+}
--+
--+#ifndef NO_CONFIG_WRITE
--+static char * wpa_config_write_rates(const struct parse_data *data,
--+				     struct wpa_ssid *ssid)
--+{
--+	char *value, *pos;
--+	int res, i;
--+
--+	if (ssid->rates[0] <= 0)
--+		return NULL;
--+
--+	value = os_malloc(6 * NL80211_MAX_SUPP_RATES + 1);
--+	if (value == NULL)
--+		return NULL;
--+	pos = value;
--+	for (i = 0; i < NL80211_MAX_SUPP_RATES - 1; i++) {
--+		res = os_snprintf(pos, 6, "%.1f,", (double)ssid->rates[i] / 2);
--+		if (res < 0) {
--+			os_free(value);
--+			return NULL;
--+		}
--+		pos += res;
--+	}
--+	res = os_snprintf(pos, 6, "%.1f",
--+			  (double)ssid->rates[NL80211_MAX_SUPP_RATES - 1] / 2);
--+	if (res < 0) {
--+		os_free(value);
--+		return NULL;
--+	}
--+
--+	value[6 * NL80211_MAX_SUPP_RATES] = '\0';
--+	return value;
--+}
--+#endif /* NO_CONFIG_WRITE */
--+
-- /* Helper macros for network block parser */
-- 
-- #ifdef OFFSET
--@@ -1715,6 +1807,9 @@ static const struct parse_data ssid_fiel
-- 	{ INT(ap_max_inactivity) },
-- 	{ INT(dtim_period) },
-- 	{ INT(beacon_int) },
--+	{ INT_RANGE(fixed_freq, 0, 1) },
--+	{ FUNC(rates) },
--+	{ FUNC(mcast_rate) },
-- };
-- 
-- #undef OFFSET
----- a/wpa_supplicant/config_ssid.h
--+++ b/wpa_supplicant/config_ssid.h
--@@ -12,6 +12,7 @@
-- #include "common/defs.h"
-- #include "utils/list.h"
-- #include "eap_peer/eap_config.h"
--+#include "drivers/nl80211_copy.h"
-- 
-- #define MAX_SSID_LEN 32
-- 
--@@ -620,6 +621,10 @@ struct wpa_ssid {
-- 	 * dereferences since it may not be updated in all cases.
-- 	 */
-- 	void *parent_cred;
--+
--+	int fixed_freq;
--+	unsigned char rates[NL80211_MAX_SUPP_RATES];
--+	double mcast_rate;
-- };
-- 
-- #endif /* CONFIG_SSID_H */
----- a/wpa_supplicant/wpa_supplicant.c
--+++ b/wpa_supplicant/wpa_supplicant.c
--@@ -1623,15 +1623,24 @@ void wpa_supplicant_associate(struct wpa
-- 		params.ssid_len = ssid->ssid_len;
-- 	}
-- 
---	if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
---	    wpa_s->conf->ap_scan == 2) {
---		params.bssid = ssid->bssid;
---		params.fixed_bssid = 1;
--+	if (ssid->mode == WPAS_MODE_IBSS) {
--+		if (ssid->bssid_set && wpa_s->conf->ap_scan == 2) {
--+			params.bssid = ssid->bssid;
--+			params.fixed_bssid = 1;
--+		}
--+		if (ssid->frequency > 0 && params.freq == 0)
--+			/* Initial channel for IBSS */
--+			params.freq = ssid->frequency;
--+		params.fixed_freq = ssid->fixed_freq;
--+		params.beacon_interval = ssid->beacon_int;
--+		i = 0;
--+		while (i < NL80211_MAX_SUPP_RATES) {
--+			params.rates[i] = ssid->rates[i];
--+			i++;
--+		}
--+		params.mcast_rate = ssid->mcast_rate;
-- 	}
-- 
---	if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
---	    params.freq == 0)
---		params.freq = ssid->frequency; /* Initial channel for IBSS */
-- 	params.wpa_ie = wpa_ie;
-- 	params.wpa_ie_len = wpa_ie_len;
-- 	params.pairwise_suite = cipher_pairwise;
-diff --git a/package/hostapd/patches/501-driver_nl80211-use-new-parameters-during-ibss-join.patch b/package/hostapd/patches/501-driver_nl80211-use-new-parameters-during-ibss-join.patch
-deleted file mode 100644
-index 565bbc9..0000000
---- a/package/hostapd/patches/501-driver_nl80211-use-new-parameters-during-ibss-join.patch
-+++ /dev/null
-@@ -1,59 +0,0 @@
--From ffc4445958a3ed4064f2e1bf73fa478a61c5cf7b Mon Sep 17 00:00:00 2001
--From: Antonio Quartulli <ordex@autistici.org>
--Date: Sun, 3 Jun 2012 18:42:25 +0200
--Subject: [PATCHv2 602/602] driver_nl80211: use new parameters during ibss join
--
--Signed-hostap: Antonio Quartulli <ordex@autistici.org>
-----
-- src/drivers/driver_nl80211.c |   33 ++++++++++++++++++++++++++++++++-
-- 1 file changed, 32 insertions(+), 1 deletion(-)
--
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -7903,7 +7903,7 @@ static int wpa_driver_nl80211_ibss(struc
-- 				   struct wpa_driver_associate_params *params)
-- {
-- 	struct nl_msg *msg;
---	int ret = -1;
--+	int ret = -1, i;
-- 	int count = 0;
-- 
-- 	wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
--@@ -7936,6 +7936,37 @@ retry:
-- 	wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
-- 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
-- 
--+	if (params->fixed_freq) {
--+		wpa_printf(MSG_DEBUG, "  * fixed_freq");
--+		NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
--+	}
--+
--+	if (params->beacon_interval > 0) {
--+		wpa_printf(MSG_DEBUG, "  * beacon_interval=%d",
--+			   params->beacon_interval);
--+		NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL,
--+			    params->beacon_interval);
--+	}
--+
--+	if (params->rates[0] > 0) {
--+		wpa_printf(MSG_DEBUG, "  * basic_rates:");
--+		i = 0;
--+		while (i < NL80211_MAX_SUPP_RATES &&
--+		       params->rates[i] > 0) {
--+			wpa_printf(MSG_DEBUG, "    %.1f",
--+				   (double)params->rates[i] / 2);
--+			i++;
--+		}
--+		NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, i,
--+			params->rates);
--+	}
--+
--+	if (params->mcast_rate > 0) {
--+		wpa_printf(MSG_DEBUG, "  * mcast_rates=%.1f",
--+			   (double)params->mcast_rate / 10);
--+		NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
--+	}
--+
-- 	ret = nl80211_set_conn_keys(params, msg);
-- 	if (ret)
-- 		goto nla_put_failure;
-diff --git a/package/hostapd/patches/502-wpa_s-support-htmode-param.patch b/package/hostapd/patches/502-wpa_s-support-htmode-param.patch
-deleted file mode 100644
-index adb20a2..0000000
---- a/package/hostapd/patches/502-wpa_s-support-htmode-param.patch
-+++ /dev/null
-@@ -1,156 +0,0 @@
--From b9329c5dfeed7d5c55d2117d8dfe326fc40c8fb1 Mon Sep 17 00:00:00 2001
--From: Antonio Quartulli <ordex@autistici.org>
--Date: Tue, 3 Jul 2012 00:36:24 +0200
--Subject: [PATCH] wpa_s: support htmode param
--
--possible values are HT20, HT40-, HT40+ and NOHT
--
--Signed-off-by: Antonio Quartulli <ordex@autistici.org>
-----
-- src/drivers/driver.h            |    2 ++
-- src/drivers/driver_nl80211.c    |   16 ++++++++++
-- wpa_supplicant/config.c         |   66 +++++++++++++++++++++++++++++++++++++++
-- wpa_supplicant/config_ssid.h    |    2 ++
-- wpa_supplicant/wpa_supplicant.c |    2 ++
-- 5 files changed, 88 insertions(+)
--
----- a/src/drivers/driver.h
--+++ b/src/drivers/driver.h
--@@ -409,6 +409,8 @@ struct wpa_driver_associate_params {
-- 	int fixed_freq;
-- 	unsigned char rates[NL80211_MAX_SUPP_RATES];
-- 	int mcast_rate;
--+	int ht_set;
--+	unsigned int htmode;
-- 
-- 	/**
-- 	 * bg_scan_period - Background scan period in seconds, 0 to disable
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -7967,6 +7967,22 @@ retry:
-- 		NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
-- 	}
-- 
--+	if (params->ht_set) {
--+		switch(params->htmode) {
--+			case NL80211_CHAN_HT20:
--+				wpa_printf(MSG_DEBUG, "  * ht=HT20");
--+				break;
--+			case NL80211_CHAN_HT40PLUS:
--+				wpa_printf(MSG_DEBUG, "  * ht=HT40+");
--+				break;
--+			case NL80211_CHAN_HT40MINUS:
--+				wpa_printf(MSG_DEBUG, "  * ht=HT40-");
--+				break;
--+		}
--+		NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
--+			    params->htmode);
--+	}
--+
-- 	ret = nl80211_set_conn_keys(params, msg);
-- 	if (ret)
-- 		goto nla_put_failure;
----- a/wpa_supplicant/config.c
--+++ b/wpa_supplicant/config.c
--@@ -1544,6 +1544,71 @@ static char * wpa_config_write_mcast_rat
-- }
-- #endif /* NO_CONFIG_WRITE */
-- 
--+static int wpa_config_parse_htmode(const struct parse_data *data,
--+				   struct wpa_ssid *ssid, int line,
--+				   const char *value)
--+{
--+	int i;
--+	static const struct {
--+		const char *name;
--+		unsigned int val;
--+	} htmap[] = {
--+		{ .name = "HT20", .val = NL80211_CHAN_HT20, },
--+		{ .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
--+		{ .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
--+		{ .name = "NOHT", .val = NL80211_CHAN_NO_HT, },
--+	};
--+	ssid->ht_set = 0;;
--+	for (i = 0; i < 4; i++) {
--+		if (strcasecmp(htmap[i].name, value) == 0) {
--+			ssid->htmode = htmap[i].val;
--+			ssid->ht_set = 1;
--+			break;
--+		}
--+	}
--+
--+	return 0;
--+}
--+
--+#ifndef NO_CONFIG_WRITE
--+static char * wpa_config_write_htmode(const struct parse_data *data,
--+				      struct wpa_ssid *ssid)
--+{
--+	char *value;
--+	int res;
--+
--+	value = os_malloc(6); /* longest: HT40+ */
--+	if (value == NULL)
--+		return NULL;
--+
--+	switch(ssid->htmode) {
--+		case NL80211_CHAN_HT20:
--+			res = os_snprintf(value, 4, "HT20");
--+			break;
--+		case NL80211_CHAN_HT40PLUS:
--+			res = os_snprintf(value, 5, "HT40+");
--+			break;
--+		case NL80211_CHAN_HT40MINUS:
--+			res = os_snprintf(value, 5, "HT40-");
--+			break;
--+		case NL80211_CHAN_NO_HT:
--+			res = os_snprintf(value, 4, "NOHT");
--+			break;
--+		default:
--+			os_free(value);
--+			return NULL;
--+	}
--+
--+	if (res < 0) {
--+		os_free(value);
--+		return NULL;
--+	}
--+
--+	return value;
--+}
--+#endif /* NO_CONFIG_WRITE */
--+
--+
-- static int wpa_config_parse_rates(const struct parse_data *data,
-- 				  struct wpa_ssid *ssid, int line,
-- 				  const char *value)
--@@ -1810,6 +1875,7 @@ static const struct parse_data ssid_fiel
-- 	{ INT_RANGE(fixed_freq, 0, 1) },
-- 	{ FUNC(rates) },
-- 	{ FUNC(mcast_rate) },
--+	{ FUNC(htmode) },
-- };
-- 
-- #undef OFFSET
----- a/wpa_supplicant/config_ssid.h
--+++ b/wpa_supplicant/config_ssid.h
--@@ -625,6 +625,8 @@ struct wpa_ssid {
-- 	int fixed_freq;
-- 	unsigned char rates[NL80211_MAX_SUPP_RATES];
-- 	double mcast_rate;
--+	int ht_set;
--+	unsigned int htmode;
-- };
-- 
-- #endif /* CONFIG_SSID_H */
----- a/wpa_supplicant/wpa_supplicant.c
--+++ b/wpa_supplicant/wpa_supplicant.c
--@@ -1639,6 +1639,8 @@ void wpa_supplicant_associate(struct wpa
-- 			i++;
-- 		}
-- 		params.mcast_rate = ssid->mcast_rate;
--+		params.ht_set = ssid->ht_set;
--+		params.htmode = ssid->htmode;
-- 	}
-- 
-- 	params.wpa_ie = wpa_ie;
-diff --git a/package/hostapd/patches/510-wpa_supplicant_p2p_parse_ifcomb.patch b/package/hostapd/patches/510-wpa_supplicant_p2p_parse_ifcomb.patch
-deleted file mode 100644
-index fe72ee2..0000000
---- a/package/hostapd/patches/510-wpa_supplicant_p2p_parse_ifcomb.patch
-+++ /dev/null
-@@ -1,18 +0,0 @@
----- a/src/drivers/driver_nl80211.c
--+++ b/src/drivers/driver_nl80211.c
--@@ -3157,10 +3157,12 @@ static int wiphy_info_iface_comb_process
-- 	}
-- 
-- 	if (combination_has_p2p && combination_has_mgd) {
---		info->p2p_concurrent = 1;
---		info->num_multichan_concurrent =
--+		int num_channels =
-- 			nla_get_u32(tb_comb[NL80211_IFACE_COMB_NUM_CHANNELS]);
---		return 1;
--+
--+		info->p2p_concurrent = 1;
--+		if (info->num_multichan_concurrent < num_channels)
--+			info->num_multichan_concurrent = num_channels;
-- 	}
-- 
-- 	return 0;
-diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile
-deleted file mode 100644
-index d9149d9..0000000
---- a/package/mac80211/Makefile
-+++ /dev/null
-@@ -1,1856 +0,0 @@
--#
--# Copyright (C) 2007-2013 OpenWrt.org
--#
--# This is free software, licensed under the GNU General Public License v2.
--# See /LICENSE for more information.
--#
--
--include $(TOPDIR)/rules.mk
--include $(INCLUDE_DIR)/kernel.mk
--
--PKG_NAME:=mac80211
--
--PKG_VERSION:=2014-01-23.1
--PKG_RELEASE:=1
--PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
--PKG_BACKPORT_VERSION:=
--PKG_MD5SUM:=8db16edbdaf4abc2e9c2f3b6c86736a6
--
--PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
--PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
--PKG_BUILD_PARALLEL:=1
--
--PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
--
--PKG_DRIVERS = \
--	adm8211 ath5k libertas-usb libertas-sd p54-common p54-pci p54-usb p54-spi \
--	rt2x00-lib rt2x00-pci rt2x00-usb rt2800-lib rt2400-pci rt2500-pci \
--	rt2500-usb rt61-pci rt73-usb rt2800-mmio rt2800-pci rt2800-usb rt2800-soc \
--	rtl8180 rtl8187 zd1211rw mac80211-hwsim carl9170 b43 b43legacy \
--	ath9k-common ath9k ath9k-htc ath10k ath net-libipw net-ipw2100 net-ipw2200 \
--	mwl8k net-hermes net-hermes-pci net-hermes-plx net-hermes-pcmcia \
--	iwl-legacy iwl3945 iwl4965 iwlagn wlcore wl12xx wl18xx lib80211 \
--	rtlwifi rtlwifi-pci rtlwifi-usb rtl8192c-common rtl8192ce rtl8192se \
--	rtl8192de rtl8192cu
--
--PKG_CONFIG_DEPENDS:= \
--	CONFIG_PACKAGE_kmod-mac80211 \
--	$(patsubst %,CONFIG_PACKAGE_kmod-%,$(PKG_DRIVERS)) \
--	CONFIG_PACKAGE_MAC80211_DEBUGFS \
--	CONFIG_PACKAGE_MAC80211_MESH \
--	CONFIG_PACKAGE_ATH_DEBUG \
--	CONFIG_PACKAGE_B43_DEBUG \
--	CONFIG_PACKAGE_B43_PIO \
--	CONFIG_PACKAGE_B43_N_PHY \
--	CONFIG_PACKAGE_RTLWIFI_DEBUG \
--	CONFIG_ATH_USER_REGD \
--
--include $(INCLUDE_DIR)/package.mk
--
--WMENU:=Wireless Drivers
--
--define KernelPackage/mac80211/Default
--  SUBMENU:=$(WMENU)
--  URL:=http://linuxwireless.org/
--  MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
--  DEPENDS:=@(!(TARGET_avr32||TARGET_ps3||TARGET_pxcab)||BROKEN)
--endef
--
--define KernelPackage/cfg80211
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=cfg80211 - wireless configuration API
--  DEPENDS+= +iw
--  FILES:= \
--	$(PKG_BUILD_DIR)/compat/compat.ko \
--	$(PKG_BUILD_DIR)/net/wireless/cfg80211.ko
--  AUTOLOAD:=$(call AutoLoad,20,compat cfg80211)
--endef
--
--define KernelPackage/cfg80211/description
--cfg80211 is the Linux wireless LAN (802.11) configuration API.
--endef
--
--define KernelPackage/mac80211
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Linux 802.11 Wireless Networking Stack
--  DEPENDS+= +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +kmod-cfg80211
--  KCONFIG:=\
--	CONFIG_AVERAGE=y
--  FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko
--  AUTOLOAD:=$(call AutoLoad,21,mac80211)
--  MENU:=1
--endef
--
--define KernelPackage/mac80211/config
--  if PACKAGE_kmod-mac80211
--
--	config PACKAGE_MAC80211_DEBUGFS
--		bool "Export mac80211 internals in DebugFS"
--		select KERNEL_DEBUG_FS
--		select KERNEL_RELAY if PACKAGE_kmod-ath9k-common
--		default y
--		help
--		  Select this to see extensive information about
--		  the internal state of mac80211 in debugfs.
--
--	config PACKAGE_MAC80211_MESH
--		bool "Enable 802.11s mesh support"
--		default y
--
--  endif
--endef
--
--define KernelPackage/mac80211/description
--Generic IEEE 802.11 Networking Stack (mac80211)
--endef
--
--PKG_LINUX_FIRMWARE_NAME:=linux-firmware
--PKG_LINUX_FIRMWARE_VERSION:=7d0c7a8cfd78388d90cc784a185b19dcbdbce824
--PKG_LINUX_FIRMWARE_SOURCE:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION).tar.bz2
--PKG_LINUX_FIRMWARE_PROTO:=git
--PKG_LINUX_FIRMWARE_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
--PKG_LINUX_FIRMWARE_SUBDIR:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION)
--PKG_LINUX_FIRMWARE_MIRROR_MD5SUM:=837a1a9456c1ec8b428cc0b2b08a331b
--
--define Download/linux-firmware
--  FILE:=$(PKG_LINUX_FIRMWARE_SOURCE)
--  URL:=$(PKG_LINUX_FIRMWARE_SOURCE_URL)
--  MD5SUM:=$(PKG_LINUX_FIRMWARE_MD5SUM)
--  PROTO:=$(PKG_LINUX_FIRMWARE_PROTO)
--  VERSION:=$(PKG_LINUX_FIRMWARE_VERSION)
--  SUBDIR:=$(PKG_LINUX_FIRMWARE_SUBDIR)
--  MIRROR_MD5SUM:=$(PKG_LINUX_FIRMWARE_MIRROR_MD5SUM)
--endef
--$(eval $(call Download,linux-firmware))
--
--PKG_ATH10K_LINUX_FIRMWARE_NAME:=ath10k-firmware
--PKG_ATH10K_LINUX_FIRMWARE_VERSION:=d86e78e5c6be34329936c8bd73a212700437be2e
--PKG_ATH10K_LINUX_FIRMWARE_SOURCE:=$(PKG_ATH10K_LINUX_FIRMWARE_NAME)-$(PKG_ATH10K_LINUX_FIRMWARE_VERSION).tar.bz2
--PKG_ATH10K_LINUX_FIRMWARE_PROTO:=git
--PKG_ATH10K_LINUX_FIRMWARE_SOURCE_URL:=https://github.com/kvalo/ath10k-firmware.git
--PKG_ATH10K_LINUX_FIRMWARE_SUBDIR:=$(PKG_ATH10K_LINUX_FIRMWARE_NAME)-$(PKG_ATH10K_LINUX_FIRMWARE_VERSION)
--#PKG_ATH10K_LINUX_FIRMWARE_MIRROR_MD5SUM:=?
--
--define Download/ath10k-firmware
--  FILE:=$(PKG_ATH10K_LINUX_FIRMWARE_SOURCE)
--  URL:=$(PKG_ATH10K_LINUX_FIRMWARE_SOURCE_URL)
--  PROTO:=$(PKG_ATH10K_LINUX_FIRMWARE_PROTO)
--  VERSION:=$(PKG_ATH10K_LINUX_FIRMWARE_VERSION)
--  SUBDIR:=$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)
--  #MIRROR_MD5SUM:=$(PKG_ATH10K_LINUX_FIRMWARE_MIRROR_MD5SUM)
--endef
--$(eval $(call Download,ath10k-firmware))
--
--# Prism54 drivers
--P54PCIFW:=2.13.12.0.arm
--P54USBFW:=2.13.24.0.lm87.arm
--P54SPIFW:=2.13.0.0.a.13.14.arm
--
--define Download/p54usb
--  FILE:=$(P54USBFW)
--  URL:=http://daemonizer.de/prism54/prism54-fw/fw-usb
--  MD5SUM:=8e8ab005a4f8f0123bcdc51bc25b47f6
--endef
--$(eval $(call Download,p54usb))
--
--define Download/p54pci
--  FILE:=$(P54PCIFW)
--  URL:=http://daemonizer.de/prism54/prism54-fw/fw-softmac
--  MD5SUM:=ff7536af2092b1c4b21315bd103ef4c4
--endef
--$(eval $(call Download,p54pci))
--
--define Download/p54spi
--  FILE:=$(P54SPIFW)
--  URL:=http://daemonizer.de/prism54/prism54-fw/stlc4560
--  MD5SUM:=42661f8ecbadd88012807493f596081d
--endef
--$(eval $(call Download,p54spi))
--
--define KernelPackage/p54/Default
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Prism54 Drivers
--endef
--
--define KernelPackage/p54/description
--  Kernel module for Prism54 chipsets (mac80211)
--endef
--
--define KernelPackage/p54-common
--  $(call KernelPackage/p54/Default)
--  DEPENDS+= @PCI_SUPPORT||@USB_SUPPORT||@TARGET_omap24xx +kmod-mac80211 +kmod-lib-crc-ccitt
--  TITLE+= (COMMON)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54common.ko
--  AUTOLOAD:=$(call AutoLoad,30,p54common)
--endef
--
--define KernelPackage/p54-pci
--  $(call KernelPackage/p54/Default)
--  TITLE+= (PCI)
--  DEPENDS+= @PCI_SUPPORT +kmod-p54-common
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54pci.ko
--  AUTOLOAD:=$(call AutoLoad,31,p54pci)
--endef
--
--define KernelPackage/p54-usb
--  $(call KernelPackage/p54/Default)
--  TITLE+= (USB)
--  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-p54-common
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54usb.ko
--  AUTOLOAD:=$(call AutoLoad,31,p54usb)
--endef
--
--define KernelPackage/p54-spi
--  $(call KernelPackage/p54/Default)
--  TITLE+= (SPI)
--  DEPENDS+= @TARGET_omap24xx +kmod-p54-common
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54spi.ko
--  AUTOLOAD:=$(call AutoLoad,31,p54spi)
--endef
--
--define KernelPackage/rt2x00/Default
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Ralink Drivers for RT2x00 cards
--endef
--
--define KernelPackage/rt2x00-lib
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-mac80211 +kmod-lib-crc-itu-t
--  TITLE+= (LIB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00lib.ko
--  AUTOLOAD:=$(call AutoLoad,24,rt2x00lib)
--  MENU:=1
--endef
--
--define KernelPackage/rt2x00-lib/config
--  if PACKAGE_kmod-rt2x00-lib
--
--	config PACKAGE_RT2X00_LIB_DEBUGFS
--		bool "Enable rt2x00 debugfs support"
--		depends on PACKAGE_MAC80211_DEBUGFS
--		help
--		  Enable creation of debugfs files for the rt2x00 drivers.
--		  These debugfs files support both reading and writing of the
--		  most important register types of the rt2x00 hardware.
--
--	config PACKAGE_RT2X00_DEBUG
--		bool "Enable rt2x00 debug output"
--		help
--		  Enable debugging output for all rt2x00 modules
--
--  endif
--endef
--
--define KernelPackage/rt2x00-mmio
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-eeprom-93cx6
--  HIDDEN:=1
--  TITLE+= (MMIO)
--  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00mmio.ko
--  AUTOLOAD:=$(call AutoLoad,25,rt2x00mmio)
--endef
--
--define KernelPackage/rt2x00-pci
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-mmio +kmod-rt2x00-lib
--  HIDDEN:=1
--  TITLE+= (PCI)
--  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00pci.ko
--  AUTOLOAD:=$(call AutoLoad,26,rt2x00pci)
--endef
--
--define KernelPackage/rt2x00-usb
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-lib +kmod-usb-core
--  HIDDEN:=1
--  TITLE+= (USB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00usb.ko
--  AUTOLOAD:=$(call AutoLoad,26,rt2x00usb)
--endef
--
--define KernelPackage/rt2800-lib
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-lib-crc-ccitt +@DRIVER_11N_SUPPORT
--  HIDDEN:=1
--  TITLE+= (rt2800 LIB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800lib.ko
--  AUTOLOAD:=$(call AutoLoad,27,rt2800lib)
--endef
--
--define KernelPackage/rt2400-pci
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
--  TITLE+= (RT2400 PCI)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2400pci.ko
--  AUTOLOAD:=$(call AutoLoad,27,rt2400pci)
--endef
--
--define KernelPackage/rt2500-pci
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
--  TITLE+= (RT2500 PCI)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2500pci.ko
--  AUTOLOAD:=$(call AutoLoad,27,rt2500pci)
--endef
--
--define KernelPackage/rt2500-usb
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb
--  TITLE+= (RT2500 USB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2500usb.ko
--  AUTOLOAD:=$(call AutoLoad,27,rt2500usb)
--endef
--
--define KernelPackage/rt61-pci
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
--  TITLE+= (RT2x61 PCI)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt61pci.ko
--  AUTOLOAD:=$(call AutoLoad,27,rt61pci)
--endef
--
--define KernelPackage/rt73-usb
--  $(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb
--  TITLE+= (RT73 USB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt73usb.ko
--  AUTOLOAD:=$(call AutoLoad,27,rt73usb)
--endef
--
--define KernelPackage/rt2800-mmio
--$(call KernelPackage/rt2x00/Default)
--  TITLE += (RT28xx/RT3xxx MMIO)
--  DEPENDS += +kmod-rt2800-lib +kmod-rt2x00-mmio
--  HIDDEN:=1
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800mmio.ko
--  AUTOLOAD:=$(call AutoLoad,28,rt2800mmio)
--endef
--
--define KernelPackage/rt2800-soc
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS += @TARGET_ramips_rt305x +kmod-rt2800-mmio +kmod-rt2800-lib
--  TITLE += (RT28xx/RT3xxx SoC)
--  FILES := \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00soc.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800soc.ko
--  AUTOLOAD:=$(call AutoLoad,29,rt2x00soc rt2800soc)
--endef
--
--define KernelPackage/rt2800-pci
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci +kmod-rt2800-lib +kmod-rt2800-mmio
--  TITLE+= (RT2860 PCI)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800pci.ko
--  AUTOLOAD:=$(call AutoLoad,29,rt2800pci)
--endef
--
--define KernelPackage/rt2800-usb
--$(call KernelPackage/rt2x00/Default)
--  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb +kmod-rt2800-lib +kmod-lib-crc-ccitt
--  TITLE+= (RT2870 USB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800usb.ko
--  AUTOLOAD:=$(call AutoLoad,28,rt2800usb)
--endef
--
--define KernelPackage/rtl818x/Default
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek Drivers for RTL818x devices
--  URL:=http://wireless.kernel.org/en/users/Drivers/rtl8187
--  DEPENDS+= +kmod-eeprom-93cx6 +kmod-mac80211
--endef
--
--define KernelPackage/rtl8180
--  $(call KernelPackage/rtl818x/Default)
--  DEPENDS+= @PCI_SUPPORT
--  TITLE+= (RTL8180 PCI)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8180/rtl8180.ko
--  AUTOLOAD:=$(call AutoLoad,27,rtl8180)
--endef
--
--define KernelPackage/rtl8187
--$(call KernelPackage/rtl818x/Default)
--  DEPENDS+= @USB_SUPPORT +kmod-usb-core
--  TITLE+= (RTL8187 USB)
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8187/rtl8187.ko
--  AUTOLOAD:=$(call AutoLoad,27,rtl8187)
--endef
--
--define KernelPackage/rtlwifi/config
--	menu "Configuration"
--		depends on PACKAGE_kmod-rtlwifi
--
--	config PACKAGE_RTLWIFI_DEBUG
--		bool "Realtek wireless debugging"
--		help
--		  Say Y, if you want to debug realtek wireless drivers.
--
--	endmenu
--endef
--
--define KernelPackage/rtlwifi
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek common driver part
--  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT) +kmod-mac80211 +@DRIVER_11N_SUPPORT
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtlwifi.ko
--  AUTOLOAD:=$(call AutoLoad,60,rtlwifi)
--  MENU:=1
--endef
--
--define KernelPackage/rtlwifi-pci
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek common driver part (PCI support)
--  DEPENDS+= @PCI_SUPPORT +kmod-rtlwifi
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl_pci.ko
--  AUTOLOAD:=$(call AutoLoad,61,rtl_pci)
--  HIDDEN:=1
--endef
--
--define KernelPackage/rtlwifi-usb
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek common driver part (USB support)
--  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-rtlwifi
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl_usb.ko
--  AUTOLOAD:=$(call AutoLoad,61,rtl_usb)
--  HIDDEN:=1
--endef
--
--define KernelPackage/rtl8192c-common
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek RTL8192CE/RTL8192CU common support module
--  DEPENDS+= +kmod-rtlwifi
--  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192c/rtl8192c-common.ko
--  AUTOLOAD:=$(call AutoLoad,62,rtl8192c-common)
--  HIDDEN:=1
--endef
--
--define KernelPackage/rtl8192ce
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek RTL8192CE/RTL8188CE support
--  DEPENDS+= +kmod-rtlwifi-pci +kmod-rtl8192c-common
--  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192ce.ko
--  AUTOLOAD:=$(call AutoLoad,63,rtl8192ce)
--endef
--
--define KernelPackage/rtl8192ce/install
--	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cfw.bin $(1)/lib/firmware/rtlwifi
--endef
--
--define KernelPackage/rtl8192se
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek RTL8192SE/RTL8191SE support
--  DEPENDS+= +kmod-rtlwifi-pci
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192se/rtl8192se.ko
--  AUTOLOAD:=$(call AutoLoad,63,rtl8192se)
--endef
--
--define KernelPackage/rtl8192se/install
--	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192sefw.bin $(1)/lib/firmware/rtlwifi
--endef
--
--define KernelPackage/rtl8192de
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek RTL8192DE/RTL8188DE support
--  DEPENDS+= +kmod-rtlwifi-pci
--  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192de/rtl8192de.ko
--  AUTOLOAD:=$(call AutoLoad,63,rtl8192de)
--endef
--
--define KernelPackage/rtl8192de/install
--	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192defw.bin $(1)/lib/firmware/rtlwifi
--endef
--
--define KernelPackage/rtl8192cu
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Realtek RTL8192CU/RTL8188CU support
--  DEPENDS+= +kmod-rtlwifi-usb +kmod-rtl8192c-common
--  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192cu/rtl8192cu.ko
--  AUTOLOAD:=$(call AutoLoad,63,rtl8192cu)
--endef
--
--define KernelPackage/rtl8192cu/install
--	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cufw.bin $(1)/lib/firmware/rtlwifi
--endef
--
--ZD1211FW_NAME:=zd1211-firmware
--ZD1211FW_VERSION:=1.4
--define Download/zd1211rw
--  FILE:=$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
--  URL:=@SF/zd1211/
--  MD5SUM:=19f28781d76569af8551c9d11294c870
--endef
--$(eval $(call Download,zd1211rw))
--
--define KernelPackage/zd1211rw
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Zydas ZD1211 support
--  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-mac80211
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/zd1211rw/zd1211rw.ko
--  AUTOLOAD:=$(call AutoLoad,60,zd1211rw)
--endef
--
--define KernelPackage/adm8211
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=ADMTek 8211 support
--  DEPENDS+=@PCI_SUPPORT +kmod-mac80211 +kmod-eeprom-93cx6
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/adm8211.ko
--  AUTOLOAD:=$(call AutoLoad,60,adm8211)
--endef
--
--define KernelPackage/ath/config
--  if PACKAGE_kmod-ath
--	config ATH_USER_REGD
--		bool "Force Atheros drivers to respect the user's regdomain settings"
--		help
--		  Atheros' idea of regulatory handling is that the EEPROM of the card defines
--		  the regulatory limits and the user is only allowed to restrict the settings
--		  even further, even if the country allows frequencies or power levels that
--		  are forbidden by the EEPROM settings.
--
--		  Select this option if you want the driver to respect the user's decision about
--		  regulatory settings.
--
--	config PACKAGE_ATH_DEBUG
--		bool "Atheros wireless debugging"
--		help
--		  Say Y, if you want to debug atheros wireless drivers.
--		  Right now only ath9k makes use of this.
--  endif
--endef
--
--define KernelPackage/ath
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Atheros common driver part
--  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_atheros +kmod-mac80211
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko
--  AUTOLOAD:=$(call AutoLoad,26,ath)
--  MENU:=1
--endef
--
--define KernelPackage/ath/description
-- This module contains some common parts needed by Atheros Wireless drivers.
--endef
--
--define KernelPackage/ath5k
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Atheros 5xxx wireless cards support
--  URL:=http://linuxwireless.org/en/users/Drivers/ath5k
--  DEPENDS+= @PCI_SUPPORT||@TARGET_atheros +kmod-ath
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.ko
--  AUTOLOAD:=$(call AutoLoad,27,ath5k)
--endef
--
--define KernelPackage/ath5k/description
-- This module adds support for wireless adapters based on
-- Atheros 5xxx chipset.
--endef
--
--define KernelPackage/ath9k-common
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc)
--  URL:=http://linuxwireless.org/en/users/Drivers/ath9k
--  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx +kmod-ath +@DRIVER_11N_SUPPORT
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
--  AUTOLOAD:=$(call AutoLoad,27,ath9k_hw ath9k_common)
--endef
--
--define KernelPackage/ath9k
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Atheros 802.11n PCI wireless cards support
--  URL:=http://linuxwireless.org/en/users/Drivers/ath9k
--  DEPENDS+= @PCI_SUPPORT||TARGET_ar71xx +kmod-ath9k-common
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko
--  AUTOLOAD:=$(call AutoLoad,28,ath9k)
--endef
--
--define KernelPackage/ath9k/description
--This module adds support for wireless adapters based on
--Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
--endef
--
--define KernelPackage/ath9k-htc
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Atheros 802.11n USB device support
--  URL:=http://linuxwireless.org/en/users/Drivers/ath9k
--  DEPENDS+= @USB_SUPPORT +kmod-ath9k-common +kmod-usb-core
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
--  AUTOLOAD:=$(call AutoLoad,55,ath9k_htc)
--endef
--
--define KernelPackage/ath9k-htc/description
--This module adds support for wireless adapters based on
--Atheros USB AR9271 and AR7010 family of chipsets.
--endef
--
--define KernelPackage/ath10k
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Atheros 802.11ac wireless cards support
--  URL:=http://wireless.kernel.org/en/users/Drivers/ath10k
--  DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
--  AUTOLOAD:=$(call AutoLoad,55,ath10k_core ath10k_pci)
--endef
--
--define KernelPackage/ath10k/description
--This module adds support for wireless adapters based on
--Atheros IEEE 802.11ac family of chipsets. For now only
--PCI is supported.
--endef
--
--define KernelPackage/carl9170
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Driver for Atheros AR9170 USB sticks
--  DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko
--  AUTOLOAD:=$(call AutoLoad,60,carl9170)
--endef
--
--define KernelPackage/lib80211
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=802.11 Networking stack
--  DEPENDS:=+kmod-cfg80211
--  FILES:= \
--	$(PKG_BUILD_DIR)/net/wireless/lib80211.ko \
--	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_wep.ko \
--	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_ccmp.ko \
--	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_tkip.ko
--  AUTOLOAD:=$(call AutoLoad,21, \
--	lib80211 \
--	lib80211_crypt_wep \
--	lib80211_crypt_ccmp \
--	lib80211_crypt_tkip \
--  )
--endef
--
--define KernelPackage/lib80211/description
-- Kernel modules for 802.11 Networking stack
-- Includes:
-- - lib80211
-- - lib80211_crypt_wep
-- - lib80211_crypt_tkip
-- - lib80211_crytp_ccmp
--endef
--
--define KernelPackage/libertas-usb
--  $(call KernelPackage/mac80211/Default)
--  DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT
--  TITLE:=Marvell 88W8015 Wireless Driver
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/usb8xxx.ko
--  AUTOLOAD:=$(call AutoLoad,27,libertas usb8xxx)
--endef
--
--define KernelPackage/libertas-sd
--  $(call KernelPackage/mac80211/Default)
--  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT
--  TITLE:=Marvell 88W8686 Wireless Driver
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas_sdio.ko
--  AUTOLOAD:=$(call AutoLoad,91,libertas libertas_sdio)
--endef
--
--define KernelPackage/mac80211-hwsim
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=mac80211 HW simulation device
--  DEPENDS+= +kmod-mac80211
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko
--  AUTOLOAD:=$(call AutoLoad,60,mac80211_hwsim)
--endef
--
--define KernelPackage/net-libipw
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=libipw for ipw2100 and ipw2200
--  DEPENDS:=@PCI_SUPPORT +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/libipw.ko
--  AUTOLOAD:=$(call AutoLoad,49,libipw)
--endef
--
--define KernelPackage/net-libipw/description
-- Hardware independent IEEE 802.11 networking stack for ipw2100 and ipw2200.
--endef
--
--IPW2100_NAME:=ipw2100-fw
--IPW2100_VERSION:=1.3
--
--define Download/net-ipw2100
--  URL:=http://bughost.org/firmware/
--  FILE:=$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
--  MD5SUM=46aa75bcda1a00efa841f9707bbbd113
--endef
--$(eval $(call Download,net-ipw2100))
--
--define KernelPackage/net-ipw2100
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Intel IPW2100 driver
--  DEPENDS:=@PCI_SUPPORT +kmod-net-libipw
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/ipw2100.ko
--  AUTOLOAD:=$(call AutoLoad,50,ipw2100)
--endef
--
--define KernelPackage/net-ipw2100/description
-- Kernel support for Intel IPW2100
-- Includes:
-- - ipw2100
--endef
--
--IPW2200_NAME:=ipw2200-fw
--IPW2200_VERSION:=3.1
--
--define Download/net-ipw2200
--  URL:=http://bughost.org/firmware/
--  FILE:=$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
--  MD5SUM=eaba788643c7cc7483dd67ace70f6e99
--endef
--$(eval $(call Download,net-ipw2200))
--
--define KernelPackage/net-ipw2200
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Intel IPW2200 driver
--  DEPENDS:=@PCI_SUPPORT +kmod-net-libipw
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/ipw2200.ko
--  AUTOLOAD:=$(call AutoLoad,50,ipw2200)
--endef
--
--define KernelPackage/net-ipw2200/description
-- Kernel support for Intel IPW2200
-- Includes:
-- - ipw2200
--endef
--
--
--define KernelPackage/net-hermes
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Hermes 802.11b chipset support
--  DEPENDS:=@PCI_SUPPORT||PCMCIA_SUPPORT +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco.ko
--  AUTOLOAD:=$(call AutoLoad,50,orinoco)
--endef
--
--define KernelPackage/net-hermes/description
-- Kernel support for Hermes 802.11b chipsets
--endef
--
--define KernelPackage/net-hermes-pci
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Intersil Prism 2.5 PCI support
--  DEPENDS:=@PCI_SUPPORT +kmod-net-hermes
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_pci.ko
--  AUTOLOAD:=$(call AutoLoad,55,orinoco_pci)
--endef
--
--define KernelPackage/net-hermes-pci/description
-- Kernel modules for Intersil Prism 2.5 PCI support
--endef
--
--define KernelPackage/net-hermes-plx
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=PLX9052 based PCI adaptor
--  DEPENDS:=@PCI_SUPPORT +kmod-net-hermes
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_plx.ko
--  AUTOLOAD:=$(call AutoLoad,55,orinoco_plx)
--endef
--
--define KernelPackage/net-hermes-plx/description
-- Kernel modules for Hermes in PLX9052 based PCI adaptors
--endef
--
--define KernelPackage/net-hermes-pcmcia
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Hermes based PCMCIA adaptors
--  DEPENDS:=@PCMCIA_SUPPORT +kmod-net-hermes @BROKEN
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_cs.ko
--  AUTOLOAD:=$(call AutoLoad,55,orinoco_cs)
--endef
--
--define KernelPackage/net-hermes-pcmcia/description
-- Kernel modules for Hermes based PCMCIA adaptors
--endef
--
--define KernelPackage/iwlagn
--  $(call KernelPackage/mac80211/Default)
--  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT
--  TITLE:=Intel AGN Wireless support
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlwifi.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/dvm/iwldvm.ko
--  AUTOLOAD:=$(call AutoLoad,60,iwlwifi iwldvm)
--  MENU:=1
--endef
--
--define KernelPackage/iwlagn/description
-- iwlagn kernel module for Intel 5000/5150/1000/6000/6050/6005/6030/100 support
--endef
--
--define KernelPackage/iwlagn/config
--  if PACKAGE_kmod-iwlagn
--
--	config IWL5000_FW
--		bool "Intel 5000 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
--
--	config IWL5150_FW
--		bool "Intel 5150 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Wireless WiFi 5150AGN
--
--	config IWL1000_FW
--		bool "Intel 1000 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Wireless-N 1000
--
--	config IWL6000_FW
--		bool "Intel 6000 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Ultimate-N 6300 and Advanced-N 6200
--
--	config IWL6050_FW
--		bool "Intel 6050 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Advanced-N + WiMAX 6250 and Wireless-N + WiMAX 6150
--
--	config IWL6005_FW
--		bool "Intel 6005 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Advanced-N 6205
--
--	config IWL6030_FW
--		bool "Intel 6030 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235
--
--	config IWL100_FW
--		bool "Intel 100 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Wireless-N 100
--
--	config IWL2000_FW
--		bool "Intel 2000 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Wireless-N 2200
--
--	config IWL2030_FW
--		bool "Intel 2030 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Wireless-N 2230
--
--	config IWL105_FW
--		bool "Intel 105 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Wireless-N 105
--
--	config IWL135_FW
--		bool "Intel 135 Firmware"
--		default y
--		help
--		  Download and install firmware for:
--		    Intel Centrino Wireless-N 135
--  endif
--endef
--
--define KernelPackage/iwl-legacy
--  $(call KernelPackage/mac80211/Default)
--  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT
--  TITLE:=Intel legacy Wireless support
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwlegacy.ko
--  AUTOLOAD:=$(call AutoLoad,60,iwlegacy)
--endef
--
--define KernelPackage/iwl-legacy/description
-- iwl-legacy kernel module for legacy Intel wireless support
--endef
--
--define KernelPackage/iwl3945
--  $(call KernelPackage/mac80211/Default)
--  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy
--  TITLE:=Intel iwl3945 Wireless support
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl3945.ko
--  AUTOLOAD:=$(call AutoLoad,61,iwl3945)
--endef
--
--define KernelPackage/iwl3945/description
-- iwl3945 kernel module for Intel 3945 support
--endef
--
--define KernelPackage/iwl4965
--  $(call KernelPackage/mac80211/Default)
--  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy +@DRIVER_11N_SUPPORT
--  TITLE:=Intel iwl4965 Wireless support
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl4965.ko
--  AUTOLOAD:=$(call AutoLoad,61,iwl4965)
--endef
--
--define KernelPackage/iwl4965/description
-- iwl4965 kernel module for Intel 4965 support
--endef
--
--
--define KernelPackage/mwl8k
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards
--  URL:=http://wireless.kernel.org/en/users/Drivers/mwl8k
--  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mwl8k.ko
--  AUTOLOAD:=$(call AutoLoad,27,mwl8k)
--endef
--
--define KernelPackage/mwl8k/description
-- Kernel modules for Marvell TOPDOG 802.11 Wireless cards
--endef
--
--
--define KernelPackage/wlcore
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=TI common driver part
--  DEPENDS+= @TARGET_omap +kmod-mac80211 +@DRIVER_11N_SUPPORT
--  FILES:= \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore.ko \
--	$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore_sdio.ko
--  AUTOLOAD:=$(call AutoLoad,61,wlcore wlcore_sdio)
--endef
--
--define KernelPackage/wlcore/description
-- This module contains some common parts needed by TI Wireless drivers.
--endef
--
--define KernelPackage/wl12xx
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Driver for TI WL12xx
--  URL:=http://wireless.kernel.org/en/users/Drivers/wl12xx
--  DEPENDS+= +kmod-wlcore
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl12xx/wl12xx.ko
--  AUTOLOAD:=$(call AutoLoad,62,wl12xx)
--endef
--
--define KernelPackage/wl12xx/description
-- Kernel modules for TI WL12xx
--endef
--
--define KernelPackage/wl18xx
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Driver for TI WL18xx
--  URL:=http://wireless.kernel.org/en/users/Drivers/wl18xx
--  DEPENDS+= +kmod-wlcore
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl18xx/wl18xx.ko
--  AUTOLOAD:=$(call AutoLoad,62,wl18xx)
--endef
--
--define KernelPackage/wl18xx/description
-- Kernel modules for TI WL18xx
--endef
--
--
--#Broadcom firmware
--ifneq ($(CONFIG_B43_FW_5_10),)
--  PKG_B43_FWV4_NAME:=broadcom-wl
--  PKG_B43_FWV4_VERSION:=5.10.56.27.3
--  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta/wl_prebuilt.o
--  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)_mipsel.tar.bz2
--  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
--  PKG_B43_FWV4_MD5SUM:=3363e3a6b3d9d73c49dea870c7834eac
--else
--ifneq ($(CONFIG_B43_FW_4_178),)
--  PKG_B43_FWV4_NAME:=broadcom-wl
--  PKG_B43_FWV4_VERSION:=4.178.10.4
--  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
--  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
--  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
--  PKG_B43_FWV4_MD5SUM:=14477e8cbbb91b11896affac9b219fdb
--else
--ifneq ($(CONFIG_B43_FW_5_100_138),)
--  PKG_B43_FWV4_NAME:=broadcom-wl
--  PKG_B43_FWV4_VERSION:=5.100.138
--  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
--  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
--  PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
--  PKG_B43_FWV4_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555
--else
--  PKG_B43_FWV4_NAME:=broadcom-wl
--  PKG_B43_FWV4_VERSION:=4.150.10.5
--  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta_mimo.o
--  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
--  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
--  PKG_B43_FWV4_MD5SUM:=0c6ba9687114c6b598e8019e262d9a60
--endif
--endif
--endif
--ifneq ($(CONFIG_B43_OPENFIRMWARE),)
--  PKG_B43_FWV4_NAME:=broadcom-wl
--  PKG_B43_FWV4_VERSION:=5.2
--  PKG_B43_FWV4_OBJECT:=openfwwf-$(PKG_B43_FWV4_VERSION)
--  PKG_B43_FWV4_SOURCE:=openfwwf-$(PKG_B43_FWV4_VERSION).tar.gz
--  PKG_B43_FWV4_SOURCE_URL:=http://www.ing.unibs.it/openfwwf/firmware/
--  PKG_B43_FWV4_MD5SUM:=e045a135453274e439ae183f8498b0fa
--endif
--
--
--PKG_B43_FWV3_NAME:=wl_apsta
--PKG_B43_FWV3_VERSION:=3.130.20.0
--PKG_B43_FWV3_SOURCE:=$(PKG_B43_FWV3_NAME)-$(PKG_B43_FWV3_VERSION).o
--PKG_B43_FWV3_SOURCE_URL:=http://downloads.openwrt.org/sources/
--PKG_B43_FWV3_MD5SUM:=e08665c5c5b66beb9c3b2dd54aa80cb3
--
--define Download/b43
--  FILE:=$(PKG_B43_FWV4_SOURCE)
--  URL:=$(PKG_B43_FWV4_SOURCE_URL)
--  MD5SUM:=$(PKG_B43_FWV4_MD5SUM)
--endef
--$(eval $(call Download,b43))
--
--define Download/b43legacy
--  FILE:=$(PKG_B43_FWV3_SOURCE)
--  URL:=$(PKG_B43_FWV3_SOURCE_URL)
--  MD5SUM:=$(PKG_B43_FWV3_MD5SUM)
--endef
--$(eval $(call Download,b43legacy))
--
--
--define KernelPackage/b43
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Broadcom 43xx wireless support
--  URL:=http://linuxwireless.org/en/users/Drivers/b43
--  KCONFIG:= \
--  	CONFIG_HW_RANDOM=y
--  DEPENDS+= +kmod-mac80211 +!TARGET_brcm47xx:kmod-bcma +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/b43/b43.ko
--  AUTOLOAD:=$(call AutoLoad,30,b43)
--  MENU:=1
--endef
--
--define KernelPackage/b43/config
--  if PACKAGE_kmod-b43
--
--	choice
--		prompt "b43 firmware version"
--		default B43_FW_5_100_138
--		help
--		  This option allows you to select the version of the b43 firmware.
--
--	config B43_FW_4_150
--		bool "Firmware 410.2160 from driver 4.150.10.5 (old stable)"
--		help
--		  Stable firmware for BCM43xx devices.
--
--		  If unsure, select this.
--
--	config B43_FW_4_178
--		bool "Firmware 478.104 from driver 4.178.10.4"
--		help
--		  Experimental firmware for BCM43xx devices.
--
--		  This firmware is not tested as much as the "stable" firmware.
--
--		  If unsure, select the "stable" firmware.
--
--	config B43_FW_5_10
--		bool "Firmware 508.1084 from driver 5.10.56.27"
--		help
--		  Newer experimental firmware for BCM43xx devices.
--
--		  This firmware is mostly untested. It is needed for some N-PHY devices.
--
--		  If unsure, select the "stable" firmware.
--
--	config B43_FW_5_100_138
--		bool "Firmware 666.2 from driver 5.100.138 (stable)"
--		help
--		  Newer experimental firmware for BCM43xx devices.
--
--		  This firmware is mostly untested. It is needed for some N-PHY devices.
--
--		  If unsure, select the "stable" firmware.
--
--	config B43_OPENFIRMWARE
--		bool "Open FirmWare for WiFi networks"
--		help
--		  Opensource firmware for BCM43xx devices.
--
--		  Do _not_ select this, unless you know what you are doing.
--		  The Opensource firmware is not suitable for embedded devices, yet.
--		  It does not support QoS, which is bad for AccessPoints.
--		  It does not support hardware crypto acceleration, which is a showstopper
--		  for embedded devices with low CPU resources.
--
--		  If unsure, select the "stable" firmware.
--
--	endchoice
--
--	config B43_FW_SQUASH
--		bool "Remove unnecessary firmware files"
--		depends on !B43_OPENFIRMWARE
--		default y
--		help
--		  This options allows you to remove unnecessary b43 firmware files
--		  from the final rootfs image. This can reduce the rootfs size by
--		  up to 200k.
--
--		  If unsure, say Y.
--
--	config B43_FW_SQUASH_COREREVS
--		string "Core revisions to include"
--		depends on B43_FW_SQUASH
--		default "5,6,7,8,9,10,11,13,15,16,29"
--		help
--		  This is a comma seperated list of core revision numbers.
--
--		  Example (keep files for rev5 only):
--		    5
--
--		  Example (keep files for rev5 and rev11):
--		    5,11
--
--	config B43_FW_SQUASH_PHYTYPES
--		string "PHY types to include"
--		depends on B43_FW_SQUASH
--		default "G,LP,N,HT"
--		help
--		  This is a comma seperated list of PHY types:
--		    A  => A-PHY
--		    AG => Dual A-PHY G-PHY
--		    G  => G-PHY
--		    LP => LP-PHY
--		    N  => N-PHY
--		    HT  => HT-PHY
--		    LCN  => LCN-PHY
--
--		  Example (keep files for G-PHY only):
--		    G
--
--		  Example (keep files for G-PHY and N-PHY):
--		    G,N
--
--	config PACKAGE_B43_DEBUG
--		bool "Enable debug output and debugfs for b43"
--		default n
--		help
--		  Enable additional debug output and runtime sanity checks for b43
--		  and enables the debugfs interface.
--
--		  If unsure, say N.
--
--	config PACKAGE_B43_PIO
--		bool "Enable support for PIO transfer mode"
--		default n
--		help
--		  Enable support for using PIO instead of DMA. Unless you have DMA
--		  transfer problems you don't need this.
--
--		  If unsure, say N.
--
--	config PACKAGE_B43_PHY_N
--		bool "Enable support for N-PHYs"
--		default y
--		help
--		  Enable support for N-PHY. This includes support for the following devices:
--		  PCI: BCM4321, BCM4322, BCM43222, BCM43224, BCM43225
--		  SoC: BCM4716, BCM4717, BCM4718
--
--		  Currently only 11g speed is available.
--
--		  If unsure, say Y.
--
--	config PACKAGE_B43_PHY_HT
--		bool "Enable support for HT-PHYs"
--		default y
--		help
--		  Enable support for HT-PHY. This includes support for the following devices:
--		  PCI: BCM4331
--
--		  Currently only 11g speed is available.
--
--		  If unsure, say Y.
--
--	config PACKAGE_B43_PHY_LCN
--		bool "Enable support for LCN-PHYs"
--		depends on BROKEN
--		default n
--		help
--		  Currently broken.
--
--		  If unsure, say N.
--
--  endif
--endef
--
--define KernelPackage/b43/description
--Kernel module for Broadcom 43xx wireless support (mac80211 stack) new
--endef
--
--define KernelPackage/b43legacy
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Broadcom 43xx-legacy wireless support
--  URL:=http://linuxwireless.org/en/users/Drivers/b43
--  KCONFIG:= \
--  	CONFIG_HW_RANDOM=y
--  DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/b43legacy/b43legacy.ko
--  AUTOLOAD:=$(call AutoLoad,30,b43legacy)
--  MENU:=1
--endef
--
--define KernelPackage/b43legacy/config
--  if PACKAGE_kmod-b43legacy
--
--	config B43LEGACY_FW_SQUASH
--		bool "Remove unnecessary firmware files"
--		default y
--		help
--		  This options allows you to remove unnecessary b43legacy firmware files
--		  from the final rootfs image. This can reduce the rootfs size by
--		  up to 50k.
--
--		  If unsure, say Y.
--
--	config B43LEGACY_FW_SQUASH_COREREVS
--		string "Core revisions to include"
--		depends on B43LEGACY_FW_SQUASH
--		default "1,2,3,4"
--		help
--		  This is a comma seperated list of core revision numbers.
--
--		  Example (keep files for rev4 only):
--		    4
--
--		  Example (keep files for rev2 and rev4):
--		    2,4
--
--  endif
--endef
--
--define KernelPackage/b43legacy/description
--Kernel module for Broadcom 43xx-legacy wireless support (mac80211 stack) new
--endef
--
--
--define KernelPackage/brcmutil
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Broadcom IEEE802.11n common driver parts
--  URL:=http://linuxwireless.org/en/users/Drivers/brcm80211
--  DEPENDS+=@PCI_SUPPORT||USB_SUPPORT
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmutil/brcmutil.ko
--  AUTOLOAD:=$(call AutoLoad,30,brcmutil)
--  MENU:=1
--endef
--
--define KernelPackage/brcmutil/description
-- This module contains some common parts needed by Broadcom Wireless drivers brcmsmac and brcmfmac.
--endef
--
--define KernelPackage/brcmutil/config
--  if PACKAGE_kmod-brcmutil
--
--	config PACKAGE_BRCM80211_DEBUG
--		bool "Broadcom wireless driver debugging"
--		help
--		  Say Y, if you want to debug brcmsmac and brcmfmac wireless driver.
--
--  endif
--endef
--
--PKG_BRCMSMAC_FW_NAME:=broadcom-wl
--PKG_BRCMSMAC_FW_VERSION:=5.100.138
--PKG_BRCMSMAC_FW_OBJECT:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION)/linux/wl_apsta.o
--PKG_BRCMSMAC_FW_SOURCE:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION).tar.bz2
--PKG_BRCMSMAC_FW_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
--PKG_BRCMSMAC_FW_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555
--
--define Download/brcmsmac
--  FILE:=$(PKG_BRCMSMAC_FW_SOURCE)
--  URL:=$(PKG_BRCMSMAC_FW_SOURCE_URL)
--  MD5SUM:=$(PKG_BRCMSMAC_FW_MD5SUM)
--endef
--$(eval $(call Download,brcmsmac))
--
--define KernelPackage/brcmsmac
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Broadcom IEEE802.11n PCIe SoftMAC WLAN driver
--  URL:=http://linuxwireless.org/en/users/Drivers/brcm80211
--  DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT +!TARGET_brcm47xx:kmod-bcma +kmod-lib-cordic +kmod-lib-crc8 +kmod-brcmutil
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmsmac/brcmsmac.ko
--  AUTOLOAD:=$(call AutoLoad,31,brcmsmac)
--  MENU:=1
--endef
--
--define KernelPackage/brcmsmac/description
-- Kernel module for Broadcom IEEE802.11n PCIe Wireless cards
--endef
--
--define KernelPackage/brcmsmac/config
--  if PACKAGE_kmod-brcmsmac
--
--	config BRCMSMAC_USE_FW_FROM_WL
--		bool "Use firmware extracted from broadcom proprietary driver"
--		default y
--		help
--		  Instead of using the official brcmsmac firmware a firmware
--		  version 666.2 extracted from the proprietary Broadcom driver
--		  is used. This is needed to get core rev 17 used in bcm4716
--		  to work.
--
--		  If unsure, say Y.
--
--  endif
--endef
--
--
--define KernelPackage/brcmfmac
--  $(call KernelPackage/mac80211/Default)
--  TITLE:=Broadcom IEEE802.11n USB FullMAC WLAN driver
--  URL:=http://linuxwireless.org/en/users/Drivers/brcm80211
--  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-cfg80211 +@DRIVER_11N_SUPPORT +kmod-brcmutil
--  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmfmac/brcmfmac.ko
--  AUTOLOAD:=$(call AutoLoad,60,brcmfmac)
--endef
--
--define KernelPackage/brcmfmac/description
-- Kernel module for Broadcom IEEE802.11n USB Wireless cards
--endef
--
--config_package=$(if $(CONFIG_PACKAGE_kmod-$(1)),m)
--
--config-y:= \
--	WLAN \
--	NL80211_TESTMODE \
--	CFG80211_WEXT \
--	CFG80211_INTERNAL_REGDB \
--	MAC80211_RC_MINSTREL \
--	MAC80211_RC_MINSTREL_HT \
--	MAC80211_RC_DEFAULT_MINSTREL \
--
--config-$(call config_package,cfg80211) += CFG80211
--
--config-$(call config_package,mac80211) += MAC80211
--config-$(CONFIG_PACKAGE_MAC80211_MESH) += MAC80211_MESH
--ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
--  config-y += \
--	CFG80211_DEBUGFS \
--	MAC80211_DEBUGFS \
--	ATH9K_DEBUGFS \
--	ATH9K_HTC_DEBUGFS \
--	ATH10K_DEBUGFS \
--	CARL9170_DEBUGFS \
--	ATH5K_DEBUG
--endif
--
--config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
--
--config-$(call config_package,ath) += ATH_CARDS ATH_COMMON
--config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG
--
--config-$(call config_package,ath9k) += ATH9K
--config-$(call config_package,ath9k-common) += ATH9K_COMMON
--config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB
--config-$(CONFIG_PCI) += ATH9K_PCI
--config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
--
--config-$(call config_package,ath9k-htc) += ATH9K_HTC
--config-$(call config_package,ath10k) += ATH10K ATH10K_PCI
--
--config-$(call config_package,ath5k) += ATH5K
--ifdef CONFIG_TARGET_atheros
--  config-y += ATH5K_AHB
--else
--  config-y += ATH5K_PCI
--endif
--
--config-$(call config_package,carl9170) += CARL9170
--
--config-$(call config_package,b43) += B43
--config-y += B43_SSB B43_BCMA B43_PHY_LP
--config-$(CONFIG_PACKAGE_B43_PHY_N) += B43_PHY_N
--config-$(CONFIG_PACKAGE_B43_PHY_HT) += B43_PHY_HT
--config-$(CONFIG_PACKAGE_B43_PIO) += B43_PIO
--config-$(CONFIG_PACKAGE_B43_DEBUG) += B43_DEBUG
--
--config-$(call config_package,b43legacy) += B43LEGACY
--config-y += B43LEGACY_DMA_MODE
--
--config-$(call config_package,brcmutil) += BRCMUTIL
--config-$(call config_package,brcmsmac) += BRCMSMAC
--config-$(call config_package,brcmfmac) += BRCMFMAC
--config-y += BRCMFMAC_USB
--config-$(CONFIG_PACKAGE_BRCM80211_DEBUG) += BRCMDBG
--
--config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM
--
--config-$(call config_package,rt2x00-lib) += RT2X00 RT2X00_LIB
--config-$(call config_package,rt2x00-pci) += RT2X00_LIB_PCI
--config-$(call config_package,rt2x00-mmio) += RT2X00_LIB_MMIO
--config-$(call config_package,rt2x00-usb) += RT2X00_LIB_USB
--config-$(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS) += RT2X00_LIB_DEBUGFS
--config-$(CONFIG_PACKAGE_RT2X00_DEBUG) += RT2X00_DEBUG
--
--config-$(call config_package,rt2400-pci) += RT2400PCI
--config-$(call config_package,rt2500-pci) += RT2500PCI
--config-$(call config_package,rt2500-usb) += RT2500USB
--config-$(call config_package,rt61-pci) += RT61PCI
--config-$(call config_package,rt73-usb) += RT73USB
--
--config-$(call config_package,rt2800-lib) += RT2800_LIB
--
--config-$(call config_package,rt2800-soc) += RT2800SOC
--config-$(call config_package,rt2800-pci) += RT2800PCI
--config-y += RT2800PCI_RT33XX RT2800PCI_RT35XX RT2800PCI_RT53XX RT2800PCI_RT3290
--
--config-$(call config_package,rt2800-usb) += RT2800USB
--config-y += RT2800USB_RT33XX RT2800USB_RT35XX RT2800USB_RT3573 RT2800USB_RT53XX RT2800USB_RT55XX
--
--config-$(call config_package,iwl-legacy) += IWLEGACY
--config-$(call config_package,iwl3945) += IWL3945
--config-$(call config_package,iwl4965) += IWL4965
--config-$(call config_package,iwlagn) += IWLWIFI IWLDVM
--
--config-$(call config_package,net-libipw) += LIBIPW
--config-$(call config_package,net-ipw2100) += IPW2100
--config-$(call config_package,net-ipw2200) += IPW2200
--
--config-$(call config_package,p54-common) += P54_COMMON
--config-$(call config_package,p54-pci) += P54_PCI
--config-$(call config_package,p54-usb) += P54_USB
--config-$(call config_package,p54-spi) += P54_SPI
--
--config-$(call config_package,net-hermes) += HERMES
--config-$(call config_package,net-hermes-pci) += PCI_HERMES
--config-$(call config_package,net-hermes-plx) += PLX_HERMES
--config-$(call config_package,net-hermes-pcmcia) += PCMCIA_HERMES
--config-y += HERMES_PRISM
--
--config-$(call config_package,adm8211) += ADM8211
--config-$(call config_package,libertas-sd) += LIBERTAS LIBERTAS_SDIO
--config-$(call config_package,libertas-usb) += LIBERTAS LIBERTAS_USB
--config-$(call config_package,mwl8k) += MWL8K
--config-$(call config_package,rtl8180) += RTL8180
--config-$(call config_package,rtl8187) += RTL8187
--config-$(call config_package,wlcore) += WLCORE WLCORE_SDIO
--config-$(call config_package,wl12xx) += WL12XX
--config-$(call config_package,wl18xx) += WL18XX
--config-y += WL_TI WILINK_PLATFORM_DATA
--config-$(call config_package,zd1211rw) += ZD1211RW
--
--config-$(call config_package,rtlwifi) += RTL_CARDS RTLWIFI
--config-$(call config_package,rtlwifi-pci) += RTLWIFI_PCI
--config-$(call config_package,rtlwifi-usb) += RTLWIFI_USB
--config-$(call config_package,rtl8192c-common) += RTL8192C_COMMON
--config-$(call config_package,rtl8192ce) += RTL8192CE
--config-$(call config_package,rtl8192se) += RTL8192SE
--config-$(call config_package,rtl8192de) += RTL8192DE
--config-$(call config_package,rtl8192cu) += RTL8192CU
--config-$(CONFIG_PACKAGE_RTLWIFI_DEBUG) += RTLWIFI_DEBUG
--
--config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS B43_LEDS B43LEGACY_LEDS
--
--MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \
--	CROSS_COMPILE="$(KERNEL_CROSS)" \
--	ARCH="$(LINUX_KARCH)" \
--	EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include" \
--	KLIB_BUILD="$(LINUX_DIR)" \
--	MODPROBE=true \
--	KLIB=$(TARGET_MODULES_DIR) \
--	KERNEL_SUBLEVEL=$(lastword $(subst ., ,$(KERNEL_PATCHVER))) \
--	KBUILD_LDFLAGS_MODULE_PREREQ=
--
--ifneq ($(findstring c,$(OPENWRT_VERBOSE)),)
--  MAKE_OPTS += V=1
--endif
--
--define ConfigVars
--$(subst $(space),,$(foreach opt,$(config-$(1)),CPTCFG_$(opt)=$(1)
--))
--endef
--
--define mac80211_config
--$(call ConfigVars,m)$(call ConfigVars,y)
--endef
--$(eval $(call shexport,mac80211_config))
--
--define Build/Prepare
--	rm -rf $(PKG_BUILD_DIR)
--	mkdir -p $(PKG_BUILD_DIR)
--	$(PKG_UNPACK)
--	$(Build/Patch)
--	$(TAR) -C $(PKG_BUILD_DIR) -xzf $(DL_DIR)/$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
--	$(TAR) -C $(PKG_BUILD_DIR) -xzf $(DL_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
--	$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
--	$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(PKG_LINUX_FIRMWARE_SOURCE)
--	$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SOURCE)
--	rm -rf \
--		$(PKG_BUILD_DIR)/include/linux/ssb \
--		$(PKG_BUILD_DIR)/include/linux/bcma \
--		$(PKG_BUILD_DIR)/include/net/bluetooth
--
--	rm -f \
--		$(PKG_BUILD_DIR)/include/linux/cordic.h \
--		$(PKG_BUILD_DIR)/include/linux/crc8.h \
--		$(PKG_BUILD_DIR)/include/linux/eeprom_93cx6.h \
--		$(PKG_BUILD_DIR)/include/linux/wl12xx.h \
--		$(PKG_BUILD_DIR)/include/linux/spi/libertas_spi.h \
--		$(PKG_BUILD_DIR)/include/net/ieee80211.h
--
--	echo 'compat-wireless-$(PKG_VERSION)-$(PKG_RELEASE)-$(REVISION)' > $(PKG_BUILD_DIR)/compat_version
--	$(CP) ./files/regdb.txt $(PKG_BUILD_DIR)/net/wireless/db.txt
--endef
--
--ifneq ($(CONFIG_PACKAGE_kmod-cfg80211)$(CONFIG_PACKAGE_kmod-lib80211),)
-- define Build/Compile/kmod
--	rm -rf $(PKG_BUILD_DIR)/modules
--	+$(MAKE) $(PKG_JOBS) $(MAKE_OPTS) modules
-- endef
--endif
--
--define Build/Configure
--	cmp $(PKG_BUILD_DIR)/include/linux/ath9k_platform.h $(LINUX_DIR)/include/linux/ath9k_platform.h
--	cmp $(PKG_BUILD_DIR)/include/linux/ath5k_platform.h $(LINUX_DIR)/include/linux/ath5k_platform.h
--	cmp $(PKG_BUILD_DIR)/include/linux/rt2x00_platform.h $(LINUX_DIR)/include/linux/rt2x00_platform.h
--endef
--
--define Build/Compile
--	$(SH_FUNC) var2file "$(call shvar,mac80211_config)" $(PKG_BUILD_DIR)/.config
--	$(MAKE) $(MAKE_OPTS) allnoconfig
--	$(call Build/Compile/kmod)
--endef
--
--define Build/InstallDev
--	mkdir -p \
--		$(1)/usr/include/mac80211 \
--		$(1)/usr/include/mac80211-backport \
--		$(1)/usr/include/mac80211/ath \
--		$(1)/usr/include/net/mac80211
--	$(CP) $(PKG_BUILD_DIR)/net/mac80211/*.h $(PKG_BUILD_DIR)/include/* $(1)/usr/include/mac80211/
--	$(CP) $(PKG_BUILD_DIR)/backport-include/* $(1)/usr/include/mac80211-backport/
--	$(CP) $(PKG_BUILD_DIR)/net/mac80211/rate.h $(1)/usr/include/net/mac80211/
--	$(CP) $(PKG_BUILD_DIR)/drivers/net/wireless/ath/*.h $(1)/usr/include/mac80211/ath/
--endef
--
--define KernelPackage/libertas-usb/install
--	$(INSTALL_DIR) $(1)/lib/firmware/libertas
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8388_v9.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8682.bin \
--		$(1)/lib/firmware/libertas/
--endef
--
--define KernelPackage/libertas-sd/install
--	$(INSTALL_DIR) $(1)/lib/firmware/libertas
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8385_helper.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8385.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v9_helper.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v9.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688_helper.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688.bin \
--		$(1)/lib/firmware/libertas
--endef
--
--define KernelPackage/cfg80211/install
--	$(INSTALL_DIR) $(1)/lib/wifi
--	$(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
--endef
--
--define KernelPackage/p54-pci/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(DL_DIR)/$(P54PCIFW) $(1)/lib/firmware/isl3886pci
--endef
--
--define KernelPackage/p54-usb/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(DL_DIR)/$(P54USBFW) $(1)/lib/firmware/isl3887usb
--endef
--
--define KernelPackage/p54-spi/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(DL_DIR)/$(P54SPIFW) $(1)/lib/firmware/3826.arm
--endef
--
--define KernelPackage/rt61-pci/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2561.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2561s.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2661.bin \
--		$(1)/lib/firmware/
--endef
--
--define KernelPackage/rt73-usb/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt73.bin $(1)/lib/firmware/
--endef
--
--define KernelPackage/rt2800-pci/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2860.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt3290.bin \
--		$(1)/lib/firmware
--endef
--
--define KernelPackage/rt2800-usb/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2870.bin $(1)/lib/firmware/
--endef
--
--define KernelPackage/wl12xx/install
--	$(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-mr.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-plt.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-sr.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl1271-nvs.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-fw-5-mr.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-fw-5-plt.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-fw-5-sr.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-nvs.bin \
--		$(1)/lib/firmware/ti-connectivity
--endef
--
--define KernelPackage/wl18xx/install
--	$(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-conf.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-fw.bin \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-fw-2.bin \
--		$(1)/lib/firmware/ti-connectivity
--endef
--
--define KernelPackage/zd1211rw/install
--	$(INSTALL_DIR) $(1)/lib/firmware/zd1211
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(ZD1211FW_NAME)/zd1211* $(1)/lib/firmware/zd1211
--endef
--
--define KernelPackage/carl9170/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/carl9170-1.fw $(1)/lib/firmware
--endef
--
--define KernelPackage/ath9k-htc/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/htc_9271.fw \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/htc_7010.fw \
--		$(1)/lib/firmware/
--endef
--
--define KernelPackage/ath10k/install
--	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/ath10k/QCA988X/hw2.0/board.bin \
--		$(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/ath10k/QCA988X/hw2.0/firmware-2.bin \
--		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/
--endef
--
--define KernelPackage/mwl8k/install
--	$(INSTALL_DIR) $(1)/lib/firmware/mwl8k
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366_ap-3.fw \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366.fw \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/helper_8366.fw \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8687.fw \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/helper_8687.fw \
--		$(1)/lib/firmware/mwl8k/
--endef
--
--define KernelPackage/net-ipw2100/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/ipw2100-$(IPW2100_VERSION)*.fw $(1)/lib/firmware
--endef
--
--define KernelPackage/net-ipw2200/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION)/ipw2200*.fw $(1)/lib/firmware
--endef
--
--define KernelPackage/iwlagn/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--ifneq ($(CONFIG_IWL5000_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL5150_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-5150-2.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL1000_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-1000-5.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL6000_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000-4.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL6050_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6050-5.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL6005_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL6030_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL100_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-100-5.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL2000_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL2030_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL105_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-105-6.ucode $(1)/lib/firmware
--endif
--ifneq ($(CONFIG_IWL135_FW),)
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-135-6.ucode $(1)/lib/firmware
--endif
--endef
--
--define KernelPackage/iwl3945/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-3945-2.ucode $(1)/lib/firmware
--endef
--
--define KernelPackage/iwl4965/install
--	$(INSTALL_DIR) $(1)/lib/firmware
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-4965-2.ucode $(1)/lib/firmware
--endef
--
--define KernelPackage/b43/install
--	rm -rf $(1)/lib/firmware/
--ifeq ($(CONFIG_B43_OPENFIRMWARE),y)
--	tar xzf "$(DL_DIR)/$(PKG_B43_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)"
--else
--	tar xjf "$(DL_DIR)/$(PKG_B43_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)"
--endif
--	$(INSTALL_DIR) $(1)/lib/firmware/
--ifeq ($(CONFIG_B43_OPENFIRMWARE),y)
--	$(MAKE) -C "$(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/"
--	$(INSTALL_DIR) $(1)/lib/firmware/b43-open/
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/ucode5.fw $(1)/lib/firmware/b43-open/ucode5.fw
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/b0g0bsinitvals5.fw $(1)/lib/firmware/b43-open/b0g0bsinitvals5.fw
--	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)/b0g0initvals5.fw $(1)/lib/firmware/b43-open/b0g0initvals5.fw
--else
--	b43-fwcutter -w $(1)/lib/firmware/ $(PKG_BUILD_DIR)/$(PKG_B43_FWV4_OBJECT)
--endif
--ifneq ($(CONFIG_B43_FW_SQUASH),)
--	b43-fwsquash.py "$(CONFIG_B43_FW_SQUASH_PHYTYPES)" "$(CONFIG_B43_FW_SQUASH_COREREVS)" "$(1)/lib/firmware/b43"
--endif
--endef
--
--define KernelPackage/b43legacy/install
--	$(INSTALL_DIR) $(1)/lib/firmware/
--	b43-fwcutter --unsupported -w $(1)/lib/firmware/ $(DL_DIR)/$(PKG_B43_FWV3_SOURCE)
--ifneq ($(CONFIG_B43LEGACY_FW_SQUASH),)
--	b43-fwsquash.py "G" "$(CONFIG_B43LEGACY_FW_SQUASH_COREREVS)" "$(1)/lib/firmware/b43legacy"
--endif
--endef
--
--define KernelPackage/brcmsmac/install
--	$(INSTALL_DIR) $(1)/lib/firmware/brcm
--ifeq ($(CONFIG_BRCMSMAC_USE_FW_FROM_WL),y)
--	tar xjf "$(DL_DIR)/$(PKG_BRCMSMAC_FW_SOURCE)" -C "$(PKG_BUILD_DIR)"
--	b43-fwcutter --brcmsmac -w $(1)/lib/firmware/ $(PKG_BUILD_DIR)/$(PKG_BRCMSMAC_FW_OBJECT)
--else
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx-0.fw \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx_hdr-0.fw \
--		$(1)/lib/firmware/brcm/
--endif
--endef
--
--define KernelPackage/brcmfmac/install
--	$(INSTALL_DIR) $(1)/lib/firmware/brcm
--	$(INSTALL_DATA) \
--		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/brcmfmac43236b.bin \
--		$(1)/lib/firmware/brcm/
--endef
--
--$(eval $(call KernelPackage,adm8211))
--$(eval $(call KernelPackage,ath5k))
--$(eval $(call KernelPackage,lib80211))
--$(eval $(call KernelPackage,libertas-usb))
--$(eval $(call KernelPackage,libertas-sd))
--$(eval $(call KernelPackage,cfg80211))
--$(eval $(call KernelPackage,mac80211))
--$(eval $(call KernelPackage,p54-common))
--$(eval $(call KernelPackage,p54-pci))
--$(eval $(call KernelPackage,p54-usb))
--$(eval $(call KernelPackage,p54-spi))
--$(eval $(call KernelPackage,rt2x00-lib))
--$(eval $(call KernelPackage,rt2x00-mmio))
--$(eval $(call KernelPackage,rt2x00-pci))
--$(eval $(call KernelPackage,rt2x00-usb))
--$(eval $(call KernelPackage,rt2800-lib))
--$(eval $(call KernelPackage,rt2400-pci))
--$(eval $(call KernelPackage,rt2500-pci))
--$(eval $(call KernelPackage,rt2500-usb))
--$(eval $(call KernelPackage,rt61-pci))
--$(eval $(call KernelPackage,rt73-usb))
--$(eval $(call KernelPackage,rt2800-mmio))
--$(eval $(call KernelPackage,rt2800-soc))
--$(eval $(call KernelPackage,rt2800-pci))
--$(eval $(call KernelPackage,rt2800-usb))
--$(eval $(call KernelPackage,rtl8180))
--$(eval $(call KernelPackage,rtl8187))
--$(eval $(call KernelPackage,rtlwifi))
--$(eval $(call KernelPackage,rtlwifi-pci))
--$(eval $(call KernelPackage,rtlwifi-usb))
--$(eval $(call KernelPackage,rtl8192c-common))
--$(eval $(call KernelPackage,rtl8192ce))
--$(eval $(call KernelPackage,rtl8192se))
--$(eval $(call KernelPackage,rtl8192de))
--$(eval $(call KernelPackage,rtl8192cu))
--$(eval $(call KernelPackage,zd1211rw))
--$(eval $(call KernelPackage,mac80211-hwsim))
--$(eval $(call KernelPackage,ath9k-common))
--$(eval $(call KernelPackage,ath9k))
--$(eval $(call KernelPackage,ath9k-htc))
--$(eval $(call KernelPackage,ath10k))
--$(eval $(call KernelPackage,ath))
--$(eval $(call KernelPackage,carl9170))
--$(eval $(call KernelPackage,b43))
--$(eval $(call KernelPackage,b43legacy))
--$(eval $(call KernelPackage,brcmutil))
--$(eval $(call KernelPackage,brcmsmac))
--$(eval $(call KernelPackage,brcmfmac))
--$(eval $(call KernelPackage,net-libipw))
--$(eval $(call KernelPackage,net-ipw2100))
--$(eval $(call KernelPackage,net-ipw2200))
--$(eval $(call KernelPackage,iwlagn))
--$(eval $(call KernelPackage,iwl-legacy))
--$(eval $(call KernelPackage,iwl4965))
--$(eval $(call KernelPackage,iwl3945))
--$(eval $(call KernelPackage,mwl8k))
--$(eval $(call KernelPackage,net-hermes))
--$(eval $(call KernelPackage,net-hermes-pci))
--$(eval $(call KernelPackage,net-hermes-plx))
--$(eval $(call KernelPackage,net-hermes-pcmcia))
--$(eval $(call KernelPackage,wlcore))
--$(eval $(call KernelPackage,wl12xx))
--$(eval $(call KernelPackage,wl18xx))
-diff --git a/package/mac80211/files/lib/wifi/mac80211.sh b/package/mac80211/files/lib/wifi/mac80211.sh
-deleted file mode 100644
-index 1994ca3..0000000
---- a/package/mac80211/files/lib/wifi/mac80211.sh
-+++ /dev/null
-@@ -1,655 +0,0 @@
--#!/bin/sh
--append DRIVERS "mac80211"
--
--mac80211_hostapd_setup_base() {
--	local phy="$1"
--	local ifname="$2"
--
--	cfgfile="/var/run/hostapd-$phy.conf"
--
--	config_get device "$vif" device
--	config_get country "$device" country
--	config_get hwmode "$device" hwmode
--	config_get channel "$device" channel
--	config_get beacon_int "$device" beacon_int
--	config_get basic_rate_list "$device" basic_rate
--	config_get_bool noscan "$device" noscan
--
--	hostapd_set_log_options base_cfg "$device"
--
--	[ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device"
--
--	hostapd_channel=$channel
--	[ "$channel" = auto -o "$channel" = 0 ] && hostapd_channel=acs_survey
--
--	[ -n "$hwmode" ] && {
--		config_get hwmode_11n "$device" hwmode_11n
--		[ -n "$hwmode_11n" ] && {
--			hwmode="$hwmode_11n"
--			append base_cfg "ieee80211n=1" "$N"
--			config_get htmode "$device" htmode
--			config_get ht_capab_list "$device" ht_capab
--			case "$htmode" in
--				HT20|HT40+|HT40-) ht_capab="[$htmode]";;
--				*)ht_capab=;;
--			esac
--			for cap in $ht_capab_list; do
--				ht_capab="$ht_capab[$cap]"
--			done
--			[ -n "$ht_capab" ] && append base_cfg "ht_capab=$ht_capab" "$N"
--		}
--	}
--
--	local country_ie=0
--	[ -n "$country" ] && country_ie=1
--	config_get_bool country_ie "$device" country_ie "$country_ie"
--	[ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N"
--
--	local br brval brstr
--	[ -n "$basic_rate_list" ] && {
--		for br in $basic_rate_list; do
--			brval="$(($br / 100))"
--			[ -n "$brstr" ] && brstr="$brstr "
--			brstr="$brstr$brval"
--		done
--	}
--
--	cat >> "$cfgfile" <<EOF
--ctrl_interface=/var/run/hostapd-$phy
--driver=nl80211
--wmm_ac_bk_cwmin=4
--wmm_ac_bk_cwmax=10
--wmm_ac_bk_aifs=7
--wmm_ac_bk_txop_limit=0
--wmm_ac_bk_acm=0
--wmm_ac_be_aifs=3
--wmm_ac_be_cwmin=4
--wmm_ac_be_cwmax=10
--wmm_ac_be_txop_limit=0
--wmm_ac_be_acm=0
--wmm_ac_vi_aifs=2
--wmm_ac_vi_cwmin=3
--wmm_ac_vi_cwmax=4
--wmm_ac_vi_txop_limit=94
--wmm_ac_vi_acm=0
--wmm_ac_vo_aifs=2
--wmm_ac_vo_cwmin=2
--wmm_ac_vo_cwmax=3
--wmm_ac_vo_txop_limit=47
--wmm_ac_vo_acm=0
--tx_queue_data3_aifs=7
--tx_queue_data3_cwmin=15
--tx_queue_data3_cwmax=1023
--tx_queue_data3_burst=0
--tx_queue_data2_aifs=3
--tx_queue_data2_cwmin=15
--tx_queue_data2_cwmax=63
--tx_queue_data2_burst=0
--tx_queue_data1_aifs=1
--tx_queue_data1_cwmin=7
--tx_queue_data1_cwmax=15
--tx_queue_data1_burst=3.0
--tx_queue_data0_aifs=1
--tx_queue_data0_cwmin=3
--tx_queue_data0_cwmax=7
--tx_queue_data0_burst=1.5
--${hwmode:+hw_mode=$hwmode}
--${hostapd_channel:+channel=$hostapd_channel}
--${beacon_int:+beacon_int=$beacon_int}
--${country:+country_code=$country}
--${noscan:+noscan=$noscan}
--${brstr:+basic_rates=$brstr}
--$base_cfg
--
--EOF
--}
--
--mac80211_hostapd_setup_bss() {
--	local phy="$1"
--	local vif="$2"
--	local staidx="$3"
--
--	hostapd_cfg=
--	cfgfile="/var/run/hostapd-$phy.conf"
--	config_get ifname "$vif" ifname
--
--	if [ -f "$cfgfile" ]; then
--		append hostapd_cfg "bss=$ifname" "$N"
--	else
--		mac80211_hostapd_setup_base "$phy" "$ifname"
--		append hostapd_cfg "interface=$ifname" "$N"
--	fi
--
--	local net_cfg bridge
--	net_cfg="$(find_net_config "$vif")"
--	[ -z "$net_cfg" ] || bridge="$(bridge_interface "$net_cfg")"
--	config_set "$vif" bridge "$bridge"
--
--	hostapd_set_bss_options hostapd_cfg "$vif"
--
--	config_get_bool wds "$vif" wds 0
--	[ "$wds" -gt 0 ] && append hostapd_cfg "wds_sta=1" "$N"
--
--	[ "$staidx" -gt 0 ] && append hostapd_cfg "start_disabled=1" "$N"
--
--	local macaddr hidden maxassoc wmm
--	config_get macaddr "$vif" macaddr
--	config_get maxassoc "$vif" maxassoc
--	config_get dtim_period "$vif" dtim_period
--	config_get max_listen_int "$vif" max_listen_int
--	config_get_bool hidden "$vif" hidden 0
--	config_get_bool wmm "$vif" wmm 1
--	cat >> /var/run/hostapd-$phy.conf <<EOF
--$hostapd_cfg
--wmm_enabled=$wmm
--bssid=$macaddr
--ignore_broadcast_ssid=$hidden
--${dtim_period:+dtim_period=$dtim_period}
--${max_listen_int:+max_listen_interval=$max_listen_int}
--${maxassoc:+max_num_sta=$maxassoc}
--EOF
--}
--
--mac80211_start_vif() {
--	local vif="$1"
--	local ifname="$2"
--
--	local net_cfg
--	net_cfg="$(find_net_config "$vif")"
--	[ -z "$net_cfg" ] || start_net "$ifname" "$net_cfg"
--
--	set_wifi_up "$vif" "$ifname"
--}
--
--lookup_phy() {
--	[ -n "$phy" ] && {
--		[ -d /sys/class/ieee80211/$phy ] && return
--	}
--
--	local devpath
--	config_get devpath "$device" path
--	[ -n "$devpath" -a -d "/sys/devices/$devpath/ieee80211" ] && {
--		phy="$(ls /sys/devices/$devpath/ieee80211 | grep -m 1 phy)"
--		[ -n "$phy" ] && return
--	}
--
--	local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
--	[ -n "$macaddr" ] && {
--		for _phy in $(ls /sys/class/ieee80211 2>/dev/null); do
--			[ "$macaddr" = "$(cat /sys/class/ieee80211/${_phy}/macaddress)" ] || continue
--			phy="$_phy"
--			return
--		done
--	}
--	phy=
--	return
--}
--
--find_mac80211_phy() {
--	local device="$1"
--
--	config_get phy "$device" phy
--	lookup_phy
--	[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
--		echo "PHY for wifi device $1 not found"
--		return 1
--	}
--	config_set "$device" phy "$phy"
--
--	config_get macaddr "$device" macaddr
--	[ -z "$macaddr" ] && {
--		config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
--	}
--
--	return 0
--}
--
--scan_mac80211() {
--	local device="$1"
--	local adhoc sta ap monitor mesh disabled
--
--	config_get vifs "$device" vifs
--	for vif in $vifs; do
--		config_get_bool disabled "$vif" disabled 0
--		[ $disabled = 0 ] || continue
--
--		config_get mode "$vif" mode
--		case "$mode" in
--			adhoc|sta|ap|monitor|mesh)
--				append $mode "$vif"
--			;;
--			*) echo "$device($vif): Invalid mode, ignored."; continue;;
--		esac
--	done
--
--	config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${monitor:+$monitor }${mesh:+$mesh}"
--}
--
--list_phy_interfaces() {
--	local phy="$1"
--	if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then
--		ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null;
--	else
--		ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g'
--	fi
--}
--
--disable_mac80211() (
--	local device="$1"
--
--	find_mac80211_phy "$device" || return 0
--	config_get phy "$device" phy
--
--	set_wifi_down "$device"
--	# kill all running hostapd and wpa_supplicant processes that
--	# are running on atheros/mac80211 vifs
--	for pid in `pidof hostapd`; do
--		grep -E "$phy" /proc/$pid/cmdline >/dev/null && \
--			kill $pid
--	done
--
--	include /lib/network
--	for wdev in $(list_phy_interfaces "$phy"); do
--		[ -f "/var/run/$wdev.pid" ] && kill $(cat /var/run/$wdev.pid) >&/dev/null 2>&1
--		for pid in `pidof wpa_supplicant meshd-nl80211`; do
--			grep "$wdev" /proc/$pid/cmdline >/dev/null && \
--				kill $pid
--		done
--		ifconfig "$wdev" down 2>/dev/null
--		unbridge "$dev"
--		iw dev "$wdev" del
--	done
--
--	return 0
--)
--
--get_freq() {
--	local phy="$1"
--	local chan="$2"
--	iw "$phy" info | grep -E -m1 "(\* ${chan:-....} MHz${chan:+|\\[$chan\\]})" | grep MHz | awk '{print $2}'
--}
--
--mac80211_generate_mac() {
--	local id="$1"
--	local ref="$2"
--	local mask="$3"
--
--	[ "$mask" = "00:00:00:00:00:00" ] && mask="ff:ff:ff:ff:ff:ff";
--	local oIFS="$IFS"; IFS=":"; set -- $mask; IFS="$oIFS"
--
--	local mask1=$1
--	local mask6=$6
--
--	local oIFS="$IFS"; IFS=":"; set -- $ref; IFS="$oIFS"
--	[ "$((0x$mask1))" -gt 0 ] && {
--		b1="0x$1"
--		[ "$id" -gt 0 ] && \
--			b1=$(($b1 ^ ((($id - 1) << 2) | 0x2)))
--		printf "%02x:%s:%s:%s:%s:%s" $b1 $2 $3 $4 $5 $6
--		return
--	}
--
--	[ "$((0x$mask6))" -lt 255 ] && {
--		printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $(( 0x$6 ^ $id ))
--		return
--	}
--
--	off2=$(( (0x$6 + $id) / 0x100 ))
--	printf "%s:%s:%s:%s:%02x:%02x" \
--		$1 $2 $3 $4 \
--		$(( (0x$5 + $off2) % 0x100 )) \
--		$(( (0x$6 + $id) % 0x100 ))
--}
--
--enable_mac80211() {
--	local device="$1"
--	config_get channel "$device" channel
--	config_get vifs "$device" vifs
--	config_get txpower "$device" txpower
--	config_get country "$device" country
--	config_get distance "$device" distance
--	config_get txantenna "$device" txantenna all
--	config_get rxantenna "$device" rxantenna all
--	config_get antenna_gain "$device" antenna_gain 0
--	config_get frag "$device" frag
--	config_get rts "$device" rts
--	find_mac80211_phy "$device" || return 0
--	config_get phy "$device" phy
--	local i=0
--	local macidx=0
--	local apidx=0
--	local staidx=0
--	fixed=""
--	local hostapd_ctrl=""
--
--	[ -n "$country" ] && {
--		iw reg get | grep -q "^country $country:" || {
--			iw reg set "$country"
--			sleep 1
--		}
--	}
--
--	config_get chanbw "$device" chanbw
--	[ -n "$chanbw" -a -d /sys/kernel/debug/ieee80211/$phy/ath9k ] && echo "$chanbw" > /sys/kernel/debug/ieee80211/$phy/ath9k/chanbw
--	[ -n "$chanbw" -a -d /sys/kernel/debug/ieee80211/$phy/ath5k ] && echo "$chanbw" > /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode
--
--	[ "$channel" = "auto" -o "$channel" = "0" ] || {
--		fixed=1
--	}
--
--	iw phy "$phy" set antenna $txantenna $rxantenna >/dev/null 2>&1
--	iw phy "$phy" set antenna_gain $antenna_gain
--
--	[ -n "$distance" ] && iw phy "$phy" set distance "$distance"
--	[ -n "$frag" ] && iw phy "$phy" set frag "${frag%%.*}"
--	[ -n "$rts" ] && iw phy "$phy" set rts "${rts%%.*}"
--
--	export channel fixed
--	# convert channel to frequency
--	local freq="$(get_freq "$phy" "${fixed:+$channel}")"
--
--	wifi_fixup_hwmode "$device" "g"
--	for vif in $vifs; do
--		config_get ifname "$vif" ifname
--		[ -n "$ifname" ] || {
--			[ $i -gt 0 ] && ifname="wlan${phy#phy}-$i" || ifname="wlan${phy#phy}"
--		}
--		config_set "$vif" ifname "$ifname"
--
--		config_get mode "$vif" mode
--		config_get ssid "$vif" ssid
--
--		# It is far easier to delete and create the desired interface
--		case "$mode" in
--			adhoc)
--				iw phy "$phy" interface add "$ifname" type adhoc
--			;;
--			ap)
--				# Hostapd will handle recreating the interface and
--				# it's accompanying monitor
--				apidx="$(($apidx + 1))"
--				[ "$apidx" -gt 1 ] || iw phy "$phy" interface add "$ifname" type managed
--			;;
--			mesh)
--				config_get key "$vif" key ""
--				if [ -n "$key" ]; then
--					iw phy "$phy" interface add "$ifname" type mp
--				else
--					config_get mesh_id "$vif" mesh_id
--					iw phy "$phy" interface add "$ifname" type mp mesh_id "$mesh_id"
--				fi
--			;;
--			monitor)
--				iw phy "$phy" interface add "$ifname" type monitor
--			;;
--			sta)
--				local wdsflag
--				staidx="$(($staidx + 1))"
--				config_get_bool wds "$vif" wds 0
--				[ "$wds" -gt 0 ] && wdsflag="4addr on"
--				iw phy "$phy" interface add "$ifname" type managed $wdsflag
--				config_get_bool powersave "$vif" powersave 0
--				[ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
--				iw "$ifname" set power_save "$powersave"
--			;;
--		esac
--
--		# All interfaces must have unique mac addresses
--		# which can either be explicitly set in the device
--		# section, or automatically generated
--		config_get macaddr "$device" macaddr
--		config_get vif_mac "$vif" macaddr
--		[ -n "$vif_mac" ] || {
--			vif_mac="$(mac80211_generate_mac $macidx $macaddr $(cat /sys/class/ieee80211/${phy}/address_mask))"
--			macidx="$(($macidx + 1))"
--		}
--		[ "$mode" = "ap" ] || ifconfig "$ifname" hw ether "$vif_mac"
--		config_set "$vif" macaddr "$vif_mac"
--
--		# !! ap !!
--		#
--		# ALL ap functionality will be passed to hostapd
--		#
--		# !! station !!
--		#
--		# ALL station functionality will be passed to wpa_supplicant
--		#
--		if [ ! "$mode" = "ap" ]; then
--			# We attempt to set the channel for all interfaces, although
--			# mac80211 may not support it or the driver might not yet
--			# for ap mode this is handled by hostapd
--			config_get htmode "$device" htmode
--			case "$htmode" in
--				HT20|HT40+|HT40-) ;;
--				*) htmode= ;;
--			esac
--			[ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel" $htmode
--		fi
--
--		i=$(($i + 1))
--	done
--
--	local start_hostapd=
--	rm -f /var/run/hostapd-$phy.conf
--	for vif in $vifs; do
--		config_get mode "$vif" mode
--		case "$mode" in
--			ap)
--				mac80211_hostapd_setup_bss "$phy" "$vif" "$staidx"
--				start_hostapd=1
--			;;
--			mesh)
--				config_get key "$vif" key ""
--				[ -n "$key" ] && authsae_start_interface "$device" "$vif"
--			;;
--		esac
--	done
--
--	[ -n "$start_hostapd" ] && {
--		hostapd -P /var/run/wifi-$phy.pid -B /var/run/hostapd-$phy.conf || {
--			echo "Failed to start hostapd for $phy"
--			return
--		}
--		sleep 2
--
--		for vif in $vifs; do
--			config_get mode "$vif" mode
--			config_get ifname "$vif" ifname
--			[ "$mode" = "ap" ] || continue
--			hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd-$phy/$ifname}"
--			mac80211_start_vif "$vif" "$ifname"
--		done
--	}
--
--	for vif in $vifs; do
--		config_get mode "$vif" mode
--		config_get ifname "$vif" ifname
--		[ "$mode" = "ap" ] || ifconfig "$ifname" up
--
--		config_get vif_txpower "$vif" txpower
--		# use vif_txpower (from wifi-iface) to override txpower (from
--		# wifi-device) if the latter doesn't exist
--		txpower="${txpower:-$vif_txpower}"
--		[ -z "$txpower" ] || iw dev "$ifname" set txpower fixed "${txpower%%.*}00"
--
--		case "$mode" in
--			adhoc)
--				config_get bssid "$vif" bssid
--				config_get ssid "$vif" ssid
--				config_get beacon_int "$device" beacon_int
--				config_get basic_rate_list "$device" basic_rate
--				config_get encryption "$vif" encryption
--				config_get key "$vif" key 1
--				config_get mcast_rate "$vif" mcast_rate
--				config_get htmode "$device" htmode
--				case "$htmode" in
--					HT20|HT40+|HT40-) ;;
--					*) htmode= ;;
--				esac
--
--
--				local keyspec=""
--				[ "$encryption" == "psk" -o "$encryption" == "psk2" ] && {
--					if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
--						wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" $freq $htmode || {
--							echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
--							# make sure this wifi interface won't accidentally stay open without encryption
--							ifconfig "$ifname" down
--						}
--						mac80211_start_vif "$vif" "$ifname"
--						continue
--					fi
--				}
--
--				[ "$encryption" == "wep" ] && {
--					case "$key" in
--						[1234])
--							local idx
--							for idx in 1 2 3 4; do
--								local ikey
--								config_get ikey "$vif" "key$idx"
--
--								[ -n "$ikey" ] && {
--									ikey="$(($idx - 1)):$(prepare_key_wep "$ikey")"
--									[ $idx -eq $key ] && ikey="d:$ikey"
--									append keyspec "$ikey"
--								}
--							done
--						;;
--						*) append keyspec "d:0:$(prepare_key_wep "$key")" ;;
--					esac
--				}
--
--				local br brval brsub brstr
--				[ -n "$basic_rate_list" ] && {
--					for br in $basic_rate_list; do
--						brval="$(($br / 1000))"
--						brsub="$((($br / 100) % 10))"
--						[ "$brsub" -gt 0 ] && brval="$brval.$brsub"
--						[ -n "$brstr" ] && brstr="$brstr,"
--						brstr="$brstr$brval"
--					done
--				}
--
--				local mcval=""
--				[ -n "$mcast_rate" ] && {
--					mcval="$(($mcast_rate / 1000))"
--					mcsub="$(( ($mcast_rate / 100) % 10 ))"
--					[ "$mcsub" -gt 0 ] && mcval="$mcval.$mcsub"
--				}
--
--				iw dev "$ifname" ibss join "$ssid" $freq $htmode \
--					${fixed:+fixed-freq} $bssid \
--					${beacon_int:+beacon-interval $beacon_int} \
--					${brstr:+basic-rates $brstr} \
--					${mcval:+mcast-rate $mcval} \
--					${keyspec:+keys $keyspec}
--			;;
--			mesh)
--				mp_list="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh_max_peer_links
--					mesh_max_retries mesh_ttl mesh_element_ttl mesh_auto_open_plinks mesh_hwmp_max_preq_retries
--					mesh_path_refresh_time mesh_min_discovery_timeout mesh_hwmp_active_path_timeout
--					mesh_hwmp_preq_min_interval mesh_hwmp_net_diameter_traversal_time mesh_hwmp_rootmode
--					mesh_hwmp_rann_interval mesh_gate_announcements mesh_fwding mesh_sync_offset_max_neighor
--					mesh_rssi_threshold mesh_hwmp_active_path_to_root_timeout mesh_hwmp_root_interval
--					mesh_hwmp_confirmation_interval mesh_power_mode mesh_awake_window"
--				for mp in $mp_list
--				do
--					config_get mp_val "$vif" "$mp" ""
--					[ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$mp" "$mp_val"
--				done
--			;;
--			sta)
--				if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
--					wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" || {
--						echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
--						# make sure this wifi interface won't accidentally stay open without encryption
--						ifconfig "$ifname" down
--						continue
--					}
--				fi
--			;;
--		esac
--		[ "$mode" = "ap" ] || mac80211_start_vif "$vif" "$ifname"
--	done
--
--}
--
--
--check_mac80211_device() {
--	config_get phy "$1" phy
--	[ -z "$phy" ] && {
--		find_mac80211_phy "$1" >/dev/null || return 0
--		config_get phy "$1" phy
--	}
--	[ "$phy" = "$dev" ] && found=1
--}
--
--detect_mac80211() {
--	devidx=0
--	config_load wireless
--	while :; do
--		config_get type "radio$devidx" type
--		[ -n "$type" ] || break
--		devidx=$(($devidx + 1))
--	done
--	for dev in $(ls /sys/class/ieee80211); do
--		found=0
--		config_foreach check_mac80211_device wifi-device
--		[ "$found" -gt 0 ] && continue
--
--		mode_11n=""
--		mode_band="g"
--		channel="11"
--		ht_cap=0
--		for cap in $(iw phy "$dev" info | grep 'Capabilities:' | cut -d: -f2); do
--			ht_cap="$(($ht_cap | $cap))"
--		done
--		ht_capab="";
--		[ "$ht_cap" -gt 0 ] && {
--			mode_11n="n"
--			append ht_capab "	option htmode	HT20" "$N"
--
--			list="	list ht_capab"
--			[ "$(($ht_cap & 1))" -eq 1 ] && append ht_capab "$list	LDPC" "$N"
--			[ "$(($ht_cap & 16))" -eq 16 ] && append ht_capab "$list	GF" "$N"
--			[ "$(($ht_cap & 32))" -eq 32 ] && append ht_capab "$list	SHORT-GI-20" "$N"
--			[ "$(($ht_cap & 64))" -eq 64 ] && append ht_capab "$list	SHORT-GI-40" "$N"
--			[ "$(($ht_cap & 128))" -eq 128 ] && append ht_capab "$list	TX-STBC" "$N"
--			[ "$(($ht_cap & 768))" -eq 256 ] && append ht_capab "$list	RX-STBC1" "$N"
--			[ "$(($ht_cap & 768))" -eq 512 ] && append ht_capab "$list	RX-STBC12" "$N"
--			[ "$(($ht_cap & 768))" -eq 768 ] && append ht_capab "$list	RX-STBC123" "$N"
--			[ "$(($ht_cap & 4096))" -eq 4096 ] && append ht_capab "$list	DSSS_CCK-40" "$N"
--		}
--		iw phy "$dev" info | grep -q '2412 MHz' || { mode_band="a"; channel="36"; }
--
--		if [ -x /usr/bin/readlink ]; then
--			path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
--			path="${path##/sys/devices/}"
--			dev_id="	option path	'$path'"
--		else
--			dev_id="	option macaddr	$(cat /sys/class/ieee80211/${dev}/macaddress)"
--		fi
--
--		cat <<EOF
--config wifi-device  radio$devidx
--	option type     mac80211
--	option channel  ${channel}
--	option hwmode	11${mode_11n}${mode_band}
--$dev_id
--$ht_capab
--	# REMOVE THIS LINE TO ENABLE WIFI:
--	option disabled 1
--
--config wifi-iface
--	option device   radio$devidx
--	option network  lan
--	option mode     ap
--	option ssid     OpenWrt
--	option encryption none
--
--EOF
--	devidx=$(($devidx + 1))
--	done
--}
--
-diff --git a/package/mac80211/files/regdb.txt b/package/mac80211/files/regdb.txt
-deleted file mode 100644
-index 2badb21..0000000
---- a/package/mac80211/files/regdb.txt
-+++ /dev/null
-@@ -1,823 +0,0 @@
--# This is the world regulatory domain
--country 00:
--	(2402 - 2472 @ 40), (3, 20)
--	# Channel 12 - 13.
--	(2457 - 2482 @ 40), (3, 20), PASSIVE-SCAN, NO-IBSS
--	# Channel 14. Only JP enables this and for 802.11b only
--	(2474 - 2494 @ 20), (3, 20), PASSIVE-SCAN, NO-IBSS, NO-OFDM
--	# Channel 36 - 48
--	(5170 - 5250 @ 80), (3, 20)
--	# NB: 5260 MHz - 5700 MHz requies DFS
--	# Channel 149 - 165
--	(5735 - 5835 @ 80), (3, 20), PASSIVE-SCAN, NO-IBSS
--	# IEEE 802.11ad (60GHz), channels 1..3
--	(57240 - 63720 @ 2160), (N/A, 0)
--
--
--country AD:
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country AE:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country AL:
--	(2402 - 2482 @ 20), (N/A, 20)
--
--country AM:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (N/A, 18)
--	(5250 - 5330 @ 20), (N/A, 18), DFS
--
--country AN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--
--country AR:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country AT: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country AU:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country AW:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--
--country AZ:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 18)
--	(5250 - 5330 @ 40), (N/A, 18), DFS
--
--country BA: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country BB:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 23)
--	(5250 - 5330 @ 40), (3, 23), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country BD:
--	(2402 - 2482 @ 40), (N/A, 20)
--
--country BE: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country BG: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 23)
--	(5250 - 5290 @ 40), (N/A, 23), DFS
--	(5490 - 5710 @ 40), (N/A, 30), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country BH:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (N/A, 20)
--	(5250 - 5330 @ 20), (N/A, 20), DFS
--	(5735 - 5835 @ 20), (N/A, 20)
--
--country BL:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 18)
--	(5250 - 5330 @ 40), (N/A, 18), DFS
--
--country BN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country BO:
--	(2402 - 2482 @ 40), (N/A, 30)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country BR:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country BY:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--
--country BZ:
--	(2402 - 2482 @ 40), (N/A, 30)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country CA:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country CH: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country CL:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5735 - 5835 @ 40), (N/A, 20)
--
--country CN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 80), (N/A, 30)
--	# 60 gHz band channels 1,4: 28dBm, channels 2,3: 44dBm
--	# ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf
--	(57240 - 59400 @ 2160), (N/A, 28)
--	(59400 - 63720 @ 2160), (N/A, 44)
--	(63720 - 65880 @ 2160), (N/A, 28)
--
--country CO:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country CR:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country CY: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--# Data from http://www.ctu.eu/164/download/VOR/VOR-12-08-2005-34.pdf
--# and http://www.ctu.eu/164/download/VOR/VOR-12-05-2007-6-AN.pdf
--# Power at 5250 - 5350 MHz and 5470 - 5725 MHz can be doubled if TPC is
--# implemented.
--country CZ: DFS-ETSI
--	(2400 - 2483.5 @ 40), (N/A, 100 mW)
--	(5150 - 5250 @ 80), (N/A, 200 mW), NO-OUTDOOR
--	(5250 - 5350 @ 80), (N/A, 100 mW), NO-OUTDOOR, DFS
--	(5470 - 5725 @ 80), (N/A, 500 mW), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--# Data from "Frequenznutzungsplan" (as published in April 2008), downloaded from
--# http://www.bundesnetzagentur.de/cae/servlet/contentblob/38448/publicationFile/2659/Frequenznutzungsplan2008_Id17448pdf.pdf
--# For the 5GHz range also see
--# http://www.bundesnetzagentur.de/cae/servlet/contentblob/38216/publicationFile/6579/WLAN5GHzVfg7_2010_28042010pdf.pdf
--# The values have been reduced by a factor of 2 (3db) for non TPC devices
--# (in other words: devices with TPC can use twice the tx power of this table).
--# Note that the docs do not require TPC for 5150--5250; the reduction to
--# 100mW thus is not strictly required -- however the conservative 100mW
--# limit is used here as the non-interference with radar and satellite
--# apps relies on the attenuation by the building walls only in the
--# absence of DFS; the neighbour countries have 100mW limit here as well.
--
--country DE: DFS-ETSI
--	# entries 279004 and 280006
--	(2400 - 2483.5 @ 40), (N/A, 100 mW)
--	# entry 303005
--	(5150 - 5250 @ 80), (N/A, 100 mW), NO-OUTDOOR
--	# entries 304002 and 305002
--	(5250 - 5350 @ 80), (N/A, 100 mW), NO-OUTDOOR, DFS
--	# entries 308002, 309001 and 310003
--	(5470 - 5725 @ 80), (N/A, 500 mW), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country DK: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country DO:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 23), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country DZ:
--	(2402 - 2482 @ 40), (N/A, 20)
--
--country EC:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country EE: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country EG:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (N/A, 20)
--	(5250 - 5330 @ 20), (N/A, 20), DFS
--
--country ES: DFS-ETSI
--	(2400 - 2483.5 @ 40), (N/A, 100 mW)
--	(5150 - 5250 @ 80), (N/A, 100 mW), NO-OUTDOOR
--	(5250 - 5350 @ 80), (N/A, 100 mW), NO-OUTDOOR, DFS
--	(5470 - 5725 @ 80), (N/A, 500 mW), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country FI: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country FR: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country GE:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 18)
--	(5250 - 5330 @ 40), (N/A, 18), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country GB: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country GD:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country GR: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country GL: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (N/A, 20)
--	(5250 - 5330 @ 20), (N/A, 20), DFS
--	(5490 - 5710 @ 20), (N/A, 27), DFS
--
--country GT:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 23), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country GU:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country HN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country HK:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country HR: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country HT:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--
--country HU: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country ID:
--	# ref: http://www.postel.go.id/content/ID/regulasi/standardisasi/kepdir/bwa%205,8%20ghz.pdf
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5815 @ 80), (N/A, 20)
--
--country IE: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country IL:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5150 - 5250 @ 80), (N/A, 200 mW), NO-OUTDOOR
--	(5250 - 5350 @ 80), (N/A, 200 mW), NO-OUTDOOR, DFS
--
--country IN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5735 - 5835 @ 40), (N/A, 20)
--
--country IS: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country IR:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country IT: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country JM:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country JP:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(2474 - 2494 @ 20), (N/A, 20), NO-OFDM
--	(4910 - 4990 @ 40), (N/A, 23)
--	(5030 - 5090 @ 40), (N/A, 23)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 160), (N/A, 23), DFS
--
--country JO:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 18)
--
--country KE:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country KH:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--
--country KP:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5330 @ 40), (3, 20)
--	(5160 - 5250 @ 40), (3, 20), DFS
--	(5490 - 5630 @ 40), (3, 30), DFS
--	(5735 - 5815 @ 40), (3, 30)
--
--country KR:
--	(2402 - 2482 @ 20), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 20)
--	(5250 - 5330 @ 80), (3, 20), DFS
--	(5490 - 5630 @ 80), (3, 30), DFS
--	(5735 - 5815 @ 80), (3, 30)
--
--country KW:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--
--country KZ:
--	(2402 - 2482 @ 40), (N/A, 20)
--
--country LB:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country LI: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--
--country LK:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (3, 17)
--	(5250 - 5330 @ 20), (3, 20), DFS
--	(5490 - 5710 @ 20), (3, 20), DFS
--	(5735 - 5835 @ 20), (3, 30)
--
--country LT: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country LU: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country LV: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country MC: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 18)
--	(5250 - 5330 @ 40), (N/A, 18), DFS
--
--country MA:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 23)
--	(5735 - 5835 @ 80), (N/A, 23)
--
--country MO:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 23)
--	(5250 - 5330 @ 40), (3, 23), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country MK: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country MT: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country MY:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 17)
--	(5250 - 5330 @ 80), (N/A, 23), DFS
--	(5735 - 5835 @ 80), (N/A, 30)
--
--country MX:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country NL: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20), NO-OUTDOOR
--	(5250 - 5330 @ 80), (N/A, 20), NO-OUTDOOR, DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country NO: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country NP:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country NZ:
--	(2402 - 2482 @ 40), (N/A, 30)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country OM:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country PA:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 23), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country PE:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country PG:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 23), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country PH:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country PK:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country PL: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country PT: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country PR:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country QA:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country RO: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--
--# Source:
--# http://www.ratel.rs/upload/documents/Plan_namene/Plan_namene-sl_glasnik.pdf
--country RS:
--	(2400 - 2483.5 @ 40), (N/A, 100 mW)
--	(5150 - 5350 @ 40), (N/A, 200 mW), NO-OUTDOOR
--	(5470 - 5725 @ 20), (3, 1000 mW), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country RU:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5330 @ 40), (N/A, 20)
--	(5650 - 5710 @ 40), (N/A, 30)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country RW:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5835 @ 40), (N/A, 30)
--
--country SA:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country SE: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country SG:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country SI: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (N/A, 20)
--	(5250 - 5330 @ 40), (N/A, 20), DFS
--	(5490 - 5710 @ 40), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country SK: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country SV:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (3, 17)
--	(5250 - 5330 @ 20), (3, 23), DFS
--	(5735 - 5835 @ 20), (3, 30)
--
--country SY:
--	(2402 - 2482 @ 40), (N/A, 20)
--
--country TW:
--	(2402 - 2472 @ 40), (3, 27)
--	(5270 - 5330 @ 40), (3, 17), DFS
--	(5490 - 5710 @ 80), (3, 30), DFS
--	(5735 - 5815 @ 80), (3, 30)
--
--country TH:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country TT:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country TN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 20), (N/A, 20)
--	(5250 - 5330 @ 20), (N/A, 20), DFS
--
--country TR: DFS-ETSI
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (N/A, 20)
--	(5250 - 5330 @ 80), (N/A, 20), DFS
--	(5490 - 5710 @ 80), (N/A, 27), DFS
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
-- 
--# Source:
--# #914 / 06 Sep 2007: http://www.ucrf.gov.ua/uk/doc/nkrz/1196068874
--# #1174 / 23 Oct 2008: http://www.nkrz.gov.ua/uk/activities/ruling/1225269361
--# (appendix 8)
--# Listed 5GHz range is a lowest common denominator for all related
--# rules in the referenced laws. Such a range is used because of
--# disputable definitions there.
--country UA:
--	(2400 - 2483.5 @ 40), (N/A, 20), NO-OUTDOOR
--	(5150 - 5350 @ 40), (N/A, 20), NO-OUTDOOR
--	# 60 gHz band channels 1-4, ref: Etsi En 302 567
--	(57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
--
--country US: DFS-FCC
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5600 @ 80), (3, 24), DFS
--	(5650 - 5710 @ 40), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--	# 60g band
--	# reference: http://cfr.regstoday.com/47cfr15.aspx#47_CFR_15p255
--	# channels 1,2,3, EIRP=40dBm(43dBm peak)
--	(57240 - 63720 @ 2160), (N/A, 40)
--
--country UY:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country UZ:
--	(2402 - 2472 @ 40), (3, 27)
--	(5170 - 5250 @ 40), (3, 17)
--	(5250 - 5330 @ 40), (3, 20), DFS
--	(5490 - 5710 @ 40), (3, 20), DFS
--	(5735 - 5835 @ 40), (3, 30)
--
--country VE:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5735 - 5815 @ 40), (N/A, 23)
--
--country VN:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country YE:
--	(2402 - 2482 @ 40), (N/A, 20)
--
--country ZA:
--	(2402 - 2482 @ 40), (N/A, 20)
--	(5170 - 5250 @ 80), (3, 17)
--	(5250 - 5330 @ 80), (3, 24), DFS
--	(5490 - 5710 @ 80), (3, 24), DFS
--	(5735 - 5835 @ 80), (3, 30)
--
--country ZW:
--	(2402 - 2482 @ 40), (N/A, 20)
--
-diff --git a/package/mac80211/patches/000-fix_kconfig.patch b/package/mac80211/patches/000-fix_kconfig.patch
-deleted file mode 100644
-index 88d0b04..0000000
---- a/package/mac80211/patches/000-fix_kconfig.patch
-+++ /dev/null
-@@ -1,16 +0,0 @@
----- a/kconf/Makefile
--+++ b/kconf/Makefile
--@@ -1,10 +1,10 @@
---CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
--+CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -DKBUILD_NO_NLS
-- 
-- LXDIALOG := lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o
-- 
-- conf: conf.o zconf.tab.o
---mconf: LDFLAGS = -Wl,--no-as-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
---mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>" -DLOCALE
--+mconf: LDFLAGS = $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
--+mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>"
-- mconf: mconf.o zconf.tab.o $(LXDIALOG)
-- 
-- .PHONY: clean
-diff --git a/package/mac80211/patches/001-fix_build.patch b/package/mac80211/patches/001-fix_build.patch
-deleted file mode 100644
-index 26b327a..0000000
---- a/package/mac80211/patches/001-fix_build.patch
-+++ /dev/null
-@@ -1,156 +0,0 @@
----- a/Makefile
--+++ b/Makefile
--@@ -19,6 +19,7 @@ KLIB_BUILD ?= $(KLIB)/build/
-- KERNEL_CONFIG := $(KLIB_BUILD)/.config
-- KERNEL_MAKEFILE := $(KLIB_BUILD)/Makefile
-- CONFIG_MD5 := $(shell md5sum $(KERNEL_CONFIG) 2>/dev/null | sed 's/\s.*//')
--+STAMP_KERNEL_CONFIG := .kernel_config_md5_$(CONFIG_MD5)
-- 
-- export KLIB KLIB_BUILD BACKPORT_PWD KMODDIR KMODPATH_ARG
-- 
--@@ -36,7 +37,8 @@ mrproper:
-- 	@rm -f .kernel_config_md5 Kconfig.versions Kconfig.kernel
-- 	@rm -f backport-include/backport/autoconf.h
-- 
---.DEFAULT:
--+.SILENT: $(STAMP_KERNEL_CONFIG)
--+$(STAMP_KERNEL_CONFIG):
-- 	@set -e ; test -f .local-symbols || (						\
-- 	echo "/--------------"								;\
-- 	echo "| You shouldn't run make in the backports tree, but only in"		;\
--@@ -60,56 +62,60 @@ mrproper:
-- 	echo "| (that isn't currently running.)"					;\
-- 	echo "\\--"									;\
-- 	false)
---	@set -e ; if [ "$$(cat .kernel_config_md5 2>/dev/null)" != "$(CONFIG_MD5)" ]	;\
---	then 										\
---		echo -n "Generating local configuration database from kernel ..."	;\
---		grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | (			\
---			while read l ; do						\
---				if [ "$${l:0:7}" != "CONFIG_" ] ; then			\
---					continue					;\
---				fi							;\
---				l=$${l:7}						;\
---				n=$${l%%=*}						;\
---				v=$${l#*=}						;\
---				if [ "$$v" = "m" ] ; then				\
---					echo config $$n					;\
---					echo '    tristate' 				;\
---				elif [ "$$v" = "y" ] ; then				\
---					echo config $$n					;\
---					echo '    bool'					;\
---				else							\
---					continue					;\
---				fi							;\
---				echo "    default $$v"					;\
---				echo ""							;\
---			done								\
---		) > Kconfig.kernel							;\
---		kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |	\
---			sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')			;\
---		test "$$kver" != "" || echo "Kernel version parse failed!"		;\
---		test "$$kver" != ""							;\
---		kvers="$$(seq 14 39 | sed 's/^/2.6./')"					;\
---		kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"				;\
---		print=0									;\
---		for v in $$kvers ; do							\
---			if [ "$$print" = "1" ] ; then					\
---				echo config BACKPORT_KERNEL_$$(echo $$v | tr . _)	;\
---				echo "    def_bool y"					;\
---			fi								;\
---			if [ "$$v" = "$$kver" ] ; then print=1 ; fi			;\
---		done > Kconfig.versions							;\
---		# RHEL as well, sadly we need to grep for it				;\
---		RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | 			\
---					sed 's/.*=\s*\([0-9]*\)/\1/;t;d')		;\
---		RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | 			\
---					sed 's/.*=\s*\([0-9]*\)/\1/;t;d')		;\
---		for v in $$(seq 0 $$RHEL_MINOR) ; do 					\
---			echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v		;\
---			echo "    def_bool y"						;\
---		done >> Kconfig.versions						;\
---		echo " done."								;\
---	fi										;\
---	echo "$(CONFIG_MD5)" > .kernel_config_md5
--+	@rm -f .kernel_config_md5_*
--+	@touch $@
--+
--+Kconfig.kernel: $(STAMP_KERNEL_CONFIG) .local-symbols
--+	@printf "Generating local configuration database from kernel ..."
--+	@grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | (			\
--+		while read l ; do						\
--+			if [ "$${l:0:7}" != "CONFIG_" ] ; then			\
--+				continue					;\
--+			fi							;\
--+			l=$${l:7}						;\
--+			n=$${l%%=*}						;\
--+			v=$${l#*=}						;\
--+			if [ "$$v" = "m" ] ; then				\
--+				echo config $$n					;\
--+				echo '    tristate' 				;\
--+			elif [ "$$v" = "y" ] ; then				\
--+				echo config $$n					;\
--+				echo '    bool'					;\
--+			else							\
--+				continue					;\
--+			fi							;\
--+			echo "    default $$v"					;\
--+			echo ""							;\
--+		done								\
--+	) > $@
--+	@echo " done."
--+
--+Kconfig.versions: Kconfig.kernel
--+	@kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |	\
--+		sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')			;\
--+	test "$$kver" != "" || echo "Kernel version parse failed!"		;\
--+	test "$$kver" != ""							;\
--+	kvers="$$(seq 14 39 | sed 's/^/2.6./')"					;\
--+	kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"				;\
--+	print=0									;\
--+	for v in $$kvers ; do							\
--+		if [ "$$print" = "1" ] ; then					\
--+			echo config BACKPORT_KERNEL_$$(echo $$v | tr . _)	;\
--+			echo "    def_bool y"					;\
--+		fi								;\
--+		if [ "$$v" = "$$kver" ] ; then print=1 ; fi			;\
--+	done > $@
--+	@RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | 			\
--+				sed 's/.*=\s*\([0-9]*\)/\1/;t;d')		;\
--+	RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | 			\
--+				sed 's/.*=\s*\([0-9]*\)/\1/;t;d')		;\
--+	for v in $$(seq 0 $$RHEL_MINOR) ; do 					\
--+		echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v		;\
--+		echo "    def_bool y"						;\
--+	done >> $@
--+
--+.DEFAULT:
--+	@$(MAKE) Kconfig.versions
-- 	@$(MAKE) -f Makefile.real "$@"
-- 
-- .PHONY: defconfig-help
----- a/Makefile.real
--+++ b/Makefile.real
--@@ -54,7 +54,7 @@ defconfig-%::
-- 
-- backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel
-- 	@$(MAKE) oldconfig
---	@echo -n "Building backport-include/backport/autoconf.h ..."
--+	@printf "Building backport-include/backport/autoconf.h ..."
-- 	@grep -f .local-symbols .config | (				\
-- 		echo "#ifndef COMPAT_AUTOCONF_INCLUDED"			;\
-- 		echo "#define COMPAT_AUTOCONF_INCLUDED"			;\
--@@ -75,7 +75,12 @@ backport-include/backport/autoconf.h: .c
-- 			esac						;\
-- 		done							;\
-- 		echo "#endif /* COMPAT_AUTOCONF_INCLUDED */"		;\
---	) > backport-include/backport/autoconf.h
--+	) > $@.new
--+	@if cmp -s $@ $@.new; then \
--+		rm -f $@.new; \
--+	else \
--+		mv $@.new $@; \
--+	fi
-- 	@echo " done."
-- 
-- .PHONY: modules
-diff --git a/package/mac80211/patches/002-change_allconfig.patch b/package/mac80211/patches/002-change_allconfig.patch
-deleted file mode 100644
-index 91ad20f..0000000
---- a/package/mac80211/patches/002-change_allconfig.patch
-+++ /dev/null
-@@ -1,44 +0,0 @@
----- a/kconf/conf.c
--+++ b/kconf/conf.c
--@@ -578,40 +578,12 @@ int main(int ac, char **av)
-- 	case oldconfig:
-- 	case listnewconfig:
-- 	case olddefconfig:
---		conf_read(NULL);
---		break;
-- 	case allnoconfig:
-- 	case allyesconfig:
-- 	case allmodconfig:
-- 	case alldefconfig:
-- 	case randconfig:
---		name = getenv("KCONFIG_ALLCONFIG");
---		if (!name)
---			break;
---		if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
---			if (conf_read_simple(name, S_DEF_USER)) {
---				fprintf(stderr,
---					_("*** Can't read seed configuration \"%s\"!\n"),
---					name);
---				exit(1);
---			}
---			break;
---		}
---		switch (input_mode) {
---		case allnoconfig:	name = "allno.config"; break;
---		case allyesconfig:	name = "allyes.config"; break;
---		case allmodconfig:	name = "allmod.config"; break;
---		case alldefconfig:	name = "alldef.config"; break;
---		case randconfig:	name = "allrandom.config"; break;
---		default: break;
---		}
---		if (conf_read_simple(name, S_DEF_USER) &&
---		    conf_read_simple("all.config", S_DEF_USER)) {
---			fprintf(stderr,
---				_("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"),
---				name);
---			exit(1);
---		}
--+		conf_read(NULL);
-- 		break;
-- 	default:
-- 		break;
-diff --git a/package/mac80211/patches/003-remove_bogus_modparams.patch b/package/mac80211/patches/003-remove_bogus_modparams.patch
-deleted file mode 100644
-index c969b19..0000000
---- a/package/mac80211/patches/003-remove_bogus_modparams.patch
-+++ /dev/null
-@@ -1,34 +0,0 @@
----- a/compat/main.c
--+++ b/compat/main.c
--@@ -21,31 +21,6 @@ MODULE_LICENSE("GPL");
-- #error "You need a BACKPORTS_VERSION"
-- #endif
-- 
---static char *backported_kernel_name = BACKPORTED_KERNEL_NAME;
---
---module_param(backported_kernel_name, charp, 0400);
---MODULE_PARM_DESC(backported_kernel_name,
---		 "The kernel tree name that was used for this backport (" BACKPORTED_KERNEL_NAME ")");
---
---#ifdef BACKPORTS_GIT_TRACKED 
---static char *backports_tracker_id = BACKPORTS_GIT_TRACKED;
---module_param(backports_tracker_id, charp, 0400);
---MODULE_PARM_DESC(backports_tracker_id,
---		 "The version of the tree containing this backport (" BACKPORTS_GIT_TRACKED ")");
---#else
---static char *backported_kernel_version = BACKPORTED_KERNEL_VERSION;
---static char *backports_version = BACKPORTS_VERSION;
---
---module_param(backported_kernel_version, charp, 0400);
---MODULE_PARM_DESC(backported_kernel_version,
---		 "The kernel version that was used for this backport (" BACKPORTED_KERNEL_VERSION ")");
---
---module_param(backports_version, charp, 0400);
---MODULE_PARM_DESC(backports_version,
---		 "The git version of the backports tree used to generate this backport (" BACKPORTS_VERSION ")");
---
---#endif
---
-- void backport_dependency_symbol(void)
-- {
-- }
-diff --git a/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch b/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch
-deleted file mode 100644
-index 584fb05..0000000
---- a/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch
-+++ /dev/null
-@@ -1,40 +0,0 @@
--From 88e75363ff9c00cc2e7768ca23ded79bf8d6bf08 Mon Sep 17 00:00:00 2001
--From: Hauke Mehrtens <hauke@hauke-m.de>
--Date: Fri, 7 Feb 2014 19:13:11 +0100
--Subject: [PATCH 1/8] backports: add led_trigger_blink{_oneshot}()
--
--When led support is deactivated in the kernel and
--CPTCFG_BACKPORT_BUILD_LEDS is set mac80211 references
--led_trigger_blink_oneshot() but it is not declared anywhere.
--
--This fixes the following build error:
--net/mac80211/led.c: In function 'ieee80211_led_rx':
--net/mac80211/led.c:25:2: error: implicit declaration of function 'led_trigger_blink_oneshot' [-Werror=implicit-function-declaration]
--
--Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-----
-- backport-include/backport/leds-disabled.h |   13 +++++++++++++
-- 1 file changed, 13 insertions(+)
--
----- a/backport-include/backport/leds-disabled.h
--+++ b/backport-include/backport/leds-disabled.h
--@@ -163,6 +163,19 @@ static inline void led_trigger_event(str
-- 				     enum led_brightness event)
-- {
-- }
--+
--+static inline void led_trigger_blink(struct led_trigger *trigger,
--+				     unsigned long *delay_on,
--+				     unsigned long *delay_off)
--+{
--+}
--+
--+static inline void led_trigger_blink_oneshot(struct led_trigger *trigger,
--+					     unsigned long *delay_on,
--+					     unsigned long *delay_off,
--+					     int invert)
--+{
--+}
-- #endif
-- 
-- #endif /* __BACKPORT_LED_DISABLED_SUPPORT */
-diff --git a/package/mac80211/patches/010-disable_rfkill.patch b/package/mac80211/patches/010-disable_rfkill.patch
-deleted file mode 100644
-index c5a92d6..0000000
---- a/package/mac80211/patches/010-disable_rfkill.patch
-+++ /dev/null
-@@ -1,13 +0,0 @@
----- a/backport-include/linux/rfkill.h
--+++ b/backport-include/linux/rfkill.h
--@@ -2,6 +2,10 @@
-- #define __COMPAT_RFKILL_H
-- #include <linux/version.h>
-- 
--+#undef CONFIG_RFKILL
--+#undef CONFIG_RFKILL_LEDS
--+#undef CONFIG_RFKILL_MODULE
--+
-- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-- #include_next <linux/rfkill.h>
-- #else
-diff --git a/package/mac80211/patches/020-disable_tty_set_termios.patch b/package/mac80211/patches/020-disable_tty_set_termios.patch
-deleted file mode 100644
-index e6d4ff6..0000000
---- a/package/mac80211/patches/020-disable_tty_set_termios.patch
-+++ /dev/null
-@@ -1,16 +0,0 @@
----- a/compat/compat-2.6.39.c
--+++ b/compat/compat-2.6.39.c
--@@ -13,6 +13,7 @@
-- #include <linux/sched.h>
-- #include <linux/module.h>
-- 
--+#ifdef CONFIG_COMPAT_BLUETOOTH
-- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
-- #ifdef CONFIG_TTY
-- /*
--@@ -114,4 +115,4 @@ int tty_set_termios(struct tty_struct *t
-- EXPORT_SYMBOL_GPL(tty_set_termios);
-- #endif /* CONFIG_TTY */
-- #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) */
---
--+#endif
-diff --git a/package/mac80211/patches/030-rt2x00_options.patch b/package/mac80211/patches/030-rt2x00_options.patch
-deleted file mode 100644
-index 5ee52a2..0000000
---- a/package/mac80211/patches/030-rt2x00_options.patch
-+++ /dev/null
-@@ -1,47 +0,0 @@
----- a/drivers/net/wireless/rt2x00/Kconfig
--+++ b/drivers/net/wireless/rt2x00/Kconfig
--@@ -225,36 +225,37 @@ config RT2800SOC
-- 
-- 
-- config RT2800_LIB
---	tristate
--+	tristate "RT2800 USB/PCI support"
-- 	depends on m
-- 
-- config RT2800_LIB_MMIO
---	tristate
--+	tristate "RT2800 MMIO support"
-- 	depends on m
-- 	select RT2X00_LIB_MMIO
-- 	select RT2800_LIB
-- 
-- config RT2X00_LIB_MMIO
---	tristate
--+	tristate "RT2x00 MMIO support"
-- 	depends on m
-- 
-- config RT2X00_LIB_PCI
---	tristate
--+	tristate "RT2x00 PCI support"
-- 	depends on m
-- 	select RT2X00_LIB
-- 
-- config RT2X00_LIB_SOC
---	tristate
--+	tristate "RT2x00 SoC support"
--+	depends on SOC_RT288X || SOC_RT305X
-- 	depends on m
-- 	select RT2X00_LIB
-- 
-- config RT2X00_LIB_USB
---	tristate
--+	tristate "RT2x00 USB support"
-- 	depends on m
-- 	select RT2X00_LIB
-- 
-- config RT2X00_LIB
---	tristate
--+	tristate "RT2x00 support"
-- 	depends on m
-- 	select BACKPORT_AVERAGE
-- 
-diff --git a/package/mac80211/patches/040-brcmutil_option.patch b/package/mac80211/patches/040-brcmutil_option.patch
-deleted file mode 100644
-index 8a6cae6..0000000
---- a/package/mac80211/patches/040-brcmutil_option.patch
-+++ /dev/null
-@@ -1,9 +0,0 @@
----- a/drivers/net/wireless/brcm80211/Kconfig
--+++ b/drivers/net/wireless/brcm80211/Kconfig
--@@ -1,5 +1,5 @@
-- config BRCMUTIL
---	tristate
--+	tristate "Broadcom 802.11 driver utility functions"
-- 	depends on m
-- 
-- config BRCMSMAC
-diff --git a/package/mac80211/patches/050-lib80211_option.patch b/package/mac80211/patches/050-lib80211_option.patch
-deleted file mode 100644
-index 5372114..0000000
---- a/package/mac80211/patches/050-lib80211_option.patch
-+++ /dev/null
-@@ -1,30 +0,0 @@
----- a/net/wireless/Kconfig
--+++ b/net/wireless/Kconfig
--@@ -123,7 +123,7 @@ config CFG80211_WEXT
-- 	  extensions with cfg80211-based drivers.
-- 
-- config LIB80211
---	tristate
--+	tristate "lib80211"
-- 	depends on m
-- 	default n
-- 	help
--@@ -133,15 +133,15 @@ config LIB80211
-- 	  Drivers should select this themselves if needed.
-- 
-- config LIB80211_CRYPT_WEP
---	tristate
--+	tristate "lib80211 WEP support"
-- 	depends on m
-- 
-- config LIB80211_CRYPT_CCMP
---	tristate
--+	tristate "lib80211 CCMP support"
-- 	depends on m
-- 
-- config LIB80211_CRYPT_TKIP
---	tristate
--+	tristate "lib80211 TKIP support"
-- 	depends on m
-- 
-- config LIB80211_DEBUG
-diff --git a/package/mac80211/patches/060-no_local_ssb_bcma.patch b/package/mac80211/patches/060-no_local_ssb_bcma.patch
-deleted file mode 100644
-index f4b9470..0000000
---- a/package/mac80211/patches/060-no_local_ssb_bcma.patch
-+++ /dev/null
-@@ -1,129 +0,0 @@
----- a/.local-symbols
--+++ b/.local-symbols
--@@ -379,42 +379,6 @@ USB_CDC_PHONET=
-- USB_IPHETH=
-- USB_SIERRA_NET=
-- USB_VL600=
---SSB_POSSIBLE=
---SSB=
---SSB_SPROM=
---SSB_BLOCKIO=
---SSB_PCIHOST_POSSIBLE=
---SSB_PCIHOST=
---SSB_B43_PCI_BRIDGE=
---SSB_PCMCIAHOST_POSSIBLE=
---SSB_PCMCIAHOST=
---SSB_SDIOHOST_POSSIBLE=
---SSB_SDIOHOST=
---SSB_SILENT=
---SSB_DEBUG=
---SSB_SERIAL=
---SSB_DRIVER_PCICORE_POSSIBLE=
---SSB_DRIVER_PCICORE=
---SSB_PCICORE_HOSTMODE=
---SSB_DRIVER_MIPS=
---SSB_SFLASH=
---SSB_EMBEDDED=
---SSB_DRIVER_EXTIF=
---SSB_DRIVER_GIGE=
---SSB_DRIVER_GPIO=
---BCMA_POSSIBLE=
---BCMA=
---BCMA_BLOCKIO=
---BCMA_HOST_PCI_POSSIBLE=
---BCMA_HOST_PCI=
---BCMA_DRIVER_PCI_HOSTMODE=
---BCMA_HOST_SOC=
---BCMA_DRIVER_MIPS=
---BCMA_SFLASH=
---BCMA_NFLASH=
---BCMA_DRIVER_GMAC_CMN=
---BCMA_DRIVER_GPIO=
---BCMA_DEBUG=
-- NFC=
-- NFC_DIGITAL=
-- NFC_NCI=
----- a/Kconfig
--+++ b/Kconfig
--@@ -33,9 +33,6 @@ source drivers/net/wireless/Kconfig
-- source drivers/net/ethernet/Kconfig
-- source drivers/net/usb/Kconfig
-- 
---source drivers/ssb/Kconfig
---source drivers/bcma/Kconfig
---
-- source net/nfc/Kconfig
-- 
-- source drivers/regulator/Kconfig
----- a/Makefile.kernel
--+++ b/Makefile.kernel
--@@ -25,8 +25,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
-- obj-$(CPTCFG_WLAN) += drivers/net/wireless/
-- obj-$(CPTCFG_BT) += net/bluetooth/
-- obj-$(CPTCFG_BT) += drivers/bluetooth/
---obj-$(CPTCFG_SSB) += drivers/ssb/
---obj-$(CPTCFG_BCMA) += drivers/bcma/
-- obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/
-- obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
-- obj-$(CPTCFG_NFC) += net/nfc/
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -2734,7 +2734,7 @@ static struct ssb_device *b43_ssb_gpio_d
-- {
-- 	struct ssb_bus *bus = dev->dev->sdev->bus;
-- 
---#ifdef CPTCFG_SSB_DRIVER_PCICORE
--+#ifdef CONFIG_SSB_DRIVER_PCICORE
-- 	return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
-- #else
-- 	return bus->chipco.dev;
--@@ -4751,7 +4751,7 @@ static int b43_wireless_core_init(struct
-- 	}
-- 	if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
-- 		hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
---#ifdef CPTCFG_SSB_DRIVER_PCICORE
--+#ifdef CONFIG_SSB_DRIVER_PCICORE
-- 	if (dev->dev->bus_type == B43_BUS_SSB &&
-- 	    dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
-- 	    dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
----- a/drivers/net/wireless/b43legacy/main.c
--+++ b/drivers/net/wireless/b43legacy/main.c
--@@ -1937,7 +1937,7 @@ static int b43legacy_gpio_init(struct b4
-- 	if (dev->dev->id.revision >= 2)
-- 		mask  |= 0x0010; /* FIXME: This is redundant. */
-- 
---#ifdef CPTCFG_SSB_DRIVER_PCICORE
--+#ifdef CONFIG_SSB_DRIVER_PCICORE
-- 	pcidev = bus->pcicore.dev;
-- #endif
-- 	gpiodev = bus->chipco.dev ? : pcidev;
--@@ -1956,7 +1956,7 @@ static void b43legacy_gpio_cleanup(struc
-- 	struct ssb_bus *bus = dev->dev->bus;
-- 	struct ssb_device *gpiodev, *pcidev = NULL;
-- 
---#ifdef CPTCFG_SSB_DRIVER_PCICORE
--+#ifdef CONFIG_SSB_DRIVER_PCICORE
-- 	pcidev = bus->pcicore.dev;
-- #endif
-- 	gpiodev = bus->chipco.dev ? : pcidev;
----- a/drivers/net/wireless/brcm80211/brcmsmac/Makefile
--+++ b/drivers/net/wireless/brcm80211/brcmsmac/Makefile
--@@ -43,6 +43,6 @@ brcmsmac-y := \
-- 	brcms_trace_events.o \
-- 	debug.o
-- 
---brcmsmac-$(CPTCFG_BCMA_DRIVER_GPIO) += led.o
--+brcmsmac-$(CONFIG_BCMA_DRIVER_GPIO) += led.o
-- 
-- obj-$(CPTCFG_BRCMSMAC)	+= brcmsmac.o
----- a/drivers/net/wireless/brcm80211/brcmsmac/led.h
--+++ b/drivers/net/wireless/brcm80211/brcmsmac/led.h
--@@ -22,7 +22,7 @@ struct brcms_led {
-- 	bool active_low;
-- };
-- 
---#ifdef CPTCFG_BCMA_DRIVER_GPIO
--+#ifdef CONFIG_BCMA_DRIVER_GPIO
-- void brcms_led_unregister(struct brcms_info *wl);
-- int brcms_led_register(struct brcms_info *wl);
-- #else
-diff --git a/package/mac80211/patches/100-revert_aes_ccm_port.patch b/package/mac80211/patches/100-revert_aes_ccm_port.patch
-deleted file mode 100644
-index 4654bc8..0000000
---- a/package/mac80211/patches/100-revert_aes_ccm_port.patch
-+++ /dev/null
-@@ -1,347 +0,0 @@
----- a/net/mac80211/Kconfig
--+++ b/net/mac80211/Kconfig
--@@ -5,7 +5,6 @@ config MAC80211
-- 	depends on CRYPTO
-- 	depends on CRYPTO_ARC4
-- 	depends on CRYPTO_AES
---	depends on CRYPTO_CCM
-- 	depends on CRC32
-- 	select BACKPORT_AVERAGE
-- 	---help---
----- a/net/mac80211/aes_ccm.c
--+++ b/net/mac80211/aes_ccm.c
--@@ -2,8 +2,6 @@
--  * Copyright 2003-2004, Instant802 Networks, Inc.
--  * Copyright 2005-2006, Devicescape Software, Inc.
--  *
--- * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
--- *
--  * This program is free software; you can redistribute it and/or modify
--  * it under the terms of the GNU General Public License version 2 as
--  * published by the Free Software Foundation.
--@@ -19,75 +17,134 @@
-- #include "key.h"
-- #include "aes_ccm.h"
-- 
---void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
---			       u8 *data, size_t data_len, u8 *mic)
--+static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *scratch, u8 *a)
-- {
---	struct scatterlist assoc, pt, ct[2];
---	struct {
---		struct aead_request	req;
---		u8			priv[crypto_aead_reqsize(tfm)];
---	} aead_req;
---
---	memset(&aead_req, 0, sizeof(aead_req));
---
---	sg_init_one(&pt, data, data_len);
---	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
---	sg_init_table(ct, 2);
---	sg_set_buf(&ct[0], data, data_len);
---	sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
---
---	aead_request_set_tfm(&aead_req.req, tfm);
---	aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
---	aead_request_set_crypt(&aead_req.req, &pt, ct, data_len, b_0);
--+	int i;
--+	u8 *b_0, *aad, *b, *s_0;
-- 
---	crypto_aead_encrypt(&aead_req.req);
--+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
--+	aad = scratch + 4 * AES_BLOCK_SIZE;
--+	b = scratch;
--+	s_0 = scratch + AES_BLOCK_SIZE;
--+
--+	crypto_cipher_encrypt_one(tfm, b, b_0);
--+
--+	/* Extra Authenticate-only data (always two AES blocks) */
--+	for (i = 0; i < AES_BLOCK_SIZE; i++)
--+		aad[i] ^= b[i];
--+	crypto_cipher_encrypt_one(tfm, b, aad);
--+
--+	aad += AES_BLOCK_SIZE;
--+
--+	for (i = 0; i < AES_BLOCK_SIZE; i++)
--+		aad[i] ^= b[i];
--+	crypto_cipher_encrypt_one(tfm, a, aad);
--+
--+	/* Mask out bits from auth-only-b_0 */
--+	b_0[0] &= 0x07;
--+
--+	/* S_0 is used to encrypt T (= MIC) */
--+	b_0[14] = 0;
--+	b_0[15] = 0;
--+	crypto_cipher_encrypt_one(tfm, s_0, b_0);
-- }
-- 
---int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
---			      u8 *data, size_t data_len, u8 *mic)
--+
--+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
--+			       u8 *data, size_t data_len,
--+			       u8 *cdata, u8 *mic)
-- {
---	struct scatterlist assoc, pt, ct[2];
---	struct {
---		struct aead_request	req;
---		u8			priv[crypto_aead_reqsize(tfm)];
---	} aead_req;
---
---	memset(&aead_req, 0, sizeof(aead_req));
---
---	sg_init_one(&pt, data, data_len);
---	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
---	sg_init_table(ct, 2);
---	sg_set_buf(&ct[0], data, data_len);
---	sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
---
---	aead_request_set_tfm(&aead_req.req, tfm);
---	aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
---	aead_request_set_crypt(&aead_req.req, ct, &pt,
---			       data_len + IEEE80211_CCMP_MIC_LEN, b_0);
--+	int i, j, last_len, num_blocks;
--+	u8 *pos, *cpos, *b, *s_0, *e, *b_0;
--+
--+	b = scratch;
--+	s_0 = scratch + AES_BLOCK_SIZE;
--+	e = scratch + 2 * AES_BLOCK_SIZE;
--+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
--+
--+	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
--+	last_len = data_len % AES_BLOCK_SIZE;
--+	aes_ccm_prepare(tfm, scratch, b);
--+
--+	/* Process payload blocks */
--+	pos = data;
--+	cpos = cdata;
--+	for (j = 1; j <= num_blocks; j++) {
--+		int blen = (j == num_blocks && last_len) ?
--+			last_len : AES_BLOCK_SIZE;
--+
--+		/* Authentication followed by encryption */
--+		for (i = 0; i < blen; i++)
--+			b[i] ^= pos[i];
--+		crypto_cipher_encrypt_one(tfm, b, b);
--+
--+		b_0[14] = (j >> 8) & 0xff;
--+		b_0[15] = j & 0xff;
--+		crypto_cipher_encrypt_one(tfm, e, b_0);
--+		for (i = 0; i < blen; i++)
--+			*cpos++ = *pos++ ^ e[i];
--+	}
-- 
---	return crypto_aead_decrypt(&aead_req.req);
--+	for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++)
--+		mic[i] = b[i] ^ s_0[i];
-- }
-- 
---struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
--+
--+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
--+			      u8 *cdata, size_t data_len, u8 *mic, u8 *data)
-- {
---	struct crypto_aead *tfm;
---	int err;
--+	int i, j, last_len, num_blocks;
--+	u8 *pos, *cpos, *b, *s_0, *a, *b_0;
-- 
---	tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
---	if (IS_ERR(tfm))
---		return tfm;
---
---	err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
---	if (!err)
---		err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
---	if (!err)
---		return tfm;
--+	b = scratch;
--+	s_0 = scratch + AES_BLOCK_SIZE;
--+	a = scratch + 2 * AES_BLOCK_SIZE;
--+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
--+
--+	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
--+	last_len = data_len % AES_BLOCK_SIZE;
--+	aes_ccm_prepare(tfm, scratch, a);
--+
--+	/* Process payload blocks */
--+	cpos = cdata;
--+	pos = data;
--+	for (j = 1; j <= num_blocks; j++) {
--+		int blen = (j == num_blocks && last_len) ?
--+			last_len : AES_BLOCK_SIZE;
--+
--+		/* Decryption followed by authentication */
--+		b_0[14] = (j >> 8) & 0xff;
--+		b_0[15] = j & 0xff;
--+		crypto_cipher_encrypt_one(tfm, b, b_0);
--+		for (i = 0; i < blen; i++) {
--+			*pos = *cpos++ ^ b[i];
--+			a[i] ^= *pos++;
--+		}
--+		crypto_cipher_encrypt_one(tfm, a, a);
--+	}
--+
--+	for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) {
--+		if ((mic[i] ^ s_0[i]) != a[i])
--+			return -1;
--+	}
-- 
---	crypto_free_aead(tfm);
---	return ERR_PTR(err);
--+	return 0;
-- }
-- 
---void ieee80211_aes_key_free(struct crypto_aead *tfm)
--+
--+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
--+{
--+	struct crypto_cipher *tfm;
--+
--+	tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
--+	if (!IS_ERR(tfm))
--+		crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
--+
--+	return tfm;
--+}
--+
--+
--+void ieee80211_aes_key_free(struct crypto_cipher *tfm)
-- {
---	crypto_free_aead(tfm);
--+	crypto_free_cipher(tfm);
-- }
----- a/net/mac80211/aes_ccm.h
--+++ b/net/mac80211/aes_ccm.h
--@@ -12,11 +12,13 @@
-- 
-- #include <linux/crypto.h>
-- 
---struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[]);
---void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
---			       u8 *data, size_t data_len, u8 *mic);
---int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
---			      u8 *data, size_t data_len, u8 *mic);
---void ieee80211_aes_key_free(struct crypto_aead *tfm);
--+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[]);
--+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
--+			       u8 *data, size_t data_len,
--+			       u8 *cdata, u8 *mic);
--+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
--+			      u8 *cdata, size_t data_len,
--+			      u8 *mic, u8 *data);
--+void ieee80211_aes_key_free(struct crypto_cipher *tfm);
-- 
-- #endif /* AES_CCM_H */
----- a/net/mac80211/key.h
--+++ b/net/mac80211/key.h
--@@ -84,7 +84,7 @@ struct ieee80211_key {
-- 			 * Management frames.
-- 			 */
-- 			u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
---			struct crypto_aead *tfm;
--+			struct crypto_cipher *tfm;
-- 			u32 replays; /* dot11RSNAStatsCCMPReplays */
-- 		} ccmp;
-- 		struct {
----- a/net/mac80211/wpa.c
--+++ b/net/mac80211/wpa.c
--@@ -301,16 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
-- }
-- 
-- 
---static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
--+static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
-- 				int encrypted)
-- {
-- 	__le16 mask_fc;
-- 	int a4_included, mgmt;
-- 	u8 qos_tid;
---	u16 len_a;
--+	u8 *b_0, *aad;
--+	u16 data_len, len_a;
-- 	unsigned int hdrlen;
-- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-- 
--+	memset(scratch, 0, 6 * AES_BLOCK_SIZE);
--+
--+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
--+	aad = scratch + 4 * AES_BLOCK_SIZE;
--+
-- 	/*
-- 	 * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
-- 	 * Retry, PwrMgt, MoreData; set Protected
--@@ -332,21 +338,20 @@ static void ccmp_special_blocks(struct s
-- 	else
-- 		qos_tid = 0;
-- 
---	/* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
---	 * mode authentication are not allowed to collide, yet both are derived
---	 * from this vector b_0. We only set L := 1 here to indicate that the
---	 * data size can be represented in (L+1) bytes. The CCM layer will take
---	 * care of storing the data length in the top (L+1) bytes and setting
---	 * and clearing the other bits as is required to derive the two IVs.
---	 */
---	b_0[0] = 0x1;
--+	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN;
--+	if (encrypted)
--+		data_len -= IEEE80211_CCMP_MIC_LEN;
-- 
--+	/* First block, b_0 */
--+	b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
-- 	/* Nonce: Nonce Flags | A2 | PN
-- 	 * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
-- 	 */
-- 	b_0[1] = qos_tid | (mgmt << 4);
-- 	memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
-- 	memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
--+	/* l(m) */
--+	put_unaligned_be16(data_len, &b_0[14]);
-- 
-- 	/* AAD (extra authenticate-only data) / masked 802.11 header
-- 	 * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
--@@ -402,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8
-- 	u8 *pos;
-- 	u8 pn[6];
-- 	u64 pn64;
---	u8 aad[2 * AES_BLOCK_SIZE];
---	u8 b_0[AES_BLOCK_SIZE];
--+	u8 scratch[6 * AES_BLOCK_SIZE];
-- 
-- 	if (info->control.hw_key &&
-- 	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
--@@ -456,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8
-- 		return 0;
-- 
-- 	pos += IEEE80211_CCMP_HDR_LEN;
---	ccmp_special_blocks(skb, pn, b_0, aad, 0);
---	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
---				  skb_put(skb, IEEE80211_CCMP_MIC_LEN));
--+	ccmp_special_blocks(skb, pn, scratch, 0);
--+	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len,
--+				  pos, skb_put(skb, IEEE80211_CCMP_MIC_LEN));
-- 
-- 	return 0;
-- }
--@@ -521,16 +525,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
-- 	}
-- 
-- 	if (!(status->flag & RX_FLAG_DECRYPTED)) {
---		u8 aad[2 * AES_BLOCK_SIZE];
---		u8 b_0[AES_BLOCK_SIZE];
--+		u8 scratch[6 * AES_BLOCK_SIZE];
-- 		/* hardware didn't decrypt/verify MIC */
---		ccmp_special_blocks(skb, pn, b_0, aad, 1);
--+		ccmp_special_blocks(skb, pn, scratch, 1);
-- 
-- 		if (ieee80211_aes_ccm_decrypt(
---			    key->u.ccmp.tfm, b_0, aad,
--+			    key->u.ccmp.tfm, scratch,
-- 			    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
-- 			    data_len,
---			    skb->data + skb->len - IEEE80211_CCMP_MIC_LEN))
--+			    skb->data + skb->len - IEEE80211_CCMP_MIC_LEN,
--+			    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN))
-- 			return RX_DROP_UNUSABLE;
-- 	}
-- 
-diff --git a/package/mac80211/patches/150-disable_addr_notifier.patch b/package/mac80211/patches/150-disable_addr_notifier.patch
-deleted file mode 100644
-index 7b50154..0000000
---- a/package/mac80211/patches/150-disable_addr_notifier.patch
-+++ /dev/null
-@@ -1,67 +0,0 @@
----- a/net/mac80211/main.c
--+++ b/net/mac80211/main.c
--@@ -287,7 +287,7 @@ void ieee80211_restart_hw(struct ieee802
-- }
-- EXPORT_SYMBOL(ieee80211_restart_hw);
-- 
---#ifdef CONFIG_INET
--+#ifdef __disabled__CONFIG_INET
-- static int ieee80211_ifa_changed(struct notifier_block *nb,
-- 				 unsigned long data, void *arg)
-- {
--@@ -346,7 +346,7 @@ static int ieee80211_ifa_changed(struct 
-- }
-- #endif
-- 
---#if IS_ENABLED(CONFIG_IPV6)
--+#if IS_ENABLED(__disabled__CONFIG_IPV6)
-- static int ieee80211_ifa6_changed(struct notifier_block *nb,
-- 				  unsigned long data, void *arg)
-- {
--@@ -1031,14 +1031,14 @@ int ieee80211_register_hw(struct ieee802
-- 		goto fail_pm_qos;
-- 	}
-- 
---#ifdef CONFIG_INET
--+#ifdef __disabled__CONFIG_INET
-- 	local->ifa_notifier.notifier_call = ieee80211_ifa_changed;
-- 	result = register_inetaddr_notifier(&local->ifa_notifier);
-- 	if (result)
-- 		goto fail_ifa;
-- #endif
-- 
---#if IS_ENABLED(CONFIG_IPV6)
--+#if IS_ENABLED(__disabled__CONFIG_IPV6)
-- 	local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
-- 	result = register_inet6addr_notifier(&local->ifa6_notifier);
-- 	if (result)
--@@ -1047,13 +1047,13 @@ int ieee80211_register_hw(struct ieee802
-- 
-- 	return 0;
-- 
---#if IS_ENABLED(CONFIG_IPV6)
--+#if IS_ENABLED(__disabled__CONFIG_IPV6)
--  fail_ifa6:
---#ifdef CONFIG_INET
--+#ifdef __disabled__CONFIG_INET
-- 	unregister_inetaddr_notifier(&local->ifa_notifier);
-- #endif
-- #endif
---#if defined(CONFIG_INET) || defined(CONFIG_IPV6)
--+#if defined(__disabled__CONFIG_INET) || defined(__disabled__CONFIG_IPV6)
--  fail_ifa:
-- 	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
-- 			       &local->network_latency_notifier);
--@@ -1086,10 +1086,10 @@ void ieee80211_unregister_hw(struct ieee
-- 
-- 	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
-- 			       &local->network_latency_notifier);
---#ifdef CONFIG_INET
--+#ifdef __disabled__CONFIG_INET
-- 	unregister_inetaddr_notifier(&local->ifa_notifier);
-- #endif
---#if IS_ENABLED(CONFIG_IPV6)
--+#if IS_ENABLED(__disabled__CONFIG_IPV6)
-- 	unregister_inet6addr_notifier(&local->ifa6_notifier);
-- #endif
-- 
-diff --git a/package/mac80211/patches/200-ath5k_pci_dependency.patch b/package/mac80211/patches/200-ath5k_pci_dependency.patch
-deleted file mode 100644
-index 2d99b4a..0000000
---- a/package/mac80211/patches/200-ath5k_pci_dependency.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/ath/ath5k/Kconfig
--+++ b/drivers/net/wireless/ath/ath5k/Kconfig
--@@ -55,7 +55,7 @@ config ATH5K_TRACER
-- 
-- config ATH5K_AHB
-- 	bool "Atheros 5xxx AHB bus support"
---	depends on (ATHEROS_AR231X && !PCI)
--+	depends on ATHEROS_AR231X
-- 	---help---
-- 	  This adds support for WiSoC type chipsets of the 5xxx Atheros
-- 	  family.
-diff --git a/package/mac80211/patches/201-ath5k-WAR-for-AR71xx-PCI-bug.patch b/package/mac80211/patches/201-ath5k-WAR-for-AR71xx-PCI-bug.patch
-deleted file mode 100644
-index 21516ff..0000000
---- a/package/mac80211/patches/201-ath5k-WAR-for-AR71xx-PCI-bug.patch
-+++ /dev/null
-@@ -1,38 +0,0 @@
----- a/drivers/net/wireless/ath/ath5k/initvals.c
--+++ b/drivers/net/wireless/ath/ath5k/initvals.c
--@@ -62,8 +62,14 @@ static const struct ath5k_ini ar5210_ini
-- 	{ AR5K_IMR,		0 },
-- 	{ AR5K_IER,		AR5K_IER_DISABLE },
-- 	{ AR5K_BSR,		0, AR5K_INI_READ },
--+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
-- 	{ AR5K_TXCFG,		AR5K_DMASIZE_128B },
-- 	{ AR5K_RXCFG,		AR5K_DMASIZE_128B },
--+#else
--+	/* WAR for AR71xx PCI bug */
--+	{ AR5K_TXCFG,		AR5K_DMASIZE_128B },
--+	{ AR5K_RXCFG,		AR5K_DMASIZE_4B },
--+#endif
-- 	{ AR5K_CFG,		AR5K_INIT_CFG },
-- 	{ AR5K_TOPS,		8 },
-- 	{ AR5K_RXNOFRM,		8 },
----- a/drivers/net/wireless/ath/ath5k/dma.c
--+++ b/drivers/net/wireless/ath/ath5k/dma.c
--@@ -869,10 +869,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah)
-- 	 * guess we can tweak it and see how it goes ;-)
-- 	 */
-- 	if (ah->ah_version != AR5K_AR5210) {
--+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
-- 		AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
-- 			AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
-- 		AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
-- 			AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_128B);
--+#else
--+		/* WAR for AR71xx PCI bug */
--+		AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
--+			AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
--+		AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
--+			AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_4B);
--+#endif
-- 	}
-- 
-- 	/* Pre-enable interrupts on 5211/5212*/
-diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
-deleted file mode 100644
-index 1da7941..0000000
---- a/package/mac80211/patches/300-pending_work.patch
-+++ /dev/null
-@@ -1,4142 +0,0 @@
--commit 584d297fd29fb39c76af25ae74ff9d5fe74c8a14
--Author: Helmut Schaa <helmut.schaa@googlemail.com>
--Date:   Wed Mar 12 10:37:55 2014 +0100
--
--    ath9k: Fix sequence number assignment for non-data frames
--    
--    Since commit 558ff225de80ac95b132d3a115ddadcd64498b4f (ath9k: fix
--    ps-poll responses under a-mpdu sessions) non-data frames would have
--    gotten a sequence number from a TIDs sequence counter instead of
--    using the global sequence counter.
--    
--    This can lead to instable connections.
--    
--    To fix this only select the correct TID if we are processing a
--    data frame. Furthermore, prevent non-data frames to get a sequence
--    number from a TID sequence counter by adding a check to
--    ath_tx_setup_buffer.
--    
--    Cc: Felix Fietkau <nbd@openwrt.org>
--    Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
--
--commit 3a0f984b1cdcd6a9f8c441635ef3b05d58547f4e
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Tue Mar 11 14:03:32 2014 +0100
--
--    ath9k_hw: set ANI firstep as absolute values instead of relative
--    
--    On older chips, the INI value differ in similar ways as cycpwr_thr1, so
--    convert it to absolute values as well.
--    
--    Since the ANI algorithm is different here compared to the old
--    implementation (fewer steps, controlled at a different point in time),
--    it makes sense to use values similar to what would be applied for newer
--    chips, just without relying on INI defaults.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 91d70d40400c569b49605b78fd7c43e9405694f4
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Tue Mar 11 14:00:37 2014 +0100
--
--    ath9k_hw: set ANI cycpwr_thr1 as absolute values instead of relative
--    
--    The table was copied from the ANI implementation of AR9300. It assumes
--    that the INI values contain a baseline value that is usable as reference
--    from which to increase/decrease based on the noise immunity value.
--    
--    On older chips, the differences are bigger and especially AR5008/AR9001
--    are configured to much more sensitive values than what is useful.
--    
--    Improve ANI behavior by reverting to the absolute values used in the
--    previous implementation (expressed as a simple formula instead of the
--    old table).
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit c977493766310a825f406836636ffd66e1447783
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Mon Mar 10 19:52:56 2014 +0100
--
--    ath9k_hw: remove ANI function restrictions for AP mode
--    
--    The primary purpose of this piece of code was to selectively disable
--    OFDM weak signal detection. The checks for this are elsewhere, and an
--    earlier commit relaxed the restrictions for older chips, which are more
--    sensitive to interference.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 8d804f1af11e4e058b1e8453327777d73a585cb8
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sun Mar 9 11:25:43 2014 +0100
--
--    ath9k: clean up and enhance ANI debugfs file
--    
--    Unify scnprintf calls and include the current OFDM/CCK immunity level.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 22e298b5a3a8a49e33805d4e351965123dede35b
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sun Mar 9 10:58:47 2014 +0100
--
--    ath9k: fix ready time of the multicast buffer queue
--    
--    qi->tqi_readyTime is written directly to registers that expect
--    microseconds as unit instead of TU.
--    When setting the CABQ ready time, cur_conf->beacon_interval is in TU, so
--    convert it to microseconds before passing it to ath9k_hw.
--    
--    This should hopefully fix some Tx DMA issues with buffered multicast
--    frames in AP mode.
--    
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit fcb064fdd5a27bec8d24099bc0172468f34c97cb
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sun Mar 9 09:43:09 2014 +0100
--
--    ath9k_hw: fix unreachable code in baseband hang detection code
--    
--    The commit "ath9k: reduce baseband hang detection false positive rate"
--    added a delay in the loop checking the baseband state, however it was
--    unreachable due to previous 'continue' statements.
--    
--    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 31959d8df39319e32c6d5ba9c135727be90cfad7
--Author: Michal Kazior <michal.kazior@tieto.com>
--Date:   Fri Mar 7 08:09:38 2014 +0100
--
--    mac80211: fix possible NULL dereference
--    
--    If chanctx is missing on a given vif then the band
--    is assumed to be 2GHz. However if hw doesn't
--    support 2GHz band then mac80211 ended up with a
--    NULL dereference.
--    
--    This fixes a splat:
--    
--    [ 4605.207223] BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
--    [ 4605.210789] IP: [<ffffffffa07b5635>] ieee80211_parse_bitrates+0x65/0x110 [mac80211]
--    
--    The splat was preceeded by WARN_ON(!chanctx_conf)
--    in ieee80211_get_sdata_band().
--    
--    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
--
--commit 6c5a3ffa0a2d22c091a2717f427259bacf77ac5e
--Author: Michael Braun <michael-dev@fami-braun.de>
--Date:   Thu Mar 6 15:08:43 2014 +0100
--
--    mac80211: fix WPA with VLAN on AP side with ps-sta again
--    
--    commit de74a1d9032f4d37ea453ad2a647e1aff4cd2591
--      "mac80211: fix WPA with VLAN on AP side with ps-sta"
--    fixed an issue where queued multicast packets would
--    be sent out encrypted with the key of an other bss.
--    
--    commit "7cbf9d017dbb5e3276de7d527925d42d4c11e732"
--      "mac80211: fix oops on mesh PS broadcast forwarding"
--    essentially reverted it, because vif.type cannot be AP_VLAN
--    due to the check to vif.type in ieee80211_get_buffered_bc before.
--    
--    As the later commit intended to fix the MESH case, fix it
--    by checking for IFTYPE_AP instead of IFTYPE_AP_VLAN.
--    
--    Fixes: 7cbf9d017dbb
--    Cc: <stable@vger.kernel.org> # 3.10.x
--    Cc: <stable@vger.kernel.org> # 3.11.x
--    Cc: <stable@vger.kernel.org> # 3.12.x
--    Cc: <stable@vger.kernel.org> # 3.13.x
--    Cc: <linux-wireless@vger.kernel.org>
--    Cc: <projekt-wlan@fem.tu-ilmenau.de>
--    Signed-off-by: Michael Braun <michael-dev@fami-braun.de>
--
--commit 9d6ab9bdb9b368a6cf9519f0f92509b5b2c297ec
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Mon Mar 3 14:19:08 2014 +0100
--
--    cfg80211: remove racy beacon_interval assignment
--    
--    In case of AP mode, the beacon interval is already reset to
--    zero inside cfg80211_stop_ap(), and in the other modes it
--    isn't relevant. Remove the assignment to remove a potential
--    race since the assignment isn't properly locked.
--    
--    Reported-by: Michal Kazior <michal.kazior@tieto.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 1abdeca3c6fb9cf1f84f85e78ed8d1c33bd69db0
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Fri Feb 28 18:52:56 2014 +0100
--
--    ath9k_hw: tweak noise immunity thresholds for older chipsets
--    
--    Older chipsets are more sensitive to high PHY error counts, and the
--    current noise immunity thresholds were based on tests run at QCA with
--    newer chipsets.
--    
--    This patch brings back the values from the old ANI implementation for
--    old chipsets, and it also disables weak signal detection on an earlier
--    noise immunity level, to improve overall radio stability on affected
--    devices.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 431e506da5953adc3b65af25f4b90873d528c115
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Fri Feb 28 18:44:13 2014 +0100
--
--    ath9k_hw: toggle weak signal detection in AP mode on older chipsets
--    
--    The commit 80b4205b "ath9k: Fix OFDM weak signal detection for AP mode"
--    prevented weak signal detection changes from taking effect in AP mode on
--    all chipsets, claiming it is "not allowed".
--    
--    The main reason for not disabling weak signal detection in AP mode is
--    that typically beacon RSSI is used to track whether it is needed to
--    boost range, and this is unavailable in AP mode for obvious reasons.
--    
--    The problem with not disabling weak signal detection is that older
--    chipsets are very sensitive to high PHY error counts. When faced with
--    heavy noise, this can lead to an excessive amount of "Failed to stop
--    TX DMA" errors in the field.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 98d1a6c5b14688ed030e81b889f607be308e0df9
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Mon Feb 24 22:20:32 2014 +0100
--
--    ath9k: fix invalid descriptor discarding
--    
--    Only set sc->rx.discard_next to rx_stats->rs_more when actually
--    discarding the current descriptor.
--    
--    Also, fix a detection of broken descriptors:
--    First the code checks if the current descriptor is not done.
--    Then it checks if the next descriptor is done.
--    Add a check that afterwards checks the first descriptor again, because
--    it might have been completed in the mean time.
--    
--    This fixes a regression introduced in
--    commit 723e711356b5a8a95728a890e254e8b0d47b55cf
--    "ath9k: fix handling of broken descriptors"
--    
--    Cc: stable@vger.kernel.org
--    Reported-by: Marco André Dinis <marcoandredinis@gmail.com>
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 52a46300e782fe6994466523eb2b0b59091ea59f
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Mon Feb 24 11:43:50 2014 +0100
--
--    ath9k: reduce baseband hang detection false positive rate
--    
--    Check if the baseband state remains stable, and add a small delay
--    between register reads.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 118945bb12082e9d4edddc868d88143164e0f440
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sat Feb 22 14:55:23 2014 +0100
--
--    ath5k: set SURVEY_INFO_IN_USE on get_survey
--    
--    Only one channel is returned - the one currently being used.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit ee41f72476e1ea44283dfe1cbf75b9543a1e15c8
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sat Feb 22 14:44:52 2014 +0100
--
--    ath9k: make some hardware reset log messages debug-only
--    
--    On some chips, baseband watchdog hangs are more common than others, and
--    the driver has support for handling them.
--    Interrupts even after a watchdog hang are also quite common, so there's
--    not much point in spamming the user's logfiles.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit b14fbb554fc65a2e0b5c41a319269b0350f187e7
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sat Feb 22 14:35:25 2014 +0100
--
--    ath9k: do not set half/quarter channel flags in AR_PHY_MODE
--    
--    5/10 MHz channel bandwidth is configured via the PLL clock, instead of
--    the AR_PHY_MODE register. Using that register is AR93xx specific, and
--    makes the mode incompatible with earlier chipsets.
--    
--    In some early versions, these flags were apparently applied at the wrong
--    point in time and thus did not cause connectivity issues, however now
--    they are causing problems, as pointed out in this OpenWrt ticket:
--    
--    https://dev.openwrt.org/ticket/14916
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit 0f1cb7be2551b30b02cd54c897e0e29e483cfda5
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Sat Feb 22 13:43:29 2014 +0100
--
--    ath9k: fix ps-poll responses under a-mpdu sessions
--    
--    When passing tx frames to the U-APSD queue for powersave poll responses,
--    the ath_atx_tid pointer needs to be passed to ath_tx_setup_buffer for
--    proper sequence number accounting.
--    
--    This fixes high latency and connection stability issues with ath9k
--    running as AP and a few kinds of mobile phones as client, when PS-Poll
--    is heavily used
--    
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit d5d87a37bbd6066b2c3c5d0bd0fe2a6e2ea45cc5
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Fri Feb 21 11:39:59 2014 +0100
--
--    ath9k: list more reset causes in debugfs
--    
--    Number of MAC hangs and stuck beacons were missing
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit d84856012e0f10fe598a5ad3b7b869397a089e07
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Thu Feb 20 11:19:58 2014 +0100
--
--    mac80211: fix station wakeup powersave race
--    
--    Consider the following (relatively unlikely) scenario:
--     1) station goes to sleep while frames are buffered in driver
--     2) driver blocks wakeup (until no more frames are buffered)
--     3) station wakes up again
--     4) driver unblocks wakeup
--    
--    In this case, the current mac80211 code will do the following:
--     1) WLAN_STA_PS_STA set
--     2) WLAN_STA_PS_DRIVER set
--     3) - nothing -
--     4) WLAN_STA_PS_DRIVER cleared
--    
--    As a result, no frames will be delivered to the client, even
--    though it is awake, until it sends another frame to us that
--    triggers ieee80211_sta_ps_deliver_wakeup() in sta_ps_end().
--    
--    Since we now take the PS spinlock, we can fix this while at
--    the same time removing the complexity with the pending skb
--    queue function. This was broken since my commit 50a9432daeec
--    ("mac80211: fix powersaving clients races") due to removing
--    the clearing of WLAN_STA_PS_STA in the RX path.
--    
--    While at it, fix a cleanup path issue when a station is
--    removed while the driver is still blocking its wakeup.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 798f2786602cbe93e6b928299614aa36ebf50692
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Mon Feb 17 20:49:03 2014 +0100
--
--    mac80211: insert stations before adding to driver
--    
--    There's a race condition in mac80211 because we add stations
--    to the internal lists after adding them to the driver, which
--    means that (for example) the following can happen:
--     1. a station connects and is added
--     2. first, it is added to the driver
--     3. then, it is added to the mac80211 lists
--    
--    If the station goes to sleep between steps 2 and 3, and the
--    firmware/hardware records it as being asleep, mac80211 will
--    never instruct the driver to wake it up again as it never
--    realized it went to sleep since the RX path discarded the
--    frame as a "spurious class 3 frame", no station entry was
--    present yet.
--    
--    Fix this by adding the station in software first, and only
--    then adding it to the driver. That way, any state that the
--    driver changes will be reflected properly in mac80211's
--    station state. The problematic part is the roll-back if the
--    driver fails to add the station, in that case a bit more is
--    needed. To not make that overly complex prevent starting BA
--    sessions in the meantime.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit b9ba6a520cb07ab3aa7aaaf9ce4a0bc7a6bc06fe
--Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--Date:   Thu Feb 20 09:22:11 2014 +0200
--
--    mac80211: fix AP powersave TX vs. wakeup race
--    
--    There is a race between the TX path and the STA wakeup: while
--    a station is sleeping, mac80211 buffers frames until it wakes
--    up, then the frames are transmitted. However, the RX and TX
--    path are concurrent, so the packet indicating wakeup can be
--    processed while a packet is being transmitted.
--    
--    This can lead to a situation where the buffered frames list
--    is emptied on the one side, while a frame is being added on
--    the other side, as the station is still seen as sleeping in
--    the TX path.
--    
--    As a result, the newly added frame will not be send anytime
--    soon. It might be sent much later (and out of order) when the
--    station goes to sleep and wakes up the next time.
--    
--    Additionally, it can lead to the crash below.
--    
--    Fix all this by synchronising both paths with a new lock.
--    Both path are not fastpath since they handle PS situations.
--    
--    In a later patch we'll remove the extra skb queue locks to
--    reduce locking overhead.
--    
--    BUG: unable to handle kernel
--    NULL pointer dereference at 000000b0
--    IP: [<ff6f1791>] ieee80211_report_used_skb+0x11/0x3e0 [mac80211]
--    *pde = 00000000
--    Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
--    EIP: 0060:[<ff6f1791>] EFLAGS: 00210282 CPU: 1
--    EIP is at ieee80211_report_used_skb+0x11/0x3e0 [mac80211]
--    EAX: e5900da0 EBX: 00000000 ECX: 00000001 EDX: 00000000
--    ESI: e41d00c0 EDI: e5900da0 EBP: ebe458e4 ESP: ebe458b0
--     DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
--    CR0: 8005003b CR2: 000000b0 CR3: 25a78000 CR4: 000407d0
--    DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
--    DR6: ffff0ff0 DR7: 00000400
--    Process iperf (pid: 3934, ti=ebe44000 task=e757c0b0 task.ti=ebe44000)
--    iwlwifi 0000:02:00.0: I iwl_pcie_enqueue_hcmd Sending command LQ_CMD (#4e), seq: 0x0903, 92 bytes at 3[3]:9
--    Stack:
--     e403b32c ebe458c4 00200002 00200286 e403b338 ebe458cc c10960bb e5900da0
--     ff76a6ec ebe458d8 00000000 e41d00c0 e5900da0 ebe458f0 ff6f1b75 e403b210
--     ebe4598c ff723dc1 00000000 ff76a6ec e597c978 e403b758 00000002 00000002
--    Call Trace:
--     [<ff6f1b75>] ieee80211_free_txskb+0x15/0x20 [mac80211]
--     [<ff723dc1>] invoke_tx_handlers+0x1661/0x1780 [mac80211]
--     [<ff7248a5>] ieee80211_tx+0x75/0x100 [mac80211]
--     [<ff7249bf>] ieee80211_xmit+0x8f/0xc0 [mac80211]
--     [<ff72550e>] ieee80211_subif_start_xmit+0x4fe/0xe20 [mac80211]
--     [<c149ef70>] dev_hard_start_xmit+0x450/0x950
--     [<c14b9aa9>] sch_direct_xmit+0xa9/0x250
--     [<c14b9c9b>] __qdisc_run+0x4b/0x150
--     [<c149f732>] dev_queue_xmit+0x2c2/0xca0
--    
--    Cc: stable@vger.kernel.org
--    Reported-by: Yaara Rozenblum <yaara.rozenblum@intel.com>
--    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--    Reviewed-by: Stanislaw Gruszka <sgruszka@redhat.com>
--    [reword commit log, use a separate lock]
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 80e419de0dff38436b30d363311c625766193f86
--Author: Inbal Hacohen <Inbal.Hacohen@intel.com>
--Date:   Wed Feb 12 09:32:27 2014 +0200
--
--    cfg80211: bugfix in regulatory user hint process
--    
--    After processing hint_user, we would want to schedule the
--    timeout work only if we are actually waiting to CRDA. This happens
--    when the status is not "IGNORE" nor "ALREADY_SET".
--    
--    Signed-off-by: Inbal Hacohen <Inbal.Hacohen@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 6514c93afede55284e2cb63359aadedb85884c80
--Author: Jouni Malinen <jouni@qca.qualcomm.com>
--Date:   Tue Feb 18 20:41:08 2014 +0200
--
--    ath9k: Enable U-APSD AP mode support
--    
--    mac80211 handles the actual operations, so ath9k can just indicate
--    support for this. Based on initial tests, this combination seems to
--    work fine.
--    
--    Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
--
--commit a63caf0a357ad5c1f08d6b7827dc76c451445017
--Author: Stanislaw Gruszka <sgruszka@redhat.com>
--Date:   Wed Feb 19 13:15:17 2014 +0100
--
--    ath9k: protect tid->sched check
--    
--    We check tid->sched without a lock taken on ath_tx_aggr_sleep(). That
--    is race condition which can result of doing list_del(&tid->list) twice
--    (second time with poisoned list node) and cause crash like shown below:
--    
--    [424271.637220] BUG: unable to handle kernel paging request at 00100104
--    [424271.637328] IP: [<f90fc072>] ath_tx_aggr_sleep+0x62/0xe0 [ath9k]
--    ...
--    [424271.639953] Call Trace:
--    [424271.639998]  [<f90f6900>] ? ath9k_get_survey+0x110/0x110 [ath9k]
--    [424271.640083]  [<f90f6942>] ath9k_sta_notify+0x42/0x50 [ath9k]
--    [424271.640177]  [<f809cfef>] sta_ps_start+0x8f/0x1c0 [mac80211]
--    [424271.640258]  [<c10f730e>] ? free_compound_page+0x2e/0x40
--    [424271.640346]  [<f809e915>] ieee80211_rx_handlers+0x9d5/0x2340 [mac80211]
--    [424271.640437]  [<c112f048>] ? kmem_cache_free+0x1d8/0x1f0
--    [424271.640510]  [<c1345a84>] ? kfree_skbmem+0x34/0x90
--    [424271.640578]  [<c10fc23c>] ? put_page+0x2c/0x40
--    [424271.640640]  [<c1345a84>] ? kfree_skbmem+0x34/0x90
--    [424271.640706]  [<c1345a84>] ? kfree_skbmem+0x34/0x90
--    [424271.640787]  [<f809dde3>] ? ieee80211_rx_handlers_result+0x73/0x1d0 [mac80211]
--    [424271.640897]  [<f80a07a0>] ieee80211_prepare_and_rx_handle+0x520/0xad0 [mac80211]
--    [424271.641009]  [<f809e22d>] ? ieee80211_rx_handlers+0x2ed/0x2340 [mac80211]
--    [424271.641104]  [<c13846ce>] ? ip_output+0x7e/0xd0
--    [424271.641182]  [<f80a1057>] ieee80211_rx+0x307/0x7c0 [mac80211]
--    [424271.641266]  [<f90fa6ee>] ath_rx_tasklet+0x88e/0xf70 [ath9k]
--    [424271.641358]  [<f80a0f2c>] ? ieee80211_rx+0x1dc/0x7c0 [mac80211]
--    [424271.641445]  [<f90f82db>] ath9k_tasklet+0xcb/0x130 [ath9k]
--    
--    Bug report:
--    https://bugzilla.kernel.org/show_bug.cgi?id=70551
--    
--    Reported-and-tested-by: Max Sydorenko <maxim.stargazer@gmail.com>
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
--
--commit 82ed9e3ccc02797df2ffe4b78127c4cd5f799a41
--Author: Felix Fietkau <nbd@openwrt.org>
--Date:   Tue Feb 11 15:54:13 2014 +0100
--
--    mac80211: send control port protocol frames to the VO queue
--    
--    Improves reliability of wifi connections with WPA, since authentication
--    frames are prioritized over normal traffic and also typically exempt
--    from aggregation.
--    
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
--commit d4426800f71e972feaa33e04c5801fc730627bdd
--Author: Stanislaw Gruszka <stf_xl@wp.pl>
--Date:   Mon Feb 10 22:38:28 2014 +0100
--
--    rtl8187: fix regression on MIPS without coherent DMA
--    
--    This patch fixes regression caused by commit a16dad77634 "MIPS: Fix
--    potencial corruption". That commit fixes one corruption scenario in
--    cost of adding another one, which actually start to cause crashes
--    on Yeeloong laptop when rtl8187 driver is used.
--    
--    For correct DMA read operation on machines without DMA coherence, kernel
--    have to invalidate cache, such it will refill later with new data that
--    device wrote to memory, when that data is needed to process. We can only
--    invalidate full cache line. Hence when cache line includes both dma
--    buffer and some other data (written in cache, but not yet in main
--    memory), the other data can not hit memory due to invalidation. That
--    happen on rtl8187 where struct rtl8187_priv fields are located just
--    before and after small buffers that are passed to USB layer and DMA
--    is performed on them.
--    
--    To fix the problem we align buffers and reserve space after them to make
--    them match cache line.
--    
--    This patch does not resolve all possible MIPS problems entirely, for
--    that we have to assure that we always map cache aligned buffers for DMA,
--    what can be complex or even not possible. But patch fixes visible and
--    reproducible regression and seems other possible corruptions do not
--    happen in practice, since Yeeloong laptop works stable without rtl8187
--    driver.
--    
--    Bug report:
--    https://bugzilla.kernel.org/show_bug.cgi?id=54391
--    
--    Reported-by: Petr Pisar <petr.pisar@atlas.cz>
--    Bisected-by: Tom Li <biergaizi2009@gmail.com>
--    Reported-and-tested-by: Tom Li <biergaizi2009@gmail.com>
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Stanislaw Gruszka <stf_xl@wp.pl>
--
--commit e2f141d67ad1e7fe10aaab61811e8a409dfb2442
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:55 2014 +0530
--
--    ath9k: Calculate IQ-CAL median
--    
--    This patch adds a routine to calculate the median IQ correction
--    values for AR955x, which is used for outlier detection.
--    The normal method which is used for all other chips is
--    bypassed for AR955x.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit c52a6fce0820c8d0687443ab86058ae03b478c8f
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:54 2014 +0530
--
--    ath9k: Expand the IQ coefficient array
--    
--    This will be used for storing data for mutiple
--    IQ calibration runs, for AR955x.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit 034969ff5c2b6431d10e07c1938f0b916da85cc3
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:53 2014 +0530
--
--    ath9k: Modify IQ calibration for AR955x
--    
--    IQ calibration post-processing for AR955x is different
--    from other chips - instead of just doing it as part
--    of AGC calibration once, it is triggered 3 times and
--    a median is determined. This patch adds initial support
--    for changing the calibration behavior for AR955x.
--    
--    Also, to simplify things, a helper routine to issue/poll
--    AGC calibration is used.
--    
--    For non-AR955x chips, the iqcal_idx (which will be used
--    in subsequent patches) is set to zero.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit 9b1ed6454e6f3511f24266be99b4e403f243f6a8
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:52 2014 +0530
--
--    ath9k: Fix magnitude/phase calculation
--    
--    Incorrect values are programmed in the registers
--    containing the IQ correction coefficients by the IQ-CAL
--    post-processing code. Fix this.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit 36f93484f96f79171dcecb67c5ef0c3de22531a6
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:51 2014 +0530
--
--    ath9k: Rename ar9003_hw_tx_iqcal_load_avg_2_passes
--    
--    Use ar9003_hw_tx_iq_cal_outlier_detection instead.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit 3af09a7f5d21dd5fd15b973ce6a91a575da30417
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:50 2014 +0530
--
--    ath9k: Check explicitly for IQ calibration
--    
--    In chips like AR955x, the initvals contain the information
--    whether IQ calibration is to be done in the HW when an
--    AGC calibration is triggered. Check if IQ-CAL is enabled
--    in the initvals before flagging 'txiqcal_done' as true.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit cb4969634b93c4643a32cc3fbd27d2b288b25771
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Fri Feb 7 10:29:49 2014 +0530
--
--    ath9k: Fix IQ cal post processing for SoC
--    
--    Calibration data is not reused for SoC chips, so
--    call ar9003_hw_tx_iq_cal_post_proc() with the correct
--    argument. The 'is_reusable' flag is currently used
--    only for PC-OEM chips, but it makes things clearer to
--    specify it explicity.
--    
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit e138e0ef9560c46ce93dbb22a728a57888e94d1c
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Mon Feb 3 13:31:37 2014 +0530
--
--    ath9k: Fix TX power calculation
--    
--    The commit, "ath9k_hw: Fix incorrect Tx control power in AR9003 template"
--    fixed the incorrect values in the eeprom templates, but if
--    boards have already been calibrated with incorrect values,
--    they would still be using the wrong TX power. Fix this by assigning
--    a default value in such cases.
--    
--    Cc: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit b9f268b5b01331c3c82179abca551429450e9417
--Author: Michal Kazior <michal.kazior@tieto.com>
--Date:   Wed Jan 29 14:22:27 2014 +0100
--
--    cfg80211: consider existing DFS interfaces
--    
--    It was possible to break interface combinations in
--    the following way:
--    
--     combo 1: iftype = AP, num_ifaces = 2, num_chans = 2,
--     combo 2: iftype = AP, num_ifaces = 1, num_chans = 1, radar = HT20
--    
--    With the above interface combinations it was
--    possible to:
--    
--     step 1. start AP on DFS channel by matching combo 2
--     step 2. start AP on non-DFS channel by matching combo 1
--    
--    This was possible beacuse (step 2) did not consider
--    if other interfaces require radar detection.
--    
--    The patch changes how cfg80211 tracks channels -
--    instead of channel itself now a complete chandef
--    is stored.
--    
--    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit bc9c62f5f511cc395c62dbf4cdd437f23db53b28
--Author: Antonio Quartulli <antonio@open-mesh.com>
--Date:   Wed Jan 29 17:53:43 2014 +0100
--
--    cfg80211: fix channel configuration in IBSS join
--    
--    When receiving an IBSS_JOINED event select the BSS object
--    based on the {bssid, channel} couple rather than the bssid
--    only.
--    With the current approach if another cell having the same
--    BSSID (but using a different channel) exists then cfg80211
--    picks up the wrong BSS object.
--    The result is a mismatching channel configuration between
--    cfg80211 and the driver, that can lead to any sort of
--    problem.
--    
--    The issue can be triggered by having an IBSS sitting on
--    given channel and then asking the driver to create a new
--    cell using the same BSSID but with a different frequency.
--    By passing the channel to cfg80211_get_bss() we can solve
--    this ambiguity and retrieve/create the correct BSS object.
--    All the users of cfg80211_ibss_joined() have been changed
--    accordingly.
--    
--    Moreover WARN when cfg80211_ibss_joined() gets a NULL
--    channel as argument and remove a bogus call of the same
--    function in ath6kl (it does not make sense to call
--    cfg80211_ibss_joined() with a zero BSSID on ibss-leave).
--    
--    Cc: Kalle Valo <kvalo@qca.qualcomm.com>
--    Cc: Arend van Spriel <arend@broadcom.com>
--    Cc: Bing Zhao <bzhao@marvell.com>
--    Cc: Jussi Kivilinna <jussi.kivilinna@iki.fi>
--    Cc: libertas-dev@lists.infradead.org
--    Acked-by: Kalle Valo <kvalo@qca.qualcomm.com>
--    Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
--    [minor code cleanup in ath6kl]
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 7e0c41cb41f215aba2c39b1c237bb4d42ec49a85
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Fri Jan 24 14:41:44 2014 +0100
--
--    mac80211: fix bufferable MMPDU RX handling
--    
--    Action, disassoc and deauth frames are bufferable, and as such don't
--    have the PM bit in the frame control field reserved which means we
--    need to react to the bit when receiving in such a frame.
--    
--    Fix this by introducing a new helper ieee80211_is_bufferable_mmpdu()
--    and using it for the RX path that currently ignores the PM bit in
--    any non-data frames for doze->wake transitions, but listens to it in
--    all frames for wake->doze transitions, both of which are wrong.
--    
--    Also use the new helper in the TX path to clean up the code.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit fc0df6d2343636e3f48a069330d5b972e3d8659d
--Author: Janusz Dziedzic <janusz.dziedzic@tieto.com>
--Date:   Fri Jan 24 14:29:21 2014 +0100
--
--    cfg80211: set preset_chandef after channel switch
--    
--    Set preset_chandef in channel switch notification.
--    In other case we will have old preset_chandef.
--    
--    Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit cdec895e2344987ff171cece96e25d7407a3ebf6
--Author: Simon Wunderlich <simon@open-mesh.com>
--Date:   Fri Jan 24 23:48:29 2014 +0100
--
--    mac80211: send ibss probe responses with noack flag
--    
--    Responding to probe requests for scanning clients will often create
--    excessive retries, as it happens quite often that the scanning client
--    already left the channel. Therefore do it like hostapd and send probe
--    responses for wildcard SSID only once by using the noack flag.
--    
--    Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
--    [fix typo & 'wildcard SSID' in commit log]
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 0b865d1e6b9c05052adae9315df7cb195dc60c3b
--Author: Luciano Coelho <luciano.coelho@intel.com>
--Date:   Tue Jan 28 17:09:08 2014 +0200
--
--    mac80211: ibss: remove unnecessary call to release channel
--    
--    The ieee80211_vif_use_channel() function calls
--    ieee80211_vif_release_channel(), so there's no need to call it
--    explicitly in __ieee80211_sta_join_ibss().
--    
--    Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit e1b6c17e971f0a51ff86c2dac2584c63cd999cd7
--Author: Michal Kazior <michal.kazior@tieto.com>
--Date:   Wed Jan 29 07:56:21 2014 +0100
--
--    mac80211: add missing CSA locking
--    
--    The patch adds a missing sdata lock and adds a few
--    lockdeps for easier maintenance.
--    
--    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit ad17ba7d14d225b109b73c177cd446afb8050598
--Author: Michal Kazior <michal.kazior@tieto.com>
--Date:   Wed Jan 29 07:56:20 2014 +0100
--
--    mac80211: fix sdata->radar_required locking
--    
--    radar_required setting wasn't protected by
--    local->mtx in some places. This should prevent
--    from scanning/radar detection/roc colliding.
--    
--    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 5fcd5f1808813a3d9e502fd756e01bee8a79c85d
--Author: Michal Kazior <michal.kazior@tieto.com>
--Date:   Wed Jan 29 07:56:19 2014 +0100
--
--    mac80211: move csa_active setting in STA CSA
--    
--    The sdata->vif.csa_active could be left set after,
--    e.g. channel context constraints check fail in STA
--    mode leaving the interface in a strange state for
--    a brief period of time until it is disconnected.
--    This was harmless but ugly.
--    
--    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
--    Reviewed-by: Luciano Coelho <luciano.coelho@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit e486da4b7eed71821c6b4c1bb9ac62ffd3ab13e9
--Author: Michal Kazior <michal.kazior@tieto.com>
--Date:   Wed Jan 29 07:56:18 2014 +0100
--
--    mac80211: fix possible memory leak on AP CSA failure
--    
--    If CSA for AP interface failed and the interface
--    was not stopped afterwards another CSA request
--    would leak sdata->u.ap.next_beacon.
--    
--    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
--    Reviewed-by: Luciano Coelho <luciano.coelho@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 3a77ba08940682bf3d52cf14f980337324af9d4a
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Sat Feb 1 00:33:29 2014 +0100
--
--    mac80211: fix fragmentation code, particularly for encryption
--    
--    The "new" fragmentation code (since my rewrite almost 5 years ago)
--    erroneously sets skb->len rather than using skb_trim() to adjust
--    the length of the first fragment after copying out all the others.
--    This leaves the skb tail pointer pointing to after where the data
--    originally ended, and thus causes the encryption MIC to be written
--    at that point, rather than where it belongs: immediately after the
--    data.
--    
--    The impact of this is that if software encryption is done, then
--     a) encryption doesn't work for the first fragment, the connection
--        becomes unusable as the first fragment will never be properly
--        verified at the receiver, the MIC is practically guaranteed to
--        be wrong
--     b) we leak up to 8 bytes of plaintext (!) of the packet out into
--        the air
--    
--    This is only mitigated by the fact that many devices are capable
--    of doing encryption in hardware, in which case this can't happen
--    as the tail pointer is irrelevant in that case. Additionally,
--    fragmentation is not used very frequently and would normally have
--    to be configured manually.
--    
--    Fix this by using skb_trim() properly.
--    
--    Cc: stable@vger.kernel.org
--    Fixes: 2de8e0d999b8 ("mac80211: rewrite fragmentation")
--    Reported-by: Jouni Malinen <j@w1.fi>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit de5f242e0c10e841017e37eb8c38974a642dbca8
--Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--Date:   Tue Jan 28 06:21:59 2014 +0530
--
--    ath9k: Fix build error on ARM
--    
--    Use mdelay instead of udelay to fix this error:
--    
--    ERROR: "__bad_udelay" [drivers/net/wireless/ath/ath9k/ath9k_hw.ko] undefined!
--    make[1]: *** [__modpost] Error 1
--    make: *** [modules] Error 2
--    
--    Reported-by: Josh Boyer <jwboyer@fedoraproject.org>
--    Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
--
--commit 8e3ea7a51dfc61810fcefd947f6edcf61125252a
--Author: Geert Uytterhoeven <geert@linux-m68k.org>
--Date:   Sun Jan 26 11:53:21 2014 +0100
--
--    ath9k: Fix uninitialized variable in ath9k_has_tx_pending()
--    
--    drivers/net/wireless/ath/ath9k/main.c: In function ‘ath9k_has_tx_pending’:
--    drivers/net/wireless/ath/ath9k/main.c:1869: warning: ‘npend’ may be used uninitialized in this function
--    
--    Introduced by commit 10e2318103f5941aa70c318afe34bc41f1b98529 ("ath9k:
--    optimize ath9k_flush").
--    
--    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
--
--commit a4a634a6937ebdd827fa58e8fcdb8ca49a3769f6
--Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--Date:   Mon Jan 27 11:07:42 2014 +0200
--
--    mac80211: release the channel in error path in start_ap
--    
--    When the driver cannot start the AP or when the assignement
--    of the beacon goes wrong, we need to unassign the vif.
--    
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit dfb6889a75c601aedb7450b7e606668e77da6679
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Wed Jan 22 11:14:19 2014 +0200
--
--    cfg80211: send scan results from work queue
--    
--    Due to the previous commit, when a scan finishes, it is in theory
--    possible to hit the following sequence:
--     1. interface starts being removed
--     2. scan is cancelled by driver and cfg80211 is notified
--     3. scan done work is scheduled
--     4. interface is removed completely, rdev->scan_req is freed,
--        event sent to userspace but scan done work remains pending
--     5. new scan is requested on another virtual interface
--     6. scan done work runs, freeing the still-running scan
--    
--    To fix this situation, hang on to the scan done message and block
--    new scans while that is the case, and only send the message from
--    the work function, regardless of whether the scan_req is already
--    freed from interface removal. This makes step 5 above impossible
--    and changes step 6 to be
--     5. scan done work runs, sending the scan done message
--    
--    As this can't work for wext, so we send the message immediately,
--    but this shouldn't be an issue since we still return -EBUSY.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 45b7ab41fc08627d9a8428cb413d5d84662a9707
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Wed Jan 22 11:14:18 2014 +0200
--
--    cfg80211: fix scan done race
--    
--    When an interface/wdev is removed, any ongoing scan should be
--    cancelled by the driver. This will make it call cfg80211, which
--    only queues a work struct. If interface/wdev removal is quick
--    enough, this can leave the scan request pending and processed
--    only after the interface is gone, causing a use-after-free.
--    
--    Fix this by making sure the scan request is not pending after
--    the interface is destroyed. We can't flush or cancel the work
--    item due to locking concerns, but when it'll run it shouldn't
--    find anything to do. This leaves a potential issue, if a new
--    scan gets requested before the work runs, it prematurely stops
--    the running scan, potentially causing another crash. I'll fix
--    that in the next patch.
--    
--    This was particularly observed with P2P_DEVICE wdevs, likely
--    because freeing them is quicker than freeing netdevs.
--    
--    Reported-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
--    Fixes: 4a58e7c38443 ("cfg80211: don't "leak" uncompleted scans")
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit ae04fa489ab31b5a10d3cc8399f52761175d4321
--Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--Date:   Thu Jan 23 14:28:16 2014 +0200
--
--    mac80211: avoid deadlock revealed by lockdep
--    
--    sdata->u.ap.request_smps_work can’t be flushed synchronously
--    under wdev_lock(wdev) since ieee80211_request_smps_ap_work
--    itself locks the same lock.
--    While at it, reset the driver_smps_mode when the ap is
--    stopped to its default: OFF.
--    
--    This solves:
--    
--    ======================================================
--    [ INFO: possible circular locking dependency detected ]
--    3.12.0-ipeer+ #2 Tainted: G           O
--    -------------------------------------------------------
--    rmmod/2867 is trying to acquire lock:
--      ((&sdata->u.ap.request_smps_work)){+.+...}, at: [<c105b8d0>] flush_work+0x0/0x90
--    
--    but task is already holding lock:
--      (&wdev->mtx){+.+.+.}, at: [<f9b32626>] cfg80211_stop_ap+0x26/0x230 [cfg80211]
--    
--    which lock already depends on the new lock.
--    
--    the existing dependency chain (in reverse order) is:
--    
--    -> #1 (&wdev->mtx){+.+.+.}:
--            [<c10aefa9>] lock_acquire+0x79/0xe0
--            [<c1607a1a>] mutex_lock_nested+0x4a/0x360
--            [<fb06288b>] ieee80211_request_smps_ap_work+0x2b/0x50 [mac80211]
--            [<c105cdd8>] process_one_work+0x198/0x450
--            [<c105d469>] worker_thread+0xf9/0x320
--            [<c10669ff>] kthread+0x9f/0xb0
--            [<c1613397>] ret_from_kernel_thread+0x1b/0x28
--    
--    -> #0 ((&sdata->u.ap.request_smps_work)){+.+...}:
--            [<c10ae9df>] __lock_acquire+0x183f/0x1910
--            [<c10aefa9>] lock_acquire+0x79/0xe0
--            [<c105b917>] flush_work+0x47/0x90
--            [<c105d867>] __cancel_work_timer+0x67/0xe0
--            [<c105d90f>] cancel_work_sync+0xf/0x20
--            [<fb0765cc>] ieee80211_stop_ap+0x8c/0x340 [mac80211]
--            [<f9b3268c>] cfg80211_stop_ap+0x8c/0x230 [cfg80211]
--            [<f9b0d8f9>] cfg80211_leave+0x79/0x100 [cfg80211]
--            [<f9b0da72>] cfg80211_netdev_notifier_call+0xf2/0x4f0 [cfg80211]
--            [<c160f2c9>] notifier_call_chain+0x59/0x130
--            [<c106c6de>] __raw_notifier_call_chain+0x1e/0x30
--            [<c106c70f>] raw_notifier_call_chain+0x1f/0x30
--            [<c14f8213>] call_netdevice_notifiers_info+0x33/0x70
--            [<c14f8263>] call_netdevice_notifiers+0x13/0x20
--            [<c14f82a4>] __dev_close_many+0x34/0xb0
--            [<c14f83fe>] dev_close_many+0x6e/0xc0
--            [<c14f9c77>] rollback_registered_many+0xa7/0x1f0
--            [<c14f9dd4>] unregister_netdevice_many+0x14/0x60
--            [<fb06f4d9>] ieee80211_remove_interfaces+0xe9/0x170 [mac80211]
--            [<fb055116>] ieee80211_unregister_hw+0x56/0x110 [mac80211]
--            [<fa3e9396>] iwl_op_mode_mvm_stop+0x26/0xe0 [iwlmvm]
--            [<f9b9d8ca>] _iwl_op_mode_stop+0x3a/0x70 [iwlwifi]
--            [<f9b9d96f>] iwl_opmode_deregister+0x6f/0x90 [iwlwifi]
--            [<fa405179>] __exit_compat+0xd/0x19 [iwlmvm]
--            [<c10b8bf9>] SyS_delete_module+0x179/0x2b0
--            [<c1613421>] sysenter_do_call+0x12/0x32
--    
--    Fixes: 687da132234f ("mac80211: implement SMPS for AP")
--    Cc: <stable@vger.kernel.org> [3.13]
--    Reported-by: Ilan Peer <ilan.peer@intel.com>
--    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 178b205e96217164fd7c30113464250d0b6f5eca
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Thu Jan 23 16:32:29 2014 +0100
--
--    cfg80211: re-enable 5/10 MHz support
--    
--    Unfortunately I forgot this during the merge window, but the
--    patch seems small enough to go in as a fix. The userspace API
--    bug that was the reason for disabling it has long been fixed.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 110a1c79acda14edc83b7c8dc5af9c7ddd23eb61
--Author: Pontus Fuchs <pontus.fuchs@gmail.com>
--Date:   Thu Jan 16 15:00:40 2014 +0100
--
--    nl80211: Reset split_start when netlink skb is exhausted
--    
--    When the netlink skb is exhausted split_start is left set. In the
--    subsequent retry, with a larger buffer, the dump is continued from the
--    failing point instead of from the beginning.
--    
--    This was causing my rt28xx based USB dongle to now show up when
--    running "iw list" with an old iw version without split dump support.
--    
--    Cc: stable@vger.kernel.org
--    Fixes: 3713b4e364ef ("nl80211: allow splitting wiphy information in dumps")
--    Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
--    [avoid the entire workaround when state->split is set]
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit b4c31b45ffc7ef110fa9ecc34d7878fe7c5b9da4
--Author: Eliad Peller <eliad@wizery.com>
--Date:   Sun Jan 12 11:06:37 2014 +0200
--
--    mac80211: move roc cookie assignment earlier
--    
--    ieee80211_start_roc_work() might add a new roc
--    to existing roc, and tell cfg80211 it has already
--    started.
--    
--    However, this might happen before the roc cookie
--    was set, resulting in REMAIN_ON_CHANNEL (started)
--    event with null cookie. Consequently, it can make
--    wpa_supplicant go out of sync.
--    
--    Fix it by setting the roc cookie earlier.
--    
--    Cc: stable@vger.kernel.org
--    Signed-off-by: Eliad Peller <eliad@wizery.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit cfdc9157bfd7bcf88ab4dae08873a9907eba984c
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Fri Jan 24 14:06:29 2014 +0100
--
--    nl80211: send event when AP operation is stopped
--    
--    There are a few cases, e.g. suspend, where an AP interface is
--    stopped by the kernel rather than by userspace request, most
--    commonly when suspending. To let userspace know about this,
--    send the NL80211_CMD_STOP_AP command as an event every time
--    an AP interface is stopped. This also happens when userspace
--    did in fact request the AP stop, but that's not a problem.
--    
--    For full-MAC drivers this may need to be extended to also
--    cover cases where the device stopped the AP operation for
--    some reason, this a bit more complicated because then all
--    cfg80211 state also needs to be reset; such API is not part
--    of this patch.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit d5d567eda7704f190379ca852a8f9a4112e3eee3
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Thu Jan 23 16:20:29 2014 +0100
--
--    mac80211: add length check in ieee80211_is_robust_mgmt_frame()
--    
--    A few places weren't checking that the frame passed to the
--    function actually has enough data even though the function
--    clearly documents it must have a payload byte. Make this
--    safer by changing the function to take an skb and checking
--    the length inside. The old version is preserved for now as
--    the rtl* drivers use it and don't have a correct skb.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit f8f6d212a047fc65c7d3442dfc038f65517236fc
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Fri Jan 24 10:53:53 2014 +0100
--
--    nl80211: fix scheduled scan RSSI matchset attribute confusion
--    
--    The scheduled scan matchsets were intended to be a list of filters,
--    with the found BSS having to pass at least one of them to be passed
--    to the host. When the RSSI attribute was added, however, this was
--    broken and currently wpa_supplicant adds that attribute in its own
--    matchset; however, it doesn't intend that to mean that anything
--    that passes the RSSI filter should be passed to the host, instead
--    it wants it to mean that everything needs to also have higher RSSI.
--    
--    This is semantically problematic because we have a list of filters
--    like [ SSID1, SSID2, SSID3, RSSI ] with no real indication which
--    one should be OR'ed and which one AND'ed.
--    
--    To fix this, move the RSSI filter attribute into each matchset. As
--    we need to stay backward compatible, treat a matchset with only the
--    RSSI attribute as a "default RSSI filter" for all other matchsets,
--    but only if there are other matchsets (an RSSI-only matchset by
--    itself is still desirable.)
--    
--    To make driver implementation easier, keep a global min_rssi_thold
--    for the entire request as well. The only affected driver is ath6kl.
--    
--    I found this when I looked into the code after Raja Mani submitted
--    a patch fixing the n_match_sets calculation to disregard the RSSI,
--    but that patch didn't address the semantic issue.
--    
--    Reported-by: Raja Mani <rmani@qti.qualcomm.com>
--    Acked-by: Luciano Coelho <luciano.coelho@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit de553e8545e65a6dc4e45f43df7e1443d4291922
--Author: Johannes Berg <johannes.berg@intel.com>
--Date:   Fri Jan 24 10:17:47 2014 +0100
--
--    nl80211: check nla_parse() return values
--    
--    If there's a policy, then nla_parse() return values must be
--    checked, otherwise the policy is useless and there's nothing
--    that ensures the attributes are actually what we expect them
--    to be.
--    
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--
--commit 652204a0733e9e1c54661d6f9d36e2e1e3b22bb1
--Author: Karl Beldan <karl.beldan@rivierawaves.com>
--Date:   Thu Jan 23 20:06:34 2014 +0100
--
--    mac80211: send {ADD,DEL}BA on AC_VO like other mgmt frames, as per spec
--    
--    ATM, {ADD,DEL}BA and BAR frames are sent on the AC matching the TID of
--    the BA parameters. In the discussion [1] about this patch, Johannes
--    recalled that it fixed some races with the DELBA and indeed this
--    behavior was introduced in [2].
--    While [2] is right for the BARs, the part queueing the {ADD,DEL}BAs on
--    their BA params TID AC violates the spec and is more a workaround for
--    some drivers. Helmut expressed some concerns wrt such drivers, in
--    particular DELBAs in rt2x00.
--    
--    ATM, DELBAs are sent after a driver has called (hence "purposely")
--    ieee80211_start_tx_ba_cb_irqsafe and Johannes and Emmanuel gave some
--    details wrt intentions behind the split of the IEEE80211_AMPDU_TX_STOP_*
--    given to the driver ampdu_action supposed to call this function, which
--    could prove handy to people trying to do the right thing in faulty
--    drivers (if their fw/hw don't get in their way).
--    
--    [1] http://mid.gmane.org/1390391564-18481-1-git-send-email-karl.beldan@gmail.com
--    [2] Commit: cf6bb79ad828 ("mac80211: Use appropriate TID for sending BAR, ADDBA and DELBA frames")
--    
--    Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com>
--    Cc: Helmut Schaa <helmut.schaa@googlemail.com>
--    Cc: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
--    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
--+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
--@@ -790,7 +790,7 @@ void ath6kl_cfg80211_connect_event(struc
-- 	if (nw_type & ADHOC_NETWORK) {
-- 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n",
-- 			   nw_type & ADHOC_CREATOR ? "creator" : "joiner");
---		cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
--+		cfg80211_ibss_joined(vif->ndev, bssid, chan, GFP_KERNEL);
-- 		cfg80211_put_bss(ar->wiphy, bss);
-- 		return;
-- 	}
--@@ -861,13 +861,9 @@ void ath6kl_cfg80211_disconnect_event(st
-- 	}
-- 
-- 	if (vif->nw_type & ADHOC_NETWORK) {
---		if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) {
--+		if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC)
-- 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
-- 				   "%s: ath6k not in ibss mode\n", __func__);
---			return;
---		}
---		memset(bssid, 0, ETH_ALEN);
---		cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
-- 		return;
-- 	}
-- 
--@@ -3256,6 +3252,15 @@ static int ath6kl_cfg80211_sscan_start(s
-- 	struct ath6kl_vif *vif = netdev_priv(dev);
-- 	u16 interval;
-- 	int ret, rssi_thold;
--+	int n_match_sets = request->n_match_sets;
--+
--+	/*
--+	 * If there's a matchset w/o an SSID, then assume it's just for
--+	 * the RSSI (nothing else is currently supported) and ignore it.
--+	 * The device only supports a global RSSI filter that we set below.
--+	 */
--+	if (n_match_sets == 1 && !request->match_sets[0].ssid.ssid_len)
--+		n_match_sets = 0;
-- 
-- 	if (ar->state != ATH6KL_STATE_ON)
-- 		return -EIO;
--@@ -3268,11 +3273,11 @@ static int ath6kl_cfg80211_sscan_start(s
-- 	ret = ath6kl_set_probed_ssids(ar, vif, request->ssids,
-- 				      request->n_ssids,
-- 				      request->match_sets,
---				      request->n_match_sets);
--+				      n_match_sets);
-- 	if (ret < 0)
-- 		return ret;
-- 
---	if (!request->n_match_sets) {
--+	if (!n_match_sets) {
-- 		ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
-- 					       ALL_BSS_FILTER, 0);
-- 		if (ret < 0)
--@@ -3286,12 +3291,12 @@ static int ath6kl_cfg80211_sscan_start(s
-- 
-- 	if (test_bit(ATH6KL_FW_CAPABILITY_RSSI_SCAN_THOLD,
-- 		     ar->fw_capabilities)) {
---		if (request->rssi_thold <= NL80211_SCAN_RSSI_THOLD_OFF)
--+		if (request->min_rssi_thold <= NL80211_SCAN_RSSI_THOLD_OFF)
-- 			rssi_thold = 0;
---		else if (request->rssi_thold < -127)
--+		else if (request->min_rssi_thold < -127)
-- 			rssi_thold = -127;
-- 		else
---			rssi_thold = request->rssi_thold;
--+			rssi_thold = request->min_rssi_thold;
-- 
-- 		ret = ath6kl_wmi_set_rssi_filter_cmd(ar->wmi, vif->fw_vif_idx,
-- 						     rssi_thold);
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -1316,7 +1316,7 @@ static bool ath9k_hw_set_reset(struct at
-- 	if (AR_SREV_9300_20_OR_LATER(ah))
-- 		udelay(50);
-- 	else if (AR_SREV_9100(ah))
---		udelay(10000);
--+		mdelay(10);
-- 	else
-- 		udelay(100);
-- 
--@@ -1534,7 +1534,7 @@ EXPORT_SYMBOL(ath9k_hw_check_nav);
-- bool ath9k_hw_check_alive(struct ath_hw *ah)
-- {
-- 	int count = 50;
---	u32 reg;
--+	u32 reg, last_val;
-- 
-- 	if (AR_SREV_9300(ah))
-- 		return !ath9k_hw_detect_mac_hang(ah);
--@@ -1542,9 +1542,14 @@ bool ath9k_hw_check_alive(struct ath_hw 
-- 	if (AR_SREV_9285_12_OR_LATER(ah))
-- 		return true;
-- 
--+	last_val = REG_READ(ah, AR_OBS_BUS_1);
-- 	do {
-- 		reg = REG_READ(ah, AR_OBS_BUS_1);
--+		if (reg != last_val)
--+			return true;
-- 
--+		udelay(1);
--+		last_val = reg;
-- 		if ((reg & 0x7E7FFFEF) == 0x00702400)
-- 			continue;
-- 
--@@ -2051,9 +2056,8 @@ static bool ath9k_hw_set_power_awake(str
-- 
-- 	REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
-- 		    AR_RTC_FORCE_WAKE_EN);
---
-- 	if (AR_SREV_9100(ah))
---		udelay(10000);
--+		mdelay(10);
-- 	else
-- 		udelay(50);
-- 
----- a/drivers/net/wireless/ath/ath9k/main.c
--+++ b/drivers/net/wireless/ath/ath9k/main.c
--@@ -451,7 +451,7 @@ void ath9k_tasklet(unsigned long data)
-- 		 * interrupts are enabled in the reset routine.
-- 		 */
-- 		atomic_inc(&ah->intr_ref_cnt);
---		ath_dbg(common, ANY, "FATAL: Skipping interrupts\n");
--+		ath_dbg(common, RESET, "FATAL: Skipping interrupts\n");
-- 		goto out;
-- 	}
-- 
--@@ -471,7 +471,7 @@ void ath9k_tasklet(unsigned long data)
-- 			 * interrupts are enabled in the reset routine.
-- 			 */
-- 			atomic_inc(&ah->intr_ref_cnt);
---			ath_dbg(common, ANY,
--+			ath_dbg(common, RESET,
-- 				"BB_WATCHDOG: Skipping interrupts\n");
-- 			goto out;
-- 		}
--@@ -484,7 +484,7 @@ void ath9k_tasklet(unsigned long data)
-- 			type = RESET_TYPE_TX_GTT;
-- 			ath9k_queue_reset(sc, type);
-- 			atomic_inc(&ah->intr_ref_cnt);
---			ath_dbg(common, ANY,
--+			ath_dbg(common, RESET,
-- 				"GTT: Skipping interrupts\n");
-- 			goto out;
-- 		}
--@@ -1866,7 +1866,7 @@ static void ath9k_set_coverage_class(str
-- 
-- static bool ath9k_has_tx_pending(struct ath_softc *sc)
-- {
---	int i, npend;
--+	int i, npend = 0;
-- 
-- 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
-- 		if (!ATH_TXQ_SETUP(sc, i))
----- a/drivers/net/wireless/iwlwifi/mvm/scan.c
--+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
--@@ -595,6 +595,9 @@ static void iwl_scan_offload_build_ssid(
-- 	 * config match list.
-- 	 */
-- 	for (i = 0; i < req->n_match_sets && i < PROBE_OPTION_MAX; i++) {
--+		/* skip empty SSID matchsets */
--+		if (!req->match_sets[i].ssid.ssid_len)
--+			continue;
-- 		scan->direct_scan[i].id = WLAN_EID_SSID;
-- 		scan->direct_scan[i].len = req->match_sets[i].ssid.ssid_len;
-- 		memcpy(scan->direct_scan[i].ssid, req->match_sets[i].ssid.ssid,
----- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
--+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
--@@ -452,7 +452,7 @@ bool rtl88ee_rx_query_desc(struct ieee80
-- 			/* During testing, hdr was NULL */
-- 			return false;
-- 		}
---		if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
--+		if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
-- 		    (ieee80211_has_protected(hdr->frame_control)))
-- 			rx_status->flag &= ~RX_FLAG_DECRYPTED;
-- 		else
----- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
--+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
--@@ -393,7 +393,7 @@ bool rtl92ce_rx_query_desc(struct ieee80
-- 			/* In testing, hdr was NULL here */
-- 			return false;
-- 		}
---		if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
--+		if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
-- 		    (ieee80211_has_protected(hdr->frame_control)))
-- 			rx_status->flag &= ~RX_FLAG_DECRYPTED;
-- 		else
----- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
--+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
--@@ -310,7 +310,7 @@ bool rtl92se_rx_query_desc(struct ieee80
-- 			/* during testing, hdr was NULL here */
-- 			return false;
-- 		}
---		if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
--+		if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
-- 			(ieee80211_has_protected(hdr->frame_control)))
-- 			rx_status->flag &= ~RX_FLAG_DECRYPTED;
-- 		else
----- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
--+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
--@@ -334,7 +334,7 @@ bool rtl8723ae_rx_query_desc(struct ieee
-- 			/* during testing, hdr could be NULL here */
-- 			return false;
-- 		}
---		if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
--+		if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
-- 			(ieee80211_has_protected(hdr->frame_control)))
-- 			rx_status->flag &= ~RX_FLAG_DECRYPTED;
-- 		else
----- a/include/linux/ieee80211.h
--+++ b/include/linux/ieee80211.h
--@@ -597,6 +597,20 @@ static inline int ieee80211_is_qos_nullf
-- }
-- 
-- /**
--+ * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
--+ * @fc: frame control field in little-endian byteorder
--+ */
--+static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
--+{
--+	/* IEEE 802.11-2012, definition of "bufferable management frame";
--+	 * note that this ignores the IBSS special case. */
--+	return ieee80211_is_mgmt(fc) &&
--+	       (ieee80211_is_action(fc) ||
--+		ieee80211_is_disassoc(fc) ||
--+		ieee80211_is_deauth(fc));
--+}
--+
--+/**
--  * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
--  * @seq_ctrl: frame sequence control bytes in little-endian byteorder
--  */
--@@ -2192,10 +2206,10 @@ static inline u8 *ieee80211_get_DA(struc
-- }
-- 
-- /**
--- * ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
--+ * _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
--  * @hdr: the frame (buffer must include at least the first octet of payload)
--  */
---static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
--+static inline bool _ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
-- {
-- 	if (ieee80211_is_disassoc(hdr->frame_control) ||
-- 	    ieee80211_is_deauth(hdr->frame_control))
--@@ -2224,6 +2238,17 @@ static inline bool ieee80211_is_robust_m
-- }
-- 
-- /**
--+ * ieee80211_is_robust_mgmt_frame - check if skb contains a robust mgmt frame
--+ * @skb: the skb containing the frame, length will be checked
--+ */
--+static inline bool ieee80211_is_robust_mgmt_frame(struct sk_buff *skb)
--+{
--+	if (skb->len < 25)
--+		return false;
--+	return _ieee80211_is_robust_mgmt_frame((void *)skb->data);
--+}
--+
--+/**
--  * ieee80211_is_public_action - check if frame is a public action frame
--  * @hdr: the frame
--  * @len: length of the frame
----- a/include/net/cfg80211.h
--+++ b/include/net/cfg80211.h
--@@ -1395,9 +1395,11 @@ struct cfg80211_scan_request {
--  * struct cfg80211_match_set - sets of attributes to match
--  *
--  * @ssid: SSID to be matched
--+ * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
--  */
-- struct cfg80211_match_set {
-- 	struct cfg80211_ssid ssid;
--+	s32 rssi_thold;
-- };
-- 
-- /**
--@@ -1420,7 +1422,8 @@ struct cfg80211_match_set {
--  * @dev: the interface
--  * @scan_start: start time of the scheduled scan
--  * @channels: channels to scan
--- * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
--+ * @min_rssi_thold: for drivers only supporting a single threshold, this
--+ *	contains the minimum over all matchsets
--  */
-- struct cfg80211_sched_scan_request {
-- 	struct cfg80211_ssid *ssids;
--@@ -1433,7 +1436,7 @@ struct cfg80211_sched_scan_request {
-- 	u32 flags;
-- 	struct cfg80211_match_set *match_sets;
-- 	int n_match_sets;
---	s32 rssi_thold;
--+	s32 min_rssi_thold;
-- 
-- 	/* internal */
-- 	struct wiphy *wiphy;
--@@ -3130,8 +3133,8 @@ struct cfg80211_cached_keys;
--  * @identifier: (private) Identifier used in nl80211 to identify this
--  *	wireless device if it has no netdev
--  * @current_bss: (private) Used by the internal configuration code
--- * @channel: (private) Used by the internal configuration code to track
--- *	the user-set AP, monitor and WDS channel
--+ * @chandef: (private) Used by the internal configuration code to track
--+ *	the user-set channel definition.
--  * @preset_chandef: (private) Used by the internal configuration code to
--  *	track the channel to be used for AP later
--  * @bssid: (private) Used by the internal configuration code
--@@ -3195,9 +3198,7 @@ struct wireless_dev {
-- 
-- 	struct cfg80211_internal_bss *current_bss; /* associated / joined */
-- 	struct cfg80211_chan_def preset_chandef;
---
---	/* for AP and mesh channel tracking */
---	struct ieee80211_channel *channel;
--+	struct cfg80211_chan_def chandef;
-- 
-- 	bool ibss_fixed;
-- 	bool ibss_dfs_possible;
--@@ -3879,6 +3880,7 @@ void cfg80211_michael_mic_failure(struct
--  *
--  * @dev: network device
--  * @bssid: the BSSID of the IBSS joined
--+ * @channel: the channel of the IBSS joined
--  * @gfp: allocation flags
--  *
--  * This function notifies cfg80211 that the device joined an IBSS or
--@@ -3888,7 +3890,8 @@ void cfg80211_michael_mic_failure(struct
--  * with the locally generated beacon -- this guarantees that there is
--  * always a scan result for this IBSS. cfg80211 will handle the rest.
--  */
---void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp);
--+void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
--+			  struct ieee80211_channel *channel, gfp_t gfp);
-- 
-- /**
--  * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate
----- a/include/uapi/linux/nl80211.h
--+++ b/include/uapi/linux/nl80211.h
--@@ -2442,9 +2442,15 @@ enum nl80211_reg_rule_attr {
--  * enum nl80211_sched_scan_match_attr - scheduled scan match attributes
--  * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
--  * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching,
--- * only report BSS with matching SSID.
--+ *	only report BSS with matching SSID.
--  * @NL80211_SCHED_SCAN_MATCH_ATTR_RSSI: RSSI threshold (in dBm) for reporting a
--- *	BSS in scan results. Filtering is turned off if not specified.
--+ *	BSS in scan results. Filtering is turned off if not specified. Note that
--+ *	if this attribute is in a match set of its own, then it is treated as
--+ *	the default value for all matchsets with an SSID, rather than being a
--+ *	matchset of its own without an RSSI filter. This is due to problems with
--+ *	how this API was implemented in the past. Also, due to the same problem,
--+ *	the only way to create a matchset with only an RSSI filter (with this
--+ *	attribute) is if there's only a single matchset with the RSSI attribute.
--  * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
--  *	attribute number currently defined
--  * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use
----- a/net/mac80211/agg-tx.c
--+++ b/net/mac80211/agg-tx.c
--@@ -107,7 +107,7 @@ static void ieee80211_send_addba_request
-- 	mgmt->u.action.u.addba_req.start_seq_num =
-- 					cpu_to_le16(start_seq_num << 4);
-- 
---	ieee80211_tx_skb_tid(sdata, skb, tid);
--+	ieee80211_tx_skb(sdata, skb);
-- }
-- 
-- void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
----- a/net/mac80211/cfg.c
--+++ b/net/mac80211/cfg.c
--@@ -970,9 +970,9 @@ static int ieee80211_start_ap(struct wip
-- 	/* TODO: make hostapd tell us what it wants */
-- 	sdata->smps_mode = IEEE80211_SMPS_OFF;
-- 	sdata->needed_rx_chains = sdata->local->rx_chains;
---	sdata->radar_required = params->radar_required;
-- 
-- 	mutex_lock(&local->mtx);
--+	sdata->radar_required = params->radar_required;
-- 	err = ieee80211_vif_use_channel(sdata, &params->chandef,
-- 					IEEE80211_CHANCTX_SHARED);
-- 	mutex_unlock(&local->mtx);
--@@ -1021,8 +1021,10 @@ static int ieee80211_start_ap(struct wip
-- 					IEEE80211_P2P_OPPPS_ENABLE_BIT;
-- 
-- 	err = ieee80211_assign_beacon(sdata, &params->beacon);
---	if (err < 0)
--+	if (err < 0) {
--+		ieee80211_vif_release_channel(sdata);
-- 		return err;
--+	}
-- 	changed |= err;
-- 
-- 	err = drv_start_ap(sdata->local, sdata);
--@@ -1032,6 +1034,7 @@ static int ieee80211_start_ap(struct wip
-- 		if (old)
-- 			kfree_rcu(old, rcu_head);
-- 		RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
--+		ieee80211_vif_release_channel(sdata);
-- 		return err;
-- 	}
-- 
--@@ -1053,6 +1056,7 @@ static int ieee80211_change_beacon(struc
-- 	int err;
-- 
-- 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
--+	sdata_assert_lock(sdata);
-- 
-- 	/* don't allow changing the beacon while CSA is in place - offset
-- 	 * of channel switch counter may change
--@@ -1080,6 +1084,8 @@ static int ieee80211_stop_ap(struct wiph
-- 	struct probe_resp *old_probe_resp;
-- 	struct cfg80211_chan_def chandef;
-- 
--+	sdata_assert_lock(sdata);
--+
-- 	old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
-- 	if (!old_beacon)
-- 		return -ENOENT;
--@@ -1090,8 +1096,6 @@ static int ieee80211_stop_ap(struct wiph
-- 	kfree(sdata->u.ap.next_beacon);
-- 	sdata->u.ap.next_beacon = NULL;
-- 
---	cancel_work_sync(&sdata->u.ap.request_smps_work);
---
-- 	/* turn off carrier for this interface and dependent VLANs */
-- 	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
-- 		netif_carrier_off(vlan->dev);
--@@ -1103,6 +1107,7 @@ static int ieee80211_stop_ap(struct wiph
-- 	kfree_rcu(old_beacon, rcu_head);
-- 	if (old_probe_resp)
-- 		kfree_rcu(old_probe_resp, rcu_head);
--+	sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
-- 
-- 	__sta_info_flush(sdata, true);
-- 	ieee80211_free_keys(sdata, true);
--@@ -1988,6 +1993,9 @@ static int ieee80211_change_bss(struct w
-- 
-- 	band = ieee80211_get_sdata_band(sdata);
-- 
--+	if (WARN_ON(!wiphy->bands[band]))
--+		return -EINVAL;
--+
-- 	if (params->use_cts_prot >= 0) {
-- 		sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
-- 		changed |= BSS_CHANGED_ERP_CTS_PROT;
--@@ -2638,6 +2646,24 @@ static int ieee80211_start_roc_work(stru
-- 	INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work);
-- 	INIT_LIST_HEAD(&roc->dependents);
-- 
--+	/*
--+	 * cookie is either the roc cookie (for normal roc)
--+	 * or the SKB (for mgmt TX)
--+	 */
--+	if (!txskb) {
--+		/* local->mtx protects this */
--+		local->roc_cookie_counter++;
--+		roc->cookie = local->roc_cookie_counter;
--+		/* wow, you wrapped 64 bits ... more likely a bug */
--+		if (WARN_ON(roc->cookie == 0)) {
--+			roc->cookie = 1;
--+			local->roc_cookie_counter++;
--+		}
--+		*cookie = roc->cookie;
--+	} else {
--+		*cookie = (unsigned long)txskb;
--+	}
--+
-- 	/* if there's one pending or we're scanning, queue this one */
-- 	if (!list_empty(&local->roc_list) ||
-- 	    local->scanning || local->radar_detect_enabled)
--@@ -2772,24 +2798,6 @@ static int ieee80211_start_roc_work(stru
-- 	if (!queued)
-- 		list_add_tail(&roc->list, &local->roc_list);
-- 
---	/*
---	 * cookie is either the roc cookie (for normal roc)
---	 * or the SKB (for mgmt TX)
---	 */
---	if (!txskb) {
---		/* local->mtx protects this */
---		local->roc_cookie_counter++;
---		roc->cookie = local->roc_cookie_counter;
---		/* wow, you wrapped 64 bits ... more likely a bug */
---		if (WARN_ON(roc->cookie == 0)) {
---			roc->cookie = 1;
---			local->roc_cookie_counter++;
---		}
---		*cookie = roc->cookie;
---	} else {
---		*cookie = (unsigned long)txskb;
---	}
---
-- 	return 0;
-- }
-- 
--@@ -3004,8 +3012,10 @@ void ieee80211_csa_finalize_work(struct 
-- 	if (!ieee80211_sdata_running(sdata))
-- 		goto unlock;
-- 
---	sdata->radar_required = sdata->csa_radar_required;
--+	sdata_assert_lock(sdata);
--+
-- 	mutex_lock(&local->mtx);
--+	sdata->radar_required = sdata->csa_radar_required;
-- 	err = ieee80211_vif_change_channel(sdata, &changed);
-- 	mutex_unlock(&local->mtx);
-- 	if (WARN_ON(err < 0))
--@@ -3022,13 +3032,13 @@ void ieee80211_csa_finalize_work(struct 
-- 	switch (sdata->vif.type) {
-- 	case NL80211_IFTYPE_AP:
-- 		err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon);
--+		kfree(sdata->u.ap.next_beacon);
--+		sdata->u.ap.next_beacon = NULL;
--+
-- 		if (err < 0)
-- 			goto unlock;
-- 
-- 		changed |= err;
---		kfree(sdata->u.ap.next_beacon);
---		sdata->u.ap.next_beacon = NULL;
---
-- 		ieee80211_bss_info_change_notify(sdata, err);
-- 		break;
-- 	case NL80211_IFTYPE_ADHOC:
--@@ -3066,7 +3076,7 @@ int ieee80211_channel_switch(struct wiph
-- 	struct ieee80211_if_mesh __maybe_unused *ifmsh;
-- 	int err, num_chanctx;
-- 
---	lockdep_assert_held(&sdata->wdev.mtx);
--+	sdata_assert_lock(sdata);
-- 
-- 	if (!list_empty(&local->roc_list) || local->scanning)
-- 		return -EBUSY;
----- a/net/mac80211/ht.c
--+++ b/net/mac80211/ht.c
--@@ -375,7 +375,7 @@ void ieee80211_send_delba(struct ieee802
-- 	mgmt->u.action.u.delba.params = cpu_to_le16(params);
-- 	mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code);
-- 
---	ieee80211_tx_skb_tid(sdata, skb, tid);
--+	ieee80211_tx_skb(sdata, skb);
-- }
-- 
-- void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
--@@ -466,7 +466,9 @@ void ieee80211_request_smps_ap_work(stru
-- 			     u.ap.request_smps_work);
-- 
-- 	sdata_lock(sdata);
---	__ieee80211_request_smps_ap(sdata, sdata->u.ap.driver_smps_mode);
--+	if (sdata_dereference(sdata->u.ap.beacon, sdata))
--+		__ieee80211_request_smps_ap(sdata,
--+					    sdata->u.ap.driver_smps_mode);
-- 	sdata_unlock(sdata);
-- }
-- 
----- a/net/mac80211/iface.c
--+++ b/net/mac80211/iface.c
--@@ -770,12 +770,19 @@ static void ieee80211_do_stop(struct iee
-- 
-- 	ieee80211_roc_purge(local, sdata);
-- 
---	if (sdata->vif.type == NL80211_IFTYPE_STATION)
--+	switch (sdata->vif.type) {
--+	case NL80211_IFTYPE_STATION:
-- 		ieee80211_mgd_stop(sdata);
---
---	if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
--+		break;
--+	case NL80211_IFTYPE_ADHOC:
-- 		ieee80211_ibss_stop(sdata);
---
--+		break;
--+	case NL80211_IFTYPE_AP:
--+		cancel_work_sync(&sdata->u.ap.request_smps_work);
--+		break;
--+	default:
--+		break;
--+	}
-- 
-- 	/*
-- 	 * Remove all stations associated with this interface.
--@@ -827,7 +834,9 @@ static void ieee80211_do_stop(struct iee
-- 	cancel_work_sync(&local->dynamic_ps_enable_work);
-- 
-- 	cancel_work_sync(&sdata->recalc_smps);
--+	sdata_lock(sdata);
-- 	sdata->vif.csa_active = false;
--+	sdata_unlock(sdata);
-- 	cancel_work_sync(&sdata->csa_finalize_work);
-- 
-- 	cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
----- a/net/mac80211/rx.c
--+++ b/net/mac80211/rx.c
--@@ -599,10 +599,10 @@ static int ieee80211_is_unicast_robust_m
-- {
-- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-- 
---	if (skb->len < 24 || is_multicast_ether_addr(hdr->addr1))
--+	if (is_multicast_ether_addr(hdr->addr1))
-- 		return 0;
-- 
---	return ieee80211_is_robust_mgmt_frame(hdr);
--+	return ieee80211_is_robust_mgmt_frame(skb);
-- }
-- 
-- 
--@@ -610,10 +610,10 @@ static int ieee80211_is_multicast_robust
-- {
-- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-- 
---	if (skb->len < 24 || !is_multicast_ether_addr(hdr->addr1))
--+	if (!is_multicast_ether_addr(hdr->addr1))
-- 		return 0;
-- 
---	return ieee80211_is_robust_mgmt_frame(hdr);
--+	return ieee80211_is_robust_mgmt_frame(skb);
-- }
-- 
-- 
--@@ -626,7 +626,7 @@ static int ieee80211_get_mmie_keyidx(str
-- 	if (skb->len < 24 + sizeof(*mmie) || !is_multicast_ether_addr(hdr->da))
-- 		return -1;
-- 
---	if (!ieee80211_is_robust_mgmt_frame((struct ieee80211_hdr *) hdr))
--+	if (!ieee80211_is_robust_mgmt_frame(skb))
-- 		return -1; /* not a robust management frame */
-- 
-- 	mmie = (struct ieee80211_mmie *)
--@@ -1128,6 +1128,13 @@ static void sta_ps_end(struct sta_info *
-- 	       sta->sta.addr, sta->sta.aid);
-- 
-- 	if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
--+		/*
--+		 * Clear the flag only if the other one is still set
--+		 * so that the TX path won't start TX'ing new frames
--+		 * directly ... In the case that the driver flag isn't
--+		 * set ieee80211_sta_ps_deliver_wakeup() will clear it.
--+		 */
--+		clear_sta_flag(sta, WLAN_STA_PS_STA);
-- 		ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n",
-- 		       sta->sta.addr, sta->sta.aid);
-- 		return;
--@@ -1311,18 +1318,15 @@ ieee80211_rx_h_sta_process(struct ieee80
-- 	    !ieee80211_has_morefrags(hdr->frame_control) &&
-- 	    !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&
-- 	    (rx->sdata->vif.type == NL80211_IFTYPE_AP ||
---	     rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
--+	     rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
--+	    /* PM bit is only checked in frames where it isn't reserved,
--+	     * in AP mode it's reserved in non-bufferable management frames
--+	     * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field)
--+	     */
--+	    (!ieee80211_is_mgmt(hdr->frame_control) ||
--+	     ieee80211_is_bufferable_mmpdu(hdr->frame_control))) {
-- 		if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
---			/*
---			 * Ignore doze->wake transitions that are
---			 * indicated by non-data frames, the standard
---			 * is unclear here, but for example going to
---			 * PS mode and then scanning would cause a
---			 * doze->wake transition for the probe request,
---			 * and that is clearly undesirable.
---			 */
---			if (ieee80211_is_data(hdr->frame_control) &&
---			    !ieee80211_has_pm(hdr->frame_control))
--+			if (!ieee80211_has_pm(hdr->frame_control))
-- 				sta_ps_end(sta);
-- 		} else {
-- 			if (ieee80211_has_pm(hdr->frame_control))
--@@ -1845,8 +1849,7 @@ static int ieee80211_drop_unencrypted_mg
-- 		 * having configured keys.
-- 		 */
-- 		if (unlikely(ieee80211_is_action(fc) && !rx->key &&
---			     ieee80211_is_robust_mgmt_frame(
---				     (struct ieee80211_hdr *) rx->skb->data)))
--+			     ieee80211_is_robust_mgmt_frame(rx->skb)))
-- 			return -EACCES;
-- 	}
-- 
----- a/net/mac80211/tx.c
--+++ b/net/mac80211/tx.c
--@@ -452,8 +452,7 @@ static int ieee80211_use_mfp(__le16 fc, 
-- 	if (sta == NULL || !test_sta_flag(sta, WLAN_STA_MFP))
-- 		return 0;
-- 
---	if (!ieee80211_is_robust_mgmt_frame((struct ieee80211_hdr *)
---					    skb->data))
--+	if (!ieee80211_is_robust_mgmt_frame(skb))
-- 		return 0;
-- 
-- 	return 1;
--@@ -478,6 +477,20 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
-- 		       sta->sta.addr, sta->sta.aid, ac);
-- 		if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
-- 			purge_old_ps_buffers(tx->local);
--+
--+		/* sync with ieee80211_sta_ps_deliver_wakeup */
--+		spin_lock(&sta->ps_lock);
--+		/*
--+		 * STA woke up the meantime and all the frames on ps_tx_buf have
--+		 * been queued to pending queue. No reordering can happen, go
--+		 * ahead and Tx the packet.
--+		 */
--+		if (!test_sta_flag(sta, WLAN_STA_PS_STA) &&
--+		    !test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
--+			spin_unlock(&sta->ps_lock);
--+			return TX_CONTINUE;
--+		}
--+
-- 		if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) {
-- 			struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]);
-- 			ps_dbg(tx->sdata,
--@@ -492,6 +505,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
-- 		info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
-- 		info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
-- 		skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb);
--+		spin_unlock(&sta->ps_lock);
-- 
-- 		if (!timer_pending(&local->sta_cleanup))
-- 			mod_timer(&local->sta_cleanup,
--@@ -525,9 +539,7 @@ ieee80211_tx_h_ps_buf(struct ieee80211_t
-- 
-- 	/* only deauth, disassoc and action are bufferable MMPDUs */
-- 	if (ieee80211_is_mgmt(hdr->frame_control) &&
---	    !ieee80211_is_deauth(hdr->frame_control) &&
---	    !ieee80211_is_disassoc(hdr->frame_control) &&
---	    !ieee80211_is_action(hdr->frame_control)) {
--+	    !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) {
-- 		if (tx->flags & IEEE80211_TX_UNICAST)
-- 			info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
-- 		return TX_CONTINUE;
--@@ -567,7 +579,7 @@ ieee80211_tx_h_select_key(struct ieee802
-- 		tx->key = key;
-- 	else if (ieee80211_is_mgmt(hdr->frame_control) &&
-- 		 is_multicast_ether_addr(hdr->addr1) &&
---		 ieee80211_is_robust_mgmt_frame(hdr) &&
--+		 ieee80211_is_robust_mgmt_frame(tx->skb) &&
-- 		 (key = rcu_dereference(tx->sdata->default_mgmt_key)))
-- 		tx->key = key;
-- 	else if (is_multicast_ether_addr(hdr->addr1) &&
--@@ -582,12 +594,12 @@ ieee80211_tx_h_select_key(struct ieee802
-- 		tx->key = NULL;
-- 	else if (tx->skb->protocol == tx->sdata->control_port_protocol)
-- 		tx->key = NULL;
---	else if (ieee80211_is_robust_mgmt_frame(hdr) &&
--+	else if (ieee80211_is_robust_mgmt_frame(tx->skb) &&
-- 		 !(ieee80211_is_action(hdr->frame_control) &&
-- 		   tx->sta && test_sta_flag(tx->sta, WLAN_STA_MFP)))
-- 		tx->key = NULL;
-- 	else if (ieee80211_is_mgmt(hdr->frame_control) &&
---		 !ieee80211_is_robust_mgmt_frame(hdr))
--+		 !ieee80211_is_robust_mgmt_frame(tx->skb))
-- 		tx->key = NULL;
-- 	else {
-- 		I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted);
--@@ -878,7 +890,7 @@ static int ieee80211_fragment(struct iee
-- 	}
-- 
-- 	/* adjust first fragment's length */
---	skb->len = hdrlen + per_fragm;
--+	skb_trim(skb, hdrlen + per_fragm);
-- 	return 0;
-- }
-- 
--@@ -2900,7 +2912,7 @@ ieee80211_get_buffered_bc(struct ieee802
-- 				cpu_to_le16(IEEE80211_FCTL_MOREDATA);
-- 		}
-- 
---		if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
--+		if (sdata->vif.type == NL80211_IFTYPE_AP)
-- 			sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
-- 		if (!ieee80211_tx_prepare(sdata, &tx, skb))
-- 			break;
----- a/net/mac80211/wpa.c
--+++ b/net/mac80211/wpa.c
--@@ -499,7 +499,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee
-- 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
-- 
-- 	if (!ieee80211_is_data(hdr->frame_control) &&
---	    !ieee80211_is_robust_mgmt_frame(hdr))
--+	    !ieee80211_is_robust_mgmt_frame(skb))
-- 		return RX_CONTINUE;
-- 
-- 	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN -
----- a/net/wireless/ap.c
--+++ b/net/wireless/ap.c
--@@ -27,9 +27,10 @@ static int __cfg80211_stop_ap(struct cfg
-- 	err = rdev_stop_ap(rdev, dev);
-- 	if (!err) {
-- 		wdev->beacon_interval = 0;
---		wdev->channel = NULL;
--+		memset(&wdev->chandef, 0, sizeof(wdev->chandef));
-- 		wdev->ssid_len = 0;
-- 		rdev_set_qos_map(rdev, dev, NULL);
--+		nl80211_send_ap_stopped(wdev);
-- 	}
-- 
-- 	return err;
----- a/net/wireless/core.c
--+++ b/net/wireless/core.c
--@@ -203,8 +203,11 @@ void cfg80211_stop_p2p_device(struct cfg
-- 
-- 	rdev->opencount--;
-- 
---	WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev &&
---		!rdev->scan_req->notified);
--+	if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
--+		if (WARN_ON(!rdev->scan_req->notified))
--+			rdev->scan_req->aborted = true;
--+		___cfg80211_scan_done(rdev, false);
--+	}
-- }
-- 
-- static int cfg80211_rfkill_set_block(void *data, bool blocked)
--@@ -447,9 +450,6 @@ int wiphy_register(struct wiphy *wiphy)
-- 	int i;
-- 	u16 ifmodes = wiphy->interface_modes;
-- 
---	/* support for 5/10 MHz is broken due to nl80211 API mess - disable */
---	wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_5_10_MHZ;
---
-- 	/*
-- 	 * There are major locking problems in nl80211/mac80211 for CSA,
-- 	 * disable for all drivers until this has been reworked.
--@@ -795,8 +795,6 @@ void cfg80211_leave(struct cfg80211_regi
-- 	default:
-- 		break;
-- 	}
---
---	wdev->beacon_interval = 0;
-- }
-- 
-- static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
--@@ -875,8 +873,11 @@ static int cfg80211_netdev_notifier_call
-- 		break;
-- 	case NETDEV_DOWN:
-- 		cfg80211_update_iface_num(rdev, wdev->iftype, -1);
---		WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev &&
---			!rdev->scan_req->notified);
--+		if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
--+			if (WARN_ON(!rdev->scan_req->notified))
--+				rdev->scan_req->aborted = true;
--+			___cfg80211_scan_done(rdev, false);
--+		}
-- 
-- 		if (WARN_ON(rdev->sched_scan_req &&
-- 			    rdev->sched_scan_req->dev == wdev->netdev)) {
----- a/net/wireless/core.h
--+++ b/net/wireless/core.h
--@@ -62,6 +62,7 @@ struct cfg80211_registered_device {
-- 	struct rb_root bss_tree;
-- 	u32 bss_generation;
-- 	struct cfg80211_scan_request *scan_req; /* protected by RTNL */
--+	struct sk_buff *scan_msg;
-- 	struct cfg80211_sched_scan_request *sched_scan_req;
-- 	unsigned long suspend_at;
-- 	struct work_struct scan_done_wk;
--@@ -210,6 +211,7 @@ struct cfg80211_event {
-- 		} dc;
-- 		struct {
-- 			u8 bssid[ETH_ALEN];
--+			struct ieee80211_channel *channel;
-- 		} ij;
-- 	};
-- };
--@@ -257,7 +259,8 @@ int __cfg80211_leave_ibss(struct cfg8021
-- 			  struct net_device *dev, bool nowext);
-- int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
-- 			struct net_device *dev, bool nowext);
---void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid);
--+void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
--+			    struct ieee80211_channel *channel);
-- int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
-- 			    struct wireless_dev *wdev);
-- 
--@@ -361,7 +364,8 @@ int cfg80211_validate_key_settings(struc
-- 				   struct key_params *params, int key_idx,
-- 				   bool pairwise, const u8 *mac_addr);
-- void __cfg80211_scan_done(struct work_struct *wk);
---void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev);
--+void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
--+			   bool send_message);
-- void __cfg80211_sched_scan_results(struct work_struct *wk);
-- int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
-- 			       bool driver_initiated);
--@@ -441,7 +445,8 @@ static inline unsigned int elapsed_jiffi
-- void
-- cfg80211_get_chan_state(struct wireless_dev *wdev,
-- 		        struct ieee80211_channel **chan,
---		        enum cfg80211_chan_mode *chanmode);
--+		        enum cfg80211_chan_mode *chanmode,
--+		        u8 *radar_detect);
-- 
-- int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
-- 				 struct cfg80211_chan_def *chandef);
----- a/net/wireless/nl80211.c
--+++ b/net/wireless/nl80211.c
--@@ -1723,9 +1723,10 @@ static int nl80211_dump_wiphy(struct sk_
-- 				 * We can then retry with the larger buffer.
-- 				 */
-- 				if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
---				    !skb->len &&
--+				    !skb->len && !state->split &&
-- 				    cb->min_dump_alloc < 4096) {
-- 					cb->min_dump_alloc = 4096;
--+					state->split_start = 0;
-- 					rtnl_unlock();
-- 					return 1;
-- 				}
--@@ -2047,10 +2048,12 @@ static int nl80211_set_wiphy(struct sk_b
-- 		nla_for_each_nested(nl_txq_params,
-- 				    info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
-- 				    rem_txq_params) {
---			nla_parse(tb, NL80211_TXQ_ATTR_MAX,
---				  nla_data(nl_txq_params),
---				  nla_len(nl_txq_params),
---				  txq_params_policy);
--+			result = nla_parse(tb, NL80211_TXQ_ATTR_MAX,
--+					   nla_data(nl_txq_params),
--+					   nla_len(nl_txq_params),
--+					   txq_params_policy);
--+			if (result)
--+				goto bad_res;
-- 			result = parse_txq_params(tb, &txq_params);
-- 			if (result)
-- 				goto bad_res;
--@@ -3289,7 +3292,7 @@ static int nl80211_start_ap(struct sk_bu
-- 	if (!err) {
-- 		wdev->preset_chandef = params.chandef;
-- 		wdev->beacon_interval = params.beacon_interval;
---		wdev->channel = params.chandef.chan;
--+		wdev->chandef = params.chandef;
-- 		wdev->ssid_len = params.ssid_len;
-- 		memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
-- 	}
--@@ -5210,9 +5213,11 @@ static int nl80211_set_reg(struct sk_buf
-- 
-- 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
-- 			    rem_reg_rules) {
---		nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
---			  nla_data(nl_reg_rule), nla_len(nl_reg_rule),
---			  reg_rule_policy);
--+		r = nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
--+			      nla_data(nl_reg_rule), nla_len(nl_reg_rule),
--+			      reg_rule_policy);
--+		if (r)
--+			goto bad_reg;
-- 		r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
-- 		if (r)
-- 			goto bad_reg;
--@@ -5277,7 +5282,7 @@ static int nl80211_trigger_scan(struct s
-- 	if (!rdev->ops->scan)
-- 		return -EOPNOTSUPP;
-- 
---	if (rdev->scan_req) {
--+	if (rdev->scan_req || rdev->scan_msg) {
-- 		err = -EBUSY;
-- 		goto unlock;
-- 	}
--@@ -5475,6 +5480,7 @@ static int nl80211_start_sched_scan(stru
-- 	enum ieee80211_band band;
-- 	size_t ie_len;
-- 	struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
--+	s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
-- 
-- 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
-- 	    !rdev->ops->sched_scan_start)
--@@ -5509,11 +5515,40 @@ static int nl80211_start_sched_scan(stru
-- 	if (n_ssids > wiphy->max_sched_scan_ssids)
-- 		return -EINVAL;
-- 
---	if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH])
--+	/*
--+	 * First, count the number of 'real' matchsets. Due to an issue with
--+	 * the old implementation, matchsets containing only the RSSI attribute
--+	 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
--+	 * RSSI for all matchsets, rather than their own matchset for reporting
--+	 * all APs with a strong RSSI. This is needed to be compatible with
--+	 * older userspace that treated a matchset with only the RSSI as the
--+	 * global RSSI for all other matchsets - if there are other matchsets.
--+	 */
--+	if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
-- 		nla_for_each_nested(attr,
-- 				    info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
---				    tmp)
---			n_match_sets++;
--+				    tmp) {
--+			struct nlattr *rssi;
--+
--+			err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
--+					nla_data(attr), nla_len(attr),
--+					nl80211_match_policy);
--+			if (err)
--+				return err;
--+			/* add other standalone attributes here */
--+			if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]) {
--+				n_match_sets++;
--+				continue;
--+			}
--+			rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
--+			if (rssi)
--+				default_match_rssi = nla_get_s32(rssi);
--+		}
--+	}
--+
--+	/* However, if there's no other matchset, add the RSSI one */
--+	if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
--+		n_match_sets = 1;
-- 
-- 	if (n_match_sets > wiphy->max_match_sets)
-- 		return -EINVAL;
--@@ -5634,11 +5669,22 @@ static int nl80211_start_sched_scan(stru
-- 				    tmp) {
-- 			struct nlattr *ssid, *rssi;
-- 
---			nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
---				  nla_data(attr), nla_len(attr),
---				  nl80211_match_policy);
--+			err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
--+					nla_data(attr), nla_len(attr),
--+					nl80211_match_policy);
--+			if (err)
--+				goto out_free;
-- 			ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
-- 			if (ssid) {
--+				if (WARN_ON(i >= n_match_sets)) {
--+					/* this indicates a programming error,
--+					 * the loop above should have verified
--+					 * things properly
--+					 */
--+					err = -EINVAL;
--+					goto out_free;
--+				}
--+
-- 				if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
-- 					err = -EINVAL;
-- 					goto out_free;
--@@ -5647,15 +5693,28 @@ static int nl80211_start_sched_scan(stru
-- 				       nla_data(ssid), nla_len(ssid));
-- 				request->match_sets[i].ssid.ssid_len =
-- 					nla_len(ssid);
--+				/* special attribute - old implemenation w/a */
--+				request->match_sets[i].rssi_thold =
--+					default_match_rssi;
--+				rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
--+				if (rssi)
--+					request->match_sets[i].rssi_thold =
--+						nla_get_s32(rssi);
-- 			}
---			rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
---			if (rssi)
---				request->rssi_thold = nla_get_u32(rssi);
---			else
---				request->rssi_thold =
---						   NL80211_SCAN_RSSI_THOLD_OFF;
-- 			i++;
-- 		}
--+
--+		/* there was no other matchset, so the RSSI one is alone */
--+		if (i == 0)
--+			request->match_sets[0].rssi_thold = default_match_rssi;
--+
--+		request->min_rssi_thold = INT_MAX;
--+		for (i = 0; i < n_match_sets; i++)
--+			request->min_rssi_thold =
--+				min(request->match_sets[i].rssi_thold,
--+				    request->min_rssi_thold);
--+	} else {
--+		request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
-- 	}
-- 
-- 	if (info->attrs[NL80211_ATTR_IE]) {
--@@ -5751,7 +5810,7 @@ static int nl80211_start_radar_detection
-- 
-- 	err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef);
-- 	if (!err) {
---		wdev->channel = chandef.chan;
--+		wdev->chandef = chandef;
-- 		wdev->cac_started = true;
-- 		wdev->cac_start_time = jiffies;
-- 	}
--@@ -7502,16 +7561,19 @@ static int nl80211_set_tx_bitrate_mask(s
-- 	 * directly to the enum ieee80211_band values used in cfg80211.
-- 	 */
-- 	BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
---	nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem)
---	{
--+	nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
-- 		enum ieee80211_band band = nla_type(tx_rates);
--+		int err;
--+
-- 		if (band < 0 || band >= IEEE80211_NUM_BANDS)
-- 			return -EINVAL;
-- 		sband = rdev->wiphy.bands[band];
-- 		if (sband == NULL)
-- 			return -EINVAL;
---		nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
---			  nla_len(tx_rates), nl80211_txattr_policy);
--+		err = nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
--+				nla_len(tx_rates), nl80211_txattr_policy);
--+		if (err)
--+			return err;
-- 		if (tb[NL80211_TXRATE_LEGACY]) {
-- 			mask.control[band].legacy = rateset_to_mask(
-- 				sband,
--@@ -10054,40 +10116,31 @@ void nl80211_send_scan_start(struct cfg8
-- 				NL80211_MCGRP_SCAN, GFP_KERNEL);
-- }
-- 
---void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
---			    struct wireless_dev *wdev)
--+struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
--+				       struct wireless_dev *wdev, bool aborted)
-- {
-- 	struct sk_buff *msg;
-- 
-- 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
-- 	if (!msg)
---		return;
--+		return NULL;
-- 
-- 	if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
---				  NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
--+				  aborted ? NL80211_CMD_SCAN_ABORTED :
--+					    NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
-- 		nlmsg_free(msg);
---		return;
--+		return NULL;
-- 	}
-- 
---	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
---				NL80211_MCGRP_SCAN, GFP_KERNEL);
--+	return msg;
-- }
-- 
---void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
---			       struct wireless_dev *wdev)
--+void nl80211_send_scan_result(struct cfg80211_registered_device *rdev,
--+			      struct sk_buff *msg)
-- {
---	struct sk_buff *msg;
---
---	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
-- 	if (!msg)
-- 		return;
-- 
---	if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
---				  NL80211_CMD_SCAN_ABORTED) < 0) {
---		nlmsg_free(msg);
---		return;
---	}
---
-- 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
-- 				NL80211_MCGRP_SCAN, GFP_KERNEL);
-- }
--@@ -11158,7 +11211,8 @@ void cfg80211_ch_switch_notify(struct ne
-- 		    wdev->iftype != NL80211_IFTYPE_MESH_POINT))
-- 		return;
-- 
---	wdev->channel = chandef->chan;
--+	wdev->chandef = *chandef;
--+	wdev->preset_chandef = *chandef;
-- 	nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
-- }
-- EXPORT_SYMBOL(cfg80211_ch_switch_notify);
--@@ -11673,6 +11727,35 @@ void cfg80211_crit_proto_stopped(struct 
-- }
-- EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
-- 
--+void nl80211_send_ap_stopped(struct wireless_dev *wdev)
--+{
--+	struct wiphy *wiphy = wdev->wiphy;
--+	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
--+	struct sk_buff *msg;
--+	void *hdr;
--+
--+	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
--+	if (!msg)
--+		return;
--+
--+	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
--+	if (!hdr)
--+		goto out;
--+
--+	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
--+	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
--+	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
--+		goto out;
--+
--+	genlmsg_end(msg, hdr);
--+
--+	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
--+				NL80211_MCGRP_MLME, GFP_KERNEL);
--+	return;
--+ out:
--+	nlmsg_free(msg);
--+}
--+
-- /* initialisation/exit functions */
-- 
-- int nl80211_init(void)
----- a/net/wireless/nl80211.h
--+++ b/net/wireless/nl80211.h
--@@ -8,10 +8,10 @@ void nl80211_exit(void);
-- void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev);
-- void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
-- 			     struct wireless_dev *wdev);
---void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
---			    struct wireless_dev *wdev);
---void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
---			       struct wireless_dev *wdev);
--+struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
--+				       struct wireless_dev *wdev, bool aborted);
--+void nl80211_send_scan_result(struct cfg80211_registered_device *rdev,
--+			      struct sk_buff *msg);
-- void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
-- 			     struct net_device *netdev, u32 cmd);
-- void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
--@@ -74,6 +74,8 @@ nl80211_radar_notify(struct cfg80211_reg
-- 		     enum nl80211_radar_event event,
-- 		     struct net_device *netdev, gfp_t gfp);
-- 
--+void nl80211_send_ap_stopped(struct wireless_dev *wdev);
--+
-- void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev);
-- 
-- #endif /* __NET_WIRELESS_NL80211_H */
----- a/net/wireless/scan.c
--+++ b/net/wireless/scan.c
--@@ -161,18 +161,25 @@ static void __cfg80211_bss_expire(struct
-- 		dev->bss_generation++;
-- }
-- 
---void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev)
--+void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
--+			   bool send_message)
-- {
-- 	struct cfg80211_scan_request *request;
-- 	struct wireless_dev *wdev;
--+	struct sk_buff *msg;
-- #ifdef CPTCFG_CFG80211_WEXT
-- 	union iwreq_data wrqu;
-- #endif
-- 
-- 	ASSERT_RTNL();
-- 
---	request = rdev->scan_req;
--+	if (rdev->scan_msg) {
--+		nl80211_send_scan_result(rdev, rdev->scan_msg);
--+		rdev->scan_msg = NULL;
--+		return;
--+	}
-- 
--+	request = rdev->scan_req;
-- 	if (!request)
-- 		return;
-- 
--@@ -186,18 +193,16 @@ void ___cfg80211_scan_done(struct cfg802
-- 	if (wdev->netdev)
-- 		cfg80211_sme_scan_done(wdev->netdev);
-- 
---	if (request->aborted) {
---		nl80211_send_scan_aborted(rdev, wdev);
---	} else {
---		if (request->flags & NL80211_SCAN_FLAG_FLUSH) {
---			/* flush entries from previous scans */
---			spin_lock_bh(&rdev->bss_lock);
---			__cfg80211_bss_expire(rdev, request->scan_start);
---			spin_unlock_bh(&rdev->bss_lock);
---		}
---		nl80211_send_scan_done(rdev, wdev);
--+	if (!request->aborted &&
--+	    request->flags & NL80211_SCAN_FLAG_FLUSH) {
--+		/* flush entries from previous scans */
--+		spin_lock_bh(&rdev->bss_lock);
--+		__cfg80211_bss_expire(rdev, request->scan_start);
--+		spin_unlock_bh(&rdev->bss_lock);
-- 	}
-- 
--+	msg = nl80211_build_scan_msg(rdev, wdev, request->aborted);
--+
-- #ifdef CPTCFG_CFG80211_WEXT
-- 	if (wdev->netdev && !request->aborted) {
-- 		memset(&wrqu, 0, sizeof(wrqu));
--@@ -211,6 +216,11 @@ void ___cfg80211_scan_done(struct cfg802
-- 
-- 	rdev->scan_req = NULL;
-- 	kfree(request);
--+
--+	if (!send_message)
--+		rdev->scan_msg = msg;
--+	else
--+		nl80211_send_scan_result(rdev, msg);
-- }
-- 
-- void __cfg80211_scan_done(struct work_struct *wk)
--@@ -221,7 +231,7 @@ void __cfg80211_scan_done(struct work_st
-- 			    scan_done_wk);
-- 
-- 	rtnl_lock();
---	___cfg80211_scan_done(rdev);
--+	___cfg80211_scan_done(rdev, true);
-- 	rtnl_unlock();
-- }
-- 
--@@ -1079,7 +1089,7 @@ int cfg80211_wext_siwscan(struct net_dev
-- 	if (IS_ERR(rdev))
-- 		return PTR_ERR(rdev);
-- 
---	if (rdev->scan_req) {
--+	if (rdev->scan_req || rdev->scan_msg) {
-- 		err = -EBUSY;
-- 		goto out;
-- 	}
--@@ -1481,7 +1491,7 @@ int cfg80211_wext_giwscan(struct net_dev
-- 	if (IS_ERR(rdev))
-- 		return PTR_ERR(rdev);
-- 
---	if (rdev->scan_req)
--+	if (rdev->scan_req || rdev->scan_msg)
-- 		return -EAGAIN;
-- 
-- 	res = ieee80211_scan_results(rdev, info, extra, data->length);
----- a/net/wireless/sme.c
--+++ b/net/wireless/sme.c
--@@ -67,7 +67,7 @@ static int cfg80211_conn_scan(struct wir
-- 	ASSERT_RDEV_LOCK(rdev);
-- 	ASSERT_WDEV_LOCK(wdev);
-- 
---	if (rdev->scan_req)
--+	if (rdev->scan_req || rdev->scan_msg)
-- 		return -EBUSY;
-- 
-- 	if (wdev->conn->params.channel)
----- a/net/mac80211/mlme.c
--+++ b/net/mac80211/mlme.c
--@@ -1001,7 +1001,6 @@ ieee80211_sta_process_chanswitch(struct 
-- 	}
-- 
-- 	ifmgd->flags |= IEEE80211_STA_CSA_RECEIVED;
---	sdata->vif.csa_active = true;
-- 
-- 	mutex_lock(&local->chanctx_mtx);
-- 	if (local->use_chanctx) {
--@@ -1039,6 +1038,7 @@ ieee80211_sta_process_chanswitch(struct 
-- 	mutex_unlock(&local->chanctx_mtx);
-- 
-- 	sdata->csa_chandef = csa_ie.chandef;
--+	sdata->vif.csa_active = true;
-- 
-- 	if (csa_ie.mode)
-- 		ieee80211_stop_queues_by_reason(&local->hw,
----- a/net/mac80211/chan.c
--+++ b/net/mac80211/chan.c
--@@ -196,6 +196,8 @@ static bool ieee80211_is_radar_required(
-- {
-- 	struct ieee80211_sub_if_data *sdata;
-- 
--+	lockdep_assert_held(&local->mtx);
--+
-- 	rcu_read_lock();
-- 	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
-- 		if (sdata->radar_required) {
----- a/net/mac80211/ibss.c
--+++ b/net/mac80211/ibss.c
--@@ -294,7 +294,6 @@ static void __ieee80211_sta_join_ibss(st
-- 	}
-- 
-- 	mutex_lock(&local->mtx);
---	ieee80211_vif_release_channel(sdata);
-- 	if (ieee80211_vif_use_channel(sdata, &chandef,
-- 				      ifibss->fixed_channel ?
-- 					IEEE80211_CHANCTX_SHARED :
--@@ -303,6 +302,7 @@ static void __ieee80211_sta_join_ibss(st
-- 		mutex_unlock(&local->mtx);
-- 		return;
-- 	}
--+	sdata->radar_required = radar_required;
-- 	mutex_unlock(&local->mtx);
-- 
-- 	memcpy(ifibss->bssid, bssid, ETH_ALEN);
--@@ -318,7 +318,6 @@ static void __ieee80211_sta_join_ibss(st
-- 	rcu_assign_pointer(ifibss->presp, presp);
-- 	mgmt = (void *)presp->head;
-- 
---	sdata->radar_required = radar_required;
-- 	sdata->vif.bss_conf.enable_beacon = true;
-- 	sdata->vif.bss_conf.beacon_int = beacon_int;
-- 	sdata->vif.bss_conf.basic_rates = basic_rates;
--@@ -386,7 +385,7 @@ static void __ieee80211_sta_join_ibss(st
-- 					      presp->head_len, 0, GFP_KERNEL);
-- 	cfg80211_put_bss(local->hw.wiphy, bss);
-- 	netif_carrier_on(sdata->dev);
---	cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
--+	cfg80211_ibss_joined(sdata->dev, ifibss->bssid, chan, GFP_KERNEL);
-- }
-- 
-- static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
--@@ -802,6 +801,8 @@ ieee80211_ibss_process_chanswitch(struct
-- 	int err;
-- 	u32 sta_flags;
-- 
--+	sdata_assert_lock(sdata);
--+
-- 	sta_flags = IEEE80211_STA_DISABLE_VHT;
-- 	switch (ifibss->chandef.width) {
-- 	case NL80211_CHAN_WIDTH_5:
--@@ -1471,6 +1472,11 @@ static void ieee80211_rx_mgmt_probe_req(
-- 	memcpy(((struct ieee80211_mgmt *) skb->data)->da, mgmt->sa, ETH_ALEN);
-- 	ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
-- 	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
--+
--+	/* avoid excessive retries for probe request to wildcard SSIDs */
--+	if (pos[1] == 0)
--+		IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_NO_ACK;
--+
-- 	ieee80211_tx_skb(sdata, skb);
-- }
-- 
----- a/net/mac80211/mesh.c
--+++ b/net/mac80211/mesh.c
--@@ -872,6 +872,8 @@ ieee80211_mesh_process_chnswitch(struct 
-- 	if (!ifmsh->mesh_id)
-- 		return false;
-- 
--+	sdata_assert_lock(sdata);
--+
-- 	sta_flags = IEEE80211_STA_DISABLE_VHT;
-- 	switch (sdata->vif.bss_conf.chandef.width) {
-- 	case NL80211_CHAN_WIDTH_20_NOHT:
----- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
--+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
--@@ -4658,6 +4658,7 @@ brcmf_notify_connect_status(struct brcmf
-- 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
-- 	struct net_device *ndev = ifp->ndev;
-- 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
--+	struct ieee80211_channel *chan;
-- 	s32 err = 0;
-- 
-- 	if (ifp->vif->mode == WL_MODE_AP) {
--@@ -4665,9 +4666,10 @@ brcmf_notify_connect_status(struct brcmf
-- 	} else if (brcmf_is_linkup(e)) {
-- 		brcmf_dbg(CONN, "Linkup\n");
-- 		if (brcmf_is_ibssmode(ifp->vif)) {
--+			chan = ieee80211_get_channel(cfg->wiphy, cfg->channel);
-- 			memcpy(profile->bssid, e->addr, ETH_ALEN);
-- 			wl_inform_ibss(cfg, ndev, e->addr);
---			cfg80211_ibss_joined(ndev, e->addr, GFP_KERNEL);
--+			cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL);
-- 			clear_bit(BRCMF_VIF_STATUS_CONNECTING,
-- 				  &ifp->vif->sme_state);
-- 			set_bit(BRCMF_VIF_STATUS_CONNECTED,
----- a/drivers/net/wireless/libertas/cfg.c
--+++ b/drivers/net/wireless/libertas/cfg.c
--@@ -1766,7 +1766,8 @@ static void lbs_join_post(struct lbs_pri
-- 	memcpy(priv->wdev->ssid, params->ssid, params->ssid_len);
-- 	priv->wdev->ssid_len = params->ssid_len;
-- 
---	cfg80211_ibss_joined(priv->dev, bssid, GFP_KERNEL);
--+	cfg80211_ibss_joined(priv->dev, bssid, params->chandef.chan,
--+			     GFP_KERNEL);
-- 
-- 	/* TODO: consider doing this at MACREG_INT_CODE_LINK_SENSED time */
-- 	priv->connect_status = LBS_CONNECTED;
----- a/drivers/net/wireless/mwifiex/cfg80211.c
--+++ b/drivers/net/wireless/mwifiex/cfg80211.c
--@@ -1881,7 +1881,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy 
-- 				     params->privacy);
-- done:
-- 	if (!ret) {
---		cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, GFP_KERNEL);
--+		cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid,
--+				     params->chandef.chan, GFP_KERNEL);
-- 		dev_dbg(priv->adapter->dev,
-- 			"info: joined/created adhoc network with bssid"
-- 			" %pM successfully\n", priv->cfg_bssid);
----- a/drivers/net/wireless/rndis_wlan.c
--+++ b/drivers/net/wireless/rndis_wlan.c
--@@ -2835,7 +2835,9 @@ static void rndis_wlan_do_link_up_work(s
-- 					bssid, req_ie, req_ie_len,
-- 					resp_ie, resp_ie_len, GFP_KERNEL);
-- 	} else if (priv->infra_mode == NDIS_80211_INFRA_ADHOC)
---		cfg80211_ibss_joined(usbdev->net, bssid, GFP_KERNEL);
--+		cfg80211_ibss_joined(usbdev->net, bssid,
--+				     get_current_channel(usbdev, NULL),
--+				     GFP_KERNEL);
-- 
-- 	kfree(info);
-- 
----- a/net/wireless/ibss.c
--+++ b/net/wireless/ibss.c
--@@ -14,7 +14,8 @@
-- #include "rdev-ops.h"
-- 
-- 
---void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid)
--+void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
--+			    struct ieee80211_channel *channel)
-- {
-- 	struct wireless_dev *wdev = dev->ieee80211_ptr;
-- 	struct cfg80211_bss *bss;
--@@ -28,8 +29,7 @@ void __cfg80211_ibss_joined(struct net_d
-- 	if (!wdev->ssid_len)
-- 		return;
-- 
---	bss = cfg80211_get_bss(wdev->wiphy, NULL, bssid,
---			       wdev->ssid, wdev->ssid_len,
--+	bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, NULL, 0,
-- 			       WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);
-- 
-- 	if (WARN_ON(!bss))
--@@ -54,21 +54,26 @@ void __cfg80211_ibss_joined(struct net_d
-- #endif
-- }
-- 
---void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp)
--+void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
--+			  struct ieee80211_channel *channel, gfp_t gfp)
-- {
-- 	struct wireless_dev *wdev = dev->ieee80211_ptr;
-- 	struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
-- 	struct cfg80211_event *ev;
-- 	unsigned long flags;
-- 
---	trace_cfg80211_ibss_joined(dev, bssid);
--+	trace_cfg80211_ibss_joined(dev, bssid, channel);
--+
--+	if (WARN_ON(!channel))
--+		return;
-- 
-- 	ev = kzalloc(sizeof(*ev), gfp);
-- 	if (!ev)
-- 		return;
-- 
-- 	ev->type = EVENT_IBSS_JOINED;
---	memcpy(ev->cr.bssid, bssid, ETH_ALEN);
--+	memcpy(ev->ij.bssid, bssid, ETH_ALEN);
--+	ev->ij.channel = channel;
-- 
-- 	spin_lock_irqsave(&wdev->event_lock, flags);
-- 	list_add_tail(&ev->list, &wdev->event_list);
--@@ -117,6 +122,7 @@ int __cfg80211_join_ibss(struct cfg80211
-- 
-- 	wdev->ibss_fixed = params->channel_fixed;
-- 	wdev->ibss_dfs_possible = params->userspace_handles_dfs;
--+	wdev->chandef = params->chandef;
-- #ifdef CPTCFG_CFG80211_WEXT
-- 	wdev->wext.ibss.chandef = params->chandef;
-- #endif
--@@ -200,6 +206,7 @@ static void __cfg80211_clear_ibss(struct
-- 
-- 	wdev->current_bss = NULL;
-- 	wdev->ssid_len = 0;
--+	memset(&wdev->chandef, 0, sizeof(wdev->chandef));
-- #ifdef CPTCFG_CFG80211_WEXT
-- 	if (!nowext)
-- 		wdev->wext.ibss.ssid_len = 0;
----- a/net/wireless/trace.h
--+++ b/net/wireless/trace.h
--@@ -2278,11 +2278,6 @@ DECLARE_EVENT_CLASS(cfg80211_rx_evt,
-- 	TP_printk(NETDEV_PR_FMT ", " MAC_PR_FMT, NETDEV_PR_ARG, MAC_PR_ARG(addr))
-- );
-- 
---DEFINE_EVENT(cfg80211_rx_evt, cfg80211_ibss_joined,
---	TP_PROTO(struct net_device *netdev, const u8 *addr),
---	TP_ARGS(netdev, addr)
---);
---
-- DEFINE_EVENT(cfg80211_rx_evt, cfg80211_rx_spurious_frame,
-- 	TP_PROTO(struct net_device *netdev, const u8 *addr),
-- 	TP_ARGS(netdev, addr)
--@@ -2293,6 +2288,24 @@ DEFINE_EVENT(cfg80211_rx_evt, cfg80211_r
-- 	TP_ARGS(netdev, addr)
-- );
-- 
--+TRACE_EVENT(cfg80211_ibss_joined,
--+	TP_PROTO(struct net_device *netdev, const u8 *bssid,
--+		 struct ieee80211_channel *channel),
--+	TP_ARGS(netdev, bssid, channel),
--+	TP_STRUCT__entry(
--+		NETDEV_ENTRY
--+		MAC_ENTRY(bssid)
--+		CHAN_ENTRY
--+	),
--+	TP_fast_assign(
--+		NETDEV_ASSIGN;
--+		MAC_ASSIGN(bssid, bssid);
--+		CHAN_ASSIGN(channel);
--+	),
--+	TP_printk(NETDEV_PR_FMT ", bssid: " MAC_PR_FMT ", " CHAN_PR_FMT,
--+		  NETDEV_PR_ARG, MAC_PR_ARG(bssid), CHAN_PR_ARG)
--+);
--+
-- TRACE_EVENT(cfg80211_probe_status,
-- 	TP_PROTO(struct net_device *netdev, const u8 *addr, u64 cookie,
-- 		 bool acked),
----- a/net/wireless/util.c
--+++ b/net/wireless/util.c
--@@ -820,7 +820,8 @@ void cfg80211_process_wdev_events(struct
-- 						ev->dc.reason, true);
-- 			break;
-- 		case EVENT_IBSS_JOINED:
---			__cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid);
--+			__cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid,
--+					       ev->ij.channel);
-- 			break;
-- 		}
-- 		wdev_unlock(wdev);
--@@ -1356,7 +1357,7 @@ int cfg80211_can_use_iftype_chan(struct 
-- 		 */
-- 		mutex_lock_nested(&wdev_iter->mtx, 1);
-- 		__acquire(wdev_iter->mtx);
---		cfg80211_get_chan_state(wdev_iter, &ch, &chmode);
--+		cfg80211_get_chan_state(wdev_iter, &ch, &chmode, &radar_detect);
-- 		wdev_unlock(wdev_iter);
-- 
-- 		switch (chmode) {
----- a/net/wireless/chan.c
--+++ b/net/wireless/chan.c
--@@ -642,7 +642,8 @@ int cfg80211_set_monitor_channel(struct 
-- void
-- cfg80211_get_chan_state(struct wireless_dev *wdev,
-- 		        struct ieee80211_channel **chan,
---		        enum cfg80211_chan_mode *chanmode)
--+		        enum cfg80211_chan_mode *chanmode,
--+		        u8 *radar_detect)
-- {
-- 	*chan = NULL;
-- 	*chanmode = CHAN_MODE_UNDEFINED;
--@@ -660,6 +661,11 @@ cfg80211_get_chan_state(struct wireless_
-- 				     !wdev->ibss_dfs_possible)
-- 				  ? CHAN_MODE_SHARED
-- 				  : CHAN_MODE_EXCLUSIVE;
--+
--+			/* consider worst-case - IBSS can try to return to the
--+			 * original user-specified channel as creator */
--+			if (wdev->ibss_dfs_possible)
--+				*radar_detect |= BIT(wdev->chandef.width);
-- 			return;
-- 		}
-- 		break;
--@@ -674,17 +680,26 @@ cfg80211_get_chan_state(struct wireless_
-- 	case NL80211_IFTYPE_AP:
-- 	case NL80211_IFTYPE_P2P_GO:
-- 		if (wdev->cac_started) {
---			*chan = wdev->channel;
--+			*chan = wdev->chandef.chan;
-- 			*chanmode = CHAN_MODE_SHARED;
--+			*radar_detect |= BIT(wdev->chandef.width);
-- 		} else if (wdev->beacon_interval) {
---			*chan = wdev->channel;
--+			*chan = wdev->chandef.chan;
-- 			*chanmode = CHAN_MODE_SHARED;
--+
--+			if (cfg80211_chandef_dfs_required(wdev->wiphy,
--+							  &wdev->chandef))
--+				*radar_detect |= BIT(wdev->chandef.width);
-- 		}
-- 		return;
-- 	case NL80211_IFTYPE_MESH_POINT:
-- 		if (wdev->mesh_id_len) {
---			*chan = wdev->channel;
--+			*chan = wdev->chandef.chan;
-- 			*chanmode = CHAN_MODE_SHARED;
--+
--+			if (cfg80211_chandef_dfs_required(wdev->wiphy,
--+							  &wdev->chandef))
--+				*radar_detect |= BIT(wdev->chandef.width);
-- 		}
-- 		return;
-- 	case NL80211_IFTYPE_MONITOR:
----- a/net/wireless/mesh.c
--+++ b/net/wireless/mesh.c
--@@ -195,7 +195,7 @@ int __cfg80211_join_mesh(struct cfg80211
-- 	if (!err) {
-- 		memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len);
-- 		wdev->mesh_id_len = setup->mesh_id_len;
---		wdev->channel = setup->chandef.chan;
--+		wdev->chandef = setup->chandef;
-- 	}
-- 
-- 	return err;
--@@ -244,7 +244,7 @@ int cfg80211_set_mesh_channel(struct cfg
-- 		err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev,
-- 						     chandef->chan);
-- 		if (!err)
---			wdev->channel = chandef->chan;
--+			wdev->chandef = *chandef;
-- 
-- 		return err;
-- 	}
--@@ -276,7 +276,7 @@ static int __cfg80211_leave_mesh(struct 
-- 	err = rdev_leave_mesh(rdev, dev);
-- 	if (!err) {
-- 		wdev->mesh_id_len = 0;
---		wdev->channel = NULL;
--+		memset(&wdev->chandef, 0, sizeof(wdev->chandef));
-- 		rdev_set_qos_map(rdev, dev, NULL);
-- 	}
-- 
----- a/net/wireless/mlme.c
--+++ b/net/wireless/mlme.c
--@@ -772,7 +772,7 @@ void cfg80211_cac_event(struct net_devic
-- 	if (WARN_ON(!wdev->cac_started))
-- 		return;
-- 
---	if (WARN_ON(!wdev->channel))
--+	if (WARN_ON(!wdev->chandef.chan))
-- 		return;
-- 
-- 	switch (event) {
----- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
--+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
--@@ -5065,6 +5065,10 @@ static u16 ar9003_hw_get_max_edge_power(
-- 			break;
-- 		}
-- 	}
--+
--+	if (is2GHz && !twiceMaxEdgePower)
--+		twiceMaxEdgePower = 60;
--+
-- 	return twiceMaxEdgePower;
-- }
-- 
----- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
--+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
--@@ -23,10 +23,11 @@
-- #define MAX_MEASUREMENT	MAX_IQCAL_MEASUREMENT
-- #define MAX_MAG_DELTA	11
-- #define MAX_PHS_DELTA	10
--+#define MAXIQCAL        3
-- 
-- struct coeff {
---	int mag_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT];
---	int phs_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT];
--+	int mag_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT][MAXIQCAL];
--+	int phs_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT][MAXIQCAL];
-- 	int iqc_coeff[2];
-- };
-- 
--@@ -800,7 +801,7 @@ static bool ar9003_hw_calc_iq_corr(struc
-- 	if (q_q_coff > 63)
-- 		q_q_coff = 63;
-- 
---	iqc_coeff[0] = (q_q_coff * 128) + q_i_coff;
--+	iqc_coeff[0] = (q_q_coff * 128) + (0x7f & q_i_coff);
-- 
-- 	ath_dbg(common, CALIBRATE, "tx chain %d: iq corr coeff=%x\n",
-- 		chain_idx, iqc_coeff[0]);
--@@ -831,7 +832,7 @@ static bool ar9003_hw_calc_iq_corr(struc
-- 	if (q_q_coff > 63)
-- 		q_q_coff = 63;
-- 
---	iqc_coeff[1] = (q_q_coff * 128) + q_i_coff;
--+	iqc_coeff[1] = (q_q_coff * 128) + (0x7f & q_i_coff);
-- 
-- 	ath_dbg(common, CALIBRATE, "rx chain %d: iq corr coeff=%x\n",
-- 		chain_idx, iqc_coeff[1]);
--@@ -839,7 +840,8 @@ static bool ar9003_hw_calc_iq_corr(struc
-- 	return true;
-- }
-- 
---static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
--+static void ar9003_hw_detect_outlier(int mp_coeff[][MAXIQCAL],
--+				     int nmeasurement,
-- 				     int max_delta)
-- {
-- 	int mp_max = -64, max_idx = 0;
--@@ -848,20 +850,20 @@ static void ar9003_hw_detect_outlier(int
-- 
-- 	/* find min/max mismatch across all calibrated gains */
-- 	for (i = 0; i < nmeasurement; i++) {
---		if (mp_coeff[i] > mp_max) {
---			mp_max = mp_coeff[i];
--+		if (mp_coeff[i][0] > mp_max) {
--+			mp_max = mp_coeff[i][0];
-- 			max_idx = i;
---		} else if (mp_coeff[i] < mp_min) {
---			mp_min = mp_coeff[i];
--+		} else if (mp_coeff[i][0] < mp_min) {
--+			mp_min = mp_coeff[i][0];
-- 			min_idx = i;
-- 		}
-- 	}
-- 
-- 	/* find average (exclude max abs value) */
-- 	for (i = 0; i < nmeasurement; i++) {
---		if ((abs(mp_coeff[i]) < abs(mp_max)) ||
---		    (abs(mp_coeff[i]) < abs(mp_min))) {
---			mp_avg += mp_coeff[i];
--+		if ((abs(mp_coeff[i][0]) < abs(mp_max)) ||
--+		    (abs(mp_coeff[i][0]) < abs(mp_min))) {
--+			mp_avg += mp_coeff[i][0];
-- 			mp_count++;
-- 		}
-- 	}
--@@ -873,7 +875,7 @@ static void ar9003_hw_detect_outlier(int
-- 	if (mp_count)
-- 		mp_avg /= mp_count;
-- 	else
---		mp_avg = mp_coeff[nmeasurement - 1];
--+		mp_avg = mp_coeff[nmeasurement - 1][0];
-- 
-- 	/* detect outlier */
-- 	if (abs(mp_max - mp_min) > max_delta) {
--@@ -882,15 +884,16 @@ static void ar9003_hw_detect_outlier(int
-- 		else
-- 			outlier_idx = min_idx;
-- 
---		mp_coeff[outlier_idx] = mp_avg;
--+		mp_coeff[outlier_idx][0] = mp_avg;
-- 	}
-- }
-- 
---static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah,
---						 struct coeff *coeff,
---						 bool is_reusable)
--+static void ar9003_hw_tx_iq_cal_outlier_detection(struct ath_hw *ah,
--+						  struct coeff *coeff,
--+						  bool is_reusable)
-- {
-- 	int i, im, nmeasurement;
--+	int magnitude, phase;
-- 	u32 tx_corr_coeff[MAX_MEASUREMENT][AR9300_MAX_CHAINS];
-- 	struct ath9k_hw_cal_data *caldata = ah->caldata;
-- 
--@@ -920,21 +923,30 @@ static void ar9003_hw_tx_iqcal_load_avg_
-- 		if (nmeasurement > MAX_MEASUREMENT)
-- 			nmeasurement = MAX_MEASUREMENT;
-- 
---		/* detect outlier only if nmeasurement > 1 */
---		if (nmeasurement > 1) {
---			/* Detect magnitude outlier */
---			ar9003_hw_detect_outlier(coeff->mag_coeff[i],
---					nmeasurement, MAX_MAG_DELTA);
---
---			/* Detect phase outlier */
---			ar9003_hw_detect_outlier(coeff->phs_coeff[i],
---					nmeasurement, MAX_PHS_DELTA);
--+		/*
--+		 * Skip normal outlier detection for AR9550.
--+		 */
--+		if (!AR_SREV_9550(ah)) {
--+			/* detect outlier only if nmeasurement > 1 */
--+			if (nmeasurement > 1) {
--+				/* Detect magnitude outlier */
--+				ar9003_hw_detect_outlier(coeff->mag_coeff[i],
--+							 nmeasurement,
--+							 MAX_MAG_DELTA);
--+
--+				/* Detect phase outlier */
--+				ar9003_hw_detect_outlier(coeff->phs_coeff[i],
--+							 nmeasurement,
--+							 MAX_PHS_DELTA);
--+			}
-- 		}
-- 
-- 		for (im = 0; im < nmeasurement; im++) {
--+			magnitude = coeff->mag_coeff[i][im][0];
--+			phase = coeff->phs_coeff[i][im][0];
-- 
---			coeff->iqc_coeff[0] = (coeff->mag_coeff[i][im] & 0x7f) |
---				((coeff->phs_coeff[i][im] & 0x7f) << 7);
--+			coeff->iqc_coeff[0] =
--+				(phase & 0x7f) | ((magnitude & 0x7f) << 7);
-- 
-- 			if ((im % 2) == 0)
-- 				REG_RMW_FIELD(ah, tx_corr_coeff[im][i],
--@@ -991,7 +1003,63 @@ static bool ar9003_hw_tx_iq_cal_run(stru
-- 	return true;
-- }
-- 
---static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)
--+static void __ar955x_tx_iq_cal_sort(struct ath_hw *ah,
--+				    struct coeff *coeff,
--+				    int i, int nmeasurement)
--+{
--+	struct ath_common *common = ath9k_hw_common(ah);
--+	int im, ix, iy, temp;
--+
--+	for (im = 0; im < nmeasurement; im++) {
--+		for (ix = 0; ix < MAXIQCAL - 1; ix++) {
--+			for (iy = ix + 1; iy <= MAXIQCAL - 1; iy++) {
--+				if (coeff->mag_coeff[i][im][iy] <
--+				    coeff->mag_coeff[i][im][ix]) {
--+					temp = coeff->mag_coeff[i][im][ix];
--+					coeff->mag_coeff[i][im][ix] =
--+						coeff->mag_coeff[i][im][iy];
--+					coeff->mag_coeff[i][im][iy] = temp;
--+				}
--+				if (coeff->phs_coeff[i][im][iy] <
--+				    coeff->phs_coeff[i][im][ix]) {
--+					temp = coeff->phs_coeff[i][im][ix];
--+					coeff->phs_coeff[i][im][ix] =
--+						coeff->phs_coeff[i][im][iy];
--+					coeff->phs_coeff[i][im][iy] = temp;
--+				}
--+			}
--+		}
--+		coeff->mag_coeff[i][im][0] = coeff->mag_coeff[i][im][MAXIQCAL / 2];
--+		coeff->phs_coeff[i][im][0] = coeff->phs_coeff[i][im][MAXIQCAL / 2];
--+
--+		ath_dbg(common, CALIBRATE,
--+			"IQCAL: Median [ch%d][gain%d]: mag = %d phase = %d\n",
--+			i, im,
--+			coeff->mag_coeff[i][im][0],
--+			coeff->phs_coeff[i][im][0]);
--+	}
--+}
--+
--+static bool ar955x_tx_iq_cal_median(struct ath_hw *ah,
--+				    struct coeff *coeff,
--+				    int iqcal_idx,
--+				    int nmeasurement)
--+{
--+	int i;
--+
--+	if ((iqcal_idx + 1) != MAXIQCAL)
--+		return false;
--+
--+	for (i = 0; i < AR9300_MAX_CHAINS; i++) {
--+		__ar955x_tx_iq_cal_sort(ah, coeff, i, nmeasurement);
--+	}
--+
--+	return true;
--+}
--+
--+static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah,
--+					  int iqcal_idx,
--+					  bool is_reusable)
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
-- 	const u32 txiqcal_status[AR9300_MAX_CHAINS] = {
--@@ -1004,10 +1072,11 @@ static void ar9003_hw_tx_iq_cal_post_pro
-- 		AR_PHY_CHAN_INFO_TAB_1,
-- 		AR_PHY_CHAN_INFO_TAB_2,
-- 	};
---	struct coeff coeff;
--+	static struct coeff coeff;
-- 	s32 iq_res[6];
-- 	int i, im, j;
---	int nmeasurement;
--+	int nmeasurement = 0;
--+	bool outlier_detect = true;
-- 
-- 	for (i = 0; i < AR9300_MAX_CHAINS; i++) {
-- 		if (!(ah->txchainmask & (1 << i)))
--@@ -1065,17 +1134,23 @@ static void ar9003_hw_tx_iq_cal_post_pro
-- 				goto tx_iqcal_fail;
-- 			}
-- 
---			coeff.mag_coeff[i][im] = coeff.iqc_coeff[0] & 0x7f;
---			coeff.phs_coeff[i][im] =
--+			coeff.phs_coeff[i][im][iqcal_idx] =
--+				coeff.iqc_coeff[0] & 0x7f;
--+			coeff.mag_coeff[i][im][iqcal_idx] =
-- 				(coeff.iqc_coeff[0] >> 7) & 0x7f;
-- 
---			if (coeff.mag_coeff[i][im] > 63)
---				coeff.mag_coeff[i][im] -= 128;
---			if (coeff.phs_coeff[i][im] > 63)
---				coeff.phs_coeff[i][im] -= 128;
--+			if (coeff.mag_coeff[i][im][iqcal_idx] > 63)
--+				coeff.mag_coeff[i][im][iqcal_idx] -= 128;
--+			if (coeff.phs_coeff[i][im][iqcal_idx] > 63)
--+				coeff.phs_coeff[i][im][iqcal_idx] -= 128;
-- 		}
-- 	}
---	ar9003_hw_tx_iqcal_load_avg_2_passes(ah, &coeff, is_reusable);
--+
--+	if (AR_SREV_9550(ah))
--+		outlier_detect = ar955x_tx_iq_cal_median(ah, &coeff,
--+							 iqcal_idx, nmeasurement);
--+	if (outlier_detect)
--+		ar9003_hw_tx_iq_cal_outlier_detection(ah, &coeff, is_reusable);
-- 
-- 	return;
-- 
--@@ -1409,7 +1484,7 @@ skip_tx_iqcal:
-- 	}
-- 
-- 	if (txiqcal_done)
---		ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
--+		ar9003_hw_tx_iq_cal_post_proc(ah, 0, is_reusable);
-- 	else if (caldata && test_bit(TXIQCAL_DONE, &caldata->cal_flags))
-- 		ar9003_hw_tx_iq_cal_reload(ah);
-- 
--@@ -1455,14 +1530,38 @@ skip_tx_iqcal:
-- 	return true;
-- }
-- 
--+static bool do_ar9003_agc_cal(struct ath_hw *ah)
--+{
--+	struct ath_common *common = ath9k_hw_common(ah);
--+	bool status;
--+
--+	REG_WRITE(ah, AR_PHY_AGC_CONTROL,
--+		  REG_READ(ah, AR_PHY_AGC_CONTROL) |
--+		  AR_PHY_AGC_CONTROL_CAL);
--+
--+	status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
--+			       AR_PHY_AGC_CONTROL_CAL,
--+			       0, AH_WAIT_TIMEOUT);
--+	if (!status) {
--+		ath_dbg(common, CALIBRATE,
--+			"offset calibration failed to complete in %d ms,"
--+			"noisy environment?\n",
--+			AH_WAIT_TIMEOUT / 1000);
--+		return false;
--+	}
--+
--+	return true;
--+}
--+
-- static bool ar9003_hw_init_cal_soc(struct ath_hw *ah,
-- 				   struct ath9k_channel *chan)
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
-- 	struct ath9k_hw_cal_data *caldata = ah->caldata;
-- 	bool txiqcal_done = false;
---	bool is_reusable = true, status = true;
--+	bool status = true;
-- 	bool run_agc_cal = false, sep_iq_cal = false;
--+	int i = 0;
-- 
-- 	/* Use chip chainmask only for calibration */
-- 	ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
--@@ -1485,7 +1584,12 @@ static bool ar9003_hw_init_cal_soc(struc
-- 	 * AGC calibration. Specifically, AR9550 in SoC chips.
-- 	 */
-- 	if (ah->enabled_cals & TX_IQ_ON_AGC_CAL) {
---		txiqcal_done = true;
--+		if (REG_READ_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_0,
--+				   AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL)) {
--+				txiqcal_done = true;
--+		} else {
--+			txiqcal_done = false;
--+		}
-- 		run_agc_cal = true;
-- 	} else {
-- 		sep_iq_cal = true;
--@@ -1512,27 +1616,37 @@ skip_tx_iqcal:
-- 		if (AR_SREV_9330_11(ah))
-- 			ar9003_hw_manual_peak_cal(ah, 0, IS_CHAN_2GHZ(chan));
-- 
---		/* Calibrate the AGC */
---		REG_WRITE(ah, AR_PHY_AGC_CONTROL,
---			  REG_READ(ah, AR_PHY_AGC_CONTROL) |
---			  AR_PHY_AGC_CONTROL_CAL);
---
---		/* Poll for offset calibration complete */
---		status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
---				       AR_PHY_AGC_CONTROL_CAL,
---				       0, AH_WAIT_TIMEOUT);
---	}
--+		/*
--+		 * For non-AR9550 chips, we just trigger AGC calibration
--+		 * in the HW, poll for completion and then process
--+		 * the results.
--+		 *
--+		 * For AR955x, we run it multiple times and use
--+		 * median IQ correction.
--+		 */
--+		if (!AR_SREV_9550(ah)) {
--+			status = do_ar9003_agc_cal(ah);
--+			if (!status)
--+				return false;
-- 
---	if (!status) {
---		ath_dbg(common, CALIBRATE,
---			"offset calibration failed to complete in %d ms; noisy environment?\n",
---			AH_WAIT_TIMEOUT / 1000);
---		return false;
--+			if (txiqcal_done)
--+				ar9003_hw_tx_iq_cal_post_proc(ah, 0, false);
--+		} else {
--+			if (!txiqcal_done) {
--+				status = do_ar9003_agc_cal(ah);
--+				if (!status)
--+					return false;
--+			} else {
--+				for (i = 0; i < MAXIQCAL; i++) {
--+					status = do_ar9003_agc_cal(ah);
--+					if (!status)
--+						return false;
--+					ar9003_hw_tx_iq_cal_post_proc(ah, i, false);
--+				}
--+			}
--+		}
-- 	}
-- 
---	if (txiqcal_done)
---		ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
---
-- 	/* Revert chainmask to runtime parameters */
-- 	ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
-- 
----- a/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
--+++ b/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
--@@ -15,6 +15,8 @@
-- #ifndef RTL8187_H
-- #define RTL8187_H
-- 
--+#include <linux/cache.h>
--+
-- #include "rtl818x.h"
-- #include "leds.h"
-- 
--@@ -139,7 +141,10 @@ struct rtl8187_priv {
-- 	u8 aifsn[4];
-- 	u8 rfkill_mask;
-- 	struct {
---		__le64 buf;
--+		union {
--+			__le64 buf;
--+			u8 dummy1[L1_CACHE_BYTES];
--+		} ____cacheline_aligned;
-- 		struct sk_buff_head queue;
-- 	} b_tx_status; /* This queue is used by both -b and non-b devices */
-- 	struct mutex io_mutex;
--@@ -147,7 +152,8 @@ struct rtl8187_priv {
-- 		u8 bits8;
-- 		__le16 bits16;
-- 		__le32 bits32;
---	} *io_dmabuf;
--+		u8 dummy2[L1_CACHE_BYTES];
--+	} *io_dmabuf ____cacheline_aligned;
-- 	bool rfkill_off;
-- 	u16 seqno;
-- };
----- a/net/mac80211/wme.c
--+++ b/net/mac80211/wme.c
--@@ -154,6 +154,11 @@ u16 ieee80211_select_queue(struct ieee80
-- 		return IEEE80211_AC_BE;
-- 	}
-- 
--+	if (skb->protocol == sdata->control_port_protocol) {
--+		skb->priority = 7;
--+		return ieee80211_downgrade_queue(sdata, skb);
--+	}
--+
-- 	/* use the data classifier to determine what 802.1d tag the
-- 	 * data frame has */
-- 	rcu_read_lock();
----- a/drivers/net/wireless/ath/ath9k/xmit.c
--+++ b/drivers/net/wireless/ath/ath9k/xmit.c
--@@ -1444,14 +1444,16 @@ void ath_tx_aggr_sleep(struct ieee80211_
-- 	for (tidno = 0, tid = &an->tid[tidno];
-- 	     tidno < IEEE80211_NUM_TIDS; tidno++, tid++) {
-- 
---		if (!tid->sched)
---			continue;
---
-- 		ac = tid->ac;
-- 		txq = ac->txq;
-- 
-- 		ath_txq_lock(sc, txq);
-- 
--+		if (!tid->sched) {
--+			ath_txq_unlock(sc, txq);
--+			continue;
--+		}
--+
-- 		buffered = ath_tid_has_buffered(tid);
-- 
-- 		tid->sched = false;
--@@ -1696,7 +1698,7 @@ int ath_cabq_update(struct ath_softc *sc
-- 
-- 	ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi);
-- 
---	qi.tqi_readyTime = (cur_conf->beacon_interval *
--+	qi.tqi_readyTime = (TU_TO_USEC(cur_conf->beacon_interval) *
-- 			    ATH_CABQ_READY_TIME) / 100;
-- 	ath_txq_update(sc, qnum, &qi);
-- 
--@@ -2061,7 +2063,7 @@ static struct ath_buf *ath_tx_setup_buff
-- 
-- 	ATH_TXBUF_RESET(bf);
-- 
---	if (tid) {
--+	if (tid && ieee80211_is_data_present(hdr->frame_control)) {
-- 		fragno = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG;
-- 		seqno = tid->seq_next;
-- 		hdr->seq_ctrl = cpu_to_le16(tid->seq_next << IEEE80211_SEQ_SEQ_SHIFT);
--@@ -2184,14 +2186,15 @@ int ath_tx_start(struct ieee80211_hw *hw
-- 		txq->stopped = true;
-- 	}
-- 
--+	if (txctl->an && ieee80211_is_data_present(hdr->frame_control))
--+		tid = ath_get_skb_tid(sc, txctl->an, skb);
--+
-- 	if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) {
-- 		ath_txq_unlock(sc, txq);
-- 		txq = sc->tx.uapsdq;
-- 		ath_txq_lock(sc, txq);
-- 	} else if (txctl->an &&
-- 		   ieee80211_is_data_present(hdr->frame_control)) {
---		tid = ath_get_skb_tid(sc, txctl->an, skb);
---
-- 		WARN_ON(tid->ac->txq != txctl->txq);
-- 
-- 		if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -943,6 +943,7 @@ static void ath9k_set_hw_capab(struct at
-- 	hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
-- 	hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_5_10_MHZ;
-- 	hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
--+	hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
-- 
-- 	hw->queues = 4;
-- 	hw->max_rates = 4;
----- a/net/mac80211/ieee80211_i.h
--+++ b/net/mac80211/ieee80211_i.h
--@@ -1700,14 +1700,8 @@ void ieee80211_stop_queue_by_reason(stru
-- void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
-- void ieee80211_add_pending_skb(struct ieee80211_local *local,
-- 			       struct sk_buff *skb);
---void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
---				   struct sk_buff_head *skbs,
---				   void (*fn)(void *data), void *data);
---static inline void ieee80211_add_pending_skbs(struct ieee80211_local *local,
---					      struct sk_buff_head *skbs)
---{
---	ieee80211_add_pending_skbs_fn(local, skbs, NULL, NULL);
---}
--+void ieee80211_add_pending_skbs(struct ieee80211_local *local,
--+				struct sk_buff_head *skbs);
-- void ieee80211_flush_queues(struct ieee80211_local *local,
-- 			    struct ieee80211_sub_if_data *sdata);
-- 
----- a/net/mac80211/sta_info.c
--+++ b/net/mac80211/sta_info.c
--@@ -91,7 +91,7 @@ static int sta_info_hash_del(struct ieee
-- 	return -ENOENT;
-- }
-- 
---static void cleanup_single_sta(struct sta_info *sta)
--+static void __cleanup_single_sta(struct sta_info *sta)
-- {
-- 	int ac, i;
-- 	struct tid_ampdu_tx *tid_tx;
--@@ -99,7 +99,8 @@ static void cleanup_single_sta(struct st
-- 	struct ieee80211_local *local = sdata->local;
-- 	struct ps_data *ps;
-- 
---	if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
--+	if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
--+	    test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
-- 		if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
-- 		    sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-- 			ps = &sdata->bss->ps;
--@@ -109,6 +110,7 @@ static void cleanup_single_sta(struct st
-- 			return;
-- 
-- 		clear_sta_flag(sta, WLAN_STA_PS_STA);
--+		clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
-- 
-- 		atomic_dec(&ps->num_sta_ps);
-- 		sta_info_recalc_tim(sta);
--@@ -139,7 +141,14 @@ static void cleanup_single_sta(struct st
-- 		ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending);
-- 		kfree(tid_tx);
-- 	}
--+}
-- 
--+static void cleanup_single_sta(struct sta_info *sta)
--+{
--+	struct ieee80211_sub_if_data *sdata = sta->sdata;
--+	struct ieee80211_local *local = sdata->local;
--+
--+	__cleanup_single_sta(sta);
-- 	sta_info_free(local, sta);
-- }
-- 
--@@ -330,6 +339,7 @@ struct sta_info *sta_info_alloc(struct i
-- 	rcu_read_unlock();
-- 
-- 	spin_lock_init(&sta->lock);
--+	spin_lock_init(&sta->ps_lock);
-- 	INIT_WORK(&sta->drv_unblock_wk, sta_unblock);
-- 	INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
-- 	mutex_init(&sta->ampdu_mlme.mtx);
--@@ -487,21 +497,26 @@ static int sta_info_insert_finish(struct
-- 		goto out_err;
-- 	}
-- 
---	/* notify driver */
---	err = sta_info_insert_drv_state(local, sdata, sta);
---	if (err)
---		goto out_err;
---
-- 	local->num_sta++;
-- 	local->sta_generation++;
-- 	smp_mb();
-- 
--+	/* simplify things and don't accept BA sessions yet */
--+	set_sta_flag(sta, WLAN_STA_BLOCK_BA);
--+
-- 	/* make the station visible */
-- 	sta_info_hash_add(local, sta);
-- 
-- 	list_add_rcu(&sta->list, &local->sta_list);
-- 
--+	/* notify driver */
--+	err = sta_info_insert_drv_state(local, sdata, sta);
--+	if (err)
--+		goto out_remove;
--+
-- 	set_sta_flag(sta, WLAN_STA_INSERTED);
--+	/* accept BA sessions now */
--+	clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
-- 
-- 	ieee80211_recalc_min_chandef(sdata);
-- 	ieee80211_sta_debugfs_add(sta);
--@@ -522,6 +537,12 @@ static int sta_info_insert_finish(struct
-- 		mesh_accept_plinks_update(sdata);
-- 
-- 	return 0;
--+ out_remove:
--+	sta_info_hash_del(local, sta);
--+	list_del_rcu(&sta->list);
--+	local->num_sta--;
--+	synchronize_net();
--+	__cleanup_single_sta(sta);
--  out_err:
-- 	mutex_unlock(&local->sta_mtx);
-- 	rcu_read_lock();
--@@ -1071,10 +1092,14 @@ struct ieee80211_sta *ieee80211_find_sta
-- }
-- EXPORT_SYMBOL(ieee80211_find_sta);
-- 
---static void clear_sta_ps_flags(void *_sta)
--+/* powersave support code */
--+void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
-- {
---	struct sta_info *sta = _sta;
-- 	struct ieee80211_sub_if_data *sdata = sta->sdata;
--+	struct ieee80211_local *local = sdata->local;
--+	struct sk_buff_head pending;
--+	int filtered = 0, buffered = 0, ac;
--+	unsigned long flags;
-- 	struct ps_data *ps;
-- 
-- 	if (sdata->vif.type == NL80211_IFTYPE_AP ||
--@@ -1085,20 +1110,6 @@ static void clear_sta_ps_flags(void *_st
-- 	else
-- 		return;
-- 
---	clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
---	if (test_and_clear_sta_flag(sta, WLAN_STA_PS_STA))
---		atomic_dec(&ps->num_sta_ps);
---}
---
---/* powersave support code */
---void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
---{
---	struct ieee80211_sub_if_data *sdata = sta->sdata;
---	struct ieee80211_local *local = sdata->local;
---	struct sk_buff_head pending;
---	int filtered = 0, buffered = 0, ac;
---	unsigned long flags;
---
-- 	clear_sta_flag(sta, WLAN_STA_SP);
-- 
-- 	BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1);
--@@ -1109,6 +1120,8 @@ void ieee80211_sta_ps_deliver_wakeup(str
-- 
-- 	skb_queue_head_init(&pending);
-- 
--+	/* sync with ieee80211_tx_h_unicast_ps_buf */
--+	spin_lock(&sta->ps_lock);
-- 	/* Send all buffered frames to the station */
-- 	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
-- 		int count = skb_queue_len(&pending), tmp;
--@@ -1127,7 +1140,12 @@ void ieee80211_sta_ps_deliver_wakeup(str
-- 		buffered += tmp - count;
-- 	}
-- 
---	ieee80211_add_pending_skbs_fn(local, &pending, clear_sta_ps_flags, sta);
--+	ieee80211_add_pending_skbs(local, &pending);
--+	clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
--+	clear_sta_flag(sta, WLAN_STA_PS_STA);
--+	spin_unlock(&sta->ps_lock);
--+
--+	atomic_dec(&ps->num_sta_ps);
-- 
-- 	/* This station just woke up and isn't aware of our SMPS state */
-- 	if (!ieee80211_smps_is_restrictive(sta->known_smps_mode,
----- a/net/mac80211/sta_info.h
--+++ b/net/mac80211/sta_info.h
--@@ -267,6 +267,7 @@ struct ieee80211_tx_latency_stat {
--  * @drv_unblock_wk: used for driver PS unblocking
--  * @listen_interval: listen interval of this station, when we're acting as AP
--  * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly
--+ * @ps_lock: used for powersave (when mac80211 is the AP) related locking
--  * @ps_tx_buf: buffers (per AC) of frames to transmit to this station
--  *	when it leaves power saving state or polls
--  * @tx_filtered: buffers (per AC) of frames we already tried to
--@@ -356,10 +357,8 @@ struct sta_info {
-- 	/* use the accessors defined below */
-- 	unsigned long _flags;
-- 
---	/*
---	 * STA powersave frame queues, no more than the internal
---	 * locking required.
---	 */
--+	/* STA powersave lock and frame queues */
--+	spinlock_t ps_lock;
-- 	struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS];
-- 	struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS];
-- 	unsigned long driver_buffered_tids;
----- a/net/mac80211/util.c
--+++ b/net/mac80211/util.c
--@@ -435,9 +435,8 @@ void ieee80211_add_pending_skb(struct ie
-- 	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
-- }
-- 
---void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
---				   struct sk_buff_head *skbs,
---				   void (*fn)(void *data), void *data)
--+void ieee80211_add_pending_skbs(struct ieee80211_local *local,
--+				struct sk_buff_head *skbs)
-- {
-- 	struct ieee80211_hw *hw = &local->hw;
-- 	struct sk_buff *skb;
--@@ -461,9 +460,6 @@ void ieee80211_add_pending_skbs_fn(struc
-- 		__skb_queue_tail(&local->pending[queue], skb);
-- 	}
-- 
---	if (fn)
---		fn(data);
---
-- 	for (i = 0; i < hw->queues; i++)
-- 		__ieee80211_wake_queue(hw, i,
-- 			IEEE80211_QUEUE_STOP_REASON_SKB_ADD);
----- a/net/wireless/reg.c
--+++ b/net/wireless/reg.c
--@@ -1700,7 +1700,7 @@ static void reg_process_hint(struct regu
-- 		return;
-- 	case NL80211_REGDOM_SET_BY_USER:
-- 		treatment = reg_process_hint_user(reg_request);
---		if (treatment == REG_REQ_OK ||
--+		if (treatment == REG_REQ_IGNORE ||
-- 		    treatment == REG_REQ_ALREADY_SET)
-- 			return;
-- 		schedule_delayed_work(&reg_timeout, msecs_to_jiffies(3142));
----- a/drivers/net/wireless/ath/ath9k/debug.c
--+++ b/drivers/net/wireless/ath/ath9k/debug.c
--@@ -138,43 +138,41 @@ static ssize_t read_file_ani(struct file
-- 	unsigned int len = 0, size = 1024;
-- 	ssize_t retval = 0;
-- 	char *buf;
--+	int i;
--+	struct {
--+		const char *name;
--+		unsigned int val;
--+	} ani_info[] = {
--+		{ "ANI RESET", ah->stats.ast_ani_reset },
--+		{ "OFDM LEVEL", ah->ani.ofdmNoiseImmunityLevel },
--+		{ "CCK LEVEL", ah->ani.cckNoiseImmunityLevel },
--+		{ "SPUR UP", ah->stats.ast_ani_spurup },
--+		{ "SPUR DOWN", ah->stats.ast_ani_spurup },
--+		{ "OFDM WS-DET ON", ah->stats.ast_ani_ofdmon },
--+		{ "OFDM WS-DET OFF", ah->stats.ast_ani_ofdmoff },
--+		{ "MRC-CCK ON", ah->stats.ast_ani_ccklow },
--+		{ "MRC-CCK OFF", ah->stats.ast_ani_cckhigh },
--+		{ "FIR-STEP UP", ah->stats.ast_ani_stepup },
--+		{ "FIR-STEP DOWN", ah->stats.ast_ani_stepdown },
--+		{ "INV LISTENTIME", ah->stats.ast_ani_lneg_or_lzero },
--+		{ "OFDM ERRORS", ah->stats.ast_ani_ofdmerrs },
--+		{ "CCK ERRORS", ah->stats.ast_ani_cckerrs },
--+	};
-- 
-- 	buf = kzalloc(size, GFP_KERNEL);
-- 	if (buf == NULL)
-- 		return -ENOMEM;
-- 
---	if (common->disable_ani) {
---		len += scnprintf(buf + len, size - len, "%s: %s\n",
---				 "ANI", "DISABLED");
--+	len += scnprintf(buf + len, size - len, "%15s: %s\n", "ANI",
--+			 common->disable_ani ? "DISABLED" : "ENABLED");
--+
--+	if (common->disable_ani)
-- 		goto exit;
---	}
-- 
---	len += scnprintf(buf + len, size - len, "%15s: %s\n",
---			 "ANI", "ENABLED");
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "ANI RESET", ah->stats.ast_ani_reset);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "SPUR UP", ah->stats.ast_ani_spurup);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "SPUR DOWN", ah->stats.ast_ani_spurup);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "OFDM WS-DET ON", ah->stats.ast_ani_ofdmon);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "OFDM WS-DET OFF", ah->stats.ast_ani_ofdmoff);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "MRC-CCK ON", ah->stats.ast_ani_ccklow);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "MRC-CCK OFF", ah->stats.ast_ani_cckhigh);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "FIR-STEP UP", ah->stats.ast_ani_stepup);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "FIR-STEP DOWN", ah->stats.ast_ani_stepdown);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "INV LISTENTIME", ah->stats.ast_ani_lneg_or_lzero);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "OFDM ERRORS", ah->stats.ast_ani_ofdmerrs);
---	len += scnprintf(buf + len, size - len, "%15s: %u\n",
---			 "CCK ERRORS", ah->stats.ast_ani_cckerrs);
--+	for (i = 0; i < ARRAY_SIZE(ani_info); i++)
--+		len += scnprintf(buf + len, size - len, "%15s: %u\n",
--+				 ani_info[i].name, ani_info[i].val);
--+
-- exit:
-- 	if (len > size)
-- 		len = size;
--@@ -866,6 +864,12 @@ static ssize_t read_file_reset(struct fi
-- 			 "%17s: %2d\n", "PLL RX Hang",
-- 			 sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
-- 	len += scnprintf(buf + len, sizeof(buf) - len,
--+			 "%17s: %2d\n", "MAC Hang",
--+			 sc->debug.stats.reset[RESET_TYPE_MAC_HANG]);
--+	len += scnprintf(buf + len, sizeof(buf) - len,
--+			 "%17s: %2d\n", "Stuck Beacon",
--+			 sc->debug.stats.reset[RESET_TYPE_BEACON_STUCK]);
--+	len += scnprintf(buf + len, sizeof(buf) - len,
-- 			 "%17s: %2d\n", "MCI Reset",
-- 			 sc->debug.stats.reset[RESET_TYPE_MCI]);
-- 
----- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
--+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
--@@ -868,10 +868,6 @@ static void ar9003_hw_set_rfmode(struct 
-- 
-- 	if (IS_CHAN_A_FAST_CLOCK(ah, chan))
-- 		rfMode |= (AR_PHY_MODE_DYNAMIC | AR_PHY_MODE_DYN_CCK_DISABLE);
---	if (IS_CHAN_QUARTER_RATE(chan))
---		rfMode |= AR_PHY_MODE_QUARTER;
---	if (IS_CHAN_HALF_RATE(chan))
---		rfMode |= AR_PHY_MODE_HALF;
-- 
-- 	if (rfMode & (AR_PHY_MODE_QUARTER | AR_PHY_MODE_HALF))
-- 		REG_RMW_FIELD(ah, AR_PHY_FRAME_CTL,
----- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
--+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
--@@ -706,6 +706,7 @@ ath5k_get_survey(struct ieee80211_hw *hw
-- 	survey->channel = conf->chandef.chan;
-- 	survey->noise = ah->ah_noise_floor;
-- 	survey->filled = SURVEY_INFO_NOISE_DBM |
--+			SURVEY_INFO_IN_USE |
-- 			SURVEY_INFO_CHANNEL_TIME |
-- 			SURVEY_INFO_CHANNEL_TIME_BUSY |
-- 			SURVEY_INFO_CHANNEL_TIME_RX |
----- a/drivers/net/wireless/ath/ath9k/recv.c
--+++ b/drivers/net/wireless/ath/ath9k/recv.c
--@@ -732,11 +732,18 @@ static struct ath_rxbuf *ath_get_next_rx
-- 			return NULL;
-- 
-- 		/*
---		 * mark descriptor as zero-length and set the 'more'
---		 * flag to ensure that both buffers get discarded
--+		 * Re-check previous descriptor, in case it has been filled
--+		 * in the mean time.
-- 		 */
---		rs->rs_datalen = 0;
---		rs->rs_more = true;
--+		ret = ath9k_hw_rxprocdesc(ah, ds, rs);
--+		if (ret == -EINPROGRESS) {
--+			/*
--+			 * mark descriptor as zero-length and set the 'more'
--+			 * flag to ensure that both buffers get discarded
--+			 */
--+			rs->rs_datalen = 0;
--+			rs->rs_more = true;
--+		}
-- 	}
-- 
-- 	list_del(&bf->list);
--@@ -985,32 +992,32 @@ static int ath9k_rx_skb_preprocess(struc
-- 	struct ath_common *common = ath9k_hw_common(ah);
-- 	struct ieee80211_hdr *hdr;
-- 	bool discard_current = sc->rx.discard_next;
---	int ret = 0;
-- 
-- 	/*
-- 	 * Discard corrupt descriptors which are marked in
-- 	 * ath_get_next_rx_buf().
-- 	 */
---	sc->rx.discard_next = rx_stats->rs_more;
-- 	if (discard_current)
---		return -EINVAL;
--+		goto corrupt;
--+
--+	sc->rx.discard_next = false;
-- 
-- 	/*
-- 	 * Discard zero-length packets.
-- 	 */
-- 	if (!rx_stats->rs_datalen) {
-- 		RX_STAT_INC(rx_len_err);
---		return -EINVAL;
--+		goto corrupt;
-- 	}
-- 
---        /*
---         * rs_status follows rs_datalen so if rs_datalen is too large
---         * we can take a hint that hardware corrupted it, so ignore
---         * those frames.
---         */
--+	/*
--+	 * rs_status follows rs_datalen so if rs_datalen is too large
--+	 * we can take a hint that hardware corrupted it, so ignore
--+	 * those frames.
--+	 */
-- 	if (rx_stats->rs_datalen > (common->rx_bufsize - ah->caps.rx_status_len)) {
-- 		RX_STAT_INC(rx_len_err);
---		return -EINVAL;
--+		goto corrupt;
-- 	}
-- 
-- 	/* Only use status info from the last fragment */
--@@ -1024,10 +1031,8 @@ static int ath9k_rx_skb_preprocess(struc
-- 	 * This is different from the other corrupt descriptor
-- 	 * condition handled above.
-- 	 */
---	if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC) {
---		ret = -EINVAL;
---		goto exit;
---	}
--+	if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC)
--+		goto corrupt;
-- 
-- 	hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len);
-- 
--@@ -1043,18 +1048,15 @@ static int ath9k_rx_skb_preprocess(struc
-- 		if (ath_process_fft(sc, hdr, rx_stats, rx_status->mactime))
-- 			RX_STAT_INC(rx_spectral);
-- 
---		ret = -EINVAL;
---		goto exit;
--+		return -EINVAL;
-- 	}
-- 
-- 	/*
-- 	 * everything but the rate is checked here, the rate check is done
-- 	 * separately to avoid doing two lookups for a rate for each frame.
-- 	 */
---	if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error)) {
---		ret = -EINVAL;
---		goto exit;
---	}
--+	if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error))
--+		return -EINVAL;
-- 
-- 	if (ath_is_mybeacon(common, hdr)) {
-- 		RX_STAT_INC(rx_beacons);
--@@ -1064,15 +1066,11 @@ static int ath9k_rx_skb_preprocess(struc
-- 	/*
-- 	 * This shouldn't happen, but have a safety check anyway.
-- 	 */
---	if (WARN_ON(!ah->curchan)) {
---		ret = -EINVAL;
---		goto exit;
---	}
--+	if (WARN_ON(!ah->curchan))
--+		return -EINVAL;
-- 
---	if (ath9k_process_rate(common, hw, rx_stats, rx_status)) {
---		ret =-EINVAL;
---		goto exit;
---	}
--+	if (ath9k_process_rate(common, hw, rx_stats, rx_status))
--+		return -EINVAL;
-- 
-- 	ath9k_process_rssi(common, hw, rx_stats, rx_status);
-- 
--@@ -1087,9 +1085,11 @@ static int ath9k_rx_skb_preprocess(struc
-- 		sc->rx.num_pkts++;
-- #endif
-- 
---exit:
---	sc->rx.discard_next = false;
---	return ret;
--+	return 0;
--+
--+corrupt:
--+	sc->rx.discard_next = rx_stats->rs_more;
--+	return -EINVAL;
-- }
-- 
-- static void ath9k_rx_skb_postprocess(struct ath_common *common,
----- a/drivers/net/wireless/ath/ath9k/ani.c
--+++ b/drivers/net/wireless/ath/ath9k/ani.c
--@@ -176,16 +176,26 @@ static void ath9k_hw_set_ofdm_nil(struct
-- 	if (ah->opmode == NL80211_IFTYPE_STATION &&
-- 	    BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_HIGH)
-- 		weak_sig = true;
---
-- 	/*
---	 * OFDM Weak signal detection is always enabled for AP mode.
--+	 * Newer chipsets are better at dealing with high PHY error counts -
--+	 * keep weak signal detection enabled when no RSSI threshold is
--+	 * available to determine if it is needed (mode != STA)
-- 	 */
---	if (ah->opmode != NL80211_IFTYPE_AP &&
---	    aniState->ofdmWeakSigDetect != weak_sig) {
---		ath9k_hw_ani_control(ah,
---				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
---				     entry_ofdm->ofdm_weak_signal_on);
---	}
--+	else if (AR_SREV_9300_20_OR_LATER(ah) &&
--+		 ah->opmode != NL80211_IFTYPE_STATION)
--+		weak_sig = true;
--+
--+	/* Older chipsets are more sensitive to high PHY error counts */
--+	else if (!AR_SREV_9300_20_OR_LATER(ah) &&
--+		 aniState->ofdmNoiseImmunityLevel >= 8)
--+		weak_sig = false;
--+
--+	if (aniState->ofdmWeakSigDetect != weak_sig)
--+		ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--+				     weak_sig);
--+
--+	if (!AR_SREV_9300_20_OR_LATER(ah))
--+		return;
-- 
-- 	if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) {
-- 		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
--@@ -308,17 +318,6 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-- 	BUG_ON(aniState == NULL);
-- 	ah->stats.ast_ani_reset++;
-- 
---	/* only allow a subset of functions in AP mode */
---	if (ah->opmode == NL80211_IFTYPE_AP) {
---		if (IS_CHAN_2GHZ(chan)) {
---			ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL |
---					    ATH9K_ANI_FIRSTEP_LEVEL);
---			if (AR_SREV_9300_20_OR_LATER(ah))
---				ah->ani_function |= ATH9K_ANI_MRC_CCK;
---		} else
---			ah->ani_function = 0;
---	}
---
-- 	ofdm_nil = max_t(int, ATH9K_ANI_OFDM_DEF_LEVEL,
-- 			 aniState->ofdmNoiseImmunityLevel);
-- 	cck_nil = max_t(int, ATH9K_ANI_CCK_DEF_LEVEL,
--@@ -483,10 +482,17 @@ void ath9k_hw_ani_init(struct ath_hw *ah
-- 
-- 	ath_dbg(common, ANI, "Initialize ANI\n");
-- 
---	ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
---	ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
---	ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH;
---	ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW;
--+	if (AR_SREV_9300_20_OR_LATER(ah)) {
--+		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
--+		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
--+		ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH;
--+		ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW;
--+	} else {
--+		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_OLD;
--+		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_OLD;
--+		ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_OLD;
--+		ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_OLD;
--+	}
-- 
-- 	ani->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL;
-- 	ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL;
----- a/drivers/net/wireless/ath/ath9k/ani.h
--+++ b/drivers/net/wireless/ath/ath9k/ani.h
--@@ -22,12 +22,16 @@
-- /* units are errors per second */
-- #define ATH9K_ANI_OFDM_TRIG_HIGH           3500
-- #define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000
--+#define ATH9K_ANI_OFDM_TRIG_HIGH_OLD       500
-- 
-- #define ATH9K_ANI_OFDM_TRIG_LOW           400
-- #define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900
--+#define ATH9K_ANI_OFDM_TRIG_LOW_OLD       200
-- 
-- #define ATH9K_ANI_CCK_TRIG_HIGH           600
--+#define ATH9K_ANI_CCK_TRIG_HIGH_OLD       200
-- #define ATH9K_ANI_CCK_TRIG_LOW            300
--+#define ATH9K_ANI_CCK_TRIG_LOW_OLD        100
-- 
-- #define ATH9K_ANI_SPUR_IMMUNE_LVL         3
-- #define ATH9K_ANI_FIRSTEP_LVL             2
----- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
--+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
--@@ -26,10 +26,6 @@ static const int firstep_table[] =
-- /* level:  0   1   2   3   4   5   6   7   8  */
-- 	{ -4, -2,  0,  2,  4,  6,  8, 10, 12 }; /* lvl 0-8, default 2 */
-- 
---static const int cycpwrThr1_table[] =
---/* level:  0   1   2   3   4   5   6   7   8  */
---	{ -6, -4, -2,  0,  2,  4,  6,  8 };     /* lvl 0-7, default 3 */
---
-- /*
--  * register values to turn OFDM weak signal detection OFF
--  */
--@@ -921,7 +917,7 @@ static bool ar5008_hw_ani_control_new(st
-- 	struct ath_common *common = ath9k_hw_common(ah);
-- 	struct ath9k_channel *chan = ah->curchan;
-- 	struct ar5416AniState *aniState = &ah->ani;
---	s32 value, value2;
--+	s32 value;
-- 
-- 	switch (cmd & ah->ani_function) {
-- 	case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{
--@@ -1008,42 +1004,11 @@ static bool ar5008_hw_ani_control_new(st
-- 	case ATH9K_ANI_FIRSTEP_LEVEL:{
-- 		u32 level = param;
-- 
---		if (level >= ARRAY_SIZE(firstep_table)) {
---			ath_dbg(common, ANI,
---				"ATH9K_ANI_FIRSTEP_LEVEL: level out of range (%u > %zu)\n",
---				level, ARRAY_SIZE(firstep_table));
---			return false;
---		}
---
---		/*
---		 * make register setting relative to default
---		 * from INI file & cap value
---		 */
---		value = firstep_table[level] -
---			firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
---			aniState->iniDef.firstep;
---		if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)
---			value = ATH9K_SIG_FIRSTEP_SETTING_MIN;
---		if (value > ATH9K_SIG_FIRSTEP_SETTING_MAX)
---			value = ATH9K_SIG_FIRSTEP_SETTING_MAX;
--+		value = level * 2;
-- 		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
---			      AR_PHY_FIND_SIG_FIRSTEP,
---			      value);
---		/*
---		 * we need to set first step low register too
---		 * make register setting relative to default
---		 * from INI file & cap value
---		 */
---		value2 = firstep_table[level] -
---			 firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
---			 aniState->iniDef.firstepLow;
---		if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)
---			value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN;
---		if (value2 > ATH9K_SIG_FIRSTEP_SETTING_MAX)
---			value2 = ATH9K_SIG_FIRSTEP_SETTING_MAX;
---
--+			      AR_PHY_FIND_SIG_FIRSTEP, value);
-- 		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG_LOW,
---			      AR_PHY_FIND_SIG_FIRSTEP_LOW, value2);
--+			      AR_PHY_FIND_SIG_FIRSTEP_LOW, value);
-- 
-- 		if (level != aniState->firstepLevel) {
-- 			ath_dbg(common, ANI,
--@@ -1060,7 +1025,7 @@ static bool ar5008_hw_ani_control_new(st
-- 				aniState->firstepLevel,
-- 				level,
-- 				ATH9K_ANI_FIRSTEP_LVL,
---				value2,
--+				value,
-- 				aniState->iniDef.firstepLow);
-- 			if (level > aniState->firstepLevel)
-- 				ah->stats.ast_ani_stepup++;
--@@ -1073,41 +1038,13 @@ static bool ar5008_hw_ani_control_new(st
-- 	case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{
-- 		u32 level = param;
-- 
---		if (level >= ARRAY_SIZE(cycpwrThr1_table)) {
---			ath_dbg(common, ANI,
---				"ATH9K_ANI_SPUR_IMMUNITY_LEVEL: level out of range (%u > %zu)\n",
---				level, ARRAY_SIZE(cycpwrThr1_table));
---			return false;
---		}
---		/*
---		 * make register setting relative to default
---		 * from INI file & cap value
---		 */
---		value = cycpwrThr1_table[level] -
---			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
---			aniState->iniDef.cycpwrThr1;
---		if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
---			value = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
---		if (value > ATH9K_SIG_SPUR_IMM_SETTING_MAX)
---			value = ATH9K_SIG_SPUR_IMM_SETTING_MAX;
--+		value = (level + 1) * 2;
-- 		REG_RMW_FIELD(ah, AR_PHY_TIMING5,
---			      AR_PHY_TIMING5_CYCPWR_THR1,
---			      value);
--+			      AR_PHY_TIMING5_CYCPWR_THR1, value);
-- 
---		/*
---		 * set AR_PHY_EXT_CCA for extension channel
---		 * make register setting relative to default
---		 * from INI file & cap value
---		 */
---		value2 = cycpwrThr1_table[level] -
---			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
---			 aniState->iniDef.cycpwrThr1Ext;
---		if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
---			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
---		if (value2 > ATH9K_SIG_SPUR_IMM_SETTING_MAX)
---			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MAX;
---		REG_RMW_FIELD(ah, AR_PHY_EXT_CCA,
---			      AR_PHY_EXT_TIMING5_CYCPWR_THR1, value2);
--+		if (IS_CHAN_HT40(ah->curchan))
--+			REG_RMW_FIELD(ah, AR_PHY_EXT_CCA,
--+				      AR_PHY_EXT_TIMING5_CYCPWR_THR1, value);
-- 
-- 		if (level != aniState->spurImmunityLevel) {
-- 			ath_dbg(common, ANI,
--@@ -1124,7 +1061,7 @@ static bool ar5008_hw_ani_control_new(st
-- 				aniState->spurImmunityLevel,
-- 				level,
-- 				ATH9K_ANI_SPUR_IMMUNE_LVL,
---				value2,
--+				value,
-- 				aniState->iniDef.cycpwrThr1Ext);
-- 			if (level > aniState->spurImmunityLevel)
-- 				ah->stats.ast_ani_spurup++;
-diff --git a/package/mac80211/patches/310-ap_scan.patch b/package/mac80211/patches/310-ap_scan.patch
-deleted file mode 100644
-index 389a003..0000000
---- a/package/mac80211/patches/310-ap_scan.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/net/mac80211/cfg.c
--+++ b/net/mac80211/cfg.c
--@@ -2148,7 +2148,7 @@ static int ieee80211_scan(struct wiphy *
-- 		 * the  frames sent while scanning on other channel will be
-- 		 * lost)
-- 		 */
---		if (sdata->u.ap.beacon &&
--+		if (0 && sdata->u.ap.beacon &&
-- 		    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
-- 		     !(req->flags & NL80211_SCAN_FLAG_AP)))
-- 			return -EOPNOTSUPP;
-diff --git a/package/mac80211/patches/400-ath_move_debug_code.patch b/package/mac80211/patches/400-ath_move_debug_code.patch
-deleted file mode 100644
-index 0dba7ac..0000000
---- a/package/mac80211/patches/400-ath_move_debug_code.patch
-+++ /dev/null
-@@ -1,28 +0,0 @@
----- a/drivers/net/wireless/ath/Makefile
--+++ b/drivers/net/wireless/ath/Makefile
--@@ -13,8 +13,8 @@ ath-objs :=	main.o \
-- 		regd.o \
-- 		hw.o \
-- 		key.o \
--+		debug.o \
-- 		dfs_pattern_detector.o \
-- 		dfs_pri_detector.o
-- 
---ath-$(CPTCFG_ATH_DEBUG) += debug.o
-- ccflags-y += -D__CHECK_ENDIAN__
----- a/drivers/net/wireless/ath/ath.h
--+++ b/drivers/net/wireless/ath/ath.h
--@@ -282,13 +282,6 @@ void _ath_dbg(struct ath_common *common,
-- #endif /* CPTCFG_ATH_DEBUG */
-- 
-- /** Returns string describing opmode, or NULL if unknown mode. */
---#ifdef CPTCFG_ATH_DEBUG
-- const char *ath_opmode_to_string(enum nl80211_iftype opmode);
---#else
---static inline const char *ath_opmode_to_string(enum nl80211_iftype opmode)
---{
---	return "UNKNOWN";
---}
---#endif
-- 
-- #endif /* ATH_H */
-diff --git a/package/mac80211/patches/401-ath9k_blink_default.patch b/package/mac80211/patches/401-ath9k_blink_default.patch
-deleted file mode 100644
-index b0cef87..0000000
---- a/package/mac80211/patches/401-ath9k_blink_default.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -45,7 +45,7 @@ int ath9k_modparam_nohwcrypt;
-- module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
-- MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
-- 
---int led_blink;
--+int led_blink = 1;
-- module_param_named(blink, led_blink, int, 0444);
-- MODULE_PARM_DESC(blink, "Enable LED blink on activity");
-- 
-diff --git a/package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch b/package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch
-deleted file mode 100644
-index 63ab0db..0000000
---- a/package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch
-+++ /dev/null
-@@ -1,29 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -19,6 +19,7 @@
-- #include <linux/module.h>
-- #include <linux/time.h>
-- #include <linux/bitops.h>
--+#include <linux/etherdevice.h>
-- #include <asm/unaligned.h>
-- 
-- #include "hw.h"
--@@ -449,8 +450,16 @@ static int ath9k_hw_init_macaddr(struct 
-- 		common->macaddr[2 * i] = eeval >> 8;
-- 		common->macaddr[2 * i + 1] = eeval & 0xff;
-- 	}
---	if (sum == 0 || sum == 0xffff * 3)
---		return -EADDRNOTAVAIL;
--+	if (!is_valid_ether_addr(common->macaddr)) {
--+		ath_err(common,
--+			"eeprom contains invalid mac address: %pM\n",
--+			common->macaddr);
--+
--+		random_ether_addr(common->macaddr);
--+		ath_err(common,
--+			"random mac address will be used: %pM\n",
--+			common->macaddr);
--+	}
-- 
-- 	return 0;
-- }
-diff --git a/package/mac80211/patches/403-ath_regd_optional.patch b/package/mac80211/patches/403-ath_regd_optional.patch
-deleted file mode 100644
-index 07c54cc..0000000
---- a/package/mac80211/patches/403-ath_regd_optional.patch
-+++ /dev/null
-@@ -1,68 +0,0 @@
----- a/drivers/net/wireless/ath/regd.c
--+++ b/drivers/net/wireless/ath/regd.c
--@@ -341,6 +341,10 @@ ath_reg_apply_beaconing_flags(struct wip
-- 	struct ieee80211_channel *ch;
-- 	unsigned int i;
-- 
--+#ifdef CPTCFG_ATH_USER_REGD
--+	return;
--+#endif
--+
-- 	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
-- 		if (!wiphy->bands[band])
-- 			continue;
--@@ -374,6 +378,10 @@ ath_reg_apply_ir_flags(struct wiphy *wip
-- {
-- 	struct ieee80211_supported_band *sband;
-- 
--+#ifdef CPTCFG_ATH_USER_REGD
--+	return;
--+#endif
--+
-- 	sband = wiphy->bands[IEEE80211_BAND_2GHZ];
-- 	if (!sband)
-- 		return;
--@@ -402,6 +410,10 @@ static void ath_reg_apply_radar_flags(st
-- 	struct ieee80211_channel *ch;
-- 	unsigned int i;
-- 
--+#ifdef CPTCFG_ATH_USER_REGD
--+	return;
--+#endif
--+
-- 	if (!wiphy->bands[IEEE80211_BAND_5GHZ])
-- 		return;
-- 
--@@ -631,6 +643,10 @@ ath_regd_init_wiphy(struct ath_regulator
-- {
-- 	const struct ieee80211_regdomain *regd;
-- 
--+#ifdef CPTCFG_ATH_USER_REGD
--+	return 0;
--+#endif
--+
-- 	wiphy->reg_notifier = reg_notifier;
-- 	wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
-- 				   REGULATORY_CUSTOM_REG;
----- a/drivers/net/wireless/ath/Kconfig
--+++ b/drivers/net/wireless/ath/Kconfig
--@@ -21,6 +21,9 @@ menuconfig ATH_CARDS
-- 
-- if ATH_CARDS
-- 
--+config ATH_USER_REGD
--+	bool "Do not enforce EEPROM regulatory restrictions"
--+
-- config ATH_DEBUG
-- 	bool "Atheros wireless debugging"
-- 	---help---
----- a/.local-symbols
--+++ b/.local-symbols
--@@ -119,6 +119,7 @@ RTL8187_LEDS=
-- ATH_COMMON=
-- ATH_CARDS=
-- ATH_DEBUG=
--+ATH_USER_REGD=
-- ATH_REG_DYNAMIC_USER_REG_HINTS=
-- ATH_REG_DYNAMIC_USER_CERT_TESTING=
-- ATH5K=
-diff --git a/package/mac80211/patches/404-world_regd_fixup.patch b/package/mac80211/patches/404-world_regd_fixup.patch
-deleted file mode 100644
-index 2b04309..0000000
---- a/package/mac80211/patches/404-world_regd_fixup.patch
-+++ /dev/null
-@@ -1,84 +0,0 @@
----- a/drivers/net/wireless/ath/regd.c
--+++ b/drivers/net/wireless/ath/regd.c
--@@ -43,7 +43,8 @@ static int __ath_regd_init(struct ath_re
-- 					 NL80211_RRF_NO_OFDM)
-- 
-- /* We allow IBSS on these on a case by case basis by regulatory domain */
---#define ATH9K_5GHZ_5150_5350	REG_RULE(5150-10, 5350+10, 80, 0, 30,\
--+#define ATH9K_5GHZ_5150_5350	REG_RULE(5150-10, 5240+10, 80, 0, 30, 0),\
--+				REG_RULE(5260-10, 5350+10, 80, 0, 30,\
-- 					 NL80211_RRF_NO_IR)
-- #define ATH9K_5GHZ_5470_5850	REG_RULE(5470-10, 5850+10, 80, 0, 30,\
-- 					 NL80211_RRF_NO_IR)
--@@ -61,57 +62,56 @@ static int __ath_regd_init(struct ath_re
-- #define ATH9K_5GHZ_NO_MIDBAND	ATH9K_5GHZ_5150_5350, \
-- 				ATH9K_5GHZ_5725_5850
-- 
--+#define REGD_RULES(...) \
--+	.reg_rules = { __VA_ARGS__ }, \
--+	.n_reg_rules = ARRAY_SIZE(((struct ieee80211_reg_rule[]) { __VA_ARGS__ }))
--+
-- /* Can be used for:
--  * 0x60, 0x61, 0x62 */
-- static const struct ieee80211_regdomain ath_world_regdom_60_61_62 = {
---	.n_reg_rules = 5,
-- 	.alpha2 =  "99",
---	.reg_rules = {
--+	REGD_RULES(
-- 		ATH9K_2GHZ_ALL,
-- 		ATH9K_5GHZ_ALL,
---	}
--+	)
-- };
-- 
-- /* Can be used by 0x63 and 0x65 */
-- static const struct ieee80211_regdomain ath_world_regdom_63_65 = {
---	.n_reg_rules = 4,
-- 	.alpha2 =  "99",
---	.reg_rules = {
--+	REGD_RULES(
-- 		ATH9K_2GHZ_CH01_11,
-- 		ATH9K_2GHZ_CH12_13,
-- 		ATH9K_5GHZ_NO_MIDBAND,
---	}
--+	)
-- };
-- 
-- /* Can be used by 0x64 only */
-- static const struct ieee80211_regdomain ath_world_regdom_64 = {
---	.n_reg_rules = 3,
-- 	.alpha2 =  "99",
---	.reg_rules = {
--+	REGD_RULES(
-- 		ATH9K_2GHZ_CH01_11,
-- 		ATH9K_5GHZ_NO_MIDBAND,
---	}
--+	)
-- };
-- 
-- /* Can be used by 0x66 and 0x69 */
-- static const struct ieee80211_regdomain ath_world_regdom_66_69 = {
---	.n_reg_rules = 3,
-- 	.alpha2 =  "99",
---	.reg_rules = {
--+	REGD_RULES(
-- 		ATH9K_2GHZ_CH01_11,
-- 		ATH9K_5GHZ_ALL,
---	}
--+	)
-- };
-- 
-- /* Can be used by 0x67, 0x68, 0x6A and 0x6C */
-- static const struct ieee80211_regdomain ath_world_regdom_67_68_6A_6C = {
---	.n_reg_rules = 4,
-- 	.alpha2 =  "99",
---	.reg_rules = {
--+	REGD_RULES(
-- 		ATH9K_2GHZ_CH01_11,
-- 		ATH9K_2GHZ_CH12_13,
-- 		ATH9K_5GHZ_ALL,
---	}
--+	)
-- };
-- 
-- static bool dynamic_country_user_possible(struct ath_regulatory *reg)
-diff --git a/package/mac80211/patches/405-regd_no_assoc_hints.patch b/package/mac80211/patches/405-regd_no_assoc_hints.patch
-deleted file mode 100644
-index 6ad4fda..0000000
---- a/package/mac80211/patches/405-regd_no_assoc_hints.patch
-+++ /dev/null
-@@ -1,19 +0,0 @@
----- a/net/wireless/reg.c
--+++ b/net/wireless/reg.c
--@@ -1878,6 +1878,8 @@ void regulatory_hint_country_ie(struct w
-- 	enum environment_cap env = ENVIRON_ANY;
-- 	struct regulatory_request *request = NULL, *lr;
-- 
--+	return;
--+
-- 	/* IE len must be evenly divisible by 2 */
-- 	if (country_ie_len & 0x01)
-- 		return;
--@@ -2072,6 +2074,7 @@ static void restore_regulatory_settings(
-- 
-- void regulatory_hint_disconnect(void)
-- {
--+	return;
-- 	REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
-- 	restore_regulatory_settings(false);
-- }
-diff --git a/package/mac80211/patches/406-ath_regd_us.patch b/package/mac80211/patches/406-ath_regd_us.patch
-deleted file mode 100644
-index cc55877..0000000
---- a/package/mac80211/patches/406-ath_regd_us.patch
-+++ /dev/null
-@@ -1,26 +0,0 @@
----- a/drivers/net/wireless/ath/regd_common.h
--+++ b/drivers/net/wireless/ath/regd_common.h
--@@ -32,6 +32,7 @@ enum EnumRd {
-- 	FCC2_WORLD = 0x21,
-- 	FCC2_ETSIC = 0x22,
-- 	FCC6_WORLD = 0x23,
--+	FCC3_FCCA_2 = 0x2A,
-- 	FRANCE_RES = 0x31,
-- 	FCC3_FCCA = 0x3A,
-- 	FCC3_WORLD = 0x3B,
--@@ -167,6 +168,7 @@ static struct reg_dmn_pair_mapping regDo
-- 	{FCC2_WORLD, CTL_FCC, CTL_ETSI},
-- 	{FCC2_ETSIC, CTL_FCC, CTL_ETSI},
-- 	{FCC3_FCCA, CTL_FCC, CTL_FCC},
--+	{FCC3_FCCA_2, CTL_FCC, CTL_FCC},
-- 	{FCC3_WORLD, CTL_FCC, CTL_ETSI},
-- 	{FCC4_FCCA, CTL_FCC, CTL_FCC},
-- 	{FCC5_FCCA, CTL_FCC, CTL_FCC},
--@@ -463,6 +465,7 @@ static struct country_code_to_enum_rd al
-- 	{CTRY_UAE, NULL1_WORLD, "AE"},
-- 	{CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"},
-- 	{CTRY_UNITED_STATES, FCC3_FCCA, "US"},
--+	{CTRY_UNITED_STATES, FCC3_FCCA_2, "US"},
-- 	/* This "PS" is for US public safety actually... to support this we
-- 	 * would need to assign new special alpha2 to CRDA db as with the world
-- 	 * regdomain and use another alpha2 */
-diff --git a/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch b/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
-deleted file mode 100644
-index 1f71e0b..0000000
---- a/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
-+++ /dev/null
-@@ -1,10 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -866,6 +866,7 @@ static const struct ieee80211_iface_limi
-- #endif
-- 				 BIT(NL80211_IFTYPE_AP) |
-- 				 BIT(NL80211_IFTYPE_P2P_GO) },
--+	{ .max = 1,	.types = BIT(NL80211_IFTYPE_ADHOC) },
-- };
-- 
-- static const struct ieee80211_iface_limit if_dfs_limits[] = {
-diff --git a/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch b/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
-deleted file mode 100644
-index 3487ab2..0000000
---- a/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
-+++ /dev/null
-@@ -1,46 +0,0 @@
----- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
--+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
--@@ -86,13 +86,8 @@ ath5k_add_interface(struct ieee80211_hw 
-- 		goto end;
-- 	}
-- 
---	/* Don't allow other interfaces if one ad-hoc is configured.
---	 * TODO: Fix the problems with ad-hoc and multiple other interfaces.
---	 * We would need to operate the HW in ad-hoc mode to allow TSF updates
---	 * for the IBSS, but this breaks with additional AP or STA interfaces
---	 * at the moment. */
---	if (ah->num_adhoc_vifs ||
---	    (ah->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
--+	/* Don't allow more than one ad-hoc interface */
--+	if (ah->num_adhoc_vifs && vif->type == NL80211_IFTYPE_ADHOC) {
-- 		ATH5K_ERR(ah, "Only one single ad-hoc interface is allowed.\n");
-- 		ret = -ELNRNG;
-- 		goto end;
----- a/drivers/net/wireless/ath/ath5k/base.c
--+++ b/drivers/net/wireless/ath/ath5k/base.c
--@@ -1934,7 +1934,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
-- 	}
-- 
-- 	if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
---			ah->num_mesh_vifs > 1) ||
--+			ah->num_adhoc_vifs + ah->num_mesh_vifs > 1) ||
-- 			ah->opmode == NL80211_IFTYPE_MESH_POINT) {
-- 		u64 tsf = ath5k_hw_get_tsf64(ah);
-- 		u32 tsftu = TSF_TO_TU(tsf);
--@@ -2020,7 +2020,7 @@ ath5k_beacon_update_timers(struct ath5k_
-- 
-- 	intval = ah->bintval & AR5K_BEACON_PERIOD;
-- 	if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
---		+ ah->num_mesh_vifs > 1) {
--+		+ ah->num_adhoc_vifs + ah->num_mesh_vifs > 1) {
-- 		intval /= ATH_BCBUF;	/* staggered multi-bss beacons */
-- 		if (intval < 15)
-- 			ATH5K_WARN(ah, "intval %u is too low, min 15\n",
--@@ -2487,6 +2487,7 @@ static const struct ieee80211_iface_limi
-- 				 BIT(NL80211_IFTYPE_MESH_POINT) |
-- #endif
-- 				 BIT(NL80211_IFTYPE_AP) },
--+	{ .max = 1,	.types = BIT(NL80211_IFTYPE_ADHOC) },
-- };
-- 
-- static const struct ieee80211_iface_combination if_comb = {
-diff --git a/package/mac80211/patches/420-ath5k_disable_fast_cc.patch b/package/mac80211/patches/420-ath5k_disable_fast_cc.patch
-deleted file mode 100644
-index 414f495..0000000
---- a/package/mac80211/patches/420-ath5k_disable_fast_cc.patch
-+++ /dev/null
-@@ -1,18 +0,0 @@
----- a/drivers/net/wireless/ath/ath5k/reset.c
--+++ b/drivers/net/wireless/ath/ath5k/reset.c
--@@ -1154,6 +1154,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
-- 	tsf_lo = 0;
-- 	mode = 0;
-- 
--+#if 0
-- 	/*
-- 	 * Sanity check for fast flag
-- 	 * Fast channel change only available
--@@ -1161,6 +1162,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
-- 	 */
-- 	if (fast && (ah->ah_radio != AR5K_RF2413) &&
-- 	(ah->ah_radio != AR5K_RF5413))
--+#endif
-- 		fast = false;
-- 
-- 	/* Disable sleep clock operation
-diff --git a/package/mac80211/patches/430-add_ath5k_platform.patch b/package/mac80211/patches/430-add_ath5k_platform.patch
-deleted file mode 100644
-index b213e2a..0000000
---- a/package/mac80211/patches/430-add_ath5k_platform.patch
-+++ /dev/null
-@@ -1,33 +0,0 @@
----- /dev/null
--+++ b/include/linux/ath5k_platform.h
--@@ -0,0 +1,30 @@
--+/*
--+ * Copyright (c) 2008 Atheros Communications Inc.
--+ * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org>
--+ * Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org>
--+ * Copyright (c) 2010 Daniel Golle <daniel.golle@gmail.com>
--+ *
--+ * Permission to use, copy, modify, and/or distribute this software for any
--+ * purpose with or without fee is hereby granted, provided that the above
--+ * copyright notice and this permission notice appear in all copies.
--+ *
--+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
--+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
--+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
--+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
--+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
--+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
--+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--+ */
--+
--+#ifndef _LINUX_ATH5K_PLATFORM_H
--+#define _LINUX_ATH5K_PLATFORM_H
--+
--+#define ATH5K_PLAT_EEP_MAX_WORDS	2048
--+
--+struct ath5k_platform_data {
--+	u16 *eeprom_data;
--+	u8 *macaddr;
--+};
--+
--+#endif /* _LINUX_ATH5K_PLATFORM_H */
-diff --git a/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch b/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch
-deleted file mode 100644
-index a223b38..0000000
---- a/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch
-+++ /dev/null
-@@ -1,56 +0,0 @@
----- a/drivers/net/wireless/ath/ath5k/pci.c
--+++ b/drivers/net/wireless/ath/ath5k/pci.c
--@@ -21,6 +21,7 @@
-- #include <linux/pci-aspm.h>
-- #include <linux/etherdevice.h>
-- #include <linux/module.h>
--+#include <linux/ath5k_platform.h>
-- #include "../ath.h"
-- #include "ath5k.h"
-- #include "debug.h"
--@@ -72,7 +73,7 @@ static void ath5k_pci_read_cachesize(str
-- }
-- 
-- /*
--- * Read from eeprom
--+ * Read from eeprom or platform_data
--  */
-- static bool
-- ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data)
--@@ -80,6 +81,19 @@ ath5k_pci_eeprom_read(struct ath_common 
-- 	struct ath5k_hw *ah = (struct ath5k_hw *) common->ah;
-- 	u32 status, timeout;
-- 
--+	struct ath5k_platform_data *pdata = NULL;
--+	
--+	if (ah->pdev)
--+		pdata = ah->pdev->dev.platform_data;
--+
--+	if (pdata && pdata->eeprom_data && pdata->eeprom_data[61] == AR5K_EEPROM_MAGIC_VALUE) {
--+		if (offset >= ATH5K_PLAT_EEP_MAX_WORDS) 
--+			return false;
--+		
--+		*data = pdata->eeprom_data[offset];
--+		return true;
--+	}
--+
-- 	/*
-- 	 * Initialize EEPROM access
-- 	 */
--@@ -123,6 +137,16 @@ static int ath5k_pci_eeprom_read_mac(str
-- 	u16 data;
-- 	int octet;
-- 
--+	struct ath5k_platform_data *pdata = NULL;
--+
--+	if (ah->pdev)
--+		pdata = ah->pdev->dev.platform_data;
--+
--+	if (pdata && pdata->macaddr) {
--+		memcpy(mac, pdata->macaddr, ETH_ALEN);
--+		return 0;
--+	}
--+
-- 	AR5K_EEPROM_READ(0x20, data);
-- 
-- 	for (offset = 0x1f, octet = 0, total = 0; offset >= 0x1d; offset--) {
-diff --git a/package/mac80211/patches/432-ath5k_add_pciids.patch b/package/mac80211/patches/432-ath5k_add_pciids.patch
-deleted file mode 100644
-index e5c85ce..0000000
---- a/package/mac80211/patches/432-ath5k_add_pciids.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/ath/ath5k/pci.c
--+++ b/drivers/net/wireless/ath/ath5k/pci.c
--@@ -48,6 +48,8 @@ static DEFINE_PCI_DEVICE_TABLE(ath5k_pci
-- 	{ PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */
-- 	{ PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */
-- 	{ PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */
--+	{ PCI_VDEVICE(ATHEROS, 0xff16) }, /* 2413,2414 sx76x on lantiq_danube */
--+	{ PCI_VDEVICE(ATHEROS, 0xff1a) }, /* 2417 arv45xx on lantiq_danube */
-- 	{ PCI_VDEVICE(ATHEROS, 0xff1b) }, /* AR5BXB63 */
-- 	{ 0 }
-- };
-diff --git a/package/mac80211/patches/440-ath5k_channel_bw_debugfs.patch b/package/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
-deleted file mode 100644
-index a8ebdf5..0000000
---- a/package/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
-+++ /dev/null
-@@ -1,143 +0,0 @@
--This adds a bwmode debugfs file which can be used to set alternate
--channel operating bandwidths.  Only tested with AR5413 and only at
--5 and 20 mhz channels.
--
--Signed-off-by: Pat Erley <pat-lkml at erley.org>
-----
--Other devices will need to be added to the switch in  write_file_bwmode
--
--drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
-- 1 files changed, 86 insertions(+), 0 deletions(-)
--
----- a/drivers/net/wireless/ath/ath5k/debug.c
--+++ b/drivers/net/wireless/ath/ath5k/debug.c
--@@ -821,6 +821,97 @@ static const struct file_operations fops
-- 	.llseek = default_llseek,
-- };
-- 
--+/* debugfs: bwmode */
--+
--+static ssize_t read_file_bwmode(struct file *file, char __user *user_buf,
--+				   size_t count, loff_t *ppos)
--+{
--+	struct ath5k_hw *ah = file->private_data;
--+	char buf[15];
--+	unsigned int len = 0;
--+
--+	int cur_ah_bwmode = ah->ah_bwmode_debug;
--+
--+#define print_selected(MODE, LABEL) \
--+	if (cur_ah_bwmode == MODE) \
--+		len += snprintf(buf+len, sizeof(buf)-len, "[%s]", LABEL); \
--+	else \
--+		len += snprintf(buf+len, sizeof(buf)-len, "%s", LABEL); \
--+	len += snprintf(buf+len, sizeof(buf)-len, " ");
--+
--+	print_selected(AR5K_BWMODE_5MHZ, "5");
--+	print_selected(AR5K_BWMODE_10MHZ, "10");
--+	print_selected(AR5K_BWMODE_DEFAULT, "20");
--+	print_selected(AR5K_BWMODE_40MHZ, "40");
--+#undef print_selected
--+
--+	len += snprintf(buf+len, sizeof(buf)-len, "\n");
--+
--+	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
--+}
--+
--+static ssize_t write_file_bwmode(struct file *file,
--+				 const char __user *userbuf,
--+				 size_t count, loff_t *ppos)
--+{
--+	struct ath5k_hw *ah = file->private_data;
--+	char buf[3];
--+	int bw = 20;
--+	int tobwmode = AR5K_BWMODE_DEFAULT;
--+
--+	if (copy_from_user(buf, userbuf, min(count, sizeof(buf))))
--+		return -EFAULT;
--+
--+	/* TODO: Add check for active interface */
--+
--+	if(strncmp(buf, "5", 1) == 0 ) {
--+		tobwmode = AR5K_BWMODE_5MHZ;
--+		bw = 5;
--+	} else if ( strncmp(buf, "10", 2) == 0 ) {
--+		tobwmode = AR5K_BWMODE_10MHZ;
--+		bw = 10;
--+	} else if ( strncmp(buf, "20", 2) == 0 ) {
--+		tobwmode = AR5K_BWMODE_DEFAULT;
--+		bw = 20;
--+	} else if ( strncmp(buf, "40", 2) == 0 ) {
--+		tobwmode = AR5K_BWMODE_40MHZ;
--+		bw = 40;
--+	} else
--+		return -EINVAL;
--+
--+	ATH5K_INFO(ah, "Changing to %imhz channel width[%i]\n",
--+		bw, tobwmode);
--+
--+	switch (ah->ah_radio) {
--+	/* TODO: only define radios that actually support 5/10mhz channels */
--+	case AR5K_RF5413:
--+	case AR5K_RF5110:
--+	case AR5K_RF5111:
--+	case AR5K_RF5112:
--+	case AR5K_RF2413:
--+	case AR5K_RF2316:
--+	case AR5K_RF2317:
--+	case AR5K_RF2425:
--+		if(ah->ah_bwmode_debug != tobwmode) {
--+			mutex_lock(&ah->lock);
--+			ah->ah_bwmode = tobwmode;
--+			ah->ah_bwmode_debug = tobwmode;
--+			mutex_unlock(&ah->lock);
--+		}
--+		break;
--+	default:
--+		return -EOPNOTSUPP;
--+	}
--+	return count;
--+}
--+
--+static const struct file_operations fops_bwmode = {
--+	.read = read_file_bwmode,
--+	.write = write_file_bwmode,
--+	.open = simple_open,
--+	.owner = THIS_MODULE,
--+	.llseek = default_llseek,
--+};
-- 
-- /* debugfs: queues etc */
-- 
--@@ -914,6 +1005,9 @@ ath5k_debug_init_device(struct ath5k_hw 
-- 	debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah,
-- 			    &fops_beacon);
-- 
--+	debugfs_create_file("bwmode", S_IWUSR | S_IRUSR, phydir, ah,
--+			    &fops_bwmode);
--+
-- 	debugfs_create_file("reset", S_IWUSR, phydir, ah, &fops_reset);
-- 
-- 	debugfs_create_file("antenna", S_IWUSR | S_IRUSR, phydir, ah,
----- a/drivers/net/wireless/ath/ath5k/ath5k.h
--+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
--@@ -1369,6 +1369,7 @@ struct ath5k_hw {
-- 	u8			ah_coverage_class;
-- 	bool			ah_ack_bitrate_high;
-- 	u8			ah_bwmode;
--+	u8			ah_bwmode_debug;
-- 	bool			ah_short_slot;
-- 
-- 	/* Antenna Control */
----- a/drivers/net/wireless/ath/ath5k/base.c
--+++ b/drivers/net/wireless/ath/ath5k/base.c
--@@ -466,6 +466,9 @@ ath5k_chan_set(struct ath5k_hw *ah, stru
-- 		return -EINVAL;
-- 	}
-- 
--+	if (ah->ah_bwmode_debug != AR5K_BWMODE_DEFAULT)
--+		ah->ah_bwmode = ah->ah_bwmode_debug;
--+
-- 	/*
-- 	 * To switch channels clear any pending DMA operations;
-- 	 * wait long enough for the RX fifo to drain, reset the
-diff --git a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
-deleted file mode 100644
-index 664cf45..0000000
---- a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
-+++ /dev/null
-@@ -1,65 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/debug.c
--+++ b/drivers/net/wireless/ath/ath9k/debug.c
--@@ -1481,6 +1481,53 @@ void ath9k_deinit_debug(struct ath_softc
-- 	ath9k_spectral_deinit_debug(sc);
-- }
-- 
--+static ssize_t read_file_eeprom(struct file *file, char __user *user_buf,
--+			     size_t count, loff_t *ppos)
--+{
--+	struct ath_softc *sc = file->private_data;
--+	struct ath_hw *ah = sc->sc_ah;
--+	struct ath_common *common = ath9k_hw_common(ah);
--+	int bytes = 0;
--+	int pos = *ppos;
--+	int size = 4096;
--+	u16 val;
--+	int i;
--+
--+	if (AR_SREV_9300_20_OR_LATER(ah))
--+		size = 16384;
--+
--+	if (*ppos < 0)
--+		return -EINVAL;
--+
--+	if (count > size - *ppos)
--+		count = size - *ppos;
--+
--+	for (i = *ppos / 2; count > 0; count -= bytes, *ppos += bytes, i++) {
--+		void *from = &val;
--+
--+		if (!common->bus_ops->eeprom_read(common, i, &val))
--+			val = 0xffff;
--+
--+		if (*ppos % 2) {
--+			from++;
--+			bytes = 1;
--+		} else if (count == 1) {
--+			bytes = 1;
--+		} else {
--+			bytes = 2;
--+		}
--+		copy_to_user(user_buf, from, bytes);
--+		user_buf += bytes;
--+	}
--+	return *ppos - pos;
--+}
--+
--+static const struct file_operations fops_eeprom = {
--+	.read = read_file_eeprom,
--+	.open = simple_open,
--+	.owner = THIS_MODULE
--+};
--+
-- int ath9k_init_debug(struct ath_hw *ah)
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
--@@ -1500,6 +1547,8 @@ int ath9k_init_debug(struct ath_hw *ah)
-- 	ath9k_tx99_init_debug(sc);
-- 	ath9k_spectral_init_debug(sc);
-- 
--+	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
--+			    &fops_eeprom);
-- 	debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
-- 			    &fops_dma);
-- 	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
-diff --git a/package/mac80211/patches/501-ath9k-eeprom_endianess.patch b/package/mac80211/patches/501-ath9k-eeprom_endianess.patch
-deleted file mode 100644
-index 96e7c6d..0000000
---- a/package/mac80211/patches/501-ath9k-eeprom_endianess.patch
-+++ /dev/null
-@@ -1,102 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
--+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
--@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(str
-- {
-- 	struct ar5416_eeprom_def *eep = &ah->eeprom.def;
-- 	struct ath_common *common = ath9k_hw_common(ah);
---	u16 *eepdata, temp, magic, magic2;
--+	u16 *eepdata, temp, magic;
-- 	u32 sum = 0, el;
-- 	bool need_swap = false;
-- 	int i, addr, size;
--@@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(str
-- 		return false;
-- 	}
-- 
---	if (!ath9k_hw_use_flash(ah)) {
---		ath_dbg(common, EEPROM, "Read Magic = 0x%04X\n", magic);
---
---		if (magic != AR5416_EEPROM_MAGIC) {
---			magic2 = swab16(magic);
---
---			if (magic2 == AR5416_EEPROM_MAGIC) {
---				size = sizeof(struct ar5416_eeprom_def);
---				need_swap = true;
---				eepdata = (u16 *) (&ah->eeprom);
---
---				for (addr = 0; addr < size / sizeof(u16); addr++) {
---					temp = swab16(*eepdata);
---					*eepdata = temp;
---					eepdata++;
---				}
---			} else {
---				ath_err(common,
---					"Invalid EEPROM Magic. Endianness mismatch.\n");
---				return -EINVAL;
---			}
--+	if (swab16(magic) == AR5416_EEPROM_MAGIC &&
--+	    !(ah->ah_flags & AH_NO_EEP_SWAP)) {
--+		size = sizeof(struct ar5416_eeprom_def);
--+		need_swap = true;
--+		eepdata = (u16 *) (&ah->eeprom);
--+
--+		for (addr = 0; addr < size / sizeof(u16); addr++) {
--+			temp = swab16(*eepdata);
--+			*eepdata = temp;
--+			eepdata++;
-- 		}
-- 	}
-- 
----- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
--+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
--@@ -57,7 +57,7 @@ static bool ath9k_hw_4k_fill_eeprom(stru
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
-- 
---	if (!ath9k_hw_use_flash(ah)) {
--+	if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
-- 		ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n");
-- 	}
-- 
----- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
--+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
--@@ -60,7 +60,7 @@ static bool ath9k_hw_ar9287_fill_eeprom(
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
-- 
---	if (!ath9k_hw_use_flash(ah)) {
--+	if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
-- 		ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n");
-- 	}
-- 
----- a/drivers/net/wireless/ath/ath9k/hw.h
--+++ b/drivers/net/wireless/ath/ath9k/hw.h
--@@ -724,6 +724,7 @@ enum ath_cal_list {
-- #define AH_USE_EEPROM   0x1
-- #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
-- #define AH_FASTCC       0x4
--+#define AH_NO_EEP_SWAP  0x8 /* Do not swap EEPROM data */
-- 
-- struct ath_hw {
-- 	struct ath_ops reg_ops;
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -722,6 +722,8 @@ static int ath9k_init_softc(u16 devid, s
-- 		ah->is_clk_25mhz = pdata->is_clk_25mhz;
-- 		ah->get_mac_revision = pdata->get_mac_revision;
-- 		ah->external_reset = pdata->external_reset;
--+		if (!pdata->endian_check)
--+			ah->ah_flags |= AH_NO_EEP_SWAP;
-- 	}
-- 
-- 	common->ops = &ah->reg_ops;
----- a/include/linux/ath9k_platform.h
--+++ b/include/linux/ath9k_platform.h
--@@ -31,6 +31,7 @@ struct ath9k_platform_data {
-- 	u32 gpio_mask;
-- 	u32 gpio_val;
-- 
--+	bool endian_check;
-- 	bool is_clk_25mhz;
-- 	bool tx_gain_buffalo;
-- 
-diff --git a/package/mac80211/patches/502-ath9k_ahb_init.patch b/package/mac80211/patches/502-ath9k_ahb_init.patch
-deleted file mode 100644
-index 4edc63b..0000000
---- a/package/mac80211/patches/502-ath9k_ahb_init.patch
-+++ /dev/null
-@@ -1,32 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -1112,23 +1112,23 @@ static int __init ath9k_init(void)
-- 		goto err_out;
-- 	}
-- 
---	error = ath_pci_init();
--+	error = ath_ahb_init();
-- 	if (error < 0) {
---		pr_err("No PCI devices found, driver not installed\n");
-- 		error = -ENODEV;
-- 		goto err_rate_unregister;
-- 	}
-- 
---	error = ath_ahb_init();
--+	error = ath_pci_init();
-- 	if (error < 0) {
--+		pr_err("No PCI devices found, driver not installed\n");
-- 		error = -ENODEV;
---		goto err_pci_exit;
--+		goto err_ahb_exit;
-- 	}
-- 
-- 	return 0;
-- 
--- err_pci_exit:
---	ath_pci_exit();
--+ err_ahb_exit:
--+	ath_ahb_exit();
-- 
--  err_rate_unregister:
-- 	ath_rate_control_unregister();
-diff --git a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
-deleted file mode 100644
-index d7478ff..0000000
---- a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
-+++ /dev/null
-@@ -1,18 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -359,13 +359,8 @@ static void ath9k_hw_init_config(struct 
-- 
-- 	ah->config.rx_intr_mitigation = true;
-- 
---	if (AR_SREV_9300_20_OR_LATER(ah)) {
---		ah->config.rimt_last = 500;
---		ah->config.rimt_first = 2000;
---	} else {
---		ah->config.rimt_last = 250;
---		ah->config.rimt_first = 700;
---	}
--+	ah->config.rimt_last = 250;
--+	ah->config.rimt_first = 500;
-- 
-- 	/*
-- 	 * We need this for PCI devices only (Cardbus, PCI, miniPCI)
-diff --git a/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch b/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch
-deleted file mode 100644
-index ef0b9a1..0000000
---- a/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/ath9k.h
--+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
--@@ -90,7 +90,7 @@ int ath_descdma_setup(struct ath_softc *
-- 		(_l) &= ((_sz) - 1);		\
-- 	} while (0)
-- 
---#define ATH_RXBUF               512
--+#define ATH_RXBUF               256
-- #define ATH_TXBUF               512
-- #define ATH_TXBUF_RESERVE       5
-- #define ATH_MAX_QDEPTH          (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE)
-diff --git a/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
-deleted file mode 100644
-index 8f3cc03..0000000
---- a/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
-+++ /dev/null
-@@ -1,125 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/debug.c
--+++ b/drivers/net/wireless/ath/ath9k/debug.c
--@@ -1528,6 +1528,52 @@ static const struct file_operations fops
-- 	.owner = THIS_MODULE
-- };
-- 
--+
--+static ssize_t read_file_chan_bw(struct file *file, char __user *user_buf,
--+			     size_t count, loff_t *ppos)
--+{
--+	struct ath_softc *sc = file->private_data;
--+	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
--+	char buf[32];
--+	unsigned int len;
--+
--+	len = sprintf(buf, "0x%08x\n", common->chan_bw);
--+	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
--+}
--+
--+static ssize_t write_file_chan_bw(struct file *file, const char __user *user_buf,
--+			     size_t count, loff_t *ppos)
--+{
--+	struct ath_softc *sc = file->private_data;
--+	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
--+	unsigned long chan_bw;
--+	char buf[32];
--+	ssize_t len;
--+
--+	len = min(count, sizeof(buf) - 1);
--+	if (copy_from_user(buf, user_buf, len))
--+		return -EFAULT;
--+
--+	buf[len] = '\0';
--+	if (kstrtoul(buf, 0, &chan_bw))
--+		return -EINVAL;
--+
--+	common->chan_bw = chan_bw;
--+	if (!test_bit(SC_OP_INVALID, &sc->sc_flags))
--+		ath9k_ops.config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL);
--+
--+	return count;
--+}
--+
--+static const struct file_operations fops_chanbw = {
--+	.read = read_file_chan_bw,
--+	.write = write_file_chan_bw,
--+	.open = simple_open,
--+	.owner = THIS_MODULE,
--+	.llseek = default_llseek,
--+};
--+
--+
-- int ath9k_init_debug(struct ath_hw *ah)
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
--@@ -1549,6 +1595,8 @@ int ath9k_init_debug(struct ath_hw *ah)
-- 
-- 	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
-- 			    &fops_eeprom);
--+	debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
--+			    sc, &fops_chanbw);
-- 	debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
-- 			    &fops_dma);
-- 	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
----- a/drivers/net/wireless/ath/ath.h
--+++ b/drivers/net/wireless/ath/ath.h
--@@ -130,6 +130,7 @@ struct ath_common {
-- 	struct ieee80211_hw *hw;
-- 	int debug_mask;
-- 	enum ath_device_state state;
--+	u32 chan_bw;
-- 
-- 	struct ath_ani ani;
-- 
----- a/drivers/net/wireless/ath/ath9k/common.c
--+++ b/drivers/net/wireless/ath/ath9k/common.c
--@@ -52,11 +52,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke
-- /*
--  * Update internal channel flags.
--  */
---static void ath9k_cmn_update_ichannel(struct ath9k_channel *ichan,
--+static void ath9k_cmn_update_ichannel(struct ath_common *common,
--+				      struct ath9k_channel *ichan,
-- 				      struct cfg80211_chan_def *chandef)
-- {
-- 	struct ieee80211_channel *chan = chandef->chan;
-- 	u16 flags = 0;
--+	int width;
-- 
-- 	ichan->channel = chan->center_freq;
-- 	ichan->chan = chan;
--@@ -64,7 +66,19 @@ static void ath9k_cmn_update_ichannel(st
-- 	if (chan->band == IEEE80211_BAND_5GHZ)
-- 		flags |= CHANNEL_5GHZ;
-- 
---	switch (chandef->width) {
--+	switch (common->chan_bw) {
--+	case 5:
--+		width = NL80211_CHAN_WIDTH_5;
--+		break;
--+	case 10:
--+		width = NL80211_CHAN_WIDTH_10;
--+		break;
--+	default:
--+		width = chandef->width;
--+		break;
--+	}
--+
--+	switch (width) {
-- 	case NL80211_CHAN_WIDTH_5:
-- 		flags |= CHANNEL_QUARTER;
-- 		break;
--@@ -97,10 +111,11 @@ struct ath9k_channel *ath9k_cmn_get_chan
-- 					    struct cfg80211_chan_def *chandef)
-- {
-- 	struct ieee80211_channel *curchan = chandef->chan;
--+	struct ath_common *common = ath9k_hw_common(ah);
-- 	struct ath9k_channel *channel;
-- 
-- 	channel = &ah->channels[curchan->hw_value];
---	ath9k_cmn_update_ichannel(channel, chandef);
--+	ath9k_cmn_update_ichannel(common, channel, chandef);
-- 
-- 	return channel;
-- }
-diff --git a/package/mac80211/patches/513-ath9k_add_pci_ids.patch b/package/mac80211/patches/513-ath9k_add_pci_ids.patch
-deleted file mode 100644
-index db4e6a1..0000000
---- a/package/mac80211/patches/513-ath9k_add_pci_ids.patch
-+++ /dev/null
-@@ -1,30 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -614,6 +614,7 @@ int ath9k_hw_init(struct ath_hw *ah)
-- 
-- 	/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
-- 	switch (ah->hw_version.devid) {
--+	case AR9300_DEVID_INVALID:
-- 	case AR5416_DEVID_PCI:
-- 	case AR5416_DEVID_PCIE:
-- 	case AR5416_AR9100_DEVID:
----- a/drivers/net/wireless/ath/ath9k/hw.h
--+++ b/drivers/net/wireless/ath/ath9k/hw.h
--@@ -34,6 +34,7 @@
-- 
-- #define ATHEROS_VENDOR_ID	0x168c
-- 
--+#define AR9300_DEVID_INVALID	0xabcd
-- #define AR5416_DEVID_PCI	0x0023
-- #define AR5416_DEVID_PCIE	0x0024
-- #define AR9160_DEVID_PCI	0x0027
----- a/drivers/net/wireless/ath/ath9k/pci.c
--+++ b/drivers/net/wireless/ath/ath9k/pci.c
--@@ -658,6 +658,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
-- 	{ PCI_VDEVICE(ATHEROS, 0x0036),
-- 	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
-- 
--+	{ PCI_VDEVICE(ATHEROS, 0xabcd) }, /* PCI-E  internal chip default ID */
-- 	{ 0 }
-- };
-- 
-diff --git a/package/mac80211/patches/520-mac80211_cur_txpower.patch b/package/mac80211/patches/520-mac80211_cur_txpower.patch
-deleted file mode 100644
-index 6df95bc..0000000
---- a/package/mac80211/patches/520-mac80211_cur_txpower.patch
-+++ /dev/null
-@@ -1,33 +0,0 @@
----- a/include/net/mac80211.h
--+++ b/include/net/mac80211.h
--@@ -1711,6 +1711,7 @@ struct ieee80211_hw {
-- 	u8 max_tx_aggregation_subframes;
-- 	u8 offchannel_tx_hw_queue;
-- 	u8 radiotap_mcs_details;
--+	s8 cur_power_level;
-- 	u16 radiotap_vht_details;
-- 	netdev_features_t netdev_features;
-- 	u8 uapsd_queues;
----- a/net/mac80211/cfg.c
--+++ b/net/mac80211/cfg.c
--@@ -2329,7 +2329,9 @@ static int ieee80211_get_tx_power(struct
-- 	struct ieee80211_local *local = wiphy_priv(wiphy);
-- 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
-- 
---	if (!local->use_chanctx)
--+	if (local->hw.cur_power_level)
--+		*dbm = local->hw.cur_power_level;
--+	else if (!local->use_chanctx)
-- 		*dbm = local->hw.conf.power_level;
-- 	else
-- 		*dbm = sdata->vif.bss_conf.txpower;
----- a/net/mac80211/main.c
--+++ b/net/mac80211/main.c
--@@ -158,6 +158,7 @@ static u32 ieee80211_hw_conf_chan(struct
-- 
-- 	if (local->hw.conf.power_level != power) {
-- 		changed |= IEEE80211_CONF_CHANGE_POWER;
--+		local->hw.cur_power_level = power;
-- 		local->hw.conf.power_level = power;
-- 	}
-- 
-diff --git a/package/mac80211/patches/521-ath9k_cur_txpower.patch b/package/mac80211/patches/521-ath9k_cur_txpower.patch
-deleted file mode 100644
-index 0d6c360..0000000
---- a/package/mac80211/patches/521-ath9k_cur_txpower.patch
-+++ /dev/null
-@@ -1,24 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/main.c
--+++ b/drivers/net/wireless/ath/ath9k/main.c
--@@ -308,8 +308,12 @@ static int ath_reset_internal(struct ath
-- 	    (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
-- 		ath9k_mci_set_txpower(sc, true, false);
-- 
---	if (!ath_complete_reset(sc, true))
--+	if (!ath_complete_reset(sc, true)) {
-- 		r = -EIO;
--+		goto out;
--+	}
--+
--+	sc->hw->cur_power_level = sc->curtxpow / 2;
-- 
-- out:
-- 	spin_unlock_bh(&sc->sc_pcu_lock);
--@@ -1371,6 +1375,7 @@ static int ath9k_config(struct ieee80211
-- 		sc->config.txpowlimit = 2 * conf->power_level;
-- 		ath9k_cmn_update_txpow(ah, sc->curtxpow,
-- 				       sc->config.txpowlimit, &sc->curtxpow);
--+		hw->cur_power_level = sc->curtxpow / 2;
-- 	}
-- 
-- 	mutex_unlock(&sc->mutex);
-diff --git a/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch
-deleted file mode 100644
-index 308ee6e..0000000
---- a/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch
-+++ /dev/null
-@@ -1,172 +0,0 @@
----- a/include/net/cfg80211.h
--+++ b/include/net/cfg80211.h
--@@ -2156,6 +2156,7 @@ struct cfg80211_qos_map {
--  *	(as advertised by the nl80211 feature flag.)
--  * @get_tx_power: store the current TX power into the dbm variable;
--  *	return 0 if successful
--+ * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary
--  *
--  * @set_wds_peer: set the WDS peer for a WDS interface
--  *
--@@ -2380,6 +2381,7 @@ struct cfg80211_ops {
-- 				enum nl80211_tx_power_setting type, int mbm);
-- 	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
-- 				int *dbm);
--+	int	(*set_antenna_gain)(struct wiphy *wiphy, int dbi);
-- 
-- 	int	(*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
-- 				const u8 *addr);
----- a/include/net/mac80211.h
--+++ b/include/net/mac80211.h
--@@ -1033,6 +1033,7 @@ enum ieee80211_smps_mode {
--  *
--  * @power_level: requested transmit power (in dBm), backward compatibility
--  *	value only that is set to the minimum of all interfaces
--+ * @max_antenna_gain: maximum antenna gain adjusted by user config (in dBi)
--  *
--  * @chandef: the channel definition to tune to
--  * @radar_enabled: whether radar detection is enabled
--@@ -1054,6 +1055,7 @@ struct ieee80211_conf {
-- 	u32 flags;
-- 	int power_level, dynamic_ps_timeout;
-- 	int max_sleep_period;
--+	int max_antenna_gain;
-- 
-- 	u16 listen_interval;
-- 	u8 ps_dtim_period;
----- a/include/uapi/linux/nl80211.h
--+++ b/include/uapi/linux/nl80211.h
--@@ -1555,6 +1555,9 @@ enum nl80211_commands {
--  *	data is in the format defined for the payload of the QoS Map Set element
--  *	in IEEE Std 802.11-2012, 8.4.2.97.
--  *
--+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
--+ *	transmit power to stay within regulatory limits. u32, dBi.
--+ *
--  * @NL80211_ATTR_MAX: highest attribute number currently defined
--  * @__NL80211_ATTR_AFTER_LAST: internal use
--  */
--@@ -1883,6 +1886,8 @@ enum nl80211_attrs {
-- 
-- 	NL80211_ATTR_QOS_MAP,
-- 
--+	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
--+
-- 	/* add attributes here, update the policy in nl80211.c */
-- 
-- 	__NL80211_ATTR_AFTER_LAST,
----- a/net/mac80211/cfg.c
--+++ b/net/mac80211/cfg.c
--@@ -2339,6 +2339,19 @@ static int ieee80211_get_tx_power(struct
-- 	return 0;
-- }
-- 
--+static int ieee80211_set_antenna_gain(struct wiphy *wiphy, int dbi)
--+{
--+	struct ieee80211_local *local = wiphy_priv(wiphy);
--+
--+	if (dbi < 0)
--+		return -EINVAL;
--+
--+	local->user_antenna_gain = dbi;
--+	ieee80211_hw_config(local, 0);
--+
--+	return 0;
--+}
--+
-- static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
-- 				  const u8 *addr)
-- {
--@@ -3924,6 +3937,7 @@ struct cfg80211_ops mac80211_config_ops 
-- 	.set_wiphy_params = ieee80211_set_wiphy_params,
-- 	.set_tx_power = ieee80211_set_tx_power,
-- 	.get_tx_power = ieee80211_get_tx_power,
--+	.set_antenna_gain = ieee80211_set_antenna_gain,
-- 	.set_wds_peer = ieee80211_set_wds_peer,
-- 	.rfkill_poll = ieee80211_rfkill_poll,
-- 	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
----- a/net/mac80211/ieee80211_i.h
--+++ b/net/mac80211/ieee80211_i.h
--@@ -1221,6 +1221,7 @@ struct ieee80211_local {
-- 	int dynamic_ps_forced_timeout;
-- 
-- 	int user_power_level; /* in dBm, for all interfaces */
--+	int user_antenna_gain; /* in dBi */
-- 
-- 	enum ieee80211_smps_mode smps_mode;
-- 
----- a/net/mac80211/main.c
--+++ b/net/mac80211/main.c
--@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
-- 	struct ieee80211_sub_if_data *sdata;
-- 	struct cfg80211_chan_def chandef = {};
-- 	u32 changed = 0;
---	int power;
--+	int power, ant_gain, max_power;
-- 	u32 offchannel_flag;
-- 
-- 	offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
--@@ -156,8 +156,21 @@ static u32 ieee80211_hw_conf_chan(struct
-- 	}
-- 	rcu_read_unlock();
-- 
---	if (local->hw.conf.power_level != power) {
--+	max_power = chandef.chan->max_reg_power;
--+	ant_gain = chandef.chan->max_antenna_gain;
--+	if (local->user_antenna_gain > 0) {
--+		if (local->user_antenna_gain > ant_gain) {
--+			max_power -= local->user_antenna_gain - ant_gain;
--+			ant_gain = 0;
--+		} else
--+			ant_gain -= local->user_antenna_gain;
--+		power = min(power, max_power);
--+	}
--+
--+	if (local->hw.conf.power_level != power ||
--+	    local->hw.conf.max_antenna_gain != ant_gain) {
-- 		changed |= IEEE80211_CONF_CHANGE_POWER;
--+		local->hw.conf.max_antenna_gain = ant_gain;
-- 		local->hw.cur_power_level = power;
-- 		local->hw.conf.power_level = power;
-- 	}
--@@ -584,6 +597,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
-- 					 IEEE80211_RADIOTAP_MCS_HAVE_BW;
-- 	local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
-- 					 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
--+	local->user_antenna_gain = 0;
-- 	local->hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES;
-- 	local->hw.uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
-- 	local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
----- a/net/wireless/nl80211.c
--+++ b/net/wireless/nl80211.c
--@@ -384,6 +384,7 @@ static const struct nla_policy nl80211_p
-- 	[NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
-- 	[NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
-- 				   .len = IEEE80211_QOS_MAP_LEN_MAX },
--+	[NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
-- };
-- 
-- /* policy for the key attributes */
--@@ -2105,6 +2106,22 @@ static int nl80211_set_wiphy(struct sk_b
-- 			goto bad_res;
-- 	}
-- 
--+	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
--+		int idx, dbi = 0;
--+
--+		if (!rdev->ops->set_antenna_gain) {
--+			result = -EOPNOTSUPP;
--+			goto bad_res;
--+		}
--+
--+		idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN;
--+		dbi = nla_get_u32(info->attrs[idx]);
--+
--+		result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi);
--+		if (result)
--+			goto bad_res;
--+	}
--+
-- 	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
-- 	    info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
-- 		u32 tx_ant, rx_ant;
-diff --git a/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch b/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch
-deleted file mode 100644
-index 30aa9ee..0000000
---- a/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch
-+++ /dev/null
-@@ -1,34 +0,0 @@
----- a/drivers/net/wireless/ath/ath.h
--+++ b/drivers/net/wireless/ath/ath.h
--@@ -74,6 +74,7 @@ struct ath_regulatory {
-- 	u16 max_power_level;
-- 	u16 current_rd;
-- 	int16_t power_limit;
--+	int16_t max_antenna_gain;
-- 	struct reg_dmn_pair_mapping *regpair;
-- };
-- 
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -2721,7 +2721,7 @@ void ath9k_hw_apply_txpower(struct ath_h
-- 	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;
--+	max_gain = chan_pwr - new_pwr + reg->max_antenna_gain * 2;
-- 
-- 	ant_gain = get_antenna_gain(ah, chan);
-- 	if (ant_gain > max_gain)
----- a/drivers/net/wireless/ath/ath9k/main.c
--+++ b/drivers/net/wireless/ath/ath9k/main.c
--@@ -1371,7 +1371,10 @@ static int ath9k_config(struct ieee80211
-- 	}
-- 
-- 	if (changed & IEEE80211_CONF_CHANGE_POWER) {
--+		struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
--+
-- 		ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
--+		reg->max_antenna_gain = conf->max_antenna_gain;
-- 		sc->config.txpowlimit = 2 * conf->power_level;
-- 		ath9k_cmn_update_txpow(ah, sc->curtxpow,
-- 				       sc->config.txpowlimit, &sc->curtxpow);
-diff --git a/package/mac80211/patches/530-ath9k_extra_leds.patch b/package/mac80211/patches/530-ath9k_extra_leds.patch
-deleted file mode 100644
-index 59f78d9..0000000
---- a/package/mac80211/patches/530-ath9k_extra_leds.patch
-+++ /dev/null
-@@ -1,248 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/ath9k.h
--+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
--@@ -563,6 +563,9 @@ static inline int ath9k_dump_btcoex(stru
-- void ath_init_leds(struct ath_softc *sc);
-- void ath_deinit_leds(struct ath_softc *sc);
-- void ath_fill_led_pin(struct ath_softc *sc);
--+int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name,
--+                        const char *trigger, bool active_low);
--+
-- #else
-- static inline void ath_init_leds(struct ath_softc *sc)
-- {
--@@ -710,6 +713,13 @@ enum sc_op_flags {
-- #define PS_BEACON_SYNC            BIT(4)
-- #define PS_WAIT_FOR_ANI           BIT(5)
-- 
--+struct ath_led {
--+	struct list_head list;
--+	struct ath_softc *sc;
--+	const struct gpio_led *gpio;
--+	struct led_classdev cdev;
--+};
--+
-- struct ath_softc {
-- 	struct ieee80211_hw *hw;
-- 	struct device *dev;
--@@ -751,9 +761,8 @@ struct ath_softc {
-- 	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
-- 
-- #ifdef CPTCFG_MAC80211_LEDS
---	bool led_registered;
---	char led_name[32];
---	struct led_classdev led_cdev;
--+	const char *led_default_trigger;
--+	struct list_head leds;
-- #endif
-- 
-- 	struct ath9k_hw_cal_data caldata;
----- a/drivers/net/wireless/ath/ath9k/gpio.c
--+++ b/drivers/net/wireless/ath/ath9k/gpio.c
--@@ -24,40 +24,102 @@
-- static void ath_led_brightness(struct led_classdev *led_cdev,
-- 			       enum led_brightness brightness)
-- {
---	struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev);
---	ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, (brightness == LED_OFF));
--+	struct ath_led *led = container_of(led_cdev, struct ath_led, cdev);
--+	struct ath_softc *sc = led->sc;
--+
--+	ath9k_ps_wakeup(sc);
--+	ath9k_hw_set_gpio(sc->sc_ah, led->gpio->gpio,
--+			  (brightness != LED_OFF) ^ led->gpio->active_low);
--+	ath9k_ps_restore(sc);
--+}
--+
--+static int ath_add_led(struct ath_softc *sc, struct ath_led *led)
--+{
--+	const struct gpio_led *gpio = led->gpio;
--+	int ret;
--+
--+	led->cdev.name = gpio->name;
--+	led->cdev.default_trigger = gpio->default_trigger;
--+	led->cdev.brightness_set = ath_led_brightness;
--+
--+	ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->cdev);
--+	if (ret < 0)
--+		return ret;
--+
--+	led->sc = sc;
--+	list_add(&led->list, &sc->leds);
--+
--+	/* Configure gpio for output */
--+	ath9k_hw_cfg_output(sc->sc_ah, gpio->gpio,
--+			    AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
--+
--+	/* LED off */
--+	ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low);
--+
--+	return 0;
--+}
--+
--+int ath_create_gpio_led(struct ath_softc *sc, int gpio_num, const char *name,
--+			const char *trigger, bool active_low)
--+{
--+	struct ath_led *led;
--+	struct gpio_led *gpio;
--+	char *_name;
--+	int ret;
--+
--+	led = kzalloc(sizeof(*led) + sizeof(*gpio) + strlen(name) + 1,
--+		      GFP_KERNEL);
--+	if (!led)
--+		return -ENOMEM;
--+
--+	led->gpio = gpio = (struct gpio_led *) (led + 1);
--+	_name = (char *) (led->gpio + 1);
--+
--+	strcpy(_name, name);
--+	gpio->name = _name;
--+	gpio->gpio = gpio_num;
--+	gpio->active_low = active_low;
--+	gpio->default_trigger = trigger;
--+
--+	ret = ath_add_led(sc, led);
--+	if (unlikely(ret < 0))
--+		kfree(led);
--+
--+	return ret;
-- }
-- 
-- void ath_deinit_leds(struct ath_softc *sc)
-- {
---	if (!sc->led_registered)
---		return;
--+	struct ath_led *led;
-- 
---	ath_led_brightness(&sc->led_cdev, LED_OFF);
---	led_classdev_unregister(&sc->led_cdev);
--+	while (!list_empty(&sc->leds)) {
--+		led = list_first_entry(&sc->leds, struct ath_led, list);
--+		list_del(&led->list);
--+		ath_led_brightness(&led->cdev, LED_OFF);
--+		led_classdev_unregister(&led->cdev);
--+		kfree(led);
--+	}
-- }
-- 
-- void ath_init_leds(struct ath_softc *sc)
-- {
---	int ret;
--+	char led_name[32];
--+	const char *trigger;
--+
--+	INIT_LIST_HEAD(&sc->leds);
-- 
-- 	if (AR_SREV_9100(sc->sc_ah))
-- 		return;
-- 
---	if (!led_blink)
---		sc->led_cdev.default_trigger =
---			ieee80211_get_radio_led_name(sc->hw);
---
---	snprintf(sc->led_name, sizeof(sc->led_name),
---		"ath9k-%s", wiphy_name(sc->hw->wiphy));
---	sc->led_cdev.name = sc->led_name;
---	sc->led_cdev.brightness_set = ath_led_brightness;
--+	snprintf(led_name, sizeof(led_name), "ath9k-%s",
--+		 wiphy_name(sc->hw->wiphy));
-- 
---	ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &sc->led_cdev);
---	if (ret < 0)
---		return;
--+	if (led_blink)
--+		trigger = sc->led_default_trigger;
--+	else
--+		trigger = ieee80211_get_radio_led_name(sc->hw);
-- 
---	sc->led_registered = true;
--+	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1);
-- }
-- 
-- void ath_fill_led_pin(struct ath_softc *sc)
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -1018,7 +1018,7 @@ int ath9k_init_device(u16 devid, struct 
-- 
-- #ifdef CPTCFG_MAC80211_LEDS
-- 	/* must be initialized before ieee80211_register_hw */
---	sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
--+	sc->led_default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
-- 		IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink,
-- 		ARRAY_SIZE(ath9k_tpt_blink));
-- #endif
----- a/drivers/net/wireless/ath/ath9k/debug.c
--+++ b/drivers/net/wireless/ath/ath9k/debug.c
--@@ -1573,6 +1573,61 @@ static const struct file_operations fops
-- 	.llseek = default_llseek,
-- };
-- 
--+#ifdef CONFIG_MAC80211_LEDS
--+
--+static ssize_t write_file_gpio_led(struct file *file, const char __user *ubuf,
--+				   size_t count, loff_t *ppos)
--+{
--+	struct ath_softc *sc = file->private_data;
--+	char buf[32], *str, *name, *c;
--+	ssize_t len;
--+	unsigned int gpio;
--+	bool active_low = false;
--+
--+	len = min(count, sizeof(buf) - 1);
--+	if (copy_from_user(buf, ubuf, len))
--+		return -EFAULT;
--+
--+	buf[len] = '\0';
--+	name = strchr(buf, ',');
--+	if (!name)
--+		return -EINVAL;
--+
--+	*(name++) = 0;
--+	if (!*name)
--+		return -EINVAL;
--+
--+	c = strchr(name, '\n');
--+	if (c)
--+		*c = 0;
--+
--+	str = buf;
--+	if (*str == '!') {
--+		str++;
--+		active_low = true;
--+	}
--+
--+	if (kstrtouint(str, 0, &gpio) < 0)
--+		return -EINVAL;
--+
--+	if (gpio >= sc->sc_ah->caps.num_gpio_pins)
--+		return -EINVAL;
--+
--+	if (ath_create_gpio_led(sc, gpio, name, NULL, active_low) < 0)
--+		return -EINVAL;
--+
--+	return count;
--+}
--+
--+static const struct file_operations fops_gpio_led = {
--+	.write = write_file_gpio_led,
--+	.open = simple_open,
--+	.owner = THIS_MODULE,
--+	.llseek = default_llseek,
--+};
--+
--+#endif
--+
-- 
-- int ath9k_init_debug(struct ath_hw *ah)
-- {
--@@ -1597,6 +1652,10 @@ int ath9k_init_debug(struct ath_hw *ah)
-- 			    &fops_eeprom);
-- 	debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
-- 			    sc, &fops_chanbw);
--+#ifdef CONFIG_MAC80211_LEDS
--+	debugfs_create_file("gpio_led", S_IWUSR,
--+			   sc->debug.debugfs_phy, sc, &fops_gpio_led);
--+#endif
-- 	debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
-- 			    &fops_dma);
-- 	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
-diff --git a/package/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/mac80211/patches/531-ath9k_extra_platform_leds.patch
-deleted file mode 100644
-index 6c9832c..0000000
---- a/package/mac80211/patches/531-ath9k_extra_platform_leds.patch
-+++ /dev/null
-@@ -1,71 +0,0 @@
----- a/include/linux/ath9k_platform.h
--+++ b/include/linux/ath9k_platform.h
--@@ -37,6 +37,9 @@ struct ath9k_platform_data {
-- 
-- 	int (*get_mac_revision)(void);
-- 	int (*external_reset)(void);
--+
--+	int num_leds;
--+	const struct gpio_led *leds;
-- };
-- 
-- #endif /* _LINUX_ATH9K_PLATFORM_H */
----- a/drivers/net/wireless/ath/ath9k/gpio.c
--+++ b/drivers/net/wireless/ath/ath9k/gpio.c
--@@ -15,6 +15,7 @@
--  */
-- 
-- #include "ath9k.h"
--+#include <linux/ath9k_platform.h>
-- 
-- /********************************/
-- /*	 LED functions		*/
--@@ -88,6 +89,24 @@ int ath_create_gpio_led(struct ath_softc
-- 	return ret;
-- }
-- 
--+static int ath_create_platform_led(struct ath_softc *sc,
--+				   const struct gpio_led *gpio)
--+{
--+	struct ath_led *led;
--+	int ret;
--+
--+	led = kzalloc(sizeof(*led), GFP_KERNEL);
--+	if (!led)
--+		return -ENOMEM;
--+
--+	led->gpio = gpio;
--+	ret = ath_add_led(sc, led);
--+	if (ret < 0)
--+		kfree(led);
--+
--+	return ret;
--+}
--+
-- void ath_deinit_leds(struct ath_softc *sc)
-- {
-- 	struct ath_led *led;
--@@ -103,8 +122,10 @@ void ath_deinit_leds(struct ath_softc *s
-- 
-- void ath_init_leds(struct ath_softc *sc)
-- {
--+	struct ath9k_platform_data *pdata = sc->dev->platform_data;
-- 	char led_name[32];
-- 	const char *trigger;
--+	int i;
-- 
-- 	INIT_LIST_HEAD(&sc->leds);
-- 
--@@ -120,6 +141,12 @@ void ath_init_leds(struct ath_softc *sc)
-- 		trigger = ieee80211_get_radio_led_name(sc->hw);
-- 
-- 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1);
--+
--+	if (!pdata)
--+		return;
--+
--+	for (i = 0; i < pdata->num_leds; i++)
--+		ath_create_platform_led(sc, &pdata->leds[i]);
-- }
-- 
-- void ath_fill_led_pin(struct ath_softc *sc)
-diff --git a/package/mac80211/patches/540-ath9k_reduce_ani_interval.patch b/package/mac80211/patches/540-ath9k_reduce_ani_interval.patch
-deleted file mode 100644
-index e899903..0000000
---- a/package/mac80211/patches/540-ath9k_reduce_ani_interval.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/ani.h
--+++ b/drivers/net/wireless/ath/ath9k/ani.h
--@@ -42,7 +42,7 @@
-- #define ATH9K_ANI_PERIOD                  300
-- 
-- /* in ms */
---#define ATH9K_ANI_POLLINTERVAL            1000
--+#define ATH9K_ANI_POLLINTERVAL            300
-- 
-- #define ATH9K_SIG_FIRSTEP_SETTING_MIN     0
-- #define ATH9K_SIG_FIRSTEP_SETTING_MAX     20
-diff --git a/package/mac80211/patches/541-ath9k_rx_dma_stop_check.patch b/package/mac80211/patches/541-ath9k_rx_dma_stop_check.patch
-deleted file mode 100644
-index a521525..0000000
---- a/package/mac80211/patches/541-ath9k_rx_dma_stop_check.patch
-+++ /dev/null
-@@ -1,28 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/mac.c
--+++ b/drivers/net/wireless/ath/ath9k/mac.c
--@@ -700,7 +700,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
-- {
-- #define AH_RX_STOP_DMA_TIMEOUT 10000   /* usec */
-- 	struct ath_common *common = ath9k_hw_common(ah);
---	u32 mac_status, last_mac_status = 0;
--+	u32 mac_status = 0, last_mac_status = 0;
-- 	int i;
-- 
-- 	/* Enable access to the DMA observation bus */
--@@ -730,6 +730,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
-- 	}
-- 
-- 	if (i == 0) {
--+		if (!AR_SREV_9300_20_OR_LATER(ah) &&
--+		    (mac_status & 0x700) == 0) {
--+			/*
--+			 * DMA is idle but the MAC is still stuck
--+			 * processing events
--+			 */
--+			*reset = true;
--+			return true;
--+		}
--+
-- 		ath_err(common,
-- 			"DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
-- 			AH_RX_STOP_DMA_TIMEOUT / 1000,
-diff --git a/package/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/mac80211/patches/542-ath9k_debugfs_diag.patch
-deleted file mode 100644
-index e1b6ff1..0000000
---- a/package/mac80211/patches/542-ath9k_debugfs_diag.patch
-+++ /dev/null
-@@ -1,139 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/debug.c
--+++ b/drivers/net/wireless/ath/ath9k/debug.c
--@@ -1629,6 +1629,50 @@ static const struct file_operations fops
-- #endif
-- 
-- 
--+static ssize_t read_file_diag(struct file *file, char __user *user_buf,
--+			     size_t count, loff_t *ppos)
--+{
--+	struct ath_softc *sc = file->private_data;
--+	struct ath_hw *ah = sc->sc_ah;
--+	char buf[32];
--+	unsigned int len;
--+
--+	len = sprintf(buf, "0x%08lx\n", ah->diag);
--+	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
--+}
--+
--+static ssize_t write_file_diag(struct file *file, const char __user *user_buf,
--+			     size_t count, loff_t *ppos)
--+{
--+	struct ath_softc *sc = file->private_data;
--+	struct ath_hw *ah = sc->sc_ah;
--+	unsigned long diag;
--+	char buf[32];
--+	ssize_t len;
--+
--+	len = min(count, sizeof(buf) - 1);
--+	if (copy_from_user(buf, user_buf, len))
--+		return -EFAULT;
--+
--+	buf[len] = '\0';
--+	if (kstrtoul(buf, 0, &diag))
--+		return -EINVAL;
--+
--+	ah->diag = diag;
--+	ath9k_hw_update_diag(ah);
--+
--+	return count;
--+}
--+
--+static const struct file_operations fops_diag = {
--+	.read = read_file_diag,
--+	.write = write_file_diag,
--+	.open = simple_open,
--+	.owner = THIS_MODULE,
--+	.llseek = default_llseek,
--+};
--+
--+
-- int ath9k_init_debug(struct ath_hw *ah)
-- {
-- 	struct ath_common *common = ath9k_hw_common(ah);
--@@ -1656,6 +1700,8 @@ int ath9k_init_debug(struct ath_hw *ah)
-- 	debugfs_create_file("gpio_led", S_IWUSR,
-- 			   sc->debug.debugfs_phy, sc, &fops_gpio_led);
-- #endif
--+	debugfs_create_file("diag", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
--+			    sc, &fops_diag);
-- 	debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
-- 			    &fops_dma);
-- 	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
----- a/drivers/net/wireless/ath/ath9k/hw.h
--+++ b/drivers/net/wireless/ath/ath9k/hw.h
--@@ -482,6 +482,12 @@ enum {
-- 	ATH9K_RESET_COLD,
-- };
-- 
--+enum {
--+	ATH_DIAG_DISABLE_RX,
--+	ATH_DIAG_DISABLE_TX,
--+	ATH_DIAG_TRIGGER_ERROR,
--+};
--+
-- struct ath9k_hw_version {
-- 	u32 magic;
-- 	u16 devid;
--@@ -762,6 +768,8 @@ struct ath_hw {
-- 	u32 rfkill_polarity;
-- 	u32 ah_flags;
-- 
--+	unsigned long diag;
--+
-- 	bool reset_power_on;
-- 	bool htc_reset_init;
-- 
--@@ -1013,6 +1021,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
-- bool ath9k_hw_check_alive(struct ath_hw *ah);
-- 
-- bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
--+void ath9k_hw_update_diag(struct ath_hw *ah);
-- 
-- /* Generic hw timer primitives */
-- struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -1735,6 +1735,20 @@ fail:
-- 	return -EINVAL;
-- }
-- 
--+void ath9k_hw_update_diag(struct ath_hw *ah)
--+{
--+	if (test_bit(ATH_DIAG_DISABLE_RX, &ah->diag))
--+		REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
--+	else
--+		REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
--+
--+	if (test_bit(ATH_DIAG_DISABLE_TX, &ah->diag))
--+		REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_LOOP_BACK);
--+	else
--+		REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_LOOP_BACK);
--+}
--+EXPORT_SYMBOL(ath9k_hw_update_diag);
--+
-- int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
-- 		   struct ath9k_hw_cal_data *caldata, bool fastcc)
-- {
--@@ -1940,6 +1954,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
-- 		ar9003_hw_disable_phy_restart(ah);
-- 
-- 	ath9k_hw_apply_gpio_override(ah);
--+	ath9k_hw_update_diag(ah);
-- 
-- 	if (AR_SREV_9565(ah) && common->bt_ant_diversity)
-- 		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
----- a/drivers/net/wireless/ath/ath9k/main.c
--+++ b/drivers/net/wireless/ath/ath9k/main.c
--@@ -602,6 +602,11 @@ irqreturn_t ath_isr(int irq, void *dev)
-- 	ath9k_debug_sync_cause(sc, sync_cause);
-- 	status &= ah->imask;	/* discard unasked-for bits */
-- 
--+	if (test_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag)) {
--+		status |= ATH9K_INT_FATAL;
--+		clear_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag);
--+	}
--+
-- 	/*
-- 	 * If there are no status bits set, then this interrupt was not
-- 	 * for me (should have been caught above).
-diff --git a/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch b/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch
-deleted file mode 100644
-index d26a5af..0000000
---- a/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch
-+++ /dev/null
-@@ -1,69 +0,0 @@
----- a/include/linux/ath9k_platform.h
--+++ b/include/linux/ath9k_platform.h
--@@ -34,6 +34,8 @@ struct ath9k_platform_data {
-- 	bool endian_check;
-- 	bool is_clk_25mhz;
-- 	bool tx_gain_buffalo;
--+	bool disable_2ghz;
--+	bool disable_5ghz;
-- 
-- 	int (*get_mac_revision)(void);
-- 	int (*external_reset)(void);
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -2328,17 +2328,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
-- 	}
-- 
-- 	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
---	if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
---		ath_err(common,
---			"no band has been marked as supported in EEPROM\n");
---		return -EINVAL;
--+
--+	if (eeval & AR5416_OPFLAGS_11A) {
--+		if (ah->disable_5ghz)
--+			ath_warn(common, "disabling 5GHz band\n");
--+		else
--+			pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
-- 	}
-- 
---	if (eeval & AR5416_OPFLAGS_11A)
---		pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
--+	if (eeval & AR5416_OPFLAGS_11G) {
--+		if (ah->disable_2ghz)
--+			ath_warn(common, "disabling 2GHz band\n");
--+		else
--+			pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
--+	}
-- 
---	if (eeval & AR5416_OPFLAGS_11G)
---		pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
--+	if ((pCap->hw_caps & (ATH9K_HW_CAP_2GHZ | ATH9K_HW_CAP_5GHZ)) == 0) {
--+		ath_err(common, "both bands are disabled\n");
--+		return -EINVAL;
--+	}
-- 
-- 	if (AR_SREV_9485(ah) ||
-- 	    AR_SREV_9285(ah) ||
----- a/drivers/net/wireless/ath/ath9k/hw.h
--+++ b/drivers/net/wireless/ath/ath9k/hw.h
--@@ -932,6 +932,8 @@ struct ath_hw {
-- 	bool is_clk_25mhz;
-- 	int (*get_mac_revision)(void);
-- 	int (*external_reset)(void);
--+	bool disable_2ghz;
--+	bool disable_5ghz;
-- 
-- 	const struct firmware *eeprom_blob;
-- };
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -722,6 +722,8 @@ static int ath9k_init_softc(u16 devid, s
-- 		ah->is_clk_25mhz = pdata->is_clk_25mhz;
-- 		ah->get_mac_revision = pdata->get_mac_revision;
-- 		ah->external_reset = pdata->external_reset;
--+		ah->disable_2ghz = pdata->disable_2ghz;
--+		ah->disable_5ghz = pdata->disable_5ghz;
-- 		if (!pdata->endian_check)
-- 			ah->ah_flags |= AH_NO_EEP_SWAP;
-- 	}
-diff --git a/package/mac80211/patches/550-ath9k_entropy_from_adc.patch b/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
-deleted file mode 100644
-index d126fd4..0000000
---- a/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
-+++ /dev/null
-@@ -1,200 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/hw.h
--+++ b/drivers/net/wireless/ath/ath9k/hw.h
--@@ -678,6 +678,7 @@ struct ath_spec_scan {
--  * @config_pci_powersave:
--  * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC
--  *
--+ * @get_adc_entropy: get entropy from the raw ADC I/Q output
--  * @spectral_scan_config: set parameters for spectral scan and enable/disable it
--  * @spectral_scan_trigger: trigger a spectral scan run
--  * @spectral_scan_wait: wait for a spectral scan run to finish
--@@ -701,6 +702,7 @@ struct ath_hw_ops {
-- 			struct ath_hw_antcomb_conf *antconf);
-- 	void (*antdiv_comb_conf_set)(struct ath_hw *ah,
-- 			struct ath_hw_antcomb_conf *antconf);
--+	void (*get_adc_entropy)(struct ath_hw *ah, u8 *buf, size_t len);
-- 	void (*spectral_scan_config)(struct ath_hw *ah,
-- 				     struct ath_spec_scan *param);
-- 	void (*spectral_scan_trigger)(struct ath_hw *ah);
----- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
--+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
--@@ -1764,6 +1764,26 @@ static void ar9003_hw_tx99_set_txpower(s
-- 		  ATH9K_POW_SM(p_pwr_array[ALL_TARGET_HT40_14],  0));
-- }
-- 
--+static void ar9003_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
--+{
--+	int i, j;
--+
--+	REG_RMW_FIELD(ah, AR_PHY_TEST, AR_PHY_TEST_BBB_OBS_SEL, 1);
--+	REG_CLR_BIT(ah, AR_PHY_TEST, AR_PHY_TEST_RX_OBS_SEL_BIT5);
--+	REG_RMW_FIELD(ah, AR_PHY_TEST_CTL_STATUS, AR_PHY_TEST_CTL_RX_OBS_SEL, 0);
--+
--+	memset(buf, 0, len);
--+	for (i = 0; i < len; i++) {
--+		for (j = 0; j < 4; j++) {
--+			u32 regval = REG_READ(ah, AR_PHY_TST_ADC);
--+
--+			buf[i] <<= 2;
--+			buf[i] |= (regval & 1) | ((regval & BIT(10)) >> 9);
--+			udelay(1);
--+		}
--+	}
--+}
--+
-- void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
-- {
-- 	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
--@@ -1794,6 +1814,7 @@ void ar9003_hw_attach_phy_ops(struct ath
-- 	priv_ops->set_radar_params = ar9003_hw_set_radar_params;
-- 	priv_ops->fast_chan_change = ar9003_hw_fast_chan_change;
-- 
--+	ops->get_adc_entropy = ar9003_hw_get_adc_entropy;
-- 	ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get;
-- 	ops->antdiv_comb_conf_set = ar9003_hw_antdiv_comb_conf_set;
-- 	ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -846,7 +846,8 @@ static void ath9k_init_txpower_limits(st
-- 	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
-- 		ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
-- 
---	ah->curchan = curchan;
--+	if (curchan)
--+		ah->curchan = curchan;
-- }
-- 
-- void ath9k_reload_chainmask_settings(struct ath_softc *sc)
--@@ -980,6 +981,18 @@ static void ath9k_set_hw_capab(struct at
-- 	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
-- }
-- 
--+static void ath_get_initial_entropy(struct ath_softc *sc)
--+{
--+	struct ath_hw *ah = sc->sc_ah;
--+	char buf[256];
--+
--+	/* reuse last channel initialized by the tx power test */
--+	ath9k_hw_reset(ah, ah->curchan, NULL, false);
--+
--+	ath9k_hw_get_adc_entropy(ah, buf, sizeof(buf));
--+	add_device_randomness(buf, sizeof(buf));
--+}
--+
-- int ath9k_init_device(u16 devid, struct ath_softc *sc,
-- 		    const struct ath_bus_ops *bus_ops)
-- {
--@@ -1025,6 +1038,8 @@ int ath9k_init_device(u16 devid, struct 
-- 		ARRAY_SIZE(ath9k_tpt_blink));
-- #endif
-- 
--+	ath_get_initial_entropy(sc);
--+
-- 	/* Register with mac80211 */
-- 	error = ieee80211_register_hw(hw);
-- 	if (error)
----- a/drivers/net/wireless/ath/ath9k/hw-ops.h
--+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
--@@ -95,6 +95,12 @@ static inline void ath9k_hw_tx99_set_txp
-- 		ath9k_hw_ops(ah)->tx99_set_txpower(ah, power);
-- }
-- 
--+static inline void ath9k_hw_get_adc_entropy(struct ath_hw *ah,
--+		u8 *buf, size_t len)
--+{
--+	ath9k_hw_ops(ah)->get_adc_entropy(ah, buf, len);
--+}
--+
-- #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT
-- 
-- static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
----- a/drivers/net/wireless/ath/ath9k/link.c
--+++ b/drivers/net/wireless/ath/ath9k/link.c
--@@ -307,6 +307,11 @@ void ath_ani_calibrate(unsigned long dat
-- 	unsigned int timestamp = jiffies_to_msecs(jiffies);
-- 	u32 cal_interval, short_cal_interval, long_cal_interval;
-- 	unsigned long flags;
--+	char buf[256];
--+
--+	/* gather entropy */
--+	ath9k_hw_get_adc_entropy(ah, buf, sizeof(buf));
--+	add_device_randomness(buf, sizeof(buf));
-- 
-- 	if (ah->caldata && test_bit(NFCAL_INTF, &ah->caldata->cal_flags))
-- 		long_cal_interval = ATH_LONG_CALINTERVAL_INT;
----- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
--+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
--@@ -1233,9 +1233,30 @@ static void ar5008_hw_set_radar_conf(str
-- 	conf->radar_inband = 8;
-- }
-- 
--+static void ar5008_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
--+{
--+	int i, j;
--+
--+	REG_RMW_FIELD(ah, AR_PHY_TEST, AR_PHY_TEST_BBB_OBS_SEL, 1);
--+	REG_CLR_BIT(ah, AR_PHY_TEST, AR_PHY_TEST_RX_OBS_SEL_BIT5);
--+	REG_RMW_FIELD(ah, AR_PHY_TEST2, AR_PHY_TEST2_RX_OBS_SEL, 0);
--+
--+	memset(buf, 0, len);
--+	for (i = 0; i < len; i++) {
--+		for (j = 0; j < 4; j++) {
--+			u32 regval = REG_READ(ah, AR_PHY_TST_ADC);
--+
--+			buf[i] <<= 2;
--+			buf[i] |= (regval & 1) | ((regval & BIT(9)) >> 8);
--+			udelay(1);
--+		}
--+	}
--+}
--+
-- int ar5008_hw_attach_phy_ops(struct ath_hw *ah)
-- {
-- 	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
--+	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
-- 	static const u32 ar5416_cca_regs[6] = {
-- 		AR_PHY_CCA,
-- 		AR_PHY_CH1_CCA,
--@@ -1250,6 +1271,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
-- 	if (ret)
-- 	    return ret;
-- 
--+	ops->get_adc_entropy = ar5008_hw_get_adc_entropy;
--+
-- 	priv_ops->rf_set_freq = ar5008_hw_set_channel;
-- 	priv_ops->spur_mitigate_freq = ar5008_hw_spur_mitigate;
-- 
----- a/drivers/net/wireless/ath/ath9k/ar9002_phy.h
--+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.h
--@@ -20,6 +20,12 @@
-- #define PHY_AGC_CLR             0x10000000
-- #define RFSILENT_BB             0x00002000
-- 
--+#define AR_PHY_TEST_BBB_OBS_SEL       0x780000
--+#define AR_PHY_TEST_BBB_OBS_SEL_S     19
--+
--+#define AR_PHY_TEST_RX_OBS_SEL_BIT5_S 23
--+#define AR_PHY_TEST_RX_OBS_SEL_BIT5   (1 << AR_PHY_TEST_RX_OBS_SEL_BIT5_S)
--+
-- #define AR_PHY_TURBO                0x9804
-- #define AR_PHY_FC_TURBO_MODE        0x00000001
-- #define AR_PHY_FC_TURBO_SHORT       0x00000002
--@@ -36,6 +42,9 @@
-- 
-- #define AR_PHY_TEST2			0x9808
-- 
--+#define AR_PHY_TEST2_RX_OBS_SEL        0x3C00
--+#define AR_PHY_TEST2_RX_OBS_SEL_S      10
--+
-- #define AR_PHY_TIMING2           0x9810
-- #define AR_PHY_TIMING3           0x9814
-- #define AR_PHY_TIMING3_DSC_MAN   0xFFFE0000
--@@ -390,6 +399,8 @@
-- #define AR_PHY_RFBUS_GRANT       0x9C20
-- #define AR_PHY_RFBUS_GRANT_EN    0x00000001
-- 
--+#define AR_PHY_TST_ADC      0x9C24
--+
-- #define AR_PHY_CHAN_INFO_GAIN_DIFF             0x9CF4
-- #define AR_PHY_CHAN_INFO_GAIN_DIFF_UPPER_LIMIT 320
-- 
-diff --git a/package/mac80211/patches/551-ath9k_p2p_ifcomb.patch b/package/mac80211/patches/551-ath9k_p2p_ifcomb.patch
-deleted file mode 100644
-index ffffe0c..0000000
---- a/package/mac80211/patches/551-ath9k_p2p_ifcomb.patch
-+++ /dev/null
-@@ -1,33 +0,0 @@
--From c997a1da25fe7c717ed099888b8eb35d4e139e70 Mon Sep 17 00:00:00 2001
--From: Felix Fietkau <nbd@openwrt.org>
--Date: Sun, 8 Dec 2013 08:52:52 +0100
--Subject: [PATCH] ath9k: support only one P2P interface
--
--Preparation for adding P2P powersave and multi-channel support.
--
--Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-----
-- drivers/net/wireless/ath/ath9k/init.c | 4 ++--
--  1 file changed, 2 insertions(+), 2 deletions(-)
--
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -863,15 +863,15 @@ void ath9k_reload_chainmask_settings(str
-- 
-- static const struct ieee80211_iface_limit if_limits[] = {
-- 	{ .max = 2048,	.types = BIT(NL80211_IFTYPE_STATION) |
---				 BIT(NL80211_IFTYPE_P2P_CLIENT) |
-- 				 BIT(NL80211_IFTYPE_WDS) },
-- 	{ .max = 8,	.types =
-- #ifdef CPTCFG_MAC80211_MESH
-- 				 BIT(NL80211_IFTYPE_MESH_POINT) |
-- #endif
---				 BIT(NL80211_IFTYPE_AP) |
---				 BIT(NL80211_IFTYPE_P2P_GO) },
--+				 BIT(NL80211_IFTYPE_AP) },
-- 	{ .max = 1,	.types = BIT(NL80211_IFTYPE_ADHOC) },
--+	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
--+				 BIT(NL80211_IFTYPE_P2P_GO) },
-- };
-- 
-- static const struct ieee80211_iface_limit if_dfs_limits[] = {
-diff --git a/package/mac80211/patches/552-ath9k_p2p_ps_support.patch b/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
-deleted file mode 100644
-index 4a61db3..0000000
---- a/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
-+++ /dev/null
-@@ -1,247 +0,0 @@
--From 6744d0a7ea037c7d65e13ca906da93009b241d00 Mon Sep 17 00:00:00 2001
--From: Felix Fietkau <nbd@openwrt.org>
--Date: Tue, 11 Feb 2014 11:16:24 +0100
--Subject: [PATCH] ath9k: implement p2p client powersave support
--
--Use generic TSF timers to trigger powersave state changes based
--information from the P2P NoA attribute.
--Opportunistic Powersave is not handled, because the driver does not
--support powersave at the moment.
--
--Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-----
-- drivers/net/wireless/ath/ath9k/ath9k.h |  12 ++++
-- drivers/net/wireless/ath/ath9k/init.c  |   6 ++
-- drivers/net/wireless/ath/ath9k/main.c  | 104 +++++++++++++++++++++++++++++++++
-- drivers/net/wireless/ath/ath9k/recv.c  |   3 +
-- 4 files changed, 125 insertions(+)
--
----- a/drivers/net/wireless/ath/ath9k/main.c
--+++ b/drivers/net/wireless/ath/ath9k/main.c
--@@ -261,6 +261,8 @@ static bool ath_complete_reset(struct at
-- 	sc->gtt_cnt = 0;
-- 	ieee80211_wake_queues(sc->hw);
-- 
--+	ath9k_p2p_ps_timer(sc);
--+
-- 	return true;
-- }
-- 
--@@ -1126,6 +1128,8 @@ static int ath9k_add_interface(struct ie
-- 	if (ath9k_uses_beacons(vif->type))
-- 		ath9k_beacon_assign_slot(sc, vif);
-- 
--+	avp->vif = vif;
--+
-- 	an->sc = sc;
-- 	an->sta = NULL;
-- 	an->vif = vif;
--@@ -1170,6 +1174,29 @@ static int ath9k_change_interface(struct
-- 	return 0;
-- }
-- 
--+static void
--+ath9k_update_p2p_ps_timer(struct ath_softc *sc, struct ath_vif *avp)
--+{
--+	struct ath_hw *ah = sc->sc_ah;
--+	s32 tsf, target_tsf;
--+
--+	if (!avp || !avp->noa.has_next_tsf)
--+		return;
--+
--+	ath9k_hw_gen_timer_stop(ah, sc->p2p_ps_timer);
--+
--+	tsf = ath9k_hw_gettsf32(sc->sc_ah);
--+
--+	target_tsf = avp->noa.next_tsf;
--+	if (!avp->noa.absent)
--+		target_tsf -= ATH_P2P_PS_STOP_TIME;
--+
--+	if (target_tsf - tsf < ATH_P2P_PS_STOP_TIME)
--+		target_tsf = tsf + ATH_P2P_PS_STOP_TIME;
--+
--+	ath9k_hw_gen_timer_start(ah, sc->p2p_ps_timer, (u32) target_tsf, 1000000);
--+}
--+
-- static void ath9k_remove_interface(struct ieee80211_hw *hw,
-- 				   struct ieee80211_vif *vif)
-- {
--@@ -1181,6 +1208,13 @@ static void ath9k_remove_interface(struc
-- 
-- 	mutex_lock(&sc->mutex);
-- 
--+	spin_lock_bh(&sc->sc_pcu_lock);
--+	if (avp == sc->p2p_ps_vif) {
--+		sc->p2p_ps_vif = NULL;
--+		ath9k_update_p2p_ps_timer(sc, NULL);
--+	}
--+	spin_unlock_bh(&sc->sc_pcu_lock);
--+
-- 	sc->nvifs--;
-- 	sc->tx99_vif = NULL;
-- 
--@@ -1649,6 +1683,70 @@ static void ath9k_bss_assoc_iter(void *d
-- 		ath9k_set_assoc_state(sc, vif);
-- }
-- 
--+void ath9k_p2p_ps_timer(void *priv)
--+{
--+	struct ath_softc *sc = priv;
--+	struct ath_vif *avp = sc->p2p_ps_vif;
--+	struct ieee80211_vif *vif;
--+	struct ieee80211_sta *sta;
--+	struct ath_node *an;
--+	u32 tsf;
--+
--+	if (!avp)
--+		return;
--+
--+	tsf = ath9k_hw_gettsf32(sc->sc_ah);
--+	if (!avp->noa.absent)
--+		tsf += ATH_P2P_PS_STOP_TIME;
--+
--+	if (!avp->noa.has_next_tsf ||
--+	    avp->noa.next_tsf - tsf > BIT(31))
--+		ieee80211_update_p2p_noa(&avp->noa, tsf);
--+
--+	ath9k_update_p2p_ps_timer(sc, avp);
--+
--+	rcu_read_lock();
--+
--+	vif = avp->vif;
--+	sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
--+	if (!sta)
--+		goto out;
--+
--+	an = (void *) sta->drv_priv;
--+	if (an->sleeping == !!avp->noa.absent)
--+		goto out;
--+
--+	an->sleeping = avp->noa.absent;
--+	if (an->sleeping)
--+		ath_tx_aggr_sleep(sta, sc, an);
--+	else
--+		ath_tx_aggr_wakeup(sc, an);
--+
--+out:
--+	rcu_read_unlock();
--+}
--+
--+void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif)
--+{
--+	struct ath_vif *avp = (void *)vif->drv_priv;
--+	u32 tsf;
--+
--+	if (!sc->p2p_ps_timer)
--+		return;
--+
--+	if (vif->type != NL80211_IFTYPE_STATION || !vif->p2p)
--+		return;
--+
--+	sc->p2p_ps_vif = avp;
--+
--+	if (sc->ps_flags & PS_BEACON_SYNC)
--+		return;
--+
--+	tsf = ath9k_hw_gettsf32(sc->sc_ah);
--+	ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
--+	ath9k_update_p2p_ps_timer(sc, avp);
--+}
--+
-- static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
-- 				   struct ieee80211_vif *vif,
-- 				   struct ieee80211_bss_conf *bss_conf,
--@@ -1723,6 +1821,12 @@ static void ath9k_bss_info_changed(struc
-- 		}
-- 	}
-- 
--+	if (changed & BSS_CHANGED_P2P_PS) {
--+		spin_lock_bh(&sc->sc_pcu_lock);
--+		ath9k_update_p2p_ps(sc, vif);
--+		spin_unlock_bh(&sc->sc_pcu_lock);
--+	}
--+
-- 	if (changed & CHECK_ANI)
-- 		ath_check_ani(sc);
-- 
----- a/drivers/net/wireless/ath/ath9k/ath9k.h
--+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
--@@ -115,6 +115,9 @@ int ath_descdma_setup(struct ath_softc *
-- #define ATH_TXFIFO_DEPTH           8
-- #define ATH_TX_ERROR               0x01
-- 
--+/* Stop tx traffic 1ms before the GO goes away */
--+#define ATH_P2P_PS_STOP_TIME       1000
--+
-- #define IEEE80211_SEQ_SEQ_SHIFT    4
-- #define IEEE80211_SEQ_MAX          4096
-- #define IEEE80211_WEP_IVLEN        3
--@@ -363,11 +366,15 @@ void ath9k_release_buffered_frames(struc
-- /********/
-- 
-- struct ath_vif {
--+	struct ieee80211_vif *vif;
-- 	struct ath_node mcast_node;
-- 	int av_bslot;
-- 	bool primary_sta_vif;
-- 	__le64 tsf_adjust; /* TSF adjustment for staggered beacons */
-- 	struct ath_buf *av_bcbuf;
--+
--+	/* P2P Client */
--+	struct ieee80211_noa_data noa;
-- };
-- 
-- struct ath9k_vif_iter_data {
--@@ -472,6 +479,8 @@ int ath_update_survey_stats(struct ath_s
-- void ath_update_survey_nf(struct ath_softc *sc, int channel);
-- void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
-- void ath_ps_full_sleep(unsigned long data);
--+void ath9k_p2p_ps_timer(void *priv);
--+void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif);
-- 
-- /**********/
-- /* BTCOEX */
--@@ -741,6 +750,9 @@ struct ath_softc {
-- 	struct completion paprd_complete;
-- 	wait_queue_head_t tx_wait;
-- 
--+	struct ath_gen_timer *p2p_ps_timer;
--+	struct ath_vif *p2p_ps_vif;
--+
-- 	unsigned long sc_flags;
-- 	unsigned long driver_data;
-- 
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -797,6 +797,9 @@ static int ath9k_init_softc(u16 devid, s
-- 	if (ret)
-- 		goto err_btcoex;
-- 
--+	sc->p2p_ps_timer = ath_gen_timer_alloc(sc->sc_ah, ath9k_p2p_ps_timer,
--+		NULL, sc, AR_FIRST_NDP_TIMER);
--+
-- 	ath9k_cmn_init_crypto(sc->sc_ah);
-- 	ath9k_init_misc(sc);
-- 	ath_fill_led_pin(sc);
--@@ -1082,6 +1085,9 @@ static void ath9k_deinit_softc(struct at
-- {
-- 	int i = 0;
-- 
--+	if (sc->p2p_ps_timer)
--+		ath_gen_timer_free(sc->sc_ah, sc->p2p_ps_timer);
--+
-- 	ath9k_deinit_btcoex(sc);
-- 
-- 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
----- a/drivers/net/wireless/ath/ath9k/recv.c
--+++ b/drivers/net/wireless/ath/ath9k/recv.c
--@@ -539,6 +539,9 @@ static void ath_rx_ps_beacon(struct ath_
-- 		ath_dbg(common, PS,
-- 			"Reconfigure beacon timers based on synchronized timestamp\n");
-- 		ath9k_set_beacon(sc);
--+
--+		if (sc->p2p_ps_vif)
--+			ath9k_update_p2p_ps(sc, sc->p2p_ps_vif->vif);
-- 	}
-- 
-- 	if (ath_beacon_dtim_pending_cab(skb)) {
-diff --git a/package/mac80211/patches/566-ath9k-ar933x-usb-hang-workaround.patch b/package/mac80211/patches/566-ath9k-ar933x-usb-hang-workaround.patch
-deleted file mode 100644
-index af94c9e..0000000
---- a/package/mac80211/patches/566-ath9k-ar933x-usb-hang-workaround.patch
-+++ /dev/null
-@@ -1,79 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -217,6 +217,19 @@ void ath9k_hw_get_channel_centers(struct
-- 		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
-- }
-- 
--+static inline void ath9k_hw_disable_pll_lock_detect(struct ath_hw *ah)
--+{
--+	/* On AR9330 and AR9340 devices, some PHY registers must be
--+	 * tuned to gain better stability/performance. These registers
--+	 * might be changed while doing wlan reset so the registers must
--+	 * be reprogrammed after each reset.
--+	 */
--+	REG_CLR_BIT(ah, AR_PHY_USB_CTRL1, BIT(20));
--+	REG_RMW(ah, AR_PHY_USB_CTRL2,
--+		(1 << 21) | (0xf << 22),
--+		(1 << 21) | (0x3 << 22));
--+}
--+
-- /******************/
-- /* Chip Revisions */
-- /******************/
--@@ -1337,6 +1350,9 @@ static bool ath9k_hw_set_reset(struct at
-- 	if (AR_SREV_9100(ah))
-- 		udelay(50);
-- 
--+	if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
--+		ath9k_hw_disable_pll_lock_detect(ah);
--+
-- 	return true;
-- }
-- 
--@@ -1436,6 +1452,9 @@ static bool ath9k_hw_chip_reset(struct a
-- 		ar9003_hw_internal_regulator_apply(ah);
-- 	ath9k_hw_init_pll(ah, chan);
-- 
--+	if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
--+		ath9k_hw_disable_pll_lock_detect(ah);
--+
-- 	return true;
-- }
-- 
--@@ -1730,8 +1749,14 @@ static int ath9k_hw_do_fastcc(struct ath
-- 	if (AR_SREV_9271(ah))
-- 		ar9002_hw_load_ani_reg(ah, chan);
-- 
--+	if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
--+		ath9k_hw_disable_pll_lock_detect(ah);
--+
-- 	return 0;
-- fail:
--+	if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
--+		ath9k_hw_disable_pll_lock_detect(ah);
--+
-- 	return -EINVAL;
-- }
-- 
--@@ -1959,6 +1984,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
-- 	if (AR_SREV_9565(ah) && common->bt_ant_diversity)
-- 		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
-- 
--+	if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
--+		ath9k_hw_disable_pll_lock_detect(ah);
--+
-- 	return 0;
-- }
-- EXPORT_SYMBOL(ath9k_hw_reset);
----- a/drivers/net/wireless/ath/ath9k/phy.h
--+++ b/drivers/net/wireless/ath/ath9k/phy.h
--@@ -48,6 +48,9 @@
-- #define AR_PHY_PLL_CONTROL 0x16180
-- #define AR_PHY_PLL_MODE 0x16184
-- 
--+#define AR_PHY_USB_CTRL1	0x16c84
--+#define AR_PHY_USB_CTRL2	0x16c88
--+
-- enum ath9k_ant_div_comb_lna_conf {
-- 	ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2,
-- 	ATH_ANT_DIV_COMB_LNA2,
-diff --git a/package/mac80211/patches/601-rt2x00-set_pci_mwi.patch b/package/mac80211/patches/601-rt2x00-set_pci_mwi.patch
-deleted file mode 100644
-index 08c8fa6..0000000
---- a/package/mac80211/patches/601-rt2x00-set_pci_mwi.patch
-+++ /dev/null
-@@ -1,13 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2x00pci.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
--@@ -94,8 +94,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
-- 
-- 	pci_set_master(pci_dev);
-- 
--+#ifdef CONFIG_PCI_SET_MWI
-- 	if (pci_set_mwi(pci_dev))
-- 		rt2x00_probe_err("MWI not available\n");
--+#endif
-- 
-- 	if (dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {
-- 		rt2x00_probe_err("PCI DMA not supported\n");
-diff --git a/package/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch b/package/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch
-deleted file mode 100644
-index 8c71075..0000000
---- a/package/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch
-+++ /dev/null
-@@ -1,32 +0,0 @@
----- /dev/null
--+++ b/include/linux/rt2x00_platform.h
--@@ -0,0 +1,19 @@
--+/*
--+ * Platform data definition for the rt2x00 driver
--+ *
--+ * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
--+ *
--+ * This program is free software; you can redistribute it and/or modify it
--+ * under the terms of the GNU General Public License version 2 as published
--+ * by the Free Software Foundation.
--+ *
--+ */
--+
--+#ifndef _RT2X00_PLATFORM_H
--+#define _RT2X00_PLATFORM_H
--+
--+struct rt2x00_platform_data {
--+	char *eeprom_file_name;
--+};
--+
--+#endif /* _RT2X00_PLATFORM_H */
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -38,6 +38,7 @@
-- #include <linux/kfifo.h>
-- #include <linux/hrtimer.h>
-- #include <linux/average.h>
--+#include <linux/rt2x00_platform.h>
-- 
-- #include <net/mac80211.h>
-- 
-diff --git a/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch b/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
-deleted file mode 100644
-index 2bbc6f1..0000000
---- a/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
-+++ /dev/null
-@@ -1,301 +0,0 @@
----- a/.local-symbols
--+++ b/.local-symbols
--@@ -279,6 +279,7 @@ RT2X00_LIB_FIRMWARE=
-- RT2X00_LIB_CRYPTO=
-- RT2X00_LIB_LEDS=
-- RT2X00_LIB_DEBUGFS=
--+RT2X00_LIB_EEPROM=
-- RT2X00_DEBUG=
-- RTL_CARDS=
-- RTL8192CE=
----- a/drivers/net/wireless/rt2x00/Kconfig
--+++ b/drivers/net/wireless/rt2x00/Kconfig
--@@ -69,6 +69,7 @@ config RT2800PCI
-- 	select RT2X00_LIB_MMIO
-- 	select RT2X00_LIB_PCI
-- 	select RT2X00_LIB_FIRMWARE
--+	select RT2X00_LIB_EEPROM
-- 	select RT2X00_LIB_CRYPTO
-- 	depends on CRC_CCITT
-- 	depends on EEPROM_93CX6
--@@ -215,6 +216,7 @@ config RT2800SOC
-- 	select RT2X00_LIB_MMIO
-- 	select RT2X00_LIB_CRYPTO
-- 	select RT2X00_LIB_FIRMWARE
--+	select RT2X00_LIB_EEPROM
-- 	select RT2800_LIB
-- 	select RT2800_LIB_MMIO
-- 	---help---
--@@ -266,6 +268,9 @@ config RT2X00_LIB_FIRMWARE
-- config RT2X00_LIB_CRYPTO
-- 	boolean
-- 
--+config RT2X00_LIB_EEPROM
--+	boolean
--+
-- config RT2X00_LIB_LEDS
-- 	boolean
-- 	default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n)
----- a/drivers/net/wireless/rt2x00/Makefile
--+++ b/drivers/net/wireless/rt2x00/Makefile
--@@ -7,6 +7,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS)	+
-- rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO)	+= rt2x00crypto.o
-- rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE)	+= rt2x00firmware.o
-- rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS)	+= rt2x00leds.o
--+rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM)	+= rt2x00eeprom.o
-- 
-- obj-$(CPTCFG_RT2X00_LIB)		+= rt2x00lib.o
-- obj-$(CPTCFG_RT2X00_LIB_MMIO)		+= rt2x00mmio.o
----- a/drivers/net/wireless/rt2x00/rt2800lib.h
--+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
--@@ -20,6 +20,8 @@
-- #ifndef RT2800LIB_H
-- #define RT2800LIB_H
-- 
--+#include "rt2800.h"
--+
-- struct rt2800_ops {
-- 	void (*register_read)(struct rt2x00_dev *rt2x00dev,
-- 			      const unsigned int offset, u32 *value);
--@@ -119,6 +121,15 @@ static inline int rt2800_read_eeprom(str
-- {
-- 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
-- 
--+	if (rt2x00dev->eeprom_file) {
--+		memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data,
--+		       EEPROM_SIZE);
--+		return 0;
--+	}
--+
--+	if (!rt2800ops->read_eeprom)
--+		return -EINVAL;
--+
-- 	return rt2800ops->read_eeprom(rt2x00dev);
-- }
-- 
----- a/drivers/net/wireless/rt2x00/rt2800soc.c
--+++ b/drivers/net/wireless/rt2x00/rt2800soc.c
--@@ -95,19 +95,6 @@ static int rt2800soc_set_device_state(st
-- 	return retval;
-- }
-- 
---static int rt2800soc_read_eeprom(struct rt2x00_dev *rt2x00dev)
---{
---	void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
---
---	if (!base_addr)
---		return -ENOMEM;
---
---	memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
---
---	iounmap(base_addr);
---	return 0;
---}
---
-- /* Firmware functions */
-- static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
-- {
--@@ -171,7 +158,6 @@ static const struct rt2800_ops rt2800soc
-- 	.register_multiread	= rt2x00mmio_register_multiread,
-- 	.register_multiwrite	= rt2x00mmio_register_multiwrite,
-- 	.regbusy_read		= rt2x00mmio_regbusy_read,
---	.read_eeprom		= rt2800soc_read_eeprom,
-- 	.hwcrypt_disabled	= rt2800soc_hwcrypt_disabled,
-- 	.drv_write_firmware	= rt2800soc_write_firmware,
-- 	.drv_init_registers	= rt2800mmio_init_registers,
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -694,6 +694,7 @@ enum rt2x00_capability_flags {
-- 	REQUIRE_SW_SEQNO,
-- 	REQUIRE_HT_TX_DESC,
-- 	REQUIRE_PS_AUTOWAKE,
--+	REQUIRE_EEPROM_FILE,
-- 
-- 	/*
-- 	 * Capabilities
--@@ -963,6 +964,11 @@ struct rt2x00_dev {
-- 	const struct firmware *fw;
-- 
-- 	/*
--+	 * EEPROM image.
--+	 */
--+	const struct firmware *eeprom_file;
--+
--+	/*
-- 	 * FIFO for storing tx status reports between isr and tasklet.
-- 	 */
-- 	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
----- a/drivers/net/wireless/rt2x00/rt2x00dev.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
--@@ -1324,6 +1324,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
-- 	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
-- 	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
-- 
--+	retval = rt2x00lib_load_eeprom_file(rt2x00dev);
--+	if (retval)
--+		goto exit;
--+
-- 	/*
-- 	 * Let the driver probe the device to detect the capabilities.
-- 	 */
--@@ -1454,6 +1458,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
-- 	 */
-- 	if (rt2x00dev->drv_data)
-- 		kfree(rt2x00dev->drv_data);
--+
--+	/*
--+	 * Free EEPROM image.
--+	 */
--+	rt2x00lib_free_eeprom_file(rt2x00dev);
-- }
-- EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
-- 
----- /dev/null
--+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
--@@ -0,0 +1,111 @@
--+/*
--+	Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
--+	Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
--+	<http://rt2x00.serialmonkey.com>
--+
--+	This program is free software; you can redistribute it and/or modify
--+	it under the terms of the GNU General Public License as published by
--+	the Free Software Foundation; either version 2 of the License, or
--+	(at your option) any later version.
--+
--+	This program is distributed in the hope that it will be useful,
--+	but WITHOUT ANY WARRANTY; without even the implied warranty of
--+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--+	GNU General Public License for more details.
--+
--+	You should have received a copy of the GNU General Public License
--+	along with this program; if not, write to the
--+	Free Software Foundation, Inc.,
--+	59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--+ */
--+
--+/*
--+	Module: rt2x00lib
--+	Abstract: rt2x00 eeprom file loading routines.
--+ */
--+
--+#include <linux/kernel.h>
--+#include <linux/module.h>
--+
--+#include "rt2x00.h"
--+#include "rt2x00lib.h"
--+
--+static const char *
--+rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
--+{
--+	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
--+
--+	if (pdata && pdata->eeprom_file_name)
--+		return pdata->eeprom_file_name;
--+
--+	return NULL
--+}
--+
--+static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
--+{
--+	const struct firmware *ee;
--+	const char *ee_name;
--+	int retval;
--+
--+	ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
--+	if (!ee_name) {
--+		rt2x00_err(rt2x00dev,
--+			   "Invalid EEPROM filename.\n"
--+			   "Please file bug report to %s.\n", DRV_PROJECT);
--+		return -EINVAL;
--+	}
--+
--+	rt2x00_info(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name);
--+
--+	retval = request_firmware(&ee, ee_name, rt2x00dev->dev);
--+	if (retval) {
--+		rt2x00_err(rt2x00dev, "Failed to request EEPROM.\n");
--+		return retval;
--+	}
--+
--+	if (!ee || !ee->size || !ee->data) {
--+		rt2x00_err(rt2x00dev, "Failed to read EEPROM file.\n");
--+		retval = -ENOENT;
--+		goto err_exit;
--+	}
--+
--+	if (ee->size != rt2x00dev->ops->eeprom_size) {
--+		rt2x00_err(rt2x00dev,
--+			   "EEPROM file size is invalid, it should be %d bytes\n",
--+			   rt2x00dev->ops->eeprom_size);
--+		retval = -EINVAL;
--+		goto err_release_ee;
--+	}
--+
--+	rt2x00dev->eeprom_file = ee;
--+	return 0;
--+
--+err_release_ee:
--+	release_firmware(ee);
--+err_exit:
--+	return retval;
--+}
--+
--+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
--+{
--+	int retval;
--+
--+	if (!rt2x00lib_get_eeprom_file_name(rt2x00dev))
--+		return 0;
--+
--+	set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
--+
--+	if (!rt2x00dev->eeprom_file) {
--+		retval = rt2x00lib_request_eeprom_file(rt2x00dev);
--+		if (retval)
--+			return retval;
--+	}
--+
--+	return 0;
--+}
--+
--+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
--+{
--+	release_firmware(rt2x00dev->eeprom_file);
--+	rt2x00dev->eeprom_file = NULL;
--+}
----- a/drivers/net/wireless/rt2x00/rt2x00lib.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
--@@ -320,6 +320,22 @@ static inline void rt2x00lib_free_firmwa
-- #endif /* CPTCFG_RT2X00_LIB_FIRMWARE */
-- 
-- /*
--+ * EEPROM file handlers.
--+ */
--+#ifdef CPTCFG_RT2X00_LIB_EEPROM
--+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev);
--+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev);
--+#else
--+static inline int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
--+{
--+	return 0;
--+}
--+static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
--+{
--+}
--+#endif /* CPTCFG_RT2X00_LIB_EEPROM */
--+
--+/*
--  * Debugfs handlers.
--  */
-- #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
----- a/drivers/net/wireless/rt2x00/rt2x00soc.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00soc.c
--@@ -92,6 +92,7 @@ int rt2x00soc_probe(struct platform_devi
-- 	rt2x00dev->hw = hw;
-- 	rt2x00dev->irq = platform_get_irq(pdev, 0);
-- 	rt2x00dev->name = pdev->dev.driver->name;
--+	set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
-- 
-- 	rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
-- 
-diff --git a/package/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch b/package/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch
-deleted file mode 100644
-index 4bc6f37..0000000
---- a/package/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch
-+++ /dev/null
-@@ -1,33 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
--@@ -26,6 +26,7 @@
-- 
-- #include <linux/kernel.h>
-- #include <linux/module.h>
--+#include <linux/of.h>
-- 
-- #include "rt2x00.h"
-- #include "rt2x00lib.h"
--@@ -34,11 +35,21 @@ static const char *
-- rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
-- {
-- 	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
--+#ifdef CONFIG_OF
--+	struct device_node *np;
--+	const char *eep;
--+#endif
-- 
-- 	if (pdata && pdata->eeprom_file_name)
-- 		return pdata->eeprom_file_name;
-- 
---	return NULL
--+#ifdef CONFIG_OF
--+	np = rt2x00dev->dev->of_node;
--+	if (np && of_property_read_string(np, "ralink,eeprom", &eep) == 0)
--+	    return eep;
--+#endif
--+
--+	return NULL;
-- }
-- 
-- static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
-diff --git a/package/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch b/package/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
-deleted file mode 100644
-index 75f0415..0000000
---- a/package/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
-+++ /dev/null
-@@ -1,101 +0,0 @@
--From 339fe73f340161a624cc08e738d2244814852c3e Mon Sep 17 00:00:00 2001
--From: John Crispin <blogic@openwrt.org>
--Date: Sun, 17 Mar 2013 00:55:04 +0100
--Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside
-- OF
--
--Signed-off-by: John Crispin <blogic@openwrt.org>
-----
-- drivers/net/wireless/rt2x00/Kconfig     |    1 +
-- drivers/net/wireless/rt2x00/rt2800pci.c |   44 ++++++++++++++++++++++++++-----
-- 2 files changed, 39 insertions(+), 6 deletions(-)
--
----- a/drivers/net/wireless/rt2x00/Kconfig
--+++ b/drivers/net/wireless/rt2x00/Kconfig
--@@ -219,6 +219,7 @@ config RT2800SOC
-- 	select RT2X00_LIB_EEPROM
-- 	select RT2800_LIB
-- 	select RT2800_LIB_MMIO
--+	select MTD if SOC_RT288X || SOC_RT305X
-- 	---help---
-- 	  This adds support for Ralink WiSoC devices.
-- 	  Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352.
----- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
--@@ -26,11 +26,66 @@
-- 
-- #include <linux/kernel.h>
-- #include <linux/module.h>
--+#include <linux/mtd/mtd.h>
--+#include <linux/mtd/partitions.h>
-- #include <linux/of.h>
-- 
-- #include "rt2x00.h"
-- #include "rt2x00lib.h"
-- 
--+static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
--+{
--+	int ret = -EINVAL;
--+#ifdef CONFIG_OF
--+	static struct firmware mtd_fw;
--+	struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL;
--+	size_t retlen, len = rt2x00dev->ops->eeprom_size;
--+	int size, offset = 0;
--+	struct mtd_info *mtd;
--+	const char *part;
--+	const __be32 *list;
--+	phandle phandle;
--+
--+	list = of_get_property(np, "ralink,mtd-eeprom", &size);
--+	if (!list) {
--+		dev_err(rt2x00dev->dev, "failed to load eeprom property\n");
--+		return -ENOENT;
--+	}
--+
--+	phandle = be32_to_cpup(list++);
--+	if (phandle)
--+		mtd_np = of_find_node_by_phandle(phandle);
--+	if (!mtd_np) {
--+		dev_err(rt2x00dev->dev, "failed to load mtd phandle\n");
--+		return -EINVAL;
--+	}
--+
--+	part = of_get_property(mtd_np, "label", NULL);
--+	if (!part)
--+		part = mtd_np->name;
--+
--+	mtd = get_mtd_device_nm(part);
--+	if (IS_ERR(mtd)) {
--+		dev_err(rt2x00dev->dev, "failed to get mtd device \"%s\"\n", part);
--+		return PTR_ERR(mtd);
--+	}
--+
--+	if (size > sizeof(*list))
--+		offset = be32_to_cpup(list);
--+
--+	ret = mtd_read(mtd, offset, len, &retlen, (u_char *) rt2x00dev->eeprom);
--+	put_mtd_device(mtd);
--+
--+	if (!ret) {
--+		rt2x00dev->eeprom_file = &mtd_fw;
--+		mtd_fw.size = len;
--+		mtd_fw.data = rt2x00dev->eeprom;
--+	}
--+#endif
--+
--+	return ret;
--+}
--+
-- static const char *
-- rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
-- {
--@@ -58,6 +113,9 @@ static int rt2x00lib_request_eeprom_file
-- 	const char *ee_name;
-- 	int retval;
-- 
--+	if (!rt2800lib_read_eeprom_mtd(rt2x00dev))
--+		return 0;
--+
-- 	ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
-- 	if (!ee_name) {
-- 		rt2x00_err(rt2x00dev,
-diff --git a/package/mac80211/patches/606-rt2x00_no_realign.patch b/package/mac80211/patches/606-rt2x00_no_realign.patch
-deleted file mode 100644
-index 7e32192..0000000
---- a/package/mac80211/patches/606-rt2x00_no_realign.patch
-+++ /dev/null
-@@ -1,67 +0,0 @@
--[RFC] rt2x00: For drivers that only need L2 padding don't realign frames
--
--Signed-off-by: Helmut Schaa <helmut.schaa@...>
-----
--
--Ivo, Gertjan, do you remeber by any chance why this alignment stuff was added
--in the first place? Was it because of DMA restrictions?
--
--While doing some profiling on the rt3052 SoC I noticed that 30-40% time was
--spent in memmove calls. And the culprit is the memmove aligning the payload
--to a 4byte boundary since that has to move a whole bunch of data.
--
--Interesstingly the legacy drivers insert an l2pad between the header and the
--payload but doesn't realign the payload itself to a 4-byte boundary. Hence,
--I came up with this patch and indeed CPU usage improves impressively.
--
--Only tested on rt2800pci!
--
--Thanks,
--Helmut
--
-- drivers/net/wireless/rt2x00/rt2x00queue.c |   30 +++-------------------------
-- 1 files changed, 4 insertions(+), 26 deletions(-)
--
----- a/drivers/net/wireless/rt2x00/rt2x00queue.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
--@@ -161,36 +161,14 @@ void rt2x00queue_align_frame(struct sk_b
-- void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
-- {
-- 	unsigned int payload_length = skb->len - header_length;
---	unsigned int header_align = ALIGN_SIZE(skb, 0);
---	unsigned int payload_align = ALIGN_SIZE(skb, header_length);
-- 	unsigned int l2pad = payload_length ? L2PAD_SIZE(header_length) : 0;
-- 
---	/*
---	 * Adjust the header alignment if the payload needs to be moved more
---	 * than the header.
---	 */
---	if (payload_align > header_align)
---		header_align += 4;
---
---	/* There is nothing to do if no alignment is needed */
---	if (!header_align)
--+	if (!l2pad)
-- 		return;
-- 
---	/* Reserve the amount of space needed in front of the frame */
---	skb_push(skb, header_align);
---
---	/*
---	 * Move the header.
---	 */
---	memmove(skb->data, skb->data + header_align, header_length);
---
---	/* Move the payload, if present and if required */
---	if (payload_length && payload_align)
---		memmove(skb->data + header_length + l2pad,
---			skb->data + header_length + l2pad + payload_align,
---			payload_length);
---
---	/* Trim the skb to the correct size */
--+	/* insert l2pad -> Move header */
--+	skb_push(skb, l2pad);
--+	memmove(skb->data, skb->data + l2pad, header_length);
-- 	skb_trim(skb, header_length + l2pad + payload_length);
-- }
-- 
-diff --git a/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
-deleted file mode 100644
-index 4116735..0000000
---- a/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
-+++ /dev/null
-@@ -1,47 +0,0 @@
----- a/include/linux/rt2x00_platform.h
--+++ b/include/linux/rt2x00_platform.h
--@@ -14,6 +14,9 @@
-- 
-- struct rt2x00_platform_data {
-- 	char *eeprom_file_name;
--+
--+	int disable_2ghz;
--+	int disable_5ghz;
-- };
-- 
-- #endif /* _RT2X00_PLATFORM_H */
----- a/drivers/net/wireless/rt2x00/rt2x00dev.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
--@@ -937,6 +937,22 @@ static int rt2x00lib_probe_hw_modes(stru
-- 	unsigned int num_rates;
-- 	unsigned int i;
-- 
--+	if (rt2x00dev->dev->platform_data) {
--+		struct rt2x00_platform_data *pdata;
--+
--+		pdata = rt2x00dev->dev->platform_data;
--+		if (pdata->disable_2ghz)
--+			spec->supported_bands &= ~SUPPORT_BAND_2GHZ;
--+		if (pdata->disable_5ghz)
--+			spec->supported_bands &= ~SUPPORT_BAND_5GHZ;
--+	}
--+
--+	if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) {
--+		rt2x00_err(rt2x00dev, "No supported bands\n");
--+		return -EINVAL;
--+	}
--+
--+
-- 	num_rates = 0;
-- 	if (spec->supported_rates & SUPPORT_RATE_CCK)
-- 		num_rates += 4;
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -403,6 +403,7 @@ struct hw_mode_spec {
-- 	unsigned int supported_bands;
-- #define SUPPORT_BAND_2GHZ	0x00000001
-- #define SUPPORT_BAND_5GHZ	0x00000002
--+#define SUPPORT_BAND_BOTH	(SUPPORT_BAND_2GHZ | SUPPORT_BAND_5GHZ)
-- 
-- 	unsigned int supported_rates;
-- #define SUPPORT_RATE_CCK	0x00000001
-diff --git a/package/mac80211/patches/608-add_platform_data_mac_addr.patch b/package/mac80211/patches/608-add_platform_data_mac_addr.patch
-deleted file mode 100644
-index a910cc3..0000000
---- a/package/mac80211/patches/608-add_platform_data_mac_addr.patch
-+++ /dev/null
-@@ -1,63 +0,0 @@
----- a/include/linux/rt2x00_platform.h
--+++ b/include/linux/rt2x00_platform.h
--@@ -14,6 +14,7 @@
-- 
-- struct rt2x00_platform_data {
-- 	char *eeprom_file_name;
--+	const u8 *mac_address;
-- 
-- 	int disable_2ghz;
-- 	int disable_5ghz;
----- a/drivers/net/wireless/rt2x00/rt2x00dev.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
--@@ -928,6 +928,18 @@ static void rt2x00lib_rate(struct ieee80
-- 		entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
-- }
-- 
--+const u8 *rt2x00lib_get_mac_address(struct rt2x00_dev *rt2x00dev)
--+{
--+	struct rt2x00_platform_data *pdata;
--+
--+	pdata = rt2x00dev->dev->platform_data;
--+	if (!pdata)
--+		return NULL;
--+
--+	return pdata->mac_address;
--+}
--+EXPORT_SYMBOL_GPL(rt2x00lib_get_mac_address);
--+
-- static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
-- 				    struct hw_mode_spec *spec)
-- {
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -1401,6 +1401,7 @@ static inline void rt2x00debug_dump_fram
--  */
-- u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
-- 			 struct ieee80211_vif *vif);
--+const u8 *rt2x00lib_get_mac_address(struct rt2x00_dev *rt2x00dev);
-- 
-- /*
--  * Interrupt context handlers.
----- a/drivers/net/wireless/rt2x00/rt61pci.c
--+++ b/drivers/net/wireless/rt2x00/rt61pci.c
--@@ -2392,6 +2392,7 @@ static int rt61pci_validate_eeprom(struc
-- 	u32 reg;
-- 	u16 word;
-- 	u8 *mac;
--+	const u8 *pdata_mac;
-- 	s8 value;
-- 
-- 	rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, &reg);
--@@ -2412,7 +2413,11 @@ static int rt61pci_validate_eeprom(struc
-- 	/*
-- 	 * Start validation of the data that has been read.
-- 	 */
--+	pdata_mac = rt2x00lib_get_mac_address(rt2x00dev);
-- 	mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
--+	if (pdata_mac)
--+		memcpy(mac, pdata_mac, 6);
--+
-- 	if (!is_valid_ether_addr(mac)) {
-- 		eth_random_addr(mac);
-- 		rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
-diff --git a/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch b/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
-deleted file mode 100644
-index 83fbcd0..0000000
---- a/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
-+++ /dev/null
-@@ -1,225 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2800lib.c
--+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
--@@ -3176,11 +3176,17 @@ static void rt2800_config_channel(struct
-- 	/*
-- 	 * Change BBP settings
-- 	 */
--+	rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
--+	rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
--+	rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
--+
-- 	if (rt2x00_rt(rt2x00dev, RT3352)) {
-- 		rt2800_bbp_write(rt2x00dev, 27, 0x0);
-- 		rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
-- 		rt2800_bbp_write(rt2x00dev, 27, 0x20);
-- 		rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
--+		rt2800_bbp_write(rt2x00dev, 86, 0x38);
--+		rt2800_bbp_write(rt2x00dev, 83, 0x6a);
-- 	} else if (rt2x00_rt(rt2x00dev, RT3593)) {
-- 		if (rf->channel > 14) {
-- 			/* Disable CCK Packet detection on 5GHz */
--@@ -3194,14 +3200,8 @@ static void rt2800_config_channel(struct
-- 		else
-- 			rt2800_bbp_write(rt2x00dev, 105, 0x34);
-- 
---		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
---		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
---		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
-- 		rt2800_bbp_write(rt2x00dev, 77, 0x98);
-- 	} else {
---		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
---		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
---		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
-- 		rt2800_bbp_write(rt2x00dev, 86, 0);
-- 	}
-- 
--@@ -6125,6 +6125,12 @@ static void rt2800_init_rfcsr_3290(struc
-- 
-- static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
-- {
--+	int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
--+				  &rt2x00dev->cap_flags);
--+	int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
--+				  &rt2x00dev->cap_flags);
--+	u8 rfcsr;
--+
-- 	rt2800_rf_init_calibration(rt2x00dev, 30);
-- 
-- 	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
--@@ -6160,15 +6166,30 @@ static void rt2800_init_rfcsr_3352(struc
-- 	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
-- 	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
-- 	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
---	rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
--+	rfcsr = 0x01;
--+	if (!tx0_int_pa)
--+		rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
--+	if (!tx1_int_pa)
--+		rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
--+	rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
-- 	rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
-- 	rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
-- 	rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
-- 	rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
-- 	rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
-- 	rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
---	rt2800_rfcsr_write(rt2x00dev, 41, 0x5b);
---	rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
--+	rfcsr = 0x52;
--+	if (tx0_int_pa) {
--+		rt2x00_set_field8(&rfcsr, RFCSR41_BIT1, 1);
--+		rt2x00_set_field8(&rfcsr, RFCSR41_BIT4, 1);
--+	}
--+	rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
--+	rfcsr = 0x52;
--+	if (tx1_int_pa) {
--+		rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1);
--+		rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1);
--+	}
--+	rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
-- 	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
-- 	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
-- 	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
--@@ -6176,15 +6197,20 @@ static void rt2800_init_rfcsr_3352(struc
-- 	rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
-- 	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
-- 	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
---	rt2800_rfcsr_write(rt2x00dev, 50, 0x2d);
---	rt2800_rfcsr_write(rt2x00dev, 51, 0x7f);
---	rt2800_rfcsr_write(rt2x00dev, 52, 0x00);
---	rt2800_rfcsr_write(rt2x00dev, 53, 0x52);
---	rt2800_rfcsr_write(rt2x00dev, 54, 0x1b);
---	rt2800_rfcsr_write(rt2x00dev, 55, 0x7f);
---	rt2800_rfcsr_write(rt2x00dev, 56, 0x00);
---	rt2800_rfcsr_write(rt2x00dev, 57, 0x52);
---	rt2800_rfcsr_write(rt2x00dev, 58, 0x1b);
--+	rfcsr = 0x2d;
--+	if (!tx0_int_pa)
--+		rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1);
--+	if (!tx1_int_pa)
--+		rt2x00_set_field8(&rfcsr, RFCSR50_TX1_EXT_PA, 1);
--+	rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
--+	rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
--+	rt2800_rfcsr_write(rt2x00dev, 52, (tx0_int_pa ? 0x00 : 0xc0));
--+	rt2800_rfcsr_write(rt2x00dev, 53, (tx0_int_pa ? 0x52 : 0xd2));
--+	rt2800_rfcsr_write(rt2x00dev, 54, (tx0_int_pa ? 0x1b : 0xc0));
--+	rt2800_rfcsr_write(rt2x00dev, 55, (tx1_int_pa ? 0x7f : 0x52));
--+	rt2800_rfcsr_write(rt2x00dev, 56, (tx1_int_pa ? 0x00 : 0xc0));
--+	rt2800_rfcsr_write(rt2x00dev, 57, (tx0_int_pa ? 0x52 : 0x49));
--+	rt2800_rfcsr_write(rt2x00dev, 58, (tx1_int_pa ? 0x1b : 0xc0));
-- 	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
-- 	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
-- 	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
--@@ -7051,6 +7077,7 @@ static int rt2800_init_eeprom(struct rt2
-- 	 * RT53xx: defined in "EEPROM_CHIP_ID" field
-- 	 */
-- 	if (rt2x00_rt(rt2x00dev, RT3290) ||
--+	    rt2x00_rt(rt2x00dev, RT3352) ||
-- 	    rt2x00_rt(rt2x00dev, RT5390) ||
-- 	    rt2x00_rt(rt2x00dev, RT5392))
-- 		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
--@@ -7142,7 +7169,8 @@ static int rt2800_init_eeprom(struct rt2
-- 	/*
-- 	 * Detect if this device has Bluetooth co-existence.
-- 	 */
---	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST))
--+	if (!rt2x00_rt(rt2x00dev, RT3352) &&
--+	    rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST))
-- 		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
-- 
-- 	/*
--@@ -7171,6 +7199,22 @@ static int rt2800_init_eeprom(struct rt2
-- 					EIRP_MAX_TX_POWER_LIMIT)
-- 		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
-- 
--+	/*
--+	 * Detect if device uses internal or external PA
--+	 */
--+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
--+
--+	if (rt2x00_rt(rt2x00dev, RT3352)) {
--+		if (!rt2x00_get_field16(eeprom,
--+		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
--+			__set_bit(CAPABILITY_INTERNAL_PA_TX0,
--+				  &rt2x00dev->cap_flags);
--+		if (!rt2x00_get_field16(eeprom,
--+		    EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352))
--+			__set_bit(CAPABILITY_INTERNAL_PA_TX1,
--+				  &rt2x00dev->cap_flags);
--+	}
--+
-- 	return 0;
-- }
-- 
----- a/drivers/net/wireless/rt2x00/rt2800.h
--+++ b/drivers/net/wireless/rt2x00/rt2800.h
--@@ -2299,6 +2299,12 @@ struct mac_iveiv_entry {
-- #define RFCSR36_RF_BS			FIELD8(0x80)
-- 
-- /*
--+ * RFCSR 34:
--+ */
--+#define RFCSR34_TX0_EXT_PA		FIELD8(0x04)
--+#define RFCSR34_TX1_EXT_PA		FIELD8(0x08)
--+
--+/*
--  * RFCSR 38:
--  */
-- #define RFCSR38_RX_LO1_EN		FIELD8(0x20)
--@@ -2310,6 +2316,18 @@ struct mac_iveiv_entry {
-- #define RFCSR39_RX_LO2_EN		FIELD8(0x80)
-- 
-- /*
--+ * RFCSR 41:
--+ */
--+#define RFCSR41_BIT1			FIELD8(0x01)
--+#define RFCSR41_BIT4			FIELD8(0x08)
--+
--+/*
--+ * RFCSR 42:
--+ */
--+#define RFCSR42_BIT1			FIELD8(0x01)
--+#define RFCSR42_BIT4			FIELD8(0x08)
--+
--+/*
--  * RFCSR 49:
--  */
-- #define RFCSR49_TX			FIELD8(0x3f)
--@@ -2322,6 +2340,8 @@ struct mac_iveiv_entry {
--  * RFCSR 50:
--  */
-- #define RFCSR50_TX			FIELD8(0x3f)
--+#define RFCSR50_TX0_EXT_PA		FIELD8(0x02)
--+#define RFCSR50_TX1_EXT_PA		FIELD8(0x10)
-- #define RFCSR50_EP			FIELD8(0xc0)
-- /* bits for RT3593 */
-- #define RFCSR50_TX_LO1_EN		FIELD8(0x20)
--@@ -2469,6 +2489,8 @@ enum rt2800_eeprom_word {
--  * INTERNAL_TX_ALC: 0: disable, 1: enable
--  * BT_COEXIST: 0: disable, 1: enable
--  * DAC_TEST: 0: disable, 1: enable
--+ * EXTERNAL_TX0_PA: 0: disable, 1: enable (only on RT3352)
--+ * EXTERNAL_TX1_PA: 0: disable, 1: enable (only on RT3352)
--  */
-- #define EEPROM_NIC_CONF1_HW_RADIO		FIELD16(0x0001)
-- #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC	FIELD16(0x0002)
--@@ -2485,6 +2507,8 @@ enum rt2800_eeprom_word {
-- #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC	FIELD16(0x2000)
-- #define EEPROM_NIC_CONF1_BT_COEXIST		FIELD16(0x4000)
-- #define EEPROM_NIC_CONF1_DAC_TEST		FIELD16(0x8000)
--+#define EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352	FIELD16(0x4000)
--+#define EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352	FIELD16(0x8000)
-- 
-- /*
--  * EEPROM frequency
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -714,6 +714,8 @@ enum rt2x00_capability_flags {
-- 	CAPABILITY_DOUBLE_ANTENNA,
-- 	CAPABILITY_BT_COEXIST,
-- 	CAPABILITY_VCO_RECALIBRATION,
--+	CAPABILITY_INTERNAL_PA_TX0,
--+	CAPABILITY_INTERNAL_PA_TX1,
-- };
-- 
-- /*
-diff --git a/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch b/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
-deleted file mode 100644
-index 478a0f2..0000000
---- a/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
-+++ /dev/null
-@@ -1,106 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2800lib.c
--+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
--@@ -7491,6 +7491,27 @@ static const struct rf_channel rf_vals_5
-- 	{196, 83, 0, 12, 1},
-- };
-- 
--+/*
--+ * RF value list for rt3xxx with Xtal20MHz
--+ * Supports: 2.4 GHz (all) (RF3322)
--+ */
--+static const struct rf_channel rf_vals_xtal20mhz_3x[] = {
--+	{1,    0xE2,	 2,  0x14},
--+	{2,    0xE3,	 2,  0x14},
--+	{3,    0xE4,	 2,  0x14},
--+	{4,    0xE5,	 2,  0x14},
--+	{5,    0xE6,	 2,  0x14},
--+	{6,    0xE7,	 2,  0x14},
--+	{7,    0xE8,	 2,  0x14},
--+	{8,    0xE9,	 2,  0x14},
--+	{9,    0xEA,	 2,  0x14},
--+	{10,   0xEB,	 2,  0x14},
--+	{11,   0xEC,	 2,  0x14},
--+	{12,   0xED,	 2,  0x14},
--+	{13,   0xEE,	 2,  0x14},
--+	{14,   0xF0,	 2,  0x18},
--+};
--+
-- static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
-- {
-- 	struct hw_mode_spec *spec = &rt2x00dev->spec;
--@@ -7579,7 +7600,10 @@ static int rt2800_probe_hw_mode(struct r
-- 	case RF5390:
-- 	case RF5392:
-- 		spec->num_channels = 14;
---		spec->channels = rf_vals_3x;
--+		if (spec->clk_is_20mhz)
--+			spec->channels = rf_vals_xtal20mhz_3x;
--+		else
--+			spec->channels = rf_vals_3x;
-- 		break;
-- 
-- 	case RF3052:
--@@ -7755,6 +7779,19 @@ static int rt2800_probe_rt(struct rt2x00
-- 	return 0;
-- }
-- 
--+int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
--+{
--+	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
--+	struct hw_mode_spec *spec = &rt2x00dev->spec;
--+
--+	if (!pdata)
--+		return -EINVAL;
--+
--+	spec->clk_is_20mhz = pdata->clk_is_20mhz;
--+
--+	return 0;
--+}
--+
-- int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
-- {
-- 	int retval;
--@@ -7784,6 +7821,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
-- 	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
-- 
-- 	/*
--+	 * Probe SoC clock.
--+	 */
--+	if (rt2x00_is_soc(rt2x00dev)) {
--+		retval = rt2800_probe_clk(rt2x00dev);
--+		if (retval)
--+			return retval;
--+	}
--+
--+	/*
-- 	 * Initialize hw specifications.
-- 	 */
-- 	retval = rt2800_probe_hw_mode(rt2x00dev);
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -398,6 +398,7 @@ static inline struct rt2x00_intf* vif_to
--  * @channels: Device/chipset specific channel values (See &struct rf_channel).
--  * @channels_info: Additional information for channels (See &struct channel_info).
--  * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
--+ * @clk_is_20mhz: External crystal of WiSoC is 20MHz instead of 40MHz
--  */
-- struct hw_mode_spec {
-- 	unsigned int supported_bands;
--@@ -414,6 +415,7 @@ struct hw_mode_spec {
-- 	const struct channel_info *channels_info;
-- 
-- 	struct ieee80211_sta_ht_cap ht;
--+	int clk_is_20mhz;
-- };
-- 
-- /*
----- a/include/linux/rt2x00_platform.h
--+++ b/include/linux/rt2x00_platform.h
--@@ -18,6 +18,7 @@ struct rt2x00_platform_data {
-- 
-- 	int disable_2ghz;
-- 	int disable_5ghz;
--+	int clk_is_20mhz;
-- };
-- 
-- #endif /* _RT2X00_PLATFORM_H */
-diff --git a/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch b/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
-deleted file mode 100644
-index f6b4808..0000000
---- a/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
-+++ /dev/null
-@@ -1,34 +0,0 @@
--From 04dbd87265f6ba4a373b211ba324b437d224fb2d Mon Sep 17 00:00:00 2001
--From: John Crispin <blogic@openwrt.org>
--Date: Sun, 17 Mar 2013 00:03:31 +0100
--Subject: [PATCH 21/38] rt2x00: make wmac loadable via OF on rt288x/305x SoC
--
--This patch ads the match table to allow loading the wmac support from a
--devicetree.
--
--Signed-off-by: John Crispin <blogic@openwrt.org>
-----
-- drivers/net/wireless/rt2x00/rt2800pci.c |    7 +++++++
-- 1 file changed, 7 insertions(+)
--
----- a/drivers/net/wireless/rt2x00/rt2800soc.c
--+++ b/drivers/net/wireless/rt2x00/rt2800soc.c
--@@ -227,11 +227,18 @@ static int rt2800soc_probe(struct platfo
-- 	return rt2x00soc_probe(pdev, &rt2800soc_ops);
-- }
-- 
--+static const struct of_device_id rt2880_wmac_match[] = {
--+	{ .compatible = "ralink,rt2880-wmac" },
--+	{},
--+};
--+MODULE_DEVICE_TABLE(of, rt2880_wmac_match);
--+
-- static struct platform_driver rt2800soc_driver = {
-- 	.driver		= {
-- 		.name		= "rt2800_wmac",
-- 		.owner		= THIS_MODULE,
-- 		.mod_name	= KBUILD_MODNAME,
--+		.of_match_table	= rt2880_wmac_match,
-- 	},
-- 	.probe		= rt2800soc_probe,
-- 	.remove		= rt2x00soc_remove,
-diff --git a/package/mac80211/patches/616-rt2x00-support-rt5350.patch b/package/mac80211/patches/616-rt2x00-support-rt5350.patch
-deleted file mode 100644
-index 3bafa16..0000000
---- a/package/mac80211/patches/616-rt2x00-support-rt5350.patch
-+++ /dev/null
-@@ -1,276 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2800.h
--+++ b/drivers/net/wireless/rt2x00/rt2800.h
--@@ -71,6 +71,7 @@
-- #define RF5592				0x000f
-- #define RF3070				0x3070
-- #define RF3290				0x3290
--+#define RF5350				0x5350
-- #define RF5360				0x5360
-- #define RF5370				0x5370
-- #define RF5372				0x5372
----- a/drivers/net/wireless/rt2x00/rt2800lib.c
--+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
--@@ -2704,6 +2704,13 @@ static void rt2800_config_channel_rf53xx
-- 
-- 				rt2800_rfcsr_write(rt2x00dev, 59,
-- 						   r59_non_bt[idx]);
--+			} else if (rt2x00_rt(rt2x00dev, RT5350)) {
--+				static const char r59_non_bt[] = {0x0b, 0x0b,
--+					0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
--+					0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
--+
--+				rt2800_rfcsr_write(rt2x00dev, 59,
--+						   r59_non_bt[idx]);
-- 			}
-- 		}
-- 	}
--@@ -3141,6 +3148,7 @@ static void rt2800_config_channel(struct
-- 		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
-- 		break;
-- 	case RF3070:
--+	case RF5350:
-- 	case RF5360:
-- 	case RF5370:
-- 	case RF5372:
--@@ -3158,6 +3166,7 @@ static void rt2800_config_channel(struct
-- 	if (rt2x00_rf(rt2x00dev, RF3070) ||
-- 	    rt2x00_rf(rt2x00dev, RF3290) ||
-- 	    rt2x00_rf(rt2x00dev, RF3322) ||
--+	    rt2x00_rf(rt2x00dev, RF5350) ||
-- 	    rt2x00_rf(rt2x00dev, RF5360) ||
-- 	    rt2x00_rf(rt2x00dev, RF5370) ||
-- 	    rt2x00_rf(rt2x00dev, RF5372) ||
--@@ -3398,7 +3407,8 @@ static void rt2800_config_channel(struct
-- 	/*
-- 	 * Clear update flag
-- 	 */
---	if (rt2x00_rt(rt2x00dev, RT3352)) {
--+	if (rt2x00_rt(rt2x00dev, RT3352) ||
--+	    rt2x00_rt(rt2x00dev, RT5350)) {
-- 		rt2800_bbp_read(rt2x00dev, 49, &bbp);
-- 		rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
-- 		rt2800_bbp_write(rt2x00dev, 49, bbp);
--@@ -4272,6 +4282,7 @@ void rt2800_vco_calibration(struct rt2x0
-- 	case RF3053:
-- 	case RF3070:
-- 	case RF3290:
--+	case RF5350:
-- 	case RF5360:
-- 	case RF5370:
-- 	case RF5372:
--@@ -4668,6 +4679,8 @@ static int rt2800_init_registers(struct 
-- 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
-- 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-- 		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
--+	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
--+		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
-- 	} else {
-- 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
-- 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
--@@ -5309,9 +5322,13 @@ static void rt2800_init_bbp_3352(struct 
-- 
-- 	rt2800_bbp_write(rt2x00dev, 82, 0x62);
-- 
---	rt2800_bbp_write(rt2x00dev, 83, 0x6a);
---
---	rt2800_bbp_write(rt2x00dev, 84, 0x99);
--+	if (rt2x00_rt(rt2x00dev, RT5350)) {
--+		rt2800_bbp_write(rt2x00dev, 83, 0x7a);
--+		rt2800_bbp_write(rt2x00dev, 84, 0x9a);
--+	} else {
--+		rt2800_bbp_write(rt2x00dev, 83, 0x6a);
--+		rt2800_bbp_write(rt2x00dev, 84, 0x99);
--+	}
-- 
-- 	rt2800_bbp_write(rt2x00dev, 86, 0x38);
-- 
--@@ -5325,9 +5342,13 @@ static void rt2800_init_bbp_3352(struct 
-- 
-- 	rt2800_bbp_write(rt2x00dev, 104, 0x92);
-- 
---	rt2800_bbp_write(rt2x00dev, 105, 0x34);
---
---	rt2800_bbp_write(rt2x00dev, 106, 0x05);
--+	if (rt2x00_rt(rt2x00dev, RT5350)) {
--+		rt2800_bbp_write(rt2x00dev, 105, 0x3c);
--+		rt2800_bbp_write(rt2x00dev, 106, 0x03);
--+	} else {
--+		rt2800_bbp_write(rt2x00dev, 105, 0x34);
--+		rt2800_bbp_write(rt2x00dev, 106, 0x05);
--+	}
-- 
-- 	rt2800_bbp_write(rt2x00dev, 120, 0x50);
-- 
--@@ -5352,6 +5373,13 @@ static void rt2800_init_bbp_3352(struct 
-- 	rt2800_bbp_write(rt2x00dev, 143, 0xa2);
-- 
-- 	rt2800_bbp_write(rt2x00dev, 148, 0xc8);
--+
--+	if (rt2x00_rt(rt2x00dev, RT5350)) {
--+		rt2800_bbp_write(rt2x00dev, 150, 0x40); /* Antenna Software OFDM */
--+		rt2800_bbp_write(rt2x00dev, 151, 0x30); /* Antenna Software CCK */
--+		rt2800_bbp_write(rt2x00dev, 152, 0xa3);
--+		rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */
--+	}
-- }
-- 
-- static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
--@@ -5652,6 +5680,7 @@ static void rt2800_init_bbp(struct rt2x0
-- 		rt2800_init_bbp_3290(rt2x00dev);
-- 		break;
-- 	case RT3352:
--+	case RT5350:
-- 		rt2800_init_bbp_3352(rt2x00dev);
-- 		break;
-- 	case RT3390:
--@@ -6462,6 +6491,76 @@ static void rt2800_init_rfcsr_3593(struc
-- 	/* TODO: enable stream mode support */
-- }
-- 
--+static void rt2800_init_rfcsr_5350(struct rt2x00_dev *rt2x00dev)
--+{
--+	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
--+	rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
--+	rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
--+	rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
--+	rt2800_rfcsr_write(rt2x00dev, 4, 0x49);
--+	rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
--+	rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
--+	rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
--+	rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
--+	rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
--+	rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
--+	rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
--+	if(rt2x00dev->spec.clk_is_20mhz)
--+		rt2800_rfcsr_write(rt2x00dev, 13, 0x1f);
--+	else
--+		rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
--+	rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 16, 0xc0);
--+	rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
--+	rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
--+	rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
--+	rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
--+	rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 29, 0xd0);
--+	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
--+	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
--+	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
--+	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
--+	rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
--+	rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
--+	rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
--+	rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
--+	rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
--+	rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
--+	rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
--+	rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
--+	rt2800_rfcsr_write(rt2x00dev, 44, 0x0c);
--+	rt2800_rfcsr_write(rt2x00dev, 45, 0xa6);
--+	rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
--+	rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
--+	rt2800_rfcsr_write(rt2x00dev, 49, 0x80);
--+	rt2800_rfcsr_write(rt2x00dev, 50, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 51, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
--+	rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
--+	rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
--+	rt2800_rfcsr_write(rt2x00dev, 56, 0x82);
--+	rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
--+	rt2800_rfcsr_write(rt2x00dev, 59, 0x0b);
--+	rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
--+	rt2800_rfcsr_write(rt2x00dev, 61, 0xd1);
--+	rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
--+	rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
--+}
--+
-- static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
-- {
-- 	rt2800_rf_init_calibration(rt2x00dev, 2);
--@@ -6699,6 +6798,9 @@ static void rt2800_init_rfcsr(struct rt2
-- 	case RT3593:
-- 		rt2800_init_rfcsr_3593(rt2x00dev);
-- 		break;
--+	case RT5350:
--+		rt2800_init_rfcsr_5350(rt2x00dev);
--+		break;
-- 	case RT5390:
-- 		rt2800_init_rfcsr_5390(rt2x00dev);
-- 		break;
--@@ -6948,6 +7050,12 @@ static int rt2800_validate_eeprom(struct
-- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
-- 		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
-- 		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
--+	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
--+		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 1);
--+		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1);
--+		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF3320);
--+		rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
--+		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
-- 	} else if (rt2x00_rt(rt2x00dev, RT2860) ||
-- 		   rt2x00_rt(rt2x00dev, RT2872)) {
-- 		/*
--@@ -7081,6 +7189,8 @@ static int rt2800_init_eeprom(struct rt2
-- 	    rt2x00_rt(rt2x00dev, RT5390) ||
-- 	    rt2x00_rt(rt2x00dev, RT5392))
-- 		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
--+	else if (rt2x00_rt(rt2x00dev, RT5350))
--+		rf = RF5350;
-- 	else
-- 		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
-- 
--@@ -7099,6 +7209,7 @@ static int rt2800_init_eeprom(struct rt2
-- 	case RF3290:
-- 	case RF3320:
-- 	case RF3322:
--+	case RF5350:
-- 	case RF5360:
-- 	case RF5370:
-- 	case RF5372:
--@@ -7594,6 +7705,7 @@ static int rt2800_probe_hw_mode(struct r
-- 	case RF3290:
-- 	case RF3320:
-- 	case RF3322:
--+	case RF5350:
-- 	case RF5360:
-- 	case RF5370:
-- 	case RF5372:
--@@ -7726,6 +7838,7 @@ static int rt2800_probe_hw_mode(struct r
-- 	case RF3053:
-- 	case RF3070:
-- 	case RF3290:
--+	case RF5350:
-- 	case RF5360:
-- 	case RF5370:
-- 	case RF5372:
--@@ -7764,6 +7877,7 @@ static int rt2800_probe_rt(struct rt2x00
-- 	case RT3390:
-- 	case RT3572:
-- 	case RT3593:
--+	case RT5350:
-- 	case RT5390:
-- 	case RT5392:
-- 	case RT5592:
----- a/drivers/net/wireless/rt2x00/rt2x00.h
--+++ b/drivers/net/wireless/rt2x00/rt2x00.h
--@@ -169,6 +169,7 @@ struct rt2x00_chip {
-- #define RT3572		0x3572
-- #define RT3593		0x3593
-- #define RT3883		0x3883	/* WSOC */
--+#define RT5350		0x5350  /* WSOC 2.4GHz */
-- #define RT5390		0x5390  /* 2.4GHz */
-- #define RT5392		0x5392  /* 2.4GHz */
-- #define RT5592		0x5592
-diff --git a/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch b/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
-deleted file mode 100644
-index f9186d8..0000000
---- a/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
-+++ /dev/null
-@@ -1,40 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2800lib.c
--+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
--@@ -36,6 +36,7 @@
-- #include <linux/kernel.h>
-- #include <linux/module.h>
-- #include <linux/slab.h>
--+#include <linux/of.h>
-- 
-- #include "rt2x00.h"
-- #include "rt2800lib.h"
--@@ -7298,6 +7299,17 @@ static int rt2800_init_eeprom(struct rt2
-- 	rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
-- 	rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
-- 
--+	{
--+		struct device_node *np = rt2x00dev->dev->of_node;
--+		unsigned int led_polarity;
--+
--+		/* Allow overriding polarity from OF */
--+		if (!of_property_read_u32(np, "ralink,led-polarity",
--+					  &led_polarity))
--+			rt2x00_set_field16(&eeprom, EEPROM_FREQ_LED_POLARITY,
--+					   led_polarity);
--+	}
--+
-- 	rt2x00dev->led_mcu_reg = eeprom;
-- #endif /* CPTCFG_RT2X00_LIB_LEDS */
-- 
----- a/drivers/net/wireless/rt2x00/rt2x00leds.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00leds.c
--@@ -109,6 +109,9 @@ static int rt2x00leds_register_led(struc
-- 	led->led_dev.name = name;
-- 	led->led_dev.brightness = LED_OFF;
-- 
--+	if (rt2x00_is_soc(rt2x00dev))
--+		led->led_dev.brightness_set(&led->led_dev, LED_OFF);
--+
-- 	retval = led_classdev_register(device, &led->led_dev);
-- 	if (retval) {
-- 		rt2x00_err(rt2x00dev, "Failed to register led handler\n");
-diff --git a/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch b/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
-deleted file mode 100644
-index 419cb60..0000000
---- a/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2x00dev.c
--+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
--@@ -1262,7 +1262,7 @@ static inline void rt2x00lib_set_if_comb
-- 	 */
-- 	if_limit = &rt2x00dev->if_limits_ap;
-- 	if_limit->max = rt2x00dev->ops->max_ap_intf;
---	if_limit->types = BIT(NL80211_IFTYPE_AP);
--+	if_limit->types = BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_STATION);
-- #ifdef CPTCFG_MAC80211_MESH
-- 	if_limit->types |= BIT(NL80211_IFTYPE_MESH_POINT);
-- #endif
-diff --git a/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch b/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
-deleted file mode 100644
-index 5e67344..0000000
---- a/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
----- a/drivers/net/wireless/rt2x00/rt2800lib.c
--+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
--@@ -7186,10 +7186,11 @@ static int rt2800_init_eeprom(struct rt2
-- 	 * RT53xx: defined in "EEPROM_CHIP_ID" field
-- 	 */
-- 	if (rt2x00_rt(rt2x00dev, RT3290) ||
---	    rt2x00_rt(rt2x00dev, RT3352) ||
-- 	    rt2x00_rt(rt2x00dev, RT5390) ||
-- 	    rt2x00_rt(rt2x00dev, RT5392))
-- 		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
--+	else if (rt2x00_rt(rt2x00dev, RT3352))
--+		rf = RF3322;
-- 	else if (rt2x00_rt(rt2x00dev, RT5350))
-- 		rf = RF5350;
-- 	else
-diff --git a/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch b/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
-deleted file mode 100644
-index 484c075..0000000
---- a/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
-+++ /dev/null
-@@ -1,10 +0,0 @@
----- a/drivers/net/wireless/mwl8k.c
--+++ b/drivers/net/wireless/mwl8k.c
--@@ -5529,6 +5529,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) = {
--+	{ PCI_VDEVICE(MARVELL, 0x2a02), .driver_data = MWL8363, },
-- 	{ PCI_VDEVICE(MARVELL, 0x2a0a), .driver_data = MWL8363, },
-- 	{ PCI_VDEVICE(MARVELL, 0x2a0c), .driver_data = MWL8363, },
-- 	{ PCI_VDEVICE(MARVELL, 0x2a24), .driver_data = MWL8363, },
-diff --git a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch
-deleted file mode 100644
-index fc874ad..0000000
---- a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch
-+++ /dev/null
-@@ -1,37 +0,0 @@
----- a/drivers/net/wireless/b43/b43.h
--+++ b/drivers/net/wireless/b43/b43.h
--@@ -820,6 +820,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 */
--+	int gpiomask;			/* GPIO LED mask as a module parameter */
-- 
-- 	/* PHY/Radio device. */
-- 	struct b43_phy phy;
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -76,6 +76,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw");
-- MODULE_FIRMWARE("b43/ucode5.fw");
-- MODULE_FIRMWARE("b43/ucode9.fw");
-- 
--+static int modparam_gpiomask = 0x000F;
--+module_param_named(gpiomask, modparam_gpiomask, int, 0444);
--+MODULE_PARM_DESC(gpiomask,
--+         "GPIO mask for LED control (default 0x000F)");
--+
-- static int modparam_bad_frames_preempt;
-- module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
-- MODULE_PARM_DESC(bad_frames_preempt,
--@@ -2747,10 +2752,10 @@ static int b43_gpio_init(struct b43_wlde
-- 	u32 mask, set;
-- 
-- 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
---	b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF);
--+	b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, modparam_gpiomask);
-- 
-- 	mask = 0x0000001F;
---	set = 0x0000000F;
--+	set = modparam_gpiomask;
-- 	if (dev->dev->chip_id == 0x4301) {
-- 		mask |= 0x0060;
-- 		set |= 0x0060;
-diff --git a/package/mac80211/patches/810-b43_no_pio.patch b/package/mac80211/patches/810-b43_no_pio.patch
-deleted file mode 100644
-index 5cd1b8b..0000000
---- a/package/mac80211/patches/810-b43_no_pio.patch
-+++ /dev/null
-@@ -1,86 +0,0 @@
----- a/drivers/net/wireless/b43/Makefile
--+++ b/drivers/net/wireless/b43/Makefile
--@@ -20,7 +20,7 @@ b43-y				+= xmit.o
-- b43-y				+= lo.o
-- b43-y				+= wa.o
-- b43-y				+= dma.o
---b43-y				+= pio.o
--+b43-$(CPTCFG_B43_PIO)		+= pio.o
-- b43-y				+= rfkill.o
-- b43-$(CPTCFG_B43_LEDS)		+= leds.o
-- b43-$(CPTCFG_B43_PCMCIA)	+= pcmcia.o
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -1915,10 +1915,12 @@ static void b43_do_interrupt_thread(stru
-- 			dma_reason[0], dma_reason[1],
-- 			dma_reason[2], dma_reason[3],
-- 			dma_reason[4], dma_reason[5]);
--+#ifdef CPTCFG_B43_PIO
-- 		b43err(dev->wl, "This device does not support DMA "
-- 			       "on your system. It will now be switched to PIO.\n");
-- 		/* Fall back to PIO transfers if we get fatal DMA errors! */
-- 		dev->use_pio = true;
--+#endif
-- 		b43_controller_restart(dev, "DMA error");
-- 		return;
-- 	}
----- a/drivers/net/wireless/b43/pio.h
--+++ b/drivers/net/wireless/b43/pio.h
--@@ -150,7 +150,7 @@ static inline void b43_piorx_write32(str
-- 	b43_write32(q->dev, q->mmio_base + offset, value);
-- }
-- 
---
--+#ifdef CPTCFG_B43_PIO
-- int b43_pio_init(struct b43_wldev *dev);
-- void b43_pio_free(struct b43_wldev *dev);
-- 
--@@ -161,5 +161,37 @@ void b43_pio_rx(struct b43_pio_rxqueue *
-- 
-- void b43_pio_tx_suspend(struct b43_wldev *dev);
-- void b43_pio_tx_resume(struct b43_wldev *dev);
--+#else
--+static inline int b43_pio_init(struct b43_wldev *dev)
--+{
--+	return 0;
--+}
--+
--+static inline void b43_pio_free(struct b43_wldev *dev)
--+{
--+}
--+
--+static inline int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
--+{
--+	return 0;
--+}
--+
--+static inline void b43_pio_handle_txstatus(struct b43_wldev *dev,
--+					   const struct b43_txstatus *status)
--+{
--+}
--+
--+static inline void b43_pio_rx(struct b43_pio_rxqueue *q)
--+{
--+}
--+
--+static inline void b43_pio_tx_suspend(struct b43_wldev *dev)
--+{
--+}
--+
--+static inline void b43_pio_tx_resume(struct b43_wldev *dev)
--+{
--+}
--+#endif /* CPTCFG_B43_PIO */
-- 
-- #endif /* B43_PIO_H_ */
----- a/drivers/net/wireless/b43/Kconfig
--+++ b/drivers/net/wireless/b43/Kconfig
--@@ -98,7 +98,7 @@ config B43_BCMA_PIO
-- 	default y
-- 
-- config B43_PIO
---	bool
--+	bool "Broadcom 43xx PIO support"
-- 	depends on B43
-- 	select SSB_BLOCKIO
-- 	default y
-diff --git a/package/mac80211/patches/820-b43-add-antenna-control.patch b/package/mac80211/patches/820-b43-add-antenna-control.patch
-deleted file mode 100644
-index dea9830..0000000
---- a/package/mac80211/patches/820-b43-add-antenna-control.patch
-+++ /dev/null
-@@ -1,131 +0,0 @@
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -1562,7 +1562,7 @@ static void b43_write_beacon_template(st
-- 				  len, ram_offset, shm_size_offset, rate);
-- 
-- 	/* Write the PHY TX control parameters. */
---	antenna = B43_ANTENNA_DEFAULT;
--+	antenna = dev->tx_antenna;
-- 	antenna = b43_antenna_to_phyctl(antenna);
-- 	ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
-- 	/* We can't send beacons with short preamble. Would get PHY errors. */
--@@ -3105,8 +3105,8 @@ static int b43_chip_init(struct b43_wlde
-- 
-- 	/* Select the antennae */
-- 	if (phy->ops->set_rx_antenna)
---		phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
---	b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
--+		phy->ops->set_rx_antenna(dev, dev->rx_antenna);
--+	b43_mgmtframe_txantenna(dev, dev->tx_antenna);
-- 
-- 	if (phy->type == B43_PHYTYPE_B) {
-- 		value16 = b43_read16(dev, 0x005E);
--@@ -3850,7 +3850,6 @@ static int b43_op_config(struct ieee8021
-- 	struct b43_wldev *dev;
-- 	struct b43_phy *phy;
-- 	struct ieee80211_conf *conf = &hw->conf;
---	int antenna;
-- 	int err = 0;
-- 	bool reload_bss = false;
-- 
--@@ -3904,11 +3903,9 @@ static int b43_op_config(struct ieee8021
-- 	}
-- 
-- 	/* Antennas for RX and management frame TX. */
---	antenna = B43_ANTENNA_DEFAULT;
---	b43_mgmtframe_txantenna(dev, antenna);
---	antenna = B43_ANTENNA_DEFAULT;
--+	b43_mgmtframe_txantenna(dev, dev->tx_antenna);
-- 	if (phy->ops->set_rx_antenna)
---		phy->ops->set_rx_antenna(dev, antenna);
--+		phy->ops->set_rx_antenna(dev, dev->rx_antenna);
-- 
-- 	if (wl->radio_enabled != phy->radio_on) {
-- 		if (wl->radio_enabled) {
--@@ -5041,6 +5038,47 @@ static int b43_op_get_survey(struct ieee
-- 	return 0;
-- }
-- 
--+static int b43_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
--+{
--+	struct b43_wl *wl = hw_to_b43_wl(hw);
--+	struct b43_wldev *dev = wl->current_dev;
--+
--+	if (tx_ant == 1 && rx_ant == 1) {
--+		dev->tx_antenna = B43_ANTENNA0;
--+		dev->rx_antenna = B43_ANTENNA0;
--+	}
--+	else if (tx_ant == 2 && rx_ant == 2) {
--+		dev->tx_antenna = B43_ANTENNA1;
--+		dev->rx_antenna = B43_ANTENNA1;
--+	}
--+	else if ((tx_ant & 3) == 3 && (rx_ant & 3) == 3) {
--+		dev->tx_antenna = B43_ANTENNA_DEFAULT;
--+		dev->rx_antenna = B43_ANTENNA_DEFAULT;
--+	}
--+	else {
--+		return -EINVAL;
--+	}
--+
--+	return 0;
--+}
--+
--+
--+static int b43_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
--+{
--+	struct b43_wl *wl = hw_to_b43_wl(hw);
--+	struct b43_wldev *dev = wl->current_dev;
--+
--+	switch (dev->tx_antenna) {
--+	case B43_ANTENNA0:
--+		*tx_ant = 1; *rx_ant = 1; break;
--+	case B43_ANTENNA1:
--+		*tx_ant = 2; *rx_ant = 2; break;
--+	case B43_ANTENNA_DEFAULT:
--+		*tx_ant = 3; *rx_ant = 3; break;
--+	}
--+	return 0;
--+}
--+
-- static const struct ieee80211_ops b43_hw_ops = {
-- 	.tx			= b43_op_tx,
-- 	.conf_tx		= b43_op_conf_tx,
--@@ -5062,6 +5100,8 @@ static const struct ieee80211_ops b43_hw
-- 	.sw_scan_complete	= b43_op_sw_scan_complete_notifier,
-- 	.get_survey		= b43_op_get_survey,
-- 	.rfkill_poll		= b43_rfkill_poll,
--+	.set_antenna		= b43_op_set_antenna,
--+	.get_antenna		= b43_op_get_antenna,
-- };
-- 
-- /* Hard-reset the chip. Do not call this directly.
--@@ -5308,6 +5348,8 @@ static int b43_one_core_attach(struct b4
-- 	if (!wldev)
-- 		goto out;
-- 
--+	wldev->rx_antenna = B43_ANTENNA_DEFAULT;
--+	wldev->tx_antenna = B43_ANTENNA_DEFAULT;
-- 	wldev->use_pio = b43_modparam_pio;
-- 	wldev->dev = dev;
-- 	wldev->wl = wl;
--@@ -5398,6 +5440,9 @@ static struct b43_wl *b43_wireless_init(
-- 
-- 	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
-- 
--+	hw->wiphy->available_antennas_rx = 0x3;
--+	hw->wiphy->available_antennas_tx = 0x3;
--+
-- 	wl->hw_registred = false;
-- 	hw->max_rates = 2;
-- 	SET_IEEE80211_DEV(hw, dev->dev);
----- a/drivers/net/wireless/b43/b43.h
--+++ b/drivers/net/wireless/b43/b43.h
--@@ -821,6 +821,8 @@ struct b43_wldev {
-- 	bool hwcrypto_enabled;		/* TRUE, if HW crypto acceleration is enabled. */
-- 	bool use_pio;			/* TRUE if next init should use PIO */
-- 	int gpiomask;			/* GPIO LED mask as a module parameter */
--+	int rx_antenna;			/* Used RX antenna (B43_ANTENNAxxx) */
--+	int tx_antenna;			/* Used TX antenna (B43_ANTENNAxxx) */
-- 
-- 	/* PHY/Radio device. */
-- 	struct b43_phy phy;
-diff --git a/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch b/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
-deleted file mode 100644
-index e76758c..0000000
---- a/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
-+++ /dev/null
-@@ -1,243 +0,0 @@
--From 4f214b1ead0af7439921637645cb63f378516175 Mon Sep 17 00:00:00 2001
--From: Hauke Mehrtens <hauke@hauke-m.de>
--Date: Sat, 21 Jan 2012 18:48:38 +0100
--Subject: [PATCH 33/34] b43: add workaround for b43 on pcie bus of bcm4716.
--
--bcm4716 (which includes 4717 & 4718), plus 4706 on PCIe can reorder
--transactions. As a fix, a read after write is performed on certain
--places in the code. Older chips and the newer 5357 family don't require
--this fix.
--This code is based on the brcmsmac driver.
--
--Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-----
-- drivers/net/wireless/b43/b43.h        |   26 ++++++++++++++++++++++++++
-- drivers/net/wireless/b43/bus.h        |   10 ++++++++++
-- drivers/net/wireless/b43/phy_common.c |    6 ++++++
-- drivers/net/wireless/b43/phy_n.c      |   10 +++++-----
-- 4 files changed, 47 insertions(+), 5 deletions(-)
--
----- a/drivers/net/wireless/b43/b43.h
--+++ b/drivers/net/wireless/b43/b43.h
--@@ -1061,6 +1061,31 @@ static inline bool b43_using_pio_transfe
-- 	return dev->__using_pio_transfers;
-- }
-- 
--+/*
--+ * bcm4716 (which includes 4717 & 4718), plus 4706 on PCIe can reorder
--+ * transactions. As a fix, a read after write is performed on certain places
--+ * in the code. Older chips and the newer 5357 family don't require this fix.
--+ */
--+#ifdef CONFIG_BCM47XX_BCMA
--+#include <asm/mach-bcm47xx/bcm47xx.h>
--+static inline void b43_wflush16(struct b43_wldev *dev, u16 offset, u16 value)
--+{
--+	if (b43_bus_host_is_pci(dev->dev) &&
--+	    bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA &&
--+	    bcm47xx_bus.bcma.bus.chipinfo.id == BCMA_CHIP_ID_BCM4716) {
--+		b43_write16(dev, offset, value);
--+		b43_read16(dev, offset);
--+	} else {
--+		b43_write16(dev, offset, value);
--+	}
--+}
--+#else
--+static inline void b43_wflush16(struct b43_wldev *dev, u16 offset, u16 value)
--+{
--+	b43_write16(dev, offset, value);
--+}
--+#endif
--+
-- /* Message printing */
-- __printf(2, 3) void b43info(struct b43_wl *wl, const char *fmt, ...);
-- __printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...);
----- a/drivers/net/wireless/b43/bus.h
--+++ b/drivers/net/wireless/b43/bus.h
--@@ -60,6 +60,16 @@ static inline bool b43_bus_host_is_sdio(
-- 	return (dev->bus_type == B43_BUS_SSB &&
-- 		dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO);
-- }
--+static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
--+{
--+	if (dev->bus_type == B43_BUS_SSB)
--+		return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
--+#ifdef CPTCFG_B43_BCMA
--+	if (dev->bus_type == B43_BUS_BCMA)
--+		return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI);
--+#endif
--+	return false;
--+}
-- 
-- struct b43_bus_dev *b43_bus_dev_bcma_init(struct bcma_device *core);
-- struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -4437,7 +4437,7 @@ static int b43_phy_versioning(struct b43
-- 		u16 radio24[3];
-- 
-- 		for (tmp = 0; tmp < 3; tmp++) {
---			b43_write16(dev, B43_MMIO_RADIO24_CONTROL, tmp);
--+			b43_wflush16(dev, B43_MMIO_RADIO24_CONTROL, tmp);
-- 			radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA);
-- 		}
-- 
--@@ -4456,10 +4456,10 @@ static int b43_phy_versioning(struct b43
-- 			else
-- 				tmp = 0x5205017F;
-- 		} else {
---			b43_write16(dev, B43_MMIO_RADIO_CONTROL,
--+			b43_wflush16(dev, B43_MMIO_RADIO_CONTROL,
-- 				    B43_RADIOCTL_ID);
-- 			tmp = b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
---			b43_write16(dev, B43_MMIO_RADIO_CONTROL,
--+			b43_wflush16(dev, B43_MMIO_RADIO_CONTROL,
-- 				    B43_RADIOCTL_ID);
-- 			tmp |= (u32)b43_read16(dev, B43_MMIO_RADIO_DATA_HIGH)
-- 				<< 16;
----- a/drivers/net/wireless/b43/phy_common.c
--+++ b/drivers/net/wireless/b43/phy_common.c
--@@ -266,6 +266,12 @@ void b43_phy_write(struct b43_wldev *dev
-- {
-- 	assert_mac_suspended(dev);
-- 	dev->phy.ops->phy_write(dev, reg, value);
--+#ifdef CONFIG_BCM47XX
--+	if (b43_bus_host_is_pci(dev->dev) && reg == 0x72) {
--+		b43_read16(dev, B43_MMIO_PHY_VER);
--+		return;
--+	}
--+#endif
-- 	if (++dev->phy.writes_counter == B43_MAX_WRITES_IN_ROW) {
-- 		b43_read16(dev, B43_MMIO_PHY_VER);
-- 		dev->phy.writes_counter = 0;
----- a/drivers/net/wireless/b43/phy_ht.c
--+++ b/drivers/net/wireless/b43/phy_ht.c
--@@ -1073,20 +1073,20 @@ static unsigned int b43_phy_ht_op_get_de
-- 
-- static u16 b43_phy_ht_op_read(struct b43_wldev *dev, u16 reg)
-- {
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	return b43_read16(dev, B43_MMIO_PHY_DATA);
-- }
-- 
-- static void b43_phy_ht_op_write(struct b43_wldev *dev, u16 reg, u16 value)
-- {
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_PHY_DATA, value);
-- }
-- 
-- static void b43_phy_ht_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask,
-- 				 u16 set)
-- {
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_PHY_DATA,
-- 		    (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set);
-- }
--@@ -1096,14 +1096,14 @@ static u16 b43_phy_ht_op_radio_read(stru
-- 	/* HT-PHY needs 0x200 for read access */
-- 	reg |= 0x200;
-- 
---	b43_write16(dev, B43_MMIO_RADIO24_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_RADIO24_CONTROL, reg);
-- 	return b43_read16(dev, B43_MMIO_RADIO24_DATA);
-- }
-- 
-- static void b43_phy_ht_op_radio_write(struct b43_wldev *dev, u16 reg,
-- 				      u16 value)
-- {
---	b43_write16(dev, B43_MMIO_RADIO24_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_RADIO24_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_RADIO24_DATA, value);
-- }
-- 
----- a/drivers/net/wireless/b43/phy_lcn.c
--+++ b/drivers/net/wireless/b43/phy_lcn.c
--@@ -845,20 +845,20 @@ static void b43_phy_lcn_op_adjust_txpowe
-- 
-- static u16 b43_phy_lcn_op_read(struct b43_wldev *dev, u16 reg)
-- {
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	return b43_read16(dev, B43_MMIO_PHY_DATA);
-- }
-- 
-- static void b43_phy_lcn_op_write(struct b43_wldev *dev, u16 reg, u16 value)
-- {
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_PHY_DATA, value);
-- }
-- 
-- static void b43_phy_lcn_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask,
-- 				   u16 set)
-- {
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_PHY_DATA,
-- 		    (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set);
-- }
--@@ -868,14 +868,14 @@ static u16 b43_phy_lcn_op_radio_read(str
-- 	/* LCN-PHY needs 0x200 for read access */
-- 	reg |= 0x200;
-- 
---	b43_write16(dev, B43_MMIO_RADIO24_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_RADIO24_CONTROL, reg);
-- 	return b43_read16(dev, B43_MMIO_RADIO24_DATA);
-- }
-- 
-- static void b43_phy_lcn_op_radio_write(struct b43_wldev *dev, u16 reg,
-- 				       u16 value)
-- {
---	b43_write16(dev, B43_MMIO_RADIO24_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_RADIO24_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_RADIO24_DATA, value);
-- }
-- 
----- a/drivers/net/wireless/b43/phy_n.c
--+++ b/drivers/net/wireless/b43/phy_n.c
--@@ -5418,14 +5418,14 @@ static inline void check_phyreg(struct b
-- static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg)
-- {
-- 	check_phyreg(dev, reg);
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	return b43_read16(dev, B43_MMIO_PHY_DATA);
-- }
-- 
-- static void b43_nphy_op_write(struct b43_wldev *dev, u16 reg, u16 value)
-- {
-- 	check_phyreg(dev, reg);
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_PHY_DATA, value);
-- }
-- 
--@@ -5433,7 +5433,7 @@ static void b43_nphy_op_maskset(struct b
-- 				 u16 set)
-- {
-- 	check_phyreg(dev, reg);
---	b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg);
-- 	b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
-- }
-- 
--@@ -5444,7 +5444,7 @@ static u16 b43_nphy_op_radio_read(struct
-- 	/* N-PHY needs 0x100 for read access */
-- 	reg |= 0x100;
-- 
---	b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_RADIO_CONTROL, reg);
-- 	return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
-- }
-- 
--@@ -5453,7 +5453,7 @@ static void b43_nphy_op_radio_write(stru
-- 	/* Register 1 is a 32-bit register. */
-- 	B43_WARN_ON(reg == 1);
-- 
---	b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
--+	b43_wflush16(dev, B43_MMIO_RADIO_CONTROL, reg);
-- 	b43_write16(dev, B43_MMIO_RADIO_DATA_LOW, value);
-- }
-- 
-diff --git a/package/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch b/package/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch
-deleted file mode 100644
-index 9c51ac6..0000000
---- a/package/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/b43/dma.h
--+++ b/drivers/net/wireless/b43/dma.h
--@@ -169,7 +169,7 @@ struct b43_dmadesc_generic {
-- 
-- /* DMA engine tuning knobs */
-- #define B43_TXRING_SLOTS		256
---#define B43_RXRING_SLOTS		256
--+#define B43_RXRING_SLOTS		32
-- #define B43_DMA0_RX_FW598_BUFSIZE	(B43_DMA0_RX_FW598_FO + IEEE80211_MAX_FRAME_LEN)
-- #define B43_DMA0_RX_FW351_BUFSIZE	(B43_DMA0_RX_FW351_FO + IEEE80211_MAX_FRAME_LEN)
-- 
-diff --git a/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch b/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
-deleted file mode 100644
-index 50347cd..0000000
---- a/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
-+++ /dev/null
-@@ -1,17 +0,0 @@
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -2764,6 +2764,14 @@ static int b43_gpio_init(struct b43_wlde
-- 	} else if (dev->dev->chip_id == 0x5354) {
-- 		/* Don't allow overtaking buttons GPIOs */
-- 		set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
--+	} else if (dev->dev->chip_id == BCMA_CHIP_ID_BCM4716 || 
--+		   dev->dev->chip_id == BCMA_CHIP_ID_BCM47162 ||
--+		   dev->dev->chip_id == BCMA_CHIP_ID_BCM5356 ||
--+		   dev->dev->chip_id == BCMA_CHIP_ID_BCM5357 ||
--+		   dev->dev->chip_id == BCMA_CHIP_ID_BCM53572) {
--+		/* just use gpio 0 and 1 for 2.4 GHz wifi led */
--+		set &= 0x3;
--+		mask &= 0x3;
-- 	}
-- 
-- 	if (0 /* FIXME: conditional unknown */ ) {
-diff --git a/package/mac80211/patches/847-b43-always-take-overlapping-devs.patch b/package/mac80211/patches/847-b43-always-take-overlapping-devs.patch
-deleted file mode 100644
-index 9d1d419..0000000
---- a/package/mac80211/patches/847-b43-always-take-overlapping-devs.patch
-+++ /dev/null
-@@ -1,11 +0,0 @@
----- a/drivers/net/wireless/b43/main.c
--+++ b/drivers/net/wireless/b43/main.c
--@@ -118,7 +118,7 @@ static int b43_modparam_pio = 0;
-- module_param_named(pio, b43_modparam_pio, int, 0644);
-- MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
-- 
---static int modparam_allhwsupport = !IS_ENABLED(CPTCFG_BRCMSMAC);
--+static int modparam_allhwsupport = 1;
-- module_param_named(allhwsupport, modparam_allhwsupport, int, 0444);
-- MODULE_PARM_DESC(allhwsupport, "Enable support for all hardware (even it if overlaps with the brcmsmac driver)");
-- 
-diff --git a/package/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch b/package/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch
-deleted file mode 100644
-index 185c427..0000000
---- a/package/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch
-+++ /dev/null
-@@ -1,27 +0,0 @@
----- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
--+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
--@@ -58,19 +58,12 @@
-- 				 (((c) < 149) ? 3 : 4))))
-- 
-- #define BRCM_2GHZ_2412_2462	REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
---#define BRCM_2GHZ_2467_2472	REG_RULE(2467-10, 2472+10, 20, 0, 19, \
---					 NL80211_RRF_NO_IR)
--+#define BRCM_2GHZ_2467_2472	REG_RULE(2467-10, 2472+10, 20, 0, 19, 0)
-- 
---#define BRCM_5GHZ_5180_5240	REG_RULE(5180-10, 5240+10, 40, 0, 21, \
---					 NL80211_RRF_NO_IR)
---#define BRCM_5GHZ_5260_5320	REG_RULE(5260-10, 5320+10, 40, 0, 21, \
---					 NL80211_RRF_DFS | \
---					 NL80211_RRF_NO_IR)
---#define BRCM_5GHZ_5500_5700	REG_RULE(5500-10, 5700+10, 40, 0, 21, \
---					 NL80211_RRF_DFS | \
---					 NL80211_RRF_NO_IR)
---#define BRCM_5GHZ_5745_5825	REG_RULE(5745-10, 5825+10, 40, 0, 21, \
---					 NL80211_RRF_NO_IR)
--+#define BRCM_5GHZ_5180_5240	REG_RULE(5180-10, 5240+10, 40, 0, 21, 0)
--+#define BRCM_5GHZ_5260_5320	REG_RULE(5260-10, 5320+10, 40, 0, 21, 0)
--+#define BRCM_5GHZ_5500_5700	REG_RULE(5500-10, 5700+10, 40, 0, 21, 0)
--+#define BRCM_5GHZ_5745_5825	REG_RULE(5745-10, 5825+10, 40, 0, 21, 0)
-- 
-- static const struct ieee80211_regdomain brcms_regdom_x2 = {
-- 	.n_reg_rules = 6,
-diff --git a/package/mac80211/patches/900-wl1251-split-wl251-platform-data-to-a-separate-structure.patch b/package/mac80211/patches/900-wl1251-split-wl251-platform-data-to-a-separate-structure.patch
-deleted file mode 100644
-index a8af257..0000000
---- a/package/mac80211/patches/900-wl1251-split-wl251-platform-data-to-a-separate-structure.patch
-+++ /dev/null
-@@ -1,109 +0,0 @@
--Move the wl1251 part of the wl12xx platform data structure into a new
--structure specifically for wl1251.  Change the platform data built-in
--block and board files accordingly.
--
--Cc: Tony Lindgren <tony@atomide.com>
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Acked-by: Tony Lindgren <tony@atomide.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wilink_platform_data.c
--+++ b/drivers/net/wireless/ti/wilink_platform_data.c
--@@ -23,17 +23,17 @@
-- #include <linux/err.h>
-- #include <linux/wl12xx.h>
-- 
---static struct wl12xx_platform_data *platform_data;
--+static struct wl12xx_platform_data *wl12xx_platform_data;
-- 
-- int __init wl12xx_set_platform_data(const struct wl12xx_platform_data *data)
-- {
---	if (platform_data)
--+	if (wl12xx_platform_data)
-- 		return -EBUSY;
-- 	if (!data)
-- 		return -EINVAL;
-- 
---	platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
---	if (!platform_data)
--+	wl12xx_platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
--+	if (!wl12xx_platform_data)
-- 		return -ENOMEM;
-- 
-- 	return 0;
--@@ -41,9 +41,34 @@ int __init wl12xx_set_platform_data(cons
-- 
-- struct wl12xx_platform_data *wl12xx_get_platform_data(void)
-- {
---	if (!platform_data)
--+	if (!wl12xx_platform_data)
-- 		return ERR_PTR(-ENODEV);
-- 
---	return platform_data;
--+	return wl12xx_platform_data;
-- }
-- EXPORT_SYMBOL(wl12xx_get_platform_data);
--+
--+static struct wl1251_platform_data *wl1251_platform_data;
--+
--+int __init wl1251_set_platform_data(const struct wl1251_platform_data *data)
--+{
--+	if (wl1251_platform_data)
--+		return -EBUSY;
--+	if (!data)
--+		return -EINVAL;
--+
--+	wl1251_platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
--+	if (!wl1251_platform_data)
--+		return -ENOMEM;
--+
--+	return 0;
--+}
--+
--+struct wl1251_platform_data *wl1251_get_platform_data(void)
--+{
--+	if (!wl1251_platform_data)
--+		return ERR_PTR(-ENODEV);
--+
--+	return wl1251_platform_data;
--+}
--+EXPORT_SYMBOL(wl1251_get_platform_data);
----- a/drivers/net/wireless/ti/wl1251/sdio.c
--+++ b/drivers/net/wireless/ti/wl1251/sdio.c
--@@ -227,7 +227,7 @@ static int wl1251_sdio_probe(struct sdio
-- 	struct wl1251 *wl;
-- 	struct ieee80211_hw *hw;
-- 	struct wl1251_sdio *wl_sdio;
---	const struct wl12xx_platform_data *wl12xx_board_data;
--+	const struct wl1251_platform_data *wl1251_board_data;
-- 
-- 	hw = wl1251_alloc_hw();
-- 	if (IS_ERR(hw))
--@@ -254,11 +254,11 @@ static int wl1251_sdio_probe(struct sdio
-- 	wl->if_priv = wl_sdio;
-- 	wl->if_ops = &wl1251_sdio_ops;
-- 
---	wl12xx_board_data = wl12xx_get_platform_data();
---	if (!IS_ERR(wl12xx_board_data)) {
---		wl->set_power = wl12xx_board_data->set_power;
---		wl->irq = wl12xx_board_data->irq;
---		wl->use_eeprom = wl12xx_board_data->use_eeprom;
--+	wl1251_board_data = wl1251_get_platform_data();
--+	if (!IS_ERR(wl1251_board_data)) {
--+		wl->set_power = wl1251_board_data->set_power;
--+		wl->irq = wl1251_board_data->irq;
--+		wl->use_eeprom = wl1251_board_data->use_eeprom;
-- 	}
-- 
-- 	if (wl->irq) {
----- a/drivers/net/wireless/ti/wl1251/spi.c
--+++ b/drivers/net/wireless/ti/wl1251/spi.c
--@@ -241,7 +241,7 @@ static const struct wl1251_if_operations
-- 
-- static int wl1251_spi_probe(struct spi_device *spi)
-- {
---	struct wl12xx_platform_data *pdata;
--+	struct wl1251_platform_data *pdata;
-- 	struct ieee80211_hw *hw;
-- 	struct wl1251 *wl;
-- 	int ret;
-diff --git a/package/mac80211/patches/901-wlcore-set-irq_flags-in-the-board-files.patch b/package/mac80211/patches/901-wlcore-set-irq_flags-in-the-board-files.patch
-deleted file mode 100644
-index f2789a9..0000000
---- a/package/mac80211/patches/901-wlcore-set-irq_flags-in-the-board-files.patch
-+++ /dev/null
-@@ -1,118 +0,0 @@
--The platform_quirk element in the platform data was used to change the
--way the IRQ is triggered.  When set, the EDGE_IRQ quirk would change
--the irqflags used and treat edge trigger differently from the rest.
--
--Instead of hiding this irq flag setting behind the quirk, have the
--board files set the flags during initialization.  This will be more
--meaningful than driver-specific quirks when we switch to DT.
--
--Additionally, fix missing gpio_request() calls in the boarding files
--(so that setting the flags actually works).
--
--Cc: Tony Lindgren <tony@atomide.com>
--Cc: Sekhar Nori <nsekhar@ti.com>
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--Acked-by: Sekhar Nori <nsekhar@ti.com>
--
----- a/drivers/net/wireless/ti/wlcore/debugfs.c
--+++ b/drivers/net/wireless/ti/wlcore/debugfs.c
--@@ -502,7 +502,7 @@ static ssize_t driver_state_read(struct 
-- 	DRIVER_STATE_PRINT_HEX(irq);
-- 	/* TODO: ref_clock and tcxo_clock were moved to wl12xx priv */
-- 	DRIVER_STATE_PRINT_HEX(hw_pg_ver);
---	DRIVER_STATE_PRINT_HEX(platform_quirks);
--+	DRIVER_STATE_PRINT_HEX(irq_flags);
-- 	DRIVER_STATE_PRINT_HEX(chip.id);
-- 	DRIVER_STATE_PRINT_STR(chip.fw_ver_str);
-- 	DRIVER_STATE_PRINT_STR(chip.phy_fw_ver_str);
----- a/drivers/net/wireless/ti/wlcore/main.c
--+++ b/drivers/net/wireless/ti/wlcore/main.c
--@@ -27,6 +27,7 @@
-- #include <linux/vmalloc.h>
-- #include <linux/wl12xx.h>
-- #include <linux/interrupt.h>
--+#include <linux/irq.h>
-- 
-- #include "wlcore.h"
-- #include "debug.h"
--@@ -528,7 +529,7 @@ static int wlcore_irq_locked(struct wl12
-- 	 * In case edge triggered interrupt must be used, we cannot iterate
-- 	 * more than once without introducing race conditions with the hardirq.
-- 	 */
---	if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
--+	if (wl->irq_flags & IRQF_TRIGGER_RISING)
-- 		loopcount = 1;
-- 
-- 	wl1271_debug(DEBUG_IRQ, "IRQ work");
--@@ -5934,7 +5935,6 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
-- 	wl->ap_ps_map = 0;
-- 	wl->ap_fw_ps_map = 0;
-- 	wl->quirks = 0;
---	wl->platform_quirks = 0;
-- 	wl->system_hlid = WL12XX_SYSTEM_HLID;
-- 	wl->active_sta_count = 0;
-- 	wl->active_link_count = 0;
--@@ -6075,7 +6075,7 @@ static void wlcore_nvs_cb(const struct f
-- 	struct platform_device *pdev = wl->pdev;
-- 	struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
-- 	struct wl12xx_platform_data *pdata = pdev_data->pdata;
---	unsigned long irqflags;
--+
-- 	int ret;
-- 	irq_handler_t hardirq_fn = NULL;
-- 
--@@ -6103,29 +6103,19 @@ static void wlcore_nvs_cb(const struct f
-- 	wlcore_adjust_conf(wl);
-- 
-- 	wl->irq = platform_get_irq(pdev, 0);
---	wl->platform_quirks = pdata->platform_quirks;
-- 	wl->if_ops = pdev_data->if_ops;
-- 
---#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
---	irqflags = IRQF_TRIGGER_RISING;
--+	wl->irq_flags = irq_get_trigger_type(wl->irq) | IRQF_ONESHOT;
-- 	hardirq_fn = wlcore_hardirq;
---#else
---	if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) {
---		irqflags = IRQF_TRIGGER_RISING;
---		hardirq_fn = wlcore_hardirq;
---	} else {
---		irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT;
---	}
---#endif
-- 
-- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
-- 	ret = compat_request_threaded_irq(&wl->irq_compat, wl->irq,
-- 					  hardirq_fn, wlcore_irq,
---					  irqflags,
--+					  wl->irqflags,
-- 					  pdev->name, wl);
-- #else
-- 	ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
---				   irqflags, pdev->name, wl);
--+				   wl->irq_flags, pdev->name, wl);
-- #endif
-- 	if (ret < 0) {
-- 		wl1271_error("request_irq() failed: %d", ret);
----- a/drivers/net/wireless/ti/wlcore/wlcore.h
--+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
--@@ -188,6 +188,8 @@ struct wl1271 {
-- 
-- 	int irq;
-- 
--+	int irq_flags;
--+
-- 	spinlock_t wl_lock;
-- 
-- 	enum wlcore_state state;
--@@ -395,9 +397,6 @@ struct wl1271 {
-- 	/* Quirks of specific hardware revisions */
-- 	unsigned int quirks;
-- 
---	/* Platform limitations */
---	unsigned int platform_quirks;
---
-- 	/* number of currently active RX BA sessions */
-- 	int ba_rx_session_count;
-- 
-diff --git a/package/mac80211/patches/902-wlcore-remove-pwr_in_suspend-from-platform-data.patch b/package/mac80211/patches/902-wlcore-remove-pwr_in_suspend-from-platform-data.patch
-deleted file mode 100644
-index 6394377..0000000
---- a/package/mac80211/patches/902-wlcore-remove-pwr_in_suspend-from-platform-data.patch
-+++ /dev/null
-@@ -1,48 +0,0 @@
--The pwr_in_suspend flag depends on the MMC settings which can be
--retrieved from the SDIO subsystem, so it doesn't need to be part of
--the platform data structure.  Move it to the platform device data that
--is passed from SDIO to wlcore.
--
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wlcore/main.c
--+++ b/drivers/net/wireless/ti/wlcore/main.c
--@@ -6074,7 +6074,6 @@ static void wlcore_nvs_cb(const struct f
-- 	struct wl1271 *wl = context;
-- 	struct platform_device *pdev = wl->pdev;
-- 	struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
---	struct wl12xx_platform_data *pdata = pdev_data->pdata;
-- 
-- 	int ret;
-- 	irq_handler_t hardirq_fn = NULL;
--@@ -6127,7 +6126,7 @@ static void wlcore_nvs_cb(const struct f
-- 	if (!ret) {
-- 		wl->irq_wake_enabled = true;
-- 		device_init_wakeup(wl->dev, 1);
---		if (pdata->pwr_in_suspend)
--+		if (pdev_data->pwr_in_suspend)
-- 			wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
-- 	}
-- #endif
----- a/drivers/net/wireless/ti/wlcore/sdio.c
--+++ b/drivers/net/wireless/ti/wlcore/sdio.c
--@@ -260,7 +260,7 @@ static int wl1271_probe(struct sdio_func
-- 	dev_dbg(glue->dev, "sdio PM caps = 0x%x\n", mmcflags);
-- 
-- 	if (mmcflags & MMC_PM_KEEP_POWER)
---		pdev_data->pdata->pwr_in_suspend = true;
--+		pdev_data->pwr_in_suspend = true;
-- 
-- 	sdio_set_drvdata(func, glue);
-- 
----- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
--+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
--@@ -209,6 +209,7 @@ struct wl1271_if_operations {
-- struct wlcore_platdev_data {
-- 	struct wl12xx_platform_data *pdata;
-- 	struct wl1271_if_operations *if_ops;
--+	bool pwr_in_suspend;
-- };
-- 
-- #define MAX_NUM_KEYS 14
-diff --git a/package/mac80211/patches/903-wl12xx-use-frequency-instead-of-enumerations-for-pdata-clocks.patch b/package/mac80211/patches/903-wl12xx-use-frequency-instead-of-enumerations-for-pdata-clocks.patch
-deleted file mode 100644
-index 4b20932..0000000
---- a/package/mac80211/patches/903-wl12xx-use-frequency-instead-of-enumerations-for-pdata-clocks.patch
-+++ /dev/null
-@@ -1,131 +0,0 @@
--Instead of defining an enumeration with the FW specific values for the
--different clock rates, use the actual frequency instead.  Also add a
--boolean to specify whether the clock is XTAL or not.
--
--Change all board files to reflect this.
--
--Additionally, this reverts commit 26f45c (ARM: OMAP2+: Legacy support
--for wl12xx when booted with devicetree), since this is not be needed
--anymore, now that DT support for WiLink is implemented.
--
--Cc: Tony Lindgren <tony@atomide.com>
--Cc: Sekhar Nori <nsekhar@ti.com>
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wl12xx/main.c
--+++ b/drivers/net/wireless/ti/wl12xx/main.c
--@@ -1711,6 +1711,43 @@ static struct ieee80211_sta_ht_cap wl12x
-- 		},
-- };
-- 
--+static const struct wl12xx_clock wl12xx_refclock_table[] = {
--+	{ 19200000,	false,	WL12XX_REFCLOCK_19	},
--+	{ 26000000,	false,	WL12XX_REFCLOCK_26	},
--+	{ 26000000,	true,	WL12XX_REFCLOCK_26_XTAL	},
--+	{ 38400000,	false,	WL12XX_REFCLOCK_38	},
--+	{ 38400000,	true,	WL12XX_REFCLOCK_38_XTAL	},
--+	{ 52000000,	false,	WL12XX_REFCLOCK_52	},
--+	{ 0,		false,	0 }
--+};
--+
--+static const struct wl12xx_clock wl12xx_tcxoclock_table[] = {
--+	{ 16368000,	true,	WL12XX_TCXOCLOCK_16_368	},
--+	{ 16800000,	true,	WL12XX_TCXOCLOCK_16_8	},
--+	{ 19200000,	true,	WL12XX_TCXOCLOCK_19_2	},
--+	{ 26000000,	true,	WL12XX_TCXOCLOCK_26	},
--+	{ 32736000,	true,	WL12XX_TCXOCLOCK_32_736	},
--+	{ 33600000,	true,	WL12XX_TCXOCLOCK_33_6	},
--+	{ 38400000,	true,	WL12XX_TCXOCLOCK_38_4	},
--+	{ 52000000,	true,	WL12XX_TCXOCLOCK_52	},
--+	{ 0,		false,	0 }
--+};
--+
--+static int wl12xx_get_clock_idx(const struct wl12xx_clock *table,
--+				u32 freq, bool xtal)
--+{
--+	int i = 0;
--+
--+	while(table[i].freq != 0) {
--+		if ((table[i].freq == freq) &&
--+		    (table[i].xtal == xtal))
--+			return table[i].hw_idx;
--+		i++;
--+	};
--+
--+	return -EINVAL;
--+}
--+
-- static int wl12xx_setup(struct wl1271 *wl)
-- {
-- 	struct wl12xx_priv *priv = wl->priv;
--@@ -1732,7 +1769,16 @@ static int wl12xx_setup(struct wl1271 *w
-- 	wl12xx_conf_init(wl);
-- 
-- 	if (!fref_param) {
---		priv->ref_clock = pdata->board_ref_clock;
--+		priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
--+						       pdata->ref_clock_freq,
--+						       pdata->ref_clock_xtal);
--+		if (priv->ref_clock < 0) {
--+			wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
--+				pdata->ref_clock_freq,
--+				pdata->ref_clock_xtal ? "XTAL" : "not XTAL");
--+
--+			return priv->ref_clock;
--+		}
-- 	} else {
-- 		if (!strcmp(fref_param, "19.2"))
-- 			priv->ref_clock = WL12XX_REFCLOCK_19;
--@@ -1751,7 +1797,15 @@ static int wl12xx_setup(struct wl1271 *w
-- 	}
-- 
-- 	if (!tcxo_param) {
---		priv->tcxo_clock = pdata->board_tcxo_clock;
--+		priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
--+							pdata->tcxo_clock_freq,
--+							true);
--+		if (priv->tcxo_clock < 0) {
--+			wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
--+				pdata->tcxo_clock_freq);
--+
--+			return priv->tcxo_clock;
--+		}
-- 	} else {
-- 		if (!strcmp(tcxo_param, "19.2"))
-- 			priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
----- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
--+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
--@@ -79,4 +79,32 @@ struct wl12xx_priv {
-- 	struct wl127x_rx_mem_pool_addr *rx_mem_addr;
-- };
-- 
--+/* Reference clock values */
--+enum {
--+	WL12XX_REFCLOCK_19	= 0, /* 19.2 MHz */
--+	WL12XX_REFCLOCK_26	= 1, /* 26 MHz */
--+	WL12XX_REFCLOCK_38	= 2, /* 38.4 MHz */
--+	WL12XX_REFCLOCK_52	= 3, /* 52 MHz */
--+	WL12XX_REFCLOCK_38_XTAL = 4, /* 38.4 MHz, XTAL */
--+	WL12XX_REFCLOCK_26_XTAL = 5, /* 26 MHz, XTAL */
--+};
--+
--+/* TCXO clock values */
--+enum {
--+	WL12XX_TCXOCLOCK_19_2	= 0, /* 19.2MHz */
--+	WL12XX_TCXOCLOCK_26	= 1, /* 26 MHz */
--+	WL12XX_TCXOCLOCK_38_4	= 2, /* 38.4MHz */
--+	WL12XX_TCXOCLOCK_52	= 3, /* 52 MHz */
--+	WL12XX_TCXOCLOCK_16_368	= 4, /* 16.368 MHz */
--+	WL12XX_TCXOCLOCK_32_736	= 5, /* 32.736 MHz */
--+	WL12XX_TCXOCLOCK_16_8	= 6, /* 16.8 MHz */
--+	WL12XX_TCXOCLOCK_33_6	= 7, /* 33.6 MHz */
--+};
--+
--+struct wl12xx_clock {
--+	u32	freq;
--+	bool	xtal;
--+	u8	hw_idx;
--+};
--+
-- #endif /* __WL12XX_PRIV_H__ */
-diff --git a/package/mac80211/patches/904-wlcore-add-initial-device-tree-support-to-the-sdio-module.patch b/package/mac80211/patches/904-wlcore-add-initial-device-tree-support-to-the-sdio-module.patch
-deleted file mode 100644
-index 9e1d190..0000000
---- a/package/mac80211/patches/904-wlcore-add-initial-device-tree-support-to-the-sdio-module.patch
-+++ /dev/null
-@@ -1,118 +0,0 @@
--If platform data is not available, try to get the required information
--from the device tree.  Register an OF match table and parse the
--appropriate device tree nodes.
--
--Parse interrupt property only, for now.
--
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wlcore/sdio.c
--+++ b/drivers/net/wireless/ti/wlcore/sdio.c
--@@ -30,7 +30,7 @@
-- #include <linux/mmc/sdio_ids.h>
-- #include <linux/mmc/card.h>
-- #include <linux/mmc/host.h>
---#include <linux/gpio.h>
--+#include <linux/of_irq.h>
-- #include <linux/wl12xx.h>
-- #include <linux/pm_runtime.h>
-- #include <linux/printk.h>
--@@ -214,6 +214,43 @@ static struct wl1271_if_operations sdio_
-- 	.set_block_size = wl1271_sdio_set_block_size,
-- };
-- 
--+static struct wl12xx_platform_data *wlcore_get_pdata_from_of(struct device *dev)
--+{
--+	struct wl12xx_platform_data *pdata;
--+	struct device_node *np = dev->of_node;
--+
--+	if (!np) {
--+		np = of_find_matching_node(NULL, dev->driver->of_match_table);
--+		if (!np) {
--+			dev_notice(dev, "device tree node not available\n");
--+			pdata = ERR_PTR(-ENODEV);
--+			goto out;
--+		}
--+	}
--+
--+	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
--+	if (!pdata) {
--+		dev_err(dev, "can't allocate platform data\n");
--+		pdata = ERR_PTR(-ENODEV);
--+		goto out;
--+	}
--+
--+	pdata->irq = irq_of_parse_and_map(np, 0);
--+	if (pdata->irq < 0) {
--+		dev_err(dev, "can't get interrupt gpio from the device tree\n");
--+		goto out_free;
--+	}
--+
--+	goto out;
--+
--+out_free:
--+	kfree(pdata);
--+	pdata = ERR_PTR(-ENODEV);
--+
--+out:
--+	return pdata;
--+}
--+
-- static int wl1271_probe(struct sdio_func *func,
-- 				  const struct sdio_device_id *id)
-- {
--@@ -248,11 +285,22 @@ static int wl1271_probe(struct sdio_func
-- 	/* Use block mode for transferring over one block size of data */
-- 	func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
-- 
--+	/* The pdata allocated here is freed when the device is freed,
--+	 * so we don't need an additional out label to free it in case
--+	 * of error further on.
--+	 */
--+
--+	/* Try to get legacy platform data from the board file */
-- 	pdev_data->pdata = wl12xx_get_platform_data();
-- 	if (IS_ERR(pdev_data->pdata)) {
---		ret = PTR_ERR(pdev_data->pdata);
---		dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
---		goto out_free_glue;
--+		dev_info(&func->dev,
--+			 "legacy platform data not found, trying device tree\n");
--+
--+		pdev_data->pdata = wlcore_get_pdata_from_of(&func->dev);
--+		if (IS_ERR(pdev_data->pdata)) {
--+			dev_err(&func->dev, "can't get platform data\n");
--+			goto out_free_glue;
--+		}
-- 	}
-- 
-- 	/* if sdio can keep power while host is suspended, enable wow */
--@@ -386,16 +434,25 @@ static const struct dev_pm_ops wl1271_sd
-- };
-- #endif
-- 
--+static const struct of_device_id wlcore_sdio_of_match_table[] = {
--+	{ .compatible = "ti,wilink6" },
--+	{ .compatible = "ti,wilink7" },
--+	{ .compatible = "ti,wilink8" },
--+	{ }
--+};
--+MODULE_DEVICE_TABLE(of, wlcore_sdio_of_match_table);
--+
-- static struct sdio_driver wl1271_sdio_driver = {
-- 	.name		= "wl1271_sdio",
-- 	.id_table	= wl1271_devices,
-- 	.probe		= wl1271_probe,
-- 	.remove		= wl1271_remove,
---#ifdef CONFIG_PM
-- 	.drv = {
--+#ifdef CONFIG_PM
-- 		.pm = &wl1271_sdio_pm_ops,
---	},
-- #endif
--+		.of_match_table = of_match_ptr(wlcore_sdio_of_match_table),
--+	},
-- };
-- 
-- static int __init wl1271_init(void)
-diff --git a/package/mac80211/patches/905-wlcore-sdio-add-wilink-clock-providers.patch b/package/mac80211/patches/905-wlcore-sdio-add-wilink-clock-providers.patch
-deleted file mode 100644
-index be1f9ad..0000000
---- a/package/mac80211/patches/905-wlcore-sdio-add-wilink-clock-providers.patch
-+++ /dev/null
-@@ -1,50 +0,0 @@
--Add refclock and tcxoclock as clock providers in WiLink.  These clocks
--are not accesible outside the WiLink module, but they are registered
--in the clock framework anyway.  Only the WiLink chip consumes these
--clocks.
--
--In theory, the WiLink chip could be connected to external clocks
--instead of using these internal clocks, so make the clock consumer
--code generic enough.  If external clocks are used, then the internal
--clock device tree nodes are not necessary, but the external ones must
--be specified.
--
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wlcore/sdio.c
--+++ b/drivers/net/wireless/ti/wlcore/sdio.c
--@@ -34,6 +34,7 @@
-- #include <linux/wl12xx.h>
-- #include <linux/pm_runtime.h>
-- #include <linux/printk.h>
--+#include <linux/clk-provider.h>
-- 
-- #include "wlcore.h"
-- #include "wl12xx_80211.h"
--@@ -214,10 +215,15 @@ static struct wl1271_if_operations sdio_
-- 	.set_block_size = wl1271_sdio_set_block_size,
-- };
-- 
--+static const struct of_device_id wlcore_sdio_of_clk_match_table[] = {
--+	{ .compatible = "ti,wilink-clock" },
--+};
--+
-- static struct wl12xx_platform_data *wlcore_get_pdata_from_of(struct device *dev)
-- {
-- 	struct wl12xx_platform_data *pdata;
-- 	struct device_node *np = dev->of_node;
--+	struct device_node *clock_node;
-- 
-- 	if (!np) {
-- 		np = of_find_matching_node(NULL, dev->driver->of_match_table);
--@@ -241,6 +247,9 @@ static struct wl12xx_platform_data *wlco
-- 		goto out_free;
-- 	}
-- 
--+	for_each_matching_node(clock_node, wlcore_sdio_of_clk_match_table)
--+		of_fixed_clk_setup(clock_node);
--+
-- 	goto out;
-- 
-- out_free:
-diff --git a/package/mac80211/patches/906-wlcore-sdio-get-clocks-from-device-tree.patch b/package/mac80211/patches/906-wlcore-sdio-get-clocks-from-device-tree.patch
-deleted file mode 100644
-index 09ff4af..0000000
---- a/package/mac80211/patches/906-wlcore-sdio-get-clocks-from-device-tree.patch
-+++ /dev/null
-@@ -1,90 +0,0 @@
--Read the clock nodes from the device tree and use them to set the
--frequency for the refclock and the tcxo clock.
--
--Also, call sdio_set_drvdata() earlier, so the glue is already set in
--the driver data when we call wlcore_get_pdata_from_of() and we don't
--need to pass it as a parameter.
--
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wlcore/sdio.c
--+++ b/drivers/net/wireless/ti/wlcore/sdio.c
--@@ -53,6 +53,7 @@ static bool dump = false;
-- struct wl12xx_sdio_glue {
-- 	struct device *dev;
-- 	struct platform_device *core;
--+	struct clk *refclock, *tcxoclock;
-- };
-- 
-- static const struct sdio_device_id wl1271_devices[] = {
--@@ -224,6 +225,7 @@ static struct wl12xx_platform_data *wlco
-- 	struct wl12xx_platform_data *pdata;
-- 	struct device_node *np = dev->of_node;
-- 	struct device_node *clock_node;
--+	struct wl12xx_sdio_glue *glue = sdio_get_drvdata(dev_to_sdio_func(dev));
-- 
-- 	if (!np) {
-- 		np = of_find_matching_node(NULL, dev->driver->of_match_table);
--@@ -250,6 +252,26 @@ static struct wl12xx_platform_data *wlco
-- 	for_each_matching_node(clock_node, wlcore_sdio_of_clk_match_table)
-- 		of_fixed_clk_setup(clock_node);
-- 
--+	/* TODO: make sure we have this when needed (ie. for WL6 and WL7) */
--+	glue->refclock = of_clk_get_by_name(np, "refclock");
--+	if (IS_ERR(glue->refclock)) {
--+		dev_err(dev, "couldn't find refclock on the device tree\n");
--+		glue->refclock = NULL;
--+	} else {
--+		clk_prepare_enable(glue->refclock);
--+		pdata->ref_clock_freq = clk_get_rate(glue->refclock);
--+	}
--+
--+	/* TODO: make sure we have this when needed (ie. for WL7) */
--+	glue->tcxoclock = of_clk_get_by_name(np, "tcxoclock");
--+	if (IS_ERR(glue->tcxoclock)) {
--+		dev_err(dev, "couldn't find tcxoclock on the device tree\n");
--+		glue->tcxoclock = NULL;
--+	} else {
--+		clk_prepare_enable(glue->tcxoclock);
--+		pdata->ref_clock_freq = clk_get_rate(glue->tcxoclock);
--+	}
--+
-- 	goto out;
-- 
-- out_free:
--@@ -294,6 +316,8 @@ static int wl1271_probe(struct sdio_func
-- 	/* Use block mode for transferring over one block size of data */
-- 	func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
-- 
--+	sdio_set_drvdata(func, glue);
--+
-- 	/* The pdata allocated here is freed when the device is freed,
-- 	 * so we don't need an additional out label to free it in case
-- 	 * of error further on.
--@@ -319,8 +343,6 @@ static int wl1271_probe(struct sdio_func
-- 	if (mmcflags & MMC_PM_KEEP_POWER)
-- 		pdev_data->pwr_in_suspend = true;
-- 
---	sdio_set_drvdata(func, glue);
---
-- 	/* Tell PM core that we don't need the card to be powered now */
-- 	pm_runtime_put_noidle(&func->dev);
-- 
--@@ -387,6 +409,16 @@ static void wl1271_remove(struct sdio_fu
-- {
-- 	struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
-- 
--+	if (glue->refclock) {
--+		clk_disable_unprepare(glue->refclock);
--+		clk_put(glue->refclock);
--+	}
--+
--+	if (glue->tcxoclock) {
--+		clk_disable_unprepare(glue->tcxoclock);
--+		clk_put(glue->tcxoclock);
--+	}
--+
-- 	/* Undo decrement done above in wl1271_probe */
-- 	pm_runtime_get_noresume(&func->dev);
-- 
-diff --git a/package/mac80211/patches/907-wlcore-wl12xx-check-if-we-got-correct-clock-data-from-DT.patch b/package/mac80211/patches/907-wlcore-wl12xx-check-if-we-got-correct-clock-data-from-DT.patch
-deleted file mode 100644
-index 6b09177..0000000
---- a/package/mac80211/patches/907-wlcore-wl12xx-check-if-we-got-correct-clock-data-from-DT.patch
-+++ /dev/null
-@@ -1,96 +0,0 @@
--The fref and the tcxo clocks settings are optional in some platforms.
--WiLink8 doesn't need either, so we don't check the values.  WiLink 6
--only needs the fref clock, so we check that it is valid or return with
--an error.  WiLink7 needs both clocks, if either is not available we
--return with an error.
--
--Signed-off-by: Luciano Coelho <coelho@ti.com>
--Reviewed-by: Felipe Balbi <balbi@ti.com>
--
----- a/drivers/net/wireless/ti/wl12xx/main.c
--+++ b/drivers/net/wireless/ti/wl12xx/main.c
--@@ -930,6 +930,11 @@ static int wl128x_boot_clk(struct wl1271
-- 	u16 sys_clk_cfg;
-- 	int ret;
-- 
--+	if ((priv->ref_clock < 0) || (priv->tcxo_clock < 0)) {
--+		wl1271_error("Missing fref and/or tcxo clock settings\n");
--+		return -EINVAL;
--+	}
--+
-- 	/* For XTAL-only modes, FREF will be used after switching from TCXO */
-- 	if (priv->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
-- 	    priv->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
--@@ -979,6 +984,11 @@ static int wl127x_boot_clk(struct wl1271
-- 	u32 clk;
-- 	int ret;
-- 
--+	if (priv->ref_clock < 0) {
--+		wl1271_error("Missing fref clock settings\n");
--+		return -EINVAL;
--+	}
--+
-- 	if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
-- 		wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
-- 
--@@ -1768,7 +1778,7 @@ static int wl12xx_setup(struct wl1271 *w
-- 	wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap);
-- 	wl12xx_conf_init(wl);
-- 
---	if (!fref_param) {
--+	if (!fref_param && (pdata->ref_clock_freq > 0)) {
-- 		priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
-- 						       pdata->ref_clock_freq,
-- 						       pdata->ref_clock_xtal);
--@@ -1779,6 +1789,8 @@ static int wl12xx_setup(struct wl1271 *w
-- 
-- 			return priv->ref_clock;
-- 		}
--+	} else if (!fref_param) {
--+		priv->ref_clock = -EINVAL;
-- 	} else {
-- 		if (!strcmp(fref_param, "19.2"))
-- 			priv->ref_clock = WL12XX_REFCLOCK_19;
--@@ -1796,7 +1808,7 @@ static int wl12xx_setup(struct wl1271 *w
-- 			wl1271_error("Invalid fref parameter %s", fref_param);
-- 	}
-- 
---	if (!tcxo_param) {
--+	if (!fref_param && (pdata->tcxo_clock_freq > 0)) {
-- 		priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
-- 							pdata->tcxo_clock_freq,
-- 							true);
--@@ -1806,7 +1818,9 @@ static int wl12xx_setup(struct wl1271 *w
-- 
-- 			return priv->tcxo_clock;
-- 		}
---	} else {
--+	} else if (!fref_param) {
--+		priv->tcxo_clock = -EINVAL;
--+	}else {
-- 		if (!strcmp(tcxo_param, "19.2"))
-- 			priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
-- 		else if (!strcmp(tcxo_param, "26"))
----- a/drivers/net/wireless/ti/wlcore/sdio.c
--+++ b/drivers/net/wireless/ti/wlcore/sdio.c
--@@ -252,20 +252,16 @@ static struct wl12xx_platform_data *wlco
-- 	for_each_matching_node(clock_node, wlcore_sdio_of_clk_match_table)
-- 		of_fixed_clk_setup(clock_node);
-- 
---	/* TODO: make sure we have this when needed (ie. for WL6 and WL7) */
-- 	glue->refclock = of_clk_get_by_name(np, "refclock");
-- 	if (IS_ERR(glue->refclock)) {
---		dev_err(dev, "couldn't find refclock on the device tree\n");
-- 		glue->refclock = NULL;
-- 	} else {
-- 		clk_prepare_enable(glue->refclock);
-- 		pdata->ref_clock_freq = clk_get_rate(glue->refclock);
-- 	}
-- 
---	/* TODO: make sure we have this when needed (ie. for WL7) */
-- 	glue->tcxoclock = of_clk_get_by_name(np, "tcxoclock");
-- 	if (IS_ERR(glue->tcxoclock)) {
---		dev_err(dev, "couldn't find tcxoclock on the device tree\n");
-- 		glue->tcxoclock = NULL;
-- 	} else {
-- 		clk_prepare_enable(glue->tcxoclock);
-diff --git a/package/mac80211/patches/a00-ath9k_platform_h_backup.patch b/package/mac80211/patches/a00-ath9k_platform_h_backup.patch
-deleted file mode 100644
-index cff3dae..0000000
---- a/package/mac80211/patches/a00-ath9k_platform_h_backup.patch
-+++ /dev/null
-@@ -1,22 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/init.c
--+++ b/drivers/net/wireless/ath/ath9k/init.c
--@@ -678,8 +678,7 @@ static int ath9k_init_soc_platform(struc
-- 			return ret;
-- 	}
-- 
---	if (pdata->tx_gain_buffalo)
---		ah->config.tx_gain_buffalo = true;
--+	ah->config.tx_gain_buffalo = true;
-- 
-- 	return ret;
-- }
----- a/include/linux/ath9k_platform.h
--+++ b/include/linux/ath9k_platform.h
--@@ -33,7 +33,6 @@ struct ath9k_platform_data {
-- 
-- 	bool endian_check;
-- 	bool is_clk_25mhz;
---	bool tx_gain_buffalo;
-- 	bool disable_2ghz;
-- 	bool disable_5ghz;
-- 
diff --git a/patches/openwrt/0007-netifd-update-to-latest-git-add-UCI-config-path-patch.patch b/patches/openwrt/0006-netifd-update-to-latest-git-add-UCI-config-path-patch.patch
similarity index 100%
rename from patches/openwrt/0007-netifd-update-to-latest-git-add-UCI-config-path-patch.patch
rename to patches/openwrt/0006-netifd-update-to-latest-git-add-UCI-config-path-patch.patch
diff --git a/patches/openwrt/0008-ar71xx-add-kernel-support-for-the-TL-WDR3500-board.patch b/patches/openwrt/0007-ar71xx-add-kernel-support-for-the-TL-WDR3500-board.patch
similarity index 100%
rename from patches/openwrt/0008-ar71xx-add-kernel-support-for-the-TL-WDR3500-board.patch
rename to patches/openwrt/0007-ar71xx-add-kernel-support-for-the-TL-WDR3500-board.patch
diff --git a/patches/openwrt/0009-ar71xx-add-user-space-support-for-TL-WDR3500-board.patch b/patches/openwrt/0008-ar71xx-add-user-space-support-for-TL-WDR3500-board.patch
similarity index 100%
rename from patches/openwrt/0009-ar71xx-add-user-space-support-for-TL-WDR3500-board.patch
rename to patches/openwrt/0008-ar71xx-add-user-space-support-for-TL-WDR3500-board.patch
diff --git a/patches/openwrt/0010-ar71xx-build-image-for-the-TL-WDR3500-board.patch b/patches/openwrt/0009-ar71xx-build-image-for-the-TL-WDR3500-board.patch
similarity index 100%
rename from patches/openwrt/0010-ar71xx-build-image-for-the-TL-WDR3500-board.patch
rename to patches/openwrt/0009-ar71xx-build-image-for-the-TL-WDR3500-board.patch
diff --git a/patches/openwrt/0011-ar71xx-add-default-switch-configuration-for-the-TL-WDR3500.patch b/patches/openwrt/0010-ar71xx-add-default-switch-configuration-for-the-TL-WDR3500.patch
similarity index 100%
rename from patches/openwrt/0011-ar71xx-add-default-switch-configuration-for-the-TL-WDR3500.patch
rename to patches/openwrt/0010-ar71xx-add-default-switch-configuration-for-the-TL-WDR3500.patch
diff --git a/patches/openwrt/0012-ar71xx-add-diag-support-for-the-TL-WDR3500.patch b/patches/openwrt/0011-ar71xx-add-diag-support-for-the-TL-WDR3500.patch
similarity index 100%
rename from patches/openwrt/0012-ar71xx-add-diag-support-for-the-TL-WDR3500.patch
rename to patches/openwrt/0011-ar71xx-add-diag-support-for-the-TL-WDR3500.patch
diff --git a/patches/openwrt/0013-ar71xx-remove-numeric-suffix-of-the-TL-WDR3500-USB-LED.patch b/patches/openwrt/0012-ar71xx-remove-numeric-suffix-of-the-TL-WDR3500-USB-LED.patch
similarity index 100%
rename from patches/openwrt/0013-ar71xx-remove-numeric-suffix-of-the-TL-WDR3500-USB-LED.patch
rename to patches/openwrt/0012-ar71xx-remove-numeric-suffix-of-the-TL-WDR3500-USB-LED.patch
diff --git a/patches/openwrt/0014-ar71xx-fix-USB-power-GPIO-on-the-TL-WDR3500.patch b/patches/openwrt/0013-ar71xx-fix-USB-power-GPIO-on-the-TL-WDR3500.patch
similarity index 100%
rename from patches/openwrt/0014-ar71xx-fix-USB-power-GPIO-on-the-TL-WDR3500.patch
rename to patches/openwrt/0013-ar71xx-fix-USB-power-GPIO-on-the-TL-WDR3500.patch
diff --git a/patches/openwrt/0015-ar71xx-add-default-LED-configuration-for-the-WL-WRD3500.patch b/patches/openwrt/0014-ar71xx-add-default-LED-configuration-for-the-WL-WRD3500.patch
similarity index 100%
rename from patches/openwrt/0015-ar71xx-add-default-LED-configuration-for-the-WL-WRD3500.patch
rename to patches/openwrt/0014-ar71xx-add-default-LED-configuration-for-the-WL-WRD3500.patch
diff --git a/patches/openwrt/0016-ar71xx-fix-ethernet-LEDs-on-the-TL-WDR3500.patch b/patches/openwrt/0015-ar71xx-fix-ethernet-LEDs-on-the-TL-WDR3500.patch
similarity index 100%
rename from patches/openwrt/0016-ar71xx-fix-ethernet-LEDs-on-the-TL-WDR3500.patch
rename to patches/openwrt/0015-ar71xx-fix-ethernet-LEDs-on-the-TL-WDR3500.patch
diff --git a/patches/openwrt/0017-ar71xx-add-GPIO-output-select-values-for-AR934x.patch b/patches/openwrt/0016-ar71xx-add-GPIO-output-select-values-for-AR934x.patch
similarity index 100%
rename from patches/openwrt/0017-ar71xx-add-GPIO-output-select-values-for-AR934x.patch
rename to patches/openwrt/0016-ar71xx-add-GPIO-output-select-values-for-AR934x.patch
diff --git a/patches/packages/mac80211/0001-mac80211-ath9k-add-support-for-QCA953x.patch b/patches/openwrt/0017-mac80211-ath9k-add-support-for-QCA953x.patch
similarity index 95%
rename from patches/packages/mac80211/0001-mac80211-ath9k-add-support-for-QCA953x.patch
rename to patches/openwrt/0017-mac80211-ath9k-add-support-for-QCA953x.patch
index c5965dd7b..a5914db23 100644
--- a/patches/packages/mac80211/0001-mac80211-ath9k-add-support-for-QCA953x.patch
+++ b/patches/openwrt/0017-mac80211-ath9k-add-support-for-QCA953x.patch
@@ -1,5 +1,5 @@
 From: Matthias Schiffer <mschiffer@universe-factory.net>
-Date: Sat, 29 Mar 2014 21:33:11 +0100
+Date: Fri, 18 Apr 2014 18:30:05 +0200
 Subject: mac80211: ath9k: add support for QCA953x
 
 This adds the following patches by Sujith Manoharan from ath9k-devel:
@@ -8,11 +8,11 @@ ath9k: Add QCA953x WMAC platform support
 ath9k: Disable AR_INTR_SYNC_HOST1_FATAL for QCA953x
 ath9k: Fix temperature compensation
 
-diff --git a/mac80211/patches/567-ath9k-qca953x-support.patch b/mac80211/patches/567-ath9k-qca953x-support.patch
+diff --git a/package/mac80211/patches/567-ath9k-qca953x-support.patch b/package/mac80211/patches/567-ath9k-qca953x-support.patch
 new file mode 100644
 index 0000000..e73083a
 --- /dev/null
-+++ b/mac80211/patches/567-ath9k-qca953x-support.patch
++++ b/package/mac80211/patches/567-ath9k-qca953x-support.patch
 @@ -0,0 +1,124 @@
 +--- a/drivers/net/wireless/ath/ath9k/ahb.c
 ++++ b/drivers/net/wireless/ath/ath9k/ahb.c
-- 
GitLab