Browse Source

mac80211, mt76, ath10k-ct, ath10k-firmware: backport from LEDE df3295f50e54909090846de12f7deb3ff8de6557

And assorted backports and a revert to make this work on lede-17.01.
Matthias Schiffer 6 years ago
parent
commit
9fda4260a6

+ 26 - 0
patches/lede/0039-kernel-speed-up-build-system-by-getting-rid-of-redundant-work.patch

@@ -0,0 +1,26 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Thu, 16 Mar 2017 09:33:18 +0100
+Subject: kernel: speed up build system by getting rid of redundant work
+
+KERNELRELEASE contains a $(shell) call which is evaluated over and over
+again.
+The call to checksyscalls.sh is unnecessary for LEDE and also takes a
+few seconds to complete.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+
+diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
+index 10bd67a571f12b2ffeb97624654f3f2c68905af4..1c3b428b1661d2fa2e4feb9c0b1eb11992d9dd7d 100644
+--- a/include/kernel-defaults.mk
++++ b/include/kernel-defaults.mk
+@@ -23,7 +23,9 @@ KERNEL_MAKEOPTS := -C $(LINUX_DIR) \
+ 	HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib" \
+ 	CONFIG_SHELL="$(BASH)" \
+ 	$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
+-	$(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID))
++	$(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \
++	KERNELRELEASE=$(LINUX_VERSION) \
++	cmd_syscalls=
+ 
+ ifdef CONFIG_STRIP_KERNEL_EXPORTS
+   KERNEL_MAKEOPTS += \

+ 31 - 0
patches/lede/0040-include-Do-not-alter-KERNELRELEASE-for-external-git-kernels.patch

@@ -0,0 +1,31 @@
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 11 May 2017 14:33:42 -0700
+Subject: include: Do not alter KERNELRELEASE for external/git kernels
+
+In case we use external and/or git cloned kernels, let the kernel
+determine the appropriate KERNELRELEASE. We cannot used
+LINUX_UNAME_VERSION because that one gets determined at a later time,
+when the kernel is already built proper.
+
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+
+diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
+index 1c3b428b1661d2fa2e4feb9c0b1eb11992d9dd7d..201c258835bd59b1da64a5c40e757a2845f27684 100644
+--- a/include/kernel-defaults.mk
++++ b/include/kernel-defaults.mk
+@@ -24,9 +24,14 @@ KERNEL_MAKEOPTS := -C $(LINUX_DIR) \
+ 	CONFIG_SHELL="$(BASH)" \
+ 	$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
+ 	$(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \
+-	KERNELRELEASE=$(LINUX_VERSION) \
+ 	cmd_syscalls=
+ 
++
++ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
++  KERNEL_MAKEOPTS += \
++	KERNELRELEASE=$(LINUX_VERSION)
++endif
++
+ ifdef CONFIG_STRIP_KERNEL_EXPORTS
+   KERNEL_MAKEOPTS += \
+ 	EXTRA_LDSFLAGS="-I$(KERNEL_BUILD_DIR) -include symtab.h"

+ 27 - 0
patches/lede/0041-Revert-kernel-prevent-addition-of-scm-marker-to-localversion.patch

@@ -0,0 +1,27 @@
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 11 May 2017 14:33:41 -0700
+Subject: Revert "kernel: prevent addition of scm marker to localversion"
+
+This reverts commit 0df2c6563a3537ed21b28a9fb6874bf2718afd05 since it
+gets in the way of identifying properly which kernel we are running.
+This is particularly important if LEDE is using external kernels/git
+cloned kernels. We want to make sure we only load modules from that
+specific kernel.
+
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+
+diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
+index 201c258835bd59b1da64a5c40e757a2845f27684..f9722a4904762e6885deaa76ba6efe40e359adcd 100644
+--- a/include/kernel-defaults.mk
++++ b/include/kernel-defaults.mk
+@@ -47,10 +47,6 @@ ifdef CONFIG_USE_SPARSE
+   KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse
+ endif
+ 
+-ifneq ($(strip $(CONFIG_KERNEL_GIT_CLONE_URI)),"")
+- KERNEL_MAKEOPTS += LOCALVERSION=
+-endif
+-
+ export HOST_EXTRACFLAGS=-I$(STAGING_DIR_HOST)/include
+ 
+ # defined in quilt.mk

+ 177 - 0
patches/lede/0042-build-add-KERNEL_MAKE-and-KERNEL_MAKE_FLAGS-variables-and-move-to-kernel.mk.patch

@@ -0,0 +1,177 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Thu, 16 Mar 2017 09:53:30 +0100
+Subject: build: add KERNEL_MAKE and KERNEL_MAKE_FLAGS variables and move to kernel.mk
+
+This allows packages to use kernel make options without the forced
+-C $(LINUX_DIR). It also makes it more clear that it to be called from
+kernel module packages directly.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+
+diff --git a/include/kernel-build.mk b/include/kernel-build.mk
+index 32da94babc75268756120b9d9b63373a8cf44b39..b8e2ab3e5c8c8ad2a51bdd9d2c2ec9b2a7172aba 100644
+--- a/include/kernel-build.mk
++++ b/include/kernel-build.mk
+@@ -105,7 +105,7 @@ define BuildKernel
+   $(KERNEL_BUILD_DIR)/symtab.h: FORCE
+ 	rm -f $(KERNEL_BUILD_DIR)/symtab.h
+ 	touch $(KERNEL_BUILD_DIR)/symtab.h
+-	+$(MAKE) $(KERNEL_MAKEOPTS) vmlinux
++	+$(KERNEL_MAKE) vmlinux
+ 	find $(LINUX_DIR) $(STAGING_DIR_ROOT)/lib/modules -name \*.ko | \
+ 		xargs $(TARGET_CROSS)nm | \
+ 		awk '$$$$1 == "U" { print $$$$2 } ' | \
+@@ -160,7 +160,7 @@ define BuildKernel
+ 	rm -f $(LINUX_DIR)/.config.prev
+ 	rm -f $(STAMP_CONFIGURED)
+ 	$(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config
+-	$(_SINGLE)$(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKEOPTS) HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib -lncurses" $$@
++	$(_SINGLE)$(KERNEL_MAKE) HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib -lncurses" $$@
+ 	$(LINUX_RECONF_DIFF) $(LINUX_DIR)/.config > $(LINUX_RECONFIG_TARGET)
+ 
+   install: $(LINUX_DIR)/.image
+diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
+index f9722a4904762e6885deaa76ba6efe40e359adcd..05f4be02c82c80ea9c86b351b0e6192a8d21d3f9 100644
+--- a/include/kernel-defaults.mk
++++ b/include/kernel-defaults.mk
+@@ -11,27 +11,6 @@ ifneq ($(SOURCE_DATE_EPOCH),)
+   endif
+ endif
+ 
+-KERNEL_MAKEOPTS := -C $(LINUX_DIR) \
+-	HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \
+-	CROSS_COMPILE="$(KERNEL_CROSS)" \
+-	ARCH="$(LINUX_KARCH)" \
+-	KBUILD_HAVE_NLS=no \
+-	KBUILD_BUILD_USER="$(call qstrip,$(CONFIG_KERNEL_BUILD_USER))" \
+-	KBUILD_BUILD_HOST="$(call qstrip,$(CONFIG_KERNEL_BUILD_DOMAIN))" \
+-	KBUILD_BUILD_TIMESTAMP="$(KBUILD_BUILD_TIMESTAMP)" \
+-	KBUILD_BUILD_VERSION="0" \
+-	HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib" \
+-	CONFIG_SHELL="$(BASH)" \
+-	$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
+-	$(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \
+-	cmd_syscalls=
+-
+-
+-ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
+-  KERNEL_MAKEOPTS += \
+-	KERNELRELEASE=$(LINUX_VERSION)
+-endif
+-
+ ifdef CONFIG_STRIP_KERNEL_EXPORTS
+   KERNEL_MAKEOPTS += \
+ 	EXTRA_LDSFLAGS="-I$(KERNEL_BUILD_DIR) -include symtab.h"
+@@ -43,10 +22,6 @@ ifneq (,$(KERNEL_CC))
+   KERNEL_MAKEOPTS += CC="$(KERNEL_CC)"
+ endif
+ 
+-ifdef CONFIG_USE_SPARSE
+-  KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse
+-endif
+-
+ export HOST_EXTRACFLAGS=-I$(STAGING_DIR_HOST)/include
+ 
+ # defined in quilt.mk
+@@ -127,7 +102,7 @@ define Kernel/Configure/Default
+ 		cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config; \
+ 		cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev; \
+ 	}
+-	$(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(MAKE) $(KERNEL_MAKEOPTS) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install
++	$(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(KERNEL_MAKE) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install
+ 	grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | mkhash md5 > $(LINUX_DIR)/.vermagic
+ endef
+ 
+@@ -137,7 +112,7 @@ endef
+ 
+ define Kernel/CompileModules/Default
+ 	rm -f $(LINUX_DIR)/vmlinux $(LINUX_DIR)/System.map
+-	+$(MAKE) $(KERNEL_MAKEOPTS) modules
++	+$(KERNEL_MAKE) modules
+ endef
+ 
+ OBJCOPY_STRIP = -R .reginfo -R .notes -R .note -R .comment -R .mdebug -R .note.gnu.build-id
+@@ -161,7 +136,7 @@ endef
+ 
+ define Kernel/CompileImage/Default
+ 	rm -f $(TARGET_DIR)/init
+-	+$(MAKE) $(KERNEL_MAKEOPTS) $(if $(KERNELNAME),$(KERNELNAME),all) modules
++	+$(KERNEL_MAKE) $(if $(KERNELNAME),$(KERNELNAME),all) modules
+ 	$(call Kernel/CopyImage)
+ endef
+ 
+@@ -170,7 +145,7 @@ define Kernel/CompileImage/Initramfs
+ 	$(call Kernel/Configure/Initramfs)
+ 	$(CP) $(GENERIC_PLATFORM_DIR)/base-files/init $(TARGET_DIR)/init
+ 	rm -rf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/usr/initramfs_data.cpio*
+-	+$(MAKE) $(KERNEL_MAKEOPTS) $(if $(KERNELNAME),$(KERNELNAME),all) modules
++	+$(KERNEL_MAKE) $(if $(KERNELNAME),$(KERNELNAME),all) modules
+ 	$(call Kernel/CopyImage,-initramfs)
+ endef
+ else
+diff --git a/include/kernel.mk b/include/kernel.mk
+index b1d0e8d927cb462b486cfd645d68963f1b6ab8ff..779d24ac5c654347e69eba127c63b256136376df 100644
+--- a/include/kernel.mk
++++ b/include/kernel.mk
+@@ -85,6 +85,35 @@ else
+   LINUX_KARCH := $(ARCH)
+ endif
+ 
++KERNEL_MAKE = $(MAKE) $(KERNEL_MAKEOPTS)
++
++KERNEL_MAKE_FLAGS := \
++	HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \
++	CROSS_COMPILE="$(KERNEL_CROSS)" \
++	ARCH="$(LINUX_KARCH)" \
++	KBUILD_HAVE_NLS=no \
++	KBUILD_BUILD_USER="$(call qstrip,$(CONFIG_KERNEL_BUILD_USER))" \
++	KBUILD_BUILD_HOST="$(call qstrip,$(CONFIG_KERNEL_BUILD_DOMAIN))" \
++	KBUILD_BUILD_TIMESTAMP="$(KBUILD_BUILD_TIMESTAMP)" \
++	KBUILD_BUILD_VERSION="0" \
++	HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib" \
++	CONFIG_SHELL="$(BASH)" \
++	$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
++	$(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \
++	KERNELRELEASE=$(LINUX_VERSION) \
++	cmd_syscalls=
++
++ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
++  KERNEL_MAKEOPTS += \
++	KERNELRELEASE=$(LINUX_VERSION)
++endif
++
++KERNEL_MAKEOPTS := -C $(LINUX_DIR) $(KERNEL_MAKE_FLAGS)
++
++ifdef CONFIG_USE_SPARSE
++  KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse
++endif
++
+ define KernelPackage/Defaults
+   FILES:=
+   AUTOLOAD:=
+diff --git a/package/kernel/kmod-sched-cake/Makefile b/package/kernel/kmod-sched-cake/Makefile
+index b58c610b2ced5b0cf26e690b6b8e1d907a7e7734..c6133f93bb72b6f57ba25c814ff7836edb37159e 100644
+--- a/package/kernel/kmod-sched-cake/Makefile
++++ b/package/kernel/kmod-sched-cake/Makefile
+@@ -36,7 +36,7 @@ define KernelPackage/sched-cake/description
+ endef
+ 
+ define Build/Compile
+-	$(MAKE) $(KERNEL_MAKEOPTS) SUBDIRS="$(PKG_BUILD_DIR)" modules
++	$(KERNEL_MAKE) SUBDIRS="$(PKG_BUILD_DIR)" modules
+ endef
+ 
+ $(eval $(call KernelPackage,sched-cake))
+diff --git a/package/kernel/trelay/Makefile b/package/kernel/trelay/Makefile
+index f95115a7d9d80259493eb0a05e4f00f6970cae2d..525a028c35d3831a00e9b81b6ec25a0dcb5ac6a4 100644
+--- a/package/kernel/trelay/Makefile
++++ b/package/kernel/trelay/Makefile
+@@ -32,7 +32,7 @@ endef
+ include $(INCLUDE_DIR)/kernel-defaults.mk
+ 
+ define Build/Compile
+-	$(MAKE) $(KERNEL_MAKEOPTS) SUBDIRS="$(PKG_BUILD_DIR)" modules
++	$(KERNEL_MAKE) SUBDIRS="$(PKG_BUILD_DIR)" modules
+ endef
+ 
+ define KernelPackage/trelay/conffiles

+ 43 - 0
patches/lede/0043-build-move-definition-of-KBUILD_BUILD_TIMESTAMP-to-include-kernel.mk.patch

@@ -0,0 +1,43 @@
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Tue, 13 Jun 2017 13:04:35 +0200
+Subject: build: move definition of KBUILD_BUILD_TIMESTAMP to include/kernel.mk
+
+Fixes: 0aed054bec (build: add KERNEL_MAKE and KERNEL_MAKE_FLAGS
+variables and move to kernel.mk)
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+
+diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
+index 05f4be02c82c80ea9c86b351b0e6192a8d21d3f9..138a3d01454b5f5b763effeb68eafa27e80f940e 100644
+--- a/include/kernel-defaults.mk
++++ b/include/kernel-defaults.mk
+@@ -5,12 +5,6 @@
+ # See /LICENSE for more information.
+ #
+ 
+-ifneq ($(SOURCE_DATE_EPOCH),)
+-  ifndef DUMP
+-    KBUILD_BUILD_TIMESTAMP:=$(shell perl -e 'print scalar gmtime($(SOURCE_DATE_EPOCH))')
+-  endif
+-endif
+-
+ ifdef CONFIG_STRIP_KERNEL_EXPORTS
+   KERNEL_MAKEOPTS += \
+ 	EXTRA_LDSFLAGS="-I$(KERNEL_BUILD_DIR) -include symtab.h"
+diff --git a/include/kernel.mk b/include/kernel.mk
+index 779d24ac5c654347e69eba127c63b256136376df..98c8c283a8d8ca24108274991808e9f63ab5f4ff 100644
+--- a/include/kernel.mk
++++ b/include/kernel.mk
+@@ -10,6 +10,12 @@ CHECK:=1
+ DUMP:=1
+ endif
+ 
++ifneq ($(SOURCE_DATE_EPOCH),)
++  ifndef DUMP
++    KBUILD_BUILD_TIMESTAMP:=$(shell perl -e 'print scalar gmtime($(SOURCE_DATE_EPOCH))')
++  endif
++endif
++
+ ifeq ($(__target_inc),)
+   ifndef CHECK
+     include $(INCLUDE_DIR)/target.mk

+ 4670 - 0
patches/lede/0044-mac80211-mt76-ath10k-ct-ath10k-firmware-backport-from-LEDE-df3295f50e54909090846de12f7deb3ff8de6557.patch

@@ -0,0 +1,4670 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Tue, 15 Aug 2017 00:18:21 +0200
+Subject: mac80211, mt76, ath10k-ct, ath10k-firmware: backport from LEDE df3295f50e54909090846de12f7deb3ff8de6557
+
+diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile
+index 8bf5729fff16677ef6449498f1df3cda19272583..16d77a398fbd3cbed6371e2cf977e2d8c4cfda36 100644
+--- a/package/firmware/ath10k-firmware/Makefile
++++ b/package/firmware/ath10k-firmware/Makefile
+@@ -8,9 +8,9 @@
+ include $(TOPDIR)/rules.mk
+ 
+ PKG_NAME:=ath10k-firmware
+-PKG_SOURCE_DATE:=2017-01-11
+-PKG_SOURCE_VERSION:=ab432c60437931a165f0aff1a6e3371f358b75dd
+-PKG_MIRROR_HASH:=e3188ecd4d7470d3cdde89fefa6258f9ec4f404b23558d1474e5014679b28101
++PKG_SOURCE_DATE:=2017-03-29
++PKG_SOURCE_VERSION:=956e2609b7e42c8c710bba10ef925a5be1be5137
++PKG_MIRROR_HASH:=25f724ff38c830281b3efba4a4ddffaae0c4bd8fea0f4c1061591229ff05535b
+ PKG_RELEASE:=1
+ 
+ PKG_SOURCE_PROTO:=git
+@@ -32,6 +32,11 @@ $(Package/ath10k-firmware-default)
+   TITLE:=ath10k firmware for QCA9887 devices
+ endef
+ 
++define Package/ath10k-firmware-qca9888
++$(Package/ath10k-firmware-default)
++  TITLE:=ath10k firmware for QCA9888 devices
++endef
++
+ define Package/ath10k-firmware-qca9887-ct
+ $(Package/ath10k-firmware-default)
+   TITLE:=ath10k-CT firmware for QCA9887 devices
+@@ -76,34 +81,41 @@ define Download/ct-firmware
+   URL_FILE:=$($(1)_FIRMWARE_FILE_CT)
+ endef
+ 
+-QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc3-lede
++QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc5-lede
+ define Download/ath10k-firmware-qca988x-ct
+   $(call Download/ct-firmware,QCA988X,)
+-  HASH:=4112d78161a2c20e7a9490ea8d04e9f919508bafb097d88761dcce026c26f93f
++  HASH:=556d6a4df50cd94a229a240d6d1d108ed5910069902f1e0cbb57b02ede27690f
+ endef
+ $(eval $(call Download,ath10k-firmware-qca988x-ct))
+ 
+-QCA9887_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc3-lede
++QCA9887_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc5-lede
+ define Download/ath10k-firmware-qca9887-ct
+   $(call Download/ct-firmware,QCA9887,ath10k-9887)
+-  HASH:=18b61875726d4384de46f75dec1d42fea31aa6d66dba4940cb9d375bc98732e4
++  HASH:=725982694156e0b891dcd1b1b18ba5318fbbe173f4ec9603ff7acbd08f7c4050
+ endef
+ $(eval $(call Download,ath10k-firmware-qca9887-ct))
+ 
+-QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.001
++QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.002
+ define Download/ath10k-firmware-qca99x0-ct
+   $(call Download/ct-firmware,QCA99X0,ath10k-10-4)
+-  HASH:=61ff2b52617ae805579f423d6539284f056aba2b9f7e3629d600f6a5077ab703
++  HASH:=e3c77077b47d55219f90816a51bf046f5b40c32be5e96bf629b083d873a879ad
+ endef
+ $(eval $(call Download,ath10k-firmware-qca99x0-ct))
+ 
+-QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.001
++QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.002
+ define Download/ath10k-firmware-qca9984-ct
+   $(call Download/ct-firmware,QCA9984,ath10k-9984-10-4)
+-  HASH:=e079db5059cf28979ff50c7f6706df87e96a375e8048deeb4f6ede5357577f74
++  HASH:=610f7747db6b101f4fc21431b776ac640b5977357e5be9aece2349447b9b1d85
+ endef
+ $(eval $(call Download,ath10k-firmware-qca9984-ct))
+ 
++QCA9888_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.002
++define Download/ath10k-firmware-qca9888-ct
++  $(call Download/ct-firmware,QCA9888,ath10k-9888-10-4)
++  HASH:=f92e7d7968698af7c6f2d76b31b3645589e03839e15838010ce457c635e5aae6
++endef
++$(eval $(call Download,ath10k-firmware-qca9888-ct))
++
+ define Package/ath10k-firmware-qca99x0
+ $(Package/ath10k-firmware-default)
+   TITLE:=ath10k firmware for QCA99x0 devices
+@@ -158,6 +170,14 @@ This firmware conflicts with the standard 9984 firmware, so select only
+ one.
+ endef
+ 
++define Package/ath10k-firmware-qca9888-ct/description
++Alternative ath10k firmware for QCA9886 and QCA9888 from Candela Technologies.
++Enables IBSS and other features.  See:
++http://www.candelatech.com/ath10k-10.4.php
++This firmware conflicts with the standard 9886 and 9888 firmware, so select only
++one.
++endef
++
+ define Package/ath10k-firmware-qca99x0/description
+ Standard ath10k firmware for QCA99x0 from QCA
+ This firmware conflicts with the CT 99x0 firmware, so select only
+@@ -178,6 +198,13 @@ $(Package/ath10k-firmware-default)
+   CATEGORY:=Firmware
+ endef
+ 
++define Package/ath10k-firmware-qca9888-ct
++$(Package/ath10k-firmware-default)
++  TITLE:=ath10k CT 10.4.3 firmware for QCA9886 and QCA9888 devices
++  SECTION:=firmware
++  CATEGORY:=Firmware
++endef
++
+ define Package/ath10k-firmware-qca9984
+ $(Package/ath10k-firmware-default)
+   TITLE:=ath10k firmware for QCA9984 devices
+@@ -185,6 +212,13 @@ $(Package/ath10k-firmware-default)
+   CATEGORY:=Firmware
+ endef
+ 
++define Package/ath10k-firmware-qca4019
++$(Package/ath10k-firmware-default)
++  TITLE:=ath10k firmware for IPQ/QCA4019 devices
++  SECTION:=firmware
++  CATEGORY:=Firmware
++endef
++
+ define Package/ath10k-firmware-qca6174
+ $(Package/ath10k-firmware-default)
+   TITLE:=ath10k firmware for QCA6174 devices
+@@ -203,31 +237,18 @@ define Download/qca99x0-board
+ endef
+ $(eval $(call Download,qca99x0-board))
+ 
+-QCA9984_BOARD_REV:=719c0127e52bd70559e71b85ab0331790e1bf66c
+-QCA9984_BOARD_FILE:=board-2.bin
+-QCA9984_BOARD_FILE_DL:=$(QCA9984_BOARD_FILE).$(QCA9984_BOARD_REV)
+-QCA9984_FIRMWARE_REV:=d43cb1188154037506e94abf3aa456cc934c6861
+-QCA9984_FIRMWARE_FILE:=firmware-5.bin_10.4-3.4-00072
+-QCA9984_FIRMWARE_FILE_DL:=$(QCA9984_FIRMWARE_FILE).$(QCA9984_FIRMWARE_REV)
+-
+-define Download/ath10k-qca9984-board
+-  URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA9984/hw1.0/
+-  URL_FILE:=$(QCA9984_BOARD_FILE)?id=$(QCA9984_BOARD_REV)
+-  FILE:=$(QCA9984_BOARD_FILE_DL)
+-  HASH:=e968b214fd76d5b7859f71841ce40fbd5f47336c3ccbaf95e23f902f5e569aef
+-endef
+-$(eval $(call Download,ath10k-qca9984-board))
++define Build/Compile
+ 
+-define Download/ath10k-qca9984-firmware
+-  URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA9984/hw1.0/
+-  URL_FILE:=$(QCA9984_FIRMWARE_FILE)?id=$(QCA9984_FIRMWARE_REV)
+-  FILE:=$(QCA9984_FIRMWARE_FILE_DL)
+-  HASH:=28d5834e8c4ca8fcef9ea033cd8b9b0f9ee84ecf30dbde84c9c64bf8dd9912bc
+ endef
+-$(eval $(call Download,ath10k-qca9984-firmware))
+-
+-define Build/Compile
+ 
++define Package/ath10k-firmware-qca4019/install
++	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA4019/hw1.0
++	$(INSTALL_DATA) \
++		$(PKG_BUILD_DIR)/QCA4019/hw1.0/board-2.bin \
++		$(1)/lib/firmware/ath10k/QCA4019/hw1.0/
++	$(INSTALL_DATA) \
++		$(PKG_BUILD_DIR)/QCA4019/hw1.0/3.2.1/firmware-5.bin_10.4-3.2.1-00053 \
++		$(1)/lib/firmware/ath10k/QCA4019/hw1.0/firmware-5.bin
+ endef
+ 
+ define Package/ath10k-firmware-qca9887/install
+@@ -240,13 +261,26 @@ define Package/ath10k-firmware-qca9887/install
+ 		$(1)/lib/firmware/ath10k/QCA9887/hw1.0/board.bin
+ endef
+ 
++define Package/ath10k-firmware-qca9888/install
++	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9888/hw2.0
++	$(INSTALL_DATA) \
++		$(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \
++		$(1)/lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin
++	$(INSTALL_DATA) \
++		$(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \
++		$(1)/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
++	$(INSTALL_DATA) \
++		$(PKG_BUILD_DIR)/QCA9888/hw2.0/firmware-5.bin_10.4-3.2-00072 \
++		$(1)/lib/firmware/ath10k/QCA9888/hw2.0/firmware-5.bin
++endef
++
+ define Package/ath10k-firmware-qca988x/install
+ 	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0
+ 	$(INSTALL_DATA) \
+ 		$(PKG_BUILD_DIR)/QCA988X/hw2.0/board.bin \
+ 		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/
+ 	$(INSTALL_DATA) \
+-		$(PKG_BUILD_DIR)/QCA988X/hw2.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00016 \
++		$(PKG_BUILD_DIR)/QCA988X/hw2.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00029 \
+ 		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin
+ endef
+ 
+@@ -303,22 +337,16 @@ endef
+ 
+ define Package/ath10k-firmware-qca9984/install
+ 	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0
+-	ln -s \
+-		../../cal-pci-0000:01:00.0.bin \
+-		$(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin
+ 	$(INSTALL_DATA) \
+-		$(DL_DIR)/$(QCA9984_BOARD_FILE_DL) \
++		$(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \
+ 		$(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin
+ 	$(INSTALL_DATA) \
+-		$(DL_DIR)/$(QCA9984_FIRMWARE_FILE_DL) \
++		$(PKG_BUILD_DIR)/QCA9984/hw1.0/3.4/firmware-5.bin_10.4-3.4-00082 \
+ 		$(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin
+ endef
+ 
+ define Package/ath10k-firmware-qca9984-ct/install
+ 	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0
+-	ln -s \
+-		../../cal-pci-0000:01:00.0.bin \
+-		$(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin
+ 	$(INSTALL_DATA) \
+ 		$(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \
+ 		$(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin
+@@ -327,13 +355,29 @@ define Package/ath10k-firmware-qca9984-ct/install
+ 		$(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin
+ endef
+ 
++define Package/ath10k-firmware-qca9888-ct/install
++	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9888/hw2.0
++	ln -s \
++		../../cal-pci-0000:01:00.0.bin \
++		$(1)/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
++	$(INSTALL_DATA) \
++		$(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \
++		$(1)/lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin
++	$(INSTALL_DATA) \
++		$(DL_DIR)/$(call CT_FIRMWARE_FILE,QCA9888) \
++		$(1)/lib/firmware/ath10k/QCA9888/hw2.0/firmware-5.bin
++endef
++
+ $(eval $(call BuildPackage,ath10k-firmware-qca9887))
++$(eval $(call BuildPackage,ath10k-firmware-qca9888))
+ $(eval $(call BuildPackage,ath10k-firmware-qca988x))
+ $(eval $(call BuildPackage,ath10k-firmware-qca99x0))
+ $(eval $(call BuildPackage,ath10k-firmware-qca6174))
+ $(eval $(call BuildPackage,ath10k-firmware-qca9984))
++$(eval $(call BuildPackage,ath10k-firmware-qca4019))
+ 
+ $(eval $(call BuildPackage,ath10k-firmware-qca9887-ct))
+ $(eval $(call BuildPackage,ath10k-firmware-qca988x-ct))
+ $(eval $(call BuildPackage,ath10k-firmware-qca99x0-ct))
+ $(eval $(call BuildPackage,ath10k-firmware-qca9984-ct))
++$(eval $(call BuildPackage,ath10k-firmware-qca9888-ct))
+diff --git a/package/kernel/ath10k-ct/Makefile b/package/kernel/ath10k-ct/Makefile
+index 4ec49c326560f55d0ab66419fac89744ea5f9535..85fe4eb4638bc286d8e6486731e255ceb7ce5694 100644
+--- a/package/kernel/ath10k-ct/Makefile
++++ b/package/kernel/ath10k-ct/Makefile
+@@ -8,9 +8,9 @@ PKG_LICENSE_FILES:=
+ 
+ PKG_SOURCE_URL:=https://github.com/greearb/ath10k-ct.git
+ PKG_SOURCE_PROTO:=git
+-PKG_SOURCE_DATE:=2017-01-26
+-PKG_SOURCE_VERSION:=d2bc84ff277936c58231f0c2280242eda4199e63
+-PKG_MIRROR_HASH:=6b734b987db00b97b06faca686dcebc56fb23b93093afbb35d5cf534987269bf
++PKG_SOURCE_DATE:=2017-05-16
++PKG_SOURCE_VERSION:=c048ef0c3eedf99b41bc12b3f4e47ef3d9fab484
++PKG_MIRROR_HASH:=7936293962a10a0da7469759623013fc151019a6a584cfc6416bc0b605bd74d7
+ 
+ PKG_MAINTAINER:=Ben Greear <greearb@candelatech.com>
+ PKG_BUILD_PARALLEL:=1
+diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
+index 8ec05a343a4df23ef43411b5074ea1b4fe10d5f5..1ac390d337c23cfb33be5f19de3281a4d83263f3 100644
+--- a/package/kernel/mac80211/Makefile
++++ b/package/kernel/mac80211/Makefile
+@@ -42,8 +42,8 @@ PKG_DRIVERS = \
+ 	rt2800-lib rt2800-mmio rt2800-pci rt2800-soc rt2800-usb \
+ 	rt61-pci rt73-usb \
+ 	rtl8180 rtl8187 \
+-	rtlwifi rtlwifi-pci rtlwifi-usb rtl8192c-common rtl8192ce rtl8192se \
+-	rtl8192de rtl8192cu \
++	rtlwifi rtlwifi-pci rtlwifi-btcoexist rtlwifi-usb rtl8192c-common \
++	rtl8192ce rtl8192se rtl8192de rtl8192cu rtl8821ae \
+ 	rtl8xxxu \
+ 	wlcore wl12xx wl18xx \
+ 	zd1211rw
+@@ -278,7 +278,7 @@ endef
+ define KernelPackage/ath10k
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Atheros 802.11ac wireless cards support
+-  URL:=https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k
+   DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY
+   FILES:= \
+ 	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
+@@ -689,7 +689,7 @@ define KernelPackage/brcmfmac
+   TITLE:=Broadcom IEEE802.11n USB FullMAC WLAN driver
+   URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
+   DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +kmod-brcmutil \
+-	+BRCMFMAC_SDIO:kmod-mmc \
++	+BRCMFMAC_SDIO:kmod-mmc @!TARGET_uml \
+ 	+BRCMFMAC_USB:kmod-usb-core +BRCMFMAC_USB:brcmfmac-firmware-usb
+   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko
+   AUTOLOAD:=$(call AutoProbe,brcmfmac)
+@@ -1042,7 +1042,7 @@ 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
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwl8k
+   DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +mwl8k-firmware
+   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwl8k.ko
+   AUTOLOAD:=$(call AutoProbe,mwl8k)
+@@ -1056,7 +1056,7 @@ endef
+ define KernelPackage/mwifiex-pcie
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Driver for Marvell 802.11n/802.11ac PCIe Wireless cards
+-  URL:=http://wireless.kernel.org/en/users/Drivers/mwifiex
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex
+   DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-pcie-firmware
+   FILES:= \
+ 	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \
+@@ -1071,7 +1071,7 @@ endef
+ define KernelPackage/mwifiex-sdio
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Driver for Marvell 802.11n/802.11ac SDIO Wireless cards
+-  URL:=http://wireless.kernel.org/en/users/Drivers/mwifiex
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex
+   DEPENDS+= +kmod-mmc +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-sdio-firmware
+   FILES:= \
+ 	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \
+@@ -1268,7 +1268,7 @@ endef
+ define KernelPackage/rtl818x/Default
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Realtek Drivers for RTL818x devices
+-  URL:=http://wireless.kernel.org/en/users/Drivers/rtl8187
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/rtl8187
+   DEPENDS+= +kmod-eeprom-93cx6 +kmod-mac80211
+ endef
+ 
+@@ -1314,6 +1314,15 @@ define KernelPackage/rtlwifi-pci
+   HIDDEN:=1
+ endef
+ 
++define KernelPackage/rtlwifi-btcoexist
++  $(call KernelPackage/mac80211/Default)
++  TITLE:=Realtek BT coexist support
++  DEPENDS+= +kmod-rtlwifi
++  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/btcoexist/btcoexist.ko
++  AUTOLOAD:=$(call AutoProbe,btcoexist)
++  HIDDEN:=1
++endef
++
+ define KernelPackage/rtlwifi-usb
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Realtek common driver part (USB support)
+@@ -1363,6 +1372,13 @@ define KernelPackage/rtl8192cu
+   AUTOLOAD:=$(call AutoProbe,rtl8192cu)
+ endef
+ 
++define KernelPackage/rtl8821ae
++  $(call KernelPackage/mac80211/Default)
++  TITLE:=Realtek RTL8821AE support
++  DEPENDS+= +kmod-rtlwifi-btcoexist +kmod-rtlwifi-pci +rtl8821ae-firmware
++  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/rtl8821ae.ko
++  AUTOLOAD:=$(call AutoProbe,rtl8821ae)
++endef
+ 
+ define KernelPackage/rtl8xxxu
+   $(call KernelPackage/mac80211/Default)
+@@ -1414,7 +1430,7 @@ endef
+ define KernelPackage/wl12xx
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Driver for TI WL12xx
+-  URL:=http://wireless.kernel.org/en/users/Drivers/wl12xx
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl12xx
+   DEPENDS+= +kmod-wlcore +wl12xx-firmware
+   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl12xx/wl12xx.ko
+   AUTOLOAD:=$(call AutoProbe,wl12xx)
+@@ -1427,7 +1443,7 @@ endef
+ define KernelPackage/wl18xx
+   $(call KernelPackage/mac80211/Default)
+   TITLE:=Driver for TI WL18xx
+-  URL:=http://wireless.kernel.org/en/users/Drivers/wl18xx
++  URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl18xx
+   DEPENDS+= +kmod-wlcore +wl18xx-firmware
+   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl18xx/wl18xx.ko
+   AUTOLOAD:=$(call AutoProbe,wl18xx)
+@@ -1521,6 +1537,7 @@ config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED
+ config-$(call config_package,ath9k) += ATH9K
+ config-$(call config_package,ath9k-common) += ATH9K_COMMON
+ config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB
++config-$(CONFIG_TARGET_ipq806x) += ATH10K_AHB
+ config-$(CONFIG_PCI) += ATH9K_PCI
+ config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
+ config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM
+@@ -1626,12 +1643,14 @@ 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-btcoexist) += RTLBTCOEXIST
+ 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-$(call config_package,rtl8821ae) += RTL8821AE
+ config-$(CONFIG_PACKAGE_RTLWIFI_DEBUG) += RTLWIFI_DEBUG
+ 
+ config-$(call config_package,rtl8xxxu) += RTL8XXXU
+@@ -1640,8 +1659,7 @@ config-y += RTL8XXXU_UNTESTED
+ config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS B43_LEDS B43LEGACY_LEDS
+ 
+ MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \
+-	CROSS_COMPILE="$(KERNEL_CROSS)" \
+-	ARCH="$(LINUX_KARCH)" \
++	$(KERNEL_MAKE_FLAGS) \
+ 	EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS)" \
+ 	KLIB_BUILD="$(LINUX_DIR)" \
+ 	MODPROBE=true \
+@@ -1649,10 +1667,6 @@ MAKE_OPTS:= -C "$(PKG_BUILD_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)
+ ))
+@@ -1834,12 +1848,14 @@ $(eval $(call KernelPackage,rtl8180))
+ $(eval $(call KernelPackage,rtl8187))
+ $(eval $(call KernelPackage,rtlwifi))
+ $(eval $(call KernelPackage,rtlwifi-pci))
++$(eval $(call KernelPackage,rtlwifi-btcoexist))
+ $(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,rtl8821ae))
+ $(eval $(call KernelPackage,rtl8xxxu))
+ $(eval $(call KernelPackage,wlcore))
+ $(eval $(call KernelPackage,wl12xx))
+diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+index 82c374353ec98259e57c2568843ca9ef6b3a4ca2..ebd24df0d3e984bf2afc5997207509f8150509b2 100644
+--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
++++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+@@ -411,6 +411,34 @@ mac80211_check_ap() {
+ 	has_ap=1
+ }
+ 
++mac80211_iw_interface_add() {
++	local phy="$1"
++	local ifname="$2"
++	local type="$3"
++	local wdsflag="$4"
++	local rc
++
++	iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
++	rc="$?"
++
++	[ "$rc" = 233 ] && {
++		# Device might have just been deleted, give the kernel some time to finish cleaning it up
++		sleep 1
++
++		iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
++		rc="$?"
++	}
++
++	[ "$rc" = 233 ] && {
++		# Device might not support virtual interfaces, so the interface never got deleted in the first place.
++		# Check if the interface already exists, and avoid failing in this case.
++		ip link show dev "$ifname" >/dev/null 2>/dev/null && rc=0
++	}
++
++	[ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED
++	return $rc
++}
++
+ mac80211_prepare_vif() {
+ 	json_select config
+ 
+@@ -437,7 +465,7 @@ mac80211_prepare_vif() {
+ 	# It is far easier to delete and create the desired interface
+ 	case "$mode" in
+ 		adhoc)
+-			iw phy "$phy" interface add "$ifname" type adhoc
++			mac80211_iw_interface_add "$phy" "$ifname" adhoc || return
+ 		;;
+ 		ap)
+ 			# Hostapd will handle recreating the interface and
+@@ -451,21 +479,21 @@ mac80211_prepare_vif() {
+ 			mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return
+ 
+ 			[ -n "$hostapd_ctrl" ] || {
+-				iw phy "$phy" interface add "$ifname" type __ap
++				mac80211_iw_interface_add "$phy" "$ifname" __ap || return
+ 				hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}"
+ 			}
+ 		;;
+ 		mesh)
+-			iw phy "$phy" interface add "$ifname" type mp
++			mac80211_iw_interface_add "$phy" "$ifname" mp || return
+ 		;;
+ 		monitor)
+-			iw phy "$phy" interface add "$ifname" type monitor
++			mac80211_iw_interface_add "$phy" "$ifname" monitor || return
+ 		;;
+ 		sta)
+ 			local wdsflag=
+ 			staidx="$(($staidx + 1))"
+ 			[ "$wds" -gt 0 ] && wdsflag="4addr on"
+-			iw phy "$phy" interface add "$ifname" type managed $wdsflag
++			mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return
+ 			[ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
+ 			iw "$ifname" set power_save "$powersave"
+ 		;;
+diff --git a/package/kernel/mac80211/files/regdb.txt b/package/kernel/mac80211/files/regdb.txt
+index c4a9b2d15fd56c7331726cfb10e15c7acc673e8c..d583887602d2e3b337a9f878ef0aa7e58b36d8c2 100644
+--- a/package/kernel/mac80211/files/regdb.txt
++++ b/package/kernel/mac80211/files/regdb.txt
+@@ -85,12 +85,20 @@ country AT: DFS-ETSI
+ 	# 60 GHz band channels 1-4, ref: Etsi En 302 567
+ 	(57000 - 66000 @ 2160), (40)
+ 
++# Source:
++# https://www.legislation.gov.au/Details/F2016C00432
++# Both DFS-ETSI and DFS-FCC are acceptable per AS/NZS 4268 Appendix B.
++# The EIRP for DFS bands can be increased by 3dB if TPC is implemented.
++# In order to allow 80MHz operation between 5650-5730MHz the upper boundary
++# of this more restrictive band has been shifted up by 5MHz from 5725MHz.
+ country AU: DFS-ETSI
+-	(2402 - 2482 @ 40), (20)
+-	(5170 - 5250 @ 80), (17), AUTO-BW
+-	(5250 - 5330 @ 80), (24), DFS, AUTO-BW
+-	(5490 - 5710 @ 160), (24), DFS
+-	(5735 - 5835 @ 80), (30)
++	(2400 - 2483.5 @ 40), (36)
++	(5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW
++	(5250 - 5350 @ 80), (20), NO-OUTDOOR, AUTO-BW, DFS
++	(5470 - 5600 @ 80), (27), DFS
++	(5650 - 5730 @ 80), (27), DFS
++	(5730 - 5850 @ 80), (36)
++	(57000 - 66000 @ 2160), (43), NO-OUTDOOR
+ 
+ country AW: DFS-ETSI
+ 	(2402 - 2482 @ 40), (20)
+@@ -230,9 +238,9 @@ country BZ: DFS-JP
+ 
+ country CA: DFS-FCC
+ 	(2402 - 2472 @ 40), (30)
+-	(5170 - 5250 @ 80), (17), AUTO-BW
+-	(5250 - 5330 @ 80), (24), DFS, AUTO-BW
+-	(5490 - 5600 @ 80), (24), DFS
++	(5150 - 5250 @ 80), (23), AUTO-BW
++	(5250 - 5350 @ 80), (24), DFS, AUTO-BW
++	(5470 - 5600 @ 80), (24), DFS
+ 	(5650 - 5730 @ 80), (24), DFS
+ 	(5735 - 5835 @ 80), (30)
+ 
+@@ -580,11 +588,10 @@ country IL: DFS-ETSI
+ 	(5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW
+ 	(5250 - 5350 @ 80), (200 mW), NO-OUTDOOR, DFS, AUTO-BW
+ 
+-country IN: DFS-JP
++country IN:
+ 	(2402 - 2482 @ 40), (20)
+-	(5170 - 5250 @ 80), (20), AUTO-BW
+-	(5250 - 5330 @ 80), (20), DFS, AUTO-BW
+-	(5735 - 5835 @ 80), (20)
++	(5150 - 5350 @ 160), (23)
++	(5725 - 5875 @ 80), (23)
+ 
+ country IR: DFS-JP
+ 	(2402 - 2482 @ 40), (20)
+diff --git a/package/kernel/mac80211/patches/012-kernel_build_check.patch b/package/kernel/mac80211/patches/012-kernel_build_check.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..d225ba1820b911003c267809b07c565e5e42d034
+--- /dev/null
++++ b/package/kernel/mac80211/patches/012-kernel_build_check.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -2,7 +2,7 @@
++ # Makefile for the output source package
++ #
++ 
++-ifeq ($(KERNELRELEASE),)
+++ifeq ($(KERNELVERSION),)
++ 
++ MAKEFLAGS += --no-print-directory
++ SHELL := /usr/bin/env bash
+diff --git a/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch b/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch
+index 7e829faef60b721a04da969a31deb5c7b6a00990..cf551fde023a8e1ae9e4379db59616559e0ae2dc 100644
+--- a/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch
++++ b/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch
+@@ -23,11 +23,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00usb.c |  5 +++++
+  2 files changed, 13 insertions(+), 15 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-index 8fcbc8dc94c1..4b08007f93f7 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -1436,21 +1436,6 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
++@@ -1436,21 +1436,6 @@ void rt2x00lib_remove_dev(struct rt2x00_
+  	cancel_work_sync(&rt2x00dev->intf_work);
+  	cancel_delayed_work_sync(&rt2x00dev->autowakeup_work);
+  	cancel_work_sync(&rt2x00dev->sleep_work);
+@@ -49,7 +47,7 @@ index 8fcbc8dc94c1..4b08007f93f7 100644
+  
+  	/*
+  	 * Kill the tx status tasklet.
+-@@ -1466,6 +1451,14 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
++@@ -1466,6 +1451,14 @@ void rt2x00lib_remove_dev(struct rt2x00_
+  	 */
+  	rt2x00lib_uninitialize(rt2x00dev);
+  
+@@ -64,11 +62,9 @@ index 8fcbc8dc94c1..4b08007f93f7 100644
+  	/*
+  	 * Free extra components
+  	 */
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+-index 838ca58d2dd6..5a2bf9f63cd7 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+-@@ -744,6 +744,11 @@ void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev)
++@@ -744,6 +744,11 @@ void rt2x00usb_uninitialize(struct rt2x0
+  {
+  	struct data_queue *queue;
+  
+@@ -80,6 +76,3 @@ index 838ca58d2dd6..5a2bf9f63cd7 100644
+  	queue_for_each(rt2x00dev, queue)
+  		rt2x00usb_free_entries(queue);
+  }
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch b/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch
+index 6510b55c7952999db4f15fd3bc095dcc06414928..d096b64a8a18ad2c22c4fb93913fd63975dc3cd0 100644
+--- a/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch
++++ b/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch
+@@ -30,11 +30,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 4 ----
+  1 file changed, 4 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+-index 5a2bf9f63cd7..fe13dd07cc2a 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+-@@ -319,10 +319,8 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void *data)
++@@ -319,10 +319,8 @@ static bool rt2x00usb_kick_tx_entry(stru
+  			  entry->skb->data, length,
+  			  rt2x00usb_interrupt_txdone, entry);
+  
+@@ -45,7 +43,7 @@ index 5a2bf9f63cd7..fe13dd07cc2a 100644
+  		if (status == -ENODEV)
+  			clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
+  		set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
+-@@ -410,10 +408,8 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data)
++@@ -410,10 +408,8 @@ static bool rt2x00usb_kick_rx_entry(stru
+  			  entry->skb->data, entry->skb->len,
+  			  rt2x00usb_interrupt_rxdone, entry);
+  
+@@ -56,6 +54,3 @@ index 5a2bf9f63cd7..fe13dd07cc2a 100644
+  		if (status == -ENODEV)
+  			clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
+  		set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch b/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch
+index 78d8ac63d8629ee79873c8d0399ed1a1aca8e435..5ff73df2a6f4748ab7eb9074050b03dcc473da2a 100644
+--- a/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch
++++ b/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch
+@@ -36,11 +36,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 13 ++++++++-----
+  1 file changed, 8 insertions(+), 5 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+-index fe13dd07cc2a..c696f0ad6a68 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
+-@@ -825,10 +825,6 @@ int rt2x00usb_probe(struct usb_interface *usb_intf,
++@@ -825,10 +825,6 @@ int rt2x00usb_probe(struct usb_interface
+  	if (retval)
+  		goto exit_free_device;
+  
+@@ -51,7 +49,7 @@ index fe13dd07cc2a..c696f0ad6a68 100644
+  	rt2x00dev->anchor = devm_kmalloc(&usb_dev->dev,
+  					sizeof(struct usb_anchor),
+  					GFP_KERNEL);
+-@@ -836,10 +832,17 @@ int rt2x00usb_probe(struct usb_interface *usb_intf,
++@@ -836,10 +832,17 @@ int rt2x00usb_probe(struct usb_interface
+  		retval = -ENOMEM;
+  		goto exit_free_reg;
+  	}
+@@ -70,6 +68,3 @@ index fe13dd07cc2a..c696f0ad6a68 100644
+  exit_free_reg:
+  	rt2x00usb_free_reg(rt2x00dev);
+  
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch b/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch
+index d8f262af850ef85ce74be1d1a4b0bceb67928f66..274d8f7c3f819f2908778561cfa1acbcab7531d1 100644
+--- a/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch
++++ b/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch
+@@ -9,11 +9,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt61pci.c | 3 +--
+  1 file changed, 1 insertion(+), 2 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+-index 5306a3b2622d..8adb5f3abe15 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+-@@ -1903,8 +1903,7 @@ static void rt61pci_write_tx_desc(struct queue_entry *entry,
++@@ -1903,8 +1903,7 @@ static void rt61pci_write_tx_desc(struct
+  
+  	rt2x00_desc_read(txd, 5, &word);
+  	rt2x00_set_field32(&word, TXD_W5_PID_TYPE, entry->queue->qid);
+@@ -23,6 +21,3 @@ index 5306a3b2622d..8adb5f3abe15 100644
+  	rt2x00_set_field32(&word, TXD_W5_TX_POWER,
+  			   TXPOWER_TO_DEV(entry->queue->rt2x00dev->tx_power));
+  	rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1);
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch b/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch
+index 04a5118103f219c9b4d737c27cfc80f8ee121e2a..241c1127bcd3a9162b7c4b466e54266a8d43dbe4 100644
+--- a/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch
++++ b/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch
+@@ -18,11 +18,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt73usb.c     | 2 +-
+  10 files changed, 15 insertions(+), 14 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
+-index 085c5b423bdf..19874439ac40 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
+-@@ -1200,7 +1200,7 @@ static void rt2400pci_write_beacon(struct queue_entry *entry,
++@@ -1200,7 +1200,7 @@ static void rt2400pci_write_beacon(struc
+  	/*
+  	 * Dump beacon to userspace through debugfs.
+  	 */
+@@ -31,11 +29,9 @@ index 085c5b423bdf..19874439ac40 100644
+  out:
+  	/*
+  	 * Enable beaconing again.
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
+-index 9832fd50c793..791434de8052 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
+-@@ -1349,7 +1349,7 @@ static void rt2500pci_write_beacon(struct queue_entry *entry,
++@@ -1349,7 +1349,7 @@ static void rt2500pci_write_beacon(struc
+  	/*
+  	 * Dump beacon to userspace through debugfs.
+  	 */
+@@ -44,11 +40,9 @@ index 9832fd50c793..791434de8052 100644
+  out:
+  	/*
+  	 * Enable beaconing again.
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+-index cd3ab5a9e98d..62357465fe29 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+-@@ -1170,7 +1170,7 @@ static void rt2500usb_write_beacon(struct queue_entry *entry,
++@@ -1170,7 +1170,7 @@ static void rt2500usb_write_beacon(struc
+  	/*
+  	 * Dump beacon to userspace through debugfs.
+  	 */
+@@ -57,11 +51,9 @@ index cd3ab5a9e98d..62357465fe29 100644
+  
+  	/*
+  	 * USB devices cannot blindly pass the skb->len as the
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 572cdea4ca25..8223a1520316 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -1014,7 +1014,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
++@@ -1014,7 +1014,7 @@ void rt2800_write_beacon(struct queue_en
+  	/*
+  	 * Dump beacon to userspace through debugfs.
+  	 */
+@@ -70,11 +62,9 @@ index 572cdea4ca25..8223a1520316 100644
+  
+  	/*
+  	 * Write entire beacon with TXWI and padding to register.
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-index ea299c4e7ada..26869b3bef45 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-@@ -1400,11 +1400,11 @@ void rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop);
++@@ -1400,11 +1400,11 @@ void rt2x00queue_flush_queues(struct rt2
+   */
+  #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
+  void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
+@@ -88,11 +78,9 @@ index ea299c4e7ada..26869b3bef45 100644
+  {
+  }
+  #endif /* CPTCFG_RT2X00_LIB_DEBUGFS */
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
+-index 72ae530e4a3b..964aefdc11f0 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
+-@@ -157,9 +157,10 @@ void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
++@@ -157,9 +157,10 @@ void rt2x00debug_update_crypto(struct rt
+  }
+  
+  void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
+@@ -104,7 +92,7 @@ index 72ae530e4a3b..964aefdc11f0 100644
+  	struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
+  	struct sk_buff *skbcopy;
+  	struct rt2x00dump_hdr *dump_hdr;
+-@@ -196,8 +197,8 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
++@@ -196,8 +197,8 @@ void rt2x00debug_dump_frame(struct rt2x0
+  	dump_hdr->chip_rf = cpu_to_le16(rt2x00dev->chip.rf);
+  	dump_hdr->chip_rev = cpu_to_le16(rt2x00dev->chip.rev);
+  	dump_hdr->type = cpu_to_le16(type);
+@@ -115,11 +103,9 @@ index 72ae530e4a3b..964aefdc11f0 100644
+  	dump_hdr->timestamp_sec = cpu_to_le32(timestamp.tv_sec);
+  	dump_hdr->timestamp_usec = cpu_to_le32(timestamp.tv_usec);
+  
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-index 4b08007f93f7..dd6678109b7e 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -363,7 +363,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
++@@ -363,7 +363,7 @@ void rt2x00lib_txdone(struct queue_entry
+  	 * Send frame to debugfs immediately, after this call is completed
+  	 * we are going to overwrite the skb->cb array.
+  	 */
+@@ -128,7 +114,7 @@ index 4b08007f93f7..dd6678109b7e 100644
+  
+  	/*
+  	 * Determine if the frame has been successfully transmitted and
+-@@ -772,7 +772,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp)
++@@ -772,7 +772,7 @@ void rt2x00lib_rxdone(struct queue_entry
+  	 */
+  	rt2x00link_update_stats(rt2x00dev, entry->skb, &rxdesc);
+  	rt2x00debug_update_crypto(rt2x00dev, &rxdesc);
+@@ -137,11 +123,9 @@ index 4b08007f93f7..dd6678109b7e 100644
+  
+  	/*
+  	 * Initialize RX status information, and send frame
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+-index b2364d378774..380daf4e1b8d 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+-@@ -544,7 +544,7 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry,
++@@ -544,7 +544,7 @@ static void rt2x00queue_write_tx_descrip
+  	 * All processing on the frame has been completed, this means
+  	 * it is now ready to be dumped to userspace through debugfs.
+  	 */
+@@ -150,11 +134,9 @@ index b2364d378774..380daf4e1b8d 100644
+  }
+  
+  static void rt2x00queue_kick_tx_queue(struct data_queue *queue,
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+-index 8adb5f3abe15..973d418b8113 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+-@@ -1988,7 +1988,7 @@ static void rt61pci_write_beacon(struct queue_entry *entry,
++@@ -1988,7 +1988,7 @@ static void rt61pci_write_beacon(struct
+  	/*
+  	 * Dump beacon to userspace through debugfs.
+  	 */
+@@ -163,11 +145,9 @@ index 8adb5f3abe15..973d418b8113 100644
+  
+  	/*
+  	 * Write entire beacon with descriptor and padding to register.
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt73usb.c b/drivers/net/wireless/ralink/rt2x00/rt73usb.c
+-index 1a29c4d205a5..bb8d307a789f 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c
+-@@ -1557,7 +1557,7 @@ static void rt73usb_write_beacon(struct queue_entry *entry,
++@@ -1557,7 +1557,7 @@ static void rt73usb_write_beacon(struct
+  	/*
+  	 * Dump beacon to userspace through debugfs.
+  	 */
+@@ -176,6 +156,3 @@ index 1a29c4d205a5..bb8d307a789f 100644
+  
+  	/*
+  	 * Write entire beacon with descriptor and padding to register.
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch b/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch
+index d8194acd2345a3d0536a0742fe84cddb5b4832fe..c2ef9c1bb0dda0fd116ab66ffb89783b3a433114 100644
+--- a/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch
++++ b/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch
+@@ -13,11 +13,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 2 --
+  2 files changed, 5 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+-index 380daf4e1b8d..e1660b92b20c 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+-@@ -83,7 +83,6 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
++@@ -83,7 +83,6 @@ struct sk_buff *rt2x00queue_alloc_rxskb(
+  	 */
+  	skbdesc = get_skb_frame_desc(skb);
+  	memset(skbdesc, 0, sizeof(*skbdesc));
+@@ -25,7 +23,7 @@ index 380daf4e1b8d..e1660b92b20c 100644
+  
+  	if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_DMA)) {
+  		dma_addr_t skb_dma;
+-@@ -689,7 +688,6 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
++@@ -689,7 +688,6 @@ int rt2x00queue_write_tx_frame(struct da
+  		goto out;
+  	}
+  
+@@ -33,7 +31,7 @@ index 380daf4e1b8d..e1660b92b20c 100644
+  	entry->skb = skb;
+  
+  	/*
+-@@ -774,7 +772,6 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
++@@ -774,7 +772,6 @@ int rt2x00queue_update_beacon(struct rt2
+  	 */
+  	skbdesc = get_skb_frame_desc(intf->beacon->skb);
+  	memset(skbdesc, 0, sizeof(*skbdesc));
+@@ -41,8 +39,6 @@ index 380daf4e1b8d..e1660b92b20c 100644
+  
+  	/*
+  	 * Send beacon to hardware.
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+-index 2233b911a1d7..22d18818e850 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+ @@ -116,8 +116,6 @@ struct skb_frame_desc {
+@@ -54,6 +50,3 @@ index 2233b911a1d7..22d18818e850 100644
+  };
+  
+  /**
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch b/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch
+index a82886d234cd2ee8807a80bbd0cf071e4b9cd982..65496ca467a30c6a5f5633f7dce804ca6d2214c9 100644
+--- a/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch
++++ b/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch
+@@ -21,11 +21,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2500usb.c | 19 +++++--------------
+  1 file changed, 5 insertions(+), 14 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+-index 62357465fe29..0d2670a56c4c 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+-@@ -55,7 +55,7 @@ MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
++@@ -55,7 +55,7 @@ MODULE_PARM_DESC(nohwcrypt, "Disable har
+   * If the csr_mutex is already held then the _lock variants must
+   * be used instead.
+   */
+@@ -34,7 +32,7 @@ index 62357465fe29..0d2670a56c4c 100644
+  					   const unsigned int offset,
+  					   u16 *value)
+  {
+-@@ -66,7 +66,7 @@ static inline void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev,
++@@ -66,7 +66,7 @@ static inline void rt2500usb_register_re
+  	*value = le16_to_cpu(reg);
+  }
+  
+@@ -43,7 +41,7 @@ index 62357465fe29..0d2670a56c4c 100644
+  						const unsigned int offset,
+  						u16 *value)
+  {
+-@@ -77,16 +77,7 @@ static inline void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev,
++@@ -77,16 +77,7 @@ static inline void rt2500usb_register_re
+  	*value = le16_to_cpu(reg);
+  }
+  
+@@ -61,7 +59,7 @@ index 62357465fe29..0d2670a56c4c 100644
+  					    const unsigned int offset,
+  					    u16 value)
+  {
+-@@ -96,7 +87,7 @@ static inline void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev,
++@@ -96,7 +87,7 @@ static inline void rt2500usb_register_wr
+  				      &reg, sizeof(reg));
+  }
+  
+@@ -70,7 +68,7 @@ index 62357465fe29..0d2670a56c4c 100644
+  						 const unsigned int offset,
+  						 u16 value)
+  {
+-@@ -106,7 +97,7 @@ static inline void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev,
++@@ -106,7 +97,7 @@ static inline void rt2500usb_register_wr
+  				       &reg, sizeof(reg), REGISTER_TIMEOUT);
+  }
+  
+@@ -79,6 +77,3 @@ index 62357465fe29..0d2670a56c4c 100644
+  						 const unsigned int offset,
+  						 void *value, const u16 length)
+  {
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch b/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
+index c2fa92641ad231558b4d9dcadeb59e7d4504ba74..8b61235e112f742304ab0b15d00737183168624c 100644
+--- a/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
++++ b/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
+@@ -21,8 +21,6 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 23 +++++++++++++++++++++++
+  2 files changed, 23 insertions(+), 25 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+-index 256496bfbafb..0e7051d8132f 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ @@ -2987,29 +2987,4 @@ enum rt2800_eeprom_word {
+@@ -55,8 +53,6 @@ index 256496bfbafb..0e7051d8132f 100644
+ -};
+ -
+  #endif /* RT2800_H */
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+-index 0a8b4df665fe..8e1ae138c3f1 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ @@ -20,6 +20,29 @@
+@@ -89,6 +85,3 @@ index 0a8b4df665fe..8e1ae138c3f1 100644
+  struct rt2800_ops {
+  	void (*register_read)(struct rt2x00_dev *rt2x00dev,
+  			      const unsigned int offset, u32 *value);
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch b/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch
+index e6c829cbf8048e28a7910b58f07a064f43d1b9b6..922c35833ced8cd7b6c0b3361facbbff0ff133d8 100644
+--- a/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch
++++ b/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch
+@@ -14,8 +14,6 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 3 ++-
+  3 files changed, 8 insertions(+), 1 deletion(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 8223a1520316..46405cce35e0 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ @@ -855,11 +855,13 @@ EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
+@@ -32,7 +30,7 @@ index 8223a1520316..46405cce35e0 100644
+  
+  	/*
+  	 * Obtain the status about this packet.
+-@@ -872,6 +874,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
++@@ -872,6 +874,7 @@ void rt2800_txdone_entry(struct queue_en
+  
+  	real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
+  	aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE);
+@@ -40,7 +38,7 @@ index 8223a1520316..46405cce35e0 100644
+  
+  	/*
+  	 * If a frame was meant to be sent as a single non-aggregated MPDU
+-@@ -1468,6 +1471,7 @@ int rt2800_sta_add(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif,
++@@ -1468,6 +1471,7 @@ int rt2800_sta_add(struct rt2x00_dev *rt
+  		return 0;
+  
+  	__set_bit(wcid - WCID_START, drv_data->sta_ids);
+@@ -48,7 +46,7 @@ index 8223a1520316..46405cce35e0 100644
+  
+  	/*
+  	 * Clean up WCID attributes and write STA address to the device.
+-@@ -1498,6 +1502,7 @@ int rt2800_sta_remove(struct rt2x00_dev *rt2x00dev, struct ieee80211_sta *sta)
++@@ -1498,6 +1502,7 @@ int rt2800_sta_remove(struct rt2x00_dev
+  	 * get renewed when the WCID is reused.
+  	 */
+  	rt2800_config_wcid(rt2x00dev, NULL, wcid);
+@@ -56,8 +54,6 @@ index 8223a1520316..46405cce35e0 100644
+  	__clear_bit(wcid - WCID_START, drv_data->sta_ids);
+  
+  	return 0;
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+-index 8e1ae138c3f1..6811d677a6e7 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ @@ -41,6 +41,7 @@ struct rt2800_drv_data {
+@@ -68,8 +64,6 @@ index 8e1ae138c3f1..6811d677a6e7 100644
+  };
+  
+  struct rt2800_ops {
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+-index 22d18818e850..9b297fce4692 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+ @@ -102,7 +102,7 @@ enum skb_frame_desc_flags {
+@@ -89,6 +83,3 @@ index 22d18818e850..9b297fce4692 100644
+  };
+  
+  /**
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch b/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch
+index 278d2d6071a1d4b2bdeea891384692e9e22d45b6..84f2732b2216ac066b08ace5aff5ec515144b09b 100644
+--- a/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch
++++ b/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch
+@@ -12,11 +12,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 141 +++++++++++++------------
+  1 file changed, 76 insertions(+), 65 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-index dd6678109b7e..b5d90fefc96b 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -313,73 +313,14 @@ static inline int rt2x00lib_txdone_bar_status(struct queue_entry *entry)
++@@ -313,73 +313,14 @@ static inline int rt2x00lib_txdone_bar_s
+  	return ret;
+  }
+  
+@@ -96,7 +94,7 @@ index dd6678109b7e..b5d90fefc96b 100644
+  
+  	rate_idx = skbdesc->tx_rate_idx;
+  	rate_flags = skbdesc->tx_rate_flags;
+-@@ -448,6 +389,76 @@ void rt2x00lib_txdone(struct queue_entry *entry,
++@@ -448,6 +389,76 @@ void rt2x00lib_txdone(struct queue_entry
+  		else
+  			rt2x00dev->low_level_stats.dot11RTSFailureCount++;
+  	}
+@@ -173,6 +171,3 @@ index dd6678109b7e..b5d90fefc96b 100644
+  
+  	/*
+  	 * Only send the status report to mac80211 when it's a frame
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch b/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch
+index b28d894fc69998b6fcf2b1f8ec9e983a8f35760c..e1359397ba37af5a1561a4a8270dfeaf4e86ffcb 100644
+--- a/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch
++++ b/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch
+@@ -12,11 +12,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 51 +++++++++++++++-----------
+  1 file changed, 29 insertions(+), 22 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-index b5d90fefc96b..03b368ac9cb6 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -391,6 +391,32 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev,
++@@ -391,6 +391,32 @@ static void rt2x00lib_fill_tx_status(str
+  	}
+  }
+  
+@@ -49,7 +47,7 @@ index b5d90fefc96b..03b368ac9cb6 100644
+  void rt2x00lib_txdone(struct queue_entry *entry,
+  		      struct txdone_entry_desc *txdesc)
+  {
+-@@ -471,30 +497,11 @@ void rt2x00lib_txdone(struct queue_entry *entry,
++@@ -471,30 +497,11 @@ void rt2x00lib_txdone(struct queue_entry
+  			ieee80211_tx_status(rt2x00dev->hw, entry->skb);
+  		else
+  			ieee80211_tx_status_ni(rt2x00dev->hw, entry->skb);
+@@ -83,6 +81,3 @@ index b5d90fefc96b..03b368ac9cb6 100644
+  }
+  EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
+  
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch b/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch
+index 7bec546a9e62d7647a11560f6c04e0d7c281b094..60edb08e751f5a4daae61c4f515c2c699b67db63 100644
+--- a/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch
++++ b/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch
+@@ -13,11 +13,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 50 ++++++++++++++++++++++++++
+  2 files changed, 52 insertions(+)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-index 340787894c69..91ba10fdf732 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-@@ -1425,6 +1425,8 @@ void rt2x00lib_dmastart(struct queue_entry *entry);
++@@ -1425,6 +1425,8 @@ void rt2x00lib_dmastart(struct queue_ent
+  void rt2x00lib_dmadone(struct queue_entry *entry);
+  void rt2x00lib_txdone(struct queue_entry *entry,
+  		      struct txdone_entry_desc *txdesc);
+@@ -26,11 +24,9 @@ index 340787894c69..91ba10fdf732 100644
+  void rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status);
+  void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp);
+  
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-index 03b368ac9cb6..90fc259fb5bc 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -417,6 +417,56 @@ static void rt2x00lib_clear_entry(struct rt2x00_dev *rt2x00dev,
++@@ -417,6 +417,56 @@ static void rt2x00lib_clear_entry(struct
+  	spin_unlock_bh(&entry->queue->tx_lock);
+  }
+  
+@@ -87,6 +83,3 @@ index 03b368ac9cb6..90fc259fb5bc 100644
+  void rt2x00lib_txdone(struct queue_entry *entry,
+  		      struct txdone_entry_desc *txdesc)
+  {
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch b/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch
+index bb35f2d3005aca4df52f115bacf894a0a8909ce9..a0cc37f491a44e49127f525bbc6f01ab0fe1db5f 100644
+--- a/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch
++++ b/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch
+@@ -13,11 +13,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 1 +
+  2 files changed, 6 insertions(+), 1 deletion(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-index 90fc259fb5bc..e95d2aad3b3f 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -357,6 +357,9 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev,
++@@ -357,6 +357,9 @@ static void rt2x00lib_fill_tx_status(str
+  	if (i < (IEEE80211_TX_MAX_RATES - 1))
+  		tx_info->status.rates[i].idx = -1; /* terminate */
+  
+@@ -27,7 +25,7 @@ index 90fc259fb5bc..e95d2aad3b3f 100644
+  	if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) {
+  		if (success)
+  			tx_info->flags |= IEEE80211_TX_STAT_ACK;
+-@@ -375,7 +378,8 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev,
++@@ -375,7 +378,8 @@ static void rt2x00lib_fill_tx_status(str
+  	 */
+  	if (test_bit(TXDONE_AMPDU, &txdesc->flags) ||
+  	    tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
+@@ -37,8 +35,6 @@ index 90fc259fb5bc..e95d2aad3b3f 100644
+  		tx_info->status.ampdu_len = 1;
+  		tx_info->status.ampdu_ack_len = success ? 1 : 0;
+  
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+-index 9b297fce4692..c78fb8c8838a 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
+ @@ -215,6 +215,7 @@ enum txdone_entry_desc_flags {
+@@ -49,6 +45,3 @@ index 9b297fce4692..c78fb8c8838a 100644
+  };
+  
+  /**
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch b/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch
+index f4e4b8b075f5df37429ef36cca0828c72b9592f2..1e23ef7bcbcb5aaed507e0879e25038b3dea6fc5 100644
+--- a/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch
++++ b/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch
+@@ -23,11 +23,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2800usb.c  | 18 ++++++--------
+  4 files changed, 35 insertions(+), 19 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 46405cce35e0..4a7bec708a13 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -852,7 +852,8 @@ void rt2800_process_rxwi(struct queue_entry *entry,
++@@ -852,7 +852,8 @@ void rt2800_process_rxwi(struct queue_en
+  }
+  EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
+  
+@@ -37,7 +35,7 @@ index 46405cce35e0..4a7bec708a13 100644
+  {
+  	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
+  	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
+-@@ -860,8 +861,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
++@@ -860,8 +861,7 @@ void rt2800_txdone_entry(struct queue_en
+  	struct txdone_entry_desc txdesc;
+  	u32 word;
+  	u16 mcs, real_mcs;
+@@ -47,7 +45,7 @@ index 46405cce35e0..4a7bec708a13 100644
+  
+  	/*
+  	 * Obtain the status about this packet.
+-@@ -875,6 +875,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
++@@ -875,6 +875,7 @@ void rt2800_txdone_entry(struct queue_en
+  	real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
+  	aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE);
+  	wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID);
+@@ -55,7 +53,7 @@ index 46405cce35e0..4a7bec708a13 100644
+  
+  	/*
+  	 * If a frame was meant to be sent as a single non-aggregated MPDU
+-@@ -891,8 +892,12 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
++@@ -891,8 +892,12 @@ void rt2800_txdone_entry(struct queue_en
+  	 * Hence, replace the requested rate with the real tx rate to not
+  	 * confuse the rate control algortihm by providing clearly wrong
+  	 * data.
+@@ -70,7 +68,7 @@ index 46405cce35e0..4a7bec708a13 100644
+  		skbdesc->tx_rate_idx = real_mcs;
+  		mcs = real_mcs;
+  	}
+-@@ -900,6 +905,9 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
++@@ -900,6 +905,9 @@ void rt2800_txdone_entry(struct queue_en
+  	if (aggr == 1 || ampdu == 1)
+  		__set_bit(TXDONE_AMPDU, &txdesc.flags);
+  
+@@ -80,7 +78,7 @@ index 46405cce35e0..4a7bec708a13 100644
+  	/*
+  	 * Ralink has a retry mechanism using a global fallback
+  	 * table. We setup this fallback table to try the immediate
+-@@ -931,7 +939,18 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
++@@ -931,7 +939,18 @@ void rt2800_txdone_entry(struct queue_en
+  	if (txdesc.retry)
+  		__set_bit(TXDONE_FALLBACK, &txdesc.flags);
+  
+@@ -100,11 +98,9 @@ index 46405cce35e0..4a7bec708a13 100644
+  }
+  EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
+  
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+-index 6811d677a6e7..d9ef260d542a 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+-@@ -191,7 +191,8 @@ void rt2800_write_tx_data(struct queue_entry *entry,
++@@ -191,7 +191,8 @@ void rt2800_write_tx_data(struct queue_e
+  			  struct txentry_desc *txdesc);
+  void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc);
+  
+@@ -114,11 +110,9 @@ index 6811d677a6e7..d9ef260d542a 100644
+  
+  void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
+  void rt2800_clear_beacon(struct queue_entry *entry);
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+-index de4790b41be7..3ab3b5323897 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+-@@ -239,7 +239,7 @@ static bool rt2800mmio_txdone_release_entries(struct queue_entry *entry,
++@@ -239,7 +239,7 @@ static bool rt2800mmio_txdone_release_en
+  {
+  	if (test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
+  		rt2800_txdone_entry(entry, entry->status,
+@@ -127,11 +121,9 @@ index de4790b41be7..3ab3b5323897 100644
+  		return false;
+  	}
+  
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
+-index 205a7b8ac8a7..f11e3f532a84 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
+-@@ -501,8 +501,7 @@ static int rt2800usb_get_tx_data_len(struct queue_entry *entry)
++@@ -501,8 +501,7 @@ static int rt2800usb_get_tx_data_len(str
+  /*
+   * TX control handlers
+   */
+@@ -141,7 +133,7 @@ index 205a7b8ac8a7..f11e3f532a84 100644
+  {
+  	__le32 *txwi;
+  	u32 word;
+-@@ -515,7 +514,7 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
++@@ -515,7 +514,7 @@ rt2800usb_txdone_entry_check(struct queu
+  	 * frame.
+  	 */
+  	if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
+@@ -150,7 +142,7 @@ index 205a7b8ac8a7..f11e3f532a84 100644
+  
+  	wcid	= rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
+  	ack	= rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
+-@@ -537,10 +536,10 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
++@@ -537,10 +536,10 @@ rt2800usb_txdone_entry_check(struct queu
+  		rt2x00_dbg(entry->queue->rt2x00dev,
+  			   "TX status report missed for queue %d entry %d\n",
+  			   entry->queue->qid, entry->entry_idx);
+@@ -163,7 +155,7 @@ index 205a7b8ac8a7..f11e3f532a84 100644
+  }
+  
+  static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
+-@@ -549,7 +548,7 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
++@@ -549,7 +548,7 @@ static void rt2800usb_txdone(struct rt2x
+  	struct queue_entry *entry;
+  	u32 reg;
+  	u8 qid;
+@@ -172,7 +164,7 @@ index 205a7b8ac8a7..f11e3f532a84 100644
+  
+  	while (kfifo_get(&rt2x00dev->txstatus_fifo, &reg)) {
+  		/*
+-@@ -574,11 +573,8 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)
++@@ -574,11 +573,8 @@ static void rt2800usb_txdone(struct rt2x
+  			break;
+  		}
+  
+@@ -186,6 +178,3 @@ index 205a7b8ac8a7..f11e3f532a84 100644
+  	}
+  }
+  
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch b/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch
+index 4e18dc8e2ae984ac809785b4a37d7bcf5b410eaa..37838e889567ddbe8ebec79d91c5b71ed3cbfc8a 100644
+--- a/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch
++++ b/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch
+@@ -17,8 +17,6 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 35 +++++++++++++++++++++++++-
+  2 files changed, 36 insertions(+), 1 deletion(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+-index 0e7051d8132f..480b08601785 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ @@ -1760,6 +1760,8 @@
+@@ -30,11 +28,9 @@ index 0e7051d8132f..480b08601785 100644
+  #define TX_STA_FIFO_PHYMODE		FIELD32(0xc0000000)
+  
+  /*
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 4a7bec708a13..8d00c599e47a 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_entry *entry,
++@@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_en
+  }
+  EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
+  
+@@ -74,7 +70,7 @@ index 4a7bec708a13..8d00c599e47a 100644
+  void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
+  			 bool match)
+  {
+-@@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
++@@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_en
+  	 * and provide retry count.
+   	 */
+  	if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) {
+@@ -83,6 +79,3 @@ index 4a7bec708a13..8d00c599e47a 100644
+  		mcs = real_mcs;
+  	}
+  
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch b/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch
+index 31d79bb751b05b410f1b84261284e4de347912c6..7825810cef9b978c0e076961af4492b3a9eda344 100644
+--- a/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch
++++ b/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch
+@@ -14,11 +14,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 7 ++++---
+  1 file changed, 4 insertions(+), 3 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+-index e1660b92b20c..a2c1ca5c76d1 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
+-@@ -372,15 +372,16 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
++@@ -372,15 +372,16 @@ static void rt2x00queue_create_tx_descri
+  
+  	/*
+  	 * Determine IFS values
+@@ -38,6 +36,3 @@ index e1660b92b20c..a2c1ca5c76d1 100644
+  		txdesc->u.ht.txop = TXOP_BACKOFF;
+  	else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
+  		txdesc->u.ht.txop = TXOP_SIFS;
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch b/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch
+index 4e53092d12aac787c365f2ee2be55c333ca71cdd..415bf5b2a6dabf1292a2b54f35e066618ff2d8ac 100644
+--- a/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch
++++ b/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch
+@@ -10,11 +10,9 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 +-
+  1 file changed, 1 insertion(+), 1 deletion(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-index 91ba10fdf732..ce340bfd71a0 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-@@ -1396,7 +1396,7 @@ void rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop);
++@@ -1396,7 +1396,7 @@ void rt2x00queue_flush_queues(struct rt2
+   * rt2x00debug_dump_frame - Dump a frame to userspace through debugfs.
+   * @rt2x00dev: Pointer to &struct rt2x00_dev.
+   * @type: The type of frame that is being dumped.
+@@ -23,6 +21,3 @@ index 91ba10fdf732..ce340bfd71a0 100644
+   */
+  #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
+  void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch b/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch
+index 3cf342d6903e86830d497999ad76750b85c20084..c6fb7dd2c4b926017b023826bff0acebe3bc1501 100644
+--- a/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch
++++ b/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch
+@@ -13,8 +13,6 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2800.h | 8 ++++----
+  1 file changed, 4 insertions(+), 4 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+-index 480b08601785..fd1dbd956bad 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ @@ -1171,10 +1171,10 @@
+@@ -32,6 +30,3 @@ index 480b08601785..fd1dbd956bad 100644
+  
+  /*
+   * TX_PIN_CFG:
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch b/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch
+index 7b99312744c7704264b15a52ce4fa70450c62040..b91e5821cdf4b1ece474fb84f222c9220929fa44 100644
+--- a/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch
++++ b/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch
+@@ -19,8 +19,6 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+  drivers/net/wireless/ralink/rt2x00/rt2x00.h    |    1 +
+  5 files changed, 1578 insertions(+), 27 deletions(-)
+ 
+-diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig b/drivers/net/wireless/ralink/rt2x00/Kconfig
+-index de62f5dcb62f..a1d1cfe214d2 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/Kconfig
+ +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
+ @@ -210,7 +210,7 @@ endif
+@@ -32,8 +30,6 @@ index de62f5dcb62f..a1d1cfe214d2 100644
+  	select RT2X00_LIB_SOC
+  	select RT2X00_LIB_MMIO
+  	select RT2X00_LIB_CRYPTO
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+-index fd1dbd956bad..6a8c93fb6a43 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ @@ -79,6 +79,7 @@
+@@ -376,8 +372,6 @@ index fd1dbd956bad..6a8c93fb6a43 100644
+  	EEPROM_TSSI_BOUND_A1,
+  	EEPROM_TSSI_BOUND_A2,
+  	EEPROM_TSSI_BOUND_A3,
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 8d00c599e47a..201b12ed90c6 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ @@ -59,6 +59,9 @@
+@@ -390,7 +384,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  #define WAIT_FOR_RF(__dev, __reg) \
+  	rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg))
+  #define WAIT_FOR_MCU(__dev, __reg) \
+-@@ -150,19 +153,56 @@ static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev,
++@@ -150,19 +153,56 @@ static void rt2800_rfcsr_write(struct rt
+  	 * Wait until the RFCSR becomes available, afterwards we
+  	 * can safely write the new data into the register.
+  	 */
+@@ -413,8 +407,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+ +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
+ +		}
+ +		break;
+- 
+--		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
+++
+ +	default:
+ +		if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
+ +			reg = 0;
+@@ -422,7 +415,8 @@ index 8d00c599e47a..201b12ed90c6 100644
+ +			rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
+ +			rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 1);
+ +			rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
+-+
++ 
++-		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
+ +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
+ +		}
+ +		break;
+@@ -454,7 +448,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
+  			      const unsigned int word, u8 *value)
+  {
+-@@ -178,22 +218,48 @@ static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
++@@ -178,22 +218,48 @@ static void rt2800_rfcsr_read(struct rt2
+  	 * doesn't become available in time, reg will be 0xffffffff
+  	 * which means we return 0xff to the caller.
+  	 */
+@@ -479,11 +473,11 @@ index 8d00c599e47a..201b12ed90c6 100644
+ -	}
+ +			WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg);
+ +		}
+- 
+--	*value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
+++
+ +		*value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA_MT7620);
+ +		break;
+-+
++ 
++-	*value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
+ +	default:
+ +		if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
+ +			reg = 0;
+@@ -512,7 +506,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev,
+  			    const unsigned int word, const u32 value)
+  {
+-@@ -250,6 +316,7 @@ static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
++@@ -250,6 +316,7 @@ static const unsigned int rt2800_eeprom_
+  	[EEPROM_TSSI_BOUND_BG5]		= 0x003b,
+  	[EEPROM_TXPOWER_A1]		= 0x003c,
+  	[EEPROM_TXPOWER_A2]		= 0x0053,
+@@ -520,7 +514,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	[EEPROM_TSSI_BOUND_A1]		= 0x006a,
+  	[EEPROM_TSSI_BOUND_A2]		= 0x006b,
+  	[EEPROM_TSSI_BOUND_A3]		= 0x006c,
+-@@ -524,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
++@@ -524,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt
+  		break;
+  
+  	case RT5592:
+@@ -528,7 +522,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		*txwi_size = TXWI_DESC_SIZE_5WORDS;
+  		*rxwi_size = RXWI_DESC_SIZE_6WORDS;
+  		break;
+-@@ -2810,7 +2878,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
++@@ -2810,7 +2878,8 @@ static void rt2800_config_channel_rf53xx
+  				rt2800_rfcsr_write(rt2x00dev, 59,
+  						   r59_nonbt_rev[idx]);
+  			} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+@@ -538,7 +532,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  				static const char r59_non_bt[] = {0x8f, 0x8f,
+  					0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
+  					0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
+-@@ -3104,6 +3173,242 @@ static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev,
++@@ -3104,6 +3173,242 @@ static void rt2800_config_channel_rf55xx
+  	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F);
+  }
+  
+@@ -781,7 +775,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
+  					   const unsigned int word,
+  					   const u8 value)
+-@@ -3228,7 +3533,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3228,7 +3533,7 @@ static void rt2800_config_channel(struct
+  				  struct channel_info *info)
+  {
+  	u32 reg;
+@@ -790,7 +784,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	u8 bbp, rfcsr;
+  
+  	info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
+-@@ -3273,6 +3578,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3273,6 +3578,9 @@ static void rt2800_config_channel(struct
+  	case RF5592:
+  		rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info);
+  		break;
+@@ -800,7 +794,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	default:
+  		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
+  	}
+-@@ -3347,7 +3655,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3347,7 +3655,8 @@ static void rt2800_config_channel(struct
+  
+  	if (rf->channel <= 14) {
+  		if (!rt2x00_rt(rt2x00dev, RT5390) &&
+@@ -810,7 +804,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  			if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+  				rt2800_bbp_write(rt2x00dev, 82, 0x62);
+  				rt2800_bbp_write(rt2x00dev, 75, 0x46);
+-@@ -3367,7 +3676,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3367,7 +3676,7 @@ static void rt2800_config_channel(struct
+  			rt2800_bbp_write(rt2x00dev, 82, 0x94);
+  		else if (rt2x00_rt(rt2x00dev, RT3593))
+  			rt2800_bbp_write(rt2x00dev, 82, 0x82);
+@@ -819,7 +813,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  			rt2800_bbp_write(rt2x00dev, 82, 0xf2);
+  
+  		if (rt2x00_rt(rt2x00dev, RT3593))
+-@@ -3388,7 +3697,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3388,7 +3697,7 @@ static void rt2800_config_channel(struct
+  	if (rt2x00_rt(rt2x00dev, RT3572))
+  		rt2800_rfcsr_write(rt2x00dev, 8, 0);
+  
+@@ -828,7 +822,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  
+  	switch (rt2x00dev->default_ant.tx_chain_num) {
+  	case 3:
+-@@ -3437,6 +3746,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3437,6 +3746,7 @@ static void rt2800_config_channel(struct
+  
+  	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
+  	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
+@@ -836,7 +830,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  
+  	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
+  
+-@@ -3495,7 +3805,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
++@@ -3495,7 +3805,7 @@ static void rt2800_config_channel(struct
+  		usleep_range(1000, 1500);
+  	}
+  
+@@ -845,7 +839,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		rt2800_bbp_write(rt2x00dev, 195, 141);
+  		rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
+  
+-@@ -4182,6 +4492,128 @@ static void rt2800_config_txpower_rt3593(struct rt2x00_dev *rt2x00dev,
++@@ -4182,6 +4492,128 @@ static void rt2800_config_txpower_rt3593
+  			   (unsigned long) regs[i]);
+  }
+  
+@@ -974,7 +968,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  /*
+   * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and
+   * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values,
+-@@ -4378,6 +4810,8 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
++@@ -4378,6 +4810,8 @@ static void rt2800_config_txpower(struct
+  {
+  	if (rt2x00_rt(rt2x00dev, RT3593))
+  		rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
+@@ -983,7 +977,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	else
+  		rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
+  }
+-@@ -4393,6 +4827,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
++@@ -4393,6 +4827,7 @@ void rt2800_vco_calibration(struct rt2x0
+  {
+  	u32	tx_pin;
+  	u8	rfcsr;
+@@ -991,7 +985,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  
+  	/*
+  	 * A voltage-controlled oscillator(VCO) is an electronic oscillator
+-@@ -4431,6 +4866,15 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
++@@ -4431,6 +4866,15 @@ void rt2800_vco_calibration(struct rt2x0
+  		rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
+  		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
+  		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
+@@ -1007,7 +1001,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		break;
+  	default:
+  		WARN_ONCE(1, "Not supported RF chipet %x for VCO recalibration",
+-@@ -4438,7 +4882,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
++@@ -4438,7 +4882,8 @@ void rt2800_vco_calibration(struct rt2x0
+  		return;
+  	}
+  
+@@ -1017,7 +1011,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  
+  	rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
+  	if (rt2x00dev->rf_channel <= 14) {
+-@@ -4470,6 +4915,42 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
++@@ -4470,6 +4915,42 @@ void rt2800_vco_calibration(struct rt2x0
+  	}
+  	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
+  
+@@ -1060,7 +1054,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  }
+  EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
+  
+-@@ -4568,7 +5049,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
++@@ -4568,7 +5049,8 @@ static u8 rt2800_get_default_vgc(struct
+  		    rt2x00_rt(rt2x00dev, RT3593) ||
+  		    rt2x00_rt(rt2x00dev, RT5390) ||
+  		    rt2x00_rt(rt2x00dev, RT5392) ||
+@@ -1070,7 +1064,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  			vgc = 0x1c + (2 * rt2x00dev->lna_gain);
+  		else
+  			vgc = 0x2e + rt2x00dev->lna_gain;
+-@@ -4795,7 +5277,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
++@@ -4795,7 +5277,8 @@ static int rt2800_init_registers(struct
+  					      0x00000000);
+  		}
+  	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+@@ -1080,7 +1074,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
+-@@ -4805,6 +5288,24 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
++@@ -4805,6 +5288,24 @@ static int rt2800_init_registers(struct
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
+  	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
+@@ -1105,7 +1099,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	} else {
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
+-@@ -5786,6 +6287,231 @@ static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev)
++@@ -5786,6 +6287,231 @@ static void rt2800_init_bbp_5592(struct
+  		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
+  }
+  
+@@ -1337,7 +1331,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
+  {
+  	unsigned int i;
+-@@ -5830,6 +6556,9 @@ static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
++@@ -5830,6 +6556,9 @@ static void rt2800_init_bbp(struct rt2x0
+  	case RT5592:
+  		rt2800_init_bbp_5592(rt2x00dev);
+  		return;
+@@ -1347,7 +1341,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	}
+  
+  	for (i = 0; i < EEPROM_BBP_SIZE; i++) {
+-@@ -6901,6 +7630,615 @@ static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev)
++@@ -6901,6 +7630,615 @@ static void rt2800_init_rfcsr_5592(struc
+  	rt2800_led_open_drain_enable(rt2x00dev);
+  }
+  
+@@ -1963,7 +1957,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
+  {
+  	if (rt2800_is_305x_soc(rt2x00dev)) {
+-@@ -6941,6 +8279,9 @@ static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
++@@ -6941,6 +8279,9 @@ static void rt2800_init_rfcsr(struct rt2
+  	case RT5592:
+  		rt2800_init_rfcsr_5592(rt2x00dev);
+  		break;
+@@ -1973,7 +1967,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	}
+  }
+  
+-@@ -7307,7 +8648,8 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
++@@ -7307,7 +8648,8 @@ static int rt2800_init_eeprom(struct rt2
+  	 */
+  	if (rt2x00_rt(rt2x00dev, RT3290) ||
+  	    rt2x00_rt(rt2x00dev, RT5390) ||
+@@ -1983,7 +1977,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
+  	else if (rt2x00_rt(rt2x00dev, RT3352))
+  		rf = RF3322;
+-@@ -7339,6 +8681,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
++@@ -7339,6 +8681,7 @@ static int rt2800_init_eeprom(struct rt2
+  	case RF5390:
+  	case RF5392:
+  	case RF5592:
+@@ -1991,7 +1985,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		break;
+  	default:
+  		rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n",
+-@@ -7746,6 +9089,23 @@ static const struct rf_channel rf_vals_5592_xtal40[] = {
++@@ -7746,6 +9089,23 @@ static const struct rf_channel rf_vals_5
+  	{196, 83, 0, 12, 1},
+  };
+  
+@@ -2015,7 +2009,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+  {
+  	struct hw_mode_spec *spec = &rt2x00dev->spec;
+-@@ -7849,6 +9209,11 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
++@@ -7849,6 +9209,11 @@ static int rt2800_probe_hw_mode(struct r
+  			spec->channels = rf_vals_3x;
+  		break;
+  
+@@ -2027,7 +2021,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	case RF3052:
+  	case RF3053:
+  		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
+-@@ -7980,6 +9345,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
++@@ -7980,6 +9345,7 @@ static int rt2800_probe_hw_mode(struct r
+  	case RF5390:
+  	case RF5392:
+  	case RF5592:
+@@ -2035,7 +2029,7 @@ index 8d00c599e47a..201b12ed90c6 100644
+  		__set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags);
+  		break;
+  	}
+-@@ -8024,6 +9390,9 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
++@@ -8024,6 +9390,9 @@ static int rt2800_probe_rt(struct rt2x00
+  		return -ENODEV;
+  	}
+  
+@@ -2045,8 +2039,6 @@ index 8d00c599e47a..201b12ed90c6 100644
+  	rt2x00_set_rt(rt2x00dev, rt, rev);
+  
+  	return 0;
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+-index d9ef260d542a..f357531d9488 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ @@ -33,6 +33,10 @@
+@@ -2060,8 +2052,6 @@ index d9ef260d542a..f357531d9488 100644
+  	u8 bbp25;
+  	u8 bbp26;
+  	u8 txmixer_gain_24g;
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-index ce340bfd71a0..8fdd2f9726ee 100644
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ @@ -174,6 +174,7 @@ struct rt2x00_chip {
+@@ -2072,6 +2062,3 @@ index ce340bfd71a0..8fdd2f9726ee 100644
+  
+  	u16 rf;
+  	u16 rev;
+--- 
+-2.12.1
+-
+diff --git a/package/kernel/mac80211/patches/020-20-rt2x00-reverse-external-PA-capability-flag-logic.patch b/package/kernel/mac80211/patches/020-20-rt2x00-reverse-external-PA-capability-flag-logic.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..7994456de71a9b6115a34e307024b59043c80aec
+--- /dev/null
++++ b/package/kernel/mac80211/patches/020-20-rt2x00-reverse-external-PA-capability-flag-logic.patch
+@@ -0,0 +1,121 @@
++From 1f242a3de702d5a19c479685d35b050837122724 Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Mon, 10 Apr 2017 15:29:45 +0200
++Subject: [PATCH] rt2x00: reverse external PA capability flag logic
++
++Consequently refer to external PA instead of inverting the logic and
++use an internal PA capability flag which is a bit confusing.
++Currently this is used for Rt3352 only, but MT7620A also allows for an
++external PA which will be supported by a follow up patch.
++
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <sgruszka@redhat.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 40 +++++++++++++-------------
++ drivers/net/wireless/ralink/rt2x00/rt2x00.h    |  4 +--
++ 2 files changed, 22 insertions(+), 22 deletions(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -7014,9 +7014,9 @@ 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,
+++	int tx0_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX0,
++ 				  &rt2x00dev->cap_flags);
++-	int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
+++	int tx1_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX1,
++ 				  &rt2x00dev->cap_flags);
++ 	u8 rfcsr;
++ 
++@@ -7056,9 +7056,9 @@ static void rt2800_init_rfcsr_3352(struc
++ 	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
++ 	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
++ 	rfcsr = 0x01;
++-	if (!tx0_int_pa)
+++	if (tx0_ext_pa)
++ 		rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
++-	if (!tx1_int_pa)
+++	if (tx1_ext_pa)
++ 		rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
++ 	rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
++ 	rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
++@@ -7068,13 +7068,13 @@ static void rt2800_init_rfcsr_3352(struc
++ 	rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
++ 	rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
++ 	rfcsr = 0x52;
++-	if (tx0_int_pa) {
+++	if (!tx0_ext_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) {
+++	if (!tx1_ext_pa) {
++ 		rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1);
++ 		rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1);
++ 	}
++@@ -7087,19 +7087,19 @@ static void rt2800_init_rfcsr_3352(struc
++ 	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
++ 	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
++ 	rfcsr = 0x2d;
++-	if (!tx0_int_pa)
+++	if (tx0_ext_pa)
++ 		rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1);
++-	if (!tx1_int_pa)
+++	if (tx1_ext_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, 51, (tx0_ext_pa ? 0x52 : 0x7f));
+++	rt2800_rfcsr_write(rt2x00dev, 52, (tx0_ext_pa ? 0xc0 : 0x00));
+++	rt2800_rfcsr_write(rt2x00dev, 53, (tx0_ext_pa ? 0xd2 : 0x52));
+++	rt2800_rfcsr_write(rt2x00dev, 54, (tx0_ext_pa ? 0xc0 : 0x1b));
+++	rt2800_rfcsr_write(rt2x00dev, 55, (tx1_ext_pa ? 0x52 : 0x7f));
+++	rt2800_rfcsr_write(rt2x00dev, 56, (tx1_ext_pa ? 0xc0 : 0x00));
+++	rt2800_rfcsr_write(rt2x00dev, 57, (tx0_ext_pa ? 0x49 : 0x52));
+++	rt2800_rfcsr_write(rt2x00dev, 58, (tx1_ext_pa ? 0xc0 : 0x1b));
++ 	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
++ 	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
++ 	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
++@@ -8782,13 +8782,13 @@ static int rt2800_init_eeprom(struct rt2
++ 	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
++ 
++ 	if (rt2x00_rt(rt2x00dev, RT3352)) {
++-		if (!rt2x00_get_field16(eeprom,
+++		if (rt2x00_get_field16(eeprom,
++ 		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
++-		    __set_bit(CAPABILITY_INTERNAL_PA_TX0,
+++		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
++ 			      &rt2x00dev->cap_flags);
++-		if (!rt2x00_get_field16(eeprom,
+++		if (rt2x00_get_field16(eeprom,
++ 		    EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352))
++-		    __set_bit(CAPABILITY_INTERNAL_PA_TX1,
+++		    __set_bit(CAPABILITY_EXTERNAL_PA_TX1,
++ 			      &rt2x00dev->cap_flags);
++ 	}
++ 
++--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++@@ -719,8 +719,8 @@ enum rt2x00_capability_flags {
++ 	CAPABILITY_DOUBLE_ANTENNA,
++ 	CAPABILITY_BT_COEXIST,
++ 	CAPABILITY_VCO_RECALIBRATION,
++-	CAPABILITY_INTERNAL_PA_TX0,
++-	CAPABILITY_INTERNAL_PA_TX1,
+++	CAPABILITY_EXTERNAL_PA_TX0,
+++	CAPABILITY_EXTERNAL_PA_TX1,
++ };
++ 
++ /*
+diff --git a/package/kernel/mac80211/patches/020-21-rt2800-fix-LNA-gain-assignment-for-MT7620.patch b/package/kernel/mac80211/patches/020-21-rt2800-fix-LNA-gain-assignment-for-MT7620.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..71a4ffea45879af5f8fda8dca253b23b9abd752b
+--- /dev/null
++++ b/package/kernel/mac80211/patches/020-21-rt2800-fix-LNA-gain-assignment-for-MT7620.patch
+@@ -0,0 +1,49 @@
++From 0109238d62a99ea779a7e28e21868118e7b8d69d Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Mon, 10 Apr 2017 14:28:14 +0200
++Subject: [PATCH 1/2] rt2800: fix LNA gain assignment for MT7620
++To: Stanislaw Gruszka <sgruszka@redhat.com>
++Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
++    linux-wireless@vger.kernel.org,
++    Kalle Valo <kvalo@codeaurora.org>
++
++The base value used for MT7620 differs from Rt5392 which resulted in
++quite bad RX signal quality. Fix this by using the correct base value as
++well as the LNA calibration values for HT20.
++
++Reported-by: Tom Psyborg <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 ++++++++++++++++--
++ 1 file changed, 16 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -3806,11 +3806,25 @@ static void rt2800_config_channel(struct
++ 	}
++ 
++ 	if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
+++		reg = 0x10;
+++		if (!conf_is_ht40(conf)) {
+++			if (rt2x00_rt(rt2x00dev, RT6352) &&
+++			    rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+++				reg |= 0x5;
+++			} else {
+++				reg |= 0xa;
+++			}
+++		}
++ 		rt2800_bbp_write(rt2x00dev, 195, 141);
++-		rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
+++		rt2800_bbp_write(rt2x00dev, 196, reg);
++ 
++ 		/* AGC init */
++-		reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain;
+++		if (rt2x00_rt(rt2x00dev, RT6352))
+++			reg = 0x04;
+++		else
+++			reg = rf->channel <= 14 ? 0x1c : 0x24;
+++
+++		reg += 2 * rt2x00dev->lna_gain;
++ 		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
++ 
++ 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
+diff --git a/package/kernel/mac80211/patches/020-22-rt2800-do-VCO-calibration-after-programming-ALC.patch b/package/kernel/mac80211/patches/020-22-rt2800-do-VCO-calibration-after-programming-ALC.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..3d76408cd24c9fe9029202b3aa2efa891137ab2f
+--- /dev/null
++++ b/package/kernel/mac80211/patches/020-22-rt2800-do-VCO-calibration-after-programming-ALC.patch
+@@ -0,0 +1,29 @@
++From feb608c7986c14bab153f31f8e96f251072e6578 Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Mon, 10 Apr 2017 15:33:20 +0200
++Subject: [PATCH 2/2] rt2800: do VCO calibration after programming ALC
++To: Stanislaw Gruszka <sgruszka@redhat.com>
++Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
++    linux-wireless@vger.kernel.org,
++    Kalle Valo <kvalo@codeaurora.org>
++
++Scanning fails if we don't do VCO calibration every time.
++The vendor driver duplicates the VCO calibration function into the
++channel switching logic, we can do the same with less duplication.
++
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
++ 1 file changed, 2 insertions(+)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -3407,6 +3407,8 @@ static void rt2800_config_alc(struct rt2
++ 			rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
++ 	}
++ 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
+++
+++	rt2800_vco_calibration(rt2x00dev);
++ }
++ 
++ static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
+diff --git a/package/kernel/mac80211/patches/020-23-rt2800-fix-mt7620-vco-calibration-registers.patch b/package/kernel/mac80211/patches/020-23-rt2800-fix-mt7620-vco-calibration-registers.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..360d06e8f8d4a3d8dd99ff1c6ed2d82b7618b5ca
+--- /dev/null
++++ b/package/kernel/mac80211/patches/020-23-rt2800-fix-mt7620-vco-calibration-registers.patch
+@@ -0,0 +1,45 @@
++From 02c452f317b4a4d06c433c294e66896a389731c1 Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Tue, 18 Apr 2017 11:09:53 +0200
++Subject: [PATCH] rt2800: fix mt7620 vco calibration registers
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++To: Stanislaw Gruszka <sgruszka@redhat.com>
++Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
++    linux-wireless@vger.kernel.org,
++    Kalle Valo <kvalo@codeaurora.org>,
++    Tom Psyborg <pozega.tomislav@gmail.com>
++
++Use register values from init LNA function instead of the ones from
++restore LNA function. Apply register values based on rx path
++configuration.
++
++Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +++---
++ 1 file changed, 3 insertions(+), 3 deletions(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -4932,7 +4932,7 @@ void rt2800_vco_calibration(struct rt2x0
++ 	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
++ 
++ 	if (rt2x00_rt(rt2x00dev, RT6352)) {
++-		if (rt2x00dev->default_ant.tx_chain_num == 1) {
+++		if (rt2x00dev->default_ant.rx_chain_num == 1) {
++ 			rt2800_bbp_write(rt2x00dev, 91, 0x07);
++ 			rt2800_bbp_write(rt2x00dev, 95, 0x1A);
++ 			rt2800_bbp_write(rt2x00dev, 195, 128);
++@@ -4953,8 +4953,8 @@ void rt2800_vco_calibration(struct rt2x0
++ 		}
++ 
++ 		if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
++-			rt2800_bbp_write(rt2x00dev, 75, 0x60);
++-			rt2800_bbp_write(rt2x00dev, 76, 0x44);
+++			rt2800_bbp_write(rt2x00dev, 75, 0x68);
+++			rt2800_bbp_write(rt2x00dev, 76, 0x4C);
++ 			rt2800_bbp_write(rt2x00dev, 79, 0x1C);
++ 			rt2800_bbp_write(rt2x00dev, 80, 0x0C);
++ 			rt2800_bbp_write(rt2x00dev, 82, 0xB6);
+diff --git a/package/kernel/mac80211/patches/020-24-rt2800-fix-mt7620-E2-channel-registers.patch b/package/kernel/mac80211/patches/020-24-rt2800-fix-mt7620-E2-channel-registers.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..92c2134845a7e239593e5a474995d0b7b5e0541f
+--- /dev/null
++++ b/package/kernel/mac80211/patches/020-24-rt2800-fix-mt7620-E2-channel-registers.patch
+@@ -0,0 +1,36 @@
++From c426cb0ed15ee12dfdc8c53ddd1449ac617023cf Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Tue, 18 Apr 2017 11:45:37 +0200
++Subject: [PATCH] rt2800: fix mt7620 E2 channel registers
++To: Stanislaw Gruszka <sgruszka@redhat.com>
++Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
++    linux-wireless@vger.kernel.org,
++    Kalle Valo <kvalo@codeaurora.org>,
++    Tom Psyborg <pozega.tomislav@gmail.com>
++
++From: Tomislav Požega <pozega.tomislav@gmail.com>
++
++update RF register 47 and 54 values according to vendor driver
++
++Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 ++++--
++ 1 file changed, 4 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -8145,9 +8145,11 @@ static void rt2800_init_rfcsr_6352(struc
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3);
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27);
++-	rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69);
+++	rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67);
+++	rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69);
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF);
++-	rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20);
+++	rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27);
+++	rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20);
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF);
++ 	rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C);
+diff --git a/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch b/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch
+deleted file mode 100644
+index 3270ea2c566850e04b5484de41e462ebafa3cfcc..0000000000000000000000000000000000000000
+--- a/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch
++++ /dev/null
+@@ -1,54 +0,0 @@
+-From 0109238d62a99ea779a7e28e21868118e7b8d69d Mon Sep 17 00:00:00 2001
+-From: Daniel Golle <daniel@makrotopia.org>
+-Date: Mon, 10 Apr 2017 14:28:14 +0200
+-Subject: [PATCH 1/2] rt2800: fix LNA gain assignment for MT7620
+-To: Stanislaw Gruszka <sgruszka@redhat.com>
+-Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
+-    linux-wireless@vger.kernel.org,
+-    Kalle Valo <kvalo@codeaurora.org>
+-
+-The base value used for MT7620 differs from Rt5392 which resulted in
+-quite bad RX signal quality. Fix this by using the correct base value as
+-well as the LNA calibration values for HT20.
+-
+-Reported-by: Tom Psyborg <pozega.tomislav@gmail.com>
+-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+----
+- drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 ++++++++++++++++--
+- 1 file changed, 16 insertions(+), 2 deletions(-)
+-
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index ba06ac2d876d..7135519a638c 100644
+---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -3806,11 +3806,25 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
+- 	}
+- 
+- 	if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
+-+		reg = 0x10;
+-+		if (!conf_is_ht40(conf)) {
+-+			if (rt2x00_rt(rt2x00dev, RT6352) &&
+-+			    rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+-+				reg |= 0x5;
+-+			} else {
+-+				reg |= 0xa;
+-+			}
+-+		}
+- 		rt2800_bbp_write(rt2x00dev, 195, 141);
+--		rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
+-+		rt2800_bbp_write(rt2x00dev, 196, reg);
+- 
+- 		/* AGC init */
+--		reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain;
+-+		if (rt2x00_rt(rt2x00dev, RT6352))
+-+			reg = 0x04;
+-+		else
+-+			reg = rf->channel <= 14 ? 0x1c : 0x24;
+-+
+-+		reg += 2 * rt2x00dev->lna_gain;
+- 		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
+- 
+- 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
+--- 
+-2.12.2
+-
+diff --git a/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch b/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch
+deleted file mode 100644
+index 1dafb78f1c71037d7362c13f68728b11dc5aaff2..0000000000000000000000000000000000000000
+--- a/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch
++++ /dev/null
+@@ -1,34 +0,0 @@
+-From feb608c7986c14bab153f31f8e96f251072e6578 Mon Sep 17 00:00:00 2001
+-From: Daniel Golle <daniel@makrotopia.org>
+-Date: Mon, 10 Apr 2017 15:33:20 +0200
+-Subject: [PATCH 2/2] rt2800: do VCO calibration after programming ALC
+-To: Stanislaw Gruszka <sgruszka@redhat.com>
+-Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
+-    linux-wireless@vger.kernel.org,
+-    Kalle Valo <kvalo@codeaurora.org>
+-
+-Scanning fails if we don't do VCO calibration every time.
+-The vendor driver duplicates the VCO calibration function into the
+-channel switching logic, we can do the same with less duplication.
+-
+-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+----
+- drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
+- 1 file changed, 2 insertions(+)
+-
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 7135519a638c..870bf315f98b 100644
+---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -3407,6 +3407,8 @@ static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
+- 			rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
+- 	}
+- 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
+-+
+-+	rt2800_vco_calibration(rt2x00dev);
+- }
+- 
+- static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
+--- 
+-2.12.2
+-
+diff --git a/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch b/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch
+deleted file mode 100644
+index 708b0b2d31a0276aa9dd3a922e26a1379ec364f4..0000000000000000000000000000000000000000
+--- a/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch
++++ /dev/null
+@@ -1,50 +0,0 @@
+-From 02c452f317b4a4d06c433c294e66896a389731c1 Mon Sep 17 00:00:00 2001
+-From: Daniel Golle <daniel@makrotopia.org>
+-Date: Tue, 18 Apr 2017 11:09:53 +0200
+-Subject: [PATCH] rt2800: fix mt7620 vco calibration registers
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=UTF-8
+-Content-Transfer-Encoding: 8bit
+-To: Stanislaw Gruszka <sgruszka@redhat.com>
+-Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
+-    linux-wireless@vger.kernel.org,
+-    Kalle Valo <kvalo@codeaurora.org>,
+-    Tom Psyborg <pozega.tomislav@gmail.com>
+-
+-Use register values from init LNA function instead of the ones from
+-restore LNA function. Apply register values based on rx path
+-configuration.
+-
+-Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
+-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+----
+- drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +++---
+- 1 file changed, 3 insertions(+), 3 deletions(-)
+-
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 870bf315f98b..86cffee6876a 100644
+---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -4932,7 +4932,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
+- 	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
+- 
+- 	if (rt2x00_rt(rt2x00dev, RT6352)) {
+--		if (rt2x00dev->default_ant.tx_chain_num == 1) {
+-+		if (rt2x00dev->default_ant.rx_chain_num == 1) {
+- 			rt2800_bbp_write(rt2x00dev, 91, 0x07);
+- 			rt2800_bbp_write(rt2x00dev, 95, 0x1A);
+- 			rt2800_bbp_write(rt2x00dev, 195, 128);
+-@@ -4953,8 +4953,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
+- 		}
+- 
+- 		if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+--			rt2800_bbp_write(rt2x00dev, 75, 0x60);
+--			rt2800_bbp_write(rt2x00dev, 76, 0x44);
+-+			rt2800_bbp_write(rt2x00dev, 75, 0x68);
+-+			rt2800_bbp_write(rt2x00dev, 76, 0x4C);
+- 			rt2800_bbp_write(rt2x00dev, 79, 0x1C);
+- 			rt2800_bbp_write(rt2x00dev, 80, 0x0C);
+- 			rt2800_bbp_write(rt2x00dev, 82, 0xB6);
+--- 
+-2.12.2
+-
+diff --git a/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch b/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch
+deleted file mode 100644
+index 284a347f256f3499222acff54ebf9df0fa5aecf9..0000000000000000000000000000000000000000
+--- a/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch
++++ /dev/null
+@@ -1,41 +0,0 @@
+-From c426cb0ed15ee12dfdc8c53ddd1449ac617023cf Mon Sep 17 00:00:00 2001
+-From: Daniel Golle <daniel@makrotopia.org>
+-Date: Tue, 18 Apr 2017 11:45:37 +0200
+-Subject: [PATCH] rt2800: fix mt7620 E2 channel registers
+-To: Stanislaw Gruszka <sgruszka@redhat.com>
+-Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
+-    linux-wireless@vger.kernel.org,
+-    Kalle Valo <kvalo@codeaurora.org>,
+-    Tom Psyborg <pozega.tomislav@gmail.com>
+-
+-From: Tomislav Požega <pozega.tomislav@gmail.com>
+-
+-update RF register 47 and 54 values according to vendor driver
+-
+-Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
+-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+----
+- drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 ++++--
+- 1 file changed, 4 insertions(+), 2 deletions(-)
+-
+-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-index 86cffee6876a..8585cdc3de53 100644
+---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8145,9 +8145,11 @@ static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev)
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3);
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27);
+--	rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69);
+-+	rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67);
+-+	rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69);
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF);
+--	rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20);
+-+	rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27);
+-+	rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20);
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF);
+- 	rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C);
+--- 
+-2.12.2
+-
+diff --git a/package/kernel/mac80211/patches/323-0001-brcmfmac-Use-net_device_stats-from-struct-net_device.patch b/package/kernel/mac80211/patches/323-0001-brcmfmac-Use-net_device_stats-from-struct-net_device.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..81567d87579aa6870b0862758acc692852cd369e
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0001-brcmfmac-Use-net_device_stats-from-struct-net_device.patch
+@@ -0,0 +1,112 @@
++From 91b632803ee4e47c5a5c4dc3d8bf5abf9c16107a Mon Sep 17 00:00:00 2001
++From: Tobias Klauser <tklauser@distanz.ch>
++Date: Mon, 13 Feb 2017 11:14:09 +0100
++Subject: [PATCH] brcmfmac: Use net_device_stats from struct net_device
++
++Instead of using a private copy of struct net_device_stats in struct
++brcm_if, use stats from struct net_device.  Also remove the now
++unnecessary .ndo_get_stats function.
++
++Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
++Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 26 +++++++---------------
++ .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  2 --
++ 2 files changed, 8 insertions(+), 20 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++@@ -249,10 +249,10 @@ static netdev_tx_t brcmf_netdev_start_xm
++ 
++ done:
++ 	if (ret) {
++-		ifp->stats.tx_dropped++;
+++		ndev->stats.tx_dropped++;
++ 	} else {
++-		ifp->stats.tx_packets++;
++-		ifp->stats.tx_bytes += skb->len;
+++		ndev->stats.tx_packets++;
+++		ndev->stats.tx_bytes += skb->len;
++ 	}
++ 
++ 	/* Return ok: we always eat the packet */
++@@ -296,15 +296,15 @@ void brcmf_txflowblock(struct device *de
++ void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
++ {
++ 	if (skb->pkt_type == PACKET_MULTICAST)
++-		ifp->stats.multicast++;
+++		ifp->ndev->stats.multicast++;
++ 
++ 	if (!(ifp->ndev->flags & IFF_UP)) {
++ 		brcmu_pkt_buf_free_skb(skb);
++ 		return;
++ 	}
++ 
++-	ifp->stats.rx_bytes += skb->len;
++-	ifp->stats.rx_packets++;
+++	ifp->ndev->stats.rx_bytes += skb->len;
+++	ifp->ndev->stats.rx_packets++;
++ 
++ 	brcmf_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol));
++ 	if (in_interrupt())
++@@ -327,7 +327,7 @@ static int brcmf_rx_hdrpull(struct brcmf
++ 
++ 	if (ret || !(*ifp) || !(*ifp)->ndev) {
++ 		if (ret != -ENODATA && *ifp)
++-			(*ifp)->stats.rx_errors++;
+++			(*ifp)->ndev->stats.rx_errors++;
++ 		brcmu_pkt_buf_free_skb(skb);
++ 		return -ENODATA;
++ 	}
++@@ -388,7 +388,7 @@ void brcmf_txfinalize(struct brcmf_if *i
++ 	}
++ 
++ 	if (!success)
++-		ifp->stats.tx_errors++;
+++		ifp->ndev->stats.tx_errors++;
++ 
++ 	brcmu_pkt_buf_free_skb(txp);
++ }
++@@ -411,15 +411,6 @@ void brcmf_txcomplete(struct device *dev
++ 	}
++ }
++ 
++-static struct net_device_stats *brcmf_netdev_get_stats(struct net_device *ndev)
++-{
++-	struct brcmf_if *ifp = netdev_priv(ndev);
++-
++-	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
++-
++-	return &ifp->stats;
++-}
++-
++ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
++ 				    struct ethtool_drvinfo *info)
++ {
++@@ -492,7 +483,6 @@ static int brcmf_netdev_open(struct net_
++ static const struct net_device_ops brcmf_netdev_ops_pri = {
++ 	.ndo_open = brcmf_netdev_open,
++ 	.ndo_stop = brcmf_netdev_stop,
++-	.ndo_get_stats = brcmf_netdev_get_stats,
++ 	.ndo_start_xmit = brcmf_netdev_start_xmit,
++ 	.ndo_set_mac_address = brcmf_netdev_set_mac_address,
++ 	.ndo_set_rx_mode = brcmf_netdev_set_multicast_list
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
++@@ -171,7 +171,6 @@ enum brcmf_netif_stop_reason {
++  * @drvr: points to device related information.
++  * @vif: points to cfg80211 specific interface information.
++  * @ndev: associated network device.
++- * @stats: interface specific network statistics.
++  * @multicast_work: worker object for multicast provisioning.
++  * @ndoffload_work: worker object for neighbor discovery offload configuration.
++  * @fws_desc: interface specific firmware-signalling descriptor.
++@@ -187,7 +186,6 @@ struct brcmf_if {
++ 	struct brcmf_pub *drvr;
++ 	struct brcmf_cfg80211_vif *vif;
++ 	struct net_device *ndev;
++-	struct net_device_stats stats;
++ 	struct work_struct multicast_work;
++ 	struct work_struct ndoffload_work;
++ 	struct brcmf_fws_mac_descriptor *fws_desc;
+diff --git a/package/kernel/mac80211/patches/323-0002-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch b/package/kernel/mac80211/patches/323-0002-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..7272b889c0bb829db55faaf32524c5762ddc4efd
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0002-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
+@@ -0,0 +1,148 @@
++From f1ac3aa212af6dd0a36dc07a63f95f91be6f4935 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
++Date: Fri, 24 Feb 2017 17:32:46 +0100
++Subject: [PATCH] brcmfmac: always print error when PSM's watchdog fires
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++So far we were attaching BRCMF_E_PSM_WATCHDOG event listener in
++brcmf_debug_attach which gets compiled only with CONFIG_BRCMDBG. This
++event means something went wrong and firmware / hardware usually can't
++be expected to work (reliably).
++
++Such a problem is significant for user experience so I believe we should
++print an error unconditionally (even with debugging disabled). What can
++be indeed optional is dumping bus memory as this is clearly part of
++debugging process.
++
++In the future we may also try to extend this listener by trying to
++recover from the error or at least signal it to the cfg80211.
++
++Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 22 ++++++++++++++++++
++ .../wireless/broadcom/brcm80211/brcmfmac/debug.c   | 26 +++-------------------
++ .../wireless/broadcom/brcm80211/brcmfmac/debug.h   |  9 ++++++++
++ 3 files changed, 34 insertions(+), 23 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++@@ -738,6 +738,24 @@ void brcmf_remove_interface(struct brcmf
++ 	brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
++ }
++ 
+++static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
+++				     const struct brcmf_event_msg *evtmsg,
+++				     void *data)
+++{
+++	int err;
+++
+++	brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
+++
+++	brcmf_err("PSM's watchdog has fired!\n");
+++
+++	err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
+++					 evtmsg->datalen);
+++	if (err)
+++		brcmf_err("Failed to get memory dump, %d\n", err);
+++
+++	return err;
+++}
+++
++ #ifdef CONFIG_INET
++ #define ARPOL_MAX_ENTRIES	8
++ static int brcmf_inetaddr_changed(struct notifier_block *nb,
++@@ -917,6 +935,10 @@ int brcmf_attach(struct device *dev, str
++ 		goto fail;
++ 	}
++ 
+++	/* Attach to events important for core code */
+++	brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
+++			    brcmf_psm_watchdog_notify);
+++
++ 	/* attach firmware event handler */
++ 	brcmf_fweh_attach(drvr);
++ 
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
++@@ -27,8 +27,8 @@
++ 
++ static struct dentry *root_folder;
++ 
++-static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
++-				      size_t len)
+++int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
+++			       size_t len)
++ {
++ 	void *dump;
++ 	size_t ramsize;
++@@ -54,24 +54,6 @@ static int brcmf_debug_create_memdump(st
++ 	return 0;
++ }
++ 
++-static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp,
++-					   const struct brcmf_event_msg *evtmsg,
++-					   void *data)
++-{
++-	int err;
++-
++-	brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
++-
++-	brcmf_err("PSM's watchdog has fired!\n");
++-
++-	err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
++-					 evtmsg->datalen);
++-	if (err)
++-		brcmf_err("Failed to get memory dump, %d\n", err);
++-
++-	return err;
++-}
++-
++ void brcmf_debugfs_init(void)
++ {
++ 	root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
++@@ -99,9 +81,7 @@ int brcmf_debug_attach(struct brcmf_pub
++ 	if (IS_ERR(drvr->dbgfs_dir))
++ 		return PTR_ERR(drvr->dbgfs_dir);
++ 
++-
++-	return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
++-				   brcmf_debug_psm_watchdog_notify);
+++	return 0;
++ }
++ 
++ void brcmf_debug_detach(struct brcmf_pub *drvr)
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
++@@ -99,6 +99,7 @@ do {									\
++ 
++ extern int brcmf_msg_level;
++ 
+++struct brcmf_bus;
++ struct brcmf_pub;
++ #ifdef DEBUG
++ void brcmf_debugfs_init(void);
++@@ -108,6 +109,8 @@ void brcmf_debug_detach(struct brcmf_pub
++ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
++ int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
++ 			    int (*read_fn)(struct seq_file *seq, void *data));
+++int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
+++			       size_t len);
++ #else
++ static inline void brcmf_debugfs_init(void)
++ {
++@@ -128,6 +131,12 @@ int brcmf_debugfs_add_entry(struct brcmf
++ {
++ 	return 0;
++ }
+++static inline
+++int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
+++			       size_t len)
+++{
+++	return 0;
+++}
++ #endif
++ 
++ #endif /* BRCMFMAC_DEBUG_H */
+diff --git a/package/kernel/mac80211/patches/323-0003-brcmfmac-Do-not-print-the-firmware-version-as-an-err.patch b/package/kernel/mac80211/patches/323-0003-brcmfmac-Do-not-print-the-firmware-version-as-an-err.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..3ab9b66e088edc980b4ca9565ecad2ead7bcc679
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0003-brcmfmac-Do-not-print-the-firmware-version-as-an-err.patch
+@@ -0,0 +1,56 @@
++From d79fe4cb70d8deab7b8dc1de547ed4b915574414 Mon Sep 17 00:00:00 2001
++From: Hans de Goede <hdegoede@redhat.com>
++Date: Wed, 8 Mar 2017 14:50:15 +0100
++Subject: [PATCH] brcmfmac: Do not print the firmware version as an error
++
++Using pr_err for things which are not errors is a bad idea. E.g. it
++will cause the plymouth bootsplash screen to drop back to the text
++console so that the user can see the error, which is not what we
++normally want to happen.
++
++Instead add a new brcmf_info macro and use that.
++
++Signed-off-by: Hans de Goede <hdegoede@redhat.com>
++Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +-
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h  | 9 +++++++++
++ 2 files changed, 10 insertions(+), 1 deletion(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
++@@ -161,7 +161,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
++ 	strsep(&ptr, "\n");
++ 
++ 	/* Print fw version info */
++-	brcmf_err("Firmware version = %s\n", buf);
+++	brcmf_info("Firmware version = %s\n", buf);
++ 
++ 	/* locate firmware version number for ethtool */
++ 	ptr = strrchr(buf, ' ') + 1;
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
++@@ -59,6 +59,10 @@ void __brcmf_err(const char *func, const
++ 	} while (0)
++ 
++ #if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
+++
+++/* For debug/tracing purposes treat info messages as errors */
+++#define brcmf_info brcmf_err
+++
++ __printf(3, 4)
++ void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...);
++ #define brcmf_dbg(level, fmt, ...)				\
++@@ -77,6 +81,11 @@ do {								\
++ 
++ #else /* defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) */
++ 
+++#define brcmf_info(fmt, ...)						\
+++	do {								\
+++		pr_info("%s: " fmt, __func__, ##__VA_ARGS__);		\
+++	} while (0)
+++
++ #define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
++ 
++ #define BRCMF_DATA_ON()		0
+diff --git a/package/kernel/mac80211/patches/323-0004-brcmfmac-Do-not-complain-about-country-code-00.patch b/package/kernel/mac80211/patches/323-0004-brcmfmac-Do-not-complain-about-country-code-00.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..f4570e71b1177abb92965d099b0dfd67f35b703f
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0004-brcmfmac-Do-not-complain-about-country-code-00.patch
+@@ -0,0 +1,28 @@
++From 26e537884a8ef451f5c60f6949b1615069931ffa Mon Sep 17 00:00:00 2001
++From: Hans de Goede <hdegoede@redhat.com>
++Date: Wed, 8 Mar 2017 14:50:16 +0100
++Subject: [PATCH] brcmfmac: Do not complain about country code "00"
++
++The country code gets set to "00" by default at boot, ignore this
++rather then logging an error about it.
++
++Signed-off-by: Hans de Goede <hdegoede@redhat.com>
++Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++++
++ 1 file changed, 4 insertions(+)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++@@ -6736,6 +6736,10 @@ static void brcmf_cfg80211_reg_notifier(
++ 	s32 err;
++ 	int i;
++ 
+++	/* The country code gets set to "00" by default at boot, ignore */
+++	if (req->alpha2[0] == '0' && req->alpha2[1] == '0')
+++		return;
+++
++ 	/* ignore non-ISO3166 country codes */
++ 	for (i = 0; i < sizeof(req->alpha2); i++)
++ 		if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
+diff --git a/package/kernel/mac80211/patches/323-0005-brcmfmac-Handle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch b/package/kernel/mac80211/patches/323-0005-brcmfmac-Handle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..0f2d54e1dd1308db876723aee4dc762a5f2e675c
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0005-brcmfmac-Handle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch
+@@ -0,0 +1,35 @@
++From b9472a2e3e452c414634b3ccb1ef6c4098878686 Mon Sep 17 00:00:00 2001
++From: Hans de Goede <hdegoede@redhat.com>
++Date: Wed, 8 Mar 2017 14:50:17 +0100
++Subject: [PATCH] brcmfmac: Handle status == BRCMF_E_STATUS_ABORT in
++ cfg80211_escan_handler
++
++If a scan gets aborted BRCMF_SCAN_STATUS_BUSY gets cleared in
++cfg->scan_status and when we receive an abort event from the firmware
++the BRCMF_SCAN_STATUS_BUSY check in the cfg80211_escan_handler will
++trigger resulting in multiple errors getting logged.
++
++Check for a status of BRCMF_E_STATUS_ABORT and in this case simply
++cleanly exit the cfg80211_escan_handler. This also avoids a
++BRCMF_E_STATUS_ABORT event arriving after a new scan has been started
++causing the new scan to complete prematurely without any data.
++
++Signed-off-by: Hans de Goede <hdegoede@redhat.com>
++Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +++
++ 1 file changed, 3 insertions(+)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++@@ -3097,6 +3097,9 @@ brcmf_cfg80211_escan_handler(struct brcm
++ 
++ 	status = e->status;
++ 
+++	if (status == BRCMF_E_STATUS_ABORT)
+++		goto exit;
+++
++ 	if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
++ 		brcmf_err("scan not ready, bsscfgidx=%d\n", ifp->bsscfgidx);
++ 		return -EPERM;
+diff --git a/package/kernel/mac80211/patches/323-0006-brcmfmac-move-brcmf_txflowblock-to-bcdc-layer.patch b/package/kernel/mac80211/patches/323-0006-brcmfmac-move-brcmf_txflowblock-to-bcdc-layer.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..b947cd1de91f67084e6978d8f53022544fa2f737
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0006-brcmfmac-move-brcmf_txflowblock-to-bcdc-layer.patch
+@@ -0,0 +1,137 @@
++From 20ec4f57498f8770c7a1a3e2a316fa752a424178 Mon Sep 17 00:00:00 2001
++From: Franky Lin <franky.lin@broadcom.com>
++Date: Fri, 10 Mar 2017 21:17:02 +0000
++Subject: [PATCH] brcmfmac: move brcmf_txflowblock to bcdc layer
++
++brcmf_txflowblock is invoked by sdio and usb bus module which are using
++bcdc protocol. This patch makes it a bcdc API instead of a core module
++function.
++
++Reviewed-by: Arend Van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Franky Lin <franky.lin@broadcom.com>
++Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 10 ++++++++++
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h |  1 +
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h  |  2 --
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 10 ----------
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |  5 +++--
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c  |  5 +++--
++ 6 files changed, 17 insertions(+), 16 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++@@ -345,6 +345,16 @@ brcmf_proto_bcdc_txdata(struct brcmf_pub
++ 	return brcmf_bus_txdata(drvr->bus_if, pktbuf);
++ }
++ 
+++void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state)
+++{
+++	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+++	struct brcmf_pub *drvr = bus_if->drvr;
+++
+++	brcmf_dbg(TRACE, "Enter\n");
+++
+++	brcmf_fws_bus_blocked(drvr, state);
+++}
+++
++ static void
++ brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
++ 				     enum proto_addr_mode addr_mode)
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
++@@ -19,6 +19,7 @@
++ #ifdef CPTCFG_BRCMFMAC_PROTO_BCDC
++ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
++ void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
+++void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
++ #else
++ static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
++ static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
++@@ -229,8 +229,6 @@ int brcmf_attach(struct device *dev, str
++ void brcmf_detach(struct device *dev);
++ /* Indication from bus module that dongle should be reset */
++ void brcmf_dev_reset(struct device *dev);
++-/* Indication from bus module to change flow-control state */
++-void brcmf_txflowblock(struct device *dev, bool state);
++ 
++ /* Notify the bus has transferred the tx packet to firmware */
++ void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++@@ -283,16 +283,6 @@ void brcmf_txflowblock_if(struct brcmf_i
++ 	spin_unlock_irqrestore(&ifp->netif_stop_lock, flags);
++ }
++ 
++-void brcmf_txflowblock(struct device *dev, bool state)
++-{
++-	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
++-	struct brcmf_pub *drvr = bus_if->drvr;
++-
++-	brcmf_dbg(TRACE, "Enter\n");
++-
++-	brcmf_fws_bus_blocked(drvr, state);
++-}
++-
++ void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
++ {
++ 	if (skb->pkt_type == PACKET_MULTICAST)
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++@@ -44,6 +44,7 @@
++ #include "firmware.h"
++ #include "core.h"
++ #include "common.h"
+++#include "bcdc.h"
++ 
++ #define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2500)
++ #define CTL_DONE_TIMEOUT	msecs_to_jiffies(2500)
++@@ -2328,7 +2329,7 @@ static uint brcmf_sdio_sendfromq(struct
++ 	if ((bus->sdiodev->state == BRCMF_SDIOD_DATA) &&
++ 	    bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
++ 		bus->txoff = false;
++-		brcmf_txflowblock(bus->sdiodev->dev, false);
+++		brcmf_proto_bcdc_txflowblock(bus->sdiodev->dev, false);
++ 	}
++ 
++ 	return cnt;
++@@ -2753,7 +2754,7 @@ static int brcmf_sdio_bus_txdata(struct
++ 
++ 	if (pktq_len(&bus->txq) >= TXHI) {
++ 		bus->txoff = true;
++-		brcmf_txflowblock(dev, true);
+++		brcmf_proto_bcdc_txflowblock(dev, true);
++ 	}
++ 	spin_unlock_bh(&bus->txq_lock);
++ 
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
++@@ -29,6 +29,7 @@
++ #include "usb.h"
++ #include "core.h"
++ #include "common.h"
+++#include "bcdc.h"
++ 
++ 
++ #define IOCTL_RESP_TIMEOUT		msecs_to_jiffies(2000)
++@@ -488,7 +489,7 @@ static void brcmf_usb_tx_complete(struct
++ 	spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
++ 	if (devinfo->tx_freecount > devinfo->tx_high_watermark &&
++ 		devinfo->tx_flowblock) {
++-		brcmf_txflowblock(devinfo->dev, false);
+++		brcmf_proto_bcdc_txflowblock(devinfo->dev, false);
++ 		devinfo->tx_flowblock = false;
++ 	}
++ 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
++@@ -635,7 +636,7 @@ static int brcmf_usb_tx(struct device *d
++ 	spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
++ 	if (devinfo->tx_freecount < devinfo->tx_low_watermark &&
++ 	    !devinfo->tx_flowblock) {
++-		brcmf_txflowblock(dev, true);
+++		brcmf_proto_bcdc_txflowblock(dev, true);
++ 		devinfo->tx_flowblock = true;
++ 	}
++ 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
+diff --git a/package/kernel/mac80211/patches/323-0007-brcmfmac-move-brcmf_txcomplete-to-bcdc-layer.patch b/package/kernel/mac80211/patches/323-0007-brcmfmac-move-brcmf_txcomplete-to-bcdc-layer.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..9614e53e51b24afd48876ea4e0c805583acf472a
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0007-brcmfmac-move-brcmf_txcomplete-to-bcdc-layer.patch
+@@ -0,0 +1,122 @@
++From 7b584396b7a760bc77bbde4625f83ef173159d3e Mon Sep 17 00:00:00 2001
++From: Franky Lin <franky.lin@broadcom.com>
++Date: Fri, 10 Mar 2017 21:17:03 +0000
++Subject: [PATCH] brcmfmac: move brcmf_txcomplete to bcdc layer
++
++brcmf_txcomplete is invoked by sdio and usb bus module which are using
++bcdc protocol. So move it from core module into bcdc layer.
++
++Signed-off-by: Franky Lin <franky.lin@broadcom.com>
++Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ .../net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 20 ++++++++++++++++++++
++ .../net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h  |  2 ++
++ .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h   |  3 ---
++ .../net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 18 ------------------
++ .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c  |  3 ++-
++ .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c   |  2 +-
++ 6 files changed, 25 insertions(+), 23 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++@@ -355,6 +355,26 @@ void brcmf_proto_bcdc_txflowblock(struct
++ 	brcmf_fws_bus_blocked(drvr, state);
++ }
++ 
+++void
+++brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
+++			    bool success)
+++{
+++	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+++	struct brcmf_pub *drvr = bus_if->drvr;
+++	struct brcmf_if *ifp;
+++
+++	/* await txstatus signal for firmware if active */
+++	if (brcmf_fws_fc_active(drvr->fws)) {
+++		if (!success)
+++			brcmf_fws_bustxfail(drvr->fws, txp);
+++	} else {
+++		if (brcmf_proto_bcdc_hdrpull(drvr, false, txp, &ifp))
+++			brcmu_pkt_buf_free_skb(txp);
+++		else
+++			brcmf_txfinalize(ifp, txp, success);
+++	}
+++}
+++
++ static void
++ brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
++ 				     enum proto_addr_mode addr_mode)
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
++@@ -20,6 +20,8 @@
++ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
++ void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
++ void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
+++void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
+++				 bool success);
++ #else
++ static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
++ static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
++@@ -230,9 +230,6 @@ void brcmf_detach(struct device *dev);
++ /* Indication from bus module that dongle should be reset */
++ void brcmf_dev_reset(struct device *dev);
++ 
++-/* Notify the bus has transferred the tx packet to firmware */
++-void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
++-
++ /* Configure the "global" bus state used by upper layers */
++ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
++ 
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++@@ -383,24 +383,6 @@ void brcmf_txfinalize(struct brcmf_if *i
++ 	brcmu_pkt_buf_free_skb(txp);
++ }
++ 
++-void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
++-{
++-	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
++-	struct brcmf_pub *drvr = bus_if->drvr;
++-	struct brcmf_if *ifp;
++-
++-	/* await txstatus signal for firmware if active */
++-	if (brcmf_fws_fc_active(drvr->fws)) {
++-		if (!success)
++-			brcmf_fws_bustxfail(drvr->fws, txp);
++-	} else {
++-		if (brcmf_proto_hdrpull(drvr, false, txp, &ifp))
++-			brcmu_pkt_buf_free_skb(txp);
++-		else
++-			brcmf_txfinalize(ifp, txp, success);
++-	}
++-}
++-
++ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
++ 				    struct ethtool_drvinfo *info)
++ {
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++@@ -2266,7 +2266,8 @@ done:
++ 		bus->tx_seq = (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WRAP;
++ 	skb_queue_walk_safe(pktq, pkt_next, tmp) {
++ 		__skb_unlink(pkt_next, pktq);
++-		brcmf_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
+++		brcmf_proto_bcdc_txcomplete(bus->sdiodev->dev, pkt_next,
+++					    ret == 0);
++ 	}
++ 	return ret;
++ }
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
++@@ -483,7 +483,7 @@ static void brcmf_usb_tx_complete(struct
++ 		  req->skb);
++ 	brcmf_usb_del_fromq(devinfo, req);
++ 
++-	brcmf_txcomplete(devinfo->dev, req->skb, urb->status == 0);
+++	brcmf_proto_bcdc_txcomplete(devinfo->dev, req->skb, urb->status == 0);
++ 	req->skb = NULL;
++ 	brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_freecount);
++ 	spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
+diff --git a/package/kernel/mac80211/patches/323-0008-brcmfmac-wrap-brcmf_fws_add_interface-into-bcdc-laye.patch b/package/kernel/mac80211/patches/323-0008-brcmfmac-wrap-brcmf_fws_add_interface-into-bcdc-laye.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..a68c6ab0c33d1a18ff315540cfb1d6be83cb0056
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0008-brcmfmac-wrap-brcmf_fws_add_interface-into-bcdc-laye.patch
+@@ -0,0 +1,95 @@
++From 9fdc64bbdbe7bd546e0fbcedd2f1c03448c6df42 Mon Sep 17 00:00:00 2001
++From: Franky Lin <franky.lin@broadcom.com>
++Date: Fri, 10 Mar 2017 21:17:04 +0000
++Subject: [PATCH] brcmfmac: wrap brcmf_fws_add_interface into bcdc layer
++
++fwsignal is only used by bcdc. Create a new protocol interface function
++brcmf_proto_add_if for core module to notify protocol layer upon a new
++interface is created.
++
++Signed-off-by: Franky Lin <franky.lin@broadcom.com>
++Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 7 +++++++
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 2 +-
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c  | 3 ++-
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 9 +++++++++
++ 4 files changed, 19 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++@@ -399,6 +399,12 @@ static void brcmf_proto_bcdc_rxreorder(s
++ 	brcmf_fws_rxreorder(ifp, skb);
++ }
++ 
+++static void
+++brcmf_proto_bcdc_add_if(struct brcmf_if *ifp)
+++{
+++	brcmf_fws_add_interface(ifp);
+++}
+++
++ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
++ {
++ 	struct brcmf_bcdc *bcdc;
++@@ -422,6 +428,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
++ 	drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
++ 	drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer;
++ 	drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
+++	drvr->proto->add_if = brcmf_proto_bcdc_add_if;
++ 	drvr->proto->pd = bcdc;
++ 
++ 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++@@ -990,7 +990,7 @@ int brcmf_bus_started(struct device *dev
++ 	if (ret < 0)
++ 		goto fail;
++ 
++-	brcmf_fws_add_interface(ifp);
+++	brcmf_proto_add_if(drvr, ifp);
++ 
++ 	drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
++ 					     drvr->settings->p2p_enable);
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
++@@ -25,6 +25,7 @@
++ #include "fwsignal.h"
++ #include "fweh.h"
++ #include "fwil.h"
+++#include "proto.h"
++ 
++ /**
++  * struct brcmf_fweh_queue_item - event item on event queue.
++@@ -172,7 +173,7 @@ static void brcmf_fweh_handle_if_event(s
++ 		if (IS_ERR(ifp))
++ 			return;
++ 		if (!is_p2pdev)
++-			brcmf_fws_add_interface(ifp);
+++			brcmf_proto_add_if(drvr, ifp);
++ 		if (!drvr->fweh.evt_handler[BRCMF_E_IF])
++ 			if (brcmf_net_attach(ifp, false) < 0)
++ 				return;
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
++@@ -44,6 +44,7 @@ struct brcmf_proto {
++ 	void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx,
++ 			      u8 peer[ETH_ALEN]);
++ 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
+++	void (*add_if)(struct brcmf_if *ifp);
++ 	void *pd;
++ };
++ 
++@@ -118,4 +119,12 @@ brcmf_proto_rxreorder(struct brcmf_if *i
++ 	ifp->drvr->proto->rxreorder(ifp, skb);
++ }
++ 
+++static inline void
+++brcmf_proto_add_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
+++{
+++	if (!drvr->proto->add_if)
+++		return;
+++	drvr->proto->add_if(ifp);
+++}
+++
++ #endif /* BRCMFMAC_PROTO_H */
+diff --git a/package/kernel/mac80211/patches/323-0009-brcmfmac-wrap-brcmf_fws_del_interface-into-bcdc-laye.patch b/package/kernel/mac80211/patches/323-0009-brcmfmac-wrap-brcmf_fws_del_interface-into-bcdc-laye.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..ded8d7b944de5515912fbae5b1351eb97fc0c59e
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0009-brcmfmac-wrap-brcmf_fws_del_interface-into-bcdc-laye.patch
+@@ -0,0 +1,83 @@
++From c02a5eb82056f75615cb48aa540bfd245f489b99 Mon Sep 17 00:00:00 2001
++From: Franky Lin <franky.lin@broadcom.com>
++Date: Fri, 10 Mar 2017 21:17:05 +0000
++Subject: [PATCH] brcmfmac: wrap brcmf_fws_del_interface into bcdc layer
++
++Create a new protocol interface function brcmf_proto_del_if for core
++module to notify protocol layer upon interface deletion.
++
++Signed-off-by: Franky Lin <franky.lin@broadcom.com>
++Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 7 +++++++
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 4 ++--
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 9 +++++++++
++ 3 files changed, 18 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++@@ -405,6 +405,12 @@ brcmf_proto_bcdc_add_if(struct brcmf_if
++ 	brcmf_fws_add_interface(ifp);
++ }
++ 
+++static void
+++brcmf_proto_bcdc_del_if(struct brcmf_if *ifp)
+++{
+++	brcmf_fws_del_interface(ifp);
+++}
+++
++ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
++ {
++ 	struct brcmf_bcdc *bcdc;
++@@ -429,6 +435,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
++ 	drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer;
++ 	drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
++ 	drvr->proto->add_if = brcmf_proto_bcdc_add_if;
+++	drvr->proto->del_if = brcmf_proto_bcdc_del_if;
++ 	drvr->proto->pd = bcdc;
++ 
++ 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++@@ -706,7 +706,7 @@ void brcmf_remove_interface(struct brcmf
++ 		return;
++ 	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx,
++ 		  ifp->ifidx);
++-	brcmf_fws_del_interface(ifp);
+++	brcmf_proto_del_if(ifp->drvr, ifp);
++ 	brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
++ }
++ 
++@@ -1035,7 +1035,7 @@ fail:
++ 		drvr->config = NULL;
++ 	}
++ 	if (drvr->fws) {
++-		brcmf_fws_del_interface(ifp);
+++		brcmf_proto_del_if(ifp->drvr, ifp);
++ 		brcmf_fws_deinit(drvr);
++ 	}
++ 	brcmf_net_detach(ifp->ndev, false);
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
++@@ -45,6 +45,7 @@ struct brcmf_proto {
++ 			      u8 peer[ETH_ALEN]);
++ 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
++ 	void (*add_if)(struct brcmf_if *ifp);
+++	void (*del_if)(struct brcmf_if *ifp);
++ 	void *pd;
++ };
++ 
++@@ -127,4 +128,12 @@ brcmf_proto_add_if(struct brcmf_pub *drv
++ 	drvr->proto->add_if(ifp);
++ }
++ 
+++static inline void
+++brcmf_proto_del_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
+++{
+++	if (!drvr->proto->del_if)
+++		return;
+++	drvr->proto->del_if(ifp);
+++}
+++
++ #endif /* BRCMFMAC_PROTO_H */
+diff --git a/package/kernel/mac80211/patches/323-0010-brcmfmac-wrap-brcmf_fws_reset_interface-into-bcdc-la.patch b/package/kernel/mac80211/patches/323-0010-brcmfmac-wrap-brcmf_fws_reset_interface-into-bcdc-la.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..34e71d8f5cccc550b901890b5619a7f67123335a
+--- /dev/null
++++ b/package/kernel/mac80211/patches/323-0010-brcmfmac-wrap-brcmf_fws_reset_interface-into-bcdc-la.patch
+@@ -0,0 +1,82 @@
++From 66ded1f8b33cdd9d6d3e20f5f8dd23615a110e70 Mon Sep 17 00:00:00 2001
++From: Franky Lin <franky.lin@broadcom.com>
++Date: Fri, 10 Mar 2017 21:17:06 +0000
++Subject: [PATCH] brcmfmac: wrap brcmf_fws_reset_interface into bcdc layer
++
++Create a new protocol interface function brcmf_proto_reset_if for core
++module to notify protocol layer when interface role changes.
++
++Signed-off-by: Franky Lin <franky.lin@broadcom.com>
++Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
++Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
++---
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 7 +++++++
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c  | 3 +--
++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 9 +++++++++
++ 3 files changed, 17 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++@@ -411,6 +411,12 @@ brcmf_proto_bcdc_del_if(struct brcmf_if
++ 	brcmf_fws_del_interface(ifp);
++ }
++ 
+++static void
+++brcmf_proto_bcdc_reset_if(struct brcmf_if *ifp)
+++{
+++	brcmf_fws_reset_interface(ifp);
+++}
+++
++ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
++ {
++ 	struct brcmf_bcdc *bcdc;
++@@ -436,6 +442,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
++ 	drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
++ 	drvr->proto->add_if = brcmf_proto_bcdc_add_if;
++ 	drvr->proto->del_if = brcmf_proto_bcdc_del_if;
+++	drvr->proto->reset_if = brcmf_proto_bcdc_reset_if;
++ 	drvr->proto->pd = bcdc;
++ 
++ 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
++@@ -22,7 +22,6 @@
++ #include "core.h"
++ #include "debug.h"
++ #include "tracepoint.h"
++-#include "fwsignal.h"
++ #include "fweh.h"
++ #include "fwil.h"
++ #include "proto.h"
++@@ -180,7 +179,7 @@ static void brcmf_fweh_handle_if_event(s
++ 	}
++ 
++ 	if (ifp && ifevent->action == BRCMF_E_IF_CHANGE)
++-		brcmf_fws_reset_interface(ifp);
+++		brcmf_proto_reset_if(drvr, ifp);
++ 
++ 	err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data);
++ 
++--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
+++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
++@@ -46,6 +46,7 @@ struct brcmf_proto {
++ 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
++ 	void (*add_if)(struct brcmf_if *ifp);
++ 	void (*del_if)(struct brcmf_if *ifp);
+++	void (*reset_if)(struct brcmf_if *ifp);
++ 	void *pd;
++ };
++ 
++@@ -136,4 +137,12 @@ brcmf_proto_del_if(struct brcmf_pub *drv
++ 	drvr->proto->del_if(ifp);
++ }
++ 
+++static inline void
+++brcmf_proto_reset_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
+++{
+++	if (!drvr->proto->reset_if)
+++		return;
+++	drvr->proto->reset_if(ifp);
+++}
+++
++ #endif /* BRCMFMAC_PROTO_H */
+diff --git a/package/kernel/mac80211/patches/326-ath9k-fix-ar934x-OTP-offsets.patch b/package/kernel/mac80211/patches/326-ath9k-fix-ar934x-OTP-offsets.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..60de2b6d147f0c77b58c3e5992df9d8014a9e17d
+--- /dev/null
++++ b/package/kernel/mac80211/patches/326-ath9k-fix-ar934x-OTP-offsets.patch
+@@ -0,0 +1,42 @@
++From: Christian Lamparter <chunkeey@googlemail.com>
++Date: Tue, 14 Feb 2017 20:10:30 +0100
++Subject: ath9k: use correct OTP register offsets for the AR9340 and AR9550
++
++This patch fixes the OTP register definitions for the AR934x and AR9550
++WMAC SoC.
++
++Previously, the ath9k driver was unable to initialize the integrated
++WMAC on an Aerohive AP121:
++
++| ath: phy0: timeout (1000 us) on reg 0x30018: 0xbadc0ffe & 0x00000007 != 0x00000004
++| ath: phy0: timeout (1000 us) on reg 0x30018: 0xbadc0ffe & 0x00000007 != 0x00000004
++| ath: phy0: Unable to initialize hardware; initialization status: -5
++| ath9k ar934x_wmac: failed to initialize device
++| ath9k: probe of ar934x_wmac failed with error -5
++
++It turns out that the AR9300_OTP_STATUS and AR9300_OTP_DATA
++definitions contain a typo.
++
++Fixes: add295a4afbdf5852d0 "ath9k: use correct OTP register offsets for AR9550"
++Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
++Signed-off-by: Chris Blake <chrisrblake93@gmail.com>
++---
++
++--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
+++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
++@@ -75,13 +75,13 @@
++ #define AR9300_OTP_BASE \
++ 		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30000 : 0x14000)
++ #define AR9300_OTP_STATUS \
++-		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30018 : 0x15f18)
+++		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x31018 : 0x15f18)
++ #define AR9300_OTP_STATUS_TYPE		0x7
++ #define AR9300_OTP_STATUS_VALID		0x4
++ #define AR9300_OTP_STATUS_ACCESS_BUSY	0x2
++ #define AR9300_OTP_STATUS_SM_BUSY	0x1
++ #define AR9300_OTP_READ_DATA \
++-		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3001c : 0x15f1c)
+++		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3101c : 0x15f1c)
++ 
++ enum targetPowerHTRates {
++ 	HT_TARGET_RATE_0_8_16,
+diff --git a/package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch b/package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..c9f493bcd8fe29afe1e08dc31b6370507b95fc72
+--- /dev/null
++++ b/package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch
+@@ -0,0 +1,31 @@
++From: Ben Greear <greearb@candelatech.com>
++Date: Wed, 31 May 2017 14:21:19 +0300
++Subject: [PATCH] ath10k: increase BMI timeout
++
++When testing a 9888 chipset NIC, I notice it often takes
++almost 2 seconds, and then many times OTP fails, probably due
++to the two-second timeout.
++
++[ 2269.841842] ath10k_pci 0000:05:00.0: bmi cmd took: 1984 jiffies (HZ: 1000), rv: 0
++[ 2273.608185] ath10k_pci 0000:05:00.0: bmi cmd took: 1986 jiffies (HZ: 1000), rv: 0
++[ 2277.294732] ath10k_pci 0000:05:00.0: bmi cmd took: 1989 jiffies (HZ: 1000), rv: 0
++
++So, increase the BMI timeout to 3 seconds.
++
++Signed-off-by: Ben Greear <greearb@candelatech.com>
++Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
++---
++
++--- a/drivers/net/wireless/ath/ath10k/bmi.h
+++++ b/drivers/net/wireless/ath/ath10k/bmi.h
++@@ -187,8 +187,8 @@ struct bmi_target_info {
++ 	u32 type;
++ };
++ 
++-/* in msec */
++-#define BMI_COMMUNICATION_TIMEOUT_HZ (2 * HZ)
+++/* in jiffies */
+++#define BMI_COMMUNICATION_TIMEOUT_HZ (3 * HZ)
++ 
++ #define BMI_CE_NUM_TO_TARG 0
++ #define BMI_CE_NUM_TO_HOST 1
+diff --git a/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch b/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..500f72ff988b87418ca235354ff33e4e4b96e716
+--- /dev/null
++++ b/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch
+@@ -0,0 +1,74 @@
++From: Ben Greear <greearb@candelatech.com>
++Date: Wed, 31 May 2017 14:21:21 +0300
++Subject: [PATCH] ath10k: log when longer bmi cmds happen
++
++This lets one have a clue that maybe timeouts are happening
++when we just aren't waiting long enough.
++
++Signed-off-by: Ben Greear <greearb@candelatech.com>
++Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
++---
++
++--- a/drivers/net/wireless/ath/ath10k/pci.c
+++++ b/drivers/net/wireless/ath/ath10k/pci.c
++@@ -101,7 +101,8 @@ static int ath10k_pci_init_irq(struct at
++ static int ath10k_pci_deinit_irq(struct ath10k *ar);
++ static int ath10k_pci_request_irq(struct ath10k *ar);
++ static void ath10k_pci_free_irq(struct ath10k *ar);
++-static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe,
+++static int ath10k_pci_bmi_wait(struct ath10k *ar,
+++			       struct ath10k_ce_pipe *tx_pipe,
++ 			       struct ath10k_ce_pipe *rx_pipe,
++ 			       struct bmi_xfer *xfer);
++ static int ath10k_pci_qca99x0_chip_reset(struct ath10k *ar);
++@@ -1843,7 +1844,7 @@ int ath10k_pci_hif_exchange_bmi_msg(stru
++ 	if (ret)
++ 		goto err_resp;
++ 
++-	ret = ath10k_pci_bmi_wait(ce_tx, ce_rx, &xfer);
+++	ret = ath10k_pci_bmi_wait(ar, ce_tx, ce_rx, &xfer);
++ 	if (ret) {
++ 		u32 unused_buffer;
++ 		unsigned int unused_nbytes;
++@@ -1910,23 +1911,37 @@ static void ath10k_pci_bmi_recv_data(str
++ 	xfer->rx_done = true;
++ }
++ 
++-static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe,
+++static int ath10k_pci_bmi_wait(struct ath10k *ar,
+++			       struct ath10k_ce_pipe *tx_pipe,
++ 			       struct ath10k_ce_pipe *rx_pipe,
++ 			       struct bmi_xfer *xfer)
++ {
++ 	unsigned long timeout = jiffies + BMI_COMMUNICATION_TIMEOUT_HZ;
+++	unsigned long started = jiffies;
+++	unsigned long dur;
+++	int ret;
++ 
++ 	while (time_before_eq(jiffies, timeout)) {
++ 		ath10k_pci_bmi_send_done(tx_pipe);
++ 		ath10k_pci_bmi_recv_data(rx_pipe);
++ 
++-		if (xfer->tx_done && (xfer->rx_done == xfer->wait_for_resp))
++-			return 0;
+++		if (xfer->tx_done && (xfer->rx_done == xfer->wait_for_resp)) {
+++			ret = 0;
+++			goto out;
+++		}
++ 
++ 		schedule();
++ 	}
++ 
++-	return -ETIMEDOUT;
+++	ret = -ETIMEDOUT;
+++
+++out:
+++	dur = jiffies - started;
+++	if (dur > HZ)
+++		ath10k_dbg(ar, ATH10K_DBG_BMI,
+++			   "bmi cmd took %lu jiffies hz %d ret %d\n",
+++			   dur, HZ, ret);
+++	return ret;
++ }
++ 
++ /*
+diff --git a/package/kernel/mac80211/patches/329-ath10k-add-BMI-parameters-to-fix-calibration-from-DT.patch b/package/kernel/mac80211/patches/329-ath10k-add-BMI-parameters-to-fix-calibration-from-DT.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..3fcf505e1547b474d87ecf5d42a3f1e2cf08068f
+--- /dev/null
++++ b/package/kernel/mac80211/patches/329-ath10k-add-BMI-parameters-to-fix-calibration-from-DT.patch
+@@ -0,0 +1,80 @@
++From: Anilkumar Kolli <akolli@qti.qualcomm.com>
++Date: Wed, 31 May 2017 14:21:27 +0300
++Subject: [PATCH] ath10k: add BMI parameters to fix calibration from
++ DT/pre-cal
++
++QCA99X0, QCA9888, QCA9984 supports calibration data in
++either OTP or DT/pre-cal file. Current ath10k supports
++Calibration data from OTP only.
++
++If caldata is loaded from DT/pre-cal file, fetching board id
++and applying calibration parameters like tx power gets failed.
++
++error log:
++[   15.733663] ath10k_pci 0000:01:00.0: failed to fetch board file: -2
++[   15.741474] ath10k_pci 0000:01:00.0: could not probe fw (-2)
++
++This patch adds calibration data support from DT/pre-cal
++file.  Below parameters are used to get board id and
++applying calibration parameters from cal data.
++
++		EEPROM[OTP]	FLASH[DT/pre-cal file]
++Cal param	0x700		0x10000
++Board id	0x10		0x8000
++
++Tested on QCA9888 with pre-cal file.
++
++Signed-off-by: Anilkumar Kolli <akolli@qti.qualcomm.com>
++Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
++---
++
++--- a/drivers/net/wireless/ath/ath10k/bmi.h
+++++ b/drivers/net/wireless/ath/ath10k/bmi.h
++@@ -83,6 +83,8 @@ enum bmi_cmd_id {
++ #define BMI_NVRAM_SEG_NAME_SZ 16
++ 
++ #define BMI_PARAM_GET_EEPROM_BOARD_ID 0x10
+++#define BMI_PARAM_GET_FLASH_BOARD_ID 0x8000
+++#define BMI_PARAM_FLASH_SECTION_ALL 0x10000
++ 
++ #define ATH10K_BMI_BOARD_ID_FROM_OTP_MASK   0x7c00
++ #define ATH10K_BMI_BOARD_ID_FROM_OTP_LSB    10
++--- a/drivers/net/wireless/ath/ath10k/core.c
+++++ b/drivers/net/wireless/ath/ath10k/core.c
++@@ -657,7 +657,7 @@ static int ath10k_core_get_board_id_from
++ {
++ 	u32 result, address;
++ 	u8 board_id, chip_id;
++-	int ret;
+++	int ret, bmi_board_id_param;
++ 
++ 	address = ar->hw_params.patch_load_addr;
++ 
++@@ -681,8 +681,13 @@ static int ath10k_core_get_board_id_from
++ 		return ret;
++ 	}
++ 
++-	ret = ath10k_bmi_execute(ar, address, BMI_PARAM_GET_EEPROM_BOARD_ID,
++-				 &result);
+++	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
+++	    ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
+++		bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
+++	else
+++		bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
+++
+++	ret = ath10k_bmi_execute(ar, address, bmi_board_id_param, &result);
++ 	if (ret) {
++ 		ath10k_err(ar, "could not execute otp for board id check: %d\n",
++ 			   ret);
++@@ -810,6 +815,11 @@ static int ath10k_download_and_run_otp(s
++ 		return ret;
++ 	}
++ 
+++	/* As of now pre-cal is valid for 10_4 variants */
+++	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
+++	    ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
+++		bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
+++
++ 	ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
++ 	if (ret) {
++ 		ath10k_err(ar, "could not execute otp (%d)\n", ret);
+diff --git a/package/kernel/mac80211/patches/330-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch b/package/kernel/mac80211/patches/330-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..d799ab4a628881f7f702bed762421befe33f1d59
+--- /dev/null
++++ b/package/kernel/mac80211/patches/330-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch
+@@ -0,0 +1,23 @@
++From: Felix Fietkau <nbd@nbd.name>
++Date: Wed, 19 Jul 2017 08:49:31 +0200
++Subject: [PATCH] ath9k: adjust tx power reduction for US regulatory domain
++
++FCC regulatory rules allow for up to 3 dBi antenna gain. Account for
++this in the EEPROM based tx power reduction code.
++
++Signed-off-by: Felix Fietkau <nbd@nbd.name>
++---
++
++--- a/drivers/net/wireless/ath/ath9k/hw.c
+++++ b/drivers/net/wireless/ath/ath9k/hw.c
++@@ -2954,6 +2954,10 @@ void ath9k_hw_apply_txpower(struct ath_h
++ 	if (ant_gain > max_gain)
++ 		ant_reduction = ant_gain - max_gain;
++ 
+++	/* FCC allows maximum antenna gain of 3 dBi */
+++	if (reg->region == NL80211_DFS_FCC)
+++		ant_reduction = max_t(int, ant_reduction - 6, 0);
+++
++ 	ah->eep_ops->set_txpower(ah, chan, ctl, ant_reduction, new_pwr, test);
++ }
++ 
+diff --git a/package/kernel/mac80211/patches/331-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch b/package/kernel/mac80211/patches/331-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..1e0761eb1547ba7885e79f8444e302f3c424e24f
+--- /dev/null
++++ b/package/kernel/mac80211/patches/331-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch
+@@ -0,0 +1,40 @@
++From: Felix Fietkau <nbd@nbd.name>
++Date: Sun, 23 Jul 2017 14:58:22 +0200
++Subject: [PATCH] ath9k: fix more-data flag for buffered multicast packets
++
++The flag needs to be cleared for the last packet in the list, not the
++first one. Fixes some issues with multicast packet loss for powersave
++clients connected to an ath9k AP.
++
++Signed-off-by: Felix Fietkau <nbd@nbd.name>
++---
++
++--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++++ b/drivers/net/wireless/ath/ath9k/xmit.c
++@@ -2451,7 +2451,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw
++ 		.txq = sc->beacon.cabq
++ 	};
++ 	struct ath_tx_info info = {};
++-	struct ieee80211_hdr *hdr;
++ 	struct ath_buf *bf_tail = NULL;
++ 	struct ath_buf *bf;
++ 	LIST_HEAD(bf_q);
++@@ -2495,15 +2494,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw
++ 	if (list_empty(&bf_q))
++ 		return;
++ 
++-	bf = list_first_entry(&bf_q, struct ath_buf, list);
++-	hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data;
++-
++-	if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) {
++-		hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
++-		dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
++-			sizeof(*hdr), DMA_TO_DEVICE);
++-	}
+++	bf = list_last_entry(&bf_q, struct ath_buf, list);
+++	ath9k_set_moredata(sc, bf, false);
++ 
+++	bf = list_first_entry(&bf_q, struct ath_buf, list);
++ 	ath_txq_lock(sc, txctl.txq);
++ 	ath_tx_fill_desc(sc, bf, txctl.txq, 0);
++ 	ath_tx_txqaddbuf(sc, txctl.txq, &bf_q, false);
+diff --git a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch
+index 35d8e8bd42399797d4904f60d61f7118c156ba7c..8ed7ad8a09a13f85e2b0f437020b650cacb89190 100644
+--- a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch
++++ b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch
+@@ -56,16 +56,21 @@
+  
+  	INIT_LIST_HEAD(&sc->leds);
+  
+-@@ -144,6 +165,12 @@ void ath_init_leds(struct ath_softc *sc)
++@@ -134,6 +155,17 @@ void ath_init_leds(struct ath_softc *sc)
+  
+- 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
+- 			   !sc->sc_ah->config.led_active_high);
++ 	ath_fill_led_pin(sc);
++ 
+++	if (pdata && pdata->leds && pdata->num_leds)
+++		for (i = 0; i < pdata->num_leds; i++) {
+++			if (pdata->leds[i].gpio == sc->sc_ah->led_pin)
+++				sc->sc_ah->led_pin = -1;
+++
+++			ath_create_platform_led(sc, &pdata->leds[i]);
+++		}
+ +
+-+	if (!pdata)
+++	if (sc->sc_ah->led_pin < 0)
+ +		return;
+ +
+-+	for (i = 0; i < pdata->num_leds; i++)
+-+		ath_create_platform_led(sc, &pdata->leds[i]);
+- }
+- #endif
++ 	snprintf(led_name, sizeof(led_name), "ath9k-%s",
++ 		 wiphy_name(sc->hw->wiphy));
+  
+diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch
+deleted file mode 100644
+index ced72c6c69fe30ebbc1c416c5e60d95dc985d6db..0000000000000000000000000000000000000000
+--- a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch
++++ /dev/null
+@@ -1,39 +0,0 @@
+-From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+-Date: Sun, 31 Jan 2016 20:45:57 +0100
+-Subject: [PATCH v4 1/8] mac80211: ath9k: enable platform WLAN LED name
+-
+-Enable platform-supplied WLAN LED name for ath9k device. It replaces generic
+-'ath9k-phy*' label with string set during platform initialization.
+-
+-Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
+----
+- drivers/net/wireless/ath/ath9k/gpio.c |   10 +++++++---
+- include/linux/ath9k_platform.h        |    1 +
+- 2 files changed, 8 insertions(+), 3 deletions(-)
+-
+---- a/drivers/net/wireless/ath/ath9k/gpio.c
+-+++ b/drivers/net/wireless/ath/ath9k/gpio.c
+-@@ -155,8 +155,11 @@ void ath_init_leds(struct ath_softc *sc)
+- 
+- 	ath_fill_led_pin(sc);
+- 
+--	snprintf(led_name, sizeof(led_name), "ath9k-%s",
+--		 wiphy_name(sc->hw->wiphy));
+-+	if (pdata && pdata->led_name)
+-+		strncpy(led_name, pdata->led_name, sizeof(led_name));
+-+	else
+-+		snprintf(led_name, sizeof(led_name), "ath9k-%s",
+-+			 wiphy_name(sc->hw->wiphy));
+- 
+- 	if (ath9k_led_blink)
+- 		trigger = sc->led_default_trigger;
+---- a/include/linux/ath9k_platform.h
+-+++ b/include/linux/ath9k_platform.h
+-@@ -49,6 +49,7 @@ struct ath9k_platform_data {
+- 
+- 	int num_leds;
+- 	const struct gpio_led *leds;
+-+	const char *led_name;
+- };
+- 
+- #endif /* _LINUX_ATH9K_PLATFORM_H */
+diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
+index d4269282d960d857cde3f81d1839359cf3447ff2..31dac29ad77b89626d300d9a82ba3bd2cc2210a1 100644
+--- a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
++++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
+@@ -196,7 +196,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+  	return 0;
+  }
+  
+-@@ -136,12 +264,18 @@ void ath_deinit_leds(struct ath_softc *s
++@@ -136,17 +264,24 @@ void ath_deinit_leds(struct ath_softc *s
+  
+  	while (!list_empty(&sc->leds)) {
+  		led = list_first_entry(&sc->leds, struct ath_led, list);
+@@ -215,18 +215,31 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+  }
+  
+  void ath_init_leds(struct ath_softc *sc)
+-@@ -158,6 +292,8 @@ void ath_init_leds(struct ath_softc *sc)
++ {
++ 	struct ath9k_platform_data *pdata = sc->dev->platform_data;
+++	struct device_node *np = sc->dev->of_node;
++ 	char led_name[32];
++ 	const char *trigger;
++ 	int i;
++@@ -156,6 +291,15 @@ void ath_init_leds(struct ath_softc *sc)
++ 	if (AR_SREV_9100(sc->sc_ah))
++ 		return;
+  
+++	if (!np)
+++		ath9k_register_gpio_chip(sc);
+++
+++	/* setup gpio controller only if requested and skip the led_pin setup */
+++	if (of_property_read_bool(np, "gpio-controller")) {
+++		ath9k_register_gpio_chip(sc);
+++		return;
+++	}
+++
+  	ath_fill_led_pin(sc);
+  
+-+	ath9k_register_gpio_chip(sc);
+-+
+- 	if (pdata && pdata->led_name)
+- 		strncpy(led_name, pdata->led_name, sizeof(led_name));
+- 	else
+-@@ -178,6 +314,7 @@ void ath_init_leds(struct ath_softc *sc)
+- 	for (i = 0; i < pdata->num_leds; i++)
+- 		ath_create_platform_led(sc, &pdata->leds[i]);
++ 	if (pdata && pdata->leds && pdata->num_leds)
++@@ -180,6 +324,7 @@ void ath_init_leds(struct ath_softc *sc)
++ 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
++ 			   !sc->sc_ah->config.led_active_high);
+  }
+ +
+  #endif
+diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
+index f40bac93c34660f5d9bb515f79287d768b8d6014..f3fead0a1aef41e05957fda39128b13eaebb9652 100644
+--- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
++++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
+@@ -117,29 +117,20 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+  	while (!list_empty(&sc->leds)) {
+  		led = list_first_entry(&sc->leds, struct ath_led, list);
+  #ifdef CONFIG_GPIOLIB
+-@@ -293,6 +362,7 @@ void ath_init_leds(struct ath_softc *sc)
+- 	ath_fill_led_pin(sc);
++@@ -301,6 +370,7 @@ void ath_init_leds(struct ath_softc *sc)
++ 	}
+  
+- 	ath9k_register_gpio_chip(sc);
++ 	ath_fill_led_pin(sc);
+ +	ath9k_init_buttons(sc);
+  
+- 	if (pdata && pdata->led_name)
+- 		strncpy(led_name, pdata->led_name, sizeof(led_name));
+-@@ -308,7 +378,7 @@ void ath_init_leds(struct ath_softc *sc)
+- 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
+- 			   !sc->sc_ah->config.led_active_high);
+- 
+--	if (!pdata)
+-+	if (!pdata || !pdata->leds || !pdata->num_leds)
+- 		return;
+- 
+- 	for (i = 0; i < pdata->num_leds; i++)
++ 	if (pdata && pdata->leds && pdata->num_leds)
++ 		for (i = 0; i < pdata->num_leds; i++) {
+ --- a/include/linux/ath9k_platform.h
+ +++ b/include/linux/ath9k_platform.h
+-@@ -50,6 +50,10 @@ struct ath9k_platform_data {
++@@ -49,6 +49,10 @@ struct ath9k_platform_data {
++ 
+  	int num_leds;
+  	const struct gpio_led *leds;
+- 	const char *led_name;
+ +
+ +	unsigned num_btns;
+ +	const struct gpio_keys_button *btns;
+diff --git a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch
+index 45284c71eed616bcaa5c875e85c209fbefc738a5..bcb0026a69afdc52b3bf5ba074418435b343d1be 100644
+--- a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch
++++ b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch
+@@ -375,7 +375,7 @@
+  
+ --- a/include/linux/ath9k_platform.h
+ +++ b/include/linux/ath9k_platform.h
+-@@ -54,6 +54,8 @@ struct ath9k_platform_data {
++@@ -53,6 +53,8 @@ struct ath9k_platform_data {
+  	unsigned num_btns;
+  	const struct gpio_keys_button *btns;
+  	unsigned btn_poll_interval;
+diff --git a/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch
+index 2325f37670be46d805d9d5a3deb5b3f8322017aa..dc0f19490e88b0f9aba2fbd9e5b97e3e9b0f299d 100644
+--- a/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch
++++ b/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -9379,6 +9379,7 @@ static int rt2800_probe_rt(struct rt2x00
++@@ -9397,6 +9397,7 @@ static int rt2800_probe_rt(struct rt2x00
+  	case RT3390:
+  	case RT3572:
+  	case RT3593:
+diff --git a/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
+index 9775664deb94a087315008637d32a1227a5f488e..45fc9645046bd39f039317bfd4dfd5e7b16e6781 100644
+--- a/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
++++ b/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
+@@ -31,7 +31,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  #define RF5362				0x5362
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8957,6 +8957,66 @@ static const struct rf_channel rf_vals_3
++@@ -8975,6 +8975,66 @@ static const struct rf_channel rf_vals_3
+  	{14,   0xF0,	 2,  0x18},
+  };
+  
+@@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  static const struct rf_channel rf_vals_5592_xtal20[] = {
+  	/* Channel, N, K, mod, R */
+  	{1, 482, 4, 10, 3},
+-@@ -9220,6 +9280,11 @@ static int rt2800_probe_hw_mode(struct r
++@@ -9238,6 +9298,11 @@ static int rt2800_probe_hw_mode(struct r
+  		spec->channels = rf_vals_3x;
+  		break;
+  
+diff --git a/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
+index 5737e015c171d47ff6dc67761de3e7f29080873e..fb32b75d0a63ed0bab62ad8e52b74cde2d6576a4 100644
+--- a/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
++++ b/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -4855,6 +4855,7 @@ void rt2800_vco_calibration(struct rt2x0
++@@ -4871,6 +4871,7 @@ void rt2800_vco_calibration(struct rt2x0
+  	case RF3053:
+  	case RF3070:
+  	case RF3290:
+@@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  	case RF5350:
+  	case RF5360:
+  	case RF5362:
+-@@ -9402,6 +9403,7 @@ static int rt2800_probe_hw_mode(struct r
++@@ -9420,6 +9421,7 @@ static int rt2800_probe_hw_mode(struct r
+  	case RF3053:
+  	case RF3070:
+  	case RF3290:
+diff --git a/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch b/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch
+index afcb6bdf4a52ab4e941e5bd996a16952935a948e..266a3fba50b15e20ef1f04c7ce32a76ceec51c89 100644
+--- a/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch
++++ b/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch
+@@ -223,7 +223,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  #define POWER_BOUND		0x27
+  #define POWER_BOUND_5G		0x2b
+  
+-@@ -3565,6 +3770,9 @@ static void rt2800_config_channel(struct
++@@ -3567,6 +3772,9 @@ static void rt2800_config_channel(struct
+  	case RF3322:
+  		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
+  		break;
+diff --git a/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch b/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch
+index 95790165955d06913499f3b583ac90da60a0445f..53e6bbb15512dca668782e079abcd3860b22f1d5 100644
+--- a/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch
++++ b/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8882,6 +8882,7 @@ static int rt2800_init_eeprom(struct rt2
++@@ -8900,6 +8900,7 @@ static int rt2800_init_eeprom(struct rt2
+  	case RF3290:
+  	case RF3320:
+  	case RF3322:
+diff --git a/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch b/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
+index 08b54f67269888abeb9f6ee59b8885966fb116f3..cfa95e56bc949f4bf8c3a05eacada49bcc89abff 100644
+--- a/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
++++ b/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
+@@ -35,7 +35,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  #define RX_FILTER_CFG			0x1400
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -5485,6 +5485,12 @@ static int rt2800_init_registers(struct
++@@ -5501,6 +5501,12 @@ static int rt2800_init_registers(struct
+  			rt2800_register_write(rt2x00dev, TX_SW_CFG2,
+  					      0x00000000);
+  		}
+@@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+  		   rt2x00_rt(rt2x00dev, RT5392) ||
+  		   rt2x00_rt(rt2x00dev, RT6352)) {
+-@@ -5698,6 +5704,11 @@ static int rt2800_init_registers(struct
++@@ -5714,6 +5720,11 @@ static int rt2800_init_registers(struct
+  	reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002;
+  	rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
+  
+diff --git a/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch b/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
+index ced3645aef4d6df5cc3fba2c444188dc8c92b1f3..6adb9e1cd24a2a1b3e6dfbb63ff7b6cff79fa2e0 100644
+--- a/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
++++ b/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
+@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -6325,6 +6325,47 @@ static void rt2800_init_bbp_3593(struct
++@@ -6341,6 +6341,47 @@ static void rt2800_init_bbp_3593(struct
+  		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
+  }
+  
+@@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
+  {
+  	int ant, div_mode;
+-@@ -6769,6 +6810,9 @@ static void rt2800_init_bbp(struct rt2x0
++@@ -6785,6 +6826,9 @@ static void rt2800_init_bbp(struct rt2x0
+  	case RT3593:
+  		rt2800_init_bbp_3593(rt2x00dev);
+  		return;
+diff --git a/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch b/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
+index 08e4ffe9ba47893180a23755b132b262932e423d..aa3ead6ee8a397ec6c279e600d841eb3fcb4a863 100644
+--- a/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
++++ b/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
+@@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  #define RFCSR2_TX2_EN_MT7620		FIELD8(0x20)
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -7685,6 +7685,144 @@ static void rt2800_init_rfcsr_5350(struc
++@@ -7701,6 +7701,144 @@ static void rt2800_init_rfcsr_5350(struc
+  	rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
+  }
+  
+@@ -166,7 +166,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
+  {
+  	rt2800_rf_init_calibration(rt2x00dev, 2);
+-@@ -8525,6 +8663,9 @@ static void rt2800_init_rfcsr(struct rt2
++@@ -8543,6 +8681,9 @@ static void rt2800_init_rfcsr(struct rt2
+  	case RT3390:
+  		rt2800_init_rfcsr_3390(rt2x00dev);
+  		break;
+diff --git a/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch b/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
+index c03527b4f704c87f1544b6fb6cd894abe9b1f83e..0ac7b040ec81742d32275b7e85ae5f729a61d798 100644
+--- a/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
++++ b/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -9059,6 +9059,8 @@ static int rt2800_init_eeprom(struct rt2
++@@ -9077,6 +9077,8 @@ static int rt2800_init_eeprom(struct rt2
+  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
+  	else if (rt2x00_rt(rt2x00dev, RT3352))
+  		rf = RF3322;
+diff --git a/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch b/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
+index 04574db7c18c77ec7e6354ea597a974661bd449a..dc34a96d99c9ab1b214a6dfada39404023fabb5e 100644
+--- a/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
++++ b/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -3733,6 +3733,36 @@ static char rt2800_txpower_to_dev(struct
++@@ -3735,6 +3735,36 @@ static char rt2800_txpower_to_dev(struct
+  		return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
+  }
+  
+@@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
+  				  struct ieee80211_conf *conf,
+  				  struct rf_channel *rf,
+-@@ -3751,6 +3781,12 @@ static void rt2800_config_channel(struct
++@@ -3753,6 +3783,12 @@ static void rt2800_config_channel(struct
+  			rt2800_txpower_to_dev(rt2x00dev, rf->channel,
+  					      info->default_power3);
+  
+@@ -60,7 +60,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  	switch (rt2x00dev->chip.rf) {
+  	case RF2020:
+  	case RF3020:
+-@@ -3855,6 +3891,15 @@ static void rt2800_config_channel(struct
++@@ -3857,6 +3893,15 @@ static void rt2800_config_channel(struct
+  		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
+  		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
+  		rt2800_bbp_write(rt2x00dev, 77, 0x98);
+@@ -76,7 +76,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  	} else {
+  		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
+  		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
+-@@ -3868,6 +3913,7 @@ static void rt2800_config_channel(struct
++@@ -3870,6 +3915,7 @@ static void rt2800_config_channel(struct
+  		    !rt2x00_rt(rt2x00dev, RT6352)) {
+  			if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+  				rt2800_bbp_write(rt2x00dev, 82, 0x62);
+@@ -84,7 +84,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  				rt2800_bbp_write(rt2x00dev, 75, 0x46);
+  			} else {
+  				if (rt2x00_rt(rt2x00dev, RT3593))
+-@@ -3876,19 +3922,22 @@ static void rt2800_config_channel(struct
++@@ -3878,19 +3924,22 @@ static void rt2800_config_channel(struct
+  					rt2800_bbp_write(rt2x00dev, 82, 0x84);
+  				rt2800_bbp_write(rt2x00dev, 75, 0x50);
+  			}
+@@ -110,7 +110,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  			rt2800_bbp_write(rt2x00dev, 83, 0x9a);
+  
+  		if (rt2x00_has_cap_external_lna_a(rt2x00dev))
+-@@ -4011,6 +4060,23 @@ static void rt2800_config_channel(struct
++@@ -4013,6 +4062,23 @@ static void rt2800_config_channel(struct
+  
+  		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
+  
+diff --git a/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch b/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
+index 3412a3e1334438c45e3780ffac395c6ef041e84f..e93d2dd96f92a23158aeb572642767aeacd22eee 100644
+--- a/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
++++ b/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -3720,13 +3720,15 @@ static char rt2800_txpower_to_dev(struct
++@@ -3722,13 +3722,15 @@ static char rt2800_txpower_to_dev(struct
+  				  unsigned int channel,
+  				  char txpower)
+  {
+diff --git a/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch b/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
+index 8d1df8cf77ad955c40ac07bd2c6e7294dc40158d..463346eec4804602a12b399144f91893403e54ec 100644
+--- a/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
++++ b/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
+@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -5085,7 +5085,8 @@ static void rt2800_config_txpower(struct
++@@ -5101,7 +5101,8 @@ static void rt2800_config_txpower(struct
+  				  struct ieee80211_channel *chan,
+  				  int power_level)
+  {
+diff --git a/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch b/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
+index 9aeb41fe6b167623872cfd6afa06dd8fb7ee2fee..3efac122463b89baa49750942385144fd21ed691 100644
+--- a/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
++++ b/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
+@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8941,7 +8941,8 @@ static u8 rt2800_get_txmixer_gain_24g(st
++@@ -8959,7 +8959,8 @@ static u8 rt2800_get_txmixer_gain_24g(st
+  {
+  	u16 word;
+  
+@@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  		return 0;
+  
+  	rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
+-@@ -8955,7 +8956,8 @@ static u8 rt2800_get_txmixer_gain_5g(str
++@@ -8973,7 +8974,8 @@ static u8 rt2800_get_txmixer_gain_5g(str
+  {
+  	u16 word;
+  
+diff --git a/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch b/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
+index 70c33a1d20431dbc388e39e20501067405c04eea..8c563b89389fcd00d55e916543405a57574f7c7c 100644
+--- a/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
++++ b/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -5338,7 +5338,8 @@ static u8 rt2800_get_default_vgc(struct
++@@ -5354,7 +5354,8 @@ static u8 rt2800_get_default_vgc(struct
+  		else
+  			vgc = 0x2e + rt2x00dev->lna_gain;
+  	} else { /* 5GHZ band */
+@@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  			vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
+  		else if (rt2x00_rt(rt2x00dev, RT5592))
+  			vgc = 0x24 + (2 * rt2x00dev->lna_gain);
+-@@ -5358,7 +5359,8 @@ static inline void rt2800_set_vgc(struct
++@@ -5374,7 +5375,8 @@ static inline void rt2800_set_vgc(struct
+  {
+  	if (qual->vgc_level != vgc_level) {
+  		if (rt2x00_rt(rt2x00dev, RT3572) ||
+@@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  			rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
+  						       vgc_level);
+  		} else if (rt2x00_rt(rt2x00dev, RT5592)) {
+-@@ -5405,6 +5407,11 @@ void rt2800_link_tuner(struct rt2x00_dev
++@@ -5421,6 +5423,11 @@ void rt2800_link_tuner(struct rt2x00_dev
+  		}
+  		break;
+  
+diff --git a/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch b/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
+index a2cfd896ebcf45bc8066c340a0b4833bd3c62d53..6e9ef1071cfa6ca73fd6bf68e2a8377311888dee 100644
+--- a/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
++++ b/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -9074,7 +9074,8 @@ static int rt2800_validate_eeprom(struct
++@@ -9092,7 +9092,8 @@ static int rt2800_validate_eeprom(struct
+  	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
+  	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
+  		rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
+@@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  		if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
+  		    rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
+  			rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
+-@@ -9094,7 +9095,8 @@ static int rt2800_validate_eeprom(struct
++@@ -9112,7 +9113,8 @@ static int rt2800_validate_eeprom(struct
+  	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
+  	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
+  		rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
+@@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+  		if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
+  		    rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
+  			rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
+-@@ -9102,7 +9104,8 @@ static int rt2800_validate_eeprom(struct
++@@ -9120,7 +9122,8 @@ static int rt2800_validate_eeprom(struct
+  	}
+  	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
+  
+diff --git a/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch b/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
+index ac8b219efdfa66ee01562653c15365f7504097e1..1a8ccbc9bda98f433e03d459031027f30efbca7c 100644
+--- a/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
++++ b/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
+@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -4332,6 +4332,9 @@ static u8 rt2800_compensate_txpower(stru
++@@ -4348,6 +4348,9 @@ static u8 rt2800_compensate_txpower(stru
+  	if (rt2x00_rt(rt2x00dev, RT3593))
+  		return min_t(u8, txpower, 0xc);
+  
+diff --git a/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch
+index 0236683d5f3c1eb723a1665c4d052f9bc841841e..51890e0a3bd7acd3eee965525a2ab40806fb4f34 100644
+--- a/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch
++++ b/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch
+@@ -8,7 +8,7 @@
+  
+  #include "rt2x00.h"
+  #include "rt2800lib.h"
+-@@ -9261,6 +9262,17 @@ static int rt2800_init_eeprom(struct rt2
++@@ -9279,6 +9280,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);
+  
+diff --git a/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..64a62f4b0792168fb60e3f33b20d0f8a751aa911
+--- /dev/null
++++ b/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
+@@ -0,0 +1,118 @@
++From 9782a7f7488443568fa4d6088b73c9aff7eb8510 Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Wed, 19 Apr 2017 16:14:53 +0200
++Subject: [PATCH] rt2x00: add support for external PA on MT7620
++To: Stanislaw Gruszka <sgruszka@redhat.com>
++Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
++    linux-wireless@vger.kernel.org,
++    Kalle Valo <kvalo@codeaurora.org>
++
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800.h    |  1 +
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 70 +++++++++++++++++++++++++-
++ 2 files changed, 70 insertions(+), 1 deletion(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
++@@ -2749,6 +2749,7 @@ enum rt2800_eeprom_word {
++ #define EEPROM_NIC_CONF2_RX_STREAM	FIELD16(0x000f)
++ #define EEPROM_NIC_CONF2_TX_STREAM	FIELD16(0x00f0)
++ #define EEPROM_NIC_CONF2_CRYSTAL	FIELD16(0x0600)
+++#define EEPROM_NIC_CONF2_EXTERNAL_PA	FIELD16(0xc000)
++ 
++ /*
++  * EEPROM LNA
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -4114,6 +4114,61 @@ static void rt2800_config_channel(struct
++ 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
++ 	}
++ 
+++	if (rt2x00_rt(rt2x00dev, RT6352)) {
+++		if (test_bit(CAPABILITY_EXTERNAL_PA_TX0,
+++			     &rt2x00dev->cap_flags)) {
+++			rt2x00_warn(rt2x00dev, "Using incomplete support for " \
+++					       "external PA\n");
+++			rt2800_register_read(rt2x00dev, RF_CONTROL3, &reg);
+++			reg |= 0x00000101;
+++			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
+++
+++			rt2800_register_read(rt2x00dev, RF_BYPASS3, &reg);
+++			reg |= 0x00000101;
+++			rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
+++
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 43, 0x73);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 43, 0x73);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 44, 0x73);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 44, 0x73);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 45, 0x73);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0x73);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 46, 0x27);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 46, 0x27);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0xC8);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0xC8);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 48, 0xA4);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 48, 0xA4);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 49, 0x05);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 49, 0x05);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x27);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 55, 0xC8);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 55, 0xC8);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 56, 0xA4);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 56, 0xA4);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 57, 0x05);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 57, 0x05);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 58, 0x27);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 58, 0x27);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 59, 0xC8);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 59, 0xC8);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 60, 0xA4);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 60, 0xA4);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 4, 61, 0x05);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 6, 61, 0x05);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 5, 05, 0x00);
+++			rt2800_rfcsr_write_bank(rt2x00dev, 7, 05, 0x00);
+++
+++			rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT,
+++					      0x36303636);
+++			rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN,
+++					      0x6C6C6B6C);
+++			rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN,
+++					      0x6C6C6B6C);
+++		}
+++	}
+++
++ 	rt2800_bbp_read(rt2x00dev, 4, &bbp);
++ 	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
++ 	rt2800_bbp_write(rt2x00dev, 4, bbp);
++@@ -9308,7 +9363,8 @@ static int rt2800_init_eeprom(struct rt2
++ 	 */
++ 	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
++ 
++-	if (rt2x00_rt(rt2x00dev, RT3352)) {
+++	if (rt2x00_rt(rt2x00dev, RT3352) ||
+++	    rt2x00_rt(rt2x00dev, RT6352)) {
++ 		if (rt2x00_get_field16(eeprom,
++ 		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
++ 		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
++@@ -9319,6 +9375,18 @@ static int rt2800_init_eeprom(struct rt2
++ 			      &rt2x00dev->cap_flags);
++ 	}
++ 
+++	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2, &eeprom);
+++
+++	if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) {
+++		if (rt2x00_get_field16(eeprom,
+++		    EEPROM_NIC_CONF2_EXTERNAL_PA)) {
+++		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
+++			      &rt2x00dev->cap_flags);
+++		    __set_bit(CAPABILITY_EXTERNAL_PA_TX1,
+++			      &rt2x00dev->cap_flags);
+++		}
+++	}
+++
++ 	return 0;
++ }
++ 
+diff --git a/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch b/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..b65bd7a73e493a52acb52947462565a9ec43c788
+--- /dev/null
++++ b/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch
+@@ -0,0 +1,132 @@
++From pozega.tomislav@gmail.com Thu May 18 12:42:27 2017
++Return-path: <pozega.tomislav@gmail.com>
++Envelope-to: daniel@makrotopia.org
++Delivery-date: Thu, 18 May 2017 12:42:27 +0200
++Received: from mail by fudo.makrotopia.org with sa-checked (Exim 4.88)
++	(envelope-from <pozega.tomislav@gmail.com>)
++	id 1dBIsy-00088b-PU
++	for daniel@makrotopia.org; Thu, 18 May 2017 12:42:27 +0200
++X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on fudo.makrotopia.org
++X-Spam-Level: 
++X-Spam-Status: No, score=-0.8 required=2.5 tests=DKIM_SIGNED,DKIM_VALID,
++	DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_LOW shortcircuit=no
++	autolearn=ham autolearn_force=no version=3.4.1
++Received: from mail-oi0-x22a.google.com ([2607:f8b0:4003:c06::22a])
++	by fudo.makrotopia.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128)
++	 (Exim 4.88)
++	(envelope-from <pozega.tomislav@gmail.com>)
++	id 1dBIsv-00088Q-Dq
++	for daniel@makrotopia.org; Thu, 18 May 2017 12:42:24 +0200
++Received: by mail-oi0-x22a.google.com with SMTP id w10so48782189oif.0
++        for <daniel@makrotopia.org>; Thu, 18 May 2017 03:42:21 -0700 (PDT)
++DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
++        d=gmail.com; s=20161025;
++        h=mime-version:from:date:message-id:subject:to;
++        bh=9dF7PHDassYY74+N6dAhmsL/B9i5oG3SEuMzHuazhJo=;
++        b=cBGJ44v+o4ASyCPmHCBRMmRYnJCv4Gx6lzDiScKn0XqYmNHYpZTPg5cAY1GZFUhHdz
++         9QT5fzhJKFikBliSuJc/7/pI8KzvyEAdvawiWA7/5fbeiTZ+zjJnzRVGezqkYDKxjR6u
++         7TsoJxR2/oFwo7bOFlThhee+Nwf7qaX8AVal7JdkqovekX79JQ5vsKAa4LapDp7Cl0wr
++         KCh0WRUHGEgpTLJFyQ3ThPmLqc8bhmu+6/V/LJ53VOY7uksZHMhvaKkk9vDCoOuPnBMK
++         Cj2/c7z9RTErz/xlHg6HxnBe/pPc31XUsuPJUleOEdZASczPsreEEKacKCONVlP1wjAB
++         iOkA==
++X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
++        d=1e100.net; s=20161025;
++        h=x-gm-message-state:mime-version:from:date:message-id:subject:to;
++        bh=9dF7PHDassYY74+N6dAhmsL/B9i5oG3SEuMzHuazhJo=;
++        b=LJAe4ZwS9aNJypROW7j+I9aNfRBWyDYy0c8ABnDbLrIoF9P2AA/Vs/Cli5f7GjaAxr
++         1JCx602ach+7R7QjQq/nqNmLuhRCfSvB0TGrq4R4v+CJ4ADO541+PddnFiU1dlIXQRP2
++         TE2FOydSO0FGJBMg+kY0eFiidBtYj1T5x7IHAhQzufiuiF6/1xZS8h61CYJjLzt/aR5y
++         JxOxsVvu3W2YQ0T5wKmAPlKtarFH6ZZgs446bRYt1MX5KAWzIoBM1+IPMMv7lSCpCaDR
++         fwH05aDyaJW2IzXH5R9Tq7gGYycYjx/SnO7JupJXJVvOzKgBJxp60JwJhCfqCwESDuuD
++         8nNA==
++X-Gm-Message-State: AODbwcDOpdFZgbxAxFsVsqFdCBN3pRGDvEclZ1heVg2byNZ9BuG5kqJg
++	GvZ9x4NGt0v8lVGa3esDw0N1KiJENg==
++X-Received: by 10.157.17.217 with SMTP id y25mr1310632oty.137.1495104134863;
++ Thu, 18 May 2017 03:42:14 -0700 (PDT)
++MIME-Version: 1.0
++Received: by 10.157.0.105 with HTTP; Thu, 18 May 2017 03:42:14 -0700 (PDT)
++From: Tom Psyborg <pozega.tomislav@gmail.com>
++Date: Thu, 18 May 2017 12:42:14 +0200
++Message-ID: <CAKR_QVJBSKw2uCY4RbHZPvbGkMcvnBh+j6F+9t93mG3BakjX3Q@mail.gmail.com>
++Subject: [PATCH] rt2x00: remove unneccesary code
++To: linux-wireless <linux-wireless@vger.kernel.org>, 
++	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, Arnd Bergmann <arnd@arndb.de>, 
++	Jes Sorensen <jes.sorensen@gmail.com>, Stanislaw Gruszka <sgruszka@redhat.com>, 
++	David Miller <davem@davemloft.net>, Helmut Schaa <helmut.schaa@googlemail.com>, 
++	Kalle Valo <kvalo@codeaurora.org>, Daniel Golle <daniel@makrotopia.org>, 
++	Mathias Kresin <dev@kresin.me>, Johannes Berg <johannes.berg@intel.com>, 
++	Serge Vasilugin <vasilugin@yandex.ru>, Roman Yeryomin <roman@advem.lv>, 
++	Networking <netdev@vger.kernel.org>
++Content-Type: multipart/alternative; boundary="94eb2c1905d2dc6361054fca0e62"
++Status: RO
++Content-Length: 11079
++Lines: 178
++
++--94eb2c1905d2dc6361054fca0e62
++Content-Type: text/plain; charset="UTF-8"
++Content-Transfer-Encoding: quoted-printable
++
++Use chanreg and dccal helpers to reduce the size of ePA code.
++
++Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++[daniel@makrotopia.org: fixed white-space so patch applies]
++---
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -4127,38 +4127,22 @@ static void rt2800_config_channel(struct
++ 			reg |= 0x00000101;
++ 			rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
++ 
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 43, 0x73);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 43, 0x73);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 44, 0x73);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 44, 0x73);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 45, 0x73);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0x73);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 46, 0x27);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 46, 0x27);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0xC8);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0xC8);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 48, 0xA4);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 48, 0xA4);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 49, 0x05);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 49, 0x05);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x27);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 55, 0xC8);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 55, 0xC8);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 56, 0xA4);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 56, 0xA4);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 57, 0x05);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 57, 0x05);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 58, 0x27);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 58, 0x27);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 59, 0xC8);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 59, 0xC8);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 60, 0xA4);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 60, 0xA4);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 4, 61, 0x05);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 6, 61, 0x05);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 5, 05, 0x00);
++-			rt2800_rfcsr_write_bank(rt2x00dev, 7, 05, 0x00);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05);
+++			rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00);
++ 
++ 			rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT,
++ 					      0x36303636);
+diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch
+index d09057f89686a54db350dbeda2fe49a84134a941..91831188ac4a02532d4dd34c694b70efd9c29b42 100644
+--- a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch
++++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch
+@@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+ 
+ --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+ +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+-@@ -1196,6 +1196,7 @@ int __init brcmf_core_init(void)
++@@ -1180,6 +1180,7 @@ int __init brcmf_core_init(void)
+  {
+  	if (!schedule_work(&brcmf_driver_work))
+  		return -EBUSY;
+diff --git a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch
+index 0c34d96847a0110779e59f4572bcfd8a1723417d..b966516e577217d60f732f56d2f3a6cabbd90864 100644
+--- a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch
++++ b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch
+@@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
+ 
+ --- a/drivers/net/wireless/ath/ath10k/core.c
+ +++ b/drivers/net/wireless/ath/ath10k/core.c
+-@@ -2319,6 +2319,16 @@ int ath10k_core_register(struct ath10k *
++@@ -2329,6 +2329,16 @@ int ath10k_core_register(struct ath10k *
+  	ar->chip_id = chip_id;
+  	queue_work(ar->workqueue, &ar->register_work);
+  
+diff --git a/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..d302a7d2a3ad7b32db3d83c0438cb606f9d85c99
+--- /dev/null
++++ b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch
+@@ -0,0 +1,11 @@
++--- a/drivers/net/wireless/ath/ath10k/core.c
+++++ b/drivers/net/wireless/ath/ath10k/core.c
++@@ -691,7 +691,7 @@ static int ath10k_core_get_board_id_from
++ 	if (ret) {
++ 		ath10k_err(ar, "could not execute otp for board id check: %d\n",
++ 			   ret);
++-		return ret;
+++		return -EOPNOTSUPP;
++ 	}
++ 
++ 	board_id = MS(result, ATH10K_BMI_BOARD_ID_FROM_OTP);
+diff --git a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch
+deleted file mode 100644
+index 057995c55acf9015c64291013738e95b18df75a2..0000000000000000000000000000000000000000
+--- a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch
++++ /dev/null
+@@ -1,51 +0,0 @@
+---- a/drivers/net/wireless/ath/ath10k/core.c
+-+++ b/drivers/net/wireless/ath/ath10k/core.c
+-@@ -1362,9 +1362,6 @@ static int ath10k_core_fetch_firmware_fi
+- {
+- 	int ret;
+- 
+--	/* calibration file is optional, don't check for any errors */
+--	ath10k_fetch_cal_file(ar);
+--
+- 	ar->fw_api = 5;
+- 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
+- 
+-@@ -2149,7 +2146,7 @@ EXPORT_SYMBOL(ath10k_core_stop);
+- static int ath10k_core_probe_fw(struct ath10k *ar)
+- {
+- 	struct bmi_target_info target_info;
+--	int ret = 0;
+-+	int calret, ret = 0;
+- 
+- 	ret = ath10k_hif_power_up(ar);
+- 	if (ret) {
+-@@ -2173,6 +2170,9 @@ static int ath10k_core_probe_fw(struct a
+- 		goto err_power_down;
+- 	}
+- 
+-+	/* calibration file is optional, don't check for any errors */
+-+	calret = ath10k_fetch_cal_file(ar);
+-+
+- 	ret = ath10k_core_fetch_firmware_files(ar);
+- 	if (ret) {
+- 		ath10k_err(ar, "could not fetch firmware files (%d)\n", ret);
+-@@ -2195,11 +2195,14 @@ static int ath10k_core_probe_fw(struct a
+- 			   "could not load pre cal data: %d\n", ret);
+- 	}
+- 
+--	ret = ath10k_core_get_board_id_from_otp(ar);
+--	if (ret && ret != -EOPNOTSUPP) {
+--		ath10k_err(ar, "failed to get board id from otp: %d\n",
+--			   ret);
+--		goto err_free_firmware_files;
+-+	/* otp and board file not needed if calibration data is present */
+-+	if (calret) {
+-+		ret = ath10k_core_get_board_id_from_otp(ar);
+-+		if (ret && ret != -EOPNOTSUPP) {
+-+			ath10k_err(ar, "failed to get board id from otp: %d\n",
+-+				ret);
+-+			goto err_free_firmware_files;
+-+		}
+- 	}
+- 
+- 	ret = ath10k_core_check_smbios(ar);
+diff --git a/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..d49be4df703e8039509ecea23de8b5bd8e590765
+--- /dev/null
++++ b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch
+@@ -0,0 +1,11 @@
++--- a/drivers/net/wireless/ath/ath10k/htt.h
+++++ b/drivers/net/wireless/ath/ath10k/htt.h
++@@ -199,7 +199,7 @@ enum htt_rx_ring_flags {
++ };
++ 
++ #define HTT_RX_RING_SIZE_MIN 128
++-#define HTT_RX_RING_SIZE_MAX 2048
+++#define HTT_RX_RING_SIZE_MAX 512
++ 
++ struct htt_rx_ring_setup_ring {
++ 	__le32 fw_idx_shadow_reg_paddr;
+diff --git a/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..a101282d074aeba592b042dcc9944c2a260e40ba
+--- /dev/null
++++ b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch
+@@ -0,0 +1,38 @@
++--- a/drivers/net/wireless/ath/ath10k/pci.c
+++++ b/drivers/net/wireless/ath/ath10k/pci.c
++@@ -128,7 +128,7 @@ static struct ce_attr host_ce_config_wla
++ 		.flags = CE_ATTR_FLAGS,
++ 		.src_nentries = 0,
++ 		.src_sz_max = 2048,
++-		.dest_nentries = 512,
+++		.dest_nentries = 128,
++ 		.recv_cb = ath10k_pci_htt_htc_rx_cb,
++ 	},
++ 
++@@ -137,7 +137,7 @@ static struct ce_attr host_ce_config_wla
++ 		.flags = CE_ATTR_FLAGS,
++ 		.src_nentries = 0,
++ 		.src_sz_max = 2048,
++-		.dest_nentries = 128,
+++		.dest_nentries = 64,
++ 		.recv_cb = ath10k_pci_htc_rx_cb,
++ 	},
++ 
++@@ -164,7 +164,7 @@ static struct ce_attr host_ce_config_wla
++ 		.flags = CE_ATTR_FLAGS,
++ 		.src_nentries = 0,
++ 		.src_sz_max = 512,
++-		.dest_nentries = 512,
+++		.dest_nentries = 128,
++ 		.recv_cb = ath10k_pci_htt_rx_cb,
++ 	},
++ 
++@@ -189,7 +189,7 @@ static struct ce_attr host_ce_config_wla
++ 		.flags = CE_ATTR_FLAGS,
++ 		.src_nentries = 0,
++ 		.src_sz_max = 2048,
++-		.dest_nentries = 128,
+++		.dest_nentries = 96,
++ 		.recv_cb = ath10k_pci_pktlog_rx_cb,
++ 	},
++ 
+diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile
+index 8a6e414e10c35557b2fc6b89f80bec6c2297ee59..8fa3267180c897aaad07466111a1273d72dbceae 100644
+--- a/package/kernel/mt76/Makefile
++++ b/package/kernel/mt76/Makefile
+@@ -1,16 +1,16 @@
+ include $(TOPDIR)/rules.mk
+ 
+ PKG_NAME:=mt76
+-PKG_RELEASE=2
++PKG_RELEASE=1
+ 
+ PKG_LICENSE:=GPLv2
+ PKG_LICENSE_FILES:=
+ 
+ PKG_SOURCE_URL:=https://github.com/openwrt/mt76
+ PKG_SOURCE_PROTO:=git
+-PKG_SOURCE_DATE:=2017-01-31
+-PKG_SOURCE_VERSION:=3c8caafc5e150db79f714b958a51cee8f242f309
+-PKG_MIRROR_HASH:=c03c166466cb7ea825e52cd085511045e3847d927ba2bde2b8fb46595a3ed13a
++PKG_SOURCE_DATE:=2017-07-17
++PKG_SOURCE_VERSION:=3c4c9a647e4feff3a42ee94d477041fdcf26c463
++PKG_MIRROR_HASH:=7ed7ef6356fafc2525cb6204ca2a3d584c1b83340ef5a1f7c581052f3a1982b1
+ 
+ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+ PKG_BUILD_PARALLEL:=1
+diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
+index 558445ff63a0f7f7bfff35286c39f89e243156de..f1f2ad419c752fc4a6a07c6b7fe366bf0ae8e38f 100644
+--- a/target/linux/generic/files/include/linux/ath9k_platform.h
++++ b/target/linux/generic/files/include/linux/ath9k_platform.h
+@@ -49,7 +49,6 @@ struct ath9k_platform_data {
+ 
+ 	int num_leds;
+ 	const struct gpio_led *leds;
+-	const char *led_name;
+ 
+ 	unsigned num_btns;
+ 	const struct gpio_keys_button *btns;

+ 106 - 0
patches/lede/0045-Revert-ath9k-drop-obsolete-patch.patch

@@ -0,0 +1,106 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Tue, 15 Aug 2017 04:08:08 +0200
+Subject: Revert "ath9k: drop obsolete patch"
+
+This reverts commit 4a4c00e7c4bd3c752fdfecb2c10dc16277e63856.
+
+diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch
+new file mode 100644
+index 0000000000000000000000000000000000000000..ddb3fe60e8535b2d547f9b05ecb956d6a5b2b904
+--- /dev/null
++++ b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch
+@@ -0,0 +1,39 @@
++From: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++Date: Sun, 31 Jan 2016 20:45:57 +0100
++Subject: [PATCH v4 1/8] mac80211: ath9k: enable platform WLAN LED name
++
++Enable platform-supplied WLAN LED name for ath9k device. It replaces generic
++'ath9k-phy*' label with string set during platform initialization.
++
++Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
++---
++ drivers/net/wireless/ath/ath9k/gpio.c | 7 +++++--
++ include/linux/ath9k_platform.h        | 1 +
++ 2 files changed, 6 insertions(+), 2 deletions(-)
++
++--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++++ b/drivers/net/wireless/ath/ath9k/gpio.c
++@@ -166,8 +166,11 @@ void ath_init_leds(struct ath_softc *sc)
++ 	if (sc->sc_ah->led_pin < 0)
++ 		return;
++ 
++-	snprintf(led_name, sizeof(led_name), "ath9k-%s",
++-		 wiphy_name(sc->hw->wiphy));
+++	if (pdata && pdata->led_name)
+++		strncpy(led_name, pdata->led_name, sizeof(led_name));
+++	else
+++		snprintf(led_name, sizeof(led_name), "ath9k-%s",
+++			 wiphy_name(sc->hw->wiphy));
++ 
++ 	if (ath9k_led_blink)
++ 		trigger = sc->led_default_trigger;
++--- a/include/linux/ath9k_platform.h
+++++ b/include/linux/ath9k_platform.h
++@@ -49,6 +49,7 @@ struct ath9k_platform_data {
++ 
++ 	int num_leds;
++ 	const struct gpio_led *leds;
+++	const char *led_name;
++ };
++ 
++ #endif /* _LINUX_ATH9K_PLATFORM_H */
+diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
+index 31dac29ad77b89626d300d9a82ba3bd2cc2210a1..86917eb6eeb18c9fb56d1cb7ec565ad1aef5c277 100644
+--- a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
++++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch
+@@ -237,7 +237,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+  	ath_fill_led_pin(sc);
+  
+  	if (pdata && pdata->leds && pdata->num_leds)
+-@@ -180,6 +324,7 @@ void ath_init_leds(struct ath_softc *sc)
++@@ -183,6 +327,7 @@ void ath_init_leds(struct ath_softc *sc)
+  	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger,
+  			   !sc->sc_ah->config.led_active_high);
+  }
+diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
+index f3fead0a1aef41e05957fda39128b13eaebb9652..4e165dde99938d3436b6497b8c2b08491c74f601 100644
+--- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
++++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch
+@@ -127,10 +127,10 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+  		for (i = 0; i < pdata->num_leds; i++) {
+ --- a/include/linux/ath9k_platform.h
+ +++ b/include/linux/ath9k_platform.h
+-@@ -49,6 +49,10 @@ struct ath9k_platform_data {
+- 
++@@ -50,6 +50,10 @@ struct ath9k_platform_data {
+  	int num_leds;
+  	const struct gpio_led *leds;
++ 	const char *led_name;
+ +
+ +	unsigned num_btns;
+ +	const struct gpio_keys_button *btns;
+diff --git a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch
+index bcb0026a69afdc52b3bf5ba074418435b343d1be..45284c71eed616bcaa5c875e85c209fbefc738a5 100644
+--- a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch
++++ b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch
+@@ -375,7 +375,7 @@
+  
+ --- a/include/linux/ath9k_platform.h
+ +++ b/include/linux/ath9k_platform.h
+-@@ -53,6 +53,8 @@ struct ath9k_platform_data {
++@@ -54,6 +54,8 @@ struct ath9k_platform_data {
+  	unsigned num_btns;
+  	const struct gpio_keys_button *btns;
+  	unsigned btn_poll_interval;
+diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
+index f1f2ad419c752fc4a6a07c6b7fe366bf0ae8e38f..558445ff63a0f7f7bfff35286c39f89e243156de 100644
+--- a/target/linux/generic/files/include/linux/ath9k_platform.h
++++ b/target/linux/generic/files/include/linux/ath9k_platform.h
+@@ -49,6 +49,7 @@ struct ath9k_platform_data {
+ 
+ 	int num_leds;
+ 	const struct gpio_led *leds;
++	const char *led_name;
+ 
+ 	unsigned num_btns;
+ 	const struct gpio_keys_button *btns;