diff --git a/config/Config-build.in b/config/Config-build.in
index 69fb7089721af63780ef876a0970baef15c2e8a2..4674d8403539a3b209d709342ab71a6e6ff79de2 100644
--- a/config/Config-build.in
+++ b/config/Config-build.in
@@ -152,7 +152,7 @@ menu "Global build settings"
 			bool "none"
 			help
 			  This will install unstripped binaries (useful for native
-		 	  compiling/debugging).
+			  compiling/debugging).
 
 		config USE_STRIP
 			bool "strip"
@@ -162,7 +162,6 @@ menu "Global build settings"
 
 		config USE_SSTRIP
 			bool "sstrip"
-			depends on !DEBUG
 			depends on !USE_GLIBC
 			help
 			  This will install binaries stripped using sstrip.
diff --git a/include/download.mk b/include/download.mk
index 7a0fb958dfe758987ab6d5fca5ecddf7b6c8d67f..35dbee1c6cb29a0beeac3f81f5233d6a954ca5b5 100644
--- a/include/download.mk
+++ b/include/download.mk
@@ -44,11 +44,11 @@ define DownloadMethod/unknown
 endef
 
 define DownloadMethod/default
-	$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MD5SUM)" $(foreach url,$(URL),"$(url)")
+	$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MD5SUM)" "$(URL_FILE)" $(foreach url,$(URL),"$(url)")
 endef
 
 define wrap_mirror
-	$(if $(if $(MIRROR),$(filter-out x,$(MIRROR_MD5SUM))),@$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MIRROR_MD5SUM)" || ( $(1) ),$(1))
+	$(if $(if $(MIRROR),$(filter-out x,$(MIRROR_MD5SUM))),@$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MIRROR_MD5SUM)" "" || ( $(1) ),$(1))
 endef
 
 define DownloadMethod/cvs
@@ -156,6 +156,7 @@ Validate/darcs=VERSION SUBDIR
 define Download/Defaults
   URL:=
   FILE:=
+  URL_FILE:=
   PROTO:=
   MD5SUM:=
   SUBDIR:=
diff --git a/include/kernel-version.mk b/include/kernel-version.mk
index 606077613e327662307a4ee34418f4c7a37edd3e..f2744249d951fa1ee048d5208a56b30dd51dba73 100644
--- a/include/kernel-version.mk
+++ b/include/kernel-version.mk
@@ -2,9 +2,9 @@
 
 LINUX_RELEASE?=1
 
-LINUX_VERSION-3.18 = .23
+LINUX_VERSION-3.18 = .29
 
-LINUX_KERNEL_MD5SUM-3.18.23 = dc6d265ab38716be3676ac294b481ad8
+LINUX_KERNEL_MD5SUM-3.18.29 = b25737a0bc98e80d12200de93f239c28
 
 ifdef KERNEL_PATCHVER
   LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))
diff --git a/include/version.mk b/include/version.mk
index 9348a241be3a3078a88bae347db611fc61c5c1ad..ddce935f3b39b69a631be2051178ec879686d714 100644
--- a/include/version.mk
+++ b/include/version.mk
@@ -21,7 +21,7 @@ qstrip_escape=$(subst ','\'',$(call qstrip,$(1)))
 #'
 
 VERSION_NUMBER:=$(call qstrip_escape,$(CONFIG_VERSION_NUMBER))
-VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),15.05)
+VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),15.05.1)
 
 VERSION_CODE:=$(call qstrip_escape,$(CONFIG_VERSION_NUMBER))
 VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),Chaos Calmer)
diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 0bba313702f0f9a3b42122b4b6beed929296d355..9f6810f4d8bad89eb11db1023693ad59f7369d57 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2007-2014 OpenWrt.org
+# Copyright (C) 2007-2016 OpenWrt.org
 # Copyright (C) 2010 Vertical Communications
 #
 # This is free software, licensed under the GNU General Public License v2.
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/version.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=157
+PKG_RELEASE:=157.2
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host usign/host
@@ -67,7 +67,7 @@ define ImageConfigOptions
 	mkdir -p $(1)/lib/preinit
 	echo 'pi_suppress_stderr="$(CONFIG_TARGET_PREINIT_SUPPRESS_STDERR)"' >$(1)/lib/preinit/00_preinit.conf
 	echo 'fs_failsafe_wait_timeout=$(if $(CONFIG_TARGET_PREINIT_TIMEOUT),$(CONFIG_TARGET_PREINIT_TIMEOUT),2)' >>$(1)/lib/preinit/00_preinit.conf
-	echo 'pi_init_path=$(if $(CONFIG_TARGET_INIT_PATH),$(CONFIG_TARGET_INIT_PATH),"/bin:/sbin:/usr/bin:/usr/sbin")' >>$(1)/lib/preinit/00_preinit.conf
+	echo 'pi_init_path=$(if $(CONFIG_TARGET_INIT_PATH),$(CONFIG_TARGET_INIT_PATH),"/usr/sbin:/usr/bin:/sbin:/bin")' >>$(1)/lib/preinit/00_preinit.conf
 	echo 'pi_init_env=$(if $(CONFIG_TARGET_INIT_ENV),$(CONFIG_TARGET_INIT_ENV),"")' >>$(1)/lib/preinit/00_preinit.conf
 	echo 'pi_init_cmd=$(if $(CONFIG_TARGET_INIT_CMD),$(CONFIG_TARGET_INIT_CMD),"/sbin/init")' >>$(1)/lib/preinit/00_preinit.conf
 	echo 'pi_init_suppress_stderr="$(CONFIG_TARGET_INIT_SUPPRESS_STDERR)"' >>$(1)/lib/preinit/00_preinit.conf
diff --git a/package/base-files/files/etc/preinit b/package/base-files/files/etc/preinit
index 9cc8a9a8f63dd824f9c75b711d779aa8b2452259..31f861edf9f8552c7648d87e2627f3f6c9df784c 100755
--- a/package/base-files/files/etc/preinit
+++ b/package/base-files/files/etc/preinit
@@ -4,7 +4,7 @@
 
 [ -z "$PREINIT" ] && exec /sbin/init
 
-export PATH=/bin:/sbin:/usr/bin:/usr/sbin
+export PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
 pi_ifname=
 pi_ip=192.168.1.1
@@ -20,7 +20,7 @@ fs_failsafe_wait_timeout=2
 
 pi_suppress_stderr="y"
 pi_init_suppress_stderr="y"
-pi_init_path="/bin:/sbin:/usr/bin:/usr/sbin"
+pi_init_path="/usr/sbin:/usr/bin:/sbin:/bin"
 pi_init_cmd="/sbin/init"
 
 . /lib/functions.sh
diff --git a/package/base-files/files/etc/profile b/package/base-files/files/etc/profile
index 3dd58e14f28f22e3119733e9069861587baaaee1..bd008a84d70fad6cf50fa74be5b0906e92161889 100644
--- a/package/base-files/files/etc/profile
+++ b/package/base-files/files/etc/profile
@@ -2,7 +2,7 @@
 [ -f /etc/banner ] && cat /etc/banner
 [ -e /tmp/.failsafe ] && cat /etc/banner.failsafe
 
-export PATH=/usr/bin:/usr/sbin:/bin:/sbin
+export PATH=/usr/sbin:/usr/bin:/sbin:/bin
 export HOME=$(grep -e "^${USER:-root}:" /etc/passwd | cut -d ":" -f 6)
 export HOME=${HOME:-/root}
 export PS1='\u@\h:\w\$ '
@@ -14,3 +14,10 @@ export PS1='\u@\h:\w\$ '
 
 [ -x /usr/bin/arp ] || arp() { cat /proc/net/arp; }
 [ -x /usr/bin/ldd ] || ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; }
+
+[ -n "$FAILSAFE" ] || {
+	for FILE in /etc/profile.d/*.sh; do
+		[ -e "$FILE" ] && . "$FILE"
+	done
+	unset FILE
+}
diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh
index 8d045fa642554e1bf11c633c86c7ce96414695da..2f78d67025d0f52968fb47d6ee60a8b1163b5e6a 100755
--- a/package/base-files/files/lib/functions.sh
+++ b/package/base-files/files/lib/functions.sh
@@ -174,7 +174,8 @@ default_prerm() {
 }
 
 default_postinst() {
-	local pkgname rusers
+	local pkgname rusers ret
+	ret=0
 	pkgname=$(basename ${1%.*})
 	rusers=$(grep "Require-User:" ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.control)
 	[ -n "$rusers" ] && {
@@ -215,7 +216,10 @@ default_postinst() {
 		done
 	}
 
-	[ -f ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.postinst-pkg ] && ( . ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.postinst-pkg )
+	if [ -f ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.postinst-pkg ]; then
+		( . ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.postinst-pkg )
+		ret=$?
+	fi
 	[ -n "${IPKG_INSTROOT}" ] || rm -f /tmp/luci-indexcache 2>/dev/null
 
 	[ "$PKG_UPGRADE" = "1" ] || for i in `cat ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.list | grep "^/etc/init.d/"`; do
@@ -225,7 +229,7 @@ default_postinst() {
 			$i start
 		}
 	done
-	return 0
+	return $ret
 }
 
 include() {
diff --git a/package/base-files/files/sbin/hotplug-call b/package/base-files/files/sbin/hotplug-call
index 260be0b7a4e9e834eda140142361e726d9eb4a30..743871a3ff4b729d7e0f7903d33604dc9850fb40 100755
--- a/package/base-files/files/sbin/hotplug-call
+++ b/package/base-files/files/sbin/hotplug-call
@@ -5,7 +5,7 @@ export HOTPLUG_TYPE="$1"
 
 . /lib/functions.sh
 
-PATH=/bin:/sbin:/usr/bin:/usr/sbin
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
 LOGNAME=root
 USER=root
 export PATH LOGNAME USER
diff --git a/package/base-files/image-config.in b/package/base-files/image-config.in
index fd0ead623650a6de1b07a18fab77209f98b56e54..0dfd6f6caaba78cf03ad70db8c123c8a83bb9825 100644
--- a/package/base-files/image-config.in
+++ b/package/base-files/image-config.in
@@ -99,7 +99,7 @@ menuconfig INITOPT
 	config TARGET_INIT_PATH
 		string
 		prompt "PATH for regular boot" if INITOPT
-		default "/bin:/sbin:/usr/bin:/usr/sbin"
+		default "/usr/sbin:/usr/bin:/sbin:/bin"
 		help
 			Default PATH used during normal operation
 
@@ -170,7 +170,7 @@ if VERSIONOPT
 	config VERSION_REPO
 		string
 		prompt "Release repository"
-		default "http://downloads.openwrt.org/snapshots/trunk/%S/packages"
+		default "http://downloads.openwrt.org/%n/%v/%S/packages"
 		help
 			This is the repository address embedded in the image, it defaults
 			to the trunk snapshot repo; the url may contain the following placeholders:
diff --git a/package/boot/uboot-envtools/files/ar71xx b/package/boot/uboot-envtools/files/ar71xx
index 8fb559e766846fa2ae118dd135f0da8bc07bc369..ec8541c3182c1e08992c0748f4feeb83c8977029 100644
--- a/package/boot/uboot-envtools/files/ar71xx
+++ b/package/boot/uboot-envtools/files/ar71xx
@@ -14,6 +14,7 @@ touch /etc/config/ubootenv
 board=$(ar71xx_board_name)
 
 case "$board" in
+alfa-ap120c | \
 all0258n | \
 cap4200ag | \
 carambola2 | \
diff --git a/package/boot/uboot-sunxi/Makefile b/package/boot/uboot-sunxi/Makefile
index 14ba922a170dd4c898e65ad1a806531c52298546..9032600162be45975a61cbaa97e4936fd36e9940 100644
--- a/package/boot/uboot-sunxi/Makefile
+++ b/package/boot/uboot-sunxi/Makefile
@@ -6,6 +6,7 @@
 #
 
 include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=u-boot
 PKG_VERSION:=2015.01
@@ -16,7 +17,7 @@ PKG_SOURCE_URL:= \
 
 PKG_MD5SUM:=7f08dc9e98a71652bd6968888ed6ec95
 
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
 
 PKG_LICENSE:=GPL-2.0 GPL-2.0+
 PKG_LICENSE_FILES:=Licenses/README
@@ -136,16 +137,16 @@ define Build/Compile
 endef
 
 define Package/uboot/install/default
-	$(INSTALL_DIR) $(BIN_DIR)/uboot-$(BOARD)-$(1)
 	$(CP) $(PKG_BUILD_DIR)/u-boot.bin \
-		$(BIN_DIR)/uboot-$(BOARD)-$(1)/openwrt-$(BOARD)-$(1)-u-boot.bin
+		$(KERNEL_BUILD_DIR)/uboot-$(BOARD)-$(1)-u-boot.bin
 	$(CP) $(PKG_BUILD_DIR)/spl/sunxi-spl.bin \
-		$(BIN_DIR)/uboot-$(BOARD)-$(1)/openwrt-$(BOARD)-$(1)-spl.bin
+		$(KERNEL_BUILD_DIR)/uboot-$(BOARD)-$(1)-spl.bin
 	$(CP) $(PKG_BUILD_DIR)/u-boot-sunxi-with-spl.bin \
-		$(BIN_DIR)/uboot-$(BOARD)-$(1)/openwrt-$(BOARD)-$(1)-u-boot-with-spl.bin
+		$(KERNEL_BUILD_DIR)/uboot-$(BOARD)-$(1)-u-boot-with-spl.bin
 	$(CP) uEnv.txt \
-		$(BIN_DIR)/uboot-$(BOARD)-$(1)/openwrt-$(BOARD)-$(1)-uEnv.txt
-	mkimage -C none -A arm -T script -d $(BIN_DIR)/uboot-$(BOARD)-$(1)/openwrt-$(BOARD)-$(1)-uEnv.txt $(BIN_DIR)/uboot-$(BOARD)-$(1)/openwrt-$(BOARD)-$(1)-boot.scr
+		$(KERNEL_BUILD_DIR)/uboot-$(BOARD)-$(1)-uEnv.txt
+	mkimage -C none -A arm -T script -d $(KERNEL_BUILD_DIR)/uboot-$(BOARD)-$(1)-uEnv.txt \
+		$(KERNEL_BUILD_DIR)/uboot-$(BOARD)-$(1)-boot.scr
 endef
 
 define Package/uboot/install/template
diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..b03d64491a554fafb72170eaa4fae171b5599835
--- /dev/null
+++ b/package/firmware/ath10k-firmware/Makefile
@@ -0,0 +1,102 @@
+#
+# Copyright (C) 2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=ath10k-firmware
+PKG_SOURCE_VERSION:=77f72b5f7dd940386d9e619a17904987759b7186
+PKG_VERSION:=2014-11-13-$(PKG_SOURCE_VERSION)
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_URL:=https://github.com/kvalo/ath10k-firmware.git
+
+PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
+
+include $(INCLUDE_DIR)/package.mk
+
+WMENU:=Wireless Drivers
+
+define Package/ath10k-firmware-default
+  SECTION:=kernel
+  CATEGORY:=Kernel modules
+  SUBMENU:=$(WMENU)
+  URL:=$(PKG_SOURCE_URL)
+endef
+
+define Package/ath10k-firmware-qca988x
+$(Package/ath10k-firmware-default)
+  TITLE:=ath10k firmware for QCA988x devices
+endef
+
+QCA988X_FIRMWARE_FILE:=firmware-5.bin_10.2.4.97-1
+
+define Download/ath10k-firmware-qca988x
+  URL:=https://www.codeaurora.org/cgit/quic/qsdk/oss/firmware/ath10k-firmware/plain/10.2.4/
+  FILE:=$(QCA988X_FIRMWARE_FILE)
+  MD5SUM:=fcb2fbd42d73a63fbf603505c718cbde
+endef
+$(eval $(call Download,ath10k-firmware-qca988x))
+
+define Package/ath10k-firmware-qca99x0
+$(Package/ath10k-firmware-default)
+  TITLE:=ath10k firmware for QCA99x0 devices
+endef
+
+define Package/ath10k-firmware-qca6174
+$(Package/ath10k-firmware-default)
+  TITLE:=ath10k firmware for QCA6174 devices
+endef
+
+QCA99X0_BOARD_REV:=ddcec9efd245da9365c474f513a855a55f3ac7fe
+QCA99X0_BOARD_FILE:=board-2.bin.$(QCA99X0_BOARD_REV)
+
+define Download/qca99x0-board
+  URL:=https://www.codeaurora.org/cgit/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA99X0/hw2.0
+  URL_FILE:=board-2.bin?id=ddcec9efd245da9365c474f513a855a55f3ac7fe
+  FILE:=$(QCA99X0_BOARD_FILE)
+  MD5SUM:=a2b3c653c2363a5641200051d6333d0a
+endef
+$(eval $(call Download,qca99x0-board))
+
+define Build/Compile
+
+endef
+
+define Package/ath10k-firmware-qca988x/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/QCA988X/board.bin \
+		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/
+	$(INSTALL_DATA) \
+		$(DL_DIR)/$(QCA988X_FIRMWARE_FILE) \
+		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin
+endef
+
+define Package/ath10k-firmware-qca6174/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ath10k
+	$(CP) $(PKG_BUILD_DIR)/QCA6174 $(1)/lib/firmware/ath10k/
+endef
+
+define Package/ath10k-firmware-qca99x0/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA99X0/hw2.0
+	$(INSTALL_DATA) \
+		$(DL_DIR)/$(QCA99X0_BOARD_FILE) \
+		$(1)/lib/firmware/ath10k/QCA99X0/hw2.0/board-2.bin
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/QCA99X0/hw2.0/boardData_AR900B_CUS239_5G_v2_001.bin \
+		$(1)/lib/firmware/ath10k/QCA99X0/hw2.0/board.bin
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/QCA99X0/hw2.0/firmware-5.bin_10.4.1.00030-1 \
+		$(1)/lib/firmware/ath10k/QCA99X0/hw2.0/firmware-5.bin
+endef
+
+$(eval $(call BuildPackage,ath10k-firmware-qca988x))
+$(eval $(call BuildPackage,ath10k-firmware-qca99x0))
+$(eval $(call BuildPackage,ath10k-firmware-qca6174))
diff --git a/package/firmware/b43legacy-firmware/Makefile b/package/firmware/b43legacy-firmware/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ec13c7d23df5b58e90aae7dbba6088c7e3774f6d
--- /dev/null
+++ b/package/firmware/b43legacy-firmware/Makefile
@@ -0,0 +1,72 @@
+#
+# Copyright (C) 2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=b43legacy-firmware
+PKG_VERSION:=3.130.20.0
+PKG_RELEASE:=1
+
+PKG_SOURCE:=wl_apsta-$(PKG_VERSION).o
+PKG_SOURCE_URL:=http://downloads.openwrt.org/sources
+PKG_MD5SUM:=e08665c5c5b66beb9c3b2dd54aa80cb3
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/b43legacy-firmware
+  SECTION:=firmware
+  CATEGORY:=Firmware
+  URL:=$(PKG_SOURCE_URL)
+  TITLE:=Broadcom bcm43xx b43legacy firmware
+endef
+
+define Package/b43legacy-firmware/config
+  if PACKAGE_b43legacy-firmware
+
+	config B43LEGACY_FW_SQUASH
+		bool "Remove unnecessary firmware files"
+		default y
+		help
+		  This options allows you to remove unnecessary b43legacy firmware files
+		  from the final rootfs image. This can reduce the rootfs size by
+		  up to 50k.
+
+		  If unsure, say Y.
+
+	config B43LEGACY_FW_SQUASH_COREREVS
+		string "Core revisions to include"
+		depends on B43LEGACY_FW_SQUASH
+		default "1,2,3,4"
+		help
+		  This is a comma seperated list of core revision numbers.
+
+		  Example (keep files for rev4 only):
+		    4
+
+		  Example (keep files for rev2 and rev4):
+		    2,4
+
+  endif
+endef
+
+define Build/Prepare
+	mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Compile
+
+endef
+
+define Package/b43legacy-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	b43-fwcutter --unsupported -w $(1)/lib/firmware/ $(DL_DIR)/$(PKG_SOURCE)
+  ifneq ($(CONFIG_B43LEGACY_FW_SQUASH),)
+	b43-fwsquash.py "G" "$(CONFIG_B43LEGACY_FW_SQUASH_COREREVS)" "$(1)/lib/firmware/b43legacy"
+  endif
+endef
+
+$(eval $(call BuildPackage,b43legacy-firmware))
diff --git a/package/firmware/linux-firmware/Makefile b/package/firmware/linux-firmware/Makefile
index 015aff755457d34cc8f39e9255fef89af46e3fe5..2fcd93b2ef104647a61c3aa40e2cef4404b1e484 100644
--- a/package/firmware/linux-firmware/Makefile
+++ b/package/firmware/linux-firmware/Makefile
@@ -8,56 +8,33 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=linux-firmware
-PKG_SOURCE_VERSION:=f8c22c692bdee57a20b092e647464ff6176df3ed
-PKG_VERSION:=2014-03-16-$(PKG_SOURCE_VERSION)
+PKG_SOURCE_VERSION:=52442afee9907bc32a058f22bb3295d040677c26
+PKG_VERSION:=2016-01-25-$(PKG_SOURCE_VERSION)
 PKG_RELEASE:=1
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
 PKG_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
 PKG_MIRROR_MD5SUM:=ca4d289ad9380471cae376fc7dd3660a
 
 PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
 
-include $(INCLUDE_DIR)/package.mk
-
-define Package/r8169-firmware
-  SECTION:=firmware
-  CATEGORY:=Firmware
-  URL:=http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git
-  TITLE:=RealTek r8169 firmware
-endef
-
-define Build/Compile
+SCAN_DEPS = *.mk
 
-endef
-
-define Package/r8169-firmware/install
-	$(INSTALL_DIR) $(1)/lib/firmware/rtl_nic
-	$(CP) \
-		$(PKG_BUILD_DIR)/rtl_nic/* \
-		$(1)/lib/firmware/rtl_nic
-endef
-
-$(eval $(call BuildPackage,r8169-firmware))
+include $(INCLUDE_DIR)/package.mk
 
-define Package/r8188eu-firmware
+define Package/firmware-default
   SECTION:=firmware
   CATEGORY:=Firmware
   URL:=http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git
-  TITLE:=RealTek r8188eu firmware
+  TITLE:=$(1)
 endef
 
 define Build/Compile
 
 endef
 
-define Package/r8188eu-firmware/install
-	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
-	$(CP) \
-		$(PKG_BUILD_DIR)/rtlwifi/rtl8188eufw.bin \
-		$(1)/lib/firmware/rtlwifi
-endef
-
-$(eval $(call BuildPackage,r8188eu-firmware))
+include $(wildcard ./*.mk)
+#$(eval $(call BuildPackage,linux-firmware))
diff --git a/package/firmware/linux-firmware/broadcom.mk b/package/firmware/linux-firmware/broadcom.mk
new file mode 100644
index 0000000000000000000000000000000000000000..659dc825ef6256d60fd8f302835c663e856c8f68
--- /dev/null
+++ b/package/firmware/linux-firmware/broadcom.mk
@@ -0,0 +1,45 @@
+Package/brcmfmac-firmware-pcie = $(call Package/firmware-default,Broadcom BCM43xx fullmac PCIe firmware)
+define Package/brcmfmac-firmware-pcie/install
+	$(INSTALL_DIR) $(1)/lib/firmware/brcm
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/brcm/brcmfmac43602-pcie.ap.bin \
+		$(1)/lib/firmware/brcm/brcmfmac43602-pcie.bin
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/brcm/brcmfmac4366b-pcie.bin \
+		$(1)/lib/firmware/brcm/
+endef
+$(eval $(call BuildPackage,brcmfmac-firmware-pcie))
+
+Package/brcmfmac-firmware-sdio = $(call Package/firmware-default,Broadcom BCM43xx fullmac SDIO firmware)
+define Package/brcmfmac-firmware-sdio/install
+	$(INSTALL_DIR) $(1)/lib/firmware/brcm
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/brcm/brcmfmac4329-sdio.bin \
+		$(1)/lib/firmware/brcm/brcmfmac4329-sdio.bin
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/brcm/brcmfmac43362-sdio.bin \
+		$(1)/lib/firmware/brcm/brcmfmac43362-sdio.bin
+endef
+$(eval $(call BuildPackage,brcmfmac-firmware-sdio))
+
+Package/brcmfmac-firmware-usb = $(call Package/firmware-default,Broadcom BCM43xx fullmac USB firmware)
+define Package/brcmfmac-firmware-usb/install
+	$(INSTALL_DIR) $(1)/lib/firmware/brcm
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/brcm/brcmfmac43236b.bin \
+		$(1)/lib/firmware/brcm/
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/brcm/brcmfmac43143.bin \
+		$(1)/lib/firmware/brcm/
+endef
+$(eval $(call BuildPackage,brcmfmac-firmware-usb))
+
+Package/brcmsmac-firmware = $(call Package/firmware-default,Broadcom BCM43xx softmac PCIe firmware)
+define Package/brcmsmac-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/brcm
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx-0.fw \
+		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx_hdr-0.fw \
+		$(1)/lib/firmware/brcm/
+endef
+$(eval $(call BuildPackage,brcmsmac-firmware))
diff --git a/package/firmware/linux-firmware/intel.mk b/package/firmware/linux-firmware/intel.mk
new file mode 100644
index 0000000000000000000000000000000000000000..f5adfaf86c9dca6a02af2453326b7b6c275530d8
--- /dev/null
+++ b/package/firmware/linux-firmware/intel.mk
@@ -0,0 +1,192 @@
+Package/ibt-firmware = $(call Package/firmware-default,Intel bluetooth firmware)
+define Package/ibt-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/intel
+	$(CP) \
+		$(PKG_BUILD_DIR)/intel/*.bseq \
+		$(1)/lib/firmware/intel
+endef
+$(eval $(call BuildPackage,ibt-firmware))
+
+Package/iwl3945-firmware = $(call Package/firmware-default,Intel IWL3945 firmware)
+define Package/iwl3945-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3945-2.ucode $(1)/lib/firmware
+endef
+$(eval $(call BuildPackage,iwl3945-firmware))
+
+Package/iwl4965-firmware = $(call Package/firmware-default,Intel IWL4965 firmware)
+define Package/iwl4965-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-4965-2.ucode $(1)/lib/firmware
+endef
+$(eval $(call BuildPackage,iwl4965-firmware))
+
+Package/iwlwifi-firmware = $(call Package/firmware-default,Intel wireless firmware)
+define Package/iwlwifi-firmware/config
+  if PACKAGE_iwlwifi-firmware
+	config IWL100_FW
+		bool "Intel 100 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Wireless-N 100
+
+	config IWL1000_FW
+		bool "Intel 1000 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Wireless-N 1000
+
+	config IWL105_FW
+		bool "Intel 105 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Wireless-N 105
+
+	config IWL135_FW
+		bool "Intel 135 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Wireless-N 135
+
+	config IWL2000_FW
+		bool "Intel 2000 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Wireless-N 2200
+
+	config IWL2030_FW
+		bool "Intel 2030 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Wireless-N 2230
+
+	config IWL3160_FW
+		bool "Intel 3160 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Wireless WiFi 3160
+
+	config IWL5000_FW
+		bool "Intel 5000 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
+
+	config IWL5150_FW
+		bool "Intel 5150 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Wireless WiFi 5150AGN
+
+	config IWL6000_FW
+		bool "Intel 6000 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Ultimate-N 6300 and Advanced-N 6200
+
+	config IWL6005_FW
+		bool "Intel 6005 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Advanced-N 6205
+
+	config IWL6030_FW
+		bool "Intel 6030 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235
+
+	config IWL6050_FW
+		bool "Intel 6050 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Centrino Advanced-N + WiMAX 6250 and Wireless-N + WiMAX 6150
+
+	config IWL7260_FW
+		bool "Intel 7260 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Dual Band Wireless-N 7260 and Intel Dual Band Wireless-AC 7260
+
+	config IWL7265_FW
+		bool "Intel 7265 Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Wireless 7265, 7265D, 3165
+
+	config IWL8000_FW
+		bool "Intel 8000 Series Firmware"
+		default y
+		help
+		  Download and install firmware for:
+		    Intel Wireless Series 8260, 4165
+  endif
+endef
+define Package/iwlwifi-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+ifneq ($(CONFIG_IWL100_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-100-5.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL1000_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-1000-5.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL105_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-105-6.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL135_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-135-6.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL2000_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL2030_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL3160_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3160-16.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL5000_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL5150_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5150-2.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL6000_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000-4.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL6005_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL6030_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL6050_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6050-5.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL7260_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7260-16.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL7265_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265-16.ucode $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265D-16.ucode $(1)/lib/firmware
+endif
+ifneq ($(CONFIG_IWL8000_FW),)
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8000C-16.ucode $(1)/lib/firmware
+endif
+endef
+$(eval $(call BuildPackage,iwlwifi-firmware))
diff --git a/package/firmware/linux-firmware/marvell.mk b/package/firmware/linux-firmware/marvell.mk
new file mode 100644
index 0000000000000000000000000000000000000000..752a8e0b4e8923065450cc1bd0d9faf142eaa270
--- /dev/null
+++ b/package/firmware/linux-firmware/marvell.mk
@@ -0,0 +1,56 @@
+Package/mwl8k-firmware = $(call Package/firmware-default,Marvell 8366/8687 firmware)
+define Package/mwl8k-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/mwl8k
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/mwl8k/fmimage_8366_ap-3.fw \
+		$(PKG_BUILD_DIR)/mwl8k/fmimage_8366.fw \
+		$(PKG_BUILD_DIR)/mwl8k/helper_8366.fw \
+		$(PKG_BUILD_DIR)/mwl8k/fmimage_8687.fw \
+		$(PKG_BUILD_DIR)/mwl8k/helper_8687.fw \
+		$(1)/lib/firmware/mwl8k/
+endef
+$(eval $(call BuildPackage,mwl8k-firmware))
+
+Package/mwifiex-pcie-firmware = $(call Package/firmware-default,Marvell 8897 firmware)
+define Package/mwifiex-pcie-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/mrvl
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/mrvl/pcie8897_uapsta.bin \
+		$(1)/lib/firmware/mrvl/
+endef
+$(eval $(call BuildPackage,mwifiex-pcie-firmware))
+
+Package/libertas-usb-firmware = $(call Package/firmware-default,Marvell 8388/8682 USB firmware)
+define Package/libertas-usb-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/libertas
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/libertas/usb8388_v9.bin \
+		$(PKG_BUILD_DIR)/libertas/usb8682.bin \
+		$(1)/lib/firmware/libertas/
+endef
+$(eval $(call BuildPackage,libertas-usb-firmware))
+
+Package/libertas-sdio-firmware = $(call Package/firmware-default,Marvell 8385/8686/8688 SDIO firmware)
+define Package/libertas-sdio-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/libertas
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/libertas/sd8385_helper.bin \
+		$(PKG_BUILD_DIR)/libertas/sd8385.bin \
+		$(PKG_BUILD_DIR)/libertas/sd8686_v9_helper.bin \
+		$(PKG_BUILD_DIR)/libertas/sd8686_v9.bin \
+		$(PKG_BUILD_DIR)/libertas/sd8688_helper.bin \
+		$(PKG_BUILD_DIR)/libertas/sd8688.bin \
+		$(1)/lib/firmware/libertas
+endef
+$(eval $(call BuildPackage,libertas-sdio-firmware))
+
+Package/libertas-spi-firmware = $(call Package/firmware-default,Marvell 8686 SPI firmware)
+define Package/libertas-spi-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/libertas
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/libertas/gspi8686_v9_helper.bin \
+		$(PKG_BUILD_DIR)/libertas/gspi8686_v9.bin \
+		$(1)/lib/firmware/libertas
+endef
+$(eval $(call BuildPackage,libertas-spi-firmware))
+
diff --git a/package/firmware/linux-firmware/mediatek.mk b/package/firmware/linux-firmware/mediatek.mk
new file mode 100644
index 0000000000000000000000000000000000000000..b258551a005e9ca95e81f9b23a67bfb300991b53
--- /dev/null
+++ b/package/firmware/linux-firmware/mediatek.mk
@@ -0,0 +1,43 @@
+Package/mt7601u-firmware = $(call Package/firmware-default,MediaTek MT7601U firmware)
+define Package/mt7601u-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/mt7601u.bin \
+		$(1)/lib/firmware
+endef
+$(eval $(call BuildPackage,mt7601u-firmware))
+
+Package/rt2800-pci-firmware = $(call Package/firmware-default,Ralink RT28xx/3xxx PCI/SoC firmware)
+define Package/rt2800-pci-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/rt2860.bin \
+		$(PKG_BUILD_DIR)/rt3290.bin \
+		$(1)/lib/firmware
+endef
+$(eval $(call BuildPackage,rt2800-pci-firmware))
+
+Package/rt2800-usb-firmware = $(call Package/firmware-default,Ralink RT28xx/3xxx USB firmware)
+define Package/rt2800-usb-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rt2870.bin $(1)/lib/firmware/
+endef
+$(eval $(call BuildPackage,rt2800-usb-firmware))
+
+Package/rt61-pci-firmware = $(call Package/firmware-default,Ralink RT2561 firmware)
+define Package/rt61-pci-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/rt2561.bin \
+		$(PKG_BUILD_DIR)/rt2561s.bin \
+		$(PKG_BUILD_DIR)/rt2661.bin \
+		$(1)/lib/firmware/
+endef
+$(eval $(call BuildPackage,rt61-pci-firmware))
+
+Package/rt73-usb-firmware = $(call Package/firmware-default,Ralink RT2573 firmware)
+define Package/rt73-usb-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rt73.bin $(1)/lib/firmware/
+endef
+$(eval $(call BuildPackage,rt73-usb-firmware))
diff --git a/package/firmware/linux-firmware/qca.mk b/package/firmware/linux-firmware/qca.mk
new file mode 100644
index 0000000000000000000000000000000000000000..7ad27ef388ebde3ad40352b274ab0835b6ca3223
--- /dev/null
+++ b/package/firmware/linux-firmware/qca.mk
@@ -0,0 +1,25 @@
+Package/ar3k-firmware = $(call Package/firmware-default,ath3k firmware)
+define Package/ar3k-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ar3k
+	$(CP) \
+		$(PKG_BUILD_DIR)/ar3k/*.dfu \
+		$(1)/lib/firmware/ar3k
+endef
+$(eval $(call BuildPackage,ar3k-firmware))
+
+Package/ath9k-htc-firmware = $(call Package/firmware-default,AR9271/AR7010 firmware)
+define Package/ath9k-htc-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ath9k_htc
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/ath9k_htc/htc_9271-1.4.0.fw \
+		$(PKG_BUILD_DIR)/ath9k_htc/htc_7010-1.4.0.fw \
+		$(1)/lib/firmware/ath9k_htc
+endef
+$(eval $(call BuildPackage,ath9k-htc-firmware))
+
+Package/carl9170-firmware = $(call Package/firmware-default,AR9170 firmware)
+define Package/carl9170-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/carl9170-1.fw $(1)/lib/firmware
+endef
+$(eval $(call BuildPackage,carl9170-firmware))
diff --git a/package/firmware/linux-firmware/realtek.mk b/package/firmware/linux-firmware/realtek.mk
new file mode 100644
index 0000000000000000000000000000000000000000..0f8b1ce75053713b25ea601fd56ad02c410861b7
--- /dev/null
+++ b/package/firmware/linux-firmware/realtek.mk
@@ -0,0 +1,50 @@
+Package/r8169-firmware = $(call Package/firmware-default,RealTek RTL8169 firmware)
+define Package/r8169-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/rtl_nic
+	$(CP) \
+		$(PKG_BUILD_DIR)/rtl_nic/* \
+		$(1)/lib/firmware/rtl_nic
+endef
+$(eval $(call BuildPackage,r8169-firmware))
+
+Package/r8188eu-firmware = $(call Package/firmware-default,RealTek RTL8188EU firmware)
+define Package/r8188eu-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
+	$(CP) \
+		$(PKG_BUILD_DIR)/rtlwifi/rtl8188eufw.bin \
+		$(1)/lib/firmware/rtlwifi
+endef
+$(eval $(call BuildPackage,r8188eu-firmware))
+
+Package/rtl8192ce-firmware = $(call Package/firmware-default,RealTek RTL8192CE firmware)
+define Package/rtl8192ce-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cfw.bin $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cfwU.bin $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cfwU_B.bin $(1)/lib/firmware/rtlwifi
+endef
+$(eval $(call BuildPackage,rtl8192ce-firmware))
+
+Package/rtl8192cu-firmware = $(call Package/firmware-default,RealTek RTL8192CU firmware)
+define Package/rtl8192cu-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cufw.bin $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cufw_A.bin $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cufw_B.bin $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192cufw_TMSC.bin $(1)/lib/firmware/rtlwifi
+endef
+$(eval $(call BuildPackage,rtl8192cu-firmware))
+
+Package/rtl8192de-firmware = $(call Package/firmware-default,RealTek RTL8192DE firmware)
+define Package/rtl8192de-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192defw.bin $(1)/lib/firmware/rtlwifi
+endef
+$(eval $(call BuildPackage,rtl8192de-firmware))
+
+Package/rtl8192se-firmware = $(call Package/firmware-default,RealTek RTL8192SE firmware)
+define KernelPackage/rtl8192se/install
+	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192sefw.bin $(1)/lib/firmware/rtlwifi
+endef
+$(eval $(call BuildPackage,rtl8192se-firmware))
diff --git a/package/firmware/linux-firmware/ti.mk b/package/firmware/linux-firmware/ti.mk
new file mode 100644
index 0000000000000000000000000000000000000000..a1e12fc5967a2e07aff576a1d6678f78178e0a86
--- /dev/null
+++ b/package/firmware/linux-firmware/ti.mk
@@ -0,0 +1,25 @@
+Package/wl12xx-firmware = $(call Package/firmware-default,TI WL12xx firmware)
+define Package/wl12xx-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl127x-fw-5-mr.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl127x-fw-5-plt.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl127x-fw-5-sr.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl1271-nvs.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl128x-fw-5-mr.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl128x-fw-5-plt.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl128x-fw-5-sr.bin \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl128x-nvs.bin \
+		$(1)/lib/firmware/ti-connectivity
+endef
+$(eval $(call BuildPackage,wl12xx-firmware))
+
+Package/wl18xx-firmware = $(call Package/firmware-default,TI WL18xx firmware)
+define Package/wl18xx-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
+	$(INSTALL_DATA) \
+		$(PKG_BUILD_DIR)/ti-connectivity/wl18xx-fw-4.bin \
+		$(1)/lib/firmware/ti-connectivity
+endef
+$(eval $(call BuildPackage,wl18xx-firmware))
+
diff --git a/package/kernel/brcm2708-gpu-fw/Makefile b/package/kernel/brcm2708-gpu-fw/Makefile
index eee85e0763f57cae79f920eccdd6090f60a43e93..286984b6e3ef3797002459633922f86c06a2f104 100644
--- a/package/kernel/brcm2708-gpu-fw/Makefile
+++ b/package/kernel/brcm2708-gpu-fw/Makefile
@@ -16,7 +16,7 @@ PKG_SOURCE:=$(PKG_REV).tar.gz
 PKG_SOURCE_URL:=https://github.com/Hexxeh/rpi-firmware/archive/
 PKG_MD5SUM:=f5683c1dcb255714942f7c9fd61b3a0a
 
-PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/rpi-firmware-$(PKG_REV)
+PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)/rpi-firmware-$(PKG_REV)
 
 include $(INCLUDE_DIR)/package.mk
 
diff --git a/package/kernel/linux/modules/fs.mk b/package/kernel/linux/modules/fs.mk
index ca529ff4244950dafa9298d493a5b8389d013e9b..fa182375ea8b0224753141620bd168328194ddf4 100644
--- a/package/kernel/linux/modules/fs.mk
+++ b/package/kernel/linux/modules/fs.mk
@@ -29,6 +29,7 @@ $(eval $(call KernelPackage,fs-fscache))
 define KernelPackage/fs-afs
   SUBMENU:=$(FS_MENU)
   TITLE:=Andrew FileSystem client
+  DEFAULT:=n
   DEPENDS:=+kmod-rxrpc +kmod-dnsresolver +kmod-fs-fscache
   KCONFIG:=\
 	CONFIG_AFS_FS=m \
diff --git a/package/kernel/linux/modules/input.mk b/package/kernel/linux/modules/input.mk
index 86ff33cb2612c17e123398b07c70ddc25493c9d5..eed9aa2680477f069722497deb1ebe48089dad6d 100644
--- a/package/kernel/linux/modules/input.mk
+++ b/package/kernel/linux/modules/input.mk
@@ -75,7 +75,7 @@ define KernelPackage/input-gpio-keys
 	CONFIG_KEYBOARD_GPIO \
 	CONFIG_INPUT_KEYBOARD=y
   FILES:=$(LINUX_DIR)/drivers/input/keyboard/gpio_keys.ko
-  AUTOLOAD:=$(call AutoProbe,gpio_keys)
+  AUTOLOAD:=$(call AutoProbe,gpio_keys,1)
 endef
 
 define KernelPackage/input-gpio-keys/description
diff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk
index b1899da5f9442dc7f17cdb5781b5002215c11c9b..cea8e47a65b5283640a17ed6c311bd87c70373b2 100644
--- a/package/kernel/linux/modules/netsupport.mk
+++ b/package/kernel/linux/modules/netsupport.mk
@@ -989,6 +989,7 @@ $(eval $(call KernelPackage,dnsresolver))
 define KernelPackage/rxrpc
   SUBMENU:=$(NETWORK_SUPPORT_MENU)
   TITLE:=AF_RXRPC support
+  HIDDEN:=1
   KCONFIG:= \
 	CONFIG_AF_RXRPC \
 	CONFIG_RXKAD=m \
diff --git a/package/kernel/linux/modules/other.mk b/package/kernel/linux/modules/other.mk
index 9a3d73ce9be3455e1152d9c4f294cd4fd6825345..c0684e5e0415805c293ae160468f30cd1c4fd07c 100644
--- a/package/kernel/linux/modules/other.mk
+++ b/package/kernel/linux/modules/other.mk
@@ -101,6 +101,16 @@ endef
 $(eval $(call KernelPackage,bluetooth-hci-h4p))
 
 
+define KernelPackage/dma-buf
+  TITLE:=DMA shared buffer support
+  HIDDEN:=1
+  KCONFIG:=CONFIG_DMA_SHARED_BUFFER
+  FILES:=$(LINUX_DIR)/drivers/dma-buf/dma-shared-buffer.ko
+  AUTOLOAD:=$(call AutoLoad,20,dma-shared-buffer)
+endef
+$(eval $(call KernelPackage,dma-buf))
+
+
 define KernelPackage/eeprom-93cx6
   SUBMENU:=$(OTHER_MENU)
   TITLE:=EEPROM 93CX6 support
diff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk
index d1ff4557733e1f7277d1e9e3cc2f8f570b079af6..8f6013c3dbb986d83374f6d6f8935f89fdde6287 100644
--- a/package/kernel/linux/modules/usb.mk
+++ b/package/kernel/linux/modules/usb.mk
@@ -1267,6 +1267,36 @@ endef
 $(eval $(call KernelPackage,usb-net-qmi-wwan))
 
 
+define KernelPackage/usb-net-rtl8150
+  TITLE:=Kernel module for USB-to-Ethernet Realtek convertors
+  KCONFIG:=CONFIG_USB_RTL8150
+  FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/rtl8150.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8150)
+  $(call AddDepends/usb-net)
+endef
+
+define KernelPackage/usb-net-rtl8150/description
+ Kernel module for USB-to-Ethernet Realtek 8150 convertors
+endef
+
+$(eval $(call KernelPackage,usb-net-rtl8150))
+
+
+define KernelPackage/usb-net-rtl8152
+  TITLE:=Kernel module for USB-to-Ethernet Realtek convertors
+  KCONFIG:=CONFIG_USB_RTL8152
+  FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/r8152.ko
+  AUTOLOAD:=$(call AutoProbe,r8152)
+  $(call AddDepends/usb-net)
+endef
+
+define KernelPackage/usb-net-rtl8152/description
+ Kernel module for USB-to-Ethernet Realtek 8152 USB2.0/3.0 convertors
+endef
+
+$(eval $(call KernelPackage,usb-net-rtl8152))
+
+
 define KernelPackage/usb-net-rndis
   TITLE:=Support for RNDIS connections
   KCONFIG:=CONFIG_USB_NET_RNDIS_HOST
diff --git a/package/kernel/linux/modules/video.mk b/package/kernel/linux/modules/video.mk
index 3b06a143be047936930a201dfd15d7cdb5face23..900bd6541acd5033a440b233d818fe74b6f1a5ce 100644
--- a/package/kernel/linux/modules/video.mk
+++ b/package/kernel/linux/modules/video.mk
@@ -121,6 +121,7 @@ endef
 
 define KernelPackage/video-videobuf2
   TITLE:=videobuf2 lib
+  DEPENDS:=+kmod-dma-buf
   KCONFIG:= \
 	CONFIG_VIDEOBUF2_CORE \
 	CONFIG_VIDEOBUF2_MEMOPS \
diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
index a1eedce01494028328a1dbc426de588b34867d70..30da1cfe250fd9cd630bf04e0c68cd7382355a2a 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=2015-03-09
-PKG_RELEASE:=3
+PKG_VERSION:=2016-01-10
+PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
 PKG_BACKPORT_VERSION:=
-PKG_MD5SUM:=6d4b04e4ce8a1f54dabfb04f4709453c
+PKG_MD5SUM:=be5fae2e8d6f7490f9b073374fb895ba
 
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@@ -23,15 +23,29 @@ PKG_BUILD_PARALLEL:=1
 PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
 
 PKG_DRIVERS = \
-	adm8211 ath5k libertas-usb libertas-sdio p54-common p54-pci p54-usb p54-spi \
-	rt2x00-lib rt2x00-pci rt2x00-usb rt2800-lib rt2400-pci rt2500-pci \
-	rt2500-usb rt61-pci rt73-usb rt2800-mmio rt2800-pci rt2800-usb rt2800-soc \
-	rtl8180 rtl8187 zd1211rw mac80211-hwsim carl9170 b43 b43legacy \
-	ath9k-common ath9k ath9k-htc ath10k ath net-libipw net-ipw2100 net-ipw2200 \
-	mwl8k mwifiex-pcie net-hermes net-hermes-pci net-hermes-plx net-hermes-pcmcia \
-	iwl-legacy iwl3945 iwl4965 iwlagn wlcore wl12xx wl18xx lib80211 \
+	adm8211 \
+	ath ath5k ath9k ath9k-common ath9k-htc ath10k \
+	b43 b43legacy \
+	carl9170 \
+	hermes hermes-pci hermes-pcmcia hermes-plx\
+	iwl-legacy iwl3945 iwl4965 iwlwifi \
+	lib80211 \
+	libipw ipw2100 ipw2200 \
+	libertas-sdio libertas-usb libertas-spi \
+	mac80211-hwsim \
+	mt7601u \
+	mwl8k mwifiex-pcie \
+	p54-common p54-pci p54-spi p54-usb \
+	rt2x00-lib rt2x00-pci rt2x00-usb \
+	rt2400-pci rt2500-pci rt2500-usb \
+	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
+	rtl8192de rtl8192cu \
+	rtl8xxxu \
+	wlcore wl12xx wl18xx \
+	zd1211rw
 
 PKG_CONFIG_DEPENDS:= \
 	CONFIG_PACKAGE_kmod-mac80211 \
@@ -60,7 +74,6 @@ define KernelPackage/mac80211/Default
   SUBMENU:=$(WMENU)
   URL:=https://wireless.wiki.kernel.org/
   MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
-  DEPENDS:=@!TARGET_uml
 endef
 
 define KernelPackage/cfg80211
@@ -79,7 +92,7 @@ endef
 define KernelPackage/mac80211
   $(call KernelPackage/mac80211/Default)
   TITLE:=Linux 802.11 Wireless Networking Stack
-  DEPENDS+= +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +kmod-cfg80211 +hostapd-common
+  DEPENDS+= +kmod-cfg80211 +hostapd-common +kmod-crypto-core +kmod-crypto-arc4
   KCONFIG:=\
 	CONFIG_AVERAGE=y
   FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko
@@ -97,6 +110,15 @@ define KernelPackage/mac80211/config
 		  Select this to see extensive information about
 		  the internal state of mac80211 in debugfs.
 
+	config PACKAGE_MAC80211_TRACING
+		bool "Enable tracing (mac80211 and supported drivers)"
+		select KERNEL_FTRACE
+		select KERNEL_ENABLE_DEFAULT_TRACERS
+		default n
+		help
+		  Select this to enable tracing of mac80211 and
+		  related wifi drivers (using trace-cmd).
+
 	config PACKAGE_MAC80211_MESH
 		bool "Enable 802.11s mesh support"
 		default y
@@ -108,833 +130,703 @@ define KernelPackage/mac80211/description
 Generic IEEE 802.11 Networking Stack (mac80211)
 endef
 
-PKG_LINUX_FIRMWARE_NAME:=linux-firmware
-PKG_LINUX_FIRMWARE_VERSION:=f404336ba808cbd57547196e13367079a23b822c
-PKG_LINUX_FIRMWARE_SOURCE:=$(PKG_LINUX_FIRMWARE_NAME)-2015-03-20-$(PKG_LINUX_FIRMWARE_VERSION).tar.bz2
-PKG_LINUX_FIRMWARE_PROTO:=git
-PKG_LINUX_FIRMWARE_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
-PKG_LINUX_FIRMWARE_SUBDIR:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION)
-#PKG_LINUX_FIRMWARE_MIRROR_MD5SUM:=e219333f01835c6e556875a9e0deb3f9
-
-define Download/linux-firmware
-  FILE:=$(PKG_LINUX_FIRMWARE_SOURCE)
-  URL:=$(PKG_LINUX_FIRMWARE_SOURCE_URL)
-  MD5SUM:=$(PKG_LINUX_FIRMWARE_MD5SUM)
-  PROTO:=$(PKG_LINUX_FIRMWARE_PROTO)
-  VERSION:=$(PKG_LINUX_FIRMWARE_VERSION)
-  SUBDIR:=$(PKG_LINUX_FIRMWARE_SUBDIR)
-  MIRROR_MD5SUM:=$(PKG_LINUX_FIRMWARE_MIRROR_MD5SUM)
-endef
-$(eval $(call Download,linux-firmware))
-
-PKG_ATH10K_LINUX_FIRMWARE_NAME:=ath10k-firmware
-PKG_ATH10K_LINUX_FIRMWARE_VERSION:=da0f85d924226ee30c46e037120621c9e192b39e
-PKG_ATH10K_LINUX_FIRMWARE_SOURCE:=$(PKG_ATH10K_LINUX_FIRMWARE_NAME)-$(PKG_ATH10K_LINUX_FIRMWARE_VERSION).tar.bz2
-PKG_ATH10K_LINUX_FIRMWARE_PROTO:=git
-PKG_ATH10K_LINUX_FIRMWARE_SOURCE_URL:=https://github.com/kvalo/ath10k-firmware.git
-PKG_ATH10K_LINUX_FIRMWARE_SUBDIR:=$(PKG_ATH10K_LINUX_FIRMWARE_NAME)-$(PKG_ATH10K_LINUX_FIRMWARE_VERSION)
-#PKG_ATH10K_LINUX_FIRMWARE_MIRROR_MD5SUM:=?
-
-define Download/ath10k-firmware
-  FILE:=$(PKG_ATH10K_LINUX_FIRMWARE_SOURCE)
-  URL:=$(PKG_ATH10K_LINUX_FIRMWARE_SOURCE_URL)
-  PROTO:=$(PKG_ATH10K_LINUX_FIRMWARE_PROTO)
-  VERSION:=$(PKG_ATH10K_LINUX_FIRMWARE_VERSION)
-  SUBDIR:=$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)
-  #MIRROR_MD5SUM:=$(PKG_ATH10K_LINUX_FIRMWARE_MIRROR_MD5SUM)
-endef
-$(eval $(call Download,ath10k-firmware))
-
-# Prism54 drivers
-P54PCIFW:=2.13.12.0.arm
-P54USBFW:=2.13.24.0.lm87.arm
-P54SPIFW:=2.13.0.0.a.13.14.arm
-
-define Download/p54usb
-  FILE:=$(P54USBFW)
-  URL:=http://daemonizer.de/prism54/prism54-fw/fw-usb
-  MD5SUM:=8e8ab005a4f8f0123bcdc51bc25b47f6
-endef
-$(eval $(call Download,p54usb))
-
-define Download/p54pci
-  FILE:=$(P54PCIFW)
-  URL:=http://daemonizer.de/prism54/prism54-fw/fw-softmac
-  MD5SUM:=ff7536af2092b1c4b21315bd103ef4c4
-endef
-$(eval $(call Download,p54pci))
-
-define Download/p54spi
-  FILE:=$(P54SPIFW)
-  URL:=http://daemonizer.de/prism54/prism54-fw/stlc4560
-  MD5SUM:=42661f8ecbadd88012807493f596081d
-endef
-$(eval $(call Download,p54spi))
-
-define KernelPackage/p54/Default
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Prism54 Drivers
-endef
-
-define KernelPackage/p54/description
-  Kernel module for Prism54 chipsets (mac80211)
-endef
-
-define KernelPackage/p54-common
-  $(call KernelPackage/p54/Default)
-  DEPENDS+= @PCI_SUPPORT||@USB_SUPPORT||@TARGET_omap24xx +kmod-mac80211 +kmod-lib-crc-ccitt
-  TITLE+= (COMMON)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54common.ko
-endef
-
-define KernelPackage/p54-pci
-  $(call KernelPackage/p54/Default)
-  TITLE+= (PCI)
-  DEPENDS+= @PCI_SUPPORT +kmod-p54-common
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54pci.ko
-  AUTOLOAD:=$(call AutoProbe,p54pci)
-endef
-
-define KernelPackage/p54-usb
-  $(call KernelPackage/p54/Default)
-  TITLE+= (USB)
-  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-p54-common
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54usb.ko
-  AUTOLOAD:=$(call AutoProbe,p54usb)
-endef
-
-define KernelPackage/p54-spi
-  $(call KernelPackage/p54/Default)
-  TITLE+= (SPI)
-  DEPENDS+= @TARGET_omap24xx +kmod-p54-common
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/p54/p54spi.ko
-  AUTOLOAD:=$(call AutoProbe,p54spi)
-endef
-
-define KernelPackage/rt2x00/Default
+define KernelPackage/adm8211
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Ralink Drivers for RT2x00 cards
+  TITLE:=ADMTek 8211 support
+  DEPENDS+=@PCI_SUPPORT +kmod-mac80211 +kmod-eeprom-93cx6
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/admtek/adm8211.ko
+  AUTOLOAD:=$(call AutoProbe,adm8211)
 endef
 
-define KernelPackage/rt2x00-lib
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-mac80211 +kmod-lib-crc-itu-t
-  TITLE+= (LIB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00lib.ko
-  MENU:=1
-endef
+define KernelPackage/ath/config
+  if PACKAGE_kmod-ath
+	config ATH_USER_REGD
+		bool "Force Atheros drivers to respect the user's regdomain settings"
+		help
+		  Atheros' idea of regulatory handling is that the EEPROM of the card defines
+		  the regulatory limits and the user is only allowed to restrict the settings
+		  even further, even if the country allows frequencies or power levels that
+		  are forbidden by the EEPROM settings.
 
-define KernelPackage/rt2x00-lib/config
-  if PACKAGE_kmod-rt2x00-lib
+		  Select this option if you want the driver to respect the user's decision about
+		  regulatory settings.
 
-	config PACKAGE_RT2X00_LIB_DEBUGFS
-		bool "Enable rt2x00 debugfs support"
-		depends on PACKAGE_MAC80211_DEBUGFS
+	config PACKAGE_ATH_DEBUG
+		bool "Atheros wireless debugging"
 		help
-		  Enable creation of debugfs files for the rt2x00 drivers.
-		  These debugfs files support both reading and writing of the
-		  most important register types of the rt2x00 hardware.
+		  Say Y, if you want to debug atheros wireless drivers.
+		  Only ath9k & ath10k make use of this.
 
-	config PACKAGE_RT2X00_DEBUG
-		bool "Enable rt2x00 debug output"
+	config PACKAGE_ATH_DFS
+		bool "Enable DFS support"
+		default y
 		help
-		  Enable debugging output for all rt2x00 modules
+		  Dynamic frequency selection (DFS) is required for most of the 5 GHz band
+		  channels in Europe, US, and Japan.
 
-  endif
-endef
+		  Select this option if you want to use such channels.
 
-define KernelPackage/rt2x00-mmio
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-eeprom-93cx6
-  HIDDEN:=1
-  TITLE+= (MMIO)
-  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00mmio.ko
+  endif
 endef
 
-define KernelPackage/rt2x00-pci
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-mmio +kmod-rt2x00-lib
-  HIDDEN:=1
-  TITLE+= (PCI)
-  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00pci.ko
-  AUTOLOAD:=$(call AutoProbe,rt2x00pci)
+define KernelPackage/ath
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Atheros common driver part
+  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_ath25 +kmod-mac80211
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko
+  MENU:=1
 endef
 
-define KernelPackage/rt2x00-usb
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-lib +kmod-usb-core
-  HIDDEN:=1
-  TITLE+= (USB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00usb.ko
-  AUTOLOAD:=$(call AutoProbe,rt2x00usb)
+define KernelPackage/ath/description
+ This module contains some common parts needed by Atheros Wireless drivers.
 endef
 
-define KernelPackage/rt2800-lib
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-lib-crc-ccitt +@DRIVER_11N_SUPPORT
-  HIDDEN:=1
-  TITLE+= (rt2800 LIB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800lib.ko
+define KernelPackage/ath5k
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Atheros 5xxx wireless cards support
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath5k
+  DEPENDS+= @PCI_SUPPORT||@TARGET_ath25 +kmod-ath
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.ko
+  AUTOLOAD:=$(call AutoProbe,ath5k)
 endef
 
-define KernelPackage/rt2400-pci
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
-  TITLE+= (RT2400 PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2400pci.ko
-  AUTOLOAD:=$(call AutoProbe,rt2400pci)
+define KernelPackage/ath5k/description
+ This module adds support for wireless adapters based on
+ Atheros 5xxx chipset.
 endef
 
-define KernelPackage/rt2500-pci
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
-  TITLE+= (RT2500 PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2500pci.ko
-  AUTOLOAD:=$(call AutoProbe,rt2500pci)
+define KernelPackage/ath9k-common
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc)
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
+  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
 endef
 
-define KernelPackage/rt2500-usb
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb
-  TITLE+= (RT2500 USB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2500usb.ko
-  AUTOLOAD:=$(call AutoProbe,rt2500usb)
+define KernelPackage/ath9k
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Atheros 802.11n PCI wireless cards support
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
+  DEPENDS+= @PCI_SUPPORT||TARGET_ar71xx +kmod-ath9k-common
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko
+  AUTOLOAD:=$(call AutoProbe,ath9k)
 endef
 
-define KernelPackage/rt61-pci
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
-  TITLE+= (RT2x61 PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt61pci.ko
-  AUTOLOAD:=$(call AutoProbe,rt61pci)
+define KernelPackage/ath9k/description
+This module adds support for wireless adapters based on
+Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
 endef
 
-define KernelPackage/rt73-usb
-  $(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb
-  TITLE+= (RT73 USB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt73usb.ko
-  AUTOLOAD:=$(call AutoProbe,rt73usb)
-endef
+define KernelPackage/ath9k/config
 
-define KernelPackage/rt2800-mmio
-$(call KernelPackage/rt2x00/Default)
-  TITLE += (RT28xx/RT3xxx MMIO)
-  DEPENDS += +kmod-rt2800-lib +kmod-rt2x00-mmio
-  HIDDEN:=1
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800mmio.ko
-endef
+	config ATH9K_SUPPORT_PCOEM
+		bool "Support chips used in PC OEM cards"
+		depends on PACKAGE_kmod-ath9k
 
-define KernelPackage/rt2800-soc
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS += @(TARGET_ramips_rt288x||TARGET_ramips_rt305x||TARGET_ramips_rt3883||TARGET_ramips_mt7620) +kmod-rt2800-mmio +kmod-rt2800-lib
-  TITLE += (RT28xx/RT3xxx SoC)
-  FILES := \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00soc.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800soc.ko
-  AUTOLOAD:=$(call AutoProbe,rt2800soc)
 endef
 
-define KernelPackage/rt2800-pci
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci +kmod-rt2800-lib +kmod-rt2800-mmio
-  TITLE+= (RT2860 PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800pci.ko
-  AUTOLOAD:=$(call AutoProbe,rt2800pci)
+define KernelPackage/ath9k-htc
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Atheros 802.11n USB device support
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
+  DEPENDS+= @USB_SUPPORT +kmod-ath9k-common +kmod-usb-core +ath9k-htc-firmware
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
+  AUTOLOAD:=$(call AutoProbe,ath9k_htc)
 endef
 
-define KernelPackage/rt2800-usb
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb +kmod-rt2800-lib +kmod-lib-crc-ccitt
-  TITLE+= (RT2870 USB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800usb.ko
-  AUTOLOAD:=$(call AutoProbe,rt2800usb)
+define KernelPackage/ath9k-htc/description
+This module adds support for wireless adapters based on
+Atheros USB AR9271 and AR7010 family of chipsets.
 endef
 
-define KernelPackage/rtl818x/Default
+define KernelPackage/ath10k
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek Drivers for RTL818x devices
-  URL:=http://wireless.kernel.org/en/users/Drivers/rtl8187
-  DEPENDS+= +kmod-eeprom-93cx6 +kmod-mac80211
+  TITLE:=Atheros 802.11ac wireless cards support
+  URL:=https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
+  DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY +ath10k-firmware-qca988x
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
+  AUTOLOAD:=$(call AutoLoad,55,ath10k_core ath10k_pci)
 endef
 
-define KernelPackage/rtl8180
-  $(call KernelPackage/rtl818x/Default)
-  DEPENDS+= @PCI_SUPPORT
-  TITLE+= (RTL8180 PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8180/rtl818x_pci.ko
-  AUTOLOAD:=$(call AutoProbe,rtl818x_pci)
+define KernelPackage/ath10k/description
+This module adds support for wireless adapters based on
+Atheros IEEE 802.11ac family of chipsets. For now only
+PCI is supported.
 endef
 
-define KernelPackage/rtl8187
-$(call KernelPackage/rtl818x/Default)
-  DEPENDS+= @USB_SUPPORT +kmod-usb-core
-  TITLE+= (RTL8187 USB)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8187/rtl8187.ko
-  AUTOLOAD:=$(call AutoProbe,rtl8187)
-endef
+#Broadcom firmware
+ifneq ($(CONFIG_B43_FW_6_30),)
+  PKG_B43_FWV4_NAME:=broadcom-wl
+  PKG_B43_FWV4_VERSION:=6.30.163.46
+  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).wl_apsta.o
+  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
+  PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
+  PKG_B43_FWV4_MD5SUM:=6fe97e9368d25342a1ab943d3cf3496d
+else
+ifneq ($(CONFIG_B43_FW_5_10),)
+  PKG_B43_FWV4_NAME:=broadcom-wl
+  PKG_B43_FWV4_VERSION:=5.10.56.27.3
+  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta/wl_prebuilt.o
+  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)_mipsel.tar.bz2
+  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
+  PKG_B43_FWV4_MD5SUM:=3363e3a6b3d9d73c49dea870c7834eac
+else
+ifneq ($(CONFIG_B43_FW_4_178),)
+  PKG_B43_FWV4_NAME:=broadcom-wl
+  PKG_B43_FWV4_VERSION:=4.178.10.4
+  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
+  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
+  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
+  PKG_B43_FWV4_MD5SUM:=14477e8cbbb91b11896affac9b219fdb
+else
+ifneq ($(CONFIG_B43_FW_5_100_138),)
+  PKG_B43_FWV4_NAME:=broadcom-wl
+  PKG_B43_FWV4_VERSION:=5.100.138
+  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
+  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
+  PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
+  PKG_B43_FWV4_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555
+else
+  PKG_B43_FWV4_NAME:=broadcom-wl
+  PKG_B43_FWV4_VERSION:=4.150.10.5
+  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta_mimo.o
+  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
+  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
+  PKG_B43_FWV4_MD5SUM:=0c6ba9687114c6b598e8019e262d9a60
+endif
+endif
+endif
+endif
+ifneq ($(CONFIG_B43_OPENFIRMWARE),)
+  PKG_B43_FWV4_NAME:=broadcom-wl
+  PKG_B43_FWV4_VERSION:=5.2
+  PKG_B43_FWV4_OBJECT:=openfwwf-$(PKG_B43_FWV4_VERSION)
+  PKG_B43_FWV4_SOURCE:=openfwwf-$(PKG_B43_FWV4_VERSION).tar.gz
+  PKG_B43_FWV4_SOURCE_URL:=http://www.ing.unibs.it/openfwwf/firmware/
+  PKG_B43_FWV4_MD5SUM:=e045a135453274e439ae183f8498b0fa
+endif
 
-define KernelPackage/rtlwifi/config
-	config PACKAGE_RTLWIFI_DEBUG
-		bool "Realtek wireless debugging"
-		depends on PACKAGE_kmod-rtlwifi
-		help
-		  Say Y, if you want to debug realtek wireless drivers.
 
+define Download/b43
+  FILE:=$(PKG_B43_FWV4_SOURCE)
+  URL:=$(PKG_B43_FWV4_SOURCE_URL)
+  MD5SUM:=$(PKG_B43_FWV4_MD5SUM)
 endef
+$(eval $(call Download,b43))
 
-define KernelPackage/rtlwifi
+define KernelPackage/b43
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek common driver part
-  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT) +kmod-mac80211 +@DRIVER_11N_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtlwifi.ko
-  HIDDEN:=1
+  TITLE:=Broadcom 43xx wireless support
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/b43
+  KCONFIG:= \
+  	CONFIG_HW_RANDOM=y
+  # Depend on PCI_SUPPORT to make sure we can select kmod-bcma or kmod-ssb
+  DEPENDS += \
+	@PCI_SUPPORT +kmod-mac80211 \
+	$(if $(CONFIG_PACKAGE_B43_USE_SSB),+kmod-ssb) \
+	$(if $(CONFIG_PACKAGE_B43_USE_BCMA),+kmod-bcma)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/b43/b43.ko
+  AUTOLOAD:=$(call AutoProbe,b43)
+  MENU:=1
 endef
 
-define KernelPackage/rtlwifi-pci
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek common driver part (PCI support)
-  DEPENDS+= @PCI_SUPPORT +kmod-rtlwifi
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl_pci.ko
-  AUTOLOAD:=$(call AutoProbe,rtl_pci)
-  HIDDEN:=1
-endef
+define KernelPackage/b43/config
 
-define KernelPackage/rtlwifi-usb
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek common driver part (USB support)
-  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-rtlwifi
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl_usb.ko
-  AUTOLOAD:=$(call AutoProbe,rtl_usb)
-  HIDDEN:=1
-endef
+config PACKAGE_B43_USE_SSB
+	select PACKAGE_kmod-ssb
+	tristate
+	depends on !TARGET_brcm47xx && !TARGET_brcm63xx
+	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA_AND_SSB
+	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_SSB
 
-define KernelPackage/rtl8192c-common
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek RTL8192CE/RTL8192CU common support module
-  DEPENDS+= +kmod-rtlwifi
-  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192c/rtl8192c-common.ko
-  HIDDEN:=1
-endef
+config PACKAGE_B43_USE_BCMA
+	select PACKAGE_kmod-bcma
+	tristate
+	depends on !TARGET_brcm47xx && !TARGET_bcm53xx
+	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA_AND_SSB
+	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA
 
-define KernelPackage/rtl8192ce
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek RTL8192CE/RTL8188CE support
-  DEPENDS+= +kmod-rtlwifi-pci +kmod-rtl8192c-common
-  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192ce.ko
-  AUTOLOAD:=$(call AutoProbe,rtl8192ce)
-endef
+  if PACKAGE_kmod-b43
 
-define KernelPackage/rtl8192ce/install
-	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cfw.bin $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cfwU.bin $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cfwU_B.bin $(1)/lib/firmware/rtlwifi
-endef
+	choice
+		prompt "b43 firmware version"
+		default B43_FW_5_100_138
+		help
+		  This option allows you to select the version of the b43 firmware.
 
-define KernelPackage/rtl8192se
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek RTL8192SE/RTL8191SE support
-  DEPENDS+= +kmod-rtlwifi-pci
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192se/rtl8192se.ko
-  AUTOLOAD:=$(call AutoProbe,rtl8192se)
-endef
+	config B43_FW_4_150
+		bool "Firmware 410.2160 from driver 4.150.10.5 (old stable)"
+		help
+		  Old stable firmware for BCM43xx devices.
 
-define KernelPackage/rtl8192se/install
-	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192sefw.bin $(1)/lib/firmware/rtlwifi
-endef
+		  If unsure, select this.
 
-define KernelPackage/rtl8192de
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek RTL8192DE/RTL8188DE support
-  DEPENDS+= +kmod-rtlwifi-pci
-  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192de/rtl8192de.ko
-  AUTOLOAD:=$(call AutoProbe,rtl8192de)
-endef
+	config B43_FW_4_178
+		bool "Firmware 478.104 from driver 4.178.10.4"
+		help
+		  Older firmware for BCM43xx devices.
 
-define KernelPackage/rtl8192de/install
-	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192defw.bin $(1)/lib/firmware/rtlwifi
-endef
+		  If unsure, select the "stable" firmware.
 
-define KernelPackage/rtl8192cu
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Realtek RTL8192CU/RTL8188CU support
-  DEPENDS+= +kmod-rtlwifi-usb +kmod-rtl8192c-common
-  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/rtlwifi/rtl8192cu/rtl8192cu.ko
-  AUTOLOAD:=$(call AutoProbe,rtl8192cu)
-endef
+	config B43_FW_5_10
+		bool "Firmware 508.1084 from driver 5.10.56.27"
+		help
+		  Older firmware for BCM43xx devices.
 
-define KernelPackage/rtl8192cu/install
-	$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cufw.bin $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cufw_A.bin $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cufw_B.bin $(1)/lib/firmware/rtlwifi
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rtlwifi/rtl8192cufw_TMSC.bin $(1)/lib/firmware/rtlwifi
-endef
+		  If unsure, select the "stable" firmware.
 
-ZD1211FW_NAME:=zd1211-firmware
-ZD1211FW_VERSION:=1.4
-define Download/zd1211rw
-  FILE:=$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
-  URL:=@SF/zd1211/
-  MD5SUM:=19f28781d76569af8551c9d11294c870
-endef
-$(eval $(call Download,zd1211rw))
+	config B43_FW_5_100_138
+		bool "Firmware 666.2 from driver 5.100.138 (stable)"
+		help
+		  The currently default firmware for BCM43xx devices.
 
-define KernelPackage/zd1211rw
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Zydas ZD1211 support
-  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-mac80211
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/zd1211rw/zd1211rw.ko
-  AUTOLOAD:=$(call AutoProbe,zd1211rw)
-endef
+		  This firmware currently gets most of the testing and is needed for some N-PHY devices.
 
-define KernelPackage/adm8211
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=ADMTek 8211 support
-  DEPENDS+=@PCI_SUPPORT +kmod-mac80211 +kmod-eeprom-93cx6
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/adm8211.ko
-  AUTOLOAD:=$(call AutoProbe,adm8211)
-endef
+		  If unsure, select the this firmware.
 
-define KernelPackage/ath/config
-  if PACKAGE_kmod-ath
-	config ATH_USER_REGD
-		bool "Force Atheros drivers to respect the user's regdomain settings"
+	config B43_FW_6_30
+		bool "Firmware 784.2 from driver 6.30.163.46 (experimental)"
 		help
-		  Atheros' idea of regulatory handling is that the EEPROM of the card defines
-		  the regulatory limits and the user is only allowed to restrict the settings
-		  even further, even if the country allows frequencies or power levels that
-		  are forbidden by the EEPROM settings.
+		  Newer experimental firmware for BCM43xx devices.
+
+		  This firmware is mostly untested.
+
+		  If unsure, select the "stable" firmware.
+
+	config B43_OPENFIRMWARE
+		bool "Open FirmWare for WiFi networks"
+		help
+		  Opensource firmware for BCM43xx devices.
+
+		  Do _not_ select this, unless you know what you are doing.
+		  The Opensource firmware is not suitable for embedded devices, yet.
+		  It does not support QoS, which is bad for AccessPoints.
+		  It does not support hardware crypto acceleration, which is a showstopper
+		  for embedded devices with low CPU resources.
+
+		  If unsure, select the "stable" firmware.
+
+	endchoice
+
+	config B43_FW_SQUASH
+		bool "Remove unnecessary firmware files"
+		depends on !B43_OPENFIRMWARE
+		default y
+		help
+		  This options allows you to remove unnecessary b43 firmware files
+		  from the final rootfs image. This can reduce the rootfs size by
+		  up to 200k.
+
+		  If unsure, say Y.
+
+	config B43_FW_SQUASH_COREREVS
+		string "Core revisions to include"
+		depends on B43_FW_SQUASH
+		default "5,6,7,8,9,10,11,13,15" if TARGET_brcm47xx_legacy
+		default "16,28,29,30" if TARGET_brcm47xx_mips74k
+		default "5,6,7,8,9,10,11,13,15,16,28,29,30"
+		help
+		  This is a comma seperated list of core revision numbers.
+
+		  Example (keep files for rev5 only):
+		    5
+
+		  Example (keep files for rev5 and rev11):
+		    5,11
+
+	config B43_FW_SQUASH_PHYTYPES
+		string "PHY types to include"
+		depends on B43_FW_SQUASH
+		default "G,N,LP" if TARGET_brcm47xx_legacy
+		default "N,HT" if TARGET_brcm47xx_mips74k
+		default "G,N,LP,HT"
+		help
+		  This is a comma seperated list of PHY types:
+		    A  => A-PHY
+		    AG => Dual A-PHY G-PHY
+		    G  => G-PHY
+		    LP => LP-PHY
+		    N  => N-PHY
+		    HT  => HT-PHY
+		    LCN  => LCN-PHY
+		    LCN40  => LCN40-PHY
+		    AC  => AC-PHY
+
+		  Example (keep files for G-PHY only):
+		    G
+
+		  Example (keep files for G-PHY and N-PHY):
+		    G,N
+
+	choice
+		prompt "Supported buses"
+		default PACKAGE_B43_BUSES_BCMA_AND_SSB
+		help
+		  This allows choosing buses that b43 should support.
+
+	config PACKAGE_B43_BUSES_BCMA_AND_SSB
+		depends on !TARGET_brcm47xx_legacy && !TARGET_brcm47xx_mips74k && !TARGET_bcm53xx
+		bool "BCMA and SSB"
+
+	config PACKAGE_B43_BUSES_BCMA
+		depends on !TARGET_brcm47xx_legacy
+		bool "BCMA only"
+
+	config PACKAGE_B43_BUSES_SSB
+		depends on !TARGET_brcm47xx_mips74k && !TARGET_bcm53xx
+		bool "SSB only"
+
+	endchoice
+
+	config PACKAGE_B43_DEBUG
+		bool "Enable debug output and debugfs for b43"
+		default n
+		help
+		  Enable additional debug output and runtime sanity checks for b43
+		  and enables the debugfs interface.
+
+		  If unsure, say N.
+
+	config PACKAGE_B43_PIO
+		bool "Enable support for PIO transfer mode"
+		default n
+		help
+		  Enable support for using PIO instead of DMA. Unless you have DMA
+		  transfer problems you don't need this.
 
-		  Select this option if you want the driver to respect the user's decision about
-		  regulatory settings.
+		  If unsure, say N.
 
-	config PACKAGE_ATH_DEBUG
-		bool "Atheros wireless debugging"
+	config PACKAGE_B43_PHY_G
+		bool "Enable support for G-PHYs"
+		default n if TARGET_brcm47xx_mips74k
+		default y
 		help
-		  Say Y, if you want to debug atheros wireless drivers.
-		  Right now only ath9k makes use of this.
+		  Enable support for G-PHY. This includes support for the following devices:
+		  PCI: BCM4306, BCM4311, BCM4318
+		  SoC: BCM5352E, BCM4712
 
-	config PACKAGE_ATH_DFS
-		bool "Enable DFS support"
+		  If unsure, say Y.
+
+	config PACKAGE_B43_PHY_N
+		bool "Enable support for N-PHYs"
 		default y
 		help
-		  Dynamic frequency selection (DFS) is required for most of the 5 GHz band
-		  channels in Europe, US, and Japan.
+		  Enable support for N-PHY. This includes support for the following devices:
+		  PCI: BCM4321, BCM4322, BCM43222, BCM43224, BCM43225
+		  SoC: BCM4716, BCM4717, BCM4718
 
-		  Select this option if you want to use such channels.
+		  Currently only 11g speed is available.
 
-  endif
-endef
+		  If unsure, say Y.
 
-define KernelPackage/ath
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Atheros common driver part
-  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_ath25 +kmod-mac80211
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko
-  MENU:=1
-endef
+	config PACKAGE_B43_PHY_LP
+		bool "Enable support for LP-PHYs"
+		default n if TARGET_brcm47xx_mips74k
+		default y
+		help
+		  Enable support for LP-PHY. This includes support for the following devices:
+		  PCI: BCM4312
+		  SoC: BCM5354
 
-define KernelPackage/ath/description
- This module contains some common parts needed by Atheros Wireless drivers.
-endef
+		  If unsure, say Y.
 
-define KernelPackage/ath5k
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Atheros 5xxx wireless cards support
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath5k
-  DEPENDS+= @PCI_SUPPORT||@TARGET_ath25 +kmod-ath
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.ko
-  AUTOLOAD:=$(call AutoProbe,ath5k)
-endef
+	config PACKAGE_B43_PHY_HT
+		bool "Enable support for HT-PHYs"
+		default n if TARGET_brcm47xx_legacy
+		default y
+		help
+		  Enable support for HT-PHY. This includes support for the following devices:
+		  PCI: BCM4331
 
-define KernelPackage/ath5k/description
- This module adds support for wireless adapters based on
- Atheros 5xxx chipset.
-endef
+		  Currently only 11g speed is available.
 
-define KernelPackage/ath9k-common
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc)
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
-  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx +kmod-ath +@DRIVER_11N_SUPPORT +@KERNEL_RELAY
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
-endef
+		  If unsure, say Y.
 
-define KernelPackage/ath9k
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Atheros 802.11n PCI wireless cards support
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
-  DEPENDS+= @PCI_SUPPORT||TARGET_ar71xx +kmod-ath9k-common
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko
-  AUTOLOAD:=$(call AutoProbe,ath9k)
-endef
+	config PACKAGE_B43_PHY_LCN
+		bool "Enable support for LCN-PHYs"
+		depends on BROKEN
+		default n
+		help
+		  Currently broken.
 
-define KernelPackage/ath9k/description
-This module adds support for wireless adapters based on
-Atheros IEEE 802.11n AR5008 and AR9001 family of chipsets.
-endef
+		  If unsure, say N.
 
-define KernelPackage/ath9k/config
+  endif
+endef
 
-	config ATH9K_SUPPORT_PCOEM
-		bool "Support chips used in PC OEM cards"
-		depends on PACKAGE_kmod-ath9k
-	
+define KernelPackage/b43/description
+Kernel module for Broadcom 43xx wireless support (mac80211 stack) new
 endef
 
-define KernelPackage/ath9k-htc
+define KernelPackage/b43legacy
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Atheros 802.11n USB device support
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k
-  DEPENDS+= @USB_SUPPORT +kmod-ath9k-common +kmod-usb-core
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
-  AUTOLOAD:=$(call AutoProbe,ath9k_htc)
+  TITLE:=Broadcom 43xx-legacy wireless support
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/b43
+  KCONFIG:= \
+  	CONFIG_HW_RANDOM=y
+  DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb +b43legacy-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/b43legacy/b43legacy.ko
+  AUTOLOAD:=$(call AutoProbe,b43legacy)
+  MENU:=1
 endef
 
-define KernelPackage/ath9k-htc/description
-This module adds support for wireless adapters based on
-Atheros USB AR9271 and AR7010 family of chipsets.
+define KernelPackage/b43legacy/description
+Kernel module for Broadcom 43xx-legacy wireless support (mac80211 stack) new
 endef
 
-define KernelPackage/ath10k
+
+define KernelPackage/brcmutil
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Atheros 802.11ac wireless cards support
-  URL:=https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
-  DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
-  AUTOLOAD:=$(call AutoLoad,55,ath10k_core ath10k_pci)
+  TITLE:=Broadcom IEEE802.11n common driver parts
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
+  DEPENDS+=@PCI_SUPPORT||USB_SUPPORT
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko
+  AUTOLOAD:=$(call AutoProbe,brcmutil)
+  MENU:=1
 endef
 
-define KernelPackage/ath10k/description
-This module adds support for wireless adapters based on
-Atheros IEEE 802.11ac family of chipsets. For now only
-PCI is supported.
+define KernelPackage/brcmutil/description
+ This module contains some common parts needed by Broadcom Wireless drivers brcmsmac and brcmfmac.
 endef
 
-define KernelPackage/ath10k/config
-  if PACKAGE_kmod-ath10k
-
-	config ATH10K_STA_FW
-		bool "Firmware optimized for STA operation"
-		default n
-		help
-		  Use the ath10k firmware optimized for wireless client instead
-		  of access point operation.
+define KernelPackage/brcmutil/config
+  if PACKAGE_kmod-brcmutil
 
-	config ATH10K_API2_FW
-		bool "Firmware optimized for AP operation (v10.1 / API v2)"
-		default n
-		depends on !ATH10K_STA_FW
+	config PACKAGE_BRCM80211_DEBUG
+		bool "Broadcom wireless driver debugging"
 		help
-		  Use the ath10k firmware from the 10.1 SDK using API v2 optimized
-		  for access point operation if the default firmware keeps crashing.
+		  Say Y, if you want to debug brcmsmac and brcmfmac wireless driver.
 
   endif
 endef
 
-define KernelPackage/carl9170
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Driver for Atheros AR9170 USB sticks
-  DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko
-  AUTOLOAD:=$(call AutoProbe,carl9170)
+PKG_BRCMSMAC_FW_NAME:=broadcom-wl
+PKG_BRCMSMAC_FW_VERSION:=5.100.138
+PKG_BRCMSMAC_FW_OBJECT:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION)/linux/wl_apsta.o
+PKG_BRCMSMAC_FW_SOURCE:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION).tar.bz2
+PKG_BRCMSMAC_FW_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
+PKG_BRCMSMAC_FW_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555
+
+define Download/brcmsmac
+  FILE:=$(PKG_BRCMSMAC_FW_SOURCE)
+  URL:=$(PKG_BRCMSMAC_FW_SOURCE_URL)
+  MD5SUM:=$(PKG_BRCMSMAC_FW_MD5SUM)
 endef
+$(eval $(call Download,brcmsmac))
 
-define KernelPackage/lib80211
+define KernelPackage/brcmsmac
   $(call KernelPackage/mac80211/Default)
-  TITLE:=802.11 Networking stack
-  DEPENDS:=+kmod-cfg80211
-  FILES:= \
-	$(PKG_BUILD_DIR)/net/wireless/lib80211.ko \
-	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_wep.ko \
-	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_ccmp.ko \
-	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_tkip.ko
-  AUTOLOAD:=$(call AutoProbe, \
-	lib80211 \
-	lib80211_crypt_wep \
-	lib80211_crypt_ccmp \
-	lib80211_crypt_tkip \
-  )
+  TITLE:=Broadcom IEEE802.11n PCIe SoftMAC WLAN driver
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
+  DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT +!TARGET_brcm47xx:kmod-bcma +kmod-lib-cordic +kmod-lib-crc8 +kmod-brcmutil +!BRCMSMAC_USE_FW_FROM_WL:brcmsmac-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcmsmac.ko
+  AUTOLOAD:=$(call AutoProbe,brcmsmac)
+  MENU:=1
 endef
 
-define KernelPackage/lib80211/description
- Kernel modules for 802.11 Networking stack
- Includes:
- - lib80211
- - lib80211_crypt_wep
- - lib80211_crypt_tkip
- - lib80211_crytp_ccmp
+define KernelPackage/brcmsmac/description
+ Kernel module for Broadcom IEEE802.11n PCIe Wireless cards
 endef
 
-define KernelPackage/libertas-usb
-  $(call KernelPackage/mac80211/Default)
-  DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT
-  TITLE:=Marvell 88W8015 Wireless Driver
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/usb8xxx.ko
-  AUTOLOAD:=$(call AutoProbe,libertas usb8xxx)
-endef
+define KernelPackage/brcmsmac/config
+  if PACKAGE_kmod-brcmsmac
 
-define KernelPackage/libertas-sdio
-  $(call KernelPackage/mac80211/Default)
-  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml
-  TITLE:=Marvell 88W8686 Wireless Driver
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/libertas/libertas_sdio.ko
-  AUTOLOAD:=$(call AutoProbe,libertas libertas_sdio)
-endef
+	config BRCMSMAC_USE_FW_FROM_WL
+		bool "Use firmware extracted from broadcom proprietary driver"
+		default y
+		help
+		  Instead of using the official brcmsmac firmware a firmware
+		  version 666.2 extracted from the proprietary Broadcom driver
+		  is used. This is needed to get core rev 17 used in bcm4716
+		  to work.
 
-define KernelPackage/mac80211-hwsim
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=mac80211 HW simulation device
-  DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko
-  AUTOLOAD:=$(call AutoProbe,mac80211_hwsim)
+		  If unsure, say Y.
+
+  endif
 endef
 
-define KernelPackage/net-libipw
+
+define KernelPackage/brcmfmac
   $(call KernelPackage/mac80211/Default)
-  TITLE:=libipw for ipw2100 and ipw2200
-  DEPENDS:=@PCI_SUPPORT +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/libipw.ko
-  AUTOLOAD:=$(call AutoProbe,libipw)
+  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 +kmod-brcmutil \
+	+BRCMFMAC_PCIE:brcmfmac-firmware-pcie \
+	+BRCMFMAC_SDIO:kmod-mmc +BRCMFMAC_SDIO:brcmfmac-firmware-sdio \
+	+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)
 endef
 
-define KernelPackage/net-libipw/description
- Hardware independent IEEE 802.11 networking stack for ipw2100 and ipw2200.
+define KernelPackage/brcmfmac/description
+ Kernel module for Broadcom IEEE802.11n USB Wireless cards
 endef
 
-IPW2100_NAME:=ipw2100-fw
-IPW2100_VERSION:=1.3
-
-define Download/net-ipw2100
-  URL:=http://bughost.org/firmware/
-  FILE:=$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
-  MD5SUM=46aa75bcda1a00efa841f9707bbbd113
-endef
-$(eval $(call Download,net-ipw2100))
+define KernelPackage/brcmfmac/config
+  if PACKAGE_kmod-brcmfmac
 
-define KernelPackage/net-ipw2100
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Intel IPW2100 driver
-  DEPENDS:=@PCI_SUPPORT +kmod-net-libipw
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/ipw2100.ko
-  AUTOLOAD:=$(call AutoProbe,ipw2100)
-endef
+	config BRCMFMAC_SDIO
+		bool "Enable SDIO bus interface support"
+		default n
+		help
+		  Enable support for cards attached to an SDIO bus.
+		  Select this option only if you are sure that your
+		  board has a Broadcom wireless chip atacched to
+		  that bus.
 
-define KernelPackage/net-ipw2100/description
- Kernel support for Intel IPW2100
- Includes:
- - ipw2100
-endef
+	config BRCMFMAC_USB
+		bool "Enable USB bus interface support"
+		depends on USB_SUPPORT
+		default y
+		help
+		  Supported USB connected chipsets:
+		  BCM43235, BCM43236, BCM43238 (all in revision 3 only)
+		  BCM43143, BCM43242, BCM43566, BCM43569
 
-IPW2200_NAME:=ipw2200-fw
-IPW2200_VERSION:=3.1
+	config BRCMFMAC_PCIE
+		bool "Enable PCIE bus interface support"
+		depends on PCI_SUPPORT
+		default y
+		help
+		  Supported PCIe connected chipsets:
+		  BCM4354, BCM4356, BCM43567, BCM43570, BCM43602
 
-define Download/net-ipw2200
-  URL:=http://bughost.org/firmware/
-  FILE:=$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
-  MD5SUM=eaba788643c7cc7483dd67ace70f6e99
+  endif
 endef
-$(eval $(call Download,net-ipw2200))
 
-define KernelPackage/net-ipw2200
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Intel IPW2200 driver
-  DEPENDS:=@PCI_SUPPORT +kmod-net-libipw
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/ipw2200.ko
-  AUTOLOAD:=$(call AutoProbe,ipw2200)
-endef
 
-define KernelPackage/net-ipw2200/description
- Kernel support for Intel IPW2200
- Includes:
- - ipw2200
+define KernelPackage/carl9170
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Driver for Atheros AR9170 USB sticks
+  DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT +carl9170-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko
+  AUTOLOAD:=$(call AutoProbe,carl9170)
 endef
 
 
-define KernelPackage/net-hermes
+define KernelPackage/hermes
   $(call KernelPackage/mac80211/Default)
   TITLE:=Hermes 802.11b chipset support
-  DEPENDS:=@PCI_SUPPORT||PCMCIA_SUPPORT +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco.ko
+  DEPENDS:=@PCI_SUPPORT||PCMCIA_SUPPORT +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT +kmod-crypto-michael-mic
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco.ko
   AUTOLOAD:=$(call AutoProbe,orinoco)
 endef
 
-define KernelPackage/net-hermes/description
+define KernelPackage/hermes/description
  Kernel support for Hermes 802.11b chipsets
 endef
 
-define KernelPackage/net-hermes-pci
+define KernelPackage/hermes-pci
   $(call KernelPackage/mac80211/Default)
   TITLE:=Intersil Prism 2.5 PCI support
-  DEPENDS:=@PCI_SUPPORT +kmod-net-hermes
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_pci.ko
+  DEPENDS:=@PCI_SUPPORT +kmod-hermes
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco_pci.ko
   AUTOLOAD:=$(call AutoProbe,orinoco_pci)
 endef
 
-define KernelPackage/net-hermes-pci/description
+define KernelPackage/hermes-pci/description
  Kernel modules for Intersil Prism 2.5 PCI support
 endef
 
-define KernelPackage/net-hermes-plx
+define KernelPackage/hermes-plx
   $(call KernelPackage/mac80211/Default)
   TITLE:=PLX9052 based PCI adaptor
-  DEPENDS:=@PCI_SUPPORT +kmod-net-hermes
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_plx.ko
+  DEPENDS:=@PCI_SUPPORT +kmod-hermes
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco_plx.ko
   AUTOLOAD:=$(call AutoProbe,orinoco_plx)
 endef
 
-define KernelPackage/net-hermes-plx/description
+define KernelPackage/hermes-plx/description
  Kernel modules for Hermes in PLX9052 based PCI adaptors
 endef
 
-define KernelPackage/net-hermes-pcmcia
+define KernelPackage/hermes-pcmcia
   $(call KernelPackage/mac80211/Default)
   TITLE:=Hermes based PCMCIA adaptors
-  DEPENDS:=@PCMCIA_SUPPORT +kmod-net-hermes @BROKEN
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_cs.ko
+  DEPENDS:=@PCMCIA_SUPPORT +kmod-hermes @BROKEN
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/orinoco/orinoco_cs.ko
   AUTOLOAD:=$(call AutoProbe,orinoco_cs)
 endef
 
-define KernelPackage/net-hermes-pcmcia/description
+define KernelPackage/hermes-pcmcia/description
  Kernel modules for Hermes based PCMCIA adaptors
 endef
 
-define KernelPackage/iwlagn
+
+define KernelPackage/iwlwifi
   $(call KernelPackage/mac80211/Default)
-  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT
+  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +iwlwifi-firmware
   TITLE:=Intel AGN Wireless support
   FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlwifi.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/dvm/iwldvm.ko
-  AUTOLOAD:=$(call AutoProbe,iwlwifi iwldvm)
+	$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/dvm/iwldvm.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/mvm/iwlmvm.ko
+  AUTOLOAD:=$(call AutoProbe,iwlwifi iwldvm iwlmvm)
   MENU:=1
 endef
 
-define KernelPackage/iwlagn/description
- iwlagn kernel module for Intel 5000/5150/1000/6000/6050/6005/6030/100 support
-endef
-
-define KernelPackage/iwlagn/config
-  if PACKAGE_kmod-iwlagn
-
-	config IWL5000_FW
-		bool "Intel 5000 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
-
-	config IWL5150_FW
-		bool "Intel 5150 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Wireless WiFi 5150AGN
-
-	config IWL1000_FW
-		bool "Intel 1000 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Wireless-N 1000
-
-	config IWL6000_FW
-		bool "Intel 6000 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Ultimate-N 6300 and Advanced-N 6200
-
-	config IWL6050_FW
-		bool "Intel 6050 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Advanced-N + WiMAX 6250 and Wireless-N + WiMAX 6150
-
-	config IWL6005_FW
-		bool "Intel 6005 Firmware"
-		default y
+define KernelPackage/iwlwifi/description
+ iwlwifi kernel module for
+ Intel Wireless WiFi Link 6250AGN Adapter
+ Intel 6000 Series Wi-Fi Adapters (6200AGN and 6300AGN)
+ Intel WiFi Link 1000BGN
+ Intel Wireless WiFi 5150AGN
+ Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
+ Intel 6005 Series Wi-Fi Adapters
+ Intel 6030 Series Wi-Fi Adapters
+ Intel Wireless WiFi Link 6150BGN 2 Adapter
+ Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
+ Intel 2000 Series Wi-Fi Adapters
+ Intel 7260 Wi-Fi Adapter
+ Intel 3160 Wi-Fi Adapter
+ Intel 7265 Wi-Fi Adapter
+ Intel 8260 Wi-Fi Adapter
+ Intel 3165 Wi-Fi Adapter
+endef
+
+define KernelPackage/iwlwifi/config
+  if PACKAGE_kmod-iwlwifi
+
+	config PACKAGE_IWLWIFI_DEBUG
+		bool "Enable full debugging output in the iwlwifi driver"
+		default n
 		help
-		  Download and install firmware for:
-		    Intel Centrino Advanced-N 6205
+		  This option will enable debug tracing output for the iwlwifi drivers
 
-	config IWL6030_FW
-		bool "Intel 6030 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235
+		  This will result in the kernel module being ~100k larger.  You can
+		  control which debug output is sent to the kernel log by setting the
+		  value in
 
-	config IWL7260_FW
-		bool "Intel 7260 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Dual Band Wireless-N 7260 and Intel Dual Band Wireless-AC 7260
+			/sys/module/iwlwifi/parameters/debug
 
-	config IWL7265_FW
-		bool "Intel 7265 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Wireless 7265
+		  This entry will only exist if this option is enabled.
 
-	config IWL100_FW
-		bool "Intel 100 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Wireless-N 100
+		  To set a value, simply echo an 8-byte hex value to the same file:
 
-	config IWL2000_FW
-		bool "Intel 2000 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Wireless-N 2200
+			  % echo 0x43fff > /sys/module/iwlwifi/parameters/debug
 
-	config IWL2030_FW
-		bool "Intel 2030 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Wireless-N 2230
+		  You can find the list of debug mask values in:
+			  drivers/net/wireless/intel/iwlwifi/iwl-debug.h
 
-	config IWL105_FW
-		bool "Intel 105 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Centrino Wireless-N 105
+		  If this is your first time using this driver, you should say Y here
+		  as the debug information can assist others in helping you resolve
+		  any problems you may encounter.
 
-	config IWL135_FW
-		bool "Intel 135 Firmware"
-		default y
+	config PACKAGE_IWLWIFI_DEBUGFS
+	        bool "iwlwifi debugfs support"
+		depends on PACKAGE_MAC80211_DEBUGFS
+		default n
 		help
-		  Download and install firmware for:
-		    Intel Centrino Wireless-N 135
+		  Enable creation of debugfs files for the iwlwifi drivers. This
+		  is a low-impact option that allows getting insight into the
+		  driver's state at runtime.
 
-	config IWL3160_FW
-		bool "Intel 3160 Firmware"
-		default y
-		help
-		  Download and install firmware for:
-		    Intel Wireless 3160
   endif
 endef
 
@@ -942,7 +834,7 @@ define KernelPackage/iwl-legacy
   $(call KernelPackage/mac80211/Default)
   DEPENDS:= +kmod-mac80211 @PCI_SUPPORT
   TITLE:=Intel legacy Wireless support
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwlegacy.ko
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlegacy/iwlegacy.ko
   AUTOLOAD:=$(call AutoProbe,iwlegacy)
 endef
 
@@ -952,9 +844,9 @@ endef
 
 define KernelPackage/iwl3945
   $(call KernelPackage/mac80211/Default)
-  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy
+  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy +iwl3945-firmware
   TITLE:=Intel iwl3945 Wireless support
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl3945.ko
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlegacy/iwl3945.ko
   AUTOLOAD:=$(call AutoProbe,iwl3945)
 endef
 
@@ -964,9 +856,9 @@ endef
 
 define KernelPackage/iwl4965
   $(call KernelPackage/mac80211/Default)
-  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy +@DRIVER_11N_SUPPORT
+  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy +@DRIVER_11N_SUPPORT +iwl4965-firmware
   TITLE:=Intel iwl4965 Wireless support
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl4965.ko
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlegacy/iwl4965.ko
   AUTOLOAD:=$(call AutoProbe,iwl4965)
 endef
 
@@ -975,557 +867,576 @@ define KernelPackage/iwl4965/description
 endef
 
 
-define KernelPackage/mwl8k
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards
-  URL:=http://wireless.kernel.org/en/users/Drivers/mwl8k
-  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mwl8k.ko
-  AUTOLOAD:=$(call AutoProbe,mwl8k)
-endef
-
-define KernelPackage/mwl8k/description
- Kernel modules for Marvell TOPDOG 802.11 Wireless cards
-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
-  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT
-  FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/mwifiex/mwifiex.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/mwifiex/mwifiex_pcie.ko
-  AUTOLOAD:=$(call AutoProbe,mwifiex_pcie)
-endef
-
-define KernelPackage/mwifiex-pcie/description
- Kernel modules for Marvell 802.11n/802.11ac PCIe Wireless cards
-endef
-
-
-define KernelPackage/wlcore
+define KernelPackage/lib80211
   $(call KernelPackage/mac80211/Default)
-  TITLE:=TI common driver part
-  DEPENDS+= @TARGET_omap +kmod-mac80211 +@DRIVER_11N_SUPPORT
+  TITLE:=802.11 Networking stack
+  DEPENDS:=+kmod-cfg80211
   FILES:= \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore.ko \
-	$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore_sdio.ko
-  AUTOLOAD:=$(call AutoProbe,wlcore wlcore_sdio)
-endef
-
-define KernelPackage/wlcore/description
- This module contains some common parts needed by TI Wireless drivers.
-endef
-
-define KernelPackage/wl12xx
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Driver for TI WL12xx
-  URL:=http://wireless.kernel.org/en/users/Drivers/wl12xx
-  DEPENDS+= +kmod-wlcore
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl12xx/wl12xx.ko
-  AUTOLOAD:=$(call AutoProbe,wl12xx)
-endef
-
-define KernelPackage/wl12xx/description
- Kernel modules for TI WL12xx
-endef
-
-define KernelPackage/wl18xx
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Driver for TI WL18xx
-  URL:=http://wireless.kernel.org/en/users/Drivers/wl18xx
-  DEPENDS+= +kmod-wlcore
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl18xx/wl18xx.ko
-  AUTOLOAD:=$(call AutoProbe,wl18xx)
-endef
-
-define KernelPackage/wl18xx/description
- Kernel modules for TI WL18xx
-endef
-
-
-#Broadcom firmware
-ifneq ($(CONFIG_B43_FW_6_30),)
-  PKG_B43_FWV4_NAME:=broadcom-wl
-  PKG_B43_FWV4_VERSION:=6.30.163.46
-  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).wl_apsta.o
-  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
-  PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
-  PKG_B43_FWV4_MD5SUM:=6fe97e9368d25342a1ab943d3cf3496d
-else
-ifneq ($(CONFIG_B43_FW_5_10),)
-  PKG_B43_FWV4_NAME:=broadcom-wl
-  PKG_B43_FWV4_VERSION:=5.10.56.27.3
-  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta/wl_prebuilt.o
-  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)_mipsel.tar.bz2
-  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
-  PKG_B43_FWV4_MD5SUM:=3363e3a6b3d9d73c49dea870c7834eac
-else
-ifneq ($(CONFIG_B43_FW_4_178),)
-  PKG_B43_FWV4_NAME:=broadcom-wl
-  PKG_B43_FWV4_VERSION:=4.178.10.4
-  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
-  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
-  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
-  PKG_B43_FWV4_MD5SUM:=14477e8cbbb91b11896affac9b219fdb
-else
-ifneq ($(CONFIG_B43_FW_5_100_138),)
-  PKG_B43_FWV4_NAME:=broadcom-wl
-  PKG_B43_FWV4_VERSION:=5.100.138
-  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/linux/wl_apsta.o
-  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
-  PKG_B43_FWV4_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
-  PKG_B43_FWV4_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555
-else
-  PKG_B43_FWV4_NAME:=broadcom-wl
-  PKG_B43_FWV4_VERSION:=4.150.10.5
-  PKG_B43_FWV4_OBJECT:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION)/driver/wl_apsta_mimo.o
-  PKG_B43_FWV4_SOURCE:=$(PKG_B43_FWV4_NAME)-$(PKG_B43_FWV4_VERSION).tar.bz2
-  PKG_B43_FWV4_SOURCE_URL:=http://mirror2.openwrt.org/sources/
-  PKG_B43_FWV4_MD5SUM:=0c6ba9687114c6b598e8019e262d9a60
-endif
-endif
-endif
-endif
-ifneq ($(CONFIG_B43_OPENFIRMWARE),)
-  PKG_B43_FWV4_NAME:=broadcom-wl
-  PKG_B43_FWV4_VERSION:=5.2
-  PKG_B43_FWV4_OBJECT:=openfwwf-$(PKG_B43_FWV4_VERSION)
-  PKG_B43_FWV4_SOURCE:=openfwwf-$(PKG_B43_FWV4_VERSION).tar.gz
-  PKG_B43_FWV4_SOURCE_URL:=http://www.ing.unibs.it/openfwwf/firmware/
-  PKG_B43_FWV4_MD5SUM:=e045a135453274e439ae183f8498b0fa
-endif
-
-
-PKG_B43_FWV3_NAME:=wl_apsta
-PKG_B43_FWV3_VERSION:=3.130.20.0
-PKG_B43_FWV3_SOURCE:=$(PKG_B43_FWV3_NAME)-$(PKG_B43_FWV3_VERSION).o
-PKG_B43_FWV3_SOURCE_URL:=http://downloads.openwrt.org/sources/
-PKG_B43_FWV3_MD5SUM:=e08665c5c5b66beb9c3b2dd54aa80cb3
-
-define Download/b43
-  FILE:=$(PKG_B43_FWV4_SOURCE)
-  URL:=$(PKG_B43_FWV4_SOURCE_URL)
-  MD5SUM:=$(PKG_B43_FWV4_MD5SUM)
+	$(PKG_BUILD_DIR)/net/wireless/lib80211.ko \
+	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_wep.ko \
+	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_ccmp.ko \
+	$(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_tkip.ko
+  AUTOLOAD:=$(call AutoProbe, \
+	lib80211 \
+	lib80211_crypt_wep \
+	lib80211_crypt_ccmp \
+	lib80211_crypt_tkip \
+  )
 endef
-$(eval $(call Download,b43))
 
-define Download/b43legacy
-  FILE:=$(PKG_B43_FWV3_SOURCE)
-  URL:=$(PKG_B43_FWV3_SOURCE_URL)
-  MD5SUM:=$(PKG_B43_FWV3_MD5SUM)
+define KernelPackage/lib80211/description
+ Kernel modules for 802.11 Networking stack
+ Includes:
+ - lib80211
+ - lib80211_crypt_wep
+ - lib80211_crypt_tkip
+ - lib80211_crytp_ccmp
 endef
-$(eval $(call Download,b43legacy))
 
 
-define KernelPackage/b43
+define KernelPackage/libipw
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Broadcom 43xx wireless support
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/b43
-  KCONFIG:= \
-  	CONFIG_HW_RANDOM=y
-  # Depend on PCI_SUPPORT to make sure we can select kmod-bcma or kmod-ssb
-  DEPENDS += \
-	@PCI_SUPPORT +kmod-mac80211 \
-	$(if $(CONFIG_PACKAGE_B43_USE_SSB),+kmod-ssb) \
-	$(if $(CONFIG_PACKAGE_B43_USE_BCMA),+kmod-bcma)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/b43/b43.ko
-  AUTOLOAD:=$(call AutoProbe,b43)
-  MENU:=1
-endef
-
-define KernelPackage/b43/config
-
-config PACKAGE_B43_USE_SSB
-	select PACKAGE_kmod-ssb
-	tristate
-	depends on !TARGET_brcm47xx && !TARGET_brcm63xx
-	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA_AND_SSB
-	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_SSB
-
-config PACKAGE_B43_USE_BCMA
-	select PACKAGE_kmod-bcma
-	tristate
-	depends on !TARGET_brcm47xx && !TARGET_bcm53xx
-	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA_AND_SSB
-	default PACKAGE_kmod-b43 if PACKAGE_B43_BUSES_BCMA
-
-  if PACKAGE_kmod-b43
+  TITLE:=libipw for ipw2100 and ipw2200
+  DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-crypto-core +kmod-crypto-arc4 +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/libipw.ko
+  AUTOLOAD:=$(call AutoProbe,libipw)
+endef
 
-	choice
-		prompt "b43 firmware version"
-		default B43_FW_5_100_138
-		help
-		  This option allows you to select the version of the b43 firmware.
+define KernelPackage/libipw/description
+ Hardware independent IEEE 802.11 networking stack for ipw2100 and ipw2200.
+endef
 
-	config B43_FW_4_150
-		bool "Firmware 410.2160 from driver 4.150.10.5 (old stable)"
-		help
-		  Old stable firmware for BCM43xx devices.
+IPW2100_NAME:=ipw2100-fw
+IPW2100_VERSION:=1.3
 
-		  If unsure, select this.
+define Download/ipw2100
+  URL:=http://bughost.org/firmware/
+  FILE:=$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
+  MD5SUM=46aa75bcda1a00efa841f9707bbbd113
+endef
+$(eval $(call Download,ipw2100))
 
-	config B43_FW_4_178
-		bool "Firmware 478.104 from driver 4.178.10.4"
-		help
-		  Older firmware for BCM43xx devices.
+define KernelPackage/ipw2100
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Intel IPW2100 driver
+  DEPENDS:=@PCI_SUPPORT +kmod-libipw
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/ipw2100.ko
+  AUTOLOAD:=$(call AutoProbe,ipw2100)
+endef
 
-		  If unsure, select the "stable" firmware.
+define KernelPackage/ipw2100/description
+ Kernel support for Intel IPW2100
+ Includes:
+ - ipw2100
+endef
 
-	config B43_FW_5_10
-		bool "Firmware 508.1084 from driver 5.10.56.27"
-		help
-		  Older firmware for BCM43xx devices.
+IPW2200_NAME:=ipw2200-fw
+IPW2200_VERSION:=3.1
 
-		  If unsure, select the "stable" firmware.
+define Download/ipw2200
+  URL:=http://bughost.org/firmware/
+  FILE:=$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
+  MD5SUM=eaba788643c7cc7483dd67ace70f6e99
+endef
+$(eval $(call Download,ipw2200))
 
-	config B43_FW_5_100_138
-		bool "Firmware 666.2 from driver 5.100.138 (stable)"
-		help
-		  The currently default firmware for BCM43xx devices.
+define KernelPackage/ipw2200
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Intel IPW2200 driver
+  DEPENDS:=@PCI_SUPPORT +kmod-libipw
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/ipw2200.ko
+  AUTOLOAD:=$(call AutoProbe,ipw2200)
+endef
 
-		  This firmware currently gets most of the testing and is needed for some N-PHY devices.
+define KernelPackage/ipw2200/description
+ Kernel support for Intel IPW2200
+ Includes:
+ - ipw2200
+endef
 
-		  If unsure, select the this firmware.
 
-	config B43_FW_6_30
-		bool "Firmware 784.2 from driver 6.30.163.46 (experimental)"
-		help
-		  Newer experimental firmware for BCM43xx devices.
+define KernelPackage/libertas-usb
+  $(call KernelPackage/mac80211/Default)
+  DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-usb-firmware
+  TITLE:=Marvell 88W8015 Wireless Driver
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/usb8xxx.ko
+  AUTOLOAD:=$(call AutoProbe,libertas usb8xxx)
+endef
 
-		  This firmware is mostly untested.
+define KernelPackage/libertas-sdio
+  $(call KernelPackage/mac80211/Default)
+  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-sdio-firmware
+  TITLE:=Marvell 88W8686 Wireless Driver
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas_sdio.ko
+  AUTOLOAD:=$(call AutoProbe,libertas libertas_sdio)
+endef
 
-		  If unsure, select the "stable" firmware.
+define KernelPackage/libertas-spi
+  $(call KernelPackage/mac80211/Default)
+  SUBMENU:=Wireless Drivers
+  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-spi-firmware
+  KCONFIG := \
+	CONFIG_SPI=y \
+	CONFIG_SPI_MASTER=y
+  TITLE:=Marvell 88W8686 SPI Wireless Driver
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas_spi.ko
+  AUTOLOAD:=$(call AutoProbe,libertas libertas_spi)
+endef
 
-	config B43_OPENFIRMWARE
-		bool "Open FirmWare for WiFi networks"
-		help
-		  Opensource firmware for BCM43xx devices.
+define KernelPackage/mac80211-hwsim
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=mac80211 HW simulation device
+  DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko
+  AUTOLOAD:=$(call AutoProbe,mac80211_hwsim)
+endef
 
-		  Do _not_ select this, unless you know what you are doing.
-		  The Opensource firmware is not suitable for embedded devices, yet.
-		  It does not support QoS, which is bad for AccessPoints.
-		  It does not support hardware crypto acceleration, which is a showstopper
-		  for embedded devices with low CPU resources.
 
-		  If unsure, select the "stable" firmware.
+define KernelPackage/mt7601u
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=MT7601U-based USB dongles Wireless Driver
+  DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT @USB_SUPPORT +kmod-usb-core +mt7601u-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
+  AUTOLOAD:=$(call AutoProbe,mt7601u)
+endef
 
-	endchoice
 
-	config B43_FW_SQUASH
-		bool "Remove unnecessary firmware files"
-		depends on !B43_OPENFIRMWARE
-		default y
-		help
-		  This options allows you to remove unnecessary b43 firmware files
-		  from the final rootfs image. This can reduce the rootfs size by
-		  up to 200k.
+define KernelPackage/mwl8k
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards
+  URL:=http://wireless.kernel.org/en/users/Drivers/mwl8k
+  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +mwl8k-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwl8k.ko
+  AUTOLOAD:=$(call AutoProbe,mwl8k)
+endef
 
-		  If unsure, say Y.
+define KernelPackage/mwl8k/description
+ Kernel modules for Marvell TOPDOG 802.11 Wireless cards
+endef
 
-	config B43_FW_SQUASH_COREREVS
-		string "Core revisions to include"
-		depends on B43_FW_SQUASH
-		default "5,6,7,8,9,10,11,13,15" if TARGET_brcm47xx_legacy
-		default "16,28,29,30" if TARGET_brcm47xx_mips74k
-		default "5,6,7,8,9,10,11,13,15,16,28,29,30"
-		help
-		  This is a comma seperated list of core revision numbers.
 
-		  Example (keep files for rev5 only):
-		    5
+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
+  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +mwifiex-pcie-firmware
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex_pcie.ko
+  AUTOLOAD:=$(call AutoProbe,mwifiex_pcie)
+endef
 
-		  Example (keep files for rev5 and rev11):
-		    5,11
+define KernelPackage/mwifiex-pcie/description
+ Kernel modules for Marvell 802.11n/802.11ac PCIe Wireless cards
+endef
 
-	config B43_FW_SQUASH_PHYTYPES
-		string "PHY types to include"
-		depends on B43_FW_SQUASH
-		default "G,N,LP" if TARGET_brcm47xx_legacy
-		default "N,HT" if TARGET_brcm47xx_mips74k
-		default "G,N,LP,HT"
-		help
-		  This is a comma seperated list of PHY types:
-		    A  => A-PHY
-		    AG => Dual A-PHY G-PHY
-		    G  => G-PHY
-		    LP => LP-PHY
-		    N  => N-PHY
-		    HT  => HT-PHY
-		    LCN  => LCN-PHY
-		    LCN40  => LCN40-PHY
-		    AC  => AC-PHY
 
-		  Example (keep files for G-PHY only):
-		    G
+# Prism54 drivers
+P54PCIFW:=2.13.12.0.arm
+P54USBFW:=2.13.24.0.lm87.arm
+P54SPIFW:=2.13.0.0.a.13.14.arm
 
-		  Example (keep files for G-PHY and N-PHY):
-		    G,N
+define Download/p54usb
+  FILE:=$(P54USBFW)
+  URL:=http://daemonizer.de/prism54/prism54-fw/fw-usb
+  MD5SUM:=8e8ab005a4f8f0123bcdc51bc25b47f6
+endef
+$(eval $(call Download,p54usb))
 
-	choice
-		prompt "Supported buses"
-		default PACKAGE_B43_BUSES_BCMA_AND_SSB
-		help
-		  This allows choosing buses that b43 should support.
+define Download/p54pci
+  FILE:=$(P54PCIFW)
+  URL:=http://daemonizer.de/prism54/prism54-fw/fw-softmac
+  MD5SUM:=ff7536af2092b1c4b21315bd103ef4c4
+endef
+$(eval $(call Download,p54pci))
 
-	config PACKAGE_B43_BUSES_BCMA_AND_SSB
-		depends on !TARGET_brcm47xx_legacy && !TARGET_brcm47xx_mips74k && !TARGET_bcm53xx
-		bool "BCMA and SSB"
+define Download/p54spi
+  FILE:=$(P54SPIFW)
+  URL:=http://daemonizer.de/prism54/prism54-fw/stlc4560
+  MD5SUM:=42661f8ecbadd88012807493f596081d
+endef
+$(eval $(call Download,p54spi))
 
-	config PACKAGE_B43_BUSES_BCMA
-		depends on !TARGET_brcm47xx_legacy
-		bool "BCMA only"
+define KernelPackage/p54/Default
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Prism54 Drivers
+endef
 
-	config PACKAGE_B43_BUSES_SSB
-		depends on !TARGET_brcm47xx_mips74k && !TARGET_bcm53xx
-		bool "SSB only"
+define KernelPackage/p54/description
+  Kernel module for Prism54 chipsets (mac80211)
+endef
 
-	endchoice
+define KernelPackage/p54-common
+  $(call KernelPackage/p54/Default)
+  DEPENDS+= @PCI_SUPPORT||@USB_SUPPORT||@TARGET_omap24xx +kmod-mac80211 +kmod-lib-crc-ccitt
+  TITLE+= (COMMON)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54common.ko
+endef
 
-	config PACKAGE_B43_DEBUG
-		bool "Enable debug output and debugfs for b43"
-		default n
-		help
-		  Enable additional debug output and runtime sanity checks for b43
-		  and enables the debugfs interface.
+define KernelPackage/p54-pci
+  $(call KernelPackage/p54/Default)
+  TITLE+= (PCI)
+  DEPENDS+= @PCI_SUPPORT +kmod-p54-common
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54pci.ko
+  AUTOLOAD:=$(call AutoProbe,p54pci)
+endef
 
-		  If unsure, say N.
+define KernelPackage/p54-usb
+  $(call KernelPackage/p54/Default)
+  TITLE+= (USB)
+  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-p54-common
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54usb.ko
+  AUTOLOAD:=$(call AutoProbe,p54usb)
+endef
 
-	config PACKAGE_B43_PIO
-		bool "Enable support for PIO transfer mode"
-		default n
-		help
-		  Enable support for using PIO instead of DMA. Unless you have DMA
-		  transfer problems you don't need this.
+define KernelPackage/p54-spi
+  $(call KernelPackage/p54/Default)
+  TITLE+= (SPI)
+  DEPENDS+= @TARGET_omap24xx +kmod-p54-common
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54spi.ko
+  AUTOLOAD:=$(call AutoProbe,p54spi)
+endef
 
-		  If unsure, say N.
+define KernelPackage/rt2x00/Default
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Ralink Drivers for RT2x00 cards
+endef
 
-	config PACKAGE_B43_PHY_G
-		bool "Enable support for G-PHYs"
-		default n if TARGET_brcm47xx_mips74k
-		default y
-		help
-		  Enable support for G-PHY. This includes support for the following devices:
-		  PCI: BCM4306, BCM4311, BCM4318
-		  SoC: BCM5352E, BCM4712
+define KernelPackage/rt2x00-lib
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-mac80211 +kmod-lib-crc-itu-t
+  TITLE+= (LIB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2x00lib.ko
+  MENU:=1
+endef
 
-		  If unsure, say Y.
+define KernelPackage/rt2x00-lib/config
+  if PACKAGE_kmod-rt2x00-lib
 
-	config PACKAGE_B43_PHY_N
-		bool "Enable support for N-PHYs"
-		default y
+	config PACKAGE_RT2X00_LIB_DEBUGFS
+		bool "Enable rt2x00 debugfs support"
+		depends on PACKAGE_MAC80211_DEBUGFS
 		help
-		  Enable support for N-PHY. This includes support for the following devices:
-		  PCI: BCM4321, BCM4322, BCM43222, BCM43224, BCM43225
-		  SoC: BCM4716, BCM4717, BCM4718
+		  Enable creation of debugfs files for the rt2x00 drivers.
+		  These debugfs files support both reading and writing of the
+		  most important register types of the rt2x00 hardware.
 
-		  Currently only 11g speed is available.
+	config PACKAGE_RT2X00_DEBUG
+		bool "Enable rt2x00 debug output"
+		help
+		  Enable debugging output for all rt2x00 modules
 
-		  If unsure, say Y.
+  endif
+endef
 
-	config PACKAGE_B43_PHY_LP
-		bool "Enable support for LP-PHYs"
-		default n if TARGET_brcm47xx_mips74k
-		default y
-		help
-		  Enable support for LP-PHY. This includes support for the following devices:
-		  PCI: BCM4312
-		  SoC: BCM5354
+define KernelPackage/rt2x00-mmio
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-eeprom-93cx6
+  HIDDEN:=1
+  TITLE+= (MMIO)
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.ko
+endef
 
-		  If unsure, say Y.
+define KernelPackage/rt2x00-pci
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-mmio +kmod-rt2x00-lib
+  HIDDEN:=1
+  TITLE+= (PCI)
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2x00pci.ko
+  AUTOLOAD:=$(call AutoProbe,rt2x00pci)
+endef
 
-	config PACKAGE_B43_PHY_HT
-		bool "Enable support for HT-PHYs"
-		default n if TARGET_brcm47xx_legacy
-		default y
-		help
-		  Enable support for HT-PHY. This includes support for the following devices:
-		  PCI: BCM4331
+define KernelPackage/rt2x00-usb
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-lib +kmod-usb-core
+  HIDDEN:=1
+  TITLE+= (USB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2x00usb.ko
+  AUTOLOAD:=$(call AutoProbe,rt2x00usb)
+endef
 
-		  Currently only 11g speed is available.
+define KernelPackage/rt2800-lib
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-lib-crc-ccitt +@DRIVER_11N_SUPPORT
+  HIDDEN:=1
+  TITLE+= (rt2800 LIB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2800lib.ko
+endef
 
-		  If unsure, say Y.
+define KernelPackage/rt2400-pci
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
+  TITLE+= (RT2400 PCI)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2400pci.ko
+  AUTOLOAD:=$(call AutoProbe,rt2400pci)
+endef
 
-	config PACKAGE_B43_PHY_LCN
-		bool "Enable support for LCN-PHYs"
-		depends on BROKEN
-		default n
-		help
-		  Currently broken.
+define KernelPackage/rt2500-pci
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci
+  TITLE+= (RT2500 PCI)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2500pci.ko
+  AUTOLOAD:=$(call AutoProbe,rt2500pci)
+endef
 
-		  If unsure, say N.
+define KernelPackage/rt2500-usb
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb
+  TITLE+= (RT2500 USB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2500usb.ko
+  AUTOLOAD:=$(call AutoProbe,rt2500usb)
+endef
 
-  endif
+define KernelPackage/rt2800-mmio
+$(call KernelPackage/rt2x00/Default)
+  TITLE += (RT28xx/RT3xxx MMIO)
+  DEPENDS += +kmod-rt2800-lib +kmod-rt2x00-mmio
+  HIDDEN:=1
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2800mmio.ko
 endef
 
-define KernelPackage/b43/description
-Kernel module for Broadcom 43xx wireless support (mac80211 stack) new
+define KernelPackage/rt2800-soc
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS += @(TARGET_ramips_rt288x||TARGET_ramips_rt305x||TARGET_ramips_rt3883||TARGET_ramips_mt7620) +kmod-rt2800-mmio +kmod-rt2800-lib
+  TITLE += (RT28xx/RT3xxx SoC)
+  FILES := \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2x00soc.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2800soc.ko
+  AUTOLOAD:=$(call AutoProbe,rt2800soc)
 endef
 
-define KernelPackage/b43legacy
-  $(call KernelPackage/mac80211/Default)
-  TITLE:=Broadcom 43xx-legacy wireless support
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/b43
-  KCONFIG:= \
-  	CONFIG_HW_RANDOM=y
-  DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/b43legacy/b43legacy.ko
-  AUTOLOAD:=$(call AutoProbe,b43legacy)
-  MENU:=1
+define KernelPackage/rt2800-pci
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci +kmod-rt2800-lib +kmod-rt2800-mmio +rt2800-pci-firmware
+  TITLE+= (RT2860 PCI)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2800pci.ko
+  AUTOLOAD:=$(call AutoProbe,rt2800pci)
 endef
 
-define KernelPackage/b43legacy/config
-  if PACKAGE_kmod-b43legacy
+define KernelPackage/rt2800-usb
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb +kmod-rt2800-lib +kmod-lib-crc-ccitt +rt2800-usb-firmware
+  TITLE+= (RT2870 USB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt2800usb.ko
+  AUTOLOAD:=$(call AutoProbe,rt2800usb)
+endef
 
-	config B43LEGACY_FW_SQUASH
-		bool "Remove unnecessary firmware files"
-		default y
-		help
-		  This options allows you to remove unnecessary b43legacy firmware files
-		  from the final rootfs image. This can reduce the rootfs size by
-		  up to 50k.
 
-		  If unsure, say Y.
+define KernelPackage/rt61-pci
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci +rt61-pci-firmware
+  TITLE+= (RT2x61 PCI)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt61pci.ko
+  AUTOLOAD:=$(call AutoProbe,rt61pci)
+endef
 
-	config B43LEGACY_FW_SQUASH_COREREVS
-		string "Core revisions to include"
-		depends on B43LEGACY_FW_SQUASH
-		default "1,2,3,4"
-		help
-		  This is a comma seperated list of core revision numbers.
+define KernelPackage/rt73-usb
+  $(call KernelPackage/rt2x00/Default)
+  DEPENDS+= @USB_SUPPORT +kmod-rt2x00-usb +rt73-usb-firmware
+  TITLE+= (RT73 USB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ralink/rt2x00/rt73usb.ko
+  AUTOLOAD:=$(call AutoProbe,rt73usb)
+endef
 
-		  Example (keep files for rev4 only):
-		    4
 
-		  Example (keep files for rev2 and rev4):
-		    2,4
+define KernelPackage/rtl818x/Default
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek Drivers for RTL818x devices
+  URL:=http://wireless.kernel.org/en/users/Drivers/rtl8187
+  DEPENDS+= +kmod-eeprom-93cx6 +kmod-mac80211
+endef
 
-  endif
+define KernelPackage/rtl8180
+  $(call KernelPackage/rtl818x/Default)
+  DEPENDS+= @PCI_SUPPORT
+  TITLE+= (RTL8180 PCI)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl818x_pci.ko
+  AUTOLOAD:=$(call AutoProbe,rtl818x_pci)
 endef
 
-define KernelPackage/b43legacy/description
-Kernel module for Broadcom 43xx-legacy wireless support (mac80211 stack) new
+define KernelPackage/rtl8187
+$(call KernelPackage/rtl818x/Default)
+  DEPENDS+= @USB_SUPPORT +kmod-usb-core
+  TITLE+= (RTL8187 USB)
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8187.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8187)
 endef
 
+define KernelPackage/rtlwifi/config
+	config PACKAGE_RTLWIFI_DEBUG
+		bool "Realtek wireless debugging"
+		depends on PACKAGE_kmod-rtlwifi
+		help
+		  Say Y, if you want to debug realtek wireless drivers.
+
+endef
 
-define KernelPackage/brcmutil
+define KernelPackage/rtlwifi
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Broadcom IEEE802.11n common driver parts
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
-  DEPENDS+=@PCI_SUPPORT||USB_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmutil/brcmutil.ko
-  AUTOLOAD:=$(call AutoProbe,brcmutil)
-  MENU:=1
+  TITLE:=Realtek common driver part
+  DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT) +kmod-mac80211 +@DRIVER_11N_SUPPORT
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtlwifi.ko
+  HIDDEN:=1
 endef
 
-define KernelPackage/brcmutil/description
- This module contains some common parts needed by Broadcom Wireless drivers brcmsmac and brcmfmac.
+define KernelPackage/rtlwifi-pci
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek common driver part (PCI support)
+  DEPENDS+= @PCI_SUPPORT +kmod-rtlwifi
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl_pci.ko
+  AUTOLOAD:=$(call AutoProbe,rtl_pci)
+  HIDDEN:=1
 endef
 
-define KernelPackage/brcmutil/config
-  if PACKAGE_kmod-brcmutil
+define KernelPackage/rtlwifi-usb
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek common driver part (USB support)
+  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-rtlwifi
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl_usb.ko
+  AUTOLOAD:=$(call AutoProbe,rtl_usb)
+  HIDDEN:=1
+endef
 
-	config PACKAGE_BRCM80211_DEBUG
-		bool "Broadcom wireless driver debugging"
-		help
-		  Say Y, if you want to debug brcmsmac and brcmfmac wireless driver.
+define KernelPackage/rtl8192c-common
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8192CE/RTL8192CU common support module
+  DEPENDS+= +kmod-rtlwifi
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192c/rtl8192c-common.ko
+  HIDDEN:=1
+endef
 
-  endif
+define KernelPackage/rtl8192ce
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8192CE/RTL8188CE support
+  DEPENDS+= +kmod-rtlwifi-pci +kmod-rtl8192c-common +rtl8192ce-firmware
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/rtl8192ce.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8192ce)
 endef
 
-PKG_BRCMSMAC_FW_NAME:=broadcom-wl
-PKG_BRCMSMAC_FW_VERSION:=5.100.138
-PKG_BRCMSMAC_FW_OBJECT:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION)/linux/wl_apsta.o
-PKG_BRCMSMAC_FW_SOURCE:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION).tar.bz2
-PKG_BRCMSMAC_FW_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/
-PKG_BRCMSMAC_FW_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555
+define KernelPackage/rtl8192se
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8192SE/RTL8191SE support
+  DEPENDS+= +kmod-rtlwifi-pci +rtl8192se-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192se/rtl8192se.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8192se)
+endef
 
-define Download/brcmsmac
-  FILE:=$(PKG_BRCMSMAC_FW_SOURCE)
-  URL:=$(PKG_BRCMSMAC_FW_SOURCE_URL)
-  MD5SUM:=$(PKG_BRCMSMAC_FW_MD5SUM)
+define KernelPackage/rtl8192de
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8192DE/RTL8188DE support
+  DEPENDS+= +kmod-rtlwifi-pci +rtl8192de-firmware
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192de/rtl8192de.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8192de)
 endef
-$(eval $(call Download,brcmsmac))
 
-define KernelPackage/brcmsmac
+define KernelPackage/rtl8192cu
   $(call KernelPackage/mac80211/Default)
-  TITLE:=Broadcom IEEE802.11n PCIe SoftMAC WLAN driver
-  URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211
-  DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT +!TARGET_brcm47xx:kmod-bcma +kmod-lib-cordic +kmod-lib-crc8 +kmod-brcmutil
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmsmac/brcmsmac.ko
-  AUTOLOAD:=$(call AutoProbe,brcmsmac)
-  MENU:=1
+  TITLE:=Realtek RTL8192CU/RTL8188CU support
+  DEPENDS+= +kmod-rtlwifi-usb +kmod-rtl8192c-common +rtl8192cu-firmware
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/rtl8192cu.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8192cu)
 endef
 
-define KernelPackage/brcmsmac/description
- Kernel module for Broadcom IEEE802.11n PCIe Wireless cards
+
+define KernelPackage/rtl8xxxu
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=alternative Realtek RTL8XXXU support
+  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-mac80211
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.ko
+  AUTOLOAD:=$(call AutoProbe,rtl8xxxu)
 endef
 
-define KernelPackage/brcmsmac/config
-  if PACKAGE_kmod-brcmsmac
+define KernelPackage/rtl8xxxu/description
+  This is an alternative driver for various Realtek RTL8XXX
+  parts written to utilize the Linux mac80211 stack.
+  The driver is known to work with a number of RTL8723AU,
+  RL8188CU, RTL8188RU, RTL8191CU, and RTL8192CU devices
 
-	config BRCMSMAC_USE_FW_FROM_WL
-		bool "Use firmware extracted from broadcom proprietary driver"
-		default y
-		help
-		  Instead of using the official brcmsmac firmware a firmware
-		  version 666.2 extracted from the proprietary Broadcom driver
-		  is used. This is needed to get core rev 17 used in bcm4716
-		  to work.
+  This driver is under development and has a limited feature
+  set. In particular it does not yet support 40MHz channels
+  and power management. However it should have a smaller
+  memory footprint than the vendor drivers and benetifs
+  from the in kernel mac80211 stack.
+
+  It can coexist with drivers from drivers/staging/rtl8723au,
+  drivers/staging/rtl8192u, and drivers/net/wireless/rtlwifi,
+  but you will need to control which module you wish to load.
 
-		  If unsure, say Y.
+  RTL8XXXU_UNTESTED is enabled
+  This option enables detection of Realtek 8723/8188/8191/8192 WiFi
+  USB devices which have not been tested directly by the driver
+  author or reported to be working by third parties.
 
-  endif
+  Please report your results!
 endef
 
 
-define KernelPackage/brcmfmac
+define KernelPackage/wlcore
   $(call KernelPackage/mac80211/Default)
-  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 +kmod-brcmutil +BRCMFMAC_SDIO:kmod-mmc +BRCMFMAC_USB:kmod-usb-core
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmfmac/brcmfmac.ko
-  AUTOLOAD:=$(call AutoProbe,brcmfmac)
+  TITLE:=TI common driver part
+  DEPENDS+= @TARGET_omap +kmod-mac80211 +@DRIVER_11N_SUPPORT
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wlcore/wlcore_sdio.ko
+  AUTOLOAD:=$(call AutoProbe,wlcore wlcore_sdio)
 endef
 
-define KernelPackage/brcmfmac/description
- Kernel module for Broadcom IEEE802.11n USB Wireless cards
+define KernelPackage/wlcore/description
+ This module contains some common parts needed by TI Wireless drivers.
 endef
 
-define KernelPackage/brcmfmac/config
-  if PACKAGE_kmod-brcmfmac
+define KernelPackage/wl12xx
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Driver for TI WL12xx
+  URL:=http://wireless.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)
+endef
 
-	config BRCMFMAC_SDIO
-		bool "Enable SDIO bus interface support"
-		default n
-		help
-		  Enable support for cards attached to an SDIO bus.
-		  Select this option only if you are sure that your
-		  board has a Broadcom wireless chip atacched to
-		  that bus.
+define KernelPackage/wl12xx/description
+ Kernel modules for TI WL12xx
+endef
 
-	config BRCMFMAC_USB
-		bool "Enable USB bus interface support"
-		depends on USB_SUPPORT
-		default y
-		help
-		  Supported USB connected chipsets:
-		  BCM43235, BCM43236, BCM43238 (all in revision 3 only)
-		  BCM43143, BCM43242, BCM43566, BCM43569
+define KernelPackage/wl18xx
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Driver for TI WL18xx
+  URL:=http://wireless.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)
+endef
 
-	config BRCMFMAC_PCIE
-		bool "Enable PCIE bus interface support"
-		depends on PCI_SUPPORT
-		default y
-		help
-		  Supported PCIe connected chipsets:
-		  BCM4354, BCM4356, BCM43567, BCM43570, BCM43602
+define KernelPackage/wl18xx/description
+ Kernel modules for TI WL18xx
+endef
 
-  endif
+
+ZD1211FW_NAME:=zd1211-firmware
+ZD1211FW_VERSION:=1.4
+define Download/zd1211rw
+  FILE:=$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
+  URL:=@SF/zd1211/
+  MD5SUM:=19f28781d76569af8551c9d11294c870
+endef
+$(eval $(call Download,zd1211rw))
+
+define KernelPackage/zd1211rw
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Zydas ZD1211 support
+  DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-mac80211
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/zydas/zd1211rw/zd1211rw.ko
+  AUTOLOAD:=$(call AutoProbe,zd1211rw)
 endef
 
+
+
 config_package=$(if $(CONFIG_PACKAGE_kmod-$(1)),m)
 
 config-y:= \
@@ -1538,6 +1449,20 @@ config-y:= \
 	MAC80211_RC_MINSTREL_HT \
 	MAC80211_RC_MINSTREL_VHT \
 	MAC80211_RC_DEFAULT_MINSTREL \
+	WLAN_VENDOR_ADMTEK \
+	WLAN_VENDOR_ATH \
+	WLAN_VENDOR_ATMEL \
+	WLAN_VENDOR_BROADCOM \
+	WLAN_VENDOR_INTEL \
+	WLAN_VENDOR_INTERSIL \
+	WLAN_VENDOR_MARVELL \
+	WLAN_VENDOR_MEDIATEK \
+	WLAN_VENDOR_RALINK \
+	WLAN_VENDOR_REALTEK \
+	WLAN_VENDOR_RSI \
+	WLAN_VENDOR_ST \
+	WLAN_VENDOR_TI \
+	WLAN_VENDOR_ZYDAS \
 
 config-$(call config_package,cfg80211) += CFG80211
 
@@ -1554,6 +1479,16 @@ ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
 	ATH5K_DEBUG
 endif
 
+ifdef CONFIG_PACKAGE_MAC80211_TRACING
+  config-y += \
+	ATH10K_TRACING \
+	ATH6KL_TRACING \
+	ATH_TRACEPOINTS \
+	WIL6210_TRACING \
+	ATH5K_TRACER \
+	IWLWIFI_DEVICE_TRACING
+endif
+
 config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
 
 config-$(call config_package,ath) += ATH_CARDS ATH_COMMON
@@ -1602,6 +1537,8 @@ config-$(CONFIG_BRCMFMAC_PCIE) += BRCMFMAC_PCIE
 config-$(CONFIG_PACKAGE_BRCM80211_DEBUG) += BRCMDBG
 
 config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM
+config-$(call config_package,mt7601u) += MT7601U
+config-y += WL_MEDIATEK
 
 config-$(call config_package,rt2x00-lib) += RT2X00 RT2X00_LIB
 config-$(call config_package,rt2x00-pci) += RT2X00_LIB_PCI
@@ -1623,31 +1560,34 @@ config-$(call config_package,rt2800-pci) += RT2800PCI
 config-y += RT2800PCI_RT33XX RT2800PCI_RT35XX RT2800PCI_RT53XX RT2800PCI_RT3290
 
 config-$(call config_package,rt2800-usb) += RT2800USB
-config-y += RT2800USB_RT33XX RT2800USB_RT35XX RT2800USB_RT3573 RT2800USB_RT53XX RT2800USB_RT55XX
+config-y += RT2800USB_RT33XX RT2800USB_RT35XX RT2800USB_RT3573 RT2800USB_RT53XX RT2800USB_RT55XX RT2800USB_UNKNOWN
 
 config-$(call config_package,iwl-legacy) += IWLEGACY
 config-$(call config_package,iwl3945) += IWL3945
 config-$(call config_package,iwl4965) += IWL4965
-config-$(call config_package,iwlagn) += IWLWIFI IWLDVM
+config-$(call config_package,iwlwifi) += IWLWIFI IWLDVM IWLMVM
+config-$(CONFIG_PACKAGE_IWLWIFI_DEBUG)+= IWLWIFI_DEBUG
+config-$(CONFIG_PACKAGE_IWLWIFI_DEBUGFS)+= IWLWIFI_DEBUGFS
 
-config-$(call config_package,net-libipw) += LIBIPW
-config-$(call config_package,net-ipw2100) += IPW2100
-config-$(call config_package,net-ipw2200) += IPW2200
+config-$(call config_package,libipw) += LIBIPW
+config-$(call config_package,ipw2100) += IPW2100
+config-$(call config_package,ipw2200) += IPW2200
 
 config-$(call config_package,p54-common) += P54_COMMON
 config-$(call config_package,p54-pci) += P54_PCI
 config-$(call config_package,p54-usb) += P54_USB
 config-$(call config_package,p54-spi) += P54_SPI
 
-config-$(call config_package,net-hermes) += HERMES
-config-$(call config_package,net-hermes-pci) += PCI_HERMES
-config-$(call config_package,net-hermes-plx) += PLX_HERMES
-config-$(call config_package,net-hermes-pcmcia) += PCMCIA_HERMES
+config-$(call config_package,hermes) += HERMES
+config-$(call config_package,hermes-pci) += PCI_HERMES
+config-$(call config_package,hermes-plx) += PLX_HERMES
+config-$(call config_package,hermes-pcmcia) += PCMCIA_HERMES
 config-y += HERMES_PRISM
 
 config-$(call config_package,adm8211) += ADM8211
 config-$(call config_package,libertas-sdio) += LIBERTAS LIBERTAS_SDIO
 config-$(call config_package,libertas-usb) += LIBERTAS LIBERTAS_USB
+config-$(call config_package,libertas-spi) += LIBERTAS LIBERTAS_SPI
 config-$(call config_package,mwl8k) += MWL8K
 config-$(call config_package,mwifiex-pcie) += MWIFIEX MWIFIEX_PCIE
 config-$(call config_package,rtl8180) += RTL8180
@@ -1668,12 +1608,15 @@ config-$(call config_package,rtl8192de) += RTL8192DE
 config-$(call config_package,rtl8192cu) += RTL8192CU
 config-$(CONFIG_PACKAGE_RTLWIFI_DEBUG) += RTLWIFI_DEBUG
 
+config-$(call config_package,rtl8xxxu) += RTL8XXXU
+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)" \
-	EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include" \
+	EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS)" \
 	KLIB_BUILD="$(LINUX_DIR)" \
 	MODPROBE=true \
 	KLIB=$(TARGET_MODULES_DIR) \
@@ -1702,8 +1645,6 @@ define Build/Prepare
 	$(TAR) -C $(PKG_BUILD_DIR) -xzf $(DL_DIR)/$(IPW2100_NAME)-$(IPW2100_VERSION).tgz
 	$(TAR) -C $(PKG_BUILD_DIR) -xzf $(DL_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION).tgz
 	$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2
-	$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(PKG_LINUX_FIRMWARE_SOURCE)
-	$(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SOURCE)
 	rm -rf \
 		$(PKG_BUILD_DIR)/include/linux/ssb \
 		$(PKG_BUILD_DIR)/include/linux/bcma \
@@ -1715,7 +1656,8 @@ define Build/Prepare
 		$(PKG_BUILD_DIR)/include/linux/eeprom_93cx6.h \
 		$(PKG_BUILD_DIR)/include/linux/wl12xx.h \
 		$(PKG_BUILD_DIR)/include/linux/spi/libertas_spi.h \
-		$(PKG_BUILD_DIR)/include/net/ieee80211.h
+		$(PKG_BUILD_DIR)/include/net/ieee80211.h \
+		$(PKG_BUILD_DIR)/backport-include/linux/bcm47xx_nvram.h
 
 	echo 'compat-wireless-$(PKG_VERSION)-$(PKG_RELEASE)-$(REVISION)' > $(PKG_BUILD_DIR)/compat_version
 	$(CP) ./files/regdb.txt $(PKG_BUILD_DIR)/net/wireless/db.txt
@@ -1753,220 +1695,6 @@ define Build/InstallDev
 	rm -f $(1)/usr/include/mac80211-backport/linux/module.h
 endef
 
-define KernelPackage/libertas-usb/install
-	$(INSTALL_DIR) $(1)/lib/firmware/libertas
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8388_v9.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8682.bin \
-		$(1)/lib/firmware/libertas/
-endef
-
-define KernelPackage/libertas-sdio/install
-	$(INSTALL_DIR) $(1)/lib/firmware/libertas
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8385_helper.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8385.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v9_helper.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v9.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688_helper.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688.bin \
-		$(1)/lib/firmware/libertas
-endef
-
-define KernelPackage/cfg80211/install
-	$(INSTALL_DIR) $(1)/lib/wifi $(1)/lib/netifd/wireless
-	$(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
-	$(INSTALL_BIN) ./files/lib/netifd/wireless/mac80211.sh $(1)/lib/netifd/wireless
-endef
-
-define KernelPackage/p54-pci/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(DL_DIR)/$(P54PCIFW) $(1)/lib/firmware/isl3886pci
-endef
-
-define KernelPackage/p54-usb/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(DL_DIR)/$(P54USBFW) $(1)/lib/firmware/isl3887usb
-endef
-
-define KernelPackage/p54-spi/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(DL_DIR)/$(P54SPIFW) $(1)/lib/firmware/3826.arm
-endef
-
-define KernelPackage/rt61-pci/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2561.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2561s.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2661.bin \
-		$(1)/lib/firmware/
-endef
-
-define KernelPackage/rt73-usb/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt73.bin $(1)/lib/firmware/
-endef
-
-define KernelPackage/rt2800-pci/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2860.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt3290.bin \
-		$(1)/lib/firmware
-endef
-
-define KernelPackage/rt2800-usb/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2870.bin $(1)/lib/firmware/
-endef
-
-define KernelPackage/wl12xx/install
-	$(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-mr.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-plt.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-sr.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl1271-nvs.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-fw-5-mr.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-fw-5-plt.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-fw-5-sr.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl128x-nvs.bin \
-		$(1)/lib/firmware/ti-connectivity
-endef
-
-define KernelPackage/wl18xx/install
-	$(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-conf.bin \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-fw-3.bin \
-		$(1)/lib/firmware/ti-connectivity
-endef
-
-define KernelPackage/zd1211rw/install
-	$(INSTALL_DIR) $(1)/lib/firmware/zd1211
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(ZD1211FW_NAME)/zd1211* $(1)/lib/firmware/zd1211
-endef
-
-define KernelPackage/carl9170/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/carl9170-1.fw $(1)/lib/firmware
-endef
-
-define KernelPackage/ath9k-htc/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/htc_9271.fw \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/htc_7010.fw \
-		$(1)/lib/firmware/
-endef
-
-define KernelPackage/ath10k/install
-	$(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/ath10k/QCA988X/hw2.0/board.bin \
-		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/
-ifeq ($(CONFIG_ATH10K_STA_FW),y)
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/main/firmware-2.bin_999.999.0.636 \
-		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-2.bin
-else ifeq ($(CONFIG_ATH10K_API2_FW),y)
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/10.1/firmware-2.bin_10.1.467.2-1 \
-		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-2.bin
-else
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/10.2.4/firmware-4.bin_10.2.4.45 \
-		$(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-4.bin
-endif
-endef
-
-define KernelPackage/mwl8k/install
-	$(INSTALL_DIR) $(1)/lib/firmware/mwl8k
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366_ap-3.fw \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366.fw \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/helper_8366.fw \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8687.fw \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/helper_8687.fw \
-		$(1)/lib/firmware/mwl8k/
-endef
-
-define KernelPackage/mwifiex-pcie/install
-	$(INSTALL_DIR) $(1)/lib/firmware/mrvl
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mrvl/pcie8897_uapsta.bin \
-		$(1)/lib/firmware/mrvl/
-endef
-
-define KernelPackage/net-ipw2100/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/ipw2100-$(IPW2100_VERSION)*.fw $(1)/lib/firmware
-endef
-
-define KernelPackage/net-ipw2200/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION)/ipw2200*.fw $(1)/lib/firmware
-endef
-
-define KernelPackage/iwlagn/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-ifneq ($(CONFIG_IWL5000_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL5150_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-5150-2.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL1000_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-1000-5.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL6000_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000-4.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL6050_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6050-5.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL6005_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL6030_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL7260_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-7260-9.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL7265_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-7265-9.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL100_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-100-5.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL2000_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL2030_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL105_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-105-6.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL135_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-135-6.ucode $(1)/lib/firmware
-endif
-ifneq ($(CONFIG_IWL3160_FW),)
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-3160-9.ucode $(1)/lib/firmware
-endif
-endef
-
-define KernelPackage/iwl3945/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-3945-2.ucode $(1)/lib/firmware
-endef
-
-define KernelPackage/iwl4965/install
-	$(INSTALL_DIR) $(1)/lib/firmware
-	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-4965-2.ucode $(1)/lib/firmware
-endef
 
 define KernelPackage/b43/install
 	rm -rf $(1)/lib/firmware/
@@ -1990,51 +1718,85 @@ ifneq ($(CONFIG_B43_FW_SQUASH),)
 endif
 endef
 
-define KernelPackage/b43legacy/install
-	$(INSTALL_DIR) $(1)/lib/firmware/
-	b43-fwcutter --unsupported -w $(1)/lib/firmware/ $(DL_DIR)/$(PKG_B43_FWV3_SOURCE)
-ifneq ($(CONFIG_B43LEGACY_FW_SQUASH),)
-	b43-fwsquash.py "G" "$(CONFIG_B43LEGACY_FW_SQUASH_COREREVS)" "$(1)/lib/firmware/b43legacy"
-endif
-endef
-
 define KernelPackage/brcmsmac/install
 	$(INSTALL_DIR) $(1)/lib/firmware/brcm
 ifeq ($(CONFIG_BRCMSMAC_USE_FW_FROM_WL),y)
 	tar xjf "$(DL_DIR)/$(PKG_BRCMSMAC_FW_SOURCE)" -C "$(PKG_BUILD_DIR)"
 	b43-fwcutter --brcmsmac -w $(1)/lib/firmware/ $(PKG_BUILD_DIR)/$(PKG_BRCMSMAC_FW_OBJECT)
-else
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx-0.fw \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx_hdr-0.fw \
-		$(1)/lib/firmware/brcm/
 endif
 endef
 
-define KernelPackage/brcmfmac/install
-	$(INSTALL_DIR) $(1)/lib/firmware/brcm
-ifneq ($(CONFIG_BRCMFMAC_USB),)
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/brcmfmac43236b.bin \
-		$(1)/lib/firmware/brcm/
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/brcmfmac43143.bin \
-		$(1)/lib/firmware/brcm/
-endif
-ifneq ($(CONFIG_BRCMFMAC_PCIE),)
-	$(INSTALL_DATA) \
-		$(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/brcmfmac43602-pcie.ap.bin \
-		$(1)/lib/firmware/brcm/brcmfmac43602-pcie.bin
-endif
+define KernelPackage/cfg80211/install
+	$(INSTALL_DIR) $(1)/lib/wifi $(1)/lib/netifd/wireless
+	$(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
+	$(INSTALL_BIN) ./files/lib/netifd/wireless/mac80211.sh $(1)/lib/netifd/wireless
+endef
+
+define KernelPackage/ipw2100/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/ipw2100-$(IPW2100_VERSION)*.fw $(1)/lib/firmware
+endef
+
+define KernelPackage/ipw2200/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION)/ipw2200*.fw $(1)/lib/firmware
+endef
+
+define KernelPackage/p54-pci/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(DL_DIR)/$(P54PCIFW) $(1)/lib/firmware/isl3886pci
+endef
+
+define KernelPackage/p54-usb/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(DL_DIR)/$(P54USBFW) $(1)/lib/firmware/isl3887usb
+endef
+
+define KernelPackage/p54-spi/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(DL_DIR)/$(P54SPIFW) $(1)/lib/firmware/3826.arm
 endef
 
+define KernelPackage/zd1211rw/install
+	$(INSTALL_DIR) $(1)/lib/firmware/zd1211
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/$(ZD1211FW_NAME)/zd1211* $(1)/lib/firmware/zd1211
+endef
+
+
 $(eval $(call KernelPackage,adm8211))
+$(eval $(call KernelPackage,ath))
+$(eval $(call KernelPackage,ath10k))
 $(eval $(call KernelPackage,ath5k))
+$(eval $(call KernelPackage,ath9k))
+$(eval $(call KernelPackage,ath9k-common))
+$(eval $(call KernelPackage,ath9k-htc))
+$(eval $(call KernelPackage,b43))
+$(eval $(call KernelPackage,b43legacy))
+$(eval $(call KernelPackage,brcmsmac))
+$(eval $(call KernelPackage,brcmfmac))
+$(eval $(call KernelPackage,brcmutil))
+$(eval $(call KernelPackage,carl9170))
+$(eval $(call KernelPackage,cfg80211))
+$(eval $(call KernelPackage,hermes))
+$(eval $(call KernelPackage,hermes-pci))
+$(eval $(call KernelPackage,hermes-plx))
+$(eval $(call KernelPackage,hermes-pcmcia))
+$(eval $(call KernelPackage,iwlwifi))
+$(eval $(call KernelPackage,iwl-legacy))
+$(eval $(call KernelPackage,iwl4965))
+$(eval $(call KernelPackage,iwl3945))
 $(eval $(call KernelPackage,lib80211))
 $(eval $(call KernelPackage,libertas-usb))
 $(eval $(call KernelPackage,libertas-sdio))
-$(eval $(call KernelPackage,cfg80211))
+$(eval $(call KernelPackage,libertas-spi))
+$(eval $(call KernelPackage,libipw))
+$(eval $(call KernelPackage,ipw2100))
+$(eval $(call KernelPackage,ipw2200))
 $(eval $(call KernelPackage,mac80211))
+$(eval $(call KernelPackage,mac80211-hwsim))
+$(eval $(call KernelPackage,mt7601u))
+$(eval $(call KernelPackage,mwl8k))
+$(eval $(call KernelPackage,mwifiex-pcie))
 $(eval $(call KernelPackage,p54-common))
 $(eval $(call KernelPackage,p54-pci))
 $(eval $(call KernelPackage,p54-usb))
@@ -2047,12 +1809,12 @@ $(eval $(call KernelPackage,rt2800-lib))
 $(eval $(call KernelPackage,rt2400-pci))
 $(eval $(call KernelPackage,rt2500-pci))
 $(eval $(call KernelPackage,rt2500-usb))
-$(eval $(call KernelPackage,rt61-pci))
-$(eval $(call KernelPackage,rt73-usb))
 $(eval $(call KernelPackage,rt2800-mmio))
 $(eval $(call KernelPackage,rt2800-soc))
 $(eval $(call KernelPackage,rt2800-pci))
 $(eval $(call KernelPackage,rt2800-usb))
+$(eval $(call KernelPackage,rt61-pci))
+$(eval $(call KernelPackage,rt73-usb))
 $(eval $(call KernelPackage,rtl8180))
 $(eval $(call KernelPackage,rtl8187))
 $(eval $(call KernelPackage,rtlwifi))
@@ -2063,32 +1825,8 @@ $(eval $(call KernelPackage,rtl8192ce))
 $(eval $(call KernelPackage,rtl8192se))
 $(eval $(call KernelPackage,rtl8192de))
 $(eval $(call KernelPackage,rtl8192cu))
-$(eval $(call KernelPackage,zd1211rw))
-$(eval $(call KernelPackage,mac80211-hwsim))
-$(eval $(call KernelPackage,ath9k-common))
-$(eval $(call KernelPackage,ath9k))
-$(eval $(call KernelPackage,ath9k-htc))
-$(eval $(call KernelPackage,ath10k))
-$(eval $(call KernelPackage,ath))
-$(eval $(call KernelPackage,carl9170))
-$(eval $(call KernelPackage,b43))
-$(eval $(call KernelPackage,b43legacy))
-$(eval $(call KernelPackage,brcmutil))
-$(eval $(call KernelPackage,brcmsmac))
-$(eval $(call KernelPackage,brcmfmac))
-$(eval $(call KernelPackage,net-libipw))
-$(eval $(call KernelPackage,net-ipw2100))
-$(eval $(call KernelPackage,net-ipw2200))
-$(eval $(call KernelPackage,iwlagn))
-$(eval $(call KernelPackage,iwl-legacy))
-$(eval $(call KernelPackage,iwl4965))
-$(eval $(call KernelPackage,iwl3945))
-$(eval $(call KernelPackage,mwl8k))
-$(eval $(call KernelPackage,mwifiex-pcie))
-$(eval $(call KernelPackage,net-hermes))
-$(eval $(call KernelPackage,net-hermes-pci))
-$(eval $(call KernelPackage,net-hermes-plx))
-$(eval $(call KernelPackage,net-hermes-pcmcia))
+$(eval $(call KernelPackage,rtl8xxxu))
 $(eval $(call KernelPackage,wlcore))
 $(eval $(call KernelPackage,wl12xx))
 $(eval $(call KernelPackage,wl18xx))
+$(eval $(call KernelPackage,zd1211rw))
diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
index 2852f3e08ceea613426f6e033b15666d1e19bd50..fb2f928751a8c7dd282022d64be784cfcca4663b 100644
--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
@@ -455,12 +455,7 @@ mac80211_prepare_vif() {
 			}
 		;;
 		mesh)
-			json_get_vars key mesh_id
-			if [ -n "$key" ]; then
-				iw phy "$phy" interface add "$ifname" type mp
-			else
-				iw phy "$phy" interface add "$ifname" type mp mesh_id "$mesh_id"
-			fi
+			iw phy "$phy" interface add "$ifname" type mp
 		;;
 		monitor)
 			iw phy "$phy" interface add "$ifname" type monitor
@@ -606,6 +601,13 @@ mac80211_setup_vif() {
 					wireless_vif_parse_encryption
 					mac80211_setup_supplicant || failed=1
 				fi
+			else
+				json_get_vars mesh_id mcast_rate
+
+				mcval=
+				[ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
+
+				iw dev "$ifname" mesh join "$mesh_id" ${mcval:+mcast-rate $mcval}
 			fi
 
 			for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do
diff --git a/package/kernel/mac80211/patches/001-fix_build.patch b/package/kernel/mac80211/patches/001-fix_build.patch
index 818983e06e6c7b97fb881e7de0317f4505907f36..402649d2ccdd06fa5a1d15a429cbd7ca0b3dc2e1 100644
--- a/package/kernel/mac80211/patches/001-fix_build.patch
+++ b/package/kernel/mac80211/patches/001-fix_build.patch
@@ -27,7 +27,7 @@
  	@set -e ; test -f .local-symbols || (						\
  	echo "/--------------"								;\
  	echo "| You shouldn't run make in the backports tree, but only in"		;\
-@@ -60,56 +62,60 @@ mrproper:
+@@ -60,57 +62,61 @@ mrproper:
  	echo "| (that isn't currently running.)"					;\
  	echo "\\--"									;\
  	false)
@@ -56,11 +56,12 @@
 -			done								\
 -		) > Kconfig.kernel							;\
 -		kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |	\
--			sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')			;\
+-			sed 's/^\(\([3-4]\|2\.6\)\.[0-9]\+\).*/\1/;t;d')		;\
 -		test "$$kver" != "" || echo "Kernel version parse failed!"		;\
 -		test "$$kver" != ""							;\
 -		kvers="$$(seq 14 39 | sed 's/^/2.6./')"					;\
--		kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"				;\
+-		kvers="$$kvers $$(seq 0 19 | sed 's/^/3./')"				;\
+-		kvers="$$kvers $$(seq 0 99 | sed 's/^/4./')"				;\
 -		print=0									;\
 -		for v in $$kvers ; do							\
 -			if [ "$$print" = "1" ] ; then					\
@@ -111,11 +112,12 @@
 +
 +Kconfig.versions: Kconfig.kernel
 +	@kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |	\
-+		sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')			;\
++		sed 's/^\(\([3-4]\|2\.6\)\.[0-9]\+\).*/\1/;t;d')		;\
 +	test "$$kver" != "" || echo "Kernel version parse failed!"		;\
 +	test "$$kver" != ""							;\
 +	kvers="$$(seq 14 39 | sed 's/^/2.6./')"					;\
-+	kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"				;\
++	kvers="$$kvers $$(seq 0 19 | sed 's/^/3./')"				;\
++	kvers="$$kvers $$(seq 0 99 | sed 's/^/4./')"				;\
 +	print=0									;\
 +	for v in $$kvers ; do							\
 +		if [ "$$print" = "1" ] ; then					\
diff --git a/package/kernel/mac80211/patches/002-change_allconfig.patch b/package/kernel/mac80211/patches/002-change_allconfig.patch
index 91ad20f06deb041e7a6ba1b244ee8c865bf3eed3..bd5bebfa450061b4f46eb0c6c3c7ad04946a766f 100644
--- a/package/kernel/mac80211/patches/002-change_allconfig.patch
+++ b/package/kernel/mac80211/patches/002-change_allconfig.patch
@@ -1,6 +1,6 @@
 --- a/kconf/conf.c
 +++ b/kconf/conf.c
-@@ -578,40 +578,12 @@ int main(int ac, char **av)
+@@ -593,40 +593,12 @@ int main(int ac, char **av)
  	case oldconfig:
  	case listnewconfig:
  	case olddefconfig:
@@ -42,3 +42,23 @@
  		break;
  	default:
  		break;
+--- a/kconf/confdata.c
++++ b/kconf/confdata.c
+@@ -1169,6 +1169,8 @@ bool conf_set_all_new_symbols(enum conf_
+ 	}
+ 	bool has_changed = false;
+ 
++	sym_clear_all_valid();
++
+ 	for_all_symbols(i, sym) {
+ 		if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
+ 			continue;
+@@ -1212,8 +1214,6 @@ bool conf_set_all_new_symbols(enum conf_
+ 
+ 	}
+ 
+-	sym_clear_all_valid();
+-
+ 	/*
+ 	 * We have different type of choice blocks.
+ 	 * If curr.tri equals to mod then we can select several
diff --git a/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch b/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9adfd8f719805961fb06d4fc3bc104b668e4fd41
--- /dev/null
+++ b/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch
@@ -0,0 +1,21 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 28 Jan 2016 15:16:35 +0100
+Subject: [PATCH] backports: add skb_free_frag()
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/backport-include/linux/skbuff.h
++++ b/backport-include/linux/skbuff.h
+@@ -300,4 +300,11 @@ int skb_ensure_writable(struct sk_buff *
+ 
+ #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) */
+ 
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0)
++static inline void skb_free_frag(void *data)
++{
++	put_page(virt_to_head_page(data));
++}
++#endif
++
+ #endif /* __BACKPORT_SKBUFF_H */
diff --git a/package/kernel/mac80211/patches/004-backports_debugfs_fix.patch b/package/kernel/mac80211/patches/004-backports_debugfs_fix.patch
deleted file mode 100644
index d48a72344390a36ca046e0b0bba8405f90f01173..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/004-backports_debugfs_fix.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/backport-include/linux/debugfs.h
-+++ b/backport-include/linux/debugfs.h
-@@ -3,6 +3,7 @@
- #include_next <linux/debugfs.h>
- #include <linux/version.h>
- #include <generated/utsrelease.h>
-+#include <linux/device.h>
- 
- #if defined(CONFIG_DEBUG_FS)
- struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name,
diff --git a/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch b/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9b672a8d14ec4e27c7d14bd6018059520ae8296c
--- /dev/null
+++ b/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch
@@ -0,0 +1,20 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 28 Jan 2016 15:19:22 +0100
+Subject: [PATCH] backports: add napi_alloc_frag
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/backport-include/linux/netdevice.h
++++ b/backport-include/linux/netdevice.h
+@@ -232,6 +232,10 @@ static inline void backport_unregister_n
+ #define unregister_netdevice_many LINUX_BACKPORT(unregister_netdevice_many)
+ #endif
+ 
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
++#define napi_alloc_frag netdev_alloc_frag
++#endif
++
+ /*
+  * Complicated way of saying: We only backport netdev_rss_key stuff on kernels
+  * that either already have net_get_random_once() (>= 3.13) or where we've been
diff --git a/package/kernel/mac80211/patches/008-fix_netdev_unregister.patch b/package/kernel/mac80211/patches/008-fix_netdev_unregister.patch
deleted file mode 100644
index e07f3231900f956c04be86aeddf1a806cdf9f48b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/008-fix_netdev_unregister.patch
+++ /dev/null
@@ -1,16 +0,0 @@
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -1858,6 +1858,13 @@ void ieee80211_remove_interfaces(struct
- 	}
- 	mutex_unlock(&local->iflist_mtx);
- 	unregister_netdevice_many(&unreg_list);
-+#if (!(LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,45) && \
-+       LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)) && \
-+     !(LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,9) && \
-+       LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)) && \
-+     (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0)))
-+	list_del(&unreg_list);
-+#endif
- 
- 	list_for_each_entry_safe(sdata, tmp, &wdev_list, list) {
- 		list_del(&sdata->list);
diff --git a/package/kernel/mac80211/patches/020-add_mpls_h.patch b/package/kernel/mac80211/patches/020-add_mpls_h.patch
deleted file mode 100644
index e5310bc1200db226eb4fa6fdab95e0eeaa801ffb..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/020-add_mpls_h.patch
+++ /dev/null
@@ -1,37 +0,0 @@
---- /dev/null
-+++ b/include/uapi/linux/mpls.h
-@@ -0,0 +1,34 @@
-+#ifndef _UAPI_MPLS_H
-+#define _UAPI_MPLS_H
-+
-+#include <linux/types.h>
-+#include <asm/byteorder.h>
-+
-+/* Reference: RFC 5462, RFC 3032
-+ *
-+ *  0                   1                   2                   3
-+ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+ * |                Label                  | TC  |S|       TTL     |
-+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-+ *
-+ *	Label:  Label Value, 20 bits
-+ *	TC:     Traffic Class field, 3 bits
-+ *	S:      Bottom of Stack, 1 bit
-+ *	TTL:    Time to Live, 8 bits
-+ */
-+
-+struct mpls_label {
-+	__be32 entry;
-+};
-+
-+#define MPLS_LS_LABEL_MASK      0xFFFFF000
-+#define MPLS_LS_LABEL_SHIFT     12
-+#define MPLS_LS_TC_MASK         0x00000E00
-+#define MPLS_LS_TC_SHIFT        9
-+#define MPLS_LS_S_MASK          0x00000100
-+#define MPLS_LS_S_SHIFT         8
-+#define MPLS_LS_TTL_MASK        0x000000FF
-+#define MPLS_LS_TTL_SHIFT       0
-+
-+#endif /* _UAPI_MPLS_H */
diff --git a/package/kernel/mac80211/patches/030-rt2x00_options.patch b/package/kernel/mac80211/patches/030-rt2x00_options.patch
index 35b5b5deb2f78194512dfc8122671b54430cb6ce..a4ca8848c662cce0ba4df3491d31b73c77d8e0a5 100644
--- a/package/kernel/mac80211/patches/030-rt2x00_options.patch
+++ b/package/kernel/mac80211/patches/030-rt2x00_options.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
+--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
++++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
 @@ -225,36 +225,37 @@ config RT2800SOC
  
  
@@ -43,5 +43,5 @@
 -	tristate
 +	tristate "RT2x00 support"
  	depends on m
- 	select BPAUTO_AVERAGE
  
+ config RT2X00_LIB_FIRMWARE
diff --git a/package/kernel/mac80211/patches/040-brcmutil_option.patch b/package/kernel/mac80211/patches/040-brcmutil_option.patch
index 8a6cae61227804ba52ce9e846e3b29ea4d301dfb..167332d916877cabf7e4ab1257b0543e47643675 100644
--- a/package/kernel/mac80211/patches/040-brcmutil_option.patch
+++ b/package/kernel/mac80211/patches/040-brcmutil_option.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/brcm80211/Kconfig
-+++ b/drivers/net/wireless/brcm80211/Kconfig
+--- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
++++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
 @@ -1,5 +1,5 @@
  config BRCMUTIL
 -	tristate
diff --git a/package/kernel/mac80211/patches/045-bcma-from-4.1.patch b/package/kernel/mac80211/patches/045-bcma-from-4.1.patch
deleted file mode 100644
index dce217f5ccea574eaea262f79225c23189302256..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/045-bcma-from-4.1.patch
+++ /dev/null
@@ -1,104 +0,0 @@
---- a/drivers/bcma/driver_pci.c
-+++ b/drivers/bcma/driver_pci.c
-@@ -282,39 +282,6 @@ void bcma_core_pci_power_save(struct bcm
- }
- EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
- 
--int bcma_core_pci_irq_ctl(struct bcma_bus *bus, struct bcma_device *core,
--			  bool enable)
--{
--	struct pci_dev *pdev;
--	u32 coremask, tmp;
--	int err = 0;
--
--	if (bus->hosttype != BCMA_HOSTTYPE_PCI) {
--		/* This bcma device is not on a PCI host-bus. So the IRQs are
--		 * not routed through the PCI core.
--		 * So we must not enable routing through the PCI core. */
--		goto out;
--	}
--
--	pdev = bus->host_pci;
--
--	err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
--	if (err)
--		goto out;
--
--	coremask = BIT(core->core_index) << 8;
--	if (enable)
--		tmp |= coremask;
--	else
--		tmp &= ~coremask;
--
--	err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp);
--
--out:
--	return err;
--}
--EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl);
--
- static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
- {
- 	u32 w;
---- a/drivers/bcma/host_pci.c
-+++ b/drivers/bcma/host_pci.c
-@@ -351,3 +351,37 @@ void bcma_host_pci_down(struct bcma_bus
- 		bcma_core_pci_down(&bus->drv_pci[0]);
- }
- EXPORT_SYMBOL_GPL(bcma_host_pci_down);
-+
-+/* See also si_pci_setup */
-+int bcma_host_pci_irq_ctl(struct bcma_bus *bus, struct bcma_device *core,
-+			  bool enable)
-+{
-+	struct pci_dev *pdev;
-+	u32 coremask, tmp;
-+	int err = 0;
-+
-+	if (bus->hosttype != BCMA_HOSTTYPE_PCI) {
-+		/* This bcma device is not on a PCI host-bus. So the IRQs are
-+		 * not routed through the PCI core.
-+		 * So we must not enable routing through the PCI core. */
-+		goto out;
-+	}
-+
-+	pdev = bus->host_pci;
-+
-+	err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
-+	if (err)
-+		goto out;
-+
-+	coremask = BIT(core->core_index) << 8;
-+	if (enable)
-+		tmp |= coremask;
-+	else
-+		tmp &= ~coremask;
-+
-+	err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp);
-+
-+out:
-+	return err;
-+}
-+EXPORT_SYMBOL_GPL(bcma_host_pci_irq_ctl);
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -4866,7 +4866,7 @@ static int b43_wireless_core_init(struct
- 	switch (dev->dev->bus_type) {
- #ifdef CPTCFG_B43_BCMA
- 	case B43_BUS_BCMA:
--		bcma_core_pci_irq_ctl(dev->dev->bdev->bus,
-+		bcma_host_pci_irq_ctl(dev->dev->bdev->bus,
- 				      dev->dev->bdev, true);
- 		bcma_host_pci_up(dev->dev->bdev->bus);
- 		break;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4959,7 +4959,7 @@ static int brcms_b_up_prep(struct brcms_
- 	 * Configure pci/pcmcia here instead of in brcms_c_attach()
- 	 * to allow mfg hotswap:  down, hotswap (chip power cycle), up.
- 	 */
--	bcma_core_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
-+	bcma_host_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
- 			      true);
- 
- 	/*
diff --git a/package/kernel/mac80211/patches/050-lib80211_option.patch b/package/kernel/mac80211/patches/050-lib80211_option.patch
index 5fe5558a125c330264d5d90fb531570745e4674d..3fc8c052071e9934ebc9ec39dce5a1d75a14a53a 100644
--- a/package/kernel/mac80211/patches/050-lib80211_option.patch
+++ b/package/kernel/mac80211/patches/050-lib80211_option.patch
@@ -1,6 +1,6 @@
 --- a/net/wireless/Kconfig
 +++ b/net/wireless/Kconfig
-@@ -174,7 +174,7 @@ config CFG80211_WEXT_EXPORT
+@@ -171,7 +171,7 @@ config CFG80211_WEXT_EXPORT
  	  wext compatibility symbols to be exported.
  
  config LIB80211
@@ -9,7 +9,7 @@
  	depends on m
  	default n
  	help
-@@ -184,15 +184,15 @@ config LIB80211
+@@ -181,15 +181,15 @@ config LIB80211
  	  Drivers should select this themselves if needed.
  
  config LIB80211_CRYPT_WEP
diff --git a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch
index d3079491dc8300b8a15589c6a44dd7937024c103..fd1e1cff3020078b5529982d5868ec65b8b4c9da 100644
--- a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch
+++ b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch
@@ -1,9 +1,9 @@
 --- a/.local-symbols
 +++ b/.local-symbols
-@@ -344,40 +344,3 @@ USB_CDC_PHONET=
- USB_IPHETH=
+@@ -476,44 +476,6 @@ USB_IPHETH=
  USB_SIERRA_NET=
  USB_VL600=
+ USB_NET_CH9200=
 -SSB_POSSIBLE=
 -SSB=
 -SSB_SPROM=
@@ -15,6 +15,7 @@
 -SSB_PCMCIAHOST=
 -SSB_SDIOHOST_POSSIBLE=
 -SSB_SDIOHOST=
+-SSB_HOST_SOC=
 -SSB_SILENT=
 -SSB_DEBUG=
 -SSB_SERIAL=
@@ -32,28 +33,20 @@
 -BCMA_BLOCKIO=
 -BCMA_HOST_PCI_POSSIBLE=
 -BCMA_HOST_PCI=
--BCMA_DRIVER_PCI_HOSTMODE=
 -BCMA_HOST_SOC=
 -BCMA_DRIVER_PCI=
+-BCMA_DRIVER_PCI_HOSTMODE=
 -BCMA_DRIVER_MIPS=
 -BCMA_SFLASH=
 -BCMA_NFLASH=
 -BCMA_DRIVER_GMAC_CMN=
 -BCMA_DRIVER_GPIO=
 -BCMA_DEBUG=
---- a/Makefile.kernel
-+++ b/Makefile.kernel
-@@ -38,8 +38,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
- obj-$(CPTCFG_WLAN) += drivers/net/wireless/
- #obj-$(CPTCFG_BT) += net/bluetooth/
- #obj-$(CPTCFG_BT) += drivers/bluetooth/
--obj-$(CPTCFG_SSB) += drivers/ssb/
--obj-$(CPTCFG_BCMA) += drivers/bcma/
- #obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/
- obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
- #obj-$(CPTCFG_NFC) += net/nfc/
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
+ NFC=
+ NFC_DIGITAL=
+ NFC_NCI=
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
 @@ -2866,7 +2866,7 @@ static struct ssb_device *b43_ssb_gpio_d
  {
  	struct ssb_bus *bus = dev->dev->sdev->bus;
@@ -63,7 +56,7 @@
  	return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
  #else
  	return bus->chipco.dev;
-@@ -4907,7 +4907,7 @@ static int b43_wireless_core_init(struct
+@@ -4903,7 +4903,7 @@ static int b43_wireless_core_init(struct
  	}
  	if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
  		hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
@@ -72,8 +65,8 @@
  	if (dev->dev->bus_type == B43_BUS_SSB &&
  	    dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
  	    dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
---- a/drivers/net/wireless/b43legacy/main.c
-+++ b/drivers/net/wireless/b43legacy/main.c
+--- a/drivers/net/wireless/broadcom/b43legacy/main.c
++++ b/drivers/net/wireless/broadcom/b43legacy/main.c
 @@ -1937,7 +1937,7 @@ static int b43legacy_gpio_init(struct b4
  	if (dev->dev->id.revision >= 2)
  		mask  |= 0x0010; /* FIXME: This is redundant. */
@@ -92,8 +85,8 @@
  	pcidev = bus->pcicore.dev;
  #endif
  	gpiodev = bus->chipco.dev ? : pcidev;
---- a/drivers/net/wireless/brcm80211/brcmsmac/Makefile
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/Makefile
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile
 @@ -43,6 +43,6 @@ brcmsmac-y := \
  	brcms_trace_events.o \
  	debug.o
@@ -102,8 +95,8 @@
 +brcmsmac-$(CONFIG_BCMA_DRIVER_GPIO) += led.o
  
  obj-$(CPTCFG_BRCMSMAC)	+= brcmsmac.o
---- a/drivers/net/wireless/brcm80211/brcmsmac/led.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/led.h
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h
 @@ -22,7 +22,7 @@ struct brcms_led {
  	bool active_low;
  };
@@ -116,12 +109,23 @@
 --- a/Kconfig.sources
 +++ b/Kconfig.sources
 @@ -9,9 +9,6 @@ source "$BACKPORT_DIR/drivers/net/wirele
- #source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig"
+ source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig"
  source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
  
 -source "$BACKPORT_DIR/drivers/ssb/Kconfig"
 -source "$BACKPORT_DIR/drivers/bcma/Kconfig"
 -
- #source "$BACKPORT_DIR/net/nfc/Kconfig"
+ source "$BACKPORT_DIR/net/nfc/Kconfig"
  
- #source "$BACKPORT_DIR/drivers/media/Kconfig"
+ source "$BACKPORT_DIR/drivers/media/Kconfig"
+--- a/Makefile.kernel
++++ b/Makefile.kernel
+@@ -38,8 +38,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
+ obj-$(CPTCFG_WLAN) += drivers/net/wireless/
+ obj-$(CPTCFG_BT) += net/bluetooth/
+ obj-$(CPTCFG_BT) += drivers/bluetooth/
+-obj-$(CPTCFG_SSB) += drivers/ssb/
+-obj-$(CPTCFG_BCMA) += drivers/bcma/
+ obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/
+ obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
+ obj-$(CPTCFG_NFC) += net/nfc/
diff --git a/package/kernel/mac80211/patches/070-ath_common_config.patch b/package/kernel/mac80211/patches/070-ath_common_config.patch
index c6e9cd8515fff3a08c7093b2e520f6f1855a724e..41774fe53e13b6ea6e3d02a5d21560ef4d61b072 100644
--- a/package/kernel/mac80211/patches/070-ath_common_config.patch
+++ b/package/kernel/mac80211/patches/070-ath_common_config.patch
@@ -1,10 +1,9 @@
 --- a/drivers/net/wireless/ath/Kconfig
 +++ b/drivers/net/wireless/ath/Kconfig
-@@ -6,6 +6,7 @@ menuconfig ATH_CARDS
- 	tristate "Atheros Wireless Cards"
+@@ -1,5 +1,5 @@
+ config ATH_COMMON
+-	tristate
++	tristate "ath.ko"
  	depends on m
- 	depends on CFG80211 && (!UML || BROKEN)
-+	select ATH_COMMON
- 	---help---
- 	  This will enable the support for the Atheros wireless drivers.
- 	  ath5k, ath9k, ath9k_htc and ar9170 drivers share some common code, this option
+ 
+ config WLAN_VENDOR_ATH
diff --git a/package/kernel/mac80211/patches/090-linux_3_18_12_compat.patch b/package/kernel/mac80211/patches/090-linux_3_18_12_compat.patch
deleted file mode 100644
index 85c52807feaac02ac362b2372b8bb3138ab0d25e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/090-linux_3_18_12_compat.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- a/backport-include/linux/wait.h
-+++ b/backport-include/linux/wait.h
-@@ -23,7 +23,7 @@ backport_wait_on_bit_io(void *word, int
- 
- #endif
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,12)
- #define WQ_FLAG_WOKEN		0x02
- 
- #define wait_woken LINUX_BACKPORT(wait_woken)
---- a/compat/backport-3.19.c
-+++ b/compat/backport-3.19.c
-@@ -15,6 +15,7 @@
- #include <linux/netdevice.h>
- #include <linux/debugfs.h>
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,12)
- static inline bool is_kthread_should_stop(void)
- {
- 	return (current->flags & PF_KTHREAD) && kthread_should_stop();
-@@ -79,6 +80,7 @@ int woken_wake_function(wait_queue_t *wa
- 	return default_wake_function(wait, mode, sync, key);
- }
- EXPORT_SYMBOL(woken_wake_function);
-+#endif
- 
- #ifdef __BACKPORT_NETDEV_RSS_KEY_FILL
- u8 netdev_rss_key[NETDEV_RSS_KEY_LEN];
diff --git a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch
new file mode 100644
index 0000000000000000000000000000000000000000..02f46c778d8cd704b96af062ea73c2cffbf2c19a
--- /dev/null
+++ b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch
@@ -0,0 +1,376 @@
+--- a/net/mac80211/Kconfig
++++ b/net/mac80211/Kconfig
+@@ -5,8 +5,6 @@ config MAC80211
+ 	depends on CRYPTO
+ 	depends on CRYPTO_ARC4
+ 	depends on CRYPTO_AES
+-	select BPAUTO_CRYPTO_CCM
+-	depends on CRYPTO_GCM
+ 	depends on CRC32
+ 	---help---
+ 	  This option enables the hardware independent IEEE 802.11
+--- a/net/mac80211/Makefile
++++ b/net/mac80211/Makefile
+@@ -16,9 +16,7 @@ mac80211-y := \
+ 	michael.o \
+ 	tkip.o \
+ 	aes_ccm.o \
+-	aes_gcm.o \
+ 	aes_cmac.o \
+-	aes_gmac.o \
+ 	cfg.o \
+ 	ethtool.o \
+ 	rx.o \
+--- a/net/mac80211/aes_ccm.c
++++ b/net/mac80211/aes_ccm.c
+@@ -13,89 +13,132 @@
+ #include <linux/types.h>
+ #include <linux/err.h>
+ #include <crypto/aead.h>
++#include <crypto/aes.h>
+ 
+ #include <net/mac80211.h>
+ #include "key.h"
+ #include "aes_ccm.h"
+ 
+-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
+-			       u8 *data, size_t data_len, u8 *mic,
+-			       size_t mic_len)
++static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, u8 *s_0,
++			    u8 *a, u8 *b)
+ {
+-	struct scatterlist sg[3];
++	int i;
++
++	crypto_cipher_encrypt_one(tfm, b, b_0);
++
++	/* Extra Authenticate-only data (always two AES blocks) */
++	for (i = 0; i < AES_BLOCK_SIZE; i++)
++		aad[i] ^= b[i];
++	crypto_cipher_encrypt_one(tfm, b, aad);
++
++	aad += AES_BLOCK_SIZE;
++
++	for (i = 0; i < AES_BLOCK_SIZE; i++)
++		aad[i] ^= b[i];
++	crypto_cipher_encrypt_one(tfm, a, aad);
+ 
+-	char aead_req_data[sizeof(struct aead_request) +
+-			   crypto_aead_reqsize(tfm)]
+-		__aligned(__alignof__(struct aead_request));
+-	struct aead_request *aead_req = (void *) aead_req_data;
++	/* Mask out bits from auth-only-b_0 */
++	b_0[0] &= 0x07;
+ 
+-	memset(aead_req, 0, sizeof(aead_req_data));
++	/* S_0 is used to encrypt T (= MIC) */
++	b_0[14] = 0;
++	b_0[15] = 0;
++	crypto_cipher_encrypt_one(tfm, s_0, b_0);
++}
+ 
+-	sg_init_table(sg, 3);
+-	sg_set_buf(&sg[0], &aad[2], be16_to_cpup((__be16 *)aad));
+-	sg_set_buf(&sg[1], data, data_len);
+-	sg_set_buf(&sg[2], mic, mic_len);
+ 
+-	aead_request_set_tfm(aead_req, tfm);
+-	aead_request_set_crypt(aead_req, sg, sg, data_len, b_0);
+-	aead_request_set_ad(aead_req, sg[0].length);
++void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
++			       u8 *data, size_t data_len, u8 *mic,
++			       size_t mic_len)
++{
++	int i, j, last_len, num_blocks;
++	u8 b[AES_BLOCK_SIZE];
++	u8 s_0[AES_BLOCK_SIZE];
++	u8 e[AES_BLOCK_SIZE];
++	u8 *pos, *cpos;
++
++	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
++	last_len = data_len % AES_BLOCK_SIZE;
++	aes_ccm_prepare(tfm, b_0, aad, s_0, b, b);
++
++	/* Process payload blocks */
++	pos = data;
++	cpos = data;
++	for (j = 1; j <= num_blocks; j++) {
++		int blen = (j == num_blocks && last_len) ?
++			last_len : AES_BLOCK_SIZE;
++
++		/* Authentication followed by encryption */
++		for (i = 0; i < blen; i++)
++			b[i] ^= pos[i];
++		crypto_cipher_encrypt_one(tfm, b, b);
++
++		b_0[14] = (j >> 8) & 0xff;
++		b_0[15] = j & 0xff;
++		crypto_cipher_encrypt_one(tfm, e, b_0);
++		for (i = 0; i < blen; i++)
++			*cpos++ = *pos++ ^ e[i];
++	}
+ 
+-	crypto_aead_encrypt(aead_req);
++	for (i = 0; i < mic_len; i++)
++		mic[i] = b[i] ^ s_0[i];
+ }
+ 
+-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
++int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
+ 			      u8 *data, size_t data_len, u8 *mic,
+ 			      size_t mic_len)
+ {
+-	struct scatterlist sg[3];
+-	char aead_req_data[sizeof(struct aead_request) +
+-			   crypto_aead_reqsize(tfm)]
+-		__aligned(__alignof__(struct aead_request));
+-	struct aead_request *aead_req = (void *) aead_req_data;
+-
+-	if (data_len == 0)
+-		return -EINVAL;
+-
+-	memset(aead_req, 0, sizeof(aead_req_data));
+-
+-	sg_init_table(sg, 3);
+-	sg_set_buf(&sg[0], &aad[2], be16_to_cpup((__be16 *)aad));
+-	sg_set_buf(&sg[1], data, data_len);
+-	sg_set_buf(&sg[2], mic, mic_len);
+-
+-	aead_request_set_tfm(aead_req, tfm);
+-	aead_request_set_crypt(aead_req, sg, sg, data_len + mic_len, b_0);
+-	aead_request_set_ad(aead_req, sg[0].length);
++	int i, j, last_len, num_blocks;
++	u8 *pos, *cpos;
++	u8 a[AES_BLOCK_SIZE];
++	u8 b[AES_BLOCK_SIZE];
++	u8 s_0[AES_BLOCK_SIZE];
++
++	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
++	last_len = data_len % AES_BLOCK_SIZE;
++	aes_ccm_prepare(tfm, b_0, aad, s_0, a, b);
++
++	/* Process payload blocks */
++	cpos = data;
++	pos = data;
++	for (j = 1; j <= num_blocks; j++) {
++		int blen = (j == num_blocks && last_len) ?
++			last_len : AES_BLOCK_SIZE;
++
++		/* Decryption followed by authentication */
++		b_0[14] = (j >> 8) & 0xff;
++		b_0[15] = j & 0xff;
++		crypto_cipher_encrypt_one(tfm, b, b_0);
++		for (i = 0; i < blen; i++) {
++			*pos = *cpos++ ^ b[i];
++			a[i] ^= *pos++;
++		}
++		crypto_cipher_encrypt_one(tfm, a, a);
++	}
++
++	for (i = 0; i < mic_len; i++) {
++		if ((mic[i] ^ s_0[i]) != a[i])
++			return -1;
++	}
+ 
+-	return crypto_aead_decrypt(aead_req);
++	return 0;
+ }
+ 
+-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[],
+-						    size_t key_len,
+-						    size_t mic_len)
++struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[],
++						      size_t key_len,
++						      size_t mic_len)
+ {
+-	struct crypto_aead *tfm;
+-	int err;
++	struct crypto_cipher *tfm;
+ 
+-	tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
+-	if (IS_ERR(tfm))
+-		return tfm;
+-
+-	err = crypto_aead_setkey(tfm, key, key_len);
+-	if (err)
+-		goto free_aead;
+-	err = crypto_aead_setauthsize(tfm, mic_len);
+-	if (err)
+-		goto free_aead;
++	tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
++	if (!IS_ERR(tfm))
++		crypto_cipher_setkey(tfm, key, key_len);
+ 
+ 	return tfm;
+-
+-free_aead:
+-	crypto_free_aead(tfm);
+-	return ERR_PTR(err);
+ }
+ 
+-void ieee80211_aes_key_free(struct crypto_aead *tfm)
++
++void ieee80211_aes_key_free(struct crypto_cipher *tfm)
+ {
+-	crypto_free_aead(tfm);
++	crypto_free_cipher(tfm);
+ }
+--- a/net/mac80211/aes_ccm.h
++++ b/net/mac80211/aes_ccm.h
+@@ -12,15 +12,15 @@
+ 
+ #include <linux/crypto.h>
+ 
+-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[],
+-						    size_t key_len,
+-						    size_t mic_len);
+-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
++struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[],
++						      size_t key_len,
++						      size_t mic_len);
++void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
+ 			       u8 *data, size_t data_len, u8 *mic,
+ 			       size_t mic_len);
+-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
++int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
+ 			      u8 *data, size_t data_len, u8 *mic,
+ 			      size_t mic_len);
+-void ieee80211_aes_key_free(struct crypto_aead *tfm);
++void ieee80211_aes_key_free(struct crypto_cipher *tfm);
+ 
+ #endif /* AES_CCM_H */
+--- a/net/mac80211/aes_gcm.h
++++ b/net/mac80211/aes_gcm.h
+@@ -11,12 +11,28 @@
+ 
+ #include <linux/crypto.h>
+ 
+-void ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
+-			       u8 *data, size_t data_len, u8 *mic);
+-int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
+-			      u8 *data, size_t data_len, u8 *mic);
+-struct crypto_aead *ieee80211_aes_gcm_key_setup_encrypt(const u8 key[],
+-							size_t key_len);
+-void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm);
++static inline void
++ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
++			  u8 *data, size_t data_len, u8 *mic)
++{
++}
++
++static inline int
++ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
++			  u8 *data, size_t data_len, u8 *mic)
++{
++    return -EOPNOTSUPP;
++}
++
++static inline struct crypto_aead *
++ieee80211_aes_gcm_key_setup_encrypt(const u8 key[], size_t key_len)
++{
++    return NULL;
++}
++
++static inline void
++ieee80211_aes_gcm_key_free(struct crypto_aead *tfm)
++{
++}
+ 
+ #endif /* AES_GCM_H */
+--- a/net/mac80211/aes_gmac.h
++++ b/net/mac80211/aes_gmac.h
+@@ -11,10 +11,22 @@
+ 
+ #include <linux/crypto.h>
+ 
+-struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
+-						 size_t key_len);
+-int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
+-		       const u8 *data, size_t data_len, u8 *mic);
+-void ieee80211_aes_gmac_key_free(struct crypto_aead *tfm);
++static inline struct crypto_aead *
++ieee80211_aes_gmac_key_setup(const u8 key[], size_t key_len)
++{
++	return NULL;
++}
++
++static inline int
++ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
++		   const u8 *data, size_t data_len, u8 *mic)
++{
++	return -EOPNOTSUPP;
++}
++
++static inline void
++ieee80211_aes_gmac_key_free(struct crypto_aead *tfm)
++{
++}
+ 
+ #endif /* AES_GMAC_H */
+--- a/net/mac80211/key.h
++++ b/net/mac80211/key.h
+@@ -84,7 +84,7 @@ struct ieee80211_key {
+ 			 * Management frames.
+ 			 */
+ 			u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
+-			struct crypto_aead *tfm;
++			struct crypto_cipher *tfm;
+ 			u32 replays; /* dot11RSNAStatsCCMPReplays */
+ 		} ccmp;
+ 		struct {
+--- a/net/mac80211/wpa.c
++++ b/net/mac80211/wpa.c
+@@ -307,7 +307,8 @@ ieee80211_crypto_tkip_decrypt(struct iee
+ }
+ 
+ 
+-static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad)
++static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
++				u16 data_len)
+ {
+ 	__le16 mask_fc;
+ 	int a4_included, mgmt;
+@@ -337,14 +338,8 @@ static void ccmp_special_blocks(struct s
+ 	else
+ 		qos_tid = 0;
+ 
+-	/* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
+-	 * mode authentication are not allowed to collide, yet both are derived
+-	 * from this vector b_0. We only set L := 1 here to indicate that the
+-	 * data size can be represented in (L+1) bytes. The CCM layer will take
+-	 * care of storing the data length in the top (L+1) bytes and setting
+-	 * and clearing the other bits as is required to derive the two IVs.
+-	 */
+-	b_0[0] = 0x1;
++	/* First block, b_0 */
++	b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
+ 
+ 	/* Nonce: Nonce Flags | A2 | PN
+ 	 * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
+@@ -352,6 +347,8 @@ static void ccmp_special_blocks(struct s
+ 	b_0[1] = qos_tid | (mgmt << 4);
+ 	memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
+ 	memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
++	/* l(m) */
++	put_unaligned_be16(data_len, &b_0[14]);
+ 
+ 	/* AAD (extra authenticate-only data) / masked 802.11 header
+ 	 * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
+@@ -463,7 +460,7 @@ static int ccmp_encrypt_skb(struct ieee8
+ 		return 0;
+ 
+ 	pos += IEEE80211_CCMP_HDR_LEN;
+-	ccmp_special_blocks(skb, pn, b_0, aad);
++	ccmp_special_blocks(skb, pn, b_0, aad, len);
+ 	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
+ 				  skb_put(skb, mic_len), mic_len);
+ 
+@@ -534,7 +531,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee
+ 			u8 aad[2 * AES_BLOCK_SIZE];
+ 			u8 b_0[AES_BLOCK_SIZE];
+ 			/* hardware didn't decrypt/verify MIC */
+-			ccmp_special_blocks(skb, pn, b_0, aad);
++			ccmp_special_blocks(skb, pn, b_0, aad, data_len);
+ 
+ 			if (ieee80211_aes_ccm_decrypt(
+ 				    key->u.ccmp.tfm, b_0, aad,
diff --git a/package/kernel/mac80211/patches/100-revert-cryptoapi-ports.patch b/package/kernel/mac80211/patches/100-revert-cryptoapi-ports.patch
deleted file mode 100644
index ceca9520f1231c28fd2705eaca97f8b49a28224d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/100-revert-cryptoapi-ports.patch
+++ /dev/null
@@ -1,2055 +0,0 @@
-This patch reverts the following commits from wireless-testing:
-
-8ade538bf39b1ee53418528fdacd36b8e65621b9
-56c52da2d554f081e8fce58ecbcf6a40c605b95b
-2b2ba0db1c820d04d5143452d70012cd44d7b578
-00b9cfa3ff38401bd70c34b250ca13e5ea347b4a
-4f031fa9f188b2b0641ac20087d9e16bcfb4e49d
-6e1ee5d2e9e411892b5d84e3ea93e3fc88ac786c
-30ef7ef9672d92ab2cac37f60a31955c118321e7
-f359d3fe832e49eeec2232b2af5a9e3aee6b4862 (only the changes in aes_cmac.{c,h})
-7ec7c4a9a686c608315739ab6a2b0527a240883c
----
-
---- a/include/linux/ieee80211.h
-+++ b/include/linux/ieee80211.h
-@@ -1017,15 +1017,6 @@ struct ieee80211_mmie {
- 	u8 mic[8];
- } __packed;
- 
--/* Management MIC information element (IEEE 802.11w) for GMAC and CMAC-256 */
--struct ieee80211_mmie_16 {
--	u8 element_id;
--	u8 length;
--	__le16 key_id;
--	u8 sequence_number[6];
--	u8 mic[16];
--} __packed;
--
- struct ieee80211_vendor_ie {
- 	u8 element_id;
- 	u8 len;
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -1306,8 +1306,8 @@ struct ieee80211_vif *wdev_to_ieee80211_
-  * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates
-  *	that the key is pairwise rather then a shared key.
-  * @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a
-- *	CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames
-- *	(MFP) to be done in software.
-+ *	CCMP key if it requires CCMP encryption of management frames (MFP) to
-+ *	be done in software.
-  * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver
-  *	if space should be prepared for the IV, but the IV
-  *	itself should not be generated. Do not set together with
-@@ -1322,7 +1322,7 @@ struct ieee80211_vif *wdev_to_ieee80211_
-  *	RX, if your crypto engine can't deal with TX you can also set the
-  *	%IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW.
-  * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the
-- *	driver for a CCMP/GCMP key to indicate that is requires IV generation
-+ *	driver for a CCMP key to indicate that is requires IV generation
-  *	only for managment frames (MFP).
-  * @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the
-  *	driver for a key to indicate that sufficient tailroom must always
-@@ -4112,10 +4112,6 @@ void ieee80211_aes_cmac_calculate_k1_k2(
-  *	reverse order than in packet)
-  * @aes_cmac: PN data, most significant byte first (big endian,
-  *	reverse order than in packet)
-- * @aes_gmac: PN data, most significant byte first (big endian,
-- *	reverse order than in packet)
-- * @gcmp: PN data, most significant byte first (big endian,
-- *	reverse order than in packet)
-  */
- struct ieee80211_key_seq {
- 	union {
-@@ -4129,12 +4125,6 @@ struct ieee80211_key_seq {
- 		struct {
- 			u8 pn[6];
- 		} aes_cmac;
--		struct {
--			u8 pn[6];
--		} aes_gmac;
--		struct {
--			u8 pn[6];
--		} gcmp;
- 	};
- };
- 
-@@ -4159,7 +4149,7 @@ void ieee80211_get_key_tx_seq(struct iee
-  * ieee80211_get_key_rx_seq - get key RX sequence counter
-  *
-  * @keyconf: the parameter passed with the set key
-- * @tid: The TID, or -1 for the management frame value (CCMP/GCMP only);
-+ * @tid: The TID, or -1 for the management frame value (CCMP only);
-  *	the value on TID 0 is also used for non-QoS frames. For
-  *	CMAC, only TID 0 is valid.
-  * @seq: buffer to receive the sequence data
-@@ -4195,7 +4185,7 @@ void ieee80211_set_key_tx_seq(struct iee
-  * ieee80211_set_key_rx_seq - set key RX sequence counter
-  *
-  * @keyconf: the parameter passed with the set key
-- * @tid: The TID, or -1 for the management frame value (CCMP/GCMP only);
-+ * @tid: The TID, or -1 for the management frame value (CCMP only);
-  *	the value on TID 0 is also used for non-QoS frames. For
-  *	CMAC, only TID 0 is valid.
-  * @seq: new sequence data
---- a/net/mac80211/Kconfig
-+++ b/net/mac80211/Kconfig
-@@ -5,8 +5,6 @@ config MAC80211
- 	depends on CRYPTO
- 	depends on CRYPTO_ARC4
- 	depends on CRYPTO_AES
--	select BPAUTO_CRYPTO_CCM
--	depends on CRYPTO_GCM
- 	depends on CRC32
- 	select BPAUTO_AVERAGE
- 	---help---
---- a/net/mac80211/Makefile
-+++ b/net/mac80211/Makefile
-@@ -15,9 +15,7 @@ mac80211-y := \
- 	michael.o \
- 	tkip.o \
- 	aes_ccm.o \
--	aes_gcm.o \
- 	aes_cmac.o \
--	aes_gmac.o \
- 	cfg.o \
- 	ethtool.o \
- 	rx.o \
---- a/net/mac80211/aes_ccm.c
-+++ b/net/mac80211/aes_ccm.c
-@@ -2,8 +2,6 @@
-  * Copyright 2003-2004, Instant802 Networks, Inc.
-  * Copyright 2005-2006, Devicescape Software, Inc.
-  *
-- * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
-- *
-  * This program is free software; you can redistribute it and/or modify
-  * it under the terms of the GNU General Public License version 2 as
-  * published by the Free Software Foundation.
-@@ -19,82 +17,134 @@
- #include "key.h"
- #include "aes_ccm.h"
- 
--void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
--			       u8 *data, size_t data_len, u8 *mic,
--			       size_t mic_len)
-+static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *scratch, u8 *a)
-+{
-+	int i;
-+	u8 *b_0, *aad, *b, *s_0;
-+
-+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
-+	aad = scratch + 4 * AES_BLOCK_SIZE;
-+	b = scratch;
-+	s_0 = scratch + AES_BLOCK_SIZE;
-+
-+	crypto_cipher_encrypt_one(tfm, b, b_0);
-+
-+	/* Extra Authenticate-only data (always two AES blocks) */
-+	for (i = 0; i < AES_BLOCK_SIZE; i++)
-+		aad[i] ^= b[i];
-+	crypto_cipher_encrypt_one(tfm, b, aad);
-+
-+	aad += AES_BLOCK_SIZE;
-+
-+	for (i = 0; i < AES_BLOCK_SIZE; i++)
-+		aad[i] ^= b[i];
-+	crypto_cipher_encrypt_one(tfm, a, aad);
-+
-+	/* Mask out bits from auth-only-b_0 */
-+	b_0[0] &= 0x07;
-+
-+	/* S_0 is used to encrypt T (= MIC) */
-+	b_0[14] = 0;
-+	b_0[15] = 0;
-+	crypto_cipher_encrypt_one(tfm, s_0, b_0);
-+}
-+
-+
-+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
-+			       u8 *data, size_t data_len,
-+			       u8 *cdata, u8 *mic)
- {
--	struct scatterlist assoc, pt, ct[2];
-+	int i, j, last_len, num_blocks;
-+	u8 *pos, *cpos, *b, *s_0, *e, *b_0;
- 
--	char aead_req_data[sizeof(struct aead_request) +
--			   crypto_aead_reqsize(tfm)]
--		__aligned(__alignof__(struct aead_request));
--	struct aead_request *aead_req = (void *) aead_req_data;
--
--	memset(aead_req, 0, sizeof(aead_req_data));
--
--	sg_init_one(&pt, data, data_len);
--	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
--	sg_init_table(ct, 2);
--	sg_set_buf(&ct[0], data, data_len);
--	sg_set_buf(&ct[1], mic, mic_len);
--
--	aead_request_set_tfm(aead_req, tfm);
--	aead_request_set_assoc(aead_req, &assoc, assoc.length);
--	aead_request_set_crypt(aead_req, &pt, ct, data_len, b_0);
-+	b = scratch;
-+	s_0 = scratch + AES_BLOCK_SIZE;
-+	e = scratch + 2 * AES_BLOCK_SIZE;
-+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
-+
-+	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
-+	last_len = data_len % AES_BLOCK_SIZE;
-+	aes_ccm_prepare(tfm, scratch, b);
-+
-+	/* Process payload blocks */
-+	pos = data;
-+	cpos = cdata;
-+	for (j = 1; j <= num_blocks; j++) {
-+		int blen = (j == num_blocks && last_len) ?
-+			last_len : AES_BLOCK_SIZE;
-+
-+		/* Authentication followed by encryption */
-+		for (i = 0; i < blen; i++)
-+			b[i] ^= pos[i];
-+		crypto_cipher_encrypt_one(tfm, b, b);
-+
-+		b_0[14] = (j >> 8) & 0xff;
-+		b_0[15] = j & 0xff;
-+		crypto_cipher_encrypt_one(tfm, e, b_0);
-+		for (i = 0; i < blen; i++)
-+			*cpos++ = *pos++ ^ e[i];
-+	}
- 
--	crypto_aead_encrypt(aead_req);
-+	for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++)
-+		mic[i] = b[i] ^ s_0[i];
- }
- 
--int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
--			      u8 *data, size_t data_len, u8 *mic,
--			      size_t mic_len)
-+
-+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
-+			      u8 *cdata, size_t data_len, u8 *mic, u8 *data)
- {
--	struct scatterlist assoc, pt, ct[2];
--	char aead_req_data[sizeof(struct aead_request) +
--			   crypto_aead_reqsize(tfm)]
--		__aligned(__alignof__(struct aead_request));
--	struct aead_request *aead_req = (void *) aead_req_data;
--
--	if (data_len == 0)
--		return -EINVAL;
--
--	memset(aead_req, 0, sizeof(aead_req_data));
--
--	sg_init_one(&pt, data, data_len);
--	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
--	sg_init_table(ct, 2);
--	sg_set_buf(&ct[0], data, data_len);
--	sg_set_buf(&ct[1], mic, mic_len);
--
--	aead_request_set_tfm(aead_req, tfm);
--	aead_request_set_assoc(aead_req, &assoc, assoc.length);
--	aead_request_set_crypt(aead_req, ct, &pt, data_len + mic_len, b_0);
-+	int i, j, last_len, num_blocks;
-+	u8 *pos, *cpos, *b, *s_0, *a, *b_0;
-+
-+	b = scratch;
-+	s_0 = scratch + AES_BLOCK_SIZE;
-+	a = scratch + 2 * AES_BLOCK_SIZE;
-+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
-+
-+	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
-+	last_len = data_len % AES_BLOCK_SIZE;
-+	aes_ccm_prepare(tfm, scratch, a);
-+
-+	/* Process payload blocks */
-+	cpos = cdata;
-+	pos = data;
-+	for (j = 1; j <= num_blocks; j++) {
-+		int blen = (j == num_blocks && last_len) ?
-+			last_len : AES_BLOCK_SIZE;
-+
-+		/* Decryption followed by authentication */
-+		b_0[14] = (j >> 8) & 0xff;
-+		b_0[15] = j & 0xff;
-+		crypto_cipher_encrypt_one(tfm, b, b_0);
-+		for (i = 0; i < blen; i++) {
-+			*pos = *cpos++ ^ b[i];
-+			a[i] ^= *pos++;
-+		}
-+		crypto_cipher_encrypt_one(tfm, a, a);
-+	}
-+
-+	for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) {
-+		if ((mic[i] ^ s_0[i]) != a[i])
-+			return -1;
-+	}
- 
--	return crypto_aead_decrypt(aead_req);
-+	return 0;
- }
- 
--struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[],
--						    size_t key_len,
--						    size_t mic_len)
-+
-+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
- {
--	struct crypto_aead *tfm;
--	int err;
-+	struct crypto_cipher *tfm;
- 
--	tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
--	if (IS_ERR(tfm))
--		return tfm;
--
--	err = crypto_aead_setkey(tfm, key, key_len);
--	if (!err)
--		err = crypto_aead_setauthsize(tfm, mic_len);
--	if (!err)
--		return tfm;
-+	tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
-+	if (!IS_ERR(tfm))
-+		crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
- 
--	crypto_free_aead(tfm);
--	return ERR_PTR(err);
-+	return tfm;
- }
- 
--void ieee80211_aes_key_free(struct crypto_aead *tfm)
-+
-+void ieee80211_aes_key_free(struct crypto_cipher *tfm)
- {
--	crypto_free_aead(tfm);
-+	crypto_free_cipher(tfm);
- }
---- a/net/mac80211/aes_ccm.h
-+++ b/net/mac80211/aes_ccm.h
-@@ -12,15 +12,13 @@
- 
- #include <linux/crypto.h>
- 
--struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[],
--						    size_t key_len,
--						    size_t mic_len);
--void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
--			       u8 *data, size_t data_len, u8 *mic,
--			       size_t mic_len);
--int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
--			      u8 *data, size_t data_len, u8 *mic,
--			      size_t mic_len);
--void ieee80211_aes_key_free(struct crypto_aead *tfm);
-+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[]);
-+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
-+			       u8 *data, size_t data_len,
-+			       u8 *cdata, u8 *mic);
-+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
-+			      u8 *cdata, size_t data_len,
-+			      u8 *mic, u8 *data);
-+void ieee80211_aes_key_free(struct crypto_cipher *tfm);
- 
- #endif /* AES_CCM_H */
---- a/net/mac80211/aes_cmac.c
-+++ b/net/mac80211/aes_cmac.c
-@@ -18,8 +18,8 @@
- #include "key.h"
- #include "aes_cmac.h"
- 
-+#define AES_CMAC_KEY_LEN 16
- #define CMAC_TLEN 8 /* CMAC TLen = 64 bits (8 octets) */
--#define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */
- #define AAD_LEN 20
- 
- 
-@@ -35,9 +35,9 @@ static void gf_mulx(u8 *pad)
- 		pad[AES_BLOCK_SIZE - 1] ^= 0x87;
- }
- 
--static void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
--			    const u8 *addr[], const size_t *len, u8 *mac,
--			    size_t mac_len)
-+
-+static void aes_128_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
-+				const u8 *addr[], const size_t *len, u8 *mac)
- {
- 	u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
- 	const u8 *pos, *end;
-@@ -88,7 +88,7 @@ static void aes_cmac_vector(struct crypt
- 	for (i = 0; i < AES_BLOCK_SIZE; i++)
- 		pad[i] ^= cbc[i];
- 	crypto_cipher_encrypt_one(tfm, pad, pad);
--	memcpy(mac, pad, mac_len);
-+	memcpy(mac, pad, CMAC_TLEN);
- }
- 
- 
-@@ -107,35 +107,17 @@ void ieee80211_aes_cmac(struct crypto_ci
- 	addr[2] = zero;
- 	len[2] = CMAC_TLEN;
- 
--	aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN);
-+	aes_128_cmac_vector(tfm, 3, addr, len, mic);
- }
- 
--void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
--			    const u8 *data, size_t data_len, u8 *mic)
--{
--	const u8 *addr[3];
--	size_t len[3];
--	u8 zero[CMAC_TLEN_256];
--
--	memset(zero, 0, CMAC_TLEN_256);
--	addr[0] = aad;
--	len[0] = AAD_LEN;
--	addr[1] = data;
--	len[1] = data_len - CMAC_TLEN_256;
--	addr[2] = zero;
--	len[2] = CMAC_TLEN_256;
--
--	aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256);
--}
- 
--struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
--						   size_t key_len)
-+struct crypto_cipher * ieee80211_aes_cmac_key_setup(const u8 key[])
- {
- 	struct crypto_cipher *tfm;
- 
- 	tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
- 	if (!IS_ERR(tfm))
--		crypto_cipher_setkey(tfm, key, key_len);
-+		crypto_cipher_setkey(tfm, key, AES_CMAC_KEY_LEN);
- 
- 	return tfm;
- }
---- a/net/mac80211/aes_cmac.h
-+++ b/net/mac80211/aes_cmac.h
-@@ -11,12 +11,9 @@
- 
- #include <linux/crypto.h>
- 
--struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
--						   size_t key_len);
-+struct crypto_cipher * ieee80211_aes_cmac_key_setup(const u8 key[]);
- void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
- 			const u8 *data, size_t data_len, u8 *mic);
--void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
--			    const u8 *data, size_t data_len, u8 *mic);
- void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm);
- 
- #endif /* AES_CMAC_H */
---- a/net/mac80211/aes_gcm.c
-+++ /dev/null
-@@ -1,95 +0,0 @@
--/*
-- * Copyright 2014-2015, Qualcomm Atheros, Inc.
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- */
--
--#include <linux/kernel.h>
--#include <linux/types.h>
--#include <linux/crypto.h>
--#include <linux/err.h>
--#include <crypto/aes.h>
--
--#include <net/mac80211.h>
--#include "key.h"
--#include "aes_gcm.h"
--
--void ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
--			       u8 *data, size_t data_len, u8 *mic)
--{
--	struct scatterlist assoc, pt, ct[2];
--
--	char aead_req_data[sizeof(struct aead_request) +
--			   crypto_aead_reqsize(tfm)]
--		__aligned(__alignof__(struct aead_request));
--	struct aead_request *aead_req = (void *)aead_req_data;
--
--	memset(aead_req, 0, sizeof(aead_req_data));
--
--	sg_init_one(&pt, data, data_len);
--	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
--	sg_init_table(ct, 2);
--	sg_set_buf(&ct[0], data, data_len);
--	sg_set_buf(&ct[1], mic, IEEE80211_GCMP_MIC_LEN);
--
--	aead_request_set_tfm(aead_req, tfm);
--	aead_request_set_assoc(aead_req, &assoc, assoc.length);
--	aead_request_set_crypt(aead_req, &pt, ct, data_len, j_0);
--
--	crypto_aead_encrypt(aead_req);
--}
--
--int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
--			      u8 *data, size_t data_len, u8 *mic)
--{
--	struct scatterlist assoc, pt, ct[2];
--	char aead_req_data[sizeof(struct aead_request) +
--			   crypto_aead_reqsize(tfm)]
--		__aligned(__alignof__(struct aead_request));
--	struct aead_request *aead_req = (void *)aead_req_data;
--
--	if (data_len == 0)
--		return -EINVAL;
--
--	memset(aead_req, 0, sizeof(aead_req_data));
--
--	sg_init_one(&pt, data, data_len);
--	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
--	sg_init_table(ct, 2);
--	sg_set_buf(&ct[0], data, data_len);
--	sg_set_buf(&ct[1], mic, IEEE80211_GCMP_MIC_LEN);
--
--	aead_request_set_tfm(aead_req, tfm);
--	aead_request_set_assoc(aead_req, &assoc, assoc.length);
--	aead_request_set_crypt(aead_req, ct, &pt,
--			       data_len + IEEE80211_GCMP_MIC_LEN, j_0);
--
--	return crypto_aead_decrypt(aead_req);
--}
--
--struct crypto_aead *ieee80211_aes_gcm_key_setup_encrypt(const u8 key[],
--							size_t key_len)
--{
--	struct crypto_aead *tfm;
--	int err;
--
--	tfm = crypto_alloc_aead("gcm(aes)", 0, CRYPTO_ALG_ASYNC);
--	if (IS_ERR(tfm))
--		return tfm;
--
--	err = crypto_aead_setkey(tfm, key, key_len);
--	if (!err)
--		err = crypto_aead_setauthsize(tfm, IEEE80211_GCMP_MIC_LEN);
--	if (!err)
--		return tfm;
--
--	crypto_free_aead(tfm);
--	return ERR_PTR(err);
--}
--
--void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm)
--{
--	crypto_free_aead(tfm);
--}
---- a/net/mac80211/aes_gcm.h
-+++ /dev/null
-@@ -1,22 +0,0 @@
--/*
-- * Copyright 2014-2015, Qualcomm Atheros, Inc.
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- */
--
--#ifndef AES_GCM_H
--#define AES_GCM_H
--
--#include <linux/crypto.h>
--
--void ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
--			       u8 *data, size_t data_len, u8 *mic);
--int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
--			      u8 *data, size_t data_len, u8 *mic);
--struct crypto_aead *ieee80211_aes_gcm_key_setup_encrypt(const u8 key[],
--							size_t key_len);
--void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm);
--
--#endif /* AES_GCM_H */
---- a/net/mac80211/aes_gmac.c
-+++ /dev/null
-@@ -1,84 +0,0 @@
--/*
-- * AES-GMAC for IEEE 802.11 BIP-GMAC-128 and BIP-GMAC-256
-- * Copyright 2015, Qualcomm Atheros, Inc.
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- */
--
--#include <linux/kernel.h>
--#include <linux/types.h>
--#include <linux/crypto.h>
--#include <linux/err.h>
--#include <crypto/aes.h>
--
--#include <net/mac80211.h>
--#include "key.h"
--#include "aes_gmac.h"
--
--#define GMAC_MIC_LEN 16
--#define GMAC_NONCE_LEN 12
--#define AAD_LEN 20
--
--int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
--		       const u8 *data, size_t data_len, u8 *mic)
--{
--	struct scatterlist sg[3], ct[1];
--	char aead_req_data[sizeof(struct aead_request) +
--			   crypto_aead_reqsize(tfm)]
--		__aligned(__alignof__(struct aead_request));
--	struct aead_request *aead_req = (void *)aead_req_data;
--	u8 zero[GMAC_MIC_LEN], iv[AES_BLOCK_SIZE];
--
--	if (data_len < GMAC_MIC_LEN)
--		return -EINVAL;
--
--	memset(aead_req, 0, sizeof(aead_req_data));
--
--	memset(zero, 0, GMAC_MIC_LEN);
--	sg_init_table(sg, 3);
--	sg_set_buf(&sg[0], aad, AAD_LEN);
--	sg_set_buf(&sg[1], data, data_len - GMAC_MIC_LEN);
--	sg_set_buf(&sg[2], zero, GMAC_MIC_LEN);
--
--	memcpy(iv, nonce, GMAC_NONCE_LEN);
--	memset(iv + GMAC_NONCE_LEN, 0, sizeof(iv) - GMAC_NONCE_LEN);
--	iv[AES_BLOCK_SIZE - 1] = 0x01;
--
--	sg_init_table(ct, 1);
--	sg_set_buf(&ct[0], mic, GMAC_MIC_LEN);
--
--	aead_request_set_tfm(aead_req, tfm);
--	aead_request_set_assoc(aead_req, sg, AAD_LEN + data_len);
--	aead_request_set_crypt(aead_req, NULL, ct, 0, iv);
--
--	crypto_aead_encrypt(aead_req);
--
--	return 0;
--}
--
--struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
--						 size_t key_len)
--{
--	struct crypto_aead *tfm;
--	int err;
--
--	tfm = crypto_alloc_aead("gcm(aes)", 0, CRYPTO_ALG_ASYNC);
--	if (IS_ERR(tfm))
--		return tfm;
--
--	err = crypto_aead_setkey(tfm, key, key_len);
--	if (!err)
--		return tfm;
--	if (!err)
--		err = crypto_aead_setauthsize(tfm, GMAC_MIC_LEN);
--
--	crypto_free_aead(tfm);
--	return ERR_PTR(err);
--}
--
--void ieee80211_aes_gmac_key_free(struct crypto_aead *tfm)
--{
--	crypto_free_aead(tfm);
--}
---- a/net/mac80211/aes_gmac.h
-+++ /dev/null
-@@ -1,20 +0,0 @@
--/*
-- * Copyright 2015, Qualcomm Atheros, Inc.
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- */
--
--#ifndef AES_GMAC_H
--#define AES_GMAC_H
--
--#include <linux/crypto.h>
--
--struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
--						 size_t key_len);
--int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
--		       const u8 *data, size_t data_len, u8 *mic);
--void ieee80211_aes_gmac_key_free(struct crypto_aead *tfm);
--
--#endif /* AES_GMAC_H */
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -162,13 +162,8 @@ static int ieee80211_add_key(struct wiph
- 			return -EINVAL;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
- 	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
- 		break;
- 	default:
- 		cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type);
-@@ -353,7 +348,6 @@ static int ieee80211_get_key(struct wiph
- 		params.seq_len = 6;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		pn64 = atomic64_read(&key->u.ccmp.tx_pn);
- 		seq[0] = pn64;
- 		seq[1] = pn64 >> 8;
-@@ -365,35 +359,10 @@ static int ieee80211_get_key(struct wiph
- 		params.seq_len = 6;
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		pn64 = atomic64_read(&key->u.aes_cmac.tx_pn);
- 		seq[0] = pn64;
- 		seq[1] = pn64 >> 8;
- 		seq[2] = pn64 >> 16;
--		seq[3] = pn64 >> 24;
--		seq[4] = pn64 >> 32;
--		seq[5] = pn64 >> 40;
--		params.seq = seq;
--		params.seq_len = 6;
--		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		pn64 = atomic64_read(&key->u.aes_gmac.tx_pn);
--		seq[0] = pn64;
--		seq[1] = pn64 >> 8;
--		seq[2] = pn64 >> 16;
--		seq[3] = pn64 >> 24;
--		seq[4] = pn64 >> 32;
--		seq[5] = pn64 >> 40;
--		params.seq = seq;
--		params.seq_len = 6;
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		pn64 = atomic64_read(&key->u.gcmp.tx_pn);
--		seq[0] = pn64;
--		seq[1] = pn64 >> 8;
--		seq[2] = pn64 >> 16;
- 		seq[3] = pn64 >> 24;
- 		seq[4] = pn64 >> 32;
- 		seq[5] = pn64 >> 40;
---- a/net/mac80211/debugfs_key.c
-+++ b/net/mac80211/debugfs_key.c
-@@ -94,33 +94,17 @@ static ssize_t key_tx_spec_read(struct f
- 				key->u.tkip.tx.iv16);
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		pn = atomic64_read(&key->u.ccmp.tx_pn);
- 		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
- 				(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
- 				(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		pn = atomic64_read(&key->u.aes_cmac.tx_pn);
- 		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
- 				(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
- 				(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		pn = atomic64_read(&key->u.aes_gmac.tx_pn);
--		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
--				(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
--				(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		pn = atomic64_read(&key->u.gcmp.tx_pn);
--		len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
--				(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
--				(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
--		break;
- 	default:
- 		return 0;
- 	}
-@@ -150,7 +134,6 @@ static ssize_t key_rx_spec_read(struct f
- 		len = p - buf;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
- 			rpn = key->u.ccmp.rx_pn[i];
- 			p += scnprintf(p, sizeof(buf)+buf-p,
-@@ -161,7 +144,6 @@ static ssize_t key_rx_spec_read(struct f
- 		len = p - buf;
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		rpn = key->u.aes_cmac.rx_pn;
- 		p += scnprintf(p, sizeof(buf)+buf-p,
- 			       "%02x%02x%02x%02x%02x%02x\n",
-@@ -169,26 +151,6 @@ static ssize_t key_rx_spec_read(struct f
- 			       rpn[3], rpn[4], rpn[5]);
- 		len = p - buf;
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		rpn = key->u.aes_gmac.rx_pn;
--		p += scnprintf(p, sizeof(buf)+buf-p,
--			       "%02x%02x%02x%02x%02x%02x\n",
--			       rpn[0], rpn[1], rpn[2],
--			       rpn[3], rpn[4], rpn[5]);
--		len = p - buf;
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
--			rpn = key->u.gcmp.rx_pn[i];
--			p += scnprintf(p, sizeof(buf)+buf-p,
--				       "%02x%02x%02x%02x%02x%02x\n",
--				       rpn[0], rpn[1], rpn[2],
--				       rpn[3], rpn[4], rpn[5]);
--		}
--		len = p - buf;
--		break;
- 	default:
- 		return 0;
- 	}
-@@ -205,23 +167,12 @@ static ssize_t key_replays_read(struct f
- 
- 	switch (key->conf.cipher) {
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays);
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		len = scnprintf(buf, sizeof(buf), "%u\n",
- 				key->u.aes_cmac.replays);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		len = scnprintf(buf, sizeof(buf), "%u\n",
--				key->u.aes_gmac.replays);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		len = scnprintf(buf, sizeof(buf), "%u\n", key->u.gcmp.replays);
--		break;
- 	default:
- 		return 0;
- 	}
-@@ -238,15 +189,9 @@ static ssize_t key_icverrors_read(struct
- 
- 	switch (key->conf.cipher) {
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		len = scnprintf(buf, sizeof(buf), "%u\n",
- 				key->u.aes_cmac.icverrors);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		len = scnprintf(buf, sizeof(buf), "%u\n",
--				key->u.aes_gmac.icverrors);
--		break;
- 	default:
- 		return 0;
- 	}
---- a/net/mac80211/key.c
-+++ b/net/mac80211/key.c
-@@ -24,8 +24,6 @@
- #include "debugfs_key.h"
- #include "aes_ccm.h"
- #include "aes_cmac.h"
--#include "aes_gmac.h"
--#include "aes_gcm.h"
- 
- 
- /**
-@@ -164,13 +162,7 @@ static int ieee80211_key_enable_hw_accel
- 	case WLAN_CIPHER_SUITE_WEP104:
- 	case WLAN_CIPHER_SUITE_TKIP:
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
- 		/* all of these we can do in software - if driver can */
- 		if (ret == 1)
- 			return 0;
-@@ -394,26 +386,7 @@ ieee80211_key_alloc(u32 cipher, int idx,
- 		 * Initialize AES key state here as an optimization so that
- 		 * it does not need to be initialized for every packet.
- 		 */
--		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
--			key_data, key_len, IEEE80211_CCMP_MIC_LEN);
--		if (IS_ERR(key->u.ccmp.tfm)) {
--			err = PTR_ERR(key->u.ccmp.tfm);
--			kfree(key);
--			return ERR_PTR(err);
--		}
--		break;
--	case WLAN_CIPHER_SUITE_CCMP_256:
--		key->conf.iv_len = IEEE80211_CCMP_256_HDR_LEN;
--		key->conf.icv_len = IEEE80211_CCMP_256_MIC_LEN;
--		for (i = 0; seq && i < IEEE80211_NUM_TIDS + 1; i++)
--			for (j = 0; j < IEEE80211_CCMP_256_PN_LEN; j++)
--				key->u.ccmp.rx_pn[i][j] =
--					seq[IEEE80211_CCMP_256_PN_LEN - j - 1];
--		/* Initialize AES key state here as an optimization so that
--		 * it does not need to be initialized for every packet.
--		 */
--		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
--			key_data, key_len, IEEE80211_CCMP_256_MIC_LEN);
-+		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(key_data);
- 		if (IS_ERR(key->u.ccmp.tfm)) {
- 			err = PTR_ERR(key->u.ccmp.tfm);
- 			kfree(key);
-@@ -421,12 +394,8 @@ ieee80211_key_alloc(u32 cipher, int idx,
- 		}
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		key->conf.iv_len = 0;
--		if (cipher == WLAN_CIPHER_SUITE_AES_CMAC)
--			key->conf.icv_len = sizeof(struct ieee80211_mmie);
--		else
--			key->conf.icv_len = sizeof(struct ieee80211_mmie_16);
-+		key->conf.icv_len = sizeof(struct ieee80211_mmie);
- 		if (seq)
- 			for (j = 0; j < IEEE80211_CMAC_PN_LEN; j++)
- 				key->u.aes_cmac.rx_pn[j] =
-@@ -436,51 +405,13 @@ ieee80211_key_alloc(u32 cipher, int idx,
- 		 * it does not need to be initialized for every packet.
- 		 */
- 		key->u.aes_cmac.tfm =
--			ieee80211_aes_cmac_key_setup(key_data, key_len);
-+			ieee80211_aes_cmac_key_setup(key_data);
- 		if (IS_ERR(key->u.aes_cmac.tfm)) {
- 			err = PTR_ERR(key->u.aes_cmac.tfm);
- 			kfree(key);
- 			return ERR_PTR(err);
- 		}
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		key->conf.iv_len = 0;
--		key->conf.icv_len = sizeof(struct ieee80211_mmie_16);
--		if (seq)
--			for (j = 0; j < IEEE80211_GMAC_PN_LEN; j++)
--				key->u.aes_gmac.rx_pn[j] =
--					seq[IEEE80211_GMAC_PN_LEN - j - 1];
--		/* Initialize AES key state here as an optimization so that
--		 * it does not need to be initialized for every packet.
--		 */
--		key->u.aes_gmac.tfm =
--			ieee80211_aes_gmac_key_setup(key_data, key_len);
--		if (IS_ERR(key->u.aes_gmac.tfm)) {
--			err = PTR_ERR(key->u.aes_gmac.tfm);
--			kfree(key);
--			return ERR_PTR(err);
--		}
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		key->conf.iv_len = IEEE80211_GCMP_HDR_LEN;
--		key->conf.icv_len = IEEE80211_GCMP_MIC_LEN;
--		for (i = 0; seq && i < IEEE80211_NUM_TIDS + 1; i++)
--			for (j = 0; j < IEEE80211_GCMP_PN_LEN; j++)
--				key->u.gcmp.rx_pn[i][j] =
--					seq[IEEE80211_GCMP_PN_LEN - j - 1];
--		/* Initialize AES key state here as an optimization so that
--		 * it does not need to be initialized for every packet.
--		 */
--		key->u.gcmp.tfm = ieee80211_aes_gcm_key_setup_encrypt(key_data,
--								      key_len);
--		if (IS_ERR(key->u.gcmp.tfm)) {
--			err = PTR_ERR(key->u.gcmp.tfm);
--			kfree(key);
--			return ERR_PTR(err);
--		}
--		break;
- 	default:
- 		if (cs) {
- 			size_t len = (seq_len > MAX_PN_LEN) ?
-@@ -502,24 +433,10 @@ ieee80211_key_alloc(u32 cipher, int idx,
- 
- static void ieee80211_key_free_common(struct ieee80211_key *key)
- {
--	switch (key->conf.cipher) {
--	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
-+	if (key->conf.cipher == WLAN_CIPHER_SUITE_CCMP)
- 		ieee80211_aes_key_free(key->u.ccmp.tfm);
--		break;
--	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
-+	if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC)
- 		ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
--		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		ieee80211_aes_gmac_key_free(key->u.aes_gmac.tfm);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		ieee80211_aes_gcm_key_free(key->u.gcmp.tfm);
--		break;
--	}
- 	kzfree(key);
- }
- 
-@@ -826,7 +743,6 @@ void ieee80211_get_key_tx_seq(struct iee
- 		seq->tkip.iv16 = key->u.tkip.tx.iv16;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		pn64 = atomic64_read(&key->u.ccmp.tx_pn);
- 		seq->ccmp.pn[5] = pn64;
- 		seq->ccmp.pn[4] = pn64 >> 8;
-@@ -836,7 +752,6 @@ void ieee80211_get_key_tx_seq(struct iee
- 		seq->ccmp.pn[0] = pn64 >> 40;
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		pn64 = atomic64_read(&key->u.aes_cmac.tx_pn);
- 		seq->ccmp.pn[5] = pn64;
- 		seq->ccmp.pn[4] = pn64 >> 8;
-@@ -845,26 +760,6 @@ void ieee80211_get_key_tx_seq(struct iee
- 		seq->ccmp.pn[1] = pn64 >> 32;
- 		seq->ccmp.pn[0] = pn64 >> 40;
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		pn64 = atomic64_read(&key->u.aes_gmac.tx_pn);
--		seq->ccmp.pn[5] = pn64;
--		seq->ccmp.pn[4] = pn64 >> 8;
--		seq->ccmp.pn[3] = pn64 >> 16;
--		seq->ccmp.pn[2] = pn64 >> 24;
--		seq->ccmp.pn[1] = pn64 >> 32;
--		seq->ccmp.pn[0] = pn64 >> 40;
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		pn64 = atomic64_read(&key->u.gcmp.tx_pn);
--		seq->gcmp.pn[5] = pn64;
--		seq->gcmp.pn[4] = pn64 >> 8;
--		seq->gcmp.pn[3] = pn64 >> 16;
--		seq->gcmp.pn[2] = pn64 >> 24;
--		seq->gcmp.pn[1] = pn64 >> 32;
--		seq->gcmp.pn[0] = pn64 >> 40;
--		break;
- 	default:
- 		WARN_ON(1);
- 	}
-@@ -887,7 +782,6 @@ void ieee80211_get_key_rx_seq(struct iee
- 		seq->tkip.iv16 = key->u.tkip.rx[tid].iv16;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
- 			return;
- 		if (tid < 0)
-@@ -897,29 +791,11 @@ void ieee80211_get_key_rx_seq(struct iee
- 		memcpy(seq->ccmp.pn, pn, IEEE80211_CCMP_PN_LEN);
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		if (WARN_ON(tid != 0))
- 			return;
- 		pn = key->u.aes_cmac.rx_pn;
- 		memcpy(seq->aes_cmac.pn, pn, IEEE80211_CMAC_PN_LEN);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		if (WARN_ON(tid != 0))
--			return;
--		pn = key->u.aes_gmac.rx_pn;
--		memcpy(seq->aes_gmac.pn, pn, IEEE80211_GMAC_PN_LEN);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
--			return;
--		if (tid < 0)
--			pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS];
--		else
--			pn = key->u.gcmp.rx_pn[tid];
--		memcpy(seq->gcmp.pn, pn, IEEE80211_GCMP_PN_LEN);
--		break;
- 	}
- }
- EXPORT_SYMBOL(ieee80211_get_key_rx_seq);
-@@ -938,7 +814,6 @@ void ieee80211_set_key_tx_seq(struct iee
- 		key->u.tkip.tx.iv16 = seq->tkip.iv16;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		pn64 = (u64)seq->ccmp.pn[5] |
- 		       ((u64)seq->ccmp.pn[4] << 8) |
- 		       ((u64)seq->ccmp.pn[3] << 16) |
-@@ -948,7 +823,6 @@ void ieee80211_set_key_tx_seq(struct iee
- 		atomic64_set(&key->u.ccmp.tx_pn, pn64);
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		pn64 = (u64)seq->aes_cmac.pn[5] |
- 		       ((u64)seq->aes_cmac.pn[4] << 8) |
- 		       ((u64)seq->aes_cmac.pn[3] << 16) |
-@@ -957,26 +831,6 @@ void ieee80211_set_key_tx_seq(struct iee
- 		       ((u64)seq->aes_cmac.pn[0] << 40);
- 		atomic64_set(&key->u.aes_cmac.tx_pn, pn64);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		pn64 = (u64)seq->aes_gmac.pn[5] |
--		       ((u64)seq->aes_gmac.pn[4] << 8) |
--		       ((u64)seq->aes_gmac.pn[3] << 16) |
--		       ((u64)seq->aes_gmac.pn[2] << 24) |
--		       ((u64)seq->aes_gmac.pn[1] << 32) |
--		       ((u64)seq->aes_gmac.pn[0] << 40);
--		atomic64_set(&key->u.aes_gmac.tx_pn, pn64);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		pn64 = (u64)seq->gcmp.pn[5] |
--		       ((u64)seq->gcmp.pn[4] << 8) |
--		       ((u64)seq->gcmp.pn[3] << 16) |
--		       ((u64)seq->gcmp.pn[2] << 24) |
--		       ((u64)seq->gcmp.pn[1] << 32) |
--		       ((u64)seq->gcmp.pn[0] << 40);
--		atomic64_set(&key->u.gcmp.tx_pn, pn64);
--		break;
- 	default:
- 		WARN_ON(1);
- 		break;
-@@ -1000,7 +854,6 @@ void ieee80211_set_key_rx_seq(struct iee
- 		key->u.tkip.rx[tid].iv16 = seq->tkip.iv16;
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--	case WLAN_CIPHER_SUITE_CCMP_256:
- 		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
- 			return;
- 		if (tid < 0)
-@@ -1010,29 +863,11 @@ void ieee80211_set_key_rx_seq(struct iee
- 		memcpy(pn, seq->ccmp.pn, IEEE80211_CCMP_PN_LEN);
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
- 		if (WARN_ON(tid != 0))
- 			return;
- 		pn = key->u.aes_cmac.rx_pn;
- 		memcpy(pn, seq->aes_cmac.pn, IEEE80211_CMAC_PN_LEN);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		if (WARN_ON(tid != 0))
--			return;
--		pn = key->u.aes_gmac.rx_pn;
--		memcpy(pn, seq->aes_gmac.pn, IEEE80211_GMAC_PN_LEN);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
--			return;
--		if (tid < 0)
--			pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS];
--		else
--			pn = key->u.gcmp.rx_pn[tid];
--		memcpy(pn, seq->gcmp.pn, IEEE80211_GCMP_PN_LEN);
--		break;
- 	default:
- 		WARN_ON(1);
- 		break;
---- a/net/mac80211/key.h
-+++ b/net/mac80211/key.h
-@@ -84,7 +84,7 @@ struct ieee80211_key {
- 			 * Management frames.
- 			 */
- 			u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
--			struct crypto_aead *tfm;
-+			struct crypto_cipher *tfm;
- 			u32 replays; /* dot11RSNAStatsCCMPReplays */
- 		} ccmp;
- 		struct {
-@@ -95,24 +95,6 @@ struct ieee80211_key {
- 			u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
- 		} aes_cmac;
- 		struct {
--			atomic64_t tx_pn;
--			u8 rx_pn[IEEE80211_GMAC_PN_LEN];
--			struct crypto_aead *tfm;
--			u32 replays; /* dot11RSNAStatsCMACReplays */
--			u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
--		} aes_gmac;
--		struct {
--			atomic64_t tx_pn;
--			/* Last received packet number. The first
--			 * IEEE80211_NUM_TIDS counters are used with Data
--			 * frames and the last counter is used with Robust
--			 * Management frames.
--			 */
--			u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_GCMP_PN_LEN];
--			struct crypto_aead *tfm;
--			u32 replays; /* dot11RSNAStatsGCMPReplays */
--		} gcmp;
--		struct {
- 			/* generic cipher scheme */
- 			u8 rx_pn[IEEE80211_NUM_TIDS + 1][MAX_PN_LEN];
- 		} gen;
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -666,15 +666,9 @@ static int ieee80211_init_cipher_suites(
- 		WLAN_CIPHER_SUITE_WEP104,
- 		WLAN_CIPHER_SUITE_TKIP,
- 		WLAN_CIPHER_SUITE_CCMP,
--		WLAN_CIPHER_SUITE_CCMP_256,
--		WLAN_CIPHER_SUITE_GCMP,
--		WLAN_CIPHER_SUITE_GCMP_256,
- 
- 		/* keep last -- depends on hw flags! */
--		WLAN_CIPHER_SUITE_AES_CMAC,
--		WLAN_CIPHER_SUITE_BIP_CMAC_256,
--		WLAN_CIPHER_SUITE_BIP_GMAC_128,
--		WLAN_CIPHER_SUITE_BIP_GMAC_256,
-+		WLAN_CIPHER_SUITE_AES_CMAC
- 	};
- 
- 	if (local->hw.flags & IEEE80211_HW_SW_CRYPTO_CONTROL ||
-@@ -713,7 +707,7 @@ static int ieee80211_init_cipher_suites(
- 		local->hw.wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
- 
- 		if (!have_mfp)
--			local->hw.wiphy->n_cipher_suites -= 4;
-+			local->hw.wiphy->n_cipher_suites--;
- 
- 		if (!have_wep) {
- 			local->hw.wiphy->cipher_suites += 2;
-@@ -730,42 +724,32 @@ static int ieee80211_init_cipher_suites(
- 		/* Driver specifies cipher schemes only (but not cipher suites
- 		 * including the schemes)
- 		 *
--		 * We start counting ciphers defined by schemes, TKIP, CCMP,
--		 * CCMP-256, GCMP, and GCMP-256
-+		 * We start counting ciphers defined by schemes, TKIP and CCMP
- 		 */
--		n_suites = local->hw.n_cipher_schemes + 5;
-+		n_suites = local->hw.n_cipher_schemes + 2;
- 
- 		/* check if we have WEP40 and WEP104 */
- 		if (have_wep)
- 			n_suites += 2;
- 
--		/* check if we have AES_CMAC, BIP-CMAC-256, BIP-GMAC-128,
--		 * BIP-GMAC-256
--		 */
-+		/* check if we have AES_CMAC */
- 		if (have_mfp)
--			n_suites += 4;
-+			n_suites++;
- 
- 		suites = kmalloc(sizeof(u32) * n_suites, GFP_KERNEL);
- 		if (!suites)
- 			return -ENOMEM;
- 
- 		suites[w++] = WLAN_CIPHER_SUITE_CCMP;
--		suites[w++] = WLAN_CIPHER_SUITE_CCMP_256;
- 		suites[w++] = WLAN_CIPHER_SUITE_TKIP;
--		suites[w++] = WLAN_CIPHER_SUITE_GCMP;
--		suites[w++] = WLAN_CIPHER_SUITE_GCMP_256;
- 
- 		if (have_wep) {
- 			suites[w++] = WLAN_CIPHER_SUITE_WEP40;
- 			suites[w++] = WLAN_CIPHER_SUITE_WEP104;
- 		}
- 
--		if (have_mfp) {
-+		if (have_mfp)
- 			suites[w++] = WLAN_CIPHER_SUITE_AES_CMAC;
--			suites[w++] = WLAN_CIPHER_SUITE_BIP_CMAC_256;
--			suites[w++] = WLAN_CIPHER_SUITE_BIP_GMAC_128;
--			suites[w++] = WLAN_CIPHER_SUITE_BIP_GMAC_256;
--		}
- 
- 		for (r = 0; r < local->hw.n_cipher_schemes; r++)
- 			suites[w++] = cs[r].cipher;
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -647,7 +647,6 @@ static int ieee80211_get_mmie_keyidx(str
- {
- 	struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *) skb->data;
- 	struct ieee80211_mmie *mmie;
--	struct ieee80211_mmie_16 *mmie16;
- 
- 	if (skb->len < 24 + sizeof(*mmie) || !is_multicast_ether_addr(hdr->da))
- 		return -1;
-@@ -657,18 +656,11 @@ static int ieee80211_get_mmie_keyidx(str
- 
- 	mmie = (struct ieee80211_mmie *)
- 		(skb->data + skb->len - sizeof(*mmie));
--	if (mmie->element_id == WLAN_EID_MMIE &&
--	    mmie->length == sizeof(*mmie) - 2)
--		return le16_to_cpu(mmie->key_id);
--
--	mmie16 = (struct ieee80211_mmie_16 *)
--		(skb->data + skb->len - sizeof(*mmie16));
--	if (skb->len >= 24 + sizeof(*mmie16) &&
--	    mmie16->element_id == WLAN_EID_MMIE &&
--	    mmie16->length == sizeof(*mmie16) - 2)
--		return le16_to_cpu(mmie16->key_id);
-+	if (mmie->element_id != WLAN_EID_MMIE ||
-+	    mmie->length != sizeof(*mmie) - 2)
-+		return -1;
- 
--	return -1;
-+	return le16_to_cpu(mmie->key_id);
- }
- 
- static int iwl80211_get_cs_keyid(const struct ieee80211_cipher_scheme *cs,
-@@ -1658,27 +1650,11 @@ ieee80211_rx_h_decrypt(struct ieee80211_
- 		result = ieee80211_crypto_tkip_decrypt(rx);
- 		break;
- 	case WLAN_CIPHER_SUITE_CCMP:
--		result = ieee80211_crypto_ccmp_decrypt(
--			rx, IEEE80211_CCMP_MIC_LEN);
--		break;
--	case WLAN_CIPHER_SUITE_CCMP_256:
--		result = ieee80211_crypto_ccmp_decrypt(
--			rx, IEEE80211_CCMP_256_MIC_LEN);
-+		result = ieee80211_crypto_ccmp_decrypt(rx);
- 		break;
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
- 		result = ieee80211_crypto_aes_cmac_decrypt(rx);
- 		break;
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
--		result = ieee80211_crypto_aes_cmac_256_decrypt(rx);
--		break;
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		result = ieee80211_crypto_aes_gmac_decrypt(rx);
--		break;
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		result = ieee80211_crypto_gcmp_decrypt(rx);
--		break;
- 	default:
- 		result = ieee80211_crypto_hw_decrypt(rx);
- 	}
-@@ -1805,9 +1781,7 @@ ieee80211_rx_h_defragment(struct ieee802
- 		/* This is the first fragment of a new frame. */
- 		entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
- 						 rx->seqno_idx, &(rx->skb));
--		if (rx->key &&
--		    (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP ||
--		     rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256) &&
-+		if (rx->key && rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP &&
- 		    ieee80211_has_protected(fc)) {
- 			int queue = rx->security_idx;
- 			/* Store CCMP PN so that we can verify that the next
-@@ -1836,9 +1810,7 @@ ieee80211_rx_h_defragment(struct ieee802
- 		int i;
- 		u8 pn[IEEE80211_CCMP_PN_LEN], *rpn;
- 		int queue;
--		if (!rx->key ||
--		    (rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP &&
--		     rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256))
-+		if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP)
- 			return RX_DROP_UNUSABLE;
- 		memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN);
- 		for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) {
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -626,9 +626,6 @@ ieee80211_tx_h_select_key(struct ieee802
- 				tx->key = NULL;
- 			break;
- 		case WLAN_CIPHER_SUITE_CCMP:
--		case WLAN_CIPHER_SUITE_CCMP_256:
--		case WLAN_CIPHER_SUITE_GCMP:
--		case WLAN_CIPHER_SUITE_GCMP_256:
- 			if (!ieee80211_is_data_present(hdr->frame_control) &&
- 			    !ieee80211_use_mfp(hdr->frame_control, tx->sta,
- 					       tx->skb))
-@@ -639,9 +636,6 @@ ieee80211_tx_h_select_key(struct ieee802
- 					ieee80211_is_mgmt(hdr->frame_control);
- 			break;
- 		case WLAN_CIPHER_SUITE_AES_CMAC:
--		case WLAN_CIPHER_SUITE_BIP_CMAC_256:
--		case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--		case WLAN_CIPHER_SUITE_BIP_GMAC_256:
- 			if (!ieee80211_is_mgmt(hdr->frame_control))
- 				tx->key = NULL;
- 			break;
-@@ -1017,21 +1011,9 @@ ieee80211_tx_h_encrypt(struct ieee80211_
- 	case WLAN_CIPHER_SUITE_TKIP:
- 		return ieee80211_crypto_tkip_encrypt(tx);
- 	case WLAN_CIPHER_SUITE_CCMP:
--		return ieee80211_crypto_ccmp_encrypt(
--			tx, IEEE80211_CCMP_MIC_LEN);
--	case WLAN_CIPHER_SUITE_CCMP_256:
--		return ieee80211_crypto_ccmp_encrypt(
--			tx, IEEE80211_CCMP_256_MIC_LEN);
-+		return ieee80211_crypto_ccmp_encrypt(tx);
- 	case WLAN_CIPHER_SUITE_AES_CMAC:
- 		return ieee80211_crypto_aes_cmac_encrypt(tx);
--	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
--		return ieee80211_crypto_aes_cmac_256_encrypt(tx);
--	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
--	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
--		return ieee80211_crypto_aes_gmac_encrypt(tx);
--	case WLAN_CIPHER_SUITE_GCMP:
--	case WLAN_CIPHER_SUITE_GCMP_256:
--		return ieee80211_crypto_gcmp_encrypt(tx);
- 	default:
- 		return ieee80211_crypto_hw_encrypt(tx);
- 	}
---- a/net/mac80211/wpa.c
-+++ b/net/mac80211/wpa.c
-@@ -22,8 +22,6 @@
- #include "tkip.h"
- #include "aes_ccm.h"
- #include "aes_cmac.h"
--#include "aes_gmac.h"
--#include "aes_gcm.h"
- #include "wpa.h"
- 
- ieee80211_tx_result
-@@ -304,15 +302,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
- }
- 
- 
--static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad)
-+static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
-+				int encrypted)
- {
- 	__le16 mask_fc;
- 	int a4_included, mgmt;
- 	u8 qos_tid;
--	u16 len_a;
-+	u8 *b_0, *aad;
-+	u16 data_len, len_a;
- 	unsigned int hdrlen;
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- 
-+	memset(scratch, 0, 6 * AES_BLOCK_SIZE);
-+
-+	b_0 = scratch + 3 * AES_BLOCK_SIZE;
-+	aad = scratch + 4 * AES_BLOCK_SIZE;
-+
- 	/*
- 	 * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
- 	 * Retry, PwrMgt, MoreData; set Protected
-@@ -334,21 +339,20 @@ static void ccmp_special_blocks(struct s
- 	else
- 		qos_tid = 0;
- 
--	/* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
--	 * mode authentication are not allowed to collide, yet both are derived
--	 * from this vector b_0. We only set L := 1 here to indicate that the
--	 * data size can be represented in (L+1) bytes. The CCM layer will take
--	 * care of storing the data length in the top (L+1) bytes and setting
--	 * and clearing the other bits as is required to derive the two IVs.
--	 */
--	b_0[0] = 0x1;
-+	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN;
-+	if (encrypted)
-+		data_len -= IEEE80211_CCMP_MIC_LEN;
- 
-+	/* First block, b_0 */
-+	b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
- 	/* Nonce: Nonce Flags | A2 | PN
- 	 * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
- 	 */
- 	b_0[1] = qos_tid | (mgmt << 4);
- 	memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
- 	memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
-+	/* l(m) */
-+	put_unaligned_be16(data_len, &b_0[14]);
- 
- 	/* AAD (extra authenticate-only data) / masked 802.11 header
- 	 * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
-@@ -395,8 +399,7 @@ static inline void ccmp_hdr2pn(u8 *pn, u
- }
- 
- 
--static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb,
--			    unsigned int mic_len)
-+static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
- {
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
- 	struct ieee80211_key *key = tx->key;
-@@ -405,8 +408,7 @@ static int ccmp_encrypt_skb(struct ieee8
- 	u8 *pos;
- 	u8 pn[6];
- 	u64 pn64;
--	u8 aad[2 * AES_BLOCK_SIZE];
--	u8 b_0[AES_BLOCK_SIZE];
-+	u8 scratch[6 * AES_BLOCK_SIZE];
- 
- 	if (info->control.hw_key &&
- 	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
-@@ -427,7 +429,7 @@ static int ccmp_encrypt_skb(struct ieee8
- 	if (info->control.hw_key)
- 		tail = 0;
- 	else
--		tail = mic_len;
-+		tail = IEEE80211_CCMP_MIC_LEN;
- 
- 	if (WARN_ON(skb_tailroom(skb) < tail ||
- 		    skb_headroom(skb) < IEEE80211_CCMP_HDR_LEN))
-@@ -460,24 +462,23 @@ static int ccmp_encrypt_skb(struct ieee8
- 		return 0;
- 
- 	pos += IEEE80211_CCMP_HDR_LEN;
--	ccmp_special_blocks(skb, pn, b_0, aad);
--	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
--				  skb_put(skb, mic_len), mic_len);
-+	ccmp_special_blocks(skb, pn, scratch, 0);
-+	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len,
-+				  pos, skb_put(skb, IEEE80211_CCMP_MIC_LEN));
- 
- 	return 0;
- }
- 
- 
- ieee80211_tx_result
--ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx,
--			      unsigned int mic_len)
-+ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx)
- {
- 	struct sk_buff *skb;
- 
- 	ieee80211_tx_set_protected(tx);
- 
- 	skb_queue_walk(&tx->skbs, skb) {
--		if (ccmp_encrypt_skb(tx, skb, mic_len) < 0)
-+		if (ccmp_encrypt_skb(tx, skb) < 0)
- 			return TX_DROP;
- 	}
- 
-@@ -486,8 +487,7 @@ ieee80211_crypto_ccmp_encrypt(struct iee
- 
- 
- ieee80211_rx_result
--ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
--			      unsigned int mic_len)
-+ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
- {
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
- 	int hdrlen;
-@@ -504,7 +504,8 @@ ieee80211_crypto_ccmp_decrypt(struct iee
- 	    !ieee80211_is_robust_mgmt_frame(skb))
- 		return RX_CONTINUE;
- 
--	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
-+	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN -
-+		   IEEE80211_CCMP_MIC_LEN;
- 	if (!rx->sta || data_len < 0)
- 		return RX_DROP_UNUSABLE;
- 
-@@ -526,23 +527,23 @@ ieee80211_crypto_ccmp_decrypt(struct iee
- 	}
- 
- 	if (!(status->flag & RX_FLAG_DECRYPTED)) {
--		u8 aad[2 * AES_BLOCK_SIZE];
--		u8 b_0[AES_BLOCK_SIZE];
-+		u8 scratch[6 * AES_BLOCK_SIZE];
- 		/* hardware didn't decrypt/verify MIC */
--		ccmp_special_blocks(skb, pn, b_0, aad);
-+		ccmp_special_blocks(skb, pn, scratch, 1);
- 
- 		if (ieee80211_aes_ccm_decrypt(
--			    key->u.ccmp.tfm, b_0, aad,
-+			    key->u.ccmp.tfm, scratch,
- 			    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
- 			    data_len,
--			    skb->data + skb->len - mic_len, mic_len))
-+			    skb->data + skb->len - IEEE80211_CCMP_MIC_LEN,
-+			    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN))
- 			return RX_DROP_UNUSABLE;
- 	}
- 
- 	memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN);
- 
- 	/* Remove CCMP header and MIC */
--	if (pskb_trim(skb, skb->len - mic_len))
-+	if (pskb_trim(skb, skb->len - IEEE80211_CCMP_MIC_LEN))
- 		return RX_DROP_UNUSABLE;
- 	memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen);
- 	skb_pull(skb, IEEE80211_CCMP_HDR_LEN);
-@@ -550,229 +551,6 @@ ieee80211_crypto_ccmp_decrypt(struct iee
- 	return RX_CONTINUE;
- }
- 
--static void gcmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *j_0, u8 *aad)
--{
--	__le16 mask_fc;
--	u8 qos_tid;
--	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
--
--	memcpy(j_0, hdr->addr2, ETH_ALEN);
--	memcpy(&j_0[ETH_ALEN], pn, IEEE80211_GCMP_PN_LEN);
--	j_0[13] = 0;
--	j_0[14] = 0;
--	j_0[AES_BLOCK_SIZE - 1] = 0x01;
--
--	/* AAD (extra authenticate-only data) / masked 802.11 header
--	 * FC | A1 | A2 | A3 | SC | [A4] | [QC]
--	 */
--	put_unaligned_be16(ieee80211_hdrlen(hdr->frame_control) - 2, &aad[0]);
--	/* Mask FC: zero subtype b4 b5 b6 (if not mgmt)
--	 * Retry, PwrMgt, MoreData; set Protected
--	 */
--	mask_fc = hdr->frame_control;
--	mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY |
--				IEEE80211_FCTL_PM | IEEE80211_FCTL_MOREDATA);
--	if (!ieee80211_is_mgmt(hdr->frame_control))
--		mask_fc &= ~cpu_to_le16(0x0070);
--	mask_fc |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
--
--	put_unaligned(mask_fc, (__le16 *)&aad[2]);
--	memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
--
--	/* Mask Seq#, leave Frag# */
--	aad[22] = *((u8 *)&hdr->seq_ctrl) & 0x0f;
--	aad[23] = 0;
--
--	if (ieee80211_is_data_qos(hdr->frame_control))
--		qos_tid = *ieee80211_get_qos_ctl(hdr) &
--			IEEE80211_QOS_CTL_TID_MASK;
--	else
--		qos_tid = 0;
--
--	if (ieee80211_has_a4(hdr->frame_control)) {
--		memcpy(&aad[24], hdr->addr4, ETH_ALEN);
--		aad[30] = qos_tid;
--		aad[31] = 0;
--	} else {
--		memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
--		aad[24] = qos_tid;
--	}
--}
--
--static inline void gcmp_pn2hdr(u8 *hdr, const u8 *pn, int key_id)
--{
--	hdr[0] = pn[5];
--	hdr[1] = pn[4];
--	hdr[2] = 0;
--	hdr[3] = 0x20 | (key_id << 6);
--	hdr[4] = pn[3];
--	hdr[5] = pn[2];
--	hdr[6] = pn[1];
--	hdr[7] = pn[0];
--}
--
--static inline void gcmp_hdr2pn(u8 *pn, const u8 *hdr)
--{
--	pn[0] = hdr[7];
--	pn[1] = hdr[6];
--	pn[2] = hdr[5];
--	pn[3] = hdr[4];
--	pn[4] = hdr[1];
--	pn[5] = hdr[0];
--}
--
--static int gcmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
--{
--	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
--	struct ieee80211_key *key = tx->key;
--	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
--	int hdrlen, len, tail;
--	u8 *pos;
--	u8 pn[6];
--	u64 pn64;
--	u8 aad[2 * AES_BLOCK_SIZE];
--	u8 j_0[AES_BLOCK_SIZE];
--
--	if (info->control.hw_key &&
--	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
--	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
--	    !((info->control.hw_key->flags &
--	       IEEE80211_KEY_FLAG_GENERATE_IV_MGMT) &&
--	      ieee80211_is_mgmt(hdr->frame_control))) {
--		/* hwaccel has no need for preallocated room for GCMP
--		 * header or MIC fields
--		 */
--		return 0;
--	}
--
--	hdrlen = ieee80211_hdrlen(hdr->frame_control);
--	len = skb->len - hdrlen;
--
--	if (info->control.hw_key)
--		tail = 0;
--	else
--		tail = IEEE80211_GCMP_MIC_LEN;
--
--	if (WARN_ON(skb_tailroom(skb) < tail ||
--		    skb_headroom(skb) < IEEE80211_GCMP_HDR_LEN))
--		return -1;
--
--	pos = skb_push(skb, IEEE80211_GCMP_HDR_LEN);
--	memmove(pos, pos + IEEE80211_GCMP_HDR_LEN, hdrlen);
--	skb_set_network_header(skb, skb_network_offset(skb) +
--				    IEEE80211_GCMP_HDR_LEN);
--
--	/* the HW only needs room for the IV, but not the actual IV */
--	if (info->control.hw_key &&
--	    (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
--		return 0;
--
--	hdr = (struct ieee80211_hdr *)pos;
--	pos += hdrlen;
--
--	pn64 = atomic64_inc_return(&key->u.gcmp.tx_pn);
--
--	pn[5] = pn64;
--	pn[4] = pn64 >> 8;
--	pn[3] = pn64 >> 16;
--	pn[2] = pn64 >> 24;
--	pn[1] = pn64 >> 32;
--	pn[0] = pn64 >> 40;
--
--	gcmp_pn2hdr(pos, pn, key->conf.keyidx);
--
--	/* hwaccel - with software GCMP header */
--	if (info->control.hw_key)
--		return 0;
--
--	pos += IEEE80211_GCMP_HDR_LEN;
--	gcmp_special_blocks(skb, pn, j_0, aad);
--	ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len,
--				  skb_put(skb, IEEE80211_GCMP_MIC_LEN));
--
--	return 0;
--}
--
--ieee80211_tx_result
--ieee80211_crypto_gcmp_encrypt(struct ieee80211_tx_data *tx)
--{
--	struct sk_buff *skb;
--
--	ieee80211_tx_set_protected(tx);
--
--	skb_queue_walk(&tx->skbs, skb) {
--		if (gcmp_encrypt_skb(tx, skb) < 0)
--			return TX_DROP;
--	}
--
--	return TX_CONTINUE;
--}
--
--ieee80211_rx_result
--ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
--{
--	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
--	int hdrlen;
--	struct ieee80211_key *key = rx->key;
--	struct sk_buff *skb = rx->skb;
--	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
--	u8 pn[IEEE80211_GCMP_PN_LEN];
--	int data_len;
--	int queue;
--
--	hdrlen = ieee80211_hdrlen(hdr->frame_control);
--
--	if (!ieee80211_is_data(hdr->frame_control) &&
--	    !ieee80211_is_robust_mgmt_frame(skb))
--		return RX_CONTINUE;
--
--	data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN -
--		   IEEE80211_GCMP_MIC_LEN;
--	if (!rx->sta || data_len < 0)
--		return RX_DROP_UNUSABLE;
--
--	if (status->flag & RX_FLAG_DECRYPTED) {
--		if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN))
--			return RX_DROP_UNUSABLE;
--	} else {
--		if (skb_linearize(rx->skb))
--			return RX_DROP_UNUSABLE;
--	}
--
--	gcmp_hdr2pn(pn, skb->data + hdrlen);
--
--	queue = rx->security_idx;
--
--	if (memcmp(pn, key->u.gcmp.rx_pn[queue], IEEE80211_GCMP_PN_LEN) <= 0) {
--		key->u.gcmp.replays++;
--		return RX_DROP_UNUSABLE;
--	}
--
--	if (!(status->flag & RX_FLAG_DECRYPTED)) {
--		u8 aad[2 * AES_BLOCK_SIZE];
--		u8 j_0[AES_BLOCK_SIZE];
--		/* hardware didn't decrypt/verify MIC */
--		gcmp_special_blocks(skb, pn, j_0, aad);
--
--		if (ieee80211_aes_gcm_decrypt(
--			    key->u.gcmp.tfm, j_0, aad,
--			    skb->data + hdrlen + IEEE80211_GCMP_HDR_LEN,
--			    data_len,
--			    skb->data + skb->len - IEEE80211_GCMP_MIC_LEN))
--			return RX_DROP_UNUSABLE;
--	}
--
--	memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN);
--
--	/* Remove GCMP header and MIC */
--	if (pskb_trim(skb, skb->len - IEEE80211_GCMP_MIC_LEN))
--		return RX_DROP_UNUSABLE;
--	memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen);
--	skb_pull(skb, IEEE80211_GCMP_HDR_LEN);
--
--	return RX_CONTINUE;
--}
--
- static ieee80211_tx_result
- ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
- 			    struct sk_buff *skb)
-@@ -956,48 +734,6 @@ ieee80211_crypto_aes_cmac_encrypt(struct
- 	return TX_CONTINUE;
- }
- 
--ieee80211_tx_result
--ieee80211_crypto_aes_cmac_256_encrypt(struct ieee80211_tx_data *tx)
--{
--	struct sk_buff *skb;
--	struct ieee80211_tx_info *info;
--	struct ieee80211_key *key = tx->key;
--	struct ieee80211_mmie_16 *mmie;
--	u8 aad[20];
--	u64 pn64;
--
--	if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
--		return TX_DROP;
--
--	skb = skb_peek(&tx->skbs);
--
--	info = IEEE80211_SKB_CB(skb);
--
--	if (info->control.hw_key)
--		return TX_CONTINUE;
--
--	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
--		return TX_DROP;
--
--	mmie = (struct ieee80211_mmie_16 *)skb_put(skb, sizeof(*mmie));
--	mmie->element_id = WLAN_EID_MMIE;
--	mmie->length = sizeof(*mmie) - 2;
--	mmie->key_id = cpu_to_le16(key->conf.keyidx);
--
--	/* PN = PN + 1 */
--	pn64 = atomic64_inc_return(&key->u.aes_cmac.tx_pn);
--
--	bip_ipn_set64(mmie->sequence_number, pn64);
--
--	bip_aad(skb, aad);
--
--	/* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128)
--	 */
--	ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad,
--			       skb->data + 24, skb->len - 24, mmie->mic);
--
--	return TX_CONTINUE;
--}
- 
- ieee80211_rx_result
- ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
-@@ -1045,160 +781,6 @@ ieee80211_crypto_aes_cmac_decrypt(struct
- 
- 	/* Remove MMIE */
- 	skb_trim(skb, skb->len - sizeof(*mmie));
--
--	return RX_CONTINUE;
--}
--
--ieee80211_rx_result
--ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx)
--{
--	struct sk_buff *skb = rx->skb;
--	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
--	struct ieee80211_key *key = rx->key;
--	struct ieee80211_mmie_16 *mmie;
--	u8 aad[20], mic[16], ipn[6];
--	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
--
--	if (!ieee80211_is_mgmt(hdr->frame_control))
--		return RX_CONTINUE;
--
--	/* management frames are already linear */
--
--	if (skb->len < 24 + sizeof(*mmie))
--		return RX_DROP_UNUSABLE;
--
--	mmie = (struct ieee80211_mmie_16 *)
--		(skb->data + skb->len - sizeof(*mmie));
--	if (mmie->element_id != WLAN_EID_MMIE ||
--	    mmie->length != sizeof(*mmie) - 2)
--		return RX_DROP_UNUSABLE; /* Invalid MMIE */
--
--	bip_ipn_swap(ipn, mmie->sequence_number);
--
--	if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
--		key->u.aes_cmac.replays++;
--		return RX_DROP_UNUSABLE;
--	}
--
--	if (!(status->flag & RX_FLAG_DECRYPTED)) {
--		/* hardware didn't decrypt/verify MIC */
--		bip_aad(skb, aad);
--		ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad,
--				       skb->data + 24, skb->len - 24, mic);
--		if (memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) {
--			key->u.aes_cmac.icverrors++;
--			return RX_DROP_UNUSABLE;
--		}
--	}
--
--	memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
--
--	/* Remove MMIE */
--	skb_trim(skb, skb->len - sizeof(*mmie));
--
--	return RX_CONTINUE;
--}
--
--ieee80211_tx_result
--ieee80211_crypto_aes_gmac_encrypt(struct ieee80211_tx_data *tx)
--{
--	struct sk_buff *skb;
--	struct ieee80211_tx_info *info;
--	struct ieee80211_key *key = tx->key;
--	struct ieee80211_mmie_16 *mmie;
--	struct ieee80211_hdr *hdr;
--	u8 aad[20];
--	u64 pn64;
--	u8 nonce[12];
--
--	if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
--		return TX_DROP;
--
--	skb = skb_peek(&tx->skbs);
--
--	info = IEEE80211_SKB_CB(skb);
--
--	if (info->control.hw_key)
--		return TX_CONTINUE;
--
--	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
--		return TX_DROP;
--
--	mmie = (struct ieee80211_mmie_16 *)skb_put(skb, sizeof(*mmie));
--	mmie->element_id = WLAN_EID_MMIE;
--	mmie->length = sizeof(*mmie) - 2;
--	mmie->key_id = cpu_to_le16(key->conf.keyidx);
--
--	/* PN = PN + 1 */
--	pn64 = atomic64_inc_return(&key->u.aes_gmac.tx_pn);
--
--	bip_ipn_set64(mmie->sequence_number, pn64);
--
--	bip_aad(skb, aad);
--
--	hdr = (struct ieee80211_hdr *)skb->data;
--	memcpy(nonce, hdr->addr2, ETH_ALEN);
--	bip_ipn_swap(nonce + ETH_ALEN, mmie->sequence_number);
--
--	/* MIC = AES-GMAC(IGTK, AAD || Management Frame Body || MMIE, 128) */
--	if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
--			       skb->data + 24, skb->len - 24, mmie->mic) < 0)
--		return TX_DROP;
--
--	return TX_CONTINUE;
--}
--
--ieee80211_rx_result
--ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
--{
--	struct sk_buff *skb = rx->skb;
--	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
--	struct ieee80211_key *key = rx->key;
--	struct ieee80211_mmie_16 *mmie;
--	u8 aad[20], mic[16], ipn[6], nonce[12];
--	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
--
--	if (!ieee80211_is_mgmt(hdr->frame_control))
--		return RX_CONTINUE;
--
--	/* management frames are already linear */
--
--	if (skb->len < 24 + sizeof(*mmie))
--		return RX_DROP_UNUSABLE;
--
--	mmie = (struct ieee80211_mmie_16 *)
--		(skb->data + skb->len - sizeof(*mmie));
--	if (mmie->element_id != WLAN_EID_MMIE ||
--	    mmie->length != sizeof(*mmie) - 2)
--		return RX_DROP_UNUSABLE; /* Invalid MMIE */
--
--	bip_ipn_swap(ipn, mmie->sequence_number);
--
--	if (memcmp(ipn, key->u.aes_gmac.rx_pn, 6) <= 0) {
--		key->u.aes_gmac.replays++;
--		return RX_DROP_UNUSABLE;
--	}
--
--	if (!(status->flag & RX_FLAG_DECRYPTED)) {
--		/* hardware didn't decrypt/verify MIC */
--		bip_aad(skb, aad);
--
--		memcpy(nonce, hdr->addr2, ETH_ALEN);
--		memcpy(nonce + ETH_ALEN, ipn, 6);
--
--		if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
--				       skb->data + 24, skb->len - 24,
--				       mic) < 0 ||
--		    memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) {
--			key->u.aes_gmac.icverrors++;
--			return RX_DROP_UNUSABLE;
--		}
--	}
--
--	memcpy(key->u.aes_gmac.rx_pn, ipn, 6);
--
--	/* Remove MMIE */
--	skb_trim(skb, skb->len - sizeof(*mmie));
- 
- 	return RX_CONTINUE;
- }
---- a/net/mac80211/wpa.h
-+++ b/net/mac80211/wpa.h
-@@ -24,32 +24,17 @@ ieee80211_rx_result
- ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx);
- 
- ieee80211_tx_result
--ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx,
--			      unsigned int mic_len);
-+ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx);
- ieee80211_rx_result
--ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
--			      unsigned int mic_len);
-+ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx);
- 
- ieee80211_tx_result
- ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx);
--ieee80211_tx_result
--ieee80211_crypto_aes_cmac_256_encrypt(struct ieee80211_tx_data *tx);
- ieee80211_rx_result
- ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx);
--ieee80211_rx_result
--ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx);
--ieee80211_tx_result
--ieee80211_crypto_aes_gmac_encrypt(struct ieee80211_tx_data *tx);
--ieee80211_rx_result
--ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx);
- ieee80211_tx_result
- ieee80211_crypto_hw_encrypt(struct ieee80211_tx_data *tx);
- ieee80211_rx_result
- ieee80211_crypto_hw_decrypt(struct ieee80211_rx_data *rx);
- 
--ieee80211_tx_result
--ieee80211_crypto_gcmp_encrypt(struct ieee80211_tx_data *tx);
--ieee80211_rx_result
--ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx);
--
- #endif /* WPA_H */
diff --git a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch
index 41a3c4f355eec31356e1d976a2a8171e20a0885e..d1d9fbd9b157c5b888797ab650db04064dfa7d31 100644
--- a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch
+++ b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch
@@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -856,7 +856,6 @@ static int ieee80211_stop_ap(struct wiph
+@@ -846,7 +846,6 @@ static int ieee80211_stop_ap(struct wiph
  	sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
  
  	__sta_info_flush(sdata, true);
diff --git a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch
index de79bd243808f2051ca4669e3268c743ce0f3afa..2855a88af7b4017f8dfeebeb34ea430a0ad51914 100644
--- a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch
+++ b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch
@@ -1,6 +1,6 @@
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -287,7 +287,7 @@ void ieee80211_restart_hw(struct ieee802
+@@ -291,7 +291,7 @@ void ieee80211_restart_hw(struct ieee802
  }
  EXPORT_SYMBOL(ieee80211_restart_hw);
  
@@ -9,7 +9,7 @@
  static int ieee80211_ifa_changed(struct notifier_block *nb,
  				 unsigned long data, void *arg)
  {
-@@ -346,7 +346,7 @@ static int ieee80211_ifa_changed(struct
+@@ -350,7 +350,7 @@ static int ieee80211_ifa_changed(struct
  }
  #endif
  
@@ -18,9 +18,9 @@
  static int ieee80211_ifa6_changed(struct notifier_block *nb,
  				  unsigned long data, void *arg)
  {
-@@ -1057,14 +1057,14 @@ int ieee80211_register_hw(struct ieee802
- 	if (result)
- 		goto fail_pm_qos;
+@@ -1087,14 +1087,14 @@ int ieee80211_register_hw(struct ieee802
+ 
+ 	rtnl_unlock();
  
 -#ifdef CONFIG_INET
 +#ifdef __disabled__CONFIG_INET
@@ -35,7 +35,7 @@
  	local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
  	result = register_inet6addr_notifier(&local->ifa6_notifier);
  	if (result)
-@@ -1073,13 +1073,13 @@ int ieee80211_register_hw(struct ieee802
+@@ -1103,13 +1103,13 @@ int ieee80211_register_hw(struct ieee802
  
  	return 0;
  
@@ -50,12 +50,12 @@
 -#if defined(CONFIG_INET) || defined(CONFIG_IPV6)
 +#if defined(__disabled__CONFIG_INET) || defined(__disabled__CONFIG_IPV6)
   fail_ifa:
- 	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
- 			       &local->network_latency_notifier);
-@@ -1124,10 +1124,10 @@ void ieee80211_unregister_hw(struct ieee
+ #endif
+ 	rtnl_lock();
+@@ -1137,10 +1137,10 @@ void ieee80211_unregister_hw(struct ieee
+ 	tasklet_kill(&local->tx_pending_tasklet);
+ 	tasklet_kill(&local->tasklet);
  
- 	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
- 			       &local->network_latency_notifier);
 -#ifdef CONFIG_INET
 +#ifdef __disabled__CONFIG_INET
  	unregister_inetaddr_notifier(&local->ifa_notifier);
diff --git a/package/kernel/mac80211/patches/210-ap_scan.patch b/package/kernel/mac80211/patches/210-ap_scan.patch
index 47dcec3ba234e4af6809c96cbb5b113563024582..a99cbd2bee913d292310e258c15c94050e90db71 100644
--- a/package/kernel/mac80211/patches/210-ap_scan.patch
+++ b/package/kernel/mac80211/patches/210-ap_scan.patch
@@ -1,6 +1,6 @@
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1963,7 +1963,7 @@ static int ieee80211_scan(struct wiphy *
+@@ -1999,7 +1999,7 @@ static int ieee80211_scan(struct wiphy *
  		 * the  frames sent while scanning on other channel will be
  		 * lost)
  		 */
diff --git a/package/kernel/mac80211/patches/356-ath9k-force-rx_clear-when-disabling-rx.patch b/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch
similarity index 100%
rename from package/kernel/mac80211/patches/356-ath9k-force-rx_clear-when-disabling-rx.patch
rename to package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch
diff --git a/package/kernel/mac80211/patches/300-mac80211-add-an-intermediate-software-queue-implemen.patch b/package/kernel/mac80211/patches/300-mac80211-add-an-intermediate-software-queue-implemen.patch
deleted file mode 100644
index 237121ba2772da754b8f7bb29e4552adb052d411..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/300-mac80211-add-an-intermediate-software-queue-implemen.patch
+++ /dev/null
@@ -1,882 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Tue, 18 Nov 2014 23:58:51 +0100
-Subject: [PATCH] mac80211: add an intermediate software queue implementation
-
-This allows drivers to request per-vif and per-sta-tid queues from which
-they can pull frames. This makes it easier to keep the hardware queues
-short, and to improve fairness between clients and vifs.
-
-The task of scheduling packet transmission is left up to the driver -
-queueing is controlled by mac80211. Drivers can only dequeue packets by
-calling ieee80211_tx_dequeue. This makes it possible to add active queue
-management later without changing drivers using this code.
-
-This can also be used as a starting point to implement A-MSDU
-aggregation in a way that does not add artificially induced latency.
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -84,6 +84,39 @@
-  *
-  */
- 
-+/**
-+ * DOC: mac80211 software tx queueing
-+ *
-+ * mac80211 provides an optional intermediate queueing implementation designed
-+ * to allow the driver to keep hardware queues short and provide some fairness
-+ * between different stations/interfaces.
-+ * In this model, the driver pulls data frames from the mac80211 queue instead
-+ * of letting mac80211 push them via drv_tx().
-+ * Other frames (e.g. control or management) are still pushed using drv_tx().
-+ *
-+ * Drivers indicate that they use this model by implementing the .wake_tx_queue
-+ * driver operation.
-+ *
-+ * Intermediate queues (struct ieee80211_txq) are kept per-sta per-tid, with a
-+ * single per-vif queue for multicast data frames.
-+ *
-+ * The driver is expected to initialize its private per-queue data for stations
-+ * and interfaces in the .add_interface and .sta_add ops.
-+ *
-+ * The driver can't access the queue directly. To dequeue a frame, it calls
-+ * ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a queue, it
-+ * calls the .wake_tx_queue driver op.
-+ *
-+ * For AP powersave TIM handling, the driver only needs to indicate if it has
-+ * buffered packets in the driver specific data structures by calling
-+ * ieee80211_sta_set_buffered(). For frames buffered in the ieee80211_txq
-+ * struct, mac80211 sets the appropriate TIM PVB bits and calls
-+ * .release_buffered_frames().
-+ * In that callback the driver is therefore expected to release its own
-+ * buffered frames and afterwards also frames from the ieee80211_txq (obtained
-+ * via the usual ieee80211_tx_dequeue).
-+ */
-+
- struct device;
- 
- /**
-@@ -1246,6 +1279,7 @@ enum ieee80211_vif_flags {
-  *	monitor interface (if that is requested.)
-  * @drv_priv: data area for driver use, will always be aligned to
-  *	sizeof(void *).
-+ * @txq: the multicast data TX queue (if driver uses the TXQ abstraction)
-  */
- struct ieee80211_vif {
- 	enum nl80211_iftype type;
-@@ -1257,6 +1291,8 @@ struct ieee80211_vif {
- 	u8 cab_queue;
- 	u8 hw_queue[IEEE80211_NUM_ACS];
- 
-+	struct ieee80211_txq *txq;
-+
- 	struct ieee80211_chanctx_conf __rcu *chanctx_conf;
- 
- 	u32 driver_flags;
-@@ -1501,6 +1537,7 @@ struct ieee80211_sta_rates {
-  * @tdls_initiator: indicates the STA is an initiator of the TDLS link. Only
-  *	valid if the STA is a TDLS peer in the first place.
-  * @mfp: indicates whether the STA uses management frame protection or not.
-+ * @txq: per-TID data TX queues (if driver uses the TXQ abstraction)
-  */
- struct ieee80211_sta {
- 	u32 supp_rates[IEEE80211_NUM_BANDS];
-@@ -1519,6 +1556,8 @@ struct ieee80211_sta {
- 	bool tdls_initiator;
- 	bool mfp;
- 
-+	struct ieee80211_txq *txq[IEEE80211_NUM_TIDS];
-+
- 	/* must be last */
- 	u8 drv_priv[0] __aligned(sizeof(void *));
- };
-@@ -1547,6 +1586,27 @@ struct ieee80211_tx_control {
- };
- 
- /**
-+ * struct ieee80211_txq - Software intermediate tx queue
-+ *
-+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
-+ * @sta: station table entry, %NULL for per-vif queue
-+ * @tid: the TID for this queue (unused for per-vif queue)
-+ * @ac: the AC for this queue
-+ *
-+ * The driver can obtain packets from this queue by calling
-+ * ieee80211_tx_dequeue().
-+ */
-+struct ieee80211_txq {
-+	struct ieee80211_vif *vif;
-+	struct ieee80211_sta *sta;
-+	u8 tid;
-+	u8 ac;
-+
-+	/* must be last */
-+	u8 drv_priv[0] __aligned(sizeof(void *));
-+};
-+
-+/**
-  * enum ieee80211_hw_flags - hardware flags
-  *
-  * These flags are used to indicate hardware capabilities to
-@@ -1770,6 +1830,8 @@ enum ieee80211_hw_flags {
-  *	within &struct ieee80211_sta.
-  * @chanctx_data_size: size (in bytes) of the drv_priv data area
-  *	within &struct ieee80211_chanctx_conf.
-+ * @txq_data_size: size (in bytes) of the drv_priv data area
-+ *	within @struct ieee80211_txq.
-  *
-  * @max_rates: maximum number of alternate rate retry stages the hw
-  *	can handle.
-@@ -1818,6 +1880,9 @@ enum ieee80211_hw_flags {
-  * @n_cipher_schemes: a size of an array of cipher schemes definitions.
-  * @cipher_schemes: a pointer to an array of cipher scheme definitions
-  *	supported by HW.
-+ *
-+ * @txq_ac_max_pending: maximum number of frames per AC pending in all txq
-+ *	entries for a vif.
-  */
- struct ieee80211_hw {
- 	struct ieee80211_conf conf;
-@@ -1830,6 +1895,7 @@ struct ieee80211_hw {
- 	int vif_data_size;
- 	int sta_data_size;
- 	int chanctx_data_size;
-+	int txq_data_size;
- 	u16 queues;
- 	u16 max_listen_interval;
- 	s8 max_signal;
-@@ -1846,6 +1912,7 @@ struct ieee80211_hw {
- 	u8 uapsd_max_sp_len;
- 	u8 n_cipher_schemes;
- 	const struct ieee80211_cipher_scheme *cipher_schemes;
-+	int txq_ac_max_pending;
- };
- 
- /**
-@@ -3007,6 +3074,8 @@ enum ieee80211_reconfig_type {
-  *	response template is provided, together with the location of the
-  *	switch-timing IE within the template. The skb can only be used within
-  *	the function call.
-+ *
-+ * @wake_tx_queue: Called when new packets have been added to the queue.
-  */
- struct ieee80211_ops {
- 	void (*tx)(struct ieee80211_hw *hw,
-@@ -3238,6 +3307,9 @@ struct ieee80211_ops {
- 	void (*tdls_recv_channel_switch)(struct ieee80211_hw *hw,
- 					 struct ieee80211_vif *vif,
- 					 struct ieee80211_tdls_ch_sw_params *params);
-+
-+	void (*wake_tx_queue)(struct ieee80211_hw *hw,
-+			      struct ieee80211_txq *txq);
- };
- 
- /**
-@@ -5249,4 +5321,15 @@ void ieee80211_unreserve_tid(struct ieee
-  */
- size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
- 			  const u8 *ids, int n_ids, size_t offset);
-+
-+/**
-+ * ieee80211_tx_dequeue - dequeue a packet from a software tx queue
-+ *
-+ * @hw: pointer as obtained from ieee80211_alloc_hw()
-+ * @txq: pointer obtained from station or virtual interface
-+ *
-+ * Returns the skb if successful, %NULL if no frame was available.
-+ */
-+struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
-+				     struct ieee80211_txq *txq);
- #endif /* MAC80211_H */
---- a/net/mac80211/driver-ops.h
-+++ b/net/mac80211/driver-ops.h
-@@ -1367,4 +1367,16 @@ drv_tdls_recv_channel_switch(struct ieee
- 	trace_drv_return_void(local);
- }
- 
-+static inline void drv_wake_tx_queue(struct ieee80211_local *local,
-+				     struct txq_info *txq)
-+{
-+	struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->txq.vif);
-+
-+	if (!check_sdata_in_driver(sdata))
-+		return;
-+
-+	trace_drv_wake_tx_queue(local, sdata, txq);
-+	local->ops->wake_tx_queue(&local->hw, &txq->txq);
-+}
-+
- #endif /* __MAC80211_DRIVER_OPS */
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -809,6 +809,19 @@ struct mac80211_qos_map {
- 	struct rcu_head rcu_head;
- };
- 
-+enum txq_info_flags {
-+	IEEE80211_TXQ_STOP,
-+	IEEE80211_TXQ_AMPDU,
-+};
-+
-+struct txq_info {
-+	struct sk_buff_head queue;
-+	unsigned long flags;
-+
-+	/* keep last! */
-+	struct ieee80211_txq txq;
-+};
-+
- struct ieee80211_sub_if_data {
- 	struct list_head list;
- 
-@@ -853,6 +866,7 @@ struct ieee80211_sub_if_data {
- 	bool control_port_no_encrypt;
- 	int encrypt_headroom;
- 
-+	atomic_t txqs_len[IEEE80211_NUM_ACS];
- 	struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS];
- 	struct mac80211_qos_map __rcu *qos_map;
- 
-@@ -1453,6 +1467,10 @@ static inline struct ieee80211_local *hw
- 	return container_of(hw, struct ieee80211_local, hw);
- }
- 
-+static inline struct txq_info *to_txq_info(struct ieee80211_txq *txq)
-+{
-+	return container_of(txq, struct txq_info, txq);
-+}
- 
- static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr)
- {
-@@ -1905,6 +1923,9 @@ static inline bool ieee80211_can_run_wor
- 	return true;
- }
- 
-+void ieee80211_init_tx_queue(struct ieee80211_sub_if_data *sdata,
-+			     struct sta_info *sta,
-+			     struct txq_info *txq, int tid);
- void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
- 			 u16 transaction, u16 auth_alg, u16 status,
- 			 const u8 *extra, size_t extra_len, const u8 *bssid,
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -969,6 +969,13 @@ static void ieee80211_do_stop(struct iee
- 	}
- 	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
- 
-+	if (sdata->vif.txq) {
-+		struct txq_info *txqi = to_txq_info(sdata->vif.txq);
-+
-+		ieee80211_purge_tx_queue(&local->hw, &txqi->queue);
-+		atomic_set(&sdata->txqs_len[txqi->txq.ac], 0);
-+	}
-+
- 	if (local->open_count == 0)
- 		ieee80211_clear_tx_pending(local);
- 
-@@ -1674,6 +1681,7 @@ int ieee80211_if_add(struct ieee80211_lo
- {
- 	struct net_device *ndev = NULL;
- 	struct ieee80211_sub_if_data *sdata = NULL;
-+	struct txq_info *txqi;
- 	int ret, i;
- 	int txqs = 1;
- 
-@@ -1693,10 +1701,18 @@ int ieee80211_if_add(struct ieee80211_lo
- 		ieee80211_assign_perm_addr(local, wdev->address, type);
- 		memcpy(sdata->vif.addr, wdev->address, ETH_ALEN);
- 	} else {
-+		int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size,
-+				 sizeof(void *));
-+		int txq_size = 0;
-+
-+		if (local->ops->wake_tx_queue)
-+			txq_size += sizeof(struct txq_info) +
-+				    local->hw.txq_data_size;
-+
- 		if (local->hw.queues >= IEEE80211_NUM_ACS)
- 			txqs = IEEE80211_NUM_ACS;
- 
--		ndev = alloc_netdev_mqs(sizeof(*sdata) + local->hw.vif_data_size,
-+		ndev = alloc_netdev_mqs(size + txq_size,
- 					name, NET_NAME_UNKNOWN,
- 					ieee80211_if_setup, txqs, 1);
- 		if (!ndev)
-@@ -1731,6 +1747,11 @@ int ieee80211_if_add(struct ieee80211_lo
- 		memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN);
- 		memcpy(sdata->name, ndev->name, IFNAMSIZ);
- 
-+		if (txq_size) {
-+			txqi = netdev_priv(ndev) + size;
-+			ieee80211_init_tx_queue(sdata, NULL, txqi, 0);
-+		}
-+
- 		sdata->dev = ndev;
- 	}
- 
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -1019,6 +1019,9 @@ int ieee80211_register_hw(struct ieee802
- 
- 	local->dynamic_ps_forced_timeout = -1;
- 
-+	if (!local->hw.txq_ac_max_pending)
-+		local->hw.txq_ac_max_pending = 64;
-+
- 	result = ieee80211_wep_init(local);
- 	if (result < 0)
- 		wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n",
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -118,6 +118,16 @@ static void __cleanup_single_sta(struct
- 		atomic_dec(&ps->num_sta_ps);
- 	}
- 
-+	if (sta->sta.txq[0]) {
-+		for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-+			struct txq_info *txqi = to_txq_info(sta->sta.txq[i]);
-+			int n = skb_queue_len(&txqi->queue);
-+
-+			ieee80211_purge_tx_queue(&local->hw, &txqi->queue);
-+			atomic_sub(n, &sdata->txqs_len[txqi->txq.ac]);
-+		}
-+	}
-+
- 	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
- 		local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]);
- 		ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]);
-@@ -234,6 +244,8 @@ void sta_info_free(struct ieee80211_loca
- 
- 	sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
- 
-+	if (sta->sta.txq[0])
-+		kfree(to_txq_info(sta->sta.txq[0]));
- 	kfree(rcu_dereference_raw(sta->sta.rates));
- 	kfree(sta);
- }
-@@ -285,11 +297,12 @@ struct sta_info *sta_info_alloc(struct i
- 				const u8 *addr, gfp_t gfp)
- {
- 	struct ieee80211_local *local = sdata->local;
-+	struct ieee80211_hw *hw = &local->hw;
- 	struct sta_info *sta;
- 	struct timespec uptime;
- 	int i;
- 
--	sta = kzalloc(sizeof(*sta) + local->hw.sta_data_size, gfp);
-+	sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);
- 	if (!sta)
- 		return NULL;
- 
-@@ -321,11 +334,25 @@ struct sta_info *sta_info_alloc(struct i
- 	for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++)
- 		ewma_init(&sta->chain_signal_avg[i], 1024, 8);
- 
--	if (sta_prepare_rate_control(local, sta, gfp)) {
--		kfree(sta);
--		return NULL;
-+	if (local->ops->wake_tx_queue) {
-+		void *txq_data;
-+		int size = sizeof(struct txq_info) +
-+			   ALIGN(hw->txq_data_size, sizeof(void *));
-+
-+		txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
-+		if (!txq_data)
-+			goto free;
-+
-+		for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-+			struct txq_info *txq = txq_data + i * size;
-+
-+			ieee80211_init_tx_queue(sdata, sta, txq, i);
-+		}
- 	}
- 
-+	if (sta_prepare_rate_control(local, sta, gfp))
-+		goto free_txq;
-+
- 	for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
- 		/*
- 		 * timer_to_tid must be initialized with identity mapping
-@@ -346,7 +373,7 @@ struct sta_info *sta_info_alloc(struct i
- 	if (sdata->vif.type == NL80211_IFTYPE_AP ||
- 	    sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
- 		struct ieee80211_supported_band *sband =
--			local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)];
-+			hw->wiphy->bands[ieee80211_get_sdata_band(sdata)];
- 		u8 smps = (sband->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >>
- 				IEEE80211_HT_CAP_SM_PS_SHIFT;
- 		/*
-@@ -371,6 +398,13 @@ struct sta_info *sta_info_alloc(struct i
- 	sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
- 
- 	return sta;
-+
-+free_txq:
-+	if (sta->sta.txq[0])
-+		kfree(to_txq_info(sta->sta.txq[0]));
-+free:
-+	kfree(sta);
-+	return NULL;
- }
- 
- static int sta_info_insert_check(struct sta_info *sta)
-@@ -640,6 +674,8 @@ static void __sta_info_recalc_tim(struct
- 
- 		indicate_tim |=
- 			sta->driver_buffered_tids & tids;
-+		indicate_tim |=
-+			sta->txq_buffered_tids & tids;
- 	}
- 
-  done:
-@@ -1071,7 +1107,7 @@ void ieee80211_sta_ps_deliver_wakeup(str
- 	struct ieee80211_sub_if_data *sdata = sta->sdata;
- 	struct ieee80211_local *local = sdata->local;
- 	struct sk_buff_head pending;
--	int filtered = 0, buffered = 0, ac;
-+	int filtered = 0, buffered = 0, ac, i;
- 	unsigned long flags;
- 	struct ps_data *ps;
- 
-@@ -1090,10 +1126,22 @@ void ieee80211_sta_ps_deliver_wakeup(str
- 
- 	BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1);
- 	sta->driver_buffered_tids = 0;
-+	sta->txq_buffered_tids = 0;
- 
- 	if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS))
- 		drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta);
- 
-+	if (sta->sta.txq[0]) {
-+		for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-+			struct txq_info *txqi = to_txq_info(sta->sta.txq[i]);
-+
-+			if (!skb_queue_len(&txqi->queue))
-+				continue;
-+
-+			drv_wake_tx_queue(local, txqi);
-+		}
-+	}
-+
- 	skb_queue_head_init(&pending);
- 
- 	/* sync with ieee80211_tx_h_unicast_ps_buf */
-@@ -1275,8 +1323,10 @@ ieee80211_sta_ps_deliver_response(struct
- 		/* if we already have frames from software, then we can't also
- 		 * release from hardware queues
- 		 */
--		if (skb_queue_empty(&frames))
-+		if (skb_queue_empty(&frames)) {
- 			driver_release_tids |= sta->driver_buffered_tids & tids;
-+			driver_release_tids |= sta->txq_buffered_tids & tids;
-+		}
- 
- 		if (driver_release_tids) {
- 			/* If the driver has data on more than one TID then
-@@ -1447,6 +1497,9 @@ ieee80211_sta_ps_deliver_response(struct
- 
- 		sta_info_recalc_tim(sta);
- 	} else {
-+		unsigned long tids = sta->txq_buffered_tids & driver_release_tids;
-+		int tid;
-+
- 		/*
- 		 * We need to release a frame that is buffered somewhere in the
- 		 * driver ... it'll have to handle that.
-@@ -1466,8 +1519,22 @@ ieee80211_sta_ps_deliver_response(struct
- 		 * that the TID(s) became empty before returning here from the
- 		 * release function.
- 		 * Either way, however, when the driver tells us that the TID(s)
--		 * became empty we'll do the TIM recalculation.
-+		 * became empty or we find that a txq became empty, we'll do the
-+		 * TIM recalculation.
- 		 */
-+
-+		if (!sta->sta.txq[0])
-+			return;
-+
-+		for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
-+			struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]);
-+
-+			if (!(tids & BIT(tid)) || skb_queue_len(&txqi->queue))
-+				continue;
-+
-+			sta_info_recalc_tim(sta);
-+			break;
-+		}
- 	}
- }
- 
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -274,6 +274,7 @@ struct sta_ampdu_mlme {
-  *	entered power saving state, these are also delivered to
-  *	the station when it leaves powersave or polls for frames
-  * @driver_buffered_tids: bitmap of TIDs the driver has data buffered on
-+ * @txq_buffered_tids: bitmap of TIDs that mac80211 has txq data buffered on
-  * @rx_packets: Number of MSDUs received from this STA
-  * @rx_bytes: Number of bytes received from this STA
-  * @last_rx: time (in jiffies) when last frame was received from this STA
-@@ -368,6 +369,7 @@ struct sta_info {
- 	struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS];
- 	struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS];
- 	unsigned long driver_buffered_tids;
-+	unsigned long txq_buffered_tids;
- 
- 	/* Updated from RX path only, no locking requirements */
- 	unsigned long rx_packets;
---- a/net/mac80211/trace.h
-+++ b/net/mac80211/trace.h
-@@ -2312,6 +2312,37 @@ TRACE_EVENT(drv_tdls_recv_channel_switch
- 	)
- );
- 
-+TRACE_EVENT(drv_wake_tx_queue,
-+	TP_PROTO(struct ieee80211_local *local,
-+		 struct ieee80211_sub_if_data *sdata,
-+		 struct txq_info *txq),
-+
-+	TP_ARGS(local, sdata, txq),
-+
-+	TP_STRUCT__entry(
-+		LOCAL_ENTRY
-+		VIF_ENTRY
-+		STA_ENTRY
-+		__field(u8, ac)
-+		__field(u8, tid)
-+	),
-+
-+	TP_fast_assign(
-+		struct ieee80211_sta *sta = txq->txq.sta;
-+
-+		LOCAL_ASSIGN;
-+		VIF_ASSIGN;
-+		STA_ASSIGN;
-+		__entry->ac = txq->txq.ac;
-+		__entry->tid = txq->txq.tid;
-+	),
-+
-+	TP_printk(
-+		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " ac:%d tid:%d",
-+		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->ac, __entry->tid
-+	)
-+);
-+
- #ifdef CPTCFG_MAC80211_MESSAGE_TRACING
- #undef TRACE_SYSTEM
- #define TRACE_SYSTEM mac80211_msg
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -776,12 +776,22 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
- 	return TX_CONTINUE;
- }
- 
-+static __le16 ieee80211_tx_next_seq(struct sta_info *sta, int tid)
-+{
-+	u16 *seq = &sta->tid_seq[tid];
-+	__le16 ret = cpu_to_le16(*seq);
-+
-+	/* Increase the sequence number. */
-+	*seq = (*seq + 0x10) & IEEE80211_SCTL_SEQ;
-+
-+	return ret;
-+}
-+
- static ieee80211_tx_result debug_noinline
- ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx)
- {
- 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
--	u16 *seq;
- 	u8 *qc;
- 	int tid;
- 
-@@ -832,13 +842,10 @@ ieee80211_tx_h_sequence(struct ieee80211
- 
- 	qc = ieee80211_get_qos_ctl(hdr);
- 	tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
--	seq = &tx->sta->tid_seq[tid];
- 	tx->sta->tx_msdu[tid]++;
- 
--	hdr->seq_ctrl = cpu_to_le16(*seq);
--
--	/* Increase the sequence number. */
--	*seq = (*seq + 0x10) & IEEE80211_SCTL_SEQ;
-+	if (!tx->sta->sta.txq[0])
-+		hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid);
- 
- 	return TX_CONTINUE;
- }
-@@ -1067,7 +1074,7 @@ static bool ieee80211_tx_prep_agg(struct
- 		 * nothing -- this aggregation session is being started
- 		 * but that might still fail with the driver
- 		 */
--	} else {
-+	} else if (!tx->sta->sta.txq[tid]) {
- 		spin_lock(&tx->sta->lock);
- 		/*
- 		 * Need to re-check now, because we may get here
-@@ -1201,13 +1208,102 @@ ieee80211_tx_prepare(struct ieee80211_su
- 	return TX_CONTINUE;
- }
- 
-+static void ieee80211_drv_tx(struct ieee80211_local *local,
-+			     struct ieee80211_vif *vif,
-+			     struct ieee80211_sta *pubsta,
-+			     struct sk_buff *skb)
-+{
-+	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-+	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
-+	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+	struct ieee80211_tx_control control = {
-+		.sta = pubsta,
-+	};
-+	struct ieee80211_txq *txq = NULL;
-+	struct txq_info *txqi;
-+	u8 ac;
-+
-+	if (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)
-+		goto tx_normal;
-+
-+	if (!ieee80211_is_data(hdr->frame_control))
-+		goto tx_normal;
-+
-+	if (pubsta) {
-+		u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-+
-+		txq = pubsta->txq[tid];
-+	} else if (vif) {
-+		txq = vif->txq;
-+	}
-+
-+	if (!txq)
-+		goto tx_normal;
-+
-+	ac = txq->ac;
-+	txqi = to_txq_info(txq);
-+	atomic_inc(&sdata->txqs_len[ac]);
-+	if (atomic_read(&sdata->txqs_len[ac]) >= local->hw.txq_ac_max_pending)
-+		netif_stop_subqueue(sdata->dev, ac);
-+
-+	skb_queue_tail(&txqi->queue, skb);
-+	drv_wake_tx_queue(local, txqi);
-+
-+	return;
-+
-+tx_normal:
-+	drv_tx(local, &control, skb);
-+}
-+
-+struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
-+				     struct ieee80211_txq *txq)
-+{
-+	struct ieee80211_local *local = hw_to_local(hw);
-+	struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif);
-+	struct txq_info *txqi = container_of(txq, struct txq_info, txq);
-+	struct ieee80211_hdr *hdr;
-+	struct sk_buff *skb = NULL;
-+	u8 ac = txq->ac;
-+
-+	spin_lock_bh(&txqi->queue.lock);
-+
-+	if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags))
-+		goto out;
-+
-+	skb = __skb_dequeue(&txqi->queue);
-+	if (!skb)
-+		goto out;
-+
-+	atomic_dec(&sdata->txqs_len[ac]);
-+	if (__netif_subqueue_stopped(sdata->dev, ac))
-+		ieee80211_propagate_queue_wake(local, sdata->vif.hw_queue[ac]);
-+
-+	hdr = (struct ieee80211_hdr *)skb->data;
-+	if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) {
-+		struct sta_info *sta = container_of(txq->sta, struct sta_info,
-+						    sta);
-+		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+
-+		hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid);
-+		if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags))
-+			info->flags |= IEEE80211_TX_CTL_AMPDU;
-+		else
-+			info->flags &= ~IEEE80211_TX_CTL_AMPDU;
-+	}
-+
-+out:
-+	spin_unlock_bh(&txqi->queue.lock);
-+
-+	return skb;
-+}
-+EXPORT_SYMBOL(ieee80211_tx_dequeue);
-+
- static bool ieee80211_tx_frags(struct ieee80211_local *local,
- 			       struct ieee80211_vif *vif,
- 			       struct ieee80211_sta *sta,
- 			       struct sk_buff_head *skbs,
- 			       bool txpending)
- {
--	struct ieee80211_tx_control control;
- 	struct sk_buff *skb, *tmp;
- 	unsigned long flags;
- 
-@@ -1265,10 +1361,9 @@ static bool ieee80211_tx_frags(struct ie
- 		spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
- 
- 		info->control.vif = vif;
--		control.sta = sta;
- 
- 		__skb_unlink(skb, skbs);
--		drv_tx(local, &control, skb);
-+		ieee80211_drv_tx(local, vif, sta, skb);
- 	}
- 
- 	return true;
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -308,6 +308,11 @@ void ieee80211_propagate_queue_wake(stru
- 		for (ac = 0; ac < n_acs; ac++) {
- 			int ac_queue = sdata->vif.hw_queue[ac];
- 
-+			if (local->ops->wake_tx_queue &&
-+			    (atomic_read(&sdata->txqs_len[ac]) >
-+			     local->hw.txq_ac_max_pending))
-+				continue;
-+
- 			if (ac_queue == queue ||
- 			    (sdata->vif.cab_queue == queue &&
- 			     local->queue_stop_reasons[ac_queue] == 0 &&
-@@ -3307,3 +3312,20 @@ u8 *ieee80211_add_wmm_info_ie(u8 *buf, u
- 
- 	return buf;
- }
-+
-+void ieee80211_init_tx_queue(struct ieee80211_sub_if_data *sdata,
-+			     struct sta_info *sta,
-+			     struct txq_info *txqi, int tid)
-+{
-+	skb_queue_head_init(&txqi->queue);
-+	txqi->txq.vif = &sdata->vif;
-+
-+	if (sta) {
-+		txqi->txq.sta = &sta->sta;
-+		sta->sta.txq[tid] = &txqi->txq;
-+		txqi->txq.ac = ieee802_1d_to_ac[tid & 7];
-+	} else {
-+		sdata->vif.txq = &txqi->txq;
-+		txqi->txq.ac = IEEE80211_AC_BE;
-+	}
-+}
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -1176,6 +1176,7 @@ static void sta_ps_start(struct sta_info
- 	struct ieee80211_sub_if_data *sdata = sta->sdata;
- 	struct ieee80211_local *local = sdata->local;
- 	struct ps_data *ps;
-+	int tid;
- 
- 	if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
- 	    sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-@@ -1189,6 +1190,18 @@ static void sta_ps_start(struct sta_info
- 		drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta);
- 	ps_dbg(sdata, "STA %pM aid %d enters power save mode\n",
- 	       sta->sta.addr, sta->sta.aid);
-+
-+	if (!sta->sta.txq[0])
-+		return;
-+
-+	for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
-+		struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]);
-+
-+		if (!skb_queue_len(&txqi->queue))
-+			set_bit(tid, &sta->txq_buffered_tids);
-+		else
-+			clear_bit(tid, &sta->txq_buffered_tids);
-+	}
- }
- 
- static void sta_ps_end(struct sta_info *sta)
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -188,6 +188,43 @@ ieee80211_wake_queue_agg(struct ieee8021
- 	__release(agg_queue);
- }
- 
-+static void
-+ieee80211_agg_stop_txq(struct sta_info *sta, int tid)
-+{
-+	struct ieee80211_txq *txq = sta->sta.txq[tid];
-+	struct txq_info *txqi;
-+
-+	if (!txq)
-+		return;
-+
-+	txqi = to_txq_info(txq);
-+
-+	/* Lock here to protect against further seqno updates on dequeue */
-+	spin_lock_bh(&txqi->queue.lock);
-+	set_bit(IEEE80211_TXQ_STOP, &txqi->flags);
-+	spin_unlock_bh(&txqi->queue.lock);
-+}
-+
-+static void
-+ieee80211_agg_start_txq(struct sta_info *sta, int tid, bool enable)
-+{
-+	struct ieee80211_txq *txq = sta->sta.txq[tid];
-+	struct txq_info *txqi;
-+
-+	if (!txq)
-+		return;
-+
-+	txqi = to_txq_info(txq);
-+
-+	if (enable)
-+		set_bit(IEEE80211_TXQ_AMPDU, &txqi->flags);
-+	else
-+		clear_bit(IEEE80211_TXQ_AMPDU, &txqi->flags);
-+
-+	clear_bit(IEEE80211_TXQ_STOP, &txqi->flags);
-+	drv_wake_tx_queue(sta->sdata->local, txqi);
-+}
-+
- /*
-  * splice packets from the STA's pending to the local pending,
-  * requires a call to ieee80211_agg_splice_finish later
-@@ -247,6 +284,7 @@ static void ieee80211_remove_tid_tx(stru
- 	ieee80211_assign_tid_tx(sta, tid, NULL);
- 
- 	ieee80211_agg_splice_finish(sta->sdata, tid);
-+	ieee80211_agg_start_txq(sta, tid, false);
- 
- 	kfree_rcu(tid_tx, rcu_head);
- }
-@@ -418,6 +456,8 @@ void ieee80211_tx_ba_session_handle_star
- 	 */
- 	clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state);
- 
-+	ieee80211_agg_stop_txq(sta, tid);
-+
- 	/*
- 	 * Make sure no packets are being processed. This ensures that
- 	 * we have a valid starting sequence number and that in-flight
-@@ -440,6 +480,8 @@ void ieee80211_tx_ba_session_handle_star
- 		ieee80211_agg_splice_finish(sdata, tid);
- 		spin_unlock_bh(&sta->lock);
- 
-+		ieee80211_agg_start_txq(sta, tid, false);
-+
- 		kfree_rcu(tid_tx, rcu_head);
- 		return;
- 	}
-@@ -666,6 +708,8 @@ static void ieee80211_agg_tx_operational
- 	ieee80211_agg_splice_finish(sta->sdata, tid);
- 
- 	spin_unlock_bh(&sta->lock);
-+
-+	ieee80211_agg_start_txq(sta, tid, true);
- }
- 
- void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid)
diff --git a/package/kernel/mac80211/patches/301-ath9k-limit-retries-for-powersave-response-frames.patch b/package/kernel/mac80211/patches/301-ath9k-limit-retries-for-powersave-response-frames.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a160dc4f02579801ba30873d4777101a059e6f79
--- /dev/null
+++ b/package/kernel/mac80211/patches/301-ath9k-limit-retries-for-powersave-response-frames.patch
@@ -0,0 +1,121 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 2 Jul 2015 15:20:56 +0200
+Subject: [PATCH] ath9k: limit retries for powersave response frames
+
+In some cases, the channel might be busy enough that an ath9k AP's
+response to PS-Poll frames might be too slow and the station has already
+gone to sleep. To avoid wasting too much airtime on this, limit the
+number of retries on such frames and ensure that no sample rate gets
+used.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -136,10 +136,25 @@ static void ath_send_bar(struct ath_atx_
+ }
+ 
+ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
+-			  struct ath_buf *bf)
++			  struct ath_buf *bf, bool ps)
+ {
++	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
++
++	if (ps) {
++		/* Clear the first rate to avoid using a sample rate for PS frames */
++		info->control.rates[0].idx = -1;
++		info->control.rates[0].count = 0;
++	}
++
+ 	ieee80211_get_tx_rates(vif, sta, bf->bf_mpdu, bf->rates,
+ 			       ARRAY_SIZE(bf->rates));
++	if (!ps)
++		return;
++
++	if (bf->rates[0].count > 2)
++		bf->rates[0].count = 2;
++
++	bf->rates[1].idx = -1;
+ }
+ 
+ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
+@@ -1419,7 +1434,7 @@ ath_tx_form_burst(struct ath_softc *sc,
+ 		if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
+ 			break;
+ 
+-		ath_set_rates(tid->an->vif, tid->an->sta, bf);
++		ath_set_rates(tid->an->vif, tid->an->sta, bf, false);
+ 	} while (1);
+ }
+ 
+@@ -1450,7 +1465,7 @@ static bool ath_tx_sched_aggr(struct ath
+ 		return false;
+ 	}
+ 
+-	ath_set_rates(tid->an->vif, tid->an->sta, bf);
++	ath_set_rates(tid->an->vif, tid->an->sta, bf, false);
+ 	if (aggr)
+ 		last = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf,
+ 					tid_q, &aggr_len);
+@@ -1647,7 +1662,7 @@ void ath9k_release_buffered_frames(struc
+ 
+ 			__skb_unlink(bf->bf_mpdu, tid_q);
+ 			list_add_tail(&bf->list, &bf_q);
+-			ath_set_rates(tid->an->vif, tid->an->sta, bf);
++			ath_set_rates(tid->an->vif, tid->an->sta, bf, true);
+ 			if (bf_isampdu(bf)) {
+ 				ath_tx_addto_baw(sc, tid, bf);
+ 				bf->bf_state.bf_type &= ~BUF_AGGR;
+@@ -2293,7 +2308,7 @@ int ath_tx_start(struct ieee80211_hw *hw
+ 	struct ath_txq *txq = txctl->txq;
+ 	struct ath_atx_tid *tid = NULL;
+ 	struct ath_buf *bf;
+-	bool queue, skip_uapsd = false, ps_resp;
++	bool queue, ps_resp;
+ 	int q, ret;
+ 
+ 	if (vif)
+@@ -2346,13 +2361,13 @@ int ath_tx_start(struct ieee80211_hw *hw
+ 		if (!txctl->an)
+ 			txctl->an = &avp->mcast_node;
+ 		queue = true;
+-		skip_uapsd = true;
++		ps_resp = false;
+ 	}
+ 
+ 	if (txctl->an && queue)
+ 		tid = ath_get_skb_tid(sc, txctl->an, skb);
+ 
+-	if (!skip_uapsd && ps_resp) {
++	if (ps_resp) {
+ 		ath_txq_unlock(sc, txq);
+ 		txq = sc->tx.uapsdq;
+ 		ath_txq_lock(sc, txq);
+@@ -2390,7 +2405,7 @@ int ath_tx_start(struct ieee80211_hw *hw
+ 	if (txctl->paprd)
+ 		bf->bf_state.bfs_paprd_timestamp = jiffies;
+ 
+-	ath_set_rates(vif, sta, bf);
++	ath_set_rates(vif, sta, bf, ps_resp);
+ 	ath_tx_send_normal(sc, txq, tid, skb);
+ 
+ out:
+@@ -2429,7 +2444,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw
+ 			break;
+ 
+ 		bf->bf_lastbf = bf;
+-		ath_set_rates(vif, NULL, bf);
++		ath_set_rates(vif, NULL, bf, false);
+ 		ath_buf_set_rate(sc, bf, &info, fi->framelen, false);
+ 		duration += info.rates[0].PktDuration;
+ 		if (bf_tail)
+@@ -2932,7 +2947,7 @@ int ath9k_tx99_send(struct ath_softc *sc
+ 		return -EINVAL;
+ 	}
+ 
+-	ath_set_rates(sc->tx99_vif, NULL, bf);
++	ath_set_rates(sc->tx99_vif, NULL, bf, false);
+ 
+ 	ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, bf->bf_daddr);
+ 	ath9k_hw_tx99_start(sc->sc_ah, txctl->txq->axq_qnum);
diff --git a/package/kernel/mac80211/patches/301-mac80211-lock-rate-control.patch b/package/kernel/mac80211/patches/301-mac80211-lock-rate-control.patch
deleted file mode 100644
index 465d94319df031e88c960312b55d8bfee8b3b6cf..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/301-mac80211-lock-rate-control.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Wed, 11 Mar 2015 09:14:15 +0100
-Subject: [PATCH] mac80211: lock rate control
-
-Both minstrel (reported by Sven Eckelmann) and the iwlwifi rate
-control aren't properly taking concurrency into account. It's
-likely that the same is true for other rate control algorithms.
-
-In the case of minstrel this manifests itself in crashes when an
-update and other data access are run concurrently, for example
-when the stations change bandwidth or similar. In iwlwifi, this
-can cause firmware crashes.
-
-Since fixing all rate control algorithms will be very difficult,
-just provide locking for invocations. This protects the internal
-data structures the algorithms maintain.
-
-I've manipulated hostapd to test this, by having it change its
-advertised bandwidth roughly ever 150ms. At the same time, I'm
-running a flood ping between the client and the AP, which causes
-this race of update vs. get_rate/status to easily happen on the
-client. With this change, the system survives this test.
-
-Reported-by: Sven Eckelmann <sven@open-mesh.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/rate.c
-+++ b/net/mac80211/rate.c
-@@ -683,7 +683,13 @@ void rate_control_get_rate(struct ieee80
- 	if (sdata->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
- 		return;
- 
--	ref->ops->get_rate(ref->priv, ista, priv_sta, txrc);
-+	if (ista) {
-+		spin_lock_bh(&sta->rate_ctrl_lock);
-+		ref->ops->get_rate(ref->priv, ista, priv_sta, txrc);
-+		spin_unlock_bh(&sta->rate_ctrl_lock);
-+	} else {
-+		ref->ops->get_rate(ref->priv, NULL, NULL, txrc);
-+	}
- 
- 	if (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_RC_TABLE)
- 		return;
---- a/net/mac80211/rate.h
-+++ b/net/mac80211/rate.h
-@@ -42,10 +42,12 @@ static inline void rate_control_tx_statu
- 	if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
- 		return;
- 
-+	spin_lock_bh(&sta->rate_ctrl_lock);
- 	if (ref->ops->tx_status)
- 		ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb);
- 	else
- 		ref->ops->tx_status_noskb(ref->priv, sband, ista, priv_sta, info);
-+	spin_unlock_bh(&sta->rate_ctrl_lock);
- }
- 
- static inline void
-@@ -64,7 +66,9 @@ rate_control_tx_status_noskb(struct ieee
- 	if (WARN_ON_ONCE(!ref->ops->tx_status_noskb))
- 		return;
- 
-+	spin_lock_bh(&sta->rate_ctrl_lock);
- 	ref->ops->tx_status_noskb(ref->priv, sband, ista, priv_sta, info);
-+	spin_unlock_bh(&sta->rate_ctrl_lock);
- }
- 
- static inline void rate_control_rate_init(struct sta_info *sta)
-@@ -91,8 +95,10 @@ static inline void rate_control_rate_ini
- 
- 	sband = local->hw.wiphy->bands[chanctx_conf->def.chan->band];
- 
-+	spin_lock_bh(&sta->rate_ctrl_lock);
- 	ref->ops->rate_init(ref->priv, sband, &chanctx_conf->def, ista,
- 			    priv_sta);
-+	spin_unlock_bh(&sta->rate_ctrl_lock);
- 	rcu_read_unlock();
- 	set_sta_flag(sta, WLAN_STA_RATE_CONTROL);
- }
-@@ -115,18 +121,20 @@ static inline void rate_control_rate_upd
- 			return;
- 		}
- 
-+		spin_lock_bh(&sta->rate_ctrl_lock);
- 		ref->ops->rate_update(ref->priv, sband, &chanctx_conf->def,
- 				      ista, priv_sta, changed);
-+		spin_unlock_bh(&sta->rate_ctrl_lock);
- 		rcu_read_unlock();
- 	}
- 	drv_sta_rc_update(local, sta->sdata, &sta->sta, changed);
- }
- 
- static inline void *rate_control_alloc_sta(struct rate_control_ref *ref,
--					   struct ieee80211_sta *sta,
--					   gfp_t gfp)
-+					   struct sta_info *sta, gfp_t gfp)
- {
--	return ref->ops->alloc_sta(ref->priv, sta, gfp);
-+	spin_lock_init(&sta->rate_ctrl_lock);
-+	return ref->ops->alloc_sta(ref->priv, &sta->sta, gfp);
- }
- 
- static inline void rate_control_free_sta(struct sta_info *sta)
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -286,7 +286,7 @@ static int sta_prepare_rate_control(stru
- 
- 	sta->rate_ctrl = local->rate_ctrl;
- 	sta->rate_ctrl_priv = rate_control_alloc_sta(sta->rate_ctrl,
--						     &sta->sta, gfp);
-+						     sta, gfp);
- 	if (!sta->rate_ctrl_priv)
- 		return -ENOMEM;
- 
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -349,6 +349,7 @@ struct sta_info {
- 	u8 ptk_idx;
- 	struct rate_control_ref *rate_ctrl;
- 	void *rate_ctrl_priv;
-+	spinlock_t rate_ctrl_lock;
- 	spinlock_t lock;
- 
- 	struct work_struct drv_deliver_wk;
diff --git a/package/kernel/mac80211/patches/302-ath9k-restart-only-triggering-DFS-detector-line.patch b/package/kernel/mac80211/patches/302-ath9k-restart-only-triggering-DFS-detector-line.patch
deleted file mode 100644
index e54e16eb053b73dc0429f91c9066b1b8b11e8c2b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/302-ath9k-restart-only-triggering-DFS-detector-line.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From: Zefir Kurtisi <zefir.kurtisi@neratec.com>
-Date: Tue, 10 Mar 2015 17:49:29 +0100
-Subject: [PATCH] ath9k: restart only triggering DFS detector line
-
-To support HT40 DFS mode, a triggering detector must
-reset only itself but not other detector lines.
-
-Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
----
-
---- a/drivers/net/wireless/ath/dfs_pattern_detector.c
-+++ b/drivers/net/wireless/ath/dfs_pattern_detector.c
-@@ -289,7 +289,7 @@ dpd_add_pulse(struct dfs_pattern_detecto
- 				"count=%d, count_false=%d\n",
- 				event->freq, pd->rs->type_id,
- 				ps->pri, ps->count, ps->count_falses);
--			channel_detector_reset(dpd, cd);
-+			pd->reset(pd, dpd->last_pulse_ts);
- 			return true;
- 		}
- 	}
diff --git a/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch b/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch
new file mode 100644
index 0000000000000000000000000000000000000000..22b987aa7aaae92f889adc938ca88042d3edfdf6
--- /dev/null
+++ b/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch
@@ -0,0 +1,95 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 14 Jan 2016 03:14:03 +0100
+Subject: [PATCH] ath9k_hw: add low power tx gain table for AR953x
+
+Used in some newer TP-Link AR9533 devices.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+@@ -698,6 +698,9 @@ static void ar9003_tx_gain_table_mode2(s
+ 	else if (AR_SREV_9340(ah))
+ 		INIT_INI_ARRAY(&ah->iniModesTxGain,
+ 			ar9340Modes_low_ob_db_tx_gain_table_1p0);
++	else if (AR_SREV_9531_11(ah))
++		INIT_INI_ARRAY(&ah->iniModesTxGain,
++			       qca953x_1p1_modes_no_xpa_low_power_tx_gain_table);
+ 	else if (AR_SREV_9485_11_OR_LATER(ah))
+ 		INIT_INI_ARRAY(&ah->iniModesTxGain,
+ 			ar9485Modes_low_ob_db_tx_gain_1_1);
+--- a/drivers/net/wireless/ath/ath9k/ar953x_initvals.h
++++ b/drivers/net/wireless/ath/ath9k/ar953x_initvals.h
+@@ -757,6 +757,71 @@ static const u32 qca953x_1p1_modes_xpa_t
+ 	{0x00016448, 0x6c927a70},
+ };
+ 
++static const u32 qca953x_1p1_modes_no_xpa_low_power_tx_gain_table[][2] = {
++	/* Addr      allmodes  */
++	{0x0000a2dc, 0xfff55592},
++	{0x0000a2e0, 0xfff99924},
++	{0x0000a2e4, 0xfffe1e00},
++	{0x0000a2e8, 0xffffe000},
++	{0x0000a410, 0x000050d6},
++	{0x0000a500, 0x00000069},
++	{0x0000a504, 0x0400006b},
++	{0x0000a508, 0x0800006d},
++	{0x0000a50c, 0x0c000269},
++	{0x0000a510, 0x1000026b},
++	{0x0000a514, 0x1400026d},
++	{0x0000a518, 0x18000669},
++	{0x0000a51c, 0x1c00066b},
++	{0x0000a520, 0x1d000a68},
++	{0x0000a524, 0x21000a6a},
++	{0x0000a528, 0x25000a6c},
++	{0x0000a52c, 0x29000a6e},
++	{0x0000a530, 0x2d0012a9},
++	{0x0000a534, 0x310012ab},
++	{0x0000a538, 0x350012ad},
++	{0x0000a53c, 0x39001b0a},
++	{0x0000a540, 0x3d001b0c},
++	{0x0000a544, 0x41001b0e},
++	{0x0000a548, 0x43001bae},
++	{0x0000a54c, 0x45001914},
++	{0x0000a550, 0x47001916},
++	{0x0000a554, 0x49001b96},
++	{0x0000a558, 0x49001b96},
++	{0x0000a55c, 0x49001b96},
++	{0x0000a560, 0x49001b96},
++	{0x0000a564, 0x49001b96},
++	{0x0000a568, 0x49001b96},
++	{0x0000a56c, 0x49001b96},
++	{0x0000a570, 0x49001b96},
++	{0x0000a574, 0x49001b96},
++	{0x0000a578, 0x49001b96},
++	{0x0000a57c, 0x49001b96},
++	{0x0000a600, 0x00000000},
++	{0x0000a604, 0x00000000},
++	{0x0000a608, 0x00000000},
++	{0x0000a60c, 0x00000000},
++	{0x0000a610, 0x00000000},
++	{0x0000a614, 0x00000000},
++	{0x0000a618, 0x00804201},
++	{0x0000a61c, 0x01408201},
++	{0x0000a620, 0x01408502},
++	{0x0000a624, 0x01408502},
++	{0x0000a628, 0x01408502},
++	{0x0000a62c, 0x01408502},
++	{0x0000a630, 0x01408502},
++	{0x0000a634, 0x01408502},
++	{0x0000a638, 0x01408502},
++	{0x0000a63c, 0x01408502},
++	{0x0000b2dc, 0xfff55592},
++	{0x0000b2e0, 0xfff99924},
++	{0x0000b2e4, 0xfffe1e00},
++	{0x0000b2e8, 0xffffe000},
++	{0x00016044, 0x044922db},
++	{0x00016048, 0x6c927a70},
++	{0x00016444, 0x044922db},
++	{0x00016448, 0x6c927a70},
++};
++
+ static const u32 qca953x_2p0_baseband_core[][2] = {
+ 	/* Addr      allmodes  */
+ 	{0x00009800, 0xafe68e30},
diff --git a/package/kernel/mac80211/patches/303-ath9k-add-DFS-support-for-extension-channel.patch b/package/kernel/mac80211/patches/303-ath9k-add-DFS-support-for-extension-channel.patch
deleted file mode 100644
index ed268eacf9082ebf2a9642a0f733ca8a7ad7165c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/303-ath9k-add-DFS-support-for-extension-channel.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Zefir Kurtisi <zefir.kurtisi@neratec.com>
-Date: Tue, 10 Mar 2015 17:49:30 +0100
-Subject: [PATCH] ath9k: add DFS support for extension channel
-
-In HT40 modes, pulse events on primary and extension
-channel are processed individually. If valid, a pulse
-event will be fed into the detector
-* for primary frequency, or
-* for extension frequency (+/-20MHz based on HT40-mode)
-* or both
-
-With that, a 40MHz radar will result in two individual
-radar events.
-
-Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
----
-
---- a/drivers/net/wireless/ath/ath9k/dfs.c
-+++ b/drivers/net/wireless/ath/ath9k/dfs.c
-@@ -126,8 +126,19 @@ ath9k_postprocess_radar_event(struct ath
- 	DFS_STAT_INC(sc, pulses_detected);
- 	return true;
- }
--#undef PRI_CH_RADAR_FOUND
--#undef EXT_CH_RADAR_FOUND
-+
-+static void
-+ath9k_dfs_process_radar_pulse(struct ath_softc *sc, struct pulse_event *pe)
-+{
-+	struct dfs_pattern_detector *pd = sc->dfs_detector;
-+	DFS_STAT_INC(sc, pulses_processed);
-+	if (pd == NULL)
-+		return;
-+	if (!pd->add_pulse(pd, pe))
-+		return;
-+	DFS_STAT_INC(sc, radar_detected);
-+	ieee80211_radar_detected(sc->hw);
-+}
- 
- /*
-  * DFS: check PHY-error for radar pulse and feed the detector
-@@ -176,18 +187,21 @@ void ath9k_dfs_process_phyerr(struct ath
- 	ard.pulse_length_pri = vdata_end[-3];
- 	pe.freq = ah->curchan->channel;
- 	pe.ts = mactime;
--	if (ath9k_postprocess_radar_event(sc, &ard, &pe)) {
--		struct dfs_pattern_detector *pd = sc->dfs_detector;
--		ath_dbg(common, DFS,
--			"ath9k_dfs_process_phyerr: channel=%d, ts=%llu, "
--			"width=%d, rssi=%d, delta_ts=%llu\n",
--			pe.freq, pe.ts, pe.width, pe.rssi,
--			pe.ts - sc->dfs_prev_pulse_ts);
--		sc->dfs_prev_pulse_ts = pe.ts;
--		DFS_STAT_INC(sc, pulses_processed);
--		if (pd != NULL && pd->add_pulse(pd, &pe)) {
--			DFS_STAT_INC(sc, radar_detected);
--			ieee80211_radar_detected(sc->hw);
--		}
-+	if (!ath9k_postprocess_radar_event(sc, &ard, &pe))
-+		return;
-+
-+	ath_dbg(common, DFS,
-+		"ath9k_dfs_process_phyerr: type=%d, freq=%d, ts=%llu, "
-+		"width=%d, rssi=%d, delta_ts=%llu\n",
-+		ard.pulse_bw_info, pe.freq, pe.ts, pe.width, pe.rssi,
-+		pe.ts - sc->dfs_prev_pulse_ts);
-+	sc->dfs_prev_pulse_ts = pe.ts;
-+	if (ard.pulse_bw_info & PRI_CH_RADAR_FOUND)
-+		ath9k_dfs_process_radar_pulse(sc, &pe);
-+	if (ard.pulse_bw_info & EXT_CH_RADAR_FOUND) {
-+		pe.freq += IS_CHAN_HT40PLUS(ah->curchan) ? 20 : -20;
-+		ath9k_dfs_process_radar_pulse(sc, &pe);
- 	}
- }
-+#undef PRI_CH_RADAR_FOUND
-+#undef EXT_CH_RADAR_FOUND
diff --git a/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch b/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7bb74353eb128442bf26bc098d62a89c32cfc9d4
--- /dev/null
+++ b/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch
@@ -0,0 +1,156 @@
+From: Eli Cooper <elicooper@gmx.com>
+Date: Thu, 14 Jan 2016 00:07:12 +0800
+Subject: [PATCH] rt2x00: fix monitor mode regression
+
+Since commit df1404650ccbfeb76a84f301f22316be0d00a864 monitor mode for rt2x00
+has been made effectively useless because the hardware filter is configured to
+drop packets whose intended recipient is not the device, regardless of the
+presence of monitor mode interfaces.
+
+This patch fixes this regression by adding explicit monitor mode support, and
+configuring the hardware filter accordingly.
+
+Signed-off-by: Eli Cooper <elicooper@gmx.com>
+---
+
+--- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
+@@ -273,8 +273,10 @@ static void rt2400pci_config_filter(stru
+ 			   !(filter_flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
+ 			   !(filter_flags & FIF_CONTROL));
+-	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, 1);
++	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
++			   !rt2x00dev->is_monitoring);
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
++			   !rt2x00dev->is_monitoring &&
+ 			   !rt2x00dev->intf_ap_count);
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
+ 	rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
+@@ -274,8 +274,10 @@ static void rt2500pci_config_filter(stru
+ 			   !(filter_flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,
+ 			   !(filter_flags & FIF_CONTROL));
+-	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, 1);
++	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
++			   !rt2x00dev->is_monitoring);
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
++			   !rt2x00dev->is_monitoring &&
+ 			   !rt2x00dev->intf_ap_count);
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
+ 	rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST,
+--- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
+@@ -437,8 +437,10 @@ static void rt2500usb_config_filter(stru
+ 			   !(filter_flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_CONTROL,
+ 			   !(filter_flags & FIF_CONTROL));
+-	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME, 1);
++	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME,
++			   !rt2x00dev->is_monitoring);
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS,
++			   !rt2x00dev->is_monitoring &&
+ 			   !rt2x00dev->intf_ap_count);
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
+ 	rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST,
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -1490,7 +1490,8 @@ void rt2800_config_filter(struct rt2x00_
+ 			   !(filter_flags & FIF_FCSFAIL));
+ 	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
+ 			   !(filter_flags & FIF_PLCPFAIL));
+-	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME, 1);
++	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME,
++			   !rt2x00dev->is_monitoring);
+ 	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
+ 	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
+ 	rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -844,11 +844,13 @@ struct rt2x00_dev {
+ 	 *  - Open sta interface count.
+ 	 *  - Association count.
+ 	 *  - Beaconing enabled count.
++	 *  - Whether the device is monitoring.
+ 	 */
+ 	unsigned int intf_ap_count;
+ 	unsigned int intf_sta_count;
+ 	unsigned int intf_associated;
+ 	unsigned int intf_beaconing;
++	bool is_monitoring;
+ 
+ 	/*
+ 	 * Interface combinations
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00config.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00config.c
+@@ -244,6 +244,16 @@ void rt2x00lib_config(struct rt2x00_dev
+ 	    (ieee80211_flags & IEEE80211_CONF_CHANGE_PS))
+ 		cancel_delayed_work_sync(&rt2x00dev->autowakeup_work);
+ 
++	if (ieee80211_flags & IEEE80211_CONF_CHANGE_MONITOR) {
++		if (conf->flags & IEEE80211_CONF_MONITOR) {
++			rt2x00_dbg(rt2x00dev, "Monitor mode is enabled\n");
++			rt2x00dev->is_monitoring = true;
++		} else {
++			rt2x00_dbg(rt2x00dev, "Monitor mode is disabled\n");
++			rt2x00dev->is_monitoring = false;
++		}
++	}
++
+ 	/*
+ 	 * Start configuration.
+ 	 */
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+@@ -1204,6 +1204,7 @@ int rt2x00lib_start(struct rt2x00_dev *r
+ 	rt2x00dev->intf_ap_count = 0;
+ 	rt2x00dev->intf_sta_count = 0;
+ 	rt2x00dev->intf_associated = 0;
++	rt2x00dev->is_monitoring = false;
+ 
+ 	/* Enable the radio */
+ 	retval = rt2x00lib_enable_radio(rt2x00dev);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
+@@ -385,11 +385,6 @@ void rt2x00mac_configure_filter(struct i
+ 			*total_flags |= FIF_PSPOLL;
+ 	}
+ 
+-	/*
+-	 * Check if there is any work left for us.
+-	 */
+-	if (rt2x00dev->packet_filter == *total_flags)
+-		return;
+ 	rt2x00dev->packet_filter = *total_flags;
+ 
+ 	rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags);
+--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
+@@ -530,8 +530,10 @@ static void rt61pci_config_filter(struct
+ 			   !(filter_flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
+ 			   !(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
+-	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME, 1);
++	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
++			   !rt2x00dev->is_monitoring);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
++			   !rt2x00dev->is_monitoring &&
+ 			   !rt2x00dev->intf_ap_count);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,
+--- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c
+@@ -480,8 +480,10 @@ static void rt73usb_config_filter(struct
+ 			   !(filter_flags & FIF_PLCPFAIL));
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,
+ 			   !(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
+-	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME, 1);
++	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
++			   !rt2x00dev->is_monitoring);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
++			   !rt2x00dev->is_monitoring &&
+ 			   !rt2x00dev->intf_ap_count);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
+ 	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,
diff --git a/package/kernel/mac80211/patches/304-ath9k-allow-40MHz-radar-detection-width.patch b/package/kernel/mac80211/patches/304-ath9k-allow-40MHz-radar-detection-width.patch
deleted file mode 100644
index e1eab64ebe27597193761d8fc1ce7796fcd4a0fb..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/304-ath9k-allow-40MHz-radar-detection-width.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From: Zefir Kurtisi <zefir.kurtisi@neratec.com>
-Date: Tue, 10 Mar 2015 17:49:31 +0100
-Subject: [PATCH] ath9k: allow 40MHz radar detection width
-
-Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
----
-
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -763,7 +763,8 @@ static const struct ieee80211_iface_comb
- 		.num_different_channels = 1,
- 		.beacon_int_infra_match = true,
- 		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
--					BIT(NL80211_CHAN_WIDTH_20),
-+					BIT(NL80211_CHAN_WIDTH_20) |
-+					BIT(NL80211_CHAN_WIDTH_40),
- 	}
- #endif
- };
diff --git a/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch b/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch
new file mode 100644
index 0000000000000000000000000000000000000000..049059aa24b50e71636336e3928bc66e64c39ae1
--- /dev/null
+++ b/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch
@@ -0,0 +1,32 @@
+From: Miaoqing Pan <miaoqing@codeaurora.org>
+Date: Fri, 15 Jan 2016 18:17:17 +0800
+Subject: [PATCH] ath9k: avoid ANI restart if no trigger
+
+Fixes commit 54da20d83f0e ("ath9k_hw: improve ANI processing and rx desensitizing parameters")
+
+Call ath9k_ani_restart() only when the phy error rate reach the
+ANI immunity threshold. Sync the logic with internal code base.
+
+Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ani.c
++++ b/drivers/net/wireless/ath/ath9k/ani.c
+@@ -444,14 +444,16 @@ void ath9k_hw_ani_monitor(struct ath_hw
+ 		    ofdmPhyErrRate < ah->config.ofdm_trig_low) {
+ 			ath9k_hw_ani_lower_immunity(ah);
+ 			aniState->ofdmsTurn = !aniState->ofdmsTurn;
++			ath9k_ani_restart(ah);
+ 		} else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) {
+ 			ath9k_hw_ani_ofdm_err_trigger(ah);
+ 			aniState->ofdmsTurn = false;
++			ath9k_ani_restart(ah);
+ 		} else if (cckPhyErrRate > ah->config.cck_trig_high) {
+ 			ath9k_hw_ani_cck_err_trigger(ah);
+ 			aniState->ofdmsTurn = true;
++			ath9k_ani_restart(ah);
+ 		}
+-		ath9k_ani_restart(ah);
+ 	}
+ }
+ EXPORT_SYMBOL(ath9k_hw_ani_monitor);
diff --git a/package/kernel/mac80211/patches/305-ath5k-channel-change-fix.patch b/package/kernel/mac80211/patches/305-ath5k-channel-change-fix.patch
deleted file mode 100644
index 4cfa53f6c05329abc56ecb83dd3bb3ced643dda9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/305-ath5k-channel-change-fix.patch
+++ /dev/null
@@ -1,137 +0,0 @@
-From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-Date: Wed, 4 Mar 2015 05:12:10 +0300
-Subject: [PATCH] ath5k: channel change fix
-
-ath5k updates the channel pointer and after that it stops the Rx logic
-and apply channel to HW. In case of channel switch, such sequence
-creates a small window when a frame, which is received on the old
-channel is considered as a frame received on the new one.
-
-The most notable consequence of this situation occurs during the switch
-from 2 GHz band (CCK+OFDM) to the 5GHz band (OFDM-only). Frame received
-with CCK rate, e.g. beacon received at the 1mbps, causes the following
-warning:
-
-  WARNING: at ath5k/base.c:589 ath5k_tasklet_rx+0x318/0x6ec [ath5k]()
-  invalid hw_rix: 1a
-  [..]
-  Call Trace:
-  [<802656a8>] show_stack+0x48/0x70
-  [<802dd92c>] warn_slowpath_common+0x88/0xbc
-  [<802dd98c>] warn_slowpath_fmt+0x2c/0x38
-  [<81b51be8>] ath5k_tasklet_rx+0x318/0x6ec [ath5k]
-  [<8028ac64>] tasklet_action+0x8c/0xf0
-  [<80075804>] __do_softirq+0x180/0x32c
-  [<80196ce8>] irq_exit+0x54/0x70
-  [<80041848>] ret_from_irq+0x0/0x4
-  [<80182fdc>] ioread32+0x4/0xc
-  [<81b4c42c>] ath5k_hw_set_sleep_clock+0x2ec/0x474 [ath5k]
-  [<81b4cf28>] ath5k_hw_reset+0x50/0xeb8 [ath5k]
-  [<81b50900>] ath5k_reset+0xd4/0x310 [ath5k]
-  [<81b557e8>] ath5k_config+0x4c/0x104 [ath5k]
-  [<80d01770>] ieee80211_hw_config+0x2f4/0x35c [mac80211]
-  [<80d09aa8>] ieee80211_scan_work+0x2e4/0x414 [mac80211]
-  [<8022c3f4>] process_one_work+0x28c/0x400
-  [<802df8f8>] worker_thread+0x258/0x3c0
-  [<801b5710>] kthread+0xe0/0xec
-  [<800418a8>] ret_from_kernel_thread+0x14/0x1c
-
-The easiest way to reproduce this warning is to run scan with dualband
-NIC in noisy environments, when the channel 11 runs multiple APs. In my
-tests if the APs num >= 12, the warning appears in the first few
-seconds of scanning.
-
-In order to fix this, the Rx disable code moved to a higher level and
-placed before the channel pointer update. This is also makes the code a
-bit more symmetrical, since we disable and enable the Rx in the same
-function.
-
-In fact, at the pointer update time new frames should not appear,
-because interrupt generation at this point should already be disabled.
-The next patch should address this issue.
-
-CC: Jiri Slaby <jirislaby@gmail.com>
-CC: Nick Kossifidis <mickflemm@gmail.com>
-CC: Luis R. Rodriguez <mcgrof@do-not-panic.com>
-Reported-by: Christophe Prevotaux <cprevotaux@nltinc.com>
-Tested-by: Christophe Prevotaux <cprevotaux@nltinc.com>
-Tested-by: Eric Bree <ebree@nltinc.com>
-Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
----
-
---- a/drivers/net/wireless/ath/ath5k/base.c
-+++ b/drivers/net/wireless/ath/ath5k/base.c
-@@ -2858,7 +2858,7 @@ ath5k_reset(struct ath5k_hw *ah, struct
- {
- 	struct ath_common *common = ath5k_hw_common(ah);
- 	int ret, ani_mode;
--	bool fast;
-+	bool fast = chan && modparam_fastchanswitch ? 1 : 0;
- 
- 	ATH5K_DBG(ah, ATH5K_DEBUG_RESET, "resetting\n");
- 
-@@ -2876,11 +2876,29 @@ ath5k_reset(struct ath5k_hw *ah, struct
- 	 * so we should also free any remaining
- 	 * tx buffers */
- 	ath5k_drain_tx_buffs(ah);
-+
-+	/* Stop PCU */
-+	ath5k_hw_stop_rx_pcu(ah);
-+
-+	/* Stop DMA
-+	 *
-+	 * Note: If DMA didn't stop continue
-+	 * since only a reset will fix it.
-+	 */
-+	ret = ath5k_hw_dma_stop(ah);
-+
-+	/* RF Bus grant won't work if we have pending
-+	 * frames
-+	 */
-+	if (ret && fast) {
-+		ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
-+			  "DMA didn't stop, falling back to normal reset\n");
-+		fast = false;
-+	}
-+
- 	if (chan)
- 		ah->curchan = chan;
- 
--	fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0;
--
- 	ret = ath5k_hw_reset(ah, ah->opmode, ah->curchan, fast, skip_pcu);
- 	if (ret) {
- 		ATH5K_ERR(ah, "can't reset hardware (%d)\n", ret);
---- a/drivers/net/wireless/ath/ath5k/reset.c
-+++ b/drivers/net/wireless/ath/ath5k/reset.c
-@@ -1169,30 +1169,6 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
- 	if (ah->ah_version == AR5K_AR5212)
- 		ath5k_hw_set_sleep_clock(ah, false);
- 
--	/*
--	 * Stop PCU
--	 */
--	ath5k_hw_stop_rx_pcu(ah);
--
--	/*
--	 * Stop DMA
--	 *
--	 * Note: If DMA didn't stop continue
--	 * since only a reset will fix it.
--	 */
--	ret = ath5k_hw_dma_stop(ah);
--
--	/* RF Bus grant won't work if we have pending
--	 * frames */
--	if (ret && fast) {
--		ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
--			"DMA didn't stop, falling back to normal reset\n");
--		fast = false;
--		/* Non fatal, just continue with
--		 * normal reset */
--		ret = 0;
--	}
--
- 	mode = channel->hw_value;
- 	switch (mode) {
- 	case AR5K_MODE_11A:
diff --git a/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch b/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a1ac67c828deb429af4ba4db0e8c18e87a3e12b6
--- /dev/null
+++ b/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch
@@ -0,0 +1,91 @@
+From: Miaoqing Pan <miaoqing@codeaurora.org>
+Date: Fri, 15 Jan 2016 18:17:18 +0800
+Subject: [PATCH] ath9k: clean up ANI per-channel pointer checking
+
+commit c24bd3620c50 ("ath9k: Do not maintain ANI state per-channel")
+removed per-channel handling, the code to check 'curchan' also
+should be removed as never used.
+
+Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ani.c
++++ b/drivers/net/wireless/ath/ath9k/ani.c
+@@ -126,12 +126,8 @@ static void ath9k_hw_update_mibstats(str
+ 
+ static void ath9k_ani_restart(struct ath_hw *ah)
+ {
+-	struct ar5416AniState *aniState;
+-
+-	if (!ah->curchan)
+-		return;
++	struct ar5416AniState *aniState = &ah->ani;
+ 
+-	aniState = &ah->ani;
+ 	aniState->listenTime = 0;
+ 
+ 	ENABLE_REGWRITE_BUFFER(ah);
+@@ -221,12 +217,7 @@ static void ath9k_hw_set_ofdm_nil(struct
+ 
+ static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah)
+ {
+-	struct ar5416AniState *aniState;
+-
+-	if (!ah->curchan)
+-		return;
+-
+-	aniState = &ah->ani;
++	struct ar5416AniState *aniState = &ah->ani;
+ 
+ 	if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL)
+ 		ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel + 1, false);
+@@ -281,12 +272,7 @@ static void ath9k_hw_set_cck_nil(struct
+ 
+ static void ath9k_hw_ani_cck_err_trigger(struct ath_hw *ah)
+ {
+-	struct ar5416AniState *aniState;
+-
+-	if (!ah->curchan)
+-		return;
+-
+-	aniState = &ah->ani;
++	struct ar5416AniState *aniState = &ah->ani;
+ 
+ 	if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL)
+ 		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1,
+@@ -299,9 +285,7 @@ static void ath9k_hw_ani_cck_err_trigger
+  */
+ static void ath9k_hw_ani_lower_immunity(struct ath_hw *ah)
+ {
+-	struct ar5416AniState *aniState;
+-
+-	aniState = &ah->ani;
++	struct ar5416AniState *aniState = &ah->ani;
+ 
+ 	/* lower OFDM noise immunity */
+ 	if (aniState->ofdmNoiseImmunityLevel > 0 &&
+@@ -329,7 +313,7 @@ void ath9k_ani_reset(struct ath_hw *ah,
+ 	struct ath_common *common = ath9k_hw_common(ah);
+ 	int ofdm_nil, cck_nil;
+ 
+-	if (!ah->curchan)
++	if (!chan)
+ 		return;
+ 
+ 	BUG_ON(aniState == NULL);
+@@ -416,14 +400,10 @@ static bool ath9k_hw_ani_read_counters(s
+ 
+ void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan)
+ {
+-	struct ar5416AniState *aniState;
++	struct ar5416AniState *aniState = &ah->ani;
+ 	struct ath_common *common = ath9k_hw_common(ah);
+ 	u32 ofdmPhyErrRate, cckPhyErrRate;
+ 
+-	if (!ah->curchan)
+-		return;
+-
+-	aniState = &ah->ani;
+ 	if (!ath9k_hw_ani_read_counters(ah))
+ 		return;
+ 
diff --git a/package/kernel/mac80211/patches/306-ath5k-fix-reset-race.patch b/package/kernel/mac80211/patches/306-ath5k-fix-reset-race.patch
deleted file mode 100644
index 85a190481bc594da37eebb8ec6f9674043c7b435..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/306-ath5k-fix-reset-race.patch
+++ /dev/null
@@ -1,96 +0,0 @@
-From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-Date: Wed, 4 Mar 2015 05:12:11 +0300
-Subject: [PATCH] ath5k: fix reset race
-
-To prepare for reset ath5k should finish all asynchronous tasks. At
-first, it disables the interrupt generation, then it waits for the
-interrupt handler and tasklets completion, and then proceeds to the HW
-configuration update. But it does not consider that the interrupt
-handler or tasklet re-enables the interrupt generation. And we fall in a
-situation when ath5k assumes that interrupts are disabled, but it is
-not.
-
-This can lead to different consequences, such as reception of the frame,
-when we do not expect it. Under certain circumstances, this can lead to
-the following warning:
-
-  WARNING: at ath5k/base.c:589 ath5k_tasklet_rx+0x318/0x6ec [ath5k]()
-  invalid hw_rix: 1a
-  [..]
-  Call Trace:
-  [<802656a8>] show_stack+0x48/0x70
-  [<802dd92c>] warn_slowpath_common+0x88/0xbc
-  [<802dd98c>] warn_slowpath_fmt+0x2c/0x38
-  [<81b51be8>] ath5k_tasklet_rx+0x318/0x6ec [ath5k]
-  [<8028ac64>] tasklet_action+0x8c/0xf0
-  [<80075804>] __do_softirq+0x180/0x32c
-  [<80196ce8>] irq_exit+0x54/0x70
-  [<80041848>] ret_from_irq+0x0/0x4
-  [<80182fdc>] ioread32+0x4/0xc
-  [<81b4c42c>] ath5k_hw_set_sleep_clock+0x2ec/0x474 [ath5k]
-  [<81b4cf28>] ath5k_hw_reset+0x50/0xeb8 [ath5k]
-  [<81b50900>] ath5k_reset+0xd4/0x310 [ath5k]
-  [<81b557e8>] ath5k_config+0x4c/0x104 [ath5k]
-  [<80d01770>] ieee80211_hw_config+0x2f4/0x35c [mac80211]
-  [<80d09aa8>] ieee80211_scan_work+0x2e4/0x414 [mac80211]
-  [<8022c3f4>] process_one_work+0x28c/0x400
-  [<802df8f8>] worker_thread+0x258/0x3c0
-  [<801b5710>] kthread+0xe0/0xec
-  [<800418a8>] ret_from_kernel_thread+0x14/0x1c
-
-Fix this issue by adding a new status flag, which forbids to re-enable
-the interrupt generation until the HW configuration is completed.
-
-Note: previous patch, which reorders the Rx disable code helps to avoid
-the above warning, but not fixes the root cause of unexpected frame
-receiving.
-
-CC: Jiri Slaby <jirislaby@gmail.com>
-CC: Nick Kossifidis <mickflemm@gmail.com>
-CC: Luis R. Rodriguez <mcgrof@do-not-panic.com>
-Reported-by: Christophe Prevotaux <cprevotaux@nltinc.com>
-Tested-by: Christophe Prevotaux <cprevotaux@nltinc.com>
-Tested-by: Eric Bree <ebree@nltinc.com>
-Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
----
-
---- a/drivers/net/wireless/ath/ath5k/ath5k.h
-+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
-@@ -1283,6 +1283,7 @@ struct ath5k_hw {
- #define ATH_STAT_PROMISC	1
- #define ATH_STAT_LEDSOFT	2		/* enable LED gpio status */
- #define ATH_STAT_STARTED	3		/* opened & irqs enabled */
-+#define ATH_STAT_RESET		4		/* hw reset */
- 
- 	unsigned int		filter_flags;	/* HW flags, AR5K_RX_FILTER_* */
- 	unsigned int		fif_filter_flags; /* Current FIF_* filter flags */
---- a/drivers/net/wireless/ath/ath5k/base.c
-+++ b/drivers/net/wireless/ath/ath5k/base.c
-@@ -1523,6 +1523,9 @@ ath5k_set_current_imask(struct ath5k_hw
- 	enum ath5k_int imask;
- 	unsigned long flags;
- 
-+	if (test_bit(ATH_STAT_RESET, ah->status))
-+		return;
-+
- 	spin_lock_irqsave(&ah->irqlock, flags);
- 	imask = ah->imask;
- 	if (ah->rx_pending)
-@@ -2862,6 +2865,8 @@ ath5k_reset(struct ath5k_hw *ah, struct
- 
- 	ATH5K_DBG(ah, ATH5K_DEBUG_RESET, "resetting\n");
- 
-+	__set_bit(ATH_STAT_RESET, ah->status);
-+
- 	ath5k_hw_set_imr(ah, 0);
- 	synchronize_irq(ah->irq);
- 	ath5k_stop_tasklets(ah);
-@@ -2952,6 +2957,8 @@ ath5k_reset(struct ath5k_hw *ah, struct
- 	 */
- /*	ath5k_chan_change(ah, c); */
- 
-+	__clear_bit(ATH_STAT_RESET, ah->status);
-+
- 	ath5k_beacon_config(ah);
- 	/* intrs are enabled by ath5k_beacon_config */
- 
diff --git a/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch b/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cf8194aa334c7b85e26404ec3a104dff5431d4e9
--- /dev/null
+++ b/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch
@@ -0,0 +1,31 @@
+From: Miaoqing Pan <miaoqing@codeaurora.org>
+Date: Fri, 15 Jan 2016 18:17:19 +0800
+Subject: [PATCH] ath9k: do not reset while BB panic(0x4000409) on ar9561
+
+BB panic(0x4000409) observed while AP enabling/disabling
+bursting.
+
+Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
+@@ -2071,7 +2071,8 @@ void ar9003_hw_attach_phy_ops(struct ath
+  *             to be disabled.
+  *
+  * 0x04000409: Packet stuck on receive.
+- *             Full chip reset is required for all chips except AR9340.
++ *             Full chip reset is required for all chips except
++ *	       AR9340, AR9531 and AR9561.
+  */
+ 
+ /*
+@@ -2100,7 +2101,7 @@ bool ar9003_hw_bb_watchdog_check(struct
+ 	case 0x04000b09:
+ 		return true;
+ 	case 0x04000409:
+-		if (AR_SREV_9340(ah) || AR_SREV_9531(ah))
++		if (AR_SREV_9340(ah) || AR_SREV_9531(ah) || AR_SREV_9561(ah))
+ 			return false;
+ 		else
+ 			return true;
diff --git a/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch b/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch
new file mode 100644
index 0000000000000000000000000000000000000000..80b781ca54dc8c217ffe5fa304bf2bc515cf1c90
--- /dev/null
+++ b/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch
@@ -0,0 +1,27 @@
+From: Miaoqing Pan <miaoqing@codeaurora.org>
+Date: Fri, 15 Jan 2016 18:17:20 +0800
+Subject: [PATCH] ath9k: fix inconsistent use of tab and space in
+ indentation
+
+Minor changes for indenting.
+
+Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+@@ -5485,11 +5485,11 @@ unsigned int ar9003_get_paprd_scale_fact
+ 			  AR9300_PAPRD_SCALE_1);
+ 	else {
+ 		if (chan->channel >= 5700)
+-		return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20),
+-			  AR9300_PAPRD_SCALE_1);
++			return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20),
++				  AR9300_PAPRD_SCALE_1);
+ 		else if (chan->channel >= 5400)
+ 			return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40),
+-				   AR9300_PAPRD_SCALE_2);
++				  AR9300_PAPRD_SCALE_2);
+ 		else
+ 			return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40),
+ 				  AR9300_PAPRD_SCALE_1);
diff --git a/package/kernel/mac80211/patches/307-ath9k-fix-tracking-of-enabled-AP-beacons.patch b/package/kernel/mac80211/patches/307-ath9k-fix-tracking-of-enabled-AP-beacons.patch
deleted file mode 100644
index ab9771e64adcc3516a1683fb1a269ed35bdda50e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/307-ath9k-fix-tracking-of-enabled-AP-beacons.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Thu, 12 Mar 2015 17:10:50 +0100
-Subject: [PATCH] ath9k: fix tracking of enabled AP beacons
-
-sc->nbcnvifs tracks assigned beacon slots, not enabled beacons.
-Therefore, it cannot be used to decide if cur_conf->enable_beacon (bool)
-should be updated, or if beacons have been enabled already.
-With the current code (depending on the order of calls), beacons often
-do not get enabled in an AP+STA setup.
-To fix tracking of enabled beacons, convert cur_conf->enable_beacon to a
-bitmask of enabled beacon slots.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -219,12 +219,15 @@ void ath9k_beacon_remove_slot(struct ath
- 	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
- 	struct ath_vif *avp = (void *)vif->drv_priv;
- 	struct ath_buf *bf = avp->av_bcbuf;
-+	struct ath_beacon_config *cur_conf = &sc->cur_chan->beacon;
- 
- 	ath_dbg(common, CONFIG, "Removing interface at beacon slot: %d\n",
- 		avp->av_bslot);
- 
- 	tasklet_disable(&sc->bcon_tasklet);
- 
-+	cur_conf->enable_beacon &= ~BIT(avp->av_bslot);
-+
- 	if (bf && bf->bf_mpdu) {
- 		struct sk_buff *skb = bf->bf_mpdu;
- 		dma_unmap_single(sc->dev, bf->bf_buf_addr,
-@@ -521,8 +524,7 @@ static bool ath9k_allow_beacon_config(st
- 	}
- 
- 	if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {
--		if ((vif->type != NL80211_IFTYPE_AP) ||
--		    (sc->nbcnvifs > 1)) {
-+		if (vif->type != NL80211_IFTYPE_AP) {
- 			ath_dbg(common, CONFIG,
- 				"An AP interface is already present !\n");
- 			return false;
-@@ -616,12 +618,14 @@ void ath9k_beacon_config(struct ath_soft
- 	 * enabling/disabling SWBA.
- 	 */
- 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
--		if (!bss_conf->enable_beacon &&
--		    (sc->nbcnvifs <= 1)) {
--			cur_conf->enable_beacon = false;
--		} else if (bss_conf->enable_beacon) {
--			cur_conf->enable_beacon = true;
--			ath9k_cache_beacon_config(sc, ctx, bss_conf);
-+		bool enabled = cur_conf->enable_beacon;
-+
-+		if (!bss_conf->enable_beacon) {
-+			cur_conf->enable_beacon &= ~BIT(avp->av_bslot);
-+		} else {
-+			cur_conf->enable_beacon |= BIT(avp->av_bslot);
-+			if (!enabled)
-+				ath9k_cache_beacon_config(sc, ctx, bss_conf);
- 		}
- 	}
- 
---- a/drivers/net/wireless/ath/ath9k/common.h
-+++ b/drivers/net/wireless/ath/ath9k/common.h
-@@ -54,7 +54,7 @@ struct ath_beacon_config {
- 	u16 dtim_period;
- 	u16 bmiss_timeout;
- 	u8 dtim_count;
--	bool enable_beacon;
-+	u8 enable_beacon;
- 	bool ibss_creator;
- 	u32 nexttbtt;
- 	u32 intval;
diff --git a/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch b/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d4088664bf68166ecf5c25a9ac727578805da176
--- /dev/null
+++ b/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch
@@ -0,0 +1,65 @@
+From: Miaoqing Pan <miaoqing@codeaurora.org>
+Date: Fri, 15 Jan 2016 18:17:21 +0800
+Subject: [PATCH] ath9k: fix data bus error on ar9300 and ar9580
+
+One crash issue be found on ar9300: RTC_RC reg read leads crash, leading
+the data bus error, due to RTC_RC reg write not happen properly.
+
+Warm Reset trigger in continuous beacon stuck for one of the customer for
+other chip, noticed the MAC was stuck in RTC reset. After analysis noticed
+DMA did not complete when RTC was put in reset.
+
+So, before resetting the MAC need to make sure there are no pending DMA
+transactions because this reset does not reset all parts of the chip.
+
+The 12th and 11th bit of MAC _DMA_CFG register used to do that.
+	12 cfg_halt_ack 0x0
+		0 DMA has not yet halted
+		1 DMA has halted
+	11 cfg_halt_req 0x0
+		0 DMA logic operates normally
+		1 Request DMA logic to stop so software can reset the MAC
+
+The Bit [12] of this register indicates when the halt has taken effect or
+not. the DMA halt IS NOT recoverable; once software sets bit [11] to
+request a DMA halt, software must wait for bit [12] to be set and reset
+the MAC.
+
+So, the same thing we implemented for ar9580 chip.
+
+Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1368,6 +1368,16 @@ static bool ath9k_hw_set_reset(struct at
+ 	if (ath9k_hw_mci_is_enabled(ah))
+ 		ar9003_mci_check_gpm_offset(ah);
+ 
++	/* DMA HALT added to resolve ar9300 and ar9580 bus error during
++	 * RTC_RC reg read
++	 */
++	if (AR_SREV_9300(ah) || AR_SREV_9580(ah)) {
++		REG_SET_BIT(ah, AR_CFG, AR_CFG_HALT_REQ);
++		ath9k_hw_wait(ah, AR_CFG, AR_CFG_HALT_ACK, AR_CFG_HALT_ACK,
++			      20 * AH_WAIT_TIMEOUT);
++		REG_CLR_BIT(ah, AR_CFG, AR_CFG_HALT_REQ);
++	}
++
+ 	REG_WRITE(ah, AR_RTC_RC, rst_flags);
+ 
+ 	REGWRITE_BUFFER_FLUSH(ah);
+--- a/drivers/net/wireless/ath/ath9k/reg.h
++++ b/drivers/net/wireless/ath/ath9k/reg.h
+@@ -34,8 +34,10 @@
+ #define AR_CFG_SWRG          0x00000010
+ #define AR_CFG_AP_ADHOC_INDICATION 0x00000020
+ #define AR_CFG_PHOK          0x00000100
+-#define AR_CFG_CLK_GATE_DIS  0x00000400
+ #define AR_CFG_EEBS          0x00000200
++#define AR_CFG_CLK_GATE_DIS  0x00000400
++#define AR_CFG_HALT_REQ	     0x00000800
++#define AR_CFG_HALT_ACK	     0x00001000
+ #define AR_CFG_PCI_MASTER_REQ_Q_THRESH         0x00060000
+ #define AR_CFG_PCI_MASTER_REQ_Q_THRESH_S       17
+ 
diff --git a/package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch b/package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch
deleted file mode 100644
index d13263655e9e11ec87209518db41c1207aa65de6..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/308-mac80211-minstrel_ht-fix-rounding-issue-in-MCS-durat.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Fri, 13 Mar 2015 10:49:40 +0100
-Subject: [PATCH] mac80211: minstrel_ht: fix rounding issue in MCS duration
- calculation
-
-On very high MCS bitrates, the calculated duration of rates that are
-next to each other can be very imprecise, due to the small packet size
-used as reference (1200 bytes).
-This is most visible in VHT80 nss=2 MCS8/9, for which minstrel shows the
-same throughput when the probability is also the same. This leads to a
-bad rate selection for such rates.
-
-Fix this issue by introducing an average A-MPDU size factor into the
-calculation.
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/net/mac80211/rc80211_minstrel_ht.c
-+++ b/net/mac80211/rc80211_minstrel_ht.c
-@@ -17,10 +17,11 @@
- #include "rc80211_minstrel.h"
- #include "rc80211_minstrel_ht.h"
- 
-+#define AVG_AMPDU_SIZE	16
- #define AVG_PKT_SIZE	1200
- 
- /* Number of bits for an average sized packet */
--#define MCS_NBITS (AVG_PKT_SIZE << 3)
-+#define MCS_NBITS ((AVG_PKT_SIZE * AVG_AMPDU_SIZE) << 3)
- 
- /* Number of symbols for a packet with (bps) bits per symbol */
- #define MCS_NSYMS(bps) DIV_ROUND_UP(MCS_NBITS, (bps))
-@@ -33,7 +34,8 @@
- 	)
- 
- /* Transmit duration for the raw data part of an average sized packet */
--#define MCS_DURATION(streams, sgi, bps) MCS_SYMBOL_TIME(sgi, MCS_NSYMS((streams) * (bps)))
-+#define MCS_DURATION(streams, sgi, bps) \
-+	(MCS_SYMBOL_TIME(sgi, MCS_NSYMS((streams) * (bps))) / AVG_AMPDU_SIZE)
- 
- #define BW_20			0
- #define BW_40			1
diff --git a/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch b/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d9511c8d5f5c8051bf2ed9c1cd408911c0ba02d9
--- /dev/null
+++ b/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch
@@ -0,0 +1,19 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Fri, 15 Jan 2016 15:59:45 +0100
+Subject: [PATCH] brcmfmac: add missing include
+
+linux/module.h is required for defining module parameters
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+@@ -17,6 +17,7 @@
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/netdevice.h>
++#include <linux/module.h>
+ #include <brcmu_wifi.h>
+ #include <brcmu_utils.h>
+ #include "core.h"
diff --git a/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch b/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch
new file mode 100644
index 0000000000000000000000000000000000000000..711e019e2b6836c6907a614fc3a3b1c17693f2cf
--- /dev/null
+++ b/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch
@@ -0,0 +1,118 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Tue, 19 Jan 2016 12:39:24 +0100
+Subject: [PATCH] brcmfmac: fix sdio sg table alloc crash
+
+With commit 7d34b0560567 ("brcmfmac: Move all module parameters to
+one place") a bug was introduced causing a null pointer exception.
+This patch fixes the bug by initializing the sg table till after
+the settings have been initialized.
+
+Fixes: 7d34b0560567 ("brcmfmac: Move all module parameters to one place")
+Reported-by: Marc Zyngier <marc.zyngier@arm.com>
+Tested-by: Marc Zyngier <marc.zyngier@arm.com>
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+@@ -879,11 +879,24 @@ int brcmf_sdiod_abort(struct brcmf_sdio_
+ 	return 0;
+ }
+ 
+-static void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev)
++void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev)
+ {
++	struct sdio_func *func;
++	struct mmc_host *host;
++	uint max_blocks;
+ 	uint nents;
+ 	int err;
+ 
++	func = sdiodev->func[2];
++	host = func->card->host;
++	sdiodev->sg_support = host->max_segs > 1;
++	max_blocks = min_t(uint, host->max_blk_count, 511u);
++	sdiodev->max_request_size = min_t(uint, host->max_req_size,
++					  max_blocks * func->cur_blksize);
++	sdiodev->max_segment_count = min_t(uint, host->max_segs,
++					   SG_MAX_SINGLE_ALLOC);
++	sdiodev->max_segment_size = host->max_seg_size;
++
+ 	if (!sdiodev->sg_support)
+ 		return;
+ 
+@@ -1021,9 +1034,6 @@ static void brcmf_sdiod_host_fixup(struc
+ 
+ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
+ {
+-	struct sdio_func *func;
+-	struct mmc_host *host;
+-	uint max_blocks;
+ 	int ret = 0;
+ 
+ 	sdiodev->num_funcs = 2;
+@@ -1054,26 +1064,6 @@ static int brcmf_sdiod_probe(struct brcm
+ 		goto out;
+ 	}
+ 
+-	/*
+-	 * determine host related variables after brcmf_sdiod_probe()
+-	 * as func->cur_blksize is properly set and F2 init has been
+-	 * completed successfully.
+-	 */
+-	func = sdiodev->func[2];
+-	host = func->card->host;
+-	sdiodev->sg_support = host->max_segs > 1;
+-	max_blocks = min_t(uint, host->max_blk_count, 511u);
+-	sdiodev->max_request_size = min_t(uint, host->max_req_size,
+-					  max_blocks * func->cur_blksize);
+-	sdiodev->max_segment_count = min_t(uint, host->max_segs,
+-					   SG_MAX_SINGLE_ALLOC);
+-	sdiodev->max_segment_size = host->max_seg_size;
+-
+-	/* allocate scatter-gather table. sg support
+-	 * will be disabled upon allocation failure.
+-	 */
+-	brcmf_sdiod_sgtable_alloc(sdiodev);
+-
+ 	ret = brcmf_sdiod_freezer_attach(sdiodev);
+ 	if (ret)
+ 		goto out;
+@@ -1084,7 +1074,7 @@ static int brcmf_sdiod_probe(struct brcm
+ 		ret = -ENODEV;
+ 		goto out;
+ 	}
+-	brcmf_sdiod_host_fixup(host);
++	brcmf_sdiod_host_fixup(sdiodev->func[2]->card->host);
+ out:
+ 	if (ret)
+ 		brcmf_sdiod_remove(sdiodev);
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+@@ -4114,6 +4114,11 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
+ 		goto fail;
+ 	}
+ 
++	/* allocate scatter-gather table. sg support
++	 * will be disabled upon allocation failure.
++	 */
++	brcmf_sdiod_sgtable_alloc(bus->sdiodev);
++
+ 	/* Query the F2 block size, set roundup accordingly */
+ 	bus->blocksize = bus->sdiodev->func[2]->cur_blksize;
+ 	bus->roundup = min(max_roundup, bus->blocksize);
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
+@@ -342,6 +342,7 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_
+ 
+ /* Issue an abort to the specified function */
+ int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn);
++void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
+ void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
+ 			      enum brcmf_sdiod_state state);
+ #ifdef CONFIG_PM_SLEEP
diff --git a/package/kernel/mac80211/patches/309-ath9k-disable-TPC-support-again-for-now.patch b/package/kernel/mac80211/patches/309-ath9k-disable-TPC-support-again-for-now.patch
deleted file mode 100644
index 945fbce3347c244f3aa786c9703e27e6ea93cc11..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/309-ath9k-disable-TPC-support-again-for-now.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Sun, 15 Mar 2015 08:02:37 +0100
-Subject: [PATCH] ath9k: disable TPC support again (for now)
-
-TPC support has been observed to cause some tx power fluctuations on
-some devices with at least AR934x and AR938x chips.
-Disable it for now until the bugs have been found and fixed
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -424,7 +424,7 @@ static void ath9k_hw_init_defaults(struc
- 	ah->power_mode = ATH9K_PM_UNDEFINED;
- 	ah->htc_reset_init = true;
- 
--	ah->tpc_enabled = true;
-+	ah->tpc_enabled = false;
- 
- 	ah->ani_function = ATH9K_ANI_ALL;
- 	if (!AR_SREV_9300_20_OR_LATER(ah))
diff --git a/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch b/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch
new file mode 100644
index 0000000000000000000000000000000000000000..287d6e13bd4a1dd4132cc2020a626e6bc60083fd
--- /dev/null
+++ b/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch
@@ -0,0 +1,38 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 21 Jan 2016 16:28:44 +0100
+Subject: [PATCH] ath9k_hw: ignore eeprom magic mismatch on flash based devices
+
+Many AR913x based devices (maybe others too) do not have a valid EEPROM
+magic in their calibration data partition.
+
+Fixes: 6fa658fd5ab2 ("ath9k: Simplify and fix eeprom endianness swapping")
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom.c
+@@ -150,18 +150,18 @@ int ath9k_hw_nvram_swap_data(struct ath_
+ 		return -EIO;
+ 	}
+ 
+-	if (magic == AR5416_EEPROM_MAGIC) {
+-		*swap_needed = false;
+-	} else if (swab16(magic) == AR5416_EEPROM_MAGIC) {
++	*swap_needed = false;
++	if (swab16(magic) == AR5416_EEPROM_MAGIC) {
+ 		if (ah->ah_flags & AH_NO_EEP_SWAP) {
+ 			ath_info(common,
+ 				 "Ignoring endianness difference in EEPROM magic bytes.\n");
+-
+-			*swap_needed = false;
+ 		} else {
+ 			*swap_needed = true;
+ 		}
+-	} else {
++	} else if (magic != AR5416_EEPROM_MAGIC) {
++		if (ath9k_hw_use_flash(ah))
++			return 0;
++
+ 		ath_err(common,
+ 			"Invalid EEPROM Magic (0x%04x).\n", magic);
+ 		return -EINVAL;
diff --git a/package/kernel/mac80211/patches/310-mac80211-don-t-look-up-stations-for-multicast-addres.patch b/package/kernel/mac80211/patches/310-mac80211-don-t-look-up-stations-for-multicast-addres.patch
deleted file mode 100644
index bd3050e3c29f2a8bc6d609ff1310f322113ed459..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/310-mac80211-don-t-look-up-stations-for-multicast-addres.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Tue, 24 Feb 2015 00:28:18 +0100
-Subject: [PATCH] mac80211: don't look up stations for multicast addresses
-
-Since multicast addresses don't exist as stations, don't attempt
-to look them up in the hashtable on TX.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1161,7 +1161,7 @@ ieee80211_tx_prepare(struct ieee80211_su
- 		   tx->sdata->control_port_protocol == tx->skb->protocol) {
- 		tx->sta = sta_info_get_bss(sdata, hdr->addr1);
- 	}
--	if (!tx->sta)
-+	if (!tx->sta && !is_multicast_ether_addr(hdr->addr1))
- 		tx->sta = sta_info_get(sdata, hdr->addr1);
- 
- 	if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) &&
diff --git a/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch b/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch
new file mode 100644
index 0000000000000000000000000000000000000000..070efa98e834e0dfe2334fc0eb9bc433e0f037e8
--- /dev/null
+++ b/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch
@@ -0,0 +1,55 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Fri, 22 Jan 2016 01:05:56 +0100
+Subject: [PATCH] ath9k: do not limit the number of DFS interfaces to 1
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -751,14 +751,6 @@ static const struct ieee80211_iface_comb
+ 
+ #endif /* CPTCFG_ATH9K_CHANNEL_CONTEXT */
+ 
+-static const struct ieee80211_iface_limit if_dfs_limits[] = {
+-	{ .max = 1,	.types = BIT(NL80211_IFTYPE_AP) |
+-#ifdef CPTCFG_MAC80211_MESH
+-				 BIT(NL80211_IFTYPE_MESH_POINT) |
+-#endif
+-				 BIT(NL80211_IFTYPE_ADHOC) },
+-};
+-
+ static const struct ieee80211_iface_combination if_comb[] = {
+ 	{
+ 		.limits = if_limits,
+@@ -766,6 +758,11 @@ static const struct ieee80211_iface_comb
+ 		.max_interfaces = 2048,
+ 		.num_different_channels = 1,
+ 		.beacon_int_infra_match = true,
++#ifdef CPTCFG_ATH9K_DFS_CERTIFIED
++		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
++					BIT(NL80211_CHAN_WIDTH_20) |
++					BIT(NL80211_CHAN_WIDTH_40),
++#endif
+ 	},
+ 	{
+ 		.limits = wds_limits,
+@@ -774,18 +771,6 @@ static const struct ieee80211_iface_comb
+ 		.num_different_channels = 1,
+ 		.beacon_int_infra_match = true,
+ 	},
+-#ifdef CPTCFG_ATH9K_DFS_CERTIFIED
+-	{
+-		.limits = if_dfs_limits,
+-		.n_limits = ARRAY_SIZE(if_dfs_limits),
+-		.max_interfaces = 1,
+-		.num_different_channels = 1,
+-		.beacon_int_infra_match = true,
+-		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
+-					BIT(NL80211_CHAN_WIDTH_20) |
+-					BIT(NL80211_CHAN_WIDTH_40),
+-	}
+-#endif
+ };
+ 
+ #ifdef CPTCFG_ATH9K_CHANNEL_CONTEXT
diff --git a/package/kernel/mac80211/patches/311-mac80211-remove-drop_unencrypted-code.patch b/package/kernel/mac80211/patches/311-mac80211-remove-drop_unencrypted-code.patch
deleted file mode 100644
index b2475b910683671d1d52489be80d535a8518e27b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/311-mac80211-remove-drop_unencrypted-code.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Fri, 20 Mar 2015 11:41:58 +0100
-Subject: [PATCH] mac80211: remove drop_unencrypted code
-
-This mechanism was historic, and only ever used by IBSS, which
-also doesn't need to have it as it properly manages station's
-802.1X PAE state (or, with WEP, always has a key.)
-
-Remove the mechanism to clean up the code.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/debugfs.c
-+++ b/net/mac80211/debugfs.c
-@@ -274,8 +274,6 @@ void debugfs_hw_add(struct ieee80211_loc
- #ifdef CPTCFG_MAC80211_DEBUG_COUNTERS
- 	DEBUGFS_STATS_ADD(tx_handlers_drop, local->tx_handlers_drop);
- 	DEBUGFS_STATS_ADD(tx_handlers_queued, local->tx_handlers_queued);
--	DEBUGFS_STATS_ADD(tx_handlers_drop_unencrypted,
--		local->tx_handlers_drop_unencrypted);
- 	DEBUGFS_STATS_ADD(tx_handlers_drop_fragment,
- 		local->tx_handlers_drop_fragment);
- 	DEBUGFS_STATS_ADD(tx_handlers_drop_wep,
---- a/net/mac80211/debugfs_netdev.c
-+++ b/net/mac80211/debugfs_netdev.c
-@@ -177,7 +177,6 @@ static ssize_t ieee80211_if_write_##name
- 	IEEE80211_IF_FILE_R(name)
- 
- /* common attributes */
--IEEE80211_IF_FILE(drop_unencrypted, drop_unencrypted, DEC);
- IEEE80211_IF_FILE(rc_rateidx_mask_2ghz, rc_rateidx_mask[IEEE80211_BAND_2GHZ],
- 		  HEX);
- IEEE80211_IF_FILE(rc_rateidx_mask_5ghz, rc_rateidx_mask[IEEE80211_BAND_5GHZ],
-@@ -562,7 +561,6 @@ IEEE80211_IF_FILE(dot11MeshAwakeWindowDu
- 
- static void add_common_files(struct ieee80211_sub_if_data *sdata)
- {
--	DEBUGFS_ADD(drop_unencrypted);
- 	DEBUGFS_ADD(rc_rateidx_mask_2ghz);
- 	DEBUGFS_ADD(rc_rateidx_mask_5ghz);
- 	DEBUGFS_ADD(rc_rateidx_mcs_mask_2ghz);
---- a/net/mac80211/ibss.c
-+++ b/net/mac80211/ibss.c
-@@ -249,8 +249,6 @@ static void __ieee80211_sta_join_ibss(st
- 	if (presp)
- 		kfree_rcu(presp, rcu_head);
- 
--	sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
--
- 	/* make a copy of the chandef, it could be modified below. */
- 	chandef = *req_chandef;
- 	chan = chandef.chan;
-@@ -1289,8 +1287,6 @@ static void ieee80211_sta_create_ibss(st
- 
- 	if (ifibss->privacy)
- 		capability |= WLAN_CAPABILITY_PRIVACY;
--	else
--		sdata->drop_unencrypted = 0;
- 
- 	__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
- 				  &ifibss->chandef, ifibss->basic_rates,
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -842,8 +842,6 @@ struct ieee80211_sub_if_data {
- 
- 	unsigned long state;
- 
--	int drop_unencrypted;
--
- 	char name[IFNAMSIZ];
- 
- 	/* Fragment table for host-based reassembly */
-@@ -1289,7 +1287,6 @@ struct ieee80211_local {
- 	/* TX/RX handler statistics */
- 	unsigned int tx_handlers_drop;
- 	unsigned int tx_handlers_queued;
--	unsigned int tx_handlers_drop_unencrypted;
- 	unsigned int tx_handlers_drop_fragment;
- 	unsigned int tx_handlers_drop_wep;
- 	unsigned int tx_handlers_drop_not_assoc;
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -1535,7 +1535,6 @@ int ieee80211_if_change_type(struct ieee
- 	}
- 
- 	/* reset some values that shouldn't be kept across type changes */
--	sdata->drop_unencrypted = 0;
- 	if (type == NL80211_IFTYPE_STATION)
- 		sdata->u.mgd.use_4addr = false;
- 
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -1897,8 +1897,7 @@ static int ieee80211_drop_unencrypted(st
- 	/* Drop unencrypted frames if key is set. */
- 	if (unlikely(!ieee80211_has_protected(fc) &&
- 		     !ieee80211_is_nullfunc(fc) &&
--		     ieee80211_is_data(fc) &&
--		     (rx->key || rx->sdata->drop_unencrypted)))
-+		     ieee80211_is_data(fc) && rx->key))
- 		return -EACCES;
- 
- 	return 0;
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -594,23 +594,8 @@ ieee80211_tx_h_select_key(struct ieee802
- 	else if (!is_multicast_ether_addr(hdr->addr1) &&
- 		 (key = rcu_dereference(tx->sdata->default_unicast_key)))
- 		tx->key = key;
--	else if (info->flags & IEEE80211_TX_CTL_INJECTED)
-+	else
- 		tx->key = NULL;
--	else if (!tx->sdata->drop_unencrypted)
--		tx->key = NULL;
--	else if (tx->skb->protocol == tx->sdata->control_port_protocol)
--		tx->key = NULL;
--	else if (ieee80211_is_robust_mgmt_frame(tx->skb) &&
--		 !(ieee80211_is_action(hdr->frame_control) &&
--		   tx->sta && test_sta_flag(tx->sta, WLAN_STA_MFP)))
--		tx->key = NULL;
--	else if (ieee80211_is_mgmt(hdr->frame_control) &&
--		 !ieee80211_is_robust_mgmt_frame(tx->skb))
--		tx->key = NULL;
--	else {
--		I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted);
--		return TX_DROP;
--	}
- 
- 	if (tx->key) {
- 		bool skip_hw = false;
diff --git a/package/kernel/mac80211/patches/312-mac80211-don-t-look-up-destination-station-twice.patch b/package/kernel/mac80211/patches/312-mac80211-don-t-look-up-destination-station-twice.patch
deleted file mode 100644
index 02a7fab4360c1830a69ad17a6eb9bde42c7b3342..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/312-mac80211-don-t-look-up-destination-station-twice.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Fri, 20 Mar 2015 16:24:21 +0100
-Subject: [PATCH] mac80211: don't look up destination station twice
-
-There's no need to look up the destination station twice while
-building the 802.11 header for a given frame if the frame will
-actually be transmitted to the station we initially looked up.
-
-This happens for 4-addr VLAN interfaces and TDLS connections, which
-both directly send the frame to the station they looked up, though
-in the case of TDLS some station conditions need to be checked.
-
-To avoid that, add a variable indicating that we've looked up the
-station that the frame is going to be transmitted to, and avoid the
-lookup/flag checking if it already has been done.
-
-In the TDLS case, also move the authorized/wme_sta flag assignment
-to the correct place, i.e. only when that station is really used.
-Before this change, the new lookup should always have succeeded so
-that the potentially erroneous data would be overwritten.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1894,6 +1894,7 @@ static struct sk_buff *ieee80211_build_h
- 	bool wme_sta = false, authorized = false, tdls_auth = false;
- 	bool tdls_peer = false, tdls_setup_frame = false;
- 	bool multicast;
-+	bool have_station = false;
- 	u16 info_id = 0;
- 	struct ieee80211_chanctx_conf *chanctx_conf;
- 	struct ieee80211_sub_if_data *ap_sdata;
-@@ -1918,6 +1919,7 @@ static struct sk_buff *ieee80211_build_h
- 			hdrlen = 30;
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
- 			wme_sta = sta->sta.wme;
-+			have_station = true;
- 		}
- 		ap_sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
- 					u.ap);
-@@ -2034,9 +2036,6 @@ static struct sk_buff *ieee80211_build_h
- 		if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) {
- 			sta = sta_info_get(sdata, skb->data);
- 			if (sta) {
--				authorized = test_sta_flag(sta,
--							WLAN_STA_AUTHORIZED);
--				wme_sta = sta->sta.wme;
- 				tdls_peer = test_sta_flag(sta,
- 							  WLAN_STA_TDLS_PEER);
- 				tdls_auth = test_sta_flag(sta,
-@@ -2068,6 +2067,9 @@ static struct sk_buff *ieee80211_build_h
- 			memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
- 			memcpy(hdr.addr3, sdata->u.mgd.bssid, ETH_ALEN);
- 			hdrlen = 24;
-+			have_station = true;
-+			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
-+			wme_sta = sta->sta.wme;
- 		}  else if (sdata->u.mgd.use_4addr &&
- 			    cpu_to_be16(ethertype) != sdata->control_port_protocol) {
- 			fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS |
-@@ -2130,7 +2132,7 @@ static struct sk_buff *ieee80211_build_h
- 	 * in AP mode)
- 	 */
- 	multicast = is_multicast_ether_addr(hdr.addr1);
--	if (!multicast) {
-+	if (!multicast && !have_station) {
- 		sta = sta_info_get(sdata, hdr.addr1);
- 		if (sta) {
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
diff --git a/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch b/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch
new file mode 100644
index 0000000000000000000000000000000000000000..61cafc7625a8f8df5b67558a875794f5d20dbb99
--- /dev/null
+++ b/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch
@@ -0,0 +1,27 @@
+From: Michal Kazior <michal.kazior@tieto.com>
+Date: Thu, 21 Jan 2016 14:23:07 +0100
+Subject: [PATCH] mac80211: fix txq queue related crashes
+
+The driver can access the queue simultanously
+while mac80211 tears down the interface. Without
+spinlock protection this could lead to corrupting
+sk_buff_head and subsequently to an invalid
+pointer dereference.
+
+Fixes: ba8c3d6f16a1 ("mac80211: add an intermediate software queue implementation")
+Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
+---
+
+--- a/net/mac80211/iface.c
++++ b/net/mac80211/iface.c
+@@ -977,7 +977,10 @@ static void ieee80211_do_stop(struct iee
+ 	if (sdata->vif.txq) {
+ 		struct txq_info *txqi = to_txq_info(sdata->vif.txq);
+ 
++		spin_lock_bh(&txqi->queue.lock);
+ 		ieee80211_purge_tx_queue(&local->hw, &txqi->queue);
++		spin_unlock_bh(&txqi->queue.lock);
++
+ 		atomic_set(&sdata->txqs_len[txqi->txq.ac], 0);
+ 	}
+ 
diff --git a/package/kernel/mac80211/patches/313-mac80211-drop-4-addr-VLAN-frames-earlier-if-not-conn.patch b/package/kernel/mac80211/patches/313-mac80211-drop-4-addr-VLAN-frames-earlier-if-not-conn.patch
deleted file mode 100644
index 41253519b3ff6b65e1d072f5ec061e9a978759a4..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/313-mac80211-drop-4-addr-VLAN-frames-earlier-if-not-conn.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Fri, 20 Mar 2015 16:24:22 +0100
-Subject: [PATCH] mac80211: drop 4-addr VLAN frames earlier if not
- connected
-
-If there's no station on the 4-addr VLAN interface, then frames
-cannot be transmitted. Drop such frames earlier, before setting
-up all the information for them.
-
-We should keep the old check though since that code might be used
-for other internally-generated frames.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1920,6 +1920,9 @@ static struct sk_buff *ieee80211_build_h
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
- 			wme_sta = sta->sta.wme;
- 			have_station = true;
-+		} else if (sdata->wdev.use_4addr) {
-+			ret = -ENOLINK;
-+			goto free;
- 		}
- 		ap_sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
- 					u.ap);
diff --git a/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch b/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch
new file mode 100644
index 0000000000000000000000000000000000000000..844d43bfc7875b937d8c67aba60f1204bcb7020a
--- /dev/null
+++ b/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch
@@ -0,0 +1,57 @@
+From: Michal Kazior <michal.kazior@tieto.com>
+Date: Mon, 25 Jan 2016 14:43:24 +0100
+Subject: [PATCH] mac80211: fix unnecessary frame drops in mesh fwding
+
+The ieee80211_queue_stopped() expects hw queue
+number but it was given raw WMM AC number instead.
+
+This could cause frame drops and problems with
+traffic in some cases - most notably if driver
+doesn't map AC numbers to queue numbers 1:1 and
+uses ieee80211_stop_queues() and
+ieee80211_wake_queue() only without ever calling
+ieee80211_wake_queues().
+
+On ath10k it was possible to hit this problem in
+the following case:
+
+  1. wlan0 uses queue 0
+     (ath10k maps queues per vif)
+  2. offchannel uses queue 15
+  3. queues 1-14 are unused
+  4. ieee80211_stop_queues()
+  5. ieee80211_wake_queue(q=0)
+  6. ieee80211_wake_queue(q=15)
+     (other queues are not woken up because both
+      driver and mac80211 know other queues are
+      unused)
+  7. ieee80211_rx_h_mesh_fwding()
+  8. ieee80211_select_queue_80211() returns 2
+  9. ieee80211_queue_stopped(q=2) returns true
+ 10. frame is dropped (oops!)
+
+Fixes: d3c1597b8d1b ("mac80211: fix forwarded mesh frame queue mapping")
+Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
+---
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2235,7 +2235,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
+ 	struct ieee80211_local *local = rx->local;
+ 	struct ieee80211_sub_if_data *sdata = rx->sdata;
+ 	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
+-	u16 q, hdrlen;
++	u16 ac, q, hdrlen;
+ 
+ 	hdr = (struct ieee80211_hdr *) skb->data;
+ 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
+@@ -2304,7 +2304,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
+ 	    ether_addr_equal(sdata->vif.addr, hdr->addr3))
+ 		return RX_CONTINUE;
+ 
+-	q = ieee80211_select_queue_80211(sdata, skb, hdr);
++	ac = ieee80211_select_queue_80211(sdata, skb, hdr);
++	q = sdata->vif.hw_queue[ac];
+ 	if (ieee80211_queue_stopped(&local->hw, q)) {
+ 		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion);
+ 		return RX_DROP_MONITOR;
diff --git a/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch b/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5b3efbdc5aff65de96b959fbc250f7ddde0c5459
--- /dev/null
+++ b/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch
@@ -0,0 +1,103 @@
+From: Sachin Kulkarni <Sachin.Kulkarni@imgtec.com>
+Date: Tue, 12 Jan 2016 14:30:19 +0530
+Subject: [PATCH] mac80211: Requeue work after scan complete for all VIF
+ types.
+
+During a sw scan ieee80211_iface_work ignores work items for all vifs.
+However after the scan complete work is requeued only for STA, ADHOC
+and MESH iftypes.
+
+This occasionally results in event processing getting delayed/not
+processed for iftype AP when it coexists with a STA. This can result
+in data halt and eventually disconnection on the AP interface.
+
+Signed-off-by: Sachin Kulkarni <Sachin.Kulkarni@imgtec.com>
+Cc: linux-wireless@vger.kernel.org
+Cc: johannes@sipsolutions.net
+---
+
+--- a/net/mac80211/ibss.c
++++ b/net/mac80211/ibss.c
+@@ -1731,7 +1731,6 @@ void ieee80211_ibss_notify_scan_complete
+ 		if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
+ 			continue;
+ 		sdata->u.ibss.last_scan_completed = jiffies;
+-		ieee80211_queue_work(&local->hw, &sdata->work);
+ 	}
+ 	mutex_unlock(&local->iflist_mtx);
+ }
+--- a/net/mac80211/mesh.c
++++ b/net/mac80211/mesh.c
+@@ -1369,17 +1369,6 @@ out:
+ 	sdata_unlock(sdata);
+ }
+ 
+-void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local)
+-{
+-	struct ieee80211_sub_if_data *sdata;
+-
+-	rcu_read_lock();
+-	list_for_each_entry_rcu(sdata, &local->interfaces, list)
+-		if (ieee80211_vif_is_mesh(&sdata->vif) &&
+-		    ieee80211_sdata_running(sdata))
+-			ieee80211_queue_work(&local->hw, &sdata->work);
+-	rcu_read_unlock();
+-}
+ 
+ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
+ {
+--- a/net/mac80211/mesh.h
++++ b/net/mac80211/mesh.h
+@@ -362,14 +362,10 @@ static inline bool mesh_path_sel_is_hwmp
+ 	return sdata->u.mesh.mesh_pp_id == IEEE80211_PATH_PROTOCOL_HWMP;
+ }
+ 
+-void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local);
+-
+ void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata);
+ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata);
+ void ieee80211s_stop(void);
+ #else
+-static inline void
+-ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) {}
+ static inline bool mesh_path_sel_is_hwmp(struct ieee80211_sub_if_data *sdata)
+ { return false; }
+ static inline void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata)
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -3978,8 +3978,6 @@ static void ieee80211_restart_sta_timer(
+ 		if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
+ 			ieee80211_queue_work(&sdata->local->hw,
+ 					     &sdata->u.mgd.monitor_work);
+-		/* and do all the other regular work too */
+-		ieee80211_queue_work(&sdata->local->hw, &sdata->work);
+ 	}
+ }
+ 
+--- a/net/mac80211/scan.c
++++ b/net/mac80211/scan.c
+@@ -314,6 +314,7 @@ static void __ieee80211_scan_completed(s
+ 	bool was_scanning = local->scanning;
+ 	struct cfg80211_scan_request *scan_req;
+ 	struct ieee80211_sub_if_data *scan_sdata;
++	struct ieee80211_sub_if_data *sdata;
+ 
+ 	lockdep_assert_held(&local->mtx);
+ 
+@@ -373,7 +374,15 @@ static void __ieee80211_scan_completed(s
+ 
+ 	ieee80211_mlme_notify_scan_completed(local);
+ 	ieee80211_ibss_notify_scan_completed(local);
+-	ieee80211_mesh_notify_scan_completed(local);
++
++	/* Requeue all the work that might have been ignored while
++	 * the scan was in progress
++	 */
++	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
++		if (ieee80211_sdata_running(sdata))
++			ieee80211_queue_work(&sdata->local->hw, &sdata->work);
++	}
++
+ 	if (was_scanning)
+ 		ieee80211_start_next_roc(local);
+ }
diff --git a/package/kernel/mac80211/patches/314-mac80211-mesh-avoid-pointless-station-lookup.patch b/package/kernel/mac80211/patches/314-mac80211-mesh-avoid-pointless-station-lookup.patch
deleted file mode 100644
index 9105a6448922ae03ad8980e3fe0a67bdb5af4a63..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/314-mac80211-mesh-avoid-pointless-station-lookup.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Fri, 20 Mar 2015 16:24:23 +0100
-Subject: [PATCH] mac80211: mesh: avoid pointless station lookup
-
-In ieee80211_build_hdr(), the station is looked up to build the
-header correctly (QoS field) and to check for authorization. For
-mesh, authorization isn't checked here, and QoS capability is
-mandatory, so the station lookup can be avoided.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -2130,12 +2130,14 @@ static struct sk_buff *ieee80211_build_h
- 	}
- 
- 	/*
--	 * There's no need to try to look up the destination
--	 * if it is a multicast address (which can only happen
--	 * in AP mode)
-+	 * There's no need to try to look up the destination station
-+	 * if it is a multicast address. In mesh, there's no need to
-+	 * look up the station at all as it always must be QoS capable
-+	 * and mesh mode checks authorization later.
- 	 */
- 	multicast = is_multicast_ether_addr(hdr.addr1);
--	if (!multicast && !have_station) {
-+	if (!multicast && !have_station &&
-+	    !ieee80211_vif_is_mesh(&sdata->vif)) {
- 		sta = sta_info_get(sdata, hdr.addr1);
- 		if (sta) {
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
diff --git a/package/kernel/mac80211/patches/315-mac80211-avoid-duplicate-TX-path-station-lookup.patch b/package/kernel/mac80211/patches/315-mac80211-avoid-duplicate-TX-path-station-lookup.patch
deleted file mode 100644
index d143025f0f923f9a5e5bf7416210222d0da91361..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/315-mac80211-avoid-duplicate-TX-path-station-lookup.patch
+++ /dev/null
@@ -1,267 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Fri, 20 Mar 2015 14:18:27 +0100
-Subject: [PATCH] mac80211: avoid duplicate TX path station lookup
-
-Instead of looking up the destination station twice in the TX path
-(first to build the header, and then for control processing), save
-it when building the header and use it later in the TX path.
-
-To avoid having to look up the station in the many callers, allow
-those to pass %NULL which keeps the existing lookup.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -3565,7 +3565,7 @@ static int ieee80211_probe_client(struct
- 		nullfunc->qos_ctrl = cpu_to_le16(7);
- 
- 	local_bh_disable();
--	ieee80211_xmit(sdata, skb);
-+	ieee80211_xmit(sdata, sta, skb);
- 	local_bh_enable();
- 	rcu_read_unlock();
- 
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -1775,7 +1775,8 @@ void mac80211_ev_michael_mic_failure(str
- 				     gfp_t gfp);
- void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
- 			       bool bss_notify);
--void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb);
-+void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
-+		    struct sta_info *sta, struct sk_buff *skb);
- 
- void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
- 				 struct sk_buff *skb, int tid,
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -1279,7 +1279,7 @@ static void ieee80211_send_null_response
- 	}
- 
- 	info->band = chanctx_conf->def.chan->band;
--	ieee80211_xmit(sdata, skb);
-+	ieee80211_xmit(sdata, sta, skb);
- 	rcu_read_unlock();
- }
- 
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1110,11 +1110,13 @@ static bool ieee80211_tx_prep_agg(struct
- 
- /*
-  * initialises @tx
-+ * pass %NULL for the station if unknown, a valid pointer if known
-+ * or an ERR_PTR() if the station is known not to exist
-  */
- static ieee80211_tx_result
- ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,
- 		     struct ieee80211_tx_data *tx,
--		     struct sk_buff *skb)
-+		     struct sta_info *sta, struct sk_buff *skb)
- {
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_hdr *hdr;
-@@ -1137,17 +1139,22 @@ ieee80211_tx_prepare(struct ieee80211_su
- 
- 	hdr = (struct ieee80211_hdr *) skb->data;
- 
--	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
--		tx->sta = rcu_dereference(sdata->u.vlan.sta);
--		if (!tx->sta && sdata->dev->ieee80211_ptr->use_4addr)
--			return TX_DROP;
--	} else if (info->flags & (IEEE80211_TX_CTL_INJECTED |
--				  IEEE80211_TX_INTFL_NL80211_FRAME_TX) ||
--		   tx->sdata->control_port_protocol == tx->skb->protocol) {
--		tx->sta = sta_info_get_bss(sdata, hdr->addr1);
-+	if (likely(sta)) {
-+		if (!IS_ERR(sta))
-+			tx->sta = sta;
-+	} else {
-+		if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
-+			tx->sta = rcu_dereference(sdata->u.vlan.sta);
-+			if (!tx->sta && sdata->wdev.use_4addr)
-+				return TX_DROP;
-+		} else if (info->flags & (IEEE80211_TX_INTFL_NL80211_FRAME_TX |
-+					  IEEE80211_TX_CTL_INJECTED) ||
-+			   tx->sdata->control_port_protocol == tx->skb->protocol) {
-+			tx->sta = sta_info_get_bss(sdata, hdr->addr1);
-+		}
-+		if (!tx->sta && !is_multicast_ether_addr(hdr->addr1))
-+			tx->sta = sta_info_get(sdata, hdr->addr1);
- 	}
--	if (!tx->sta && !is_multicast_ether_addr(hdr->addr1))
--		tx->sta = sta_info_get(sdata, hdr->addr1);
- 
- 	if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) &&
- 	    !ieee80211_is_qos_nullfunc(hdr->frame_control) &&
-@@ -1485,7 +1492,7 @@ bool ieee80211_tx_prepare_skb(struct iee
- 	struct ieee80211_tx_data tx;
- 	struct sk_buff *skb2;
- 
--	if (ieee80211_tx_prepare(sdata, &tx, skb) == TX_DROP)
-+	if (ieee80211_tx_prepare(sdata, &tx, NULL, skb) == TX_DROP)
- 		return false;
- 
- 	info->band = band;
-@@ -1518,7 +1525,8 @@ EXPORT_SYMBOL(ieee80211_tx_prepare_skb);
-  * Returns false if the frame couldn't be transmitted but was queued instead.
-  */
- static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,
--			 struct sk_buff *skb, bool txpending)
-+			 struct sta_info *sta, struct sk_buff *skb,
-+			 bool txpending)
- {
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_tx_data tx;
-@@ -1534,7 +1542,7 @@ static bool ieee80211_tx(struct ieee8021
- 
- 	/* initialises tx */
- 	led_len = skb->len;
--	res_prepare = ieee80211_tx_prepare(sdata, &tx, skb);
-+	res_prepare = ieee80211_tx_prepare(sdata, &tx, sta, skb);
- 
- 	if (unlikely(res_prepare == TX_DROP)) {
- 		ieee80211_free_txskb(&local->hw, skb);
-@@ -1590,7 +1598,8 @@ static int ieee80211_skb_resize(struct i
- 	return 0;
- }
- 
--void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
-+void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
-+		    struct sta_info *sta, struct sk_buff *skb)
- {
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-@@ -1625,7 +1634,7 @@ void ieee80211_xmit(struct ieee80211_sub
- 	}
- 
- 	ieee80211_set_qos_hdr(sdata, skb);
--	ieee80211_tx(sdata, skb, false);
-+	ieee80211_tx(sdata, sta, skb, false);
- }
- 
- static bool ieee80211_parse_tx_radiotap(struct sk_buff *skb)
-@@ -1846,7 +1855,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
- 		goto fail_rcu;
- 
- 	info->band = chandef->chan->band;
--	ieee80211_xmit(sdata, skb);
-+	ieee80211_xmit(sdata, NULL, skb);
- 	rcu_read_unlock();
- 
- 	return NETDEV_TX_OK;
-@@ -1877,7 +1886,8 @@ fail:
-  * Returns: the (possibly reallocated) skb or an ERR_PTR() code
-  */
- static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
--					   struct sk_buff *skb, u32 info_flags)
-+					   struct sk_buff *skb, u32 info_flags,
-+					   struct sta_info **sta_out)
- {
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_tx_info *info;
-@@ -1920,6 +1930,7 @@ static struct sk_buff *ieee80211_build_h
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
- 			wme_sta = sta->sta.wme;
- 			have_station = true;
-+			*sta_out = sta;
- 		} else if (sdata->wdev.use_4addr) {
- 			ret = -ENOLINK;
- 			goto free;
-@@ -2073,6 +2084,7 @@ static struct sk_buff *ieee80211_build_h
- 			have_station = true;
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
- 			wme_sta = sta->sta.wme;
-+			*sta_out = sta;
- 		}  else if (sdata->u.mgd.use_4addr &&
- 			    cpu_to_be16(ethertype) != sdata->control_port_protocol) {
- 			fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS |
-@@ -2136,13 +2148,18 @@ static struct sk_buff *ieee80211_build_h
- 	 * and mesh mode checks authorization later.
- 	 */
- 	multicast = is_multicast_ether_addr(hdr.addr1);
--	if (!multicast && !have_station &&
--	    !ieee80211_vif_is_mesh(&sdata->vif)) {
--		sta = sta_info_get(sdata, hdr.addr1);
-+	if (multicast) {
-+		*sta_out = ERR_PTR(-ENOENT);
-+	} else if (!have_station && !ieee80211_vif_is_mesh(&sdata->vif)) {
-+		if (sdata->control_port_protocol == skb->protocol)
-+			sta = sta_info_get_bss(sdata, hdr.addr1);
-+		else
-+			sta = sta_info_get(sdata, hdr.addr1);
- 		if (sta) {
- 			authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
- 			wme_sta = sta->sta.wme;
- 		}
-+		*sta_out = sta ?: ERR_PTR(-ENOENT);
- 	}
- 
- 	/* For mesh, the use of the QoS header is mandatory */
-@@ -2320,6 +2337,7 @@ void __ieee80211_subif_start_xmit(struct
- 				  u32 info_flags)
- {
- 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-+	struct sta_info *sta = NULL;
- 
- 	if (unlikely(skb->len < ETH_HLEN)) {
- 		kfree_skb(skb);
-@@ -2328,7 +2346,7 @@ void __ieee80211_subif_start_xmit(struct
- 
- 	rcu_read_lock();
- 
--	skb = ieee80211_build_hdr(sdata, skb, info_flags);
-+	skb = ieee80211_build_hdr(sdata, skb, info_flags, &sta);
- 	if (IS_ERR(skb))
- 		goto out;
- 
-@@ -2336,7 +2354,7 @@ void __ieee80211_subif_start_xmit(struct
- 	dev->stats.tx_bytes += skb->len;
- 	dev->trans_start = jiffies;
- 
--	ieee80211_xmit(sdata, skb);
-+	ieee80211_xmit(sdata, sta, skb);
-  out:
- 	rcu_read_unlock();
- }
-@@ -2364,10 +2382,11 @@ ieee80211_build_data_template(struct iee
- 		.local = sdata->local,
- 		.sdata = sdata,
- 	};
-+	struct sta_info *sta_ignore;
- 
- 	rcu_read_lock();
- 
--	skb = ieee80211_build_hdr(sdata, skb, info_flags);
-+	skb = ieee80211_build_hdr(sdata, skb, info_flags, &sta_ignore);
- 	if (IS_ERR(skb))
- 		goto out;
- 
-@@ -2425,7 +2444,7 @@ static bool ieee80211_tx_pending_skb(str
- 			return true;
- 		}
- 		info->band = chanctx_conf->def.chan->band;
--		result = ieee80211_tx(sdata, skb, true);
-+		result = ieee80211_tx(sdata, NULL, skb, true);
- 	} else {
- 		struct sk_buff_head skbs;
- 
-@@ -3163,7 +3182,7 @@ ieee80211_get_buffered_bc(struct ieee802
- 
- 		if (sdata->vif.type == NL80211_IFTYPE_AP)
- 			sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
--		if (!ieee80211_tx_prepare(sdata, &tx, skb))
-+		if (!ieee80211_tx_prepare(sdata, &tx, NULL, skb))
- 			break;
- 		dev_kfree_skb_any(skb);
- 	}
-@@ -3295,6 +3314,6 @@ void __ieee80211_tx_skb_tid_band(struct
- 	 */
- 	local_bh_disable();
- 	IEEE80211_SKB_CB(skb)->band = band;
--	ieee80211_xmit(sdata, skb);
-+	ieee80211_xmit(sdata, NULL, skb);
- 	local_bh_enable();
- }
diff --git a/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch b/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch
new file mode 100644
index 0000000000000000000000000000000000000000..52fecb96b002de8ed650e2155f846cbcc9ba0900
--- /dev/null
+++ b/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch
@@ -0,0 +1,57 @@
+From: Sara Sharon <sara.sharon@intel.com>
+Date: Mon, 25 Jan 2016 15:46:35 +0200
+Subject: [PATCH] mac80211: fix ibss scan parameters
+
+When joining IBSS a full scan should be initiated in order to search
+for existing cell, unless the fixed_channel parameter was set.
+A default channel to create the IBSS on if no cell was found is
+provided as well.
+However - a scan is initiated only on the default channel provided
+regardless of whether ifibss->fixed_channel is set or not, with the
+obvious result of the cell not joining existing IBSS cell that is
+on another channel.
+
+Fixes: 76bed0f43b27 ("mac80211: IBSS fix scan request")
+Signed-off-by: Sara Sharon <sara.sharon@intel.com>
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+---
+
+--- a/net/mac80211/ibss.c
++++ b/net/mac80211/ibss.c
+@@ -7,6 +7,7 @@
+  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
+  * Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
+  * Copyright 2013-2014  Intel Mobile Communications GmbH
++ * Copyright(c) 2016 Intel Deutschland GmbH
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License version 2 as
+@@ -1483,14 +1484,21 @@ static void ieee80211_sta_find_ibss(stru
+ 
+ 		sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
+ 
+-		num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy,
+-							 &ifibss->chandef,
+-							 channels,
+-							 ARRAY_SIZE(channels));
+ 		scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
+-		ieee80211_request_ibss_scan(sdata, ifibss->ssid,
+-					    ifibss->ssid_len, channels, num,
+-					    scan_width);
++
++		if (ifibss->fixed_channel) {
++			num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy,
++								 &ifibss->chandef,
++								 channels,
++								 ARRAY_SIZE(channels));
++			ieee80211_request_ibss_scan(sdata, ifibss->ssid,
++						    ifibss->ssid_len, channels,
++						    num, scan_width);
++		} else {
++			ieee80211_request_ibss_scan(sdata, ifibss->ssid,
++						    ifibss->ssid_len, NULL,
++						    0, scan_width);
++		}
+ 	} else {
+ 		int interval = IEEE80211_SCAN_INTERVAL;
+ 
diff --git a/package/kernel/mac80211/patches/316-mac80211-reduce-log-spam-from-ieee80211_handle_pwr_c.patch b/package/kernel/mac80211/patches/316-mac80211-reduce-log-spam-from-ieee80211_handle_pwr_c.patch
deleted file mode 100644
index 77a82c25c6b41e567fec812524b505d12fb1badf..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/316-mac80211-reduce-log-spam-from-ieee80211_handle_pwr_c.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From: John Linville <linville@tuxdriver.com>
-Date: Tue, 31 Mar 2015 10:49:14 -0400
-Subject: [PATCH] mac80211: reduce log spam from ieee80211_handle_pwr_constr
-
-This changes a couple of messages from sdata_info to sdata_dbg.
-This should reduce some log spam, as reported here:
-
-	https://bugzilla.redhat.com/show_bug.cgi?id=1206468
-
-Signed-off-by: John W. Linville <linville@tuxdriver.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -1347,15 +1347,15 @@ static u32 ieee80211_handle_pwr_constr(s
- 	 */
- 	if (has_80211h_pwr &&
- 	    (!has_cisco_pwr || pwr_level_80211h <= pwr_level_cisco)) {
--		sdata_info(sdata,
--			   "Limiting TX power to %d (%d - %d) dBm as advertised by %pM\n",
--			   pwr_level_80211h, chan_pwr, pwr_reduction_80211h,
--			   sdata->u.mgd.bssid);
-+		sdata_dbg(sdata,
-+			  "Limiting TX power to %d (%d - %d) dBm as advertised by %pM\n",
-+			  pwr_level_80211h, chan_pwr, pwr_reduction_80211h,
-+			  sdata->u.mgd.bssid);
- 		new_ap_level = pwr_level_80211h;
- 	} else {  /* has_cisco_pwr is always true here. */
--		sdata_info(sdata,
--			   "Limiting TX power to %d dBm as advertised by %pM\n",
--			   pwr_level_cisco, sdata->u.mgd.bssid);
-+		sdata_dbg(sdata,
-+			  "Limiting TX power to %d dBm as advertised by %pM\n",
-+			  pwr_level_cisco, sdata->u.mgd.bssid);
- 		new_ap_level = pwr_level_cisco;
- 	}
- 
diff --git a/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch b/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e78df366003ee0d1cb5402e7c0760d96c45a40d7
--- /dev/null
+++ b/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch
@@ -0,0 +1,50 @@
+From: Chris Bainbridge <chris.bainbridge@gmail.com>
+Date: Wed, 27 Jan 2016 15:46:18 +0000
+Subject: [PATCH] net/mac80211/agg-rx.c: fix use of uninitialised values
+
+Use kzalloc instead of kmalloc for struct tid_ampdu_rx. Fixes:
+
+[    7.976605] UBSAN: Undefined behaviour in net/mac80211/rx.c:932:29
+[    7.976608] load of value 2 is not a valid value for type '_Bool'
+[    7.976611] CPU: 3 PID: 1134 Comm: kworker/u16:7 Not tainted 4.5.0-rc1+ #265
+[    7.976613] Hardware name: Apple Inc. MacBookPro10,2/Mac-AFD8A9D944EA4843, BIOS MBP102.88Z.0106.B0A.1509130955 09/13/2015
+[    7.976616] Workqueue: phy0 rt2x00usb_work_rxdone
+[    7.976619]  0000000000000004 ffff880254a7ba50 ffffffff8181d866 0000000000000007
+[    7.976622]  ffff880254a7ba78 ffff880254a7ba68 ffffffff8188422d ffffffff8379b500
+[    7.976626]  ffff880254a7bab8 ffffffff81884747 0000000000000202 0000000348620032
+[    7.976629] Call Trace:
+[    7.976633]  [<ffffffff8181d866>] dump_stack+0x45/0x5f
+[    7.976637]  [<ffffffff8188422d>] ubsan_epilogue+0xd/0x40
+[    7.976642]  [<ffffffff81884747>] __ubsan_handle_load_invalid_value+0x67/0x70
+[    7.976646]  [<ffffffff82227b4d>] ieee80211_sta_reorder_release.isra.16+0x5ed/0x730
+[    7.976650]  [<ffffffff8222ca14>] ieee80211_prepare_and_rx_handle+0xd04/0x1c00
+[    7.976654]  [<ffffffff81cb27ce>] ? usb_hcd_map_urb_for_dma+0x65e/0x960
+[    7.976659]  [<ffffffff8222db03>] __ieee80211_rx_handle_packet+0x1f3/0x750
+[    7.976663]  [<ffffffff8222e4a7>] ieee80211_rx_napi+0x447/0x990
+[    7.976667]  [<ffffffff81c5fb85>] rt2x00lib_rxdone+0x305/0xbd0
+[    7.976670]  [<ffffffff811ac23f>] ? dequeue_task_fair+0x64f/0x1de0
+[    7.976674]  [<ffffffff811a1516>] ? sched_clock_cpu+0xe6/0x150
+[    7.976678]  [<ffffffff81c6c45c>] rt2x00usb_work_rxdone+0x7c/0x140
+[    7.976682]  [<ffffffff8117aef6>] process_one_work+0x226/0x860
+[    7.976686]  [<ffffffff8117b58c>] worker_thread+0x5c/0x680
+[    7.976690]  [<ffffffff8117b530>] ? process_one_work+0x860/0x860
+[    7.976693]  [<ffffffff81184f86>] kthread+0xf6/0x150
+[    7.976697]  [<ffffffff81184e90>] ? kthread_worker_fn+0x310/0x310
+[    7.976700]  [<ffffffff822a94df>] ret_from_fork+0x3f/0x70
+[    7.976703]  [<ffffffff81184e90>] ? kthread_worker_fn+0x310/0x310
+
+Link: https://lkml.org/lkml/2016/1/26/230
+Signed-off-by: Chris Bainbridge <chris.bainbridge@gmail.com>
+---
+
+--- a/net/mac80211/agg-rx.c
++++ b/net/mac80211/agg-rx.c
+@@ -327,7 +327,7 @@ void __ieee80211_start_rx_ba_session(str
+ 	}
+ 
+ 	/* prepare A-MPDU MLME for Rx aggregation */
+-	tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL);
++	tid_agg_rx = kzalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL);
+ 	if (!tid_agg_rx)
+ 		goto end;
+ 
diff --git a/package/kernel/mac80211/patches/317-brcmfmac-Fix-race-condition-in-msgbuf-ioctl-processi.patch b/package/kernel/mac80211/patches/317-brcmfmac-Fix-race-condition-in-msgbuf-ioctl-processi.patch
deleted file mode 100644
index e005fe73d29a8048ad6b33657ecd91a36b008d4e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/317-brcmfmac-Fix-race-condition-in-msgbuf-ioctl-processi.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 6 Mar 2015 18:40:41 +0100
-Subject: [PATCH] brcmfmac: Fix race condition in msgbuf ioctl processing.
-
-Msgbuf is using a wait_event_timeout to wait for the response on
-an ioctl. The wakeup routine uses waitqueue_active to see if
-wait_event_timeout has been called. There is a chance that the
-response arrives before wait_event_timeout is called, this
-will result in situation that wait_event_timeout never gets
-woken again and assumed result will be a timeout. This patch
-removes that errornous situation by always setting the
-ctl_completed var before checking for queue active.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -481,10 +481,9 @@ static int brcmf_msgbuf_ioctl_resp_wait(
- 
- static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf)
- {
--	if (waitqueue_active(&msgbuf->ioctl_resp_wait)) {
--		msgbuf->ctl_completed = true;
-+	msgbuf->ctl_completed = true;
-+	if (waitqueue_active(&msgbuf->ioctl_resp_wait))
- 		wake_up(&msgbuf->ioctl_resp_wait);
--	}
- }
- 
- 
diff --git a/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch b/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5bf53b918c4936c09f65ea8a02f9ac7e93cf686a
--- /dev/null
+++ b/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch
@@ -0,0 +1,45 @@
+From: Konstantin Khlebnikov <koct9i@gmail.com>
+Date: Fri, 29 Jan 2016 11:35:12 +0300
+Subject: [PATCH] mac80211: minstrel_ht: fix out-of-bound in
+ minstrel_ht_set_best_prob_rate
+
+Patch fixes this splat
+
+BUG: KASAN: slab-out-of-bounds in minstrel_ht_update_stats.isra.7+0x6e1/0x9e0
+[mac80211] at addr ffff8800cee640f4 Read of size 4 by task swapper/3/0
+
+Signed-off-by: Konstantin Khlebnikov <koct9i@gmail.com>
+Link: http://lkml.kernel.org/r/CALYGNiNyJhSaVnE35qS6UCGaSb2Dx1_i5HcRavuOX14oTz2P+w@mail.gmail.com
+---
+
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -414,15 +414,16 @@ minstrel_ht_set_best_prob_rate(struct mi
+ 	    (max_tp_group != MINSTREL_CCK_GROUP))
+ 		return;
+ 
++	max_gpr_group = mg->max_group_prob_rate / MCS_GROUP_RATES;
++	max_gpr_idx = mg->max_group_prob_rate % MCS_GROUP_RATES;
++	max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_ewma;
++
+ 	if (mrs->prob_ewma > MINSTREL_FRAC(75, 100)) {
+ 		cur_tp_avg = minstrel_ht_get_tp_avg(mi, cur_group, cur_idx,
+ 						    mrs->prob_ewma);
+ 		if (cur_tp_avg > tmp_tp_avg)
+ 			mi->max_prob_rate = index;
+ 
+-		max_gpr_group = mg->max_group_prob_rate / MCS_GROUP_RATES;
+-		max_gpr_idx = mg->max_group_prob_rate %	MCS_GROUP_RATES;
+-		max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_ewma;
+ 		max_gpr_tp_avg = minstrel_ht_get_tp_avg(mi, max_gpr_group,
+ 							max_gpr_idx,
+ 							max_gpr_prob);
+@@ -431,7 +432,7 @@ minstrel_ht_set_best_prob_rate(struct mi
+ 	} else {
+ 		if (mrs->prob_ewma > tmp_prob)
+ 			mi->max_prob_rate = index;
+-		if (mrs->prob_ewma > mg->rates[mg->max_group_prob_rate].prob_ewma)
++		if (mrs->prob_ewma > max_gpr_prob)
+ 			mg->max_group_prob_rate = index;
+ 	}
+ }
diff --git a/package/kernel/mac80211/patches/318-brcmfmac-Update-msgbuf-commonring-size-for-improved-.patch b/package/kernel/mac80211/patches/318-brcmfmac-Update-msgbuf-commonring-size-for-improved-.patch
deleted file mode 100644
index c2cd1c5c688a77ab696c3ae6217b94b99ad490ee..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/318-brcmfmac-Update-msgbuf-commonring-size-for-improved-.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:23 +0100
-Subject: [PATCH] brcmfmac: Update msgbuf commonring size for improved
- throughput.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
-@@ -17,11 +17,11 @@
- 
- #ifdef CPTCFG_BRCMFMAC_PROTO_MSGBUF
- 
--#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM	20
--#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM	256
--#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM	20
-+#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM	64
-+#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM	512
-+#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM	64
- #define BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM		1024
--#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM		256
-+#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM		512
- #define BRCMF_H2D_TXFLOWRING_MAX_ITEM			512
- 
- #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE	40
diff --git a/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch b/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch
new file mode 100644
index 0000000000000000000000000000000000000000..655dc4bfa934ca34ac108e54a93626e7d73eeb6e
--- /dev/null
+++ b/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch
@@ -0,0 +1,35 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 2 Feb 2016 14:39:08 +0100
+Subject: [PATCH] mac80211: move A-MSDU skb_linearize call to
+ ieee80211_amsdu_to_8023s
+
+Prepararation for zero-copy A-MSDU support with page fragment SKBs
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2203,9 +2203,6 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
+ 	skb->dev = dev;
+ 	__skb_queue_head_init(&frame_list);
+ 
+-	if (skb_linearize(skb))
+-		return RX_DROP_UNUSABLE;
+-
+ 	ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr,
+ 				 rx->sdata->vif.type,
+ 				 rx->local->hw.extra_tx_headroom, true);
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -657,6 +657,9 @@ void ieee80211_amsdu_to_8023s(struct sk_
+ 	int remaining, err;
+ 	u8 dst[ETH_ALEN], src[ETH_ALEN];
+ 
++	if (skb_linearize(skb))
++		goto out;
++
+ 	if (has_80211_header) {
+ 		err = ieee80211_data_to_8023(skb, addr, iftype);
+ 		if (err)
diff --git a/package/kernel/mac80211/patches/319-ath9k_htc-add-new-WMI_REG_RMW_CMDID-command.patch b/package/kernel/mac80211/patches/319-ath9k_htc-add-new-WMI_REG_RMW_CMDID-command.patch
deleted file mode 100644
index 6af69ebd2afa42e878697d56ff1f87a4c2136d99..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/319-ath9k_htc-add-new-WMI_REG_RMW_CMDID-command.patch
+++ /dev/null
@@ -1,307 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:46 +0100
-Subject: [PATCH] ath9k_htc: add new WMI_REG_RMW_CMDID command
-
-Since usb bus add extra delay on each request, a command
-with read + write requests is too expensive. We can dramtically
-reduce usb load by moving this command to firmware.
-
-In my tests, this patch will reduce channel scan time
-for about 5-10 seconds.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath.h
-+++ b/drivers/net/wireless/ath/ath.h
-@@ -131,6 +131,9 @@ struct ath_ops {
- 	void (*enable_write_buffer)(void *);
- 	void (*write_flush) (void *);
- 	u32 (*rmw)(void *, u32 reg_offset, u32 set, u32 clr);
-+	void (*enable_rmw_buffer)(void *);
-+	void (*rmw_flush) (void *);
-+
- };
- 
- struct ath_common;
---- a/drivers/net/wireless/ath/ath9k/htc.h
-+++ b/drivers/net/wireless/ath/ath9k/htc.h
-@@ -444,6 +444,10 @@ static inline void ath9k_htc_stop_btcoex
- #define OP_BT_SCAN                 BIT(4)
- #define OP_TSF_RESET               BIT(6)
- 
-+enum htc_op_flags {
-+	HTC_FWFLAG_NO_RMW,
-+};
-+
- struct ath9k_htc_priv {
- 	struct device *dev;
- 	struct ieee80211_hw *hw;
-@@ -482,6 +486,7 @@ struct ath9k_htc_priv {
- 	bool reconfig_beacon;
- 	unsigned int rxfilter;
- 	unsigned long op_flags;
-+	unsigned long fw_flags;
- 
- 	struct ath9k_hw_cal_data caldata;
- 	struct ath_spec_scan_priv spec_priv;
---- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
-@@ -376,17 +376,139 @@ static void ath9k_regwrite_flush(void *h
- 	mutex_unlock(&priv->wmi->multi_write_mutex);
- }
- 
--static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
-+static void ath9k_reg_rmw_buffer(void *hw_priv,
-+				 u32 reg_offset, u32 set, u32 clr)
-+{
-+	struct ath_hw *ah = (struct ath_hw *) hw_priv;
-+	struct ath_common *common = ath9k_hw_common(ah);
-+	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
-+	u32 rsp_status;
-+	int r;
-+
-+	mutex_lock(&priv->wmi->multi_rmw_mutex);
-+
-+	/* Store the register/value */
-+	priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].reg =
-+		cpu_to_be32(reg_offset);
-+	priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].set =
-+		cpu_to_be32(set);
-+	priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].clr =
-+		cpu_to_be32(clr);
-+
-+	priv->wmi->multi_rmw_idx++;
-+
-+	/* If the buffer is full, send it out. */
-+	if (priv->wmi->multi_rmw_idx == MAX_RMW_CMD_NUMBER) {
-+		r = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
-+			  (u8 *) &priv->wmi->multi_rmw,
-+			  sizeof(struct register_write) * priv->wmi->multi_rmw_idx,
-+			  (u8 *) &rsp_status, sizeof(rsp_status),
-+			  100);
-+		if (unlikely(r)) {
-+			ath_dbg(common, WMI,
-+				"REGISTER RMW FAILED, multi len: %d\n",
-+				priv->wmi->multi_rmw_idx);
-+		}
-+		priv->wmi->multi_rmw_idx = 0;
-+	}
-+
-+	mutex_unlock(&priv->wmi->multi_rmw_mutex);
-+}
-+
-+static void ath9k_reg_rmw_flush(void *hw_priv)
- {
--	u32 val;
-+	struct ath_hw *ah = (struct ath_hw *) hw_priv;
-+	struct ath_common *common = ath9k_hw_common(ah);
-+	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
-+	u32 rsp_status;
-+	int r;
-+
-+	if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
-+		return;
-+
-+	atomic_dec(&priv->wmi->m_rmw_cnt);
-+
-+	mutex_lock(&priv->wmi->multi_rmw_mutex);
-+
-+	if (priv->wmi->multi_rmw_idx) {
-+		r = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
-+			  (u8 *) &priv->wmi->multi_rmw,
-+			  sizeof(struct register_rmw) * priv->wmi->multi_rmw_idx,
-+			  (u8 *) &rsp_status, sizeof(rsp_status),
-+			  100);
-+		if (unlikely(r)) {
-+			ath_dbg(common, WMI,
-+				"REGISTER RMW FAILED, multi len: %d\n",
-+				priv->wmi->multi_rmw_idx);
-+		}
-+		priv->wmi->multi_rmw_idx = 0;
-+	}
- 
--	val = ath9k_regread(hw_priv, reg_offset);
--	val &= ~clr;
--	val |= set;
--	ath9k_regwrite(hw_priv, val, reg_offset);
-+	mutex_unlock(&priv->wmi->multi_rmw_mutex);
-+}
-+
-+static void ath9k_enable_rmw_buffer(void *hw_priv)
-+{
-+	struct ath_hw *ah = (struct ath_hw *) hw_priv;
-+	struct ath_common *common = ath9k_hw_common(ah);
-+	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
-+
-+	if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
-+		return;
-+
-+	atomic_inc(&priv->wmi->m_rmw_cnt);
-+}
-+
-+static u32 ath9k_reg_rmw_single(void *hw_priv,
-+				 u32 reg_offset, u32 set, u32 clr)
-+{
-+	struct ath_hw *ah = (struct ath_hw *) hw_priv;
-+	struct ath_common *common = ath9k_hw_common(ah);
-+	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
-+	struct register_rmw buf, buf_ret;
-+	int ret;
-+	u32 val = 0;
-+
-+	buf.reg = cpu_to_be32(reg_offset);
-+	buf.set = cpu_to_be32(set);
-+	buf.clr = cpu_to_be32(clr);
-+
-+	ret = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
-+			  (u8 *) &buf, sizeof(buf),
-+			  (u8 *) &buf_ret, sizeof(buf_ret),
-+			  100);
-+	if (unlikely(ret)) {
-+		ath_dbg(common, WMI, "REGISTER RMW FAILED:(0x%04x, %d)\n",
-+			reg_offset, ret);
-+	}
- 	return val;
- }
- 
-+static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
-+{
-+	struct ath_hw *ah = (struct ath_hw *) hw_priv;
-+	struct ath_common *common = ath9k_hw_common(ah);
-+	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
-+
-+	if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags)) {
-+		u32 val;
-+
-+		val = REG_READ(ah, reg_offset);
-+		val &= ~clr;
-+		val |= set;
-+		REG_WRITE(ah, reg_offset, val);
-+
-+		return 0;
-+	}
-+
-+	if (atomic_read(&priv->wmi->m_rmw_cnt))
-+		ath9k_reg_rmw_buffer(hw_priv, reg_offset, set, clr);
-+	else
-+		ath9k_reg_rmw_single(hw_priv, reg_offset, set, clr);
-+
-+	return 0;
-+}
-+
- static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
- {
- 	*csz = L1_CACHE_BYTES >> 2;
-@@ -501,6 +623,8 @@ static int ath9k_init_priv(struct ath9k_
- 	ah->reg_ops.write = ath9k_regwrite;
- 	ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer;
- 	ah->reg_ops.write_flush = ath9k_regwrite_flush;
-+	ah->reg_ops.enable_rmw_buffer = ath9k_enable_rmw_buffer;
-+	ah->reg_ops.rmw_flush = ath9k_reg_rmw_flush;
- 	ah->reg_ops.rmw = ath9k_reg_rmw;
- 	priv->ah = ah;
- 
-@@ -686,6 +810,12 @@ static int ath9k_init_firmware_version(s
- 		return -EINVAL;
- 	}
- 
-+	if (priv->fw_version_major == 1 && priv->fw_version_minor < 4)
-+		set_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags);
-+
-+	dev_info(priv->dev, "FW RMW support: %s\n",
-+		test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags) ? "Off" : "On");
-+
- 	return 0;
- }
- 
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -100,6 +100,18 @@
- 			(_ah)->reg_ops.write_flush((_ah));	\
- 	} while (0)
- 
-+#define ENABLE_REG_RMW_BUFFER(_ah)					\
-+	do {								\
-+		if ((_ah)->reg_ops.enable_rmw_buffer)	\
-+			(_ah)->reg_ops.enable_rmw_buffer((_ah)); \
-+	} while (0)
-+
-+#define REG_RMW_BUFFER_FLUSH(_ah)					\
-+	do {								\
-+		if ((_ah)->reg_ops.rmw_flush)		\
-+			(_ah)->reg_ops.rmw_flush((_ah));	\
-+	} while (0)
-+
- #define PR_EEP(_s, _val)						\
- 	do {								\
- 		len += scnprintf(buf + len, size - len, "%20s : %10d\n",\
---- a/drivers/net/wireless/ath/ath9k/wmi.c
-+++ b/drivers/net/wireless/ath/ath9k/wmi.c
-@@ -61,6 +61,8 @@ static const char *wmi_cmd_to_name(enum
- 		return "WMI_REG_READ_CMDID";
- 	case WMI_REG_WRITE_CMDID:
- 		return "WMI_REG_WRITE_CMDID";
-+	case WMI_REG_RMW_CMDID:
-+		return "WMI_REG_RMW_CMDID";
- 	case WMI_RC_STATE_CHANGE_CMDID:
- 		return "WMI_RC_STATE_CHANGE_CMDID";
- 	case WMI_RC_RATE_UPDATE_CMDID:
-@@ -101,6 +103,7 @@ struct wmi *ath9k_init_wmi(struct ath9k_
- 	spin_lock_init(&wmi->event_lock);
- 	mutex_init(&wmi->op_mutex);
- 	mutex_init(&wmi->multi_write_mutex);
-+	mutex_init(&wmi->multi_rmw_mutex);
- 	init_completion(&wmi->cmd_wait);
- 	INIT_LIST_HEAD(&wmi->pending_tx_events);
- 	tasklet_init(&wmi->wmi_event_tasklet, ath9k_wmi_event_tasklet,
---- a/drivers/net/wireless/ath/ath9k/wmi.h
-+++ b/drivers/net/wireless/ath/ath9k/wmi.h
-@@ -112,6 +112,7 @@ enum wmi_cmd_id {
- 	WMI_TX_STATS_CMDID,
- 	WMI_RX_STATS_CMDID,
- 	WMI_BITRATE_MASK_CMDID,
-+	WMI_REG_RMW_CMDID,
- };
- 
- enum wmi_event_id {
-@@ -125,12 +126,19 @@ enum wmi_event_id {
- };
- 
- #define MAX_CMD_NUMBER 62
-+#define MAX_RMW_CMD_NUMBER 15
- 
- struct register_write {
- 	__be32 reg;
- 	__be32 val;
- };
- 
-+struct register_rmw {
-+	__be32 reg;
-+	__be32 set;
-+	__be32 clr;
-+} __packed;
-+
- struct ath9k_htc_tx_event {
- 	int count;
- 	struct __wmi_event_txstatus txs;
-@@ -156,10 +164,18 @@ struct wmi {
- 
- 	spinlock_t wmi_lock;
- 
-+	/* multi write section */
- 	atomic_t mwrite_cnt;
- 	struct register_write multi_write[MAX_CMD_NUMBER];
- 	u32 multi_write_idx;
- 	struct mutex multi_write_mutex;
-+
-+	/* multi rmw section */
-+	atomic_t m_rmw_cnt;
-+	struct register_rmw multi_rmw[MAX_RMW_CMD_NUMBER];
-+	u32 multi_rmw_idx;
-+	struct mutex multi_rmw_mutex;
-+
- };
- 
- struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv);
diff --git a/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch b/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b646ab36dd204205735338c394a71f3bb58bd46a
--- /dev/null
+++ b/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch
@@ -0,0 +1,186 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 2 Feb 2016 14:39:09 +0100
+Subject: [PATCH] cfg80211: add function for 802.3 conversion with separate
+ output buffer
+
+Use skb_copy_bits in preparation for allowing fragmented skbs
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -393,9 +393,9 @@ unsigned int ieee80211_get_hdrlen_from_s
+ }
+ EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb);
+ 
+-unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr)
++static unsigned int __ieee80211_get_mesh_hdrlen(u8 flags)
+ {
+-	int ae = meshhdr->flags & MESH_FLAGS_AE;
++	int ae = flags & MESH_FLAGS_AE;
+ 	/* 802.11-2012, 8.2.4.7.3 */
+ 	switch (ae) {
+ 	default:
+@@ -407,21 +407,31 @@ unsigned int ieee80211_get_mesh_hdrlen(s
+ 		return 18;
+ 	}
+ }
++
++unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr)
++{
++	return __ieee80211_get_mesh_hdrlen(meshhdr->flags);
++}
+ EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen);
+ 
+-int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
+-			   enum nl80211_iftype iftype)
++static int __ieee80211_data_to_8023(struct sk_buff *skb, struct ethhdr *ehdr,
++				    const u8 *addr, enum nl80211_iftype iftype)
+ {
+ 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
+-	u16 hdrlen, ethertype;
+-	u8 *payload;
+-	u8 dst[ETH_ALEN];
+-	u8 src[ETH_ALEN] __aligned(2);
++	struct {
++		u8 hdr[ETH_ALEN] __aligned(2);
++		__be16 proto;
++	} payload;
++	struct ethhdr tmp;
++	u16 hdrlen;
++	u8 mesh_flags = 0;
+ 
+ 	if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
+ 		return -1;
+ 
+ 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
++	if (skb->len < hdrlen + 8)
++		return -1;
+ 
+ 	/* convert IEEE 802.11 header + possible LLC headers into Ethernet
+ 	 * header
+@@ -432,8 +442,11 @@ int ieee80211_data_to_8023(struct sk_buf
+ 	 *   1     0   BSSID SA    DA    n/a
+ 	 *   1     1   RA    TA    DA    SA
+ 	 */
+-	memcpy(dst, ieee80211_get_DA(hdr), ETH_ALEN);
+-	memcpy(src, ieee80211_get_SA(hdr), ETH_ALEN);
++	memcpy(tmp.h_dest, ieee80211_get_DA(hdr), ETH_ALEN);
++	memcpy(tmp.h_source, ieee80211_get_SA(hdr), ETH_ALEN);
++
++	if (iftype == NL80211_IFTYPE_MESH_POINT)
++		skb_copy_bits(skb, hdrlen, &mesh_flags, 1);
+ 
+ 	switch (hdr->frame_control &
+ 		cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
+@@ -450,44 +463,31 @@ int ieee80211_data_to_8023(struct sk_buf
+ 			     iftype != NL80211_IFTYPE_STATION))
+ 			return -1;
+ 		if (iftype == NL80211_IFTYPE_MESH_POINT) {
+-			struct ieee80211s_hdr *meshdr =
+-				(struct ieee80211s_hdr *) (skb->data + hdrlen);
+-			/* make sure meshdr->flags is on the linear part */
+-			if (!pskb_may_pull(skb, hdrlen + 1))
+-				return -1;
+-			if (meshdr->flags & MESH_FLAGS_AE_A4)
++			if (mesh_flags & MESH_FLAGS_AE_A4)
+ 				return -1;
+-			if (meshdr->flags & MESH_FLAGS_AE_A5_A6) {
++			if (mesh_flags & MESH_FLAGS_AE_A5_A6) {
+ 				skb_copy_bits(skb, hdrlen +
+ 					offsetof(struct ieee80211s_hdr, eaddr1),
+-				       	dst, ETH_ALEN);
+-				skb_copy_bits(skb, hdrlen +
+-					offsetof(struct ieee80211s_hdr, eaddr2),
+-				        src, ETH_ALEN);
++					tmp.h_dest, 2 * ETH_ALEN);
+ 			}
+-			hdrlen += ieee80211_get_mesh_hdrlen(meshdr);
++			hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags);
+ 		}
+ 		break;
+ 	case cpu_to_le16(IEEE80211_FCTL_FROMDS):
+ 		if ((iftype != NL80211_IFTYPE_STATION &&
+ 		     iftype != NL80211_IFTYPE_P2P_CLIENT &&
+ 		     iftype != NL80211_IFTYPE_MESH_POINT) ||
+-		    (is_multicast_ether_addr(dst) &&
+-		     ether_addr_equal(src, addr)))
++		    (is_multicast_ether_addr(tmp.h_dest) &&
++		     ether_addr_equal(tmp.h_source, addr)))
+ 			return -1;
+ 		if (iftype == NL80211_IFTYPE_MESH_POINT) {
+-			struct ieee80211s_hdr *meshdr =
+-				(struct ieee80211s_hdr *) (skb->data + hdrlen);
+-			/* make sure meshdr->flags is on the linear part */
+-			if (!pskb_may_pull(skb, hdrlen + 1))
+-				return -1;
+-			if (meshdr->flags & MESH_FLAGS_AE_A5_A6)
++			if (mesh_flags & MESH_FLAGS_AE_A5_A6)
+ 				return -1;
+-			if (meshdr->flags & MESH_FLAGS_AE_A4)
++			if (mesh_flags & MESH_FLAGS_AE_A4)
+ 				skb_copy_bits(skb, hdrlen +
+ 					offsetof(struct ieee80211s_hdr, eaddr1),
+-					src, ETH_ALEN);
+-			hdrlen += ieee80211_get_mesh_hdrlen(meshdr);
++					tmp.h_source, ETH_ALEN);
++			hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags);
+ 		}
+ 		break;
+ 	case cpu_to_le16(0):
+@@ -498,33 +498,33 @@ int ieee80211_data_to_8023(struct sk_buf
+ 		break;
+ 	}
+ 
+-	if (!pskb_may_pull(skb, hdrlen + 8))
+-		return -1;
+-
+-	payload = skb->data + hdrlen;
+-	ethertype = (payload[6] << 8) | payload[7];
++	skb_copy_bits(skb, hdrlen, &payload, sizeof(payload));
++	tmp.h_proto = payload.proto;
+ 
+-	if (likely((ether_addr_equal(payload, rfc1042_header) &&
+-		    ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
+-		   ether_addr_equal(payload, bridge_tunnel_header))) {
++	if (likely((ether_addr_equal(payload.hdr, rfc1042_header) &&
++		    tmp.h_proto != htons(ETH_P_AARP) &&
++		    tmp.h_proto != htons(ETH_P_IPX)) ||
++		   ether_addr_equal(payload.hdr, bridge_tunnel_header)))
+ 		/* remove RFC1042 or Bridge-Tunnel encapsulation and
+ 		 * replace EtherType */
+-		skb_pull(skb, hdrlen + 6);
+-		memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
+-		memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
+-	} else {
+-		struct ethhdr *ehdr;
+-		__be16 len;
++		hdrlen += ETH_ALEN + 2;
++	else
++		tmp.h_proto = htons(skb->len);
+ 
+-		skb_pull(skb, hdrlen);
+-		len = htons(skb->len);
++	pskb_pull(skb, hdrlen);
++
++	if (!ehdr)
+ 		ehdr = (struct ethhdr *) skb_push(skb, sizeof(struct ethhdr));
+-		memcpy(ehdr->h_dest, dst, ETH_ALEN);
+-		memcpy(ehdr->h_source, src, ETH_ALEN);
+-		ehdr->h_proto = len;
+-	}
++	memcpy(ehdr, &tmp, sizeof(tmp));
++
+ 	return 0;
+ }
++
++int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
++			   enum nl80211_iftype iftype)
++{
++	return __ieee80211_data_to_8023(skb, NULL, addr, iftype);
++}
+ EXPORT_SYMBOL(ieee80211_data_to_8023);
+ 
+ int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr,
diff --git a/package/kernel/mac80211/patches/320-ath9k-ar9271_hw_pa_cal-use-defs-instead-of-magin-num.patch b/package/kernel/mac80211/patches/320-ath9k-ar9271_hw_pa_cal-use-defs-instead-of-magin-num.patch
deleted file mode 100644
index c4dd1af187cf86535db2a698a3912f6b5c4eda2f..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/320-ath9k-ar9271_hw_pa_cal-use-defs-instead-of-magin-num.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:47 +0100
-Subject: [PATCH] ath9k: ar9271_hw_pa_cal - use defs instead of magin
- numbers
-
-This function uses mixed styles for register names/numbers which
-is make harder reading and optimisation.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-@@ -430,22 +430,22 @@ static void ar9271_hw_pa_cal(struct ath_
- 	u32 regVal;
- 	unsigned int i;
- 	u32 regList[][2] = {
--		{ 0x786c, 0 },
--		{ 0x7854, 0 },
--		{ 0x7820, 0 },
--		{ 0x7824, 0 },
--		{ 0x7868, 0 },
--		{ 0x783c, 0 },
--		{ 0x7838, 0 } ,
--		{ 0x7828, 0 } ,
-+		{ AR9285_AN_TOP3, 0 },
-+		{ AR9285_AN_RXTXBB1, 0 },
-+		{ AR9285_AN_RF2G1, 0 },
-+		{ AR9285_AN_RF2G2, 0 },
-+		{ AR9285_AN_TOP2, 0 },
-+		{ AR9285_AN_RF2G8, 0 },
-+		{ AR9285_AN_RF2G7, 0 } ,
-+		{ AR9285_AN_RF2G3, 0 } ,
- 	};
- 
- 	for (i = 0; i < ARRAY_SIZE(regList); i++)
- 		regList[i][1] = REG_READ(ah, regList[i][0]);
- 
--	regVal = REG_READ(ah, 0x7834);
-+	regVal = REG_READ(ah, AR9285_AN_RF2G6);
- 	regVal &= (~(0x1));
--	REG_WRITE(ah, 0x7834, regVal);
-+	REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
- 	regVal = REG_READ(ah, 0x9808);
- 	regVal |= (0x1 << 27);
- 	REG_WRITE(ah, 0x9808, regVal);
-@@ -477,7 +477,7 @@ static void ar9271_hw_pa_cal(struct ath_
- 	 * does not matter since we turn it off
- 	 */
- 	REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0);
--
-+	/* 7828, b0-11, ccom=fff */
- 	REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff);
- 
- 	/* Set:
-@@ -490,15 +490,16 @@ static void ar9271_hw_pa_cal(struct ath_
- 
- 	/* find off_6_1; */
- 	for (i = 6; i > 0; i--) {
--		regVal = REG_READ(ah, 0x7834);
-+		regVal = REG_READ(ah, AR9285_AN_RF2G6);
- 		regVal |= (1 << (20 + i));
--		REG_WRITE(ah, 0x7834, regVal);
-+		REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
- 		udelay(1);
- 		/* regVal = REG_READ(ah, 0x7834); */
- 		regVal &= (~(0x1 << (20 + i)));
--		regVal |= (MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9)
-+		regVal |= (MS(REG_READ(ah, AR9285_AN_RF2G9),
-+			      AR9285_AN_RXTXBB1_SPARE9)
- 			    << (20 + i));
--		REG_WRITE(ah, 0x7834, regVal);
-+		REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
- 	}
- 
- 	regVal = (regVal >> 20) & 0x7f;
-@@ -517,9 +518,9 @@ static void ar9271_hw_pa_cal(struct ath_
- 
- 	ENABLE_REGWRITE_BUFFER(ah);
- 
--	regVal = REG_READ(ah, 0x7834);
-+	regVal = REG_READ(ah, AR_AN_RF2G1_CH1);
- 	regVal |= 0x1;
--	REG_WRITE(ah, 0x7834, regVal);
-+	REG_WRITE(ah, AR_AN_RF2G1_CH1, regVal);
- 	regVal = REG_READ(ah, 0x9808);
- 	regVal &= (~(0x1 << 27));
- 	REG_WRITE(ah, 0x9808, regVal);
diff --git a/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch b/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2eeed22af0adb5e8386f5f5e75af725bbf71ec7b
--- /dev/null
+++ b/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch
@@ -0,0 +1,159 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Tue, 2 Feb 2016 14:39:10 +0100
+Subject: [PATCH] cfg80211: add support for non-linear skbs in
+ ieee80211_amsdu_to_8023s
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -644,73 +644,75 @@ int ieee80211_data_from_8023(struct sk_b
+ }
+ EXPORT_SYMBOL(ieee80211_data_from_8023);
+ 
++static struct sk_buff *
++__ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen,
++		       int offset, int len)
++{
++	struct sk_buff *frame;
++
++	if (skb->len - offset < len)
++		return NULL;
++
++	/*
++	 * Allocate and reserve two bytes more for payload
++	 * alignment since sizeof(struct ethhdr) is 14.
++	 */
++	frame = dev_alloc_skb(hlen + sizeof(struct ethhdr) + 2 + len);
++
++	skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2);
++	skb_copy_bits(skb, offset, skb_put(frame, len), len);
++
++	return frame;
++}
+ 
+ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
+ 			      const u8 *addr, enum nl80211_iftype iftype,
+ 			      const unsigned int extra_headroom,
+ 			      bool has_80211_header)
+ {
++	unsigned int hlen = ALIGN(extra_headroom, 4);
+ 	struct sk_buff *frame = NULL;
+ 	u16 ethertype;
+ 	u8 *payload;
+-	const struct ethhdr *eth;
+-	int remaining, err;
+-	u8 dst[ETH_ALEN], src[ETH_ALEN];
+-
+-	if (skb_linearize(skb))
+-		goto out;
++	int offset = 0, remaining, err;
++	struct ethhdr eth;
++	bool reuse_skb = true;
++	bool last = false;
+ 
+ 	if (has_80211_header) {
+-		err = ieee80211_data_to_8023(skb, addr, iftype);
++		err = __ieee80211_data_to_8023(skb, &eth, addr, iftype);
+ 		if (err)
+ 			goto out;
+-
+-		/* skip the wrapping header */
+-		eth = (struct ethhdr *) skb_pull(skb, sizeof(struct ethhdr));
+-		if (!eth)
+-			goto out;
+-	} else {
+-		eth = (struct ethhdr *) skb->data;
+ 	}
+ 
+-	while (skb != frame) {
++	while (!last) {
++		unsigned int subframe_len;
++		int len;
+ 		u8 padding;
+-		__be16 len = eth->h_proto;
+-		unsigned int subframe_len = sizeof(struct ethhdr) + ntohs(len);
+-
+-		remaining = skb->len;
+-		memcpy(dst, eth->h_dest, ETH_ALEN);
+-		memcpy(src, eth->h_source, ETH_ALEN);
+ 
++		skb_copy_bits(skb, offset, &eth, sizeof(eth));
++		len = ntohs(eth.h_proto);
++		subframe_len = sizeof(struct ethhdr) + len;
+ 		padding = (4 - subframe_len) & 0x3;
++
+ 		/* the last MSDU has no padding */
++		remaining = skb->len - offset;
+ 		if (subframe_len > remaining)
+ 			goto purge;
+ 
+-		skb_pull(skb, sizeof(struct ethhdr));
++		offset += sizeof(struct ethhdr);
+ 		/* reuse skb for the last subframe */
+-		if (remaining <= subframe_len + padding)
++		last = remaining <= subframe_len + padding;
++		if (!skb_is_nonlinear(skb) && last) {
++			skb_pull(skb, offset);
+ 			frame = skb;
+-		else {
+-			unsigned int hlen = ALIGN(extra_headroom, 4);
+-			/*
+-			 * Allocate and reserve two bytes more for payload
+-			 * alignment since sizeof(struct ethhdr) is 14.
+-			 */
+-			frame = dev_alloc_skb(hlen + subframe_len + 2);
++			reuse_skb = true;
++		} else {
++			frame = __ieee80211_amsdu_copy(skb, hlen, offset, len);
+ 			if (!frame)
+ 				goto purge;
+ 
+-			skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2);
+-			memcpy(skb_put(frame, ntohs(len)), skb->data,
+-				ntohs(len));
+-
+-			eth = (struct ethhdr *)skb_pull(skb, ntohs(len) +
+-							padding);
+-			if (!eth) {
+-				dev_kfree_skb(frame);
+-				goto purge;
+-			}
++			offset += len + padding;
+ 		}
+ 
+ 		skb_reset_network_header(frame);
+@@ -719,24 +721,20 @@ void ieee80211_amsdu_to_8023s(struct sk_
+ 
+ 		payload = frame->data;
+ 		ethertype = (payload[6] << 8) | payload[7];
+-
+ 		if (likely((ether_addr_equal(payload, rfc1042_header) &&
+ 			    ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
+ 			   ether_addr_equal(payload, bridge_tunnel_header))) {
+-			/* remove RFC1042 or Bridge-Tunnel
+-			 * encapsulation and replace EtherType */
+-			skb_pull(frame, 6);
+-			memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
+-			memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
+-		} else {
+-			memcpy(skb_push(frame, sizeof(__be16)), &len,
+-				sizeof(__be16));
+-			memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
+-			memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
++			eth.h_proto = htons(ethertype);
++			skb_pull(frame, ETH_ALEN + 2);
+ 		}
++
++		memcpy(skb_push(frame, sizeof(eth)), &eth, sizeof(eth));
+ 		__skb_queue_tail(list, frame);
+ 	}
+ 
++	if (!reuse_skb)
++		dev_kfree_skb(skb);
++
+ 	return;
+ 
+  purge:
diff --git a/package/kernel/mac80211/patches/321-ath9k-ar9271_hw_pa_cal-use-proper-makroses.patch b/package/kernel/mac80211/patches/321-ath9k-ar9271_hw_pa_cal-use-proper-makroses.patch
deleted file mode 100644
index f05287d9197bcd97bb9aa6e375001d74934ee2f4..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/321-ath9k-ar9271_hw_pa_cal-use-proper-makroses.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:48 +0100
-Subject: [PATCH] ath9k: ar9271_hw_pa_cal: use proper makroses.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-@@ -443,33 +443,30 @@ static void ar9271_hw_pa_cal(struct ath_
- 	for (i = 0; i < ARRAY_SIZE(regList); i++)
- 		regList[i][1] = REG_READ(ah, regList[i][0]);
- 
--	regVal = REG_READ(ah, AR9285_AN_RF2G6);
--	regVal &= (~(0x1));
--	REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
--	regVal = REG_READ(ah, 0x9808);
--	regVal |= (0x1 << 27);
--	REG_WRITE(ah, 0x9808, regVal);
--
-+	/* 7834, b1=0 */
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
-+	/* 9808, b27=1 */
-+	REG_SET_BIT(ah, 0x9808, 1 << 27);
- 	/* 786c,b23,1, pwddac=1 */
--	REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1);
-+	REG_SET_BIT(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC);
- 	/* 7854, b5,1, pdrxtxbb=1 */
--	REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1);
-+	REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1);
- 	/* 7854, b7,1, pdv2i=1 */
--	REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1);
-+	REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I);
- 	/* 7854, b8,1, pddacinterface=1 */
--	REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1);
-+	REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF);
- 	/* 7824,b12,0, offcal=0 */
--	REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0);
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL);
- 	/* 7838, b1,0, pwddb=0 */
--	REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0);
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB);
- 	/* 7820,b11,0, enpacal=0 */
--	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0);
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL);
- 	/* 7820,b25,1, pdpadrv1=0 */
--	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0);
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1);
- 	/* 7820,b24,0, pdpadrv2=0 */
--	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0);
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2);
- 	/* 7820,b23,0, pdpaout=0 */
--	REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0);
-+	REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT);
- 	/* 783c,b14-16,7, padrvgn2tab_0=7 */
- 	REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7);
- 	/*
-@@ -516,15 +513,13 @@ static void ar9271_hw_pa_cal(struct ath_
- 		ah->pacal_info.prev_offset = regVal;
- 	}
- 
--	ENABLE_REGWRITE_BUFFER(ah);
- 
--	regVal = REG_READ(ah, AR_AN_RF2G1_CH1);
--	regVal |= 0x1;
--	REG_WRITE(ah, AR_AN_RF2G1_CH1, regVal);
--	regVal = REG_READ(ah, 0x9808);
--	regVal &= (~(0x1 << 27));
--	REG_WRITE(ah, 0x9808, regVal);
-+	/* 7834, b1=1 */
-+	REG_SET_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
-+	/* 9808, b27=0 */
-+	REG_CLR_BIT(ah, 0x9808, 1 << 27);
- 
-+	ENABLE_REGWRITE_BUFFER(ah);
- 	for (i = 0; i < ARRAY_SIZE(regList); i++)
- 		REG_WRITE(ah, regList[i][0], regList[i][1]);
- 
diff --git a/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch b/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c4155a118101fb910100de80f4ac7f6da1787a1c
--- /dev/null
+++ b/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch
@@ -0,0 +1,155 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Tue, 26 Jan 2016 17:11:13 +0100
+Subject: [PATCH] mac80211: Parse legacy and HT rate in injected frames
+
+Drivers/devices without their own rate control algorithm can get the
+information what rates they should use from either the radiotap header of
+injected frames or from the rate control algorithm. But the parsing of the
+legacy rate information from the radiotap header was removed in commit
+e6a9854b05c1 ("mac80211/drivers: rewrite the rate control API").
+
+The removal of this feature heavily reduced the usefulness of frame
+injection when wanting to simulate specific transmission behavior. Having
+rate parsing together with MCS rates and retry support allows a fine
+grained selection of the tx behavior of injected frames for these kind of
+tests.
+
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+Cc: Simon Wunderlich <sw@simonwunderlich.de>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -708,12 +708,14 @@ enum mac80211_tx_info_flags {
+  *	protocol frame (e.g. EAP)
+  * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll
+  *	frame (PS-Poll or uAPSD).
++ * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information
+  *
+  * These flags are used in tx_info->control.flags.
+  */
+ enum mac80211_tx_control_flags {
+ 	IEEE80211_TX_CTRL_PORT_CTRL_PROTO	= BIT(0),
+ 	IEEE80211_TX_CTRL_PS_RESPONSE		= BIT(1),
++	IEEE80211_TX_CTRL_RATE_INJECT		= BIT(2),
+ };
+ 
+ /*
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -710,6 +710,10 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
+ 
+ 	info->control.short_preamble = txrc.short_preamble;
+ 
++	/* don't ask rate control when rate already injected via radiotap */
++	if (info->control.flags & IEEE80211_TX_CTRL_RATE_INJECT)
++		return TX_CONTINUE;
++
+ 	if (tx->sta)
+ 		assoc = test_sta_flag(tx->sta, WLAN_STA_ASSOC);
+ 
+@@ -1665,15 +1669,24 @@ void ieee80211_xmit(struct ieee80211_sub
+ 	ieee80211_tx(sdata, sta, skb, false);
+ }
+ 
+-static bool ieee80211_parse_tx_radiotap(struct sk_buff *skb)
++static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local,
++					struct sk_buff *skb)
+ {
+ 	struct ieee80211_radiotap_iterator iterator;
+ 	struct ieee80211_radiotap_header *rthdr =
+ 		(struct ieee80211_radiotap_header *) skb->data;
+ 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
++	struct ieee80211_supported_band *sband =
++		local->hw.wiphy->bands[info->band];
+ 	int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len,
+ 						   NULL);
+ 	u16 txflags;
++	u16 rate = 0;
++	bool rate_found = false;
++	u8 rate_retries = 0;
++	u16 rate_flags = 0;
++	u8 mcs_known, mcs_flags;
++	int i;
+ 
+ 	info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
+ 		       IEEE80211_TX_CTL_DONTFRAG;
+@@ -1724,6 +1737,35 @@ static bool ieee80211_parse_tx_radiotap(
+ 				info->flags |= IEEE80211_TX_CTL_NO_ACK;
+ 			break;
+ 
++		case IEEE80211_RADIOTAP_RATE:
++			rate = *iterator.this_arg;
++			rate_flags = 0;
++			rate_found = true;
++			break;
++
++		case IEEE80211_RADIOTAP_DATA_RETRIES:
++			rate_retries = *iterator.this_arg;
++			break;
++
++		case IEEE80211_RADIOTAP_MCS:
++			mcs_known = iterator.this_arg[0];
++			mcs_flags = iterator.this_arg[1];
++			if (!(mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_MCS))
++				break;
++
++			rate_found = true;
++			rate = iterator.this_arg[2];
++			rate_flags = IEEE80211_TX_RC_MCS;
++
++			if (mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_GI &&
++			    mcs_flags & IEEE80211_RADIOTAP_MCS_SGI)
++				rate_flags |= IEEE80211_TX_RC_SHORT_GI;
++
++			if (mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_BW &&
++			    mcs_flags & IEEE80211_RADIOTAP_MCS_BW_40)
++				rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
++			break;
++
+ 		/*
+ 		 * Please update the file
+ 		 * Documentation/networking/mac80211-injection.txt
+@@ -1738,6 +1780,32 @@ static bool ieee80211_parse_tx_radiotap(
+ 	if (ret != -ENOENT) /* ie, if we didn't simply run out of fields */
+ 		return false;
+ 
++	if (rate_found) {
++		info->control.flags |= IEEE80211_TX_CTRL_RATE_INJECT;
++
++		for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
++			info->control.rates[i].idx = -1;
++			info->control.rates[i].flags = 0;
++			info->control.rates[i].count = 0;
++		}
++
++		if (rate_flags & IEEE80211_TX_RC_MCS) {
++			info->control.rates[0].idx = rate;
++		} else {
++			for (i = 0; i < sband->n_bitrates; i++) {
++				if (rate * 5 != sband->bitrates[i].bitrate)
++					continue;
++
++				info->control.rates[0].idx = i;
++				break;
++			}
++		}
++
++		info->control.rates[0].flags = rate_flags;
++		info->control.rates[0].count = min_t(u8, rate_retries + 1,
++						     local->hw.max_rate_tries);
++	}
++
+ 	/*
+ 	 * remove the radiotap header
+ 	 * iterator->_max_length was sanity-checked against
+@@ -1819,7 +1887,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
+ 		      IEEE80211_TX_CTL_INJECTED;
+ 
+ 	/* process and remove the injection radiotap header */
+-	if (!ieee80211_parse_tx_radiotap(skb))
++	if (!ieee80211_parse_tx_radiotap(local, skb))
+ 		goto fail;
+ 
+ 	rcu_read_lock();
diff --git a/package/kernel/mac80211/patches/322-ath9k-ar9271_hw_pa_cal-use-RMW-buffer.patch b/package/kernel/mac80211/patches/322-ath9k-ar9271_hw_pa_cal-use-RMW-buffer.patch
deleted file mode 100644
index 72473694989a03b9c02c4e39a88c342edced77ec..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/322-ath9k-ar9271_hw_pa_cal-use-RMW-buffer.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:49 +0100
-Subject: [PATCH] ath9k: ar9271_hw_pa_cal: use RMW buffer
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-@@ -436,13 +436,14 @@ static void ar9271_hw_pa_cal(struct ath_
- 		{ AR9285_AN_RF2G2, 0 },
- 		{ AR9285_AN_TOP2, 0 },
- 		{ AR9285_AN_RF2G8, 0 },
--		{ AR9285_AN_RF2G7, 0 } ,
--		{ AR9285_AN_RF2G3, 0 } ,
-+		{ AR9285_AN_RF2G7, 0 },
-+		{ AR9285_AN_RF2G3, 0 },
- 	};
- 
- 	for (i = 0; i < ARRAY_SIZE(regList); i++)
- 		regList[i][1] = REG_READ(ah, regList[i][0]);
- 
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	/* 7834, b1=0 */
- 	REG_CLR_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
- 	/* 9808, b27=1 */
-@@ -476,6 +477,7 @@ static void ar9271_hw_pa_cal(struct ath_
- 	REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0);
- 	/* 7828, b0-11, ccom=fff */
- 	REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff);
-+	REG_RMW_BUFFER_FLUSH(ah);
- 
- 	/* Set:
- 	 * localmode=1,bmode=1,bmoderxtx=1,synthon=1,
-@@ -514,10 +516,12 @@ static void ar9271_hw_pa_cal(struct ath_
- 	}
- 
- 
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	/* 7834, b1=1 */
- 	REG_SET_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
- 	/* 9808, b27=0 */
- 	REG_CLR_BIT(ah, 0x9808, 1 << 27);
-+	REG_RMW_BUFFER_FLUSH(ah);
- 
- 	ENABLE_REGWRITE_BUFFER(ah);
- 	for (i = 0; i < ARRAY_SIZE(regList); i++)
diff --git a/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch b/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e7bfb9c83dd406e41e523195fabd0a4611dc86b4
--- /dev/null
+++ b/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch
@@ -0,0 +1,317 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Fri, 5 Feb 2016 01:38:51 +0100
+Subject: [PATCH] mac80211: add A-MSDU tx support
+
+Requires software tx queueing support. frag_list support (for zero-copy)
+is optional.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -709,6 +709,7 @@ enum mac80211_tx_info_flags {
+  * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll
+  *	frame (PS-Poll or uAPSD).
+  * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information
++ * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame
+  *
+  * These flags are used in tx_info->control.flags.
+  */
+@@ -716,6 +717,7 @@ enum mac80211_tx_control_flags {
+ 	IEEE80211_TX_CTRL_PORT_CTRL_PROTO	= BIT(0),
+ 	IEEE80211_TX_CTRL_PS_RESPONSE		= BIT(1),
+ 	IEEE80211_TX_CTRL_RATE_INJECT		= BIT(2),
++	IEEE80211_TX_CTRL_AMSDU			= BIT(3),
+ };
+ 
+ /*
+@@ -1728,6 +1730,7 @@ struct ieee80211_sta_rates {
+  *		  size is min(max_amsdu_len, 7935) bytes.
+  *	Both additional HT limits must be enforced by the low level driver.
+  *	This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2).
++ * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
+  * @txq: per-TID data TX queues (if driver uses the TXQ abstraction)
+  */
+ struct ieee80211_sta {
+@@ -1748,6 +1751,7 @@ struct ieee80211_sta {
+ 	bool mfp;
+ 	u8 max_amsdu_subframes;
+ 	u16 max_amsdu_len;
++	u16 max_rc_amsdu_len;
+ 
+ 	struct ieee80211_txq *txq[IEEE80211_NUM_TIDS];
+ 
+@@ -1961,6 +1965,15 @@ struct ieee80211_txq {
+  *	order and does not need to manage its own reorder buffer or BA session
+  *	timeout.
+  *
++ * @IEEE80211_HW_TX_AMSDU: Hardware (or driver) supports software aggregated
++ *	A-MSDU frames. Requires software tx queueing and fast-xmit support.
++ *	When not using minstrel/minstrel_ht rate control, the driver should
++ *	limit the maximum A-MSDU size based on the current tx rate by setting
++ *	max_rc_amsdu_len in struct ieee80211_sta.
++ *
++ * @IEEE80211_HW_TX_FRAG_LIST: Hardware (or driver) supports sending frag_list
++ *	skbs, needed for zero-copy software A-MSDU.
++ *
+  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
+  */
+ enum ieee80211_hw_flags {
+@@ -1998,6 +2011,8 @@ enum ieee80211_hw_flags {
+ 	IEEE80211_HW_BEACON_TX_STATUS,
+ 	IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR,
+ 	IEEE80211_HW_SUPPORTS_REORDERING_BUFFER,
++	IEEE80211_HW_TX_AMSDU,
++	IEEE80211_HW_TX_FRAG_LIST,
+ 
+ 	/* keep last, obviously */
+ 	NUM_IEEE80211_HW_FLAGS
+@@ -2070,6 +2085,9 @@ enum ieee80211_hw_flags {
+  *	size is smaller (an example is LinkSys WRT120N with FW v1.0.07
+  *	build 002 Jun 18 2012).
+  *
++ * @max_tx_fragments: maximum number of tx buffers per (A)-MSDU, sum
++ *	of 1 + skb_shinfo(skb)->nr_frags for each skb in the frag_list.
++ *
+  * @offchannel_tx_hw_queue: HW queue ID to use for offchannel TX
+  *	(if %IEEE80211_HW_QUEUE_CONTROL is set)
+  *
+@@ -2124,6 +2142,7 @@ struct ieee80211_hw {
+ 	u8 max_rate_tries;
+ 	u8 max_rx_aggregation_subframes;
+ 	u8 max_tx_aggregation_subframes;
++	u8 max_tx_fragments;
+ 	u8 offchannel_tx_hw_queue;
+ 	u8 radiotap_mcs_details;
+ 	u16 radiotap_vht_details;
+--- a/net/mac80211/agg-tx.c
++++ b/net/mac80211/agg-tx.c
+@@ -935,6 +935,7 @@ void ieee80211_process_addba_resp(struct
+ 				  size_t len)
+ {
+ 	struct tid_ampdu_tx *tid_tx;
++	struct ieee80211_txq *txq;
+ 	u16 capab, tid;
+ 	u8 buf_size;
+ 	bool amsdu;
+@@ -945,6 +946,10 @@ void ieee80211_process_addba_resp(struct
+ 	buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
+ 	buf_size = min(buf_size, local->hw.max_tx_aggregation_subframes);
+ 
++	txq = sta->sta.txq[tid];
++	if (!amsdu && txq)
++		set_bit(IEEE80211_TXQ_NO_AMSDU, &to_txq_info(txq)->flags);
++
+ 	mutex_lock(&sta->ampdu_mlme.mtx);
+ 
+ 	tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
+--- a/net/mac80211/debugfs.c
++++ b/net/mac80211/debugfs.c
+@@ -127,6 +127,8 @@ static const char *hw_flag_names[NUM_IEE
+ 	FLAG(BEACON_TX_STATUS),
+ 	FLAG(NEEDS_UNIQUE_STA_ADDR),
+ 	FLAG(SUPPORTS_REORDERING_BUFFER),
++	FLAG(TX_AMSDU),
++	FLAG(TX_FRAG_LIST),
+ 
+ 	/* keep last for the build bug below */
+ 	(void *)0x1
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -799,6 +799,7 @@ struct mac80211_qos_map {
+ enum txq_info_flags {
+ 	IEEE80211_TXQ_STOP,
+ 	IEEE80211_TXQ_AMPDU,
++	IEEE80211_TXQ_NO_AMSDU,
+ };
+ 
+ struct txq_info {
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1318,6 +1318,10 @@ struct sk_buff *ieee80211_tx_dequeue(str
+ out:
+ 	spin_unlock_bh(&txqi->queue.lock);
+ 
++	if (skb && skb_has_frag_list(skb) &&
++	    !ieee80211_hw_check(&local->hw, TX_FRAG_LIST))
++		skb_linearize(skb);
++
+ 	return skb;
+ }
+ EXPORT_SYMBOL(ieee80211_tx_dequeue);
+@@ -2757,6 +2761,163 @@ void ieee80211_clear_fast_xmit(struct st
+ 		kfree_rcu(fast_tx, rcu_head);
+ }
+ 
++static bool ieee80211_amsdu_realloc_pad(struct ieee80211_local *local,
++					struct sk_buff *skb, int headroom,
++					int *subframe_len)
++{
++	int amsdu_len = *subframe_len + sizeof(struct ethhdr);
++	int padding = (4 - amsdu_len) & 3;
++
++	if (skb_headroom(skb) < headroom || skb_tailroom(skb) < padding) {
++		I802_DEBUG_INC(local->tx_expand_skb_head);
++
++		if (pskb_expand_head(skb, headroom, padding, GFP_ATOMIC)) {
++			wiphy_debug(local->hw.wiphy,
++				    "failed to reallocate TX buffer\n");
++			return false;
++		}
++	}
++
++	if (padding) {
++		*subframe_len += padding;
++		memset(skb_put(skb, padding), 0, padding);
++	}
++
++	return true;
++}
++
++static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,
++					 struct ieee80211_fast_tx *fast_tx,
++					 struct sk_buff *skb)
++{
++	struct ieee80211_local *local = sdata->local;
++	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
++	struct ieee80211_hdr *hdr;
++	struct ethhdr amsdu_hdr;
++	int hdr_len = fast_tx->hdr_len - sizeof(rfc1042_header);
++	int subframe_len = skb->len - hdr_len;
++	void *data;
++	u8 *qc;
++
++	if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
++		return false;
++
++	if (info->control.flags & IEEE80211_TX_CTRL_AMSDU)
++		return true;
++
++	if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(amsdu_hdr),
++					 &subframe_len))
++		return false;
++
++	amsdu_hdr.h_proto = cpu_to_be16(subframe_len);
++	memcpy(amsdu_hdr.h_source, skb->data + fast_tx->sa_offs, ETH_ALEN);
++	memcpy(amsdu_hdr.h_dest, skb->data + fast_tx->da_offs, ETH_ALEN);
++
++	data = skb_push(skb, sizeof(amsdu_hdr));
++	memmove(data, data + sizeof(amsdu_hdr), hdr_len);
++	memcpy(data + hdr_len, &amsdu_hdr, sizeof(amsdu_hdr));
++
++	hdr = data;
++	qc = ieee80211_get_qos_ctl(hdr);
++	*qc |= IEEE80211_QOS_CTL_A_MSDU_PRESENT;
++
++	info->control.flags |= IEEE80211_TX_CTRL_AMSDU;
++
++	return true;
++}
++
++static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
++				      struct sta_info *sta,
++				      struct ieee80211_fast_tx *fast_tx,
++				      struct sk_buff *skb)
++{
++	struct ieee80211_local *local = sdata->local;
++	u8 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
++	struct ieee80211_txq *txq = sta->sta.txq[tid];
++	struct txq_info *txqi;
++	struct sk_buff **frag_tail, *head;
++	int subframe_len = skb->len - ETH_ALEN;
++	u8 max_subframes = sta->sta.max_amsdu_subframes;
++	int max_frags = local->hw.max_tx_fragments;
++	int max_amsdu_len = sta->sta.max_amsdu_len;
++	__be16 len;
++	void *data;
++	bool ret = false;
++	int n = 1, nfrags;
++
++	if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
++		return false;
++
++	if (!txq)
++		return false;
++
++	txqi = to_txq_info(txq);
++	if (test_bit(IEEE80211_TXQ_NO_AMSDU, &txqi->flags))
++		return false;
++
++	if (sta->sta.max_rc_amsdu_len)
++		max_amsdu_len = min_t(int, max_amsdu_len,
++				      sta->sta.max_rc_amsdu_len);
++
++	spin_lock_bh(&txqi->queue.lock);
++
++	head = skb_peek_tail(&txqi->queue);
++	if (!head)
++		goto out;
++
++	if (skb->len + head->len > max_amsdu_len)
++		goto out;
++
++	/*
++	 * HT A-MPDU limits maximum MPDU size to 4095 bytes. Since aggregation
++	 * sessions are started/stopped without txq flush, use the limit here
++	 * to avoid having to de-aggregate later.
++	 */
++	if (skb->len + head->len > 4095 &&
++	    !sta->sta.vht_cap.vht_supported)
++		goto out;
++
++	if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head))
++		goto out;
++
++	nfrags = 1 + skb_shinfo(skb)->nr_frags;
++	nfrags += 1 + skb_shinfo(head)->nr_frags;
++	frag_tail = &skb_shinfo(head)->frag_list;
++	while (*frag_tail) {
++		nfrags += 1 + skb_shinfo(*frag_tail)->nr_frags;
++		frag_tail = &(*frag_tail)->next;
++		n++;
++	}
++
++	if (max_subframes && n > max_subframes)
++		goto out;
++
++	if (max_frags && nfrags > max_frags)
++		goto out;
++
++	if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) + 2,
++					 &subframe_len))
++		return false;
++
++	ret = true;
++	data = skb_push(skb, ETH_ALEN + 2);
++	memmove(data, data + ETH_ALEN + 2, 2 * ETH_ALEN);
++
++	data += 2 * ETH_ALEN;
++	len = cpu_to_be16(subframe_len);
++	memcpy(data, &len, 2);
++	memcpy(data + 2, rfc1042_header, sizeof(rfc1042_header));
++
++	head->len += skb->len;
++	head->data_len += skb->len;
++	*frag_tail = skb;
++
++out:
++	spin_unlock_bh(&txqi->queue.lock);
++
++	return ret;
++}
++
+ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
+ 				struct net_device *dev, struct sta_info *sta,
+ 				struct ieee80211_fast_tx *fast_tx,
+@@ -2811,6 +2972,10 @@ static bool ieee80211_xmit_fast(struct i
+ 
+ 	ieee80211_tx_stats(dev, skb->len + extra_head);
+ 
++	if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) &&
++	    ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb))
++		return true;
++
+ 	/* will not be crypto-handled beyond what we do here, so use false
+ 	 * as the may-encrypt argument for the resize to not account for
+ 	 * more room than we already have in 'extra_head'
diff --git a/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch b/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9277b2cabcdf6a02fa285b7eef2391b7f575869a
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch
@@ -0,0 +1,64 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Wed, 20 Jan 2016 16:46:04 +0100
+Subject: [PATCH] brcmfmac: fix setting primary channel for 80 MHz width
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+First of all it changes the way we calculate primary channel offset. If
+we use e.g. 80 MHz channel with primary frequency 5180 MHz (which means
+center frequency is 5210 MHz) it makes sense to calculate primary offset
+as -30 MHz.
+Then it fixes values we compare primary_offset with. We were comparing
+offset in MHz against -2 or 2 which was resulting in picking a wrong
+primary channel.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -247,7 +247,7 @@ static u16 chandef_to_chanspec(struct br
+ 	brcmf_dbg(TRACE, "chandef: control %d center %d width %d\n",
+ 		  ch->chan->center_freq, ch->center_freq1, ch->width);
+ 	ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1);
+-	primary_offset = ch->center_freq1 - ch->chan->center_freq;
++	primary_offset = ch->chan->center_freq - ch->center_freq1;
+ 	switch (ch->width) {
+ 	case NL80211_CHAN_WIDTH_20:
+ 	case NL80211_CHAN_WIDTH_20_NOHT:
+@@ -256,24 +256,21 @@ static u16 chandef_to_chanspec(struct br
+ 		break;
+ 	case NL80211_CHAN_WIDTH_40:
+ 		ch_inf.bw = BRCMU_CHAN_BW_40;
+-		if (primary_offset < 0)
++		if (primary_offset > 0)
+ 			ch_inf.sb = BRCMU_CHAN_SB_U;
+ 		else
+ 			ch_inf.sb = BRCMU_CHAN_SB_L;
+ 		break;
+ 	case NL80211_CHAN_WIDTH_80:
+ 		ch_inf.bw = BRCMU_CHAN_BW_80;
+-		if (primary_offset < 0) {
+-			if (primary_offset < -CH_10MHZ_APART)
+-				ch_inf.sb = BRCMU_CHAN_SB_UU;
+-			else
+-				ch_inf.sb = BRCMU_CHAN_SB_UL;
+-		} else {
+-			if (primary_offset > CH_10MHZ_APART)
+-				ch_inf.sb = BRCMU_CHAN_SB_LL;
+-			else
+-				ch_inf.sb = BRCMU_CHAN_SB_LU;
+-		}
++		if (primary_offset == -30)
++			ch_inf.sb = BRCMU_CHAN_SB_LL;
++		else if (primary_offset == -10)
++			ch_inf.sb = BRCMU_CHAN_SB_LU;
++		else if (primary_offset == 10)
++			ch_inf.sb = BRCMU_CHAN_SB_UL;
++		else
++			ch_inf.sb = BRCMU_CHAN_SB_UU;
+ 		break;
+ 	case NL80211_CHAN_WIDTH_80P80:
+ 	case NL80211_CHAN_WIDTH_160:
diff --git a/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch b/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d7018dab3d230ab2e342824ff5067d0a24b586a1
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch
@@ -0,0 +1,51 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 26 Jan 2016 17:57:01 +0100
+Subject: [PATCH] brcmfmac: analyze descriptors of current component only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+So far we were looking for address descriptors without a check for
+crossing current component border. In case of dealing with unsupported
+descriptor or descriptor missing at all the code would incorrectly get
+data from another component.
+
+Consider this binary-described component from BCM4366 EROM:
+4bf83b01	TAG==CI		CID==0x83b
+20080201	TAG==CI		PORTS==0+1	WRAPPERS==0+1
+18400035	TAG==ADDR	SZ_SZD		TYPE_SLAVE
+00050000
+18107085	TAG==ADDR	SZ_4K		TYPE_SWRAP
+
+Driver was assigning invalid base address to this core:
+brcmfmac:  [6 ] core 0x83b:32 base 0x18109000 wrap 0x18107000
+which came from totally different component defined in EROM:
+43b36701	TAG==CI		CID==0x367
+00000201	TAG==CI		PORTS==0+1	WRAPPERS==0+0
+18109005	TAG==ADDR	SZ_4K		TYPE_SLAVE
+
+This change will also allow us to support components without wrapper
+address in the future.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+@@ -803,7 +803,14 @@ static int brcmf_chip_dmp_get_regaddr(st
+ 				*eromaddr -= 4;
+ 				return -EFAULT;
+ 			}
+-		} while (desc != DMP_DESC_ADDRESS);
++		} while (desc != DMP_DESC_ADDRESS &&
++			 desc != DMP_DESC_COMPONENT);
++
++		/* stop if we crossed current component border */
++		if (desc == DMP_DESC_COMPONENT) {
++			*eromaddr -= 4;
++			return 0;
++		}
+ 
+ 		/* skip upper 32-bit address descriptor */
+ 		if (val & DMP_DESC_ADDRSIZE_GT32)
diff --git a/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch b/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch
new file mode 100644
index 0000000000000000000000000000000000000000..045ab4953bb9a43044435baa8e242b3f4794952a
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch
@@ -0,0 +1,28 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 26 Jan 2016 17:57:02 +0100
+Subject: [PATCH] brcmfmac: allow storing PMU core without wrapper address
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Separated PMU core can be found in new devices and should be used for
+accessing PMU registers (which were routed through ChipCommon so far).
+This core is one of exceptions that doesn't have or need wrapper address
+to be still safely accessible.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+@@ -883,7 +883,8 @@ int brcmf_chip_dmp_erom_scan(struct brcm
+ 		rev = (val & DMP_COMP_REVISION) >> DMP_COMP_REVISION_S;
+ 
+ 		/* need core with ports */
+-		if (nmw + nsw == 0)
++		if (nmw + nsw == 0 &&
++		    id != BCMA_CORE_PMU)
+ 			continue;
+ 
+ 		/* try to obtain register address info */
diff --git a/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch b/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7b7ba4f743b244c0d766efbce7045e00e13e27ed
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch
@@ -0,0 +1,43 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 26 Jan 2016 17:57:03 +0100
+Subject: [PATCH] brcmfmac: read extended capabilities of ChipCommon core
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This is an extra bitfield with info about some present hardware.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+@@ -1025,6 +1025,9 @@ static int brcmf_chip_setup(struct brcmf
+ 	/* get chipcommon capabilites */
+ 	pub->cc_caps = chip->ops->read32(chip->ctx,
+ 					 CORE_CC_REG(base, capabilities));
++	pub->cc_caps_ext = chip->ops->read32(chip->ctx,
++					     CORE_CC_REG(base,
++							 capabilities_ext));
+ 
+ 	/* get pmu caps & rev */
+ 	if (pub->cc_caps & CC_CAP_PMU) {
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
+@@ -27,6 +27,7 @@
+  * @chip: chip identifier.
+  * @chiprev: chip revision.
+  * @cc_caps: chipcommon core capabilities.
++ * @cc_caps_ext: chipcommon core extended capabilities.
+  * @pmucaps: PMU capabilities.
+  * @pmurev: PMU revision.
+  * @rambase: RAM base address (only applicable for ARM CR4 chips).
+@@ -38,6 +39,7 @@ struct brcmf_chip {
+ 	u32 chip;
+ 	u32 chiprev;
+ 	u32 cc_caps;
++	u32 cc_caps_ext;
+ 	u32 pmucaps;
+ 	u32 pmurev;
+ 	u32 rambase;
diff --git a/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch b/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2af6fd93bc06142b459144caf49489d51f7f6304
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch
@@ -0,0 +1,148 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 26 Jan 2016 17:57:04 +0100
+Subject: [PATCH] brcmfmac: access PMU registers using standalone PMU core if
+ available
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+On recent Broadcom chipsets PMU is present as separated core and it
+can't be accessed using ChipCommon anymore as it fails with e.g.:
+[   18.198412] Unhandled fault: imprecise external abort (0x1406) at 0xb6da200f
+
+Add a new helper function that will return a proper core that should be
+used for accessing PMU registers.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+@@ -1014,6 +1014,7 @@ static int brcmf_chip_setup(struct brcmf
+ {
+ 	struct brcmf_chip *pub;
+ 	struct brcmf_core_priv *cc;
++	struct brcmf_core *pmu;
+ 	u32 base;
+ 	u32 val;
+ 	int ret = 0;
+@@ -1030,9 +1031,10 @@ static int brcmf_chip_setup(struct brcmf
+ 							 capabilities_ext));
+ 
+ 	/* get pmu caps & rev */
++	pmu = brcmf_chip_get_pmu(pub); /* after reading cc_caps_ext */
+ 	if (pub->cc_caps & CC_CAP_PMU) {
+ 		val = chip->ops->read32(chip->ctx,
+-					CORE_CC_REG(base, pmucapabilities));
++					CORE_CC_REG(pmu->base, pmucapabilities));
+ 		pub->pmurev = val & PCAP_REV_MASK;
+ 		pub->pmucaps = val;
+ 	}
+@@ -1131,6 +1133,23 @@ struct brcmf_core *brcmf_chip_get_chipco
+ 	return &cc->pub;
+ }
+ 
++struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub)
++{
++	struct brcmf_core *cc = brcmf_chip_get_chipcommon(pub);
++	struct brcmf_core *pmu;
++
++	/* See if there is separated PMU core available */
++	if (cc->rev >= 35 &&
++	    pub->cc_caps_ext & BCMA_CC_CAP_EXT_AOB_PRESENT) {
++		pmu = brcmf_chip_get_core(pub, BCMA_CORE_PMU);
++		if (pmu)
++			return pmu;
++	}
++
++	/* Fallback to ChipCommon core for older hardware */
++	return cc;
++}
++
+ bool brcmf_chip_iscoreup(struct brcmf_core *pub)
+ {
+ 	struct brcmf_core_priv *core;
+@@ -1301,6 +1320,7 @@ bool brcmf_chip_sr_capable(struct brcmf_
+ {
+ 	u32 base, addr, reg, pmu_cc3_mask = ~0;
+ 	struct brcmf_chip_priv *chip;
++	struct brcmf_core *pmu = brcmf_chip_get_pmu(pub);
+ 
+ 	brcmf_dbg(TRACE, "Enter\n");
+ 
+@@ -1320,9 +1340,9 @@ bool brcmf_chip_sr_capable(struct brcmf_
+ 	case BRCM_CC_4335_CHIP_ID:
+ 	case BRCM_CC_4339_CHIP_ID:
+ 		/* read PMU chipcontrol register 3 */
+-		addr = CORE_CC_REG(base, chipcontrol_addr);
++		addr = CORE_CC_REG(pmu->base, chipcontrol_addr);
+ 		chip->ops->write32(chip->ctx, addr, 3);
+-		addr = CORE_CC_REG(base, chipcontrol_data);
++		addr = CORE_CC_REG(pmu->base, chipcontrol_data);
+ 		reg = chip->ops->read32(chip->ctx, addr);
+ 		return (reg & pmu_cc3_mask) != 0;
+ 	case BRCM_CC_43430_CHIP_ID:
+@@ -1330,12 +1350,12 @@ bool brcmf_chip_sr_capable(struct brcmf_
+ 		reg = chip->ops->read32(chip->ctx, addr);
+ 		return reg != 0;
+ 	default:
+-		addr = CORE_CC_REG(base, pmucapabilities_ext);
++		addr = CORE_CC_REG(pmu->base, pmucapabilities_ext);
+ 		reg = chip->ops->read32(chip->ctx, addr);
+ 		if ((reg & PCAPEXT_SR_SUPPORTED_MASK) == 0)
+ 			return false;
+ 
+-		addr = CORE_CC_REG(base, retention_ctl);
++		addr = CORE_CC_REG(pmu->base, retention_ctl);
+ 		reg = chip->ops->read32(chip->ctx, addr);
+ 		return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK |
+ 			       PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
+@@ -85,6 +85,7 @@ struct brcmf_chip *brcmf_chip_attach(voi
+ void brcmf_chip_detach(struct brcmf_chip *chip);
+ struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid);
+ struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip);
++struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub);
+ bool brcmf_chip_iscoreup(struct brcmf_core *core);
+ void brcmf_chip_coredisable(struct brcmf_core *core, u32 prereset, u32 reset);
+ void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset,
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+@@ -3615,7 +3615,6 @@ brcmf_sdio_drivestrengthinit(struct brcm
+ 	const struct sdiod_drive_str *str_tab = NULL;
+ 	u32 str_mask;
+ 	u32 str_shift;
+-	u32 base;
+ 	u32 i;
+ 	u32 drivestrength_sel = 0;
+ 	u32 cc_data_temp;
+@@ -3658,14 +3657,15 @@ brcmf_sdio_drivestrengthinit(struct brcm
+ 	}
+ 
+ 	if (str_tab != NULL) {
++		struct brcmf_core *pmu = brcmf_chip_get_pmu(ci);
++
+ 		for (i = 0; str_tab[i].strength != 0; i++) {
+ 			if (drivestrength >= str_tab[i].strength) {
+ 				drivestrength_sel = str_tab[i].sel;
+ 				break;
+ 			}
+ 		}
+-		base = brcmf_chip_get_chipcommon(ci)->base;
+-		addr = CORE_CC_REG(base, chipcontrol_addr);
++		addr = CORE_CC_REG(pmu->base, chipcontrol_addr);
+ 		brcmf_sdiod_regwl(sdiodev, addr, 1, NULL);
+ 		cc_data_temp = brcmf_sdiod_regrl(sdiodev, addr, NULL);
+ 		cc_data_temp &= ~str_mask;
+@@ -3835,8 +3835,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
+ 		goto fail;
+ 
+ 	/* set PMUControl so a backplane reset does PMU state reload */
+-	reg_addr = CORE_CC_REG(brcmf_chip_get_chipcommon(bus->ci)->base,
+-			       pmucontrol);
++	reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol);
+ 	reg_val = brcmf_sdiod_regrl(bus->sdiodev, reg_addr, &err);
+ 	if (err)
+ 		goto fail;
diff --git a/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch b/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch
new file mode 100644
index 0000000000000000000000000000000000000000..35887fcb59219270e0aedd6c9466956f9ba318f4
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch
@@ -0,0 +1,38 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 26 Jan 2016 17:57:05 +0100
+Subject: [PATCH] brcmfmac: add support for 14e4:4365 PCI ID with BCM4366
+ chipset
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+On Broadcom ARM routers BCM4366 cards are available with 14e4:4365 ID.
+Unfortunately this ID was already used by Broadcom for cards with
+BCM43142, a totally different chipset requiring SoftMAC driver. To avoid
+a conflict between brcmfmac and bcma use more specific ID entry with
+subvendor and subdevice specified.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+@@ -1951,6 +1951,9 @@ static const struct dev_pm_ops brcmf_pci
+ 
+ #define BRCMF_PCIE_DEVICE(dev_id)	{ BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
+ 	PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
++#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev)	{ \
++	BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
++	subvend, subdev, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
+ 
+ static struct pci_device_id brcmf_pcie_devid_table[] = {
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
+@@ -1966,6 +1969,7 @@ static struct pci_device_id brcmf_pcie_d
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID),
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID),
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID),
++	BRCMF_PCIE_DEVICE_SUB(0x4365, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4365),
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_DEVICE_ID),
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
+ 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
diff --git a/package/kernel/mac80211/patches/323-ath9k-add-multi_read-to-be-compatible-with-ath9k_htc.patch b/package/kernel/mac80211/patches/323-ath9k-add-multi_read-to-be-compatible-with-ath9k_htc.patch
deleted file mode 100644
index 246bb9d2951db955d8ec5dec3d2bc9548da871ff..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/323-ath9k-add-multi_read-to-be-compatible-with-ath9k_htc.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:50 +0100
-Subject: [PATCH] ath9k: add multi_read to be compatible with ath9k_htc
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -141,6 +141,16 @@ static unsigned int ath9k_ioread32(void
- 	return val;
- }
- 
-+static void ath9k_multi_ioread32(void *hw_priv, u32 *addr,
-+                                u32 *val, u16 count)
-+{
-+	int i;
-+
-+	for (i = 0; i < count; i++)
-+		val[i] = ath9k_ioread32(hw_priv, addr[i]);
-+}
-+
-+
- static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset,
- 				    u32 set, u32 clr)
- {
-@@ -530,6 +540,7 @@ static int ath9k_init_softc(u16 devid, s
- 	ah->hw = sc->hw;
- 	ah->hw_version.devid = devid;
- 	ah->reg_ops.read = ath9k_ioread32;
-+	ah->reg_ops.multi_read = ath9k_multi_ioread32;
- 	ah->reg_ops.write = ath9k_iowrite32;
- 	ah->reg_ops.rmw = ath9k_reg_rmw;
- 	pCap = &ah->caps;
diff --git a/package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch b/package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch
deleted file mode 100644
index 2eda1c9d25f5faff8f5a264f6106d22c4f093193..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/324-ath9k-add-new-function-ath9k_hw_read_array.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:51 +0100
-Subject: [PATCH] ath9k: add new function ath9k_hw_read_array
-
-REG_READ generate most overhead on usb bus. It send and read micro packages
-and reduce usb bandwidth. To reduce this overhead we should read in batches.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -121,6 +121,36 @@ void ath9k_hw_write_array(struct ath_hw
- 	REGWRITE_BUFFER_FLUSH(ah);
- }
- 
-+void ath9k_hw_read_array(struct ath_hw *ah, u32 array[][2], int size)
-+{
-+	u32 *tmp_reg_list, *tmp_data;
-+	int i;
-+
-+	tmp_reg_list = kmalloc(size * sizeof(u32), GFP_KERNEL);
-+	if (!tmp_reg_list) {
-+		dev_err(ah->dev, "%s: tmp_reg_list: alloc filed\n", __func__);
-+		return;
-+	}
-+
-+	tmp_data = kmalloc(size * sizeof(u32), GFP_KERNEL);
-+	if (!tmp_data) {
-+		dev_err(ah->dev, "%s tmp_data: alloc filed\n", __func__);
-+		goto error_tmp_data;
-+	}
-+
-+	for (i = 0; i < size; i++)
-+		tmp_reg_list[i] = array[i][0];
-+
-+	REG_READ_MULTI(ah, tmp_reg_list, tmp_data, size);
-+
-+	for (i = 0; i < size; i++)
-+		array[i][1] = tmp_data[i];
-+
-+	kfree(tmp_data);
-+error_tmp_data:
-+	kfree(tmp_reg_list);
-+}
-+
- u32 ath9k_hw_reverse_bits(u32 val, u32 n)
- {
- 	u32 retval;
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -138,6 +138,8 @@
- 
- #define REG_WRITE_ARRAY(iniarray, column, regWr) \
- 	ath9k_hw_write_array(ah, iniarray, column, &(regWr))
-+#define REG_READ_ARRAY(ah, array, size) \
-+	ath9k_hw_read_array(ah, array, size)
- 
- #define AR_GPIO_OUTPUT_MUX_AS_OUTPUT             0
- #define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
-@@ -1020,6 +1022,7 @@ void ath9k_hw_synth_delay(struct ath_hw
- bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout);
- void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
- 			  int column, unsigned int *writecnt);
-+void ath9k_hw_read_array(struct ath_hw *ah, u32 array[][2], int size);
- u32 ath9k_hw_reverse_bits(u32 val, u32 n);
- u16 ath9k_hw_computetxtime(struct ath_hw *ah,
- 			   u8 phy, int kbps,
diff --git a/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch b/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6ce60f19608abcc89a27c6cebfbb90806b58a503
--- /dev/null
+++ b/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch
@@ -0,0 +1,32 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Sun, 31 Jan 2016 12:14:34 +0100
+Subject: [PATCH] brcmfmac: treat NULL character in NVRAM as separator
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Platform NVRAM (stored on a flash partition) has entries separated by a
+NULL (\0) char. Our parsing code switches from VALUE state to IDLE
+whenever it meets a NULL (\0). When that happens our IDLE handler should
+simply consume it and analyze whatever is placed ahead.
+
+This fixes harmless warnings spamming debugging output:
+[  155.165624] brcmfmac: brcmf_nvram_handle_idle warning: ln=1:col=20: ignoring invalid character
+[  155.180806] brcmfmac: brcmf_nvram_handle_idle warning: ln=1:col=44: ignoring invalid character
+[  155.195971] brcmfmac: brcmf_nvram_handle_idle warning: ln=1:col=63: ignoring invalid character
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
+@@ -93,7 +93,7 @@ static enum nvram_parser_state brcmf_nvr
+ 	c = nvp->data[nvp->pos];
+ 	if (c == '\n')
+ 		return COMMENT;
+-	if (is_whitespace(c))
++	if (is_whitespace(c) || c == '\0')
+ 		goto proceed;
+ 	if (c == '#')
+ 		return COMMENT;
diff --git a/package/kernel/mac80211/patches/325-ath9k-ar9271_hw_pa_cal-use-REG_READ_ARRAY.patch b/package/kernel/mac80211/patches/325-ath9k-ar9271_hw_pa_cal-use-REG_READ_ARRAY.patch
deleted file mode 100644
index 4e4888fd0712a58a6ec3055343d016f7ef273153..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/325-ath9k-ar9271_hw_pa_cal-use-REG_READ_ARRAY.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:52 +0100
-Subject: [PATCH] ath9k: ar9271_hw_pa_cal: use REG_READ_ARRAY
-
-insted of reading each register separatly
-and waste 4ms on each operation, we can
-use one shot read.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
-@@ -440,8 +440,7 @@ static void ar9271_hw_pa_cal(struct ath_
- 		{ AR9285_AN_RF2G3, 0 },
- 	};
- 
--	for (i = 0; i < ARRAY_SIZE(regList); i++)
--		regList[i][1] = REG_READ(ah, regList[i][0]);
-+	REG_READ_ARRAY(ah, regList, ARRAY_SIZE(regList));
- 
- 	ENABLE_REG_RMW_BUFFER(ah);
- 	/* 7834, b1=0 */
diff --git a/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch b/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch
new file mode 100644
index 0000000000000000000000000000000000000000..012dea1e3a995d0118faea99f994da117e16293d
--- /dev/null
+++ b/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch
@@ -0,0 +1,41 @@
+From: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+Date: Mon, 25 Jan 2016 11:47:29 +0100
+Subject: [PATCH] brcmfmac: sdio: Increase the default timeouts a bit
+
+On a Radxa Rock2 board with a Ampak AP6335 (Broadcom 4339 core) it seems
+the card responds very quickly most of the time, unfortunately during
+initialisation it sometimes seems to take just a bit over 2 seconds to
+respond.
+
+This results intialization failing with message like:
+  brcmf_c_preinit_dcmds: Retreiving cur_etheraddr failed, -52
+  brcmf_bus_start: failed: -52
+  brcmf_sdio_firmware_callback: dongle is not responding
+
+Increasing the timeout to allow for a bit more headroom allows the
+card to initialize reliably.
+
+A quick search online after diagnosing/fixing this showed that Google
+has a similar patch in their ChromeOS tree, so this doesn't seem
+specific to the board I'm using.
+
+Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+Reviewed-by: Julian Calaby <julian.calaby@gmail.com>
+Acked-by: Arend van Spriel <arend@broadcom.com>
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+@@ -45,8 +45,8 @@
+ #include "chip.h"
+ #include "firmware.h"
+ 
+-#define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2000)
+-#define CTL_DONE_TIMEOUT	msecs_to_jiffies(2000)
++#define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2500)
++#define CTL_DONE_TIMEOUT	msecs_to_jiffies(2500)
+ 
+ #ifdef DEBUG
+ 
diff --git a/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch b/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch
new file mode 100644
index 0000000000000000000000000000000000000000..71f7a4043304e4120bfb1fdfa3744a2ebd53ac54
--- /dev/null
+++ b/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch
@@ -0,0 +1,87 @@
+From: Miaoqing Pan <miaoqing@codeaurora.org>
+Date: Fri, 5 Feb 2016 09:45:50 +0800
+Subject: [PATCH] ath9k: make NF load complete quickly and reliably
+
+Make NF load complete quickly and reliably. NF load execution
+is delayed by HW to end of frame if frame Rx or Tx is ongoing.
+Increasing timeout to max frame duration. If NF cal is ongoing
+before NF load, stop it before load, and restart it afterwards.
+
+Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/calib.c
++++ b/drivers/net/wireless/ath/ath9k/calib.c
+@@ -241,6 +241,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 	u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
+ 	struct ath_common *common = ath9k_hw_common(ah);
+ 	s16 default_nf = ath9k_hw_get_default_nf(ah, chan);
++	u32 bb_agc_ctl = REG_READ(ah, AR_PHY_AGC_CONTROL);
+ 
+ 	if (ah->caldata)
+ 		h = ah->caldata->nfCalHist;
+@@ -264,6 +265,16 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 	}
+ 
+ 	/*
++	 * stop NF cal if ongoing to ensure NF load completes immediately
++	 * (or after end rx/tx frame if ongoing)
++	 */
++	if (bb_agc_ctl & AR_PHY_AGC_CONTROL_NF) {
++		REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
++		REG_RMW_BUFFER_FLUSH(ah);
++		ENABLE_REG_RMW_BUFFER(ah);
++	}
++
++	/*
+ 	 * Load software filtered NF value into baseband internal minCCApwr
+ 	 * variable.
+ 	 */
+@@ -276,18 +287,33 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 
+ 	/*
+ 	 * Wait for load to complete, should be fast, a few 10s of us.
+-	 * The max delay was changed from an original 250us to 10000us
+-	 * since 250us often results in NF load timeout and causes deaf
+-	 * condition during stress testing 12/12/2009
++	 * The max delay was changed from an original 250us to 22.2 msec.
++	 * This would increase timeout to the longest possible frame
++	 * (11n max length 22.1 msec)
+ 	 */
+-	for (j = 0; j < 10000; j++) {
++	for (j = 0; j < 22200; j++) {
+ 		if ((REG_READ(ah, AR_PHY_AGC_CONTROL) &
+-		     AR_PHY_AGC_CONTROL_NF) == 0)
++			      AR_PHY_AGC_CONTROL_NF) == 0)
+ 			break;
+ 		udelay(10);
+ 	}
+ 
+ 	/*
++	 * Restart NF so it can continue.
++	 */
++	if (bb_agc_ctl & AR_PHY_AGC_CONTROL_NF) {
++		ENABLE_REG_RMW_BUFFER(ah);
++		if (bb_agc_ctl & AR_PHY_AGC_CONTROL_ENABLE_NF)
++			REG_SET_BIT(ah, AR_PHY_AGC_CONTROL,
++				    AR_PHY_AGC_CONTROL_ENABLE_NF);
++		if (bb_agc_ctl & AR_PHY_AGC_CONTROL_NO_UPDATE_NF)
++			REG_SET_BIT(ah, AR_PHY_AGC_CONTROL,
++				    AR_PHY_AGC_CONTROL_NO_UPDATE_NF);
++		REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
++		REG_RMW_BUFFER_FLUSH(ah);
++	}
++
++	/*
+ 	 * We timed out waiting for the noisefloor to load, probably due to an
+ 	 * in-progress rx. Simply return here and allow the load plenty of time
+ 	 * to complete before the next calibration interval.  We need to avoid
+@@ -296,7 +322,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
+ 	 * here, the baseband nf cal will just be capped by our present
+ 	 * noisefloor until the next calibration timer.
+ 	 */
+-	if (j == 10000) {
++	if (j == 22200) {
+ 		ath_dbg(common, ANY,
+ 			"Timeout while waiting for nf to load: AR_PHY_AGC_CONTROL=0x%x\n",
+ 			REG_READ(ah, AR_PHY_AGC_CONTROL));
diff --git a/package/kernel/mac80211/patches/326-ath9k-use-one-shot-read-in-ath9k_hw_update_mibstats.patch b/package/kernel/mac80211/patches/326-ath9k-use-one-shot-read-in-ath9k_hw_update_mibstats.patch
deleted file mode 100644
index a22cd1d490a8311ccac9679ff7a0749eb95526f5..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/326-ath9k-use-one-shot-read-in-ath9k_hw_update_mibstats.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:53 +0100
-Subject: [PATCH] ath9k: use one shot read in ath9k_hw_update_mibstats
-
-this will reduce some overhead on usb bus.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/ani.c
-+++ b/drivers/net/wireless/ath/ath9k/ani.c
-@@ -107,11 +107,21 @@ static const struct ani_cck_level_entry
- static void ath9k_hw_update_mibstats(struct ath_hw *ah,
- 				     struct ath9k_mib_stats *stats)
- {
--	stats->ackrcv_bad += REG_READ(ah, AR_ACK_FAIL);
--	stats->rts_bad += REG_READ(ah, AR_RTS_FAIL);
--	stats->fcs_bad += REG_READ(ah, AR_FCS_FAIL);
--	stats->rts_good += REG_READ(ah, AR_RTS_OK);
--	stats->beacons += REG_READ(ah, AR_BEACON_CNT);
-+	u32 addr[5] = {AR_RTS_OK, AR_RTS_FAIL, AR_ACK_FAIL,
-+		       AR_FCS_FAIL, AR_BEACON_CNT};
-+	u32 data[5];
-+
-+	REG_READ_MULTI(ah, &addr[0], &data[0], 5);
-+	/* AR_RTS_OK */
-+	stats->rts_good += data[0];
-+	/* AR_RTS_FAIL */
-+	stats->rts_bad += data[1];
-+	/* AR_ACK_FAIL */
-+	stats->ackrcv_bad += data[2];
-+	/* AR_FCS_FAIL */
-+	stats->fcs_bad += data[3];
-+	/* AR_BEACON_CNT */
-+	stats->beacons += data[4];
- }
- 
- static void ath9k_ani_restart(struct ath_hw *ah)
diff --git a/package/kernel/mac80211/patches/327-ath9k-ath9k_hw_loadnf-use-REG_RMW.patch b/package/kernel/mac80211/patches/327-ath9k-ath9k_hw_loadnf-use-REG_RMW.patch
deleted file mode 100644
index e5a362ffa6932fc7292cc8277aeffbba79d8c3e9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/327-ath9k-ath9k_hw_loadnf-use-REG_RMW.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:54 +0100
-Subject: [PATCH] ath9k: ath9k_hw_loadnf: use REG_RMW
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/calib.c
-+++ b/drivers/net/wireless/ath/ath9k/calib.c
-@@ -238,7 +238,6 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
- {
- 	struct ath9k_nfcal_hist *h = NULL;
- 	unsigned i, j;
--	int32_t val;
- 	u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
- 	struct ath_common *common = ath9k_hw_common(ah);
- 	s16 default_nf = ath9k_hw_get_default_nf(ah, chan);
-@@ -246,6 +245,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
- 	if (ah->caldata)
- 		h = ah->caldata->nfCalHist;
- 
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	for (i = 0; i < NUM_NF_READINGS; i++) {
- 		if (chainmask & (1 << i)) {
- 			s16 nfval;
-@@ -258,10 +258,8 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
- 			else
- 				nfval = default_nf;
- 
--			val = REG_READ(ah, ah->nf_regs[i]);
--			val &= 0xFFFFFE00;
--			val |= (((u32) nfval << 1) & 0x1ff);
--			REG_WRITE(ah, ah->nf_regs[i], val);
-+			REG_RMW(ah, ah->nf_regs[i],
-+				(((u32) nfval << 1) & 0x1ff), 0x1ff);
- 		}
- 	}
- 
-@@ -274,6 +272,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
- 	REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
- 		    AR_PHY_AGC_CONTROL_NO_UPDATE_NF);
- 	REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
-+	REG_RMW_BUFFER_FLUSH(ah);
- 
- 	/*
- 	 * Wait for load to complete, should be fast, a few 10s of us.
-@@ -309,19 +308,17 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s
- 	 * by the median we just loaded.  This will be initial (and max) value
- 	 * of next noise floor calibration the baseband does.
- 	 */
--	ENABLE_REGWRITE_BUFFER(ah);
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	for (i = 0; i < NUM_NF_READINGS; i++) {
- 		if (chainmask & (1 << i)) {
- 			if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan))
- 				continue;
- 
--			val = REG_READ(ah, ah->nf_regs[i]);
--			val &= 0xFFFFFE00;
--			val |= (((u32) (-50) << 1) & 0x1ff);
--			REG_WRITE(ah, ah->nf_regs[i], val);
-+			REG_RMW(ah, ah->nf_regs[i],
-+					(((u32) (-50) << 1) & 0x1ff), 0x1ff);
- 		}
- 	}
--	REGWRITE_BUFFER_FLUSH(ah);
-+	REG_RMW_BUFFER_FLUSH(ah);
- 
- 	return 0;
- }
diff --git a/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch b/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f7f9df946a462b5ede16dc61f49f2731ae444af6
--- /dev/null
+++ b/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch
@@ -0,0 +1,54 @@
+From: Henning Rogge <hrogge@gmail.com>
+Date: Wed, 3 Feb 2016 13:58:36 +0100
+Subject: [PATCH] mac80211: Remove MPP table entries with MPath
+
+Make the mesh_path_del() function remove all mpp table entries
+that are proxied by the removed mesh path.
+
+Acked-by: Bob Copeland <me@bobcopeland.com>
+Signed-off-by: Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/mesh_pathtbl.c
++++ b/net/mac80211/mesh_pathtbl.c
+@@ -835,6 +835,29 @@ void mesh_path_flush_by_nexthop(struct s
+ 	rcu_read_unlock();
+ }
+ 
++static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
++			       const u8 *proxy)
++{
++	struct mesh_table *tbl;
++	struct mesh_path *mpp;
++	struct mpath_node *node;
++	int i;
++
++	rcu_read_lock();
++	read_lock_bh(&pathtbl_resize_lock);
++	tbl = resize_dereference_mpp_paths();
++	for_each_mesh_entry(tbl, node, i) {
++		mpp = node->mpath;
++		if (ether_addr_equal(mpp->mpp, proxy)) {
++			spin_lock(&tbl->hashwlock[i]);
++			__mesh_path_del(tbl, node);
++			spin_unlock(&tbl->hashwlock[i]);
++		}
++	}
++	read_unlock_bh(&pathtbl_resize_lock);
++	rcu_read_unlock();
++}
++
+ static void table_flush_by_iface(struct mesh_table *tbl,
+ 				 struct ieee80211_sub_if_data *sdata)
+ {
+@@ -892,6 +915,9 @@ int mesh_path_del(struct ieee80211_sub_i
+ 	int hash_idx;
+ 	int err = 0;
+ 
++	/* flush relevant mpp entries first */
++	mpp_flush_by_proxy(sdata, addr);
++
+ 	read_lock_bh(&pathtbl_resize_lock);
+ 	tbl = resize_dereference_mesh_paths();
+ 	hash_idx = mesh_table_hash(addr, sdata, tbl);
diff --git a/package/kernel/mac80211/patches/328-ath9k-write-buffer-related-optimisation-in-ar5008_hw.patch b/package/kernel/mac80211/patches/328-ath9k-write-buffer-related-optimisation-in-ar5008_hw.patch
deleted file mode 100644
index 01c801123e148e9047bf8a9a86dbd2afcbadea3b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/328-ath9k-write-buffer-related-optimisation-in-ar5008_hw.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:55 +0100
-Subject: [PATCH] ath9k: write buffer related optimisation in
- ar5008_hw_set_channel_regs
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -681,12 +681,13 @@ static void ar5008_hw_set_channel_regs(s
- 			phymode |= AR_PHY_FC_DYN2040_PRI_CH;
- 
- 	}
-+	ENABLE_REGWRITE_BUFFER(ah);
- 	REG_WRITE(ah, AR_PHY_TURBO, phymode);
- 
-+	/* This function do only REG_WRITE, so
-+	 * we can include it to REGWRITE_BUFFER. */
- 	ath9k_hw_set11nmac2040(ah, chan);
- 
--	ENABLE_REGWRITE_BUFFER(ah);
--
- 	REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S);
- 	REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S);
- 
diff --git a/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch b/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch
new file mode 100644
index 0000000000000000000000000000000000000000..740993c9e0284e5d03a9036ac87fd7548b22ab3b
--- /dev/null
+++ b/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch
@@ -0,0 +1,104 @@
+From: Henning Rogge <hrogge@gmail.com>
+Date: Wed, 3 Feb 2016 13:58:37 +0100
+Subject: [PATCH] mac80211: let unused MPP table entries timeout
+
+Remember the last time when a mpp table entry is used for
+rx or tx and remove them after MESH_PATH_EXPIRE time.
+
+Acked-by: Bob Copeland <me@bobcopeland.com>
+Signed-off-by: Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/mesh_pathtbl.c
++++ b/net/mac80211/mesh_pathtbl.c
+@@ -942,6 +942,46 @@ enddel:
+ }
+ 
+ /**
++ * mpp_path_del - delete a mesh proxy path from the table
++ *
++ * @addr: addr address (ETH_ALEN length)
++ * @sdata: local subif
++ *
++ * Returns: 0 if successful
++ */
++static int mpp_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
++{
++	struct mesh_table *tbl;
++	struct mesh_path *mpath;
++	struct mpath_node *node;
++	struct hlist_head *bucket;
++	int hash_idx;
++	int err = 0;
++
++	read_lock_bh(&pathtbl_resize_lock);
++	tbl = resize_dereference_mpp_paths();
++	hash_idx = mesh_table_hash(addr, sdata, tbl);
++	bucket = &tbl->hash_buckets[hash_idx];
++
++	spin_lock(&tbl->hashwlock[hash_idx]);
++	hlist_for_each_entry(node, bucket, list) {
++		mpath = node->mpath;
++		if (mpath->sdata == sdata &&
++		    ether_addr_equal(addr, mpath->dst)) {
++			__mesh_path_del(tbl, node);
++			goto enddel;
++		}
++	}
++
++	err = -ENXIO;
++enddel:
++	mesh_paths_generation++;
++	spin_unlock(&tbl->hashwlock[hash_idx]);
++	read_unlock_bh(&pathtbl_resize_lock);
++	return err;
++}
++
++/**
+  * mesh_path_tx_pending - sends pending frames in a mesh path queue
+  *
+  * @mpath: mesh path to activate
+@@ -1157,6 +1197,17 @@ void mesh_path_expire(struct ieee80211_s
+ 		     time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE))
+ 			mesh_path_del(mpath->sdata, mpath->dst);
+ 	}
++
++	tbl = rcu_dereference(mpp_paths);
++	for_each_mesh_entry(tbl, node, i) {
++		if (node->mpath->sdata != sdata)
++			continue;
++		mpath = node->mpath;
++		if ((!(mpath->flags & MESH_PATH_FIXED)) &&
++		    time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE))
++			mpp_path_del(mpath->sdata, mpath->dst);
++	}
++
+ 	rcu_read_unlock();
+ }
+ 
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2291,6 +2291,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
+ 			spin_lock_bh(&mppath->state_lock);
+ 			if (!ether_addr_equal(mppath->mpp, mpp_addr))
+ 				memcpy(mppath->mpp, mpp_addr, ETH_ALEN);
++			mppath->exp_time = jiffies;
+ 			spin_unlock_bh(&mppath->state_lock);
+ 		}
+ 		rcu_read_unlock();
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -2171,8 +2171,11 @@ static struct sk_buff *ieee80211_build_h
+ 					mpp_lookup = true;
+ 			}
+ 
+-			if (mpp_lookup)
++			if (mpp_lookup) {
+ 				mppath = mpp_path_lookup(sdata, skb->data);
++				if (mppath)
++					mppath->exp_time = jiffies;
++			}
+ 
+ 			if (mppath && mpath)
+ 				mesh_path_del(mpath->sdata, mpath->dst);
diff --git a/package/kernel/mac80211/patches/329-ath9k-ath9k_hw_set_4k_power_cal_tabl-use-rmw-buffer.patch b/package/kernel/mac80211/patches/329-ath9k-ath9k_hw_set_4k_power_cal_tabl-use-rmw-buffer.patch
deleted file mode 100644
index e5219f281bfb1464b08dc8c87b367733cfcfb881..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/329-ath9k-ath9k_hw_set_4k_power_cal_tabl-use-rmw-buffer.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:56 +0100
-Subject: [PATCH] ath9k: ath9k_hw_set_4k_power_cal_tabl: use rmw buffer
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-@@ -389,6 +389,7 @@ static void ath9k_hw_set_4k_power_cal_ta
- 		}
- 	}
- 
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN,
- 		      (numXpdGain - 1) & 0x3);
- 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1,
-@@ -396,6 +397,7 @@ static void ath9k_hw_set_4k_power_cal_ta
- 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2,
- 		      xpdGainValues[1]);
- 	REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, 0);
-+	REG_RMW_BUFFER_FLUSH(ah);
- 
- 	for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) {
- 		regChainOffset = i * 0x1000;
diff --git a/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch b/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0c36b1d5687447021eaa560d08b16580351b4a20
--- /dev/null
+++ b/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch
@@ -0,0 +1,143 @@
+From: Henning Rogge <hrogge@gmail.com>
+Date: Wed, 3 Feb 2016 13:58:38 +0100
+Subject: [PATCH] mac80211: Unify mesh and mpp path removal function
+
+mpp_path_del() and mesh_path_del() are mostly the same function.
+Move common code into a new static function.
+
+Acked-by: Bob Copeland <me@bobcopeland.com>
+Signed-off-by: Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/mesh_pathtbl.c
++++ b/net/mac80211/mesh_pathtbl.c
+@@ -55,16 +55,21 @@ int mpp_paths_generation;
+ static DEFINE_RWLOCK(pathtbl_resize_lock);
+ 
+ 
++static inline struct mesh_table *resize_dereference_paths(
++	struct mesh_table __rcu *table)
++{
++	return rcu_dereference_protected(table,
++					lockdep_is_held(&pathtbl_resize_lock));
++}
++
+ static inline struct mesh_table *resize_dereference_mesh_paths(void)
+ {
+-	return rcu_dereference_protected(mesh_paths,
+-		lockdep_is_held(&pathtbl_resize_lock));
++	return resize_dereference_paths(mesh_paths);
+ }
+ 
+ static inline struct mesh_table *resize_dereference_mpp_paths(void)
+ {
+-	return rcu_dereference_protected(mpp_paths,
+-		lockdep_is_held(&pathtbl_resize_lock));
++	return resize_dereference_paths(mpp_paths);
+ }
+ 
+ /*
+@@ -899,14 +904,17 @@ void mesh_path_flush_by_iface(struct iee
+ }
+ 
+ /**
+- * mesh_path_del - delete a mesh path from the table
++ * table_path_del - delete a path from the mesh or mpp table
+  *
+- * @addr: dst address (ETH_ALEN length)
++ * @tbl: mesh or mpp path table
+  * @sdata: local subif
++ * @addr: dst address (ETH_ALEN length)
+  *
+  * Returns: 0 if successful
+  */
+-int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
++static int table_path_del(struct mesh_table __rcu *rcu_tbl,
++			  struct ieee80211_sub_if_data *sdata,
++			  const u8 *addr)
+ {
+ 	struct mesh_table *tbl;
+ 	struct mesh_path *mpath;
+@@ -915,11 +923,7 @@ int mesh_path_del(struct ieee80211_sub_i
+ 	int hash_idx;
+ 	int err = 0;
+ 
+-	/* flush relevant mpp entries first */
+-	mpp_flush_by_proxy(sdata, addr);
+-
+-	read_lock_bh(&pathtbl_resize_lock);
+-	tbl = resize_dereference_mesh_paths();
++	tbl = resize_dereference_paths(rcu_tbl);
+ 	hash_idx = mesh_table_hash(addr, sdata, tbl);
+ 	bucket = &tbl->hash_buckets[hash_idx];
+ 
+@@ -935,9 +939,30 @@ int mesh_path_del(struct ieee80211_sub_i
+ 
+ 	err = -ENXIO;
+ enddel:
+-	mesh_paths_generation++;
+ 	spin_unlock(&tbl->hashwlock[hash_idx]);
++	return err;
++}
++
++/**
++ * mesh_path_del - delete a mesh path from the table
++ *
++ * @addr: dst address (ETH_ALEN length)
++ * @sdata: local subif
++ *
++ * Returns: 0 if successful
++ */
++int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
++{
++	int err = 0;
++
++	/* flush relevant mpp entries first */
++	mpp_flush_by_proxy(sdata, addr);
++
++	read_lock_bh(&pathtbl_resize_lock);
++	err = table_path_del(mesh_paths, sdata, addr);
++	mesh_paths_generation++;
+ 	read_unlock_bh(&pathtbl_resize_lock);
++
+ 	return err;
+ }
+ 
+@@ -951,33 +976,13 @@ enddel:
+  */
+ static int mpp_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
+ {
+-	struct mesh_table *tbl;
+-	struct mesh_path *mpath;
+-	struct mpath_node *node;
+-	struct hlist_head *bucket;
+-	int hash_idx;
+ 	int err = 0;
+ 
+ 	read_lock_bh(&pathtbl_resize_lock);
+-	tbl = resize_dereference_mpp_paths();
+-	hash_idx = mesh_table_hash(addr, sdata, tbl);
+-	bucket = &tbl->hash_buckets[hash_idx];
+-
+-	spin_lock(&tbl->hashwlock[hash_idx]);
+-	hlist_for_each_entry(node, bucket, list) {
+-		mpath = node->mpath;
+-		if (mpath->sdata == sdata &&
+-		    ether_addr_equal(addr, mpath->dst)) {
+-			__mesh_path_del(tbl, node);
+-			goto enddel;
+-		}
+-	}
+-
+-	err = -ENXIO;
+-enddel:
+-	mesh_paths_generation++;
+-	spin_unlock(&tbl->hashwlock[hash_idx]);
++	err = table_path_del(mpp_paths, sdata, addr);
++	mpp_paths_generation++;
+ 	read_unlock_bh(&pathtbl_resize_lock);
++
+ 	return err;
+ }
+ 
diff --git a/package/kernel/mac80211/patches/330-ath9k-use-rmw-buffer-in-ath9k_hw_set_operating_mode-.patch b/package/kernel/mac80211/patches/330-ath9k-use-rmw-buffer-in-ath9k_hw_set_operating_mode-.patch
deleted file mode 100644
index 6ce3f40f05d5d1e98e0c81065710893d3a015cd1..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/330-ath9k-use-rmw-buffer-in-ath9k_hw_set_operating_mode-.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:57 +0100
-Subject: [PATCH] ath9k: use rmw buffer in ath9k_hw_set_operating_mode
- and ath9k_hw_reset
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1227,6 +1227,7 @@ static void ath9k_hw_set_operating_mode(
- 	u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC;
- 	u32 set = AR_STA_ID1_KSRCH_MODE;
- 
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	switch (opmode) {
- 	case NL80211_IFTYPE_ADHOC:
- 		if (!AR_SREV_9340_13(ah)) {
-@@ -1248,6 +1249,7 @@ static void ath9k_hw_set_operating_mode(
- 		break;
- 	}
- 	REG_RMW(ah, AR_STA_ID1, set, mask);
-+	REG_RMW_BUFFER_FLUSH(ah);
- }
- 
- void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
-@@ -1960,6 +1962,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
- 	if (!ath9k_hw_mci_is_enabled(ah))
- 		REG_WRITE(ah, AR_OBS, 8);
- 
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	if (ah->config.rx_intr_mitigation) {
- 		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, ah->config.rimt_last);
- 		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, ah->config.rimt_first);
-@@ -1969,6 +1972,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
- 		REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300);
- 		REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750);
- 	}
-+	REG_RMW_BUFFER_FLUSH(ah);
- 
- 	ath9k_hw_init_bb(ah, chan);
- 
diff --git a/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch b/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4dc6d663ed7af432b5d26338ef74732abe6aa31c
--- /dev/null
+++ b/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch
@@ -0,0 +1,51 @@
+From: Sven Eckelmann <sven.eckelmann@open-mesh.com>
+Date: Tue, 2 Feb 2016 08:12:26 +0100
+Subject: [PATCH] mac80211: minstrel: Change expected throughput unit back to
+ Kbps
+
+The change from cur_tp to the function
+minstrel_get_tp_avg/minstrel_ht_get_tp_avg changed the unit used for the
+current throughput. For example in minstrel_ht the correct
+conversion between them would be:
+
+    mrs->cur_tp / 10 == minstrel_ht_get_tp_avg(..).
+
+This factor 10 must also be included in the calculation of
+minstrel_get_expected_throughput and minstrel_ht_get_expected_throughput to
+return values with the unit [Kbps] instead of [10Kbps]. Otherwise routing
+algorithms like B.A.T.M.A.N. V will make incorrect decision based on these
+values. Its kernel based implementation expects expected_throughput always
+to have the unit [Kbps] and not sometimes [10Kbps] and sometimes [Kbps].
+
+The same requirement has iw or olsrdv2's nl80211 based statistics module
+which retrieve the same data via NL80211_STA_INFO_TX_BITRATE.
+
+Cc: stable@vger.kernel.org
+Fixes: 6a27b2c40b48 ("mac80211: restructure per-rate throughput calculation into function")
+Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/rc80211_minstrel.c
++++ b/net/mac80211/rc80211_minstrel.c
+@@ -711,7 +711,7 @@ static u32 minstrel_get_expected_through
+ 	 * computing cur_tp
+ 	 */
+ 	tmp_mrs = &mi->r[idx].stats;
+-	tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_ewma);
++	tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_ewma) * 10;
+ 	tmp_cur_tp = tmp_cur_tp * 1200 * 8 / 1024;
+ 
+ 	return tmp_cur_tp;
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -1335,7 +1335,8 @@ static u32 minstrel_ht_get_expected_thro
+ 	prob = mi->groups[i].rates[j].prob_ewma;
+ 
+ 	/* convert tp_avg from pkt per second in kbps */
+-	tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * AVG_PKT_SIZE * 8 / 1024;
++	tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * 10;
++	tp_avg = tp_avg * AVG_PKT_SIZE * 8 / 1024;
+ 
+ 	return tp_avg;
+ }
diff --git a/package/kernel/mac80211/patches/331-ath9k-ath9k_hw_4k_set_board_values-use-rmw-buffer.patch b/package/kernel/mac80211/patches/331-ath9k-ath9k_hw_4k_set_board_values-use-rmw-buffer.patch
deleted file mode 100644
index edd6160fa6229fa1984d555379fb5d6edd5d56f9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/331-ath9k-ath9k_hw_4k_set_board_values-use-rmw-buffer.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:58 +0100
-Subject: [PATCH] ath9k: ath9k_hw_4k_set_board_values: use rmw buffer
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-@@ -1082,6 +1082,7 @@ static void ath9k_hw_4k_set_board_values
- 		mask = BIT(0)|BIT(5)|BIT(10)|BIT(15)|BIT(20)|BIT(25);
- 		pwrctrl = mask * bb_desired_scale;
- 		clr = mask * 0x1f;
-+		ENABLE_REG_RMW_BUFFER(ah);
- 		REG_RMW(ah, AR_PHY_TX_PWRCTRL8, pwrctrl, clr);
- 		REG_RMW(ah, AR_PHY_TX_PWRCTRL10, pwrctrl, clr);
- 		REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL12, pwrctrl, clr);
-@@ -1096,6 +1097,7 @@ static void ath9k_hw_4k_set_board_values
- 		clr = mask * 0x1f;
- 		REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL11, pwrctrl, clr);
- 		REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL13, pwrctrl, clr);
-+		REG_RMW_BUFFER_FLUSH(ah);
- 	}
- }
- 
diff --git a/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch b/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1fd016f7f6bc9ad7bd4265e16a439b4de33b8f9c
--- /dev/null
+++ b/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch
@@ -0,0 +1,307 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Sun, 7 Feb 2016 18:08:24 +0100
+Subject: [PATCH] brcmfmac: Increase nr of supported flowrings.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+New generation devices have firmware which has more than 256 flowrings.
+E.g. following debugging message comes from 14e4:4365 BCM4366:
+[  194.606245] brcmfmac: brcmf_pcie_init_ringbuffers Nr of flowrings is 264
+
+At various code places (related to flowrings) we were using u8 which
+could lead to storing wrong number or infinite loops when indexing with
+this type. This issue was quite easy to spot in brcmf_flowring_detach
+where it led to infinite loop e.g. on failed initialization.
+
+This patch switches code to proper types and increases the maximum
+number of supported flowrings to 512.
+
+Originally this change was sent in September 2015, but back it was
+causing a regression on BCM43602 resulting in:
+Unable to handle kernel NULL pointer dereference at virtual address ...
+
+The reason for this regression was missing update (s/u8/u16) of struct
+brcmf_flowring_ring. This problem was handled in 9f64df9 ("brcmfmac: Fix
+bug in flowring management."). Starting with that it's safe to apply
+this original patch as it doesn't cause a regression anymore.
+
+This patch fixes an infinite loop on BCM4366 which is supported since
+4.4 so it makes sense to apply it to stable 4.4+.
+
+Cc: <stable@vger.kernel.org> # 4.4+
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
+@@ -32,7 +32,7 @@
+ #define BRCMF_FLOWRING_LOW		(BRCMF_FLOWRING_HIGH - 256)
+ #define BRCMF_FLOWRING_INVALID_IFIDX	0xff
+ 
+-#define BRCMF_FLOWRING_HASH_AP(da, fifo, ifidx) (da[5] + fifo + ifidx * 16)
++#define BRCMF_FLOWRING_HASH_AP(da, fifo, ifidx) (da[5] * 2 + fifo + ifidx * 16)
+ #define BRCMF_FLOWRING_HASH_STA(fifo, ifidx) (fifo + ifidx * 16)
+ 
+ static const u8 brcmf_flowring_prio2fifo[] = {
+@@ -68,7 +68,7 @@ u32 brcmf_flowring_lookup(struct brcmf_f
+ 			  u8 prio, u8 ifidx)
+ {
+ 	struct brcmf_flowring_hash *hash;
+-	u8 hash_idx;
++	u16 hash_idx;
+ 	u32 i;
+ 	bool found;
+ 	bool sta;
+@@ -88,6 +88,7 @@ u32 brcmf_flowring_lookup(struct brcmf_f
+ 	}
+ 	hash_idx =  sta ? BRCMF_FLOWRING_HASH_STA(fifo, ifidx) :
+ 			  BRCMF_FLOWRING_HASH_AP(mac, fifo, ifidx);
++	hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1);
+ 	found = false;
+ 	hash = flow->hash;
+ 	for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) {
+@@ -98,6 +99,7 @@ u32 brcmf_flowring_lookup(struct brcmf_f
+ 			break;
+ 		}
+ 		hash_idx++;
++		hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1);
+ 	}
+ 	if (found)
+ 		return hash[hash_idx].flowid;
+@@ -111,7 +113,7 @@ u32 brcmf_flowring_create(struct brcmf_f
+ {
+ 	struct brcmf_flowring_ring *ring;
+ 	struct brcmf_flowring_hash *hash;
+-	u8 hash_idx;
++	u16 hash_idx;
+ 	u32 i;
+ 	bool found;
+ 	u8 fifo;
+@@ -131,6 +133,7 @@ u32 brcmf_flowring_create(struct brcmf_f
+ 	}
+ 	hash_idx =  sta ? BRCMF_FLOWRING_HASH_STA(fifo, ifidx) :
+ 			  BRCMF_FLOWRING_HASH_AP(mac, fifo, ifidx);
++	hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1);
+ 	found = false;
+ 	hash = flow->hash;
+ 	for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) {
+@@ -140,6 +143,7 @@ u32 brcmf_flowring_create(struct brcmf_f
+ 			break;
+ 		}
+ 		hash_idx++;
++		hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1);
+ 	}
+ 	if (found) {
+ 		for (i = 0; i < flow->nrofrings; i++) {
+@@ -169,7 +173,7 @@ u32 brcmf_flowring_create(struct brcmf_f
+ }
+ 
+ 
+-u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid)
++u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid)
+ {
+ 	struct brcmf_flowring_ring *ring;
+ 
+@@ -179,7 +183,7 @@ u8 brcmf_flowring_tid(struct brcmf_flowr
+ }
+ 
+ 
+-static void brcmf_flowring_block(struct brcmf_flowring *flow, u8 flowid,
++static void brcmf_flowring_block(struct brcmf_flowring *flow, u16 flowid,
+ 				 bool blocked)
+ {
+ 	struct brcmf_flowring_ring *ring;
+@@ -228,10 +232,10 @@ static void brcmf_flowring_block(struct
+ }
+ 
+ 
+-void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid)
++void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid)
+ {
+ 	struct brcmf_flowring_ring *ring;
+-	u8 hash_idx;
++	u16 hash_idx;
+ 	struct sk_buff *skb;
+ 
+ 	ring = flow->rings[flowid];
+@@ -253,7 +257,7 @@ void brcmf_flowring_delete(struct brcmf_
+ }
+ 
+ 
+-u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
++u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid,
+ 			   struct sk_buff *skb)
+ {
+ 	struct brcmf_flowring_ring *ring;
+@@ -279,7 +283,7 @@ u32 brcmf_flowring_enqueue(struct brcmf_
+ }
+ 
+ 
+-struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid)
++struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid)
+ {
+ 	struct brcmf_flowring_ring *ring;
+ 	struct sk_buff *skb;
+@@ -300,7 +304,7 @@ struct sk_buff *brcmf_flowring_dequeue(s
+ }
+ 
+ 
+-void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
++void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid,
+ 			     struct sk_buff *skb)
+ {
+ 	struct brcmf_flowring_ring *ring;
+@@ -311,7 +315,7 @@ void brcmf_flowring_reinsert(struct brcm
+ }
+ 
+ 
+-u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u8 flowid)
++u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid)
+ {
+ 	struct brcmf_flowring_ring *ring;
+ 
+@@ -326,7 +330,7 @@ u32 brcmf_flowring_qlen(struct brcmf_flo
+ }
+ 
+ 
+-void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid)
++void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid)
+ {
+ 	struct brcmf_flowring_ring *ring;
+ 
+@@ -340,10 +344,10 @@ void brcmf_flowring_open(struct brcmf_fl
+ }
+ 
+ 
+-u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u8 flowid)
++u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid)
+ {
+ 	struct brcmf_flowring_ring *ring;
+-	u8 hash_idx;
++	u16 hash_idx;
+ 
+ 	ring = flow->rings[flowid];
+ 	hash_idx = ring->hash_id;
+@@ -384,7 +388,7 @@ void brcmf_flowring_detach(struct brcmf_
+ 	struct brcmf_pub *drvr = bus_if->drvr;
+ 	struct brcmf_flowring_tdls_entry *search;
+ 	struct brcmf_flowring_tdls_entry *remove;
+-	u8 flowid;
++	u16 flowid;
+ 
+ 	for (flowid = 0; flowid < flow->nrofrings; flowid++) {
+ 		if (flow->rings[flowid])
+@@ -408,7 +412,7 @@ void brcmf_flowring_configure_addr_mode(
+ 	struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev);
+ 	struct brcmf_pub *drvr = bus_if->drvr;
+ 	u32 i;
+-	u8 flowid;
++	u16 flowid;
+ 
+ 	if (flow->addr_mode[ifidx] != addr_mode) {
+ 		for (i = 0; i < ARRAY_SIZE(flow->hash); i++) {
+@@ -434,7 +438,7 @@ void brcmf_flowring_delete_peer(struct b
+ 	struct brcmf_flowring_tdls_entry *prev;
+ 	struct brcmf_flowring_tdls_entry *search;
+ 	u32 i;
+-	u8 flowid;
++	u16 flowid;
+ 	bool sta;
+ 
+ 	sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT);
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h
+@@ -16,7 +16,7 @@
+ #define BRCMFMAC_FLOWRING_H
+ 
+ 
+-#define BRCMF_FLOWRING_HASHSIZE		256
++#define BRCMF_FLOWRING_HASHSIZE		512		/* has to be 2^x */
+ #define BRCMF_FLOWRING_INVALID_ID	0xFFFFFFFF
+ 
+ 
+@@ -24,7 +24,7 @@ struct brcmf_flowring_hash {
+ 	u8 mac[ETH_ALEN];
+ 	u8 fifo;
+ 	u8 ifidx;
+-	u8 flowid;
++	u16 flowid;
+ };
+ 
+ enum ring_status {
+@@ -61,16 +61,16 @@ u32 brcmf_flowring_lookup(struct brcmf_f
+ 			  u8 prio, u8 ifidx);
+ u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN],
+ 			  u8 prio, u8 ifidx);
+-void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid);
+-void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid);
+-u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid);
+-u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
++void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid);
++void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid);
++u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid);
++u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid,
+ 			   struct sk_buff *skb);
+-struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid);
+-void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
++struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid);
++void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid,
+ 			     struct sk_buff *skb);
+-u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u8 flowid);
+-u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u8 flowid);
++u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid);
++u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid);
+ struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings);
+ void brcmf_flowring_detach(struct brcmf_flowring *flow);
+ void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx,
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
+@@ -677,7 +677,7 @@ static u32 brcmf_msgbuf_flowring_create(
+ }
+ 
+ 
+-static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u8 flowid)
++static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u16 flowid)
+ {
+ 	struct brcmf_flowring *flow = msgbuf->flow;
+ 	struct brcmf_commonring *commonring;
+@@ -1310,7 +1310,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct
+ }
+ 
+ 
+-void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u8 flowid)
++void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
+ {
+ 	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
+ 	struct msgbuf_tx_flowring_delete_req *delete;
+@@ -1415,6 +1415,13 @@ int brcmf_proto_msgbuf_attach(struct brc
+ 	u32 count;
+ 
+ 	if_msgbuf = drvr->bus_if->msgbuf;
++
++	if (if_msgbuf->nrof_flowrings >= BRCMF_FLOWRING_HASHSIZE) {
++		brcmf_err("driver not configured for this many flowrings %d\n",
++			  if_msgbuf->nrof_flowrings);
++		if_msgbuf->nrof_flowrings = BRCMF_FLOWRING_HASHSIZE - 1;
++	}
++
+ 	msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL);
+ 	if (!msgbuf)
+ 		goto fail;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
+@@ -33,7 +33,7 @@
+ 
+ 
+ int brcmf_proto_msgbuf_rx_trigger(struct device *dev);
+-void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u8 flowid);
++void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid);
+ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr);
+ void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr);
+ #else
diff --git a/package/kernel/mac80211/patches/332-ath9k-ath9k_hw_analog_shift_rmw-use-REG_RMW.patch b/package/kernel/mac80211/patches/332-ath9k-ath9k_hw_analog_shift_rmw-use-REG_RMW.patch
deleted file mode 100644
index 3ce4428f563e0d5584ae06aaa804b35fcc529860..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/332-ath9k-ath9k_hw_analog_shift_rmw-use-REG_RMW.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:29:59 +0100
-Subject: [PATCH] ath9k: ath9k_hw_analog_shift_rmw: use REG_RMW
-
-use REG_RMW in ath9k_hw_analog_shift_rmw.
-It will double execution speed on usb bus.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
-@@ -27,12 +27,7 @@ void ath9k_hw_analog_shift_regwrite(stru
- void ath9k_hw_analog_shift_rmw(struct ath_hw *ah, u32 reg, u32 mask,
- 			       u32 shift, u32 val)
- {
--	u32 regVal;
--
--	regVal = REG_READ(ah, reg) & ~mask;
--	regVal |= (val << shift) & mask;
--
--	REG_WRITE(ah, reg, regVal);
-+	REG_RMW(ah, reg, ((val << shift) & mask), mask);
- 
- 	if (ah->config.analog_shiftreg)
- 		udelay(100);
diff --git a/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch b/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e414f23784163abfeba59d9e523e3684643c038a
--- /dev/null
+++ b/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch
@@ -0,0 +1,22 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Mon, 8 Feb 2016 14:24:36 +0100
+Subject: [PATCH] cfg80211: fix faulty variable initialization in
+ ieee80211_amsdu_to_8023s
+
+reuse_skb is set to true if the code decides to use the last segment.
+Fixes a memory leak
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -676,7 +676,7 @@ void ieee80211_amsdu_to_8023s(struct sk_
+ 	u8 *payload;
+ 	int offset = 0, remaining, err;
+ 	struct ethhdr eth;
+-	bool reuse_skb = true;
++	bool reuse_skb = false;
+ 	bool last = false;
+ 
+ 	if (has_80211_header) {
diff --git a/package/kernel/mac80211/patches/333-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_4k_set_.patch b/package/kernel/mac80211/patches/333-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_4k_set_.patch
deleted file mode 100644
index 8f12b364548a2809187d34e1d3fec9097ea1008b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/333-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_4k_set_.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:30:01 +0100
-Subject: [PATCH] ath9k: use REG_RMW and rmw buffer in
- ath9k_hw_4k_set_gain
-
-it is possible to reduce time needed for this function
-by rplacing REG_WRITE with REG_RMW (plus dummy 0) and putt all commands
-in same buffer.
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
-@@ -772,15 +772,14 @@ static void ath9k_hw_4k_set_gain(struct
- 				 struct ar5416_eeprom_4k *eep,
- 				 u8 txRxAttenLocal)
- {
--	REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0,
--		  pModal->antCtrlChain[0]);
--
--	REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0),
--		  (REG_READ(ah, AR_PHY_TIMING_CTRL4(0)) &
--		   ~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF |
--		     AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) |
--		  SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |
--		  SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF));
-+	ENABLE_REG_RMW_BUFFER(ah);
-+	REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0,
-+		pModal->antCtrlChain[0], 0);
-+
-+	REG_RMW(ah, AR_PHY_TIMING_CTRL4(0),
-+		SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |
-+		SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF),
-+		AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF);
- 
- 	if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >=
- 	    AR5416_EEP_MINOR_VER_3) {
-@@ -819,6 +818,7 @@ static void ath9k_hw_4k_set_gain(struct
- 		      AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal);
- 	REG_RMW_FIELD(ah, AR_PHY_RXGAIN + 0x1000,
- 		      AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[0]);
-+	REG_RMW_BUFFER_FLUSH(ah);
- }
- 
- /*
diff --git a/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch b/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6e2d0cf5b0783860cb39264e33ecdef622fcc548
--- /dev/null
+++ b/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch
@@ -0,0 +1,132 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Mon, 8 Feb 2016 14:33:19 +0100
+Subject: [PATCH] cfg80211: reuse existing page fragments in A-MSDU rx
+
+This massively reduces data copying and thus improves rx performance
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -644,23 +644,93 @@ int ieee80211_data_from_8023(struct sk_b
+ }
+ EXPORT_SYMBOL(ieee80211_data_from_8023);
+ 
++static void
++__frame_add_frag(struct sk_buff *skb, struct page *page,
++		 void *ptr, int len, int size)
++{
++	struct skb_shared_info *sh = skb_shinfo(skb);
++	int page_offset;
++
++	atomic_inc(&page->_count);
++	page_offset = ptr - page_address(page);
++	skb_add_rx_frag(skb, sh->nr_frags, page, page_offset, len, size);
++}
++
++static void
++__ieee80211_amsdu_copy_frag(struct sk_buff *skb, struct sk_buff *frame,
++			    int offset, int len)
++{
++	struct skb_shared_info *sh = skb_shinfo(skb);
++	const skb_frag_t *frag = &sh->frags[-1];
++	struct page *frag_page;
++	void *frag_ptr;
++	int frag_len, frag_size;
++	int head_size = skb->len - skb->data_len;
++	int cur_len;
++
++	frag_page = virt_to_head_page(skb->head);
++	frag_ptr = skb->data;
++	frag_size = head_size;
++
++	while (offset >= frag_size) {
++		offset -= frag_size;
++		frag++;
++		frag_page = skb_frag_page(frag);
++		frag_ptr = skb_frag_address(frag);
++		frag_size = skb_frag_size(frag);
++	}
++
++	frag_ptr += offset;
++	frag_len = frag_size - offset;
++
++	cur_len = min(len, frag_len);
++
++	__frame_add_frag(frame, frag_page, frag_ptr, cur_len, frag_size);
++	len -= cur_len;
++
++	while (len > 0) {
++		frag++;
++		frag_len = skb_frag_size(frag);
++		cur_len = min(len, frag_len);
++		__frame_add_frag(frame, skb_frag_page(frag),
++				 skb_frag_address(frag), cur_len, frag_len);
++		len -= cur_len;
++	}
++}
++
+ static struct sk_buff *
+ __ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen,
+-		       int offset, int len)
++		       int offset, int len, bool reuse_frag)
+ {
+ 	struct sk_buff *frame;
++	int cur_len = len;
+ 
+ 	if (skb->len - offset < len)
+ 		return NULL;
+ 
+ 	/*
++	 * When reusing framents, copy some data to the head to simplify
++	 * ethernet header handling and speed up protocol header processing
++	 * in the stack later.
++	 */
++	if (reuse_frag)
++		cur_len = min_t(int, len, 32);
++
++	/*
+ 	 * Allocate and reserve two bytes more for payload
+ 	 * alignment since sizeof(struct ethhdr) is 14.
+ 	 */
+-	frame = dev_alloc_skb(hlen + sizeof(struct ethhdr) + 2 + len);
++	frame = dev_alloc_skb(hlen + sizeof(struct ethhdr) + 2 + cur_len);
+ 
+ 	skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2);
+-	skb_copy_bits(skb, offset, skb_put(frame, len), len);
++	skb_copy_bits(skb, offset, skb_put(frame, cur_len), cur_len);
++
++	len -= cur_len;
++	if (!len)
++		return frame;
++
++	offset += cur_len;
++	__ieee80211_amsdu_copy_frag(skb, frame, offset, len);
+ 
+ 	return frame;
+ }
+@@ -676,6 +746,7 @@ void ieee80211_amsdu_to_8023s(struct sk_
+ 	u8 *payload;
+ 	int offset = 0, remaining, err;
+ 	struct ethhdr eth;
++	bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb);
+ 	bool reuse_skb = false;
+ 	bool last = false;
+ 
+@@ -703,12 +774,13 @@ void ieee80211_amsdu_to_8023s(struct sk_
+ 		offset += sizeof(struct ethhdr);
+ 		/* reuse skb for the last subframe */
+ 		last = remaining <= subframe_len + padding;
+-		if (!skb_is_nonlinear(skb) && last) {
++		if (!skb_is_nonlinear(skb) && !reuse_frag && last) {
+ 			skb_pull(skb, offset);
+ 			frame = skb;
+ 			reuse_skb = true;
+ 		} else {
+-			frame = __ieee80211_amsdu_copy(skb, hlen, offset, len);
++			frame = __ieee80211_amsdu_copy(skb, hlen, offset, len,
++						       reuse_frag);
+ 			if (!frame)
+ 				goto purge;
+ 
diff --git a/package/kernel/mac80211/patches/334-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_def_set.patch b/package/kernel/mac80211/patches/334-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_def_set.patch
deleted file mode 100644
index f26e059cf081e4d4104c734c4a947a48b9f82bbc..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/334-ath9k-use-REG_RMW-and-rmw-buffer-in-ath9k_hw_def_set.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Oleksij Rempel <linux@rempel-privat.de>
-Date: Sun, 22 Mar 2015 19:30:03 +0100
-Subject: [PATCH] ath9k: use REG_RMW and rmw buffer in
- ath9k_hw_def_set_gain
-
-Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
-@@ -466,6 +466,7 @@ static void ath9k_hw_def_set_gain(struct
- 				  struct ar5416_eeprom_def *eep,
- 				  u8 txRxAttenLocal, int regChainOffset, int i)
- {
-+	ENABLE_REG_RMW_BUFFER(ah);
- 	if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) {
- 		txRxAttenLocal = pModal->txRxAttenCh[i];
- 
-@@ -483,16 +484,12 @@ static void ath9k_hw_def_set_gain(struct
- 			      AR_PHY_GAIN_2GHZ_XATTEN2_DB,
- 			      pModal->xatten2Db[i]);
- 		} else {
--			REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
--			  (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
--			   ~AR_PHY_GAIN_2GHZ_BSW_MARGIN)
--			  | SM(pModal-> bswMargin[i],
--			       AR_PHY_GAIN_2GHZ_BSW_MARGIN));
--			REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
--			  (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
--			   ~AR_PHY_GAIN_2GHZ_BSW_ATTEN)
--			  | SM(pModal->bswAtten[i],
--			       AR_PHY_GAIN_2GHZ_BSW_ATTEN));
-+			REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
-+				SM(pModal-> bswMargin[i], AR_PHY_GAIN_2GHZ_BSW_MARGIN),
-+				AR_PHY_GAIN_2GHZ_BSW_MARGIN);
-+			REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
-+				SM(pModal->bswAtten[i], AR_PHY_GAIN_2GHZ_BSW_ATTEN),
-+				AR_PHY_GAIN_2GHZ_BSW_ATTEN);
- 		}
- 	}
- 
-@@ -504,17 +501,14 @@ static void ath9k_hw_def_set_gain(struct
- 		      AR_PHY_RXGAIN + regChainOffset,
- 		      AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[i]);
- 	} else {
--		REG_WRITE(ah,
--			  AR_PHY_RXGAIN + regChainOffset,
--			  (REG_READ(ah, AR_PHY_RXGAIN + regChainOffset) &
--			   ~AR_PHY_RXGAIN_TXRX_ATTEN)
--			  | SM(txRxAttenLocal, AR_PHY_RXGAIN_TXRX_ATTEN));
--		REG_WRITE(ah,
--			  AR_PHY_GAIN_2GHZ + regChainOffset,
--			  (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
--			   ~AR_PHY_GAIN_2GHZ_RXTX_MARGIN) |
--			  SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN));
-+		REG_RMW(ah, AR_PHY_RXGAIN + regChainOffset,
-+			SM(txRxAttenLocal, AR_PHY_RXGAIN_TXRX_ATTEN),
-+			AR_PHY_RXGAIN_TXRX_ATTEN);
-+		REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
-+			SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN),
-+			AR_PHY_GAIN_2GHZ_RXTX_MARGIN);
- 	}
-+	REG_RMW_BUFFER_FLUSH(ah);
- }
- 
- static void ath9k_hw_def_set_board_values(struct ath_hw *ah,
diff --git a/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch b/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f8f4f0999dd2185090fdffef1d80629f15a67dd2
--- /dev/null
+++ b/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch
@@ -0,0 +1,36 @@
+From: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+Date: Wed, 10 Feb 2016 16:08:17 +0100
+Subject: [PATCH] mac80211: fix wiphy supported_band access
+
+Fix wiphy supported_band access in tx radiotap parsing. In particular,
+info->band is always set to 0 (IEEE80211_BAND_2GHZ) since it has not
+assigned yet. This cause a kernel crash on 5GHz only devices.
+Move ieee80211_parse_tx_radiotap() after info->band assignment
+
+Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+---
+
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1890,10 +1890,6 @@ netdev_tx_t ieee80211_monitor_start_xmit
+ 	info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
+ 		      IEEE80211_TX_CTL_INJECTED;
+ 
+-	/* process and remove the injection radiotap header */
+-	if (!ieee80211_parse_tx_radiotap(local, skb))
+-		goto fail;
+-
+ 	rcu_read_lock();
+ 
+ 	/*
+@@ -1955,6 +1951,10 @@ netdev_tx_t ieee80211_monitor_start_xmit
+ 		goto fail_rcu;
+ 
+ 	info->band = chandef->chan->band;
++	/* process and remove the injection radiotap header */
++	if (!ieee80211_parse_tx_radiotap(local, skb))
++		goto fail_rcu;
++
+ 	ieee80211_xmit(sdata, NULL, skb);
+ 	rcu_read_unlock();
+ 
diff --git a/package/kernel/mac80211/patches/335-0001-brcmfmac-Fix-oops-when-SDIO-device-is-removed.patch b/package/kernel/mac80211/patches/335-0001-brcmfmac-Fix-oops-when-SDIO-device-is-removed.patch
deleted file mode 100644
index 5e63a803b0e817e70ec22e25d3b3c020a3e8cc87..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/335-0001-brcmfmac-Fix-oops-when-SDIO-device-is-removed.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 6 Mar 2015 18:40:38 +0100
-Subject: [PATCH] brcmfmac: Fix oops when SDIO device is removed.
-
-On removal of SDIO card both functions of card will be getting
-a remove call. When the first is hanging in ctrl frame xmit then
-the second will cause oops. This patch fixes the xmit ctrl
-handling in case of serious errors and also limits the handling
-for remove to function 1 only.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -1194,7 +1194,7 @@ static void brcmf_ops_sdio_remove(struct
- 	brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
- 	brcmf_dbg(SDIO, "Function: %d\n", func->num);
- 
--	if (func->num != 1 && func->num != 2)
-+	if (func->num != 1)
- 		return;
- 
- 	bus_if = dev_get_drvdata(&func->dev);
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -2740,6 +2740,11 @@ static void brcmf_sdio_dpc(struct brcmf_
- 	if ((bus->sdiodev->state != BRCMF_SDIOD_DATA) || (err != 0)) {
- 		brcmf_err("failed backplane access over SDIO, halting operation\n");
- 		atomic_set(&bus->intstatus, 0);
-+		if (bus->ctrl_frame_stat) {
-+			bus->ctrl_frame_err = -ENODEV;
-+			bus->ctrl_frame_stat = false;
-+			brcmf_sdio_wait_event_wakeup(bus);
-+		}
- 	} else if (atomic_read(&bus->intstatus) ||
- 		   atomic_read(&bus->ipend) > 0 ||
- 		   (!atomic_read(&bus->fcstate) &&
diff --git a/package/kernel/mac80211/patches/335-0002-brcmfmac-Simplify-watchdog-sleep.patch b/package/kernel/mac80211/patches/335-0002-brcmfmac-Simplify-watchdog-sleep.patch
deleted file mode 100644
index 201da75bfcfe1942c5d0fd3d71291ecc2186a9f3..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/335-0002-brcmfmac-Simplify-watchdog-sleep.patch
+++ /dev/null
@@ -1,157 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 6 Mar 2015 18:40:39 +0100
-Subject: [PATCH] brcmfmac: Simplify watchdog sleep.
-
-The watchdog thread is used to put the SDIO bus to sleep when the
-system is idling. This patch simplifies the way it is determined
-when sleep can be entered.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -485,10 +485,9 @@ struct brcmf_sdio {
- #endif				/* DEBUG */
- 
- 	uint clkstate;		/* State of sd and backplane clock(s) */
--	bool activity;		/* Activity flag for clock down */
- 	s32 idletime;		/* Control for activity timeout */
--	s32 idlecount;	/* Activity timeout counter */
--	s32 idleclock;	/* How to set bus driver when idle */
-+	s32 idlecount;		/* Activity timeout counter */
-+	s32 idleclock;		/* How to set bus driver when idle */
- 	bool rxflow_mode;	/* Rx flow control mode */
- 	bool rxflow;		/* Is rx flow control on */
- 	bool alp_only;		/* Don't use HT clock (ALP only) */
-@@ -511,6 +510,7 @@ struct brcmf_sdio {
- 	struct workqueue_struct *brcmf_wq;
- 	struct work_struct datawork;
- 	atomic_t dpc_tskcnt;
-+	atomic_t dpc_running;
- 
- 	bool txoff;		/* Transmit flow-controlled */
- 	struct brcmf_sdio_count sdcnt;
-@@ -959,13 +959,8 @@ static int brcmf_sdio_clkctl(struct brcm
- 	brcmf_dbg(SDIO, "Enter\n");
- 
- 	/* Early exit if we're already there */
--	if (bus->clkstate == target) {
--		if (target == CLK_AVAIL) {
--			brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
--			bus->activity = true;
--		}
-+	if (bus->clkstate == target)
- 		return 0;
--	}
- 
- 	switch (target) {
- 	case CLK_AVAIL:
-@@ -975,7 +970,6 @@ static int brcmf_sdio_clkctl(struct brcm
- 		/* Now request HT Avail on the backplane */
- 		brcmf_sdio_htclk(bus, true, pendok);
- 		brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
--		bus->activity = true;
- 		break;
- 
- 	case CLK_SDONLY:
-@@ -1024,17 +1018,6 @@ brcmf_sdio_bus_sleep(struct brcmf_sdio *
- 
- 		/* Going to sleep */
- 		if (sleep) {
--			/* Don't sleep if something is pending */
--			if (atomic_read(&bus->intstatus) ||
--			    atomic_read(&bus->ipend) > 0 ||
--			    bus->ctrl_frame_stat ||
--			    (!atomic_read(&bus->fcstate) &&
--			    brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
--			    data_ok(bus))) {
--				 err = -EBUSY;
--				 goto done;
--			}
--
- 			clkcsr = brcmf_sdiod_regrb(bus->sdiodev,
- 						   SBSDIO_FUNC1_CHIPCLKCSR,
- 						   &err);
-@@ -1045,11 +1028,7 @@ brcmf_sdio_bus_sleep(struct brcmf_sdio *
- 						  SBSDIO_ALP_AVAIL_REQ, &err);
- 			}
- 			err = brcmf_sdio_kso_control(bus, false);
--			/* disable watchdog */
--			if (!err)
--				brcmf_sdio_wd_timer(bus, 0);
- 		} else {
--			bus->idlecount = 0;
- 			err = brcmf_sdio_kso_control(bus, true);
- 		}
- 		if (err) {
-@@ -3566,7 +3545,7 @@ void brcmf_sdio_isr(struct brcmf_sdio *b
- 	queue_work(bus->brcmf_wq, &bus->datawork);
- }
- 
--static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
-+static void brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
- {
- 	brcmf_dbg(TIMER, "Enter\n");
- 
-@@ -3627,22 +3606,21 @@ static bool brcmf_sdio_bus_watchdog(stru
- #endif				/* DEBUG */
- 
- 	/* On idle timeout clear activity flag and/or turn off clock */
--	if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
--		if (++bus->idlecount >= bus->idletime) {
-+	if ((atomic_read(&bus->dpc_tskcnt) == 0) &&
-+	    (atomic_read(&bus->dpc_running) == 0) &&
-+	    (bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
-+		bus->idlecount++;
-+		if (bus->idlecount > bus->idletime) {
-+			brcmf_dbg(SDIO, "idle\n");
-+			sdio_claim_host(bus->sdiodev->func[1]);
-+			brcmf_sdio_wd_timer(bus, 0);
- 			bus->idlecount = 0;
--			if (bus->activity) {
--				bus->activity = false;
--				brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
--			} else {
--				brcmf_dbg(SDIO, "idle\n");
--				sdio_claim_host(bus->sdiodev->func[1]);
--				brcmf_sdio_bus_sleep(bus, true, false);
--				sdio_release_host(bus->sdiodev->func[1]);
--			}
-+			brcmf_sdio_bus_sleep(bus, true, false);
-+			sdio_release_host(bus->sdiodev->func[1]);
- 		}
-+	} else {
-+		bus->idlecount = 0;
- 	}
--
--	return (atomic_read(&bus->ipend) > 0);
- }
- 
- static void brcmf_sdio_dataworker(struct work_struct *work)
-@@ -3651,8 +3629,11 @@ static void brcmf_sdio_dataworker(struct
- 					      datawork);
- 
- 	while (atomic_read(&bus->dpc_tskcnt)) {
-+		atomic_set(&bus->dpc_running, 1);
- 		atomic_set(&bus->dpc_tskcnt, 0);
- 		brcmf_sdio_dpc(bus);
-+		bus->idlecount = 0;
-+		atomic_set(&bus->dpc_running, 0);
- 	}
- 	if (brcmf_sdiod_freezing(bus->sdiodev)) {
- 		brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DOWN);
-@@ -4154,6 +4135,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
- 	}
- 	/* Initialize DPC thread */
- 	atomic_set(&bus->dpc_tskcnt, 0);
-+	atomic_set(&bus->dpc_running, 0);
- 
- 	/* Assign bus interface call back */
- 	bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
diff --git a/package/kernel/mac80211/patches/335-0003-brcmfmac-Fix-possible-race-condition.patch b/package/kernel/mac80211/patches/335-0003-brcmfmac-Fix-possible-race-condition.patch
deleted file mode 100644
index 3a2de7a94431cc6b64b96c3d152cf60af49660c9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/335-0003-brcmfmac-Fix-possible-race-condition.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 6 Mar 2015 18:40:40 +0100
-Subject: [PATCH] brcmfmac: Fix possible race-condition.
-
-SDIO is using a "shared" variable to handoff ctl frames to DPC
-and to see when they are done. In a timeout situation this can
-lead to erroneous situation where DPC started to handle the ctl
-frame while the timeout expired. This patch will fix this by
-adding locking around the shared variable.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -2700,11 +2700,13 @@ static void brcmf_sdio_dpc(struct brcmf_
- 	if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
- 	    data_ok(bus)) {
- 		sdio_claim_host(bus->sdiodev->func[1]);
--		err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
--					      bus->ctrl_frame_len);
-+		if (bus->ctrl_frame_stat) {
-+			err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
-+						      bus->ctrl_frame_len);
-+			bus->ctrl_frame_err = err;
-+			bus->ctrl_frame_stat = false;
-+		}
- 		sdio_release_host(bus->sdiodev->func[1]);
--		bus->ctrl_frame_err = err;
--		bus->ctrl_frame_stat = false;
- 		brcmf_sdio_wait_event_wakeup(bus);
- 	}
- 	/* Send queued frames (limit 1 if rx may still be pending) */
-@@ -2720,9 +2722,13 @@ static void brcmf_sdio_dpc(struct brcmf_
- 		brcmf_err("failed backplane access over SDIO, halting operation\n");
- 		atomic_set(&bus->intstatus, 0);
- 		if (bus->ctrl_frame_stat) {
--			bus->ctrl_frame_err = -ENODEV;
--			bus->ctrl_frame_stat = false;
--			brcmf_sdio_wait_event_wakeup(bus);
-+			sdio_claim_host(bus->sdiodev->func[1]);
-+			if (bus->ctrl_frame_stat) {
-+				bus->ctrl_frame_err = -ENODEV;
-+				bus->ctrl_frame_stat = false;
-+				brcmf_sdio_wait_event_wakeup(bus);
-+			}
-+			sdio_release_host(bus->sdiodev->func[1]);
- 		}
- 	} else if (atomic_read(&bus->intstatus) ||
- 		   atomic_read(&bus->ipend) > 0 ||
-@@ -2930,15 +2936,20 @@ brcmf_sdio_bus_txctl(struct device *dev,
- 	brcmf_sdio_trigger_dpc(bus);
- 	wait_event_interruptible_timeout(bus->ctrl_wait, !bus->ctrl_frame_stat,
- 					 msecs_to_jiffies(CTL_DONE_TIMEOUT));
--
--	if (!bus->ctrl_frame_stat) {
-+	ret = 0;
-+	if (bus->ctrl_frame_stat) {
-+		sdio_claim_host(bus->sdiodev->func[1]);
-+		if (bus->ctrl_frame_stat) {
-+			brcmf_dbg(SDIO, "ctrl_frame timeout\n");
-+			bus->ctrl_frame_stat = false;
-+			ret = -ETIMEDOUT;
-+		}
-+		sdio_release_host(bus->sdiodev->func[1]);
-+	}
-+	if (!ret) {
- 		brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n",
- 			  bus->ctrl_frame_err);
- 		ret = bus->ctrl_frame_err;
--	} else {
--		brcmf_dbg(SDIO, "ctrl_frame timeout\n");
--		bus->ctrl_frame_stat = false;
--		ret = -ETIMEDOUT;
- 	}
- 
- 	if (ret)
diff --git a/package/kernel/mac80211/patches/335-0004-brcmfmac-Add-support-for-BCM4345-SDIO-chipset.patch b/package/kernel/mac80211/patches/335-0004-brcmfmac-Add-support-for-BCM4345-SDIO-chipset.patch
deleted file mode 100644
index c9eb9008a6e12b3cafbfd5e2683707bec8aefb21..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/335-0004-brcmfmac-Add-support-for-BCM4345-SDIO-chipset.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-From: Syed Asifful Dayyan <syedd@broadcom.com>
-Date: Fri, 6 Mar 2015 18:40:42 +0100
-Subject: [PATCH] brcmfmac: Add support for BCM4345 SDIO chipset.
-
-These changes add support for BCM4345 SDIO chipset.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Syed Asifful Dayyan <syedd@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -1096,6 +1096,7 @@ static const struct sdio_device_id brcmf
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
- 	{ /* end: all zeroes */ }
- };
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -491,6 +491,10 @@ static void brcmf_chip_get_raminfo(struc
- 	case BRCM_CC_43362_CHIP_ID:
- 		ci->pub.ramsize = 0x3c000;
- 		break;
-+	case BRCM_CC_4345_CHIP_ID:
-+		ci->pub.ramsize = 0xc8000;
-+		ci->pub.rambase = 0x198000;
-+		break;
- 	case BRCM_CC_4339_CHIP_ID:
- 	case BRCM_CC_4354_CHIP_ID:
- 	case BRCM_CC_4356_CHIP_ID:
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -617,6 +617,8 @@ static const struct sdiod_drive_str sdio
- #define BCM43362_NVRAM_NAME		"brcm/brcmfmac43362-sdio.txt"
- #define BCM4339_FIRMWARE_NAME		"brcm/brcmfmac4339-sdio.bin"
- #define BCM4339_NVRAM_NAME		"brcm/brcmfmac4339-sdio.txt"
-+#define BCM4345_FIRMWARE_NAME		"brcm/brcmfmac4345-sdio.bin"
-+#define BCM4345_NVRAM_NAME		"brcm/brcmfmac4345-sdio.txt"
- #define BCM4354_FIRMWARE_NAME		"brcm/brcmfmac4354-sdio.bin"
- #define BCM4354_NVRAM_NAME		"brcm/brcmfmac4354-sdio.txt"
- 
-@@ -640,6 +642,8 @@ MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
-+MODULE_FIRMWARE(BCM4345_FIRMWARE_NAME);
-+MODULE_FIRMWARE(BCM4345_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4354_NVRAM_NAME);
- 
-@@ -669,6 +673,7 @@ static const struct brcmf_firmware_names
- 	{ BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
- 	{ BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
- 	{ BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) },
-+	{ BRCM_CC_4345_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4345) },
- 	{ BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) }
- };
- 
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -37,6 +37,7 @@
- #define BRCM_CC_43362_CHIP_ID		43362
- #define BRCM_CC_4335_CHIP_ID		0x4335
- #define BRCM_CC_4339_CHIP_ID		0x4339
-+#define BRCM_CC_4345_CHIP_ID		0x4345
- #define BRCM_CC_4354_CHIP_ID		0x4354
- #define BRCM_CC_4356_CHIP_ID		0x4356
- #define BRCM_CC_43566_CHIP_ID		43566
---- a/include/linux/mmc/sdio_ids.h
-+++ b/include/linux/mmc/sdio_ids.h
-@@ -33,6 +33,7 @@
- #define SDIO_DEVICE_ID_BROADCOM_43341		0xa94d
- #define SDIO_DEVICE_ID_BROADCOM_4335_4339	0x4335
- #define SDIO_DEVICE_ID_BROADCOM_43362		0xa962
-+#define SDIO_DEVICE_ID_BROADCOM_4345		0x4345
- #define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
- 
- #define SDIO_VENDOR_ID_INTEL			0x0089
diff --git a/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch b/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch
new file mode 100644
index 0000000000000000000000000000000000000000..acaacf7cacc3ecf380dd69794aaa6b07b5403708
--- /dev/null
+++ b/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch
@@ -0,0 +1,61 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 18 Feb 2016 19:30:05 +0100
+Subject: [PATCH] mac80211: minstrel_ht: set A-MSDU tx limits based on selected
+ max_prob_rate
+
+Prevents excessive A-MSDU aggregation at low data rates or bad
+conditions.
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -883,6 +883,39 @@ minstrel_ht_set_rate(struct minstrel_pri
+ 	ratetbl->rate[offset].flags = flags;
+ }
+ 
++static int
++minstrel_ht_get_max_amsdu_len(struct minstrel_ht_sta *mi)
++{
++	int group = mi->max_prob_rate / MCS_GROUP_RATES;
++	const struct mcs_group *g = &minstrel_mcs_groups[group];
++	int rate = mi->max_prob_rate % MCS_GROUP_RATES;
++
++	/* Disable A-MSDU if max_prob_rate is bad */
++	if (mi->groups[group].rates[rate].prob_ewma < MINSTREL_FRAC(50, 100))
++		return 1;
++
++	/* If the rate is slower than single-stream MCS1, make A-MSDU limit small */
++	if (g->duration[rate] > MCS_DURATION(1, 0, 52))
++		return 500;
++
++	/*
++	 * If the rate is slower than single-stream MCS4, limit A-MSDU to usual
++	 * data packet size
++	 */
++	if (g->duration[rate] > MCS_DURATION(1, 0, 104))
++		return 1500;
++
++	/*
++	 * If the rate is slower than single-stream MCS7, limit A-MSDU to twice
++	 * the usual data packet size
++	 */
++	if (g->duration[rate] > MCS_DURATION(1, 0, 260))
++		return 3000;
++
++	/* unlimited */
++	return 0;
++}
++
+ static void
+ minstrel_ht_update_rates(struct minstrel_priv *mp, struct minstrel_ht_sta *mi)
+ {
+@@ -907,6 +940,7 @@ minstrel_ht_update_rates(struct minstrel
+ 		minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_prob_rate);
+ 	}
+ 
++	mi->sta->max_rc_amsdu_len = minstrel_ht_get_max_amsdu_len(mi);
+ 	rates->rate[i].idx = -1;
+ 	rate_control_set_rates(mp->hw, mi->sta, rates);
+ }
diff --git a/package/kernel/mac80211/patches/336-0001-brcmfmac-remove-duplication-of-ramsize-info.patch b/package/kernel/mac80211/patches/336-0001-brcmfmac-remove-duplication-of-ramsize-info.patch
deleted file mode 100644
index 7a688c4be615320a65bd629d03c30e35e9c74b5b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0001-brcmfmac-remove-duplication-of-ramsize-info.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:27 +0100
-Subject: [PATCH] brcmfmac: remove duplication of ramsize info
-
-Removing the ramsize from the brcmf_sdio structure to avoid
-duplication. The information is available in brcmf_chip
-structure.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -432,8 +432,6 @@ struct brcmf_sdio {
- 	struct brcmf_sdio_dev *sdiodev;	/* sdio device handler */
- 	struct brcmf_chip *ci;	/* Chip info struct */
- 
--	u32 ramsize;		/* Size of RAM in SOCRAM (bytes) */
--
- 	u32 hostintmask;	/* Copy of Host Interrupt Mask */
- 	atomic_t intstatus;	/* Intstatus bits (events) pending */
- 	atomic_t fcstate;	/* State of dongle flow-control */
-@@ -1075,7 +1073,7 @@ static int brcmf_sdio_readshared(struct
- 	struct sdpcm_shared_le sh_le;
- 	__le32 addr_le;
- 
--	shaddr = bus->ci->rambase + bus->ramsize - 4;
-+	shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
- 
- 	/*
- 	 * Read last word in socram to determine
-@@ -3871,13 +3869,6 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
- 		drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH;
- 	brcmf_sdio_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength);
- 
--	/* Get info on the SOCRAM cores... */
--	bus->ramsize = bus->ci->ramsize;
--	if (!(bus->ramsize)) {
--		brcmf_err("failed to find SOCRAM memory!\n");
--		goto fail;
--	}
--
- 	/* Set card control so an SDIO card reset does a WLAN backplane reset */
- 	reg_val = brcmf_sdiod_regrb(bus->sdiodev,
- 				    SDIO_CCCR_BRCM_CARDCTRL, &err);
diff --git a/package/kernel/mac80211/patches/336-0002-brcmfmac-always-perform-cores-checks.patch b/package/kernel/mac80211/patches/336-0002-brcmfmac-always-perform-cores-checks.patch
deleted file mode 100644
index e2a20742474c854ad5ead155f26d43ac0450415f..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0002-brcmfmac-always-perform-cores-checks.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:28 +0100
-Subject: [PATCH] brcmfmac: always perform cores checks
-
-Instead of checking the cores in the chip only if CONFIG_BRCMDBG
-is selected perform the check always and extend it with more sanity
-checking.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -419,13 +419,13 @@ static struct brcmf_core *brcmf_chip_add
- 	return &core->pub;
- }
- 
--#ifdef DEBUG
- /* safety check for chipinfo */
- static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci)
- {
- 	struct brcmf_core_priv *core;
- 	bool need_socram = false;
- 	bool has_socram = false;
-+	bool cpu_found = false;
- 	int idx = 1;
- 
- 	list_for_each_entry(core, &ci->cores, list) {
-@@ -435,12 +435,14 @@ static int brcmf_chip_cores_check(struct
- 
- 		switch (core->pub.id) {
- 		case BCMA_CORE_ARM_CM3:
-+			cpu_found = true;
- 			need_socram = true;
- 			break;
- 		case BCMA_CORE_INTERNAL_MEM:
- 			has_socram = true;
- 			break;
- 		case BCMA_CORE_ARM_CR4:
-+			cpu_found = true;
- 			if (ci->pub.rambase == 0) {
- 				brcmf_err("RAM base not provided with ARM CR4 core\n");
- 				return -ENOMEM;
-@@ -451,19 +453,21 @@ static int brcmf_chip_cores_check(struct
- 		}
- 	}
- 
-+	if (!cpu_found) {
-+		brcmf_err("CPU core not detected\n");
-+		return -ENXIO;
-+	}
- 	/* check RAM core presence for ARM CM3 core */
- 	if (need_socram && !has_socram) {
- 		brcmf_err("RAM core not provided with ARM CM3 core\n");
- 		return -ENODEV;
- 	}
-+	if (!ci->pub.ramsize) {
-+		brcmf_err("RAM size is undetermined\n");
-+		return -ENOMEM;
-+	}
- 	return 0;
- }
--#else	/* DEBUG */
--static inline int brcmf_chip_cores_check(struct brcmf_chip_priv *ci)
--{
--	return 0;
--}
--#endif
- 
- static void brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
- {
diff --git a/package/kernel/mac80211/patches/336-0003-brcmfmac-rename-chip-download-functions.patch b/package/kernel/mac80211/patches/336-0003-brcmfmac-rename-chip-download-functions.patch
deleted file mode 100644
index a27280057799a012e9062ded954ba63bfb614546..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0003-brcmfmac-rename-chip-download-functions.patch
+++ /dev/null
@@ -1,240 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:29 +0100
-Subject: [PATCH] brcmfmac: rename chip download functions
-
-The functions brcmf_chip_[enter/exit]_download() are not exclusively
-used for firmware download so rename these more appropriate.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -807,7 +807,7 @@ struct brcmf_chip *brcmf_chip_attach(voi
- 		err = -EINVAL;
- 	if (WARN_ON(!ops->prepare))
- 		err = -EINVAL;
--	if (WARN_ON(!ops->exit_dl))
-+	if (WARN_ON(!ops->activate))
- 		err = -EINVAL;
- 	if (err < 0)
- 		return ERR_PTR(-EINVAL);
-@@ -905,7 +905,7 @@ void brcmf_chip_resetcore(struct brcmf_c
- }
- 
- static void
--brcmf_chip_cm3_enterdl(struct brcmf_chip_priv *chip)
-+brcmf_chip_cm3_set_passive(struct brcmf_chip_priv *chip)
- {
- 	struct brcmf_core *core;
- 
-@@ -919,7 +919,7 @@ brcmf_chip_cm3_enterdl(struct brcmf_chip
- 	brcmf_chip_resetcore(core, 0, 0, 0);
- }
- 
--static bool brcmf_chip_cm3_exitdl(struct brcmf_chip_priv *chip)
-+static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip)
- {
- 	struct brcmf_core *core;
- 
-@@ -929,7 +929,7 @@ static bool brcmf_chip_cm3_exitdl(struct
- 		return false;
- 	}
- 
--	chip->ops->exit_dl(chip->ctx, &chip->pub, 0);
-+	chip->ops->activate(chip->ctx, &chip->pub, 0);
- 
- 	core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CM3);
- 	brcmf_chip_resetcore(core, 0, 0, 0);
-@@ -938,7 +938,7 @@ static bool brcmf_chip_cm3_exitdl(struct
- }
- 
- static inline void
--brcmf_chip_cr4_enterdl(struct brcmf_chip_priv *chip)
-+brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip)
- {
- 	struct brcmf_core *core;
- 
-@@ -951,11 +951,11 @@ brcmf_chip_cr4_enterdl(struct brcmf_chip
- 			     D11_BCMA_IOCTL_PHYCLOCKEN);
- }
- 
--static bool brcmf_chip_cr4_exitdl(struct brcmf_chip_priv *chip, u32 rstvec)
-+static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec)
- {
- 	struct brcmf_core *core;
- 
--	chip->ops->exit_dl(chip->ctx, &chip->pub, rstvec);
-+	chip->ops->activate(chip->ctx, &chip->pub, rstvec);
- 
- 	/* restore ARM */
- 	core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CR4);
-@@ -964,7 +964,7 @@ static bool brcmf_chip_cr4_exitdl(struct
- 	return true;
- }
- 
--void brcmf_chip_enter_download(struct brcmf_chip *pub)
-+void brcmf_chip_set_passive(struct brcmf_chip *pub)
- {
- 	struct brcmf_chip_priv *chip;
- 	struct brcmf_core *arm;
-@@ -974,14 +974,14 @@ void brcmf_chip_enter_download(struct br
- 	chip = container_of(pub, struct brcmf_chip_priv, pub);
- 	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4);
- 	if (arm) {
--		brcmf_chip_cr4_enterdl(chip);
-+		brcmf_chip_cr4_set_passive(chip);
- 		return;
- 	}
- 
--	brcmf_chip_cm3_enterdl(chip);
-+	brcmf_chip_cm3_set_passive(chip);
- }
- 
--bool brcmf_chip_exit_download(struct brcmf_chip *pub, u32 rstvec)
-+bool brcmf_chip_set_active(struct brcmf_chip *pub, u32 rstvec)
- {
- 	struct brcmf_chip_priv *chip;
- 	struct brcmf_core *arm;
-@@ -991,9 +991,9 @@ bool brcmf_chip_exit_download(struct brc
- 	chip = container_of(pub, struct brcmf_chip_priv, pub);
- 	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4);
- 	if (arm)
--		return brcmf_chip_cr4_exitdl(chip, rstvec);
-+		return brcmf_chip_cr4_set_active(chip, rstvec);
- 
--	return brcmf_chip_cm3_exitdl(chip);
-+	return brcmf_chip_cm3_set_active(chip);
- }
- 
- bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.h
-@@ -64,7 +64,7 @@ struct brcmf_core {
-  * @write32: write 32-bit value over bus.
-  * @prepare: prepare bus for core configuration.
-  * @setup: bus-specific core setup.
-- * @exit_dl: exit download state.
-+ * @active: chip becomes active.
-  *	The callback should use the provided @rstvec when non-zero.
-  */
- struct brcmf_buscore_ops {
-@@ -72,7 +72,7 @@ struct brcmf_buscore_ops {
- 	void (*write32)(void *ctx, u32 addr, u32 value);
- 	int (*prepare)(void *ctx);
- 	int (*setup)(void *ctx, struct brcmf_chip *chip);
--	void (*exit_dl)(void *ctx, struct brcmf_chip *chip, u32 rstvec);
-+	void (*activate)(void *ctx, struct brcmf_chip *chip, u32 rstvec);
- };
- 
- struct brcmf_chip *brcmf_chip_attach(void *ctx,
-@@ -84,8 +84,8 @@ bool brcmf_chip_iscoreup(struct brcmf_co
- void brcmf_chip_coredisable(struct brcmf_core *core, u32 prereset, u32 reset);
- void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset,
- 			  u32 postreset);
--void brcmf_chip_enter_download(struct brcmf_chip *ci);
--bool brcmf_chip_exit_download(struct brcmf_chip *ci, u32 rstvec);
-+void brcmf_chip_set_passive(struct brcmf_chip *ci);
-+bool brcmf_chip_set_active(struct brcmf_chip *ci, u32 rstvec);
- bool brcmf_chip_sr_capable(struct brcmf_chip *pub);
- 
- #endif /* BRCMF_AXIDMP_H */
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -509,7 +509,7 @@ static void brcmf_pcie_attach(struct brc
- 
- static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
- {
--	brcmf_chip_enter_download(devinfo->ci);
-+	brcmf_chip_set_passive(devinfo->ci);
- 
- 	if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) {
- 		brcmf_pcie_select_core(devinfo, BCMA_CORE_ARM_CR4);
-@@ -536,7 +536,7 @@ static int brcmf_pcie_exit_download_stat
- 		brcmf_chip_resetcore(core, 0, 0, 0);
- 	}
- 
--	return !brcmf_chip_exit_download(devinfo->ci, resetintr);
-+	return !brcmf_chip_set_active(devinfo->ci, resetintr);
- }
- 
- 
-@@ -1566,8 +1566,8 @@ static int brcmf_pcie_buscoreprep(void *
- }
- 
- 
--static void brcmf_pcie_buscore_exitdl(void *ctx, struct brcmf_chip *chip,
--				      u32 rstvec)
-+static void brcmf_pcie_buscore_activate(void *ctx, struct brcmf_chip *chip,
-+					u32 rstvec)
- {
- 	struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
- 
-@@ -1577,7 +1577,7 @@ static void brcmf_pcie_buscore_exitdl(vo
- 
- static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
- 	.prepare = brcmf_pcie_buscoreprep,
--	.exit_dl = brcmf_pcie_buscore_exitdl,
-+	.activate = brcmf_pcie_buscore_activate,
- 	.read32 = brcmf_pcie_buscore_read32,
- 	.write32 = brcmf_pcie_buscore_write32,
- };
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -3357,7 +3357,7 @@ static int brcmf_sdio_download_firmware(
- 	brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
- 
- 	/* Keep arm in reset */
--	brcmf_chip_enter_download(bus->ci);
-+	brcmf_chip_set_passive(bus->ci);
- 
- 	rstvec = get_unaligned_le32(fw->data);
- 	brcmf_dbg(SDIO, "firmware rstvec: %x\n", rstvec);
-@@ -3378,7 +3378,7 @@ static int brcmf_sdio_download_firmware(
- 	}
- 
- 	/* Take arm out of reset */
--	if (!brcmf_chip_exit_download(bus->ci, rstvec)) {
-+	if (!brcmf_chip_set_active(bus->ci, rstvec)) {
- 		brcmf_err("error getting out of ARM core reset\n");
- 		goto err;
- 	}
-@@ -3771,8 +3771,8 @@ static int brcmf_sdio_buscoreprep(void *
- 	return 0;
- }
- 
--static void brcmf_sdio_buscore_exitdl(void *ctx, struct brcmf_chip *chip,
--				      u32 rstvec)
-+static void brcmf_sdio_buscore_activate(void *ctx, struct brcmf_chip *chip,
-+					u32 rstvec)
- {
- 	struct brcmf_sdio_dev *sdiodev = ctx;
- 	struct brcmf_core *core;
-@@ -3815,7 +3815,7 @@ static void brcmf_sdio_buscore_write32(v
- 
- static const struct brcmf_buscore_ops brcmf_sdio_buscore_ops = {
- 	.prepare = brcmf_sdio_buscoreprep,
--	.exit_dl = brcmf_sdio_buscore_exitdl,
-+	.activate = brcmf_sdio_buscore_activate,
- 	.read32 = brcmf_sdio_buscore_read32,
- 	.write32 = brcmf_sdio_buscore_write32,
- };
-@@ -4239,12 +4239,11 @@ void brcmf_sdio_remove(struct brcmf_sdio
- 				sdio_claim_host(bus->sdiodev->func[1]);
- 				brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
- 				/* Leave the device in state where it is
--				 * 'quiet'. This is done by putting it in
--				 * download_state which essentially resets
--				 * all necessary cores.
-+				 * 'passive'. This is done by resetting all
-+				 * necessary cores.
- 				 */
- 				msleep(20);
--				brcmf_chip_enter_download(bus->ci);
-+				brcmf_chip_set_passive(bus->ci);
- 				brcmf_sdio_clkctl(bus, CLK_NONE, false);
- 				sdio_release_host(bus->sdiodev->func[1]);
- 			}
diff --git a/package/kernel/mac80211/patches/336-0004-brcmfmac-assure-device-is-ready-for-download-after-b.patch b/package/kernel/mac80211/patches/336-0004-brcmfmac-assure-device-is-ready-for-download-after-b.patch
deleted file mode 100644
index 6b1dd8144f1347d78285d09af51224217c07a0b2..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0004-brcmfmac-assure-device-is-ready-for-download-after-b.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:30 +0100
-Subject: [PATCH] brcmfmac: assure device is ready for download after
- brcmf_chip_attach()
-
-Make the brcmf_chip_attach() function responsible for putting the
-device in a state where it is accessible for firmware download.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -786,12 +786,6 @@ static int brcmf_chip_setup(struct brcmf
- 	if (chip->ops->setup)
- 		ret = chip->ops->setup(chip->ctx, pub);
- 
--	/*
--	 * Make sure any on-chip ARM is off (in case strapping is wrong),
--	 * or downloaded code was already running.
--	 */
--	brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CM3);
--	brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4);
- 	return ret;
- }
- 
-@@ -833,6 +827,8 @@ struct brcmf_chip *brcmf_chip_attach(voi
- 	if (err < 0)
- 		goto fail;
- 
-+	/* assure chip is passive for download */
-+	brcmf_chip_set_passive(&chip->pub);
- 	return &chip->pub;
- 
- fail:
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -509,8 +509,6 @@ static void brcmf_pcie_attach(struct brc
- 
- static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
- {
--	brcmf_chip_set_passive(devinfo->ci);
--
- 	if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) {
- 		brcmf_pcie_select_core(devinfo, BCMA_CORE_ARM_CR4);
- 		brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKIDX,
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -3356,9 +3356,6 @@ static int brcmf_sdio_download_firmware(
- 	sdio_claim_host(bus->sdiodev->func[1]);
- 	brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
- 
--	/* Keep arm in reset */
--	brcmf_chip_set_passive(bus->ci);
--
- 	rstvec = get_unaligned_le32(fw->data);
- 	brcmf_dbg(SDIO, "firmware rstvec: %x\n", rstvec);
- 
diff --git a/package/kernel/mac80211/patches/336-0005-brcmfmac-extract-ram-size-info-from-internal-memory-.patch b/package/kernel/mac80211/patches/336-0005-brcmfmac-extract-ram-size-info-from-internal-memory-.patch
deleted file mode 100644
index bcc2ed4868265efcef40d2583146da783c7493f4..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0005-brcmfmac-extract-ram-size-info-from-internal-memory-.patch
+++ /dev/null
@@ -1,367 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:31 +0100
-Subject: [PATCH] brcmfmac: extract ram size info from internal memory
- registers
-
-Instead of hard-coded memory sizes it is possible to obtain that
-information from the internal memory registers.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -100,9 +100,6 @@
- #define BCM4329_CORE_SOCRAM_BASE	0x18003000
- /* ARM Cortex M3 core, ID 0x82a */
- #define BCM4329_CORE_ARM_BASE		0x18002000
--#define BCM4329_RAMSIZE			0x48000
--/* bcm43143 */
--#define BCM43143_RAMSIZE		0x70000
- 
- #define CORE_SB(base, field) \
- 		(base + SBCONFIGOFF + offsetof(struct sbconfig, field))
-@@ -150,6 +147,78 @@ struct sbconfig {
- 	u32 sbidhigh;	/* identification */
- };
- 
-+/* bankidx and bankinfo reg defines corerev >= 8 */
-+#define SOCRAM_BANKINFO_RETNTRAM_MASK	0x00010000
-+#define SOCRAM_BANKINFO_SZMASK		0x0000007f
-+#define SOCRAM_BANKIDX_ROM_MASK		0x00000100
-+
-+#define SOCRAM_BANKIDX_MEMTYPE_SHIFT	8
-+/* socram bankinfo memtype */
-+#define SOCRAM_MEMTYPE_RAM		0
-+#define SOCRAM_MEMTYPE_R0M		1
-+#define SOCRAM_MEMTYPE_DEVRAM		2
-+
-+#define SOCRAM_BANKINFO_SZBASE		8192
-+#define SRCI_LSS_MASK		0x00f00000
-+#define SRCI_LSS_SHIFT		20
-+#define	SRCI_SRNB_MASK		0xf0
-+#define	SRCI_SRNB_SHIFT		4
-+#define	SRCI_SRBSZ_MASK		0xf
-+#define	SRCI_SRBSZ_SHIFT	0
-+#define SR_BSZ_BASE		14
-+
-+struct sbsocramregs {
-+	u32 coreinfo;
-+	u32 bwalloc;
-+	u32 extracoreinfo;
-+	u32 biststat;
-+	u32 bankidx;
-+	u32 standbyctrl;
-+
-+	u32 errlogstatus;	/* rev 6 */
-+	u32 errlogaddr;	/* rev 6 */
-+	/* used for patching rev 3 & 5 */
-+	u32 cambankidx;
-+	u32 cambankstandbyctrl;
-+	u32 cambankpatchctrl;
-+	u32 cambankpatchtblbaseaddr;
-+	u32 cambankcmdreg;
-+	u32 cambankdatareg;
-+	u32 cambankmaskreg;
-+	u32 PAD[1];
-+	u32 bankinfo;	/* corev 8 */
-+	u32 bankpda;
-+	u32 PAD[14];
-+	u32 extmemconfig;
-+	u32 extmemparitycsr;
-+	u32 extmemparityerrdata;
-+	u32 extmemparityerrcnt;
-+	u32 extmemwrctrlandsize;
-+	u32 PAD[84];
-+	u32 workaround;
-+	u32 pwrctl;		/* corerev >= 2 */
-+	u32 PAD[133];
-+	u32 sr_control;     /* corerev >= 15 */
-+	u32 sr_status;      /* corerev >= 15 */
-+	u32 sr_address;     /* corerev >= 15 */
-+	u32 sr_data;        /* corerev >= 15 */
-+};
-+
-+#define SOCRAMREGOFFS(_f)	offsetof(struct sbsocramregs, _f)
-+
-+#define ARMCR4_CAP		(0x04)
-+#define ARMCR4_BANKIDX		(0x40)
-+#define ARMCR4_BANKINFO		(0x44)
-+#define ARMCR4_BANKPDA		(0x4C)
-+
-+#define	ARMCR4_TCBBNB_MASK	0xf0
-+#define	ARMCR4_TCBBNB_SHIFT	4
-+#define	ARMCR4_TCBANB_MASK	0xf
-+#define	ARMCR4_TCBANB_SHIFT	0
-+
-+#define	ARMCR4_BSZ_MASK		0x3f
-+#define	ARMCR4_BSZ_MULT		8192
-+
- struct brcmf_core_priv {
- 	struct brcmf_core pub;
- 	u32 wrapbase;
-@@ -443,10 +512,6 @@ static int brcmf_chip_cores_check(struct
- 			break;
- 		case BCMA_CORE_ARM_CR4:
- 			cpu_found = true;
--			if (ci->pub.rambase == 0) {
--				brcmf_err("RAM base not provided with ARM CR4 core\n");
--				return -ENOMEM;
--			}
- 			break;
- 		default:
- 			break;
-@@ -462,60 +527,160 @@ static int brcmf_chip_cores_check(struct
- 		brcmf_err("RAM core not provided with ARM CM3 core\n");
- 		return -ENODEV;
- 	}
--	if (!ci->pub.ramsize) {
--		brcmf_err("RAM size is undetermined\n");
--		return -ENOMEM;
--	}
- 	return 0;
- }
- 
--static void brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
-+static u32 brcmf_chip_core_read32(struct brcmf_core_priv *core, u16 reg)
- {
--	switch (ci->pub.chip) {
--	case BRCM_CC_4329_CHIP_ID:
--		ci->pub.ramsize = BCM4329_RAMSIZE;
--		break;
--	case BRCM_CC_43143_CHIP_ID:
--		ci->pub.ramsize = BCM43143_RAMSIZE;
--		break;
--	case BRCM_CC_43241_CHIP_ID:
--		ci->pub.ramsize = 0x90000;
--		break;
--	case BRCM_CC_4330_CHIP_ID:
--		ci->pub.ramsize = 0x48000;
--		break;
-+	return core->chip->ops->read32(core->chip->ctx, core->pub.base + reg);
-+}
-+
-+static void brcmf_chip_core_write32(struct brcmf_core_priv *core,
-+				    u16 reg, u32 val)
-+{
-+	core->chip->ops->write32(core->chip->ctx, core->pub.base + reg, val);
-+}
-+
-+static bool brcmf_chip_socram_banksize(struct brcmf_core_priv *core, u8 idx,
-+				       u32 *banksize)
-+{
-+	u32 bankinfo;
-+	u32 bankidx = (SOCRAM_MEMTYPE_RAM << SOCRAM_BANKIDX_MEMTYPE_SHIFT);
-+
-+	bankidx |= idx;
-+	brcmf_chip_core_write32(core, SOCRAMREGOFFS(bankidx), bankidx);
-+	bankinfo = brcmf_chip_core_read32(core, SOCRAMREGOFFS(bankinfo));
-+	*banksize = (bankinfo & SOCRAM_BANKINFO_SZMASK) + 1;
-+	*banksize *= SOCRAM_BANKINFO_SZBASE;
-+	return !!(bankinfo & SOCRAM_BANKINFO_RETNTRAM_MASK);
-+}
-+
-+static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize,
-+				      u32 *srsize)
-+{
-+	u32 coreinfo;
-+	uint nb, banksize, lss;
-+	bool retent;
-+	int i;
-+
-+	*ramsize = 0;
-+	*srsize = 0;
-+
-+	if (WARN_ON(sr->pub.rev < 4))
-+		return;
-+
-+	if (!brcmf_chip_iscoreup(&sr->pub))
-+		brcmf_chip_resetcore(&sr->pub, 0, 0, 0);
-+
-+	/* Get info for determining size */
-+	coreinfo = brcmf_chip_core_read32(sr, SOCRAMREGOFFS(coreinfo));
-+	nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
-+
-+	if ((sr->pub.rev <= 7) || (sr->pub.rev == 12)) {
-+		banksize = (coreinfo & SRCI_SRBSZ_MASK);
-+		lss = (coreinfo & SRCI_LSS_MASK) >> SRCI_LSS_SHIFT;
-+		if (lss != 0)
-+			nb--;
-+		*ramsize = nb * (1 << (banksize + SR_BSZ_BASE));
-+		if (lss != 0)
-+			*ramsize += (1 << ((lss - 1) + SR_BSZ_BASE));
-+	} else {
-+		nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
-+		for (i = 0; i < nb; i++) {
-+			retent = brcmf_chip_socram_banksize(sr, i, &banksize);
-+			*ramsize += banksize;
-+			if (retent)
-+				*srsize += banksize;
-+		}
-+	}
-+
-+	/* hardcoded save&restore memory sizes */
-+	switch (sr->chip->pub.chip) {
- 	case BRCM_CC_4334_CHIP_ID:
--	case BRCM_CC_43340_CHIP_ID:
--		ci->pub.ramsize = 0x80000;
-+		if (sr->chip->pub.chiprev < 2)
-+			*srsize = (32 * 1024);
- 		break;
--	case BRCM_CC_4335_CHIP_ID:
--		ci->pub.ramsize = 0xc0000;
--		ci->pub.rambase = 0x180000;
--		break;
--	case BRCM_CC_43362_CHIP_ID:
--		ci->pub.ramsize = 0x3c000;
-+	default:
- 		break;
-+	}
-+}
-+
-+/** Return the TCM-RAM size of the ARMCR4 core. */
-+static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
-+{
-+	u32 corecap;
-+	u32 memsize = 0;
-+	u32 nab;
-+	u32 nbb;
-+	u32 totb;
-+	u32 bxinfo;
-+	u32 idx;
-+
-+	corecap = brcmf_chip_core_read32(cr4, ARMCR4_CAP);
-+
-+	nab = (corecap & ARMCR4_TCBANB_MASK) >> ARMCR4_TCBANB_SHIFT;
-+	nbb = (corecap & ARMCR4_TCBBNB_MASK) >> ARMCR4_TCBBNB_SHIFT;
-+	totb = nab + nbb;
-+
-+	for (idx = 0; idx < totb; idx++) {
-+		brcmf_chip_core_write32(cr4, ARMCR4_BANKIDX, idx);
-+		bxinfo = brcmf_chip_core_read32(cr4, ARMCR4_BANKINFO);
-+		memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT;
-+	}
-+
-+	return memsize;
-+}
-+
-+static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
-+{
-+	switch (ci->pub.chip) {
- 	case BRCM_CC_4345_CHIP_ID:
--		ci->pub.ramsize = 0xc8000;
--		ci->pub.rambase = 0x198000;
--		break;
-+		return 0x198000;
-+	case BRCM_CC_4335_CHIP_ID:
- 	case BRCM_CC_4339_CHIP_ID:
- 	case BRCM_CC_4354_CHIP_ID:
- 	case BRCM_CC_4356_CHIP_ID:
- 	case BRCM_CC_43567_CHIP_ID:
- 	case BRCM_CC_43569_CHIP_ID:
- 	case BRCM_CC_43570_CHIP_ID:
--		ci->pub.ramsize = 0xc0000;
--		ci->pub.rambase = 0x180000;
--		break;
- 	case BRCM_CC_43602_CHIP_ID:
--		ci->pub.ramsize = 0xf0000;
--		ci->pub.rambase = 0x180000;
--		break;
-+		return 0x180000;
- 	default:
- 		brcmf_err("unknown chip: %s\n", ci->pub.name);
- 		break;
- 	}
-+	return 0;
-+}
-+
-+static int brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
-+{
-+	struct brcmf_core_priv *mem_core;
-+	struct brcmf_core *mem;
-+
-+	mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_ARM_CR4);
-+	if (mem) {
-+		mem_core = container_of(mem, struct brcmf_core_priv, pub);
-+		ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core);
-+		ci->pub.rambase = brcmf_chip_tcm_rambase(ci);
-+		if (!ci->pub.rambase) {
-+			brcmf_err("RAM base not provided with ARM CR4 core\n");
-+			return -EINVAL;
-+		}
-+	} else {
-+		mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_INTERNAL_MEM);
-+		mem_core = container_of(mem, struct brcmf_core_priv, pub);
-+		brcmf_chip_socram_ramsize(mem_core, &ci->pub.ramsize,
-+					  &ci->pub.srsize);
-+	}
-+	brcmf_dbg(INFO, "RAM: base=0x%x size=%d (0x%x) sr=%d (0x%x)\n",
-+		  ci->pub.rambase, ci->pub.ramsize, ci->pub.ramsize,
-+		  ci->pub.srsize, ci->pub.srsize);
-+
-+	if (!ci->pub.ramsize) {
-+		brcmf_err("RAM size is undetermined\n");
-+		return -ENOMEM;
-+	}
-+	return 0;
- }
- 
- static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip_priv *ci, u32 *eromaddr,
-@@ -668,6 +833,7 @@ static int brcmf_chip_recognition(struct
- 	struct brcmf_core *core;
- 	u32 regdata;
- 	u32 socitype;
-+	int ret;
- 
- 	/* Get CC core rev
- 	 * Chipid is assume to be at offset 0 from SI_ENUM_BASE
-@@ -720,9 +886,13 @@ static int brcmf_chip_recognition(struct
- 		return -ENODEV;
- 	}
- 
--	brcmf_chip_get_raminfo(ci);
--
--	return brcmf_chip_cores_check(ci);
-+	ret = brcmf_chip_cores_check(ci);
-+	if (ret)
-+		return ret;
-+
-+	/* assure chip is passive for core access */
-+	brcmf_chip_set_passive(&ci->pub);
-+	return brcmf_chip_get_raminfo(ci);
- }
- 
- static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id)
-@@ -827,8 +997,6 @@ struct brcmf_chip *brcmf_chip_attach(voi
- 	if (err < 0)
- 		goto fail;
- 
--	/* assure chip is passive for download */
--	brcmf_chip_set_passive(&chip->pub);
- 	return &chip->pub;
- 
- fail:
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.h
-@@ -30,7 +30,8 @@
-  * @pmucaps: PMU capabilities.
-  * @pmurev: PMU revision.
-  * @rambase: RAM base address (only applicable for ARM CR4 chips).
-- * @ramsize: amount of RAM on chip.
-+ * @ramsize: amount of RAM on chip including retention.
-+ * @srsize: amount of retention RAM on chip.
-  * @name: string representation of the chip identifier.
-  */
- struct brcmf_chip {
-@@ -41,6 +42,7 @@ struct brcmf_chip {
- 	u32 pmurev;
- 	u32 rambase;
- 	u32 ramsize;
-+	u32 srsize;
- 	char name[8];
- };
- 
diff --git a/package/kernel/mac80211/patches/336-0006-brcmfmac-take-save-restore-memory-into-account-for-S.patch b/package/kernel/mac80211/patches/336-0006-brcmfmac-take-save-restore-memory-into-account-for-S.patch
deleted file mode 100644
index 69618a7aa7a4d059d2ffccb57d88556eb294b9b8..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0006-brcmfmac-take-save-restore-memory-into-account-for-S.patch
+++ /dev/null
@@ -1,96 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:32 +0100
-Subject: [PATCH] brcmfmac: take save&restore memory into account for SDIO
- shared info
-
-The firmware provides pointer to SDIO shared information at end of
-RAM during firmware initialization. End of RAM is obviously determined
-by the actual ram size, but part of that may be used for save&restore
-memory. In that case another location in RAM will hold the pointer.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -1067,44 +1067,47 @@ static inline bool brcmf_sdio_valid_shar
- static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
- 				 struct sdpcm_shared *sh)
- {
--	u32 addr;
-+	u32 addr = 0;
- 	int rv;
- 	u32 shaddr = 0;
- 	struct sdpcm_shared_le sh_le;
- 	__le32 addr_le;
- 
--	shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
-+	sdio_claim_host(bus->sdiodev->func[1]);
-+	brcmf_sdio_bus_sleep(bus, false, false);
- 
- 	/*
- 	 * Read last word in socram to determine
- 	 * address of sdpcm_shared structure
- 	 */
--	sdio_claim_host(bus->sdiodev->func[1]);
--	brcmf_sdio_bus_sleep(bus, false, false);
--	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr, (u8 *)&addr_le, 4);
--	sdio_release_host(bus->sdiodev->func[1]);
-+	shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
-+	if (!bus->ci->rambase && brcmf_chip_sr_capable(bus->ci))
-+		shaddr -= bus->ci->srsize;
-+	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr,
-+			       (u8 *)&addr_le, 4);
- 	if (rv < 0)
--		return rv;
--
--	addr = le32_to_cpu(addr_le);
--
--	brcmf_dbg(SDIO, "sdpcm_shared address 0x%08X\n", addr);
-+		goto fail;
- 
- 	/*
- 	 * Check if addr is valid.
- 	 * NVRAM length at the end of memory should have been overwritten.
- 	 */
-+	addr = le32_to_cpu(addr_le);
- 	if (!brcmf_sdio_valid_shared_address(addr)) {
--			brcmf_err("invalid sdpcm_shared address 0x%08X\n",
--				  addr);
--			return -EINVAL;
-+		brcmf_err("invalid sdpcm_shared address 0x%08X\n", addr);
-+		rv = -EINVAL;
-+		goto fail;
- 	}
- 
-+	brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
-+
- 	/* Read hndrte_shared structure */
- 	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le,
- 			       sizeof(struct sdpcm_shared_le));
- 	if (rv < 0)
--		return rv;
-+		goto fail;
-+
-+	sdio_release_host(bus->sdiodev->func[1]);
- 
- 	/* Endianness */
- 	sh->flags = le32_to_cpu(sh_le.flags);
-@@ -1121,8 +1124,13 @@ static int brcmf_sdio_readshared(struct
- 			  sh->flags & SDPCM_SHARED_VERSION_MASK);
- 		return -EPROTO;
- 	}
--
- 	return 0;
-+
-+fail:
-+	brcmf_err("unable to obtain sdpcm_shared info: rv=%d (addr=0x%x)\n",
-+		  rv, addr);
-+	sdio_release_host(bus->sdiodev->func[1]);
-+	return rv;
- }
- 
- static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)
diff --git a/package/kernel/mac80211/patches/336-0007-brcmfmac-fix-watchdog-timer-regression.patch b/package/kernel/mac80211/patches/336-0007-brcmfmac-fix-watchdog-timer-regression.patch
deleted file mode 100644
index 1b10dbb800aa89411eeb23847a68f441582092ce..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/336-0007-brcmfmac-fix-watchdog-timer-regression.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 11 Mar 2015 16:11:33 +0100
-Subject: [PATCH] brcmfmac: fix watchdog timer regression
-
-The watchdog timer is used to put the device in a low-power mode when
-it is idle for some time. This timer is stopped during that mode and
-should be restarted upon activity. This has been broken by commit
-d4150fced0365 ("brcmfmac: Simplify watchdog sleep."). This patch
-restores the behaviour as it was before that commit.
-
-Reported-by: Pontus Fuchs <pontusf@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -972,7 +972,6 @@ static int brcmf_sdio_clkctl(struct brcm
- 			brcmf_sdio_sdclk(bus, true);
- 		/* Now request HT Avail on the backplane */
- 		brcmf_sdio_htclk(bus, true, pendok);
--		brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
- 		break;
- 
- 	case CLK_SDONLY:
-@@ -984,7 +983,6 @@ static int brcmf_sdio_clkctl(struct brcm
- 		else
- 			brcmf_err("request for %d -> %d\n",
- 				  bus->clkstate, target);
--		brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
- 		break;
- 
- 	case CLK_NONE:
-@@ -993,7 +991,6 @@ static int brcmf_sdio_clkctl(struct brcm
- 			brcmf_sdio_htclk(bus, false, false);
- 		/* Now remove the SD clock */
- 		brcmf_sdio_sdclk(bus, false);
--		brcmf_sdio_wd_timer(bus, 0);
- 		break;
- 	}
- #ifdef DEBUG
-@@ -1048,6 +1045,7 @@ end:
- 			brcmf_sdio_clkctl(bus, CLK_NONE, pendok);
- 	} else {
- 		brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok);
-+		brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
- 	}
- 	bus->sleeping = sleep;
- 	brcmf_dbg(SDIO, "new state %s\n",
-@@ -4242,6 +4240,7 @@ void brcmf_sdio_remove(struct brcmf_sdio
- 		if (bus->ci) {
- 			if (bus->sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
- 				sdio_claim_host(bus->sdiodev->func[1]);
-+				brcmf_sdio_wd_timer(bus, 0);
- 				brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
- 				/* Leave the device in state where it is
- 				 * 'passive'. This is done by resetting all
diff --git a/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch b/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch
new file mode 100644
index 0000000000000000000000000000000000000000..32a2ad6f0bcdafc499f257b6f925aaf0499e24c0
--- /dev/null
+++ b/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch
@@ -0,0 +1,31 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 18 Feb 2016 19:45:33 +0100
+Subject: [PATCH] mac80211: minstrel_ht: set default tx aggregation timeout to
+ 0
+
+The value 5000 was put here with the addition of the timeout field to
+ieee80211_start_tx_ba_session. It was originally added in mac80211 to
+save resources for drivers like iwlwifi, which only supports a limited
+number of concurrent aggregation sessions.
+
+Since iwlwifi does not use minstrel_ht and other drivers don't need
+this, 0 is a better default - especially since there have been
+recent reports of aggregation setup related issues reproduced with
+ath9k. This should improve stability without causing any adverse
+effects.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -692,7 +692,7 @@ minstrel_aggr_check(struct ieee80211_sta
+ 	if (likely(sta->ampdu_mlme.tid_tx[tid]))
+ 		return;
+ 
+-	ieee80211_start_tx_ba_session(pubsta, tid, 5000);
++	ieee80211_start_tx_ba_session(pubsta, tid, 0);
+ }
+ 
+ static void
diff --git a/package/kernel/mac80211/patches/337-0001-brcmfmac-avoid-runtime-pm-for-sdio-host-controller.patch b/package/kernel/mac80211/patches/337-0001-brcmfmac-avoid-runtime-pm-for-sdio-host-controller.patch
deleted file mode 100644
index af76f13ecdc3da223484c08b9929d2efd34666ef..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0001-brcmfmac-avoid-runtime-pm-for-sdio-host-controller.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:21 +0100
-Subject: [PATCH] brcmfmac: avoid runtime-pm for sdio host controller
-
-Several host controllers supporting runtime-pm are causing issues
-with our sdio wireless cards because they disable the sdio interrupt
-upon going into runtime suspend. This patch avoids that by doing
-a pm_runtime_forbid() call during the probe. Tested with Sony Vaio
-Duo 13 which uses sdhci-acpi host controller.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -29,6 +29,7 @@
- #include <linux/mmc/host.h>
- #include <linux/platform_device.h>
- #include <linux/platform_data/brcmfmac-sdio.h>
-+#include <linux/pm_runtime.h>
- #include <linux/suspend.h>
- #include <linux/errno.h>
- #include <linux/module.h>
-@@ -1006,6 +1007,7 @@ static int brcmf_sdiod_remove(struct brc
- 	sg_free_table(&sdiodev->sgtable);
- 	sdiodev->sbwad = 0;
- 
-+	pm_runtime_allow(sdiodev->func[1]->card->host->parent);
- 	return 0;
- }
- 
-@@ -1074,7 +1076,7 @@ static int brcmf_sdiod_probe(struct brcm
- 		ret = -ENODEV;
- 		goto out;
- 	}
--
-+	pm_runtime_forbid(host->parent);
- out:
- 	if (ret)
- 		brcmf_sdiod_remove(sdiodev);
diff --git a/package/kernel/mac80211/patches/337-0002-brcmfmac-Add-necessary-memory-barriers-for-SDIO.patch b/package/kernel/mac80211/patches/337-0002-brcmfmac-Add-necessary-memory-barriers-for-SDIO.patch
deleted file mode 100644
index c419cc68f5d5d494f36a4c05541169c41949f402..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0002-brcmfmac-Add-necessary-memory-barriers-for-SDIO.patch
+++ /dev/null
@@ -1,171 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:22 +0100
-Subject: [PATCH] brcmfmac: Add necessary memory barriers for SDIO.
-
-SDIO uses a thread to handle all communication with the device,
-for this data is exchanged between threads. This data needs proper
-memory barriers to make sure that data "exchange" is going correct.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -507,8 +507,8 @@ struct brcmf_sdio {
- 
- 	struct workqueue_struct *brcmf_wq;
- 	struct work_struct datawork;
--	atomic_t dpc_tskcnt;
--	atomic_t dpc_running;
-+	bool dpc_triggered;
-+	bool dpc_running;
- 
- 	bool txoff;		/* Transmit flow-controlled */
- 	struct brcmf_sdio_count sdcnt;
-@@ -2713,6 +2713,7 @@ static void brcmf_sdio_dpc(struct brcmf_
- 			err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
- 						      bus->ctrl_frame_len);
- 			bus->ctrl_frame_err = err;
-+			wmb();
- 			bus->ctrl_frame_stat = false;
- 		}
- 		sdio_release_host(bus->sdiodev->func[1]);
-@@ -2734,6 +2735,7 @@ static void brcmf_sdio_dpc(struct brcmf_
- 			sdio_claim_host(bus->sdiodev->func[1]);
- 			if (bus->ctrl_frame_stat) {
- 				bus->ctrl_frame_err = -ENODEV;
-+				wmb();
- 				bus->ctrl_frame_stat = false;
- 				brcmf_sdio_wait_event_wakeup(bus);
- 			}
-@@ -2744,7 +2746,7 @@ static void brcmf_sdio_dpc(struct brcmf_
- 		   (!atomic_read(&bus->fcstate) &&
- 		    brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
- 		    data_ok(bus))) {
--		atomic_inc(&bus->dpc_tskcnt);
-+		bus->dpc_triggered = true;
- 	}
- }
- 
-@@ -2940,6 +2942,7 @@ brcmf_sdio_bus_txctl(struct device *dev,
- 	/* Send from dpc */
- 	bus->ctrl_frame_buf = msg;
- 	bus->ctrl_frame_len = msglen;
-+	wmb();
- 	bus->ctrl_frame_stat = true;
- 
- 	brcmf_sdio_trigger_dpc(bus);
-@@ -2958,6 +2961,7 @@ brcmf_sdio_bus_txctl(struct device *dev,
- 	if (!ret) {
- 		brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n",
- 			  bus->ctrl_frame_err);
-+		rmb();
- 		ret = bus->ctrl_frame_err;
- 	}
- 
-@@ -3526,8 +3530,8 @@ done:
- 
- void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus)
- {
--	if (atomic_read(&bus->dpc_tskcnt) == 0) {
--		atomic_inc(&bus->dpc_tskcnt);
-+	if (!bus->dpc_triggered) {
-+		bus->dpc_triggered = true;
- 		queue_work(bus->brcmf_wq, &bus->datawork);
- 	}
- }
-@@ -3558,7 +3562,7 @@ void brcmf_sdio_isr(struct brcmf_sdio *b
- 	if (!bus->intr)
- 		brcmf_err("isr w/o interrupt configured!\n");
- 
--	atomic_inc(&bus->dpc_tskcnt);
-+	bus->dpc_triggered = true;
- 	queue_work(bus->brcmf_wq, &bus->datawork);
- }
- 
-@@ -3578,7 +3582,7 @@ static void brcmf_sdio_bus_watchdog(stru
- 		if (!bus->intr ||
- 		    (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) {
- 
--			if (atomic_read(&bus->dpc_tskcnt) == 0) {
-+			if (!bus->dpc_triggered) {
- 				u8 devpend;
- 
- 				sdio_claim_host(bus->sdiodev->func[1]);
-@@ -3596,7 +3600,7 @@ static void brcmf_sdio_bus_watchdog(stru
- 				bus->sdcnt.pollcnt++;
- 				atomic_set(&bus->ipend, 1);
- 
--				atomic_inc(&bus->dpc_tskcnt);
-+				bus->dpc_triggered = true;
- 				queue_work(bus->brcmf_wq, &bus->datawork);
- 			}
- 		}
-@@ -3623,17 +3627,21 @@ static void brcmf_sdio_bus_watchdog(stru
- #endif				/* DEBUG */
- 
- 	/* On idle timeout clear activity flag and/or turn off clock */
--	if ((atomic_read(&bus->dpc_tskcnt) == 0) &&
--	    (atomic_read(&bus->dpc_running) == 0) &&
--	    (bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
--		bus->idlecount++;
--		if (bus->idlecount > bus->idletime) {
--			brcmf_dbg(SDIO, "idle\n");
--			sdio_claim_host(bus->sdiodev->func[1]);
--			brcmf_sdio_wd_timer(bus, 0);
-+	if (!bus->dpc_triggered) {
-+		rmb();
-+		if ((!bus->dpc_running) && (bus->idletime > 0) &&
-+		    (bus->clkstate == CLK_AVAIL)) {
-+			bus->idlecount++;
-+			if (bus->idlecount > bus->idletime) {
-+				brcmf_dbg(SDIO, "idle\n");
-+				sdio_claim_host(bus->sdiodev->func[1]);
-+				brcmf_sdio_wd_timer(bus, 0);
-+				bus->idlecount = 0;
-+				brcmf_sdio_bus_sleep(bus, true, false);
-+				sdio_release_host(bus->sdiodev->func[1]);
-+			}
-+		} else {
- 			bus->idlecount = 0;
--			brcmf_sdio_bus_sleep(bus, true, false);
--			sdio_release_host(bus->sdiodev->func[1]);
- 		}
- 	} else {
- 		bus->idlecount = 0;
-@@ -3645,13 +3653,14 @@ static void brcmf_sdio_dataworker(struct
- 	struct brcmf_sdio *bus = container_of(work, struct brcmf_sdio,
- 					      datawork);
- 
--	while (atomic_read(&bus->dpc_tskcnt)) {
--		atomic_set(&bus->dpc_running, 1);
--		atomic_set(&bus->dpc_tskcnt, 0);
-+	bus->dpc_running = true;
-+	wmb();
-+	while (ACCESS_ONCE(bus->dpc_triggered)) {
-+		bus->dpc_triggered = false;
- 		brcmf_sdio_dpc(bus);
- 		bus->idlecount = 0;
--		atomic_set(&bus->dpc_running, 0);
- 	}
-+	bus->dpc_running = false;
- 	if (brcmf_sdiod_freezing(bus->sdiodev)) {
- 		brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DOWN);
- 		brcmf_sdiod_try_freeze(bus->sdiodev);
-@@ -4144,8 +4153,8 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
- 		bus->watchdog_tsk = NULL;
- 	}
- 	/* Initialize DPC thread */
--	atomic_set(&bus->dpc_tskcnt, 0);
--	atomic_set(&bus->dpc_running, 0);
-+	bus->dpc_triggered = false;
-+	bus->dpc_running = false;
- 
- 	/* Assign bus interface call back */
- 	bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
diff --git a/package/kernel/mac80211/patches/337-0003-brcmfmac-Remove-unnecessary-new-line-in-pcie-console.patch b/package/kernel/mac80211/patches/337-0003-brcmfmac-Remove-unnecessary-new-line-in-pcie-console.patch
deleted file mode 100644
index 1bc98a053ea09c0932670d553146addf95f82b17..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0003-brcmfmac-Remove-unnecessary-new-line-in-pcie-console.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:24 +0100
-Subject: [PATCH] brcmfmac: Remove unnecessary new-line in pcie console
- logging.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -651,10 +651,9 @@ static void brcmf_pcie_bus_console_read(
- 			console->log_str[console->log_idx] = ch;
- 			console->log_idx++;
- 		}
--
- 		if (ch == '\n') {
- 			console->log_str[console->log_idx] = 0;
--			brcmf_dbg(PCIE, "CONSOLE: %s\n", console->log_str);
-+			brcmf_dbg(PCIE, "CONSOLE: %s", console->log_str);
- 			console->log_idx = 0;
- 		}
- 	}
diff --git a/package/kernel/mac80211/patches/337-0004-brcmfmac-add-MODULE_FIRMWARE-macros-for-bcm4356-PCIe.patch b/package/kernel/mac80211/patches/337-0004-brcmfmac-add-MODULE_FIRMWARE-macros-for-bcm4356-PCIe.patch
deleted file mode 100644
index fcf0bf34f008c9d42ece3f38e9ad93b7264aae17..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0004-brcmfmac-add-MODULE_FIRMWARE-macros-for-bcm4356-PCIe.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:25 +0100
-Subject: [PATCH] brcmfmac: add MODULE_FIRMWARE() macros for bcm4356 PCIe
- device
-
-The BCM4356 PCIe wireless device was added recently but overlooked
-the fact that the MODULE_FIRMWARE() macros were missing for the
-firmwares needed by this device.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -189,6 +189,8 @@ MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME
- MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4354_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4354_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
- 
diff --git a/package/kernel/mac80211/patches/337-0005-brcmfmac-add-support-for-BCM43430-SDIO-chipset.patch b/package/kernel/mac80211/patches/337-0005-brcmfmac-add-support-for-BCM43430-SDIO-chipset.patch
deleted file mode 100644
index b3e9bc9a072658b27e67f1443346fa83ccafe9d2..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0005-brcmfmac-add-support-for-BCM43430-SDIO-chipset.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:26 +0100
-Subject: [PATCH] brcmfmac: add support for BCM43430 SDIO chipset
-
-This patch added support for the BCM43430 802.11n SDIO chipset.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -1098,6 +1098,7 @@ static const struct sdio_device_id brcmf
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
- 	{ /* end: all zeroes */ }
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -600,6 +600,12 @@ static void brcmf_chip_socram_ramsize(st
- 		if (sr->chip->pub.chiprev < 2)
- 			*srsize = (32 * 1024);
- 		break;
-+	case BRCM_CC_43430_CHIP_ID:
-+		/* assume sr for now as we can not check
-+		 * firmware sr capability at this point.
-+		 */
-+		*srsize = (64 * 1024);
-+		break;
- 	default:
- 		break;
- 	}
-@@ -1072,6 +1078,7 @@ static void
- brcmf_chip_cm3_set_passive(struct brcmf_chip_priv *chip)
- {
- 	struct brcmf_core *core;
-+	struct brcmf_core_priv *sr;
- 
- 	brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CM3);
- 	core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211);
-@@ -1081,6 +1088,13 @@ brcmf_chip_cm3_set_passive(struct brcmf_
- 			     D11_BCMA_IOCTL_PHYCLOCKEN);
- 	core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_INTERNAL_MEM);
- 	brcmf_chip_resetcore(core, 0, 0, 0);
-+
-+	/* disable bank #3 remap for this device */
-+	if (chip->pub.chip == BRCM_CC_43430_CHIP_ID) {
-+		sr = container_of(core, struct brcmf_core_priv, pub);
-+		brcmf_chip_core_write32(sr, SOCRAMREGOFFS(bankidx), 3);
-+		brcmf_chip_core_write32(sr, SOCRAMREGOFFS(bankpda), 0);
-+	}
- }
- 
- static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip)
-@@ -1188,6 +1202,10 @@ bool brcmf_chip_sr_capable(struct brcmf_
- 		addr = CORE_CC_REG(base, chipcontrol_data);
- 		reg = chip->ops->read32(chip->ctx, addr);
- 		return (reg & pmu_cc3_mask) != 0;
-+	case BRCM_CC_43430_CHIP_ID:
-+		addr = CORE_CC_REG(base, sr_control1);
-+		reg = chip->ops->read32(chip->ctx, addr);
-+		return reg != 0;
- 	default:
- 		addr = CORE_CC_REG(base, pmucapabilities_ext);
- 		reg = chip->ops->read32(chip->ctx, addr);
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -615,6 +615,8 @@ static const struct sdiod_drive_str sdio
- #define BCM43362_NVRAM_NAME		"brcm/brcmfmac43362-sdio.txt"
- #define BCM4339_FIRMWARE_NAME		"brcm/brcmfmac4339-sdio.bin"
- #define BCM4339_NVRAM_NAME		"brcm/brcmfmac4339-sdio.txt"
-+#define BCM43430_FIRMWARE_NAME		"brcm/brcmfmac43430-sdio.bin"
-+#define BCM43430_NVRAM_NAME		"brcm/brcmfmac43430-sdio.txt"
- #define BCM4345_FIRMWARE_NAME		"brcm/brcmfmac4345-sdio.bin"
- #define BCM4345_NVRAM_NAME		"brcm/brcmfmac4345-sdio.txt"
- #define BCM4354_FIRMWARE_NAME		"brcm/brcmfmac4354-sdio.bin"
-@@ -640,6 +642,8 @@ MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
-+MODULE_FIRMWARE(BCM43430_FIRMWARE_NAME);
-+MODULE_FIRMWARE(BCM43430_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4345_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4345_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME);
-@@ -671,6 +675,7 @@ static const struct brcmf_firmware_names
- 	{ BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
- 	{ BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
- 	{ BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) },
-+	{ BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43430) },
- 	{ BRCM_CC_4345_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4345) },
- 	{ BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) }
- };
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -37,6 +37,7 @@
- #define BRCM_CC_43362_CHIP_ID		43362
- #define BRCM_CC_4335_CHIP_ID		0x4335
- #define BRCM_CC_4339_CHIP_ID		0x4339
-+#define BRCM_CC_43430_CHIP_ID		43430
- #define BRCM_CC_4345_CHIP_ID		0x4345
- #define BRCM_CC_4354_CHIP_ID		0x4354
- #define BRCM_CC_4356_CHIP_ID		0x4356
---- a/drivers/net/wireless/brcm80211/include/chipcommon.h
-+++ b/drivers/net/wireless/brcm80211/include/chipcommon.h
-@@ -183,7 +183,14 @@ struct chipcregs {
- 	u8 uart1lsr;
- 	u8 uart1msr;
- 	u8 uart1scratch;
--	u32 PAD[126];
-+	u32 PAD[62];
-+
-+	/* save/restore, corerev >= 48 */
-+	u32 sr_capability;          /* 0x500 */
-+	u32 sr_control0;            /* 0x504 */
-+	u32 sr_control1;            /* 0x508 */
-+	u32 gpio_control;           /* 0x50C */
-+	u32 PAD[60];
- 
- 	/* PMU registers (corerev >= 20) */
- 	u32 pmucontrol;	/* 0x600 */
---- a/include/linux/mmc/sdio_ids.h
-+++ b/include/linux/mmc/sdio_ids.h
-@@ -33,6 +33,7 @@
- #define SDIO_DEVICE_ID_BROADCOM_43341		0xa94d
- #define SDIO_DEVICE_ID_BROADCOM_4335_4339	0x4335
- #define SDIO_DEVICE_ID_BROADCOM_43362		0xa962
-+#define SDIO_DEVICE_ID_BROADCOM_43430		0xa9a6
- #define SDIO_DEVICE_ID_BROADCOM_4345		0x4345
- #define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
- 
diff --git a/package/kernel/mac80211/patches/337-0006-brcmfmac-only-support-the-BCM43455-7-device.patch b/package/kernel/mac80211/patches/337-0006-brcmfmac-only-support-the-BCM43455-7-device.patch
deleted file mode 100644
index c3d7bc2cbf6912813642fdc90342360b1fe0d663..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0006-brcmfmac-only-support-the-BCM43455-7-device.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:27 +0100
-Subject: [PATCH] brcmfmac: only support the BCM43455/7 device
-
-Recently support was added for the BCM4345 SDIO chipset by
-commit 9c51026509d7 ("brcmfmac: Add support for BCM4345 SDIO chipset")
-however this was verified using a BCM43455 device, which is
-a more recent revision of the chip. This patch assure that
-older revisions are not probed as they would fail.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Syed Asifful Dayyan <syedd@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -617,8 +617,8 @@ static const struct sdiod_drive_str sdio
- #define BCM4339_NVRAM_NAME		"brcm/brcmfmac4339-sdio.txt"
- #define BCM43430_FIRMWARE_NAME		"brcm/brcmfmac43430-sdio.bin"
- #define BCM43430_NVRAM_NAME		"brcm/brcmfmac43430-sdio.txt"
--#define BCM4345_FIRMWARE_NAME		"brcm/brcmfmac4345-sdio.bin"
--#define BCM4345_NVRAM_NAME		"brcm/brcmfmac4345-sdio.txt"
-+#define BCM43455_FIRMWARE_NAME		"brcm/brcmfmac43455-sdio.bin"
-+#define BCM43455_NVRAM_NAME		"brcm/brcmfmac43455-sdio.txt"
- #define BCM4354_FIRMWARE_NAME		"brcm/brcmfmac4354-sdio.bin"
- #define BCM4354_NVRAM_NAME		"brcm/brcmfmac4354-sdio.txt"
- 
-@@ -644,8 +644,8 @@ MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
- MODULE_FIRMWARE(BCM43430_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM43430_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4345_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4345_NVRAM_NAME);
-+MODULE_FIRMWARE(BCM43455_FIRMWARE_NAME);
-+MODULE_FIRMWARE(BCM43455_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4354_NVRAM_NAME);
- 
-@@ -676,7 +676,7 @@ static const struct brcmf_firmware_names
- 	{ BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
- 	{ BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) },
- 	{ BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43430) },
--	{ BRCM_CC_4345_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4345) },
-+	{ BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43455) },
- 	{ BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) }
- };
- 
diff --git a/package/kernel/mac80211/patches/337-0007-brcmfmac-remove-support-for-unreleased-BCM4354-PCIe.patch b/package/kernel/mac80211/patches/337-0007-brcmfmac-remove-support-for-unreleased-BCM4354-PCIe.patch
deleted file mode 100644
index a62cfdfc4cd4d67628543d38fc8f3cba76b8117c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/337-0007-brcmfmac-remove-support-for-unreleased-BCM4354-PCIe.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 18 Mar 2015 13:25:28 +0100
-Subject: [PATCH] brcmfmac: remove support for unreleased BCM4354 PCIe
-
-There are no known BCM4354 PCIe devices released so removing
-support from the driver until proven otherwise.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -47,8 +47,6 @@ enum brcmf_pcie_state {
- 
- #define BRCMF_PCIE_43602_FW_NAME		"brcm/brcmfmac43602-pcie.bin"
- #define BRCMF_PCIE_43602_NVRAM_NAME		"brcm/brcmfmac43602-pcie.txt"
--#define BRCMF_PCIE_4354_FW_NAME			"brcm/brcmfmac4354-pcie.bin"
--#define BRCMF_PCIE_4354_NVRAM_NAME		"brcm/brcmfmac4354-pcie.txt"
- #define BRCMF_PCIE_4356_FW_NAME			"brcm/brcmfmac4356-pcie.bin"
- #define BRCMF_PCIE_4356_NVRAM_NAME		"brcm/brcmfmac4356-pcie.txt"
- #define BRCMF_PCIE_43570_FW_NAME		"brcm/brcmfmac43570-pcie.bin"
-@@ -187,8 +185,6 @@ enum brcmf_pcie_state {
- 
- MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4354_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4354_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
-@@ -1327,10 +1323,6 @@ static int brcmf_pcie_get_fwnames(struct
- 		fw_name = BRCMF_PCIE_43602_FW_NAME;
- 		nvram_name = BRCMF_PCIE_43602_NVRAM_NAME;
- 		break;
--	case BRCM_CC_4354_CHIP_ID:
--		fw_name = BRCMF_PCIE_4354_FW_NAME;
--		nvram_name = BRCMF_PCIE_4354_NVRAM_NAME;
--		break;
- 	case BRCM_CC_4356_CHIP_ID:
- 		fw_name = BRCMF_PCIE_4356_FW_NAME;
- 		nvram_name = BRCMF_PCIE_4356_NVRAM_NAME;
-@@ -1855,7 +1847,6 @@ cleanup:
- 	PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
- 
- static struct pci_device_id brcmf_pcie_devid_table[] = {
--	BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
diff --git a/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch b/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch
new file mode 100644
index 0000000000000000000000000000000000000000..229351ba56802ef44fae5fe5f88a3ffbb0ada098
--- /dev/null
+++ b/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch
@@ -0,0 +1,26 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Wed, 24 Feb 2016 12:03:13 +0100
+Subject: [PATCH] mac80211: minstrel_ht: fix a logic error in RTS/CTS handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+RTS/CTS needs to be enabled if the rate is a fallback rate *or* if it's
+a dual-stream rate and the sta is in dynamic SMPS mode.
+
+Fixes: a3ebb4e1b763 ("mac80211: minstrel_ht: handle peers in dynamic SMPS")
+Reported-by: Matías Richart <mrichart@fing.edu.uy>
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -872,7 +872,7 @@ minstrel_ht_set_rate(struct minstrel_pri
+ 	 *  - if station is in dynamic SMPS (and streams > 1)
+ 	 *  - for fallback rates, to increase chances of getting through
+ 	 */
+-	if (offset > 0 &&
++	if (offset > 0 ||
+ 	    (mi->sta->smps_mode == IEEE80211_SMPS_DYNAMIC &&
+ 	     group->streams > 1)) {
+ 		ratetbl->rate[offset].count = ratetbl->rate[offset].count_rts;
diff --git a/package/kernel/mac80211/patches/338-brcmfmac-disable-MBSS-feature-for-BCM43362.patch b/package/kernel/mac80211/patches/338-brcmfmac-disable-MBSS-feature-for-BCM43362.patch
deleted file mode 100644
index 366ff85d035baf33c476be093caa602e44edded6..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/338-brcmfmac-disable-MBSS-feature-for-BCM43362.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Fri, 20 Mar 2015 22:18:17 +0100
-Subject: [PATCH] brcmfmac: disable MBSS feature for BCM43362
-
-The BCM43362 firmware falsely reports it is capable of providing
-MBSS. As a result AP mode no longer works for this device. Therefor
-disable MBSS in the driver for this chipset.
-
-Cc: stable@vger.kernel.org # 3.19.y
-Reported-by: Jorg Krause <jkrause@posteo.de>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-@@ -126,7 +126,8 @@ void brcmf_feat_attach(struct brcmf_pub
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MCHAN, "mchan");
- 	if (drvr->bus_if->wowl_supported)
- 		brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
--	brcmf_feat_iovar_int_set(ifp, BRCMF_FEAT_MBSS, "mbss", 0);
-+	if (drvr->bus_if->chip != BRCM_CC_43362_CHIP_ID)
-+		brcmf_feat_iovar_int_set(ifp, BRCMF_FEAT_MBSS, "mbss", 0);
- 
- 	/* set chip related quirks */
- 	switch (drvr->bus_if->chip) {
diff --git a/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch b/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch
new file mode 100644
index 0000000000000000000000000000000000000000..56cd94aa152169fa4e98cd16dbf8a251dca4ca8a
--- /dev/null
+++ b/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch
@@ -0,0 +1,35 @@
+From: Jouni Malinen <jouni@qca.qualcomm.com>
+Date: Tue, 1 Mar 2016 00:29:00 +0200
+Subject: [PATCH] mac80211: Fix Public Action frame RX in AP mode
+
+Public Action frames use special rules for how the BSSID field (Address
+3) is set. A wildcard BSSID is used in cases where the transmitter and
+recipient are not members of the same BSS. As such, we need to accept
+Public Action frames with wildcard BSSID.
+
+Commit db8e17324553 ("mac80211: ignore frames between TDLS peers when
+operating as AP") added a rule that drops Action frames to TDLS-peers
+based on an Action frame having different DA (Address 1) and BSSID
+(Address 3) values. This is not correct since it misses the possibility
+of BSSID being a wildcard BSSID in which case the Address 1 would not
+necessarily match.
+
+Fix this by allowing mac80211 to accept wildcard BSSID in an Action
+frame when in AP mode.
+
+Fixes: db8e17324553 ("mac80211: ignore frames between TDLS peers when operating as AP")
+Cc: stable@vger.kernel.org
+Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -3374,6 +3374,7 @@ static bool ieee80211_accept_frame(struc
+ 				return false;
+ 			/* ignore action frames to TDLS-peers */
+ 			if (ieee80211_is_action(hdr->frame_control) &&
++			    !is_broadcast_ether_addr(bssid) &&
+ 			    !ether_addr_equal(bssid, hdr->addr1))
+ 				return false;
+ 		}
diff --git a/package/kernel/mac80211/patches/339-0001-brcmfmac-use-static-superset-of-channels-for-wiphy-b.patch b/package/kernel/mac80211/patches/339-0001-brcmfmac-use-static-superset-of-channels-for-wiphy-b.patch
deleted file mode 100644
index 6e461f617f70e4c144167cc3f8ee86ffbca34237..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0001-brcmfmac-use-static-superset-of-channels-for-wiphy-b.patch
+++ /dev/null
@@ -1,300 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:24 +0200
-Subject: [PATCH] brcmfmac: use static superset of channels for wiphy
- bands
-
-The driver was constructing a list of channels per wiphy band
-by querying the device. This list is not what the hardware is
-able to do as it is already filtered by the country setting in
-the device. As user-space may change the country this would
-require updating the channel list which is not recommended [1].
-This patch introduces a superset of channels. The individual
-channels are disabled appropriately by querying the device.
-
-[1] http://mid.gmane.org/1426706320.3001.21.camel@sipsolutions.net
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -129,13 +129,47 @@ static struct ieee80211_rate __wl_rates[
- 	RATETAB_ENT(BRCM_RATE_54M, 0),
- };
- 
--#define wl_a_rates		(__wl_rates + 4)
--#define wl_a_rates_size	8
- #define wl_g_rates		(__wl_rates + 0)
--#define wl_g_rates_size	12
-+#define wl_g_rates_size		ARRAY_SIZE(__wl_rates)
-+#define wl_a_rates		(__wl_rates + 4)
-+#define wl_a_rates_size		(wl_g_rates_size - 4)
-+
-+#define CHAN2G(_channel, _freq) {				\
-+	.band			= IEEE80211_BAND_2GHZ,		\
-+	.center_freq		= (_freq),			\
-+	.hw_value		= (_channel),			\
-+	.flags			= IEEE80211_CHAN_DISABLED,	\
-+	.max_antenna_gain	= 0,				\
-+	.max_power		= 30,				\
-+}
-+
-+#define CHAN5G(_channel) {					\
-+	.band			= IEEE80211_BAND_5GHZ,		\
-+	.center_freq		= 5000 + (5 * (_channel)),	\
-+	.hw_value		= (_channel),			\
-+	.flags			= IEEE80211_CHAN_DISABLED,	\
-+	.max_antenna_gain	= 0,				\
-+	.max_power		= 30,				\
-+}
-+
-+static struct ieee80211_channel __wl_2ghz_channels[] = {
-+	CHAN2G(1, 2412), CHAN2G(2, 2417), CHAN2G(3, 2422), CHAN2G(4, 2427),
-+	CHAN2G(5, 2432), CHAN2G(6, 2437), CHAN2G(7, 2442), CHAN2G(8, 2447),
-+	CHAN2G(9, 2452), CHAN2G(10, 2457), CHAN2G(11, 2462), CHAN2G(12, 2467),
-+	CHAN2G(13, 2472), CHAN2G(14, 2484)
-+};
-+
-+static struct ieee80211_channel __wl_5ghz_channels[] = {
-+	CHAN5G(34), CHAN5G(36), CHAN5G(38), CHAN5G(40), CHAN5G(42),
-+	CHAN5G(44), CHAN5G(46), CHAN5G(48), CHAN5G(52), CHAN5G(56),
-+	CHAN5G(60), CHAN5G(64), CHAN5G(100), CHAN5G(104), CHAN5G(108),
-+	CHAN5G(112), CHAN5G(116), CHAN5G(120), CHAN5G(124), CHAN5G(128),
-+	CHAN5G(132), CHAN5G(136), CHAN5G(140), CHAN5G(144), CHAN5G(149),
-+	CHAN5G(153), CHAN5G(157), CHAN5G(161), CHAN5G(165)
-+};
- 
- /* Band templates duplicated per wiphy. The channel info
-- * is filled in after querying the device.
-+ * above is added to the band during setup.
-  */
- static const struct ieee80211_supported_band __wl_band_2ghz = {
- 	.band = IEEE80211_BAND_2GHZ,
-@@ -143,7 +177,7 @@ static const struct ieee80211_supported_
- 	.n_bitrates = wl_g_rates_size,
- };
- 
--static const struct ieee80211_supported_band __wl_band_5ghz_a = {
-+static const struct ieee80211_supported_band __wl_band_5ghz = {
- 	.band = IEEE80211_BAND_5GHZ,
- 	.bitrates = wl_a_rates,
- 	.n_bitrates = wl_a_rates_size,
-@@ -5252,40 +5286,6 @@ dongle_scantime_out:
- 	return err;
- }
- 
--/* Filter the list of channels received from firmware counting only
-- * the 20MHz channels. The wiphy band data only needs those which get
-- * flagged to indicate if they can take part in higher bandwidth.
-- */
--static void brcmf_count_20mhz_channels(struct brcmf_cfg80211_info *cfg,
--				       struct brcmf_chanspec_list *chlist,
--				       u32 chcnt[])
--{
--	u32 total = le32_to_cpu(chlist->count);
--	struct brcmu_chan ch;
--	int i;
--
--	for (i = 0; i < total; i++) {
--		ch.chspec = (u16)le32_to_cpu(chlist->element[i]);
--		cfg->d11inf.decchspec(&ch);
--
--		/* Firmware gives a ordered list. We skip non-20MHz
--		 * channels is 2G. For 5G we can abort upon reaching
--		 * a non-20MHz channel in the list.
--		 */
--		if (ch.bw != BRCMU_CHAN_BW_20) {
--			if (ch.band == BRCMU_CHAN_BAND_5G)
--				break;
--			else
--				continue;
--		}
--
--		if (ch.band == BRCMU_CHAN_BAND_2G)
--			chcnt[0] += 1;
--		else if (ch.band == BRCMU_CHAN_BAND_5G)
--			chcnt[1] += 1;
--	}
--}
--
- static void brcmf_update_bw40_channel_flag(struct ieee80211_channel *channel,
- 					   struct brcmu_chan *ch)
- {
-@@ -5321,7 +5321,6 @@ static int brcmf_construct_chaninfo(stru
- 	u32 i, j;
- 	u32 total;
- 	u32 chaninfo;
--	u32 chcnt[2] = { 0, 0 };
- 	u32 index;
- 
- 	pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL);
-@@ -5338,42 +5337,15 @@ static int brcmf_construct_chaninfo(stru
- 		goto fail_pbuf;
- 	}
- 
--	brcmf_count_20mhz_channels(cfg, list, chcnt);
- 	wiphy = cfg_to_wiphy(cfg);
--	if (chcnt[0]) {
--		band = kmemdup(&__wl_band_2ghz, sizeof(__wl_band_2ghz),
--			       GFP_KERNEL);
--		if (band == NULL) {
--			err = -ENOMEM;
--			goto fail_pbuf;
--		}
--		band->channels = kcalloc(chcnt[0], sizeof(*channel),
--					 GFP_KERNEL);
--		if (band->channels == NULL) {
--			kfree(band);
--			err = -ENOMEM;
--			goto fail_pbuf;
--		}
--		band->n_channels = 0;
--		wiphy->bands[IEEE80211_BAND_2GHZ] = band;
--	}
--	if (chcnt[1]) {
--		band = kmemdup(&__wl_band_5ghz_a, sizeof(__wl_band_5ghz_a),
--			       GFP_KERNEL);
--		if (band == NULL) {
--			err = -ENOMEM;
--			goto fail_band2g;
--		}
--		band->channels = kcalloc(chcnt[1], sizeof(*channel),
--					 GFP_KERNEL);
--		if (band->channels == NULL) {
--			kfree(band);
--			err = -ENOMEM;
--			goto fail_band2g;
--		}
--		band->n_channels = 0;
--		wiphy->bands[IEEE80211_BAND_5GHZ] = band;
--	}
-+	band = wiphy->bands[IEEE80211_BAND_2GHZ];
-+	if (band)
-+		for (i = 0; i < band->n_channels; i++)
-+			band->channels[i].flags = IEEE80211_CHAN_DISABLED;
-+	band = wiphy->bands[IEEE80211_BAND_5GHZ];
-+	if (band)
-+		for (i = 0; i < band->n_channels; i++)
-+			band->channels[i].flags = IEEE80211_CHAN_DISABLED;
- 
- 	total = le32_to_cpu(list->count);
- 	for (i = 0; i < total; i++) {
-@@ -5388,6 +5360,8 @@ static int brcmf_construct_chaninfo(stru
- 			brcmf_err("Invalid channel Spec. 0x%x.\n", ch.chspec);
- 			continue;
- 		}
-+		if (!band)
-+			continue;
- 		if (!(bw_cap[band->band] & WLC_BW_40MHZ_BIT) &&
- 		    ch.bw == BRCMU_CHAN_BW_40)
- 			continue;
-@@ -5415,9 +5389,9 @@ static int brcmf_construct_chaninfo(stru
- 		} else if (ch.bw == BRCMU_CHAN_BW_40) {
- 			brcmf_update_bw40_channel_flag(&channel[index], &ch);
- 		} else {
--			/* disable other bandwidths for now as mentioned
--			 * order assure they are enabled for subsequent
--			 * chanspecs.
-+			/* enable the channel and disable other bandwidths
-+			 * for now as mentioned order assure they are enabled
-+			 * for subsequent chanspecs.
- 			 */
- 			channel[index].flags = IEEE80211_CHAN_NO_HT40 |
- 					       IEEE80211_CHAN_NO_80MHZ;
-@@ -5436,16 +5410,8 @@ static int brcmf_construct_chaninfo(stru
- 						IEEE80211_CHAN_NO_IR;
- 			}
- 		}
--		if (index == band->n_channels)
--			band->n_channels++;
- 	}
--	kfree(pbuf);
--	return 0;
- 
--fail_band2g:
--	kfree(wiphy->bands[IEEE80211_BAND_2GHZ]->channels);
--	kfree(wiphy->bands[IEEE80211_BAND_2GHZ]);
--	wiphy->bands[IEEE80211_BAND_2GHZ] = NULL;
- fail_pbuf:
- 	kfree(pbuf);
- 	return err;
-@@ -5778,7 +5744,12 @@ static void brcmf_wiphy_wowl_params(stru
- 
- static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
-+	struct ieee80211_supported_band *band;
- 	struct ieee80211_iface_combination ifc_combo;
-+	__le32 bandlist[3];
-+	u32 n_bands;
-+	int err, i;
-+
- 	wiphy->max_scan_ssids = WL_NUM_SCAN_MAX;
- 	wiphy->max_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX;
- 	wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX;
-@@ -5820,7 +5791,52 @@ static int brcmf_setup_wiphy(struct wiph
- 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
- 		brcmf_wiphy_wowl_params(wiphy);
- 
--	return brcmf_setup_wiphybands(wiphy);
-+	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist,
-+				     sizeof(bandlist));
-+	if (err) {
-+		brcmf_err("could not obtain band info: err=%d\n", err);
-+		return err;
-+	}
-+	/* first entry in bandlist is number of bands */
-+	n_bands = le32_to_cpu(bandlist[0]);
-+	for (i = 1; i <= n_bands && i < ARRAY_SIZE(bandlist); i++) {
-+		if (bandlist[i] == cpu_to_le32(WLC_BAND_2G)) {
-+			band = kmemdup(&__wl_band_2ghz, sizeof(__wl_band_2ghz),
-+				       GFP_KERNEL);
-+			if (!band)
-+				return -ENOMEM;
-+
-+			band->channels = kmemdup(&__wl_2ghz_channels,
-+						 sizeof(__wl_2ghz_channels),
-+						 GFP_KERNEL);
-+			if (!band->channels) {
-+				kfree(band);
-+				return -ENOMEM;
-+			}
-+
-+			band->n_channels = ARRAY_SIZE(__wl_2ghz_channels);
-+			wiphy->bands[IEEE80211_BAND_2GHZ] = band;
-+		}
-+		if (bandlist[i] == cpu_to_le32(WLC_BAND_5G)) {
-+			band = kmemdup(&__wl_band_5ghz, sizeof(__wl_band_5ghz),
-+				       GFP_KERNEL);
-+			if (!band)
-+				return -ENOMEM;
-+
-+			band->channels = kmemdup(&__wl_5ghz_channels,
-+						 sizeof(__wl_5ghz_channels),
-+						 GFP_KERNEL);
-+			if (!band->channels) {
-+				kfree(band);
-+				return -ENOMEM;
-+			}
-+
-+			band->n_channels = ARRAY_SIZE(__wl_5ghz_channels);
-+			wiphy->bands[IEEE80211_BAND_5GHZ] = band;
-+		}
-+	}
-+	err = brcmf_setup_wiphybands(wiphy);
-+	return err;
- }
- 
- static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
-@@ -6011,6 +6027,9 @@ static void brcmf_cfg80211_reg_notifier(
- 
- static void brcmf_free_wiphy(struct wiphy *wiphy)
- {
-+	if (!wiphy)
-+		return;
-+
- 	kfree(wiphy->iface_combinations);
- 	if (wiphy->bands[IEEE80211_BAND_2GHZ]) {
- 		kfree(wiphy->bands[IEEE80211_BAND_2GHZ]->channels);
diff --git a/package/kernel/mac80211/patches/339-0002-brcmfmac-update-wiphy-band-information-upon-updating.patch b/package/kernel/mac80211/patches/339-0002-brcmfmac-update-wiphy-band-information-upon-updating.patch
deleted file mode 100644
index a0c22eb411fd0fbdf4a20fecd0e563324bec53ac..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0002-brcmfmac-update-wiphy-band-information-upon-updating.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:25 +0200
-Subject: [PATCH] brcmfmac: update wiphy band information upon updating
- regulatory domain
-
-When change the country code the available channels may change. So
-the wiphy bands should be updated accordingly.
-
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6022,7 +6022,11 @@ static void brcmf_cfg80211_reg_notifier(
- 	memset(&ccreq, 0, sizeof(ccreq));
- 	ccreq.rev = cpu_to_le32(-1);
- 	memcpy(ccreq.ccode, req->alpha2, sizeof(req->alpha2));
--	brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq));
-+	if (brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq))) {
-+		brcmf_err("firmware rejected country setting\n");
-+		return;
-+	}
-+	brcmf_setup_wiphybands(wiphy);
- }
- 
- static void brcmf_free_wiphy(struct wiphy *wiphy)
diff --git a/package/kernel/mac80211/patches/339-0003-brcmfmac-add-description-for-feature-flags.patch b/package/kernel/mac80211/patches/339-0003-brcmfmac-add-description-for-feature-flags.patch
deleted file mode 100644
index 193f507d0de848ef30990633d39acabebe50789e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0003-brcmfmac-add-description-for-feature-flags.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:26 +0200
-Subject: [PATCH] brcmfmac: add description for feature flags
-
-Some feature flags were not described in the header file. Adding
-the description.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-@@ -19,7 +19,9 @@
- /*
-  * Features:
-  *
-+ * MBSS: multiple BSSID support (eg. guest network in AP mode).
-  * MCHAN: multi-channel for concurrent P2P.
-+ * WOWL: Wake-On-WLAN.
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
diff --git a/package/kernel/mac80211/patches/339-0004-brcmfmac-make-scheduled-scan-support-conditional.patch b/package/kernel/mac80211/patches/339-0004-brcmfmac-make-scheduled-scan-support-conditional.patch
deleted file mode 100644
index 42330b474e6c67693936f5215796e36d0c630b18..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0004-brcmfmac-make-scheduled-scan-support-conditional.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:27 +0200
-Subject: [PATCH] brcmfmac: make scheduled scan support conditional
-
-The scheduled scan support depends on firmware supporting the PNO
-feature. This feature is optional so add a feature flag for this
-in the driver and announce scheduled scan support accordingly.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -5782,7 +5782,8 @@ static int brcmf_setup_wiphy(struct wiph
- 		wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;
- 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
- 	wiphy->max_remain_on_channel_duration = 5000;
--	brcmf_wiphy_pno_params(wiphy);
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO))
-+		brcmf_wiphy_pno_params(wiphy);
- 
- 	/* vendor commands/events support */
- 	wiphy->vendor_commands = brcmf_vendor_cmds;
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-@@ -124,6 +124,7 @@ void brcmf_feat_attach(struct brcmf_pub
- 	struct brcmf_if *ifp = drvr->iflist[0];
- 
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MCHAN, "mchan");
-+	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn");
- 	if (drvr->bus_if->wowl_supported)
- 		brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
- 	if (drvr->bus_if->chip != BRCM_CC_43362_CHIP_ID)
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-@@ -21,11 +21,13 @@
-  *
-  * MBSS: multiple BSSID support (eg. guest network in AP mode).
-  * MCHAN: multi-channel for concurrent P2P.
-+ * PNO: preferred network offload.
-  * WOWL: Wake-On-WLAN.
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
- 	BRCMF_FEAT_DEF(MCHAN) \
-+	BRCMF_FEAT_DEF(PNO) \
- 	BRCMF_FEAT_DEF(WOWL)
- /*
-  * Quirks:
diff --git a/package/kernel/mac80211/patches/339-0005-brcmfmac-add-support-for-BCM4324-rev-B5-chipset.patch b/package/kernel/mac80211/patches/339-0005-brcmfmac-add-support-for-BCM4324-rev-B5-chipset.patch
deleted file mode 100644
index b859d46894547de9e250ca36f7b57e1244b46274..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0005-brcmfmac-add-support-for-BCM4324-rev-B5-chipset.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:28 +0200
-Subject: [PATCH] brcmfmac: add support for BCM4324 rev B5 chipset
-
-This patch adds support for the BCM4324 B5 revision. This device
-is similar to BCM43241 from driver and firmware perspective. It
-is known to be used in Lenovo Thinkpad Tablet devices.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -601,6 +601,8 @@ static const struct sdiod_drive_str sdio
- #define BCM43241B0_NVRAM_NAME		"brcm/brcmfmac43241b0-sdio.txt"
- #define BCM43241B4_FIRMWARE_NAME	"brcm/brcmfmac43241b4-sdio.bin"
- #define BCM43241B4_NVRAM_NAME		"brcm/brcmfmac43241b4-sdio.txt"
-+#define BCM43241B5_FIRMWARE_NAME	"brcm/brcmfmac43241b5-sdio.bin"
-+#define BCM43241B5_NVRAM_NAME		"brcm/brcmfmac43241b5-sdio.txt"
- #define BCM4329_FIRMWARE_NAME		"brcm/brcmfmac4329-sdio.bin"
- #define BCM4329_NVRAM_NAME		"brcm/brcmfmac4329-sdio.txt"
- #define BCM4330_FIRMWARE_NAME		"brcm/brcmfmac4330-sdio.bin"
-@@ -628,6 +630,8 @@ MODULE_FIRMWARE(BCM43241B0_FIRMWARE_NAME
- MODULE_FIRMWARE(BCM43241B0_NVRAM_NAME);
- MODULE_FIRMWARE(BCM43241B4_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM43241B4_NVRAM_NAME);
-+MODULE_FIRMWARE(BCM43241B5_FIRMWARE_NAME);
-+MODULE_FIRMWARE(BCM43241B5_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4329_FIRMWARE_NAME);
- MODULE_FIRMWARE(BCM4329_NVRAM_NAME);
- MODULE_FIRMWARE(BCM4330_FIRMWARE_NAME);
-@@ -667,7 +671,8 @@ enum brcmf_firmware_type {
- static const struct brcmf_firmware_names brcmf_fwname_data[] = {
- 	{ BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43143) },
- 	{ BRCM_CC_43241_CHIP_ID, 0x0000001F, BRCMF_FIRMWARE_NVRAM(BCM43241B0) },
--	{ BRCM_CC_43241_CHIP_ID, 0xFFFFFFE0, BRCMF_FIRMWARE_NVRAM(BCM43241B4) },
-+	{ BRCM_CC_43241_CHIP_ID, 0x00000020, BRCMF_FIRMWARE_NVRAM(BCM43241B4) },
-+	{ BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43241B5) },
- 	{ BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4329) },
- 	{ BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
- 	{ BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
diff --git a/package/kernel/mac80211/patches/339-0006-brcmfmac-process-interrupt-regardless-sdiod-state.patch b/package/kernel/mac80211/patches/339-0006-brcmfmac-process-interrupt-regardless-sdiod-state.patch
deleted file mode 100644
index d420308383167674068f749ac3c5067ae3340049..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0006-brcmfmac-process-interrupt-regardless-sdiod-state.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:29 +0200
-Subject: [PATCH] brcmfmac: process interrupt regardless sdiod state
-
-When the sdio bus state is not ready to process we abort the
-interrupt service routine. This is not wanted as it keeps the
-interrupt source active. Better clear the interrupt source.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -3555,10 +3555,6 @@ void brcmf_sdio_isr(struct brcmf_sdio *b
- 		return;
- 	}
- 
--	if (bus->sdiodev->state != BRCMF_SDIOD_DATA) {
--		brcmf_err("bus is down. we have nothing to do\n");
--		return;
--	}
- 	/* Count the interrupt call */
- 	bus->sdcnt.intrcount++;
- 	if (in_interrupt())
diff --git a/package/kernel/mac80211/patches/339-0007-brcmfmac-fix-sdio-suspend-and-resume.patch b/package/kernel/mac80211/patches/339-0007-brcmfmac-fix-sdio-suspend-and-resume.patch
deleted file mode 100644
index ac5584ec3cc869bd96251ef85192e3a962111c51..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0007-brcmfmac-fix-sdio-suspend-and-resume.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:30 +0200
-Subject: [PATCH] brcmfmac: fix sdio suspend and resume
-
-commit 330b4e4be937 ("brcmfmac: Add wowl support for SDIO devices.")
-changed the behaviour by removing the MMC_PM_KEEP_POWER flag for
-non-wowl scenario, which needs to be restored. Another necessary
-change is to mark the card as being non-removable. With this in place
-the suspend resume test passes successfully doing:
-
- # echo devices > /sys/power/pm_test
- # echo mem > /sys/power/state
-
-Note that power may still be switched off when system is going
-in S3 state.
-
-Reported-by: Fu, Zhonghui <<zhonghui.fu@linux.intel.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -1011,6 +1011,14 @@ static int brcmf_sdiod_remove(struct brc
- 	return 0;
- }
- 
-+static void brcmf_sdiod_host_fixup(struct mmc_host *host)
-+{
-+	/* runtime-pm powers off the device */
-+	pm_runtime_forbid(host->parent);
-+	/* avoid removal detection upon resume */
-+	host->caps |= MMC_CAP_NONREMOVABLE;
-+}
-+
- static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- {
- 	struct sdio_func *func;
-@@ -1076,7 +1084,7 @@ static int brcmf_sdiod_probe(struct brcm
- 		ret = -ENODEV;
- 		goto out;
- 	}
--	pm_runtime_forbid(host->parent);
-+	brcmf_sdiod_host_fixup(host);
- out:
- 	if (ret)
- 		brcmf_sdiod_remove(sdiodev);
-@@ -1246,15 +1254,15 @@ static int brcmf_ops_sdio_suspend(struct
- 	brcmf_sdiod_freezer_on(sdiodev);
- 	brcmf_sdio_wd_timer(sdiodev->bus, 0);
- 
-+	sdio_flags = MMC_PM_KEEP_POWER;
- 	if (sdiodev->wowl_enabled) {
--		sdio_flags = MMC_PM_KEEP_POWER;
- 		if (sdiodev->pdata->oob_irq_supported)
- 			enable_irq_wake(sdiodev->pdata->oob_irq_nr);
- 		else
--			sdio_flags = MMC_PM_WAKE_SDIO_IRQ;
--		if (sdio_set_host_pm_flags(sdiodev->func[1], sdio_flags))
--			brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
-+			sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
- 	}
-+	if (sdio_set_host_pm_flags(sdiodev->func[1], sdio_flags))
-+		brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
- 	return 0;
- }
- 
diff --git a/package/kernel/mac80211/patches/339-0008-brcmfmac-add-support-for-BCM4358-PCIe-device.patch b/package/kernel/mac80211/patches/339-0008-brcmfmac-add-support-for-BCM4358-PCIe-device.patch
deleted file mode 100644
index a521b65d0f039a2c208a13332c4c696d130be02d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0008-brcmfmac-add-support-for-BCM4358-PCIe-device.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:31 +0200
-Subject: [PATCH] brcmfmac: add support for BCM4358 PCIe device
-
-This patch adds support for the BCM4358 2x2 11ac device.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -649,6 +649,7 @@ static u32 brcmf_chip_tcm_rambase(struct
- 	case BRCM_CC_43567_CHIP_ID:
- 	case BRCM_CC_43569_CHIP_ID:
- 	case BRCM_CC_43570_CHIP_ID:
-+	case BRCM_CC_4358_CHIP_ID:
- 	case BRCM_CC_43602_CHIP_ID:
- 		return 0x180000;
- 	default:
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -51,6 +51,8 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_4356_NVRAM_NAME		"brcm/brcmfmac4356-pcie.txt"
- #define BRCMF_PCIE_43570_FW_NAME		"brcm/brcmfmac43570-pcie.bin"
- #define BRCMF_PCIE_43570_NVRAM_NAME		"brcm/brcmfmac43570-pcie.txt"
-+#define BRCMF_PCIE_4358_FW_NAME			"brcm/brcmfmac4358-pcie.bin"
-+#define BRCMF_PCIE_4358_NVRAM_NAME		"brcm/brcmfmac4358-pcie.txt"
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
- 
-@@ -189,6 +191,8 @@ MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME)
- MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4358_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4358_NVRAM_NAME);
- 
- 
- struct brcmf_pcie_console {
-@@ -1333,6 +1337,10 @@ static int brcmf_pcie_get_fwnames(struct
- 		fw_name = BRCMF_PCIE_43570_FW_NAME;
- 		nvram_name = BRCMF_PCIE_43570_NVRAM_NAME;
- 		break;
-+	case BRCM_CC_4358_CHIP_ID:
-+		fw_name = BRCMF_PCIE_4358_FW_NAME;
-+		nvram_name = BRCMF_PCIE_4358_NVRAM_NAME;
-+		break;
- 	default:
- 		brcmf_err("Unsupported chip 0x%04x\n", devinfo->ci->chip);
- 		return -ENODEV;
-@@ -1850,6 +1858,7 @@ static struct pci_device_id brcmf_pcie_d
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4358_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -45,6 +45,7 @@
- #define BRCM_CC_43567_CHIP_ID		43567
- #define BRCM_CC_43569_CHIP_ID		43569
- #define BRCM_CC_43570_CHIP_ID		43570
-+#define BRCM_CC_4358_CHIP_ID		0x4358
- #define BRCM_CC_43602_CHIP_ID		43602
- 
- /* USB Device IDs */
-@@ -59,6 +60,7 @@
- #define BRCM_PCIE_4356_DEVICE_ID	0x43ec
- #define BRCM_PCIE_43567_DEVICE_ID	0x43d3
- #define BRCM_PCIE_43570_DEVICE_ID	0x43d9
-+#define BRCM_PCIE_4358_DEVICE_ID	0x43e9
- #define BRCM_PCIE_43602_DEVICE_ID	0x43ba
- #define BRCM_PCIE_43602_2G_DEVICE_ID	0x43bb
- #define BRCM_PCIE_43602_5G_DEVICE_ID	0x43bc
diff --git a/package/kernel/mac80211/patches/339-0009-brcmfmac-add-additional-43602-pcie-device-id.patch b/package/kernel/mac80211/patches/339-0009-brcmfmac-add-additional-43602-pcie-device-id.patch
deleted file mode 100644
index bcbb984d42df2e8441074012d1ebe340114a2931..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0009-brcmfmac-add-additional-43602-pcie-device-id.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:32 +0200
-Subject: [PATCH] brcmfmac: add additional 43602 pcie device id.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -1862,6 +1862,7 @@ static struct pci_device_id brcmf_pcie_d
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID),
- 	{ /* end: all zeroes */ }
- };
- 
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -64,6 +64,7 @@
- #define BRCM_PCIE_43602_DEVICE_ID	0x43ba
- #define BRCM_PCIE_43602_2G_DEVICE_ID	0x43bb
- #define BRCM_PCIE_43602_5G_DEVICE_ID	0x43bc
-+#define BRCM_PCIE_43602_RAW_DEVICE_ID	43602
- 
- /* brcmsmac IDs */
- #define BCM4313_D11N2G_ID	0x4727	/* 4313 802.11n 2.4G device */
diff --git a/package/kernel/mac80211/patches/339-0010-brcmfmac-Add-support-for-multiple-PCIE-devices-in-nv.patch b/package/kernel/mac80211/patches/339-0010-brcmfmac-Add-support-for-multiple-PCIE-devices-in-nv.patch
deleted file mode 100644
index 5f9bbeaf5c5c7d8055174a0aa36c59967f461a56..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/339-0010-brcmfmac-Add-support-for-multiple-PCIE-devices-in-nv.patch
+++ /dev/null
@@ -1,351 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Tue, 14 Apr 2015 20:10:33 +0200
-Subject: [PATCH] brcmfmac: Add support for multiple PCIE devices in
- nvram.
-
-With PCIE it is possible to support multiple devices with the
-same device type. They all load the same nvram file. In order to
-support this the nvram can specify which part of the nvram is
-for which pcie device. This patch adds support for these new
-types of nvram files.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -23,6 +23,10 @@
- #include "debug.h"
- #include "firmware.h"
- 
-+#define BRCMF_FW_MAX_NVRAM_SIZE			64000
-+#define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */
-+#define BRCMF_FW_NVRAM_PCIEDEV_LEN		9	/* pcie/1/4/ */
-+
- char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
- module_param_string(firmware_path, brcmf_firmware_path,
- 		    BRCMF_FW_PATH_LEN, 0440);
-@@ -46,6 +50,8 @@ enum nvram_parser_state {
-  * @column: current column in line.
-  * @pos: byte offset in input buffer.
-  * @entry: start position of key,value entry.
-+ * @multi_dev_v1: detect pcie multi device v1 (compressed).
-+ * @multi_dev_v2: detect pcie multi device v2.
-  */
- struct nvram_parser {
- 	enum nvram_parser_state state;
-@@ -56,6 +62,8 @@ struct nvram_parser {
- 	u32 column;
- 	u32 pos;
- 	u32 entry;
-+	bool multi_dev_v1;
-+	bool multi_dev_v2;
- };
- 
- static bool is_nvram_char(char c)
-@@ -108,6 +116,10 @@ static enum nvram_parser_state brcmf_nvr
- 			st = COMMENT;
- 		else
- 			st = VALUE;
-+		if (strncmp(&nvp->fwnv->data[nvp->entry], "devpath", 7) == 0)
-+			nvp->multi_dev_v1 = true;
-+		if (strncmp(&nvp->fwnv->data[nvp->entry], "pcie/", 5) == 0)
-+			nvp->multi_dev_v2 = true;
- 	} else if (!is_nvram_char(c)) {
- 		brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
- 			  nvp->line, nvp->column);
-@@ -133,6 +145,8 @@ brcmf_nvram_handle_value(struct nvram_pa
- 		ekv = (u8 *)&nvp->fwnv->data[nvp->pos];
- 		skv = (u8 *)&nvp->fwnv->data[nvp->entry];
- 		cplen = ekv - skv;
-+		if (nvp->nvram_len + cplen + 1 >= BRCMF_FW_MAX_NVRAM_SIZE)
-+			return END;
- 		/* copy to output buffer */
- 		memcpy(&nvp->nvram[nvp->nvram_len], skv, cplen);
- 		nvp->nvram_len += cplen;
-@@ -180,10 +194,18 @@ static enum nvram_parser_state
- static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
- 				   const struct firmware *nv)
- {
-+	size_t size;
-+
- 	memset(nvp, 0, sizeof(*nvp));
- 	nvp->fwnv = nv;
-+	/* Limit size to MAX_NVRAM_SIZE, some files contain lot of comment */
-+	if (nv->size > BRCMF_FW_MAX_NVRAM_SIZE)
-+		size = BRCMF_FW_MAX_NVRAM_SIZE;
-+	else
-+		size = nv->size;
- 	/* Alloc for extra 0 byte + roundup by 4 + length field */
--	nvp->nvram = kzalloc(nv->size + 1 + 3 + sizeof(u32), GFP_KERNEL);
-+	size += 1 + 3 + sizeof(u32);
-+	nvp->nvram = kzalloc(size, GFP_KERNEL);
- 	if (!nvp->nvram)
- 		return -ENOMEM;
- 
-@@ -192,12 +214,136 @@ static int brcmf_init_nvram_parser(struc
- 	return 0;
- }
- 
-+/* brcmf_fw_strip_multi_v1 :Some nvram files contain settings for multiple
-+ * devices. Strip it down for one device, use domain_nr/bus_nr to determine
-+ * which data is to be returned. v1 is the version where nvram is stored
-+ * compressed and "devpath" maps to index for valid entries.
-+ */
-+static void brcmf_fw_strip_multi_v1(struct nvram_parser *nvp, u16 domain_nr,
-+				    u16 bus_nr)
-+{
-+	u32 i, j;
-+	bool found;
-+	u8 *nvram;
-+	u8 id;
-+
-+	nvram = kzalloc(nvp->nvram_len + 1 + 3 + sizeof(u32), GFP_KERNEL);
-+	if (!nvram)
-+		goto fail;
-+
-+	/* min length: devpath0=pcie/1/4/ + 0:x=y */
-+	if (nvp->nvram_len < BRCMF_FW_NVRAM_DEVPATH_LEN + 6)
-+		goto fail;
-+
-+	/* First search for the devpathX and see if it is the configuration
-+	 * for domain_nr/bus_nr. Search complete nvp
-+	 */
-+	found = false;
-+	i = 0;
-+	while (i < nvp->nvram_len - BRCMF_FW_NVRAM_DEVPATH_LEN) {
-+		/* Format: devpathX=pcie/Y/Z/
-+		 * Y = domain_nr, Z = bus_nr, X = virtual ID
-+		 */
-+		if ((strncmp(&nvp->nvram[i], "devpath", 7) == 0) &&
-+		    (strncmp(&nvp->nvram[i + 8], "=pcie/", 6) == 0)) {
-+			if (((nvp->nvram[i + 14] - '0') == domain_nr) &&
-+			    ((nvp->nvram[i + 16] - '0') == bus_nr)) {
-+				id = nvp->nvram[i + 7] - '0';
-+				found = true;
-+				break;
-+			}
-+		}
-+		while (nvp->nvram[i] != 0)
-+			i++;
-+		i++;
-+	}
-+	if (!found)
-+		goto fail;
-+
-+	/* Now copy all valid entries, release old nvram and assign new one */
-+	i = 0;
-+	j = 0;
-+	while (i < nvp->nvram_len) {
-+		if ((nvp->nvram[i] - '0' == id) && (nvp->nvram[i + 1] == ':')) {
-+			i += 2;
-+			while (nvp->nvram[i] != 0) {
-+				nvram[j] = nvp->nvram[i];
-+				i++;
-+				j++;
-+			}
-+			nvram[j] = 0;
-+			j++;
-+		}
-+		while (nvp->nvram[i] != 0)
-+			i++;
-+		i++;
-+	}
-+	kfree(nvp->nvram);
-+	nvp->nvram = nvram;
-+	nvp->nvram_len = j;
-+	return;
-+
-+fail:
-+	kfree(nvram);
-+	nvp->nvram_len = 0;
-+}
-+
-+/* brcmf_fw_strip_multi_v2 :Some nvram files contain settings for multiple
-+ * devices. Strip it down for one device, use domain_nr/bus_nr to determine
-+ * which data is to be returned. v2 is the version where nvram is stored
-+ * uncompressed, all relevant valid entries are identified by
-+ * pcie/domain_nr/bus_nr:
-+ */
-+static void brcmf_fw_strip_multi_v2(struct nvram_parser *nvp, u16 domain_nr,
-+				    u16 bus_nr)
-+{
-+	u32 i, j;
-+	u8 *nvram;
-+
-+	nvram = kzalloc(nvp->nvram_len + 1 + 3 + sizeof(u32), GFP_KERNEL);
-+	if (!nvram)
-+		goto fail;
-+
-+	/* Copy all valid entries, release old nvram and assign new one.
-+	 * Valid entries are of type pcie/X/Y/ where X = domain_nr and
-+	 * Y = bus_nr.
-+	 */
-+	i = 0;
-+	j = 0;
-+	while (i < nvp->nvram_len - BRCMF_FW_NVRAM_PCIEDEV_LEN) {
-+		if ((strncmp(&nvp->nvram[i], "pcie/", 5) == 0) &&
-+		    (nvp->nvram[i + 6] == '/') && (nvp->nvram[i + 8] == '/') &&
-+		    ((nvp->nvram[i + 5] - '0') == domain_nr) &&
-+		    ((nvp->nvram[i + 7] - '0') == bus_nr)) {
-+			i += BRCMF_FW_NVRAM_PCIEDEV_LEN;
-+			while (nvp->nvram[i] != 0) {
-+				nvram[j] = nvp->nvram[i];
-+				i++;
-+				j++;
-+			}
-+			nvram[j] = 0;
-+			j++;
-+		}
-+		while (nvp->nvram[i] != 0)
-+			i++;
-+		i++;
-+	}
-+	kfree(nvp->nvram);
-+	nvp->nvram = nvram;
-+	nvp->nvram_len = j;
-+	return;
-+fail:
-+	kfree(nvram);
-+	nvp->nvram_len = 0;
-+}
-+
- /* brcmf_nvram_strip :Takes a buffer of "<var>=<value>\n" lines read from a fil
-  * and ending in a NUL. Removes carriage returns, empty lines, comment lines,
-  * and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
-  * End of buffer is completed with token identifying length of buffer.
-  */
--static void *brcmf_fw_nvram_strip(const struct firmware *nv, u32 *new_length)
-+static void *brcmf_fw_nvram_strip(const struct firmware *nv, u32 *new_length,
-+				  u16 domain_nr, u16 bus_nr)
- {
- 	struct nvram_parser nvp;
- 	u32 pad;
-@@ -212,6 +358,16 @@ static void *brcmf_fw_nvram_strip(const
- 		if (nvp.state == END)
- 			break;
- 	}
-+	if (nvp.multi_dev_v1)
-+		brcmf_fw_strip_multi_v1(&nvp, domain_nr, bus_nr);
-+	else if (nvp.multi_dev_v2)
-+		brcmf_fw_strip_multi_v2(&nvp, domain_nr, bus_nr);
-+
-+	if (nvp.nvram_len == 0) {
-+		kfree(nvp.nvram);
-+		return NULL;
-+	}
-+
- 	pad = nvp.nvram_len;
- 	*new_length = roundup(nvp.nvram_len + 1, 4);
- 	while (pad != *new_length) {
-@@ -239,6 +395,8 @@ struct brcmf_fw {
- 	u16 flags;
- 	const struct firmware *code;
- 	const char *nvram_name;
-+	u16 domain_nr;
-+	u16 bus_nr;
- 	void (*done)(struct device *dev, const struct firmware *fw,
- 		     void *nvram_image, u32 nvram_len);
- };
-@@ -254,7 +412,8 @@ static void brcmf_fw_request_nvram_done(
- 		goto fail;
- 
- 	if (fw) {
--		nvram = brcmf_fw_nvram_strip(fw, &nvram_length);
-+		nvram = brcmf_fw_nvram_strip(fw, &nvram_length,
-+					     fwctx->domain_nr, fwctx->bus_nr);
- 		release_firmware(fw);
- 		if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
- 			goto fail;
-@@ -309,11 +468,12 @@ fail:
- 	kfree(fwctx);
- }
- 
--int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
--			   const char *code, const char *nvram,
--			   void (*fw_cb)(struct device *dev,
--					 const struct firmware *fw,
--					 void *nvram_image, u32 nvram_len))
-+int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
-+				const char *code, const char *nvram,
-+				void (*fw_cb)(struct device *dev,
-+					      const struct firmware *fw,
-+					      void *nvram_image, u32 nvram_len),
-+				u16 domain_nr, u16 bus_nr)
- {
- 	struct brcmf_fw *fwctx;
- 
-@@ -333,8 +493,21 @@ int brcmf_fw_get_firmwares(struct device
- 	fwctx->done = fw_cb;
- 	if (flags & BRCMF_FW_REQUEST_NVRAM)
- 		fwctx->nvram_name = nvram;
-+	fwctx->domain_nr = domain_nr;
-+	fwctx->bus_nr = bus_nr;
- 
- 	return request_firmware_nowait(THIS_MODULE, true, code, dev,
- 				       GFP_KERNEL, fwctx,
- 				       brcmf_fw_request_code_done);
- }
-+
-+int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
-+			   const char *code, const char *nvram,
-+			   void (*fw_cb)(struct device *dev,
-+					 const struct firmware *fw,
-+					 void *nvram_image, u32 nvram_len))
-+{
-+	return brcmf_fw_get_firmwares_pcie(dev, flags, code, nvram, fw_cb, 0,
-+					   0);
-+}
-+
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.h
-@@ -32,6 +32,12 @@ void brcmf_fw_nvram_free(void *nvram);
-  * fails it will not use the callback, but call device_release_driver()
-  * instead which will call the driver .remove() callback.
-  */
-+int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
-+				const char *code, const char *nvram,
-+				void (*fw_cb)(struct device *dev,
-+					      const struct firmware *fw,
-+					      void *nvram_image, u32 nvram_len),
-+				u16 domain_nr, u16 bus_nr);
- int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
- 			   const char *code, const char *nvram,
- 			   void (*fw_cb)(struct device *dev,
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -1649,8 +1649,13 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
- 	struct brcmf_pciedev_info *devinfo;
- 	struct brcmf_pciedev *pcie_bus_dev;
- 	struct brcmf_bus *bus;
-+	u16 domain_nr;
-+	u16 bus_nr;
- 
--	brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
-+	domain_nr = pci_domain_nr(pdev->bus) + 1;
-+	bus_nr = pdev->bus->number;
-+	brcmf_dbg(PCIE, "Enter %x:%x (%d/%d)\n", pdev->vendor, pdev->device,
-+		  domain_nr, bus_nr);
- 
- 	ret = -ENOMEM;
- 	devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
-@@ -1699,10 +1704,10 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
- 	if (ret)
- 		goto fail_bus;
- 
--	ret = brcmf_fw_get_firmwares(bus->dev, BRCMF_FW_REQUEST_NVRAM |
--					       BRCMF_FW_REQ_NV_OPTIONAL,
--				     devinfo->fw_name, devinfo->nvram_name,
--				     brcmf_pcie_setup);
-+	ret = brcmf_fw_get_firmwares_pcie(bus->dev, BRCMF_FW_REQUEST_NVRAM |
-+						    BRCMF_FW_REQ_NV_OPTIONAL,
-+					  devinfo->fw_name, devinfo->nvram_name,
-+					  brcmf_pcie_setup, domain_nr, bus_nr);
- 	if (ret == 0)
- 		return 0;
- fail_bus:
diff --git a/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch b/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch
new file mode 100644
index 0000000000000000000000000000000000000000..15d6cd03eae1c5b2380cb718238762cbf5f5a5b6
--- /dev/null
+++ b/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch
@@ -0,0 +1,21 @@
+From: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+Date: Fri, 19 Feb 2016 11:43:04 +0100
+Subject: [PATCH] cfg80211: add radiotap VHT info to rtap_namespace_sizes
+
+Add IEEE80211_RADIOTAP_VHT entry to rtap_namespace_sizes array in order to
+define alignment and size of VHT info in tx radiotap
+
+Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/wireless/radiotap.c
++++ b/net/wireless/radiotap.c
+@@ -43,6 +43,7 @@ static const struct radiotap_align_size
+ 	[IEEE80211_RADIOTAP_DATA_RETRIES] = { .align = 1, .size = 1, },
+ 	[IEEE80211_RADIOTAP_MCS] = { .align = 1, .size = 3, },
+ 	[IEEE80211_RADIOTAP_AMPDU_STATUS] = { .align = 4, .size = 8, },
++	[IEEE80211_RADIOTAP_VHT] = { .align = 2, .size = 12, },
+ 	/*
+ 	 * add more here as they are defined in radiotap.h
+ 	 */
diff --git a/package/kernel/mac80211/patches/340-brcmfmac-cleanup-a-sizeof.patch b/package/kernel/mac80211/patches/340-brcmfmac-cleanup-a-sizeof.patch
deleted file mode 100644
index d26e118d77691695a8af69592a39d0ad349b73c6..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/340-brcmfmac-cleanup-a-sizeof.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Dan Carpenter <dan.carpenter@oracle.com>
-Date: Thu, 7 May 2015 12:59:19 +0300
-Subject: [PATCH] brcmfmac: cleanup a sizeof()
-
-"flowrings" and "*flowrings" are both pointers so this always returns
-sizeof(void *) and the current code works fine.  But "*flowrings" is
-intended here and static checkers complain, so lets change it.
-
-Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -1617,7 +1617,7 @@ static void brcmf_pcie_setup(struct devi
- 		bus->msgbuf->commonrings[i] =
- 				&devinfo->shared.commonrings[i]->commonring;
- 
--	flowrings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(flowrings),
-+	flowrings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*flowrings),
- 			    GFP_KERNEL);
- 	if (!flowrings)
- 		goto fail;
diff --git a/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch b/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch
new file mode 100644
index 0000000000000000000000000000000000000000..de1b38625c3845be51df0f34c2b82290651ca4be
--- /dev/null
+++ b/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch
@@ -0,0 +1,36 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Wed, 24 Feb 2016 16:25:49 +0100
+Subject: [PATCH] mac80211: fix parsing of 40Mhz in injected radiotap
+ header
+
+The MCS bandwidth part of the radiotap header is 2 bits wide. The full 2
+bit have to compared against IEEE80211_RADIOTAP_MCS_BW_40 and not only if
+the first bit is set. Otherwise IEEE80211_RADIOTAP_MCS_BW_40 can be
+confused with IEEE80211_RADIOTAP_MCS_BW_20U.
+
+Fixes: 5ec3aed9ba4c ("mac80211: Parse legacy and HT rate in injected frames")
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+---
+
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1689,7 +1689,7 @@ static bool ieee80211_parse_tx_radiotap(
+ 	bool rate_found = false;
+ 	u8 rate_retries = 0;
+ 	u16 rate_flags = 0;
+-	u8 mcs_known, mcs_flags;
++	u8 mcs_known, mcs_flags, mcs_bw;
+ 	int i;
+ 
+ 	info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
+@@ -1765,8 +1765,9 @@ static bool ieee80211_parse_tx_radiotap(
+ 			    mcs_flags & IEEE80211_RADIOTAP_MCS_SGI)
+ 				rate_flags |= IEEE80211_TX_RC_SHORT_GI;
+ 
++			mcs_bw = mcs_flags & IEEE80211_RADIOTAP_MCS_BW_MASK;
+ 			if (mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_BW &&
+-			    mcs_flags & IEEE80211_RADIOTAP_MCS_BW_40)
++			    mcs_bw == IEEE80211_RADIOTAP_MCS_BW_40)
+ 				rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
+ 			break;
+ 
diff --git a/package/kernel/mac80211/patches/341-brcmfmac-check-result-of-USB-firmware-request.patch b/package/kernel/mac80211/patches/341-brcmfmac-check-result-of-USB-firmware-request.patch
deleted file mode 100644
index 9b2880d8fcf7f138a469661a8dbc55e15efe81ad..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/341-brcmfmac-check-result-of-USB-firmware-request.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Thu, 7 May 2015 14:13:03 +0200
-Subject: [PATCH] brcmfmac: check result of USB firmware request
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This prevents silence failures with driver waiting (infinitely) for a
-callback.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-@@ -1270,8 +1270,13 @@ static int brcmf_usb_probe_cb(struct brc
- 	bus->chiprev = bus_pub->chiprev;
- 
- 	/* request firmware here */
--	brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo), NULL,
--			       brcmf_usb_probe_phase2);
-+	ret = brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo),
-+				     NULL, brcmf_usb_probe_phase2);
-+	if (ret) {
-+		brcmf_err("firmware request failed: %d\n", ret);
-+		goto fail;
-+	}
-+
- 	return 0;
- 
- fail:
diff --git a/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch b/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ac1f2517f29973c74cdd32301b32d1be93fcefb1
--- /dev/null
+++ b/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch
@@ -0,0 +1,65 @@
+From: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+Date: Tue, 23 Feb 2016 15:43:35 +0100
+Subject: [PATCH] mac80211: parse VHT info in injected frames
+
+Add VHT radiotap parsing support to ieee80211_parse_tx_radiotap().
+That capability has been tested using a d-link dir-860l rev b1 running
+OpenWrt trunk and mt76 driver
+
+Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+---
+
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1690,6 +1690,8 @@ static bool ieee80211_parse_tx_radiotap(
+ 	u8 rate_retries = 0;
+ 	u16 rate_flags = 0;
+ 	u8 mcs_known, mcs_flags, mcs_bw;
++	u16 vht_known;
++	u8 vht_mcs = 0, vht_nss = 0;
+ 	int i;
+ 
+ 	info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
+@@ -1771,6 +1773,32 @@ static bool ieee80211_parse_tx_radiotap(
+ 				rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
+ 			break;
+ 
++		case IEEE80211_RADIOTAP_VHT:
++			vht_known = get_unaligned_le16(iterator.this_arg);
++			rate_found = true;
++
++			rate_flags = IEEE80211_TX_RC_VHT_MCS;
++			if ((vht_known & IEEE80211_RADIOTAP_VHT_KNOWN_GI) &&
++			    (iterator.this_arg[2] &
++			     IEEE80211_RADIOTAP_VHT_FLAG_SGI))
++				rate_flags |= IEEE80211_TX_RC_SHORT_GI;
++			if (vht_known &
++			    IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH) {
++				if (iterator.this_arg[3] == 1)
++					rate_flags |=
++						IEEE80211_TX_RC_40_MHZ_WIDTH;
++				else if (iterator.this_arg[3] == 4)
++					rate_flags |=
++						IEEE80211_TX_RC_80_MHZ_WIDTH;
++				else if (iterator.this_arg[3] == 11)
++					rate_flags |=
++						IEEE80211_TX_RC_160_MHZ_WIDTH;
++			}
++
++			vht_mcs = iterator.this_arg[4] >> 4;
++			vht_nss = iterator.this_arg[4] & 0xF;
++			break;
++
+ 		/*
+ 		 * Please update the file
+ 		 * Documentation/networking/mac80211-injection.txt
+@@ -1796,6 +1824,9 @@ static bool ieee80211_parse_tx_radiotap(
+ 
+ 		if (rate_flags & IEEE80211_TX_RC_MCS) {
+ 			info->control.rates[0].idx = rate;
++		} else if (rate_flags & IEEE80211_TX_RC_VHT_MCS) {
++			ieee80211_rate_set_vht(info->control.rates, vht_mcs,
++					       vht_nss);
+ 		} else {
+ 			for (i = 0; i < sband->n_bitrates; i++) {
+ 				if (rate * 5 != sband->bitrates[i].bitrate)
diff --git a/package/kernel/mac80211/patches/342-brcmfmac-prohibit-ACPI-power-management-for-brcmfmac.patch b/package/kernel/mac80211/patches/342-brcmfmac-prohibit-ACPI-power-management-for-brcmfmac.patch
deleted file mode 100644
index d46b300daaec3c3d5aae5aa0142c66fea91a013a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/342-brcmfmac-prohibit-ACPI-power-management-for-brcmfmac.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From: "Fu, Zhonghui" <zhonghui.fu@linux.intel.com>
-Date: Mon, 11 May 2015 10:41:32 +0800
-Subject: [PATCH] brcmfmac: prohibit ACPI power management for brcmfmac driver
-
-ACPI will manage WiFi chip's power state during suspend/resume
-process on some tablet platforms(such as ASUS T100TA). This is
-not supported by brcmfmac driver now, and the context of WiFi
-chip will be damaged after resume. This patch informs ACPI not
-to manage WiFi chip's power state.
-
-Signed-off-by: Zhonghui Fu <zhonghui.fu@linux.intel.com>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -33,6 +33,7 @@
- #include <linux/suspend.h>
- #include <linux/errno.h>
- #include <linux/module.h>
-+#include <linux/acpi.h>
- #include <net/cfg80211.h>
- 
- #include <defs.h>
-@@ -1122,6 +1123,8 @@ static int brcmf_ops_sdio_probe(struct s
- 	int err;
- 	struct brcmf_sdio_dev *sdiodev;
- 	struct brcmf_bus *bus_if;
-+	struct device *dev;
-+	struct acpi_device *adev;
- 
- 	brcmf_dbg(SDIO, "Enter\n");
- 	brcmf_dbg(SDIO, "Class=%x\n", func->class);
-@@ -1129,6 +1132,12 @@ static int brcmf_ops_sdio_probe(struct s
- 	brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
- 	brcmf_dbg(SDIO, "Function#: %d\n", func->num);
- 
-+	/* prohibit ACPI power management for this device */
-+	dev = &func->dev;
-+	adev = ACPI_COMPANION(dev);
-+	if (adev)
-+		adev->flags.power_manageable = 0;
-+
- 	/* Consume func num 1 but dont do anything with it. */
- 	if (func->num == 1)
- 		return 0;
diff --git a/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch b/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d7452c29c1fad9ee170199c33b260161b603032a
--- /dev/null
+++ b/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch
@@ -0,0 +1,23 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Wed, 2 Mar 2016 15:51:40 +0100
+Subject: [PATCH] mac80211: do not pass injected frames without a valid rate to
+ the driver
+
+Fall back to rate control if the requested bitrate was not found.
+
+Fixes: dfdfc2beb0dd ("mac80211: Parse legacy and HT rate in injected frames")
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1837,6 +1837,9 @@ static bool ieee80211_parse_tx_radiotap(
+ 			}
+ 		}
+ 
++		if (info->control.rates[0].idx < 0)
++			info->control.flags &= ~IEEE80211_TX_CTRL_RATE_INJECT;
++
+ 		info->control.rates[0].flags = rate_flags;
+ 		info->control.rates[0].count = min_t(u8, rate_retries + 1,
+ 						     local->hw.max_rate_tries);
diff --git a/package/kernel/mac80211/patches/343-brcmfmac-avoid-gcc-5.1-warning.patch b/package/kernel/mac80211/patches/343-brcmfmac-avoid-gcc-5.1-warning.patch
deleted file mode 100644
index 9b4609fb7545a0ebfa8404fb6bd118ca0e6be69e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/343-brcmfmac-avoid-gcc-5.1-warning.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Arnd Bergmann <arnd@arndb.de>
-Date: Tue, 12 May 2015 23:54:25 +0200
-Subject: [PATCH] brcmfmac: avoid gcc-5.1 warning
-
-gcc-5.0 gained a new warning in the fwsignal portion of the brcmfmac
-driver:
-
-drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c: In function 'brcmf_fws_txs_process':
-drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c:1478:8: warning: 'skb' may be used uninitialized in this function [-Wmaybe-uninitialized]
-
-This is a false positive, and marking the brcmf_fws_hanger_poppkt function
-as 'static inline' makes the warning go away. I have checked the object
-file output and while a little code gets moved around, the size of
-the binary remains identical.
-
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -635,7 +635,7 @@ static int brcmf_fws_hanger_pushpkt(stru
- 	return 0;
- }
- 
--static int brcmf_fws_hanger_poppkt(struct brcmf_fws_hanger *h,
-+static inline int brcmf_fws_hanger_poppkt(struct brcmf_fws_hanger *h,
- 					  u32 slot_id, struct sk_buff **pktout,
- 					  bool remove_item)
- {
diff --git a/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch b/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch
new file mode 100644
index 0000000000000000000000000000000000000000..55ff817009294fde4c61548f95a49ca506d15b4d
--- /dev/null
+++ b/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch
@@ -0,0 +1,77 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Thu, 3 Mar 2016 23:20:06 +0100
+Subject: [PATCH] mac80211: minstrel_ht: improve sample rate skip logic
+
+There were a few issues that were slowing down the process of finding
+the optimal rate, especially on devices with multi-rate retry
+limitations:
+
+When max_tp_rate[0] was slower than max_tp_rate[1], the code did not
+sample max_tp_rate[1], which would often allow it to switch places with
+max_tp_rate[0] (e.g. if only the first sampling attempts were bad, but the
+rate is otherwise good).
+
+Also, sample attempts of rates between max_tp_rate[0] and [1] were being
+ignored in this case, because the code only checked if the rate was
+slower than [1].
+
+Fix this by checking against the fastest / second fastest max_tp_rate
+instead of assuming a specific order between the two.
+
+In my tests this patch significantly reduces the time until minstrel_ht
+finds the optimal rate right after assoc
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -958,6 +958,7 @@ minstrel_get_sample_rate(struct minstrel
+ 	struct minstrel_rate_stats *mrs;
+ 	struct minstrel_mcs_group_data *mg;
+ 	unsigned int sample_dur, sample_group, cur_max_tp_streams;
++	int tp_rate1, tp_rate2;
+ 	int sample_idx = 0;
+ 
+ 	if (mi->sample_wait > 0) {
+@@ -979,14 +980,22 @@ minstrel_get_sample_rate(struct minstrel
+ 	mrs = &mg->rates[sample_idx];
+ 	sample_idx += sample_group * MCS_GROUP_RATES;
+ 
++	/* Set tp_rate1, tp_rate2 to the highest / second highest max_tp_rate */
++	if (minstrel_get_duration(mi->max_tp_rate[0]) >
++	    minstrel_get_duration(mi->max_tp_rate[1])) {
++		tp_rate1 = mi->max_tp_rate[1];
++		tp_rate2 = mi->max_tp_rate[0];
++	} else {
++		tp_rate1 = mi->max_tp_rate[0];
++		tp_rate2 = mi->max_tp_rate[1];
++	}
++
+ 	/*
+ 	 * Sampling might add some overhead (RTS, no aggregation)
+-	 * to the frame. Hence, don't use sampling for the currently
+-	 * used rates.
++	 * to the frame. Hence, don't use sampling for the highest currently
++	 * used highest throughput or probability rate.
+ 	 */
+-	if (sample_idx == mi->max_tp_rate[0] ||
+-	    sample_idx == mi->max_tp_rate[1] ||
+-	    sample_idx == mi->max_prob_rate)
++	if (sample_idx == mi->max_tp_rate[0] || sample_idx == mi->max_prob_rate)
+ 		return -1;
+ 
+ 	/*
+@@ -1001,10 +1010,10 @@ minstrel_get_sample_rate(struct minstrel
+ 	 * if the link is working perfectly.
+ 	 */
+ 
+-	cur_max_tp_streams = minstrel_mcs_groups[mi->max_tp_rate[0] /
++	cur_max_tp_streams = minstrel_mcs_groups[tp_rate1 /
+ 		MCS_GROUP_RATES].streams;
+ 	sample_dur = minstrel_get_duration(sample_idx);
+-	if (sample_dur >= minstrel_get_duration(mi->max_tp_rate[1]) &&
++	if (sample_dur >= minstrel_get_duration(tp_rate2) &&
+ 	    (cur_max_tp_streams - 1 <
+ 	     minstrel_mcs_groups[sample_group].streams ||
+ 	     sample_dur >= minstrel_get_duration(mi->max_prob_rate))) {
diff --git a/package/kernel/mac80211/patches/344-0001-brcmfmac-allow-device-tree-node-without-interrupts-p.patch b/package/kernel/mac80211/patches/344-0001-brcmfmac-allow-device-tree-node-without-interrupts-p.patch
deleted file mode 100644
index b16782d59379d13b9a50856d429055004f483419..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/344-0001-brcmfmac-allow-device-tree-node-without-interrupts-p.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 20 May 2015 14:09:47 +0200
-Subject: [PATCH] brcmfmac: allow device tree node without 'interrupts'
- property
-
-As described in the device tree bindings for 'brcm,bcm4329-fmac'
-nodes, the interrupts property is optional. So adding a check
-for the presence of this property before attempting to parse
-and map the interrupt. If not present or parsing fails return
-and fallback to in-band sdio interrupt.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/of.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/of.c
-@@ -39,10 +39,16 @@ void brcmf_of_probe(struct brcmf_sdio_de
- 	if (!sdiodev->pdata)
- 		return;
- 
-+	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
-+		sdiodev->pdata->drive_strength = val;
-+
-+	/* make sure there are interrupts defined in the node */
-+	if (!of_find_property(np, "interrupts", NULL))
-+		return;
-+
- 	irq = irq_of_parse_and_map(np, 0);
- 	if (!irq) {
- 		brcmf_err("interrupt could not be mapped\n");
--		devm_kfree(dev, sdiodev->pdata);
- 		return;
- 	}
- 	irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
-@@ -50,7 +56,4 @@ void brcmf_of_probe(struct brcmf_sdio_de
- 	sdiodev->pdata->oob_irq_supported = true;
- 	sdiodev->pdata->oob_irq_nr = irq;
- 	sdiodev->pdata->oob_irq_flags = irqf;
--
--	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
--		sdiodev->pdata->drive_strength = val;
- }
diff --git a/package/kernel/mac80211/patches/344-0002-brcmfmac-Improve-throughput-by-scheduling-msbug-flow.patch b/package/kernel/mac80211/patches/344-0002-brcmfmac-Improve-throughput-by-scheduling-msbug-flow.patch
deleted file mode 100644
index f81250ee4c16430a642e0dba2ae67ee52e0be830..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/344-0002-brcmfmac-Improve-throughput-by-scheduling-msbug-flow.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 20 May 2015 14:09:48 +0200
-Subject: [PATCH] brcmfmac: Improve throughput by scheduling msbug flow worker.
-
-The tx flow worker in msgbuf gets scheduled at tx till a certain
-threshold has been reached. Then the tx completes will take over
-the scheduling. When amsdu and ampdu is used the frames are
-transferred wireless in a very bulky fashion, in combination
-with this scheduling algorithm and buffer limiters in the stack
-this can result in limited throughput. This change causes the
-flow worker to be scheduled more frequently from tx.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
-@@ -249,8 +249,8 @@ void brcmf_flowring_delete(struct brcmf_
- }
- 
- 
--void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
--			    struct sk_buff *skb)
-+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
-+			   struct sk_buff *skb)
- {
- 	struct brcmf_flowring_ring *ring;
- 
-@@ -271,6 +271,7 @@ void brcmf_flowring_enqueue(struct brcmf
- 		if (skb_queue_len(&ring->skblist) < BRCMF_FLOWRING_LOW)
- 			brcmf_flowring_block(flow, flowid, false);
- 	}
-+	return skb_queue_len(&ring->skblist);
- }
- 
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
-@@ -64,8 +64,8 @@ u32 brcmf_flowring_create(struct brcmf_f
- void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid);
- void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid);
- u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid);
--void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
--			    struct sk_buff *skb);
-+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
-+			   struct sk_buff *skb);
- struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid);
- void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
- 			     struct sk_buff *skb);
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -73,7 +73,7 @@
- #define BRCMF_MSGBUF_TX_FLUSH_CNT1		32
- #define BRCMF_MSGBUF_TX_FLUSH_CNT2		96
- 
--#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS	64
-+#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS	96
- #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS	32
- 
- struct msgbuf_common_hdr {
-@@ -797,6 +797,8 @@ static int brcmf_msgbuf_txdata(struct br
- 	struct brcmf_flowring *flow = msgbuf->flow;
- 	struct ethhdr *eh = (struct ethhdr *)(skb->data);
- 	u32 flowid;
-+	u32 queue_count;
-+	bool force;
- 
- 	flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
- 	if (flowid == BRCMF_FLOWRING_INVALID_ID) {
-@@ -804,8 +806,9 @@ static int brcmf_msgbuf_txdata(struct br
- 		if (flowid == BRCMF_FLOWRING_INVALID_ID)
- 			return -ENOMEM;
- 	}
--	brcmf_flowring_enqueue(flow, flowid, skb);
--	brcmf_msgbuf_schedule_txdata(msgbuf, flowid, false);
-+	queue_count = brcmf_flowring_enqueue(flow, flowid, skb);
-+	force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0);
-+	brcmf_msgbuf_schedule_txdata(msgbuf, flowid, force);
- 
- 	return 0;
- }
diff --git a/package/kernel/mac80211/patches/344-0003-brcmfmac-remove-pci-shared-structure-rev4-support.patch b/package/kernel/mac80211/patches/344-0003-brcmfmac-remove-pci-shared-structure-rev4-support.patch
deleted file mode 100644
index 61153c4a988ff618203e2e315601702ff0b2b6ef..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/344-0003-brcmfmac-remove-pci-shared-structure-rev4-support.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Wed, 20 May 2015 14:09:49 +0200
-Subject: [PATCH] brcmfmac: remove pci shared structure rev4 support
-
-All pcie full dongle chips supported by fmac are using rev 5+ shared
-structure. This patch removes the rev4 related code.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -112,10 +112,9 @@ enum brcmf_pcie_state {
- 						 BRCMF_PCIE_MB_INT_D2H3_DB0 | \
- 						 BRCMF_PCIE_MB_INT_D2H3_DB1)
- 
--#define BRCMF_PCIE_MIN_SHARED_VERSION		4
-+#define BRCMF_PCIE_MIN_SHARED_VERSION		5
- #define BRCMF_PCIE_MAX_SHARED_VERSION		5
- #define BRCMF_PCIE_SHARED_VERSION_MASK		0x00FF
--#define BRCMF_PCIE_SHARED_TXPUSH_SUPPORT	0x4000
- 
- #define BRCMF_PCIE_FLAGS_HTOD_SPLIT		0x4000
- #define BRCMF_PCIE_FLAGS_DTOH_SPLIT		0x8000
-@@ -1280,11 +1279,6 @@ brcmf_pcie_init_share_ram_info(struct br
- 		brcmf_err("Unsupported PCIE version %d\n", version);
- 		return -EINVAL;
- 	}
--	if (shared->flags & BRCMF_PCIE_SHARED_TXPUSH_SUPPORT) {
--		brcmf_err("Unsupported legacy TX mode 0x%x\n",
--			  shared->flags & BRCMF_PCIE_SHARED_TXPUSH_SUPPORT);
--		return -EINVAL;
--	}
- 
- 	addr = sharedram_addr + BRCMF_SHARED_MAX_RXBUFPOST_OFFSET;
- 	shared->max_rxbufpost = brcmf_pcie_read_tcm16(devinfo, addr);
diff --git a/package/kernel/mac80211/patches/344-0004-brcmfmac-remove-dummy-cache-flush-invalidate-functio.patch b/package/kernel/mac80211/patches/344-0004-brcmfmac-remove-dummy-cache-flush-invalidate-functio.patch
deleted file mode 100644
index 8c8eebe44f676570be47e970be8b2a2f685b6963..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/344-0004-brcmfmac-remove-dummy-cache-flush-invalidate-functio.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Wed, 20 May 2015 14:09:50 +0200
-Subject: [PATCH] brcmfmac: remove dummy cache flush/invalidate function
-
-brcmf_dma_flush and brcmf_dma_invalidate_cache are not necessary and
-have never been implemented.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
-@@ -22,17 +22,6 @@
- #include "core.h"
- #include "commonring.h"
- 
--
--/* dma flushing needs implementation for mips and arm platforms. Should
-- * be put in util. Note, this is not real flushing. It is virtual non
-- * cached memory. Only write buffers should have to be drained. Though
-- * this may be different depending on platform......
-- * SEE ALSO msgbuf.c
-- */
--#define brcmf_dma_flush(addr, len)
--#define brcmf_dma_invalidate_cache(addr, len)
--
--
- void brcmf_commonring_register_cb(struct brcmf_commonring *commonring,
- 				  int (*cr_ring_bell)(void *ctx),
- 				  int (*cr_update_rptr)(void *ctx),
-@@ -206,14 +195,9 @@ int brcmf_commonring_write_complete(stru
- 	address = commonring->buf_addr;
- 	address += (commonring->f_ptr * commonring->item_len);
- 	if (commonring->f_ptr > commonring->w_ptr) {
--		brcmf_dma_flush(address,
--				(commonring->depth - commonring->f_ptr) *
--				commonring->item_len);
- 		address = commonring->buf_addr;
- 		commonring->f_ptr = 0;
- 	}
--	brcmf_dma_flush(address, (commonring->w_ptr - commonring->f_ptr) *
--			commonring->item_len);
- 
- 	commonring->f_ptr = commonring->w_ptr;
- 
-@@ -258,8 +242,6 @@ void *brcmf_commonring_get_read_ptr(stru
- 	if (commonring->r_ptr == commonring->depth)
- 		commonring->r_ptr = 0;
- 
--	brcmf_dma_invalidate_cache(ret_addr, *n_ items * commonring->item_len);
--
- 	return ret_addr;
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -278,16 +278,6 @@ struct brcmf_msgbuf_pktids {
- 	struct brcmf_msgbuf_pktid *array;
- };
- 
--
--/* dma flushing needs implementation for mips and arm platforms. Should
-- * be put in util. Note, this is not real flushing. It is virtual non
-- * cached memory. Only write buffers should have to be drained. Though
-- * this may be different depending on platform......
-- */
--#define brcmf_dma_flush(addr, len)
--#define brcmf_dma_invalidate_cache(addr, len)
--
--
- static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf);
- 
- 
-@@ -462,7 +452,6 @@ static int brcmf_msgbuf_tx_ioctl(struct
- 		memcpy(msgbuf->ioctbuf, buf, buf_len);
- 	else
- 		memset(msgbuf->ioctbuf, 0, buf_len);
--	brcmf_dma_flush(ioctl_buf, buf_len);
- 
- 	err = brcmf_commonring_write_complete(commonring);
- 	brcmf_commonring_unlock(commonring);
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -276,15 +276,6 @@ static const u32 brcmf_ring_itemsize[BRC
- };
- 
- 
--/* dma flushing needs implementation for mips and arm platforms. Should
-- * be put in util. Note, this is not real flushing. It is virtual non
-- * cached memory. Only write buffers should have to be drained. Though
-- * this may be different depending on platform......
-- */
--#define brcmf_dma_flush(addr, len)
--#define brcmf_dma_invalidate_cache(addr, len)
--
--
- static u32
- brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
- {
-@@ -1174,7 +1165,6 @@ static int brcmf_pcie_init_scratchbuffer
- 		goto fail;
- 
- 	memset(devinfo->shared.scratch, 0, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
--	brcmf_dma_flush(devinfo->shared.scratch, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
- 
- 	addr = devinfo->shared.tcm_base_address +
- 	       BRCMF_SHARED_DMA_SCRATCH_ADDR_OFFSET;
-@@ -1192,7 +1182,6 @@ static int brcmf_pcie_init_scratchbuffer
- 		goto fail;
- 
- 	memset(devinfo->shared.ringupd, 0, BRCMF_DMA_D2H_RINGUPD_BUF_LEN);
--	brcmf_dma_flush(devinfo->shared.ringupd, BRCMF_DMA_D2H_RINGUPD_BUF_LEN);
- 
- 	addr = devinfo->shared.tcm_base_address +
- 	       BRCMF_SHARED_DMA_RINGUPD_ADDR_OFFSET;
diff --git a/package/kernel/mac80211/patches/344-0005-brcmfmac-add-support-for-dma-indices-feature.patch b/package/kernel/mac80211/patches/344-0005-brcmfmac-add-support-for-dma-indices-feature.patch
deleted file mode 100644
index 2f50abd0e124bee916b749a966187270a5ade8a8..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/344-0005-brcmfmac-add-support-for-dma-indices-feature.patch
+++ /dev/null
@@ -1,270 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Wed, 20 May 2015 14:09:51 +0200
-Subject: [PATCH] brcmfmac: add support for dma indices feature
-
-PCIe full dongle firmware can support a dma indices feature with which
-firmware can update/fetch the read/write indices of message buffer
-rings on both host to dongle and dongle to host directions. The support is
-announced by firmware through shared flags.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -115,6 +115,8 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_MIN_SHARED_VERSION		5
- #define BRCMF_PCIE_MAX_SHARED_VERSION		5
- #define BRCMF_PCIE_SHARED_VERSION_MASK		0x00FF
-+#define BRCMF_PCIE_SHARED_DMA_INDEX		0x10000
-+#define BRCMF_PCIE_SHARED_DMA_2B_IDX		0x100000
- 
- #define BRCMF_PCIE_FLAGS_HTOD_SPLIT		0x4000
- #define BRCMF_PCIE_FLAGS_DTOH_SPLIT		0x8000
-@@ -146,6 +148,10 @@ enum brcmf_pcie_state {
- #define BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET	8
- #define BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET	12
- #define BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET	16
-+#define BRCMF_SHARED_RING_H2D_WP_HADDR_OFFSET	20
-+#define BRCMF_SHARED_RING_H2D_RP_HADDR_OFFSET	28
-+#define BRCMF_SHARED_RING_D2H_WP_HADDR_OFFSET	36
-+#define BRCMF_SHARED_RING_D2H_RP_HADDR_OFFSET	44
- #define BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET	0
- #define BRCMF_SHARED_RING_MAX_SUB_QUEUES	52
- 
-@@ -247,6 +253,13 @@ struct brcmf_pciedev_info {
- 	bool mbdata_completed;
- 	bool irq_allocated;
- 	bool wowl_enabled;
-+	u8 dma_idx_sz;
-+	void *idxbuf;
-+	u32 idxbuf_sz;
-+	dma_addr_t idxbuf_dmahandle;
-+	u16 (*read_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset);
-+	void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
-+			  u16 value);
- };
- 
- struct brcmf_pcie_ringbuf {
-@@ -323,6 +336,25 @@ brcmf_pcie_write_tcm16(struct brcmf_pcie
- }
- 
- 
-+static u16
-+brcmf_pcie_read_idx(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
-+{
-+	u16 *address = devinfo->idxbuf + mem_offset;
-+
-+	return (*(address));
-+}
-+
-+
-+static void
-+brcmf_pcie_write_idx(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
-+		     u16 value)
-+{
-+	u16 *address = devinfo->idxbuf + mem_offset;
-+
-+	*(address) = value;
-+}
-+
-+
- static u32
- brcmf_pcie_read_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
-@@ -868,7 +900,7 @@ static int brcmf_pcie_ring_mb_write_rptr
- 	brcmf_dbg(PCIE, "W r_ptr %d (%d), ring %d\n", commonring->r_ptr,
- 		  commonring->w_ptr, ring->id);
- 
--	brcmf_pcie_write_tcm16(devinfo, ring->r_idx_addr, commonring->r_ptr);
-+	devinfo->write_ptr(devinfo, ring->r_idx_addr, commonring->r_ptr);
- 
- 	return 0;
- }
-@@ -886,7 +918,7 @@ static int brcmf_pcie_ring_mb_write_wptr
- 	brcmf_dbg(PCIE, "W w_ptr %d (%d), ring %d\n", commonring->w_ptr,
- 		  commonring->r_ptr, ring->id);
- 
--	brcmf_pcie_write_tcm16(devinfo, ring->w_idx_addr, commonring->w_ptr);
-+	devinfo->write_ptr(devinfo, ring->w_idx_addr, commonring->w_ptr);
- 
- 	return 0;
- }
-@@ -915,7 +947,7 @@ static int brcmf_pcie_ring_mb_update_rpt
- 	if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
- 		return -EIO;
- 
--	commonring->r_ptr = brcmf_pcie_read_tcm16(devinfo, ring->r_idx_addr);
-+	commonring->r_ptr = devinfo->read_ptr(devinfo, ring->r_idx_addr);
- 
- 	brcmf_dbg(PCIE, "R r_ptr %d (%d), ring %d\n", commonring->r_ptr,
- 		  commonring->w_ptr, ring->id);
-@@ -933,7 +965,7 @@ static int brcmf_pcie_ring_mb_update_wpt
- 	if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
- 		return -EIO;
- 
--	commonring->w_ptr = brcmf_pcie_read_tcm16(devinfo, ring->w_idx_addr);
-+	commonring->w_ptr = devinfo->read_ptr(devinfo, ring->w_idx_addr);
- 
- 	brcmf_dbg(PCIE, "R w_ptr %d (%d), ring %d\n", commonring->w_ptr,
- 		  commonring->r_ptr, ring->id);
-@@ -1038,6 +1070,13 @@ static void brcmf_pcie_release_ringbuffe
- 	}
- 	kfree(devinfo->shared.flowrings);
- 	devinfo->shared.flowrings = NULL;
-+	if (devinfo->idxbuf) {
-+		dma_free_coherent(&devinfo->pdev->dev,
-+				  devinfo->idxbuf_sz,
-+				  devinfo->idxbuf,
-+				  devinfo->idxbuf_dmahandle);
-+		devinfo->idxbuf = NULL;
-+	}
- }
- 
- 
-@@ -1053,19 +1092,72 @@ static int brcmf_pcie_init_ringbuffers(s
- 	u32 addr;
- 	u32 ring_mem_ptr;
- 	u32 i;
-+	u64 address;
-+	u32 bufsz;
- 	u16 max_sub_queues;
-+	u8 idx_offset;
- 
- 	ring_addr = devinfo->shared.ring_info_addr;
- 	brcmf_dbg(PCIE, "Base ring addr = 0x%08x\n", ring_addr);
-+	addr = ring_addr + BRCMF_SHARED_RING_MAX_SUB_QUEUES;
-+	max_sub_queues = brcmf_pcie_read_tcm16(devinfo, addr);
- 
--	addr = ring_addr + BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET;
--	d2h_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
--	addr = ring_addr + BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET;
--	d2h_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
--	addr = ring_addr + BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET;
--	h2d_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
--	addr = ring_addr + BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET;
--	h2d_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
-+	if (devinfo->dma_idx_sz != 0) {
-+		bufsz = (BRCMF_NROF_D2H_COMMON_MSGRINGS + max_sub_queues) *
-+			devinfo->dma_idx_sz * 2;
-+		devinfo->idxbuf = dma_alloc_coherent(&devinfo->pdev->dev, bufsz,
-+						     &devinfo->idxbuf_dmahandle,
-+						     GFP_KERNEL);
-+		if (!devinfo->idxbuf)
-+			devinfo->dma_idx_sz = 0;
-+	}
-+
-+	if (devinfo->dma_idx_sz == 0) {
-+		addr = ring_addr + BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET;
-+		d2h_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
-+		addr = ring_addr + BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET;
-+		d2h_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
-+		addr = ring_addr + BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET;
-+		h2d_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
-+		addr = ring_addr + BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET;
-+		h2d_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
-+		idx_offset = sizeof(u32);
-+		devinfo->write_ptr = brcmf_pcie_write_tcm16;
-+		devinfo->read_ptr = brcmf_pcie_read_tcm16;
-+		brcmf_dbg(PCIE, "Using TCM indices\n");
-+	} else {
-+		memset(devinfo->idxbuf, 0, bufsz);
-+		devinfo->idxbuf_sz = bufsz;
-+		idx_offset = devinfo->dma_idx_sz;
-+		devinfo->write_ptr = brcmf_pcie_write_idx;
-+		devinfo->read_ptr = brcmf_pcie_read_idx;
-+
-+		h2d_w_idx_ptr = 0;
-+		addr = ring_addr + BRCMF_SHARED_RING_H2D_WP_HADDR_OFFSET;
-+		address = (u64)devinfo->idxbuf_dmahandle;
-+		brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
-+		brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
-+
-+		h2d_r_idx_ptr = h2d_w_idx_ptr + max_sub_queues * idx_offset;
-+		addr = ring_addr + BRCMF_SHARED_RING_H2D_RP_HADDR_OFFSET;
-+		address += max_sub_queues * idx_offset;
-+		brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
-+		brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
-+
-+		d2h_w_idx_ptr = h2d_r_idx_ptr + max_sub_queues * idx_offset;
-+		addr = ring_addr + BRCMF_SHARED_RING_D2H_WP_HADDR_OFFSET;
-+		address += max_sub_queues * idx_offset;
-+		brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
-+		brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
-+
-+		d2h_r_idx_ptr = d2h_w_idx_ptr +
-+				BRCMF_NROF_D2H_COMMON_MSGRINGS * idx_offset;
-+		addr = ring_addr + BRCMF_SHARED_RING_D2H_RP_HADDR_OFFSET;
-+		address += BRCMF_NROF_D2H_COMMON_MSGRINGS * idx_offset;
-+		brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
-+		brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
-+		brcmf_dbg(PCIE, "Using host memory indices\n");
-+	}
- 
- 	addr = ring_addr + BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET;
- 	ring_mem_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
-@@ -1079,8 +1171,8 @@ static int brcmf_pcie_init_ringbuffers(s
- 		ring->id = i;
- 		devinfo->shared.commonrings[i] = ring;
- 
--		h2d_w_idx_ptr += sizeof(u32);
--		h2d_r_idx_ptr += sizeof(u32);
-+		h2d_w_idx_ptr += idx_offset;
-+		h2d_r_idx_ptr += idx_offset;
- 		ring_mem_ptr += BRCMF_RING_MEM_SZ;
- 	}
- 
-@@ -1094,13 +1186,11 @@ static int brcmf_pcie_init_ringbuffers(s
- 		ring->id = i;
- 		devinfo->shared.commonrings[i] = ring;
- 
--		d2h_w_idx_ptr += sizeof(u32);
--		d2h_r_idx_ptr += sizeof(u32);
-+		d2h_w_idx_ptr += idx_offset;
-+		d2h_r_idx_ptr += idx_offset;
- 		ring_mem_ptr += BRCMF_RING_MEM_SZ;
- 	}
- 
--	addr = ring_addr + BRCMF_SHARED_RING_MAX_SUB_QUEUES;
--	max_sub_queues = brcmf_pcie_read_tcm16(devinfo, addr);
- 	devinfo->shared.nrof_flowrings =
- 			max_sub_queues - BRCMF_NROF_H2D_COMMON_MSGRINGS;
- 	rings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*ring),
-@@ -1124,15 +1214,15 @@ static int brcmf_pcie_init_ringbuffers(s
- 					     ring);
- 		ring->w_idx_addr = h2d_w_idx_ptr;
- 		ring->r_idx_addr = h2d_r_idx_ptr;
--		h2d_w_idx_ptr += sizeof(u32);
--		h2d_r_idx_ptr += sizeof(u32);
-+		h2d_w_idx_ptr += idx_offset;
-+		h2d_r_idx_ptr += idx_offset;
- 	}
- 	devinfo->shared.flowrings = rings;
- 
- 	return 0;
- 
- fail:
--	brcmf_err("Allocating commonring buffers failed\n");
-+	brcmf_err("Allocating ring buffers failed\n");
- 	brcmf_pcie_release_ringbuffers(devinfo);
- 	return -ENOMEM;
- }
-@@ -1269,6 +1359,14 @@ brcmf_pcie_init_share_ram_info(struct br
- 		return -EINVAL;
- 	}
- 
-+	/* check firmware support dma indicies */
-+	if (shared->flags & BRCMF_PCIE_SHARED_DMA_INDEX) {
-+		if (shared->flags & BRCMF_PCIE_SHARED_DMA_2B_IDX)
-+			devinfo->dma_idx_sz = sizeof(u16);
-+		else
-+			devinfo->dma_idx_sz = sizeof(u32);
-+	}
-+
- 	addr = sharedram_addr + BRCMF_SHARED_MAX_RXBUFPOST_OFFSET;
- 	shared->max_rxbufpost = brcmf_pcie_read_tcm16(devinfo, addr);
- 	if (shared->max_rxbufpost == 0)
diff --git a/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch b/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3de0f64d560d8a64923f5227e95cbfa2cbfc72df
--- /dev/null
+++ b/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch
@@ -0,0 +1,73 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Wed, 17 Feb 2016 11:26:57 +0100
+Subject: [PATCH] brcmfmac: use device memsize config from fw if defined
+
+Newer type pcie devices have memory which get shared between fw and
+hw. The division of this memory is done firmware compile time. As a
+result the ramsize as used by driver needs to be adjusted for this.
+This is done by reading the memory size from the firmware.
+
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+@@ -207,6 +207,10 @@ static struct brcmf_firmware_mapping brc
+ #define BRCMF_PCIE_CFGREG_REG_BAR3_CONFIG	0x4F4
+ #define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB	3
+ 
++/* Magic number at a magic location to find RAM size */
++#define BRCMF_RAMSIZE_MAGIC			0x534d4152	/* SMAR */
++#define BRCMF_RAMSIZE_OFFSET			0x6c
++
+ 
+ struct brcmf_pcie_console {
+ 	u32 base_addr;
+@@ -1412,6 +1416,28 @@ static const struct brcmf_bus_ops brcmf_
+ };
+ 
+ 
++static void
++brcmf_pcie_adjust_ramsize(struct brcmf_pciedev_info *devinfo, u8 *data,
++			  u32 data_len)
++{
++	__le32 *field;
++	u32 newsize;
++
++	if (data_len < BRCMF_RAMSIZE_OFFSET + 8)
++		return;
++
++	field = (__le32 *)&data[BRCMF_RAMSIZE_OFFSET];
++	if (le32_to_cpup(field) != BRCMF_RAMSIZE_MAGIC)
++		return;
++	field++;
++	newsize = le32_to_cpup(field);
++
++	brcmf_dbg(PCIE, "Found ramsize info in FW, adjusting to 0x%x\n",
++		  newsize);
++	devinfo->ci->ramsize = newsize;
++}
++
++
+ static int
+ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
+ 			       u32 sharedram_addr)
+@@ -1694,6 +1720,13 @@ static void brcmf_pcie_setup(struct devi
+ 
+ 	brcmf_pcie_attach(devinfo);
+ 
++	/* Some of the firmwares have the size of the memory of the device
++	 * defined inside the firmware. This is because part of the memory in
++	 * the device is shared and the devision is determined by FW. Parse
++	 * the firmware and adjust the chip memory size now.
++	 */
++	brcmf_pcie_adjust_ramsize(devinfo, (u8 *)fw->data, fw->size);
++
+ 	ret = brcmf_pcie_download_fw_nvram(devinfo, fw, nvram, nvram_len);
+ 	if (ret)
+ 		goto fail;
diff --git a/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch b/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ca03ffe4b09a5b565b9da2ce4eb13949bb3623b4
--- /dev/null
+++ b/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch
@@ -0,0 +1,58 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Wed, 17 Feb 2016 11:26:58 +0100
+Subject: [PATCH] brcmfmac: use bar1 window size as provided by pci subsystem
+
+The PCIE bar1 window size is specified by chip. Currently the
+ioremap of bar1 was using a define which always matched the size
+of bar1, but newer chips can have a different bar1 sizes. With
+this patch the ioremap will be called with the by chip provided
+window size.
+
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+@@ -72,7 +72,6 @@ static struct brcmf_firmware_mapping brc
+ 
+ #define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
+ 
+-#define BRCMF_PCIE_TCM_MAP_SIZE			(4096 * 1024)
+ #define BRCMF_PCIE_REG_MAP_SIZE			(32 * 1024)
+ 
+ /* backplane addres space accessed by BAR0 */
+@@ -252,7 +251,6 @@ struct brcmf_pciedev_info {
+ 	char nvram_name[BRCMF_FW_NAME_LEN];
+ 	void __iomem *regs;
+ 	void __iomem *tcm;
+-	u32 tcm_size;
+ 	u32 ram_base;
+ 	u32 ram_size;
+ 	struct brcmf_chip *ci;
+@@ -1592,8 +1590,7 @@ static int brcmf_pcie_get_resource(struc
+ 	}
+ 
+ 	devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
+-	devinfo->tcm = ioremap_nocache(bar1_addr, BRCMF_PCIE_TCM_MAP_SIZE);
+-	devinfo->tcm_size = BRCMF_PCIE_TCM_MAP_SIZE;
++	devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
+ 
+ 	if (!devinfo->regs || !devinfo->tcm) {
+ 		brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs,
+@@ -1602,8 +1599,9 @@ static int brcmf_pcie_get_resource(struc
+ 	}
+ 	brcmf_dbg(PCIE, "Phys addr : reg space = %p base addr %#016llx\n",
+ 		  devinfo->regs, (unsigned long long)bar0_addr);
+-	brcmf_dbg(PCIE, "Phys addr : mem space = %p base addr %#016llx\n",
+-		  devinfo->tcm, (unsigned long long)bar1_addr);
++	brcmf_dbg(PCIE, "Phys addr : mem space = %p base addr %#016llx size 0x%x\n",
++		  devinfo->tcm, (unsigned long long)bar1_addr,
++		  (unsigned int)bar1_size);
+ 
+ 	return 0;
+ }
diff --git a/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch b/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e4a8f305cf5a8d9029ad5619ef8bcbc10a425ddd
--- /dev/null
+++ b/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch
@@ -0,0 +1,34 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Wed, 17 Feb 2016 11:26:59 +0100
+Subject: [PATCH] brcmfmac: add support for the PCIE 4366c0 chip
+
+A newer version of the 4366 PCIE chip has been released. Add
+support for this version of the chip.
+
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+@@ -53,6 +53,7 @@ BRCMF_FW_NVRAM_DEF(4358, "brcmfmac4358-p
+ BRCMF_FW_NVRAM_DEF(4359, "brcmfmac4359-pcie.bin", "brcmfmac4359-pcie.txt");
+ BRCMF_FW_NVRAM_DEF(4365B, "brcmfmac4365b-pcie.bin", "brcmfmac4365b-pcie.txt");
+ BRCMF_FW_NVRAM_DEF(4366B, "brcmfmac4366b-pcie.bin", "brcmfmac4366b-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4366C, "brcmfmac4366c-pcie.bin", "brcmfmac4366c-pcie.txt");
+ BRCMF_FW_NVRAM_DEF(4371, "brcmfmac4371-pcie.bin", "brcmfmac4371-pcie.txt");
+ 
+ static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
+@@ -66,7 +67,8 @@ static struct brcmf_firmware_mapping brc
+ 	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
+ 	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
+ 	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFFF, 4365B),
+-	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFFF, 4366B),
++	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
++	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
+ 	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
+ };
+ 
diff --git a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch b/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c529ff2c0e8319526c31d1806c02ba3f67911b2c
--- /dev/null
+++ b/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch
@@ -0,0 +1,30 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Wed, 17 Feb 2016 11:27:01 +0100
+Subject: [PATCH] brcmfmac: increase timeout for tx eapol
+
+When keys get set and updated this has to happen after eapol got
+transmitted (without key or old key) before the key can be updated.
+To make sure the order of sending eapol and configuring key is done
+correctly a timeout for tx of eapol is applied. This timeout is set
+to 50 msec, which is not always enough. Especially in AP mode and
+key updates the timeout may need to be much longer because client(s)
+can be in powersave. Increase the timeout from 50 to 950 msec.
+
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -40,7 +40,7 @@ MODULE_AUTHOR("Broadcom Corporation");
+ MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
+ MODULE_LICENSE("Dual BSD/GPL");
+ 
+-#define MAX_WAIT_FOR_8021X_TX			msecs_to_jiffies(50)
++#define MAX_WAIT_FOR_8021X_TX			msecs_to_jiffies(950)
+ 
+ /* AMPDU rx reordering definitions */
+ #define BRCMF_RXREORDER_FLOWID_OFFSET		0
diff --git a/package/kernel/mac80211/patches/345-brcmfmac-avoid-null-pointer-access-when-brcmf_msgbuf.patch b/package/kernel/mac80211/patches/345-brcmfmac-avoid-null-pointer-access-when-brcmf_msgbuf.patch
deleted file mode 100644
index 28408d2b4fd59731a390c9f6ebc911d97aebca0e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/345-brcmfmac-avoid-null-pointer-access-when-brcmf_msgbuf.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Tue, 26 May 2015 13:19:46 +0200
-Subject: [PATCH] brcmfmac: avoid null pointer access when
- brcmf_msgbuf_get_pktid() fails
-
-The function brcmf_msgbuf_get_pktid() may return a NULL pointer so
-the callers should check the return pointer before accessing it to
-avoid the crash below (see [1]):
-
-brcmfmac: brcmf_msgbuf_get_pktid: Invalid packet id 273 (not in use)
-BUG: unable to handle kernel NULL pointer dereference at 0000000000000080
-IP: [<ffffffff8145b225>] skb_pull+0x5/0x50
-PGD 0
-Oops: 0000 [#1] PREEMPT SMP
-Modules linked in: pci_stub vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O)
- snd_hda_codec_hdmi bnep mousedev hid_generic ushwmon msr ext4 crc16 mbcache
- jbd2 sd_mod uas usb_storage ahci libahci libata scsi_mod xhci_pci xhci_hcd
- usbcore usb_common
-CPU: 0 PID: 1661 Comm: irq/61-brcmf_pc Tainted: G O    4.0.1-MacbookPro-ARCH #1
-Hardware name: Apple Inc. MacBookPro12,1/Mac-E43C1C25D4880AD6,
- BIOS MBP121.88Z.0167.B02.1503241251 03/24/2015
-task: ffff880264203cc0 ti: ffff88025ffe4000 task.ti: ffff88025ffe4000
-RIP: 0010:[<ffffffff8145b225>]  [<ffffffff8145b225>] skb_pull+0x5/0x50
-RSP: 0018:ffff88025ffe7d40  EFLAGS: 00010202
-RAX: 0000000000000000 RBX: ffff88008a33c000 RCX: 0000000000000044
-RDX: 0000000000000000 RSI: 000000000000004a RDI: 0000000000000000
-RBP: ffff88025ffe7da8 R08: 0000000000000096 R09: 000000000000004a
-R10: 0000000000000000 R11: 000000000000048e R12: ffff88025ff14f00
-R13: 0000000000000000 R14: ffff880263b48200 R15: ffff88008a33c000
-FS:  0000000000000000(0000) GS:ffff88026ec00000(0000) knlGS:0000000000000000
-CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-CR2: 0000000000000080 CR3: 000000000180b000 CR4: 00000000003407f0
-Stack:
- ffffffffa06aed74 ffff88025ffe7dc8 ffff880263b48270 ffff880263b48278
- 05ea88020000004a 0002ffff81014635 000000001720b2f6 ffff88026ec116c0
- ffff880263b48200 0000000000010000 ffff880263b4ae00 ffff880264203cc0
-Call Trace:
- [<ffffffffa06aed74>] ? brcmf_msgbuf_process_rx+0x404/0x480 [brcmfmac]
- [<ffffffff810cea60>] ? irq_finalize_oneshot.part.30+0xf0/0xf0
- [<ffffffffa06afb55>] brcmf_proto_msgbuf_rx_trigger+0x35/0xf0 [brcmfmac]
- [<ffffffffa06baf2a>] brcmf_pcie_isr_thread_v2+0x8a/0x130 [brcmfmac]
- [<ffffffff810cea80>] irq_thread_fn+0x20/0x50
- [<ffffffff810ceddf>] irq_thread+0x13f/0x170
- [<ffffffff810cebf0>] ? wake_threads_waitq+0x30/0x30
- [<ffffffff810ceca0>] ? irq_thread_dtor+0xb0/0xb0
- [<ffffffff81092a08>] kthread+0xd8/0xf0
- [<ffffffff81092930>] ? kthread_create_on_node+0x1c0/0x1c0
- [<ffffffff8156d898>] ret_from_fork+0x58/0x90
- [<ffffffff81092930>] ? kthread_create_on_node+0x1c0/0x1c0
-Code: 01 83 e2 f7 88 50 01 48 83 c4 08 5b 5d f3 c3 0f 1f 80 00 00 00 00 83 e2
- f7 88 50 01 c3 66 0f 1f 84 00 00 00 00 00 0f 1f
-RIP  [<ffffffff8145b225>] skb_pull+0x5/0x50
- RSP <ffff88025ffe7d40>
-CR2: 0000000000000080
----[ end trace b074c0f90e7c997d ]---
-
-[1] http://mid.gmane.org/20150430193259.GA5630@googlemail.com
-
-Cc: <stable@vger.kernel.org> # v3.18, v3.19, v4.0, v4.1
-Reported-by: Michael Hornung <mhornung.linux@gmail.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -500,11 +500,9 @@ static int brcmf_msgbuf_query_dcmd(struc
- 				     msgbuf->rx_pktids,
- 				     msgbuf->ioctl_resp_pktid);
- 	if (msgbuf->ioctl_resp_ret_len != 0) {
--		if (!skb) {
--			brcmf_err("Invalid packet id idx recv'd %d\n",
--				  msgbuf->ioctl_resp_pktid);
-+		if (!skb)
- 			return -EBADF;
--		}
-+
- 		memcpy(buf, skb->data, (len < msgbuf->ioctl_resp_ret_len) ?
- 				       len : msgbuf->ioctl_resp_ret_len);
- 	}
-@@ -866,10 +864,8 @@ brcmf_msgbuf_process_txstatus(struct brc
- 	flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
- 	skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
- 				     msgbuf->tx_pktids, idx);
--	if (!skb) {
--		brcmf_err("Invalid packet id idx recv'd %d\n", idx);
-+	if (!skb)
- 		return;
--	}
- 
- 	set_bit(flowid, msgbuf->txstatus_done_map);
- 	commonring = msgbuf->flowrings[flowid];
-@@ -1148,6 +1144,8 @@ brcmf_msgbuf_process_rx_complete(struct
- 
- 	skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
- 				     msgbuf->rx_pktids, idx);
-+	if (!skb)
-+		return;
- 
- 	if (data_offset)
- 		skb_pull(skb, data_offset);
diff --git a/package/kernel/mac80211/patches/345-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch b/package/kernel/mac80211/patches/345-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f293401ca82d37e367600acf2676b18f6fad92ba
--- /dev/null
+++ b/package/kernel/mac80211/patches/345-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch
@@ -0,0 +1,114 @@
+From: Hante Meuleman <hante.meuleman@broadcom.com>
+Date: Mon, 11 Apr 2016 11:35:23 +0200
+Subject: [PATCH] brcmfmac: insert default boardrev in nvram data if
+ missing
+
+Some nvram files/stores come without the boardrev information,
+but firmware requires this to be set. When not found in nvram then
+add a default boardrev string to the nvram data.
+
+Reported-by: Rafal Milecki <zajec5@gmail.com>
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <franky.lin@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
+Signed-off-by: Hante Meuleman <hante.meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
+@@ -29,6 +29,7 @@
+ #define BRCMF_FW_MAX_NVRAM_SIZE			64000
+ #define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */
+ #define BRCMF_FW_NVRAM_PCIEDEV_LEN		10	/* pcie/1/4/ + \0 */
++#define BRCMF_FW_DEFAULT_BOARDREV		"boardrev=0xff"
+ 
+ enum nvram_parser_state {
+ 	IDLE,
+@@ -51,6 +52,7 @@ enum nvram_parser_state {
+  * @entry: start position of key,value entry.
+  * @multi_dev_v1: detect pcie multi device v1 (compressed).
+  * @multi_dev_v2: detect pcie multi device v2.
++ * @boardrev_found: nvram contains boardrev information.
+  */
+ struct nvram_parser {
+ 	enum nvram_parser_state state;
+@@ -63,6 +65,7 @@ struct nvram_parser {
+ 	u32 entry;
+ 	bool multi_dev_v1;
+ 	bool multi_dev_v2;
++	bool boardrev_found;
+ };
+ 
+ /**
+@@ -125,6 +128,8 @@ static enum nvram_parser_state brcmf_nvr
+ 			nvp->multi_dev_v1 = true;
+ 		if (strncmp(&nvp->data[nvp->entry], "pcie/", 5) == 0)
+ 			nvp->multi_dev_v2 = true;
++		if (strncmp(&nvp->data[nvp->entry], "boardrev", 8) == 0)
++			nvp->boardrev_found = true;
+ 	} else if (!is_nvram_char(c) || c == ' ') {
+ 		brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
+ 			  nvp->line, nvp->column);
+@@ -284,6 +289,8 @@ static void brcmf_fw_strip_multi_v1(stru
+ 	while (i < nvp->nvram_len) {
+ 		if ((nvp->nvram[i] - '0' == id) && (nvp->nvram[i + 1] == ':')) {
+ 			i += 2;
++			if (strncmp(&nvp->nvram[i], "boardrev", 8) == 0)
++				nvp->boardrev_found = true;
+ 			while (nvp->nvram[i] != 0) {
+ 				nvram[j] = nvp->nvram[i];
+ 				i++;
+@@ -335,6 +342,8 @@ static void brcmf_fw_strip_multi_v2(stru
+ 	while (i < nvp->nvram_len - len) {
+ 		if (strncmp(&nvp->nvram[i], prefix, len) == 0) {
+ 			i += len;
++			if (strncmp(&nvp->nvram[i], "boardrev", 8) == 0)
++				nvp->boardrev_found = true;
+ 			while (nvp->nvram[i] != 0) {
+ 				nvram[j] = nvp->nvram[i];
+ 				i++;
+@@ -356,6 +365,18 @@ fail:
+ 	nvp->nvram_len = 0;
+ }
+ 
++static void brcmf_fw_add_defaults(struct nvram_parser *nvp)
++{
++	if (nvp->boardrev_found)
++		return;
++
++	memcpy(&nvp->nvram[nvp->nvram_len], &BRCMF_FW_DEFAULT_BOARDREV,
++	       strlen(BRCMF_FW_DEFAULT_BOARDREV));
++	nvp->nvram_len += strlen(BRCMF_FW_DEFAULT_BOARDREV);
++	nvp->nvram[nvp->nvram_len] = '\0';
++	nvp->nvram_len++;
++}
++
+ /* brcmf_nvram_strip :Takes a buffer of "<var>=<value>\n" lines read from a fil
+  * and ending in a NUL. Removes carriage returns, empty lines, comment lines,
+  * and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
+@@ -377,16 +398,21 @@ static void *brcmf_fw_nvram_strip(const
+ 		if (nvp.state == END)
+ 			break;
+ 	}
+-	if (nvp.multi_dev_v1)
++	if (nvp.multi_dev_v1) {
++		nvp.boardrev_found = false;
+ 		brcmf_fw_strip_multi_v1(&nvp, domain_nr, bus_nr);
+-	else if (nvp.multi_dev_v2)
++	} else if (nvp.multi_dev_v2) {
++		nvp.boardrev_found = false;
+ 		brcmf_fw_strip_multi_v2(&nvp, domain_nr, bus_nr);
++	}
+ 
+ 	if (nvp.nvram_len == 0) {
+ 		kfree(nvp.nvram);
+ 		return NULL;
+ 	}
+ 
++	brcmf_fw_add_defaults(&nvp);
++
+ 	pad = nvp.nvram_len;
+ 	*new_length = roundup(nvp.nvram_len + 1, 4);
+ 	while (pad != *new_length) {
diff --git a/package/kernel/mac80211/patches/346-brcmfmac-fix-invalid-access-to-struct-acpi_device-fi.patch b/package/kernel/mac80211/patches/346-brcmfmac-fix-invalid-access-to-struct-acpi_device-fi.patch
deleted file mode 100644
index f0230347efc0a8ff33497c3006f917927e41a324..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/346-brcmfmac-fix-invalid-access-to-struct-acpi_device-fi.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 27 May 2015 19:31:41 +0200
-Subject: [PATCH] brcmfmac: fix invalid access to struct acpi_device fields
-
-The fields of struct acpi_device are only known when CONFIG_ACPI is
-defined. Fix this by using a helper function. This will resolve the
-issue found in linux-next:
-
- ../brcmfmac/bcmsdh.c: In function 'brcmf_ops_sdio_probe':
- ../brcmfmac/bcmsdh.c:1139:7: error: dereferencing pointer to incomplete type
-   adev->flags.power_manageable = 0;
-       ^
-
-Fixes: f0992ace680c ("brcmfmac: prohibit ACPI power management ...")
-Cc: Fu, Zhonghui <zhonghui.fu@linux.intel.com>
-Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -1117,6 +1117,18 @@ MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_id
- static struct brcmfmac_sdio_platform_data *brcmfmac_sdio_pdata;
- 
- 
-+static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev,
-+						  int val)
-+{
-+#if IS_ENABLED(CONFIG_ACPI)
-+	struct acpi_device *adev;
-+
-+	adev = ACPI_COMPANION(dev);
-+	if (adev)
-+		adev->flags.power_manageable = 0;
-+#endif
-+}
-+
- static int brcmf_ops_sdio_probe(struct sdio_func *func,
- 				const struct sdio_device_id *id)
- {
-@@ -1124,7 +1136,6 @@ static int brcmf_ops_sdio_probe(struct s
- 	struct brcmf_sdio_dev *sdiodev;
- 	struct brcmf_bus *bus_if;
- 	struct device *dev;
--	struct acpi_device *adev;
- 
- 	brcmf_dbg(SDIO, "Enter\n");
- 	brcmf_dbg(SDIO, "Class=%x\n", func->class);
-@@ -1132,11 +1143,9 @@ static int brcmf_ops_sdio_probe(struct s
- 	brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
- 	brcmf_dbg(SDIO, "Function#: %d\n", func->num);
- 
--	/* prohibit ACPI power management for this device */
- 	dev = &func->dev;
--	adev = ACPI_COMPANION(dev);
--	if (adev)
--		adev->flags.power_manageable = 0;
-+	/* prohibit ACPI power management for this device */
-+	brcmf_sdiod_acpi_set_power_manageable(dev, 0);
- 
- 	/* Consume func num 1 but dont do anything with it. */
- 	if (func->num == 1)
diff --git a/package/kernel/mac80211/patches/347-brcmfmac-simplify-check-stripping-v2-NVRAM.patch b/package/kernel/mac80211/patches/347-brcmfmac-simplify-check-stripping-v2-NVRAM.patch
deleted file mode 100644
index 2bfd44f9987bb4025e787d3742885c07fde90cf6..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/347-brcmfmac-simplify-check-stripping-v2-NVRAM.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Wed, 20 May 2015 09:34:21 +0200
-Subject: [PATCH] brcmfmac: simplify check stripping v2 NVRAM
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Comparing NVRAM entry with a full filtering string is simpler than
-comparing it with a short prefix and then checking random chars at magic
-offsets. The cost of snprintf relatively low, we execute it just once.
-Tested on BCM43602 with NVRAM hacked to use V2 format.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -25,7 +25,7 @@
- 
- #define BRCMF_FW_MAX_NVRAM_SIZE			64000
- #define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */
--#define BRCMF_FW_NVRAM_PCIEDEV_LEN		9	/* pcie/1/4/ */
-+#define BRCMF_FW_NVRAM_PCIEDEV_LEN		10	/* pcie/1/4/ + \0 */
- 
- char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
- module_param_string(firmware_path, brcmf_firmware_path,
-@@ -297,6 +297,8 @@ fail:
- static void brcmf_fw_strip_multi_v2(struct nvram_parser *nvp, u16 domain_nr,
- 				    u16 bus_nr)
- {
-+	char prefix[BRCMF_FW_NVRAM_PCIEDEV_LEN];
-+	size_t len;
- 	u32 i, j;
- 	u8 *nvram;
- 
-@@ -308,14 +310,13 @@ static void brcmf_fw_strip_multi_v2(stru
- 	 * Valid entries are of type pcie/X/Y/ where X = domain_nr and
- 	 * Y = bus_nr.
- 	 */
-+	snprintf(prefix, sizeof(prefix), "pcie/%d/%d/", domain_nr, bus_nr);
-+	len = strlen(prefix);
- 	i = 0;
- 	j = 0;
--	while (i < nvp->nvram_len - BRCMF_FW_NVRAM_PCIEDEV_LEN) {
--		if ((strncmp(&nvp->nvram[i], "pcie/", 5) == 0) &&
--		    (nvp->nvram[i + 6] == '/') && (nvp->nvram[i + 8] == '/') &&
--		    ((nvp->nvram[i + 5] - '0') == domain_nr) &&
--		    ((nvp->nvram[i + 7] - '0') == bus_nr)) {
--			i += BRCMF_FW_NVRAM_PCIEDEV_LEN;
-+	while (i < nvp->nvram_len - len) {
-+		if (strncmp(&nvp->nvram[i], prefix, len) == 0) {
-+			i += len;
- 			while (nvp->nvram[i] != 0) {
- 				nvram[j] = nvp->nvram[i];
- 				i++;
diff --git a/package/kernel/mac80211/patches/348-brcmfmac-simplify-check-finding-NVRAM-v1-device-path.patch b/package/kernel/mac80211/patches/348-brcmfmac-simplify-check-finding-NVRAM-v1-device-path.patch
deleted file mode 100644
index 0e65114f862ab4dd5e0c8deae0f8e82786fe3015..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/348-brcmfmac-simplify-check-finding-NVRAM-v1-device-path.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Wed, 20 May 2015 11:01:08 +0200
-Subject: [PATCH] brcmfmac: simplify check finding NVRAM v1 device path
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-With a simple use of snprintf and small buffer we can compare NVRAM
-entry value with a full string. This way we avoid checking random chars
-at magic offsets.
-Tested on BCM43602 with NVRAM hacked to use v1 format.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -222,6 +222,10 @@ static int brcmf_init_nvram_parser(struc
- static void brcmf_fw_strip_multi_v1(struct nvram_parser *nvp, u16 domain_nr,
- 				    u16 bus_nr)
- {
-+	/* Device path with a leading '=' key-value separator */
-+	char pcie_path[] = "=pcie/?/?";
-+	size_t pcie_len;
-+
- 	u32 i, j;
- 	bool found;
- 	u8 *nvram;
-@@ -238,6 +242,9 @@ static void brcmf_fw_strip_multi_v1(stru
- 	/* First search for the devpathX and see if it is the configuration
- 	 * for domain_nr/bus_nr. Search complete nvp
- 	 */
-+	snprintf(pcie_path, sizeof(pcie_path), "=pcie/%d/%d", domain_nr,
-+		 bus_nr);
-+	pcie_len = strlen(pcie_path);
- 	found = false;
- 	i = 0;
- 	while (i < nvp->nvram_len - BRCMF_FW_NVRAM_DEVPATH_LEN) {
-@@ -245,13 +252,10 @@ static void brcmf_fw_strip_multi_v1(stru
- 		 * Y = domain_nr, Z = bus_nr, X = virtual ID
- 		 */
- 		if ((strncmp(&nvp->nvram[i], "devpath", 7) == 0) &&
--		    (strncmp(&nvp->nvram[i + 8], "=pcie/", 6) == 0)) {
--			if (((nvp->nvram[i + 14] - '0') == domain_nr) &&
--			    ((nvp->nvram[i + 16] - '0') == bus_nr)) {
--				id = nvp->nvram[i + 7] - '0';
--				found = true;
--				break;
--			}
-+		    (strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len) == 0)) {
-+			id = nvp->nvram[i + 7] - '0';
-+			found = true;
-+			break;
- 		}
- 		while (nvp->nvram[i] != 0)
- 			i++;
diff --git a/package/kernel/mac80211/patches/349-brcmfmac-treat-0-as-end-of-comment-when-parsing-NVRA.patch b/package/kernel/mac80211/patches/349-brcmfmac-treat-0-as-end-of-comment-when-parsing-NVRA.patch
deleted file mode 100644
index dc174e5a3d9d46c310253e6d546273b3f7d10ee7..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/349-brcmfmac-treat-0-as-end-of-comment-when-parsing-NVRA.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Wed, 20 May 2015 13:59:54 +0200
-Subject: [PATCH] brcmfmac: treat \0 as end of comment when parsing NVRAM
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This fixes brcmfmac dealing with NVRAM coming from platform e.g. from a
-flash MTD partition. In such cases entries are separated by \0 instead
-of \n which caused ignoring whole content after the first "comment".
-While platform NVRAM doesn't usually contain comments, we switch to
-COMMENT state after e.g. finding an unexpected char in key name.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -162,17 +162,20 @@ brcmf_nvram_handle_value(struct nvram_pa
- static enum nvram_parser_state
- brcmf_nvram_handle_comment(struct nvram_parser *nvp)
- {
--	char *eol, *sol;
-+	char *eoc, *sol;
- 
- 	sol = (char *)&nvp->fwnv->data[nvp->pos];
--	eol = strchr(sol, '\n');
--	if (eol == NULL)
--		return END;
-+	eoc = strchr(sol, '\n');
-+	if (!eoc) {
-+		eoc = strchr(sol, '\0');
-+		if (!eoc)
-+			return END;
-+	}
- 
- 	/* eat all moving to next line */
- 	nvp->line++;
- 	nvp->column = 1;
--	nvp->pos += (eol - sol) + 1;
-+	nvp->pos += (eoc - sol) + 1;
- 	return IDLE;
- }
- 
diff --git a/package/kernel/mac80211/patches/350-brcmfmac-allow-NVRAM-values-to-contain-spaces.patch b/package/kernel/mac80211/patches/350-brcmfmac-allow-NVRAM-values-to-contain-spaces.patch
deleted file mode 100644
index 5700142646fc4d0ec6bbd576ea1715ab77bc33f9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/350-brcmfmac-allow-NVRAM-values-to-contain-spaces.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Sat, 23 May 2015 09:15:33 +0200
-Subject: [PATCH] brcmfmac: allow NVRAM values to contain spaces
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Platform NVRAMs often contain values with spaces. Even if right now most
-firmware-supported entries are simple values, we shouldn't reject these
-with spaces. It was semi-confirmed by Broadcom in the early patch adding
-support for platform NVRAMs.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -66,6 +66,12 @@ struct nvram_parser {
- 	bool multi_dev_v2;
- };
- 
-+/**
-+ * is_nvram_char() - check if char is a valid one for NVRAM entry
-+ *
-+ * It accepts all printable ASCII chars except for '#' which opens a comment.
-+ * Please note that ' ' (space) while accepted is not a valid key name char.
-+ */
- static bool is_nvram_char(char c)
- {
- 	/* comment marker excluded */
-@@ -73,7 +79,7 @@ static bool is_nvram_char(char c)
- 		return false;
- 
- 	/* key and value may have any other readable character */
--	return (c > 0x20 && c < 0x7f);
-+	return (c >= 0x20 && c < 0x7f);
- }
- 
- static bool is_whitespace(char c)
-@@ -120,7 +126,7 @@ static enum nvram_parser_state brcmf_nvr
- 			nvp->multi_dev_v1 = true;
- 		if (strncmp(&nvp->fwnv->data[nvp->entry], "pcie/", 5) == 0)
- 			nvp->multi_dev_v2 = true;
--	} else if (!is_nvram_char(c)) {
-+	} else if (!is_nvram_char(c) || c == ' ') {
- 		brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
- 			  nvp->line, nvp->column);
- 		return COMMENT;
diff --git a/package/kernel/mac80211/patches/351-ath9k-fix-DMA-stop-sequence-for-AR9003.patch b/package/kernel/mac80211/patches/351-ath9k-fix-DMA-stop-sequence-for-AR9003.patch
deleted file mode 100644
index 814b0d7a4ad33d99cf53dc51f5596eda6f540902..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/351-ath9k-fix-DMA-stop-sequence-for-AR9003.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Tue, 2 Jun 2015 10:35:46 +0200
-Subject: [PATCH] ath9k: fix DMA stop sequence for AR9003+
-
-AR93xx and newer needs to stop rx before tx to avoid getting the DMA
-engine or MAC into a stuck state.
-This should reduce/fix the occurence of "Failed to stop Tx DMA" logspam.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -216,11 +216,13 @@ static bool ath_prepare_reset(struct ath
- 	ath_stop_ani(sc);
- 	ath9k_hw_disable_interrupts(ah);
- 
--	if (!ath_drain_all_txq(sc))
--		ret = false;
--
--	if (!ath_stoprecv(sc))
--		ret = false;
-+	if (AR_SREV_9300_20_OR_LATER(ah)) {
-+		ret &= ath_stoprecv(sc);
-+		ret &= ath_drain_all_txq(sc);
-+	} else {
-+		ret &= ath_drain_all_txq(sc);
-+		ret &= ath_stoprecv(sc);
-+	}
- 
- 	return ret;
- }
diff --git a/package/kernel/mac80211/patches/352-brcmfmac-support-NVRAMs-containing-pci-devpaths-inst.patch b/package/kernel/mac80211/patches/352-brcmfmac-support-NVRAMs-containing-pci-devpaths-inst.patch
deleted file mode 100644
index 7bbd57e15ed3e9b28443c52a02cccac9780de634..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/352-brcmfmac-support-NVRAMs-containing-pci-devpaths-inst.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Thu, 28 May 2015 14:19:21 +0200
-Subject: [PATCH] brcmfmac: support NVRAMs containing pci devpaths (instead of
- pcie)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Recently Broadcom added support for NVRAMs with entries for multiple
-PCIe devices. One of the supported formats is based on prefixes defined
-like: devpath0=pcie/1/4/ and entries like 0:foo=bar 0:baz=qux etc.
-
-Unfortunately there are also a bit older devices using different way of
-defining prefixes, e.g. SmartRG SR400ac (2 x BCM43602) with entries:
-devpath0=pci/1/1/
-devpath1=pci/2/1
-Broadcom stated this old format will never be used/supported by brcmfmac
-but given the simplicity of this patch I'll insist on supporting it.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -232,6 +232,8 @@ static void brcmf_fw_strip_multi_v1(stru
- 				    u16 bus_nr)
- {
- 	/* Device path with a leading '=' key-value separator */
-+	char pci_path[] = "=pci/?/?";
-+	size_t pci_len;
- 	char pcie_path[] = "=pcie/?/?";
- 	size_t pcie_len;
- 
-@@ -251,6 +253,9 @@ static void brcmf_fw_strip_multi_v1(stru
- 	/* First search for the devpathX and see if it is the configuration
- 	 * for domain_nr/bus_nr. Search complete nvp
- 	 */
-+	snprintf(pci_path, sizeof(pci_path), "=pci/%d/%d", domain_nr,
-+		 bus_nr);
-+	pci_len = strlen(pci_path);
- 	snprintf(pcie_path, sizeof(pcie_path), "=pcie/%d/%d", domain_nr,
- 		 bus_nr);
- 	pcie_len = strlen(pcie_path);
-@@ -260,8 +265,9 @@ static void brcmf_fw_strip_multi_v1(stru
- 		/* Format: devpathX=pcie/Y/Z/
- 		 * Y = domain_nr, Z = bus_nr, X = virtual ID
- 		 */
--		if ((strncmp(&nvp->nvram[i], "devpath", 7) == 0) &&
--		    (strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len) == 0)) {
-+		if (strncmp(&nvp->nvram[i], "devpath", 7) == 0 &&
-+		    (!strncmp(&nvp->nvram[i + 8], pci_path, pci_len) ||
-+		     !strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len))) {
- 			id = nvp->nvram[i + 7] - '0';
- 			found = true;
- 			break;
diff --git a/package/kernel/mac80211/patches/353-brcmfmac-set-wiphy-perm_addr-to-hardware-MAC-address.patch b/package/kernel/mac80211/patches/353-brcmfmac-set-wiphy-perm_addr-to-hardware-MAC-address.patch
deleted file mode 100644
index 1eff6ed83a75b3640af1248f0edef52e3915ef84..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/353-brcmfmac-set-wiphy-perm_addr-to-hardware-MAC-address.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Sun, 31 May 2015 02:52:26 +0200
-Subject: [PATCH] brcmfmac: set wiphy perm_addr to hardware MAC address
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This allows e.g. user space to use /sys/class/ieee80211/*/macaddress
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6070,6 +6070,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
- 		brcmf_err("Could not allocate wiphy device\n");
- 		return NULL;
- 	}
-+	memcpy(wiphy->perm_addr, drvr->mac, ETH_ALEN);
- 	set_wiphy_dev(wiphy, busdev);
- 
- 	cfg = wiphy_priv(wiphy);
diff --git a/package/kernel/mac80211/patches/354-brcmfmac-use-direct-data-pointer-in-NVRAM-parser-str.patch b/package/kernel/mac80211/patches/354-brcmfmac-use-direct-data-pointer-in-NVRAM-parser-str.patch
deleted file mode 100644
index c6e83ddd29256435d7522845b26df02451efadfe..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/354-brcmfmac-use-direct-data-pointer-in-NVRAM-parser-str.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Thu, 4 Jun 2015 22:11:07 +0200
-Subject: [PATCH] brcmfmac: use direct data pointer in NVRAM parser struct
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-As we plan to add support for platform NVRAM we should store direct
-data pointer without the extra struct firmware layer. This will allow
-us to support other sources with the only requirement being u8 buffer.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -43,7 +43,7 @@ enum nvram_parser_state {
-  * struct nvram_parser - internal info for parser.
-  *
-  * @state: current parser state.
-- * @fwnv: input buffer being parsed.
-+ * @data: input buffer being parsed.
-  * @nvram: output buffer with parse result.
-  * @nvram_len: lenght of parse result.
-  * @line: current line.
-@@ -55,7 +55,7 @@ enum nvram_parser_state {
-  */
- struct nvram_parser {
- 	enum nvram_parser_state state;
--	const struct firmware *fwnv;
-+	const u8 *data;
- 	u8 *nvram;
- 	u32 nvram_len;
- 	u32 line;
-@@ -91,7 +91,7 @@ static enum nvram_parser_state brcmf_nvr
- {
- 	char c;
- 
--	c = nvp->fwnv->data[nvp->pos];
-+	c = nvp->data[nvp->pos];
- 	if (c == '\n')
- 		return COMMENT;
- 	if (is_whitespace(c))
-@@ -115,16 +115,16 @@ static enum nvram_parser_state brcmf_nvr
- 	enum nvram_parser_state st = nvp->state;
- 	char c;
- 
--	c = nvp->fwnv->data[nvp->pos];
-+	c = nvp->data[nvp->pos];
- 	if (c == '=') {
- 		/* ignore RAW1 by treating as comment */
--		if (strncmp(&nvp->fwnv->data[nvp->entry], "RAW1", 4) == 0)
-+		if (strncmp(&nvp->data[nvp->entry], "RAW1", 4) == 0)
- 			st = COMMENT;
- 		else
- 			st = VALUE;
--		if (strncmp(&nvp->fwnv->data[nvp->entry], "devpath", 7) == 0)
-+		if (strncmp(&nvp->data[nvp->entry], "devpath", 7) == 0)
- 			nvp->multi_dev_v1 = true;
--		if (strncmp(&nvp->fwnv->data[nvp->entry], "pcie/", 5) == 0)
-+		if (strncmp(&nvp->data[nvp->entry], "pcie/", 5) == 0)
- 			nvp->multi_dev_v2 = true;
- 	} else if (!is_nvram_char(c) || c == ' ') {
- 		brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
-@@ -145,11 +145,11 @@ brcmf_nvram_handle_value(struct nvram_pa
- 	char *ekv;
- 	u32 cplen;
- 
--	c = nvp->fwnv->data[nvp->pos];
-+	c = nvp->data[nvp->pos];
- 	if (!is_nvram_char(c)) {
- 		/* key,value pair complete */
--		ekv = (u8 *)&nvp->fwnv->data[nvp->pos];
--		skv = (u8 *)&nvp->fwnv->data[nvp->entry];
-+		ekv = (u8 *)&nvp->data[nvp->pos];
-+		skv = (u8 *)&nvp->data[nvp->entry];
- 		cplen = ekv - skv;
- 		if (nvp->nvram_len + cplen + 1 >= BRCMF_FW_MAX_NVRAM_SIZE)
- 			return END;
-@@ -170,7 +170,7 @@ brcmf_nvram_handle_comment(struct nvram_
- {
- 	char *eoc, *sol;
- 
--	sol = (char *)&nvp->fwnv->data[nvp->pos];
-+	sol = (char *)&nvp->data[nvp->pos];
- 	eoc = strchr(sol, '\n');
- 	if (!eoc) {
- 		eoc = strchr(sol, '\0');
-@@ -201,17 +201,17 @@ static enum nvram_parser_state
- };
- 
- static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
--				   const struct firmware *nv)
-+				   const u8 *data, size_t data_len)
- {
- 	size_t size;
- 
- 	memset(nvp, 0, sizeof(*nvp));
--	nvp->fwnv = nv;
-+	nvp->data = data;
- 	/* Limit size to MAX_NVRAM_SIZE, some files contain lot of comment */
--	if (nv->size > BRCMF_FW_MAX_NVRAM_SIZE)
-+	if (data_len > BRCMF_FW_MAX_NVRAM_SIZE)
- 		size = BRCMF_FW_MAX_NVRAM_SIZE;
- 	else
--		size = nv->size;
-+		size = data_len;
- 	/* Alloc for extra 0 byte + roundup by 4 + length field */
- 	size += 1 + 3 + sizeof(u32);
- 	nvp->nvram = kzalloc(size, GFP_KERNEL);
-@@ -362,18 +362,18 @@ fail:
-  * and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
-  * End of buffer is completed with token identifying length of buffer.
-  */
--static void *brcmf_fw_nvram_strip(const struct firmware *nv, u32 *new_length,
--				  u16 domain_nr, u16 bus_nr)
-+static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len,
-+				  u32 *new_length, u16 domain_nr, u16 bus_nr)
- {
- 	struct nvram_parser nvp;
- 	u32 pad;
- 	u32 token;
- 	__le32 token_le;
- 
--	if (brcmf_init_nvram_parser(&nvp, nv) < 0)
-+	if (brcmf_init_nvram_parser(&nvp, data, data_len) < 0)
- 		return NULL;
- 
--	while (nvp.pos < nv->size) {
-+	while (nvp.pos < data_len) {
- 		nvp.state = nv_parser_states[nvp.state](&nvp);
- 		if (nvp.state == END)
- 			break;
-@@ -432,7 +432,7 @@ static void brcmf_fw_request_nvram_done(
- 		goto fail;
- 
- 	if (fw) {
--		nvram = brcmf_fw_nvram_strip(fw, &nvram_length,
-+		nvram = brcmf_fw_nvram_strip(fw->data, fw->size, &nvram_length,
- 					     fwctx->domain_nr, fwctx->bus_nr);
- 		release_firmware(fw);
- 		if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
diff --git a/package/kernel/mac80211/patches/355-b43-fix-support-for-14e4-4321-PCI-dev-with-BCM4321-c.patch b/package/kernel/mac80211/patches/355-b43-fix-support-for-14e4-4321-PCI-dev-with-BCM4321-c.patch
deleted file mode 100644
index 4ecef3b5af8eaaf682a15fa5e0f647e493688298..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/355-b43-fix-support-for-14e4-4321-PCI-dev-with-BCM4321-c.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Sat, 6 Jun 2015 22:45:59 +0200
-Subject: [PATCH] b43: fix support for 14e4:4321 PCI dev with BCM4321 chipset
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-It seems Broadcom released two devices with conflicting device id. There
-are for sure 14e4:4321 PCI devices with BCM4321 (N-PHY) chipset, they
-can be found in routers, e.g. Netgear WNR834Bv2. However, according to
-Broadcom public sources 0x4321 is also used for 5 GHz BCM4306 (G-PHY).
-It's unsure if they meant PCI device id, or "virtual" id (from SPROM).
-To distinguish these devices lets check PHY type (G vs. N).
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Cc: <stable@vger.kernel.org> # 3.16+
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -5365,6 +5365,10 @@ static void b43_supported_bands(struct b
- 		*have_5ghz_phy = true;
- 		return;
- 	case 0x4321: /* BCM4306 */
-+		/* There are 14e4:4321 PCI devs with 2.4 GHz BCM4321 (N-PHY) */
-+		if (dev->phy.type != B43_PHYTYPE_G)
-+			break;
-+		/* fall through */
- 	case 0x4313: /* BCM4311 */
- 	case 0x431a: /* BCM4318 */
- 	case 0x432a: /* BCM4321 */
diff --git a/package/kernel/mac80211/patches/357-0001-brcmfmac-Update-msgbuf-read-pointer-quicker.patch b/package/kernel/mac80211/patches/357-0001-brcmfmac-Update-msgbuf-read-pointer-quicker.patch
deleted file mode 100644
index 74df9f93f75bd17055caccd38a466708a1dee63e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/357-0001-brcmfmac-Update-msgbuf-read-pointer-quicker.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Mon, 8 Jun 2015 14:38:32 +0200
-Subject: [PATCH] brcmfmac: Update msgbuf read pointer quicker.
-
-On device to host data using msgbuf the read pointer gets updated
-once all data is processed. Updating this pointer more frequently
-allows the firmware to add more data quicker. This will result in
-slightly higher and more stable throughput on CPU bounded host
-processors.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
-@@ -223,8 +223,6 @@ void brcmf_commonring_write_cancel(struc
- void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
- 				    u16 *n_items)
- {
--	void *ret_addr;
--
- 	if (commonring->cr_update_wptr)
- 		commonring->cr_update_wptr(commonring->cr_ctx);
- 
-@@ -235,19 +233,18 @@ void *brcmf_commonring_get_read_ptr(stru
- 	if (*n_items == 0)
- 		return NULL;
- 
--	ret_addr = commonring->buf_addr +
--		   (commonring->r_ptr * commonring->item_len);
--
--	commonring->r_ptr += *n_items;
--	if (commonring->r_ptr == commonring->depth)
--		commonring->r_ptr = 0;
--
--	return ret_addr;
-+	return commonring->buf_addr +
-+	       (commonring->r_ptr * commonring->item_len);
- }
- 
- 
--int brcmf_commonring_read_complete(struct brcmf_commonring *commonring)
-+int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
-+				   u16 n_items)
- {
-+	commonring->r_ptr += n_items;
-+	if (commonring->r_ptr == commonring->depth)
-+		commonring->r_ptr = 0;
-+
- 	if (commonring->cr_write_rptr)
- 		return commonring->cr_write_rptr(commonring->cr_ctx);
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/commonring.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.h
-@@ -62,7 +62,8 @@ void brcmf_commonring_write_cancel(struc
- 				   u16 n_items);
- void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
- 				    u16 *n_items);
--int brcmf_commonring_read_complete(struct brcmf_commonring *commonring);
-+int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
-+				   u16 n_items);
- 
- #define brcmf_commonring_n_items(commonring) (commonring->depth)
- #define brcmf_commonring_len_item(commonring) (commonring->item_len)
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -75,6 +75,8 @@
- 
- #define BRCMF_MSGBUF_DELAY_TXWORKER_THRS	96
- #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS	32
-+#define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS		48
-+
- 
- struct msgbuf_common_hdr {
- 	u8				msgtype;
-@@ -1257,19 +1259,27 @@ static void brcmf_msgbuf_process_rx(stru
- {
- 	void *buf;
- 	u16 count;
-+	u16 processed;
- 
- again:
- 	buf = brcmf_commonring_get_read_ptr(commonring, &count);
- 	if (buf == NULL)
- 		return;
- 
-+	processed = 0;
- 	while (count) {
- 		brcmf_msgbuf_process_msgtype(msgbuf,
- 					     buf + msgbuf->rx_dataoffset);
- 		buf += brcmf_commonring_len_item(commonring);
-+		processed++;
-+		if (processed == BRCMF_MSGBUF_UPDATE_RX_PTR_THRS) {
-+			brcmf_commonring_read_complete(commonring, processed);
-+			processed = 0;
-+		}
- 		count--;
- 	}
--	brcmf_commonring_read_complete(commonring);
-+	if (processed)
-+		brcmf_commonring_read_complete(commonring, processed);
- 
- 	if (commonring->r_ptr == 0)
- 		goto again;
diff --git a/package/kernel/mac80211/patches/357-0002-brcmfmac-remove-chipinfo-debugfs-entry.patch b/package/kernel/mac80211/patches/357-0002-brcmfmac-remove-chipinfo-debugfs-entry.patch
deleted file mode 100644
index 9e5b48608d1d8f7fafe4262511744eab5404024d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/357-0002-brcmfmac-remove-chipinfo-debugfs-entry.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Mon, 8 Jun 2015 14:38:33 +0200
-Subject: [PATCH] brcmfmac: remove chipinfo debugfs entry
-
-The information provided by chipinfo is also provided by the
-revinfo debugfs entry. Removing it from debugfs.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-@@ -41,15 +41,6 @@ void brcmf_debugfs_exit(void)
- 	root_folder = NULL;
- }
- 
--static int brcmf_debugfs_chipinfo_read(struct seq_file *seq, void *data)
--{
--	struct brcmf_bus *bus = dev_get_drvdata(seq->private);
--
--	seq_printf(seq, "chip: %x(%u) rev %u\n",
--		   bus->chip, bus->chip, bus->chiprev);
--	return 0;
--}
--
- int brcmf_debugfs_attach(struct brcmf_pub *drvr)
- {
- 	struct device *dev = drvr->bus_if->dev;
-@@ -58,7 +49,6 @@ int brcmf_debugfs_attach(struct brcmf_pu
- 		return -ENODEV;
- 
- 	drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
--	brcmf_debugfs_add_entry(drvr, "chipinfo", brcmf_debugfs_chipinfo_read);
- 
- 	return PTR_ERR_OR_ZERO(drvr->dbgfs_dir);
- }
diff --git a/package/kernel/mac80211/patches/357-0003-brcmfmac-remove-watchdog-reset-from-brcmf_pcie_busco.patch b/package/kernel/mac80211/patches/357-0003-brcmfmac-remove-watchdog-reset-from-brcmf_pcie_busco.patch
deleted file mode 100644
index c38b2cd15074d3b4ed3beef2bcdfac08aa980a85..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/357-0003-brcmfmac-remove-watchdog-reset-from-brcmf_pcie_busco.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Mon, 8 Jun 2015 14:38:34 +0200
-Subject: [PATCH] brcmfmac: remove watchdog reset from
- brcmf_pcie_buscoreprep()
-
-The watchdog reset as done in brcmf_pcie_buscoreprep() is not
-sufficient. It needs to modify PCIe core registers as well
-which is properly done by brcmf_pcie_reset_device() after the
-chip recognition is done. So the faulty watchdog reset can be
-removed as it was causing driver reload to fail and hang the
-system requiring a power-cycle. Instead the call to to the
-brcmf_pcie_reset_device() function is done twice in the unload.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -1629,20 +1629,7 @@ static void brcmf_pcie_buscore_write32(v
- 
- static int brcmf_pcie_buscoreprep(void *ctx)
- {
--	struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
--	int err;
--
--	err = brcmf_pcie_get_resource(devinfo);
--	if (err == 0) {
--		/* Set CC watchdog to reset all the cores on the chip to bring
--		 * back dongle to a sane state.
--		 */
--		brcmf_pcie_buscore_write32(ctx, CORE_CC_REG(SI_ENUM_BASE,
--							    watchdog), 4);
--		msleep(100);
--	}
--
--	return err;
-+	return brcmf_pcie_get_resource(ctx);
- }
- 
- 
-@@ -1824,6 +1811,7 @@ brcmf_pcie_remove(struct pci_dev *pdev)
- 		brcmf_pcie_intr_disable(devinfo);
- 
- 	brcmf_detach(&pdev->dev);
-+	brcmf_pcie_reset_device(devinfo);
- 
- 	kfree(bus->bus_priv.pcie);
- 	kfree(bus->msgbuf->flowrings);
diff --git a/package/kernel/mac80211/patches/357-0004-brcmfmac-use-debugfs_create_devm_seqfile-helper-func.patch b/package/kernel/mac80211/patches/357-0004-brcmfmac-use-debugfs_create_devm_seqfile-helper-func.patch
deleted file mode 100644
index 756fbb2cb7eadbbd6738c971b86e3dc1c9bd132e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/357-0004-brcmfmac-use-debugfs_create_devm_seqfile-helper-func.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Mon, 8 Jun 2015 14:38:35 +0200
-Subject: [PATCH] brcmfmac: use debugfs_create_devm_seqfile() helper
- function
-
-Some time ago the function debugfs_create_devm_seqfile() was
-introduced in debugfs. The caller simply needs to provide a
-device pointer and read function. The function brcmf_debugfs_add_entry()
-is now simply a wrapper only doing the work for CONFIG_BRCMDBG.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-@@ -64,44 +64,12 @@ struct dentry *brcmf_debugfs_get_devdir(
- 	return drvr->dbgfs_dir;
- }
- 
--struct brcmf_debugfs_entry {
--	int (*read)(struct seq_file *seq, void *data);
--	struct brcmf_pub *drvr;
--};
--
--static int brcmf_debugfs_entry_open(struct inode *inode, struct file *f)
--{
--	struct brcmf_debugfs_entry *entry = inode->i_private;
--
--	return single_open(f, entry->read, entry->drvr->bus_if->dev);
--}
--
--static const struct file_operations brcmf_debugfs_def_ops = {
--	.owner = THIS_MODULE,
--	.open = brcmf_debugfs_entry_open,
--	.release = single_release,
--	.read = seq_read,
--	.llseek = seq_lseek
--};
--
- int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
- 			    int (*read_fn)(struct seq_file *seq, void *data))
- {
--	struct dentry *dentry =  drvr->dbgfs_dir;
--	struct brcmf_debugfs_entry *entry;
--
--	if (IS_ERR_OR_NULL(dentry))
--		return -ENOENT;
--
--	entry = devm_kzalloc(drvr->bus_if->dev, sizeof(*entry), GFP_KERNEL);
--	if (!entry)
--		return -ENOMEM;
--
--	entry->read = read_fn;
--	entry->drvr = drvr;
--
--	dentry = debugfs_create_file(fn, S_IRUGO, dentry, entry,
--				     &brcmf_debugfs_def_ops);
-+	struct dentry *e;
- 
--	return PTR_ERR_OR_ZERO(dentry);
-+	e = debugfs_create_devm_seqfile(drvr->bus_if->dev, fn,
-+					drvr->dbgfs_dir, read_fn);
-+	return PTR_ERR_OR_ZERO(e);
- }
diff --git a/package/kernel/mac80211/patches/358-ath9k_hw-fix-device-ID-check-for-AR956x.patch b/package/kernel/mac80211/patches/358-ath9k_hw-fix-device-ID-check-for-AR956x.patch
deleted file mode 100644
index 2674efb91f839f304e8afebf5da0c95037b06242..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/358-ath9k_hw-fix-device-ID-check-for-AR956x.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Sun, 21 Jun 2015 19:45:59 +0200
-Subject: [PATCH] ath9k_hw: fix device ID check for AR956x
-
-Because of the missing return, the macVersion value was being
-overwritten with an invalid register read
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/hw.c
-+++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -278,6 +278,7 @@ static void ath9k_hw_read_revisions(stru
- 		return;
- 	case AR9300_DEVID_QCA956X:
- 		ah->hw_version.macVersion = AR_SREV_VERSION_9561;
-+		return;
- 	}
- 
- 	val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
diff --git a/package/kernel/mac80211/patches/359-0001-brcmfmac-Check-if-firmware-supports-p2p.patch b/package/kernel/mac80211/patches/359-0001-brcmfmac-Check-if-firmware-supports-p2p.patch
deleted file mode 100644
index ff24a4a06fd16036440718ea445993325d1a8089..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0001-brcmfmac-Check-if-firmware-supports-p2p.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From: Pontus Fuchs <pontusf@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:17 +0200
-Subject: [PATCH] brcmfmac: Check if firmware supports p2p
-
-Add a feature flag to reflect the firmware's p2p capability.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Signed-off-by: Pontus Fuchs <pontusf@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-@@ -129,6 +129,7 @@ void brcmf_feat_attach(struct brcmf_pub
- 		brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
- 	if (drvr->bus_if->chip != BRCM_CC_43362_CHIP_ID)
- 		brcmf_feat_iovar_int_set(ifp, BRCMF_FEAT_MBSS, "mbss", 0);
-+	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_P2P, "p2p");
- 
- 	/* set chip related quirks */
- 	switch (drvr->bus_if->chip) {
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-@@ -23,12 +23,14 @@
-  * MCHAN: multi-channel for concurrent P2P.
-  * PNO: preferred network offload.
-  * WOWL: Wake-On-WLAN.
-+ * P2P: peer-to-peer
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
- 	BRCMF_FEAT_DEF(MCHAN) \
- 	BRCMF_FEAT_DEF(PNO) \
--	BRCMF_FEAT_DEF(WOWL)
-+	BRCMF_FEAT_DEF(WOWL) \
-+	BRCMF_FEAT_DEF(P2P)
- /*
-  * Quirks:
-  *
diff --git a/package/kernel/mac80211/patches/359-0002-brcmfmac-Build-wiphy-mode-and-interface-combinations.patch b/package/kernel/mac80211/patches/359-0002-brcmfmac-Build-wiphy-mode-and-interface-combinations.patch
deleted file mode 100644
index 3876ba01da23fb66dc371d2d76455a069d1b8151..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0002-brcmfmac-Build-wiphy-mode-and-interface-combinations.patch
+++ /dev/null
@@ -1,198 +0,0 @@
-From: Pontus Fuchs <pontusf@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:18 +0200
-Subject: [PATCH] brcmfmac: Build wiphy mode and interface combinations
- dynamically
-
-Switch from using semi hard coded interface combinations. This makes
-it easier to announce what the firmware actually supports. This fixes
-the case where brcmfmac announces p2p but the firmware doesn't
-support it.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Signed-off-by: Pontus Fuchs <pontusf@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -52,8 +52,6 @@
- #define BRCMF_PNO_SCAN_COMPLETE		1
- #define BRCMF_PNO_SCAN_INCOMPLETE	0
- 
--#define BRCMF_IFACE_MAX_CNT		3
--
- #define WPA_OUI				"\x00\x50\xF2"	/* WPA OUI */
- #define WPA_OUI_TYPE			1
- #define RSN_OUI				"\x00\x0F\xAC"	/* RSN OUI */
-@@ -5639,53 +5637,6 @@ static int brcmf_setup_wiphybands(struct
- 	return 0;
- }
- 
--static const struct ieee80211_iface_limit brcmf_iface_limits_mbss[] = {
--	{
--		.max = 1,
--		.types = BIT(NL80211_IFTYPE_STATION) |
--			 BIT(NL80211_IFTYPE_ADHOC)
--	},
--	{
--		.max = 4,
--		.types = BIT(NL80211_IFTYPE_AP)
--	},
--	{
--		.max = 1,
--		.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
--			 BIT(NL80211_IFTYPE_P2P_GO)
--	},
--	{
--		.max = 1,
--		.types = BIT(NL80211_IFTYPE_P2P_DEVICE)
--	}
--};
--
--static const struct ieee80211_iface_limit brcmf_iface_limits_sbss[] = {
--	{
--		.max = 2,
--		.types = BIT(NL80211_IFTYPE_STATION) |
--			 BIT(NL80211_IFTYPE_ADHOC) |
--			 BIT(NL80211_IFTYPE_AP)
--	},
--	{
--		.max = 1,
--		.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
--			 BIT(NL80211_IFTYPE_P2P_GO)
--	},
--	{
--		.max = 1,
--		.types = BIT(NL80211_IFTYPE_P2P_DEVICE)
--	}
--};
--static struct ieee80211_iface_combination brcmf_iface_combos[] = {
--	{
--		 .max_interfaces = BRCMF_IFACE_MAX_CNT,
--		 .num_different_channels = 1,
--		 .n_limits = ARRAY_SIZE(brcmf_iface_limits_sbss),
--		 .limits = brcmf_iface_limits_sbss,
--	}
--};
--
- static const struct ieee80211_txrx_stypes
- brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
- 	[NL80211_IFTYPE_STATION] = {
-@@ -5715,6 +5666,67 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] =
- 	}
- };
- 
-+static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
-+{
-+	struct ieee80211_iface_combination *combo = NULL;
-+	struct ieee80211_iface_limit *limits = NULL;
-+	int i = 0, max_iface_cnt;
-+
-+	combo = kzalloc(sizeof(*combo), GFP_KERNEL);
-+	if (!combo)
-+		goto err;
-+
-+	limits = kzalloc(sizeof(*limits) * 4, GFP_KERNEL);
-+	if (!limits)
-+		goto err;
-+
-+	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-+				 BIT(NL80211_IFTYPE_ADHOC) |
-+				 BIT(NL80211_IFTYPE_AP);
-+
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
-+		combo->num_different_channels = 2;
-+	else
-+		combo->num_different_channels = 1;
-+
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
-+		limits[i].max = 1;
-+		limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		limits[i].max = 4;
-+		limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		max_iface_cnt = 5;
-+	} else {
-+		limits[i].max = 2;
-+		limits[i++].types = BIT(NL80211_IFTYPE_STATION) |
-+				    BIT(NL80211_IFTYPE_AP);
-+		max_iface_cnt = 2;
-+	}
-+
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P)) {
-+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+					  BIT(NL80211_IFTYPE_P2P_GO) |
-+					  BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		limits[i].max = 1;
-+		limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+				    BIT(NL80211_IFTYPE_P2P_GO);
-+		limits[i].max = 1;
-+		limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		max_iface_cnt += 2;
-+	}
-+	combo->max_interfaces = max_iface_cnt;
-+	combo->limits = limits;
-+	combo->n_limits = i;
-+
-+	wiphy->iface_combinations = combo;
-+	wiphy->n_iface_combinations = 1;
-+	return 0;
-+
-+err:
-+	kfree(limits);
-+	kfree(combo);
-+	return -ENOMEM;
-+}
-+
- static void brcmf_wiphy_pno_params(struct wiphy *wiphy)
- {
- 	/* scheduled scan settings */
-@@ -5745,7 +5757,6 @@ static void brcmf_wiphy_wowl_params(stru
- static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
- 	struct ieee80211_supported_band *band;
--	struct ieee80211_iface_combination ifc_combo;
- 	__le32 bandlist[3];
- 	u32 n_bands;
- 	int err, i;
-@@ -5753,24 +5764,11 @@ static int brcmf_setup_wiphy(struct wiph
- 	wiphy->max_scan_ssids = WL_NUM_SCAN_MAX;
- 	wiphy->max_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX;
- 	wiphy->max_num_pmkids = WL_NUM_PMKIDS_MAX;
--	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
--				 BIT(NL80211_IFTYPE_ADHOC) |
--				 BIT(NL80211_IFTYPE_AP) |
--				 BIT(NL80211_IFTYPE_P2P_CLIENT) |
--				 BIT(NL80211_IFTYPE_P2P_GO) |
--				 BIT(NL80211_IFTYPE_P2P_DEVICE);
--	/* need VSDB firmware feature for concurrent channels */
--	ifc_combo = brcmf_iface_combos[0];
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
--		ifc_combo.num_different_channels = 2;
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
--		ifc_combo.n_limits = ARRAY_SIZE(brcmf_iface_limits_mbss),
--		ifc_combo.limits = brcmf_iface_limits_mbss;
--	}
--	wiphy->iface_combinations = kmemdup(&ifc_combo,
--					    sizeof(ifc_combo),
--					    GFP_KERNEL);
--	wiphy->n_iface_combinations = ARRAY_SIZE(brcmf_iface_combos);
-+
-+	err = brcmf_setup_ifmodes(wiphy, ifp);
-+	if (err)
-+		return err;
-+
- 	wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
- 	wiphy->cipher_suites = __wl_cipher_suites;
- 	wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites);
-@@ -6035,6 +6033,8 @@ static void brcmf_free_wiphy(struct wiph
- 	if (!wiphy)
- 		return;
- 
-+	if (wiphy->iface_combinations)
-+		kfree(wiphy->iface_combinations->limits);
- 	kfree(wiphy->iface_combinations);
- 	if (wiphy->bands[IEEE80211_BAND_2GHZ]) {
- 		kfree(wiphy->bands[IEEE80211_BAND_2GHZ]->channels);
diff --git a/package/kernel/mac80211/patches/359-0003-brcmfmac-rework-.get_station-callback.patch b/package/kernel/mac80211/patches/359-0003-brcmfmac-rework-.get_station-callback.patch
deleted file mode 100644
index 7bd06869dab668583c276104a28333c29aff00db..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0003-brcmfmac-rework-.get_station-callback.patch
+++ /dev/null
@@ -1,326 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:19 +0200
-Subject: [PATCH] brcmfmac: rework .get_station() callback
-
-The .get_station() cfg80211 callback is used in several scenarios. In
-managed mode it can obtain information about the access-point and its
-BSS parameters. In managed mode it can also obtain information about
-TDLS peers. In AP mode it can obtain information about connected
-clients.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -2395,27 +2395,80 @@ brcmf_cfg80211_reconfigure_wep(struct br
- 		brcmf_err("set wsec error (%d)\n", err);
- }
- 
-+static void brcmf_convert_sta_flags(u32 fw_sta_flags, struct station_info *si)
-+{
-+	struct nl80211_sta_flag_update *sfu;
-+
-+	brcmf_dbg(TRACE, "flags %08x\n", fw_sta_flags);
-+	si->filled |= BIT(NL80211_STA_INFO_STA_FLAGS);
-+	sfu = &si->sta_flags;
-+	sfu->mask = BIT(NL80211_STA_FLAG_WME) |
-+		    BIT(NL80211_STA_FLAG_AUTHENTICATED) |
-+		    BIT(NL80211_STA_FLAG_ASSOCIATED) |
-+		    BIT(NL80211_STA_FLAG_AUTHORIZED);
-+	if (fw_sta_flags & BRCMF_STA_WME)
-+		sfu->set |= BIT(NL80211_STA_FLAG_WME);
-+	if (fw_sta_flags & BRCMF_STA_AUTHE)
-+		sfu->set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
-+	if (fw_sta_flags & BRCMF_STA_ASSOC)
-+		sfu->set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
-+	if (fw_sta_flags & BRCMF_STA_AUTHO)
-+		sfu->set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
-+}
-+
-+static void brcmf_fill_bss_param(struct brcmf_if *ifp, struct station_info *si)
-+{
-+	struct {
-+		__le32 len;
-+		struct brcmf_bss_info_le bss_le;
-+	} *buf;
-+	u16 capability;
-+	int err;
-+
-+	buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
-+	if (!buf)
-+		return;
-+
-+	buf->len = cpu_to_le32(WL_BSS_INFO_MAX);
-+	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO, buf,
-+				     WL_BSS_INFO_MAX);
-+	if (err) {
-+		brcmf_err("Failed to get bss info (%d)\n", err);
-+		return;
-+	}
-+	si->filled |= BIT(NL80211_STA_INFO_BSS_PARAM);
-+	si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period);
-+	si->bss_param.dtim_period = buf->bss_le.dtim_period;
-+	capability = le16_to_cpu(buf->bss_le.capability);
-+	if (capability & IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT)
-+		si->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
-+	if (capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
-+		si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
-+	if (capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
-+		si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
-+}
-+
- static s32
- brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
- 			   const u8 *mac, struct station_info *sinfo)
- {
- 	struct brcmf_if *ifp = netdev_priv(ndev);
--	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
--	struct brcmf_scb_val_le scb_val;
--	int rssi;
--	s32 rate;
- 	s32 err = 0;
--	u8 *bssid = profile->bssid;
- 	struct brcmf_sta_info_le sta_info_le;
--	u32 beacon_period;
--	u32 dtim_period;
-+	u32 sta_flags;
-+	u32 is_tdls_peer;
- 
- 	brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
- 	if (!check_vif_up(ifp->vif))
- 		return -EIO;
- 
--	if (brcmf_is_apmode(ifp->vif)) {
--		memcpy(&sta_info_le, mac, ETH_ALEN);
-+	memset(&sta_info_le, 0, sizeof(sta_info_le));
-+	memcpy(&sta_info_le, mac, ETH_ALEN);
-+	err = brcmf_fil_iovar_data_get(ifp, "tdls_sta_info",
-+				       &sta_info_le,
-+				       sizeof(sta_info_le));
-+	is_tdls_peer = !err;
-+	if (err) {
- 		err = brcmf_fil_iovar_data_get(ifp, "sta_info",
- 					       &sta_info_le,
- 					       sizeof(sta_info_le));
-@@ -2423,73 +2476,48 @@ brcmf_cfg80211_get_station(struct wiphy
- 			brcmf_err("GET STA INFO failed, %d\n", err);
- 			goto done;
- 		}
--		sinfo->filled = BIT(NL80211_STA_INFO_INACTIVE_TIME);
--		sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000;
--		if (le32_to_cpu(sta_info_le.flags) & BRCMF_STA_ASSOC) {
--			sinfo->filled |= BIT(NL80211_STA_INFO_CONNECTED_TIME);
--			sinfo->connected_time = le32_to_cpu(sta_info_le.in);
--		}
--		brcmf_dbg(TRACE, "STA idle time : %d ms, connected time :%d sec\n",
--			  sinfo->inactive_time, sinfo->connected_time);
--	} else if (ifp->vif->wdev.iftype == NL80211_IFTYPE_STATION) {
--		if (memcmp(mac, bssid, ETH_ALEN)) {
--			brcmf_err("Wrong Mac address cfg_mac-%pM wl_bssid-%pM\n",
--				  mac, bssid);
--			err = -ENOENT;
--			goto done;
--		}
--		/* Report the current tx rate */
--		err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_RATE, &rate);
--		if (err) {
--			brcmf_err("Could not get rate (%d)\n", err);
--			goto done;
--		} else {
-+	}
-+	brcmf_dbg(TRACE, "version %d\n", le16_to_cpu(sta_info_le.ver));
-+	sinfo->filled = BIT(NL80211_STA_INFO_INACTIVE_TIME);
-+	sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000;
-+	sta_flags = le32_to_cpu(sta_info_le.flags);
-+	brcmf_convert_sta_flags(sta_flags, sinfo);
-+	sinfo->sta_flags.mask |= BIT(NL80211_STA_FLAG_TDLS_PEER);
-+	if (is_tdls_peer)
-+		sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
-+	else
-+		sinfo->sta_flags.set &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
-+	if (sta_flags & BRCMF_STA_ASSOC) {
-+		sinfo->filled |= BIT(NL80211_STA_INFO_CONNECTED_TIME);
-+		sinfo->connected_time = le32_to_cpu(sta_info_le.in);
-+		brcmf_fill_bss_param(ifp, sinfo);
-+	}
-+	if (sta_flags & BRCMF_STA_SCBSTATS) {
-+		sinfo->filled |= BIT(NL80211_STA_INFO_TX_FAILED);
-+		sinfo->tx_failed = le32_to_cpu(sta_info_le.tx_failures);
-+		sinfo->filled |= BIT(NL80211_STA_INFO_TX_PACKETS);
-+		sinfo->tx_packets = le32_to_cpu(sta_info_le.tx_pkts);
-+		sinfo->tx_packets += le32_to_cpu(sta_info_le.tx_mcast_pkts);
-+		sinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS);
-+		sinfo->rx_packets = le32_to_cpu(sta_info_le.rx_ucast_pkts);
-+		sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts);
-+		if (sinfo->tx_packets) {
- 			sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE);
--			sinfo->txrate.legacy = rate * 5;
--			brcmf_dbg(CONN, "Rate %d Mbps\n", rate / 2);
-+			sinfo->txrate.legacy = le32_to_cpu(sta_info_le.tx_rate);
-+			sinfo->txrate.legacy /= 100;
- 		}
--
--		if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
--			     &ifp->vif->sme_state)) {
--			memset(&scb_val, 0, sizeof(scb_val));
--			err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI,
--						     &scb_val, sizeof(scb_val));
--			if (err) {
--				brcmf_err("Could not get rssi (%d)\n", err);
--				goto done;
--			} else {
--				rssi = le32_to_cpu(scb_val.val);
--				sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
--				sinfo->signal = rssi;
--				brcmf_dbg(CONN, "RSSI %d dBm\n", rssi);
--			}
--			err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_BCNPRD,
--						    &beacon_period);
--			if (err) {
--				brcmf_err("Could not get beacon period (%d)\n",
--					  err);
--				goto done;
--			} else {
--				sinfo->bss_param.beacon_interval =
--					beacon_period;
--				brcmf_dbg(CONN, "Beacon peroid %d\n",
--					  beacon_period);
--			}
--			err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_DTIMPRD,
--						    &dtim_period);
--			if (err) {
--				brcmf_err("Could not get DTIM period (%d)\n",
--					  err);
--				goto done;
--			} else {
--				sinfo->bss_param.dtim_period = dtim_period;
--				brcmf_dbg(CONN, "DTIM peroid %d\n",
--					  dtim_period);
--			}
--			sinfo->filled |= BIT(NL80211_STA_INFO_BSS_PARAM);
-+		if (sinfo->rx_packets) {
-+			sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE);
-+			sinfo->rxrate.legacy = le32_to_cpu(sta_info_le.rx_rate);
-+			sinfo->rxrate.legacy /= 100;
-+		}
-+		if (le16_to_cpu(sta_info_le.ver) >= 4) {
-+			sinfo->filled |= BIT(NL80211_STA_INFO_TX_BYTES);
-+			sinfo->tx_bytes = le64_to_cpu(sta_info_le.tx_tot_bytes);
-+			sinfo->filled |= BIT(NL80211_STA_INFO_RX_BYTES);
-+			sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
- 		}
--	} else
--		err = -EPERM;
-+	}
- done:
- 	brcmf_dbg(TRACE, "Exit\n");
- 	return err;
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-@@ -32,7 +32,11 @@
- #define	BRCMF_BSS_INFO_VERSION	109 /* curr ver of brcmf_bss_info_le struct */
- #define BRCMF_BSS_RSSI_ON_CHANNEL	0x0002
- 
--#define BRCMF_STA_ASSOC			0x10		/* Associated */
-+#define BRCMF_STA_WME              0x00000002      /* WMM association */
-+#define BRCMF_STA_AUTHE            0x00000008      /* Authenticated */
-+#define BRCMF_STA_ASSOC            0x00000010      /* Associated */
-+#define BRCMF_STA_AUTHO            0x00000020      /* Authorized */
-+#define BRCMF_STA_SCBSTATS         0x00004000      /* Per STA debug stats */
- 
- /* size of brcmf_scan_params not including variable length array */
- #define BRCMF_SCAN_PARAMS_FIXED_SIZE	64
-@@ -113,6 +117,7 @@
- #define BRCMF_WOWL_MAXPATTERNSIZE	128
- 
- #define BRCMF_COUNTRY_BUF_SZ		4
-+#define BRCMF_ANT_MAX			4
- 
- /* join preference types for join_pref iovar */
- enum brcmf_join_pref_types {
-@@ -456,25 +461,61 @@ struct brcmf_channel_info_le {
- };
- 
- struct brcmf_sta_info_le {
--	__le16	ver;		/* version of this struct */
--	__le16	len;		/* length in bytes of this structure */
--	__le16	cap;		/* sta's advertised capabilities */
--	__le32	flags;		/* flags defined below */
--	__le32	idle;		/* time since data pkt rx'd from sta */
--	u8	ea[ETH_ALEN];		/* Station address */
--	__le32	count;			/* # rates in this set */
--	u8	rates[BRCMF_MAXRATES_IN_SET];	/* rates in 500kbps units */
-+	__le16 ver;		/* version of this struct */
-+	__le16 len;		/* length in bytes of this structure */
-+	__le16 cap;		/* sta's advertised capabilities */
-+	__le32 flags;		/* flags defined below */
-+	__le32 idle;		/* time since data pkt rx'd from sta */
-+	u8 ea[ETH_ALEN];		/* Station address */
-+	__le32 count;			/* # rates in this set */
-+	u8 rates[BRCMF_MAXRATES_IN_SET];	/* rates in 500kbps units */
- 						/* w/hi bit set if basic */
--	__le32	in;		/* seconds elapsed since associated */
--	__le32	listen_interval_inms; /* Min Listen interval in ms for STA */
--	__le32	tx_pkts;	/* # of packets transmitted */
--	__le32	tx_failures;	/* # of packets failed */
--	__le32	rx_ucast_pkts;	/* # of unicast packets received */
--	__le32	rx_mcast_pkts;	/* # of multicast packets received */
--	__le32	tx_rate;	/* Rate of last successful tx frame */
--	__le32	rx_rate;	/* Rate of last successful rx frame */
--	__le32	rx_decrypt_succeeds;	/* # of packet decrypted successfully */
--	__le32	rx_decrypt_failures;	/* # of packet decrypted failed */
-+	__le32 in;		/* seconds elapsed since associated */
-+	__le32 listen_interval_inms; /* Min Listen interval in ms for STA */
-+	__le32 tx_pkts;	/* # of packets transmitted */
-+	__le32 tx_failures;	/* # of packets failed */
-+	__le32 rx_ucast_pkts;	/* # of unicast packets received */
-+	__le32 rx_mcast_pkts;	/* # of multicast packets received */
-+	__le32 tx_rate;	/* Rate of last successful tx frame */
-+	__le32 rx_rate;	/* Rate of last successful rx frame */
-+	__le32 rx_decrypt_succeeds;	/* # of packet decrypted successfully */
-+	__le32 rx_decrypt_failures;	/* # of packet decrypted failed */
-+	__le32 tx_tot_pkts;    /* # of tx pkts (ucast + mcast) */
-+	__le32 rx_tot_pkts;    /* # of data packets recvd (uni + mcast) */
-+	__le32 tx_mcast_pkts;  /* # of mcast pkts txed */
-+	__le64 tx_tot_bytes;   /* data bytes txed (ucast + mcast) */
-+	__le64 rx_tot_bytes;   /* data bytes recvd (ucast + mcast) */
-+	__le64 tx_ucast_bytes; /* data bytes txed (ucast) */
-+	__le64 tx_mcast_bytes; /* # data bytes txed (mcast) */
-+	__le64 rx_ucast_bytes; /* data bytes recvd (ucast) */
-+	__le64 rx_mcast_bytes; /* data bytes recvd (mcast) */
-+	s8 rssi[BRCMF_ANT_MAX];   /* per antenna rssi */
-+	s8 nf[BRCMF_ANT_MAX];     /* per antenna noise floor */
-+	__le16 aid;                    /* association ID */
-+	__le16 ht_capabilities;        /* advertised ht caps */
-+	__le16 vht_flags;              /* converted vht flags */
-+	__le32 tx_pkts_retry_cnt;      /* # of frames where a retry was
-+					 * exhausted.
-+					 */
-+	__le32 tx_pkts_retry_exhausted; /* # of user frames where a retry
-+					 * was exhausted
-+					 */
-+	s8 rx_lastpkt_rssi[BRCMF_ANT_MAX]; /* Per antenna RSSI of last
-+					    * received data frame.
-+					    */
-+	/* TX WLAN retry/failure statistics:
-+	 * Separated for host requested frames and locally generated frames.
-+	 * Include unicast frame only where the retries/failures can be counted.
-+	 */
-+	__le32 tx_pkts_total;          /* # user frames sent successfully */
-+	__le32 tx_pkts_retries;        /* # user frames retries */
-+	__le32 tx_pkts_fw_total;       /* # FW generated sent successfully */
-+	__le32 tx_pkts_fw_retries;     /* # retries for FW generated frames */
-+	__le32 tx_pkts_fw_retry_exhausted;     /* # FW generated where a retry
-+						* was exhausted
-+						*/
-+	__le32 rx_pkts_retried;        /* # rx with retry bit set */
-+	__le32 tx_rate_fallback;       /* lowest fallback TX rate */
- };
- 
- struct brcmf_chanspec_list {
diff --git a/package/kernel/mac80211/patches/359-0004-brcmfmac-have-sdio-return-EIO-when-device-communicat.patch b/package/kernel/mac80211/patches/359-0004-brcmfmac-have-sdio-return-EIO-when-device-communicat.patch
deleted file mode 100644
index 302bc3ed1571d462533b814d28256c754a3df0b9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0004-brcmfmac-have-sdio-return-EIO-when-device-communicat.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:20 +0200
-Subject: [PATCH] brcmfmac: have sdio return -EIO when device communication
- is not possible
-
-The bus interface functions txctl and rxctl may be used while the device
-can not be accessed, eg. upon driver .remove() callback. This patch will
-immediately return -EIO when this is the case which speeds up the module
-unload.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
-@@ -988,6 +988,7 @@ static void brcmf_sdiod_freezer_detach(s
- 
- static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
- {
-+	sdiodev->state = BRCMF_SDIOD_DOWN;
- 	if (sdiodev->bus) {
- 		brcmf_sdio_remove(sdiodev->bus);
- 		sdiodev->bus = NULL;
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -2820,6 +2820,8 @@ static int brcmf_sdio_bus_txdata(struct
- 	struct brcmf_sdio *bus = sdiodev->bus;
- 
- 	brcmf_dbg(TRACE, "Enter: pkt: data %p len %d\n", pkt->data, pkt->len);
-+	if (sdiodev->state != BRCMF_SDIOD_DATA)
-+		return -EIO;
- 
- 	/* Add space for the header */
- 	skb_push(pkt, bus->tx_hdrlen);
-@@ -2948,6 +2950,8 @@ brcmf_sdio_bus_txctl(struct device *dev,
- 	int ret;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
-+	if (sdiodev->state != BRCMF_SDIOD_DATA)
-+		return -EIO;
- 
- 	/* Send from dpc */
- 	bus->ctrl_frame_buf = msg;
-@@ -3238,6 +3242,8 @@ brcmf_sdio_bus_rxctl(struct device *dev,
- 	struct brcmf_sdio *bus = sdiodev->bus;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
-+	if (sdiodev->state != BRCMF_SDIOD_DATA)
-+		return -EIO;
- 
- 	/* Wait until control frame is available */
- 	timeleft = brcmf_sdio_dcmd_resp_wait(bus, &bus->rxlen, &pending);
diff --git a/package/kernel/mac80211/patches/359-0005-ath9k-make-DMA-stop-related-messages-debug-only.patch b/package/kernel/mac80211/patches/359-0005-ath9k-make-DMA-stop-related-messages-debug-only.patch
deleted file mode 100644
index 34af6d2acf2819b6b43263f224bc14222f4e48b1..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0005-ath9k-make-DMA-stop-related-messages-debug-only.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Thu, 2 Jul 2015 13:35:05 +0200
-Subject: [PATCH] ath9k: make DMA stop related messages debug-only
-
-A long time ago, ath9k had issues during reset where the DMA engine
-would stay active and could potentially corrupt memory.
-To debug those issues, the driver would print warnings whenever they
-occur.
-
-Nowadays, these issues are gone and the primary cause of these messages
-is if the MAC is stuck during reset or busy processing a long
-transmission. This is fairly harmless, yet these messages continue to
-worry users.
-
-To reduce the number of bogus bug reports, turn these messages into
-debug messages and count their occurence in the "reset" debugfs file.
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/debug.c
-+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -765,6 +765,8 @@ static int read_file_reset(struct seq_fi
- 		[RESET_TYPE_BEACON_STUCK] = "Stuck Beacon",
- 		[RESET_TYPE_MCI] = "MCI Reset",
- 		[RESET_TYPE_CALIBRATION] = "Calibration error",
-+		[RESET_TX_DMA_ERROR] = "Tx DMA stop error",
-+		[RESET_RX_DMA_ERROR] = "Rx DMA stop error",
- 	};
- 	int i;
- 
---- a/drivers/net/wireless/ath/ath9k/debug.h
-+++ b/drivers/net/wireless/ath/ath9k/debug.h
-@@ -50,6 +50,8 @@ enum ath_reset_type {
- 	RESET_TYPE_BEACON_STUCK,
- 	RESET_TYPE_MCI,
- 	RESET_TYPE_CALIBRATION,
-+	RESET_TX_DMA_ERROR,
-+	RESET_RX_DMA_ERROR,
- 	__RESET_TYPE_MAX
- };
- 
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -496,10 +496,9 @@ bool ath_stoprecv(struct ath_softc *sc)
- 
- 	if (!(ah->ah_flags & AH_UNPLUGGED) &&
- 	    unlikely(!stopped)) {
--		ath_err(ath9k_hw_common(sc->sc_ah),
--			"Could not stop RX, we could be "
--			"confusing the DMA engine when we start RX up\n");
--		ATH_DBG_WARN_ON_ONCE(!stopped);
-+		ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
-+			"Failed to stop Rx DMA\n");
-+		RESET_STAT_INC(sc, RESET_RX_DMA_ERROR);
- 	}
- 	return stopped && !reset;
- }
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -1896,8 +1896,11 @@ bool ath_drain_all_txq(struct ath_softc
- 			npend |= BIT(i);
- 	}
- 
--	if (npend)
--		ath_err(common, "Failed to stop TX DMA, queues=0x%03x!\n", npend);
-+	if (npend) {
-+		RESET_STAT_INC(sc, RESET_TX_DMA_ERROR);
-+		ath_dbg(common, RESET,
-+			"Failed to stop TX DMA, queues=0x%03x!\n", npend);
-+	}
- 
- 	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
- 		if (!ATH_TXQ_SETUP(sc, i))
diff --git a/package/kernel/mac80211/patches/359-0006-brcmfmac-free-ifp-for-non-netdev-interface-in-p2p-mo.patch b/package/kernel/mac80211/patches/359-0006-brcmfmac-free-ifp-for-non-netdev-interface-in-p2p-mo.patch
deleted file mode 100644
index 06f2dce83f871d8613b5f2ab5c64fb5253f9ebf2..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0006-brcmfmac-free-ifp-for-non-netdev-interface-in-p2p-mo.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:21 +0200
-Subject: [PATCH] brcmfmac: free ifp for non-netdev interface in p2p module
-
-Making it more clear by freeing the ifp in same place where the
-vif object is freed.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -867,8 +867,6 @@ static void brcmf_del_if(struct brcmf_pu
- 		}
- 		/* unregister will take care of freeing it */
- 		unregister_netdev(ifp->ndev);
--	} else {
--		kfree(ifp);
- 	}
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2238,6 +2238,7 @@ static void brcmf_p2p_delete_p2pdev(stru
- {
- 	cfg80211_unregister_wdev(&vif->wdev);
- 	p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
-+	kfree(vif->ifp);
- 	brcmf_free_vif(vif);
- }
- 
-@@ -2361,6 +2362,8 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 		break;
- 
- 	case NL80211_IFTYPE_P2P_DEVICE:
-+		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
-+		brcmf_p2p_deinit_discovery(p2p);
- 		brcmf_p2p_delete_p2pdev(p2p, vif);
- 		return 0;
- 	default:
diff --git a/package/kernel/mac80211/patches/359-0007-brcmfmac-move-p2p-attach-detach-functions.patch b/package/kernel/mac80211/patches/359-0007-brcmfmac-move-p2p-attach-detach-functions.patch
deleted file mode 100644
index 0a6e093512499a9e0ef31a0f7277794db036fdd9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0007-brcmfmac-move-p2p-attach-detach-functions.patch
+++ /dev/null
@@ -1,225 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:22 +0200
-Subject: [PATCH] brcmfmac: move p2p attach/detach functions
-
-Moving two functions in p2p.c as is so next change will be
-easier to review.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -1908,105 +1908,6 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere
- 
- 
- /**
-- * brcmf_p2p_attach() - attach for P2P.
-- *
-- * @cfg: driver private data for cfg80211 interface.
-- */
--s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg)
--{
--	struct brcmf_if *pri_ifp;
--	struct brcmf_if *p2p_ifp;
--	struct brcmf_cfg80211_vif *p2p_vif;
--	struct brcmf_p2p_info *p2p;
--	struct brcmf_pub *drvr;
--	s32 bssidx;
--	s32 err = 0;
--
--	p2p = &cfg->p2p;
--	p2p->cfg = cfg;
--
--	drvr = cfg->pub;
--
--	pri_ifp = drvr->iflist[0];
--	p2p_ifp = drvr->iflist[1];
--
--	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
--
--	if (p2p_ifp) {
--		p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
--					  false);
--		if (IS_ERR(p2p_vif)) {
--			brcmf_err("could not create discovery vif\n");
--			err = -ENOMEM;
--			goto exit;
--		}
--
--		p2p_vif->ifp = p2p_ifp;
--		p2p_ifp->vif = p2p_vif;
--		p2p_vif->wdev.netdev = p2p_ifp->ndev;
--		p2p_ifp->ndev->ieee80211_ptr = &p2p_vif->wdev;
--		SET_NETDEV_DEV(p2p_ifp->ndev, wiphy_dev(cfg->wiphy));
--
--		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
--
--		brcmf_p2p_generate_bss_mac(p2p, NULL);
--		memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
--		brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
--
--		/* Initialize P2P Discovery in the firmware */
--		err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
--		if (err < 0) {
--			brcmf_err("set p2p_disc error\n");
--			brcmf_free_vif(p2p_vif);
--			goto exit;
--		}
--		/* obtain bsscfg index for P2P discovery */
--		err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
--		if (err < 0) {
--			brcmf_err("retrieving discover bsscfg index failed\n");
--			brcmf_free_vif(p2p_vif);
--			goto exit;
--		}
--		/* Verify that firmware uses same bssidx as driver !! */
--		if (p2p_ifp->bssidx != bssidx) {
--			brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
--				  bssidx, p2p_ifp->bssidx);
--			brcmf_free_vif(p2p_vif);
--			goto exit;
--		}
--
--		init_completion(&p2p->send_af_done);
--		INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
--		init_completion(&p2p->afx_hdl.act_frm_scan);
--		init_completion(&p2p->wait_next_af);
--	}
--exit:
--	return err;
--}
--
--
--/**
-- * brcmf_p2p_detach() - detach P2P.
-- *
-- * @p2p: P2P specific data.
-- */
--void brcmf_p2p_detach(struct brcmf_p2p_info *p2p)
--{
--	struct brcmf_cfg80211_vif *vif;
--
--	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
--	if (vif != NULL) {
--		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
--		brcmf_p2p_deinit_discovery(p2p);
--		/* remove discovery interface */
--		brcmf_free_vif(vif);
--		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
--	}
--	/* just set it all to zero */
--	memset(p2p, 0, sizeof(*p2p));
--}
--
--/**
-  * brcmf_p2p_get_current_chanspec() - Get current operation channel.
-  *
-  * @p2p: P2P specific data.
-@@ -2425,3 +2326,102 @@ void brcmf_p2p_stop_device(struct wiphy
- 	clear_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state);
- 	mutex_unlock(&cfg->usr_sync);
- }
-+
-+/**
-+ * brcmf_p2p_attach() - attach for P2P.
-+ *
-+ * @cfg: driver private data for cfg80211 interface.
-+ */
-+s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg)
-+{
-+	struct brcmf_if *pri_ifp;
-+	struct brcmf_if *p2p_ifp;
-+	struct brcmf_cfg80211_vif *p2p_vif;
-+	struct brcmf_p2p_info *p2p;
-+	struct brcmf_pub *drvr;
-+	s32 bssidx;
-+	s32 err = 0;
-+
-+	p2p = &cfg->p2p;
-+	p2p->cfg = cfg;
-+
-+	drvr = cfg->pub;
-+
-+	pri_ifp = drvr->iflist[0];
-+	p2p_ifp = drvr->iflist[1];
-+
-+	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
-+
-+	if (p2p_ifp) {
-+		p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
-+					  false);
-+		if (IS_ERR(p2p_vif)) {
-+			brcmf_err("could not create discovery vif\n");
-+			err = -ENOMEM;
-+			goto exit;
-+		}
-+
-+		p2p_vif->ifp = p2p_ifp;
-+		p2p_ifp->vif = p2p_vif;
-+		p2p_vif->wdev.netdev = p2p_ifp->ndev;
-+		p2p_ifp->ndev->ieee80211_ptr = &p2p_vif->wdev;
-+		SET_NETDEV_DEV(p2p_ifp->ndev, wiphy_dev(cfg->wiphy));
-+
-+		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
-+
-+		brcmf_p2p_generate_bss_mac(p2p, NULL);
-+		memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
-+		brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
-+
-+		/* Initialize P2P Discovery in the firmware */
-+		err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
-+		if (err < 0) {
-+			brcmf_err("set p2p_disc error\n");
-+			brcmf_free_vif(p2p_vif);
-+			goto exit;
-+		}
-+		/* obtain bsscfg index for P2P discovery */
-+		err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
-+		if (err < 0) {
-+			brcmf_err("retrieving discover bsscfg index failed\n");
-+			brcmf_free_vif(p2p_vif);
-+			goto exit;
-+		}
-+		/* Verify that firmware uses same bssidx as driver !! */
-+		if (p2p_ifp->bssidx != bssidx) {
-+			brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
-+				  bssidx, p2p_ifp->bssidx);
-+			brcmf_free_vif(p2p_vif);
-+			goto exit;
-+		}
-+
-+		init_completion(&p2p->send_af_done);
-+		INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
-+		init_completion(&p2p->afx_hdl.act_frm_scan);
-+		init_completion(&p2p->wait_next_af);
-+	}
-+exit:
-+	return err;
-+}
-+
-+/**
-+ * brcmf_p2p_detach() - detach P2P.
-+ *
-+ * @p2p: P2P specific data.
-+ */
-+void brcmf_p2p_detach(struct brcmf_p2p_info *p2p)
-+{
-+	struct brcmf_cfg80211_vif *vif;
-+
-+	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
-+	if (vif != NULL) {
-+		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
-+		brcmf_p2p_deinit_discovery(p2p);
-+		/* remove discovery interface */
-+		brcmf_free_vif(vif);
-+		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
-+	}
-+	/* just set it all to zero */
-+	memset(p2p, 0, sizeof(*p2p));
-+}
-+
diff --git a/package/kernel/mac80211/patches/359-0008-brcmfmac-assure-p2pdev-is-unregistered-upon-driver-u.patch b/package/kernel/mac80211/patches/359-0008-brcmfmac-assure-p2pdev-is-unregistered-upon-driver-u.patch
deleted file mode 100644
index 72e8eed61b77347897ee0900e7b2b9a8cddce7aa..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/359-0008-brcmfmac-assure-p2pdev-is-unregistered-upon-driver-u.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 11 Jun 2015 00:12:23 +0200
-Subject: [PATCH] brcmfmac: assure p2pdev is unregistered upon driver
- unload
-
-When unloading the driver with a p2pdev interface it resulted in
-a warning upon calling wiphy_unregister() and subsequently a crash
-in the driver. This patch assures the p2pdev is unregistered calling
-unregister_wdev() before doing the wiphy_unregister().
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6206,10 +6206,8 @@ void brcmf_cfg80211_detach(struct brcmf_
- 	if (!cfg)
- 		return;
- 
--	WARN_ON(!list_empty(&cfg->vif_list));
--	wiphy_unregister(cfg->wiphy);
- 	brcmf_btcoex_detach(cfg);
--	brcmf_p2p_detach(&cfg->p2p);
-+	wiphy_unregister(cfg->wiphy);
- 	wl_deinit_priv(cfg);
- 	brcmf_free_wiphy(cfg->wiphy);
- }
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -1098,6 +1098,7 @@ void brcmf_detach(struct device *dev)
- 
- 	/* stop firmware event handling */
- 	brcmf_fweh_detach(drvr);
-+	brcmf_p2p_detach(&drvr->config->p2p);
- 
- 	brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -16,6 +16,7 @@
- #include <linux/slab.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
-+#include <linux/rtnetlink.h>
- #include <net/cfg80211.h>
- 
- #include <brcmu_wifi.h>
-@@ -2418,8 +2419,9 @@ void brcmf_p2p_detach(struct brcmf_p2p_i
- 		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
- 		brcmf_p2p_deinit_discovery(p2p);
- 		/* remove discovery interface */
--		brcmf_free_vif(vif);
--		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
-+		rtnl_lock();
-+		brcmf_p2p_delete_p2pdev(p2p, vif);
-+		rtnl_unlock();
- 	}
- 	/* just set it all to zero */
- 	memset(p2p, 0, sizeof(*p2p));
diff --git a/package/kernel/mac80211/patches/360-0001-brcmfmac-fix-double-free-of-p2pdev-interface.patch b/package/kernel/mac80211/patches/360-0001-brcmfmac-fix-double-free-of-p2pdev-interface.patch
deleted file mode 100644
index 179c77e9dfca1cc238cceddb070bbd9c4f34b93d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/360-0001-brcmfmac-fix-double-free-of-p2pdev-interface.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Mon, 15 Jun 2015 22:48:38 +0200
-Subject: [PATCH] brcmfmac: fix double free of p2pdev interface
-
-When freeing the driver ifp pointer it should also be removed from
-the driver interface list, which is what brcmf_remove_interface()
-does. Otherwise, the ifp pointer will be freed twice triggering
-a kernel oops.
-
-Fixes: f37d69a4babc ("brcmfmac: free ifp for non-netdev interface in p2p module")
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2140,7 +2140,7 @@ static void brcmf_p2p_delete_p2pdev(stru
- {
- 	cfg80211_unregister_wdev(&vif->wdev);
- 	p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
--	kfree(vif->ifp);
-+	brcmf_remove_interface(vif->ifp->drvr, vif->ifp->bssidx);
- 	brcmf_free_vif(vif);
- }
- 
diff --git a/package/kernel/mac80211/patches/360-0002-brcmfmac-make-brcmf_p2p_detach-call-conditional.patch b/package/kernel/mac80211/patches/360-0002-brcmfmac-make-brcmf_p2p_detach-call-conditional.patch
deleted file mode 100644
index e4f88b5022c68d27155843cdc936859a3b9dbb53..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/360-0002-brcmfmac-make-brcmf_p2p_detach-call-conditional.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Mon, 15 Jun 2015 22:48:39 +0200
-Subject: [PATCH] brcmfmac: make brcmf_p2p_detach() call conditional
-
-During verification of error handling in brcmf_cfg80211_attach() a
-null pointer dereference occurred upon calling brcmf_p2p_detach()
-from brcmf_detach(). This should only be called when the
-brcmf_cfg80211_attach() has succeeded.
-
-Fixes: f7a40873d2fa ("brcmfmac: assure p2pdev is unregistered upon driver unload")
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -1098,7 +1098,8 @@ void brcmf_detach(struct device *dev)
- 
- 	/* stop firmware event handling */
- 	brcmf_fweh_detach(drvr);
--	brcmf_p2p_detach(&drvr->config->p2p);
-+	if (drvr->config)
-+		brcmf_p2p_detach(&drvr->config->p2p);
- 
- 	brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
- 
diff --git a/package/kernel/mac80211/patches/361-brcmfmac-set-wiphy-s-addresses-to-provide-valid-MACs.patch b/package/kernel/mac80211/patches/361-brcmfmac-set-wiphy-s-addresses-to-provide-valid-MACs.patch
deleted file mode 100644
index 0a81237a28bf198b19bedee3b93d2d441e22fceb..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/361-brcmfmac-set-wiphy-s-addresses-to-provide-valid-MACs.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Rafa? Mi?ecki <zajec5@gmail.com>
-Date: Thu, 9 Jul 2015 17:07:08 +0200
-Subject: [PATCH] brcmfmac: set wiphy's addresses to provide valid MACs
-
-Broadcom's firmware requires every BSS to use MAC address with unique
-last few bits. The amount of bits may depend on a particular firmware,
-it was verified to be 2 for BCM43602 one.
-If this condition won't be fulfilled firmware will reject such MAC:
-brcmfmac: _brcmf_set_mac_address: Setting cur_etheraddr failed, -52
-
-We don't want to simply set addr_mask as it would also disallow using
-locally administrated bit. Instead let's build a list of addresses
-manually enabling 0x2 bit for extra interfaces.
-
-Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -5784,6 +5784,7 @@ static void brcmf_wiphy_wowl_params(stru
- 
- static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
-+	struct brcmf_pub *drvr = ifp->drvr;
- 	struct ieee80211_supported_band *band;
- 	__le32 bandlist[3];
- 	u32 n_bands;
-@@ -5797,6 +5798,19 @@ static int brcmf_setup_wiphy(struct wiph
- 	if (err)
- 		return err;
- 
-+	for (i = 0; i < wiphy->iface_combinations->max_interfaces &&
-+	     i < ARRAY_SIZE(drvr->addresses); i++) {
-+		u8 *addr = drvr->addresses[i].addr;
-+
-+		memcpy(addr, drvr->mac, ETH_ALEN);
-+		if (i) {
-+			addr[0] |= BIT(1);
-+			addr[ETH_ALEN - 1] ^= i;
-+		}
-+	}
-+	wiphy->addresses = drvr->addresses;
-+	wiphy->n_addresses = i;
-+
- 	wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
- 	wiphy->cipher_suites = __wl_cipher_suites;
- 	wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites);
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -21,6 +21,7 @@
- #ifndef BRCMFMAC_CORE_H
- #define BRCMFMAC_CORE_H
- 
-+#include <net/cfg80211.h>
- #include "fweh.h"
- 
- #define TOE_TX_CSUM_OL		0x00000001
-@@ -118,6 +119,8 @@ struct brcmf_pub {
- 	/* Multicast data packets sent to dongle */
- 	unsigned long tx_multicast;
- 
-+	struct mac_address addresses[BRCMF_MAX_IFS];
-+
- 	struct brcmf_if *iflist[BRCMF_MAX_IFS];
- 
- 	struct mutex proto_block;
diff --git a/package/kernel/mac80211/patches/362-brcmfmac-dhd_sdio.c-use-existing-atomic_or-primitive.patch b/package/kernel/mac80211/patches/362-brcmfmac-dhd_sdio.c-use-existing-atomic_or-primitive.patch
deleted file mode 100644
index e44f121ea3f0faf3ebaa76d0c768de308e272d4e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/362-brcmfmac-dhd_sdio.c-use-existing-atomic_or-primitive.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
-Date: Thu, 9 Jul 2015 13:43:18 +0530
-Subject: [PATCH] brcmfmac: dhd_sdio.c: use existing atomic_or primitive
-
-There's already a generic implementation so use that instead.
-
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -2564,15 +2564,6 @@ static inline void brcmf_sdio_clrintr(st
- 	}
- }
- 
--static void atomic_orr(int val, atomic_t *v)
--{
--	int old_val;
--
--	old_val = atomic_read(v);
--	while (atomic_cmpxchg(v, old_val, val | old_val) != old_val)
--		old_val = atomic_read(v);
--}
--
- static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
- {
- 	struct brcmf_core *buscore;
-@@ -2595,7 +2586,7 @@ static int brcmf_sdio_intr_rstatus(struc
- 	if (val) {
- 		brcmf_sdiod_regwl(bus->sdiodev, addr, val, &ret);
- 		bus->sdcnt.f1regdata++;
--		atomic_orr(val, &bus->intstatus);
-+		atomic_or(val, &bus->intstatus);
- 	}
- 
- 	return ret;
-@@ -2712,7 +2703,7 @@ static void brcmf_sdio_dpc(struct brcmf_
- 
- 	/* Keep still-pending events for next scheduling */
- 	if (intstatus)
--		atomic_orr(intstatus, &bus->intstatus);
-+		atomic_or(intstatus, &bus->intstatus);
- 
- 	brcmf_sdio_clrintr(bus);
- 
diff --git a/package/kernel/mac80211/patches/363-0001-brcmfmac-check-all-combinations-when-setting-wiphy-s.patch b/package/kernel/mac80211/patches/363-0001-brcmfmac-check-all-combinations-when-setting-wiphy-s.patch
deleted file mode 100644
index 76ca143df570bee70f024b5c6aed3664ce27c3e3..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/363-0001-brcmfmac-check-all-combinations-when-setting-wiphy-s.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Thu, 20 Aug 2015 00:16:42 +0200
-Subject: [PATCH] brcmfmac: check all combinations when setting wiphy's
- addresses
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Broadcom is working on better reflection of interface combinations. With
-upcoming patches we may have 1st combination supporting less interfaces
-than others.
-To don't run out of addresses check all combinations to find the one
-with the greatest max_interfaces value.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -5785,7 +5785,9 @@ static void brcmf_wiphy_wowl_params(stru
- static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = ifp->drvr;
-+	const struct ieee80211_iface_combination *combo;
- 	struct ieee80211_supported_band *band;
-+	u16 max_interfaces = 0;
- 	__le32 bandlist[3];
- 	u32 n_bands;
- 	int err, i;
-@@ -5798,8 +5800,13 @@ static int brcmf_setup_wiphy(struct wiph
- 	if (err)
- 		return err;
- 
--	for (i = 0; i < wiphy->iface_combinations->max_interfaces &&
--	     i < ARRAY_SIZE(drvr->addresses); i++) {
-+	for (i = 0, combo = wiphy->iface_combinations;
-+	     i < wiphy->n_iface_combinations; i++, combo++) {
-+		max_interfaces = max(max_interfaces, combo->max_interfaces);
-+	}
-+
-+	for (i = 0; i < max_interfaces && i < ARRAY_SIZE(drvr->addresses);
-+	     i++) {
- 		u8 *addr = drvr->addresses[i].addr;
- 
- 		memcpy(addr, drvr->mac, ETH_ALEN);
diff --git a/package/kernel/mac80211/patches/363-0002-brcmfmac-correct-interface-combination-info.patch b/package/kernel/mac80211/patches/363-0002-brcmfmac-correct-interface-combination-info.patch
deleted file mode 100644
index c4a0720b35deef49befab2a121c90f4ac60becef..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/363-0002-brcmfmac-correct-interface-combination-info.patch
+++ /dev/null
@@ -1,204 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 20 Aug 2015 22:06:03 +0200
-Subject: [PATCH] brcmfmac: correct interface combination info
-
-The interface combination provided by brcmfmac did not truly reflect
-the combinations supported by driver and/or firmware.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Pontus Fuchs <pontusf@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -5694,63 +5694,132 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] =
- 	}
- };
- 
-+/**
-+ * brcmf_setup_ifmodes() - determine interface modes and combinations.
-+ *
-+ * @wiphy: wiphy object.
-+ * @ifp: interface object needed for feat module api.
-+ *
-+ * The interface modes and combinations are determined dynamically here
-+ * based on firmware functionality.
-+ *
-+ * no p2p and no mbss:
-+ *
-+ *	#STA <= 1, #AP <= 1, channels = 1, 2 total
-+ *
-+ * no p2p and mbss:
-+ *
-+ *	#STA <= 1, #AP <= 1, channels = 1, 2 total
-+ *	#AP <= 4, matching BI, channels = 1, 4 total
-+ *
-+ * p2p, no mchan, and mbss:
-+ *
-+ *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
-+ *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
-+ *	#AP <= 4, matching BI, channels = 1, 4 total
-+ *
-+ * p2p, mchan, and mbss:
-+ *
-+ *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-+ *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
-+ *	#AP <= 4, matching BI, channels = 1, 4 total
-+ */
- static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
- 	struct ieee80211_iface_combination *combo = NULL;
--	struct ieee80211_iface_limit *limits = NULL;
--	int i = 0, max_iface_cnt;
-+	struct ieee80211_iface_limit *c0_limits = NULL;
-+	struct ieee80211_iface_limit *p2p_limits = NULL;
-+	struct ieee80211_iface_limit *mbss_limits = NULL;
-+	bool mbss, p2p;
-+	int i, c, n_combos;
- 
--	combo = kzalloc(sizeof(*combo), GFP_KERNEL);
-+	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
-+	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
-+
-+	n_combos = 1 + !!p2p + !!mbss;
-+	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
- 	if (!combo)
- 		goto err;
- 
--	limits = kzalloc(sizeof(*limits) * 4, GFP_KERNEL);
--	if (!limits)
-+	c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
-+	if (!c0_limits)
- 		goto err;
- 
-+	if (p2p) {
-+		p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
-+		if (!p2p_limits)
-+			goto err;
-+	}
-+
-+	if (mbss) {
-+		mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
-+		if (!mbss_limits)
-+			goto err;
-+	}
-+
- 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
- 				 BIT(NL80211_IFTYPE_ADHOC) |
- 				 BIT(NL80211_IFTYPE_AP);
- 
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
--		combo->num_different_channels = 2;
--	else
--		combo->num_different_channels = 1;
--
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
--		limits[i].max = 1;
--		limits[i++].types = BIT(NL80211_IFTYPE_STATION);
--		limits[i].max = 4;
--		limits[i++].types = BIT(NL80211_IFTYPE_AP);
--		max_iface_cnt = 5;
--	} else {
--		limits[i].max = 2;
--		limits[i++].types = BIT(NL80211_IFTYPE_STATION) |
--				    BIT(NL80211_IFTYPE_AP);
--		max_iface_cnt = 2;
--	}
--
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P)) {
-+	c = 0;
-+	i = 0;
-+	combo[c].num_different_channels = 1;
-+	c0_limits[i].max = 1;
-+	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+	if (p2p) {
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
-+			combo[c].num_different_channels = 2;
- 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 					  BIT(NL80211_IFTYPE_P2P_GO) |
- 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
--		limits[i].max = 1;
--		limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
--				    BIT(NL80211_IFTYPE_P2P_GO);
--		limits[i].max = 1;
--		limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
--		max_iface_cnt += 2;
--	}
--	combo->max_interfaces = max_iface_cnt;
--	combo->limits = limits;
--	combo->n_limits = i;
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+				       BIT(NL80211_IFTYPE_P2P_GO);
-+	} else {
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+	}
-+	combo[c].max_interfaces = i;
-+	combo[c].n_limits = i;
-+	combo[c].limits = c0_limits;
-+
-+	if (p2p) {
-+		c++;
-+		i = 0;
-+		combo[c].num_different_channels = 1;
-+		p2p_limits[i].max = 1;
-+		p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		p2p_limits[i].max = 1;
-+		p2p_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		p2p_limits[i].max = 1;
-+		p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT);
-+		p2p_limits[i].max = 1;
-+		p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		combo[c].max_interfaces = i;
-+		combo[c].n_limits = i;
-+		combo[c].limits = p2p_limits;
-+	}
- 
-+	if (mbss) {
-+		c++;
-+		combo[c].beacon_int_infra_match = true;
-+		combo[c].num_different_channels = 1;
-+		mbss_limits[0].max = 4;
-+		mbss_limits[0].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = 4;
-+		combo[c].n_limits = 1;
-+		combo[c].limits = mbss_limits;
-+	}
-+	wiphy->n_iface_combinations = n_combos;
- 	wiphy->iface_combinations = combo;
--	wiphy->n_iface_combinations = 1;
- 	return 0;
- 
- err:
--	kfree(limits);
-+	kfree(c0_limits);
-+	kfree(p2p_limits);
-+	kfree(mbss_limits);
- 	kfree(combo);
- 	return -ENOMEM;
- }
-@@ -6079,11 +6148,15 @@ static void brcmf_cfg80211_reg_notifier(
- 
- static void brcmf_free_wiphy(struct wiphy *wiphy)
- {
-+	int i;
-+
- 	if (!wiphy)
- 		return;
- 
--	if (wiphy->iface_combinations)
--		kfree(wiphy->iface_combinations->limits);
-+	if (wiphy->iface_combinations) {
-+		for (i = 0; i < wiphy->n_iface_combinations; i++)
-+			kfree(wiphy->iface_combinations[i].limits);
-+	}
- 	kfree(wiphy->iface_combinations);
- 	if (wiphy->bands[IEEE80211_BAND_2GHZ]) {
- 		kfree(wiphy->bands[IEEE80211_BAND_2GHZ]->channels);
diff --git a/package/kernel/mac80211/patches/363-0003-brcmfmac-add-debugfs-entry-for-msgbuf-statistics.patch b/package/kernel/mac80211/patches/363-0003-brcmfmac-add-debugfs-entry-for-msgbuf-statistics.patch
deleted file mode 100644
index 9768ef27717255e4cc014d4a60f3d19016eb312c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/363-0003-brcmfmac-add-debugfs-entry-for-msgbuf-statistics.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Thu, 20 Aug 2015 22:06:04 +0200
-Subject: [PATCH] brcmfmac: add debugfs entry for msgbuf statistics
-
-Expose ring buffer read/write pointers and other useful statistics
-through debugfs.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -1360,6 +1360,60 @@ void brcmf_msgbuf_delete_flowring(struct
- 	}
- }
- 
-+#ifdef DEBUG
-+static int brcmf_msgbuf_stats_read(struct seq_file *seq, void *data)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(seq->private);
-+	struct brcmf_pub *drvr = bus_if->drvr;
-+	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
-+	struct brcmf_commonring *commonring;
-+	u16 i;
-+	struct brcmf_flowring_ring *ring;
-+	struct brcmf_flowring_hash *hash;
-+
-+	commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
-+	seq_printf(seq, "h2d_ctl_submit: rp %4u, wp %4u, depth %4u\n",
-+		   commonring->r_ptr, commonring->w_ptr, commonring->depth);
-+	commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_RXPOST_SUBMIT];
-+	seq_printf(seq, "h2d_rx_submit:  rp %4u, wp %4u, depth %4u\n",
-+		   commonring->r_ptr, commonring->w_ptr, commonring->depth);
-+	commonring = msgbuf->commonrings[BRCMF_D2H_MSGRING_CONTROL_COMPLETE];
-+	seq_printf(seq, "d2h_ctl_cmplt:  rp %4u, wp %4u, depth %4u\n",
-+		   commonring->r_ptr, commonring->w_ptr, commonring->depth);
-+	commonring = msgbuf->commonrings[BRCMF_D2H_MSGRING_TX_COMPLETE];
-+	seq_printf(seq, "d2h_tx_cmplt:   rp %4u, wp %4u, depth %4u\n",
-+		   commonring->r_ptr, commonring->w_ptr, commonring->depth);
-+	commonring = msgbuf->commonrings[BRCMF_D2H_MSGRING_RX_COMPLETE];
-+	seq_printf(seq, "d2h_rx_cmplt:   rp %4u, wp %4u, depth %4u\n",
-+		   commonring->r_ptr, commonring->w_ptr, commonring->depth);
-+
-+	seq_printf(seq, "\nh2d_flowrings: depth %u\n",
-+		   BRCMF_H2D_TXFLOWRING_MAX_ITEM);
-+	seq_puts(seq, "Active flowrings:\n");
-+	hash = msgbuf->flow->hash;
-+	for (i = 0; i < msgbuf->flow->nrofrings; i++) {
-+		if (!msgbuf->flow->rings[i])
-+			continue;
-+		ring = msgbuf->flow->rings[i];
-+		if (ring->status != RING_OPEN)
-+			continue;
-+		commonring = msgbuf->flowrings[i];
-+		hash = &msgbuf->flow->hash[ring->hash_id];
-+		seq_printf(seq, "id %3u: rp %4u, wp %4u, qlen %4u, blocked %u\n"
-+				"        ifidx %u, fifo %u, da %pM\n",
-+				i, commonring->r_ptr, commonring->w_ptr,
-+				skb_queue_len(&ring->skblist), ring->blocked,
-+				hash->ifidx, hash->fifo, hash->mac);
-+	}
-+
-+	return 0;
-+}
-+#else
-+static int brcmf_msgbuf_stats_read(struct seq_file *seq, void *data)
-+{
-+	return 0;
-+}
-+#endif
- 
- int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
- {
-@@ -1460,6 +1514,8 @@ int brcmf_proto_msgbuf_attach(struct brc
- 	spin_lock_init(&msgbuf->flowring_work_lock);
- 	INIT_LIST_HEAD(&msgbuf->work_queue);
- 
-+	brcmf_debugfs_add_entry(drvr, "msgbuf_stats", brcmf_msgbuf_stats_read);
-+
- 	return 0;
- 
- fail:
diff --git a/package/kernel/mac80211/patches/363-0004-brcmfmac-make-use-of-cfg80211_check_combinations.patch b/package/kernel/mac80211/patches/363-0004-brcmfmac-make-use-of-cfg80211_check_combinations.patch
deleted file mode 100644
index 2b84cf9fcdd3ed91d931d5a2df5657cf8d6b683c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/363-0004-brcmfmac-make-use-of-cfg80211_check_combinations.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 20 Aug 2015 22:06:05 +0200
-Subject: [PATCH] brcmfmac: make use of cfg80211_check_combinations()
-
-Use cfg80211_check_combinations() so we can bail out early when an
-interface add or change results in an invalid combination.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -469,6 +469,36 @@ brcmf_find_wpsie(const u8 *parse, u32 le
- 	return NULL;
- }
- 
-+static int brcmf_vif_change_validate(struct brcmf_cfg80211_info *cfg,
-+				     struct brcmf_cfg80211_vif *vif,
-+				     enum nl80211_iftype new_type)
-+{
-+	int iftype_num[NUM_NL80211_IFTYPES];
-+	struct brcmf_cfg80211_vif *pos;
-+
-+	memset(&iftype_num[0], 0, sizeof(iftype_num));
-+	list_for_each_entry(pos, &cfg->vif_list, list)
-+		if (pos == vif)
-+			iftype_num[new_type]++;
-+		else
-+			iftype_num[pos->wdev.iftype]++;
-+
-+	return cfg80211_check_combinations(cfg->wiphy, 1, 0, iftype_num);
-+}
-+
-+static int brcmf_vif_add_validate(struct brcmf_cfg80211_info *cfg,
-+				  enum nl80211_iftype new_type)
-+{
-+	int iftype_num[NUM_NL80211_IFTYPES];
-+	struct brcmf_cfg80211_vif *pos;
-+
-+	memset(&iftype_num[0], 0, sizeof(iftype_num));
-+	list_for_each_entry(pos, &cfg->vif_list, list)
-+		iftype_num[pos->wdev.iftype]++;
-+
-+	iftype_num[new_type]++;
-+	return cfg80211_check_combinations(cfg->wiphy, 1, 0, iftype_num);
-+}
- 
- static void convert_key_from_CPU(struct brcmf_wsec_key *key,
- 				 struct brcmf_wsec_key_le *key_le)
-@@ -662,8 +692,14 @@ static struct wireless_dev *brcmf_cfg802
- 						     struct vif_params *params)
- {
- 	struct wireless_dev *wdev;
-+	int err;
- 
- 	brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
-+	err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type);
-+	if (err) {
-+		brcmf_err("iface validation failed: err=%d\n", err);
-+		return ERR_PTR(err);
-+	}
- 	switch (type) {
- 	case NL80211_IFTYPE_ADHOC:
- 	case NL80211_IFTYPE_STATION:
-@@ -822,8 +858,12 @@ brcmf_cfg80211_change_iface(struct wiphy
- 	s32 ap = 0;
- 	s32 err = 0;
- 
--	brcmf_dbg(TRACE, "Enter, ndev=%p, type=%d\n", ndev, type);
--
-+	brcmf_dbg(TRACE, "Enter, idx=%d, type=%d\n", ifp->bssidx, type);
-+	err = brcmf_vif_change_validate(wiphy_to_cfg(wiphy), vif, type);
-+	if (err) {
-+		brcmf_err("iface validation failed: err=%d\n", err);
-+		return err;
-+	}
- 	switch (type) {
- 	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_WDS:
diff --git a/package/kernel/mac80211/patches/363-0005-brcmfmac-block-the-correct-flowring-when-backup-queu.patch b/package/kernel/mac80211/patches/363-0005-brcmfmac-block-the-correct-flowring-when-backup-queu.patch
deleted file mode 100644
index 2d5f7b9be741075527b58e6271b318eaf73409a8..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/363-0005-brcmfmac-block-the-correct-flowring-when-backup-queu.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Thu, 20 Aug 2015 22:06:06 +0200
-Subject: [PATCH] brcmfmac: block the correct flowring when backup queue
- overflow
-
-brcmf_flowring_block blocks the last active flowring under the same
-interface instead of the one provided by caller. This could lead to a
-dead lock of netif stop if there are more than one flowring under the
-interface and the traffic is high enough so brcmf_flowring_enqueue can
-not unblock the ring right away.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
-@@ -194,11 +194,15 @@ static void brcmf_flowring_block(struct
- 	spin_lock_irqsave(&flow->block_lock, flags);
- 
- 	ring = flow->rings[flowid];
-+	if (ring->blocked == blocked) {
-+		spin_unlock_irqrestore(&flow->block_lock, flags);
-+		return;
-+	}
- 	ifidx = brcmf_flowring_ifidx_get(flow, flowid);
- 
- 	currently_blocked = false;
- 	for (i = 0; i < flow->nrofrings; i++) {
--		if (flow->rings[i]) {
-+		if ((flow->rings[i]) && (i != flowid)) {
- 			ring = flow->rings[i];
- 			if ((ring->status == RING_OPEN) &&
- 			    (brcmf_flowring_ifidx_get(flow, i) == ifidx)) {
-@@ -209,8 +213,8 @@ static void brcmf_flowring_block(struct
- 			}
- 		}
- 	}
--	ring->blocked = blocked;
--	if (currently_blocked == blocked) {
-+	flow->rings[flowid]->blocked = blocked;
-+	if (currently_blocked) {
- 		spin_unlock_irqrestore(&flow->block_lock, flags);
- 		return;
- 	}
diff --git a/package/kernel/mac80211/patches/363-0006-brcmfmac-bump-highest-event-number-for-4339-firmware.patch b/package/kernel/mac80211/patches/363-0006-brcmfmac-bump-highest-event-number-for-4339-firmware.patch
deleted file mode 100644
index 7378401c52034bc23f39228924d10617bd83131c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/363-0006-brcmfmac-bump-highest-event-number-for-4339-firmware.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 20 Aug 2015 22:06:07 +0200
-Subject: [PATCH] brcmfmac: bump highest event number for 4339 firmware
-
-The event mask length is determined by the highest event number
-that is specified in the driver. When this length is shorter than
-firmware expects setting event mask will fail and device becomes
-pretty useless. This issue was reported with bcm4339 firmware that
-was recently released.
-
-Reported-by: Pontus Fuchs <pontusf@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Pontus Fuchs <pontusf@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
-@@ -85,7 +85,6 @@ struct brcmf_event;
- 	BRCMF_ENUM_DEF(IF, 54) \
- 	BRCMF_ENUM_DEF(P2P_DISC_LISTEN_COMPLETE, 55) \
- 	BRCMF_ENUM_DEF(RSSI, 56) \
--	BRCMF_ENUM_DEF(PFN_SCAN_COMPLETE, 57) \
- 	BRCMF_ENUM_DEF(EXTLOG_MSG, 58) \
- 	BRCMF_ENUM_DEF(ACTION_FRAME, 59) \
- 	BRCMF_ENUM_DEF(ACTION_FRAME_COMPLETE, 60) \
-@@ -103,8 +102,7 @@ struct brcmf_event;
- 	BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \
- 	BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \
- 	BRCMF_ENUM_DEF(TDLS_PEER_EVENT, 92) \
--	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \
--	BRCMF_ENUM_DEF(PSTA_PRIMARY_INTF_IND, 128)
-+	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127)
- 
- #define BRCMF_ENUM_DEF(id, val) \
- 	BRCMF_E_##id = (val),
-@@ -112,7 +110,11 @@ struct brcmf_event;
- /* firmware event codes sent by the dongle */
- enum brcmf_fweh_event_code {
- 	BRCMF_FWEH_EVENT_ENUM_DEFLIST
--	BRCMF_E_LAST
-+	/* this determines event mask length which must match
-+	 * minimum length check in device firmware so it is
-+	 * hard-coded here.
-+	 */
-+	BRCMF_E_LAST = 139
- };
- #undef BRCMF_ENUM_DEF
- 
diff --git a/package/kernel/mac80211/patches/365-0001-brcmfmac-consolidate-ifp-lookup-in-driver-core.patch b/package/kernel/mac80211/patches/365-0001-brcmfmac-consolidate-ifp-lookup-in-driver-core.patch
deleted file mode 100644
index 97444b3c0dcf3db20d667be3c64cc0bb49815cfa..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0001-brcmfmac-consolidate-ifp-lookup-in-driver-core.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:53 +0200
-Subject: [PATCH] brcmfmac: consolidate ifp lookup in driver core
-
-In rx path the firmware provide an interface index which is used to
-map to a struct brcmf_if instance. However, this involves some trick
-that is done in two places. This is changed by having driver core
-providing brcmf_get_ifp() function.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-@@ -276,6 +276,7 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 			 struct sk_buff *pktbuf)
- {
- 	struct brcmf_proto_bcdc_header *h;
-+	struct brcmf_if *ifp;
- 
- 	brcmf_dbg(BCDC, "Enter\n");
- 
-@@ -289,30 +290,21 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 	trace_brcmf_bcdchdr(pktbuf->data);
- 	h = (struct brcmf_proto_bcdc_header *)(pktbuf->data);
- 
--	*ifidx = BCDC_GET_IF_IDX(h);
--	if (*ifidx >= BRCMF_MAX_IFS) {
--		brcmf_err("rx data ifnum out of range (%d)\n", *ifidx);
-+	ifp = brcmf_get_ifp(drvr, BCDC_GET_IF_IDX(h));
-+	if (IS_ERR_OR_NULL(ifp)) {
-+		brcmf_dbg(INFO, "no matching ifp found\n");
- 		return -EBADE;
- 	}
--	/* The ifidx is the idx to map to matching netdev/ifp. When receiving
--	 * events this is easy because it contains the bssidx which maps
--	 * 1-on-1 to the netdev/ifp. But for data frames the ifidx is rcvd.
--	 * bssidx 1 is used for p2p0 and no data can be received or
--	 * transmitted on it. Therefor bssidx is ifidx + 1 if ifidx > 0
--	 */
--	if (*ifidx)
--		(*ifidx)++;
--
- 	if (((h->flags & BCDC_FLAG_VER_MASK) >> BCDC_FLAG_VER_SHIFT) !=
- 	    BCDC_PROTO_VER) {
- 		brcmf_err("%s: non-BCDC packet received, flags 0x%x\n",
--			  brcmf_ifname(drvr, *ifidx), h->flags);
-+			  brcmf_ifname(drvr, ifp->ifidx), h->flags);
- 		return -EBADE;
- 	}
- 
- 	if (h->flags & BCDC_FLAG_SUM_GOOD) {
- 		brcmf_dbg(BCDC, "%s: BDC rcv, good checksum, flags 0x%x\n",
--			  brcmf_ifname(drvr, *ifidx), h->flags);
-+			  brcmf_ifname(drvr, ifp->ifidx), h->flags);
- 		pktbuf->ip_summed = CHECKSUM_UNNECESSARY;
- 	}
- 
-@@ -320,12 +312,15 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 
- 	skb_pull(pktbuf, BCDC_HEADER_LEN);
- 	if (do_fws)
--		brcmf_fws_hdrpull(drvr, *ifidx, h->data_offset << 2, pktbuf);
-+		brcmf_fws_hdrpull(drvr, ifp->ifidx, h->data_offset << 2,
-+				  pktbuf);
- 	else
- 		skb_pull(pktbuf, h->data_offset << 2);
- 
- 	if (pktbuf->len == 0)
- 		return -ENODATA;
-+
-+	*ifidx = ifp->ifidx;
- 	return 0;
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -83,6 +83,25 @@ char *brcmf_ifname(struct brcmf_pub *drv
- 	return "<if_none>";
- }
- 
-+struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx)
-+{
-+	if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
-+		brcmf_err("ifidx %d out of range\n", ifidx);
-+		return ERR_PTR(-ERANGE);
-+	}
-+
-+	/* The ifidx is the idx to map to matching netdev/ifp. When receiving
-+	 * events this is easy because it contains the bssidx which maps
-+	 * 1-on-1 to the netdev/ifp. But for data frames the ifidx is rcvd.
-+	 * bssidx 1 is used for p2p0 and no data can be received or
-+	 * transmitted on it. Therefor bssidx is ifidx + 1 if ifidx > 0
-+	 */
-+	if (ifidx)
-+		ifidx++;
-+
-+	return drvr->iflist[ifidx];
-+}
-+
- static void _brcmf_set_multicast_list(struct work_struct *work)
- {
- 	struct brcmf_if *ifp;
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -202,7 +202,7 @@ int brcmf_netdev_wait_pend8021x(struct b
- 
- /* Return pointer to interface name */
- char *brcmf_ifname(struct brcmf_pub *drvr, int idx);
--
-+struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
- 			      char *name, u8 *mac_addr);
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -1081,16 +1081,8 @@ brcmf_msgbuf_rx_skb(struct brcmf_msgbuf
- {
- 	struct brcmf_if *ifp;
- 
--	/* The ifidx is the idx to map to matching netdev/ifp. When receiving
--	 * events this is easy because it contains the bssidx which maps
--	 * 1-on-1 to the netdev/ifp. But for data frames the ifidx is rcvd.
--	 * bssidx 1 is used for p2p0 and no data can be received or
--	 * transmitted on it. Therefor bssidx is ifidx + 1 if ifidx > 0
--	 */
--	if (ifidx)
--		(ifidx)++;
--	ifp = msgbuf->drvr->iflist[ifidx];
--	if (!ifp || !ifp->ndev) {
-+	ifp = brcmf_get_ifp(msgbuf->drvr, ifidx);
-+	if (IS_ERR_OR_NULL(ifp) || !ifp->ndev) {
- 		brcmf_err("Received pkt for invalid ifidx %d\n", ifidx);
- 		brcmu_pkt_buf_free_skb(skb);
- 		return;
diff --git a/package/kernel/mac80211/patches/365-0002-brcmfmac-make-brcmf_proto_hdrpull-return-struct-brcm.patch b/package/kernel/mac80211/patches/365-0002-brcmfmac-make-brcmf_proto_hdrpull-return-struct-brcm.patch
deleted file mode 100644
index 632714ce24f901f8b2fade9d80e1382f454aae0d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0002-brcmfmac-make-brcmf_proto_hdrpull-return-struct-brcm.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:54 +0200
-Subject: [PATCH] brcmfmac: make brcmf_proto_hdrpull() return struct
- brcmf_if instance
-
-Avoid spreading the ifidx in the driver, but have it return the
-struct brcmf_if instance.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-@@ -272,11 +272,11 @@ brcmf_proto_bcdc_hdrpush(struct brcmf_pu
- }
- 
- static int
--brcmf_proto_bcdc_hdrpull(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx,
--			 struct sk_buff *pktbuf)
-+brcmf_proto_bcdc_hdrpull(struct brcmf_pub *drvr, bool do_fws,
-+			 struct sk_buff *pktbuf, struct brcmf_if **ifp)
- {
- 	struct brcmf_proto_bcdc_header *h;
--	struct brcmf_if *ifp;
-+	struct brcmf_if *tmp_if;
- 
- 	brcmf_dbg(BCDC, "Enter\n");
- 
-@@ -290,21 +290,21 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 	trace_brcmf_bcdchdr(pktbuf->data);
- 	h = (struct brcmf_proto_bcdc_header *)(pktbuf->data);
- 
--	ifp = brcmf_get_ifp(drvr, BCDC_GET_IF_IDX(h));
--	if (IS_ERR_OR_NULL(ifp)) {
-+	tmp_if = brcmf_get_ifp(drvr, BCDC_GET_IF_IDX(h));
-+	if (!tmp_if) {
- 		brcmf_dbg(INFO, "no matching ifp found\n");
- 		return -EBADE;
- 	}
- 	if (((h->flags & BCDC_FLAG_VER_MASK) >> BCDC_FLAG_VER_SHIFT) !=
- 	    BCDC_PROTO_VER) {
- 		brcmf_err("%s: non-BCDC packet received, flags 0x%x\n",
--			  brcmf_ifname(drvr, ifp->ifidx), h->flags);
-+			  brcmf_ifname(drvr, tmp_if->ifidx), h->flags);
- 		return -EBADE;
- 	}
- 
- 	if (h->flags & BCDC_FLAG_SUM_GOOD) {
- 		brcmf_dbg(BCDC, "%s: BDC rcv, good checksum, flags 0x%x\n",
--			  brcmf_ifname(drvr, ifp->ifidx), h->flags);
-+			  brcmf_ifname(drvr, tmp_if->ifidx), h->flags);
- 		pktbuf->ip_summed = CHECKSUM_UNNECESSARY;
- 	}
- 
-@@ -312,7 +312,7 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 
- 	skb_pull(pktbuf, BCDC_HEADER_LEN);
- 	if (do_fws)
--		brcmf_fws_hdrpull(drvr, ifp->ifidx, h->data_offset << 2,
-+		brcmf_fws_hdrpull(drvr, tmp_if->ifidx, h->data_offset << 2,
- 				  pktbuf);
- 	else
- 		skb_pull(pktbuf, h->data_offset << 2);
-@@ -320,7 +320,7 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 	if (pktbuf->len == 0)
- 		return -ENODATA;
- 
--	*ifidx = ifp->ifidx;
-+	*ifp = tmp_if;
- 	return 0;
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -87,7 +87,7 @@ struct brcmf_if *brcmf_get_ifp(struct br
- {
- 	if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
- 		brcmf_err("ifidx %d out of range\n", ifidx);
--		return ERR_PTR(-ERANGE);
-+		return NULL;
- 	}
- 
- 	/* The ifidx is the idx to map to matching netdev/ifp. When receiving
-@@ -539,17 +539,15 @@ void brcmf_rx_frame(struct device *dev,
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
- 	struct brcmf_pub *drvr = bus_if->drvr;
- 	struct brcmf_skb_reorder_data *rd;
--	u8 ifidx;
- 	int ret;
- 
- 	brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb);
- 
- 	/* process and remove protocol-specific header */
--	ret = brcmf_proto_hdrpull(drvr, true, &ifidx, skb);
--	ifp = drvr->iflist[ifidx];
-+	ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp);
- 
- 	if (ret || !ifp || !ifp->ndev) {
--		if ((ret != -ENODATA) && ifp)
-+		if (ret != -ENODATA && ifp)
- 			ifp->stats.rx_errors++;
- 		brcmu_pkt_buf_free_skb(skb);
- 		return;
-@@ -592,17 +590,17 @@ void brcmf_txcomplete(struct device *dev
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
- 	struct brcmf_pub *drvr = bus_if->drvr;
--	u8 ifidx;
-+	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, &ifidx, txp))
-+		if (brcmf_proto_hdrpull(drvr, false, txp, &ifp))
- 			brcmu_pkt_buf_free_skb(txp);
- 		else
--			brcmf_txfinalize(drvr, txp, ifidx, success);
-+			brcmf_txfinalize(drvr, txp, ifp->ifidx, success);
- 	}
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -1448,7 +1448,7 @@ brcmf_fws_txs_process(struct brcmf_fws_i
- 	struct sk_buff *skb;
- 	struct brcmf_skbuff_cb *skcb;
- 	struct brcmf_fws_mac_descriptor *entry = NULL;
--	u8 ifidx;
-+	struct brcmf_if *ifp;
- 
- 	brcmf_dbg(DATA, "flags %d\n", flags);
- 
-@@ -1497,15 +1497,16 @@ brcmf_fws_txs_process(struct brcmf_fws_i
- 	}
- 	brcmf_fws_macdesc_return_req_credit(skb);
- 
--	if (brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb)) {
-+	ret = brcmf_proto_hdrpull(fws->drvr, false, skb, &ifp);
-+	if (ret) {
- 		brcmu_pkt_buf_free_skb(skb);
- 		return -EINVAL;
- 	}
- 	if (!remove_from_hanger)
--		ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, ifidx,
-+		ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, ifp->ifidx,
- 						    genbit, seq);
- 	if (remove_from_hanger || ret)
--		brcmf_txfinalize(fws->drvr, skb, ifidx, true);
-+		brcmf_txfinalize(fws->drvr, skb, ifp->ifidx, true);
- 
- 	return 0;
- }
-@@ -1848,7 +1849,7 @@ static int brcmf_fws_commit_skb(struct b
- 		entry->transit_count--;
- 		if (entry->suppressed)
- 			entry->suppr_transit_count--;
--		brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb);
-+		(void)brcmf_proto_hdrpull(fws->drvr, false, skb, NULL);
- 		goto rollback;
- 	}
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -522,7 +522,7 @@ static int brcmf_msgbuf_set_dcmd(struct
- 
- 
- static int brcmf_msgbuf_hdrpull(struct brcmf_pub *drvr, bool do_fws,
--				u8 *ifidx, struct sk_buff *skb)
-+				struct sk_buff *skb, struct brcmf_if **ifp)
- {
- 	return -ENODEV;
- }
-@@ -1082,7 +1082,7 @@ brcmf_msgbuf_rx_skb(struct brcmf_msgbuf
- 	struct brcmf_if *ifp;
- 
- 	ifp = brcmf_get_ifp(msgbuf->drvr, ifidx);
--	if (IS_ERR_OR_NULL(ifp) || !ifp->ndev) {
-+	if (!ifp || !ifp->ndev) {
- 		brcmf_err("Received pkt for invalid ifidx %d\n", ifidx);
- 		brcmu_pkt_buf_free_skb(skb);
- 		return;
---- a/drivers/net/wireless/brcm80211/brcmfmac/proto.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.h
-@@ -24,8 +24,8 @@ enum proto_addr_mode {
- 
- 
- struct brcmf_proto {
--	int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx,
--		       struct sk_buff *skb);
-+	int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws,
-+		       struct sk_buff *skb, struct brcmf_if **ifp);
- 	int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd,
- 			  void *buf, uint len);
- 	int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
-@@ -46,9 +46,19 @@ int brcmf_proto_attach(struct brcmf_pub
- void brcmf_proto_detach(struct brcmf_pub *drvr);
- 
- static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws,
--				      u8 *ifidx, struct sk_buff *skb)
-+				      struct sk_buff *skb,
-+				      struct brcmf_if **ifp)
- {
--	return drvr->proto->hdrpull(drvr, do_fws, ifidx, skb);
-+	struct brcmf_if *tmp = NULL;
-+
-+	/* assure protocol is always called with
-+	 * non-null initialized pointer.
-+	 */
-+	if (ifp)
-+		*ifp = NULL;
-+	else
-+		ifp = &tmp;
-+	return drvr->proto->hdrpull(drvr, do_fws, skb, ifp);
- }
- static inline int brcmf_proto_query_dcmd(struct brcmf_pub *drvr, int ifidx,
- 					 uint cmd, void *buf, uint len)
diff --git a/package/kernel/mac80211/patches/365-0003-brcmfmac-change-parameters-for-brcmf_remove_interfac.patch b/package/kernel/mac80211/patches/365-0003-brcmfmac-change-parameters-for-brcmf_remove_interfac.patch
deleted file mode 100644
index 2d15a77154423b99daf6e476fb85375c7895e979..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0003-brcmfmac-change-parameters-for-brcmf_remove_interfac.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:55 +0200
-Subject: [PATCH] brcmfmac: change parameters for
- brcmf_remove_interface()
-
-Just pass the interface to be removed, ie. the struct brcmf_if instance.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -4982,7 +4982,7 @@ brcmf_notify_connect_status_ap(struct br
- 		brcmf_dbg(CONN, "AP mode link down\n");
- 		complete(&cfg->vif_disabled);
- 		if (ifp->vif->mbss)
--			brcmf_remove_interface(ifp->drvr, ifp->bssidx);
-+			brcmf_remove_interface(ifp);
- 		return 0;
- 	}
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -887,12 +887,13 @@ static void brcmf_del_if(struct brcmf_pu
- 	}
- }
- 
--void brcmf_remove_interface(struct brcmf_pub *drvr, u32 bssidx)
-+void brcmf_remove_interface(struct brcmf_if *ifp)
- {
--	if (drvr->iflist[bssidx]) {
--		brcmf_fws_del_interface(drvr->iflist[bssidx]);
--		brcmf_del_if(drvr, bssidx);
--	}
-+	if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bssidx] != ifp))
-+		return;
-+
-+	brcmf_fws_del_interface(ifp);
-+	brcmf_del_if(ifp->drvr, ifp->bssidx);
- }
- 
- int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr)
-@@ -1122,7 +1123,7 @@ void brcmf_detach(struct device *dev)
- 
- 	/* make sure primary interface removed last */
- 	for (i = BRCMF_MAX_IFS-1; i > -1; i--)
--		brcmf_remove_interface(drvr, i);
-+		brcmf_remove_interface(drvr->iflist[i]);
- 
- 	brcmf_cfg80211_detach(drvr->config);
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -206,7 +206,7 @@ struct brcmf_if *brcmf_get_ifp(struct br
- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
- 			      char *name, u8 *mac_addr);
--void brcmf_remove_interface(struct brcmf_pub *drvr, u32 bssidx);
-+void brcmf_remove_interface(struct brcmf_if *ifp);
- int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr);
- void brcmf_txflowblock_if(struct brcmf_if *ifp,
- 			  enum brcmf_netif_stop_reason reason, bool state);
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -222,7 +222,7 @@ static void brcmf_fweh_handle_if_event(s
- 	err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data);
- 
- 	if (ifp && ifevent->action == BRCMF_E_IF_DEL)
--		brcmf_remove_interface(drvr, ifevent->bssidx);
-+		brcmf_remove_interface(ifp);
- }
- 
- /**
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2140,7 +2140,7 @@ static void brcmf_p2p_delete_p2pdev(stru
- {
- 	cfg80211_unregister_wdev(&vif->wdev);
- 	p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
--	brcmf_remove_interface(vif->ifp->drvr, vif->ifp->bssidx);
-+	brcmf_remove_interface(vif->ifp);
- 	brcmf_free_vif(vif);
- }
- 
diff --git a/package/kernel/mac80211/patches/365-0004-brcmfmac-only-call-brcmf_cfg80211_detach-when-attach.patch b/package/kernel/mac80211/patches/365-0004-brcmfmac-only-call-brcmf_cfg80211_detach-when-attach.patch
deleted file mode 100644
index 2b61f4eda575194e38c1b2d04a5035eac627fe08..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0004-brcmfmac-only-call-brcmf_cfg80211_detach-when-attach.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:56 +0200
-Subject: [PATCH] brcmfmac: only call brcmf_cfg80211_detach() when attach
- was successful
-
-In brcmf_bus_start() the function brcmf_cfg80211_attach() is called which
-may fail. If this happens we should not call brcmf_cfg80211_detach() in
-the failure path as it will result in NULL pointer dereference:
-
-  brcmf_fweh_activate_events: Set event_msgs error (-5)
-  brcmf_bus_start: failed: -5
-  brcmf_sdio_firmware_callback: dongle is not responding
-  BUG: unable to handle kernel NULL pointer dereference at 0000000000000068
-  IP: [<ffffffff811e8f08>] kernfs_find_ns+0x18/0xd0
-  PGD 0
-  Oops: 0000 [#1] SMP
-  Modules linked in: brcmfmac(O) brcmutil(O) cfg80211 auth_rpcgss
-  CPU: 1 PID: 45 Comm: kworker/1:1 Tainted: G           O
-  Hardware name: Dell Inc. Latitude E6410/07XJP9, BIOS A07 02/15/2011
-  Workqueue: events request_firmware_work_func
-  task: ffff880036c09ac0 ti: ffff880036dd4000 task.ti: ffff880036dd4000
-  RIP: 0010:[<ffffffff811e8f08>]  [<ffffffff811e8f08>] kernfs_find_ns+0x18/0xd0
-  RSP: 0018:ffff880036dd7a28  EFLAGS: 00010246
-  RAX: ffff880036c09ac0 RBX: 0000000000000000 RCX: 000000007fffffff
-  RDX: 0000000000000000 RSI: ffffffff816578b9 RDI: 0000000000000000
-  RBP: ffff880036dd7a48 R08: 0000000000000000 R09: ffff880036c0b340
-  R10: 00000000000002ec R11: ffff880036dd7b08 R12: ffffffff816578b9
-  R13: 0000000000000000 R14: ffffffff816578b9 R15: ffff8800c6c87000
-  FS:  0000000000000000(0000) GS:ffff88012bc40000(0000) knlGS:0000000000000000
-  CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
-  CR2: 0000000000000068 CR3: 0000000001a0b000 CR4: 00000000000006e0
-  Stack:
-   0000000000000000 ffffffff816578b9 0000000000000000 ffff8800c0d003c8
-   ffff880036dd7a78 ffffffff811e8ff5 0000000ffffffff1 ffffffff81a9b060
-   ffff8800c789f880 ffff8800c0d00000 ffff880036dd7a98 ffffffff811ebe0d
-  Call Trace:
-   [<ffffffff811e8ff5>] kernfs_find_and_get_ns+0x35/0x60
-   [<ffffffff811ebe0d>] sysfs_unmerge_group+0x1d/0x60
-   [<ffffffff81404ef2>] dpm_sysfs_remove+0x22/0x60
-   [<ffffffff813f9db9>] device_del+0x49/0x240
-   [<ffffffff815da768>] rfkill_unregister+0x58/0xc0
-   [<ffffffffa06bd91b>] wiphy_unregister+0xab/0x2f0 [cfg80211]
-   [<ffffffffa0742fe3>] brcmf_cfg80211_detach+0x23/0x50 [brcmfmac]
-   [<ffffffffa074d986>] brcmf_detach+0x86/0xe0 [brcmfmac]
-   [<ffffffffa0757de8>] brcmf_sdio_remove+0x48/0x120 [brcmfmac]
-   [<ffffffffa0758ed9>] brcmf_sdiod_remove+0x29/0xd0 [brcmfmac]
-   [<ffffffffa0759031>] brcmf_ops_sdio_remove+0xb1/0x110 [brcmfmac]
-   [<ffffffffa001c267>] sdio_bus_remove+0x37/0x100 [mmc_core]
-   [<ffffffff813fe026>] __device_release_driver+0x96/0x130
-   [<ffffffff813fe0e3>] device_release_driver+0x23/0x30
-   [<ffffffffa0754bc8>] brcmf_sdio_firmware_callback+0x2a8/0x5d0 [brcmfmac]
-   [<ffffffffa074deaf>] brcmf_fw_request_nvram_done+0x15f/0x5e0 [brcmfmac]
-   [<ffffffff8140142f>] ? devres_add+0x3f/0x50
-   [<ffffffff810642b5>] ? usermodehelper_read_unlock+0x15/0x20
-   [<ffffffff81400000>] ? platform_match+0x70/0xa0
-   [<ffffffff8140f400>] request_firmware_work_func+0x30/0x60
-   [<ffffffff8106828c>] process_one_work+0x14c/0x3d0
-   [<ffffffff8106862a>] worker_thread+0x11a/0x450
-   [<ffffffff81068510>] ? process_one_work+0x3d0/0x3d0
-   [<ffffffff8106d692>] kthread+0xd2/0xf0
-   [<ffffffff8106d5c0>] ? kthread_create_on_node+0x180/0x180
-   [<ffffffff815ed35f>] ret_from_fork+0x3f/0x70
-   [<ffffffff8106d5c0>] ? kthread_create_on_node+0x180/0x180
-  Code: e9 40 fe ff ff 48 89 d8 eb 87 66 0f 1f 84 00 00 00 00 00 66 66 66 66
-	90 55 48 89 e5 41 56 49 89 f6 41 55 49 89 d5 31 d2 41 54 53 <0f> b7
-	47 68 48 8b 5f 48 66 c1 e8 05 83 e0 01 4d 85 ed 0f b6 c8
-  RIP  [<ffffffff811e8f08>] kernfs_find_ns+0x18/0xd0
-   RSP <ffff880036dd7a28>
-  CR2: 0000000000000068
-  ---[ end trace 87d6ec0d3fe46740 ]---
-
-Reported-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -1049,7 +1049,10 @@ int brcmf_bus_start(struct device *dev)
- fail:
- 	if (ret < 0) {
- 		brcmf_err("failed: %d\n", ret);
--		brcmf_cfg80211_detach(drvr->config);
-+		if (drvr->config) {
-+			brcmf_cfg80211_detach(drvr->config);
-+			drvr->config = NULL;
-+		}
- 		if (drvr->fws) {
- 			brcmf_fws_del_interface(ifp);
- 			brcmf_fws_deinit(drvr);
diff --git a/package/kernel/mac80211/patches/365-0005-brcmfmac-correct-detection-of-p2pdev-interface-event.patch b/package/kernel/mac80211/patches/365-0005-brcmfmac-correct-detection-of-p2pdev-interface-event.patch
deleted file mode 100644
index 868b0a82e6bb9ddf74ce2e28e1feaac4429b3c0d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0005-brcmfmac-correct-detection-of-p2pdev-interface-event.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:57 +0200
-Subject: [PATCH] brcmfmac: correct detection of p2pdev interface event
-
-The p2pdev interface is setup in firmware resulting in a interface
-event. This event has role and no-if flag. When role is p2p client
-and no-if flag is set it indicates that this is the p2pdev interface.
-This info is used in handling the event and adding interface in the
-driver.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -795,7 +795,7 @@ fail:
- }
- 
- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
--			      char *name, u8 *mac_addr)
-+			      bool is_p2pdev, char *name, u8 *mac_addr)
- {
- 	struct brcmf_if *ifp;
- 	struct net_device *ndev;
-@@ -821,7 +821,7 @@ struct brcmf_if *brcmf_add_if(struct brc
- 		}
- 	}
- 
--	if (!brcmf_p2p_enable && bssidx == 1) {
-+	if (!brcmf_p2p_enable && is_p2pdev) {
- 		/* this is P2P_DEVICE interface */
- 		brcmf_dbg(INFO, "allocate non-netdev interface\n");
- 		ifp = kzalloc(sizeof(*ifp), GFP_KERNEL);
-@@ -999,12 +999,12 @@ int brcmf_bus_start(struct device *dev)
- 	brcmf_dbg(TRACE, "\n");
- 
- 	/* add primary networking interface */
--	ifp = brcmf_add_if(drvr, 0, 0, "wlan%d", NULL);
-+	ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d", NULL);
- 	if (IS_ERR(ifp))
- 		return PTR_ERR(ifp);
- 
- 	if (brcmf_p2p_enable)
--		p2p_ifp = brcmf_add_if(drvr, 1, 0, "p2p%d", NULL);
-+		p2p_ifp = brcmf_add_if(drvr, 1, 0, false, "p2p%d", NULL);
- 	else
- 		p2p_ifp = NULL;
- 	if (IS_ERR(p2p_ifp))
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -205,7 +205,7 @@ char *brcmf_ifname(struct brcmf_pub *drv
- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
--			      char *name, u8 *mac_addr);
-+			      bool is_p2pdev, char *name, u8 *mac_addr);
- void brcmf_remove_interface(struct brcmf_if *ifp);
- int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr);
- void brcmf_txflowblock_if(struct brcmf_if *ifp,
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -179,6 +179,7 @@ static void brcmf_fweh_handle_if_event(s
- {
- 	struct brcmf_if_event *ifevent = data;
- 	struct brcmf_if *ifp;
-+	bool is_p2pdev;
- 	int err = 0;
- 
- 	brcmf_dbg(EVENT, "action: %u idx: %u bsscfg: %u flags: %u role: %u\n",
-@@ -186,18 +187,16 @@ static void brcmf_fweh_handle_if_event(s
- 		  ifevent->flags, ifevent->role);
- 
- 	/* The P2P Device interface event must not be ignored
--	 * contrary to what firmware tells us. The only way to
--	 * distinguish the P2P Device is by looking at the ifidx
--	 * and bssidx received.
-+	 * contrary to what firmware tells us.
- 	 */
--	if (!(ifevent->ifidx == 0 && ifevent->bssidx == 1) &&
--	    (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
-+	is_p2pdev = (ifevent->flags & BRCMF_E_IF_FLAG_NOIF) &&
-+		    ifevent->role == BRCMF_E_IF_ROLE_P2P_CLIENT;
-+	if (!is_p2pdev && (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
- 		brcmf_dbg(EVENT, "event can be ignored\n");
- 		return;
- 	}
- 	if (ifevent->ifidx >= BRCMF_MAX_IFS) {
--		brcmf_err("invalid interface index: %u\n",
--			  ifevent->ifidx);
-+		brcmf_err("invalid interface index: %u\n", ifevent->ifidx);
- 		return;
- 	}
- 
-@@ -207,7 +206,7 @@ static void brcmf_fweh_handle_if_event(s
- 		brcmf_dbg(EVENT, "adding %s (%pM)\n", emsg->ifname,
- 			  emsg->addr);
- 		ifp = brcmf_add_if(drvr, ifevent->bssidx, ifevent->ifidx,
--				   emsg->ifname, emsg->addr);
-+				   is_p2pdev, emsg->ifname, emsg->addr);
- 		if (IS_ERR(ifp))
- 			return;
- 		brcmf_fws_add_interface(ifp);
diff --git a/package/kernel/mac80211/patches/365-0006-brcmfmac-use-brcmf_get_ifp-to-map-ifidx-to-struct-br.patch b/package/kernel/mac80211/patches/365-0006-brcmfmac-use-brcmf_get_ifp-to-map-ifidx-to-struct-br.patch
deleted file mode 100644
index aebbfa6c49f5f73832960d9acc2e9f098dc3157b..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0006-brcmfmac-use-brcmf_get_ifp-to-map-ifidx-to-struct-br.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:58 +0200
-Subject: [PATCH] brcmfmac: use brcmf_get_ifp() to map ifidx to struct
- brcmf_if instance
-
-The knowledge on how to map the interface index to a struct brcmf_if
-instance is in brcmf_get_ifp() so use that function when only the
-interface index is known instead of accessing brcmf_pub::iflist
-directly.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/btcoex.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/btcoex.c
-@@ -149,7 +149,7 @@ static s32 brcmf_btcoex_params_read(stru
- static void brcmf_btcoex_boost_wifi(struct brcmf_btcoex_info *btci,
- 				    bool trump_sco)
- {
--	struct brcmf_if *ifp = btci->cfg->pub->iflist[0];
-+	struct brcmf_if *ifp = brcmf_get_ifp(btci->cfg->pub, 0);
- 
- 	if (trump_sco && !btci->saved_regs_part2) {
- 		/* this should reduce eSCO agressive
-@@ -468,7 +468,7 @@ int brcmf_btcoex_set_mode(struct brcmf_c
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_priv(vif->wdev.wiphy);
- 	struct brcmf_btcoex_info *btci = cfg->btcoex;
--	struct brcmf_if *ifp = cfg->pub->iflist[0];
-+	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
- 
- 	switch (mode) {
- 	case BRCMF_BTCOEX_DISABLED:
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6212,7 +6212,7 @@ static void brcmf_free_wiphy(struct wiph
- struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
- 						  struct device *busdev)
- {
--	struct net_device *ndev = drvr->iflist[0]->ndev;
-+	struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev;
- 	struct brcmf_cfg80211_info *cfg;
- 	struct wiphy *wiphy;
- 	struct brcmf_cfg80211_vif *vif;
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-@@ -121,7 +121,7 @@ static void brcmf_feat_iovar_int_set(str
- 
- void brcmf_feat_attach(struct brcmf_pub *drvr)
- {
--	struct brcmf_if *ifp = drvr->iflist[0];
-+	struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
- 
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MCHAN, "mchan");
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn");
---- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
-@@ -221,7 +221,7 @@ static void brcmf_flowring_block(struct
- 
- 	bus_if = dev_get_drvdata(flow->dev);
- 	drvr = bus_if->drvr;
--	ifp = drvr->iflist[ifidx];
-+	ifp = brcmf_get_ifp(drvr, ifidx);
- 	brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, blocked);
- 
- 	spin_unlock_irqrestore(&flow->block_lock, flags);
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -334,7 +334,7 @@ void brcmf_fweh_attach(struct brcmf_pub
- void brcmf_fweh_detach(struct brcmf_pub *drvr)
- {
- 	struct brcmf_fweh_info *fweh = &drvr->fweh;
--	struct brcmf_if *ifp = drvr->iflist[0];
-+	struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
- 	s8 eventmask[BRCMF_EVENTING_MASK_LEN];
- 
- 	if (ifp) {
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -972,7 +972,7 @@ static void
- brcmf_fws_flow_control_check(struct brcmf_fws_info *fws, struct pktq *pq,
- 			     u8 if_id)
- {
--	struct brcmf_if *ifp = fws->drvr->iflist[!if_id ? 0 : if_id + 1];
-+	struct brcmf_if *ifp = brcmf_get_ifp(fws->drvr, if_id);
- 
- 	if (WARN_ON(!ifp))
- 		return;
-@@ -2118,6 +2118,7 @@ static int brcmf_debugfs_fws_stats_read(
- int brcmf_fws_init(struct brcmf_pub *drvr)
- {
- 	struct brcmf_fws_info *fws;
-+	struct brcmf_if *ifp;
- 	u32 tlv = BRCMF_FWS_FLAGS_RSSI_SIGNALS;
- 	int rc;
- 	u32 mode;
-@@ -2177,21 +2178,22 @@ int brcmf_fws_init(struct brcmf_pub *drv
- 	 * continue. Set mode back to none indicating not enabled.
- 	 */
- 	fws->fw_signals = true;
--	if (brcmf_fil_iovar_int_set(drvr->iflist[0], "tlv", tlv)) {
-+	ifp = brcmf_get_ifp(drvr, 0);
-+	if (brcmf_fil_iovar_int_set(ifp, "tlv", tlv)) {
- 		brcmf_err("failed to set bdcv2 tlv signaling\n");
- 		fws->fcmode = BRCMF_FWS_FCMODE_NONE;
- 		fws->fw_signals = false;
- 	}
- 
--	if (brcmf_fil_iovar_int_set(drvr->iflist[0], "ampdu_hostreorder", 1))
-+	if (brcmf_fil_iovar_int_set(ifp, "ampdu_hostreorder", 1))
- 		brcmf_dbg(INFO, "enabling AMPDU host-reorder failed\n");
- 
- 	/* Enable seq number reuse, if supported */
--	if (brcmf_fil_iovar_int_get(drvr->iflist[0], "wlfc_mode", &mode) == 0) {
-+	if (brcmf_fil_iovar_int_get(ifp, "wlfc_mode", &mode) == 0) {
- 		if (BRCMF_FWS_MODE_GET_REUSESEQ(mode)) {
- 			mode = 0;
- 			BRCMF_FWS_MODE_SET_REUSESEQ(mode, 1);
--			if (brcmf_fil_iovar_int_set(drvr->iflist[0],
-+			if (brcmf_fil_iovar_int_set(ifp,
- 						    "wlfc_mode", mode) == 0) {
- 				BRCMF_FWS_MODE_SET_REUSESEQ(fws->mode, 1);
- 			}
diff --git a/package/kernel/mac80211/patches/365-0007-brcmfmac-pass-struct-brcmf_if-instance-in-brcmf_txfi.patch b/package/kernel/mac80211/patches/365-0007-brcmfmac-pass-struct-brcmf_if-instance-in-brcmf_txfi.patch
deleted file mode 100644
index 23a7b6f1c8a8380004478c30da1ce72d02b87422..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0007-brcmfmac-pass-struct-brcmf_if-instance-in-brcmf_txfi.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:14:59 +0200
-Subject: [PATCH] brcmfmac: pass struct brcmf_if instance in
- brcmf_txfinalize()
-
-Most call sites of brcmf_txfinalize already have struct brcmf_if
-instance so pass that to brcmf_txfinalize() as the function
-needs it anyway.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -560,17 +560,11 @@ void brcmf_rx_frame(struct device *dev,
- 		brcmf_netif_rx(ifp, skb);
- }
- 
--void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp, u8 ifidx,
--		      bool success)
-+void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
- {
--	struct brcmf_if *ifp;
- 	struct ethhdr *eh;
- 	u16 type;
- 
--	ifp = drvr->iflist[ifidx];
--	if (!ifp)
--		goto done;
--
- 	eh = (struct ethhdr *)(txp->data);
- 	type = ntohs(eh->h_proto);
- 
-@@ -582,7 +576,7 @@ void brcmf_txfinalize(struct brcmf_pub *
- 
- 	if (!success)
- 		ifp->stats.tx_errors++;
--done:
-+
- 	brcmu_pkt_buf_free_skb(txp);
- }
- 
-@@ -600,7 +594,7 @@ void brcmf_txcomplete(struct device *dev
- 		if (brcmf_proto_hdrpull(drvr, false, txp, &ifp))
- 			brcmu_pkt_buf_free_skb(txp);
- 		else
--			brcmf_txfinalize(drvr, txp, ifp->ifidx, success);
-+			brcmf_txfinalize(ifp, txp, success);
- 	}
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -210,8 +210,7 @@ void brcmf_remove_interface(struct brcmf
- int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr);
- void brcmf_txflowblock_if(struct brcmf_if *ifp,
- 			  enum brcmf_netif_stop_reason reason, bool state);
--void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp, u8 ifidx,
--		      bool success);
-+void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
- void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
- 
- /* Sets dongle media info (drv_version, mac address). */
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -1506,7 +1506,7 @@ brcmf_fws_txs_process(struct brcmf_fws_i
- 		ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, ifp->ifidx,
- 						    genbit, seq);
- 	if (remove_from_hanger || ret)
--		brcmf_txfinalize(fws->drvr, skb, ifp->ifidx, true);
-+		brcmf_txfinalize(ifp, skb, true);
- 
- 	return 0;
- }
-@@ -1905,7 +1905,7 @@ int brcmf_fws_process_skb(struct brcmf_i
- 	if (fws->avoid_queueing) {
- 		rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb);
- 		if (rc < 0)
--			brcmf_txfinalize(drvr, skb, ifp->ifidx, false);
-+			brcmf_txfinalize(ifp, skb, false);
- 		return rc;
- 	}
- 
-@@ -1929,7 +1929,7 @@ int brcmf_fws_process_skb(struct brcmf_i
- 		brcmf_fws_schedule_deq(fws);
- 	} else {
- 		brcmf_err("drop skb: no hanger slot\n");
--		brcmf_txfinalize(drvr, skb, ifp->ifidx, false);
-+		brcmf_txfinalize(ifp, skb, false);
- 		rc = -ENOMEM;
- 	}
- 	brcmf_fws_unlock(fws);
-@@ -2009,8 +2009,9 @@ static void brcmf_fws_dequeue_worker(str
- 				ret = brcmf_proto_txdata(drvr, ifidx, 0, skb);
- 				brcmf_fws_lock(fws);
- 				if (ret < 0)
--					brcmf_txfinalize(drvr, skb, ifidx,
--							 false);
-+					brcmf_txfinalize(brcmf_get_ifp(drvr,
-+								       ifidx),
-+							 skb, false);
- 				if (fws->bus_flow_blocked)
- 					break;
- 			}
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -873,7 +873,11 @@ brcmf_msgbuf_process_txstatus(struct brc
- 	commonring = msgbuf->flowrings[flowid];
- 	atomic_dec(&commonring->outstanding_tx);
- 
--	brcmf_txfinalize(msgbuf->drvr, skb, tx_status->msg.ifidx, true);
-+	/* Hante: i believe this was a bug as tx_status->msg.ifidx was used
-+	 * in brcmf_txfinalize as index in drvr->iflist. Can you confirm/deny?
-+	 */
-+	brcmf_txfinalize(brcmf_get_ifp(msgbuf->drvr, tx_status->msg.ifidx),
-+			 skb, true);
- }
- 
- 
diff --git a/package/kernel/mac80211/patches/365-0008-brcmfmac-add-mapping-for-interface-index-to-bsscfg-i.patch b/package/kernel/mac80211/patches/365-0008-brcmfmac-add-mapping-for-interface-index-to-bsscfg-i.patch
deleted file mode 100644
index 8ddc0a6eef8f97b995b301422fc4a147852b9762..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0008-brcmfmac-add-mapping-for-interface-index-to-bsscfg-i.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:15:00 +0200
-Subject: [PATCH] brcmfmac: add mapping for interface index to bsscfg
- index
-
-Because the P2P Device interface in firmware uses the same interface
-index as the primary interface we use the bsscfg index as index in the
-struct brcmf_pub::iflist. However, in the data path we get the interface
-index and not the bsscfg index. So we need a mapping of interface index
-to bsscfg index, which can be determined upon handle adding the interface.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -85,21 +85,20 @@ char *brcmf_ifname(struct brcmf_pub *drv
- 
- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx)
- {
-+	struct brcmf_if *ifp;
-+	s32 bssidx;
-+
- 	if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
- 		brcmf_err("ifidx %d out of range\n", ifidx);
- 		return NULL;
- 	}
- 
--	/* The ifidx is the idx to map to matching netdev/ifp. When receiving
--	 * events this is easy because it contains the bssidx which maps
--	 * 1-on-1 to the netdev/ifp. But for data frames the ifidx is rcvd.
--	 * bssidx 1 is used for p2p0 and no data can be received or
--	 * transmitted on it. Therefor bssidx is ifidx + 1 if ifidx > 0
--	 */
--	if (ifidx)
--		ifidx++;
-+	ifp = NULL;
-+	bssidx = drvr->if2bss[ifidx];
-+	if (bssidx >= 0)
-+		ifp = drvr->iflist[bssidx];
- 
--	return drvr->iflist[ifidx];
-+	return ifp;
- }
- 
- static void _brcmf_set_multicast_list(struct work_struct *work)
-@@ -831,6 +830,8 @@ struct brcmf_if *brcmf_add_if(struct brc
- 
- 		ifp = netdev_priv(ndev);
- 		ifp->ndev = ndev;
-+		/* store mapping ifidx to bssidx */
-+		drvr->if2bss[ifidx] = bssidx;
- 	}
- 
- 	ifp->drvr = drvr;
-@@ -855,6 +856,7 @@ static void brcmf_del_if(struct brcmf_pu
- 	struct brcmf_if *ifp;
- 
- 	ifp = drvr->iflist[bssidx];
-+	drvr->if2bss[ifp->ifidx] = -1;
- 	drvr->iflist[bssidx] = NULL;
- 	if (!ifp) {
- 		brcmf_err("Null interface, idx=%d\n", bssidx);
-@@ -862,6 +864,7 @@ static void brcmf_del_if(struct brcmf_pu
- 	}
- 	brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifp->ifidx);
- 	if (ifp->ndev) {
-+		drvr->if2bss[ifp->ifidx] = -1;
- 		if (bssidx == 0) {
- 			if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
- 				rtnl_lock();
-@@ -926,6 +929,7 @@ int brcmf_attach(struct device *dev)
- 	if (!drvr)
- 		return -ENOMEM;
- 
-+	memset(drvr->if2bss, 0xFF, sizeof(drvr->if2bss));
- 	mutex_init(&drvr->proto_block);
- 
- 	/* Link to bus module */
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -122,6 +122,7 @@ struct brcmf_pub {
- 	struct mac_address addresses[BRCMF_MAX_IFS];
- 
- 	struct brcmf_if *iflist[BRCMF_MAX_IFS];
-+	s32 if2bss[BRCMF_MAX_IFS];
- 
- 	struct mutex proto_block;
- 	unsigned char proto_buf[BRCMF_DCMD_MAXLEN];
diff --git a/package/kernel/mac80211/patches/365-0009-brcmfmac-add-dedicated-debug-level-for-firmware-cons.patch b/package/kernel/mac80211/patches/365-0009-brcmfmac-add-dedicated-debug-level-for-firmware-cons.patch
deleted file mode 100644
index a0a798be93ba5d5a5fee57c557d877483e248e0d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0009-brcmfmac-add-dedicated-debug-level-for-firmware-cons.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:15:01 +0200
-Subject: [PATCH] brcmfmac: add dedicated debug level for firmware
- console logging
-
-Both PCIe and SDIO devices have the possibility to log the firmware
-console output in kernel log. For PCIe it is logged when PCIE debug
-level is enabled. For SDIO it is logged when user specifies a non-zero
-console interval through debugfs. This patch tries to make it a
-bit more consistent. The firmware console output is only logged when
-FWCON debug level is enabled.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Pontus Fuchs <pontusf@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-@@ -37,6 +37,7 @@
- #define BRCMF_SDIO_VAL		0x00020000
- #define BRCMF_MSGBUF_VAL	0x00040000
- #define BRCMF_PCIE_VAL		0x00080000
-+#define BRCMF_FWCON_VAL		0x00100000
- 
- /* set default print format */
- #undef pr_fmt
-@@ -78,6 +79,7 @@ do {								\
- #define BRCMF_GLOM_ON()		(brcmf_msg_level & BRCMF_GLOM_VAL)
- #define BRCMF_EVENT_ON()	(brcmf_msg_level & BRCMF_EVENT_VAL)
- #define BRCMF_FIL_ON()		(brcmf_msg_level & BRCMF_FIL_VAL)
-+#define BRCMF_FWCON_ON()	(brcmf_msg_level & BRCMF_FWCON_VAL)
- 
- #else /* defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) */
- 
-@@ -90,6 +92,7 @@ do {								\
- #define BRCMF_GLOM_ON()		0
- #define BRCMF_EVENT_ON()	0
- #define BRCMF_FIL_ON()		0
-+#define BRCMF_FWCON_ON()	0
- 
- #endif /* defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) */
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -644,7 +644,7 @@ static void brcmf_pcie_bus_console_init(
- 	addr = console->base_addr + BRCMF_CONSOLE_BUFSIZE_OFFSET;
- 	console->bufsize = brcmf_pcie_read_tcm32(devinfo, addr);
- 
--	brcmf_dbg(PCIE, "Console: base %x, buf %x, size %d\n",
-+	brcmf_dbg(FWCON, "Console: base %x, buf %x, size %d\n",
- 		  console->base_addr, console->buf_addr, console->bufsize);
- }
- 
-@@ -656,6 +656,9 @@ static void brcmf_pcie_bus_console_read(
- 	u8 ch;
- 	u32 newidx;
- 
-+	if (!BRCMF_FWCON_ON())
-+		return;
-+
- 	console = &devinfo->shared.console;
- 	addr = console->base_addr + BRCMF_CONSOLE_WRITEIDX_OFFSET;
- 	newidx = brcmf_pcie_read_tcm32(devinfo, addr);
-@@ -677,7 +680,7 @@ static void brcmf_pcie_bus_console_read(
- 		}
- 		if (ch == '\n') {
- 			console->log_str[console->log_idx] = 0;
--			brcmf_dbg(PCIE, "CONSOLE: %s", console->log_str);
-+			pr_debug("CONSOLE: %s", console->log_str);
- 			console->log_idx = 0;
- 		}
- 	}
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -123,6 +123,7 @@ struct rte_console {
- 
- #define BRCMF_FIRSTREAD	(1 << 6)
- 
-+#define BRCMF_CONSOLE	10	/* watchdog interval to poll console */
- 
- /* SBSDIO_DEVICE_CTL */
- 
-@@ -3204,6 +3205,8 @@ static void brcmf_sdio_debugfs_create(st
- 	if (IS_ERR_OR_NULL(dentry))
- 		return;
- 
-+	bus->console_interval = BRCMF_CONSOLE;
-+
- 	brcmf_debugfs_add_entry(drvr, "forensics", brcmf_sdio_forensic_read);
- 	brcmf_debugfs_add_entry(drvr, "counters",
- 				brcmf_debugfs_sdio_count_read);
-@@ -3613,7 +3616,7 @@ static void brcmf_sdio_bus_watchdog(stru
- 	}
- #ifdef DEBUG
- 	/* Poll for console output periodically */
--	if (bus->sdiodev->state == BRCMF_SDIOD_DATA &&
-+	if (bus->sdiodev->state == BRCMF_SDIOD_DATA && BRCMF_FWCON_ON() &&
- 	    bus->console_interval != 0) {
- 		bus->console.count += BRCMF_WD_POLL_MS;
- 		if (bus->console.count >= bus->console_interval) {
diff --git a/package/kernel/mac80211/patches/365-0010-brcmfmac-remove-ifidx-parameter-from-brcmf_fws_txsta.patch b/package/kernel/mac80211/patches/365-0010-brcmfmac-remove-ifidx-parameter-from-brcmf_fws_txsta.patch
deleted file mode 100644
index 53e7edeee7f6e5d5fec57b85ae8174865852b488..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0010-brcmfmac-remove-ifidx-parameter-from-brcmf_fws_txsta.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:15:02 +0200
-Subject: [PATCH] brcmfmac: remove ifidx parameter from
- brcmf_fws_txstatus_suppressed()
-
-The brcmf_fws_txstatus_suppressed() function prototype specifies an
-ifidx parameter which is not used within the function implementation.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -1398,7 +1398,7 @@ done:
- }
- 
- static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo,
--					 struct sk_buff *skb, u8 ifidx,
-+					 struct sk_buff *skb,
- 					 u32 genbit, u16 seq)
- {
- 	struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac;
-@@ -1503,7 +1503,7 @@ brcmf_fws_txs_process(struct brcmf_fws_i
- 		return -EINVAL;
- 	}
- 	if (!remove_from_hanger)
--		ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, ifp->ifidx,
-+		ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb,
- 						    genbit, seq);
- 	if (remove_from_hanger || ret)
- 		brcmf_txfinalize(ifp, skb, true);
diff --git a/package/kernel/mac80211/patches/365-0011-brcmfmac-change-prototype-for-brcmf_fws_hdrpull.patch b/package/kernel/mac80211/patches/365-0011-brcmfmac-change-prototype-for-brcmf_fws_hdrpull.patch
deleted file mode 100644
index bb05235cf429b065b351ef75e005ce341790b17a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0011-brcmfmac-change-prototype-for-brcmf_fws_hdrpull.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:15:03 +0200
-Subject: [PATCH] brcmfmac: change prototype for brcmf_fws_hdrpull()
-
-Instead of passing ifidx and drvr just pass struct brcmf_if pointer
-which holds both parameters.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-@@ -312,8 +312,7 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 
- 	skb_pull(pktbuf, BCDC_HEADER_LEN);
- 	if (do_fws)
--		brcmf_fws_hdrpull(drvr, tmp_if->ifidx, h->data_offset << 2,
--				  pktbuf);
-+		brcmf_fws_hdrpull(tmp_if, h->data_offset << 2, pktbuf);
- 	else
- 		skb_pull(pktbuf, h->data_offset << 2);
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -1616,11 +1616,10 @@ static int brcmf_fws_notify_bcmc_credit_
- 	return 0;
- }
- 
--int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
--		      struct sk_buff *skb)
-+void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb)
- {
- 	struct brcmf_skb_reorder_data *rd;
--	struct brcmf_fws_info *fws = drvr->fws;
-+	struct brcmf_fws_info *fws = ifp->drvr->fws;
- 	u8 *signal_data;
- 	s16 data_len;
- 	u8 type;
-@@ -1630,20 +1629,20 @@ int brcmf_fws_hdrpull(struct brcmf_pub *
- 	s32 err;
- 
- 	brcmf_dbg(HDRS, "enter: ifidx %d, skblen %u, sig %d\n",
--		  ifidx, skb->len, signal_len);
-+		  ifp->ifidx, skb->len, siglen);
- 
--	WARN_ON(signal_len > skb->len);
-+	WARN_ON(siglen > skb->len);
- 
--	if (!signal_len)
--		return 0;
-+	if (!siglen)
-+		return;
- 	/* if flow control disabled, skip to packet data and leave */
- 	if ((!fws) || (!fws->fw_signals)) {
--		skb_pull(skb, signal_len);
--		return 0;
-+		skb_pull(skb, siglen);
-+		return;
- 	}
- 
- 	fws->stats.header_pulls++;
--	data_len = signal_len;
-+	data_len = siglen;
- 	signal_data = skb->data;
- 
- 	status = BRCMF_FWS_RET_OK_NOSCHEDULE;
-@@ -1731,14 +1730,12 @@ int brcmf_fws_hdrpull(struct brcmf_pub *
- 	/* signalling processing result does
- 	 * not affect the actual ethernet packet.
- 	 */
--	skb_pull(skb, signal_len);
-+	skb_pull(skb, siglen);
- 
- 	/* this may be a signal-only packet
- 	 */
- 	if (skb->len == 0)
- 		fws->stats.header_only_pkt++;
--
--	return 0;
- }
- 
- static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo,
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.h
-@@ -21,8 +21,7 @@
- int brcmf_fws_init(struct brcmf_pub *drvr);
- void brcmf_fws_deinit(struct brcmf_pub *drvr);
- bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
--int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
--		      struct sk_buff *skb);
-+void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb);
- int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
- 
- void brcmf_fws_reset_interface(struct brcmf_if *ifp);
diff --git a/package/kernel/mac80211/patches/365-0012-brcmfmac-introduce-brcmf_net_detach-function.patch b/package/kernel/mac80211/patches/365-0012-brcmfmac-introduce-brcmf_net_detach-function.patch
deleted file mode 100644
index ba92c6749b5f2b1124e227e25e6f61e47a309e02..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/365-0012-brcmfmac-introduce-brcmf_net_detach-function.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 26 Aug 2015 22:15:04 +0200
-Subject: [PATCH] brcmfmac: introduce brcmf_net_detach() function
-
-In case of error during brcmf_bus_start() the network interfaces were
-freed using free_netdev(). However, the interfaces may have additional
-memory allocated which is not freed. The netdev has destructor set to
-brcmf_cfg80211_free_netdev() which frees the additional memory if
-allocated and call free_netdev(). The brcmf_net_detach() either calls
-brcmf_cfg80211_free_netdev() directly or uses unregister_netdev() when
-struct net_device::reg_state indicates the netdev was registered.
-
-Reported-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -4746,7 +4746,8 @@ void brcmf_cfg80211_free_netdev(struct n
- 	ifp = netdev_priv(ndev);
- 	vif = ifp->vif;
- 
--	brcmf_free_vif(vif);
-+	if (vif)
-+		brcmf_free_vif(vif);
- 	free_netdev(ndev);
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -718,8 +718,6 @@ int brcmf_net_attach(struct brcmf_if *if
- 	}
- 
- 	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
--
--	ndev->destructor = brcmf_cfg80211_free_netdev;
- 	return 0;
- 
- fail:
-@@ -729,6 +727,14 @@ fail:
- 	return -EBADE;
- }
- 
-+static void brcmf_net_detach(struct net_device *ndev)
-+{
-+	if (ndev->reg_state == NETREG_REGISTERED)
-+		unregister_netdev(ndev);
-+	else
-+		brcmf_cfg80211_free_netdev(ndev);
-+}
-+
- static int brcmf_net_p2p_open(struct net_device *ndev)
- {
- 	brcmf_dbg(TRACE, "Enter\n");
-@@ -805,8 +811,7 @@ struct brcmf_if *brcmf_add_if(struct brc
- 			  ifp->ndev->name);
- 		if (ifidx) {
- 			netif_stop_queue(ifp->ndev);
--			unregister_netdev(ifp->ndev);
--			free_netdev(ifp->ndev);
-+			brcmf_net_detach(ifp->ndev);
- 			drvr->iflist[bssidx] = NULL;
- 		} else {
- 			brcmf_err("ignore IF event\n");
-@@ -828,6 +833,7 @@ struct brcmf_if *brcmf_add_if(struct brc
- 		if (!ndev)
- 			return ERR_PTR(-ENOMEM);
- 
-+		ndev->destructor = brcmf_cfg80211_free_netdev;
- 		ifp = netdev_priv(ndev);
- 		ifp->ndev = ndev;
- 		/* store mapping ifidx to bssidx */
-@@ -879,8 +885,7 @@ static void brcmf_del_if(struct brcmf_pu
- 			cancel_work_sync(&ifp->setmacaddr_work);
- 			cancel_work_sync(&ifp->multicast_work);
- 		}
--		/* unregister will take care of freeing it */
--		unregister_netdev(ifp->ndev);
-+		brcmf_net_detach(ifp->ndev);
- 	}
- }
- 
-@@ -1056,11 +1061,11 @@ fail:
- 			brcmf_fws_deinit(drvr);
- 		}
- 		if (drvr->iflist[0]) {
--			free_netdev(ifp->ndev);
-+			brcmf_net_detach(ifp->ndev);
- 			drvr->iflist[0] = NULL;
- 		}
- 		if (p2p_ifp) {
--			free_netdev(p2p_ifp->ndev);
-+			brcmf_net_detach(p2p_ifp->ndev);
- 			drvr->iflist[1] = NULL;
- 		}
- 		return ret;
diff --git a/package/kernel/mac80211/patches/366-brcmfmac-Reset-PCIE-devices-after-recognition.patch b/package/kernel/mac80211/patches/366-brcmfmac-Reset-PCIE-devices-after-recognition.patch
deleted file mode 100644
index 5a7e447e2512e018f89eb0027724c79ad869d0a8..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/366-brcmfmac-Reset-PCIE-devices-after-recognition.patch
+++ /dev/null
@@ -1,193 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 27 Aug 2015 16:14:06 +0200
-Subject: [PATCH] brcmfmac: Reset PCIE devices after recognition.
-
-When PCIE type devices are being FW reloaded without being properly
-reset then the device ends up in a locked state, requiring the
-device to be completely powered down. This patch adds a reset
-through watchdog at the moment the device (cores) has been
-recognized. This will solve warm reboot issues.
-
-Cc: Rafal Milecki <zajec5@gmail.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -101,6 +101,9 @@
- /* ARM Cortex M3 core, ID 0x82a */
- #define BCM4329_CORE_ARM_BASE		0x18002000
- 
-+/* Max possibly supported memory size (limited by IO mapped memory) */
-+#define BRCMF_CHIP_MAX_MEMSIZE		(4 * 1024 * 1024)
-+
- #define CORE_SB(base, field) \
- 		(base + SBCONFIGOFF + offsetof(struct sbconfig, field))
- #define	SBCOREREV(sbidh) \
-@@ -687,6 +690,12 @@ static int brcmf_chip_get_raminfo(struct
- 		brcmf_err("RAM size is undetermined\n");
- 		return -ENOMEM;
- 	}
-+
-+	if (ci->pub.ramsize > BRCMF_CHIP_MAX_MEMSIZE) {
-+		brcmf_err("RAM size is incorrect\n");
-+		return -ENOMEM;
-+	}
-+
- 	return 0;
- }
- 
-@@ -899,6 +908,15 @@ static int brcmf_chip_recognition(struct
- 
- 	/* assure chip is passive for core access */
- 	brcmf_chip_set_passive(&ci->pub);
-+
-+	/* Call bus specific reset function now. Cores have been determined
-+	 * but further access may require a chip specific reset at this point.
-+	 */
-+	if (ci->ops->reset) {
-+		ci->ops->reset(ci->ctx, &ci->pub);
-+		brcmf_chip_set_passive(&ci->pub);
-+	}
-+
- 	return brcmf_chip_get_raminfo(ci);
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.h
-@@ -73,6 +73,7 @@ struct brcmf_buscore_ops {
- 	u32 (*read32)(void *ctx, u32 addr);
- 	void (*write32)(void *ctx, u32 addr, u32 value);
- 	int (*prepare)(void *ctx);
-+	int (*reset)(void *ctx, struct brcmf_chip *chip);
- 	int (*setup)(void *ctx, struct brcmf_chip *chip);
- 	void (*activate)(void *ctx, struct brcmf_chip *chip, u32 rstvec);
- };
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -74,6 +74,8 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_REG_INTMASK			0x94
- #define BRCMF_PCIE_REG_SBMBX			0x98
- 
-+#define BRCMF_PCIE_REG_LINK_STATUS_CTRL		0xBC
-+
- #define BRCMF_PCIE_PCIE2REG_INTMASK		0x24
- #define BRCMF_PCIE_PCIE2REG_MAILBOXINT		0x48
- #define BRCMF_PCIE_PCIE2REG_MAILBOXMASK		0x4C
-@@ -466,6 +468,7 @@ brcmf_pcie_select_core(struct brcmf_pcie
- 
- static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
- {
-+	struct brcmf_core *core;
- 	u16 cfg_offset[] = { BRCMF_PCIE_CFGREG_STATUS_CMD,
- 			     BRCMF_PCIE_CFGREG_PM_CSR,
- 			     BRCMF_PCIE_CFGREG_MSI_CAP,
-@@ -484,32 +487,38 @@ static void brcmf_pcie_reset_device(stru
- 	if (!devinfo->ci)
- 		return;
- 
-+	/* Disable ASPM */
- 	brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
--	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
--			       BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL);
--	lsc = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA);
-+	pci_read_config_dword(devinfo->pdev, BRCMF_PCIE_REG_LINK_STATUS_CTRL,
-+			      &lsc);
- 	val = lsc & (~BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB);
--	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA, val);
-+	pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_LINK_STATUS_CTRL,
-+			       val);
- 
-+	/* Watchdog reset */
- 	brcmf_pcie_select_core(devinfo, BCMA_CORE_CHIPCOMMON);
- 	WRITECC32(devinfo, watchdog, 4);
- 	msleep(100);
- 
-+	/* Restore ASPM */
- 	brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
--	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
--			       BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL);
--	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA, lsc);
-+	pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_LINK_STATUS_CTRL,
-+			       lsc);
- 
--	brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
--	for (i = 0; i < ARRAY_SIZE(cfg_offset); i++) {
--		brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
--				       cfg_offset[i]);
--		val = brcmf_pcie_read_reg32(devinfo,
--					    BRCMF_PCIE_PCIE2REG_CONFIGDATA);
--		brcmf_dbg(PCIE, "config offset 0x%04x, value 0x%04x\n",
--			  cfg_offset[i], val);
--		brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA,
--				       val);
-+	core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2);
-+	if (core->rev <= 13) {
-+		for (i = 0; i < ARRAY_SIZE(cfg_offset); i++) {
-+			brcmf_pcie_write_reg32(devinfo,
-+					       BRCMF_PCIE_PCIE2REG_CONFIGADDR,
-+					       cfg_offset[i]);
-+			val = brcmf_pcie_read_reg32(devinfo,
-+				BRCMF_PCIE_PCIE2REG_CONFIGDATA);
-+			brcmf_dbg(PCIE, "config offset 0x%04x, value 0x%04x\n",
-+				  cfg_offset[i], val);
-+			brcmf_pcie_write_reg32(devinfo,
-+					       BRCMF_PCIE_PCIE2REG_CONFIGDATA,
-+					       val);
-+		}
- 	}
- }
- 
-@@ -519,8 +528,6 @@ static void brcmf_pcie_attach(struct brc
- 	u32 config;
- 
- 	brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
--	if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_INTMASK) != 0)
--		brcmf_pcie_reset_device(devinfo);
- 	/* BAR1 window may not be sized properly */
- 	brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
- 	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR, 0x4e0);
-@@ -1636,6 +1643,23 @@ static int brcmf_pcie_buscoreprep(void *
- }
- 
- 
-+static int brcmf_pcie_buscore_reset(void *ctx, struct brcmf_chip *chip)
-+{
-+	struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
-+	u32 val;
-+
-+	devinfo->ci = chip;
-+	brcmf_pcie_reset_device(devinfo);
-+
-+	val = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT);
-+	if (val != 0xffffffff)
-+		brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT,
-+				       val);
-+
-+	return 0;
-+}
-+
-+
- static void brcmf_pcie_buscore_activate(void *ctx, struct brcmf_chip *chip,
- 					u32 rstvec)
- {
-@@ -1647,6 +1671,7 @@ static void brcmf_pcie_buscore_activate(
- 
- static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
- 	.prepare = brcmf_pcie_buscoreprep,
-+	.reset = brcmf_pcie_buscore_reset,
- 	.activate = brcmf_pcie_buscore_activate,
- 	.read32 = brcmf_pcie_buscore_read32,
- 	.write32 = brcmf_pcie_buscore_write32,
-@@ -1814,7 +1839,6 @@ brcmf_pcie_remove(struct pci_dev *pdev)
- 		brcmf_pcie_intr_disable(devinfo);
- 
- 	brcmf_detach(&pdev->dev);
--	brcmf_pcie_reset_device(devinfo);
- 
- 	kfree(bus->bus_priv.pcie);
- 	kfree(bus->msgbuf->flowrings);
diff --git a/package/kernel/mac80211/patches/367-ath10k-fix-DMA-related-firmware-crashes-on-multiple-.patch b/package/kernel/mac80211/patches/367-ath10k-fix-DMA-related-firmware-crashes-on-multiple-.patch
deleted file mode 100644
index f7b3e40b66b8775f1be663806d66fb4548757443..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/367-ath10k-fix-DMA-related-firmware-crashes-on-multiple-.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Sun, 13 Sep 2015 22:26:10 +0200
-Subject: [PATCH] ath10k: fix DMA related firmware crashes on multiple devices
-
-Some platforms really don't like DMA bursts of 256 bytes, and this
-causes the firmware to crash when sending beacons.
-Also, changing this based on the firmware version does not seem to make
-much sense, so use 128 bytes for all versions.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath10k/hw.h
-+++ b/drivers/net/wireless/ath/ath10k/hw.h
-@@ -253,7 +253,7 @@ struct ath10k_pktlog_hdr {
- #define TARGET_10X_MAX_FRAG_ENTRIES		0
- 
- /* 10.2 parameters */
--#define TARGET_10_2_DMA_BURST_SIZE		1
-+#define TARGET_10_2_DMA_BURST_SIZE		0
- 
- /* Target specific defines for WMI-TLV firmware */
- #define TARGET_TLV_NUM_VDEVS			3
diff --git a/package/kernel/mac80211/patches/368-ath9k-declare-required-extra-tx-headroom.patch b/package/kernel/mac80211/patches/368-ath9k-declare-required-extra-tx-headroom.patch
deleted file mode 100644
index c420d20bae5471bc88909199c8b70a0d30818ca1..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/368-ath9k-declare-required-extra-tx-headroom.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Thu, 24 Sep 2015 16:57:37 +0200
-Subject: [PATCH] ath9k: declare required extra tx headroom
-
-ath9k inserts padding between the 802.11 header and the data area (to
-align it). Since it didn't declare this extra required headroom, this
-led to some nasty issues like randomly dropped packets in some setups.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -867,6 +867,7 @@ static void ath9k_set_hw_capab(struct at
- 	hw->max_rate_tries = 10;
- 	hw->sta_data_size = sizeof(struct ath_node);
- 	hw->vif_data_size = sizeof(struct ath_vif);
-+	hw->extra_tx_headroom = 4;
- 
- 	hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1;
- 	hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1;
diff --git a/package/kernel/mac80211/patches/369-mac80211-initialize-tid-field-in-struct-ieee80211_tx.patch b/package/kernel/mac80211/patches/369-mac80211-initialize-tid-field-in-struct-ieee80211_tx.patch
deleted file mode 100644
index 1478efae77e8d95549788c0e82f136898bcecfb9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/369-mac80211-initialize-tid-field-in-struct-ieee80211_tx.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From: Felix Fietkau <nbd@openwrt.org>
-Date: Mon, 5 Oct 2015 17:41:25 +0200
-Subject: [PATCH] mac80211: initialize tid field in struct ieee80211_txq
-
-Signed-off-by: Felix Fietkau <nbd@openwrt.org>
----
-
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -3323,9 +3323,11 @@ void ieee80211_init_tx_queue(struct ieee
- 	if (sta) {
- 		txqi->txq.sta = &sta->sta;
- 		sta->sta.txq[tid] = &txqi->txq;
-+		txqi->txq.tid = tid;
- 		txqi->txq.ac = ieee802_1d_to_ac[tid & 7];
- 	} else {
- 		sdata->vif.txq = &txqi->txq;
-+		txqi->txq.tid = 0;
- 		txqi->txq.ac = IEEE80211_AC_BE;
- 	}
- }
diff --git a/package/kernel/mac80211/patches/370-0001-brcmfmac-Fix-exception-handling.patch b/package/kernel/mac80211/patches/370-0001-brcmfmac-Fix-exception-handling.patch
deleted file mode 100644
index bcd10314d926fdd507bd6928fb8bdefcc9cf6aa5..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0001-brcmfmac-Fix-exception-handling.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:04 +0200
-Subject: [PATCH] brcmfmac: Fix exception handling.
-
-In some exception situations the ifp->vif was not properly assigned
-which could result in crash.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6331,6 +6331,7 @@ wiphy_unreg_out:
- priv_out:
- 	wl_deinit_priv(cfg);
- 	brcmf_free_vif(vif);
-+	ifp->vif = NULL;
- wiphy_out:
- 	brcmf_free_wiphy(wiphy);
- 	return NULL;
diff --git a/package/kernel/mac80211/patches/370-0002-brcmfmac-Add-support-for-the-BCM4350-PCIE-device.patch b/package/kernel/mac80211/patches/370-0002-brcmfmac-Add-support-for-the-BCM4350-PCIE-device.patch
deleted file mode 100644
index f4ab77b599b376dbcad5defdef35b3408d107ad2..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0002-brcmfmac-Add-support-for-the-BCM4350-PCIE-device.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:05 +0200
-Subject: [PATCH] brcmfmac: Add support for the BCM4350 PCIE device.
-
-This patch adds support fo the BRCM4350 2x2 11ac PCIE device.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -647,6 +647,7 @@ static u32 brcmf_chip_tcm_rambase(struct
- 		return 0x198000;
- 	case BRCM_CC_4335_CHIP_ID:
- 	case BRCM_CC_4339_CHIP_ID:
-+	case BRCM_CC_4350_CHIP_ID:
- 	case BRCM_CC_4354_CHIP_ID:
- 	case BRCM_CC_4356_CHIP_ID:
- 	case BRCM_CC_43567_CHIP_ID:
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -47,6 +47,8 @@ enum brcmf_pcie_state {
- 
- #define BRCMF_PCIE_43602_FW_NAME		"brcm/brcmfmac43602-pcie.bin"
- #define BRCMF_PCIE_43602_NVRAM_NAME		"brcm/brcmfmac43602-pcie.txt"
-+#define BRCMF_PCIE_4350_FW_NAME			"brcm/brcmfmac4350-pcie.bin"
-+#define BRCMF_PCIE_4350_NVRAM_NAME		"brcm/brcmfmac4350-pcie.txt"
- #define BRCMF_PCIE_4356_FW_NAME			"brcm/brcmfmac4356-pcie.bin"
- #define BRCMF_PCIE_4356_NVRAM_NAME		"brcm/brcmfmac4356-pcie.txt"
- #define BRCMF_PCIE_43570_FW_NAME		"brcm/brcmfmac43570-pcie.bin"
-@@ -194,6 +196,8 @@ enum brcmf_pcie_state {
- 
- MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4350_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4350_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
-@@ -1418,6 +1422,10 @@ static int brcmf_pcie_get_fwnames(struct
- 		fw_name = BRCMF_PCIE_43602_FW_NAME;
- 		nvram_name = BRCMF_PCIE_43602_NVRAM_NAME;
- 		break;
-+	case BRCM_CC_4350_CHIP_ID:
-+		fw_name = BRCMF_PCIE_4350_FW_NAME;
-+		nvram_name = BRCMF_PCIE_4350_NVRAM_NAME;
-+		break;
- 	case BRCM_CC_4356_CHIP_ID:
- 		fw_name = BRCMF_PCIE_4356_FW_NAME;
- 		nvram_name = BRCMF_PCIE_4356_NVRAM_NAME;
-@@ -1956,6 +1964,7 @@ cleanup:
- 	PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
- 
- static struct pci_device_id brcmf_pcie_devid_table[] = {
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -39,6 +39,7 @@
- #define BRCM_CC_4339_CHIP_ID		0x4339
- #define BRCM_CC_43430_CHIP_ID		43430
- #define BRCM_CC_4345_CHIP_ID		0x4345
-+#define BRCM_CC_4350_CHIP_ID		0x4350
- #define BRCM_CC_4354_CHIP_ID		0x4354
- #define BRCM_CC_4356_CHIP_ID		0x4356
- #define BRCM_CC_43566_CHIP_ID		43566
-@@ -56,6 +57,7 @@
- #define BRCM_USB_BCMFW_DEVICE_ID	0x0bdc
- 
- /* PCIE Device IDs */
-+#define BRCM_PCIE_4350_DEVICE_ID	0x43a3
- #define BRCM_PCIE_4354_DEVICE_ID	0x43df
- #define BRCM_PCIE_4356_DEVICE_ID	0x43ec
- #define BRCM_PCIE_43567_DEVICE_ID	0x43d3
diff --git a/package/kernel/mac80211/patches/370-0003-brcmfmac-Fix-set-and-get-tx-power-functions.patch b/package/kernel/mac80211/patches/370-0003-brcmfmac-Fix-set-and-get-tx-power-functions.patch
deleted file mode 100644
index 62fdd8d7455f471a758c4ea32fe411d8939ae871..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0003-brcmfmac-Fix-set-and-get-tx-power-functions.patch
+++ /dev/null
@@ -1,218 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:06 +0200
-Subject: [PATCH] brcmfmac: Fix set and get tx-power functions.
-
-Implementation of tx-power (get and set) related functions are
-still assuming mW interface. This is wrong as functions use dbm
-(or mbm) nowadays. As a result a tx power configuration could
-result in wrong power configuration.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -236,89 +236,6 @@ static int brcmf_roamoff;
- module_param_named(roamoff, brcmf_roamoff, int, S_IRUSR);
- MODULE_PARM_DESC(roamoff, "do not use internal roaming engine");
- 
--/* Quarter dBm units to mW
-- * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153
-- * Table is offset so the last entry is largest mW value that fits in
-- * a u16.
-- */
--
--#define QDBM_OFFSET 153		/* Offset for first entry */
--#define QDBM_TABLE_LEN 40	/* Table size */
--
--/* Smallest mW value that will round up to the first table entry, QDBM_OFFSET.
-- * Value is ( mW(QDBM_OFFSET - 1) + mW(QDBM_OFFSET) ) / 2
-- */
--#define QDBM_TABLE_LOW_BOUND 6493	/* Low bound */
--
--/* Largest mW value that will round down to the last table entry,
-- * QDBM_OFFSET + QDBM_TABLE_LEN-1.
-- * Value is ( mW(QDBM_OFFSET + QDBM_TABLE_LEN - 1) +
-- * mW(QDBM_OFFSET + QDBM_TABLE_LEN) ) / 2.
-- */
--#define QDBM_TABLE_HIGH_BOUND 64938	/* High bound */
--
--static const u16 nqdBm_to_mW_map[QDBM_TABLE_LEN] = {
--/* qdBm:	+0	+1	+2	+3	+4	+5	+6	+7 */
--/* 153: */ 6683, 7079, 7499, 7943, 8414, 8913, 9441, 10000,
--/* 161: */ 10593, 11220, 11885, 12589, 13335, 14125, 14962, 15849,
--/* 169: */ 16788, 17783, 18836, 19953, 21135, 22387, 23714, 25119,
--/* 177: */ 26607, 28184, 29854, 31623, 33497, 35481, 37584, 39811,
--/* 185: */ 42170, 44668, 47315, 50119, 53088, 56234, 59566, 63096
--};
--
--static u16 brcmf_qdbm_to_mw(u8 qdbm)
--{
--	uint factor = 1;
--	int idx = qdbm - QDBM_OFFSET;
--
--	if (idx >= QDBM_TABLE_LEN)
--		/* clamp to max u16 mW value */
--		return 0xFFFF;
--
--	/* scale the qdBm index up to the range of the table 0-40
--	 * where an offset of 40 qdBm equals a factor of 10 mW.
--	 */
--	while (idx < 0) {
--		idx += 40;
--		factor *= 10;
--	}
--
--	/* return the mW value scaled down to the correct factor of 10,
--	 * adding in factor/2 to get proper rounding.
--	 */
--	return (nqdBm_to_mW_map[idx] + factor / 2) / factor;
--}
--
--static u8 brcmf_mw_to_qdbm(u16 mw)
--{
--	u8 qdbm;
--	int offset;
--	uint mw_uint = mw;
--	uint boundary;
--
--	/* handle boundary case */
--	if (mw_uint <= 1)
--		return 0;
--
--	offset = QDBM_OFFSET;
--
--	/* move mw into the range of the table */
--	while (mw_uint < QDBM_TABLE_LOW_BOUND) {
--		mw_uint *= 10;
--		offset -= 40;
--	}
--
--	for (qdbm = 0; qdbm < QDBM_TABLE_LEN - 1; qdbm++) {
--		boundary = nqdBm_to_mW_map[qdbm] + (nqdBm_to_mW_map[qdbm + 1] -
--						    nqdBm_to_mW_map[qdbm]) / 2;
--		if (mw_uint < boundary)
--			break;
--	}
--
--	qdbm += (u8) offset;
--
--	return qdbm;
--}
- 
- static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
- 			       struct cfg80211_chan_def *ch)
-@@ -2016,16 +1933,14 @@ static s32
- brcmf_cfg80211_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
- 			    enum nl80211_tx_power_setting type, s32 mbm)
- {
--
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct net_device *ndev = cfg_to_ndev(cfg);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
--	u16 txpwrmw;
--	s32 err = 0;
--	s32 disable = 0;
--	s32 dbm = MBM_TO_DBM(mbm);
-+	s32 err;
-+	s32 disable;
-+	u32 qdbm = 127;
- 
--	brcmf_dbg(TRACE, "Enter\n");
-+	brcmf_dbg(TRACE, "Enter %d %d\n", type, mbm);
- 	if (!check_vif_up(ifp->vif))
- 		return -EIO;
- 
-@@ -2034,12 +1949,20 @@ brcmf_cfg80211_set_tx_power(struct wiphy
- 		break;
- 	case NL80211_TX_POWER_LIMITED:
- 	case NL80211_TX_POWER_FIXED:
--		if (dbm < 0) {
-+		if (mbm < 0) {
- 			brcmf_err("TX_POWER_FIXED - dbm is negative\n");
- 			err = -EINVAL;
- 			goto done;
- 		}
-+		qdbm =  MBM_TO_DBM(4 * mbm);
-+		if (qdbm > 127)
-+			qdbm = 127;
-+		qdbm |= WL_TXPWR_OVERRIDE;
- 		break;
-+	default:
-+		brcmf_err("Unsupported type %d\n", type);
-+		err = -EINVAL;
-+		goto done;
- 	}
- 	/* Make sure radio is off or on as far as software is concerned */
- 	disable = WL_RADIO_SW_DISABLE << 16;
-@@ -2047,52 +1970,44 @@ brcmf_cfg80211_set_tx_power(struct wiphy
- 	if (err)
- 		brcmf_err("WLC_SET_RADIO error (%d)\n", err);
- 
--	if (dbm > 0xffff)
--		txpwrmw = 0xffff;
--	else
--		txpwrmw = (u16) dbm;
--	err = brcmf_fil_iovar_int_set(ifp, "qtxpower",
--				      (s32)brcmf_mw_to_qdbm(txpwrmw));
-+	err = brcmf_fil_iovar_int_set(ifp, "qtxpower", qdbm);
- 	if (err)
- 		brcmf_err("qtxpower error (%d)\n", err);
--	cfg->conf->tx_power = dbm;
- 
- done:
--	brcmf_dbg(TRACE, "Exit\n");
-+	brcmf_dbg(TRACE, "Exit %d (qdbm)\n", qdbm & ~WL_TXPWR_OVERRIDE);
- 	return err;
- }
- 
--static s32 brcmf_cfg80211_get_tx_power(struct wiphy *wiphy,
--				       struct wireless_dev *wdev,
--				       s32 *dbm)
-+static s32
-+brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			    s32 *dbm)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
--	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
--	s32 txpwrdbm;
--	u8 result;
--	s32 err = 0;
-+	struct net_device *ndev = cfg_to_ndev(cfg);
-+	struct brcmf_if *ifp = netdev_priv(ndev);
-+	s32 qdbm = 0;
-+	s32 err;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 	if (!check_vif_up(ifp->vif))
- 		return -EIO;
- 
--	err = brcmf_fil_iovar_int_get(ifp, "qtxpower", &txpwrdbm);
-+	err = brcmf_fil_iovar_int_get(ifp, "qtxpower", &qdbm);
- 	if (err) {
- 		brcmf_err("error (%d)\n", err);
- 		goto done;
- 	}
--
--	result = (u8) (txpwrdbm & ~WL_TXPWR_OVERRIDE);
--	*dbm = (s32) brcmf_qdbm_to_mw(result);
-+	*dbm = (qdbm & ~WL_TXPWR_OVERRIDE) / 4;
- 
- done:
--	brcmf_dbg(TRACE, "Exit\n");
-+	brcmf_dbg(TRACE, "Exit (0x%x %d)\n", qdbm, *dbm);
- 	return err;
- }
- 
- static s32
- brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
--			       u8 key_idx, bool unicast, bool multicast)
-+				  u8 key_idx, bool unicast, bool multicast)
- {
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	u32 index;
diff --git a/package/kernel/mac80211/patches/370-0004-brcmfmac-Only-assign-primary-netdev-to-if2bss-array.patch b/package/kernel/mac80211/patches/370-0004-brcmfmac-Only-assign-primary-netdev-to-if2bss-array.patch
deleted file mode 100644
index c51365fe29d746a4b468dd5f722dbf1ed7d8544e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0004-brcmfmac-Only-assign-primary-netdev-to-if2bss-array.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:07 +0200
-Subject: [PATCH] brcmfmac: Only assign primary netdev to if2bss array.
-
-The if2bss allows for translation of ifidx to bssidx which has a 1:n
-relation. Therefor only the first (primary) netdev should be
-assigned in this array. This fixes the p2pon=1 module param usage.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -53,6 +53,8 @@ MODULE_LICENSE("Dual BSD/GPL");
- #define BRCMF_RXREORDER_EXPIDX_VALID		0x08
- #define BRCMF_RXREORDER_NEW_HOLE		0x10
- 
-+#define BRCMF_BSSIDX_INVALID			-1
-+
- /* Error bits */
- int brcmf_msg_level;
- module_param_named(debug, brcmf_msg_level, int, S_IRUSR | S_IWUSR);
-@@ -837,7 +839,8 @@ struct brcmf_if *brcmf_add_if(struct brc
- 		ifp = netdev_priv(ndev);
- 		ifp->ndev = ndev;
- 		/* store mapping ifidx to bssidx */
--		drvr->if2bss[ifidx] = bssidx;
-+		if (drvr->if2bss[ifidx] == BRCMF_BSSIDX_INVALID)
-+			drvr->if2bss[ifidx] = bssidx;
- 	}
- 
- 	ifp->drvr = drvr;
-@@ -862,15 +865,15 @@ static void brcmf_del_if(struct brcmf_pu
- 	struct brcmf_if *ifp;
- 
- 	ifp = drvr->iflist[bssidx];
--	drvr->if2bss[ifp->ifidx] = -1;
- 	drvr->iflist[bssidx] = NULL;
- 	if (!ifp) {
- 		brcmf_err("Null interface, idx=%d\n", bssidx);
- 		return;
- 	}
- 	brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifp->ifidx);
-+	if (drvr->if2bss[ifp->ifidx] == bssidx)
-+		drvr->if2bss[ifp->ifidx] = BRCMF_BSSIDX_INVALID;
- 	if (ifp->ndev) {
--		drvr->if2bss[ifp->ifidx] = -1;
- 		if (bssidx == 0) {
- 			if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
- 				rtnl_lock();
-@@ -926,6 +929,7 @@ int brcmf_attach(struct device *dev)
- {
- 	struct brcmf_pub *drvr = NULL;
- 	int ret = 0;
-+	int i;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-@@ -934,7 +938,9 @@ int brcmf_attach(struct device *dev)
- 	if (!drvr)
- 		return -ENOMEM;
- 
--	memset(drvr->if2bss, 0xFF, sizeof(drvr->if2bss));
-+	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
-+		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
-+
- 	mutex_init(&drvr->proto_block);
- 
- 	/* Link to bus module */
diff --git a/package/kernel/mac80211/patches/370-0005-brcmfmac-Inform-p2p-module-about-p2pon-through-API.patch b/package/kernel/mac80211/patches/370-0005-brcmfmac-Inform-p2p-module-about-p2pon-through-API.patch
deleted file mode 100644
index 3c1058d0adb20d43257a3a34a9c91cb0066c5528..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0005-brcmfmac-Inform-p2p-module-about-p2pon-through-API.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:08 +0200
-Subject: [PATCH] brcmfmac: Inform p2p module about p2pon through API
-
-When the p2pon module param is used then p2p attach will initialize
-p2p device iface in the firmware, but it is doing that by checking
-data. It is cleaner to pass the p2pon information to p2p by API.
-This information is also needed for other patch.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6126,7 +6126,8 @@ static void brcmf_free_wiphy(struct wiph
- }
- 
- struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
--						  struct device *busdev)
-+						  struct device *busdev,
-+						  bool p2pdev_forced)
- {
- 	struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev;
- 	struct brcmf_cfg80211_info *cfg;
-@@ -6218,7 +6219,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
- 			*cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
- 	}
- 
--	err = brcmf_p2p_attach(cfg);
-+	err = brcmf_p2p_attach(cfg, p2pdev_forced);
- 	if (err) {
- 		brcmf_err("P2P initilisation failed (%d)\n", err);
- 		goto wiphy_unreg_out;
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-@@ -469,7 +469,8 @@ brcmf_cfg80211_connect_info *cfg_to_conn
- }
- 
- struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
--						  struct device *busdev);
-+						  struct device *busdev,
-+						  bool p2pdev_forced);
- void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
- s32 brcmf_cfg80211_up(struct net_device *ndev);
- s32 brcmf_cfg80211_down(struct net_device *ndev);
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -1044,7 +1044,8 @@ int brcmf_bus_start(struct device *dev)
- 
- 	brcmf_fws_add_interface(ifp);
- 
--	drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev);
-+	drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
-+					     brcmf_p2p_enable);
- 	if (drvr->config == NULL) {
- 		ret = -ENOMEM;
- 		goto fail;
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2333,7 +2333,7 @@ void brcmf_p2p_stop_device(struct wiphy
-  *
-  * @cfg: driver private data for cfg80211 interface.
-  */
--s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg)
-+s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
- {
- 	struct brcmf_if *pri_ifp;
- 	struct brcmf_if *p2p_ifp;
-@@ -2348,11 +2348,15 @@ s32 brcmf_p2p_attach(struct brcmf_cfg802
- 
- 	drvr = cfg->pub;
- 
--	pri_ifp = drvr->iflist[0];
--	p2p_ifp = drvr->iflist[1];
--
-+	pri_ifp = brcmf_get_ifp(drvr, 0);
- 	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
- 
-+	if (p2pdev_forced) {
-+		p2p_ifp = drvr->iflist[1];
-+	} else {
-+		p2p_ifp = NULL;
-+		p2p->p2pdev_dynamically = true;
-+	}
- 	if (p2p_ifp) {
- 		p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
- 					  false);
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
-@@ -124,6 +124,7 @@ struct afx_hdl {
-  * @wait_next_af: thread synchronizing struct.
-  * @gon_req_action: about to send go negotiation requets frame.
-  * @block_gon_req_tx: drop tx go negotiation requets frame.
-+ * @p2pdev_dynamically: is p2p device if created by module param or supplicant.
-  */
- struct brcmf_p2p_info {
- 	struct brcmf_cfg80211_info *cfg;
-@@ -144,9 +145,10 @@ struct brcmf_p2p_info {
- 	struct completion wait_next_af;
- 	bool gon_req_action;
- 	bool block_gon_req_tx;
-+	bool p2pdev_dynamically;
- };
- 
--s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg);
-+s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced);
- void brcmf_p2p_detach(struct brcmf_p2p_info *p2p);
- struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 				       enum nl80211_iftype type, u32 *flags,
diff --git a/package/kernel/mac80211/patches/370-0006-brcmfmac-Fix-bug-in-flowring-management.patch b/package/kernel/mac80211/patches/370-0006-brcmfmac-Fix-bug-in-flowring-management.patch
deleted file mode 100644
index 66b21176935a58356da3a279c2784346e6da954e..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0006-brcmfmac-Fix-bug-in-flowring-management.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:09 +0200
-Subject: [PATCH] brcmfmac: Fix bug in flowring management.
-
-The hash index stored in the flowrings is of type u16 but gets
-stored in u8. This can result in incorrect indexing and possibly
-result in crashes. This patch fixes the type.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
-@@ -34,7 +34,7 @@ enum ring_status {
- };
- 
- struct brcmf_flowring_ring {
--	u8 hash_id;
-+	u16 hash_id;
- 	bool blocked;
- 	enum ring_status status;
- 	struct sk_buff_head skblist;
diff --git a/package/kernel/mac80211/patches/370-0007-brcmfmac-Make-p2pon-module-param-always-available.patch b/package/kernel/mac80211/patches/370-0007-brcmfmac-Make-p2pon-module-param-always-available.patch
deleted file mode 100644
index c143c3ba7585f1a95ff270c5bc8ddb28aaf12d9a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0007-brcmfmac-Make-p2pon-module-param-always-available.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:10 +0200
-Subject: [PATCH] brcmfmac: Make p2pon module param always available.
-
-p2pon module param is currently under define BRCMDBG. Though it is
-a needed option for older versions of the wpa_supplicant which do not
-support the P2P_DEVICE interface.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -62,10 +62,8 @@ MODULE_PARM_DESC(debug, "level of debug
- 
- /* P2P0 enable */
- static int brcmf_p2p_enable;
--#ifdef CPTCFG_BRCMDBG
- module_param_named(p2pon, brcmf_p2p_enable, int, 0);
--MODULE_PARM_DESC(p2pon, "enable p2p management functionality");
--#endif
-+MODULE_PARM_DESC(p2pon, "enable legacy p2p management functionality");
- 
- char *brcmf_ifname(struct brcmf_pub *drvr, int ifidx)
- {
diff --git a/package/kernel/mac80211/patches/370-0008-brcmfmac-Workaround-in-change-vif-for-wpa_supplicant.patch b/package/kernel/mac80211/patches/370-0008-brcmfmac-Workaround-in-change-vif-for-wpa_supplicant.patch
deleted file mode 100644
index 15ac2d900ac56fb719c0f3422faacf615bd0713d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0008-brcmfmac-Workaround-in-change-vif-for-wpa_supplicant.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:11 +0200
-Subject: [PATCH] brcmfmac: Workaround in change vif for wpa_supplicant
- support.
-
-Different wpa_supplicants have different behavior and expectations
-regarding the change_virtual_intf behavior. This patch implements
-a workaround for the different versions and possible brcmfmac
-configuration.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -776,6 +776,37 @@ brcmf_cfg80211_change_iface(struct wiphy
- 	s32 err = 0;
- 
- 	brcmf_dbg(TRACE, "Enter, idx=%d, type=%d\n", ifp->bssidx, type);
-+
-+	/* WAR: There are a number of p2p interface related problems which
-+	 * need to be handled initially (before doing the validate).
-+	 * wpa_supplicant tends to do iface changes on p2p device/client/go
-+	 * which are not always possible/allowed. However we need to return
-+	 * OK otherwise the wpa_supplicant wont start. The situation differs
-+	 * on configuration and setup (p2pon=1 module param). The first check
-+	 * is to see if the request is a change to station for p2p iface.
-+	 */
-+	if ((type == NL80211_IFTYPE_STATION) &&
-+	    ((vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) ||
-+	     (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) ||
-+	     (vif->wdev.iftype == NL80211_IFTYPE_P2P_DEVICE))) {
-+		brcmf_dbg(TRACE, "Ignoring cmd for p2p if\n");
-+		/* Now depending on whether module param p2pon=1 was used the
-+		 * response needs to be either 0 or EOPNOTSUPP. The reason is
-+		 * that if p2pon=1 is used, but a newer supplicant is used then
-+		 * we should return an error, as this combination wont work.
-+		 * In other situations 0 is returned and supplicant will start
-+		 * normally. It will give a trace in cfg80211, but it is the
-+		 * only way to get it working. Unfortunately this will result
-+		 * in situation where we wont support new supplicant in
-+		 * combination with module param p2pon=1, but that is the way
-+		 * it is. If the user tries this then unloading of driver might
-+		 * fail/lock.
-+		 */
-+		if (cfg->p2p.p2pdev_dynamically)
-+			return -EOPNOTSUPP;
-+		else
-+			return 0;
-+	}
- 	err = brcmf_vif_change_validate(wiphy_to_cfg(wiphy), vif, type);
- 	if (err) {
- 		brcmf_err("iface validation failed: err=%d\n", err);
-@@ -791,18 +822,6 @@ brcmf_cfg80211_change_iface(struct wiphy
- 		infra = 0;
- 		break;
- 	case NL80211_IFTYPE_STATION:
--		/* Ignore change for p2p IF. Unclear why supplicant does this */
--		if ((vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) ||
--		    (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO)) {
--			brcmf_dbg(TRACE, "Ignoring cmd for p2p if\n");
--			/* WAR: It is unexpected to get a change of VIF for P2P
--			 * IF, but it happens. The request can not be handled
--			 * but returning EPERM causes a crash. Returning 0
--			 * without setting ieee80211_ptr->iftype causes trace
--			 * (WARN_ON) but it works with wpa_supplicant
--			 */
--			return 0;
--		}
- 		infra = 1;
- 		break;
- 	case NL80211_IFTYPE_AP:
diff --git a/package/kernel/mac80211/patches/370-0009-brcmfmac-Deleting-of-p2p-device-is-leaking-memory.patch b/package/kernel/mac80211/patches/370-0009-brcmfmac-Deleting-of-p2p-device-is-leaking-memory.patch
deleted file mode 100644
index 1988b5cb6b4131f91cdc81dbd4273c96fc66c4fc..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0009-brcmfmac-Deleting-of-p2p-device-is-leaking-memory.patch
+++ /dev/null
@@ -1,124 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:12 +0200
-Subject: [PATCH] brcmfmac: Deleting of p2p device is leaking memory.
-
-When a p2p device gets deleted, the memory for the vif is not being
-released. This is solved by reorganizing the cleanup path and
-properly freeing the memory.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -887,6 +887,16 @@ static void brcmf_del_if(struct brcmf_pu
- 			cancel_work_sync(&ifp->multicast_work);
- 		}
- 		brcmf_net_detach(ifp->ndev);
-+	} else {
-+		/* Only p2p device interfaces which get dynamically created
-+		 * end up here. In this case the p2p module should be informed
-+		 * about the removal of the interface within the firmware. If
-+		 * not then p2p commands towards the firmware will cause some
-+		 * serious troublesome side effects. The p2p module will clean
-+		 * up the ifp if needed.
-+		 */
-+		brcmf_p2p_ifp_removed(ifp);
-+		kfree(ifp);
- 	}
- }
- 
-@@ -894,7 +904,8 @@ void brcmf_remove_interface(struct brcmf
- {
- 	if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bssidx] != ifp))
- 		return;
--
-+	brcmf_dbg(TRACE, "Enter, bssidx=%d, ifidx=%d\n", ifp->bssidx,
-+		  ifp->ifidx);
- 	brcmf_fws_del_interface(ifp);
- 	brcmf_del_if(ifp->drvr, ifp->bssidx);
- }
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2131,20 +2131,6 @@ fail:
- }
- 
- /**
-- * brcmf_p2p_delete_p2pdev() - delete P2P_DEVICE virtual interface.
-- *
-- * @vif: virtual interface object to delete.
-- */
--static void brcmf_p2p_delete_p2pdev(struct brcmf_p2p_info *p2p,
--				    struct brcmf_cfg80211_vif *vif)
--{
--	cfg80211_unregister_wdev(&vif->wdev);
--	p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
--	brcmf_remove_interface(vif->ifp);
--	brcmf_free_vif(vif);
--}
--
--/**
-  * brcmf_p2p_add_vif() - create a new P2P virtual interface.
-  *
-  * @wiphy: wiphy device of new interface.
-@@ -2264,9 +2250,11 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 		break;
- 
- 	case NL80211_IFTYPE_P2P_DEVICE:
-+		if (!p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
-+			return 0;
- 		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
- 		brcmf_p2p_deinit_discovery(p2p);
--		brcmf_p2p_delete_p2pdev(p2p, vif);
-+		brcmf_remove_interface(vif->ifp);
- 		return 0;
- 	default:
- 		return -ENOTSUPP;
-@@ -2298,6 +2286,21 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 	return err;
- }
- 
-+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp)
-+{
-+	struct brcmf_cfg80211_info *cfg;
-+	struct brcmf_cfg80211_vif *vif;
-+
-+	brcmf_dbg(INFO, "P2P: device interface removed\n");
-+	vif = ifp->vif;
-+	cfg = wdev_to_cfg(&vif->wdev);
-+	cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
-+	rtnl_lock();
-+	cfg80211_unregister_wdev(&vif->wdev);
-+	rtnl_unlock();
-+	brcmf_free_vif(vif);
-+}
-+
- int brcmf_p2p_start_device(struct wiphy *wiphy, struct wireless_dev *wdev)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-@@ -2422,10 +2425,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_i
- 	if (vif != NULL) {
- 		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
- 		brcmf_p2p_deinit_discovery(p2p);
--		/* remove discovery interface */
--		rtnl_lock();
--		brcmf_p2p_delete_p2pdev(p2p, vif);
--		rtnl_unlock();
-+		brcmf_remove_interface(vif->ifp);
- 	}
- 	/* just set it all to zero */
- 	memset(p2p, 0, sizeof(*p2p));
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
-@@ -156,6 +156,7 @@ struct wireless_dev *brcmf_p2p_add_vif(s
- int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev);
- int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg,
- 		       enum brcmf_fil_p2p_if_types if_type);
-+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp);
- int brcmf_p2p_start_device(struct wiphy *wiphy, struct wireless_dev *wdev);
- void brcmf_p2p_stop_device(struct wiphy *wiphy, struct wireless_dev *wdev);
- int brcmf_p2p_scan_prep(struct wiphy *wiphy,
diff --git a/package/kernel/mac80211/patches/370-0010-brcmfmac-Only-handle-p2p_stop_device-if-vif-is-valid.patch b/package/kernel/mac80211/patches/370-0010-brcmfmac-Only-handle-p2p_stop_device-if-vif-is-valid.patch
deleted file mode 100644
index 5225c9e5bc547e2a047e07aec279a7606564d197..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0010-brcmfmac-Only-handle-p2p_stop_device-if-vif-is-valid.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:13 +0200
-Subject: [PATCH] brcmfmac: Only handle p2p_stop_device if vif is valid
-
-In some situations it is possible that vif has been removed while
-cfg80211 invokes the p2p_stop_device handler. This will result in
-crash.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2324,11 +2324,17 @@ void brcmf_p2p_stop_device(struct wiphy
- 	struct brcmf_cfg80211_vif *vif;
- 
- 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
--	mutex_lock(&cfg->usr_sync);
--	(void)brcmf_p2p_deinit_discovery(p2p);
--	brcmf_abort_scanning(cfg);
--	clear_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state);
--	mutex_unlock(&cfg->usr_sync);
-+	/* This call can be result of the unregister_wdev call. In that case
-+	 * we dont want to do anything anymore. Just return. The config vif
-+	 * will have been cleared at this point.
-+	 */
-+	if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif == vif) {
-+		mutex_lock(&cfg->usr_sync);
-+		(void)brcmf_p2p_deinit_discovery(p2p);
-+		brcmf_abort_scanning(cfg);
-+		clear_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state);
-+		mutex_unlock(&cfg->usr_sync);
-+	}
- }
- 
- /**
diff --git a/package/kernel/mac80211/patches/370-0011-brcmfmac-Fix-p2p-bug-for-older-firmwares.patch b/package/kernel/mac80211/patches/370-0011-brcmfmac-Fix-p2p-bug-for-older-firmwares.patch
deleted file mode 100644
index e2f24e866bdc5133cc55597ba5358b8c9e72e58f..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0011-brcmfmac-Fix-p2p-bug-for-older-firmwares.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:14 +0200
-Subject: [PATCH] brcmfmac: Fix p2p bug for older firmwares.
-
-Some devices with older firmwares are reporting new p2p device
-interface with the wrong type. Accept this type to get p2p
-working for these devices.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -186,11 +186,13 @@ static void brcmf_fweh_handle_if_event(s
- 		  ifevent->action, ifevent->ifidx, ifevent->bssidx,
- 		  ifevent->flags, ifevent->role);
- 
--	/* The P2P Device interface event must not be ignored
--	 * contrary to what firmware tells us.
-+	/* The P2P Device interface event must not be ignored contrary to what
-+	 * firmware tells us. Older firmware uses p2p noif, with sta role.
-+	 * This should be accepted.
- 	 */
--	is_p2pdev = (ifevent->flags & BRCMF_E_IF_FLAG_NOIF) &&
--		    ifevent->role == BRCMF_E_IF_ROLE_P2P_CLIENT;
-+	is_p2pdev = ((ifevent->flags & BRCMF_E_IF_FLAG_NOIF) &&
-+		     (ifevent->role == BRCMF_E_IF_ROLE_P2P_CLIENT ||
-+		      ifevent->role == BRCMF_E_IF_ROLE_STA));
- 	if (!is_p2pdev && (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
- 		brcmf_dbg(EVENT, "event can be ignored\n");
- 		return;
diff --git a/package/kernel/mac80211/patches/370-0012-brcmfmac-Add-module-parameter-to-disable-features.patch b/package/kernel/mac80211/patches/370-0012-brcmfmac-Add-module-parameter-to-disable-features.patch
deleted file mode 100644
index 52c787ff61af2386369218ab215de038bb0feeaa..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0012-brcmfmac-Add-module-parameter-to-disable-features.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:15 +0200
-Subject: [PATCH] brcmfmac: Add module parameter to disable features.
-
-For debugging purpose it is very handy to be able to disable
-features. It has happened a few times that new features turned
-out not always being properly detected for all devices/firmwares.
-Making it possible to disable the feature with a module parameter
-will make testing/debugging easier.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-@@ -15,6 +15,7 @@
-  */
- 
- #include <linux/netdevice.h>
-+#include <linux/module.h>
- 
- #include <brcm_hw_ids.h>
- #include "core.h"
-@@ -23,6 +24,12 @@
- #include "fwil.h"
- #include "feature.h"
- 
-+
-+/* Module param feature_disable (global for all devices) */
-+static int brcmf_feature_disable;
-+module_param_named(feature_disable, brcmf_feature_disable, int, 0);
-+MODULE_PARM_DESC(feature_disable, "Disable features");
-+
- /*
-  * expand feature list to array of feature strings.
-  */
-@@ -131,6 +138,12 @@ void brcmf_feat_attach(struct brcmf_pub
- 		brcmf_feat_iovar_int_set(ifp, BRCMF_FEAT_MBSS, "mbss", 0);
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_P2P, "p2p");
- 
-+	if (brcmf_feature_disable) {
-+		brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n",
-+			  ifp->drvr->feat_flags, brcmf_feature_disable);
-+		ifp->drvr->feat_flags &= ~brcmf_feature_disable;
-+	}
-+
- 	/* set chip related quirks */
- 	switch (drvr->bus_if->chip) {
- 	case BRCM_CC_43236_CHIP_ID:
diff --git a/package/kernel/mac80211/patches/370-0013-brcmfmac-Fix-race-condition-bug-when-deleting-p2p-in.patch b/package/kernel/mac80211/patches/370-0013-brcmfmac-Fix-race-condition-bug-when-deleting-p2p-in.patch
deleted file mode 100644
index 58a638aa08fb1e6bb8ea4ac7bd812f1bf8ca7d83..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0013-brcmfmac-Fix-race-condition-bug-when-deleting-p2p-in.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:16 +0200
-Subject: [PATCH] brcmfmac: Fix race condition bug when deleting p2p interface.
-
-When p2p device interface gets deleted by deinitialising discovery
-it will result in an event which removes the interface, but that is
-also done by delete p2p interface code. This results in race
-condition which sometimes results in lockup/crash. With this patch
-the delete device interface will wait for the event (with timeout)
-removing the possible race condition. Also on the stop device call
-from cfg80211 the deinitialisation of the discovery device should
-be avoided as it can result in a similar situation.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2238,6 +2238,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 	brcmf_dbg(TRACE, "delete P2P vif\n");
- 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
- 
-+	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 	switch (vif->wdev.iftype) {
- 	case NL80211_IFTYPE_P2P_CLIENT:
- 		if (test_bit(BRCMF_VIF_STATUS_DISCONNECTING, &vif->sme_state))
-@@ -2254,8 +2255,6 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 			return 0;
- 		brcmf_p2p_cancel_remain_on_channel(vif->ifp);
- 		brcmf_p2p_deinit_discovery(p2p);
--		brcmf_remove_interface(vif->ifp);
--		return 0;
- 	default:
- 		return -ENOTSUPP;
- 	}
-@@ -2267,10 +2266,11 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 		wait_for_completion_timeout(&cfg->vif_disabled,
- 					    msecs_to_jiffies(500));
- 
--	brcmf_vif_clear_mgmt_ies(vif);
--
--	brcmf_cfg80211_arm_vif_event(cfg, vif);
--	err = brcmf_p2p_release_p2p_if(vif);
-+	err = 0;
-+	if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) {
-+		brcmf_vif_clear_mgmt_ies(vif);
-+		err = brcmf_p2p_release_p2p_if(vif);
-+	}
- 	if (!err) {
- 		/* wait for firmware event */
- 		err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL,
-@@ -2280,8 +2280,12 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
- 		else
- 			err = 0;
- 	}
-+	if (err)
-+		brcmf_remove_interface(vif->ifp);
-+
- 	brcmf_cfg80211_arm_vif_event(cfg, NULL);
--	p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
-+	if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE)
-+		p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
- 
- 	return err;
- }
-@@ -2330,7 +2334,9 @@ void brcmf_p2p_stop_device(struct wiphy
- 	 */
- 	if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif == vif) {
- 		mutex_lock(&cfg->usr_sync);
--		(void)brcmf_p2p_deinit_discovery(p2p);
-+		/* Set the discovery state to SCAN */
-+		(void)brcmf_p2p_set_discover_state(vif->ifp,
-+						   WL_P2P_DISC_ST_SCAN, 0, 0);
- 		brcmf_abort_scanning(cfg);
- 		clear_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state);
- 		mutex_unlock(&cfg->usr_sync);
diff --git a/package/kernel/mac80211/patches/370-0014-brcmfmac-Add-support-for-the-BCM4365-and-BCM4366-PCI.patch b/package/kernel/mac80211/patches/370-0014-brcmfmac-Add-support-for-the-BCM4365-and-BCM4366-PCI.patch
deleted file mode 100644
index d0bbf2a8783d50d62cfb1c8fda65099060e957a9..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0014-brcmfmac-Add-support-for-the-BCM4365-and-BCM4366-PCI.patch
+++ /dev/null
@@ -1,277 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:17 +0200
-Subject: [PATCH] brcmfmac: Add support for the BCM4365 and BCM4366 PCIE
- devices.
-
-This patch adds support for the BCM4365 and BCM4366 11ac Wave2
-PCIE devices.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -208,6 +208,7 @@ struct sbsocramregs {
- };
- 
- #define SOCRAMREGOFFS(_f)	offsetof(struct sbsocramregs, _f)
-+#define SYSMEMREGOFFS(_f)	offsetof(struct sbsocramregs, _f)
- 
- #define ARMCR4_CAP		(0x04)
- #define ARMCR4_BANKIDX		(0x40)
-@@ -516,6 +517,9 @@ static int brcmf_chip_cores_check(struct
- 		case BCMA_CORE_ARM_CR4:
- 			cpu_found = true;
- 			break;
-+		case BCMA_CORE_ARM_CA7:
-+			cpu_found = true;
-+			break;
- 		default:
- 			break;
- 		}
-@@ -614,6 +618,29 @@ static void brcmf_chip_socram_ramsize(st
- 	}
- }
- 
-+/** Return the SYS MEM size */
-+static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem)
-+{
-+	u32 memsize = 0;
-+	u32 coreinfo;
-+	u32 idx;
-+	u32 nb;
-+	u32 banksize;
-+
-+	if (!brcmf_chip_iscoreup(&sysmem->pub))
-+		brcmf_chip_resetcore(&sysmem->pub, 0, 0, 0);
-+
-+	coreinfo = brcmf_chip_core_read32(sysmem, SYSMEMREGOFFS(coreinfo));
-+	nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
-+
-+	for (idx = 0; idx < nb; idx++) {
-+		brcmf_chip_socram_banksize(sysmem, idx, &banksize);
-+		memsize += banksize;
-+	}
-+
-+	return memsize;
-+}
-+
- /** Return the TCM-RAM size of the ARMCR4 core. */
- static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
- {
-@@ -656,6 +683,9 @@ static u32 brcmf_chip_tcm_rambase(struct
- 	case BRCM_CC_4358_CHIP_ID:
- 	case BRCM_CC_43602_CHIP_ID:
- 		return 0x180000;
-+	case BRCM_CC_4365_CHIP_ID:
-+	case BRCM_CC_4366_CHIP_ID:
-+		return 0x200000;
- 	default:
- 		brcmf_err("unknown chip: %s\n", ci->pub.name);
- 		break;
-@@ -678,10 +708,28 @@ static int brcmf_chip_get_raminfo(struct
- 			return -EINVAL;
- 		}
- 	} else {
--		mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_INTERNAL_MEM);
--		mem_core = container_of(mem, struct brcmf_core_priv, pub);
--		brcmf_chip_socram_ramsize(mem_core, &ci->pub.ramsize,
--					  &ci->pub.srsize);
-+		mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_SYS_MEM);
-+		if (mem) {
-+			mem_core = container_of(mem, struct brcmf_core_priv,
-+						pub);
-+			ci->pub.ramsize = brcmf_chip_sysmem_ramsize(mem_core);
-+			ci->pub.rambase = brcmf_chip_tcm_rambase(ci);
-+			if (!ci->pub.rambase) {
-+				brcmf_err("RAM base not provided with ARM CA7 core\n");
-+				return -EINVAL;
-+			}
-+		} else {
-+			mem = brcmf_chip_get_core(&ci->pub,
-+						  BCMA_CORE_INTERNAL_MEM);
-+			if (!mem) {
-+				brcmf_err("No memory cores found\n");
-+				return -ENOMEM;
-+			}
-+			mem_core = container_of(mem, struct brcmf_core_priv,
-+						pub);
-+			brcmf_chip_socram_ramsize(mem_core, &ci->pub.ramsize,
-+						  &ci->pub.srsize);
-+		}
- 	}
- 	brcmf_dbg(INFO, "RAM: base=0x%x size=%d (0x%x) sr=%d (0x%x)\n",
- 		  ci->pub.rambase, ci->pub.ramsize, ci->pub.ramsize,
-@@ -924,7 +972,7 @@ static int brcmf_chip_recognition(struct
- static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id)
- {
- 	struct brcmf_core *core;
--	struct brcmf_core_priv *cr4;
-+	struct brcmf_core_priv *cpu;
- 	u32 val;
- 
- 
-@@ -937,10 +985,11 @@ static void brcmf_chip_disable_arm(struc
- 		brcmf_chip_coredisable(core, 0, 0);
- 		break;
- 	case BCMA_CORE_ARM_CR4:
--		cr4 = container_of(core, struct brcmf_core_priv, pub);
-+	case BCMA_CORE_ARM_CA7:
-+		cpu = container_of(core, struct brcmf_core_priv, pub);
- 
- 		/* clear all IOCTL bits except HALT bit */
--		val = chip->ops->read32(chip->ctx, cr4->wrapbase + BCMA_IOCTL);
-+		val = chip->ops->read32(chip->ctx, cpu->wrapbase + BCMA_IOCTL);
- 		val &= ARMCR4_BCMA_IOCTL_CPUHALT;
- 		brcmf_chip_resetcore(core, val, ARMCR4_BCMA_IOCTL_CPUHALT,
- 				     ARMCR4_BCMA_IOCTL_CPUHALT);
-@@ -1162,6 +1211,33 @@ static bool brcmf_chip_cr4_set_active(st
- 	return true;
- }
- 
-+static inline void
-+brcmf_chip_ca7_set_passive(struct brcmf_chip_priv *chip)
-+{
-+	struct brcmf_core *core;
-+
-+	brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CA7);
-+
-+	core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211);
-+	brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET |
-+				   D11_BCMA_IOCTL_PHYCLOCKEN,
-+			     D11_BCMA_IOCTL_PHYCLOCKEN,
-+			     D11_BCMA_IOCTL_PHYCLOCKEN);
-+}
-+
-+static bool brcmf_chip_ca7_set_active(struct brcmf_chip_priv *chip, u32 rstvec)
-+{
-+	struct brcmf_core *core;
-+
-+	chip->ops->activate(chip->ctx, &chip->pub, rstvec);
-+
-+	/* restore ARM */
-+	core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CA7);
-+	brcmf_chip_resetcore(core, ARMCR4_BCMA_IOCTL_CPUHALT, 0, 0);
-+
-+	return true;
-+}
-+
- void brcmf_chip_set_passive(struct brcmf_chip *pub)
- {
- 	struct brcmf_chip_priv *chip;
-@@ -1175,8 +1251,16 @@ void brcmf_chip_set_passive(struct brcmf
- 		brcmf_chip_cr4_set_passive(chip);
- 		return;
- 	}
--
--	brcmf_chip_cm3_set_passive(chip);
-+	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CA7);
-+	if (arm) {
-+		brcmf_chip_ca7_set_passive(chip);
-+		return;
-+	}
-+	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CM3);
-+	if (arm) {
-+		brcmf_chip_cm3_set_passive(chip);
-+		return;
-+	}
- }
- 
- bool brcmf_chip_set_active(struct brcmf_chip *pub, u32 rstvec)
-@@ -1190,8 +1274,14 @@ bool brcmf_chip_set_active(struct brcmf_
- 	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4);
- 	if (arm)
- 		return brcmf_chip_cr4_set_active(chip, rstvec);
-+	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CA7);
-+	if (arm)
-+		return brcmf_chip_ca7_set_active(chip, rstvec);
-+	arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CM3);
-+	if (arm)
-+		return brcmf_chip_cm3_set_active(chip);
- 
--	return brcmf_chip_cm3_set_active(chip);
-+	return false;
- }
- 
- bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -55,6 +55,10 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_43570_NVRAM_NAME		"brcm/brcmfmac43570-pcie.txt"
- #define BRCMF_PCIE_4358_FW_NAME			"brcm/brcmfmac4358-pcie.bin"
- #define BRCMF_PCIE_4358_NVRAM_NAME		"brcm/brcmfmac4358-pcie.txt"
-+#define BRCMF_PCIE_4365_FW_NAME			"brcm/brcmfmac4365b-pcie.bin"
-+#define BRCMF_PCIE_4365_NVRAM_NAME		"brcm/brcmfmac4365b-pcie.txt"
-+#define BRCMF_PCIE_4366_FW_NAME			"brcm/brcmfmac4366b-pcie.bin"
-+#define BRCMF_PCIE_4366_NVRAM_NAME		"brcm/brcmfmac4366b-pcie.txt"
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
- 
-@@ -204,6 +208,10 @@ MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME
- MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4358_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4358_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4365_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4365_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4366_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4366_NVRAM_NAME);
- 
- 
- struct brcmf_pcie_console {
-@@ -1440,6 +1448,14 @@ static int brcmf_pcie_get_fwnames(struct
- 		fw_name = BRCMF_PCIE_4358_FW_NAME;
- 		nvram_name = BRCMF_PCIE_4358_NVRAM_NAME;
- 		break;
-+	case BRCM_CC_4365_CHIP_ID:
-+		fw_name = BRCMF_PCIE_4365_FW_NAME;
-+		nvram_name = BRCMF_PCIE_4365_NVRAM_NAME;
-+		break;
-+	case BRCM_CC_4366_CHIP_ID:
-+		fw_name = BRCMF_PCIE_4366_FW_NAME;
-+		nvram_name = BRCMF_PCIE_4366_NVRAM_NAME;
-+		break;
- 	default:
- 		brcmf_err("Unsupported chip 0x%04x\n", devinfo->ci->chip);
- 		return -ENODEV;
-@@ -1973,6 +1989,12 @@ static struct pci_device_id brcmf_pcie_d
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
- 	{ /* end: all zeroes */ }
- };
- 
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -48,6 +48,8 @@
- #define BRCM_CC_43570_CHIP_ID		43570
- #define BRCM_CC_4358_CHIP_ID		0x4358
- #define BRCM_CC_43602_CHIP_ID		43602
-+#define BRCM_CC_4365_CHIP_ID		0x4365
-+#define BRCM_CC_4366_CHIP_ID		0x4366
- 
- /* USB Device IDs */
- #define BRCM_USB_43143_DEVICE_ID	0xbd1e
-@@ -67,6 +69,13 @@
- #define BRCM_PCIE_43602_2G_DEVICE_ID	0x43bb
- #define BRCM_PCIE_43602_5G_DEVICE_ID	0x43bc
- #define BRCM_PCIE_43602_RAW_DEVICE_ID	43602
-+#define BRCM_PCIE_4365_DEVICE_ID	0x43ca
-+#define BRCM_PCIE_4365_2G_DEVICE_ID	0x43cb
-+#define BRCM_PCIE_4365_5G_DEVICE_ID	0x43cc
-+#define BRCM_PCIE_4366_DEVICE_ID	0x43c3
-+#define BRCM_PCIE_4366_2G_DEVICE_ID	0x43c4
-+#define BRCM_PCIE_4366_5G_DEVICE_ID	0x43c5
-+
- 
- /* brcmsmac IDs */
- #define BCM4313_D11N2G_ID	0x4727	/* 4313 802.11n 2.4G device */
diff --git a/package/kernel/mac80211/patches/370-0015-brcmfmac-Fix-TDLS-setup-by-properly-handling-p2p-noi.patch b/package/kernel/mac80211/patches/370-0015-brcmfmac-Fix-TDLS-setup-by-properly-handling-p2p-noi.patch
deleted file mode 100644
index d33c803ab5c06748a109ee38b845c8efa137441a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0015-brcmfmac-Fix-TDLS-setup-by-properly-handling-p2p-noi.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:18 +0200
-Subject: [PATCH] brcmfmac: Fix TDLS setup by properly handling p2p noif.
-
-There is a workaround needed for p2p device setup which breaks tdls
-functionality. This patch fixes that by properly signalling fweh that
-p2p device setup is ongoing.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -188,11 +188,13 @@ static void brcmf_fweh_handle_if_event(s
- 
- 	/* The P2P Device interface event must not be ignored contrary to what
- 	 * firmware tells us. Older firmware uses p2p noif, with sta role.
--	 * This should be accepted.
-+	 * This should be accepted when p2pdev_setup is ongoing. TDLS setup will
-+	 * use the same ifevent and should be ignored.
- 	 */
- 	is_p2pdev = ((ifevent->flags & BRCMF_E_IF_FLAG_NOIF) &&
- 		     (ifevent->role == BRCMF_E_IF_ROLE_P2P_CLIENT ||
--		      ifevent->role == BRCMF_E_IF_ROLE_STA));
-+		      ((ifevent->role == BRCMF_E_IF_ROLE_STA) &&
-+		       (drvr->fweh.p2pdev_setup_ongoing))));
- 	if (!is_p2pdev && (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
- 		brcmf_dbg(EVENT, "event can be ignored\n");
- 		return;
-@@ -316,6 +318,17 @@ event_free:
- }
- 
- /**
-+ * brcmf_fweh_p2pdev_setup() - P2P device setup ongoing (or not).
-+ *
-+ * @ifp: ifp on which setup is taking place or finished.
-+ * @ongoing: p2p device setup in progress (or not).
-+ */
-+void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing)
-+{
-+	ifp->drvr->fweh.p2pdev_setup_ongoing = ongoing;
-+}
-+
-+/**
-  * brcmf_fweh_attach() - initialize firmware event handling.
-  *
-  * @drvr: driver information object.
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
-@@ -230,12 +230,14 @@ typedef int (*brcmf_fweh_handler_t)(stru
- /**
-  * struct brcmf_fweh_info - firmware event handling information.
-  *
-+ * @p2pdev_setup_ongoing: P2P device creation in progress.
-  * @event_work: event worker.
-  * @evt_q_lock: lock for event queue protection.
-  * @event_q: event queue.
-  * @evt_handler: registered event handlers.
-  */
- struct brcmf_fweh_info {
-+	bool p2pdev_setup_ongoing;
- 	struct work_struct event_work;
- 	spinlock_t evt_q_lock;
- 	struct list_head event_q;
-@@ -255,6 +257,7 @@ void brcmf_fweh_unregister(struct brcmf_
- int brcmf_fweh_activate_events(struct brcmf_if *ifp);
- void brcmf_fweh_process_event(struct brcmf_pub *drvr,
- 			      struct brcmf_event *event_packet);
-+void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing);
- 
- static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
- 					  struct sk_buff *skb)
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2084,11 +2084,13 @@ static struct wireless_dev *brcmf_p2p_cr
- 	brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
- 
- 	brcmf_cfg80211_arm_vif_event(p2p->cfg, p2p_vif);
-+	brcmf_fweh_p2pdev_setup(pri_ifp, true);
- 
- 	/* Initialize P2P Discovery in the firmware */
- 	err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
- 	if (err < 0) {
- 		brcmf_err("set p2p_disc error\n");
-+		brcmf_fweh_p2pdev_setup(pri_ifp, false);
- 		brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL);
- 		goto fail;
- 	}
-@@ -2097,6 +2099,7 @@ static struct wireless_dev *brcmf_p2p_cr
- 	err = brcmf_cfg80211_wait_vif_event_timeout(p2p->cfg, BRCMF_E_IF_ADD,
- 						    msecs_to_jiffies(1500));
- 	brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL);
-+	brcmf_fweh_p2pdev_setup(pri_ifp, false);
- 	if (!err) {
- 		brcmf_err("timeout occurred\n");
- 		err = -EIO;
-@@ -2393,6 +2396,8 @@ s32 brcmf_p2p_attach(struct brcmf_cfg802
- 		memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
- 		brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
- 
-+		brcmf_fweh_p2pdev_setup(pri_ifp, true);
-+
- 		/* Initialize P2P Discovery in the firmware */
- 		err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
- 		if (err < 0) {
-@@ -2419,8 +2424,9 @@ s32 brcmf_p2p_attach(struct brcmf_cfg802
- 		INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
- 		init_completion(&p2p->afx_hdl.act_frm_scan);
- 		init_completion(&p2p->wait_next_af);
--	}
- exit:
-+		brcmf_fweh_p2pdev_setup(pri_ifp, false);
-+	}
- 	return err;
- }
- 
diff --git a/package/kernel/mac80211/patches/370-0016-brcmfmac-Accept-events-when-TDLS-is-used-in-combinat.patch b/package/kernel/mac80211/patches/370-0016-brcmfmac-Accept-events-when-TDLS-is-used-in-combinat.patch
deleted file mode 100644
index b880078835a5746eb158e8ac2cb63b6ed6ab9ec2..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/370-0016-brcmfmac-Accept-events-when-TDLS-is-used-in-combinat.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Fri, 18 Sep 2015 22:08:19 +0200
-Subject: [PATCH] brcmfmac: Accept events when TDLS is used in combination with
- p2p.
-
-TDLS events are mapped back to primary interface but when p2p is in
-use then this fails because the check was incorrect by checking
-bsscfg number. Which can be different when a p2p device has been
-created.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -300,8 +300,7 @@ static void brcmf_fweh_event_worker(stru
- 			goto event_free;
- 		}
- 
--		if ((event->code == BRCMF_E_TDLS_PEER_EVENT) &&
--		    (emsg.bsscfgidx == 1))
-+		if (event->code == BRCMF_E_TDLS_PEER_EVENT)
- 			ifp = drvr->iflist[0];
- 		else
- 			ifp = drvr->iflist[emsg.bsscfgidx];
diff --git a/package/kernel/mac80211/patches/371-brcmfmac-include-linux-atomic.h.patch b/package/kernel/mac80211/patches/371-brcmfmac-include-linux-atomic.h.patch
deleted file mode 100644
index 9311a9dbe4926ddbf24942a71663917997fc045f..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/371-brcmfmac-include-linux-atomic.h.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 19 Sep 2015 12:47:20 +0200
-Subject: [PATCH] brcmfmac: include linux/atomic.h
-
-brcmfmac uses atomic_or() and other atomic_* functions, but does not
-include linux/atomic.h. This file gets included by some other header
-file so this normally does not cause problems.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -15,6 +15,7 @@
-  */
- 
- #include <linux/types.h>
-+#include <linux/atomic.h>
- #include <linux/kernel.h>
- #include <linux/kthread.h>
- #include <linux/printk.h>
diff --git a/package/kernel/mac80211/patches/372-0001-brcmfmac-expose-device-memory-to-devcoredump-subsyst.patch b/package/kernel/mac80211/patches/372-0001-brcmfmac-expose-device-memory-to-devcoredump-subsyst.patch
deleted file mode 100644
index cf3f27887191e7b06dc2dd8a25b491ec77cb90be..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0001-brcmfmac-expose-device-memory-to-devcoredump-subsyst.patch
+++ /dev/null
@@ -1,347 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:11 +0200
-Subject: [PATCH] brcmfmac: expose device memory to devcoredump subsystem
-
-Upon PSM watchdog event received from firmware the driver will obtain
-a memory snapshot of the device and expose it to user-space through
-the devcoredump framework. This will trigger a uevent.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/Kconfig
-+++ b/drivers/net/wireless/brcm80211/Kconfig
-@@ -85,5 +85,6 @@ config BRCM_TRACING
- config BRCMDBG
- 	bool "Broadcom driver debug functions"
- 	depends on BRCMSMAC || BRCMFMAC
-+	select WANT_DEV_COREDUMP
- 	---help---
- 	  Selecting this enables additional code for debug purposes.
---- a/drivers/net/wireless/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bus.h
-@@ -65,6 +65,8 @@ struct brcmf_bus_dcmd {
-  * @rxctl: receive a control response message from dongle.
-  * @gettxq: obtain a reference of bus transmit queue (optional).
-  * @wowl_config: specify if dongle is configured for wowl when going to suspend
-+ * @get_ramsize: obtain size of device memory.
-+ * @get_memdump: obtain device memory dump in provided buffer.
-  *
-  * This structure provides an abstract interface towards the
-  * bus specific driver. For control messages to common driver
-@@ -79,6 +81,8 @@ struct brcmf_bus_ops {
- 	int (*rxctl)(struct device *dev, unsigned char *msg, uint len);
- 	struct pktq * (*gettxq)(struct device *dev);
- 	void (*wowl_config)(struct device *dev, bool enabled);
-+	size_t (*get_ramsize)(struct device *dev);
-+	int (*get_memdump)(struct device *dev, void *data, size_t len);
- };
- 
- 
-@@ -185,6 +189,23 @@ void brcmf_bus_wowl_config(struct brcmf_
- 		bus->ops->wowl_config(bus->dev, enabled);
- }
- 
-+static inline size_t brcmf_bus_get_ramsize(struct brcmf_bus *bus)
-+{
-+	if (!bus->ops->get_ramsize)
-+		return 0;
-+
-+	return bus->ops->get_ramsize(bus->dev);
-+}
-+
-+static inline
-+int brcmf_bus_get_memdump(struct brcmf_bus *bus, void *data, size_t len)
-+{
-+	if (!bus->ops->get_memdump)
-+		return -EOPNOTSUPP;
-+
-+	return bus->ops->get_memdump(bus->dev, data, len);
-+}
-+
- /*
-  * interface functions from common layer
-  */
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -957,8 +957,8 @@ int brcmf_attach(struct device *dev)
- 	drvr->bus_if = dev_get_drvdata(dev);
- 	drvr->bus_if->drvr = drvr;
- 
--	/* create device debugfs folder */
--	brcmf_debugfs_attach(drvr);
-+	/* attach debug facilities */
-+	brcmf_debug_attach(drvr);
- 
- 	/* Attach and link in the protocol */
- 	ret = brcmf_proto_attach(drvr);
-@@ -1155,7 +1155,7 @@ void brcmf_detach(struct device *dev)
- 
- 	brcmf_proto_detach(drvr);
- 
--	brcmf_debugfs_detach(drvr);
-+	brcmf_debug_detach(drvr);
- 	bus_if->drvr = NULL;
- 	kfree(drvr);
- }
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-@@ -16,15 +16,45 @@
- #include <linux/debugfs.h>
- #include <linux/netdevice.h>
- #include <linux/module.h>
-+#include <linux/devcoredump.h>
- 
- #include <brcmu_wifi.h>
- #include <brcmu_utils.h>
- #include "core.h"
- #include "bus.h"
-+#include "fweh.h"
- #include "debug.h"
- 
- static struct dentry *root_folder;
- 
-+static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
-+				      size_t len)
-+{
-+	void *dump;
-+	size_t ramsize;
-+
-+	ramsize = brcmf_bus_get_ramsize(bus);
-+	if (ramsize) {
-+		dump = vzalloc(len + ramsize);
-+		if (!dump)
-+			return -ENOMEM;
-+		memcpy(dump, data, len);
-+		brcmf_bus_get_memdump(bus, dump + len, ramsize);
-+		dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL);
-+	}
-+	return 0;
-+}
-+
-+static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp,
-+					   const struct brcmf_event_msg *evtmsg,
-+					   void *data)
-+{
-+	brcmf_dbg(TRACE, "enter: idx=%d\n", ifp->bssidx);
-+
-+	return brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
-+					  evtmsg->datalen);
-+}
-+
- void brcmf_debugfs_init(void)
- {
- 	root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
-@@ -41,7 +71,7 @@ void brcmf_debugfs_exit(void)
- 	root_folder = NULL;
- }
- 
--int brcmf_debugfs_attach(struct brcmf_pub *drvr)
-+int brcmf_debug_attach(struct brcmf_pub *drvr)
- {
- 	struct device *dev = drvr->bus_if->dev;
- 
-@@ -49,12 +79,18 @@ int brcmf_debugfs_attach(struct brcmf_pu
- 		return -ENODEV;
- 
- 	drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
-+	if (IS_ERR(drvr->dbgfs_dir))
-+		return PTR_ERR(drvr->dbgfs_dir);
- 
--	return PTR_ERR_OR_ZERO(drvr->dbgfs_dir);
-+
-+	return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
-+				   brcmf_debug_psm_watchdog_notify);
- }
- 
--void brcmf_debugfs_detach(struct brcmf_pub *drvr)
-+void brcmf_debug_detach(struct brcmf_pub *drvr)
- {
-+	brcmf_fweh_unregister(drvr, BRCMF_E_PSM_WATCHDOG);
-+
- 	if (!IS_ERR_OR_NULL(drvr->dbgfs_dir))
- 		debugfs_remove_recursive(drvr->dbgfs_dir);
- }
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-@@ -109,8 +109,8 @@ struct brcmf_pub;
- #ifdef DEBUG
- void brcmf_debugfs_init(void);
- void brcmf_debugfs_exit(void);
--int brcmf_debugfs_attach(struct brcmf_pub *drvr);
--void brcmf_debugfs_detach(struct brcmf_pub *drvr);
-+int brcmf_debug_attach(struct brcmf_pub *drvr);
-+void brcmf_debug_detach(struct brcmf_pub *drvr);
- 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));
-@@ -121,11 +121,11 @@ static inline void brcmf_debugfs_init(vo
- static inline void brcmf_debugfs_exit(void)
- {
- }
--static inline int brcmf_debugfs_attach(struct brcmf_pub *drvr)
-+static inline int brcmf_debug_attach(struct brcmf_pub *drvr)
- {
- 	return 0;
- }
--static inline void brcmf_debugfs_detach(struct brcmf_pub *drvr)
-+static inline void brcmf_debug_detach(struct brcmf_pub *drvr)
- {
- }
- static inline
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -448,6 +448,47 @@ brcmf_pcie_copy_mem_todev(struct brcmf_p
- }
- 
- 
-+static void
-+brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
-+			  void *dstaddr, u32 len)
-+{
-+	void __iomem *address = devinfo->tcm + mem_offset;
-+	__le32 *dst32;
-+	__le16 *dst16;
-+	u8 *dst8;
-+
-+	if (((ulong)address & 4) || ((ulong)dstaddr & 4) || (len & 4)) {
-+		if (((ulong)address & 2) || ((ulong)dstaddr & 2) || (len & 2)) {
-+			dst8 = (u8 *)dstaddr;
-+			while (len) {
-+				*dst8 = ioread8(address);
-+				address++;
-+				dst8++;
-+				len--;
-+			}
-+		} else {
-+			len = len / 2;
-+			dst16 = (__le16 *)dstaddr;
-+			while (len) {
-+				*dst16 = cpu_to_le16(ioread16(address));
-+				address += 2;
-+				dst16++;
-+				len--;
-+			}
-+		}
-+	} else {
-+		len = len / 4;
-+		dst32 = (__le32 *)dstaddr;
-+		while (len) {
-+			*dst32 = cpu_to_le32(ioread32(address));
-+			address += 4;
-+			dst32++;
-+			len--;
-+		}
-+	}
-+}
-+
-+
- #define WRITECC32(devinfo, reg, value) brcmf_pcie_write_reg32(devinfo, \
- 		CHIPCREGOFFS(reg), value)
- 
-@@ -1352,12 +1393,36 @@ static void brcmf_pcie_wowl_config(struc
- }
- 
- 
-+static size_t brcmf_pcie_get_ramsize(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
-+
-+	return devinfo->ci->ramsize - devinfo->ci->srsize;
-+}
-+
-+
-+static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
-+
-+	brcmf_dbg(PCIE, "dump at 0x%08X: len=%zu\n", devinfo->ci->rambase, len);
-+	brcmf_pcie_copy_dev_tomem(devinfo, devinfo->ci->rambase, data, len);
-+	return 0;
-+}
-+
-+
- static struct brcmf_bus_ops brcmf_pcie_bus_ops = {
- 	.txdata = brcmf_pcie_tx,
- 	.stop = brcmf_pcie_down,
- 	.txctl = brcmf_pcie_tx_ctlpkt,
- 	.rxctl = brcmf_pcie_rx_ctlpkt,
- 	.wowl_config = brcmf_pcie_wowl_config,
-+	.get_ramsize = brcmf_pcie_get_ramsize,
-+	.get_memdump = brcmf_pcie_get_memdump,
- };
- 
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -3539,6 +3539,51 @@ done:
- 	return err;
- }
- 
-+static size_t brcmf_sdio_bus_get_ramsize(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
-+	struct brcmf_sdio *bus = sdiodev->bus;
-+
-+	return bus->ci->ramsize - bus->ci->srsize;
-+}
-+
-+static int brcmf_sdio_bus_get_memdump(struct device *dev, void *data,
-+				      size_t mem_size)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
-+	struct brcmf_sdio *bus = sdiodev->bus;
-+	int err;
-+	int address;
-+	int offset;
-+	int len;
-+
-+	brcmf_dbg(INFO, "dump at 0x%08x: size=%zu\n", bus->ci->rambase,
-+		  mem_size);
-+
-+	address = bus->ci->rambase;
-+	offset = err = 0;
-+	sdio_claim_host(sdiodev->func[1]);
-+	while (offset < mem_size) {
-+		len = ((offset + MEMBLOCK) < mem_size) ? MEMBLOCK :
-+		      mem_size - offset;
-+		err = brcmf_sdiod_ramrw(sdiodev, false, address, data, len);
-+		if (err) {
-+			brcmf_err("error %d on reading %d membytes at 0x%08x\n",
-+				  err, len, address);
-+			goto done;
-+		}
-+		data += len;
-+		offset += len;
-+		address += len;
-+	}
-+
-+done:
-+	sdio_release_host(sdiodev->func[1]);
-+	return err;
-+}
-+
- void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus)
- {
- 	if (!bus->dpc_triggered) {
-@@ -3987,7 +4032,9 @@ static struct brcmf_bus_ops brcmf_sdio_b
- 	.txctl = brcmf_sdio_bus_txctl,
- 	.rxctl = brcmf_sdio_bus_rxctl,
- 	.gettxq = brcmf_sdio_bus_gettxq,
--	.wowl_config = brcmf_sdio_wowl_config
-+	.wowl_config = brcmf_sdio_wowl_config,
-+	.get_ramsize = brcmf_sdio_bus_get_ramsize,
-+	.get_memdump = brcmf_sdio_bus_get_memdump,
- };
- 
- static void brcmf_sdio_firmware_callback(struct device *dev,
diff --git a/package/kernel/mac80211/patches/372-0002-brcmfmac-Fix-race-condition-between-USB-probe-load-a.patch b/package/kernel/mac80211/patches/372-0002-brcmfmac-Fix-race-condition-between-USB-probe-load-a.patch
deleted file mode 100644
index 5b82bcac9af9caea595e43962f696716fd4aaa58..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0002-brcmfmac-Fix-race-condition-between-USB-probe-load-a.patch
+++ /dev/null
@@ -1,108 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:12 +0200
-Subject: [PATCH] brcmfmac: Fix race condition between USB probe/load and
- disconnect.
-
-When a USB device gets disconnected due to for example removal
-then it is possible that it is still in the loading phase due to
-the asynchronous load routines. These routines can then possible
-access memory which has been freed. Fix this by mutex locking the
-device init phase.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-@@ -144,6 +144,7 @@ struct brcmf_usbdev_info {
- 
- 	struct usb_device *usbdev;
- 	struct device *dev;
-+	struct mutex dev_init_lock;
- 
- 	int ctl_in_pipe, ctl_out_pipe;
- 	struct urb *ctl_urb; /* URB for control endpoint */
-@@ -1204,6 +1205,8 @@ static void brcmf_usb_probe_phase2(struc
- 	int ret;
- 
- 	brcmf_dbg(USB, "Start fw downloading\n");
-+
-+	devinfo = bus->bus_priv.usb->devinfo;
- 	ret = check_file(fw->data);
- 	if (ret < 0) {
- 		brcmf_err("invalid firmware\n");
-@@ -1211,7 +1214,6 @@ static void brcmf_usb_probe_phase2(struc
- 		goto error;
- 	}
- 
--	devinfo = bus->bus_priv.usb->devinfo;
- 	devinfo->image = fw->data;
- 	devinfo->image_len = fw->size;
- 
-@@ -1224,9 +1226,11 @@ static void brcmf_usb_probe_phase2(struc
- 	if (ret)
- 		goto error;
- 
-+	mutex_unlock(&devinfo->dev_init_lock);
- 	return;
- error:
- 	brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret);
-+	mutex_unlock(&devinfo->dev_init_lock);
- 	device_release_driver(dev);
- }
- 
-@@ -1264,6 +1268,7 @@ static int brcmf_usb_probe_cb(struct brc
- 		if (ret)
- 			goto fail;
- 		/* we are done */
-+		mutex_unlock(&devinfo->dev_init_lock);
- 		return 0;
- 	}
- 	bus->chip = bus_pub->devid;
-@@ -1317,6 +1322,12 @@ brcmf_usb_probe(struct usb_interface *in
- 
- 	devinfo->usbdev = usb;
- 	devinfo->dev = &usb->dev;
-+	/* Take an init lock, to protect for disconnect while still loading.
-+	 * Necessary because of the asynchronous firmware load construction
-+	 */
-+	mutex_init(&devinfo->dev_init_lock);
-+	mutex_lock(&devinfo->dev_init_lock);
-+
- 	usb_set_intfdata(intf, devinfo);
- 
- 	/* Check that the device supports only one configuration */
-@@ -1391,6 +1402,7 @@ brcmf_usb_probe(struct usb_interface *in
- 	return 0;
- 
- fail:
-+	mutex_unlock(&devinfo->dev_init_lock);
- 	kfree(devinfo);
- 	usb_set_intfdata(intf, NULL);
- 	return ret;
-@@ -1403,8 +1415,19 @@ brcmf_usb_disconnect(struct usb_interfac
- 
- 	brcmf_dbg(USB, "Enter\n");
- 	devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
--	brcmf_usb_disconnect_cb(devinfo);
--	kfree(devinfo);
-+
-+	if (devinfo) {
-+		mutex_lock(&devinfo->dev_init_lock);
-+		/* Make sure that devinfo still exists. Firmware probe routines
-+		 * may have released the device and cleared the intfdata.
-+		 */
-+		if (!usb_get_intfdata(intf))
-+			goto done;
-+
-+		brcmf_usb_disconnect_cb(devinfo);
-+		kfree(devinfo);
-+	}
-+done:
- 	brcmf_dbg(USB, "Exit\n");
- }
- 
diff --git a/package/kernel/mac80211/patches/372-0003-brcmfmac-rename-firmware_path-to-alternative_fw_path.patch b/package/kernel/mac80211/patches/372-0003-brcmfmac-rename-firmware_path-to-alternative_fw_path.patch
deleted file mode 100644
index f877c232a2f8f6808a2bd04b0344133dd9efe3ed..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0003-brcmfmac-rename-firmware_path-to-alternative_fw_path.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:13 +0200
-Subject: [PATCH] brcmfmac: rename firmware_path to alternative_fw_path
-
-In brcmfmac the module parameter "firmware_path" is used as an
-alternative relative path under the search path used by firmware_class
-or ueventhelper. Rename the parameter to alternative_fw_path to avoid
-confusion.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -28,7 +28,7 @@
- #define BRCMF_FW_NVRAM_PCIEDEV_LEN		10	/* pcie/1/4/ + \0 */
- 
- char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
--module_param_string(firmware_path, brcmf_firmware_path,
-+module_param_string(alternative_fw_path, brcmf_firmware_path,
- 		    BRCMF_FW_PATH_LEN, 0440);
- 
- enum nvram_parser_state {
diff --git a/package/kernel/mac80211/patches/372-0004-brcmfmac-remove-conversational-comment.patch b/package/kernel/mac80211/patches/372-0004-brcmfmac-remove-conversational-comment.patch
deleted file mode 100644
index 0bfd9effc8147fa8dc3f49e09e9b8ee671caf5de..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0004-brcmfmac-remove-conversational-comment.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:14 +0200
-Subject: [PATCH] brcmfmac: remove conversational comment
-
-Removing a comment that was only useful during the review of
-the change that introduced it and which should never have been
-submitted.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
-@@ -873,9 +873,6 @@ brcmf_msgbuf_process_txstatus(struct brc
- 	commonring = msgbuf->flowrings[flowid];
- 	atomic_dec(&commonring->outstanding_tx);
- 
--	/* Hante: i believe this was a bug as tx_status->msg.ifidx was used
--	 * in brcmf_txfinalize as index in drvr->iflist. Can you confirm/deny?
--	 */
- 	brcmf_txfinalize(brcmf_get_ifp(msgbuf->drvr, tx_status->msg.ifidx),
- 			 skb, true);
- }
diff --git a/package/kernel/mac80211/patches/372-0005-brcmfmac-Rework-p2p-attach-use-single-method-for-p2p.patch b/package/kernel/mac80211/patches/372-0005-brcmfmac-Rework-p2p-attach-use-single-method-for-p2p.patch
deleted file mode 100644
index 3ffada8d562a841ae17b77ac02bfd613250f7a54..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0005-brcmfmac-Rework-p2p-attach-use-single-method-for-p2p.patch
+++ /dev/null
@@ -1,226 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:15 +0200
-Subject: [PATCH] brcmfmac: Rework p2p attach, use single method for p2p dev
- creation.
-
-When module param p2pon is used a p2p device is created at init.
-This patch reworks how this is done by using the same method as
-for a dynamically (by user space) created p2p device.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -6237,6 +6237,17 @@ struct brcmf_cfg80211_info *brcmf_cfg802
- 		else
- 			*cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
- 	}
-+	/* p2p might require that "if-events" get processed by fweh. So
-+	 * activate the already registered event handlers now and activate
-+	 * the rest when initialization has completed. drvr->config needs to
-+	 * be assigned before activating events.
-+	 */
-+	drvr->config = cfg;
-+	err = brcmf_fweh_activate_events(ifp);
-+	if (err) {
-+		brcmf_err("FWEH activation failed (%d)\n", err);
-+		goto wiphy_unreg_out;
-+	}
- 
- 	err = brcmf_p2p_attach(cfg, p2pdev_forced);
- 	if (err) {
-@@ -6259,6 +6270,13 @@ struct brcmf_cfg80211_info *brcmf_cfg802
- 				    brcmf_notify_tdls_peer_event);
- 	}
- 
-+	/* (re-) activate FWEH event handling */
-+	err = brcmf_fweh_activate_events(ifp);
-+	if (err) {
-+		brcmf_err("FWEH activation failed (%d)\n", err);
-+		goto wiphy_unreg_out;
-+	}
-+
- 	return cfg;
- 
- wiphy_unreg_out:
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -828,8 +828,8 @@ struct brcmf_if *brcmf_add_if(struct brc
- 	} else {
- 		brcmf_dbg(INFO, "allocate netdev interface\n");
- 		/* Allocate netdev, including space for private structure */
--		ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN,
--				    ether_setup);
-+		ndev = alloc_netdev(sizeof(*ifp), is_p2pdev ? "p2p%d" : name,
-+				    NET_NAME_UNKNOWN, ether_setup);
- 		if (!ndev)
- 			return ERR_PTR(-ENOMEM);
- 
-@@ -1021,12 +1021,7 @@ int brcmf_bus_start(struct device *dev)
- 	if (IS_ERR(ifp))
- 		return PTR_ERR(ifp);
- 
--	if (brcmf_p2p_enable)
--		p2p_ifp = brcmf_add_if(drvr, 1, 0, false, "p2p%d", NULL);
--	else
--		p2p_ifp = NULL;
--	if (IS_ERR(p2p_ifp))
--		p2p_ifp = NULL;
-+	p2p_ifp = NULL;
- 
- 	/* signal bus ready */
- 	brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
-@@ -1060,11 +1055,13 @@ int brcmf_bus_start(struct device *dev)
- 		goto fail;
- 	}
- 
--	ret = brcmf_fweh_activate_events(ifp);
--	if (ret < 0)
--		goto fail;
--
- 	ret = brcmf_net_attach(ifp, false);
-+
-+	if ((!ret) && (brcmf_p2p_enable)) {
-+		p2p_ifp = drvr->iflist[1];
-+		if (p2p_ifp)
-+			ret = brcmf_net_p2p_attach(p2p_ifp);
-+	}
- fail:
- 	if (ret < 0) {
- 		brcmf_err("failed: %d\n", ret);
-@@ -1076,20 +1073,12 @@ fail:
- 			brcmf_fws_del_interface(ifp);
- 			brcmf_fws_deinit(drvr);
- 		}
--		if (drvr->iflist[0]) {
-+		if (ifp)
- 			brcmf_net_detach(ifp->ndev);
--			drvr->iflist[0] = NULL;
--		}
--		if (p2p_ifp) {
-+		if (p2p_ifp)
- 			brcmf_net_detach(p2p_ifp->ndev);
--			drvr->iflist[1] = NULL;
--		}
- 		return ret;
- 	}
--	if ((brcmf_p2p_enable) && (p2p_ifp))
--		if (brcmf_net_p2p_attach(p2p_ifp) < 0)
--			brcmf_p2p_enable = 0;
--
- 	return 0;
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -213,7 +213,8 @@ static void brcmf_fweh_handle_if_event(s
- 				   is_p2pdev, emsg->ifname, emsg->addr);
- 		if (IS_ERR(ifp))
- 			return;
--		brcmf_fws_add_interface(ifp);
-+		if (!is_p2pdev)
-+			brcmf_fws_add_interface(ifp);
- 		if (!drvr->fweh.evt_handler[BRCMF_E_IF])
- 			if (brcmf_net_attach(ifp, false) < 0)
- 				return;
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2350,83 +2350,30 @@ void brcmf_p2p_stop_device(struct wiphy
-  * brcmf_p2p_attach() - attach for P2P.
-  *
-  * @cfg: driver private data for cfg80211 interface.
-+ * @p2pdev_forced: create p2p device interface at attach.
-  */
- s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
- {
--	struct brcmf_if *pri_ifp;
--	struct brcmf_if *p2p_ifp;
--	struct brcmf_cfg80211_vif *p2p_vif;
- 	struct brcmf_p2p_info *p2p;
--	struct brcmf_pub *drvr;
--	s32 bssidx;
-+	struct brcmf_if *pri_ifp;
- 	s32 err = 0;
-+	void *err_ptr;
- 
- 	p2p = &cfg->p2p;
- 	p2p->cfg = cfg;
- 
--	drvr = cfg->pub;
--
--	pri_ifp = brcmf_get_ifp(drvr, 0);
-+	pri_ifp = brcmf_get_ifp(cfg->pub, 0);
- 	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
- 
- 	if (p2pdev_forced) {
--		p2p_ifp = drvr->iflist[1];
-+		err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
-+		if (IS_ERR(err_ptr)) {
-+			brcmf_err("P2P device creation failed.\n");
-+			err = PTR_ERR(err_ptr);
-+		}
- 	} else {
--		p2p_ifp = NULL;
- 		p2p->p2pdev_dynamically = true;
- 	}
--	if (p2p_ifp) {
--		p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
--					  false);
--		if (IS_ERR(p2p_vif)) {
--			brcmf_err("could not create discovery vif\n");
--			err = -ENOMEM;
--			goto exit;
--		}
--
--		p2p_vif->ifp = p2p_ifp;
--		p2p_ifp->vif = p2p_vif;
--		p2p_vif->wdev.netdev = p2p_ifp->ndev;
--		p2p_ifp->ndev->ieee80211_ptr = &p2p_vif->wdev;
--		SET_NETDEV_DEV(p2p_ifp->ndev, wiphy_dev(cfg->wiphy));
--
--		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
--
--		brcmf_p2p_generate_bss_mac(p2p, NULL);
--		memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
--		brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
--
--		brcmf_fweh_p2pdev_setup(pri_ifp, true);
--
--		/* Initialize P2P Discovery in the firmware */
--		err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
--		if (err < 0) {
--			brcmf_err("set p2p_disc error\n");
--			brcmf_free_vif(p2p_vif);
--			goto exit;
--		}
--		/* obtain bsscfg index for P2P discovery */
--		err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
--		if (err < 0) {
--			brcmf_err("retrieving discover bsscfg index failed\n");
--			brcmf_free_vif(p2p_vif);
--			goto exit;
--		}
--		/* Verify that firmware uses same bssidx as driver !! */
--		if (p2p_ifp->bssidx != bssidx) {
--			brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
--				  bssidx, p2p_ifp->bssidx);
--			brcmf_free_vif(p2p_vif);
--			goto exit;
--		}
--
--		init_completion(&p2p->send_af_done);
--		INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
--		init_completion(&p2p->afx_hdl.act_frm_scan);
--		init_completion(&p2p->wait_next_af);
--exit:
--		brcmf_fweh_p2pdev_setup(pri_ifp, false);
--	}
- 	return err;
- }
- 
diff --git a/package/kernel/mac80211/patches/372-0006-brcmfmac-Fix-station-info-rate-information.patch b/package/kernel/mac80211/patches/372-0006-brcmfmac-Fix-station-info-rate-information.patch
deleted file mode 100644
index 0abcf1eef482240a6d4cd9101e0a58b1e52f4abd..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0006-brcmfmac-Fix-station-info-rate-information.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:16 +0200
-Subject: [PATCH] brcmfmac: Fix station info rate information.
-
-Txrate and rxrate in get_station got assigned first with value
-in kbps and then divided by 100 to get it in 100kbps unit. The
-problem with that is that type of rate is u16 which resulted
-in incorrect values for high data rate values.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -2477,13 +2477,13 @@ brcmf_cfg80211_get_station(struct wiphy
- 		sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts);
- 		if (sinfo->tx_packets) {
- 			sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE);
--			sinfo->txrate.legacy = le32_to_cpu(sta_info_le.tx_rate);
--			sinfo->txrate.legacy /= 100;
-+			sinfo->txrate.legacy =
-+				le32_to_cpu(sta_info_le.tx_rate) / 100;
- 		}
- 		if (sinfo->rx_packets) {
- 			sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE);
--			sinfo->rxrate.legacy = le32_to_cpu(sta_info_le.rx_rate);
--			sinfo->rxrate.legacy /= 100;
-+			sinfo->rxrate.legacy =
-+				le32_to_cpu(sta_info_le.rx_rate) / 100;
- 		}
- 		if (le16_to_cpu(sta_info_le.ver) >= 4) {
- 			sinfo->filled |= BIT(NL80211_STA_INFO_TX_BYTES);
diff --git a/package/kernel/mac80211/patches/372-0007-brcmfmac-Add-RSSI-information-to-get_station.patch b/package/kernel/mac80211/patches/372-0007-brcmfmac-Add-RSSI-information-to-get_station.patch
deleted file mode 100644
index bb03d679dfc1a72101321a5ca30d6e32165d69d3..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0007-brcmfmac-Add-RSSI-information-to-get_station.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:17 +0200
-Subject: [PATCH] brcmfmac: Add RSSI information to get_station.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -2431,6 +2431,9 @@ brcmf_cfg80211_get_station(struct wiphy
- 	struct brcmf_sta_info_le sta_info_le;
- 	u32 sta_flags;
- 	u32 is_tdls_peer;
-+	s32 total_rssi;
-+	s32 count_rssi;
-+	u32 i;
- 
- 	brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
- 	if (!check_vif_up(ifp->vif))
-@@ -2491,6 +2494,26 @@ brcmf_cfg80211_get_station(struct wiphy
- 			sinfo->filled |= BIT(NL80211_STA_INFO_RX_BYTES);
- 			sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
- 		}
-+		total_rssi = 0;
-+		count_rssi = 0;
-+		for (i = 0; i < BRCMF_ANT_MAX; i++) {
-+			if (sta_info_le.rssi[i]) {
-+				sinfo->chain_signal_avg[count_rssi] =
-+					sta_info_le.rssi[i];
-+				sinfo->chain_signal[count_rssi] =
-+					sta_info_le.rssi[i];
-+				total_rssi += sta_info_le.rssi[i];
-+				count_rssi++;
-+			}
-+		}
-+		if (count_rssi) {
-+			sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL);
-+			sinfo->chains = count_rssi;
-+
-+			sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
-+			total_rssi /= count_rssi;
-+			sinfo->signal = total_rssi;
-+		}
- 	}
- done:
- 	brcmf_dbg(TRACE, "Exit\n");
diff --git a/package/kernel/mac80211/patches/372-0008-brcmfmac-Add-dump_station-support-to-cfg80221-ops.patch b/package/kernel/mac80211/patches/372-0008-brcmfmac-Add-dump_station-support-to-cfg80221-ops.patch
deleted file mode 100644
index a6bafd24979928543f1a55a0ad4fc6e5c3b85f47..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0008-brcmfmac-Add-dump_station-support-to-cfg80221-ops.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:18 +0200
-Subject: [PATCH] brcmfmac: Add dump_station support to cfg80221 ops.
-
-With this feature it becomes possible to request a station
-assoc list.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -2520,6 +2520,35 @@ done:
- 	return err;
- }
- 
-+static int
-+brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
-+			    int idx, u8 *mac, struct station_info *sinfo)
-+{
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_if *ifp = netdev_priv(ndev);
-+	s32 err;
-+
-+	brcmf_dbg(TRACE, "Enter, idx %d\n", idx);
-+
-+	if (idx == 0) {
-+		cfg->assoclist.count = cpu_to_le32(BRCMF_MAX_ASSOCLIST);
-+		err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_ASSOCLIST,
-+					     &cfg->assoclist,
-+					     sizeof(cfg->assoclist));
-+		if (err) {
-+			brcmf_err("BRCMF_C_GET_ASSOCLIST unsupported, err=%d\n",
-+				  err);
-+			cfg->assoclist.count = 0;
-+			return -EOPNOTSUPP;
-+		}
-+	}
-+	if (idx < le32_to_cpu(cfg->assoclist.count)) {
-+		memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN);
-+		return brcmf_cfg80211_get_station(wiphy, ndev, mac, sinfo);
-+	}
-+	return -ENOENT;
-+}
-+
- static s32
- brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
- 			   bool enabled, s32 timeout)
-@@ -4619,6 +4648,7 @@ static struct cfg80211_ops wl_cfg80211_o
- 	.join_ibss = brcmf_cfg80211_join_ibss,
- 	.leave_ibss = brcmf_cfg80211_leave_ibss,
- 	.get_station = brcmf_cfg80211_get_station,
-+	.dump_station = brcmf_cfg80211_dump_station,
- 	.set_tx_power = brcmf_cfg80211_set_tx_power,
- 	.get_tx_power = brcmf_cfg80211_get_tx_power,
- 	.add_key = brcmf_cfg80211_add_key,
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-@@ -407,6 +407,7 @@ struct brcmf_cfg80211_info {
- 	struct brcmu_d11inf d11inf;
- 	bool wowl_enabled;
- 	u32 pre_wowl_pmmode;
-+	struct brcmf_assoclist_le assoclist;
- };
- 
- /**
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
-@@ -72,6 +72,7 @@
- #define BRCMF_C_GET_BSS_INFO			136
- #define BRCMF_C_GET_BANDLIST			140
- #define BRCMF_C_SET_SCB_TIMEOUT			158
-+#define BRCMF_C_GET_ASSOCLIST			159
- #define BRCMF_C_GET_PHYLIST			180
- #define BRCMF_C_SET_SCAN_CHANNEL_TIME		185
- #define BRCMF_C_SET_SCAN_UNASSOC_TIME		187
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-@@ -119,6 +119,8 @@
- #define BRCMF_COUNTRY_BUF_SZ		4
- #define BRCMF_ANT_MAX			4
- 
-+#define BRCMF_MAX_ASSOCLIST		128
-+
- /* join preference types for join_pref iovar */
- enum brcmf_join_pref_types {
- 	BRCMF_JOIN_PREF_RSSI = 1,
-@@ -621,4 +623,15 @@ struct brcmf_rev_info_le {
- 	__le32 nvramrev;
- };
- 
-+/**
-+ * struct brcmf_assoclist_le - request assoc list.
-+ *
-+ * @count: indicates number of stations.
-+ * @mac: MAC addresses of stations.
-+ */
-+struct brcmf_assoclist_le {
-+	__le32 count;
-+	u8 mac[BRCMF_MAX_ASSOCLIST][ETH_ALEN];
-+};
-+
- #endif /* FWIL_TYPES_H_ */
diff --git a/package/kernel/mac80211/patches/372-0009-brcmfmac-Move-brcmf_c_preinit_dcmds-prototype-to-cor.patch b/package/kernel/mac80211/patches/372-0009-brcmfmac-Move-brcmf_c_preinit_dcmds-prototype-to-cor.patch
deleted file mode 100644
index dc549040ec609a5f794b1f45998324f96982ed23..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0009-brcmfmac-Move-brcmf_c_preinit_dcmds-prototype-to-cor.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:19 +0200
-Subject: [PATCH] brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct
- file.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/common.h
-@@ -17,4 +17,7 @@
- 
- extern const u8 ALLFFMAC[ETH_ALEN];
- 
-+/* Sets dongle media info (drv_version, mac address). */
-+int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
-+
- #endif /* BRCMFMAC_COMMON_H */
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -33,6 +33,7 @@
- #include "feature.h"
- #include "proto.h"
- #include "pcie.h"
-+#include "common.h"
- 
- MODULE_AUTHOR("Broadcom Corporation");
- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -214,7 +214,4 @@ void brcmf_txflowblock_if(struct brcmf_i
- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
- void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
- 
--/* Sets dongle media info (drv_version, mac address). */
--int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
--
- #endif /* BRCMFMAC_CORE_H */
diff --git a/package/kernel/mac80211/patches/372-0010-brcmfmac-Remove-unused-state-AP-creating.patch b/package/kernel/mac80211/patches/372-0010-brcmfmac-Remove-unused-state-AP-creating.patch
deleted file mode 100644
index c6a7363aa690cac92b4c6c925cf7f08be92be7fe..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0010-brcmfmac-Remove-unused-state-AP-creating.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:20 +0200
-Subject: [PATCH] brcmfmac: Remove unused state AP creating.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -839,7 +839,6 @@ brcmf_cfg80211_change_iface(struct wiphy
- 			err = brcmf_p2p_ifchange(cfg, BRCMF_FIL_P2P_IF_GO);
- 		}
- 		if (!err) {
--			set_bit(BRCMF_VIF_STATUS_AP_CREATING, &vif->sme_state);
- 			brcmf_dbg(INFO, "IF Type = AP\n");
- 		}
- 	} else {
-@@ -4250,7 +4249,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
- 
- 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
- 	}
--	clear_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state);
- 	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
- 
- exit:
-@@ -4315,7 +4313,6 @@ static int brcmf_cfg80211_stop_ap(struct
- 	}
- 	brcmf_set_mpc(ifp, 1);
- 	brcmf_configure_arp_offload(ifp, true);
--	set_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state);
- 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
- 
- 	return err;
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-@@ -143,7 +143,6 @@ struct brcmf_cfg80211_profile {
-  * @BRCMF_VIF_STATUS_CONNECTING: connect/join in progress.
-  * @BRCMF_VIF_STATUS_CONNECTED: connected/joined succesfully.
-  * @BRCMF_VIF_STATUS_DISCONNECTING: disconnect/disable in progress.
-- * @BRCMF_VIF_STATUS_AP_CREATING: interface configured for AP operation.
-  * @BRCMF_VIF_STATUS_AP_CREATED: AP operation started.
-  */
- enum brcmf_vif_status {
-@@ -151,7 +150,6 @@ enum brcmf_vif_status {
- 	BRCMF_VIF_STATUS_CONNECTING,
- 	BRCMF_VIF_STATUS_CONNECTED,
- 	BRCMF_VIF_STATUS_DISCONNECTING,
--	BRCMF_VIF_STATUS_AP_CREATING,
- 	BRCMF_VIF_STATUS_AP_CREATED
- };
- 
diff --git a/package/kernel/mac80211/patches/372-0011-brcmfmac-Properly-set-carrier-state-of-netdev.patch b/package/kernel/mac80211/patches/372-0011-brcmfmac-Properly-set-carrier-state-of-netdev.patch
deleted file mode 100644
index c0948ded4004aea7cf6d0cf00a2e3e9e9283cd2a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/372-0011-brcmfmac-Properly-set-carrier-state-of-netdev.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 8 Oct 2015 20:33:21 +0200
-Subject: [PATCH] brcmfmac: Properly set carrier state of netdev.
-
-Use the netif_carrier api to correctly set carrier state on the
-different modes.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -4250,6 +4250,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
- 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
- 	}
- 	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
-+	brcmf_net_setcarrier(ifp, true);
- 
- exit:
- 	if ((err) && (!mbss)) {
-@@ -4314,6 +4315,7 @@ static int brcmf_cfg80211_stop_ap(struct
- 	brcmf_set_mpc(ifp, 1);
- 	brcmf_configure_arp_offload(ifp, true);
- 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
-+	brcmf_net_setcarrier(ifp, false);
- 
- 	return err;
- }
-@@ -5023,6 +5025,7 @@ brcmf_notify_connect_status(struct brcmf
- 				&ifp->vif->sme_state);
- 		} else
- 			brcmf_bss_connect_done(cfg, ndev, e, true);
-+		brcmf_net_setcarrier(ifp, true);
- 	} else if (brcmf_is_linkdown(e)) {
- 		brcmf_dbg(CONN, "Linkdown\n");
- 		if (!brcmf_is_ibssmode(ifp->vif)) {
-@@ -5032,6 +5035,7 @@ brcmf_notify_connect_status(struct brcmf
- 		brcmf_init_prof(ndev_to_prof(ndev));
- 		if (ndev != cfg_to_ndev(cfg))
- 			complete(&cfg->vif_disabled);
-+		brcmf_net_setcarrier(ifp, false);
- 	} else if (brcmf_is_nonetwork(cfg, e)) {
- 		if (brcmf_is_ibssmode(ifp->vif))
- 			clear_bit(BRCMF_VIF_STATUS_CONNECTING,
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -635,8 +635,7 @@ static int brcmf_netdev_stop(struct net_
- 
- 	brcmf_cfg80211_down(ndev);
- 
--	/* Set state and stop OS transmissions */
--	netif_stop_queue(ndev);
-+	brcmf_net_setcarrier(ifp, false);
- 
- 	return 0;
- }
-@@ -670,8 +669,8 @@ static int brcmf_netdev_open(struct net_
- 		return -EIO;
- 	}
- 
--	/* Allow transmit calls */
--	netif_start_queue(ndev);
-+	/* Clear, carrier, set when connected or AP mode. */
-+	netif_carrier_off(ndev);
- 	return 0;
- }
- 
-@@ -736,6 +735,24 @@ static void brcmf_net_detach(struct net_
- 		brcmf_cfg80211_free_netdev(ndev);
- }
- 
-+void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
-+{
-+	struct net_device *ndev;
-+
-+	brcmf_dbg(TRACE, "Enter, idx=%d carrier=%d\n", ifp->bssidx, on);
-+
-+	ndev = ifp->ndev;
-+	brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_DISCONNECTED, !on);
-+	if (on) {
-+		if (!netif_carrier_ok(ndev))
-+			netif_carrier_on(ndev);
-+
-+	} else {
-+		if (netif_carrier_ok(ndev))
-+			netif_carrier_off(ndev);
-+	}
-+}
-+
- static int brcmf_net_p2p_open(struct net_device *ndev)
- {
- 	brcmf_dbg(TRACE, "Enter\n");
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -154,10 +154,13 @@ struct brcmf_fws_mac_descriptor;
-  *	netif stopped due to firmware signalling flow control.
-  * @BRCMF_NETIF_STOP_REASON_FLOW:
-  *	netif stopped due to flowring full.
-+ * @BRCMF_NETIF_STOP_REASON_DISCONNECTED:
-+ *	netif stopped due to not being connected (STA mode).
-  */
- enum brcmf_netif_stop_reason {
--	BRCMF_NETIF_STOP_REASON_FWS_FC = 1,
--	BRCMF_NETIF_STOP_REASON_FLOW = 2
-+	BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0),
-+	BRCMF_NETIF_STOP_REASON_FLOW = BIT(1),
-+	BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2)
- };
- 
- /**
-@@ -213,5 +216,6 @@ void brcmf_txflowblock_if(struct brcmf_i
- 			  enum brcmf_netif_stop_reason reason, bool state);
- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
- void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
-+void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
- 
- #endif /* BRCMFMAC_CORE_H */
diff --git a/package/kernel/mac80211/patches/373-brcm80211-Add-support-for-brcm4371.patch b/package/kernel/mac80211/patches/373-brcm80211-Add-support-for-brcm4371.patch
deleted file mode 100644
index ea6fad1cea6fea31b979eee52cb49620e1fe3a6a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/373-brcm80211-Add-support-for-brcm4371.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Eric Caruso <ejcaruso@google.com>
-Date: Wed, 14 Oct 2015 12:34:11 -0700
-Subject: [PATCH] brcm80211: Add support for brcm4371
-
-This is a new Broadcom chip and we should be able to recognize it.
-
-Signed-off-by: Eric Caruso <ejcaruso@google.com>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -682,6 +682,7 @@ static u32 brcmf_chip_tcm_rambase(struct
- 	case BRCM_CC_43570_CHIP_ID:
- 	case BRCM_CC_4358_CHIP_ID:
- 	case BRCM_CC_43602_CHIP_ID:
-+	case BRCM_CC_4371_CHIP_ID:
- 		return 0x180000;
- 	case BRCM_CC_4365_CHIP_ID:
- 	case BRCM_CC_4366_CHIP_ID:
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -59,6 +59,8 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_4365_NVRAM_NAME		"brcm/brcmfmac4365b-pcie.txt"
- #define BRCMF_PCIE_4366_FW_NAME			"brcm/brcmfmac4366b-pcie.bin"
- #define BRCMF_PCIE_4366_NVRAM_NAME		"brcm/brcmfmac4366b-pcie.txt"
-+#define BRCMF_PCIE_4371_FW_NAME			"brcm/brcmfmac4371-pcie.bin"
-+#define BRCMF_PCIE_4371_NVRAM_NAME		"brcm/brcmfmac4371-pcie.txt"
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
- 
-@@ -212,6 +214,8 @@ MODULE_FIRMWARE(BRCMF_PCIE_4365_FW_NAME)
- MODULE_FIRMWARE(BRCMF_PCIE_4365_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4366_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4366_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4371_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4371_NVRAM_NAME);
- 
- 
- struct brcmf_pcie_console {
-@@ -1521,6 +1525,10 @@ static int brcmf_pcie_get_fwnames(struct
- 		fw_name = BRCMF_PCIE_4366_FW_NAME;
- 		nvram_name = BRCMF_PCIE_4366_NVRAM_NAME;
- 		break;
-+	case BRCM_CC_4371_CHIP_ID:
-+		fw_name = BRCMF_PCIE_4371_FW_NAME;
-+		nvram_name = BRCMF_PCIE_4371_NVRAM_NAME;
-+		break;
- 	default:
- 		brcmf_err("Unsupported chip 0x%04x\n", devinfo->ci->chip);
- 		return -ENODEV;
-@@ -2060,6 +2068,7 @@ static struct pci_device_id brcmf_pcie_d
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
- 	{ /* end: all zeroes */ }
- };
- 
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -50,6 +50,7 @@
- #define BRCM_CC_43602_CHIP_ID		43602
- #define BRCM_CC_4365_CHIP_ID		0x4365
- #define BRCM_CC_4366_CHIP_ID		0x4366
-+#define BRCM_CC_4371_CHIP_ID		0x4371
- 
- /* USB Device IDs */
- #define BRCM_USB_43143_DEVICE_ID	0xbd1e
-@@ -75,6 +76,7 @@
- #define BRCM_PCIE_4366_DEVICE_ID	0x43c3
- #define BRCM_PCIE_4366_2G_DEVICE_ID	0x43c4
- #define BRCM_PCIE_4366_5G_DEVICE_ID	0x43c5
-+#define BRCM_PCIE_4371_DEVICE_ID	0x440d
- 
- 
- /* brcmsmac IDs */
diff --git a/package/kernel/mac80211/patches/374-0001-brcmfmac-Add-support-for-the-BCM4359-11ac-RSDB-PCIE-.patch b/package/kernel/mac80211/patches/374-0001-brcmfmac-Add-support-for-the-BCM4359-11ac-RSDB-PCIE-.patch
deleted file mode 100644
index 221bae629980f943593d6d880402035eb98cff2a..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0001-brcmfmac-Add-support-for-the-BCM4359-11ac-RSDB-PCIE-.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:11 +0100
-Subject: [PATCH] brcmfmac: Add support for the BCM4359 11ac RSDB PCIE device.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
-@@ -681,6 +681,7 @@ static u32 brcmf_chip_tcm_rambase(struct
- 	case BRCM_CC_43569_CHIP_ID:
- 	case BRCM_CC_43570_CHIP_ID:
- 	case BRCM_CC_4358_CHIP_ID:
-+	case BRCM_CC_4359_CHIP_ID:
- 	case BRCM_CC_43602_CHIP_ID:
- 	case BRCM_CC_4371_CHIP_ID:
- 		return 0x180000;
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -55,6 +55,8 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_43570_NVRAM_NAME		"brcm/brcmfmac43570-pcie.txt"
- #define BRCMF_PCIE_4358_FW_NAME			"brcm/brcmfmac4358-pcie.bin"
- #define BRCMF_PCIE_4358_NVRAM_NAME		"brcm/brcmfmac4358-pcie.txt"
-+#define BRCMF_PCIE_4359_FW_NAME			"brcm/brcmfmac4359-pcie.bin"
-+#define BRCMF_PCIE_4359_NVRAM_NAME		"brcm/brcmfmac4359-pcie.txt"
- #define BRCMF_PCIE_4365_FW_NAME			"brcm/brcmfmac4365b-pcie.bin"
- #define BRCMF_PCIE_4365_NVRAM_NAME		"brcm/brcmfmac4365b-pcie.txt"
- #define BRCMF_PCIE_4366_FW_NAME			"brcm/brcmfmac4366b-pcie.bin"
-@@ -210,6 +212,8 @@ MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME
- MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4358_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4358_NVRAM_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4359_FW_NAME);
-+MODULE_FIRMWARE(BRCMF_PCIE_4359_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4365_FW_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4365_NVRAM_NAME);
- MODULE_FIRMWARE(BRCMF_PCIE_4366_FW_NAME);
-@@ -1517,6 +1521,10 @@ static int brcmf_pcie_get_fwnames(struct
- 		fw_name = BRCMF_PCIE_4358_FW_NAME;
- 		nvram_name = BRCMF_PCIE_4358_NVRAM_NAME;
- 		break;
-+	case BRCM_CC_4359_CHIP_ID:
-+		fw_name = BRCMF_PCIE_4359_FW_NAME;
-+		nvram_name = BRCMF_PCIE_4359_NVRAM_NAME;
-+		break;
- 	case BRCM_CC_4365_CHIP_ID:
- 		fw_name = BRCMF_PCIE_4365_FW_NAME;
- 		nvram_name = BRCMF_PCIE_4365_NVRAM_NAME;
-@@ -2058,6 +2066,7 @@ static struct pci_device_id brcmf_pcie_d
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4358_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4359_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
---- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
-@@ -47,6 +47,7 @@
- #define BRCM_CC_43569_CHIP_ID		43569
- #define BRCM_CC_43570_CHIP_ID		43570
- #define BRCM_CC_4358_CHIP_ID		0x4358
-+#define BRCM_CC_4359_CHIP_ID		0x4359
- #define BRCM_CC_43602_CHIP_ID		43602
- #define BRCM_CC_4365_CHIP_ID		0x4365
- #define BRCM_CC_4366_CHIP_ID		0x4366
-@@ -66,6 +67,7 @@
- #define BRCM_PCIE_43567_DEVICE_ID	0x43d3
- #define BRCM_PCIE_43570_DEVICE_ID	0x43d9
- #define BRCM_PCIE_4358_DEVICE_ID	0x43e9
-+#define BRCM_PCIE_4359_DEVICE_ID	0x43ef
- #define BRCM_PCIE_43602_DEVICE_ID	0x43ba
- #define BRCM_PCIE_43602_2G_DEVICE_ID	0x43bb
- #define BRCM_PCIE_43602_5G_DEVICE_ID	0x43bc
diff --git a/package/kernel/mac80211/patches/374-0002-brcmfmac-Simplify-and-fix-usage-of-brcmf_ifname.patch b/package/kernel/mac80211/patches/374-0002-brcmfmac-Simplify-and-fix-usage-of-brcmf_ifname.patch
deleted file mode 100644
index 331896b98dfff0884ba0ae035fb4305bbb965a50..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0002-brcmfmac-Simplify-and-fix-usage-of-brcmf_ifname.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:12 +0100
-Subject: [PATCH] brcmfmac: Simplify and fix usage of brcmf_ifname.
-
-brcmf_ifname is a debug function to return a name related to an ifp,
-but is using a rather complex implementation. It was also used
-wrongly from bcdc as it did not use the bsscfgidx as it was supposed
-to, but bssidx. This patch fixes that bug and simplifies
-brcmf_ifname.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
-@@ -187,7 +187,8 @@ retry:
- 		goto retry;
- 	if (id != bcdc->reqid) {
- 		brcmf_err("%s: unexpected request id %d (expected %d)\n",
--			  brcmf_ifname(drvr, ifidx), id, bcdc->reqid);
-+			  brcmf_ifname(brcmf_get_ifp(drvr, ifidx)), id,
-+			  bcdc->reqid);
- 		ret = -EINVAL;
- 		goto done;
- 	}
-@@ -234,7 +235,8 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
- 
- 	if (id != bcdc->reqid) {
- 		brcmf_err("%s: unexpected request id %d (expected %d)\n",
--			  brcmf_ifname(drvr, ifidx), id, bcdc->reqid);
-+			  brcmf_ifname(brcmf_get_ifp(drvr, ifidx)), id,
-+			  bcdc->reqid);
- 		ret = -EINVAL;
- 		goto done;
- 	}
-@@ -298,13 +300,13 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
- 	if (((h->flags & BCDC_FLAG_VER_MASK) >> BCDC_FLAG_VER_SHIFT) !=
- 	    BCDC_PROTO_VER) {
- 		brcmf_err("%s: non-BCDC packet received, flags 0x%x\n",
--			  brcmf_ifname(drvr, tmp_if->ifidx), h->flags);
-+			  brcmf_ifname(tmp_if), h->flags);
- 		return -EBADE;
- 	}
- 
- 	if (h->flags & BCDC_FLAG_SUM_GOOD) {
- 		brcmf_dbg(BCDC, "%s: BDC rcv, good checksum, flags 0x%x\n",
--			  brcmf_ifname(drvr, tmp_if->ifidx), h->flags);
-+			  brcmf_ifname(tmp_if), h->flags);
- 		pktbuf->ip_summed = CHECKSUM_UNNECESSARY;
- 	}
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -66,20 +66,13 @@ static int brcmf_p2p_enable;
- module_param_named(p2pon, brcmf_p2p_enable, int, 0);
- MODULE_PARM_DESC(p2pon, "enable legacy p2p management functionality");
- 
--char *brcmf_ifname(struct brcmf_pub *drvr, int ifidx)
-+char *brcmf_ifname(struct brcmf_if *ifp)
- {
--	if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
--		brcmf_err("ifidx %d out of range\n", ifidx);
--		return "<if_bad>";
--	}
--
--	if (drvr->iflist[ifidx] == NULL) {
--		brcmf_err("null i/f %d\n", ifidx);
-+	if (!ifp)
- 		return "<if_null>";
--	}
- 
--	if (drvr->iflist[ifidx]->ndev)
--		return drvr->iflist[ifidx]->ndev->name;
-+	if (ifp->ndev)
-+		return ifp->ndev->name;
- 
- 	return "<if_none>";
- }
-@@ -237,14 +230,14 @@ static netdev_tx_t brcmf_netdev_start_xm
- 		struct sk_buff *skb2;
- 
- 		brcmf_dbg(INFO, "%s: insufficient headroom\n",
--			  brcmf_ifname(drvr, ifp->bssidx));
-+			  brcmf_ifname(ifp));
- 		drvr->bus_if->tx_realloc++;
- 		skb2 = skb_realloc_headroom(skb, drvr->hdrlen);
- 		dev_kfree_skb(skb);
- 		skb = skb2;
- 		if (skb == NULL) {
- 			brcmf_err("%s: skb_realloc_headroom failed\n",
--				  brcmf_ifname(drvr, ifp->bssidx));
-+				  brcmf_ifname(ifp));
- 			ret = -ENOMEM;
- 			goto done;
- 		}
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -205,7 +205,7 @@ struct brcmf_skb_reorder_data {
- int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp);
- 
- /* Return pointer to interface name */
--char *brcmf_ifname(struct brcmf_pub *drvr, int idx);
-+char *brcmf_ifname(struct brcmf_if *ifp);
- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
diff --git a/package/kernel/mac80211/patches/374-0003-brcmfmac-Remove-unnecessary-check-from-start_xmit.patch b/package/kernel/mac80211/patches/374-0003-brcmfmac-Remove-unnecessary-check-from-start_xmit.patch
deleted file mode 100644
index 4d60521cc5fecb8fba129619b7364f9fc4ea3bb0..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0003-brcmfmac-Remove-unnecessary-check-from-start_xmit.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:13 +0100
-Subject: [PATCH] brcmfmac: Remove unnecessary check from start_xmit.
-
-The brcmf_netdev_start_xmit checks if the ndev is still valid by
-checking if it still exists in database. This check is not needed
-and therefor removed.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -217,14 +217,6 @@ static netdev_tx_t brcmf_netdev_start_xm
- 		goto done;
- 	}
- 
--	if (!drvr->iflist[ifp->bssidx]) {
--		brcmf_err("bad ifidx %d\n", ifp->bssidx);
--		netif_stop_queue(ndev);
--		dev_kfree_skb(skb);
--		ret = -ENODEV;
--		goto done;
--	}
--
- 	/* Make sure there's enough room for any header */
- 	if (skb_headroom(skb) < drvr->hdrlen) {
- 		struct sk_buff *skb2;
diff --git a/package/kernel/mac80211/patches/374-0004-brcmfmac-Remove-unncessary-variable-irq_requested.patch b/package/kernel/mac80211/patches/374-0004-brcmfmac-Remove-unncessary-variable-irq_requested.patch
deleted file mode 100644
index 50302975ef89b4cc8349e8439f55cd7dc4d22037..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0004-brcmfmac-Remove-unncessary-variable-irq_requested.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:14 +0100
-Subject: [PATCH] brcmfmac: Remove unncessary variable irq_requested.
-
-The variable irq_requested is unneeded as the functionality
-it is providing, is also provided by the variable irq_allocated.
-
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -257,7 +257,6 @@ struct brcmf_pcie_core_info {
- struct brcmf_pciedev_info {
- 	enum brcmf_pcie_state state;
- 	bool in_irq;
--	bool irq_requested;
- 	struct pci_dev *pdev;
- 	char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
- 	char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
-@@ -889,7 +888,6 @@ static int brcmf_pcie_request_irq(struct
- 
- 	brcmf_dbg(PCIE, "Enter\n");
- 	/* is it a v1 or v2 implementation */
--	devinfo->irq_requested = false;
- 	pci_enable_msi(pdev);
- 	if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) {
- 		if (request_threaded_irq(pdev->irq,
-@@ -912,7 +910,6 @@ static int brcmf_pcie_request_irq(struct
- 			return -EIO;
- 		}
- 	}
--	devinfo->irq_requested = true;
- 	devinfo->irq_allocated = true;
- 	return 0;
- }
-@@ -930,9 +927,6 @@ static void brcmf_pcie_release_irq(struc
- 	pdev = devinfo->pdev;
- 
- 	brcmf_pcie_intr_disable(devinfo);
--	if (!devinfo->irq_requested)
--		return;
--	devinfo->irq_requested = false;
- 	free_irq(pdev->irq, devinfo);
- 	pci_disable_msi(pdev);
- 
diff --git a/package/kernel/mac80211/patches/374-0005-brcmfmac-Disable-runtime-pm-for-USB.patch b/package/kernel/mac80211/patches/374-0005-brcmfmac-Disable-runtime-pm-for-USB.patch
deleted file mode 100644
index f2afb90c174c3b8a169a717094919f03bcce907c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0005-brcmfmac-Disable-runtime-pm-for-USB.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:15 +0100
-Subject: [PATCH] brcmfmac: Disable runtime pm for USB.
-
-Currently runtime pm is enabled for USB, but it is not properly
-supported by driver. This patch disables the runtime PM support
-completely for USB, as it currently can result in problems on
-some systems.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-@@ -1504,7 +1504,6 @@ static struct usb_driver brcmf_usbdrvr =
- 	.suspend = brcmf_usb_suspend,
- 	.resume = brcmf_usb_resume,
- 	.reset_resume = brcmf_usb_reset_resume,
--	.supports_autosuspend = 1,
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0))
- 	.disable_hub_initiated_lpm = 1,
- #endif
diff --git a/package/kernel/mac80211/patches/374-0006-brcmfmac-Add-RSDB-support.patch b/package/kernel/mac80211/patches/374-0006-brcmfmac-Add-RSDB-support.patch
deleted file mode 100644
index 78a95c57b154a30afa40253c6702a0601f4ea33c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0006-brcmfmac-Add-RSDB-support.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:16 +0100
-Subject: [PATCH] brcmfmac: Add RSDB support.
-
-Broadcom devices with a single 802.11 core can work on two band
-concurrently using VSDB feature, ie. Virtual Simultaneous Dual-Band.
-For devices that are fitted with two 802.11 cores and RF paths the
-driver should support a firmware feature called RSDB, which stands
-for Real Simultaneous Dual-Band. RSDB works almost autonomously in
-firmware except for AP config. When the device supports RSDB then
-the interface should not be brought down when configuring it,
-otherwise the link (if configured) on the other interface will be
-lost.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-[kvalo@codeaurora.org: changed the commit log based on discussion]
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -4182,7 +4182,9 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
- 			}
- 		}
- 
--		if (dev_role == NL80211_IFTYPE_AP) {
-+		if ((dev_role == NL80211_IFTYPE_AP) &&
-+		    ((ifp->ifidx == 0) ||
-+		     !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			if (err < 0) {
- 				brcmf_err("BRCMF_C_DOWN error %d\n", err);
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
-@@ -137,6 +137,7 @@ void brcmf_feat_attach(struct brcmf_pub
- 	if (drvr->bus_if->chip != BRCM_CC_43362_CHIP_ID)
- 		brcmf_feat_iovar_int_set(ifp, BRCMF_FEAT_MBSS, "mbss", 0);
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_P2P, "p2p");
-+	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
- 
- 	if (brcmf_feature_disable) {
- 		brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n",
---- a/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.h
-@@ -24,13 +24,16 @@
-  * PNO: preferred network offload.
-  * WOWL: Wake-On-WLAN.
-  * P2P: peer-to-peer
-+ * RSDB: Real Simultaneous Dual Band
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
- 	BRCMF_FEAT_DEF(MCHAN) \
- 	BRCMF_FEAT_DEF(PNO) \
- 	BRCMF_FEAT_DEF(WOWL) \
--	BRCMF_FEAT_DEF(P2P)
-+	BRCMF_FEAT_DEF(P2P) \
-+	BRCMF_FEAT_DEF(RSDB)
-+
- /*
-  * Quirks:
-  *
diff --git a/package/kernel/mac80211/patches/374-0007-brcmfmac-Use-consistent-naming-for-bsscfgidx.patch b/package/kernel/mac80211/patches/374-0007-brcmfmac-Use-consistent-naming-for-bsscfgidx.patch
deleted file mode 100644
index d1e72643bff8d71bd71231fc3611b65fbe5ee3e7..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0007-brcmfmac-Use-consistent-naming-for-bsscfgidx.patch
+++ /dev/null
@@ -1,533 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:17 +0100
-Subject: [PATCH] brcmfmac: Use consistent naming for bsscfgidx.
-
-The variable bsscfgidx is used in different places with different
-names, e.g. bsscfg, bssidx, bsscfg_idx. This patch cleans this up
-by using bsscfgidx everywhere.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -775,7 +775,8 @@ brcmf_cfg80211_change_iface(struct wiphy
- 	s32 ap = 0;
- 	s32 err = 0;
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d, type=%d\n", ifp->bssidx, type);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, type=%d\n", ifp->bsscfgidx,
-+		  type);
- 
- 	/* WAR: There are a number of p2p interface related problems which
- 	 * need to be handled initially (before doing the validate).
-@@ -2920,7 +2921,7 @@ brcmf_cfg80211_escan_handler(struct brcm
- 	status = e->status;
- 
- 	if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
--		brcmf_err("scan not ready, bssidx=%d\n", ifp->bssidx);
-+		brcmf_err("scan not ready, bsscfgidx=%d\n", ifp->bsscfgidx);
- 		return -EPERM;
- 	}
- 
-@@ -3876,7 +3877,8 @@ s32 brcmf_vif_set_mgmt_ie(struct brcmf_c
- 	ifp = vif->ifp;
- 	saved_ie = &vif->saved_ie;
- 
--	brcmf_dbg(TRACE, "bssidx %d, pktflag : 0x%02X\n", ifp->bssidx, pktflag);
-+	brcmf_dbg(TRACE, "bsscfgidx %d, pktflag : 0x%02X\n", ifp->bsscfgidx,
-+		  pktflag);
- 	iovar_ie_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL);
- 	if (!iovar_ie_buf)
- 		return -ENOMEM;
-@@ -4240,7 +4242,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
- 			brcmf_err("setting ssid failed %d\n", err);
- 			goto exit;
- 		}
--		bss_enable.bsscfg_idx = cpu_to_le32(ifp->bssidx);
-+		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
- 		bss_enable.enable = cpu_to_le32(1);
- 		err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
- 					       sizeof(bss_enable));
-@@ -4307,7 +4309,7 @@ static int brcmf_cfg80211_stop_ap(struct
- 		if (err < 0)
- 			brcmf_err("BRCMF_C_UP error %d\n", err);
- 	} else {
--		bss_enable.bsscfg_idx = cpu_to_le32(ifp->bssidx);
-+		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
- 		bss_enable.enable = cpu_to_le32(0);
- 		err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
- 					       sizeof(bss_enable));
-@@ -5093,9 +5095,9 @@ static s32 brcmf_notify_vif_event(struct
- 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
- 	struct brcmf_cfg80211_vif *vif;
- 
--	brcmf_dbg(TRACE, "Enter: action %u flags %u ifidx %u bsscfg %u\n",
-+	brcmf_dbg(TRACE, "Enter: action %u flags %u ifidx %u bsscfgidx %u\n",
- 		  ifevent->action, ifevent->flags, ifevent->ifidx,
--		  ifevent->bssidx);
-+		  ifevent->bsscfgidx);
- 
- 	mutex_lock(&event->vif_event_lock);
- 	event->action = ifevent->action;
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -80,7 +80,7 @@ char *brcmf_ifname(struct brcmf_if *ifp)
- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx)
- {
- 	struct brcmf_if *ifp;
--	s32 bssidx;
-+	s32 bsscfgidx;
- 
- 	if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
- 		brcmf_err("ifidx %d out of range\n", ifidx);
-@@ -88,9 +88,9 @@ struct brcmf_if *brcmf_get_ifp(struct br
- 	}
- 
- 	ifp = NULL;
--	bssidx = drvr->if2bss[ifidx];
--	if (bssidx >= 0)
--		ifp = drvr->iflist[bssidx];
-+	bsscfgidx = drvr->if2bss[ifidx];
-+	if (bsscfgidx >= 0)
-+		ifp = drvr->iflist[bsscfgidx];
- 
- 	return ifp;
- }
-@@ -108,7 +108,7 @@ static void _brcmf_set_multicast_list(st
- 
- 	ifp = container_of(work, struct brcmf_if, multicast_work);
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	ndev = ifp->ndev;
- 
-@@ -168,7 +168,7 @@ _brcmf_set_mac_address(struct work_struc
- 
- 	ifp = container_of(work, struct brcmf_if, setmacaddr_work);
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr,
- 				       ETH_ALEN);
-@@ -206,7 +206,7 @@ static netdev_tx_t brcmf_netdev_start_xm
- 	struct brcmf_pub *drvr = ifp->drvr;
- 	struct ethhdr *eh = (struct ethhdr *)(skb->data);
- 
--	brcmf_dbg(DATA, "Enter, idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(DATA, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	/* Can the device send data? */
- 	if (drvr->bus_if->state != BRCMF_BUS_UP) {
-@@ -267,8 +267,8 @@ void brcmf_txflowblock_if(struct brcmf_i
- 	if (!ifp || !ifp->ndev)
- 		return;
- 
--	brcmf_dbg(TRACE, "enter: idx=%d stop=0x%X reason=%d state=%d\n",
--		  ifp->bssidx, ifp->netif_stop, reason, state);
-+	brcmf_dbg(TRACE, "enter: bsscfgidx=%d stop=0x%X reason=%d state=%d\n",
-+		  ifp->bsscfgidx, ifp->netif_stop, reason, state);
- 
- 	spin_lock_irqsave(&ifp->netif_stop_lock, flags);
- 	if (state) {
-@@ -587,7 +587,7 @@ static struct net_device_stats *brcmf_ne
- {
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	return &ifp->stats;
- }
-@@ -616,7 +616,7 @@ static int brcmf_netdev_stop(struct net_
- {
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	brcmf_cfg80211_down(ndev);
- 
-@@ -632,7 +632,7 @@ static int brcmf_netdev_open(struct net_
- 	struct brcmf_bus *bus_if = drvr->bus_if;
- 	u32 toe_ol;
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	/* If bus is not ready, can't continue */
- 	if (bus_if->state != BRCMF_BUS_UP) {
-@@ -674,7 +674,7 @@ int brcmf_net_attach(struct brcmf_if *if
- 	struct net_device *ndev;
- 	s32 err;
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d mac=%pM\n", ifp->bssidx,
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d mac=%pM\n", ifp->bsscfgidx,
- 		  ifp->mac_addr);
- 	ndev = ifp->ndev;
- 
-@@ -706,7 +706,7 @@ int brcmf_net_attach(struct brcmf_if *if
- 	return 0;
- 
- fail:
--	drvr->iflist[ifp->bssidx] = NULL;
-+	drvr->iflist[ifp->bsscfgidx] = NULL;
- 	ndev->netdev_ops = NULL;
- 	free_netdev(ndev);
- 	return -EBADE;
-@@ -724,7 +724,8 @@ void brcmf_net_setcarrier(struct brcmf_i
- {
- 	struct net_device *ndev;
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d carrier=%d\n", ifp->bssidx, on);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d carrier=%d\n", ifp->bsscfgidx,
-+		  on);
- 
- 	ndev = ifp->ndev;
- 	brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_DISCONNECTED, !on);
-@@ -771,7 +772,7 @@ static int brcmf_net_p2p_attach(struct b
- {
- 	struct net_device *ndev;
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d mac=%pM\n", ifp->bssidx,
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d mac=%pM\n", ifp->bsscfgidx,
- 		  ifp->mac_addr);
- 	ndev = ifp->ndev;
- 
-@@ -790,21 +791,21 @@ static int brcmf_net_p2p_attach(struct b
- 	return 0;
- 
- fail:
--	ifp->drvr->iflist[ifp->bssidx] = NULL;
-+	ifp->drvr->iflist[ifp->bsscfgidx] = NULL;
- 	ndev->netdev_ops = NULL;
- 	free_netdev(ndev);
- 	return -EBADE;
- }
- 
--struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
-+struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
- 			      bool is_p2pdev, char *name, u8 *mac_addr)
- {
- 	struct brcmf_if *ifp;
- 	struct net_device *ndev;
- 
--	brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifidx);
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx, ifidx);
- 
--	ifp = drvr->iflist[bssidx];
-+	ifp = drvr->iflist[bsscfgidx];
- 	/*
- 	 * Delete the existing interface before overwriting it
- 	 * in case we missed the BRCMF_E_IF_DEL event.
-@@ -815,7 +816,7 @@ struct brcmf_if *brcmf_add_if(struct brc
- 		if (ifidx) {
- 			netif_stop_queue(ifp->ndev);
- 			brcmf_net_detach(ifp->ndev);
--			drvr->iflist[bssidx] = NULL;
-+			drvr->iflist[bsscfgidx] = NULL;
- 		} else {
- 			brcmf_err("ignore IF event\n");
- 			return ERR_PTR(-EINVAL);
-@@ -839,15 +840,15 @@ struct brcmf_if *brcmf_add_if(struct brc
- 		ndev->destructor = brcmf_cfg80211_free_netdev;
- 		ifp = netdev_priv(ndev);
- 		ifp->ndev = ndev;
--		/* store mapping ifidx to bssidx */
-+		/* store mapping ifidx to bsscfgidx */
- 		if (drvr->if2bss[ifidx] == BRCMF_BSSIDX_INVALID)
--			drvr->if2bss[ifidx] = bssidx;
-+			drvr->if2bss[ifidx] = bsscfgidx;
- 	}
- 
- 	ifp->drvr = drvr;
--	drvr->iflist[bssidx] = ifp;
-+	drvr->iflist[bsscfgidx] = ifp;
- 	ifp->ifidx = ifidx;
--	ifp->bssidx = bssidx;
-+	ifp->bsscfgidx = bsscfgidx;
- 
- 	init_waitqueue_head(&ifp->pend_8021x_wait);
- 	spin_lock_init(&ifp->netif_stop_lock);
-@@ -861,21 +862,22 @@ struct brcmf_if *brcmf_add_if(struct brc
- 	return ifp;
- }
- 
--static void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)
-+static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx)
- {
- 	struct brcmf_if *ifp;
- 
--	ifp = drvr->iflist[bssidx];
--	drvr->iflist[bssidx] = NULL;
-+	ifp = drvr->iflist[bsscfgidx];
-+	drvr->iflist[bsscfgidx] = NULL;
- 	if (!ifp) {
--		brcmf_err("Null interface, idx=%d\n", bssidx);
-+		brcmf_err("Null interface, bsscfgidx=%d\n", bsscfgidx);
- 		return;
- 	}
--	brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifp->ifidx);
--	if (drvr->if2bss[ifp->ifidx] == bssidx)
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx,
-+		  ifp->ifidx);
-+	if (drvr->if2bss[ifp->ifidx] == bsscfgidx)
- 		drvr->if2bss[ifp->ifidx] = BRCMF_BSSIDX_INVALID;
- 	if (ifp->ndev) {
--		if (bssidx == 0) {
-+		if (bsscfgidx == 0) {
- 			if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
- 				rtnl_lock();
- 				brcmf_netdev_stop(ifp->ndev);
-@@ -905,12 +907,12 @@ static void brcmf_del_if(struct brcmf_pu
- 
- void brcmf_remove_interface(struct brcmf_if *ifp)
- {
--	if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bssidx] != ifp))
-+	if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bsscfgidx] != ifp))
- 		return;
--	brcmf_dbg(TRACE, "Enter, bssidx=%d, ifidx=%d\n", ifp->bssidx,
-+	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx,
- 		  ifp->ifidx);
- 	brcmf_fws_del_interface(ifp);
--	brcmf_del_if(ifp->drvr, ifp->bssidx);
-+	brcmf_del_if(ifp->drvr, ifp->bsscfgidx);
- }
- 
- int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr)
-@@ -925,10 +927,10 @@ int brcmf_get_next_free_bsscfgidx(struct
- 	highest = 2;
- 	for (ifidx = 0; ifidx < BRCMF_MAX_IFS; ifidx++) {
- 		if (drvr->iflist[ifidx]) {
--			if (drvr->iflist[ifidx]->bssidx == bsscfgidx)
-+			if (drvr->iflist[ifidx]->bsscfgidx == bsscfgidx)
- 				bsscfgidx = highest + 1;
--			else if (drvr->iflist[ifidx]->bssidx > highest)
--				highest = drvr->iflist[ifidx]->bssidx;
-+			else if (drvr->iflist[ifidx]->bsscfgidx > highest)
-+				highest = drvr->iflist[ifidx]->bsscfgidx;
- 		} else {
- 			available = true;
- 		}
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
-@@ -174,7 +174,7 @@ enum brcmf_netif_stop_reason {
-  * @multicast_work: worker object for multicast provisioning.
-  * @fws_desc: interface specific firmware-signalling descriptor.
-  * @ifidx: interface index in device firmware.
-- * @bssidx: index of bss associated with this interface.
-+ * @bsscfgidx: index of bss associated with this interface.
-  * @mac_addr: assigned mac address.
-  * @netif_stop: bitmap indicates reason why netif queues are stopped.
-  * @netif_stop_lock: spinlock for update netif_stop from multiple sources.
-@@ -190,7 +190,7 @@ struct brcmf_if {
- 	struct work_struct multicast_work;
- 	struct brcmf_fws_mac_descriptor *fws_desc;
- 	int ifidx;
--	s32 bssidx;
-+	s32 bsscfgidx;
- 	u8 mac_addr[ETH_ALEN];
- 	u8 netif_stop;
- 	spinlock_t netif_stop_lock;
-@@ -208,7 +208,7 @@ int brcmf_netdev_wait_pend8021x(struct b
- char *brcmf_ifname(struct brcmf_if *ifp);
- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
--struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
-+struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
- 			      bool is_p2pdev, char *name, u8 *mac_addr);
- void brcmf_remove_interface(struct brcmf_if *ifp);
- int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr);
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.c
-@@ -49,7 +49,7 @@ static int brcmf_debug_psm_watchdog_noti
- 					   const struct brcmf_event_msg *evtmsg,
- 					   void *data)
- {
--	brcmf_dbg(TRACE, "enter: idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
- 
- 	return brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
- 					  evtmsg->datalen);
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
-@@ -182,8 +182,8 @@ static void brcmf_fweh_handle_if_event(s
- 	bool is_p2pdev;
- 	int err = 0;
- 
--	brcmf_dbg(EVENT, "action: %u idx: %u bsscfg: %u flags: %u role: %u\n",
--		  ifevent->action, ifevent->ifidx, ifevent->bssidx,
-+	brcmf_dbg(EVENT, "action: %u ifidx: %u bsscfgidx: %u flags: %u role: %u\n",
-+		  ifevent->action, ifevent->ifidx, ifevent->bsscfgidx,
- 		  ifevent->flags, ifevent->role);
- 
- 	/* The P2P Device interface event must not be ignored contrary to what
-@@ -204,12 +204,12 @@ static void brcmf_fweh_handle_if_event(s
- 		return;
- 	}
- 
--	ifp = drvr->iflist[ifevent->bssidx];
-+	ifp = drvr->iflist[ifevent->bsscfgidx];
- 
- 	if (ifevent->action == BRCMF_E_IF_ADD) {
- 		brcmf_dbg(EVENT, "adding %s (%pM)\n", emsg->ifname,
- 			  emsg->addr);
--		ifp = brcmf_add_if(drvr, ifevent->bssidx, ifevent->ifidx,
-+		ifp = brcmf_add_if(drvr, ifevent->bsscfgidx, ifevent->ifidx,
- 				   is_p2pdev, emsg->ifname, emsg->addr);
- 		if (IS_ERR(ifp))
- 			return;
---- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
-@@ -219,7 +219,7 @@ struct brcmf_if_event {
- 	u8 ifidx;
- 	u8 action;
- 	u8 flags;
--	u8 bssidx;
-+	u8 bsscfgidx;
- 	u8 role;
- };
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.c
-@@ -293,22 +293,22 @@ brcmf_fil_iovar_int_get(struct brcmf_if
- }
- 
- static u32
--brcmf_create_bsscfg(s32 bssidx, char *name, char *data, u32 datalen, char *buf,
--		    u32 buflen)
-+brcmf_create_bsscfg(s32 bsscfgidx, char *name, char *data, u32 datalen,
-+		    char *buf, u32 buflen)
- {
- 	const s8 *prefix = "bsscfg:";
- 	s8 *p;
- 	u32 prefixlen;
- 	u32 namelen;
- 	u32 iolen;
--	__le32 bssidx_le;
-+	__le32 bsscfgidx_le;
- 
--	if (bssidx == 0)
-+	if (bsscfgidx == 0)
- 		return brcmf_create_iovar(name, data, datalen, buf, buflen);
- 
- 	prefixlen = strlen(prefix);
- 	namelen = strlen(name) + 1; /* lengh of iovar  name + null */
--	iolen = prefixlen + namelen + sizeof(bssidx_le) + datalen;
-+	iolen = prefixlen + namelen + sizeof(bsscfgidx_le) + datalen;
- 
- 	if (buflen < iolen) {
- 		brcmf_err("buffer is too short\n");
-@@ -326,9 +326,9 @@ brcmf_create_bsscfg(s32 bssidx, char *na
- 	p += namelen;
- 
- 	/* bss config index as first data */
--	bssidx_le = cpu_to_le32(bssidx);
--	memcpy(p, &bssidx_le, sizeof(bssidx_le));
--	p += sizeof(bssidx_le);
-+	bsscfgidx_le = cpu_to_le32(bsscfgidx);
-+	memcpy(p, &bsscfgidx_le, sizeof(bsscfgidx_le));
-+	p += sizeof(bsscfgidx_le);
- 
- 	/* parameter buffer follows */
- 	if (datalen)
-@@ -347,12 +347,12 @@ brcmf_fil_bsscfg_data_set(struct brcmf_i
- 
- 	mutex_lock(&drvr->proto_block);
- 
--	brcmf_dbg(FIL, "ifidx=%d, bssidx=%d, name=%s, len=%d\n", ifp->ifidx,
--		  ifp->bssidx, name, len);
-+	brcmf_dbg(FIL, "ifidx=%d, bsscfgidx=%d, name=%s, len=%d\n", ifp->ifidx,
-+		  ifp->bsscfgidx, name, len);
- 	brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data,
- 			   min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n");
- 
--	buflen = brcmf_create_bsscfg(ifp->bssidx, name, data, len,
-+	buflen = brcmf_create_bsscfg(ifp->bsscfgidx, name, data, len,
- 				     drvr->proto_buf, sizeof(drvr->proto_buf));
- 	if (buflen) {
- 		err = brcmf_fil_cmd_data(ifp, BRCMF_C_SET_VAR, drvr->proto_buf,
-@@ -376,7 +376,7 @@ brcmf_fil_bsscfg_data_get(struct brcmf_i
- 
- 	mutex_lock(&drvr->proto_block);
- 
--	buflen = brcmf_create_bsscfg(ifp->bssidx, name, data, len,
-+	buflen = brcmf_create_bsscfg(ifp->bsscfgidx, name, data, len,
- 				     drvr->proto_buf, sizeof(drvr->proto_buf));
- 	if (buflen) {
- 		err = brcmf_fil_cmd_data(ifp, BRCMF_C_GET_VAR, drvr->proto_buf,
-@@ -387,8 +387,8 @@ brcmf_fil_bsscfg_data_get(struct brcmf_i
- 		err = -EPERM;
- 		brcmf_err("Creating bsscfg failed\n");
- 	}
--	brcmf_dbg(FIL, "ifidx=%d, bssidx=%d, name=%s, len=%d\n", ifp->ifidx,
--		  ifp->bssidx, name, len);
-+	brcmf_dbg(FIL, "ifidx=%d, bsscfgidx=%d, name=%s, len=%d\n", ifp->ifidx,
-+		  ifp->bsscfgidx, name, len);
- 	brcmf_dbg_hex_dump(BRCMF_FIL_ON(), data,
- 			   min_t(uint, len, MAX_HEX_DUMP_LEN), "data\n");
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-@@ -170,7 +170,7 @@ struct brcmf_fil_af_params_le {
- };
- 
- struct brcmf_fil_bss_enable_le {
--	__le32 bsscfg_idx;
-+	__le32 bsscfgidx;
- 	__le32 enable;
- };
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -719,7 +719,7 @@ static void brcmf_fws_macdesc_init(struc
- 	desc->state = BRCMF_FWS_STATE_OPEN;
- 	desc->requested_credit = 0;
- 	desc->requested_packet = 0;
--	/* depending on use may need ifp->bssidx instead */
-+	/* depending on use may need ifp->bsscfgidx instead */
- 	desc->interface_id = ifidx;
- 	desc->ac_bitmap = 0xff; /* update this when handling APSD */
- 	if (addr)
-@@ -1938,7 +1938,7 @@ void brcmf_fws_reset_interface(struct br
- {
- 	struct brcmf_fws_mac_descriptor *entry = ifp->fws_desc;
- 
--	brcmf_dbg(TRACE, "enter: idx=%d\n", ifp->bssidx);
-+	brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
- 	if (!entry)
- 		return;
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -2067,7 +2067,7 @@ static struct wireless_dev *brcmf_p2p_cr
- 	struct brcmf_if *p2p_ifp;
- 	struct brcmf_if *pri_ifp;
- 	int err;
--	u32 bssidx;
-+	u32 bsscfgidx;
- 
- 	if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
- 		return ERR_PTR(-ENOSPC);
-@@ -2113,13 +2113,13 @@ static struct wireless_dev *brcmf_p2p_cr
- 	memcpy(&p2p_vif->wdev.address, p2p->dev_addr, sizeof(p2p->dev_addr));
- 
- 	/* verify bsscfg index for P2P discovery */
--	err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
-+	err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bsscfgidx);
- 	if (err < 0) {
- 		brcmf_err("retrieving discover bsscfg index failed\n");
- 		goto fail;
- 	}
- 
--	WARN_ON(p2p_ifp->bssidx != bssidx);
-+	WARN_ON(p2p_ifp->bsscfgidx != bsscfgidx);
- 
- 	init_completion(&p2p->send_af_done);
- 	INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
diff --git a/package/kernel/mac80211/patches/374-0008-brcmfmac-Use-new-methods-for-pcie-Power-Management.patch b/package/kernel/mac80211/patches/374-0008-brcmfmac-Use-new-methods-for-pcie-Power-Management.patch
deleted file mode 100644
index fb2b85e46c11d8490252cfcd3a649005ce8477a5..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0008-brcmfmac-Use-new-methods-for-pcie-Power-Management.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:18 +0100
-Subject: [PATCH] brcmfmac: Use new methods for pcie Power Management.
-
-Currently the legacy methods suspend and resume are used for pcie
-devices. This is not the preferable method and is also causing
-issues with some setups when doing hibernate. Changing this to
-use the new PM methods.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -1388,10 +1388,6 @@ static void brcmf_pcie_wowl_config(struc
- 
- 	brcmf_dbg(PCIE, "Configuring WOWL, enabled=%d\n", enabled);
- 	devinfo->wowl_enabled = enabled;
--	if (enabled)
--		device_set_wakeup_enable(&devinfo->pdev->dev, true);
--	else
--		device_set_wakeup_enable(&devinfo->pdev->dev, false);
- }
- 
- 
-@@ -1961,15 +1957,14 @@ brcmf_pcie_remove(struct pci_dev *pdev)
- #ifdef CONFIG_PM
- 
- 
--static int brcmf_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
-+static int brcmf_pcie_pm_enter_D3(struct device *dev)
- {
- 	struct brcmf_pciedev_info *devinfo;
- 	struct brcmf_bus *bus;
--	int err;
- 
--	brcmf_dbg(PCIE, "Enter, state=%d, pdev=%p\n", state.event, pdev);
-+	brcmf_err("Enter\n");
- 
--	bus = dev_get_drvdata(&pdev->dev);
-+	bus = dev_get_drvdata(dev);
- 	devinfo = bus->bus_priv.pcie->devinfo;
- 
- 	brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
-@@ -1984,62 +1979,45 @@ static int brcmf_pcie_suspend(struct pci
- 		brcmf_err("Timeout on response for entering D3 substate\n");
- 		return -EIO;
- 	}
--	brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM_IN_USE);
- 
--	err = pci_save_state(pdev);
--	if (err)
--		brcmf_err("pci_save_state failed, err=%d\n", err);
--	if ((err) || (!devinfo->wowl_enabled)) {
--		brcmf_chip_detach(devinfo->ci);
--		devinfo->ci = NULL;
--		brcmf_pcie_remove(pdev);
--		return 0;
--	}
-+	devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
- 
--	return pci_prepare_to_sleep(pdev);
-+	return 0;
- }
- 
--static int brcmf_pcie_resume(struct pci_dev *pdev)
-+
-+static int brcmf_pcie_pm_leave_D3(struct device *dev)
- {
- 	struct brcmf_pciedev_info *devinfo;
- 	struct brcmf_bus *bus;
-+	struct pci_dev *pdev;
- 	int err;
- 
--	bus = dev_get_drvdata(&pdev->dev);
--	brcmf_dbg(PCIE, "Enter, pdev=%p, bus=%p\n", pdev, bus);
-+	brcmf_err("Enter\n");
- 
--	err = pci_set_power_state(pdev, PCI_D0);
--	if (err) {
--		brcmf_err("pci_set_power_state failed, err=%d\n", err);
--		goto cleanup;
--	}
--	pci_restore_state(pdev);
--	pci_enable_wake(pdev, PCI_D3hot, false);
--	pci_enable_wake(pdev, PCI_D3cold, false);
-+	bus = dev_get_drvdata(dev);
-+	devinfo = bus->bus_priv.pcie->devinfo;
-+	brcmf_dbg(PCIE, "Enter, dev=%p, bus=%p\n", dev, bus);
- 
- 	/* Check if device is still up and running, if so we are ready */
--	if (bus) {
--		devinfo = bus->bus_priv.pcie->devinfo;
--		if (brcmf_pcie_read_reg32(devinfo,
--					  BRCMF_PCIE_PCIE2REG_INTMASK) != 0) {
--			if (brcmf_pcie_send_mb_data(devinfo,
--						    BRCMF_H2D_HOST_D0_INFORM))
--				goto cleanup;
--			brcmf_dbg(PCIE, "Hot resume, continue....\n");
--			brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
--			brcmf_bus_change_state(bus, BRCMF_BUS_UP);
--			brcmf_pcie_intr_enable(devinfo);
--			return 0;
--		}
-+	if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_INTMASK) != 0) {
-+		brcmf_dbg(PCIE, "Try to wakeup device....\n");
-+		if (brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM))
-+			goto cleanup;
-+		brcmf_dbg(PCIE, "Hot resume, continue....\n");
-+		devinfo->state = BRCMFMAC_PCIE_STATE_UP;
-+		brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
-+		brcmf_bus_change_state(bus, BRCMF_BUS_UP);
-+		brcmf_pcie_intr_enable(devinfo);
-+		return 0;
- 	}
- 
- cleanup:
--	if (bus) {
--		devinfo = bus->bus_priv.pcie->devinfo;
--		brcmf_chip_detach(devinfo->ci);
--		devinfo->ci = NULL;
--		brcmf_pcie_remove(pdev);
--	}
-+	brcmf_chip_detach(devinfo->ci);
-+	devinfo->ci = NULL;
-+	pdev = devinfo->pdev;
-+	brcmf_pcie_remove(pdev);
-+
- 	err = brcmf_pcie_probe(pdev, NULL);
- 	if (err)
- 		brcmf_err("probe after resume failed, err=%d\n", err);
-@@ -2048,6 +2026,14 @@ cleanup:
- }
- 
- 
-+static const struct dev_pm_ops brcmf_pciedrvr_pm = {
-+	.suspend = brcmf_pcie_pm_enter_D3,
-+	.resume = brcmf_pcie_pm_leave_D3,
-+	.freeze = brcmf_pcie_pm_enter_D3,
-+	.restore = brcmf_pcie_pm_leave_D3,
-+};
-+
-+
- #endif /* CONFIG_PM */
- 
- 
-@@ -2086,9 +2072,8 @@ static struct pci_driver brcmf_pciedrvr
- 	.probe = brcmf_pcie_probe,
- 	.remove = brcmf_pcie_remove,
- #ifdef CONFIG_PM
--	.suspend = brcmf_pcie_suspend,
--	.resume = brcmf_pcie_resume
--#endif /* CONFIG_PM */
-+	.driver.pm = &brcmf_pciedrvr_pm,
-+#endif
- };
- 
- 
diff --git a/package/kernel/mac80211/patches/374-0009-brcmfmac-Add-wowl-wake-indication-report.patch b/package/kernel/mac80211/patches/374-0009-brcmfmac-Add-wowl-wake-indication-report.patch
deleted file mode 100644
index 4324cc70c4ada03dbcbadc3db49b6f845be00118..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/374-0009-brcmfmac-Add-wowl-wake-indication-report.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Thu, 29 Oct 2015 20:33:19 +0100
-Subject: [PATCH] brcmfmac: Add wowl wake indication report.
-
-On wakeup of the system (resume) a wowl wakeup indication report
-can be sent to cfg80211. This patch adds support for this. The
-report specifies if the device was responsible for the wakeup
-and if so, will specify the exact reason.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -3061,6 +3061,67 @@ static s32 brcmf_config_wowl_pattern(str
- 	return ret;
- }
- 
-+#ifdef CPTCFG_PM
-+
-+static void brcmf_report_wowl_wakeind(struct wiphy *wiphy, struct brcmf_if *ifp)
-+{
-+	struct brcmf_wowl_wakeind_le wake_ind_le;
-+	struct cfg80211_wowlan_wakeup wakeup_data;
-+	struct cfg80211_wowlan_wakeup *wakeup;
-+	u32 wakeind;
-+	s32 err;
-+
-+	err = brcmf_fil_iovar_data_get(ifp, "wowl_wakeind", &wake_ind_le,
-+				       sizeof(wake_ind_le));
-+	if (!err) {
-+		brcmf_err("Get wowl_wakeind failed, err = %d\n", err);
-+		return;
-+	}
-+
-+	wakeind = le32_to_cpu(wake_ind_le.ucode_wakeind);
-+	if (wakeind & (BRCMF_WOWL_MAGIC | BRCMF_WOWL_DIS | BRCMF_WOWL_BCN |
-+		       BRCMF_WOWL_RETR | BRCMF_WOWL_NET)) {
-+		wakeup = &wakeup_data;
-+		memset(&wakeup_data, 0, sizeof(wakeup_data));
-+		wakeup_data.pattern_idx = -1;
-+
-+		if (wakeind & BRCMF_WOWL_MAGIC) {
-+			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_MAGIC\n");
-+			wakeup_data.magic_pkt = true;
-+		}
-+		if (wakeind & BRCMF_WOWL_DIS) {
-+			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_DIS\n");
-+			wakeup_data.disconnect = true;
-+		}
-+		if (wakeind & BRCMF_WOWL_BCN) {
-+			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_BCN\n");
-+			wakeup_data.disconnect = true;
-+		}
-+		if (wakeind & BRCMF_WOWL_RETR) {
-+			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_RETR\n");
-+			wakeup_data.disconnect = true;
-+		}
-+		if (wakeind & BRCMF_WOWL_NET) {
-+			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_NET\n");
-+			/* For now always map to pattern 0, no API to get
-+			 * correct information available at the moment.
-+			 */
-+			wakeup_data.pattern_idx = 0;
-+		}
-+	} else {
-+		wakeup = NULL;
-+	}
-+	cfg80211_report_wowlan_wakeup(&ifp->vif->wdev, wakeup, GFP_KERNEL);
-+}
-+
-+#else
-+
-+static void brcmf_report_wowl_wakeind(struct wiphy *wiphy, struct brcmf_if *ifp)
-+{
-+}
-+
-+#endif /* CPTCFG_PM */
-+
- static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-@@ -3070,11 +3131,12 @@ static s32 brcmf_cfg80211_resume(struct
- 	brcmf_dbg(TRACE, "Enter\n");
- 
- 	if (cfg->wowl_enabled) {
-+		brcmf_report_wowl_wakeind(wiphy, ifp);
-+		brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
-+		brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
- 		brcmf_configure_arp_offload(ifp, true);
- 		brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM,
- 				      cfg->pre_wowl_pmmode);
--		brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
--		brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
- 		cfg->wowl_enabled = false;
- 	}
- 	return 0;
-@@ -3108,6 +3170,7 @@ static void brcmf_configure_wowl(struct
- 				wowl->patterns[i].pkt_offset);
- 		}
- 	}
-+	brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", strlen("clear"));
- 	brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config);
- 	brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1);
- 	brcmf_bus_wowl_config(cfg->pub->bus_if, true);
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-@@ -634,4 +634,16 @@ struct brcmf_assoclist_le {
- 	u8 mac[BRCMF_MAX_ASSOCLIST][ETH_ALEN];
- };
- 
-+/**
-+ * struct brcmf_wowl_wakeind_le - Wakeup indicators
-+ *	Note: note both fields contain same information.
-+ *
-+ * @pci_wakeind: Whether PCI PMECSR PMEStatus bit was set.
-+ * @ucode_wakeind: What wakeup-event indication was set by ucode
-+ */
-+struct brcmf_wowl_wakeind_le {
-+	__le32 pci_wakeind;
-+	__le32 ucode_wakeind;
-+};
-+
- #endif /* FWIL_TYPES_H_ */
diff --git a/package/kernel/mac80211/patches/375-brcmfmac-constify-brcmf_bus_ops-structures.patch b/package/kernel/mac80211/patches/375-brcmfmac-constify-brcmf_bus_ops-structures.patch
deleted file mode 100644
index a0cc231de7d3f81a288761ef4d015e4cbf3da891..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/375-brcmfmac-constify-brcmf_bus_ops-structures.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From: Julia Lawall <Julia.Lawall@lip6.fr>
-Date: Sat, 14 Nov 2015 17:22:07 +0100
-Subject: [PATCH] brcmfmac: constify brcmf_bus_ops structures
-
-The brcmf_bus_ops structures are never modified, so declare them as const.
-
-Done with the help of Coccinelle.
-
-Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/bus.h
-@@ -137,7 +137,7 @@ struct brcmf_bus {
- 	bool always_use_fws_queue;
- 	bool wowl_supported;
- 
--	struct brcmf_bus_ops *ops;
-+	const struct brcmf_bus_ops *ops;
- 	struct brcmf_bus_msgbuf *msgbuf;
- };
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -1413,7 +1413,7 @@ static int brcmf_pcie_get_memdump(struct
- }
- 
- 
--static struct brcmf_bus_ops brcmf_pcie_bus_ops = {
-+static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
- 	.txdata = brcmf_pcie_tx,
- 	.stop = brcmf_pcie_down,
- 	.txctl = brcmf_pcie_tx_ctlpkt,
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -4025,7 +4025,7 @@ brcmf_sdio_watchdog(unsigned long data)
- 	}
- }
- 
--static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
-+static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
- 	.stop = brcmf_sdio_bus_stop,
- 	.preinit = brcmf_sdio_bus_preinit,
- 	.txdata = brcmf_sdio_bus_txdata,
---- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-@@ -1163,7 +1163,7 @@ static void brcmf_usb_wowl_config(struct
- 		device_set_wakeup_enable(devinfo->dev, false);
- }
- 
--static struct brcmf_bus_ops brcmf_usb_bus_ops = {
-+static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
- 	.txdata = brcmf_usb_tx,
- 	.stop = brcmf_usb_down,
- 	.txctl = brcmf_usb_tx_ctlpkt,
diff --git a/package/kernel/mac80211/patches/376-0001-brcmfmac-Cleanup-ssid-storage.patch b/package/kernel/mac80211/patches/376-0001-brcmfmac-Cleanup-ssid-storage.patch
deleted file mode 100644
index 83f1ebe907e4da7993a94381be8b87e78248ac11..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0001-brcmfmac-Cleanup-ssid-storage.patch
+++ /dev/null
@@ -1,251 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:37 +0100
-Subject: [PATCH] brcmfmac: Cleanup ssid storage.
-
-SSIDs used for connect and p2p got stored, but never used.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -959,7 +959,7 @@ brcmf_run_escan(struct brcmf_cfg80211_in
- 		params_size += sizeof(u32) * ((request->n_channels + 1) / 2);
- 
- 		/* Allocate space for populating ssids in struct */
--		params_size += sizeof(struct brcmf_ssid) * request->n_ssids;
-+		params_size += sizeof(struct brcmf_ssid_le) * request->n_ssids;
- 	}
- 
- 	params = kzalloc(params_size, GFP_KERNEL);
-@@ -1291,6 +1291,7 @@ brcmf_cfg80211_join_ibss(struct wiphy *w
- 	s32 wsec = 0;
- 	s32 bcnprd;
- 	u16 chanspec;
-+	u32 ssid_len;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 	if (!check_vif_up(ifp->vif))
-@@ -1368,17 +1369,15 @@ brcmf_cfg80211_join_ibss(struct wiphy *w
- 	memset(&join_params, 0, sizeof(struct brcmf_join_params));
- 
- 	/* SSID */
--	profile->ssid.SSID_len = min_t(u32, params->ssid_len, 32);
--	memcpy(profile->ssid.SSID, params->ssid, profile->ssid.SSID_len);
--	memcpy(join_params.ssid_le.SSID, params->ssid, profile->ssid.SSID_len);
--	join_params.ssid_le.SSID_len = cpu_to_le32(profile->ssid.SSID_len);
-+	ssid_len = min_t(u32, params->ssid_len, IEEE80211_MAX_SSID_LEN);
-+	memcpy(join_params.ssid_le.SSID, params->ssid, ssid_len);
-+	join_params.ssid_le.SSID_len = cpu_to_le32(ssid_len);
- 	join_params_size = sizeof(join_params.ssid_le);
- 
- 	/* BSSID */
- 	if (params->bssid) {
- 		memcpy(join_params.params_le.bssid, params->bssid, ETH_ALEN);
--		join_params_size = sizeof(join_params.ssid_le) +
--				   BRCMF_ASSOC_PARAMS_FIXED_SIZE;
-+		join_params_size += BRCMF_ASSOC_PARAMS_FIXED_SIZE;
- 		memcpy(profile->bssid, params->bssid, ETH_ALEN);
- 	} else {
- 		eth_broadcast_addr(join_params.params_le.bssid);
-@@ -1728,7 +1727,6 @@ brcmf_cfg80211_connect(struct wiphy *wip
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
--	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
- 	struct ieee80211_channel *chan = sme->channel;
- 	struct brcmf_join_params join_params;
- 	size_t join_params_size;
-@@ -1739,6 +1737,7 @@ brcmf_cfg80211_connect(struct wiphy *wip
- 	struct brcmf_ext_join_params_le *ext_join_params;
- 	u16 chanspec;
- 	s32 err = 0;
-+	u32 ssid_len;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 	if (!check_vif_up(ifp->vif))
-@@ -1824,15 +1823,6 @@ brcmf_cfg80211_connect(struct wiphy *wip
- 		goto done;
- 	}
- 
--	profile->ssid.SSID_len = min_t(u32, (u32)sizeof(profile->ssid.SSID),
--				       (u32)sme->ssid_len);
--	memcpy(&profile->ssid.SSID, sme->ssid, profile->ssid.SSID_len);
--	if (profile->ssid.SSID_len < IEEE80211_MAX_SSID_LEN) {
--		profile->ssid.SSID[profile->ssid.SSID_len] = 0;
--		brcmf_dbg(CONN, "SSID \"%s\", len (%d)\n", profile->ssid.SSID,
--			  profile->ssid.SSID_len);
--	}
--
- 	/* Join with specific BSSID and cached SSID
- 	 * If SSID is zero join based on BSSID only
- 	 */
-@@ -1845,9 +1835,12 @@ brcmf_cfg80211_connect(struct wiphy *wip
- 		err = -ENOMEM;
- 		goto done;
- 	}
--	ext_join_params->ssid_le.SSID_len = cpu_to_le32(profile->ssid.SSID_len);
--	memcpy(&ext_join_params->ssid_le.SSID, sme->ssid,
--	       profile->ssid.SSID_len);
-+	ssid_len = min_t(u32, sme->ssid_len, IEEE80211_MAX_SSID_LEN);
-+	ext_join_params->ssid_le.SSID_len = cpu_to_le32(ssid_len);
-+	memcpy(&ext_join_params->ssid_le.SSID, sme->ssid, ssid_len);
-+	if (ssid_len < IEEE80211_MAX_SSID_LEN)
-+		brcmf_dbg(CONN, "SSID \"%s\", len (%d)\n",
-+			  ext_join_params->ssid_le.SSID, ssid_len);
- 
- 	/* Set up join scan parameters */
- 	ext_join_params->scan_le.scan_type = -1;
-@@ -1895,8 +1888,8 @@ brcmf_cfg80211_connect(struct wiphy *wip
- 	memset(&join_params, 0, sizeof(join_params));
- 	join_params_size = sizeof(join_params.ssid_le);
- 
--	memcpy(&join_params.ssid_le.SSID, sme->ssid, profile->ssid.SSID_len);
--	join_params.ssid_le.SSID_len = cpu_to_le32(profile->ssid.SSID_len);
-+	memcpy(&join_params.ssid_le.SSID, sme->ssid, ssid_len);
-+	join_params.ssid_le.SSID_len = cpu_to_le32(ssid_len);
- 
- 	if (sme->bssid)
- 		memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN);
-@@ -2775,9 +2768,7 @@ CleanUp:
- static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
- 				 struct brcmf_if *ifp)
- {
--	struct brcmf_cfg80211_profile *profile = ndev_to_prof(ifp->ndev);
- 	struct brcmf_bss_info_le *bi;
--	struct brcmf_ssid *ssid;
- 	const struct brcmf_tlv *tim;
- 	u16 beacon_interval;
- 	u8 dtim_period;
-@@ -2789,8 +2780,6 @@ static s32 brcmf_update_bss_info(struct
- 	if (brcmf_is_ibssmode(ifp->vif))
- 		return err;
- 
--	ssid = &profile->ssid;
--
- 	*(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX);
- 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO,
- 				     cfg->extra_buf, WL_EXTRA_BUF_MAX);
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-@@ -124,13 +124,11 @@ struct brcmf_cfg80211_security {
- /**
-  * struct brcmf_cfg80211_profile - profile information.
-  *
-- * @ssid: ssid of associated/associating ap.
-  * @bssid: bssid of joined/joining ibss.
-  * @sec: security information.
-  * @key: key information
-  */
- struct brcmf_cfg80211_profile {
--	struct brcmf_ssid ssid;
- 	u8 bssid[ETH_ALEN];
- 	struct brcmf_cfg80211_security sec;
- 	struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-@@ -282,14 +282,9 @@ struct brcm_rateset_le {
- 	u8 rates[BRCMF_MAXRATES_IN_SET];
- };
- 
--struct brcmf_ssid {
--	u32 SSID_len;
--	unsigned char SSID[32];
--};
--
- struct brcmf_ssid_le {
- 	__le32 SSID_len;
--	unsigned char SSID[32];
-+	unsigned char SSID[IEEE80211_MAX_SSID_LEN];
- };
- 
- struct brcmf_scan_params_le {
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -642,7 +642,6 @@ static s32 brcmf_p2p_escan(struct brcmf_
- 	struct brcmf_cfg80211_vif *vif;
- 	struct brcmf_p2p_scan_le *p2p_params;
- 	struct brcmf_scan_params_le *sparams;
--	struct brcmf_ssid ssid;
- 
- 	memsize += num_chans * sizeof(__le16);
- 	memblk = kzalloc(memsize, GFP_KERNEL);
-@@ -655,16 +654,16 @@ static s32 brcmf_p2p_escan(struct brcmf_
- 		ret = -EINVAL;
- 		goto exit;
- 	}
-+	p2p_params = (struct brcmf_p2p_scan_le *)memblk;
-+	sparams = &p2p_params->eparams.params_le;
- 
- 	switch (search_state) {
- 	case WL_P2P_DISC_ST_SEARCH:
- 		/*
- 		 * If we in SEARCH STATE, we don't need to set SSID explictly
--		 * because dongle use P2P WILDCARD internally by default
-+		 * because dongle use P2P WILDCARD internally by default, use
-+		 * null ssid, which it is already due to kzalloc.
- 		 */
--		/* use null ssid */
--		ssid.SSID_len = 0;
--		memset(ssid.SSID, 0, sizeof(ssid.SSID));
- 		break;
- 	case WL_P2P_DISC_ST_SCAN:
- 		/*
-@@ -673,8 +672,10 @@ static s32 brcmf_p2p_escan(struct brcmf_
- 		 * P2P WILDCARD because we just do broadcast scan unless
- 		 * setting SSID.
- 		 */
--		ssid.SSID_len = BRCMF_P2P_WILDCARD_SSID_LEN;
--		memcpy(ssid.SSID, BRCMF_P2P_WILDCARD_SSID, ssid.SSID_len);
-+		sparams->ssid_le.SSID_len =
-+				cpu_to_le32(BRCMF_P2P_WILDCARD_SSID_LEN);
-+		memcpy(sparams->ssid_le.SSID, BRCMF_P2P_WILDCARD_SSID,
-+		       BRCMF_P2P_WILDCARD_SSID_LEN);
- 		break;
- 	default:
- 		brcmf_err(" invalid search state %d\n", search_state);
-@@ -687,11 +688,9 @@ static s32 brcmf_p2p_escan(struct brcmf_
- 	/*
- 	 * set p2p scan parameters.
- 	 */
--	p2p_params = (struct brcmf_p2p_scan_le *)memblk;
- 	p2p_params->type = 'E';
- 
- 	/* determine the scan engine parameters */
--	sparams = &p2p_params->eparams.params_le;
- 	sparams->bss_type = DOT11_BSSTYPE_ANY;
- 	if (p2p->cfg->active_scan)
- 		sparams->scan_type = 0;
-@@ -699,9 +698,6 @@ static s32 brcmf_p2p_escan(struct brcmf_
- 		sparams->scan_type = 1;
- 
- 	eth_broadcast_addr(sparams->bssid);
--	if (ssid.SSID_len)
--		memcpy(sparams->ssid_le.SSID, ssid.SSID, ssid.SSID_len);
--	sparams->ssid_le.SSID_len = cpu_to_le32(ssid.SSID_len);
- 	sparams->home_time = cpu_to_le32(P2PAPI_SCAN_HOME_TIME_MS);
- 
- 	/*
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
-@@ -112,7 +112,6 @@ struct afx_hdl {
-  * @int_addr: P2P interface address.
-  * @bss_idx: informate for P2P bss types.
-  * @listen_timer: timer for @WL_P2P_DISC_ST_LISTEN discover state.
-- * @ssid: ssid for P2P GO.
-  * @listen_channel: channel for @WL_P2P_DISC_ST_LISTEN discover state.
-  * @remain_on_channel: contains copy of struct used by cfg80211.
-  * @remain_on_channel_cookie: cookie counter for remain on channel cmd
-@@ -133,7 +132,6 @@ struct brcmf_p2p_info {
- 	u8 int_addr[ETH_ALEN];
- 	struct p2p_bss bss_idx[P2PAPI_BSSCFG_MAX];
- 	struct timer_list listen_timer;
--	struct brcmf_ssid ssid;
- 	u8 listen_channel;
- 	struct ieee80211_channel remain_on_channel;
- 	u32 remain_on_channel_cookie;
diff --git a/package/kernel/mac80211/patches/376-0002-brcmfmac-Return-actual-error-by-fwil.patch b/package/kernel/mac80211/patches/376-0002-brcmfmac-Return-actual-error-by-fwil.patch
deleted file mode 100644
index 8672c18f6b02e22a525b71f07ea1b981e073a080..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0002-brcmfmac-Return-actual-error-by-fwil.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:38 +0100
-Subject: [PATCH] brcmfmac: Return actual error by fwil.
-
-FWIL is always mapping back errors to EBADE. This is not very
-conventient when trying to understand problems by reading logs.
-Some callers print the error code, but that is quite useless
-when the exact error code is not returned. It also makes it
-impossible to differentiate based on error code. This patch
-changes the return of EBADE into the actual error code.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.c
-@@ -126,7 +126,8 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
- 
- 	brcmf_dbg(FIL, "Failed: %s (%d)\n",
- 		  brcmf_fil_get_errstr((u32)(-err)), err);
--	return -EBADE;
-+
-+	return err;
- }
- 
- s32
diff --git a/package/kernel/mac80211/patches/376-0003-brcmfmac-Change-error-print-on-wlan0-existence.patch b/package/kernel/mac80211/patches/376-0003-brcmfmac-Change-error-print-on-wlan0-existence.patch
deleted file mode 100644
index 1cfab2157d04332813e48e4daa153a976c0f3e37..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0003-brcmfmac-Change-error-print-on-wlan0-existence.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:39 +0100
-Subject: [PATCH] brcmfmac: Change error print on wlan0 existence.
-
-During initialization of the device, but also on some other
-moments the driver prints an error that the netdev already exists.
-This is a result of the way the driver is initializing the
-firmware and not really an error. The code is not treating it as
-an error either. This error print has resulted in many questions
-by users and is confusing and incorrect. This patch changes the
-error log into a debug info log.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -811,14 +811,15 @@ struct brcmf_if *brcmf_add_if(struct brc
- 	 * in case we missed the BRCMF_E_IF_DEL event.
- 	 */
- 	if (ifp) {
--		brcmf_err("ERROR: netdev:%s already exists\n",
--			  ifp->ndev->name);
- 		if (ifidx) {
-+			brcmf_err("ERROR: netdev:%s already exists\n",
-+				  ifp->ndev->name);
- 			netif_stop_queue(ifp->ndev);
- 			brcmf_net_detach(ifp->ndev);
- 			drvr->iflist[bsscfgidx] = NULL;
- 		} else {
--			brcmf_err("ignore IF event\n");
-+			brcmf_dbg(INFO, "netdev:%s ignore IF event\n",
-+				  ifp->ndev->name);
- 			return ERR_PTR(-EINVAL);
- 		}
- 	}
diff --git a/package/kernel/mac80211/patches/376-0004-brcmfmac-no-retries-on-rxglom-superframe-errors.patch b/package/kernel/mac80211/patches/376-0004-brcmfmac-no-retries-on-rxglom-superframe-errors.patch
deleted file mode 100644
index dfc3a983bdf1859f654503f514a123e8de7e191d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0004-brcmfmac-no-retries-on-rxglom-superframe-errors.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Franky Lin <frankyl@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:40 +0100
-Subject: [PATCH] brcmfmac: no retries on rxglom superframe errors
-
-Aborting the current read attempt on the superframe also removes the
-packet from the pipeline. Retries should not be attempted on the next
-packet since it would not be a superframe(either a superframe descriptor
-or other data packet) and should not be handled by brcmf_sdio_rxglom
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Signed-off-by: Franky Lin <frankyl@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -460,7 +460,6 @@ struct brcmf_sdio {
- 
- 	struct sk_buff *glomd;	/* Packet containing glomming descriptor */
- 	struct sk_buff_head glom; /* Packet list for glommed superframe */
--	uint glomerr;		/* Glom packet read errors */
- 
- 	u8 *rxbuf;		/* Buffer for receiving control packets */
- 	uint rxblen;		/* Allocated length of rxbuf */
-@@ -1654,20 +1653,15 @@ static u8 brcmf_sdio_rxglom(struct brcmf
- 		sdio_release_host(bus->sdiodev->func[1]);
- 		bus->sdcnt.f2rxdata++;
- 
--		/* On failure, kill the superframe, allow a couple retries */
-+		/* On failure, kill the superframe */
- 		if (errcode < 0) {
- 			brcmf_err("glom read of %d bytes failed: %d\n",
- 				  dlen, errcode);
- 
- 			sdio_claim_host(bus->sdiodev->func[1]);
--			if (bus->glomerr++ < 3) {
--				brcmf_sdio_rxfail(bus, true, true);
--			} else {
--				bus->glomerr = 0;
--				brcmf_sdio_rxfail(bus, true, false);
--				bus->sdcnt.rxglomfail++;
--				brcmf_sdio_free_glom(bus);
--			}
-+			brcmf_sdio_rxfail(bus, true, false);
-+			bus->sdcnt.rxglomfail++;
-+			brcmf_sdio_free_glom(bus);
- 			sdio_release_host(bus->sdiodev->func[1]);
- 			return 0;
- 		}
-@@ -1708,19 +1702,11 @@ static u8 brcmf_sdio_rxglom(struct brcmf
- 		}
- 
- 		if (errcode) {
--			/* Terminate frame on error, request
--				 a couple retries */
-+			/* Terminate frame on error */
- 			sdio_claim_host(bus->sdiodev->func[1]);
--			if (bus->glomerr++ < 3) {
--				/* Restore superframe header space */
--				skb_push(pfirst, sfdoff);
--				brcmf_sdio_rxfail(bus, true, true);
--			} else {
--				bus->glomerr = 0;
--				brcmf_sdio_rxfail(bus, true, false);
--				bus->sdcnt.rxglomfail++;
--				brcmf_sdio_free_glom(bus);
--			}
-+			brcmf_sdio_rxfail(bus, true, false);
-+			bus->sdcnt.rxglomfail++;
-+			brcmf_sdio_free_glom(bus);
- 			sdio_release_host(bus->sdiodev->func[1]);
- 			bus->cur_read.len = 0;
- 			return 0;
diff --git a/package/kernel/mac80211/patches/376-0005-brcmfmac-Remove-redundant-parameter-action-from-scan.patch b/package/kernel/mac80211/patches/376-0005-brcmfmac-Remove-redundant-parameter-action-from-scan.patch
deleted file mode 100644
index ede1f479841c15cb9c14c08615a689605ea3a3bf..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0005-brcmfmac-Remove-redundant-parameter-action-from-scan.patch
+++ /dev/null
@@ -1,108 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:41 +0100
-Subject: [PATCH] brcmfmac: Remove redundant parameter action from scan.
-
-ESCAN is always performed using action start scan. No need to
-pass this parameter on to different functions.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -945,7 +945,7 @@ static void brcmf_escan_prep(struct brcm
- 
- static s32
- brcmf_run_escan(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp,
--		struct cfg80211_scan_request *request, u16 action)
-+		struct cfg80211_scan_request *request)
- {
- 	s32 params_size = BRCMF_SCAN_PARAMS_FIXED_SIZE +
- 			  offsetof(struct brcmf_escan_params_le, params_le);
-@@ -970,7 +970,7 @@ brcmf_run_escan(struct brcmf_cfg80211_in
- 	BUG_ON(params_size + sizeof("escan") >= BRCMF_DCMD_MEDLEN);
- 	brcmf_escan_prep(cfg, &params->params_le, request);
- 	params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION);
--	params->action = cpu_to_le16(action);
-+	params->action = cpu_to_le16(WL_ESCAN_ACTION_START);
- 	params->sync_id = cpu_to_le16(0x1234);
- 
- 	err = brcmf_fil_iovar_data_set(ifp, "escan", params, params_size);
-@@ -1012,7 +1012,7 @@ brcmf_do_escan(struct brcmf_cfg80211_inf
- 	results->count = 0;
- 	results->buflen = WL_ESCAN_RESULTS_FIXED_SIZE;
- 
--	err = escan->run(cfg, ifp, request, WL_ESCAN_ACTION_START);
-+	err = escan->run(cfg, ifp, request);
- 	if (err)
- 		brcmf_scan_config_mpc(ifp, 1);
- 	return err;
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-@@ -231,7 +231,7 @@ struct escan_info {
- 	struct wiphy *wiphy;
- 	struct brcmf_if *ifp;
- 	s32 (*run)(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp,
--		   struct cfg80211_scan_request *request, u16 action);
-+		   struct cfg80211_scan_request *request);
- };
- 
- /**
---- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
-@@ -625,11 +625,10 @@ exit:
-  * @num_chans: number of channels to scan.
-  * @chanspecs: channel parameters for @num_chans channels.
-  * @search_state: P2P discover state to use.
-- * @action: scan action to pass to firmware.
-  * @bss_type: type of P2P bss.
-  */
- static s32 brcmf_p2p_escan(struct brcmf_p2p_info *p2p, u32 num_chans,
--			   u16 chanspecs[], s32 search_state, u16 action,
-+			   u16 chanspecs[], s32 search_state,
- 			   enum p2p_bss_type bss_type)
- {
- 	s32 ret = 0;
-@@ -738,7 +737,7 @@ static s32 brcmf_p2p_escan(struct brcmf_
- 
- 	/* set the escan specific parameters */
- 	p2p_params->eparams.version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION);
--	p2p_params->eparams.action =  cpu_to_le16(action);
-+	p2p_params->eparams.action =  cpu_to_le16(WL_ESCAN_ACTION_START);
- 	p2p_params->eparams.sync_id = cpu_to_le16(0x1234);
- 	/* perform p2p scan on primary device */
- 	ret = brcmf_fil_bsscfg_data_set(vif->ifp, "p2p_scan", memblk, memsize);
-@@ -762,8 +761,7 @@ exit:
-  */
- static s32 brcmf_p2p_run_escan(struct brcmf_cfg80211_info *cfg,
- 			       struct brcmf_if *ifp,
--			       struct cfg80211_scan_request *request,
--			       u16 action)
-+			       struct cfg80211_scan_request *request)
- {
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
- 	s32 err = 0;
-@@ -823,7 +821,7 @@ static s32 brcmf_p2p_run_escan(struct br
- 			num_nodfs++;
- 		}
- 		err = brcmf_p2p_escan(p2p, num_nodfs, chanspecs, search_state,
--				      action, P2PAPI_BSSCFG_DEVICE);
-+				      P2PAPI_BSSCFG_DEVICE);
- 		kfree(chanspecs);
- 	}
- exit:
-@@ -1092,8 +1090,7 @@ static s32 brcmf_p2p_act_frm_search(stru
- 		default_chan_list[2] = ch.chspec;
- 	}
- 	err = brcmf_p2p_escan(p2p, channel_cnt, default_chan_list,
--			      WL_P2P_DISC_ST_SEARCH, WL_ESCAN_ACTION_START,
--			      P2PAPI_BSSCFG_DEVICE);
-+			      WL_P2P_DISC_ST_SEARCH, P2PAPI_BSSCFG_DEVICE);
- 	kfree(default_chan_list);
- exit:
- 	return err;
diff --git a/package/kernel/mac80211/patches/376-0006-brcmfmac-Cleanup-roaming-configuration.patch b/package/kernel/mac80211/patches/376-0006-brcmfmac-Cleanup-roaming-configuration.patch
deleted file mode 100644
index 41b8770dbd400b06eecd6204dbd24755a95331eb..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0006-brcmfmac-Cleanup-roaming-configuration.patch
+++ /dev/null
@@ -1,180 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:42 +0100
-Subject: [PATCH] brcmfmac: Cleanup roaming configuration.
-
-Put all roaming configuration related code in one place and
-configure timeout based upon roaming setting.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -4755,7 +4755,6 @@ struct brcmf_cfg80211_vif *brcmf_alloc_v
- 	vif->wdev.iftype = type;
- 
- 	vif->pm_block = pm_block;
--	vif->roam_off = -1;
- 
- 	brcmf_init_prof(&vif->profile);
- 
-@@ -5305,35 +5304,33 @@ static void init_vif_event(struct brcmf_
- 	mutex_init(&event->vif_event_lock);
- }
- 
--static s32
--brcmf_dongle_roam(struct brcmf_if *ifp, u32 bcn_timeout)
-+static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
- {
--	s32 err = 0;
-+	s32 err;
-+	u32 bcn_timeout;
- 	__le32 roamtrigger[2];
- 	__le32 roam_delta[2];
- 
--	/*
--	 * Setup timeout if Beacons are lost and roam is
--	 * off to report link down
--	 */
--	if (brcmf_roamoff) {
--		err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout", bcn_timeout);
--		if (err) {
--			brcmf_err("bcn_timeout error (%d)\n", err);
--			goto dongle_rom_out;
--		}
-+	/* Configure beacon timeout value based upon roaming setting */
-+	if (brcmf_roamoff)
-+		bcn_timeout = BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_OFF;
-+	else
-+		bcn_timeout = BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON;
-+	err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout", bcn_timeout);
-+	if (err) {
-+		brcmf_err("bcn_timeout error (%d)\n", err);
-+		goto roam_setup_done;
- 	}
- 
--	/*
--	 * Enable/Disable built-in roaming to allow supplicant
--	 * to take care of roaming
-+	/* Enable/Disable built-in roaming to allow supplicant to take care of
-+	 * roaming.
- 	 */
- 	brcmf_dbg(INFO, "Internal Roaming = %s\n",
- 		  brcmf_roamoff ? "Off" : "On");
- 	err = brcmf_fil_iovar_int_set(ifp, "roam_off", !!(brcmf_roamoff));
- 	if (err) {
- 		brcmf_err("roam_off error (%d)\n", err);
--		goto dongle_rom_out;
-+		goto roam_setup_done;
- 	}
- 
- 	roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL);
-@@ -5342,7 +5339,7 @@ brcmf_dongle_roam(struct brcmf_if *ifp,
- 				     (void *)roamtrigger, sizeof(roamtrigger));
- 	if (err) {
- 		brcmf_err("WLC_SET_ROAM_TRIGGER error (%d)\n", err);
--		goto dongle_rom_out;
-+		goto roam_setup_done;
- 	}
- 
- 	roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
-@@ -5351,10 +5348,10 @@ brcmf_dongle_roam(struct brcmf_if *ifp,
- 				     (void *)roam_delta, sizeof(roam_delta));
- 	if (err) {
- 		brcmf_err("WLC_SET_ROAM_DELTA error (%d)\n", err);
--		goto dongle_rom_out;
-+		goto roam_setup_done;
- 	}
- 
--dongle_rom_out:
-+roam_setup_done:
- 	return err;
- }
- 
-@@ -6069,7 +6066,7 @@ static s32 brcmf_config_dongle(struct br
- 	brcmf_dbg(INFO, "power save set to %s\n",
- 		  (power_mode ? "enabled" : "disabled"));
- 
--	err = brcmf_dongle_roam(ifp, WL_BEACON_TIMEOUT);
-+	err = brcmf_dongle_roam(ifp);
- 	if (err)
- 		goto default_conf_out;
- 	err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
-@@ -28,7 +28,6 @@
- #define WL_EXTRA_BUF_MAX		2048
- #define WL_ROAM_TRIGGER_LEVEL		-75
- #define WL_ROAM_DELTA			20
--#define WL_BEACON_TIMEOUT		3
- 
- #define WL_SCAN_CHANNEL_TIME		40
- #define WL_SCAN_UNASSOC_TIME		40
-@@ -77,6 +76,9 @@
- 
- #define BRCMF_MAX_DEFAULT_KEYS		4
- 
-+/* beacon loss timeout defaults */
-+#define BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON	2
-+#define BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_OFF	4
- 
- /**
-  * enum brcmf_scan_status - scan engine status
-@@ -178,7 +180,6 @@ struct vif_saved_ie {
-  * @ifp: lower layer interface pointer
-  * @wdev: wireless device.
-  * @profile: profile information.
-- * @roam_off: roaming state.
-  * @sme_state: SME state using enum brcmf_vif_status bits.
-  * @pm_block: power-management blocked.
-  * @list: linked list.
-@@ -189,7 +190,6 @@ struct brcmf_cfg80211_vif {
- 	struct brcmf_if *ifp;
- 	struct wireless_dev wdev;
- 	struct brcmf_cfg80211_profile profile;
--	s32 roam_off;
- 	unsigned long sme_state;
- 	bool pm_block;
- 	struct vif_saved_ie saved_ie;
---- a/drivers/net/wireless/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/common.c
-@@ -29,7 +29,6 @@
- 
- const u8 ALLFFMAC[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
- 
--#define BRCMF_DEFAULT_BCN_TIMEOUT	3
- #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME	40
- #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME	40
- 
-@@ -107,26 +106,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
- 		goto done;
- 	}
- 
--	/*
--	 * Setup timeout if Beacons are lost and roam is off to report
--	 * link down
--	 */
--	err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout",
--				      BRCMF_DEFAULT_BCN_TIMEOUT);
--	if (err) {
--		brcmf_err("bcn_timeout error (%d)\n", err);
--		goto done;
--	}
--
--	/* Enable/Disable build-in roaming to allowed ext supplicant to take
--	 * of romaing
--	 */
--	err = brcmf_fil_iovar_int_set(ifp, "roam_off", 1);
--	if (err) {
--		brcmf_err("roam_off error (%d)\n", err);
--		goto done;
--	}
--
- 	/* Setup join_pref to select target by RSSI(with boost on 5GHz) */
- 	join_pref_params[0].type = BRCMF_JOIN_PREF_RSSI_DELTA;
- 	join_pref_params[0].len = 2;
diff --git a/package/kernel/mac80211/patches/376-0007-brcmfmac-Add-beamforming-support.patch b/package/kernel/mac80211/patches/376-0007-brcmfmac-Add-beamforming-support.patch
deleted file mode 100644
index 395166beed59ee2d97cb4546a51d32a187f52a1c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0007-brcmfmac-Add-beamforming-support.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:43 +0100
-Subject: [PATCH] brcmfmac: Add beamforming support.
-
-Some devices support beamforming. This patch enables tx beamforming
-if supported and reports beamforming capabilities per channel if
-supported.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -5671,7 +5671,8 @@ static __le16 brcmf_get_mcs_map(u32 ncha
- }
- 
- static void brcmf_update_vht_cap(struct ieee80211_supported_band *band,
--				 u32 bw_cap[2], u32 nchain)
-+				 u32 bw_cap[2], u32 nchain, u32 txstreams,
-+				 u32 txbf_bfe_cap, u32 txbf_bfr_cap)
- {
- 	__le16 mcs_map;
- 
-@@ -5690,6 +5691,25 @@ static void brcmf_update_vht_cap(struct
- 	mcs_map = brcmf_get_mcs_map(nchain, IEEE80211_VHT_MCS_SUPPORT_0_9);
- 	band->vht_cap.vht_mcs.rx_mcs_map = mcs_map;
- 	band->vht_cap.vht_mcs.tx_mcs_map = mcs_map;
-+
-+	/* Beamforming support information */
-+	if (txbf_bfe_cap & BRCMF_TXBF_SU_BFE_CAP)
-+		band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
-+	if (txbf_bfe_cap & BRCMF_TXBF_MU_BFE_CAP)
-+		band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
-+	if (txbf_bfr_cap & BRCMF_TXBF_SU_BFR_CAP)
-+		band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
-+	if (txbf_bfr_cap & BRCMF_TXBF_MU_BFR_CAP)
-+		band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
-+
-+	if ((txbf_bfe_cap || txbf_bfr_cap) && (txstreams > 1)) {
-+		band->vht_cap.cap |=
-+			(2 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT);
-+		band->vht_cap.cap |= ((txstreams - 1) <<
-+				IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT);
-+		band->vht_cap.cap |=
-+			IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB;
-+	}
- }
- 
- static int brcmf_setup_wiphybands(struct wiphy *wiphy)
-@@ -5704,6 +5724,9 @@ static int brcmf_setup_wiphybands(struct
- 	int err;
- 	s32 i;
- 	struct ieee80211_supported_band *band;
-+	u32 txstreams = 0;
-+	u32 txbf_bfe_cap = 0;
-+	u32 txbf_bfr_cap = 0;
- 
- 	(void)brcmf_fil_iovar_int_get(ifp, "vhtmode", &vhtmode);
- 	err = brcmf_fil_iovar_int_get(ifp, "nmode", &nmode);
-@@ -5732,6 +5755,14 @@ static int brcmf_setup_wiphybands(struct
- 		return err;
- 	}
- 
-+	if (vhtmode) {
-+		(void)brcmf_fil_iovar_int_get(ifp, "txstreams", &txstreams);
-+		(void)brcmf_fil_iovar_int_get(ifp, "txbf_bfe_cap",
-+					      &txbf_bfe_cap);
-+		(void)brcmf_fil_iovar_int_get(ifp, "txbf_bfr_cap",
-+					      &txbf_bfr_cap);
-+	}
-+
- 	wiphy = cfg_to_wiphy(cfg);
- 	for (i = 0; i < ARRAY_SIZE(wiphy->bands); i++) {
- 		band = wiphy->bands[i];
-@@ -5741,7 +5772,8 @@ static int brcmf_setup_wiphybands(struct
- 		if (nmode)
- 			brcmf_update_ht_cap(band, bw_cap, nchain);
- 		if (vhtmode)
--			brcmf_update_vht_cap(band, bw_cap, nchain);
-+			brcmf_update_vht_cap(band, bw_cap, nchain, txstreams,
-+					     txbf_bfe_cap, txbf_bfr_cap);
- 	}
- 
- 	return 0;
---- a/drivers/net/wireless/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/common.c
-@@ -153,6 +153,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
- 		goto done;
- 	}
- 
-+	/* Enable tx beamforming, errors can be ignored (not supported) */
-+	(void)brcmf_fil_iovar_int_set(ifp, "txbf", 1);
-+
- 	/* do bus specific preinit here */
- 	err = brcmf_bus_preinit(ifp->drvr->bus_if);
- done:
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
-@@ -121,6 +121,11 @@
- 
- #define BRCMF_MAX_ASSOCLIST		128
- 
-+#define BRCMF_TXBF_SU_BFE_CAP		BIT(0)
-+#define BRCMF_TXBF_MU_BFE_CAP		BIT(1)
-+#define BRCMF_TXBF_SU_BFR_CAP		BIT(0)
-+#define BRCMF_TXBF_MU_BFR_CAP		BIT(1)
-+
- /* join preference types for join_pref iovar */
- enum brcmf_join_pref_types {
- 	BRCMF_JOIN_PREF_RSSI = 1,
diff --git a/package/kernel/mac80211/patches/376-0008-brcmfmac-assure-net_ratelimit-is-declared-before-use.patch b/package/kernel/mac80211/patches/376-0008-brcmfmac-assure-net_ratelimit-is-declared-before-use.patch
deleted file mode 100644
index d471eb54e00440dde63da66016e216a47b471b95..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0008-brcmfmac-assure-net_ratelimit-is-declared-before-use.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Arend van Spriel <arend@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:45 +0100
-Subject: [PATCH] brcmfmac: assure net_ratelimit() is declared before use
-
-Under some kernel configuration we get build issue with implicit
-declaration of net_ratelimit() function. Fix this by explicitly
-including the file providing the prototype.
-
-Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-@@ -17,6 +17,8 @@
- #ifndef BRCMFMAC_DEBUG_H
- #define BRCMFMAC_DEBUG_H
- 
-+#include <linux/net.h>	/* net_ratelimit() */
-+
- /* message levels */
- #define BRCMF_TRACE_VAL		0x00000002
- #define BRCMF_INFO_VAL		0x00000004
diff --git a/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch b/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch
deleted file mode 100644
index 0ec9d1030104b73c4233097156cc3743180f2be1..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch
+++ /dev/null
@@ -1,664 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:46 +0100
-Subject: [PATCH] brcmfmac: Unify methods to define and map firmware files.
-
-All bus drivers (sdio, usb and pcie) require firmware files which
-needs to be downloaded to the device, The definitions and mapping
-of device id and revision to firmware and nvram file is done by
-each bus driver. This patch creates common functions and defines
-to simplify and unify the definition of these firmware and nvram
-files and mapping.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -27,9 +27,9 @@
- #define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */
- #define BRCMF_FW_NVRAM_PCIEDEV_LEN		10	/* pcie/1/4/ + \0 */
- 
--char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
-+static char brcmf_firmware_path[BRCMF_FW_NAME_LEN];
- module_param_string(alternative_fw_path, brcmf_firmware_path,
--		    BRCMF_FW_PATH_LEN, 0440);
-+		    BRCMF_FW_NAME_LEN, 0440);
- 
- enum nvram_parser_state {
- 	IDLE,
-@@ -531,3 +531,43 @@ int brcmf_fw_get_firmwares(struct device
- 					   0);
- }
- 
-+int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
-+			      struct brcmf_firmware_mapping mapping_table[],
-+			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
-+			      char nvram_name[BRCMF_FW_NAME_LEN])
-+{
-+	u32 i;
-+	char end;
-+
-+	for (i = 0; i < table_size; i++) {
-+		if (mapping_table[i].chipid == chip &&
-+		    mapping_table[i].revmask & BIT(chiprev))
-+			break;
-+	}
-+
-+	if (i == table_size) {
-+		brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
-+		return -ENODEV;
-+	}
-+
-+	/* check if firmware path is provided by module parameter */
-+	if (brcmf_firmware_path[0] != '\0') {
-+		strlcpy(fw_name, brcmf_firmware_path, BRCMF_FW_NAME_LEN);
-+		if ((nvram_name) && (mapping_table[i].nvram))
-+			strlcpy(nvram_name, brcmf_firmware_path,
-+				BRCMF_FW_NAME_LEN);
-+
-+		end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
-+		if (end != '/') {
-+			strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
-+			if ((nvram_name) && (mapping_table[i].nvram))
-+				strlcat(nvram_name, "/", BRCMF_FW_NAME_LEN);
-+		}
-+	}
-+	strlcat(fw_name, mapping_table[i].fw, BRCMF_FW_NAME_LEN);
-+	if ((nvram_name) && (mapping_table[i].nvram))
-+		strlcat(nvram_name, mapping_table[i].nvram, BRCMF_FW_NAME_LEN);
-+
-+	return 0;
-+}
-+
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.h
-@@ -21,11 +21,51 @@
- #define BRCMF_FW_REQ_FLAGS		0x00F0
- #define  BRCMF_FW_REQ_NV_OPTIONAL	0x0010
- 
--#define	BRCMF_FW_PATH_LEN	256
--#define	BRCMF_FW_NAME_LEN	32
-+#define	BRCMF_FW_NAME_LEN		320
- 
--extern char brcmf_firmware_path[];
-+#define BRCMF_FW_DEFAULT_PATH		"brcm/"
- 
-+/**
-+ * struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware
-+ *	filename and nvram filename. Each bus type implementation should create
-+ *	a table of firmware mappings (using the macros defined below).
-+ *
-+ * @chipid: ID of chip.
-+ * @revmask: bitmask of revisions, e.g. 0x10 means rev 4 only, 0xf means rev 0-3
-+ * @fw: name of the firmware file.
-+ * @nvram: name of nvram file.
-+ */
-+struct brcmf_firmware_mapping {
-+	u32 chipid;
-+	u32 revmask;
-+	const char *fw;
-+	const char *nvram;
-+};
-+
-+#define BRCMF_FW_NVRAM_DEF(fw_nvram_name, fw, nvram) \
-+static const char BRCM_ ## fw_nvram_name ## _FIRMWARE_NAME[] = \
-+	BRCMF_FW_DEFAULT_PATH fw; \
-+static const char BRCM_ ## fw_nvram_name ## _NVRAM_NAME[] = \
-+	BRCMF_FW_DEFAULT_PATH nvram; \
-+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw); \
-+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH nvram)
-+
-+#define BRCMF_FW_DEF(fw_name, fw) \
-+static const char BRCM_ ## fw_name ## _FIRMWARE_NAME[] = \
-+	BRCMF_FW_DEFAULT_PATH fw; \
-+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw) \
-+
-+#define BRCMF_FW_NVRAM_ENTRY(chipid, mask, name) \
-+	{ chipid, mask, \
-+	  BRCM_ ## name ## _FIRMWARE_NAME, BRCM_ ## name ## _NVRAM_NAME }
-+
-+#define BRCMF_FW_ENTRY(chipid, mask, name) \
-+	{ chipid, mask, BRCM_ ## name ## _FIRMWARE_NAME, NULL }
-+
-+int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
-+			      struct brcmf_firmware_mapping mapping_table[],
-+			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
-+			      char nvram_name[BRCMF_FW_NAME_LEN]);
- void brcmf_fw_nvram_free(void *nvram);
- /*
-  * Request firmware(s) asynchronously. When the asynchronous request
---- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
-@@ -44,25 +44,29 @@ enum brcmf_pcie_state {
- 	BRCMFMAC_PCIE_STATE_UP
- };
- 
--
--#define BRCMF_PCIE_43602_FW_NAME		"brcm/brcmfmac43602-pcie.bin"
--#define BRCMF_PCIE_43602_NVRAM_NAME		"brcm/brcmfmac43602-pcie.txt"
--#define BRCMF_PCIE_4350_FW_NAME			"brcm/brcmfmac4350-pcie.bin"
--#define BRCMF_PCIE_4350_NVRAM_NAME		"brcm/brcmfmac4350-pcie.txt"
--#define BRCMF_PCIE_4356_FW_NAME			"brcm/brcmfmac4356-pcie.bin"
--#define BRCMF_PCIE_4356_NVRAM_NAME		"brcm/brcmfmac4356-pcie.txt"
--#define BRCMF_PCIE_43570_FW_NAME		"brcm/brcmfmac43570-pcie.bin"
--#define BRCMF_PCIE_43570_NVRAM_NAME		"brcm/brcmfmac43570-pcie.txt"
--#define BRCMF_PCIE_4358_FW_NAME			"brcm/brcmfmac4358-pcie.bin"
--#define BRCMF_PCIE_4358_NVRAM_NAME		"brcm/brcmfmac4358-pcie.txt"
--#define BRCMF_PCIE_4359_FW_NAME			"brcm/brcmfmac4359-pcie.bin"
--#define BRCMF_PCIE_4359_NVRAM_NAME		"brcm/brcmfmac4359-pcie.txt"
--#define BRCMF_PCIE_4365_FW_NAME			"brcm/brcmfmac4365b-pcie.bin"
--#define BRCMF_PCIE_4365_NVRAM_NAME		"brcm/brcmfmac4365b-pcie.txt"
--#define BRCMF_PCIE_4366_FW_NAME			"brcm/brcmfmac4366b-pcie.bin"
--#define BRCMF_PCIE_4366_NVRAM_NAME		"brcm/brcmfmac4366b-pcie.txt"
--#define BRCMF_PCIE_4371_FW_NAME			"brcm/brcmfmac4371-pcie.bin"
--#define BRCMF_PCIE_4371_NVRAM_NAME		"brcm/brcmfmac4371-pcie.txt"
-+BRCMF_FW_NVRAM_DEF(43602, "brcmfmac43602-pcie.bin", "brcmfmac43602-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4350, "brcmfmac4350-pcie.bin", "brcmfmac4350-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-pcie.bin", "brcmfmac4356-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(43570, "brcmfmac43570-pcie.bin", "brcmfmac43570-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4358, "brcmfmac4358-pcie.bin", "brcmfmac4358-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4359, "brcmfmac4359-pcie.bin", "brcmfmac4359-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4365B, "brcmfmac4365b-pcie.bin", "brcmfmac4365b-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4366B, "brcmfmac4366b-pcie.bin", "brcmfmac4366b-pcie.txt");
-+BRCMF_FW_NVRAM_DEF(4371, "brcmfmac4371-pcie.bin", "brcmfmac4371-pcie.txt");
-+
-+static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFFFF, 4350),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFFF, 4365B),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFFF, 4366B),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
-+};
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
- 
-@@ -202,26 +206,6 @@ enum brcmf_pcie_state {
- #define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB	3
- 
- 
--MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4350_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4350_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4358_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4358_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4359_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4359_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4365_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4365_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4366_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4366_NVRAM_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4371_FW_NAME);
--MODULE_FIRMWARE(BRCMF_PCIE_4371_NVRAM_NAME);
--
--
- struct brcmf_pcie_console {
- 	u32 base_addr;
- 	u32 buf_addr;
-@@ -258,8 +242,8 @@ struct brcmf_pciedev_info {
- 	enum brcmf_pcie_state state;
- 	bool in_irq;
- 	struct pci_dev *pdev;
--	char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
--	char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
-+	char fw_name[BRCMF_FW_NAME_LEN];
-+	char nvram_name[BRCMF_FW_NAME_LEN];
- 	void __iomem *regs;
- 	void __iomem *tcm;
- 	u32 tcm_size;
-@@ -1478,84 +1462,6 @@ brcmf_pcie_init_share_ram_info(struct br
- }
- 
- 
--static int brcmf_pcie_get_fwnames(struct brcmf_pciedev_info *devinfo)
--{
--	char *fw_name;
--	char *nvram_name;
--	uint fw_len, nv_len;
--	char end;
--
--	brcmf_dbg(PCIE, "Enter, chip 0x%04x chiprev %d\n", devinfo->ci->chip,
--		  devinfo->ci->chiprev);
--
--	switch (devinfo->ci->chip) {
--	case BRCM_CC_43602_CHIP_ID:
--		fw_name = BRCMF_PCIE_43602_FW_NAME;
--		nvram_name = BRCMF_PCIE_43602_NVRAM_NAME;
--		break;
--	case BRCM_CC_4350_CHIP_ID:
--		fw_name = BRCMF_PCIE_4350_FW_NAME;
--		nvram_name = BRCMF_PCIE_4350_NVRAM_NAME;
--		break;
--	case BRCM_CC_4356_CHIP_ID:
--		fw_name = BRCMF_PCIE_4356_FW_NAME;
--		nvram_name = BRCMF_PCIE_4356_NVRAM_NAME;
--		break;
--	case BRCM_CC_43567_CHIP_ID:
--	case BRCM_CC_43569_CHIP_ID:
--	case BRCM_CC_43570_CHIP_ID:
--		fw_name = BRCMF_PCIE_43570_FW_NAME;
--		nvram_name = BRCMF_PCIE_43570_NVRAM_NAME;
--		break;
--	case BRCM_CC_4358_CHIP_ID:
--		fw_name = BRCMF_PCIE_4358_FW_NAME;
--		nvram_name = BRCMF_PCIE_4358_NVRAM_NAME;
--		break;
--	case BRCM_CC_4359_CHIP_ID:
--		fw_name = BRCMF_PCIE_4359_FW_NAME;
--		nvram_name = BRCMF_PCIE_4359_NVRAM_NAME;
--		break;
--	case BRCM_CC_4365_CHIP_ID:
--		fw_name = BRCMF_PCIE_4365_FW_NAME;
--		nvram_name = BRCMF_PCIE_4365_NVRAM_NAME;
--		break;
--	case BRCM_CC_4366_CHIP_ID:
--		fw_name = BRCMF_PCIE_4366_FW_NAME;
--		nvram_name = BRCMF_PCIE_4366_NVRAM_NAME;
--		break;
--	case BRCM_CC_4371_CHIP_ID:
--		fw_name = BRCMF_PCIE_4371_FW_NAME;
--		nvram_name = BRCMF_PCIE_4371_NVRAM_NAME;
--		break;
--	default:
--		brcmf_err("Unsupported chip 0x%04x\n", devinfo->ci->chip);
--		return -ENODEV;
--	}
--
--	fw_len = sizeof(devinfo->fw_name) - 1;
--	nv_len = sizeof(devinfo->nvram_name) - 1;
--	/* check if firmware path is provided by module parameter */
--	if (brcmf_firmware_path[0] != '\0') {
--		strncpy(devinfo->fw_name, brcmf_firmware_path, fw_len);
--		strncpy(devinfo->nvram_name, brcmf_firmware_path, nv_len);
--		fw_len -= strlen(devinfo->fw_name);
--		nv_len -= strlen(devinfo->nvram_name);
--
--		end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
--		if (end != '/') {
--			strncat(devinfo->fw_name, "/", fw_len);
--			strncat(devinfo->nvram_name, "/", nv_len);
--			fw_len--;
--			nv_len--;
--		}
--	}
--	strncat(devinfo->fw_name, fw_name, fw_len);
--	strncat(devinfo->nvram_name, nvram_name, nv_len);
--
--	return 0;
--}
--
--
- static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
- 					const struct firmware *fw, void *nvram,
- 					u32 nvram_len)
-@@ -1891,7 +1797,10 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
- 	bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
- 	dev_set_drvdata(&pdev->dev, bus);
- 
--	ret = brcmf_pcie_get_fwnames(devinfo);
-+	ret = brcmf_fw_map_chip_to_name(devinfo->ci->chip, devinfo->ci->chiprev,
-+					brcmf_pcie_fwnames,
-+					ARRAY_SIZE(brcmf_pcie_fwnames),
-+					devinfo->fw_name, devinfo->nvram_name);
- 	if (ret)
- 		goto fail_bus;
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
-@@ -596,136 +596,41 @@ static const struct sdiod_drive_str sdio
- 	{4,  0x1}
- };
- 
--#define BCM43143_FIRMWARE_NAME		"brcm/brcmfmac43143-sdio.bin"
--#define BCM43143_NVRAM_NAME		"brcm/brcmfmac43143-sdio.txt"
--#define BCM43241B0_FIRMWARE_NAME	"brcm/brcmfmac43241b0-sdio.bin"
--#define BCM43241B0_NVRAM_NAME		"brcm/brcmfmac43241b0-sdio.txt"
--#define BCM43241B4_FIRMWARE_NAME	"brcm/brcmfmac43241b4-sdio.bin"
--#define BCM43241B4_NVRAM_NAME		"brcm/brcmfmac43241b4-sdio.txt"
--#define BCM43241B5_FIRMWARE_NAME	"brcm/brcmfmac43241b5-sdio.bin"
--#define BCM43241B5_NVRAM_NAME		"brcm/brcmfmac43241b5-sdio.txt"
--#define BCM4329_FIRMWARE_NAME		"brcm/brcmfmac4329-sdio.bin"
--#define BCM4329_NVRAM_NAME		"brcm/brcmfmac4329-sdio.txt"
--#define BCM4330_FIRMWARE_NAME		"brcm/brcmfmac4330-sdio.bin"
--#define BCM4330_NVRAM_NAME		"brcm/brcmfmac4330-sdio.txt"
--#define BCM4334_FIRMWARE_NAME		"brcm/brcmfmac4334-sdio.bin"
--#define BCM4334_NVRAM_NAME		"brcm/brcmfmac4334-sdio.txt"
--#define BCM43340_FIRMWARE_NAME		"brcm/brcmfmac43340-sdio.bin"
--#define BCM43340_NVRAM_NAME		"brcm/brcmfmac43340-sdio.txt"
--#define BCM4335_FIRMWARE_NAME		"brcm/brcmfmac4335-sdio.bin"
--#define BCM4335_NVRAM_NAME		"brcm/brcmfmac4335-sdio.txt"
--#define BCM43362_FIRMWARE_NAME		"brcm/brcmfmac43362-sdio.bin"
--#define BCM43362_NVRAM_NAME		"brcm/brcmfmac43362-sdio.txt"
--#define BCM4339_FIRMWARE_NAME		"brcm/brcmfmac4339-sdio.bin"
--#define BCM4339_NVRAM_NAME		"brcm/brcmfmac4339-sdio.txt"
--#define BCM43430_FIRMWARE_NAME		"brcm/brcmfmac43430-sdio.bin"
--#define BCM43430_NVRAM_NAME		"brcm/brcmfmac43430-sdio.txt"
--#define BCM43455_FIRMWARE_NAME		"brcm/brcmfmac43455-sdio.bin"
--#define BCM43455_NVRAM_NAME		"brcm/brcmfmac43455-sdio.txt"
--#define BCM4354_FIRMWARE_NAME		"brcm/brcmfmac4354-sdio.bin"
--#define BCM4354_NVRAM_NAME		"brcm/brcmfmac4354-sdio.txt"
--
--MODULE_FIRMWARE(BCM43143_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43143_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43241B0_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43241B0_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43241B4_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43241B4_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43241B5_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43241B5_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4329_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4329_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4330_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4330_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4334_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4334_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43340_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43340_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4335_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4335_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43430_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43430_NVRAM_NAME);
--MODULE_FIRMWARE(BCM43455_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM43455_NVRAM_NAME);
--MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME);
--MODULE_FIRMWARE(BCM4354_NVRAM_NAME);
--
--struct brcmf_firmware_names {
--	u32 chipid;
--	u32 revmsk;
--	const char *bin;
--	const char *nv;
-+BRCMF_FW_NVRAM_DEF(43143, "brcmfmac43143-sdio.bin", "brcmfmac43143-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43241B0, "brcmfmac43241b0-sdio.bin",
-+		   "brcmfmac43241b0-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43241B4, "brcmfmac43241b4-sdio.bin",
-+		   "brcmfmac43241b4-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43241B5, "brcmfmac43241b5-sdio.bin",
-+		   "brcmfmac43241b5-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(4329, "brcmfmac4329-sdio.bin", "brcmfmac4329-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(4330, "brcmfmac4330-sdio.bin", "brcmfmac4330-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(4334, "brcmfmac4334-sdio.bin", "brcmfmac4334-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43340, "brcmfmac43340-sdio.bin", "brcmfmac43340-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(4335, "brcmfmac4335-sdio.bin", "brcmfmac4335-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43362, "brcmfmac43362-sdio.bin", "brcmfmac43362-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(4339, "brcmfmac4339-sdio.bin", "brcmfmac4339-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43430, "brcmfmac43430-sdio.bin", "brcmfmac43430-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(43455, "brcmfmac43455-sdio.bin", "brcmfmac43455-sdio.txt");
-+BRCMF_FW_NVRAM_DEF(4354, "brcmfmac4354-sdio.bin", "brcmfmac4354-sdio.txt");
-+
-+static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, 43241B5),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, 4329),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, 43430),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
-+	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354)
- };
- 
--enum brcmf_firmware_type {
--	BRCMF_FIRMWARE_BIN,
--	BRCMF_FIRMWARE_NVRAM
--};
--
--#define BRCMF_FIRMWARE_NVRAM(name) \
--	name ## _FIRMWARE_NAME, name ## _NVRAM_NAME
--
--static const struct brcmf_firmware_names brcmf_fwname_data[] = {
--	{ BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43143) },
--	{ BRCM_CC_43241_CHIP_ID, 0x0000001F, BRCMF_FIRMWARE_NVRAM(BCM43241B0) },
--	{ BRCM_CC_43241_CHIP_ID, 0x00000020, BRCMF_FIRMWARE_NVRAM(BCM43241B4) },
--	{ BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43241B5) },
--	{ BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4329) },
--	{ BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
--	{ BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
--	{ BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43340) },
--	{ BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
--	{ BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
--	{ BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) },
--	{ BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43430) },
--	{ BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43455) },
--	{ BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) }
--};
--
--static int brcmf_sdio_get_fwnames(struct brcmf_chip *ci,
--				  struct brcmf_sdio_dev *sdiodev)
--{
--	int i;
--	char end;
--
--	for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) {
--		if (brcmf_fwname_data[i].chipid == ci->chip &&
--		    brcmf_fwname_data[i].revmsk & BIT(ci->chiprev))
--			break;
--	}
--
--	if (i == ARRAY_SIZE(brcmf_fwname_data)) {
--		brcmf_err("Unknown chipid %d [%d]\n", ci->chip, ci->chiprev);
--		return -ENODEV;
--	}
--
--	/* check if firmware path is provided by module parameter */
--	if (brcmf_firmware_path[0] != '\0') {
--		strlcpy(sdiodev->fw_name, brcmf_firmware_path,
--			sizeof(sdiodev->fw_name));
--		strlcpy(sdiodev->nvram_name, brcmf_firmware_path,
--			sizeof(sdiodev->nvram_name));
--
--		end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
--		if (end != '/') {
--			strlcat(sdiodev->fw_name, "/",
--				sizeof(sdiodev->fw_name));
--			strlcat(sdiodev->nvram_name, "/",
--				sizeof(sdiodev->nvram_name));
--		}
--	}
--	strlcat(sdiodev->fw_name, brcmf_fwname_data[i].bin,
--		sizeof(sdiodev->fw_name));
--	strlcat(sdiodev->nvram_name, brcmf_fwname_data[i].nv,
--		sizeof(sdiodev->nvram_name));
--
--	return 0;
--}
--
- static void pkt_align(struct sk_buff *p, int len, int align)
- {
- 	uint datalign;
-@@ -4252,7 +4157,10 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
- 	brcmf_sdio_debugfs_create(bus);
- 	brcmf_dbg(INFO, "completed!!\n");
- 
--	ret = brcmf_sdio_get_fwnames(bus->ci, sdiodev);
-+	ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev,
-+					brcmf_sdio_fwnames,
-+					ARRAY_SIZE(brcmf_sdio_fwnames),
-+					sdiodev->fw_name, sdiodev->nvram_name);
- 	if (ret)
- 		goto fail;
- 
---- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
-@@ -195,8 +195,8 @@ struct brcmf_sdio_dev {
- 	uint max_segment_size;
- 	uint txglomsz;
- 	struct sg_table sgtable;
--	char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
--	char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
-+	char fw_name[BRCMF_FW_NAME_LEN];
-+	char nvram_name[BRCMF_FW_NAME_LEN];
- 	bool wowl_enabled;
- 	enum brcmf_sdiod_state state;
- 	struct brcmf_sdiod_freezer *freezer;
---- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
-@@ -43,10 +43,20 @@
- #define BRCMF_USB_CBCTL_READ		1
- #define BRCMF_USB_MAX_PKT_SIZE		1600
- 
--#define BRCMF_USB_43143_FW_NAME		"brcm/brcmfmac43143.bin"
--#define BRCMF_USB_43236_FW_NAME		"brcm/brcmfmac43236b.bin"
--#define BRCMF_USB_43242_FW_NAME		"brcm/brcmfmac43242a.bin"
--#define BRCMF_USB_43569_FW_NAME		"brcm/brcmfmac43569.bin"
-+BRCMF_FW_DEF(43143, "brcmfmac43143.bin");
-+BRCMF_FW_DEF(43236B, "brcmfmac43236b.bin");
-+BRCMF_FW_DEF(43242A, "brcmfmac43242a.bin");
-+BRCMF_FW_DEF(43569, "brcmfmac43569.bin");
-+
-+static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
-+	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
-+	BRCMF_FW_ENTRY(BRCM_CC_43235_CHIP_ID, 0x00000008, 43236B),
-+	BRCMF_FW_ENTRY(BRCM_CC_43236_CHIP_ID, 0x00000008, 43236B),
-+	BRCMF_FW_ENTRY(BRCM_CC_43238_CHIP_ID, 0x00000008, 43236B),
-+	BRCMF_FW_ENTRY(BRCM_CC_43242_CHIP_ID, 0xFFFFFFFF, 43242A),
-+	BRCMF_FW_ENTRY(BRCM_CC_43566_CHIP_ID, 0xFFFFFFFF, 43569),
-+	BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43569)
-+};
- 
- #define TRX_MAGIC		0x30524448	/* "HDR0" */
- #define TRX_MAX_OFFSET		3		/* Max number of file offsets */
-@@ -139,6 +149,7 @@ struct brcmf_usbdev_info {
- 	struct brcmf_usbreq *tx_reqs;
- 	struct brcmf_usbreq *rx_reqs;
- 
-+	char fw_name[BRCMF_FW_NAME_LEN];
- 	const u8 *image;	/* buffer for combine fw and nvram */
- 	int image_len;
- 
-@@ -983,45 +994,15 @@ static int brcmf_usb_dlrun(struct brcmf_
- 	return 0;
- }
- 
--static bool brcmf_usb_chip_support(int chipid, int chiprev)
--{
--	switch(chipid) {
--	case BRCM_CC_43143_CHIP_ID:
--		return true;
--	case BRCM_CC_43235_CHIP_ID:
--	case BRCM_CC_43236_CHIP_ID:
--	case BRCM_CC_43238_CHIP_ID:
--		return (chiprev == 3);
--	case BRCM_CC_43242_CHIP_ID:
--		return true;
--	case BRCM_CC_43566_CHIP_ID:
--	case BRCM_CC_43569_CHIP_ID:
--		return true;
--	default:
--		break;
--	}
--	return false;
--}
--
- static int
- brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
- {
--	int devid, chiprev;
- 	int err;
- 
- 	brcmf_dbg(USB, "Enter\n");
- 	if (devinfo == NULL)
- 		return -ENODEV;
- 
--	devid = devinfo->bus_pub.devid;
--	chiprev = devinfo->bus_pub.chiprev;
--
--	if (!brcmf_usb_chip_support(devid, chiprev)) {
--		brcmf_err("unsupported chip %d rev %d\n",
--			  devid, chiprev);
--		return -EINVAL;
--	}
--
- 	if (!devinfo->image) {
- 		brcmf_err("No firmware!\n");
- 		return -ENOENT;
-@@ -1071,25 +1052,6 @@ static int check_file(const u8 *headers)
- 	return -1;
- }
- 
--static const char *brcmf_usb_get_fwname(struct brcmf_usbdev_info *devinfo)
--{
--	switch (devinfo->bus_pub.devid) {
--	case BRCM_CC_43143_CHIP_ID:
--		return BRCMF_USB_43143_FW_NAME;
--	case BRCM_CC_43235_CHIP_ID:
--	case BRCM_CC_43236_CHIP_ID:
--	case BRCM_CC_43238_CHIP_ID:
--		return BRCMF_USB_43236_FW_NAME;
--	case BRCM_CC_43242_CHIP_ID:
--		return BRCMF_USB_43242_FW_NAME;
--	case BRCM_CC_43566_CHIP_ID:
--	case BRCM_CC_43569_CHIP_ID:
--		return BRCMF_USB_43569_FW_NAME;
--	default:
--		return NULL;
--	}
--}
--
- 
- static
- struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
-@@ -1274,9 +1236,16 @@ static int brcmf_usb_probe_cb(struct brc
- 	bus->chip = bus_pub->devid;
- 	bus->chiprev = bus_pub->chiprev;
- 
-+	ret = brcmf_fw_map_chip_to_name(bus_pub->devid, bus_pub->chiprev,
-+					brcmf_usb_fwnames,
-+					ARRAY_SIZE(brcmf_usb_fwnames),
-+					devinfo->fw_name, NULL);
-+	if (ret)
-+		goto fail;
-+
- 	/* request firmware here */
--	ret = brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo),
--				     NULL, brcmf_usb_probe_phase2);
-+	ret = brcmf_fw_get_firmwares(dev, 0, devinfo->fw_name, NULL,
-+				     brcmf_usb_probe_phase2);
- 	if (ret) {
- 		brcmf_err("firmware request failed: %d\n", ret);
- 		goto fail;
-@@ -1472,8 +1441,7 @@ static int brcmf_usb_reset_resume(struct
- 
- 	brcmf_dbg(USB, "Enter\n");
- 
--	return brcmf_fw_get_firmwares(&usb->dev, 0,
--				      brcmf_usb_get_fwname(devinfo), NULL,
-+	return brcmf_fw_get_firmwares(&usb->dev, 0, devinfo->fw_name, NULL,
- 				      brcmf_usb_probe_phase2);
- }
- 
-@@ -1491,10 +1459,6 @@ static struct usb_device_id brcmf_usb_de
- };
- 
- MODULE_DEVICE_TABLE(usb, brcmf_usb_devid_table);
--MODULE_FIRMWARE(BRCMF_USB_43143_FW_NAME);
--MODULE_FIRMWARE(BRCMF_USB_43236_FW_NAME);
--MODULE_FIRMWARE(BRCMF_USB_43242_FW_NAME);
--MODULE_FIRMWARE(BRCMF_USB_43569_FW_NAME);
- 
- static struct usb_driver brcmf_usbdrvr = {
- 	.name = KBUILD_MODNAME,
diff --git a/package/kernel/mac80211/patches/376-0010-brcmfmac-Fix-double-free-on-exception-at-module-load.patch b/package/kernel/mac80211/patches/376-0010-brcmfmac-Fix-double-free-on-exception-at-module-load.patch
deleted file mode 100644
index 2174d099f2228466aca81fb8f71eed7383bcd37d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/376-0010-brcmfmac-Fix-double-free-on-exception-at-module-load.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Hante Meuleman <meuleman@broadcom.com>
-Date: Wed, 25 Nov 2015 11:32:47 +0100
-Subject: [PATCH] brcmfmac: Fix double free on exception at module load.
-
-Reviewed-by: Arend Van Spriel <arend@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
-Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
-Signed-off-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -1083,6 +1083,8 @@ fail:
- 			brcmf_net_detach(ifp->ndev);
- 		if (p2p_ifp)
- 			brcmf_net_detach(p2p_ifp->ndev);
-+		drvr->iflist[0] = NULL;
-+		drvr->iflist[1] = NULL;
- 		return ret;
- 	}
- 	return 0;
diff --git a/package/kernel/mac80211/patches/377-brcmfmac-only-lock-and-unlock-fws-if-fws-is-not-null.patch b/package/kernel/mac80211/patches/377-brcmfmac-only-lock-and-unlock-fws-if-fws-is-not-null.patch
deleted file mode 100644
index 8ec1441f814771489b82ef358d93e46365700349..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/377-brcmfmac-only-lock-and-unlock-fws-if-fws-is-not-null.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Colin Ian King <colin.king@canonical.com>
-Date: Wed, 2 Dec 2015 11:45:10 +0000
-Subject: [PATCH] brcmfmac: only lock and unlock fws if fws is not null
-
-There is a null ptr check for fws to set bcmc_credit_check, however,
-there a lock and unlock on fws should only performed if fwts is
-also not null to also avoid a potential null pointer deference.
-
-Signed-off-by: Colin Ian King <colin.king@canonical.com>
-Acked-by: Arend van Spriel <arend@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
-@@ -1609,10 +1609,11 @@ static int brcmf_fws_notify_bcmc_credit_
- {
- 	struct brcmf_fws_info *fws = ifp->drvr->fws;
- 
--	brcmf_fws_lock(fws);
--	if (fws)
-+	if (fws) {
-+		brcmf_fws_lock(fws);
- 		fws->bcmc_credit_check = true;
--	brcmf_fws_unlock(fws);
-+		brcmf_fws_unlock(fws);
-+	}
- 	return 0;
- }
- 
diff --git a/package/kernel/mac80211/patches/400-ath_move_debug_code.patch b/package/kernel/mac80211/patches/400-ath_move_debug_code.patch
index 298f7228434533ef166bacd36f59d46ca4b65cd8..72e9a412230e38ae4a17c1db8446b14a924d063e 100644
--- a/package/kernel/mac80211/patches/400-ath_move_debug_code.patch
+++ b/package/kernel/mac80211/patches/400-ath_move_debug_code.patch
@@ -14,7 +14,7 @@
  ccflags-y += -D__CHECK_ENDIAN__
 --- a/drivers/net/wireless/ath/ath.h
 +++ b/drivers/net/wireless/ath/ath.h
-@@ -316,13 +316,6 @@ void _ath_dbg(struct ath_common *common,
+@@ -318,13 +318,6 @@ void _ath_dbg(struct ath_common *common,
  #endif /* CPTCFG_ATH_DEBUG */
  
  /** Returns string describing opmode, or NULL if unknown mode. */
diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch
index 2dac5057c9f1e2547f92538ca290e4812f86db8c..735135307631290037afa6a00bab73a50fea78ba 100644
--- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch
+++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch
@@ -47,9 +47,9 @@
  
 --- a/drivers/net/wireless/ath/Kconfig
 +++ b/drivers/net/wireless/ath/Kconfig
-@@ -22,6 +22,9 @@ menuconfig ATH_CARDS
+@@ -23,6 +23,9 @@ config WLAN_VENDOR_ATH
  
- if ATH_CARDS
+ if WLAN_VENDOR_ATH
  
 +config ATH_USER_REGD
 +	bool "Do not enforce EEPROM regulatory restrictions"
@@ -59,9 +59,9 @@
  	---help---
 --- a/.local-symbols
 +++ b/.local-symbols
-@@ -89,6 +89,7 @@ RTL8187_LEDS=
+@@ -125,6 +125,7 @@ ADM8211=
  ATH_COMMON=
- ATH_CARDS=
+ WLAN_VENDOR_ATH=
  ATH_DEBUG=
 +ATH_USER_REGD=
  ATH_TRACEPOINTS=
diff --git a/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch b/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch
index 1476953c21cb90c91c4f0313145d867631bba0a0..1ef55456c5f4efd9a09f422461dc837ff1e0b5b4 100644
--- a/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch
+++ b/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch
@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -2368,6 +2368,8 @@ void regulatory_hint_country_ie(struct w
+@@ -2411,6 +2411,8 @@ void regulatory_hint_country_ie(struct w
  	enum environment_cap env = ENVIRON_ANY;
  	struct regulatory_request *request = NULL, *lr;
  
@@ -9,11 +9,11 @@
  	/* IE len must be evenly divisible by 2 */
  	if (country_ie_len & 0x01)
  		return;
-@@ -2571,6 +2573,7 @@ static void restore_regulatory_settings(
+@@ -2617,6 +2619,7 @@ static void restore_regulatory_settings(
  
  void regulatory_hint_disconnect(void)
  {
 +	return;
- 	REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
+ 	pr_debug("All devices are disconnected, going to restore regulatory settings\n");
  	restore_regulatory_settings(false);
  }
diff --git a/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch b/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
index 93760f9f8b7b30f9687cbb65e2ef5da0b640bbd9..1a624849546ca40db86f27a5edc3ffe860b2280d 100644
--- a/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
+++ b/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -715,6 +715,7 @@ static const struct ieee80211_iface_limi
+@@ -722,6 +722,7 @@ static const struct ieee80211_iface_limi
  				 BIT(NL80211_IFTYPE_AP) },
  	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
  				 BIT(NL80211_IFTYPE_P2P_GO) },
diff --git a/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch b/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
index aa521d2abbb193c1d14c37ae1bf1aa88f0ab045a..924b62e0d4f511fea576ce14a22406fe8cfec381 100644
--- a/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
+++ b/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
@@ -121,7 +121,7 @@ drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
  	debugfs_create_file("antenna", S_IWUSR | S_IRUSR, phydir, ah,
 --- a/drivers/net/wireless/ath/ath5k/ath5k.h
 +++ b/drivers/net/wireless/ath/ath5k/ath5k.h
-@@ -1371,6 +1371,7 @@ struct ath5k_hw {
+@@ -1372,6 +1372,7 @@ struct ath5k_hw {
  	u8			ah_coverage_class;
  	bool			ah_ack_bitrate_high;
  	u8			ah_bwmode;
diff --git a/package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch b/package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
index ed2cfee72ce2b2e1f694ef29a2e9065fdadd0829..d2a3b9657065cd6b7abf41297e7bc5b76b58b6ce 100644
--- a/package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
+++ b/package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -389,13 +389,8 @@ static void ath9k_hw_init_config(struct
+@@ -390,13 +390,8 @@ static void ath9k_hw_init_config(struct
  
  	ah->config.rx_intr_mitigation = true;
  
@@ -14,5 +14,5 @@
 +	ah->config.rimt_last = 250;
 +	ah->config.rimt_first = 500;
  
- 	/*
- 	 * We need this for PCI devices only (Cardbus, PCI, miniPCI)
+ 	if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
+ 		ah->config.pll_pwrsave = 7;
diff --git a/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch b/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch
index d4104f0e9354cde2eb7b1885c2f052254b8d830c..6766111dfd3e43b2251a0248f256e97f8d5cbffa 100644
--- a/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch
+++ b/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -87,7 +87,7 @@ int ath_descdma_setup(struct ath_softc *
+@@ -88,7 +88,7 @@ int ath_descdma_setup(struct ath_softc *
  		(_l) &= ((_sz) - 1);		\
  	} while (0)
  
diff --git a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch
index 40b5c81b80a73a2b5c4338047a9fd4a3ea5e158d..c84d1bc8290e673d8366e3fcf9b97e84e634726a 100644
--- a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch
+++ b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -647,6 +647,7 @@ int ath9k_hw_init(struct ath_hw *ah)
+@@ -651,6 +651,7 @@ int ath9k_hw_init(struct ath_hw *ah)
  
  	/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
  	switch (ah->hw_version.devid) {
diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch
index 0c50a0bbbaeaeac7f01087759ee9bee98b24bd3a..e151a12967ccf90d2de7cfde5728803b1069591c 100644
--- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch
+++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch
@@ -1,6 +1,6 @@
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -2320,6 +2320,7 @@ struct cfg80211_qos_map {
+@@ -2363,6 +2363,7 @@ struct cfg80211_qos_map {
   *	(as advertised by the nl80211 feature flag.)
   * @get_tx_power: store the current TX power into the dbm variable;
   *	return 0 if successful
@@ -8,7 +8,7 @@
   *
   * @set_wds_peer: set the WDS peer for a WDS interface
   *
-@@ -2576,6 +2577,7 @@ struct cfg80211_ops {
+@@ -2624,6 +2625,7 @@ struct cfg80211_ops {
  				enum nl80211_tx_power_setting type, int mbm);
  	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
  				int *dbm);
@@ -18,7 +18,7 @@
  				const u8 *addr);
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1171,6 +1171,7 @@ enum ieee80211_smps_mode {
+@@ -1286,6 +1286,7 @@ enum ieee80211_smps_mode {
   *
   * @power_level: requested transmit power (in dBm), backward compatibility
   *	value only that is set to the minimum of all interfaces
@@ -26,19 +26,19 @@
   *
   * @chandef: the channel definition to tune to
   * @radar_enabled: whether radar detection is enabled
-@@ -1192,6 +1193,7 @@ struct ieee80211_conf {
+@@ -1306,6 +1307,7 @@ enum ieee80211_smps_mode {
+ struct ieee80211_conf {
  	u32 flags;
  	int power_level, dynamic_ps_timeout;
- 	int max_sleep_period;
 +	int max_antenna_gain;
  
  	u16 listen_interval;
  	u8 ps_dtim_period;
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -1760,6 +1760,9 @@ enum nl80211_commands {
-  * @NL80211_ATTR_REG_INDOOR: flag attribute, if set indicates that the device
-  *      is operating in an indoor environment.
+@@ -1790,6 +1790,9 @@ enum nl80211_commands {
+  *	between scans. The scan plans are executed sequentially.
+  *	Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan.
   *
 + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
 + *	transmit power to stay within regulatory limits. u32, dBi.
@@ -46,9 +46,9 @@
   * @NUM_NL80211_ATTR: total number of nl80211_attrs available
   * @NL80211_ATTR_MAX: highest attribute number currently defined
   * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -2129,6 +2132,8 @@ enum nl80211_attrs {
- 
- 	NL80211_ATTR_REG_INDOOR,
+@@ -2164,6 +2167,8 @@ enum nl80211_attrs {
+ 	NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
+ 	NL80211_ATTR_SCHED_SCAN_PLANS,
  
 +	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +
@@ -57,7 +57,7 @@
  	__NL80211_ATTR_AFTER_LAST,
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2208,6 +2208,19 @@ static int ieee80211_get_tx_power(struct
+@@ -2229,6 +2229,19 @@ static int ieee80211_get_tx_power(struct
  	return 0;
  }
  
@@ -77,7 +77,7 @@
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  				  const u8 *addr)
  {
-@@ -3771,6 +3784,7 @@ const struct cfg80211_ops mac80211_confi
+@@ -3403,6 +3416,7 @@ const struct cfg80211_ops mac80211_confi
  	.set_wiphy_params = ieee80211_set_wiphy_params,
  	.set_tx_power = ieee80211_set_tx_power,
  	.get_tx_power = ieee80211_get_tx_power,
@@ -87,7 +87,7 @@
  	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1333,6 +1333,7 @@ struct ieee80211_local {
+@@ -1318,6 +1318,7 @@ struct ieee80211_local {
  	int dynamic_ps_forced_timeout;
  
  	int user_power_level; /* in dBm, for all interfaces */
@@ -97,7 +97,7 @@
  
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -98,7 +98,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -93,7 +93,7 @@ static u32 ieee80211_hw_conf_chan(struct
  	struct ieee80211_sub_if_data *sdata;
  	struct cfg80211_chan_def chandef = {};
  	u32 changed = 0;
@@ -106,7 +106,7 @@
  	u32 offchannel_flag;
  
  	offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
-@@ -155,6 +155,12 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -150,6 +150,12 @@ static u32 ieee80211_hw_conf_chan(struct
  	}
  	rcu_read_unlock();
  
@@ -119,7 +119,7 @@
  	if (local->hw.conf.power_level != power) {
  		changed |= IEEE80211_CONF_CHANGE_POWER;
  		local->hw.conf.power_level = power;
-@@ -578,6 +584,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -586,6 +592,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
  					 IEEE80211_RADIOTAP_MCS_HAVE_BW;
  	local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
  					 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
@@ -129,7 +129,7 @@
  	local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -400,6 +400,7 @@ static const struct nla_policy nl80211_p
+@@ -403,6 +403,7 @@ static const struct nla_policy nl80211_p
  	[NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
  	[NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
  	[NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
@@ -137,7 +137,7 @@
  };
  
  /* policy for the key attributes */
-@@ -2206,6 +2207,20 @@ static int nl80211_set_wiphy(struct sk_b
+@@ -2220,6 +2221,20 @@ static int nl80211_set_wiphy(struct sk_b
  		if (result)
  			return result;
  	}
diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
index 7512811e704c9bbfc5065be836c12d47b560ce3b..5a5e4643f5287e1426dd63a662b1f9b75cf22c80 100644
--- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
+++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
@@ -24,7 +24,7 @@
  struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
-@@ -1004,9 +1014,8 @@ struct ath_softc {
+@@ -1005,9 +1015,8 @@ struct ath_softc {
  	spinlock_t chan_lock;
  
  #ifdef CPTCFG_MAC80211_LEDS
@@ -54,7 +54,8 @@
 +			  (brightness != LED_OFF) ^ led->gpio->active_low);
 +	ath9k_ps_restore(sc);
 +}
-+
+ 
+-	ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
 +static int ath_add_led(struct ath_softc *sc, struct ath_led *led)
 +{
 +	const struct gpio_led *gpio = led->gpio;
@@ -63,8 +64,7 @@
 +	led->cdev.name = gpio->name;
 +	led->cdev.default_trigger = gpio->default_trigger;
 +	led->cdev.brightness_set = ath_led_brightness;
- 
--	ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
++
 +	ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->cdev);
 +	if (ret < 0)
 +		return ret;
@@ -159,7 +159,7 @@
 +		trigger = ieee80211_get_radio_led_name(sc->hw);
  
 -	sc->led_registered = true;
-+	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1);
++	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, !sc->sc_ah->config.led_active_high);
  }
  
  void ath_fill_led_pin(struct ath_softc *sc)
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 dc33cd029b5356623781aa7aeaa38aceb742d811..7c10ea6b0d042db76b703e12356f53bea36e90de 100644
--- a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch
+++ b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch
@@ -59,7 +59,7 @@
 @@ -120,6 +141,12 @@ void ath_init_leds(struct ath_softc *sc)
  		trigger = ieee80211_get_radio_led_name(sc->hw);
  
- 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1);
+ 	ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, !sc->sc_ah->config.led_active_high);
 +
 +	if (!pdata)
 +		return;
diff --git a/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch b/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6d62a2b1c2cdb716c9e207e219cad96075b82bac
--- /dev/null
+++ b/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch
@@ -0,0 +1,20 @@
+--- a/include/linux/ath9k_platform.h
++++ b/include/linux/ath9k_platform.h
+@@ -36,6 +36,7 @@ struct ath9k_platform_data {
+ 	bool tx_gain_buffalo;
+ 	bool disable_2ghz;
+ 	bool disable_5ghz;
++	bool led_active_high;
+ 
+ 	int (*get_mac_revision)(void);
+ 	int (*external_reset)(void);
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -577,6 +577,7 @@ static int ath9k_init_softc(u16 devid, s
+ 		ah->external_reset = pdata->external_reset;
+ 		ah->disable_2ghz = pdata->disable_2ghz;
+ 		ah->disable_5ghz = pdata->disable_5ghz;
++		ah->config.led_active_high = pdata->led_active_high;
+ 		if (!pdata->endian_check)
+ 			ah->ah_flags |= AH_NO_EEP_SWAP;
+ 	}
diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch
index 08c5a0ffc09a168663e4fdbb612ac83a5157c244..e83c6bfbf90d18577398c50fca1fa46b46e7822c 100644
--- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch
+++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch
@@ -62,7 +62,7 @@
  	debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy,
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -513,6 +513,12 @@ enum {
+@@ -519,6 +519,12 @@ enum {
  	ATH9K_RESET_COLD,
  };
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
  	u32 magic;
  	u16 devid;
-@@ -794,6 +800,8 @@ struct ath_hw {
+@@ -804,6 +810,8 @@ struct ath_hw {
  	u32 rfkill_polarity;
  	u32 ah_flags;
  
@@ -84,7 +84,7 @@
  	bool reset_power_on;
  	bool htc_reset_init;
  
-@@ -1055,6 +1063,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
+@@ -1066,6 +1074,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
@@ -94,7 +94,7 @@
  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1804,6 +1804,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
+@@ -1819,6 +1819,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
  }
  EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
  
@@ -115,7 +115,7 @@
  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
  		   struct ath9k_hw_cal_data *caldata, bool fastcc)
  {
-@@ -2012,6 +2026,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2027,6 +2041,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  		ar9003_hw_disable_phy_restart(ah);
  
  	ath9k_hw_apply_gpio_override(ah);
diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch
index 8c9b34cb0acf3db2ec29120ce1fdf82249176e9b..d7bb5a12ce6f4135cdb7eaa951321cec48d221b8 100644
--- a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch
+++ b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -710,6 +710,7 @@ struct ath_spec_scan {
+@@ -720,6 +720,7 @@ struct ath_spec_scan {
   * @config_pci_powersave:
   * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC
   *
@@ -8,7 +8,7 @@
   * @spectral_scan_config: set parameters for spectral scan and enable/disable it
   * @spectral_scan_trigger: trigger a spectral scan run
   * @spectral_scan_wait: wait for a spectral scan run to finish
-@@ -732,6 +733,7 @@ struct ath_hw_ops {
+@@ -742,6 +743,7 @@ struct ath_hw_ops {
  			struct ath_hw_antcomb_conf *antconf);
  	void (*antdiv_comb_conf_set)(struct ath_hw *ah,
  			struct ath_hw_antcomb_conf *antconf);
@@ -18,7 +18,7 @@
  	void (*spectral_scan_trigger)(struct ath_hw *ah);
 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -1999,6 +1999,26 @@ void ar9003_hw_init_rate_txpower(struct
+@@ -1998,6 +1998,26 @@ void ar9003_hw_init_rate_txpower(struct
  	}
  }
  
@@ -45,7 +45,7 @@
  void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
  {
  	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
-@@ -2035,6 +2055,7 @@ void ar9003_hw_attach_phy_ops(struct ath
+@@ -2034,6 +2054,7 @@ void ar9003_hw_attach_phy_ops(struct ath
  	priv_ops->set_radar_params = ar9003_hw_set_radar_params;
  	priv_ops->fast_chan_change = ar9003_hw_fast_chan_change;
  
@@ -55,7 +55,7 @@
  	ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -703,7 +703,8 @@ static void ath9k_init_txpower_limits(st
+@@ -711,7 +711,8 @@ static void ath9k_init_txpower_limits(st
  	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
  		ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
  
@@ -65,7 +65,7 @@
  }
  
  static const struct ieee80211_iface_limit if_limits[] = {
-@@ -896,6 +897,18 @@ static void ath9k_set_hw_capab(struct at
+@@ -897,6 +898,18 @@ static void ath9k_set_hw_capab(struct at
  	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
  }
  
@@ -84,7 +84,7 @@
  int ath9k_init_device(u16 devid, struct ath_softc *sc,
  		    const struct ath_bus_ops *bus_ops)
  {
-@@ -941,6 +954,8 @@ int ath9k_init_device(u16 devid, struct
+@@ -942,6 +955,8 @@ int ath9k_init_device(u16 devid, struct
  		ARRAY_SIZE(ath9k_tpt_blink));
  #endif
  
@@ -110,7 +110,7 @@
  static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -1316,9 +1316,30 @@ void ar5008_hw_init_rate_txpower(struct
+@@ -1327,9 +1327,30 @@ void ar5008_hw_init_rate_txpower(struct
  	}
  }
  
@@ -141,7 +141,7 @@
  	static const u32 ar5416_cca_regs[6] = {
  		AR_PHY_CCA,
  		AR_PHY_CH1_CCA,
-@@ -1333,6 +1354,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
+@@ -1344,6 +1365,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
  	if (ret)
  	    return ret;
  
diff --git a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch
index 240b898c0dc00469ba1a185d07f715ae87209174..8768c5d89a7b38d0e0a3c07dc94bf52edb480732 100644
--- a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch
+++ b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -245,6 +245,19 @@ void ath9k_hw_get_channel_centers(struct
+@@ -246,6 +246,19 @@ void ath9k_hw_get_channel_centers(struct
  		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
  }
  
@@ -20,7 +20,7 @@
  /******************/
  /* Chip Revisions */
  /******************/
-@@ -1382,6 +1395,9 @@ static bool ath9k_hw_set_reset(struct at
+@@ -1397,6 +1410,9 @@ static bool ath9k_hw_set_reset(struct at
  	if (AR_SREV_9100(ah))
  		udelay(50);
  
@@ -30,7 +30,7 @@
  	return true;
  }
  
-@@ -1481,6 +1497,9 @@ static bool ath9k_hw_chip_reset(struct a
+@@ -1496,6 +1512,9 @@ static bool ath9k_hw_chip_reset(struct a
  		ar9003_hw_internal_regulator_apply(ah);
  	ath9k_hw_init_pll(ah, chan);
  
@@ -40,7 +40,7 @@
  	return true;
  }
  
-@@ -1782,8 +1801,14 @@ static int ath9k_hw_do_fastcc(struct ath
+@@ -1797,8 +1816,14 @@ static int ath9k_hw_do_fastcc(struct ath
  	if (AR_SREV_9271(ah))
  		ar9002_hw_load_ani_reg(ah, chan);
  
@@ -55,7 +55,7 @@
  	return -EINVAL;
  }
  
-@@ -2037,6 +2062,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2052,6 +2077,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  		ath9k_hw_set_radar_params(ah);
  	}
  
diff --git a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch
index 9610372b08916248c75f9dcf682652b861fc7e48..3d24ccda1f83daee789973c101bd650df4c1694b 100644
--- a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch
+++ b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -945,55 +945,6 @@ static bool ar5008_hw_ani_control_new(st
+@@ -956,55 +956,6 @@ static bool ar5008_hw_ani_control_new(st
  		 * on == 0 means more noise imm
  		 */
  		u32 on = param ? 1 : 0;
@@ -79,7 +79,7 @@
  static const u8 ofdm2pwr[] = {
  	ALL_TARGET_LEGACY_6_24,
  	ALL_TARGET_LEGACY_6_24,
-@@ -1090,11 +1076,6 @@ static bool ar9003_hw_ani_control(struct
+@@ -1089,11 +1075,6 @@ static bool ar9003_hw_ani_control(struct
  	struct ath_common *common = ath9k_hw_common(ah);
  	struct ath9k_channel *chan = ah->curchan;
  	struct ar5416AniState *aniState = &ah->ani;
@@ -91,7 +91,7 @@
  	s32 value, value2;
  
  	switch (cmd & ah->ani_function) {
-@@ -1108,61 +1089,6 @@ static bool ar9003_hw_ani_control(struct
+@@ -1107,61 +1088,6 @@ static bool ar9003_hw_ani_control(struct
  		 */
  		u32 on = param ? 1 : 0;
  
diff --git a/package/kernel/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch b/package/kernel/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
index c0dc4fe7a08ba01b7f5a2c6cf522dd43ec6b23a8..bd81555ac1353f909a1ae968b97fc298847ec96a 100644
--- a/package/kernel/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
+++ b/package/kernel/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
@@ -16,36 +16,18 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
 Changes since v1: ---
 ---
- drivers/net/wireless/rt2x00/rt2800.h    |   13 -------------
- drivers/net/wireless/rt2x00/rt2800lib.h |   11 +++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800.h    |   13 -------------
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.h |   11 +++++++++++
  2 files changed, 11 insertions(+), 13 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -2960,17 +2960,4 @@ enum rt2800_eeprom_word {
-  */
- #define BCN_TBTT_OFFSET 64
- 
--/*
-- * RT2800 driver data structure
-- */
--struct rt2800_drv_data {
--	u8 calibration_bw20;
--	u8 calibration_bw40;
--	u8 bbp25;
--	u8 bbp26;
--	u8 txmixer_gain_24g;
--	u8 txmixer_gain_5g;
--	unsigned int tbtt_tick;
--};
--
- #endif /* RT2800_H */
---- a/drivers/net/wireless/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
-@@ -20,6 +20,17 @@
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+@@ -20,6 +20,20 @@
  #ifndef RT2800LIB_H
  #define RT2800LIB_H
  
++#include "rt2800.h"
++
 +/* RT2800 driver data structure */
 +struct rt2800_drv_data {
 +	u8 calibration_bw20;
@@ -55,8 +37,30 @@ Changes since v1: ---
 +	u8 txmixer_gain_24g;
 +	u8 txmixer_gain_5g;
 +	unsigned int tbtt_tick;
++	DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
 +};
 +
  struct rt2800_ops {
  	void (*register_read)(struct rt2x00_dev *rt2x00dev,
  			      const unsigned int offset, u32 *value);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+@@ -2969,18 +2969,4 @@ enum rt2800_eeprom_word {
+ #define WCID_END	222
+ #define STA_IDS_SIZE	(WCID_END - WCID_START + 2)
+ 
+-/*
+- * RT2800 driver data structure
+- */
+-struct rt2800_drv_data {
+-	u8 calibration_bw20;
+-	u8 calibration_bw40;
+-	u8 bbp25;
+-	u8 bbp26;
+-	u8 txmixer_gain_24g;
+-	u8 txmixer_gain_5g;
+-	unsigned int tbtt_tick;
+-	DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
+-};
+-
+ #endif /* RT2800_H */
diff --git a/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch b/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch
index 6bad6ac509aca516451490589fc6209abc189167..82459091fe47c8b2fb17c88ed9cef1c1b9502280 100644
--- a/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch
+++ b/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch
@@ -18,13 +18,13 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 Changes since v1:
   - don't enable the new flag for RT3071 and RT5592
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    4 ++++
- drivers/net/wireless/rt2x00/rt2800lib.h |   13 +++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    4 ++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.h |   13 +++++++++++++
  2 files changed, 17 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7747,6 +7747,7 @@ static int rt2800_probe_rt(struct rt2x00
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7722,6 +7722,7 @@ static int rt2800_probe_rt(struct rt2x00
  
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  {
@@ -32,7 +32,7 @@ Changes since v1:
  	int retval;
  	u32 reg;
  
-@@ -7754,6 +7755,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -7729,6 +7730,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	if (retval)
  		return retval;
  
@@ -42,11 +42,11 @@ Changes since v1:
  	/*
  	 * Allocate eeprom data.
  	 */
---- a/drivers/net/wireless/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
-@@ -20,6 +20,10 @@
- #ifndef RT2800LIB_H
- #define RT2800LIB_H
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+@@ -22,6 +22,10 @@
+ 
+ #include "rt2800.h"
  
 +enum rt2800_flag {
 +	RT2800_HAS_HIGH_SHARED_MEM,
@@ -55,16 +55,16 @@ Changes since v1:
  /* RT2800 driver data structure */
  struct rt2800_drv_data {
  	u8 calibration_bw20;
-@@ -29,6 +33,8 @@ struct rt2800_drv_data {
- 	u8 txmixer_gain_24g;
+@@ -32,6 +36,8 @@ struct rt2800_drv_data {
  	u8 txmixer_gain_5g;
  	unsigned int tbtt_tick;
+ 	DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
 +
 +	unsigned long rt2800_flags;
  };
  
  struct rt2800_ops {
-@@ -61,6 +67,13 @@ struct rt2800_ops {
+@@ -64,6 +70,13 @@ struct rt2800_ops {
  	__le32 *(*drv_get_txwi)(struct queue_entry *entry);
  };
  
diff --git a/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch b/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch
index 9f8dfcc46754d80e6549110aab0be8f3326b83d5..7abfcd16f2e68354cb990b85d75c792fe9468fcb 100644
--- a/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch
+++ b/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch
@@ -17,17 +17,17 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
 Changes since v1: ---
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c  |   55 +++++++++++++++++++++++++++++-
- drivers/net/wireless/rt2x00/rt2800lib.h  |   32 +++++++++++++++++
- drivers/net/wireless/rt2x00/rt2800mmio.c |   26 ++++++++++++++
- drivers/net/wireless/rt2x00/rt2800mmio.h |    4 +++
- drivers/net/wireless/rt2x00/rt2800pci.c  |   14 ++++++++
- drivers/net/wireless/rt2x00/rt2800soc.c  |    3 ++
- drivers/net/wireless/rt2x00/rt2800usb.c  |   31 +++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c  |   55 +++++++++++++++++++++++++++++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.h  |   32 +++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800mmio.c |   26 ++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800mmio.h |    4 +++
+ drivers/net/wireless/ralink/rt2x00/rt2800pci.c  |   14 ++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800soc.c  |    3 ++
+ drivers/net/wireless/ralink/rt2x00/rt2800usb.c  |   31 +++++++++++++++++
  7 files changed, 164 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -451,11 +451,13 @@ void rt2800_mcu_request(struct rt2x00_de
  		rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
  		rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
@@ -175,7 +175,7 @@ Changes since v1: ---
  
  	/*
  	 * Update WCID information
-@@ -1437,8 +1467,11 @@ int rt2800_config_pairwise_key(struct rt
+@@ -1405,8 +1435,11 @@ int rt2800_config_pairwise_key(struct rt
  		       sizeof(key_entry.rx_mic));
  
  		offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
@@ -187,7 +187,7 @@ Changes since v1: ---
  	}
  
  	/*
-@@ -4908,14 +4941,19 @@ static int rt2800_init_registers(struct
+@@ -4885,14 +4918,19 @@ static int rt2800_init_registers(struct
  	/*
  	 * ASIC will keep garbage value after boot, clear encryption keys.
  	 */
@@ -207,7 +207,7 @@ Changes since v1: ---
  	}
  
  	/*
-@@ -5041,8 +5079,10 @@ static int rt2800_wait_bbp_ready(struct
+@@ -5018,8 +5056,10 @@ static int rt2800_wait_bbp_ready(struct
  	 * BBP was enabled after firmware was loaded,
  	 * but we need to reactivate it now.
  	 */
@@ -218,7 +218,7 @@ Changes since v1: ---
  	msleep(1);
  
  	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
-@@ -6738,11 +6778,19 @@ int rt2800_enable_radio(struct rt2x00_de
+@@ -6715,11 +6755,19 @@ int rt2800_enable_radio(struct rt2x00_de
  	/*
  	 * Send signal during boot time to initialize firmware.
  	 */
@@ -239,7 +239,7 @@ Changes since v1: ---
  	msleep(1);
  
  	/*
-@@ -7751,6 +7799,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -7726,6 +7774,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	int retval;
  	u32 reg;
  
@@ -248,22 +248,22 @@ Changes since v1: ---
  	retval = rt2800_probe_rt(rt2x00dev);
  	if (retval)
  		return retval;
-@@ -7830,8 +7880,11 @@ void rt2800_get_tkip_seq(struct ieee8021
- 	u32 offset;
+@@ -7809,8 +7859,11 @@ void rt2800_get_key_seq(struct ieee80211
+ 		return;
  
- 	offset = MAC_IVEIV_ENTRY(hw_key_idx);
+ 	offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
 +
 +	rt2800_shared_mem_lock(rt2x00dev);
  	rt2800_register_multiread(rt2x00dev, offset,
  				      &iveiv_entry, sizeof(iveiv_entry));
 +	rt2800_shared_mem_unlock(rt2x00dev);
  
- 	memcpy(iv16, &iveiv_entry.iv[0], sizeof(*iv16));
- 	memcpy(iv32, &iveiv_entry.iv[4], sizeof(*iv32));
---- a/drivers/net/wireless/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
-@@ -35,6 +35,11 @@ struct rt2800_drv_data {
- 	unsigned int tbtt_tick;
+ 	memcpy(&seq->tkip.iv16, &iveiv_entry.iv[0], 2);
+ 	memcpy(&seq->tkip.iv32, &iveiv_entry.iv[4], 4);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+@@ -38,6 +38,11 @@ struct rt2800_drv_data {
+ 	DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
  
  	unsigned long rt2800_flags;
 +
@@ -274,7 +274,7 @@ Changes since v1: ---
  };
  
  struct rt2800_ops {
-@@ -65,6 +70,10 @@ struct rt2800_ops {
+@@ -68,6 +73,10 @@ struct rt2800_ops {
  				  const u8 *data, const size_t len);
  	int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
  	__le32 *(*drv_get_txwi)(struct queue_entry *entry);
@@ -285,7 +285,7 @@ Changes since v1: ---
  };
  
  static inline bool rt2800_has_high_shared_mem(struct rt2x00_dev *rt2x00dev)
-@@ -74,6 +83,29 @@ static inline bool rt2800_has_high_share
+@@ -77,6 +86,29 @@ static inline bool rt2800_has_high_share
  	return test_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  }
  
@@ -315,8 +315,8 @@ Changes since v1: ---
  static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
  					const unsigned int offset,
  					u32 *value)
---- a/drivers/net/wireless/rt2x00/rt2800mmio.c
-+++ b/drivers/net/wireless/rt2x00/rt2800mmio.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
 @@ -820,8 +820,10 @@ int rt2800mmio_init_registers(struct rt2
  	rt2x00_set_field32(&reg, WPDMA_RST_IDX_DRX_IDX0, 1);
  	rt2x00mmio_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
@@ -359,8 +359,8 @@ Changes since v1: ---
  MODULE_AUTHOR(DRV_PROJECT);
  MODULE_VERSION(DRV_VERSION);
  MODULE_DESCRIPTION("rt2800 MMIO library");
---- a/drivers/net/wireless/rt2x00/rt2800mmio.h
-+++ b/drivers/net/wireless/rt2x00/rt2800mmio.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h
 @@ -160,4 +160,8 @@ int rt2800mmio_init_registers(struct rt2
  /* Device state switch handlers. */
  int rt2800mmio_enable_radio(struct rt2x00_dev *rt2x00dev);
@@ -370,8 +370,8 @@ Changes since v1: ---
 +void rt2800mmio_shmem_unlock(struct rt2x00_dev *rt2x00dev);
 +
  #endif /* RT2800MMIO_H */
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
 @@ -69,7 +69,9 @@ static void rt2800pci_mcu_status(struct
  		return;
  
@@ -444,8 +444,8 @@ Changes since v1: ---
  };
  
  static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
---- a/drivers/net/wireless/rt2x00/rt2800soc.c
-+++ b/drivers/net/wireless/rt2x00/rt2800soc.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 @@ -176,6 +176,9 @@ static const struct rt2800_ops rt2800soc
  	.drv_write_firmware	= rt2800soc_write_firmware,
  	.drv_init_registers	= rt2800mmio_init_registers,
@@ -456,8 +456,8 @@ Changes since v1: ---
  };
  
  static const struct rt2x00lib_ops rt2800soc_rt2x00_ops = {
---- a/drivers/net/wireless/rt2x00/rt2800usb.c
-+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
 @@ -51,6 +51,27 @@ static bool rt2800usb_hwcrypt_disabled(s
  	return modparam_nohwcrypt;
  }
@@ -486,7 +486,7 @@ Changes since v1: ---
  /*
   * Queue handlers.
   */
-@@ -294,8 +315,10 @@ static int rt2800usb_write_firmware(stru
+@@ -299,8 +320,10 @@ static int rt2800usb_write_firmware(stru
  					      data + offset, length);
  	}
  
@@ -497,7 +497,7 @@ Changes since v1: ---
  
  	/*
  	 * Send firmware request to device to load firmware,
-@@ -310,7 +333,10 @@ static int rt2800usb_write_firmware(stru
+@@ -315,7 +338,10 @@ static int rt2800usb_write_firmware(stru
  	}
  
  	msleep(10);
@@ -508,7 +508,7 @@ Changes since v1: ---
  
  	return 0;
  }
-@@ -328,8 +354,10 @@ static int rt2800usb_init_registers(stru
+@@ -333,8 +359,10 @@ static int rt2800usb_init_registers(stru
  	if (rt2800_wait_csr_ready(rt2x00dev))
  		return -EBUSY;
  
@@ -519,7 +519,7 @@ Changes since v1: ---
  
  	reg = 0;
  	rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
-@@ -859,6 +887,9 @@ static const struct rt2800_ops rt2800usb
+@@ -863,6 +891,9 @@ static const struct rt2800_ops rt2800usb
  	.drv_write_firmware	= rt2800usb_write_firmware,
  	.drv_init_registers	= rt2800usb_init_registers,
  	.drv_get_txwi		= rt2800usb_get_txwi,
diff --git a/package/kernel/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch b/package/kernel/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch
index b8c1914645f29235533c19c7a7096a64ea1baf02..985a3b91f120d355d2788be7a68ad055352b6640 100644
--- a/package/kernel/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch
+++ b/package/kernel/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch
@@ -23,12 +23,12 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
 Changes since v1: ---
 ---
- drivers/net/wireless/rt2x00/rt2800.h    |    3 +++
- drivers/net/wireless/rt2x00/rt2800lib.c |   44 +++++++++++++++++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800.h    |    3 +++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   44 +++++++++++++++++++++++++++++++
  2 files changed, 47 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -574,6 +574,7 @@
  #define PBF_SYS_CTRL			0x0400
  #define PBF_SYS_CTRL_READY		FIELD32(0x00000080)
@@ -46,8 +46,8 @@ Changes since v1: ---
  #define BEACON_BASE_TO_OFFSET(_base)	(((_base) - 0x4000) / 64)
  
  /*
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -82,6 +82,39 @@ static inline bool rt2800_is_305x_soc(st
  	return false;
  }
diff --git a/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch b/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch
index e7eb630d484f5d952c52ff2fc2d8f9581a97e314..02b2acfeee4c40af3f4739362d12ca0ce7f5e587 100644
--- a/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch
+++ b/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch
@@ -18,13 +18,13 @@ new field with the actually used value.
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    5 ++++-
- drivers/net/wireless/rt2x00/rt2800lib.h |    1 +
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    5 ++++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.h |    1 +
  2 files changed, 5 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4638,6 +4638,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -4615,6 +4615,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner);
   */
  static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
  {
@@ -32,7 +32,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  	u32 reg;
  	u16 eeprom;
  	unsigned int i;
-@@ -5003,7 +5004,7 @@ static int rt2800_init_registers(struct
+@@ -4980,7 +4981,7 @@ static int rt2800_init_registers(struct
  	/*
  	 * Clear all beacons
  	 */
@@ -41,7 +41,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  		rt2800_clear_beacon_register(rt2x00dev, i);
  
  	if (rt2x00_is_usb(rt2x00dev)) {
-@@ -7852,6 +7853,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -7827,6 +7828,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	if (rt2x00_rt(rt2x00dev, RT3593))
  		__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  
@@ -50,13 +50,13 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  	/*
  	 * Allocate eeprom data.
  	 */
---- a/drivers/net/wireless/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
-@@ -33,6 +33,7 @@ struct rt2800_drv_data {
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+@@ -35,6 +35,7 @@ struct rt2800_drv_data {
  	u8 txmixer_gain_24g;
  	u8 txmixer_gain_5g;
  	unsigned int tbtt_tick;
 +	unsigned int hw_beacon_count;
+ 	DECLARE_BITMAP(sta_ids, STA_IDS_SIZE);
  
  	unsigned long rt2800_flags;
- 
diff --git a/package/kernel/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch b/package/kernel/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch
index b79b4bea1a2a7a927234234378293a5028734148..4e735d348a5810c3e1df09c170797f84a0172a97 100644
--- a/package/kernel/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch
+++ b/package/kernel/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: init additional beacon offset registers
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800.h    |   14 ++++++++++++++
- drivers/net/wireless/rt2x00/rt2800lib.c |   24 ++++++++++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800.h    |   14 ++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   24 ++++++++++++++++++++++++
  2 files changed, 38 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -629,6 +629,20 @@
   */
  #define PBF_DBG				0x043c
@@ -32,9 +32,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  /*
   * RF registers
   */
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4650,6 +4650,30 @@ static int rt2800_init_registers(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -4627,6 +4627,30 @@ static int rt2800_init_registers(struct
  	if (ret)
  		return ret;
  
diff --git a/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch b/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch
index 180c5e306113dc9e94cde6bb678cf2a28a13f8ae..e90927271090fafef5f2e1b33be1a43f2a0eeba8 100644
--- a/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch
+++ b/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix max supported beacon count for RT3593
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    5 ++++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7877,7 +7877,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7852,7 +7852,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	if (rt2x00_rt(rt2x00dev, RT3593))
  		__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  
diff --git a/package/kernel/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch b/package/kernel/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch
index 8a10c6e02fb83a9f0738b45d8b8c14e843e38463..565e39de5f57562f868c5532365744b072242540 100644
--- a/package/kernel/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] rt2x00: allow to build rt2800soc module for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/Kconfig |    2 +-
+ drivers/net/wireless/ralink/rt2x00/Kconfig |    2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
+--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
++++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
 @@ -210,7 +210,7 @@ endif
  config RT2800SOC
  	tristate "Ralink WiSoC support"
diff --git a/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch
index 31aa34a8e753589275d1f01dd7ca6beedbd9d2b5..7fe38e0958a170f6f127fedc3764a0df87163180 100644
--- a/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: enable support for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    1 +
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    1 +
  1 file changed, 1 insertion(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7847,6 +7847,7 @@ static int rt2800_probe_rt(struct rt2x00
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7822,6 +7822,7 @@ static int rt2800_probe_rt(struct rt2x00
  	case RT3390:
  	case RT3572:
  	case RT3593:
diff --git a/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
index a90c5909bae970b1eaf9d4510d62fd3561c746e5..253a0c0c1e67def822917c469a41bea3b2d0c862 100644
--- a/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
+++ b/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: add rf_vals for RF3853
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800.h    |    4 +-
- drivers/net/wireless/rt2x00/rt2800lib.c |   65 +++++++++++++++++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800.h    |    4 +-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   65 +++++++++++++++++++++++++++++++
  2 files changed, 68 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -48,7 +48,8 @@
   * RF2853 2.4G/5G 3T3R
   * RF3320 2.4G 1T1R(RT3350/RT3370/RT3390)
@@ -29,9 +29,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #define RF5360				0x5360
  #define RF5362				0x5362
  #define RF5370				0x5370
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7465,6 +7465,66 @@ static const struct rf_channel rf_vals_3
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7442,6 +7442,66 @@ static const struct rf_channel rf_vals_3
  	{173, 0x61, 0, 9},
  };
  
@@ -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},
-@@ -7694,6 +7754,11 @@ static int rt2800_probe_hw_mode(struct r
+@@ -7669,6 +7729,11 @@ static int rt2800_probe_hw_mode(struct r
  		spec->channels = rf_vals_3x;
  		break;
  
diff --git a/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
index ab2673b55b0f7451e2b7e385f38d531273572adc..f15c22b30f8e517e10f71c64082e8bea3a2b1d63 100644
--- a/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
+++ b/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: enable VCO calibration for RF3853
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    2 ++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    2 ++
  1 file changed, 2 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4402,6 +4402,7 @@ void rt2800_vco_calibration(struct rt2x0
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -4379,6 +4379,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 RF5360:
  	case RF5362:
  	case RF5370:
-@@ -7873,6 +7874,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -7848,6 +7849,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF3053:
  	case RF3070:
  	case RF3290:
diff --git a/package/kernel/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch b/package/kernel/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch
index 05ed444435cdb5a56e3da506a4594ab667bacbf3..c120f2c1d1d9c5f13994d83ad6056ec9d17ca951 100644
--- a/package/kernel/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch
+++ b/package/kernel/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800lib: add channel configuration function for
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |  208 +++++++++++++++++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |  208 +++++++++++++++++++++++++++++++
  1 file changed, 208 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2649,6 +2649,211 @@ static void rt2800_config_channel_rf3053
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -2626,6 +2626,211 @@ static void rt2800_config_channel_rf3053
  	}
  }
  
@@ -223,7 +223,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #define POWER_BOUND		0x27
  #define POWER_BOUND_5G		0x2b
  
-@@ -3261,6 +3466,9 @@ static void rt2800_config_channel(struct
+@@ -3238,6 +3443,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-0013-rt2x00-rt2800lib-enable-RF3853-support.patch b/package/kernel/mac80211/patches/600-0013-rt2x00-rt2800lib-enable-RF3853-support.patch
index 3b507754993d41b4d96f3e4062762b45105d7085..f006304e7f4e867916c5ab93e0730b3c9dd63668 100644
--- a/package/kernel/mac80211/patches/600-0013-rt2x00-rt2800lib-enable-RF3853-support.patch
+++ b/package/kernel/mac80211/patches/600-0013-rt2x00-rt2800lib-enable-RF3853-support.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: enable RF3853 support
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    1 +
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    1 +
  1 file changed, 1 insertion(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7430,6 +7430,7 @@ static int rt2800_init_eeprom(struct rt2
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7407,6 +7407,7 @@ static int rt2800_init_eeprom(struct rt2
  	case RF3290:
  	case RF3320:
  	case RF3322:
diff --git a/package/kernel/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch b/package/kernel/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
index 4dfb068e2f5b6ed456c53c636827ded72f81fd60..a56bfa865eeb49574eefdc13d8d312c6f51f31f1 100644
--- a/package/kernel/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
+++ b/package/kernel/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800lib: add MAC register initialization for
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800.h    |   14 ++++++++++++++
- drivers/net/wireless/rt2x00/rt2800lib.c |   19 ++++++++++++++++---
+ drivers/net/wireless/ralink/rt2x00/rt2800.h    |   14 ++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   19 ++++++++++++++++---
  2 files changed, 30 insertions(+), 3 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -1588,6 +1588,20 @@
  #define TX_PWR_CFG_9_STBC7_CH2		FIELD32(0x00000f00)
  
@@ -33,9 +33,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
   * RX_FILTER_CFG: RX configuration register.
   */
  #define RX_FILTER_CFG			0x1400
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -5005,6 +5005,12 @@ static int rt2800_init_registers(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -4982,6 +4982,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, RT5592)) {
-@@ -5035,9 +5041,11 @@ static int rt2800_init_registers(struct
+@@ -5012,9 +5018,11 @@ static int rt2800_init_registers(struct
  
  	rt2800_register_read(rt2x00dev, MAX_LEN_CFG, &reg);
  	rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
@@ -63,7 +63,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  		rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 2);
  	else
  		rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 1);
-@@ -5190,6 +5198,11 @@ static int rt2800_init_registers(struct
+@@ -5167,6 +5175,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-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch b/package/kernel/mac80211/patches/600-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch
index 837c025b8453ec5828fa79a1a8bee6453b9525b1..d68ad504476adfdd0ac0d30ec54347ae1463f681 100644
--- a/package/kernel/mac80211/patches/600-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch
+++ b/package/kernel/mac80211/patches/600-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] rt2x00: rt2800soc: fix rt2800soc_disable_radio for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800soc.c |    9 ++++++++-
+ drivers/net/wireless/ralink/rt2x00/rt2800soc.c |    9 ++++++++-
  1 file changed, 8 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800soc.c
-+++ b/drivers/net/wireless/rt2x00/rt2800soc.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 @@ -51,9 +51,16 @@ static bool rt2800soc_hwcrypt_disabled(s
  
  static void rt2800soc_disable_radio(struct rt2x00_dev *rt2x00dev)
diff --git a/package/kernel/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch b/package/kernel/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
index 6663b785d8b93a4fe8b95587d25826956ada0873..953263226c884c62f3135697052e807ea6b25e3c 100644
--- a/package/kernel/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
+++ b/package/kernel/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800lib: add BBP register initialization for
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |   44 +++++++++++++++++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   44 +++++++++++++++++++++++++++++++
  1 file changed, 44 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -5808,6 +5808,47 @@ static void rt2800_init_bbp_3593(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -5785,6 +5785,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;
-@@ -6026,6 +6067,9 @@ static void rt2800_init_bbp(struct rt2x0
+@@ -6003,6 +6044,9 @@ static void rt2800_init_bbp(struct rt2x0
  	case RT3593:
  		rt2800_init_bbp_3593(rt2x00dev);
  		return;
diff --git a/package/kernel/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch b/package/kernel/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
index 6e66f1430a1dc0f51cadda3824673d35fbffe225..936fa35a009154af470cb0531d9c9c317ed2614c 100644
--- a/package/kernel/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: add RFCSR initialization for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800.h    |    1 +
- drivers/net/wireless/rt2x00/rt2800lib.c |  141 +++++++++++++++++++++++++++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800.h    |    1 +
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |  141 +++++++++++++++++++++++++++++++
  2 files changed, 142 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -2171,6 +2171,7 @@ struct mac_iveiv_entry {
  /*
   * RFCSR 2:
@@ -19,9 +19,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #define RFCSR2_RESCAL_EN		FIELD8(0x80)
  
  /*
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -6843,6 +6843,144 @@ static void rt2800_init_rfcsr_3593(struc
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -6820,6 +6820,144 @@ static void rt2800_init_rfcsr_3593(struc
  	/* TODO: enable stream mode support */
  }
  
@@ -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);
-@@ -7074,6 +7212,9 @@ static void rt2800_init_rfcsr(struct rt2
+@@ -7051,6 +7189,9 @@ static void rt2800_init_rfcsr(struct rt2
  	case RT3390:
  		rt2800_init_rfcsr_3390(rt2x00dev);
  		break;
diff --git a/package/kernel/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch b/package/kernel/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch
index 57af96106fed9a5e3a5efb69987e511c6761c49a..ae899f73be18820f236e46531a7f6d3ac838d61d 100644
--- a/package/kernel/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch
+++ b/package/kernel/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] rt2x00: rt2800lib: use the extended EEPROM map for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -342,7 +342,8 @@ static unsigned int rt2800_eeprom_word_i
  		      wiphy_name(rt2x00dev->hw->wiphy), word))
  		return 0;
diff --git a/package/kernel/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch b/package/kernel/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
index 9390f7ecfb602e5a3c522c49227cc21ed47846bf..bcaf67677d1ab4e4e8b9303b686f21c5907ca112 100644
--- a/package/kernel/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: force rf type to RF3853 on RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    2 ++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    2 ++
  1 file changed, 2 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7611,6 +7611,8 @@ static int rt2800_init_eeprom(struct rt2
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7588,6 +7588,8 @@ static int rt2800_init_eeprom(struct rt2
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
diff --git a/package/kernel/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch b/package/kernel/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
index 1cba4f68c1a8c48599414ba42a0a2951889110ef..3169c1048d77886e23f4d547f77c1f8f8be54bab 100644
--- a/package/kernel/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
+++ b/package/kernel/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: add channel configuration code for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |   72 +++++++++++++++++++++++++++++--
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   72 +++++++++++++++++++++++++++++--
  1 file changed, 69 insertions(+), 3 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -3429,6 +3429,36 @@ static char rt2800_txpower_to_dev(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -3406,6 +3406,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,
-@@ -3447,6 +3477,12 @@ static void rt2800_config_channel(struct
+@@ -3424,6 +3454,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:
-@@ -3530,6 +3566,15 @@ static void rt2800_config_channel(struct
+@@ -3507,6 +3543,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);
-@@ -3542,6 +3587,7 @@ static void rt2800_config_channel(struct
+@@ -3519,6 +3564,7 @@ static void rt2800_config_channel(struct
  		    !rt2x00_rt(rt2x00dev, RT5392)) {
  			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))
-@@ -3550,19 +3596,22 @@ static void rt2800_config_channel(struct
+@@ -3527,19 +3573,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))
-@@ -3684,6 +3733,23 @@ static void rt2800_config_channel(struct
+@@ -3661,6 +3710,23 @@ static void rt2800_config_channel(struct
  
  		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
  
diff --git a/package/kernel/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch b/package/kernel/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
index 177312845fc2da11c8e8fdccd7fb25165609af94..fa646d2fafc8301a9080a51d1c46338020faf39a 100644
--- a/package/kernel/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
+++ b/package/kernel/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix txpower_to_dev function for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    6 ++++--
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    6 ++++--
  1 file changed, 4 insertions(+), 2 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -3416,13 +3416,15 @@ static char rt2800_txpower_to_dev(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -3393,13 +3393,15 @@ static char rt2800_txpower_to_dev(struct
  				  unsigned int channel,
  				  char txpower)
  {
diff --git a/package/kernel/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch b/package/kernel/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
index 36f0a4cc0653495e0ee187e02b1ec5df0c0913b7..c06876906bf52573a7147b8a68813603cb8b2a48 100644
--- a/package/kernel/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
+++ b/package/kernel/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800lib: use correct txpower calculation function
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4635,7 +4635,8 @@ static void rt2800_config_txpower(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -4612,7 +4612,8 @@ static void rt2800_config_txpower(struct
  				  struct ieee80211_channel *chan,
  				  int power_level)
  {
diff --git a/package/kernel/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch b/package/kernel/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
index 8119f975b0b8f1b119a3f6a64786fc681199ef35..74d80ded1dc65cabd1fd097b3c3a690a3c0c8c9f 100644
--- a/package/kernel/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
+++ b/package/kernel/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800lib: hardcode txmixer gain values to zero for
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    6 ++++--
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    6 ++++--
  1 file changed, 4 insertions(+), 2 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7493,7 +7493,8 @@ static u8 rt2800_get_txmixer_gain_24g(st
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7470,7 +7470,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);
-@@ -7507,7 +7508,8 @@ static u8 rt2800_get_txmixer_gain_5g(str
+@@ -7484,7 +7485,8 @@ static u8 rt2800_get_txmixer_gain_5g(str
  {
  	u16 word;
  
diff --git a/package/kernel/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch b/package/kernel/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch
index 53435aa17e5de016eccd916fd1d1ba78cf4c9888..125928642f2096c3df86e7a5377d8d549063c2ab 100644
--- a/package/kernel/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] rt2x00: rt2800lib: use correct [RT]XWI size for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    1 +
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    1 +
  1 file changed, 1 insertion(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -558,6 +558,7 @@ void rt2800_get_txwi_rxwi_size(struct rt
  {
  	switch (rt2x00dev->chip.rt) {
diff --git a/package/kernel/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch b/package/kernel/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch
index 08f3f88797afb722637815427605d2a1bebe2e4c..0dcc027ffcf9bb0c91d7897ab65c88af199c6523 100644
--- a/package/kernel/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] rt2x00: rt2800lib: use correct beacon base for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -983,7 +983,8 @@ EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
  static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
  					  unsigned int index)
diff --git a/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch b/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch
index dfbdee72281933befeed8d3a395949abb20b073d..6ce224aba27242f5e55030a396ea044d16528653 100644
--- a/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: use correct beacon count for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -8428,7 +8428,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -8403,7 +8403,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	if (rt2x00_rt(rt2x00dev, RT3593))
  		__set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  
diff --git a/package/kernel/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch b/package/kernel/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch
index 22f7110a7e5422768d3c04128668053788b90046..39363685f46d25c8f37afc87cfd433571b22286d 100644
--- a/package/kernel/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch
+++ b/package/kernel/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix antenna configuration for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -1961,7 +1961,8 @@ void rt2800_config_ant(struct rt2x00_dev
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -1938,7 +1938,8 @@ void rt2800_config_ant(struct rt2x00_dev
  	rt2800_bbp_write(rt2x00dev, 3, r3);
  	rt2800_bbp_write(rt2x00dev, 1, r1);
  
diff --git a/package/kernel/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch b/package/kernel/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch
index 9945f38fbd295f77a316cefe5a1b2ab7d79c7dff..f0285874da8851a47e5b154711e13fa2cc91936b 100644
--- a/package/kernel/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch
+++ b/package/kernel/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix LNA gain configuration for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    6 ++++--
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    6 ++++--
  1 file changed, 4 insertions(+), 2 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -1984,7 +1984,8 @@ static void rt2800_config_lna_gain(struc
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -1961,7 +1961,8 @@ static void rt2800_config_lna_gain(struc
  		rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
  		lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
  	} else if (libconf->rf.channel <= 128) {
@@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  			rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
  			lna_gain = rt2x00_get_field16(eeprom,
  						      EEPROM_EXT_LNA2_A1);
-@@ -1994,7 +1995,8 @@ static void rt2800_config_lna_gain(struc
+@@ -1971,7 +1972,8 @@ static void rt2800_config_lna_gain(struc
  						      EEPROM_RSSI_BG2_LNA_A1);
  		}
  	} else {
diff --git a/package/kernel/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch b/package/kernel/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
index beadea88b70d41cde65488fcb914ca7601d72f16..ab8c625c13e90f3c7a487333b3d6be225f088c61 100644
--- a/package/kernel/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix VGC setup for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |   11 +++++++++--
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |   11 +++++++++--
  1 file changed, 9 insertions(+), 2 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4835,7 +4835,8 @@ static u8 rt2800_get_default_vgc(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -4812,7 +4812,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);
-@@ -4855,7 +4856,8 @@ static inline void rt2800_set_vgc(struct
+@@ -4832,7 +4833,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)) {
-@@ -4902,6 +4904,11 @@ void rt2800_link_tuner(struct rt2x00_dev
+@@ -4879,6 +4881,11 @@ void rt2800_link_tuner(struct rt2x00_dev
  		}
  		break;
  
diff --git a/package/kernel/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch b/package/kernel/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
index a6c0f588f767a420d95155204becc76a1c737f24..49830a12f57120c2926bbf3a64d675a8d359a445 100644
--- a/package/kernel/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
+++ b/package/kernel/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix EEPROM LNA validation for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    9 ++++++---
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    9 ++++++---
  1 file changed, 6 insertions(+), 3 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7630,7 +7630,8 @@ static int rt2800_validate_eeprom(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7607,7 +7607,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,
-@@ -7650,7 +7651,8 @@ static int rt2800_validate_eeprom(struct
+@@ -7627,7 +7628,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,
-@@ -7658,7 +7660,8 @@ static int rt2800_validate_eeprom(struct
+@@ -7635,7 +7637,8 @@ static int rt2800_validate_eeprom(struct
  	}
  	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
  
diff --git a/package/kernel/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch b/package/kernel/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
index 910f9ecd2c369ba80f7371b25c05e32d264148d4..6e228479b08c74f99ce4aa2e2e5a2171e5763645 100644
--- a/package/kernel/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
+++ b/package/kernel/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] rt2x00: rt2800lib: fix txpower compensation for RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 +++
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 +++
  1 file changed, 3 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4005,6 +4005,9 @@ static u8 rt2800_compensate_txpower(stru
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -3982,6 +3982,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/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch b/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch
index bcdfc6728e49fdce6557e9e94eb19210899e381b..25753af81b2bf911fec969118e81c90a6c95e975 100644
--- a/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch
+++ b/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800lib: enable RT2800_HAS_HIGH_SHARED_MEM for
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -8441,7 +8441,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -8416,7 +8416,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	if (retval)
  		return retval;
  
diff --git a/package/kernel/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch b/package/kernel/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch
index dc06e6a64b2621a48362f3f18af9e1f0979ce5e8..4f2e7548699e9dbc0d72f67cca987c52c6f6ec88 100644
--- a/package/kernel/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch
+++ b/package/kernel/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] rt2x00: rt2800lib: use high memory for beacons on RT3883
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800lib.c |    3 ++-
+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -97,7 +97,8 @@ static inline void rt2800_shared_mem_sel
  
  static inline bool rt2800_beacon_uses_high_mem(struct rt2x00_dev *rt2x00dev)
diff --git a/package/kernel/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch b/package/kernel/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
index 212eb4e7441623a7697801e249ebf9037eaf2872..a497b5eead47710dde66f5f50afa1cfa6723c53b 100644
--- a/package/kernel/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
+++ b/package/kernel/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: rt2800mmio: add a workaround for spurious
 
 Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800mmio.c |   72 +++++++++++++++++++++++++-----
- drivers/net/wireless/rt2x00/rt2x00.h     |    5 +++
+ drivers/net/wireless/ralink/rt2x00/rt2800mmio.c |   72 +++++++++++++++++++++++++-----
+ drivers/net/wireless/ralink/rt2x00/rt2x00.h     |    5 +++
  2 files changed, 65 insertions(+), 12 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/rt2800mmio.c
-+++ b/drivers/net/wireless/rt2x00/rt2800mmio.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
 @@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigne
  }
  EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
@@ -120,9 +120,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  		/*
  		 * Never disable the TX_FIFO_STATUS interrupt.
  		 */
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -987,6 +987,11 @@ struct rt2x00_dev {
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -991,6 +991,11 @@ struct rt2x00_dev {
  	int rf_channel;
  
  	/*
diff --git a/package/kernel/mac80211/patches/601-rt2x00-set_pci_mwi.patch b/package/kernel/mac80211/patches/601-rt2x00-set_pci_mwi.patch
index 08c8fa651cbb6ea25e1b3fac7f6ef1b70f2173e5..a40716163f62db45e1e498d4eaeca3e9c24c1426 100644
--- a/package/kernel/mac80211/patches/601-rt2x00-set_pci_mwi.patch
+++ b/package/kernel/mac80211/patches/601-rt2x00-set_pci_mwi.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2x00pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00pci.c
 @@ -94,8 +94,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
  
  	pci_set_master(pci_dev);
diff --git a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch
index 8c71075b5cdce6afce5236d03661248f79bea644..7a183a404bae73cdcc120b41e83910ab579974ea 100644
--- a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch
+++ b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch
@@ -20,8 +20,8 @@
 +};
 +
 +#endif /* _RT2X00_PLATFORM_H */
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 @@ -38,6 +38,7 @@
  #include <linux/kfifo.h>
  #include <linux/hrtimer.h>
diff --git a/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
index 8f650a28e5d9968590fbf743709f56901ebcfba6..bc056cd7357f57570168e5c1a4dbd4b9acd9a3c3 100644
--- a/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
+++ b/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
@@ -1,15 +1,15 @@
 --- a/.local-symbols
 +++ b/.local-symbols
-@@ -263,6 +263,7 @@ RT2X00_LIB_FIRMWARE=
+@@ -329,6 +329,7 @@ RT2X00_LIB_FIRMWARE=
  RT2X00_LIB_CRYPTO=
  RT2X00_LIB_LEDS=
  RT2X00_LIB_DEBUGFS=
 +RT2X00_LIB_EEPROM=
  RT2X00_DEBUG=
- RTL_CARDS=
- RTL8192CE=
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
+ WLAN_VENDOR_REALTEK=
+ RTL8180=
+--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
++++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
 @@ -69,6 +69,7 @@ config RT2800PCI
  	select RT2X00_LIB_MMIO
  	select RT2X00_LIB_PCI
@@ -26,7 +26,7 @@
  	select RT2800_LIB
  	select RT2800_LIB_MMIO
  	---help---
-@@ -266,6 +268,9 @@ config RT2X00_LIB_FIRMWARE
+@@ -265,6 +267,9 @@ config RT2X00_LIB_FIRMWARE
  config RT2X00_LIB_CRYPTO
  	bool
  
@@ -36,8 +36,8 @@
  config RT2X00_LIB_LEDS
  	bool
  	default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n)
---- a/drivers/net/wireless/rt2x00/Makefile
-+++ b/drivers/net/wireless/rt2x00/Makefile
+--- a/drivers/net/wireless/ralink/rt2x00/Makefile
++++ b/drivers/net/wireless/ralink/rt2x00/Makefile
 @@ -7,6 +7,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS)	+
  rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO)	+= rt2x00crypto.o
  rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE)	+= rt2x00firmware.o
@@ -46,9 +46,9 @@
  
  obj-$(CPTCFG_RT2X00_LIB)		+= rt2x00lib.o
  obj-$(CPTCFG_RT2X00_LIB_MMIO)		+= rt2x00mmio.o
---- a/drivers/net/wireless/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
-@@ -43,6 +43,8 @@ struct rt2800_drv_data {
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+@@ -46,6 +46,8 @@ struct rt2800_drv_data {
  	} shmem_lock;
  };
  
@@ -57,7 +57,7 @@
  struct rt2800_ops {
  	void (*register_read)(struct rt2x00_dev *rt2x00dev,
  			      const unsigned int offset, u32 *value);
-@@ -176,6 +178,15 @@ static inline int rt2800_read_eeprom(str
+@@ -179,6 +181,15 @@ static inline int rt2800_read_eeprom(str
  {
  	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
  
@@ -73,8 +73,8 @@
  	return rt2800ops->read_eeprom(rt2x00dev);
  }
  
---- a/drivers/net/wireless/rt2x00/rt2800soc.c
-+++ b/drivers/net/wireless/rt2x00/rt2800soc.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 @@ -102,19 +102,6 @@ static int rt2800soc_set_device_state(st
  	return retval;
  }
@@ -103,9 +103,9 @@
  	.hwcrypt_disabled	= rt2800soc_hwcrypt_disabled,
  	.drv_write_firmware	= rt2800soc_write_firmware,
  	.drv_init_registers	= rt2800mmio_init_registers,
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -695,6 +695,7 @@ enum rt2x00_capability_flags {
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -697,6 +697,7 @@ enum rt2x00_capability_flags {
  	REQUIRE_HT_TX_DESC,
  	REQUIRE_PS_AUTOWAKE,
  	REQUIRE_DELAYED_RFKILL,
@@ -113,7 +113,7 @@
  
  	/*
  	 * Capabilities
-@@ -964,6 +965,11 @@ struct rt2x00_dev {
+@@ -968,6 +969,11 @@ struct rt2x00_dev {
  	const struct firmware *fw;
  
  	/*
@@ -125,9 +125,9 @@
  	 * FIFO for storing tx status reports between isr and tasklet.
  	 */
  	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
---- a/drivers/net/wireless/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -1334,6 +1334,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+@@ -1335,6 +1335,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
  	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
  	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
  
@@ -138,7 +138,7 @@
  	/*
  	 * Let the driver probe the device to detect the capabilities.
  	 */
-@@ -1474,6 +1478,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
+@@ -1475,6 +1479,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
  	 * Free the driver data.
  	 */
  	kfree(rt2x00dev->drv_data);
@@ -151,7 +151,7 @@
  EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
  
 --- /dev/null
-+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
 @@ -0,0 +1,111 @@
 +/*
 +	Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
@@ -264,8 +264,8 @@
 +	release_firmware(rt2x00dev->eeprom_file);
 +	rt2x00dev->eeprom_file = NULL;
 +}
---- a/drivers/net/wireless/rt2x00/rt2x00lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h
 @@ -320,6 +320,22 @@ static inline void rt2x00lib_free_firmwa
  #endif /* CPTCFG_RT2X00_LIB_FIRMWARE */
  
@@ -289,8 +289,8 @@
   * Debugfs handlers.
   */
  #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
---- a/drivers/net/wireless/rt2x00/rt2x00soc.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00soc.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 @@ -92,6 +92,7 @@ int rt2x00soc_probe(struct platform_devi
  	rt2x00dev->hw = hw;
  	rt2x00dev->irq = platform_get_irq(pdev, 0);
diff --git a/package/kernel/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch b/package/kernel/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch
index 4bc6f37adb71af568fc169a6723c3adb664f8ce8..9dffef1812d121c6132b77fa5fa3ca7c50d277c8 100644
--- a/package/kernel/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch
+++ b/package/kernel/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
 @@ -26,6 +26,7 @@
  
  #include <linux/kernel.h>
diff --git a/package/kernel/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch b/package/kernel/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
index 75f0415b73f71e35f9b9b4ac0891e9c1e03412df..5dceff87943174bf41995aae438b9fbc906a2022 100644
--- a/package/kernel/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
+++ b/package/kernel/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside
 
 Signed-off-by: John Crispin <blogic@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/Kconfig     |    1 +
- drivers/net/wireless/rt2x00/rt2800pci.c |   44 ++++++++++++++++++++++++++-----
+ drivers/net/wireless/ralink/rt2x00/Kconfig     |    1 +
+ drivers/net/wireless/ralink/rt2x00/rt2800pci.c |   44 ++++++++++++++++++++++++++-----
  2 files changed, 39 insertions(+), 6 deletions(-)
 
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
+--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
++++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
 @@ -219,6 +219,7 @@ config RT2800SOC
  	select RT2X00_LIB_EEPROM
  	select RT2800_LIB
@@ -20,8 +20,8 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  	---help---
  	  This adds support for Ralink WiSoC devices.
  	  Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352.
---- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
 @@ -26,11 +26,66 @@
  
  #include <linux/kernel.h>
@@ -79,7 +79,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +	if (!ret) {
 +		rt2x00dev->eeprom_file = &mtd_fw;
 +		mtd_fw.size = len;
-+		mtd_fw.data = rt2x00dev->eeprom;
++		mtd_fw.data = (const u8 *) rt2x00dev->eeprom;
 +	}
 +#endif
 +
diff --git a/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
index 70f7b783ad43f009479e8a6de0b12f5a579c2002..d923e05c770f2f325d7b47a9a5c9bcdf63cbbbdc 100644
--- a/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
+++ b/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
@@ -10,8 +10,8 @@
  };
  
  #endif /* _RT2X00_PLATFORM_H */
---- a/drivers/net/wireless/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 @@ -940,6 +940,22 @@ static int rt2x00lib_probe_hw_modes(stru
  	unsigned int num_rates;
  	unsigned int i;
@@ -35,9 +35,9 @@
  	num_rates = 0;
  	if (spec->supported_rates & SUPPORT_RATE_CCK)
  		num_rates += 4;
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -403,6 +403,7 @@ struct hw_mode_spec {
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -405,6 +405,7 @@ struct hw_mode_spec {
  	unsigned int supported_bands;
  #define SUPPORT_BAND_2GHZ	0x00000001
  #define SUPPORT_BAND_5GHZ	0x00000002
diff --git a/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch
index a35bd55a7c05902659cdba434ce2d641a7991ebe..a645ba176e4ab17046945a87bb97359602b675c6 100644
--- a/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch
+++ b/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch
@@ -8,8 +8,8 @@
  
  	int disable_2ghz;
  	int disable_5ghz;
---- a/drivers/net/wireless/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 @@ -931,6 +931,18 @@ static void rt2x00lib_rate(struct ieee80
  		entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
  }
@@ -29,9 +29,9 @@
  static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
  				    struct hw_mode_spec *spec)
  {
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -1410,6 +1410,7 @@ static inline void rt2x00debug_dump_fram
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -1414,6 +1414,7 @@ static inline void rt2x00debug_dump_fram
   */
  u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
  			 struct ieee80211_vif *vif);
@@ -39,8 +39,8 @@
  
  /*
   * Interrupt context handlers.
---- a/drivers/net/wireless/rt2x00/rt61pci.c
-+++ b/drivers/net/wireless/rt2x00/rt61pci.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
 @@ -2392,6 +2392,7 @@ static int rt61pci_validate_eeprom(struc
  	u32 reg;
  	u16 word;
diff --git a/package/kernel/mac80211/patches/609-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/609-rt2x00-allow_disabling_bands_through_dts.patch
index 63a8641464fab0def980afd28e3eee7e9990c314..3fdaae759b6042b38e6716efec77ea9dadefba9c 100644
--- a/package/kernel/mac80211/patches/609-rt2x00-allow_disabling_bands_through_dts.patch
+++ b/package/kernel/mac80211/patches/609-rt2x00-allow_disabling_bands_through_dts.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 @@ -26,6 +26,7 @@
  #include <linux/module.h>
  #include <linux/slab.h>
diff --git a/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch b/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
index 067d2eaf731f09072806ad38b8fa5952fdfd88dd..c69d33025d91dfb49ec411cbe2fc506ba67d03ff 100644
--- a/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
+++ b/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -3552,11 +3552,18 @@ static void rt2800_config_channel(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -3529,11 +3529,18 @@ static void rt2800_config_channel(struct
  	/*
  	 * Change BBP settings
  	 */
@@ -19,7 +19,7 @@
  	} else if (rt2x00_rt(rt2x00dev, RT3593)) {
  		if (rf->channel > 14) {
  			/* Disable CCK Packet detection on 5GHz */
-@@ -6618,6 +6625,12 @@ static void rt2800_init_rfcsr_3290(struc
+@@ -6595,6 +6602,12 @@ static void rt2800_init_rfcsr_3290(struc
  
  static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  {
@@ -32,7 +32,7 @@
  	rt2800_rf_init_calibration(rt2x00dev, 30);
  
  	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
-@@ -6653,15 +6666,30 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -6630,15 +6643,30 @@ static void rt2800_init_rfcsr_3352(struc
  	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
@@ -66,7 +66,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
-@@ -6669,15 +6697,20 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -6646,15 +6674,20 @@ static void rt2800_init_rfcsr_3352(struc
  	rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
  	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
  	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
@@ -96,7 +96,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
-@@ -7698,6 +7731,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7675,6 +7708,7 @@ static int rt2800_init_eeprom(struct rt2
  	 * RT53xx: defined in "EEPROM_CHIP_ID" field
  	 */
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
@@ -104,7 +104,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
-@@ -7793,7 +7827,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7770,7 +7804,8 @@ static int rt2800_init_eeprom(struct rt2
  	/*
  	 * Detect if this device has Bluetooth co-existence.
  	 */
@@ -114,7 +114,7 @@
  		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  
  	/*
-@@ -7822,6 +7857,22 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7799,6 +7834,22 @@ static int rt2800_init_eeprom(struct rt2
  					EIRP_MAX_TX_POWER_LIMIT)
  		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  
@@ -137,8 +137,8 @@
  	return 0;
  }
  
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -2335,6 +2335,12 @@ struct mac_iveiv_entry {
  #define RFCSR36_RF_BS			FIELD8(0x80)
  
@@ -198,9 +198,9 @@
  
  /*
   * EEPROM frequency
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -715,6 +715,8 @@ enum rt2x00_capability_flags {
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -717,6 +717,8 @@ enum rt2x00_capability_flags {
  	CAPABILITY_DOUBLE_ANTENNA,
  	CAPABILITY_BT_COEXIST,
  	CAPABILITY_VCO_RECALIBRATION,
diff --git a/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch b/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
index 1dcca36c21b5ea12279b73d98ed207f6541f7add..b44fe900d53f87580ab8c0e502bc7f94958e6109 100644
--- a/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
+++ b/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -8209,6 +8209,27 @@ static const struct rf_channel rf_vals_5
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -8186,6 +8186,27 @@ static const struct rf_channel rf_vals_5
  	{196, 83, 0, 12, 1},
  };
  
@@ -28,7 +28,7 @@
  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  {
  	struct hw_mode_spec *spec = &rt2x00dev->spec;
-@@ -8297,7 +8318,10 @@ static int rt2800_probe_hw_mode(struct r
+@@ -8272,7 +8293,10 @@ static int rt2800_probe_hw_mode(struct r
  	case RF5390:
  	case RF5392:
  		spec->num_channels = 14;
@@ -40,7 +40,7 @@
  		break;
  
  	case RF3052:
-@@ -8481,6 +8505,19 @@ static int rt2800_probe_rt(struct rt2x00
+@@ -8456,6 +8480,19 @@ static int rt2800_probe_rt(struct rt2x00
  	return 0;
  }
  
@@ -60,7 +60,7 @@
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  {
  	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
-@@ -8523,6 +8560,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -8498,6 +8535,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  
  	/*
@@ -76,9 +76,9 @@
  	 * Initialize hw specifications.
  	 */
  	retval = rt2800_probe_hw_mode(rt2x00dev);
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -398,6 +398,7 @@ static inline struct rt2x00_intf* vif_to
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+@@ -400,6 +400,7 @@ static inline struct rt2x00_intf* vif_to
   * @channels: Device/chipset specific channel values (See &struct rf_channel).
   * @channels_info: Additional information for channels (See &struct channel_info).
   * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
@@ -86,7 +86,7 @@
   */
  struct hw_mode_spec {
  	unsigned int supported_bands;
-@@ -414,6 +415,7 @@ struct hw_mode_spec {
+@@ -416,6 +417,7 @@ struct hw_mode_spec {
  	const struct channel_info *channels_info;
  
  	struct ieee80211_sta_ht_cap ht;
diff --git a/package/kernel/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch b/package/kernel/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
index 1970efc08c5868b17e0d85f48f4990c6e87092c0..e4b028b1a9336e2a721dd322f28e9774f0da39bd 100644
--- a/package/kernel/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
+++ b/package/kernel/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
@@ -8,11 +8,11 @@ devicetree.
 
 Signed-off-by: John Crispin <blogic@openwrt.org>
 ---
- drivers/net/wireless/rt2x00/rt2800pci.c |    7 +++++++
+ drivers/net/wireless/ralink/rt2x00/rt2800pci.c |    7 +++++++
  1 file changed, 7 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800soc.c
-+++ b/drivers/net/wireless/rt2x00/rt2800soc.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 @@ -237,10 +237,17 @@ static int rt2800soc_probe(struct platfo
  	return rt2x00soc_probe(pdev, &rt2800soc_ops);
  }
diff --git a/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch b/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch
index c779a1732c65f3f6cdd3b5965862f760c2b1846e..8e3bd2a3622c1954a01ed548c71e436be9e92d8e 100644
--- a/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch
+++ b/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -36,6 +36,7 @@
  #include <linux/kernel.h>
  #include <linux/module.h>
@@ -8,7 +8,7 @@
  
  #include "rt2x00.h"
  #include "rt2800lib.h"
-@@ -8507,13 +8508,14 @@ static int rt2800_probe_rt(struct rt2x00
+@@ -8482,13 +8483,14 @@ static int rt2800_probe_rt(struct rt2x00
  
  int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
  {
diff --git a/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch b/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
index 840b3bc96408af64eedfca8f2d58f94a9db7b5f8..faa5879de68b0ec27d0099b51e296cfd7ccf7416 100644
--- a/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
+++ b/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -74,6 +74,7 @@
  #define RF3070				0x3070
  #define RF3290				0x3290
@@ -8,9 +8,9 @@
  #define RF5360				0x5360
  #define RF5362				0x5362
  #define RF5370				0x5370
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -3038,6 +3038,13 @@ static void rt2800_config_channel_rf53xx
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -3015,6 +3015,13 @@ static void rt2800_config_channel_rf53xx
  
  				rt2800_rfcsr_write(rt2x00dev, 59,
  						   r59_non_bt[idx]);
@@ -24,7 +24,7 @@
  			}
  		}
  	}
-@@ -3516,6 +3523,7 @@ static void rt2800_config_channel(struct
+@@ -3493,6 +3500,7 @@ static void rt2800_config_channel(struct
  		rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
  		break;
  	case RF3070:
@@ -32,7 +32,7 @@
  	case RF5360:
  	case RF5362:
  	case RF5370:
-@@ -3534,6 +3542,7 @@ static void rt2800_config_channel(struct
+@@ -3511,6 +3519,7 @@ static void rt2800_config_channel(struct
  	if (rt2x00_rf(rt2x00dev, RF3070) ||
  	    rt2x00_rf(rt2x00dev, RF3290) ||
  	    rt2x00_rf(rt2x00dev, RF3322) ||
@@ -40,7 +40,7 @@
  	    rt2x00_rf(rt2x00dev, RF5360) ||
  	    rt2x00_rf(rt2x00dev, RF5362) ||
  	    rt2x00_rf(rt2x00dev, RF5370) ||
-@@ -3812,7 +3821,8 @@ static void rt2800_config_channel(struct
+@@ -3789,7 +3798,8 @@ static void rt2800_config_channel(struct
  	/*
  	 * Clear update flag
  	 */
@@ -50,7 +50,7 @@
  		rt2800_bbp_read(rt2x00dev, 49, &bbp);
  		rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
  		rt2800_bbp_write(rt2x00dev, 49, bbp);
-@@ -4698,6 +4708,7 @@ void rt2800_vco_calibration(struct rt2x0
+@@ -4675,6 +4685,7 @@ void rt2800_vco_calibration(struct rt2x0
  	case RF3070:
  	case RF3290:
  	case RF3853:
@@ -58,7 +58,7 @@
  	case RF5360:
  	case RF5362:
  	case RF5370:
-@@ -5111,6 +5122,8 @@ static int rt2800_init_registers(struct
+@@ -5088,6 +5099,8 @@ static int rt2800_init_registers(struct
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -67,7 +67,7 @@
  	} else {
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-@@ -5766,9 +5779,13 @@ static void rt2800_init_bbp_3352(struct
+@@ -5743,9 +5756,13 @@ static void rt2800_init_bbp_3352(struct
  
  	rt2800_bbp_write(rt2x00dev, 82, 0x62);
  
@@ -84,7 +84,7 @@
  
  	rt2800_bbp_write(rt2x00dev, 86, 0x38);
  
-@@ -5782,9 +5799,13 @@ static void rt2800_init_bbp_3352(struct
+@@ -5759,9 +5776,13 @@ static void rt2800_init_bbp_3352(struct
  
  	rt2800_bbp_write(rt2x00dev, 104, 0x92);
  
@@ -101,7 +101,7 @@
  
  	rt2800_bbp_write(rt2x00dev, 120, 0x50);
  
-@@ -5809,6 +5830,13 @@ static void rt2800_init_bbp_3352(struct
+@@ -5786,6 +5807,13 @@ static void rt2800_init_bbp_3352(struct
  	rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  
  	rt2800_bbp_write(rt2x00dev, 148, 0xc8);
@@ -115,7 +115,7 @@
  }
  
  static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
-@@ -6150,6 +6178,7 @@ static void rt2800_init_bbp(struct rt2x0
+@@ -6127,6 +6155,7 @@ static void rt2800_init_bbp(struct rt2x0
  		rt2800_init_bbp_3290(rt2x00dev);
  		break;
  	case RT3352:
@@ -123,7 +123,7 @@
  		rt2800_init_bbp_3352(rt2x00dev);
  		break;
  	case RT3390:
-@@ -7101,6 +7130,76 @@ static void rt2800_init_rfcsr_3883(struc
+@@ -7078,6 +7107,76 @@ static void rt2800_init_rfcsr_3883(struc
  	rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
  }
  
@@ -200,7 +200,7 @@
  static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
  {
  	rt2800_rf_init_calibration(rt2x00dev, 2);
-@@ -7341,6 +7440,9 @@ static void rt2800_init_rfcsr(struct rt2
+@@ -7318,6 +7417,9 @@ static void rt2800_init_rfcsr(struct rt2
  	case RT3593:
  		rt2800_init_rfcsr_3593(rt2x00dev);
  		break;
@@ -210,7 +210,7 @@
  	case RT5390:
  		rt2800_init_rfcsr_5390(rt2x00dev);
  		break;
-@@ -7600,6 +7702,12 @@ static int rt2800_validate_eeprom(struct
+@@ -7577,6 +7679,12 @@ static int rt2800_validate_eeprom(struct
  		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
  		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
  		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
@@ -223,7 +223,7 @@
  	} else if (rt2x00_rt(rt2x00dev, RT2860) ||
  		   rt2x00_rt(rt2x00dev, RT2872)) {
  		/*
-@@ -7738,6 +7846,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7715,6 +7823,8 @@ static int rt2800_init_eeprom(struct rt2
  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
  	else if (rt2x00_rt(rt2x00dev, RT3883))
  		rf = RF3853;
@@ -232,7 +232,7 @@
  	else
  		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
  
-@@ -7757,6 +7867,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7734,6 +7844,7 @@ static int rt2800_init_eeprom(struct rt2
  	case RF3320:
  	case RF3322:
  	case RF3853:
@@ -240,7 +240,7 @@
  	case RF5360:
  	case RF5362:
  	case RF5370:
-@@ -8312,6 +8423,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -8287,6 +8398,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF3290:
  	case RF3320:
  	case RF3322:
@@ -248,7 +248,7 @@
  	case RF5360:
  	case RF5362:
  	case RF5370:
-@@ -8451,6 +8563,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -8426,6 +8538,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF3070:
  	case RF3290:
  	case RF3853:
@@ -256,7 +256,7 @@
  	case RF5360:
  	case RF5362:
  	case RF5370:
-@@ -8491,6 +8604,7 @@ static int rt2800_probe_rt(struct rt2x00
+@@ -8466,6 +8579,7 @@ static int rt2800_probe_rt(struct rt2x00
  	case RT3572:
  	case RT3593:
  	case RT3883:
@@ -264,8 +264,8 @@
  	case RT5390:
  	case RT5392:
  	case RT5592:
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 @@ -169,6 +169,7 @@ struct rt2x00_chip {
  #define RT3572		0x3572
  #define RT3593		0x3593
diff --git a/package/kernel/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
index 13f2048e607c18e63f1ab692b7dedae8d9891a60..6094a613b2e25e610ec23d0f4d70563e3c116f95 100644
--- a/package/kernel/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
+++ b/package/kernel/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -37,6 +37,7 @@
  #include <linux/module.h>
  #include <linux/slab.h>
@@ -8,7 +8,7 @@
  
  #include "rt2x00.h"
  #include "rt2800lib.h"
-@@ -7957,6 +7958,17 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7934,6 +7935,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);
  
@@ -26,8 +26,8 @@
  	rt2x00dev->led_mcu_reg = eeprom;
  #endif /* CPTCFG_RT2X00_LIB_LEDS */
  
---- a/drivers/net/wireless/rt2x00/rt2x00leds.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00leds.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c
 @@ -109,6 +109,9 @@ static int rt2x00leds_register_led(struc
  	led->led_dev.name = name;
  	led->led_dev.brightness = LED_OFF;
diff --git a/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
index 2dbfd10f70618382f7c0010714e8638bb5604ef9..55452b9ebde82e716e9fbf557db07abdde07dce5 100644
--- a/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
+++ b/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -1283,7 +1283,7 @@ static inline void rt2x00lib_set_if_comb
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+@@ -1284,7 +1284,7 @@ static inline void rt2x00lib_set_if_comb
  	 */
  	if_limit = &rt2x00dev->if_limits_ap;
  	if_limit->max = rt2x00dev->ops->max_ap_intf;
diff --git a/package/kernel/mac80211/patches/620-rt2x00-rt3352-rf-id.patch b/package/kernel/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
index aaa8367a6a0cedf106835a5635d72b59e1348853..8ddf4258501cfba89bfdceb305349f26bf2273c2 100644
--- a/package/kernel/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
+++ b/package/kernel/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7841,10 +7841,11 @@ static int rt2800_init_eeprom(struct rt2
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -7818,10 +7818,11 @@ static int rt2800_init_eeprom(struct rt2
  	 * RT53xx: defined in "EEPROM_CHIP_ID" field
  	 */
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
diff --git a/package/kernel/mac80211/patches/621-rt2x00-ht20_40_fix.patch b/package/kernel/mac80211/patches/621-rt2x00-ht20_40_fix.patch
index bb2fc1ca95ea2b91950a246b52bc11ee7ee022a3..e3e4c98efca132e5408ab998a01b56007b909b79 100644
--- a/package/kernel/mac80211/patches/621-rt2x00-ht20_40_fix.patch
+++ b/package/kernel/mac80211/patches/621-rt2x00-ht20_40_fix.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -2321,6 +2321,8 @@ struct mac_iveiv_entry {
  #define RFCSR30_RX_H20M			FIELD8(0x04)
  #define RFCSR30_RX_VCM			FIELD8(0x18)
@@ -9,9 +9,9 @@
  
  /*
   * RFCSR 31:
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -3551,8 +3551,13 @@ static void rt2800_config_channel(struct
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+@@ -3528,8 +3528,13 @@ static void rt2800_config_channel(struct
  	    rt2x00_rf(rt2x00dev, RF5390) ||
  	    rt2x00_rf(rt2x00dev, RF5392)) {
  		rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
diff --git a/package/kernel/mac80211/patches/622-rt2x00-fix-beacon-bit-balance.patch b/package/kernel/mac80211/patches/622-rt2x00-fix-beacon-bit-balance.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3cf6268155dc7153db2fe092219f814181cabd2c
--- /dev/null
+++ b/package/kernel/mac80211/patches/622-rt2x00-fix-beacon-bit-balance.patch
@@ -0,0 +1,47 @@
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
+@@ -627,12 +627,8 @@ void rt2x00mac_bss_info_changed(struct i
+ 		} else if (bss_conf->enable_beacon && !intf->enable_beacon) {
+ 			rt2x00dev->intf_beaconing++;
+ 			intf->enable_beacon = true;
+-			/*
+-			 * Upload beacon to the H/W. This is only required on
+-			 * USB devices. PCI devices fetch beacons periodically.
+-			 */
+-			if (rt2x00_is_usb(rt2x00dev))
+-				rt2x00queue_update_beacon(rt2x00dev, vif);
++
++			rt2x00queue_update_beacon(rt2x00dev, vif);
+ 
+ 			if (rt2x00dev->intf_beaconing == 1) {
+ 				/*
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+@@ -144,7 +144,8 @@ static void rt2x00lib_intf_scheduled_ite
+ 
+ 	if (test_and_clear_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags)) {
+ 		mutex_lock(&intf->beacon_skb_mutex);
+-		rt2x00queue_update_beacon(rt2x00dev, vif);
++		if (intf->enable_beacon)
++			rt2x00queue_update_beacon(rt2x00dev, vif);
+ 		mutex_unlock(&intf->beacon_skb_mutex);
+ 	}
+ }
+@@ -207,6 +208,7 @@ static void rt2x00lib_beaconupdate_iter(
+ 					struct ieee80211_vif *vif)
+ {
+ 	struct rt2x00_dev *rt2x00dev = data;
++	struct rt2x00_intf *intf = vif_to_intf(vif);
+ 
+ 	if (vif->type != NL80211_IFTYPE_AP &&
+ 	    vif->type != NL80211_IFTYPE_ADHOC &&
+@@ -220,7 +222,8 @@ static void rt2x00lib_beaconupdate_iter(
+ 	 * never be called for USB devices.
+ 	 */
+ 	WARN_ON(rt2x00_is_usb(rt2x00dev));
+-	rt2x00queue_update_beacon(rt2x00dev, vif);
++	if (intf->enable_beacon)
++		rt2x00queue_update_beacon(rt2x00dev, vif);
+ }
+ 
+ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
diff --git a/package/kernel/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch b/package/kernel/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
index f2a766328ecbebb7d1e7259f24fd924459b24ec8..a901a44ba42619b30d8b4c56332fdb36bdab0b14 100644
--- a/package/kernel/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
+++ b/package/kernel/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/mwl8k.c
-+++ b/drivers/net/wireless/mwl8k.c
-@@ -5678,6 +5678,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
+--- a/drivers/net/wireless/marvell/mwl8k.c
++++ b/drivers/net/wireless/marvell/mwl8k.c
+@@ -5681,6 +5681,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
  MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
  
  static const struct pci_device_id mwl8k_pci_id_table[] = {
diff --git a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch
index 9e29034e8cbfb8782efc69736c8c9ca46c4eb43b..fd885cc002461dbdb4b21f3bc4c5ae97c6609ad3 100644
--- a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch
+++ b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/libertas/cfg.c
-+++ b/drivers/net/wireless/libertas/cfg.c
+--- a/drivers/net/wireless/marvell/libertas/cfg.c
++++ b/drivers/net/wireless/marvell/libertas/cfg.c
 @@ -2084,6 +2084,8 @@ struct wireless_dev *lbs_cfg_alloc(struc
  		goto err_wiphy_new;
  	}
@@ -9,8 +9,8 @@
  	lbs_deb_leave(LBS_DEB_CFG80211);
  	return wdev;
  
---- a/drivers/net/wireless/libertas/main.c
-+++ b/drivers/net/wireless/libertas/main.c
+--- a/drivers/net/wireless/marvell/libertas/main.c
++++ b/drivers/net/wireless/marvell/libertas/main.c
 @@ -987,6 +987,7 @@ struct lbs_private *lbs_add_card(void *c
  		goto err_adapter;
  	}
diff --git a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch
index 252fa810b06cdda6e34820c503668c46abde2b47..b67a95f948b79b4430799beadbcb98fc6f05e0da 100644
--- a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch
+++ b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/libertas/cfg.c
-+++ b/drivers/net/wireless/libertas/cfg.c
+--- a/drivers/net/wireless/marvell/libertas/cfg.c
++++ b/drivers/net/wireless/marvell/libertas/cfg.c
 @@ -2174,6 +2174,8 @@ int lbs_cfg_register(struct lbs_private
  	wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
  	wdev->wiphy->reg_notifier = lbs_reg_notifier;
diff --git a/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch b/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch
new file mode 100644
index 0000000000000000000000000000000000000000..74cd4489f15fb1b18a2157441011a4ff68bb60f8
--- /dev/null
+++ b/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch
@@ -0,0 +1,17 @@
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
+@@ -1215,10 +1215,10 @@ void b43_wireless_core_phy_pll_reset(str
+ 	case B43_BUS_BCMA:
+ 		bcma_cc = &dev->dev->bdev->bus->drv_cc;
+ 
+-		bcma_cc_write32(bcma_cc, BCMA_CC_CHIPCTL_ADDR, 0);
+-		bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4);
+-		bcma_cc_set32(bcma_cc, BCMA_CC_CHIPCTL_DATA, 0x4);
+-		bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4);
++		bcma_cc_write32(bcma_cc, BCMA_CC_PMU_CHIPCTL_ADDR, 0);
++		bcma_cc_mask32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, ~0x4);
++		bcma_cc_set32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, 0x4);
++		bcma_cc_mask32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, ~0x4);
+ 		break;
+ #endif
+ #ifdef CPTCFG_B43_SSB
diff --git a/package/kernel/mac80211/patches/805-b43-gpio-mask-module-option.patch b/package/kernel/mac80211/patches/805-b43-gpio-mask-module-option.patch
index 95867ef8da9aa0a3f21ab6a6c3185710b77a0579..fd9e6fd97454a20f7f9236104fb58beb39be1788 100644
--- a/package/kernel/mac80211/patches/805-b43-gpio-mask-module-option.patch
+++ b/package/kernel/mac80211/patches/805-b43-gpio-mask-module-option.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/b43/b43.h
-+++ b/drivers/net/wireless/b43/b43.h
+--- a/drivers/net/wireless/broadcom/b43/b43.h
++++ b/drivers/net/wireless/broadcom/b43/b43.h
 @@ -839,6 +839,7 @@ struct b43_wldev {
  	bool qos_enabled;		/* TRUE, if QoS is used. */
  	bool hwcrypto_enabled;		/* TRUE, if HW crypto acceleration is enabled. */
@@ -8,9 +8,9 @@
  
  	/* PHY/Radio device. */
  	struct b43_phy phy;
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -76,6 +76,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw");
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
+@@ -75,6 +75,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw");
  MODULE_FIRMWARE("b43/ucode5.fw");
  MODULE_FIRMWARE("b43/ucode9.fw");
  
diff --git a/package/kernel/mac80211/patches/810-b43_no_pio.patch b/package/kernel/mac80211/patches/810-b43_no_pio.patch
index 0979100d4cd762e89e51d7d46b3862a8bf655b70..79428c278450e400e2566628ac6d1e0ed69694fc 100644
--- a/package/kernel/mac80211/patches/810-b43_no_pio.patch
+++ b/package/kernel/mac80211/patches/810-b43_no_pio.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/b43/Makefile
-+++ b/drivers/net/wireless/b43/Makefile
+--- a/drivers/net/wireless/broadcom/b43/Makefile
++++ b/drivers/net/wireless/broadcom/b43/Makefile
 @@ -17,7 +17,7 @@ b43-$(CPTCFG_B43_PHY_AC)	+= phy_ac.o
  b43-y				+= sysfs.o
  b43-y				+= xmit.o
@@ -9,8 +9,8 @@
  b43-y				+= rfkill.o
  b43-y				+= ppr.o
  b43-$(CPTCFG_B43_LEDS)		+= leds.o
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
 @@ -2008,10 +2008,12 @@ static void b43_do_interrupt_thread(stru
  			dma_reason[0], dma_reason[1],
  			dma_reason[2], dma_reason[3],
@@ -24,8 +24,8 @@
  		b43_controller_restart(dev, "DMA error");
  		return;
  	}
---- a/drivers/net/wireless/b43/pio.h
-+++ b/drivers/net/wireless/b43/pio.h
+--- a/drivers/net/wireless/broadcom/b43/pio.h
++++ b/drivers/net/wireless/broadcom/b43/pio.h
 @@ -150,7 +150,7 @@ static inline void b43_piorx_write32(str
  	b43_write32(q->dev, q->mmio_base + offset, value);
  }
@@ -73,9 +73,9 @@
 +#endif /* CPTCFG_B43_PIO */
  
  #endif /* B43_PIO_H_ */
---- a/drivers/net/wireless/b43/Kconfig
-+++ b/drivers/net/wireless/b43/Kconfig
-@@ -118,7 +118,7 @@ config B43_BCMA_PIO
+--- a/drivers/net/wireless/broadcom/b43/Kconfig
++++ b/drivers/net/wireless/broadcom/b43/Kconfig
+@@ -98,7 +98,7 @@ config B43_BCMA_PIO
  	default y
  
  config B43_PIO
diff --git a/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch b/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch
index ac58dba19bce0cbe184a187ab7fbcf4545caa891..06c731fce677f7ea4a29652916c678f6de4dfc7d 100644
--- a/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch
+++ b/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
 @@ -1648,7 +1648,7 @@ static void b43_write_beacon_template(st
  				  len, ram_offset, shm_size_offset, rate);
  
@@ -9,7 +9,7 @@
  	antenna = b43_antenna_to_phyctl(antenna);
  	ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
  	/* We can't send beacons with short preamble. Would get PHY errors. */
-@@ -3302,8 +3302,8 @@ static int b43_chip_init(struct b43_wlde
+@@ -3300,8 +3300,8 @@ static int b43_chip_init(struct b43_wlde
  
  	/* Select the antennae */
  	if (phy->ops->set_rx_antenna)
@@ -20,7 +20,7 @@
  
  	if (phy->type == B43_PHYTYPE_B) {
  		value16 = b43_read16(dev, 0x005E);
-@@ -4003,7 +4003,6 @@ static int b43_op_config(struct ieee8021
+@@ -4001,7 +4001,6 @@ static int b43_op_config(struct ieee8021
  	struct b43_wldev *dev = wl->current_dev;
  	struct b43_phy *phy = &dev->phy;
  	struct ieee80211_conf *conf = &hw->conf;
@@ -28,7 +28,7 @@
  	int err = 0;
  
  	mutex_lock(&wl->mutex);
-@@ -4046,11 +4045,9 @@ static int b43_op_config(struct ieee8021
+@@ -4044,11 +4043,9 @@ static int b43_op_config(struct ieee8021
  	}
  
  	/* Antennas for RX and management frame TX. */
@@ -42,7 +42,7 @@
  
  	if (wl->radio_enabled != phy->radio_on) {
  		if (wl->radio_enabled) {
-@@ -5213,6 +5210,47 @@ static int b43_op_get_survey(struct ieee
+@@ -5209,6 +5206,47 @@ static int b43_op_get_survey(struct ieee
  	return 0;
  }
  
@@ -90,7 +90,7 @@
  static const struct ieee80211_ops b43_hw_ops = {
  	.tx			= b43_op_tx,
  	.conf_tx		= b43_op_conf_tx,
-@@ -5234,6 +5272,8 @@ static const struct ieee80211_ops b43_hw
+@@ -5230,6 +5268,8 @@ static const struct ieee80211_ops b43_hw
  	.sw_scan_complete	= b43_op_sw_scan_complete_notifier,
  	.get_survey		= b43_op_get_survey,
  	.rfkill_poll		= b43_rfkill_poll,
@@ -99,7 +99,7 @@
  };
  
  /* Hard-reset the chip. Do not call this directly.
-@@ -5542,6 +5582,8 @@ static int b43_one_core_attach(struct b4
+@@ -5538,6 +5578,8 @@ static int b43_one_core_attach(struct b4
  	if (!wldev)
  		goto out;
  
@@ -108,7 +108,7 @@
  	wldev->use_pio = b43_modparam_pio;
  	wldev->dev = dev;
  	wldev->wl = wl;
-@@ -5632,6 +5674,9 @@ static struct b43_wl *b43_wireless_init(
+@@ -5628,6 +5670,9 @@ static struct b43_wl *b43_wireless_init(
  
  	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  
@@ -118,8 +118,8 @@
  	wl->hw_registred = false;
  	hw->max_rates = 2;
  	SET_IEEE80211_DEV(hw, dev->dev);
---- a/drivers/net/wireless/b43/b43.h
-+++ b/drivers/net/wireless/b43/b43.h
+--- a/drivers/net/wireless/broadcom/b43/b43.h
++++ b/drivers/net/wireless/broadcom/b43/b43.h
 @@ -840,6 +840,8 @@ struct b43_wldev {
  	bool hwcrypto_enabled;		/* TRUE, if HW crypto acceleration is enabled. */
  	bool use_pio;			/* TRUE if next init should use PIO */
diff --git a/package/kernel/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch b/package/kernel/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch
index 9c51ac63d72867f5410e3a88a94289109819cfe1..5899706896901f270ab3735315c0babbcc7e0bf5 100644
--- a/package/kernel/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch
+++ b/package/kernel/mac80211/patches/841-b43-reduce-number-of-RX-slots.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/b43/dma.h
-+++ b/drivers/net/wireless/b43/dma.h
+--- a/drivers/net/wireless/broadcom/b43/dma.h
++++ b/drivers/net/wireless/broadcom/b43/dma.h
 @@ -169,7 +169,7 @@ struct b43_dmadesc_generic {
  
  /* DMA engine tuning knobs */
diff --git a/package/kernel/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch b/package/kernel/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
index d4f9a8892bea8963c569040671fb2ea906456efc..8d0c0412d2add813ae880e37997d712d36bbf004 100644
--- a/package/kernel/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
+++ b/package/kernel/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
 @@ -2899,6 +2899,14 @@ static int b43_gpio_init(struct b43_wlde
  	} else if (dev->dev->chip_id == 0x5354) {
  		/* Don't allow overtaking buttons GPIOs */
diff --git a/package/kernel/mac80211/patches/847-b43-always-take-overlapping-devs.patch b/package/kernel/mac80211/patches/847-b43-always-take-overlapping-devs.patch
index 9d1d41946008318f9edb554cafbc4cc1073abbe9..ef7f3c92d24141eb6d3ae036977de6ab96c1002e 100644
--- a/package/kernel/mac80211/patches/847-b43-always-take-overlapping-devs.patch
+++ b/package/kernel/mac80211/patches/847-b43-always-take-overlapping-devs.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -118,7 +118,7 @@ static int b43_modparam_pio = 0;
+--- a/drivers/net/wireless/broadcom/b43/main.c
++++ b/drivers/net/wireless/broadcom/b43/main.c
+@@ -117,7 +117,7 @@ static int b43_modparam_pio = 0;
  module_param_named(pio, b43_modparam_pio, int, 0644);
  MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
  
diff --git a/package/kernel/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch b/package/kernel/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch
index 185c4279e9bd8b21192ce35fca8591993b05dfc8..3c93386b304b1dc5b2b4979527a317eb726e2d47 100644
--- a/package/kernel/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch
+++ b/package/kernel/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
 @@ -58,19 +58,12 @@
  				 (((c) < 149) ? 3 : 4))))
  
diff --git a/package/kernel/mac80211/patches/860-brcmfmac-use-bcm47xx-platform-NVRAM-as-fallback.patch b/package/kernel/mac80211/patches/860-brcmfmac-use-bcm47xx-platform-NVRAM-as-fallback.patch
deleted file mode 100644
index 44bb779fd145eee63d717634326adcc1b578344c..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/860-brcmfmac-use-bcm47xx-platform-NVRAM-as-fallback.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Mon, 8 Jun 2015 16:59:31 +0200
-Subject: [PATCH] brcmfmac: use bcm47xx platform NVRAM as fallback
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
-
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -19,6 +19,9 @@
- #include <linux/device.h>
- #include <linux/firmware.h>
- #include <linux/module.h>
-+#if IS_ENABLED(CONFIG_BCM47XX_NVRAM)
-+#include <linux/bcm47xx_nvram.h>
-+#endif
- 
- #include "debug.h"
- #include "firmware.h"
-@@ -424,17 +427,42 @@ struct brcmf_fw {
- static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
- {
- 	struct brcmf_fw *fwctx = ctx;
-+#if IS_ENABLED(CONFIG_BCM47XX_NVRAM)
-+	const u8 *bcm47xx_nvram = NULL;
-+	size_t bcm47xx_nvram_len;
-+#endif
-+	const u8 *data = NULL;
-+	size_t data_len;
- 	u32 nvram_length = 0;
- 	void *nvram = NULL;
- 
- 	brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev));
--	if (!fw && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
-+	if (fw) {
-+		data = fw->data;
-+		data_len = fw->size;
-+	}
-+#if IS_ENABLED(CONFIG_BCM47XX_NVRAM)
-+	else {
-+		bcm47xx_nvram = bcm47xx_nvram_get_contents(&bcm47xx_nvram_len);
-+		if (bcm47xx_nvram) {
-+			data = bcm47xx_nvram;
-+			data_len = bcm47xx_nvram_len;
-+			brcmf_err("Found platform NVRAM (%zu B)\n", data_len);
-+		}
-+	}
-+#endif
-+	if (!data && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
- 		goto fail;
- 
--	if (fw) {
--		nvram = brcmf_fw_nvram_strip(fw->data, fw->size, &nvram_length,
-+	if (data) {
-+		nvram = brcmf_fw_nvram_strip(data, data_len, &nvram_length,
- 					     fwctx->domain_nr, fwctx->bus_nr);
--		release_firmware(fw);
-+		if (fw)
-+			release_firmware(fw);
-+#if IS_ENABLED(CONFIG_BCM47XX_NVRAM)
-+		if (bcm47xx_nvram)
-+			bcm47xx_nvram_release_contents(bcm47xx_nvram);
-+#endif
- 		if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
- 			goto fail;
- 	}
---- a/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.h
-@@ -19,6 +19,8 @@
- 
- #include <linux/net.h>	/* net_ratelimit() */
- 
-+#include <linux/net.h>
-+
- /* message levels */
- #define BRCMF_TRACE_VAL		0x00000002
- #define BRCMF_INFO_VAL		0x00000004
diff --git a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch
index 14f8a001aff74666e068eb98178774f35e3c5f57..00181f647ba5c526d36276f6db6e9cf979ff4832 100644
--- a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch
+++ b/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch
@@ -11,9 +11,9 @@ module loads successfully.
 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 ---
 
---- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
-@@ -1226,6 +1226,7 @@ static int __init brcmfmac_module_init(v
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -1332,6 +1332,7 @@ static int __init brcmfmac_module_init(v
  #endif
  	if (!schedule_work(&brcmf_driver_work))
  		return -EBUSY;
@@ -21,9 +21,9 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  	return 0;
  }
---- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
-@@ -422,13 +422,14 @@ struct brcmf_fw {
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
+@@ -444,6 +444,7 @@ struct brcmf_fw {
  	u16 bus_nr;
  	void (*done)(struct device *dev, const struct firmware *fw,
  		     void *nvram_image, u32 nvram_len);
@@ -31,16 +31,8 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  };
  
  static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
- {
- 	struct brcmf_fw *fwctx = ctx;
- #if IS_ENABLED(CONFIG_BCM47XX_NVRAM)
--	const u8 *bcm47xx_nvram = NULL;
-+	u8 *bcm47xx_nvram = NULL;
- 	size_t bcm47xx_nvram_len;
- #endif
- 	const u8 *data = NULL;
-@@ -468,6 +469,8 @@ static void brcmf_fw_request_nvram_done(
- 	}
+@@ -478,6 +479,8 @@ static void brcmf_fw_request_nvram_done(
+ 		goto fail;
  
  	fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length);
 +	if (fwctx->completion)
@@ -48,7 +40,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	kfree(fwctx);
  	return;
  
-@@ -475,6 +478,8 @@ fail:
+@@ -485,6 +488,8 @@ fail:
  	brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
  	release_firmware(fwctx->code);
  	device_release_driver(fwctx->dev);
@@ -57,7 +49,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	kfree(fwctx);
  }
  
-@@ -490,6 +495,8 @@ static void brcmf_fw_request_code_done(c
+@@ -500,6 +505,8 @@ static void brcmf_fw_request_code_done(c
  	/* only requested code so done here */
  	if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) {
  		fwctx->done(fwctx->dev, fw, NULL, 0);
@@ -66,16 +58,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  		kfree(fwctx);
  		return;
  	}
-@@ -504,6 +511,8 @@ static void brcmf_fw_request_code_done(c
- 	/* when nvram is optional call .done() callback here */
- 	if (fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL) {
- 		fwctx->done(fwctx->dev, fw, NULL, 0);
-+		if (fwctx->completion)
-+			complete(fwctx->completion);
- 		kfree(fwctx);
- 		return;
- 	}
-@@ -513,6 +522,8 @@ static void brcmf_fw_request_code_done(c
+@@ -517,6 +524,8 @@ static void brcmf_fw_request_code_done(c
  fail:
  	brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
  	device_release_driver(fwctx->dev);
@@ -84,7 +67,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	kfree(fwctx);
  }
  
-@@ -524,6 +535,8 @@ int brcmf_fw_get_firmwares_pcie(struct d
+@@ -528,6 +537,8 @@ int brcmf_fw_get_firmwares_pcie(struct d
  				u16 domain_nr, u16 bus_nr)
  {
  	struct brcmf_fw *fwctx;
@@ -93,7 +76,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  	brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
  	if (!fw_cb || !code)
-@@ -544,9 +557,17 @@ int brcmf_fw_get_firmwares_pcie(struct d
+@@ -548,9 +559,17 @@ int brcmf_fw_get_firmwares_pcie(struct d
  	fwctx->domain_nr = domain_nr;
  	fwctx->bus_nr = bus_nr;
  
diff --git a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
index 32c4a6f9e7b9eebed9e00dee2acefbc90d5def9d..4295b4bd339374216416e305dfac2e9cd8ddd4b2 100644
--- a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
+++ b/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
@@ -8,9 +8,9 @@ Content-Transfer-Encoding: 8bit
 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 ---
 
---- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
-@@ -608,9 +608,37 @@ static struct wireless_dev *brcmf_cfg802
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -615,9 +615,37 @@ static struct wireless_dev *brcmf_cfg802
  						     u32 *flags,
  						     struct vif_params *params)
  {
diff --git a/package/kernel/mac80211/patches/900-wlcore-Add-support-for-DT-platform-data.patch b/package/kernel/mac80211/patches/900-wlcore-Add-support-for-DT-platform-data.patch
deleted file mode 100644
index 856dea8de4f54147598db56182bb238e81769e4d..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/900-wlcore-Add-support-for-DT-platform-data.patch
+++ /dev/null
@@ -1,139 +0,0 @@
-When running with DT, we no longer have a board file that can set up the
-platform data for wlcore. Allow this data to be passed from DT.
-
-Since some platforms use a gpio-irq, add support for passing either the
-irq number or the gpio number. For the latter case, the driver will
-request the gpio and convert it to the irq number. If an irq is
-specified, it'll be used as is.
-
-[Arik - the pdev_data pointer does not belong to us and is freed when
-the device is released. Dereference to our private data first.]
-
-Signed-off-by: Ido Yariv <ido@wizery.com>
-Signed-off-by: Arik Nemtsov <arik@wizery.com>
----
- drivers/net/wireless/ti/wlcore/sdio.c | 71 ++++++++++++++++++++++++++++++++---
- include/linux/wl12xx.h                |  3 +-
- 2 files changed, 67 insertions(+), 7 deletions(-)
-
---- a/drivers/net/wireless/ti/wlcore/sdio.c
-+++ b/drivers/net/wireless/ti/wlcore/sdio.c
-@@ -34,6 +34,7 @@
- #include <linux/wl12xx.h>
- #include <linux/pm_runtime.h>
- #include <linux/printk.h>
-+#include <linux/of.h>
- 
- #include "wlcore.h"
- #include "wl12xx_80211.h"
-@@ -214,6 +215,61 @@ static struct wl1271_if_operations sdio_
- 	.set_block_size = wl1271_sdio_set_block_size,
- };
- 
-+static const struct of_device_id wlcore_of_match[] = {
-+	{
-+		.compatible = "wlcore",
-+	},
-+	{}
-+};
-+MODULE_DEVICE_TABLE(of, wlcore_of_match);
-+
-+static struct wl12xx_platform_data *get_platform_data(struct device *dev)
-+{
-+	struct wl12xx_platform_data *pdata;
-+	struct device_node *np;
-+	u32 gpio;
-+
-+	pdata = wl12xx_get_platform_data();
-+	if (!IS_ERR(pdata))
-+		return kmemdup(pdata, sizeof(*pdata), GFP_KERNEL);
-+
-+	np = of_find_matching_node(NULL, wlcore_of_match);
-+	if (!np) {
-+		dev_err(dev, "No platform data set\n");
-+		return NULL;
-+	}
-+
-+	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
-+	if (!pdata) {
-+		dev_err(dev, "Can't allocate platform data\n");
-+		return NULL;
-+	}
-+
-+	if (of_property_read_u32(np, "irq", &pdata->irq)) {
-+		if (!of_property_read_u32(np, "gpio", &gpio) &&
-+		    !gpio_request_one(gpio, GPIOF_IN, "wlcore_irq")) {
-+			pdata->gpio = gpio;
-+			pdata->irq = gpio_to_irq(gpio);
-+		}
-+	}
-+
-+	/* Optional fields */
-+	pdata->use_eeprom = of_property_read_bool(np, "use-eeprom");
-+	of_property_read_u32(np, "board-ref-clock", &pdata->board_ref_clock);
-+	of_property_read_u32(np, "board-tcxo-clock", &pdata->board_tcxo_clock);
-+	of_property_read_u32(np, "platform-quirks", &pdata->platform_quirks);
-+
-+	return pdata;
-+}
-+
-+static void del_platform_data(struct wl12xx_platform_data *pdata)
-+{
-+	if (pdata->gpio)
-+		gpio_free(pdata->gpio);
-+
-+	kfree(pdata);
-+}
-+
- static int wl1271_probe(struct sdio_func *func,
- 				  const struct sdio_device_id *id)
- {
-@@ -245,10 +301,10 @@ static int wl1271_probe(struct sdio_func
- 	/* Use block mode for transferring over one block size of data */
- 	func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
- 
--	pdev_data.pdata = wl12xx_get_platform_data();
--	if (IS_ERR(pdev_data.pdata)) {
--		ret = PTR_ERR(pdev_data.pdata);
--		dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
-+	pdev_data.pdata = get_platform_data(&func->dev);
-+	if (!pdev_data.pdata) {
-+		ret = -EINVAL;
-+		dev_err(glue->dev, "missing wlan platform data\n");
- 		goto out_free_glue;
- 	}
- 
-@@ -279,7 +335,7 @@ static int wl1271_probe(struct sdio_func
- 	if (!glue->core) {
- 		dev_err(glue->dev, "can't allocate platform_device");
- 		ret = -ENOMEM;
--		goto out_free_glue;
-+		goto out_free_pdata;
- 	}
- 
- 	glue->core->dev.parent = &func->dev;
-@@ -313,6 +369,9 @@ static int wl1271_probe(struct sdio_func
- out_dev_put:
- 	platform_device_put(glue->core);
- 
-+out_free_pdata:
-+	del_platform_data(pdev_data->pdata);
-+
- out_free_glue:
- 	kfree(glue);
- 
-@@ -323,11 +382,14 @@ out:
- static void wl1271_remove(struct sdio_func *func)
- {
- 	struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
-+	struct wlcore_platdev_data *pdev_data = glue->core->dev.platform_data;
-+	struct wl12xx_platform_data *pdata = pdev_data->pdata;
- 
- 	/* Undo decrement done above in wl1271_probe */
- 	pm_runtime_get_noresume(&func->dev);
- 
- 	platform_device_unregister(glue->core);
-+	del_platform_data(pdata);
- 	kfree(glue);
- }
- 
diff --git a/package/kernel/mac80211/patches/910-00-rt2x00-enable-rt2800soc-for-mt7620.patch b/package/kernel/mac80211/patches/910-00-rt2x00-enable-rt2800soc-for-mt7620.patch
index e6b2d7be0dc892b5c008cd7161b601982a88421c..bc9f7995201c0cbf43403904550b05fde800375d 100644
--- a/package/kernel/mac80211/patches/910-00-rt2x00-enable-rt2800soc-for-mt7620.patch
+++ b/package/kernel/mac80211/patches/910-00-rt2x00-enable-rt2800soc-for-mt7620.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
+--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
++++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
 @@ -211,7 +211,7 @@ endif
  config RT2800SOC
  	tristate "Ralink WiSoC support"
diff --git a/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch b/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch
index 501910fe822691bb1af16dab704c6c9824fa66d4..f2e21ea49feafaf060846d95746ea6132819536f 100644
--- a/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch
+++ b/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch
@@ -1,5 +1,5 @@
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
 @@ -81,6 +81,7 @@
  #define RF5372				0x5372
  #define RF5390				0x5390
@@ -62,8 +62,8 @@
  /* TX_PWR_CFG_7 */
  #define TX_PWR_CFG_7			0x13d4
  #define TX_PWR_CFG_7_OFDM54_CH0		FIELD32(0x0000000f)
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 @@ -61,6 +61,8 @@
  	rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg))
  #define WAIT_FOR_RFCSR(__dev, __reg) \
@@ -91,7 +91,8 @@
 +			rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM_MT7620, word);
 +			rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE_MT7620, 1);
 +			rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY_MT7620, 1);
-+
+ 
+-		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
 +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
 +		}
 +		break;
@@ -103,8 +104,7 @@
 +			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;
@@ -210,7 +210,7 @@
  	case RT5592:
  		*txwi_size = TXWI_DESC_SIZE_5WORDS;
  		*rxwi_size = RXWI_DESC_SIZE_6WORDS;
-@@ -3326,6 +3399,312 @@ static void rt2800_config_channel_rf55xx
+@@ -3303,6 +3376,312 @@ static void rt2800_config_channel_rf55xx
  	rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F);
  }
  
@@ -258,6 +258,7 @@
 +	u32 mac_sys_ctrl, mac_status;
 +	u32 tx_pin = 0x00150F0F;
 +	struct hw_mode_spec *spec = &rt2x00dev->spec;
++	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
 +
 +	/* Frequeny plan setting */
 +	/*	
@@ -383,7 +384,6 @@
 +		rfcsr &= (~0x4);
 +	rt2800_rfcsr_write(rt2x00dev, 28, rfcsr);
 +
-+	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
 +	/*if (bScan == FALSE)*/
 +	if (conf_is_ht40(conf)) {
 +		txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw40,
@@ -523,7 +523,7 @@
  static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
  					   const unsigned int word,
  					   const u8 value)
-@@ -3482,7 +3861,7 @@ static void rt2800_config_channel(struct
+@@ -3459,7 +3838,7 @@ static void rt2800_config_channel(struct
  				  struct channel_info *info)
  {
  	u32 reg;
@@ -532,7 +532,7 @@
  	u8 bbp, rfcsr;
  
  	info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
-@@ -3536,6 +3915,9 @@ static void rt2800_config_channel(struct
+@@ -3513,6 +3892,9 @@ static void rt2800_config_channel(struct
  	case RF5592:
  		rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info);
  		break;
@@ -542,7 +542,7 @@
  	default:
  		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
  	}
-@@ -3638,7 +4020,7 @@ static void rt2800_config_channel(struct
+@@ -3615,7 +3997,7 @@ static void rt2800_config_channel(struct
  		else if (rt2x00_rt(rt2x00dev, RT3593) ||
  			 rt2x00_rt(rt2x00dev, RT3883))
  			rt2800_bbp_write(rt2x00dev, 82, 0x82);
@@ -551,7 +551,7 @@
  			rt2800_bbp_write(rt2x00dev, 82, 0xf2);
  
  		if (rt2x00_rt(rt2x00dev, RT3593) ||
-@@ -3660,7 +4042,7 @@ static void rt2800_config_channel(struct
+@@ -3637,7 +4019,7 @@ static void rt2800_config_channel(struct
  	if (rt2x00_rt(rt2x00dev, RT3572))
  		rt2800_rfcsr_write(rt2x00dev, 8, 0);
  
@@ -560,7 +560,7 @@
  
  	switch (rt2x00dev->default_ant.tx_chain_num) {
  	case 3:
-@@ -3709,6 +4091,7 @@ static void rt2800_config_channel(struct
+@@ -3686,6 +4068,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);
@@ -568,7 +568,7 @@
  
  	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
  
-@@ -4725,6 +5108,14 @@ void rt2800_vco_calibration(struct rt2x0
+@@ -4702,6 +5085,14 @@ void rt2800_vco_calibration(struct rt2x0
  		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
  		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
  		break;
@@ -583,7 +583,7 @@
  	default:
  		return;
  	}
-@@ -5125,9 +5516,42 @@ static int rt2800_init_registers(struct
+@@ -5102,9 +5493,42 @@ static int rt2800_init_registers(struct
  	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
  		   rt2x00_rt(rt2x00dev, RT5392) ||
  		   rt2x00_rt(rt2x00dev, RT5592)) {
@@ -629,7 +629,7 @@
  	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
  	} else {
-@@ -6159,6 +6583,225 @@ static void rt2800_init_bbp_5592(struct
+@@ -6136,6 +6560,225 @@ static void rt2800_init_bbp_5592(struct
  		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
  }
  
@@ -855,7 +855,7 @@
  static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
  {
  	unsigned int i;
-@@ -6201,7 +6844,10 @@ static void rt2800_init_bbp(struct rt2x0
+@@ -6178,7 +6821,10 @@ static void rt2800_init_bbp(struct rt2x0
  		return;
  	case RT5390:
  	case RT5392:
@@ -867,7 +867,7 @@
  		break;
  	case RT5592:
  		rt2800_init_bbp_5592(rt2x00dev);
-@@ -7415,6 +8061,295 @@ static void rt2800_init_rfcsr_5592(struc
+@@ -7392,6 +8038,296 @@ static void rt2800_init_rfcsr_5592(struc
  	rt2800_led_open_drain_enable(rt2x00dev);
  }
  
@@ -875,6 +875,8 @@
 +{
 +	u16 freq;
 +	u8 rfvalue;
++	struct hw_mode_spec *spec = &rt2x00dev->spec;
++
 +	/* Initialize RF central register to default value */
 +	rt2800_rfcsr_write(rt2x00dev, 0, 0x02);
 +	rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
@@ -921,7 +923,6 @@
 +	rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
 +	rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
 +
-+	struct hw_mode_spec *spec = &rt2x00dev->spec;
 +	rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
 +	if (spec->clk_is_20mhz)
 +		rt2800_rfcsr_write(rt2x00dev, 13, 0x03);
@@ -1163,7 +1164,7 @@
  static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
  {
  	if (rt2800_is_305x_soc(rt2x00dev)) {
-@@ -7450,7 +8385,10 @@ static void rt2800_init_rfcsr(struct rt2
+@@ -7427,7 +8363,10 @@ static void rt2800_init_rfcsr(struct rt2
  		rt2800_init_rfcsr_5350(rt2x00dev);
  		break;
  	case RT5390:
@@ -1175,7 +1176,7 @@
  		break;
  	case RT5392:
  		rt2800_init_rfcsr_5392(rt2x00dev);
-@@ -7882,6 +8820,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7859,6 +8798,7 @@ static int rt2800_init_eeprom(struct rt2
  	case RF5390:
  	case RF5392:
  	case RF5592:
@@ -1183,7 +1184,7 @@
  		break;
  	default:
  		rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n",
-@@ -8448,6 +9387,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -8423,6 +9363,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF5372:
  	case RF5390:
  	case RF5392:
@@ -1191,7 +1192,7 @@
  		spec->num_channels = 14;
  		if (spec->clk_is_20mhz)
  			spec->channels = rf_vals_xtal20mhz_3x;
-@@ -8588,6 +9528,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -8563,6 +9504,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF5372:
  	case RF5390:
  	case RF5392:
diff --git a/package/kernel/mac80211/patches/920-ath10k_allow_fallback_to_board_bin_on_empty_otp_stream.patch b/package/kernel/mac80211/patches/920-ath10k_allow_fallback_to_board_bin_on_empty_otp_stream.patch
deleted file mode 100644
index 4c04d4f0ac5d6be405830c3b4a8adbf73d91d672..0000000000000000000000000000000000000000
--- a/package/kernel/mac80211/patches/920-ath10k_allow_fallback_to_board_bin_on_empty_otp_stream.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/drivers/net/wireless/ath/ath10k/core.c
-+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -387,9 +387,14 @@ static int ath10k_download_and_run_otp(s
- 
- 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot otp execute result %d\n", result);
- 
--	if (!skip_otp && result != 0) {
--		ath10k_err(ar, "otp calibration failed: %d", result);
--		return -EINVAL;
-+	if (!skip_otp) {
-+		if (result == 2) {
-+			ath10k_warn(ar, "otp stream is empty, using board.bin contents");
-+			return 0;
-+		} else if (result != 0) {
-+			ath10k_err(ar, "otp calibration failed: %d", result);
-+			return -EINVAL;
-+		}
- 	}
- 
- 	return 0;
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 eed3814eebfd49c79e5c89bb3c4bda4309a8c6a1..8c6d720a73cf73e007eeede2829ec9019d5a2d40 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
-@@ -1323,6 +1323,16 @@ int ath10k_core_register(struct ath10k *
+@@ -1914,6 +1914,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/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch
index 8003f86468183ea2bb48c7b73f7d7a91abb463e4..281b4475ada3f4388292d930a9fd252b234ec0c5 100644
--- a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch
+++ b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath10k/mac.c
 +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -5416,6 +5416,21 @@ struct ath10k_vif *ath10k_get_arvif(stru
+@@ -7141,6 +7141,21 @@ struct ath10k_vif *ath10k_get_arvif(stru
  	return arvif_iter.arvif;
  }
  
@@ -22,7 +22,7 @@
  int ath10k_mac_register(struct ath10k *ar)
  {
  	static const u32 cipher_suites[] = {
-@@ -5590,6 +5605,12 @@ int ath10k_mac_register(struct ath10k *a
+@@ -7357,6 +7372,12 @@ int ath10k_mac_register(struct ath10k *a
  	ar->hw->wiphy->cipher_suites = cipher_suites;
  	ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
  
diff --git a/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch
new file mode 100644
index 0000000000000000000000000000000000000000..357faee4bfa2186d3e6fb44e8a468190bd283640
--- /dev/null
+++ b/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch
@@ -0,0 +1,20 @@
+--- a/drivers/net/wireless/marvell/mwl8k.c
++++ b/drivers/net/wireless/marvell/mwl8k.c
+@@ -6264,6 +6264,8 @@ static int mwl8k_probe(struct pci_dev *p
+ 
+ 	priv->running_bsses = 0;
+ 
++	wait_for_completion(&priv->firmware_loading_complete);
++
+ 	return rc;
+ 
+ err_stop_firmware:
+@@ -6297,8 +6299,6 @@ static void mwl8k_remove(struct pci_dev
+ 		return;
+ 	priv = hw->priv;
+ 
+-	wait_for_completion(&priv->firmware_loading_complete);
+-
+ 	if (priv->fw_state == FW_STATE_ERROR) {
+ 		mwl8k_hw_reset(priv);
+ 		goto unmap;
diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile
index 5ede95a44ec6f49783d84946d09d3ee40d6744ca..e49dd486d2c952f3bc985a02bb131fdc7a03ce4a 100644
--- a/package/kernel/mt76/Makefile
+++ b/package/kernel/mt76/Makefile
@@ -1,7 +1,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mt76
-PKG_VERSION:=2015-10-12
+PKG_VERSION:=2016-03-03
 PKG_RELEASE=1
 
 PKG_LICENSE:=GPLv2
@@ -10,7 +10,7 @@ PKG_LICENSE_FILES:=
 PKG_SOURCE_URL:=https://github.com/openwrt/mt76
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
-PKG_SOURCE_VERSION:=2f31d1e329dc43074a05782624195860c45b099a
+PKG_SOURCE_VERSION:=310d420178c86e253a172413da30ecf479b64251
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
 
 PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
@@ -23,8 +23,10 @@ define KernelPackage/mt76
   SUBMENU:=Wireless Drivers
   TITLE:=MediaTek MT76x2 wireless driver
   DEPENDS:=+kmod-mac80211 +@DRIVER_11N_SUPPORT @PCI_SUPPORT
-  FILES:=$(PKG_BUILD_DIR)/mt76pci.ko
-  AUTOLOAD:=$(call AutoLoad,50,mac80211 mt76pci)
+  FILES:=\
+	$(PKG_BUILD_DIR)/mt76.ko \
+	$(PKG_BUILD_DIR)/mt76x2e.ko
+  AUTOLOAD:=$(call AutoLoad,50,mac80211 mt76 mt76x2e)
 endef
 
 NOSTDINC_FLAGS = \
diff --git a/package/kernel/mt76/patches/001-backport_ieee80211_hw_set.patch b/package/kernel/mt76/patches/001-backport_ieee80211_hw_set.patch
deleted file mode 100644
index e94574dc43633a21e617a770fa5d9fbfe6cc93a8..0000000000000000000000000000000000000000
--- a/package/kernel/mt76/patches/001-backport_ieee80211_hw_set.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/init.c
-+++ b/init.c
-@@ -16,6 +16,9 @@
- #include "eeprom.h"
- #include "mcu.h"
- 
-+#define ieee80211_hw_set(hw, flag) \
-+	do { (hw)->flags |= IEEE80211_HW_##flag; } while(0)
-+
- static bool
- mt76_wait_for_mac(struct mt76_dev *dev)
- {
diff --git a/package/kernel/mt76/patches/002-disable_fast_xmit.patch b/package/kernel/mt76/patches/002-disable_fast_xmit.patch
deleted file mode 100644
index f7a011b2e133cc4d3357fd038d6f503ac0de5836..0000000000000000000000000000000000000000
--- a/package/kernel/mt76/patches/002-disable_fast_xmit.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/init.c
-+++ b/init.c
-@@ -816,7 +816,6 @@ int mt76_register_device(struct mt76_dev
- 	ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
- 	ieee80211_hw_set(hw, AMPDU_AGGREGATION);
- 	ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
--	ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
- 
- 	hw->sta_data_size = sizeof(struct mt76_sta);
- 	hw->vif_data_size = sizeof(struct mt76_vif);
diff --git a/package/kernel/mwlwifi/patches/100-drop_old_api.patch b/package/kernel/mwlwifi/patches/100-drop_old_api.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d2e149e9a21118ee788603f1a8071e2df7ed7a99
--- /dev/null
+++ b/package/kernel/mwlwifi/patches/100-drop_old_api.patch
@@ -0,0 +1,92 @@
+--- a/main.c
++++ b/main.c
+@@ -418,11 +418,7 @@ static void mwl_set_ht_caps(struct mwl_p
+ 	band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
+ 	band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
+ 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
+-	hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
+-#else
+ 	ieee80211_hw_set(hw, AMPDU_AGGREGATION);
+-#endif
+ 	band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
+ 	band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_4;
+ 
+@@ -524,29 +520,16 @@ static int mwl_wl_init(struct mwl_priv *
+ 	hw->queues = SYSADPT_TX_WMM_QUEUES;
+ 
+ 	/* Set rssi values to dBm */
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
+-	hw->flags |= IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HAS_RATE_CONTROL;
+-#else
+ 	ieee80211_hw_set(hw, SIGNAL_DBM);
+ 	ieee80211_hw_set(hw, HAS_RATE_CONTROL);
+-#endif
+ 
+ 	/* Ask mac80211 not to trigger PS mode
+ 	 * based on PM bit of incoming frames.
+ 	 */
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
+-	hw->flags |= IEEE80211_HW_AP_LINK_PS;
+-#else
+ 	ieee80211_hw_set(hw, AP_LINK_PS);
+-#endif
+ 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
+-	hw->flags |= IEEE80211_HW_SUPPORTS_PER_STA_GTK |
+-		     IEEE80211_HW_MFP_CAPABLE;
+-#else
+ 	ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
+ 	ieee80211_hw_set(hw, MFP_CAPABLE);
+-#endif
+ 
+ 	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
+ 
+--- a/dev.h
++++ b/dev.h
+@@ -484,10 +484,6 @@ static inline struct mwl_sta *mwl_dev_ge
+ 	return (struct mwl_sta *)&sta->drv_priv;
+ }
+ 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
+-#define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN)
+-#endif
+-
+ /* Defined in mac80211.c. */
+ extern const struct ieee80211_ops mwl_mac80211_ops;
+ 
+--- a/mac80211.c
++++ b/mac80211.c
+@@ -572,19 +572,11 @@ static int mwl_mac80211_get_survey(struc
+ 	return 0;
+ }
+ 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
+-static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw,
+-				     struct ieee80211_vif *vif,
+-				     enum ieee80211_ampdu_mlme_action action,
+-				     struct ieee80211_sta *sta,
+-				     u16 tid, u16 *ssn, u8 buf_size)
+-#else
+ static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw,
+ 				     struct ieee80211_vif *vif,
+ 				     enum ieee80211_ampdu_mlme_action action,
+ 				     struct ieee80211_sta *sta,
+ 				     u16 tid, u16 *ssn, u8 buf_size, bool amsdu)
+-#endif
+ {
+ 	int rc = 0;
+ 	struct mwl_priv *priv = hw->priv;
+--- a/rx.c
++++ b/rx.c
+@@ -232,10 +232,8 @@ static inline void mwl_rx_prepare_status
+ 		status->flag |= RX_FLAG_VHT;
+ 		if (bw == RX_RATE_INFO_HT40)
+ 			status->flag |= RX_FLAG_40MHZ;
+-#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 18, 0)
+ 		if (bw == RX_RATE_INFO_HT80)
+ 			status->vht_flag |= RX_VHT_FLAG_80MHZ;
+-#endif
+ 		if (gi == RX_RATE_INFO_SHORT_INTERVAL)
+ 			status->flag |= RX_FLAG_SHORT_GI;
+ 		status->vht_nss = (nss + 1);
diff --git a/package/kernel/mwlwifi/patches/110-api_sync.patch b/package/kernel/mwlwifi/patches/110-api_sync.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ed3e06a1c1d4b24c4365ac83cb614134be120e3b
--- /dev/null
+++ b/package/kernel/mwlwifi/patches/110-api_sync.patch
@@ -0,0 +1,19 @@
+--- a/mac80211.c
++++ b/mac80211.c
+@@ -597,10 +597,13 @@ static int mwl_mac80211_get_survey(struc
+ 
+ static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw,
+ 				     struct ieee80211_vif *vif,
+-				     enum ieee80211_ampdu_mlme_action action,
+-				     struct ieee80211_sta *sta,
+-				     u16 tid, u16 *ssn, u8 buf_size, bool amsdu)
++				     struct ieee80211_ampdu_params *params)
+ {
++	enum ieee80211_ampdu_mlme_action action = params->action;
++	struct ieee80211_sta *sta = params->sta;
++	u16 tid = params->tid;
++	u16 *ssn = &params->ssn;
++	u8 buf_size = params->buf_size;
+ 	int rc = 0;
+ 	struct mwl_priv *priv = hw->priv;
+ 	struct mwl_ampdu_stream *stream;
diff --git a/package/libs/cyassl/Makefile b/package/libs/cyassl/Makefile
index c3361eb64f571d4de3b16e933ff7683e9c2d3e6c..7384a3d1db5c02f43f847235d2b581fd3d97baa9 100644
--- a/package/libs/cyassl/Makefile
+++ b/package/libs/cyassl/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2014 OpenWrt.org
+# Copyright (C) 2006-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -7,13 +7,13 @@
 
 include $(TOPDIR)/rules.mk
 
-PKG_NAME:=cyassl
-PKG_VERSION:=3.3.0
+PKG_NAME:=wolfssl
+PKG_VERSION:=3.8.0
 PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
-PKG_SOURCE_URL:=http://www.yassl.com/
-PKG_MD5SUM:=0303eb0f2f9065a1207d9104ab0eba7c
+PKG_SOURCE_URL:=https://www.wolfssl.com/
+PKG_MD5SUM:=a73d90c5439adea97a5002a73b46ddeb
 
 PKG_FIXUP:=libtool
 PKG_INSTALL:=1
@@ -27,7 +27,7 @@ define Package/libcyassl
   SUBMENU:=SSL
   CATEGORY:=Libraries
   TITLE:=CyaSSL library
-  URL:=http://www.yassl.com/
+  URL:=http://www.wolfssl.com/
 endef
 
 define Package/libcyassl/description
@@ -43,19 +43,30 @@ CONFIGURE_ARGS += \
 	--enable-opensslextra \
 	--enable-sni \
 	--enable-ecc \
+	--enable-sslv3 \
 	--disable-examples
 
+#ifneq ($(CONFIG_TARGET_x86),)
+#	CONFIGURE_ARGS += --enable-intelasm
+#endif
+#ifneq ($(CONFIG_TARGET_x86_64),)
+#	CONFIGURE_ARGS += --enable-intelasm
+#endif
+
 define Build/InstallDev
 	$(INSTALL_DIR) $(1)/usr/include
 	$(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
 
 	$(INSTALL_DIR) $(1)/usr/lib
-	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libcyassl.{so*,la} $(1)/usr/lib/
+	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libwolfssl.{so*,la} $(1)/usr/lib/
+	ln -s libwolfssl.so $(1)/usr/lib/libcyassl.so
+	ln -s libwolfssl.la $(1)/usr/lib/libcyassl.la
 endef
 
 define Package/libcyassl/install
 	$(INSTALL_DIR) $(1)/usr/lib
-	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libcyassl.so* $(1)/usr/lib/
+	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libwolfssl.so* $(1)/usr/lib/
+	ln -s libwolfssl.so $(1)/usr/lib/libcyassl.so
 endef
 
 $(eval $(call BuildPackage,libcyassl))
diff --git a/package/libs/cyassl/patches/100-respect_cflags.patch b/package/libs/cyassl/patches/100-respect_cflags.patch
deleted file mode 100644
index 0e03230dcfb4be094093a9dd8171f9596e06a7ca..0000000000000000000000000000000000000000
--- a/package/libs/cyassl/patches/100-respect_cflags.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/configure.ac
-+++ b/configure.ac
-@@ -47,7 +47,7 @@ AC_SUBST([CYASSL_LIBRARY_VERSION])
- 
- # capture user C_EXTRA_FLAGS from ./configure line, CFLAGS may hold -g -O2 even
- # if user doesn't override, no way to tell
--USER_C_EXTRA_FLAGS="$C_EXTRA_FLAGS"
-+USER_C_EXTRA_FLAGS="$CFLAGS"
- 
- LT_PREREQ([2.2])
- LT_INIT([disable-static],[win32-dll])
diff --git a/package/libs/cyassl/patches/200-SSL_accept-handle-hello-garbage.patch b/package/libs/cyassl/patches/200-SSL_accept-handle-hello-garbage.patch
deleted file mode 100644
index 5463cb0cf9f4890ad791a0f73adbfc014ee27ede..0000000000000000000000000000000000000000
--- a/package/libs/cyassl/patches/200-SSL_accept-handle-hello-garbage.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/src/internal.c
-+++ b/src/internal.c
-@@ -6037,6 +6037,10 @@ int ProcessReply(CYASSL* ssl)
-                 b1 =
-                 ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
-                 ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
-+
-+                /* does not appear to a be a SSLv2 client hello */
-+                if ( ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx] != 1 )
-+                    return UNKNOWN_HANDSHAKE_TYPE;
-             }
-             else {
-                 ssl->options.processReply = getRecordLayerHeader;
diff --git a/package/libs/cyassl/patches/300-SSL_set_tlsext_host_name.patch b/package/libs/cyassl/patches/300-SSL_set_tlsext_host_name.patch
index d81e41618081d4855a18c776abd4f65a4fa5e55c..a35cdadc8ed0794158941e3a3e12330e5e1bb01b 100644
--- a/package/libs/cyassl/patches/300-SSL_set_tlsext_host_name.patch
+++ b/package/libs/cyassl/patches/300-SSL_set_tlsext_host_name.patch
@@ -1,10 +1,19 @@
---- a/cyassl/openssl/ssl.h
-+++ b/cyassl/openssl/ssl.h
-@@ -372,6 +373,7 @@
- #define SSL_CTX_get_ex_new_index CyaSSL_CTX_get_ex_new_index
+--- a/wolfssl/openssl/ssl.h
++++ b/wolfssl/openssl/ssl.h
+@@ -401,6 +401,8 @@ typedef WOLFSSL_X509_STORE_CTX X509_STOR
+ /* yassl had set the default to be 500 */
+ #define SSL_get_default_timeout(ctx) 500
  
++#define SSL_set_tlsext_host_name(x, y) wolfSSL_UseSNI(x, WOLFSSL_SNI_HOST_NAME, y, strlen(y))
++ 
+ /* Lighthttp compatability */
  
-+#define SSL_set_tlsext_host_name(x, y) CyaSSL_UseSNI(x, CYASSL_SNI_HOST_NAME, y, strlen(y))
+ #ifdef HAVE_LIGHTY                       
+@@ -487,7 +489,6 @@ typedef WOLFSSL_ASN1_BIT_STRING    ASN1_
+ #define SSL_TLSEXT_ERR_NOACK                 alert_warning
+ #define TLSEXT_NAMETYPE_host_name            WOLFSSL_SNI_HOST_NAME
  
- #ifdef __cplusplus
-     } /* extern "C" */
+-#define SSL_set_tlsext_host_name wolfSSL_set_tlsext_host_name
+ #define SSL_get_servername wolfSSL_get_servername
+ #define SSL_set_SSL_CTX                  wolfSSL_set_SSL_CTX
+ #define SSL_CTX_get_verify_callback      wolfSSL_CTX_get_verify_callback
diff --git a/package/libs/cyassl/patches/400-additional_compatibility.patch b/package/libs/cyassl/patches/400-additional_compatibility.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4d75d989066388a5bc7450b37c7a3d606e461bc5
--- /dev/null
+++ b/package/libs/cyassl/patches/400-additional_compatibility.patch
@@ -0,0 +1,12 @@
+--- a/cyassl/openssl/ssl.h
++++ b/cyassl/openssl/ssl.h
+@@ -27,6 +27,9 @@
+ #define CYASSL_OPENSSL_H_
+ 
+ #include <cyassl/ssl.h>
++#ifndef HAVE_SNI
++#undef CYASSL_SNI_HOST_NAME
++#endif
+ #include <wolfssl/openssl/ssl.h>
+ 
+ #endif
diff --git a/package/libs/openssl/Makefile b/package/libs/openssl/Makefile
index 6909f97e0d4f6448e1ce5c36bfc8646442b04aa1..0b965571e69f8c704ced68766c3ab5d1fc8cde9d 100644
--- a/package/libs/openssl/Makefile
+++ b/package/libs/openssl/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2015 OpenWrt.org
+# Copyright (C) 2006-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,7 +8,9 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=openssl
-PKG_VERSION:=1.0.2e
+PKG_BASE:=1.0.2
+PKG_BUGFIX:=g
+PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX)
 PKG_RELEASE:=1
 PKG_USE_MIPS16:=0
 
@@ -16,9 +18,10 @@ PKG_BUILD_PARALLEL:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.openssl.org/source/ \
+	http://www.openssl.org/source/old/$(PKG_BASE)/ \
 	ftp://ftp.funet.fi/pub/crypt/mirrors/ftp.openssl.org/source \
 	ftp://ftp.sunet.se/pub/security/tools/net/openssl/source/
-PKG_MD5SUM:=5262bfa25b60ed9de9f28d5d52d77fc5
+PKG_MD5SUM:=f3c710c045cdee5fd114feb69feba7aa
 
 PKG_LICENSE:=OpenSSL
 PKG_LICENSE_FILES:=LICENSE
diff --git a/package/libs/openssl/patches/110-optimize-for-size.patch b/package/libs/openssl/patches/110-optimize-for-size.patch
index 5070284e3d1fef5ee80fb642ec3ea0a630193d15..172184228e12a0c87ebdfc75967f00081e0dac34 100644
--- a/package/libs/openssl/patches/110-optimize-for-size.patch
+++ b/package/libs/openssl/patches/110-optimize-for-size.patch
@@ -1,6 +1,6 @@
 --- a/Configure
 +++ b/Configure
-@@ -461,6 +461,12 @@ my %table=(
+@@ -468,6 +468,12 @@ my %table=(
  "linux-alpha-ccc","ccc:-fast -readonly_strings -DL_ENDIAN::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}",
  "linux-alpha+bwx-ccc","ccc:-fast -readonly_strings -DL_ENDIAN::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}",
  
diff --git a/package/libs/openssl/patches/150-no_engines.patch b/package/libs/openssl/patches/150-no_engines.patch
index 8cccddb87e1eb7a86f969f94258523b5b6f44002..f509d28bd2cf9bb30117bcaf806ce4d82e50e7e9 100644
--- a/package/libs/openssl/patches/150-no_engines.patch
+++ b/package/libs/openssl/patches/150-no_engines.patch
@@ -1,6 +1,6 @@
 --- a/Configure
 +++ b/Configure
-@@ -2106,6 +2106,11 @@ EOF
+@@ -2109,6 +2109,11 @@ EOF
  	close(OUT);
    }
    
@@ -14,7 +14,7 @@
  Configured for $target.
 --- a/util/libeay.num
 +++ b/util/libeay.num
-@@ -2073,7 +2073,6 @@ PKCS7_ATTR_SIGN_it
+@@ -2075,7 +2075,6 @@ PKCS7_ATTR_SIGN_it
  UI_add_error_string                     2633	EXIST::FUNCTION:
  KRB5_CHECKSUM_free                      2634	EXIST::FUNCTION:
  OCSP_REQUEST_get_ext                    2635	EXIST::FUNCTION:
@@ -22,7 +22,7 @@
  ENGINE_register_all_digests             2637	EXIST::FUNCTION:ENGINE
  PKEY_USAGE_PERIOD_it                    2638	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
  PKEY_USAGE_PERIOD_it                    2638	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
-@@ -2547,7 +2546,6 @@ OCSP_RESPONSE_new
+@@ -2549,7 +2548,6 @@ OCSP_RESPONSE_new
  AES_set_encrypt_key                     3024	EXIST::FUNCTION:AES
  OCSP_resp_count                         3025	EXIST::FUNCTION:
  KRB5_CHECKSUM_new                       3026	EXIST::FUNCTION:
@@ -30,7 +30,7 @@
  OCSP_onereq_get0_id                     3028	EXIST::FUNCTION:
  ENGINE_set_default_ciphers              3029	EXIST::FUNCTION:ENGINE
  NOTICEREF_it                            3030	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
-@@ -2578,7 +2576,6 @@ ASN1_primitive_free
+@@ -2580,7 +2578,6 @@ ASN1_primitive_free
  i2d_EXTENDED_KEY_USAGE                  3052	EXIST::FUNCTION:
  i2d_OCSP_SIGNATURE                      3053	EXIST::FUNCTION:
  asn1_enc_save                           3054	EXIST::FUNCTION:
@@ -38,7 +38,7 @@
  _ossl_old_des_pcbc_encrypt              3056	EXIST::FUNCTION:DES
  PKCS12_MAC_DATA_it                      3057	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
  PKCS12_MAC_DATA_it                      3057	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
-@@ -2602,7 +2599,6 @@ asn1_get_choice_selector
+@@ -2604,7 +2601,6 @@ asn1_get_choice_selector
  i2d_KRB5_CHECKSUM                       3072	EXIST::FUNCTION:
  ENGINE_set_table_flags                  3073	EXIST::FUNCTION:ENGINE
  AES_options                             3074	EXIST::FUNCTION:AES
@@ -46,7 +46,7 @@
  OCSP_id_cmp                             3076	EXIST::FUNCTION:
  OCSP_BASICRESP_new                      3077	EXIST::FUNCTION:
  OCSP_REQUEST_get_ext_by_NID             3078	EXIST::FUNCTION:
-@@ -2669,7 +2665,6 @@ OCSP_CRLID_it
+@@ -2671,7 +2667,6 @@ OCSP_CRLID_it
  OCSP_CRLID_it                           3127	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
  i2d_KRB5_AUTHENTBODY                    3128	EXIST::FUNCTION:
  OCSP_REQUEST_get_ext_count              3129	EXIST::FUNCTION:
@@ -54,7 +54,7 @@
  X509_NAME_it                            3131	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
  X509_NAME_it                            3131	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
  USERNOTICE_it                           3132	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
-@@ -2764,8 +2759,6 @@ DES_read_2passwords
+@@ -2766,8 +2761,6 @@ DES_read_2passwords
  DES_read_password                       3207	EXIST::FUNCTION:DES
  UI_UTIL_read_pw                         3208	EXIST::FUNCTION:
  UI_UTIL_read_pw_string                  3209	EXIST::FUNCTION:
@@ -63,7 +63,7 @@
  OPENSSL_add_all_algorithms_noconf       3212	EXIST:!VMS:FUNCTION:
  OPENSSL_add_all_algo_noconf             3212	EXIST:VMS:FUNCTION:
  OPENSSL_add_all_algorithms_conf         3213	EXIST:!VMS:FUNCTION:
-@@ -2774,7 +2767,6 @@ OPENSSL_load_builtin_modules
+@@ -2776,7 +2769,6 @@ OPENSSL_load_builtin_modules
  AES_ofb128_encrypt                      3215	EXIST::FUNCTION:AES
  AES_ctr128_encrypt                      3216	EXIST::FUNCTION:AES
  AES_cfb128_encrypt                      3217	EXIST::FUNCTION:AES
@@ -71,7 +71,7 @@
  _ossl_096_des_random_seed               3219	EXIST::FUNCTION:DES
  EVP_aes_256_ofb                         3220	EXIST::FUNCTION:AES
  EVP_aes_192_ofb                         3221	EXIST::FUNCTION:AES
-@@ -3109,7 +3101,6 @@ EC_GFp_nist_method
+@@ -3111,7 +3103,6 @@ EC_GFp_nist_method
  STORE_meth_set_modify_fn                3530	NOEXIST::FUNCTION:
  STORE_method_set_modify_function        3530	NOEXIST::FUNCTION:
  STORE_parse_attrs_next                  3531	NOEXIST::FUNCTION:
diff --git a/package/libs/openssl/patches/160-disable_doc_tests.patch b/package/libs/openssl/patches/160-disable_doc_tests.patch
index 274e5d0bbb9c3859f16178dc2f6ae4279d4bf1c3..a3bee387214cacff0456827711289d5b23f77aed 100644
--- a/package/libs/openssl/patches/160-disable_doc_tests.patch
+++ b/package/libs/openssl/patches/160-disable_doc_tests.patch
@@ -27,7 +27,7 @@
  WDIRS=  windows
  LIBS=   libcrypto.a libssl.a
  SHARED_CRYPTO=libcrypto$(SHLIB_EXT)
-@@ -274,7 +274,7 @@ reflect:
+@@ -273,7 +273,7 @@ reflect:
  
  sub_all: build_all
  
@@ -36,9 +36,9 @@
  
  build_libs: build_libcrypto build_libssl openssl.pc
  
-@@ -534,7 +534,7 @@ dist:
- dist_pem_h:
- 	(cd crypto/pem; $(MAKE) -e $(BUILDENV) pem.h; $(MAKE) clean)
+@@ -530,7 +530,7 @@ dist:
+ 	@$(MAKE) SDIRS='$(SDIRS)' clean
+ 	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar
  
 -install: all install_docs install_sw
 +install: all install_sw
@@ -47,9 +47,9 @@
  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \
 --- a/Makefile.org
 +++ b/Makefile.org
-@@ -532,7 +532,7 @@ dist:
- dist_pem_h:
- 	(cd crypto/pem; $(MAKE) -e $(BUILDENV) pem.h; $(MAKE) clean)
+@@ -528,7 +528,7 @@ dist:
+ 	@$(MAKE) SDIRS='$(SDIRS)' clean
+ 	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar
  
 -install: all install_docs install_sw
 +install: all install_sw
diff --git a/package/libs/openssl/patches/190-remove_timestamp_check.patch b/package/libs/openssl/patches/190-remove_timestamp_check.patch
index c468bf5983b04587005d6f525b5ba391cda59d30..ffc2f2db2b402733c91fd1c93440bf6bde68a7be 100644
--- a/package/libs/openssl/patches/190-remove_timestamp_check.patch
+++ b/package/libs/openssl/patches/190-remove_timestamp_check.patch
@@ -1,6 +1,6 @@
 --- a/Makefile.org
 +++ b/Makefile.org
-@@ -185,7 +185,7 @@ WTARFILE=       $(NAME)-win.tar
+@@ -184,7 +184,7 @@ TARFILE=        ../$(NAME).tar
  EXHEADER=       e_os2.h
  HEADER=         e_os.h
  
@@ -9,7 +9,7 @@
  
  # as we stick to -e, CLEARENV ensures that local variables in lower
  # Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn
-@@ -401,11 +401,6 @@ openssl.pc: Makefile
+@@ -400,11 +400,6 @@ openssl.pc: Makefile
  	    echo 'Version: '$(VERSION); \
  	    echo 'Requires: libssl libcrypto' ) > openssl.pc
  
diff --git a/package/libs/openssl/patches/200-parallel_build.patch b/package/libs/openssl/patches/200-parallel_build.patch
index edb201a45806e16246e163edde04bc00422d6527..e3a0bb2b01813c039825360673b54cdde7a931d5 100644
--- a/package/libs/openssl/patches/200-parallel_build.patch
+++ b/package/libs/openssl/patches/200-parallel_build.patch
@@ -1,6 +1,6 @@
 --- a/Makefile.org
 +++ b/Makefile.org
-@@ -280,17 +280,17 @@ build_libcrypto: build_crypto build_engi
+@@ -279,17 +279,17 @@ build_libcrypto: build_crypto build_engi
  build_libssl: build_ssl libssl.pc
  
  build_crypto:
@@ -24,7 +24,7 @@
  
  all_testapps: build_libs build_testapps
  build_testapps:
-@@ -462,7 +462,7 @@ update: errors stacks util/libeay.num ut
+@@ -461,7 +461,7 @@ update: errors stacks util/libeay.num ut
  	@set -e; target=update; $(RECURSIVE_BUILD_CMD)
  
  depend:
@@ -33,9 +33,9 @@
  
  lint:
  	@set -e; target=lint; $(RECURSIVE_BUILD_CMD)
-@@ -527,9 +527,9 @@ dist:
- dist_pem_h:
- 	(cd crypto/pem; $(MAKE) -e $(BUILDENV) pem.h; $(MAKE) clean)
+@@ -523,9 +523,9 @@ dist:
+ 	@$(MAKE) SDIRS='$(SDIRS)' clean
+ 	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar
  
 -install: all install_sw
 +install: install_sw
@@ -45,7 +45,7 @@
  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \
  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \
  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \
-@@ -538,12 +538,19 @@ install_sw:
+@@ -534,12 +534,19 @@ install_sw:
  		$(INSTALL_PREFIX)$(OPENSSLDIR)/misc \
  		$(INSTALL_PREFIX)$(OPENSSLDIR)/certs \
  		$(INSTALL_PREFIX)$(OPENSSLDIR)/private
@@ -66,7 +66,7 @@
  	@set -e; liblist="$(LIBS)"; for i in $$liblist ;\
  	do \
  		if [ -f "$$i" ]; then \
-@@ -627,12 +634,7 @@ install_html_docs:
+@@ -623,12 +630,7 @@ install_html_docs:
  		done; \
  	done
  
@@ -164,7 +164,7 @@
  	ctags $(SRC)
 --- a/test/Makefile
 +++ b/test/Makefile
-@@ -138,7 +138,7 @@ install:
+@@ -139,7 +139,7 @@ install:
  tags:
  	ctags $(SRC)
  
@@ -173,7 +173,7 @@
  
  apps:
  	@(cd ..; $(MAKE) DIRS=apps all)
-@@ -549,7 +549,7 @@ $(CLIENTHELLOTEST)$(EXE_EXT): $(CLIENTHE
+@@ -557,7 +557,7 @@ $(SSLV2CONFTEST)$(EXE_EXT): $(SSLV2CONFT
  #	fi
  
  dummytest$(EXE_EXT): dummytest.o $(DLIBCRYPTO)
diff --git a/package/network/ipv6/odhcp6c/Makefile b/package/network/ipv6/odhcp6c/Makefile
index 5bf43bd94de81927803c2de82d9c738c4dde5582..aa81e02dcab2f05965c37ca804d1070288952afa 100644
--- a/package/network/ipv6/odhcp6c/Makefile
+++ b/package/network/ipv6/odhcp6c/Makefile
@@ -8,14 +8,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=odhcp6c
-PKG_VERSION:=2015-07-13
+PKG_VERSION:=2015-07-29
 PKG_RELEASE=$(PKG_SOURCE_VERSION)
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
 PKG_SOURCE_URL:=https://github.com/sbyx/odhcp6c.git
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=024525798c5f6aba3af9b2ef7b3af2f3c14f1db8
+PKG_SOURCE_VERSION:=dc186d6d2b0dd4ad23ca5fc69c00e81f796ff6d9
 PKG_MAINTAINER:=Steven Barth <steven@midlink.org>
 PKG_LICENSE:=GPL-2.0
 
diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script
index b8cbddb9422f3da0655de0093ff8f08e18e617bb..677d35f4f92e82d6a7fe9ca01a35e071097baca8 100755
--- a/package/network/ipv6/odhcp6c/files/dhcpv6.script
+++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script
@@ -5,6 +5,8 @@
 
 setup_interface () {
 	local device="$1"
+	local prefsig=""
+	local addrsig=""
 	proto_init_update "*" 1
 
 	# Merge RA-DNS
@@ -34,6 +36,7 @@ setup_interface () {
 
 	for prefix in $PREFIXES; do
 		proto_add_ipv6_prefix "$prefix"
+		prefsig="$prefsig ${prefix%%,*}"
 		local entry="${prefix#*/}"
 		entry="${entry#*,}"
 		entry="${entry#*,}"
@@ -68,6 +71,7 @@ setup_interface () {
 		local valid="${entry%%,*}"
 
 		proto_add_ipv6_address "$addr" "$mask" "$preferred" "$valid" 1
+		addrsig="$addrsig $addr/$mask"
 
 		if [ -z "$RA_ADDRESSES" -a -z "$RA_ROUTES" -a \
 				-z "$RA_DNS" -a "$FAKE_ROUTES" = 1 ]; then
@@ -76,7 +80,7 @@ setup_interface () {
 	done
 
 	for entry in $RA_ROUTES; do
-		local duplicate=0
+		local duplicate=$NOSOURCEFILTER
 		local addr="${entry%%/*}"
 		entry="${entry#*/}"
 		local mask="${entry%%,*}"
@@ -136,6 +140,8 @@ setup_interface () {
 		json_add_string ifname "@$INTERFACE"
 		json_add_string proto map
 		json_add_string type "$MAPTYPE"
+		json_add_string _prefsig "$prefsig"
+		[ "$MAPTYPE" = lw4o6 ] && json_add_string _addrsig "$addrsig"
 		json_add_string rule "$MAPRULE"
 		json_add_string tunlink "$INTERFACE"
 		[ -n "$ZONE_MAP" ] || ZONE_MAP=$ZONE
@@ -163,6 +169,7 @@ setup_interface () {
 		json_add_string ifname "@$INTERFACE"
 		json_add_string proto "464xlat"
 		json_add_string tunlink "$INTERFACE"
+		json_add_string _addrsig "$addrsig"
 		[ -n "$ZONE_464XLAT" ] || ZONE_464XLAT=$ZONE
 		[ -n "$ZONE_464XLAT" ] && json_add_string zone "$ZONE_464XLAT"
 		[ -n "$IFACE_464XLAT_DELEGATE" ] && json_add_boolean delegate "$IFACE_464XLAT_DELEGATE"
diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.sh b/package/network/ipv6/odhcp6c/files/dhcpv6.sh
index adcb1007a9684af6fff821be7490640ba09ffa10..4a453fdc4d94d9298067a986b0e4c6054b6c0a60 100755
--- a/package/network/ipv6/odhcp6c/files/dhcpv6.sh
+++ b/package/network/ipv6/odhcp6c/files/dhcpv6.sh
@@ -28,14 +28,15 @@ proto_dhcpv6_init_config() {
 	proto_config_add_boolean delegate
 	proto_config_add_int "soltimeout"
 	proto_config_add_boolean fakeroutes
+	proto_config_add_boolean sourcefilter
 }
 
 proto_dhcpv6_setup() {
 	local config="$1"
 	local iface="$2"
 
-	local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes
-	json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes
+	local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter
+	json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter
 
 
 	# Configure
@@ -76,6 +77,7 @@ proto_dhcpv6_setup() {
 	[ -n "$zone_464xlat" ] && proto_export "ZONE_464XLAT=$zone_464xlat"
 	[ -n "$zone" ] && proto_export "ZONE=$zone"
 	[ "$fakeroutes" != "0" ] && proto_export "FAKE_ROUTES=1"
+	[ "$sourcefilter" = "0" ] && proto_export "NOSOURCEFILTER=1"
 
 	proto_export "INTERFACE=$config"
 	proto_run_command "$config" odhcp6c \
diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in
index 65125a36dfd83e6e8b7a6cb2335f6508b025ac36..aee2a15fd314479ba4d5e29a8bb4ec5855a78342 100644
--- a/package/network/services/hostapd/Config.in
+++ b/package/network/services/hostapd/Config.in
@@ -46,3 +46,7 @@ config DRIVER_WEXT_SUPPORT
 config DRIVER_11N_SUPPORT
 	bool
 	default n
+
+config DRIVER_11W_SUPPORT
+	bool
+	default n
diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile
index c16cb11294b4f61e84df3325eb1e023992d7c600..8e706dc5a3dac630076e32eafbffbee2ba7e2976 100644
--- a/package/network/services/hostapd/Makefile
+++ b/package/network/services/hostapd/Makefile
@@ -71,7 +71,7 @@ DRIVER_MAKEOPTS= \
 	CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \
 
 ifeq ($(LOCAL_VARIANT),full)
-  DRIVER_MAKEOPTS += CONFIG_IEEE80211W=$(CONFIG_PACKAGE_kmod-ath9k)
+  DRIVER_MAKEOPTS += CONFIG_IEEE80211W=$(CONFIG_DRIVER_11W_SUPPORT)
 endif
 
 ifneq ($(LOCAL_TYPE),hostapd)
diff --git a/package/network/services/samba36/patches/010-patch-cve-2015-5252.patch b/package/network/services/samba36/patches/010-patch-cve-2015-5252.patch
index 8922a6e505f4471bf957f85f39ff728ebda1ee34..3640907a9b884327d8bf3a77a58ccca9546acb48 100644
--- a/package/network/services/samba36/patches/010-patch-cve-2015-5252.patch
+++ b/package/network/services/samba36/patches/010-patch-cve-2015-5252.patch
@@ -14,11 +14,9 @@ Reviewed-by: Volker Lendecke <vl@samba.org>
  source3/smbd/vfs.c | 7 +++++--
  1 file changed, 5 insertions(+), 2 deletions(-)
 
-diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
-index 6c56964..bd93b7f 100644
 --- a/source3/smbd/vfs.c
 +++ b/source3/smbd/vfs.c
-@@ -982,6 +982,7 @@ NTSTATUS check_reduced_name(connection_struct *conn, const char *fname)
+@@ -982,6 +982,7 @@ NTSTATUS check_reduced_name(connection_s
  	if (!allow_widelinks || !allow_symlinks) {
  		const char *conn_rootdir;
  		size_t rootdir_len;
@@ -26,7 +24,7 @@ index 6c56964..bd93b7f 100644
  
  		conn_rootdir = SMB_VFS_CONNECTPATH(conn, fname);
  		if (conn_rootdir == NULL) {
-@@ -992,8 +993,10 @@ NTSTATUS check_reduced_name(connection_struct *conn, const char *fname)
+@@ -992,8 +993,10 @@ NTSTATUS check_reduced_name(connection_s
  		}
  
  		rootdir_len = strlen(conn_rootdir);
@@ -39,5 +37,3 @@ index 6c56964..bd93b7f 100644
  			DEBUG(2, ("check_reduced_name: Bad access "
  				"attempt: %s is a symlink outside the "
  				"share path\n", fname));
--- 
-2.5.0
diff --git a/package/network/services/samba36/patches/011-patch-cve-2015-5296.patch b/package/network/services/samba36/patches/011-patch-cve-2015-5296.patch
index eaafd1c6679197e63027e35f682fd362278cc3ec..a309cf1b7ffdba5cd3416634430d02bc309df5ab 100644
--- a/package/network/services/samba36/patches/011-patch-cve-2015-5296.patch
+++ b/package/network/services/samba36/patches/011-patch-cve-2015-5296.patch
@@ -12,11 +12,9 @@ Reviewed-by: Jeremy Allison <jra@samba.org>
  source3/libsmb/clidfs.c | 7 ++++++-
  1 file changed, 6 insertions(+), 1 deletion(-)
 
-diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
-index 23e1471..f153b6b 100644
 --- a/source3/libsmb/clidfs.c
 +++ b/source3/libsmb/clidfs.c
-@@ -98,6 +98,11 @@ static struct cli_state *do_connect(TALLOC_CTX *ctx,
+@@ -98,6 +98,11 @@ static struct cli_state *do_connect(TALL
  	const char *username;
  	const char *password;
  	NTSTATUS status;
@@ -28,7 +26,7 @@ index 23e1471..f153b6b 100644
  
  	/* make a copy so we don't modify the global string 'service' */
  	servicename = talloc_strdup(ctx,share);
-@@ -132,7 +137,7 @@ static struct cli_state *do_connect(TALLOC_CTX *ctx,
+@@ -132,7 +137,7 @@ static struct cli_state *do_connect(TALL
  	zero_sockaddr(&ss);
  
  	/* have to open a new connection */
@@ -37,26 +35,6 @@ index 23e1471..f153b6b 100644
  	if (c == NULL) {
  		d_printf("Connection to %s failed\n", server_n);
  		return NULL;
--- 
-2.5.0
-
-
-From 060adb0abdeda51b8b622c6020b5dea0c8dde1cf Mon Sep 17 00:00:00 2001
-From: Stefan Metzmacher <metze@samba.org>
-Date: Wed, 30 Sep 2015 21:17:02 +0200
-Subject: [PATCH 2/2] CVE-2015-5296: s3:libsmb: force signing when requiring
- encryption in SMBC_server_internal()
-
-BUG: https://bugzilla.samba.org/show_bug.cgi?id=11536
-
-Signed-off-by: Stefan Metzmacher <metze@samba.org>
-Reviewed-by: Jeremy Allison <jra@samba.org>
----
- source3/libsmb/libsmb_server.c | 13 +++++++++++--
- 1 file changed, 11 insertions(+), 2 deletions(-)
-
-diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c
-index 45be660..167f2c9 100644
 --- a/source3/libsmb/libsmb_server.c
 +++ b/source3/libsmb/libsmb_server.c
 @@ -258,6 +258,7 @@ SMBC_server_internal(TALLOC_CTX *ctx,
@@ -108,5 +86,3 @@ index 45be660..167f2c9 100644
                  if (! NT_STATUS_IS_OK(nt_status)) {
                          DEBUG(1,("cli_full_connection failed! (%s)\n",
                                   nt_errstr(nt_status)));
--- 
-2.5.0
diff --git a/package/network/services/samba36/patches/012-patch-cve-2015-5299.patch b/package/network/services/samba36/patches/012-patch-cve-2015-5299.patch
index 19cbb19890af21c26b4fddf6cdeb0ed890cec4d9..7a569c746264a0beb5b4010f4ee1a876e08a00a9 100644
--- a/package/network/services/samba36/patches/012-patch-cve-2015-5299.patch
+++ b/package/network/services/samba36/patches/012-patch-cve-2015-5299.patch
@@ -14,8 +14,6 @@ Reviewed-by: David Disseldorp <ddiss@samba.org>
  source3/modules/vfs_shadow_copy2.c | 47 ++++++++++++++++++++++++++++++++++++++
  1 file changed, 47 insertions(+)
 
-diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c
-index fedfb53..16c1ed7 100644
 --- a/source3/modules/vfs_shadow_copy2.c
 +++ b/source3/modules/vfs_shadow_copy2.c
 @@ -21,6 +21,8 @@
@@ -27,7 +25,7 @@ index fedfb53..16c1ed7 100644
  #include "system/filesys.h"
  #include "ntioctl.h"
  
-@@ -764,6 +766,43 @@ static int shadow_copy2_mkdir(vfs_handle_struct *handle,  const char *fname, mod
+@@ -764,6 +766,43 @@ static int shadow_copy2_mkdir(vfs_handle
          SHADOW2_NEXT(MKDIR, (handle, name, mode), int, -1);
  }
  
@@ -71,7 +69,7 @@ index fedfb53..16c1ed7 100644
  static int shadow_copy2_rmdir(vfs_handle_struct *handle,  const char *fname)
  {
          SHADOW2_NEXT(RMDIR, (handle, name), int, -1);
-@@ -877,6 +916,7 @@ static int shadow_copy2_get_shadow_copy2_data(vfs_handle_struct *handle,
+@@ -877,6 +916,7 @@ static int shadow_copy2_get_shadow_copy2
  	SMB_STRUCT_DIRENT *d;
  	TALLOC_CTX *tmp_ctx = talloc_new(handle->data);
  	char *snapshot;
@@ -79,7 +77,7 @@ index fedfb53..16c1ed7 100644
  
  	snapdir = shadow_copy2_find_snapdir(tmp_ctx, handle);
  	if (snapdir == NULL) {
-@@ -886,6 +926,13 @@ static int shadow_copy2_get_shadow_copy2_data(vfs_handle_struct *handle,
+@@ -886,6 +926,13 @@ static int shadow_copy2_get_shadow_copy2
  		talloc_free(tmp_ctx);
  		return -1;
  	}
@@ -93,5 +91,3 @@ index fedfb53..16c1ed7 100644
  
  	p = SMB_VFS_NEXT_OPENDIR(handle, snapdir, NULL, 0);
  
--- 
-2.5.0
diff --git a/package/network/services/samba36/patches/015-patch-cve-2015-7560.patch b/package/network/services/samba36/patches/015-patch-cve-2015-7560.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6ce8e2f9b74c109c8ebfc9940b16f00d58d08adf
--- /dev/null
+++ b/package/network/services/samba36/patches/015-patch-cve-2015-7560.patch
@@ -0,0 +1,172 @@
+From eb27f9b7bf9c1dc902d9545eecf805831bd4e46c Mon Sep 17 00:00:00 2001
+From: Jeremy Allison <jra@samba.org>
+Date: Tue, 5 Jan 2016 11:18:12 -0800
+Subject: [PATCH 1/8] CVE-2015-7560: s3: smbd: Add refuse_symlink() function
+ that can be used to prevent operations on a symlink.
+
+BUG: https://bugzilla.samba.org/show_bug.cgi?id=11648
+
+Signed-off-by: Jeremy Allison <jra@samba.org>
+Reviewed-by: Michael Adam <obnox@samba.org>
+---
+ source3/smbd/trans2.c | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+--- a/source3/smbd/trans2.c
++++ b/source3/smbd/trans2.c
+@@ -51,6 +51,34 @@ static char *store_file_unix_basic_info2
+ 				files_struct *fsp,
+ 				const SMB_STRUCT_STAT *psbuf);
+ 
++/****************************************************************************
++ Check if an open file handle or pathname is a symlink.
++****************************************************************************/
++
++static NTSTATUS refuse_symlink(connection_struct *conn,
++			const files_struct *fsp,
++			const char *name)
++{
++	SMB_STRUCT_STAT sbuf;
++	const SMB_STRUCT_STAT *pst = NULL;
++
++	if (fsp) {
++		pst = &fsp->fsp_name->st;
++	} else {
++		int ret = vfs_stat_smb_fname(conn,
++				name,
++				&sbuf);
++		if (ret == -1) {
++			return map_nt_error_from_unix(errno);
++		}
++		pst = &sbuf;
++	}
++	if (S_ISLNK(pst->st_ex_mode)) {
++		return NT_STATUS_ACCESS_DENIED;
++	}
++	return NT_STATUS_OK;
++}
++
+ /********************************************************************
+  Roundup a value to the nearest allocation roundup size boundary.
+  Only do this for Windows clients.
+@@ -181,12 +209,22 @@ NTSTATUS get_ea_names_from_file(TALLOC_C
+ 	char **names, **tmp;
+ 	size_t num_names;
+ 	ssize_t sizeret = -1;
++	NTSTATUS status;
++
++	if (pnames) {
++		*pnames = NULL;
++	}
++	*pnum_names = 0;
+ 
+ 	if (!lp_ea_support(SNUM(conn))) {
+-		if (pnames) {
+-			*pnames = NULL;
+-		}
+-		*pnum_names = 0;
++		return NT_STATUS_OK;
++	}
++
++	status = refuse_symlink(conn, fsp, fname);
++	if (!NT_STATUS_IS_OK(status)) {
++		/*
++		 * Just return no EA's on a symlink.
++		 */
+ 		return NT_STATUS_OK;
+ 	}
+ 
+@@ -236,10 +274,6 @@ NTSTATUS get_ea_names_from_file(TALLOC_C
+ 
+ 	if (sizeret == 0) {
+ 		TALLOC_FREE(names);
+-		if (pnames) {
+-			*pnames = NULL;
+-		}
+-		*pnum_names = 0;
+ 		return NT_STATUS_OK;
+ 	}
+ 
+@@ -550,6 +584,7 @@ NTSTATUS set_ea(connection_struct *conn,
+ 		const struct smb_filename *smb_fname, struct ea_list *ea_list)
+ {
+ 	char *fname = NULL;
++	NTSTATUS status;
+ 
+ 	if (!lp_ea_support(SNUM(conn))) {
+ 		return NT_STATUS_EAS_NOT_SUPPORTED;
+@@ -559,6 +594,12 @@ NTSTATUS set_ea(connection_struct *conn,
+ 		return NT_STATUS_ACCESS_DENIED;
+ 	}
+ 
++	status = refuse_symlink(conn, fsp, smb_fname->base_name);
++	if (!NT_STATUS_IS_OK(status)) {
++		return status;
++	}
++
++
+ 	/* For now setting EAs on streams isn't supported. */
+ 	fname = smb_fname->base_name;
+ 
+@@ -4931,6 +4972,13 @@ NTSTATUS smbd_do_qfilepathinfo(connectio
+ 				uint16 num_file_acls = 0;
+ 				uint16 num_def_acls = 0;
+ 
++				status = refuse_symlink(conn,
++						fsp,
++						smb_fname->base_name);
++				if (!NT_STATUS_IS_OK(status)) {
++					return status;
++				}
++
+ 				if (fsp && fsp->fh->fd != -1) {
+ 					file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp);
+ 				} else {
+@@ -6452,6 +6500,7 @@ static NTSTATUS smb_set_posix_acl(connec
+ 	uint16 num_def_acls;
+ 	bool valid_file_acls = True;
+ 	bool valid_def_acls = True;
++	NTSTATUS status;
+ 
+ 	if (total_data < SMB_POSIX_ACL_HEADER_SIZE) {
+ 		return NT_STATUS_INVALID_PARAMETER;
+@@ -6479,6 +6528,11 @@ static NTSTATUS smb_set_posix_acl(connec
+ 		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
++	status = refuse_symlink(conn, fsp, smb_fname->base_name);
++	if (!NT_STATUS_IS_OK(status)) {
++		return status;
++	}
++
+ 	DEBUG(10,("smb_set_posix_acl: file %s num_file_acls = %u, num_def_acls = %u\n",
+ 		smb_fname ? smb_fname_str_dbg(smb_fname) : fsp_str_dbg(fsp),
+ 		(unsigned int)num_file_acls,
+--- a/source3/smbd/nttrans.c
++++ b/source3/smbd/nttrans.c
+@@ -877,6 +877,12 @@ NTSTATUS set_sd(files_struct *fsp, struc
+ 		return NT_STATUS_OK;
+ 	}
+ 
++	if (S_ISLNK(fsp->fsp_name->st.st_ex_mode)) {
++		DEBUG(10, ("ACL set on symlink %s denied.\n",
++			fsp_str_dbg(fsp)));
++		return NT_STATUS_ACCESS_DENIED;
++	}
++
+ 	if (psd->owner_sid == NULL) {
+ 		security_info_sent &= ~SECINFO_OWNER;
+ 	}
+@@ -1925,6 +1931,12 @@ NTSTATUS smbd_do_query_security_desc(con
+ 		return NT_STATUS_ACCESS_DENIED;
+ 	}
+ 
++	if (S_ISLNK(fsp->fsp_name->st.st_ex_mode)) {
++		DEBUG(10, ("ACL get on symlink %s denied.\n",
++			fsp_str_dbg(fsp)));
++		return NT_STATUS_ACCESS_DENIED;
++	}
++
+ 	if (security_info_wanted & (SECINFO_DACL|SECINFO_OWNER|
+ 			SECINFO_GROUP|SECINFO_SACL)) {
+ 		/* Don't return SECINFO_LABEL if anything else was
diff --git a/package/network/services/samba36/patches/020-CVE-preparation-v3-6.patch b/package/network/services/samba36/patches/020-CVE-preparation-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ae822f47f1e860da29ab6e8aa54095ba80aa5817
--- /dev/null
+++ b/package/network/services/samba36/patches/020-CVE-preparation-v3-6.patch
@@ -0,0 +1,6824 @@
+From 39a3fa39967faaf216be8e108ca57d07de1aa95a Mon Sep 17 00:00:00 2001
+From: Vadim Zhukov <persgray@gmail.com>
+Date: Sat, 25 May 2013 15:19:24 +0100
+Subject: [PATCH 01/41] pidl: Recent Perl warns about "defined(@var)"
+ constructs.
+
+Signed-off-by: Jelmer Vernooij <jelmer@samba.org>
+
+Autobuild-User(master): Jelmer Vernooij <jelmer@samba.org>
+Autobuild-Date(master): Sat May 25 18:10:53 CEST 2013 on sn-devel-104
+
+(cherry picked from commit 92254d09e0ee5a7d9d0cd91fe1803f54e64d9a5f)
+---
+ pidl/lib/Parse/Pidl/ODL.pm | 2 +-
+ pidl/pidl                  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/pidl/lib/Parse/Pidl/ODL.pm
++++ b/pidl/lib/Parse/Pidl/ODL.pm
+@@ -70,7 +70,7 @@ sub ODL2IDL
+ 					next;
+ 				}
+ 				my $podl = Parse::Pidl::IDL::parse_file($idl_path, $opt_incdirs);
+-				if (defined(@$podl)) {
++				if (defined($podl)) {
+ 					require Parse::Pidl::Typelist;
+ 					my $basename = basename($idl_path, ".idl");
+ 
+--- a/pidl/pidl
++++ b/pidl/pidl
+@@ -605,7 +605,7 @@ sub process_file($)
+ 		require Parse::Pidl::IDL;
+ 
+ 		$pidl = Parse::Pidl::IDL::parse_file($idl_file, \@opt_incdirs);
+-		defined @$pidl || die "Failed to parse $idl_file";
++		defined $pidl || die "Failed to parse $idl_file";
+ 	}
+ 
+ 	require Parse::Pidl::Typelist;
+--- a/source4/heimdal/cf/make-proto.pl
++++ b/source4/heimdal/cf/make-proto.pl
+@@ -1,8 +1,8 @@
+ # Make prototypes from .c files
+ # $Id$
+ 
+-##use Getopt::Std;
+-require 'getopts.pl';
++use Getopt::Std;
++#require 'getopts.pl';
+ 
+ my $comment = 0;
+ my $if_0 = 0;
+@@ -12,7 +12,7 @@ my $debug = 0;
+ my $oproto = 1;
+ my $private_func_re = "^_";
+ 
+-Getopts('x:m:o:p:dqE:R:P:') || die "foo";
++getopts('x:m:o:p:dqE:R:P:') || die "foo";
+ 
+ if($opt_d) {
+     $debug = 1;
+--- a/source3/Makefile-smbtorture4
++++ b/source3/Makefile-smbtorture4
+@@ -6,7 +6,7 @@ SAMBA4_BINARIES="smbtorture,ndrdump"
+ samba4-configure:
+ 	@(cd .. && \
+ 		CFLAGS='' $(WAF) reconfigure || \
+-		CFLAGS='' $(WAF) configure --enable-socket-wrapper --enable-nss-wrapper --enable-uid-wrapper --nonshared-binary=$(SAMBA4_BINARIES) --enable-auto-reconfigure )
++		CFLAGS='' $(WAF) configure --enable-socket-wrapper --enable-nss-wrapper --enable-uid-wrapper --nonshared-binary=$(SAMBA4_BINARIES) --enable-auto-reconfigure --bundled-libraries=ALL --disable-gnutls )
+ 
+ .PHONY: samba4-configure
+ 
+--- a/source4/lib/ldb/wscript
++++ b/source4/lib/ldb/wscript
+@@ -135,9 +135,7 @@ def build(bld):
+                           pc_files=ldb_pc_files,
+                           vnum=VERSION,
+                           private_library=private_library,
+-                          manpages='man/ldb.3',
+-                          abi_directory = 'ABI',
+-                          abi_match = abi_match)
++                          manpages='man/ldb.3')
+ 
+         # generate a include/ldb_version.h
+         t = bld.SAMBA_GENERATOR('ldb_version.h',
+--- a/source3/selftest/skip
++++ b/source3/selftest/skip
+@@ -22,3 +22,8 @@ samba3.*raw.ioctl
+ samba3.*raw.qfileinfo
+ samba3.*raw.qfsinfo
+ samba3.*raw.sfileinfo.base
++# skip, don't work for badlock backports
++samba3.posix_s3.raw.eas
++samba3.posix_s3.raw.rename
++samba3.posix_s3.raw.search
++samba3.posix_s3.raw.streams
+--- a/librpc/ndr/ndr_ntlmssp.c
++++ b/librpc/ndr/ndr_ntlmssp.c
+@@ -176,4 +176,20 @@ _PUBLIC_ void ndr_print_ntlmssp_Version(
+ 	}
+ }
+ 
++_PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list,
++					     enum ntlmssp_AvId AvId)
++{
++	struct AV_PAIR *res = NULL;
++	uint32_t i = 0;
+ 
++	for (i = 0; i < av_list->count; i++) {
++		if (av_list->pair[i].AvId != AvId) {
++			continue;
++		}
++
++		res = discard_const_p(struct AV_PAIR, &av_list->pair[i]);
++		break;
++	}
++
++	return res;
++}
+--- a/librpc/ndr/ndr_ntlmssp.h
++++ b/librpc/ndr/ndr_ntlmssp.h
+@@ -31,3 +31,5 @@ _PUBLIC_ void ndr_print_ntlmssp_lm_respo
+ 					    bool ntlmv2);
+ _PUBLIC_ void ndr_print_ntlmssp_Version(struct ndr_print *ndr, const char *name, const union ntlmssp_Version *r);
+ 
++_PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list,
++					     enum ntlmssp_AvId AvId);
+--- /dev/null
++++ b/librpc/ABI/ndr-0.0.2.sigs
+@@ -0,0 +1,247 @@
++GUID_all_zero: bool (const struct GUID *)
++GUID_compare: int (const struct GUID *, const struct GUID *)
++GUID_equal: bool (const struct GUID *, const struct GUID *)
++GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
++GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
++GUID_from_string: NTSTATUS (const char *, struct GUID *)
++GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *)
++GUID_random: struct GUID (void)
++GUID_string: char *(TALLOC_CTX *, const struct GUID *)
++GUID_string2: char *(TALLOC_CTX *, const struct GUID *)
++GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *)
++GUID_zero: struct GUID (void)
++ndr_align_size: size_t (uint32_t, size_t)
++ndr_charset_length: uint32_t (const void *, charset_t)
++ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
++ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
++ndr_check_padding: void (struct ndr_pull *, size_t)
++ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t)
++ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t)
++ndr_get_array_length: uint32_t (struct ndr_pull *, const void *)
++ndr_get_array_size: uint32_t (struct ndr_pull *, const void *)
++ndr_map_error2errno: int (enum ndr_err_code)
++ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code)
++ndr_map_error2string: const char *(enum ndr_err_code)
++ndr_policy_handle_empty: bool (const struct policy_handle *)
++ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *)
++ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB)
++ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *)
++ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *)
++ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS)
++ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME)
++ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME)
++ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME)
++ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR)
++ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t)
++ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t)
++ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t)
++ndr_print_bool: void (struct ndr_print *, const char *, const bool)
++ndr_print_debug: void (ndr_print_fn_t, const char *, void *)
++ndr_print_debug_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *)
++ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_dlong: void (struct ndr_print *, const char *, int64_t)
++ndr_print_double: void (struct ndr_print *, const char *, double)
++ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t)
++ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *)
++ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *)
++ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *)
++ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t)
++ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t)
++ndr_print_int16: void (struct ndr_print *, const char *, int16_t)
++ndr_print_int32: void (struct ndr_print *, const char *, int32_t)
++ndr_print_int3264: void (struct ndr_print *, const char *, int32_t)
++ndr_print_int8: void (struct ndr_print *, const char *, int8_t)
++ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *)
++ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *)
++ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *)
++ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID)
++ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType)
++ndr_print_null: void (struct ndr_print *)
++ndr_print_pointer: void (struct ndr_print *, const char *, void *)
++ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *)
++ndr_print_printf_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_ptr: void (struct ndr_print *, const char *, const void *)
++ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t)
++ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *)
++ndr_print_string: void (struct ndr_print *, const char *, const char *)
++ndr_print_string_array: void (struct ndr_print *, const char *, const char **)
++ndr_print_string_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_struct: void (struct ndr_print *, const char *, const char *)
++ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *)
++ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t)
++ndr_print_time_t: void (struct ndr_print *, const char *, time_t)
++ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *)
++ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *)
++ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t)
++ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t)
++ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t)
++ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t)
++ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t)
++ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t)
++ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t)
++ndr_print_union: void (struct ndr_print *, const char *, int, const char *)
++ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *)
++ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *)
++ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *)
++ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type)
++ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *)
++ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *)
++ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *)
++ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *)
++ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
++ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
++ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
++ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *)
++ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t)
++ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t)
++ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t)
++ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t)
++ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
++ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
++ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *)
++ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *)
++ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
++ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...)
++ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
++ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *)
++ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *)
++ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *)
++ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
++ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *)
++ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *)
++ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *)
++ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *)
++ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **)
++ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **)
++ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *)
++ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *)
++ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *)
++ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **)
++ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *)
++ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
++ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
++ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *)
++ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t)
++ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
++ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
++ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **)
++ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***)
++ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
++ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
++ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t)
++ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t)
++ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *)
++ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *)
++ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *)
++ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t)
++ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
++ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
++ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *)
++ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
++ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t)
++ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
++ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
++ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *)
++ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *)
++ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB)
++ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *)
++ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *)
++ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS)
++ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME)
++ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME)
++ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME)
++ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR)
++ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t)
++ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t)
++ndr_push_blob: DATA_BLOB (struct ndr_push *)
++ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t)
++ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t)
++ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t)
++ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double)
++ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
++ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...)
++ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t)
++ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *)
++ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *)
++ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t)
++ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t)
++ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *)
++ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t)
++ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t)
++ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t)
++ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *)
++ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *)
++ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *)
++ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID)
++ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType)
++ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *)
++ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *)
++ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *)
++ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t)
++ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
++ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
++ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *)
++ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **)
++ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t)
++ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t)
++ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t)
++ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t)
++ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *)
++ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *)
++ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t)
++ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t)
++ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t)
++ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t)
++ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
++ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t)
++ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t)
++ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *)
++ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type)
++ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t)
++ndr_set_flags: void (uint32_t *, uint32_t)
++ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int)
++ndr_size_GUID: size_t (const struct GUID *, int)
++ndr_size_string: uint32_t (int, const char * const *, int)
++ndr_size_string_array: size_t (const char **, uint32_t, int)
++ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t)
++ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t)
++ndr_string_array_size: size_t (struct ndr_push *, const char *)
++ndr_string_length: uint32_t (const void *, uint32_t)
++ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *)
++ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0
++ndr_token_peek: uint32_t (struct ndr_token_list **, const void *)
++ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *)
++ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *, comparison_fn_t, bool)
++ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list **, const void *, uint32_t)
++ndr_transfer_syntax_ndr: uuid = {time_low = 2324192516, time_mid = 7403, time_hi_and_version = 4553, clock_seq = "\237\350", node = "\b\000+\020H`"}, if_version = 2
++ndr_transfer_syntax_ndr64: uuid = {time_low = 1903232307, time_mid = 48826, time_hi_and_version = 18743, clock_seq = "\203\031", node = "\265\333\357\234\314\066"}, if_version = 1
+--- a/librpc/ndr/libndr.h
++++ b/librpc/ndr/libndr.h
+@@ -124,6 +124,20 @@ struct ndr_print {
+ #define LIBNDR_FLAG_STR_UTF8		(1<<12)
+ #define LIBNDR_STRING_FLAGS		(0x7FFC)
+ 
++/*
++ * don't debug NDR_ERR_BUFSIZE failures,
++ * as the available buffer might be incomplete.
++ *
++ * return NDR_ERR_INCOMPLETE_BUFFER instead.
++ */
++#define LIBNDR_FLAG_INCOMPLETE_BUFFER (1<<16)
++
++/*
++ * This lets ndr_pull_subcontext_end() return
++ * NDR_ERR_UNREAD_BYTES.
++ */
++#define LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES (1<<17)
++
+ /* set if relative pointers should *not* be marshalled in reverse order */
+ #define LIBNDR_FLAG_NO_RELATIVE_REVERSE	(1<<18)
+ 
+@@ -163,6 +177,7 @@ struct ndr_print {
+ 
+ /* useful macro for debugging */
+ #define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p)
++#define NDR_PRINT_DEBUGC(dbgc_class, type, p) ndr_print_debugc(dbgc_class, (ndr_print_fn_t)ndr_print_ ##type, #p, p)
+ #define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_fn_t)ndr_print_ ##type, #p, level, p)
+ #define NDR_PRINT_FUNCTION_DEBUG(type, flags, p) ndr_print_function_debug((ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
+ #define NDR_PRINT_BOTH_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_BOTH, p)
+@@ -199,7 +214,9 @@ enum ndr_err_code {
+ 	NDR_ERR_IPV6ADDRESS,
+ 	NDR_ERR_INVALID_POINTER,
+ 	NDR_ERR_UNREAD_BYTES,
+-	NDR_ERR_NDR64
++	NDR_ERR_NDR64,
++	NDR_ERR_FLAGS,
++	NDR_ERR_INCOMPLETE_BUFFER
+ };
+ 
+ #define NDR_ERR_CODE_IS_SUCCESS(x) (x == NDR_ERR_SUCCESS)
+@@ -217,20 +234,52 @@ enum ndr_compression_alg {
+ 
+ /*
+   flags passed to control parse flow
++  These are deliberately in a different range to the NDR_IN/NDR_OUT
++  flags to catch mixups
+ */
+-#define NDR_SCALARS 1
+-#define NDR_BUFFERS 2
++#define NDR_SCALARS    0x100
++#define NDR_BUFFERS    0x200
+ 
+ /*
+-  flags passed to ndr_print_*()
++  flags passed to ndr_print_*() and ndr pull/push for functions
++  These are deliberately in a different range to the NDR_SCALARS/NDR_BUFFERS
++  flags to catch mixups
+ */
+-#define NDR_IN 1
+-#define NDR_OUT 2
+-#define NDR_BOTH 3
+-#define NDR_SET_VALUES 4
++#define NDR_IN         0x10
++#define NDR_OUT        0x20
++#define NDR_BOTH       0x30
++#define NDR_SET_VALUES 0x40
++
++
++#define NDR_PULL_CHECK_FLAGS(ndr, ndr_flags) do { \
++	if ((ndr_flags) & ~(NDR_SCALARS|NDR_BUFFERS)) { \
++		return ndr_pull_error(ndr, NDR_ERR_FLAGS, "Invalid pull struct ndr_flags 0x%x", ndr_flags); \
++	} \
++} while (0)
++
++#define NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags) do { \
++	if ((ndr_flags) & ~(NDR_SCALARS|NDR_BUFFERS)) \
++		return ndr_push_error(ndr, NDR_ERR_FLAGS, "Invalid push struct ndr_flags 0x%x", ndr_flags); \
++} while (0)
++
++#define NDR_PULL_CHECK_FN_FLAGS(ndr, flags) do { \
++	if ((flags) & ~(NDR_BOTH|NDR_SET_VALUES)) { \
++		return ndr_pull_error(ndr, NDR_ERR_FLAGS, "Invalid fn pull flags 0x%x", flags); \
++	} \
++} while (0)
++
++#define NDR_PUSH_CHECK_FN_FLAGS(ndr, flags) do { \
++	if ((flags) & ~(NDR_BOTH|NDR_SET_VALUES)) \
++		return ndr_push_error(ndr, NDR_ERR_FLAGS, "Invalid fn push flags 0x%x", flags); \
++} while (0)
+ 
+ #define NDR_PULL_NEED_BYTES(ndr, n) do { \
+ 	if (unlikely((n) > ndr->data_size || ndr->offset + (n) > ndr->data_size)) { \
++		if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { \
++			uint32_t _available = ndr->data_size - ndr->offset; \
++			uint32_t _missing = n - _available; \
++			ndr->relative_highest_offset = _missing; \
++		} \
+ 		return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "Pull bytes %u (%s)", (unsigned)n, __location__); \
+ 	} \
+ } while(0)
+@@ -247,6 +296,10 @@ enum ndr_compression_alg {
+ 		ndr->offset = (ndr->offset + (n-1)) & ~(n-1); \
+ 	} \
+ 	if (unlikely(ndr->offset > ndr->data_size)) {			\
++		if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { \
++			uint32_t _missing = ndr->offset - ndr->data_size; \
++			ndr->relative_highest_offset = _missing; \
++		} \
+ 		return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "Pull align %u", (unsigned)n); \
+ 	} \
+ } while(0)
+@@ -402,6 +455,8 @@ void ndr_print_dom_sid0(struct ndr_print
+ size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags);
+ void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid);
+ bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2); 
++char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id);
++bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id);
+ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, const void *p, ndr_push_flags_fn_t fn);
+ enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, uint32_t level, ndr_push_flags_fn_t fn);
+ size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push);
+@@ -424,14 +479,18 @@ enum ndr_err_code ndr_pull_relative_ptr2
+ enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v);
+ size_t ndr_align_size(uint32_t offset, size_t n);
+ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx);
++enum ndr_err_code ndr_pull_append(struct ndr_pull *ndr, DATA_BLOB *blob);
++enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr);
+ enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size);
+ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx);
+ DATA_BLOB ndr_push_blob(struct ndr_push *ndr);
+ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size);
+ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
++void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
+ void ndr_print_printf_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
+ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
+ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr);
++void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr);
+ void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr);
+ void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr);
+ char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr);
+--- a/librpc/ndr/ndr.c
++++ b/librpc/ndr/ndr.c
+@@ -77,6 +77,111 @@ _PUBLIC_ struct ndr_pull *ndr_pull_init_
+ 	return ndr;
+ }
+ 
++_PUBLIC_ enum ndr_err_code ndr_pull_append(struct ndr_pull *ndr, DATA_BLOB *blob)
++{
++	enum ndr_err_code ndr_err;
++	DATA_BLOB b;
++	uint32_t append = 0;
++	bool ok;
++
++	if (blob->length == 0) {
++		return NDR_ERR_SUCCESS;
++	}
++
++	ndr_err = ndr_token_retrieve(&ndr->array_size_list, ndr, &append);
++	if (ndr_err == NDR_ERR_TOKEN) {
++		append = 0;
++		ndr_err = NDR_ERR_SUCCESS;
++	}
++	NDR_CHECK(ndr_err);
++
++	if (ndr->data_size == 0) {
++		ndr->data = NULL;
++		append = UINT32_MAX;
++	}
++
++	if (append == UINT32_MAX) {
++		/*
++		 * append == UINT32_MAX means that
++		 * ndr->data is either NULL or a valid
++		 * talloc child of ndr, which means
++		 * we can use data_blob_append() without
++		 * data_blob_talloc() of the existing callers data
++		 */
++		b = data_blob_const(ndr->data, ndr->data_size);
++	} else {
++		b = data_blob_talloc(ndr, ndr->data, ndr->data_size);
++		if (b.data == NULL) {
++			return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__);
++		}
++	}
++
++	ok = data_blob_append(ndr, &b, blob->data, blob->length);
++	if (!ok) {
++		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__);
++	}
++
++	ndr->data = b.data;
++	ndr->data_size = b.length;
++
++	return ndr_token_store(ndr, &ndr->array_size_list, ndr, UINT32_MAX);
++}
++
++_PUBLIC_ enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr)
++{
++	uint32_t skip = 0;
++	uint32_t append = 0;
++
++	if (ndr->relative_base_offset != 0) {
++		return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
++				      "%s", __location__);
++	}
++	if (ndr->relative_highest_offset != 0) {
++		return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
++				      "%s", __location__);
++	}
++	if (ndr->relative_list != NULL) {
++		return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
++				      "%s", __location__);
++	}
++	if (ndr->relative_base_list != NULL) {
++		return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
++				      "%s", __location__);
++	}
++
++	/*
++	 * we need to keep up to 7 bytes
++	 * in order to get the aligment right.
++	 */
++	skip = ndr->offset & 0xFFFFFFF8;
++
++	if (skip == 0) {
++		return NDR_ERR_SUCCESS;
++	}
++
++	ndr->offset -= skip;
++	ndr->data_size -= skip;
++
++	append = ndr_token_peek(&ndr->array_size_list, ndr);
++	if (append != UINT32_MAX) {
++		/*
++		 * here we assume, that ndr->data is not a
++		 * talloc child of ndr.
++		 */
++		ndr->data += skip;
++		return NDR_ERR_SUCCESS;
++	}
++
++	memmove(ndr->data, ndr->data + skip, ndr->data_size);
++
++	ndr->data = talloc_realloc(ndr, ndr->data, uint8_t, ndr->data_size);
++	if (ndr->data_size != 0 && ndr->data == NULL) {
++		return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__);
++	}
++
++	return NDR_ERR_SUCCESS;
++}
++
+ /*
+   advance by 'size' bytes
+ */
+@@ -167,6 +272,38 @@ _PUBLIC_ enum ndr_err_code ndr_push_expa
+ 	return NDR_ERR_SUCCESS;
+ }
+ 
++_PUBLIC_ void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...)
++{
++	va_list ap;
++	char *s = NULL;
++	uint32_t i;
++	int ret;
++	int dbgc_class;
++
++	va_start(ap, format);
++	ret = vasprintf(&s, format, ap);
++	va_end(ap);
++
++	if (ret == -1) {
++		return;
++	}
++
++	dbgc_class = *(int *)ndr->private_data;
++
++	if (ndr->no_newline) {
++		DEBUGADDC(dbgc_class, 1,("%s", s));
++		free(s);
++		return;
++	}
++
++	for (i=0;i<ndr->depth;i++) {
++		DEBUGADDC(dbgc_class, 1,("    "));
++	}
++
++	DEBUGADDC(dbgc_class, 1,("%s\n", s));
++	free(s);
++}
++
+ _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) 
+ {
+ 	va_list ap;
+@@ -238,6 +375,25 @@ _PUBLIC_ void ndr_print_string_helper(st
+ }
+ 
+ /*
++  a useful helper function for printing idl structures via DEBUGC()
++*/
++_PUBLIC_ void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr)
++{
++	struct ndr_print *ndr;
++
++	DEBUGC(dbgc_class, 1,(" "));
++
++	ndr = talloc_zero(NULL, struct ndr_print);
++	if (!ndr) return;
++	ndr->private_data = &dbgc_class;
++	ndr->print = ndr_print_debugc_helper;
++	ndr->depth = 1;
++	ndr->flags = 0;
++	fn(ndr, name, ptr);
++	talloc_free(ndr);
++}
++
++/*
+   a useful helper function for printing idl structures via DEBUG()
+ */
+ _PUBLIC_ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr)
+@@ -403,6 +559,15 @@ _PUBLIC_ enum ndr_err_code ndr_pull_erro
+ 	va_list ap;
+ 	int ret;
+ 
++	if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) {
++		switch (ndr_err) {
++		case NDR_ERR_BUFSIZE:
++			return NDR_ERR_INCOMPLETE_BUFFER;
++		default:
++			break;
++		}
++	}
++
+ 	va_start(ap, format);
+ 	ret = vasprintf(&s, format, ap);
+ 	va_end(ap);
+@@ -557,6 +722,23 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subc
+ 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &reserved));
+ 		break;
+ 	}
++	case 0xFFFFFFFF:
++		/*
++		 * a shallow copy like subcontext
++		 * useful for DCERPC pipe chunks.
++		 */
++		subndr = talloc_zero(ndr, struct ndr_pull);
++		NDR_ERR_HAVE_NO_MEMORY(subndr);
++
++		subndr->flags		= ndr->flags;
++		subndr->current_mem_ctx	= ndr->current_mem_ctx;
++		subndr->data		= ndr->data;
++		subndr->offset		= ndr->offset;
++		subndr->data_size	= ndr->data_size;
++
++		*_subndr = subndr;
++		return NDR_ERR_SUCCESS;
++
+ 	default:
+ 		return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", 
+ 				      (int)header_size);
+@@ -589,13 +771,35 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subc
+ 				 ssize_t size_is)
+ {
+ 	uint32_t advance;
+-	if (size_is >= 0) {
++	uint32_t highest_ofs;
++
++	if (header_size == 0xFFFFFFFF) {
++		advance = subndr->offset - ndr->offset;
++	} else if (size_is >= 0) {
+ 		advance = size_is;
+ 	} else if (header_size > 0) {
+ 		advance = subndr->data_size;
+ 	} else {
+ 		advance = subndr->offset;
+ 	}
++
++	if (subndr->offset > ndr->relative_highest_offset) {
++		highest_ofs = subndr->offset;
++	} else {
++		highest_ofs = subndr->relative_highest_offset;
++	}
++	if (!(subndr->flags & LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES)) {
++		/*
++		 * avoid an error unless SUBCONTEXT_NO_UNREAD_BYTES is specified
++		 */
++		highest_ofs = advance;
++	}
++	if (highest_ofs < advance) {
++		return ndr_pull_error(subndr, NDR_ERR_UNREAD_BYTES,
++				      "not all bytes consumed ofs[%u] advance[%u]",
++				      highest_ofs, advance);
++	}
++
+ 	NDR_CHECK(ndr_pull_advance(ndr, advance));
+ 	return NDR_ERR_SUCCESS;
+ }
+@@ -1440,6 +1644,7 @@ const static struct {
+ 	{ NDR_ERR_INVALID_POINTER, "Invalid Pointer" },
+ 	{ NDR_ERR_UNREAD_BYTES, "Unread Bytes" },
+ 	{ NDR_ERR_NDR64, "NDR64 assertion error" },
++	{ NDR_ERR_INCOMPLETE_BUFFER, "Incomplete Buffer" },
+ 	{ 0, NULL }
+ };
+ 
+--- a/librpc/idl/idl_types.h
++++ b/librpc/idl/idl_types.h
+@@ -47,3 +47,5 @@
+ 
+ #define NDR_RELATIVE_REVERSE LIBNDR_FLAG_RELATIVE_REVERSE
+ #define NDR_NO_RELATIVE_REVERSE LIBNDR_FLAG_NO_RELATIVE_REVERSE
++
++#define NDR_SUBCONTEXT_NO_UNREAD_BYTES LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES
+--- a/librpc/idl/dcerpc.idl
++++ b/librpc/idl/dcerpc.idl
+@@ -10,6 +10,8 @@
+ */
+ import "misc.idl";
+ 
++cpp_quote("extern const uint8_t DCERPC_SEC_VT_MAGIC[8];")
++
+ interface dcerpc
+ {
+ 	typedef struct {
+@@ -453,14 +455,21 @@ interface dcerpc
+ 	} dcerpc_payload;
+ 
+ 	/* pfc_flags values */
+-	const uint8 DCERPC_PFC_FLAG_FIRST		= 0x01; /* First fragment */
+-	const uint8 DCERPC_PFC_FLAG_LAST		= 0x02; /* Last fragment */
+-	const uint8 DCERPC_PFC_FLAG_PENDING_CANCEL	= 0x04; /* Cancel was pending at sender */
+-	const uint8 DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN	= DCERPC_PFC_FLAG_PENDING_CANCEL; /* depends on the pdu type */
+-	const uint8 DCERPC_PFC_FLAG_CONC_MPX		= 0x10; /* supports concurrent multiplexing of a single connection. */
+-	const uint8 DCERPC_PFC_FLAG_DID_NOT_EXECUTE	= 0x20; /* on a fault it means the server hasn't done anything */
+-	const uint8 DCERPC_PFC_FLAG_MAYBE		= 0x40; /* `maybe' call semantics requested */
+-	const uint8 DCERPC_PFC_FLAG_OBJECT_UUID		= 0x80; /* on valid guid is in the optional object field */
++	typedef [bitmap8bit] bitmap {
++		DCERPC_PFC_FLAG_FIRST		= 0x01, /* First fragment */
++		DCERPC_PFC_FLAG_LAST		= 0x02, /* Last fragment */
++		DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING = 0x04, /* depends on the pdu type */
++		DCERPC_PFC_FLAG_CONC_MPX	= 0x10, /* supports concurrent multiplexing of a single connection. */
++		DCERPC_PFC_FLAG_DID_NOT_EXECUTE	= 0x20, /* on a fault it means the server hasn't done anything */
++		DCERPC_PFC_FLAG_MAYBE		= 0x40, /* `maybe' call semantics requested */
++		DCERPC_PFC_FLAG_OBJECT_UUID	= 0x80 /* on valid guid is in the optional object field */
++	} dcerpc_pfc_flags;
++
++	/* Cancel was pending at sender */
++	const int DCERPC_PFC_FLAG_PENDING_CANCEL =
++		DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING;
++	const ist DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN =
++		DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING;
+ 
+ 	/* these offsets are needed by the signing code */
+ 	const uint8 DCERPC_PFC_OFFSET      =  3;
+@@ -468,6 +477,7 @@ interface dcerpc
+ 	const uint8 DCERPC_FRAG_LEN_OFFSET =  8;
+ 	const uint8 DCERPC_AUTH_LEN_OFFSET = 10;
+ 	const uint8 DCERPC_CALL_ID_OFFSET  = 12;
++	const uint8 DCERPC_NCACN_PAYLOAD_OFFSET = 16;
+ 
+ 	/* little-endian flag */
+ 	const uint8 DCERPC_DREP_LE  = 0x10;
+@@ -476,7 +486,7 @@ interface dcerpc
+ 		uint8 rpc_vers;	        /* RPC version */
+ 		uint8 rpc_vers_minor;   /* Minor version */
+ 		dcerpc_pkt_type ptype;  /* Packet type */
+-		uint8 pfc_flags;        /* Fragmentation flags */
++		dcerpc_pfc_flags pfc_flags; /* Fragmentation flags */
+ 		uint8 drep[4];	        /* NDR data representation */
+ 		uint16 frag_length;     /* Total length of fragment */
+ 		uint16 auth_length;     /* authenticator length */
+@@ -506,4 +516,69 @@ interface dcerpc
+ 		uint8 serial_low;
+ 		[switch_is(ptype)] dcerpc_payload u;
+ 	} ncadg_packet;
++
++	typedef [bitmap16bit] bitmap {
++		DCERPC_SEC_VT_COMMAND_ENUM  = 0x3FFF,
++		DCERPC_SEC_VT_COMMAND_END   = 0x4000,
++		DCERPC_SEC_VT_MUST_PROCESS  = 0x8000
++	} dcerpc_sec_vt_command;
++
++	typedef [enum16bit] enum {
++		DCERPC_SEC_VT_COMMAND_BITMASK1  = 0x0001,
++		DCERPC_SEC_VT_COMMAND_PCONTEXT  = 0x0002,
++		DCERPC_SEC_VT_COMMAND_HEADER2   = 0x0003
++	} dcerpc_sec_vt_command_enum;
++
++	typedef [bitmap32bit] bitmap {
++		DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING = 0x00000001
++	} dcerpc_sec_vt_bitmask1;
++
++	typedef struct {
++		ndr_syntax_id abstract_syntax;
++		ndr_syntax_id transfer_syntax;
++	} dcerpc_sec_vt_pcontext;
++
++	typedef struct {
++		dcerpc_pkt_type ptype;  /* Packet type */
++		[value(0)] uint8 reserved1;
++		[value(0)] uint16 reserved2;
++		uint8 drep[4];          /* NDR data representation */
++		uint32 call_id;         /* Call identifier */
++		uint16 context_id;
++		uint16 opnum;
++	} dcerpc_sec_vt_header2;
++
++	typedef [switch_type(dcerpc_sec_vt_command_enum),nodiscriminant] union {
++	[case(DCERPC_SEC_VT_COMMAND_BITMASK1)] dcerpc_sec_vt_bitmask1 bitmask1;
++	[case(DCERPC_SEC_VT_COMMAND_PCONTEXT)] dcerpc_sec_vt_pcontext pcontext;
++	[case(DCERPC_SEC_VT_COMMAND_HEADER2)] dcerpc_sec_vt_header2 header2;
++	[default,flag(NDR_REMAINING)] DATA_BLOB _unknown;
++	} dcerpc_sec_vt_union;
++
++	typedef struct {
++		dcerpc_sec_vt_command command;
++		[switch_is(command & DCERPC_SEC_VT_COMMAND_ENUM)]
++			[subcontext(2),flag(NDR_SUBCONTEXT_NO_UNREAD_BYTES)]
++			dcerpc_sec_vt_union u;
++	} dcerpc_sec_vt;
++
++	typedef [public,nopush,nopull] struct {
++		uint16 count;
++	} dcerpc_sec_vt_count;
++
++	/*
++	 * We assume that the whole verification trailer fits into
++	 * the last 1024 bytes after the stub data.
++	 *
++	 * There're currently only 3 commands defined and each should
++	 * only be used once.
++	 */
++	const uint16 DCERPC_SEC_VT_MAX_SIZE = 1024;
++
++	typedef [public,flag(NDR_PAHEX)] struct {
++		[flag(NDR_ALIGN4)] DATA_BLOB _pad;
++		[value(DCERPC_SEC_VT_MAGIC)] uint8 magic[8];
++		dcerpc_sec_vt_count count;
++		dcerpc_sec_vt commands[count.count];
++	} dcerpc_sec_verification_trailer;
+ }
+--- /dev/null
++++ b/librpc/ndr/ndr_dcerpc.c
+@@ -0,0 +1,187 @@
++/*
++   Unix SMB/CIFS implementation.
++
++   Manually parsed structures found in the DCERPC protocol
++
++   Copyright (C) Stefan Metzmacher 2014
++   Copyright (C) Gregor Beck 2014
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.
++*/
++
++#include "includes.h"
++#include "librpc/gen_ndr/ndr_dcerpc.h"
++
++#include "librpc/gen_ndr/ndr_misc.h"
++#include "lib/util/bitmap.h"
++
++const uint8_t DCERPC_SEC_VT_MAGIC[] = {0x8a,0xe3,0x13,0x71,0x02,0xf4,0x36,0x71};
++
++_PUBLIC_ enum ndr_err_code ndr_push_dcerpc_sec_vt_count(struct ndr_push *ndr, int ndr_flags, const struct dcerpc_sec_vt_count *r)
++{
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
++	/* nothing */
++	return NDR_ERR_SUCCESS;
++}
++
++_PUBLIC_ enum ndr_err_code ndr_pull_dcerpc_sec_vt_count(struct ndr_pull *ndr, int ndr_flags, struct dcerpc_sec_vt_count *r)
++{
++	uint32_t _saved_ofs = ndr->offset;
++
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
++
++	if (!(ndr_flags & NDR_SCALARS)) {
++		return NDR_ERR_SUCCESS;
++	}
++
++	r->count = 0;
++
++	while (true) {
++		uint16_t command;
++		uint16_t length;
++
++		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &command));
++		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &length));
++		NDR_CHECK(ndr_pull_advance(ndr, length));
++
++		r->count += 1;
++
++		if (command & DCERPC_SEC_VT_COMMAND_END) {
++			break;
++		}
++	}
++
++	ndr->offset = _saved_ofs;
++	return NDR_ERR_SUCCESS;
++}
++
++_PUBLIC_ enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer(
++	struct ndr_pull *ndr, TALLOC_CTX *mem_ctx,
++	struct dcerpc_sec_verification_trailer **_r)
++{
++	enum ndr_err_code ndr_err;
++	uint32_t ofs;
++	uint32_t min_ofs = 0;
++	struct dcerpc_sec_verification_trailer *r;
++	DATA_BLOB sub_blob = data_blob_null;
++	struct ndr_pull *sub_ndr = NULL;
++	uint32_t remaining;
++
++	*_r = NULL;
++
++	r = talloc_zero(mem_ctx, struct dcerpc_sec_verification_trailer);
++	if (r == NULL) {
++		return NDR_ERR_ALLOC;
++	}
++
++	if (ndr->data_size < sizeof(DCERPC_SEC_VT_MAGIC)) {
++		/*
++		 * we return with r->count = 0
++		 */
++		*_r = r;
++		return NDR_ERR_SUCCESS;
++	}
++
++	ofs = ndr->data_size - sizeof(DCERPC_SEC_VT_MAGIC);
++	/* the magic is 4 byte aligned */
++	ofs &= ~3;
++
++	if (ofs > DCERPC_SEC_VT_MAX_SIZE) {
++		/*
++		 * We just scan the last 1024 bytes.
++		 */
++		min_ofs = ofs - DCERPC_SEC_VT_MAX_SIZE;
++	} else {
++		min_ofs = 0;
++	}
++
++	while (true) {
++		int ret;
++
++		ret = memcmp(&ndr->data[ofs],
++			     DCERPC_SEC_VT_MAGIC,
++			     sizeof(DCERPC_SEC_VT_MAGIC));
++		if (ret == 0) {
++			sub_blob = data_blob_const(&ndr->data[ofs],
++						   ndr->data_size - ofs);
++			break;
++		}
++
++		if (ofs <= min_ofs) {
++			break;
++		}
++
++		ofs -= 4;
++	}
++
++	if (sub_blob.length == 0) {
++		/*
++		 * we return with r->count = 0
++		 */
++		*_r = r;
++		return NDR_ERR_SUCCESS;
++	}
++
++	sub_ndr = ndr_pull_init_blob(&sub_blob, r);
++	if (sub_ndr == NULL) {
++		TALLOC_FREE(r);
++		return NDR_ERR_ALLOC;
++	}
++
++	ndr_err = ndr_pull_dcerpc_sec_verification_trailer(sub_ndr,
++							   NDR_SCALARS | NDR_BUFFERS,
++							   r);
++	if (ndr_err == NDR_ERR_ALLOC) {
++		TALLOC_FREE(r);
++		return NDR_ERR_ALLOC;
++	}
++
++	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
++		goto ignore_error;
++	}
++
++	remaining = sub_ndr->data_size - sub_ndr->offset;
++	if (remaining > 16) {
++		/*
++		 * we expect not more than 16 byte of additional
++		 * padding after the verification trailer.
++		 */
++		goto ignore_error;
++	}
++
++	/*
++	 * We assume that we got a real verification trailer.
++	 *
++	 * We remove it from the available stub data.
++	 */
++	ndr->data_size = ofs;
++
++	TALLOC_FREE(sub_ndr);
++
++	*_r = r;
++	return NDR_ERR_SUCCESS;
++
++ignore_error:
++	TALLOC_FREE(sub_ndr);
++	/*
++	 * just ignore the error, it's likely
++	 * that the magic we found belongs to
++	 * the stub data.
++	 *
++	 * we return with r->count = 0
++	 */
++	ZERO_STRUCTP(r);
++	*_r = r;
++	return NDR_ERR_SUCCESS;
++}
+--- a/librpc/wscript_build
++++ b/librpc/wscript_build
+@@ -274,8 +274,9 @@ bld.SAMBA_SUBSYSTEM('NDR_COMPRESSION',
+ 	)
+ 
+ bld.SAMBA_SUBSYSTEM('NDR_DCERPC',
+-	source='gen_ndr/ndr_dcerpc.c',
++	source='gen_ndr/ndr_dcerpc.c ndr/ndr_dcerpc.c',
+ 	public_deps='ndr',
++	deps='bitmap',
+ 	public_headers='gen_ndr/ndr_dcerpc.h gen_ndr/dcerpc.h',
+ 	header_path= [ ('*gen_ndr*', 'gen_ndr') ],
+ 	)
+--- a/source3/Makefile.in
++++ b/source3/Makefile.in
+@@ -323,7 +323,8 @@ LIBNDR_OBJ = ../librpc/ndr/ndr_basic.o \
+ 	     ../librpc/ndr/uuid.o \
+ 	     librpc/ndr/util.o \
+ 	     librpc/gen_ndr/ndr_server_id.o \
+-	     librpc/gen_ndr/ndr_dcerpc.o
++	     librpc/gen_ndr/ndr_dcerpc.o \
++	     ../librpc/ndr/ndr_dcerpc.o
+ 
+ LIBNDR_GEN_OBJ0 = librpc/gen_ndr/ndr_samr.o \
+ 		  librpc/gen_ndr/ndr_lsa.o
+@@ -454,7 +455,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ
+ 	  lib/username.o \
+ 	  ../libds/common/flag_mapping.o \
+ 	  lib/access.o lib/smbrun.o \
+-	  lib/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \
++	  ../lib/util/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \
+ 	  lib/wins_srv.o \
+ 	  lib/util_str.o lib/clobber.o lib/util_sid.o \
+ 	  lib/util_unistr.o ../lib/util/charset/codepoints.o lib/util_file.o \
+@@ -987,7 +988,9 @@ SWAT_OBJ = $(SWAT_OBJ1) $(PARAM_OBJ) $(P
+ 	   $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \
+            $(PASSCHANGE_OBJ) $(FNAME_UTIL_OBJ) \
+ 	   $(LIBCLI_SAMR_OBJ) \
+-	   rpc_client/init_lsa.o
++	   $(LIBCLI_NETLOGON_OBJ) \
++	   rpc_client/init_lsa.o \
++	   rpc_client/init_netlogon.o
+ 
+ STATUS_OBJ = utils/status.o utils/status_profile.o \
+ 	     $(LOCKING_OBJ) $(PARAM_OBJ) \
+@@ -1003,7 +1006,9 @@ SMBTREE_OBJ = utils/smbtree.o $(PARAM_OB
+ 	     $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
+ 	     $(LIBMSRPC_GEN_OBJ) \
+ 	     $(LIBMSRPC_OBJ) \
+-	     $(LIBCLI_SRVSVC_OBJ)
++	     $(LIBCLI_SRVSVC_OBJ) \
++	     $(LIBCLI_NETLOGON_OBJ) \
++	     rpc_client/init_netlogon.o
+ 
+ TESTPARM_OBJ = utils/testparm.o \
+                $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
+@@ -1025,7 +1030,9 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASS
+ 		$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \
+ 		$(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \
+ 		$(LIBCLI_SAMR_OBJ) \
+-		rpc_client/init_lsa.o
++		$(LIBCLI_NETLOGON_OBJ) \
++		rpc_client/init_lsa.o \
++		rpc_client/init_netlogon.o
+ 
+ PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \
+ 		$(LIBSAMBA_OBJ) $(LIBTSOCKET_OBJ) \
+@@ -1098,7 +1105,9 @@ LIBSMBCLIENT_OBJ1 = $(LIBSMBCLIENT_OBJ0)
+ 		    $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \
+ 		    $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
+ 		    $(LIBCLI_SRVSVC_OBJ) \
+-		    $(LIBCLI_LSA_OBJ)
++		    $(LIBCLI_LSA_OBJ) \
++		    $(LIBCLI_NETLOGON_OBJ) \
++		    rpc_client/init_netlogon.o
+ 
+ LIBSMBCLIENT_OBJ = $(LIBSMBCLIENT_OBJ1)
+ 
+@@ -1121,7 +1130,9 @@ CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ)
+              $(READLINE_OBJ) $(POPT_LIB_OBJ) \
+              $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
+ 	     $(DISPLAY_SEC_OBJ) \
+-	     $(LIBCLI_SRVSVC_OBJ)
++	     $(LIBCLI_SRVSVC_OBJ) \
++	     $(LIBCLI_NETLOGON_OBJ) \
++	     rpc_client/init_netlogon.o
+ 
+ LIBSMBCONF_OBJ = ../lib/smbconf/smbconf.o \
+ 		 ../lib/smbconf/smbconf_util.o \
+@@ -1233,7 +1244,9 @@ SMBTORTURE_OBJ = $(SMBTORTURE_OBJ1) $(PA
+ 	@LIBWBCLIENT_STATIC@ \
+         torture/wbc_async.o \
+         ../nsswitch/wb_reqtrans.o \
+-	$(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBCLI_ECHO_OBJ)
++	$(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBCLI_ECHO_OBJ) \
++	$(LIBCLI_NETLOGON_OBJ) rpc_client/init_netlogon.o
++
+ 
+ MASKTEST_OBJ = torture/masktest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
+                  $(LIB_NONSMBD_OBJ) \
+@@ -1268,14 +1281,18 @@ SMBCACLS_OBJ = utils/smbcacls.o $(PARAM_
+ 		$(KRBCLIENT_OBJ) $(LIB_NONSMBD_OBJ) \
+ 		$(PASSDB_OBJ) $(GROUPDB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \
+ 		$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \
+-		$(LIBCLI_LSA_OBJ)
++		$(LIBCLI_LSA_OBJ) \
++		$(LIBCLI_NETLOGON_OBJ) \
++		rpc_client/init_netlogon.o
+ 
+ SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
+ 		$(PARAM_OBJ) \
+ 		$(LIB_NONSMBD_OBJ) \
+ 		$(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(POPT_LIB_OBJ) \
+ 		$(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
+-		$(LIBCLI_LSA_OBJ)
++		$(LIBCLI_LSA_OBJ) \
++		$(LIBCLI_NETLOGON_OBJ) \
++		rpc_client/init_netlogon.o
+ 
+ EVTLOGADM_OBJ0	= utils/eventlogadm.o
+ 
+--- a/librpc/ndr/ndr_basic.c
++++ b/librpc/ndr/ndr_basic.c
+@@ -61,6 +61,7 @@ _PUBLIC_ void ndr_check_padding(struct n
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_NEED_BYTES(ndr, 1);
+ 	*v = (int8_t)CVAL(ndr->data, ndr->offset);
+ 	ndr->offset += 1;
+@@ -72,6 +73,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int8
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_NEED_BYTES(ndr, 1);
+ 	*v = CVAL(ndr->data, ndr->offset);
+ 	ndr->offset += 1;
+@@ -83,6 +85,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 2);
+ 	NDR_PULL_NEED_BYTES(ndr, 2);
+ 	*v = (uint16_t)NDR_SVAL(ndr, ndr->offset);
+@@ -95,6 +98,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int1
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 2);
+ 	NDR_PULL_NEED_BYTES(ndr, 2);
+ 	*v = NDR_SVAL(ndr, ndr->offset);
+@@ -107,6 +111,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
+ 		uint32_t v32 = 0;
+ 		enum ndr_err_code err = ndr_pull_uint32(ndr, ndr_flags, &v32);
+@@ -125,6 +130,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 4);
+ 	NDR_PULL_NEED_BYTES(ndr, 4);
+ 	*v = NDR_IVALS(ndr, ndr->offset);
+@@ -137,6 +143,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int3
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 4);
+ 	NDR_PULL_NEED_BYTES(ndr, 4);
+ 	*v = NDR_IVAL(ndr, ndr->offset);
+@@ -151,6 +158,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
+ {
+ 	uint64_t v64;
+ 	enum ndr_err_code err;
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) {
+ 		return ndr_pull_uint32(ndr, ndr_flags, v);
+ 	}
+@@ -169,6 +177,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_double(struct ndr_pull *ndr, int ndr_flags, double *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 8);
+ 	NDR_PULL_NEED_BYTES(ndr, 8);
+ 	memcpy(v, ndr->data+ndr->offset, 8);
+@@ -217,6 +226,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_ref_
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 4);
+ 	NDR_PULL_NEED_BYTES(ndr, 8);
+ 	*v = NDR_IVAL(ndr, ndr->offset);
+@@ -230,6 +240,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_udlo
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, 4);
+ 	NDR_PULL_NEED_BYTES(ndr, 8);
+ 	*v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32;
+@@ -264,6 +275,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_hype
+ _PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
+ {
+ 	uintptr_t h;
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PULL_ALIGN(ndr, sizeof(h));
+ 	NDR_PULL_NEED_BYTES(ndr, sizeof(h));
+ 	memcpy(&h, ndr->data+ndr->offset, sizeof(h));
+@@ -278,6 +290,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_poin
+ _PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status)
+ {
+ 	uint32_t v;
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+ 	*status = NT_STATUS(v);
+ 	return NDR_ERR_SUCCESS;
+@@ -302,6 +315,7 @@ _PUBLIC_ void ndr_print_NTSTATUS(struct
+ _PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status)
+ {
+ 	uint32_t v;
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+ 	*status = W_ERROR(v);
+ 	return NDR_ERR_SUCCESS;
+@@ -414,6 +428,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_byte
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	if (!(ndr_flags & NDR_SCALARS)) {
+ 		return NDR_ERR_SUCCESS;
+ 	}
+@@ -425,6 +440,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_arra
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_NEED_BYTES(ndr, 1);
+ 	SCVAL(ndr->data, ndr->offset, (uint8_t)v);
+ 	ndr->offset += 1;
+@@ -436,6 +452,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int8
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_NEED_BYTES(ndr, 1);
+ 	SCVAL(ndr->data, ndr->offset, v);
+ 	ndr->offset += 1;
+@@ -447,6 +464,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 2);
+ 	NDR_PUSH_NEED_BYTES(ndr, 2);
+ 	NDR_SSVAL(ndr, ndr->offset, (uint16_t)v);
+@@ -459,6 +477,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int1
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 2);
+ 	NDR_PUSH_NEED_BYTES(ndr, 2);
+ 	NDR_SSVAL(ndr, ndr->offset, v);
+@@ -482,6 +501,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 4);
+ 	NDR_PUSH_NEED_BYTES(ndr, 4);
+ 	NDR_SIVALS(ndr, ndr->offset, v);
+@@ -494,6 +514,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int3
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 4);
+ 	NDR_PUSH_NEED_BYTES(ndr, 4);
+ 	NDR_SIVAL(ndr, ndr->offset, v);
+@@ -517,6 +538,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 4);
+ 	NDR_PUSH_NEED_BYTES(ndr, 8);
+ 	NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF));
+@@ -530,6 +552,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_udlo
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 4);
+ 	NDR_PUSH_NEED_BYTES(ndr, 8);
+ 	NDR_SIVAL(ndr, ndr->offset, (v>>32));
+@@ -563,6 +586,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_hype
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_double(struct ndr_push *ndr, int ndr_flags, double v)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, 8);
+ 	NDR_PUSH_NEED_BYTES(ndr, 8);
+ 	memcpy(ndr->data+ndr->offset, &v, 8);
+@@ -576,6 +600,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_doub
+ _PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
+ {
+ 	uintptr_t h = (intptr_t)v;
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_PUSH_ALIGN(ndr, sizeof(h));
+ 	NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
+ 	memcpy(ndr->data+ndr->offset, &h, sizeof(h));
+@@ -686,6 +711,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_zero
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	if (!(ndr_flags & NDR_SCALARS)) {
+ 		return NDR_ERR_SUCCESS;
+ 	}
+@@ -738,6 +764,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_ref_
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
+ 	return NDR_ERR_SUCCESS;
+ }
+@@ -747,6 +774,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_NTTI
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
+ 	return NDR_ERR_SUCCESS;
+ }
+@@ -756,6 +784,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	t /= 10000000;
+ 	NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
+ 	return NDR_ERR_SUCCESS;
+@@ -766,6 +795,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_NTTI
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
+ 	(*t) *= 10000000;
+ 	return NDR_ERR_SUCCESS;
+@@ -776,6 +806,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI
+ */
+ _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
+ {
++	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
+ 	return NDR_ERR_SUCCESS;
+ }
+@@ -785,6 +816,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
+ 	return NDR_ERR_SUCCESS;
+ }
+@@ -814,6 +846,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_time
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, int ndr_flags, uid_t u)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u);
+ }
+ 
+@@ -839,6 +872,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uid_
+ */
+ _PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, int ndr_flags, gid_t g)
+ {
++	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+ 	return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g);
+ }
+ 
+--- a/source3/lib/bitmap.c
++++ /dev/null
+@@ -1,136 +0,0 @@
+-/*
+-   Unix SMB/CIFS implementation.
+-   simple bitmap functions
+-   Copyright (C) Andrew Tridgell 1992-1998
+-
+-   This program is free software; you can redistribute it and/or modify
+-   it under the terms of the GNU General Public License as published by
+-   the Free Software Foundation; either version 3 of the License, or
+-   (at your option) any later version.
+-
+-   This program is distributed in the hope that it will be useful,
+-   but WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-   GNU General Public License for more details.
+-
+-   You should have received a copy of the GNU General Public License
+-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-*/
+-
+-#include "includes.h"
+-
+-/* these functions provide a simple way to allocate integers from a
+-   pool without repetition */
+-
+-/****************************************************************************
+-talloc a bitmap
+-****************************************************************************/
+-struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
+-{
+-	struct bitmap *bm;
+-
+-	bm = TALLOC_P(mem_ctx, struct bitmap);
+-
+-	if (!bm) return NULL;
+-
+-	bm->n = n;
+-	bm->b = TALLOC_ZERO_ARRAY(bm, uint32, (n+31)/32);
+-	if (!bm->b) {
+-		TALLOC_FREE(bm);
+-		return NULL;
+-	}
+-	return bm;
+-}
+-
+-/****************************************************************************
+-copy as much of the source bitmap as will fit in the destination bitmap.
+-****************************************************************************/
+-
+-int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src)
+-{
+-        int count = MIN(dst->n, src->n);
+-
+-        SMB_ASSERT(dst->b != src->b);
+-	memcpy(dst->b, src->b, sizeof(uint32)*((count+31)/32));
+-
+-        return count;
+-}
+-
+-/****************************************************************************
+-set a bit in a bitmap
+-****************************************************************************/
+-bool bitmap_set(struct bitmap *bm, unsigned i)
+-{
+-	if (i >= bm->n) {
+-		DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n",
+-		      i, bm->n));
+-		return False;
+-	}
+-	bm->b[i/32] |= (1<<(i%32));
+-	return True;
+-}
+-
+-/****************************************************************************
+-clear a bit in a bitmap
+-****************************************************************************/
+-bool bitmap_clear(struct bitmap *bm, unsigned i)
+-{
+-	if (i >= bm->n) {
+-		DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n",
+-		      i, bm->n));
+-		return False;
+-	}
+-	bm->b[i/32] &= ~(1<<(i%32));
+-	return True;
+-}
+-
+-/****************************************************************************
+-query a bit in a bitmap
+-****************************************************************************/
+-bool bitmap_query(struct bitmap *bm, unsigned i)
+-{
+-	if (i >= bm->n) return False;
+-	if (bm->b[i/32] & (1<<(i%32))) {
+-		return True;
+-	}
+-	return False;
+-}
+-
+-/****************************************************************************
+-find a zero bit in a bitmap starting at the specified offset, with
+-wraparound
+-****************************************************************************/
+-int bitmap_find(struct bitmap *bm, unsigned ofs)
+-{
+-	unsigned int i, j;
+-
+-	if (ofs > bm->n) ofs = 0;
+-
+-	i = ofs;
+-	while (i < bm->n) {
+-		if (~(bm->b[i/32])) {
+-			j = i;
+-			do {
+-				if (!bitmap_query(bm, j)) return j;
+-				j++;
+-			} while (j & 31 && j < bm->n);
+-		}
+-		i += 32;
+-		i &= ~31;
+-	}
+-
+-	i = 0;
+-	while (i < ofs) {
+-		if (~(bm->b[i/32])) {
+-			j = i;
+-			do {
+-				if (!bitmap_query(bm, j)) return j;
+-				j++;
+-			} while (j & 31 && j < bm->n);
+-		}
+-		i += 32;
+-		i &= ~31;
+-	}
+-
+-	return -1;
+-}
+--- /dev/null
++++ b/lib/util/bitmap.c
+@@ -0,0 +1,137 @@
++/*
++   Unix SMB/CIFS implementation.
++   simple bitmap functions
++   Copyright (C) Andrew Tridgell 1992-1998
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.
++*/
++
++#include "includes.h"
++#include "lib/util/bitmap.h"
++
++/* these functions provide a simple way to allocate integers from a
++   pool without repetition */
++
++/****************************************************************************
++talloc a bitmap
++****************************************************************************/
++struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
++{
++	struct bitmap *bm;
++
++	bm = talloc_zero(mem_ctx, struct bitmap);
++
++	if (!bm) return NULL;
++
++	bm->n = n;
++	bm->b = talloc_zero_array(bm, uint32_t, (n+31)/32);
++	if (!bm->b) {
++		TALLOC_FREE(bm);
++		return NULL;
++	}
++	return bm;
++}
++
++/****************************************************************************
++copy as much of the source bitmap as will fit in the destination bitmap.
++****************************************************************************/
++
++int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src)
++{
++        int count = MIN(dst->n, src->n);
++
++        SMB_ASSERT(dst->b != src->b);
++	memcpy(dst->b, src->b, sizeof(uint32_t)*((count+31)/32));
++
++        return count;
++}
++
++/****************************************************************************
++set a bit in a bitmap
++****************************************************************************/
++bool bitmap_set(struct bitmap *bm, unsigned i)
++{
++	if (i >= bm->n) {
++		DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n",
++		      i, bm->n));
++		return false;
++	}
++	bm->b[i/32] |= (1<<(i%32));
++	return true;
++}
++
++/****************************************************************************
++clear a bit in a bitmap
++****************************************************************************/
++bool bitmap_clear(struct bitmap *bm, unsigned i)
++{
++	if (i >= bm->n) {
++		DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n",
++		      i, bm->n));
++		return false;
++	}
++	bm->b[i/32] &= ~(1<<(i%32));
++	return true;
++}
++
++/****************************************************************************
++query a bit in a bitmap
++****************************************************************************/
++bool bitmap_query(struct bitmap *bm, unsigned i)
++{
++	if (i >= bm->n) return false;
++	if (bm->b[i/32] & (1<<(i%32))) {
++		return true;
++	}
++	return false;
++}
++
++/****************************************************************************
++find a zero bit in a bitmap starting at the specified offset, with
++wraparound
++****************************************************************************/
++int bitmap_find(struct bitmap *bm, unsigned ofs)
++{
++	unsigned int i, j;
++
++	if (ofs > bm->n) ofs = 0;
++
++	i = ofs;
++	while (i < bm->n) {
++		if (~(bm->b[i/32])) {
++			j = i;
++			do {
++				if (!bitmap_query(bm, j)) return j;
++				j++;
++			} while (j & 31 && j < bm->n);
++		}
++		i += 32;
++		i &= ~31;
++	}
++
++	i = 0;
++	while (i < ofs) {
++		if (~(bm->b[i/32])) {
++			j = i;
++			do {
++				if (!bitmap_query(bm, j)) return j;
++				j++;
++			} while (j & 31 && j < bm->n);
++		}
++		i += 32;
++		i &= ~31;
++	}
++
++	return -1;
++}
+--- /dev/null
++++ b/lib/util/bitmap.h
+@@ -0,0 +1,32 @@
++/*
++   Unix SMB/CIFS implementation.
++   simple bitmap functions
++   Copyright (C) Andrew Tridgell 1992-1998
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.
++*/
++
++/* The following definitions come from lib/bitmap.c  */
++
++struct bitmap {
++	uint32_t *b;
++	unsigned int n;
++};
++
++struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n);
++int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src);
++bool bitmap_set(struct bitmap *bm, unsigned i);
++bool bitmap_clear(struct bitmap *bm, unsigned i);
++bool bitmap_query(struct bitmap *bm, unsigned i);
++int bitmap_find(struct bitmap *bm, unsigned ofs);
+--- a/lib/util/wscript_build
++++ b/lib/util/wscript_build
+@@ -99,5 +99,11 @@ bld.SAMBA_LIBRARY('tdb-wrap',
+                   public_headers='tdb_wrap.h',
+                   private_library=True,
+                   local_include=False
+-                  )
++                 )
++
++bld.SAMBA_LIBRARY('bitmap',
++		  source='bitmap.c',
++		  deps='talloc samba-util',
++                  local_include=False,
++		  private_library=True)
+ 
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -61,15 +61,6 @@ const char *audit_description_str(uint32
+ bool get_audit_category_from_param(const char *param, uint32 *audit_category);
+ const char *audit_policy_str(TALLOC_CTX *mem_ctx, uint32 policy);
+ 
+-/* The following definitions come from lib/bitmap.c  */
+-
+-struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n);
+-int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src);
+-bool bitmap_set(struct bitmap *bm, unsigned i);
+-bool bitmap_clear(struct bitmap *bm, unsigned i);
+-bool bitmap_query(struct bitmap *bm, unsigned i);
+-int bitmap_find(struct bitmap *bm, unsigned ofs);
+-
+ /* The following definitions come from lib/charcnv.c  */
+ 
+ char lp_failed_convert_char(void);
+--- a/source3/include/smb.h
++++ b/source3/include/smb.h
+@@ -712,7 +712,6 @@ struct connections_data {
+ 	uint32 unused_compatitibility_field;
+ };
+ 
+-
+ /* the following are used by loadparm for option lists */
+ typedef enum {
+ 	P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,P_LIST,
+@@ -759,11 +758,6 @@ struct parm_struct {
+ #define FLAG_META	0x8000 /* A meta directive - not a real parameter */
+ #define FLAG_CMDLINE	0x10000 /* option has been overridden */
+ 
+-struct bitmap {
+-	uint32 *b;
+-	unsigned int n;
+-};
+-
+ /* offsets into message for common items */
+ #define smb_com 8
+ #define smb_rcls 9
+--- a/source3/modules/vfs_acl_common.c
++++ b/source3/modules/vfs_acl_common.c
+@@ -23,6 +23,7 @@
+ #include "system/filesys.h"
+ #include "../libcli/security/security.h"
+ #include "../librpc/gen_ndr/ndr_security.h"
++#include "../lib/util/bitmap.h"
+ 
+ static NTSTATUS create_acl_blob(const struct security_descriptor *psd,
+ 			DATA_BLOB *pblob,
+--- a/source3/modules/vfs_full_audit.c
++++ b/source3/modules/vfs_full_audit.c
+@@ -64,6 +64,7 @@
+ #include "../librpc/gen_ndr/ndr_netlogon.h"
+ #include "auth.h"
+ #include "ntioctl.h"
++#include "lib/util/bitmap.h"
+ 
+ static int vfs_full_audit_debug_level = DBGC_VFS;
+ 
+--- a/source3/param/loadparm.c
++++ b/source3/param/loadparm.c
+@@ -64,6 +64,7 @@
+ #include "smb_signing.h"
+ #include "dbwrap.h"
+ #include "smbldap.h"
++#include "../lib/util/bitmap.h"
+ 
+ #ifdef HAVE_SYS_SYSCTL_H
+ #include <sys/sysctl.h>
+--- a/source3/passdb/pdb_get_set.c
++++ b/source3/passdb/pdb_get_set.c
+@@ -25,6 +25,7 @@
+ #include "passdb.h"
+ #include "../libcli/auth/libcli_auth.h"
+ #include "../libcli/security/security.h"
++#include "../lib/util/bitmap.h"
+ 
+ #undef DBGC_CLASS
+ #define DBGC_CLASS DBGC_PASSDB
+--- a/source3/smbd/conn.c
++++ b/source3/smbd/conn.c
+@@ -23,6 +23,7 @@
+ #include "smbd/smbd.h"
+ #include "smbd/globals.h"
+ #include "rpc_server/rpc_ncacn_np.h"
++#include "lib/util/bitmap.h"
+ 
+ /* The connections bitmap is expanded in increments of BITMAP_BLOCK_SZ. The
+  * maximum size of the bitmap is the largest positive integer, but you will hit
+--- a/source3/smbd/dir.c
++++ b/source3/smbd/dir.c
+@@ -23,6 +23,7 @@
+ #include "smbd/smbd.h"
+ #include "smbd/globals.h"
+ #include "libcli/security/security.h"
++#include "lib/util/bitmap.h"
+ 
+ /*
+    This module implements directory related functions for Samba.
+--- a/source3/smbd/files.c
++++ b/source3/smbd/files.c
+@@ -22,6 +22,7 @@
+ #include "smbd/globals.h"
+ #include "libcli/security/security.h"
+ #include "util_tdb.h"
++#include "lib/util/bitmap.h"
+ 
+ #define VALID_FNUM(fnum)   (((fnum) >= 0) && ((fnum) < real_max_open_files))
+ 
+--- a/source3/smbd/smb2_server.c
++++ b/source3/smbd/smb2_server.c
+@@ -26,6 +26,7 @@
+ #include "../lib/tsocket/tsocket.h"
+ #include "../lib/util/tevent_ntstatus.h"
+ #include "smbprofile.h"
++#include "../lib/util/bitmap.h"
+ 
+ #define OUTVEC_ALLOC_SIZE (SMB2_HDR_BODY + 9)
+ 
+--- a/source3/rpc_client/cli_pipe.c
++++ b/source3/rpc_client/cli_pipe.c
+@@ -28,6 +28,7 @@
+ #include "../libcli/auth/ntlmssp.h"
+ #include "ntlmssp_wrap.h"
+ #include "librpc/gen_ndr/ndr_dcerpc.h"
++#include "librpc/gen_ndr/ndr_netlogon_c.h"
+ #include "librpc/rpc/dcerpc.h"
+ #include "librpc/crypto/gse.h"
+ #include "librpc/crypto/spnego.h"
+@@ -399,6 +400,7 @@ static NTSTATUS cli_pipe_validate_curren
+ 						struct ncacn_packet *pkt,
+ 						DATA_BLOB *pdu,
+ 						uint8_t expected_pkt_type,
++						uint32_t call_id,
+ 						DATA_BLOB *rdata,
+ 						DATA_BLOB *reply_pdu)
+ {
+@@ -497,7 +499,7 @@ static NTSTATUS cli_pipe_validate_curren
+ 			  "from %s!\n",
+ 			  (unsigned int)pkt->ptype,
+ 			  rpccli_pipe_txt(talloc_tos(), cli)));
+-		return NT_STATUS_INVALID_INFO_CLASS;
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
+ 	}
+ 
+ 	if (pkt->ptype != expected_pkt_type) {
+@@ -505,7 +507,15 @@ static NTSTATUS cli_pipe_validate_curren
+ 			  "RPC packet type - %u, not %u\n",
+ 			  rpccli_pipe_txt(talloc_tos(), cli),
+ 			  pkt->ptype, expected_pkt_type));
+-		return NT_STATUS_INVALID_INFO_CLASS;
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
++	if (pkt->call_id != call_id) {
++		DEBUG(3, (__location__ ": Connection to %s got an unexpected "
++			  "RPC call_id - %u, not %u\n",
++			  rpccli_pipe_txt(talloc_tos(), cli),
++			  pkt->call_id, call_id));
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
+ 	}
+ 
+ 	/* Do this just before return - we don't want to modify any rpc header
+@@ -898,6 +908,7 @@ static void rpc_api_pipe_got_pdu(struct
+ 						state->cli, state->pkt,
+ 						&state->incoming_frag,
+ 						state->expected_pkt_type,
++						state->call_id,
+ 						&rdata,
+ 						&state->reply_pdu);
+ 
+@@ -1269,12 +1280,17 @@ struct rpc_api_pipe_req_state {
+ 	uint32_t call_id;
+ 	DATA_BLOB *req_data;
+ 	uint32_t req_data_sent;
++	DATA_BLOB req_trailer;
++	uint32_t req_trailer_sent;
++	bool verify_bitmask1;
++	bool verify_pcontext;
+ 	DATA_BLOB rpc_out;
+ 	DATA_BLOB reply_pdu;
+ };
+ 
+ static void rpc_api_pipe_req_write_done(struct tevent_req *subreq);
+ static void rpc_api_pipe_req_done(struct tevent_req *subreq);
++static NTSTATUS prepare_verification_trailer(struct rpc_api_pipe_req_state *state);
+ static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state,
+ 				  bool *is_last_frag);
+ 
+@@ -1310,6 +1326,11 @@ struct tevent_req *rpc_api_pipe_req_send
+ 		goto post_status;
+ 	}
+ 
++	status = prepare_verification_trailer(state);
++	if (!NT_STATUS_IS_OK(status)) {
++		goto post_status;
++	}
++
+ 	status = prepare_next_frag(state, &is_last_frag);
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		goto post_status;
+@@ -1344,25 +1365,161 @@ struct tevent_req *rpc_api_pipe_req_send
+ 	return NULL;
+ }
+ 
++static NTSTATUS prepare_verification_trailer(struct rpc_api_pipe_req_state *state)
++{
++	struct pipe_auth_data *a = state->cli->auth;
++	struct dcerpc_sec_verification_trailer *t;
++	struct dcerpc_sec_vt *c = NULL;
++	struct ndr_push *ndr = NULL;
++	enum ndr_err_code ndr_err;
++	size_t align = 0;
++	size_t pad = 0;
++
++	if (a == NULL) {
++		return NT_STATUS_OK;
++	}
++
++	if (a->auth_level < DCERPC_AUTH_LEVEL_INTEGRITY) {
++		return NT_STATUS_OK;
++	}
++
++	t = talloc_zero(state, struct dcerpc_sec_verification_trailer);
++	if (t == NULL) {
++		return NT_STATUS_NO_MEMORY;
++	}
++
++	if (!a->verified_bitmask1) {
++		t->commands = talloc_realloc(t, t->commands,
++					     struct dcerpc_sec_vt,
++					     t->count.count + 1);
++		if (t->commands == NULL) {
++			return NT_STATUS_NO_MEMORY;
++		}
++		c = &t->commands[t->count.count++];
++		ZERO_STRUCTP(c);
++
++		c->command = DCERPC_SEC_VT_COMMAND_BITMASK1;
++		state->verify_bitmask1 = true;
++	}
++
++	if (!state->cli->verified_pcontext) {
++		t->commands = talloc_realloc(t, t->commands,
++					     struct dcerpc_sec_vt,
++					     t->count.count + 1);
++		if (t->commands == NULL) {
++			return NT_STATUS_NO_MEMORY;
++		}
++		c = &t->commands[t->count.count++];
++		ZERO_STRUCTP(c);
++
++		c->command = DCERPC_SEC_VT_COMMAND_PCONTEXT;
++		c->u.pcontext.abstract_syntax = state->cli->abstract_syntax;
++		c->u.pcontext.transfer_syntax = state->cli->transfer_syntax;
++
++		state->verify_pcontext = true;
++	}
++
++	if (true) { /* We do not support header signing */
++		t->commands = talloc_realloc(t, t->commands,
++					     struct dcerpc_sec_vt,
++					     t->count.count + 1);
++		if (t->commands == NULL) {
++			return NT_STATUS_NO_MEMORY;
++		}
++		c = &t->commands[t->count.count++];
++		ZERO_STRUCTP(c);
++
++		c->command = DCERPC_SEC_VT_COMMAND_HEADER2;
++		c->u.header2.ptype = DCERPC_PKT_REQUEST;
++		c->u.header2.drep[0] = DCERPC_DREP_LE;
++		c->u.header2.drep[1] = 0;
++		c->u.header2.drep[2] = 0;
++		c->u.header2.drep[3] = 0;
++		c->u.header2.call_id = state->call_id;
++		c->u.header2.context_id = 0;
++		c->u.header2.opnum = state->op_num;
++	}
++
++	if (t->count.count == 0) {
++		TALLOC_FREE(t);
++		return NT_STATUS_OK;
++	}
++
++	c = &t->commands[t->count.count - 1];
++	c->command |= DCERPC_SEC_VT_COMMAND_END;
++
++	if (DEBUGLEVEL >= 10) {
++		NDR_PRINT_DEBUG(dcerpc_sec_verification_trailer, t);
++	}
++
++	ndr = ndr_push_init_ctx(state);
++	if (ndr == NULL) {
++		return NT_STATUS_NO_MEMORY;
++	}
++
++	ndr_err = ndr_push_dcerpc_sec_verification_trailer(ndr,
++						NDR_SCALARS | NDR_BUFFERS,
++						t);
++	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
++		return ndr_map_error2ntstatus(ndr_err);
++	}
++	state->req_trailer = ndr_push_blob(ndr);
++
++	align = state->req_data->length & 0x3;
++	if (align > 0) {
++		pad = 4 - align;
++	}
++	if (pad > 0) {
++		bool ok;
++		uint8_t *p;
++		const uint8_t zeros[4] = { 0, };
++
++		ok = data_blob_append(ndr, &state->req_trailer, zeros, pad);
++		if (!ok) {
++			return NT_STATUS_NO_MEMORY;
++		}
++
++		/* move the padding to the start */
++		p = state->req_trailer.data;
++		memmove(p + pad, p, state->req_trailer.length - pad);
++		memset(p, 0, pad);
++	}
++
++	return NT_STATUS_OK;
++}
++
+ static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state,
+ 				  bool *is_last_frag)
+ {
+-	size_t data_sent_thistime;
+ 	size_t auth_len;
+ 	size_t frag_len;
+ 	uint8_t flags = 0;
+ 	size_t pad_len;
+ 	size_t data_left;
++	size_t data_thistime;
++	size_t trailer_left;
++	size_t trailer_thistime = 0;
++	size_t total_left;
++	size_t total_thistime;
+ 	NTSTATUS status;
++	bool ok;
+ 	union dcerpc_payload u;
+ 
+ 	data_left = state->req_data->length - state->req_data_sent;
++	trailer_left = state->req_trailer.length - state->req_trailer_sent;
++	total_left = data_left + trailer_left;
++	if ((total_left < data_left) || (total_left < trailer_left)) {
++		/*
++		 * overflow
++		 */
++		return NT_STATUS_INVALID_PARAMETER_MIX;
++	}
+ 
+ 	status = dcerpc_guess_sizes(state->cli->auth,
+-				    DCERPC_REQUEST_LENGTH, data_left,
++				    DCERPC_REQUEST_LENGTH, total_left,
+ 				    state->cli->max_xmit_frag,
+ 				    CLIENT_NDR_PADDING_SIZE,
+-				    &data_sent_thistime,
++				    &total_thistime,
+ 				    &frag_len, &auth_len, &pad_len);
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		return status;
+@@ -1372,15 +1529,20 @@ static NTSTATUS prepare_next_frag(struct
+ 		flags = DCERPC_PFC_FLAG_FIRST;
+ 	}
+ 
+-	if (data_sent_thistime == data_left) {
++	if (total_thistime == total_left) {
+ 		flags |= DCERPC_PFC_FLAG_LAST;
+ 	}
+ 
++	data_thistime = MIN(total_thistime, data_left);
++	if (data_thistime < total_thistime) {
++		trailer_thistime = total_thistime - data_thistime;
++	}
++
+ 	data_blob_free(&state->rpc_out);
+ 
+ 	ZERO_STRUCT(u.request);
+ 
+-	u.request.alloc_hint	= state->req_data->length;
++	u.request.alloc_hint	= total_left;
+ 	u.request.context_id	= 0;
+ 	u.request.opnum		= state->op_num;
+ 
+@@ -1400,11 +1562,26 @@ static NTSTATUS prepare_next_frag(struct
+ 	 * at this stage */
+ 	dcerpc_set_frag_length(&state->rpc_out, frag_len);
+ 
+-	/* Copy in the data. */
+-	if (!data_blob_append(NULL, &state->rpc_out,
++	if (data_thistime > 0) {
++		/* Copy in the data. */
++		ok = data_blob_append(NULL, &state->rpc_out,
+ 				state->req_data->data + state->req_data_sent,
+-				data_sent_thistime)) {
+-		return NT_STATUS_NO_MEMORY;
++				data_thistime);
++		if (!ok) {
++			return NT_STATUS_NO_MEMORY;
++		}
++		state->req_data_sent += data_thistime;
++	}
++
++	if (trailer_thistime > 0) {
++		/* Copy in the verification trailer. */
++		ok = data_blob_append(NULL, &state->rpc_out,
++				state->req_trailer.data + state->req_trailer_sent,
++				trailer_thistime);
++		if (!ok) {
++			return NT_STATUS_NO_MEMORY;
++		}
++		state->req_trailer_sent += trailer_thistime;
+ 	}
+ 
+ 	switch (state->cli->auth->auth_level) {
+@@ -1424,7 +1601,6 @@ static NTSTATUS prepare_next_frag(struct
+ 		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
+-	state->req_data_sent += data_sent_thistime;
+ 	*is_last_frag = ((flags & DCERPC_PFC_FLAG_LAST) != 0);
+ 
+ 	return status;
+@@ -1488,6 +1664,20 @@ static void rpc_api_pipe_req_done(struct
+ 		tevent_req_nterror(req, status);
+ 		return;
+ 	}
++
++	if (state->cli->auth == NULL) {
++		tevent_req_done(req);
++		return;
++	}
++
++	if (state->verify_bitmask1) {
++		state->cli->auth->verified_bitmask1 = true;
++	}
++
++	if (state->verify_pcontext) {
++		state->cli->verified_pcontext = true;
++	}
++
+ 	tevent_req_done(req);
+ }
+ 
+@@ -1647,9 +1837,15 @@ struct rpc_pipe_bind_state {
+ 	DATA_BLOB rpc_out;
+ 	bool auth3;
+ 	uint32_t rpc_call_id;
++	struct netr_Authenticator auth;
++	struct netr_Authenticator return_auth;
++	struct netlogon_creds_CredentialState *creds;
++	union netr_Capabilities capabilities;
++	struct netr_LogonGetCapabilities r;
+ };
+ 
+ static void rpc_pipe_bind_step_one_done(struct tevent_req *subreq);
++static void rpc_pipe_bind_step_two_trigger(struct tevent_req *req);
+ static NTSTATUS rpc_bind_next_send(struct tevent_req *req,
+ 				   struct rpc_pipe_bind_state *state,
+ 				   DATA_BLOB *credentials);
+@@ -1753,11 +1949,14 @@ static void rpc_pipe_bind_step_one_done(
+ 
+ 	case DCERPC_AUTH_TYPE_NONE:
+ 	case DCERPC_AUTH_TYPE_NCALRPC_AS_SYSTEM:
+-	case DCERPC_AUTH_TYPE_SCHANNEL:
+ 		/* Bind complete. */
+ 		tevent_req_done(req);
+ 		return;
+ 
++	case DCERPC_AUTH_TYPE_SCHANNEL:
++		rpc_pipe_bind_step_two_trigger(req);
++		return;
++
+ 	case DCERPC_AUTH_TYPE_NTLMSSP:
+ 	case DCERPC_AUTH_TYPE_SPNEGO:
+ 	case DCERPC_AUTH_TYPE_KRB5:
+@@ -1869,6 +2068,153 @@ err_out:
+ 	tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+ }
+ 
++static void rpc_pipe_bind_step_two_done(struct tevent_req *subreq);
++
++static void rpc_pipe_bind_step_two_trigger(struct tevent_req *req)
++{
++	struct rpc_pipe_bind_state *state =
++		tevent_req_data(req,
++				struct rpc_pipe_bind_state);
++	struct dcerpc_binding_handle *b = state->cli->binding_handle;
++	struct schannel_state *schannel_auth =
++		talloc_get_type_abort(state->cli->auth->auth_ctx,
++				      struct schannel_state);
++	struct tevent_req *subreq;
++
++	if (schannel_auth == NULL ||
++	    !ndr_syntax_id_equal(&state->cli->abstract_syntax,
++				 &ndr_table_netlogon.syntax_id)) {
++		tevent_req_done(req);
++		return;
++	}
++
++	ZERO_STRUCT(state->return_auth);
++
++	state->creds = netlogon_creds_copy(state, schannel_auth->creds);
++	if (state->creds == NULL) {
++		tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
++		return;
++	}
++
++	netlogon_creds_client_authenticator(state->creds, &state->auth);
++
++	state->r.in.server_name = state->cli->srv_name_slash;
++	state->r.in.computer_name = state->creds->computer_name;
++	state->r.in.credential = &state->auth;
++	state->r.in.query_level = 1;
++	state->r.in.return_authenticator = &state->return_auth;
++
++	state->r.out.capabilities = &state->capabilities;
++	state->r.out.return_authenticator = &state->return_auth;
++
++	subreq = dcerpc_netr_LogonGetCapabilities_r_send(talloc_tos(),
++							 state->ev,
++							 b,
++							 &state->r);
++	if (subreq == NULL) {
++		tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
++		return;
++	}
++
++	tevent_req_set_callback(subreq, rpc_pipe_bind_step_two_done, req);
++	return;
++}
++
++static void rpc_pipe_bind_step_two_done(struct tevent_req *subreq)
++{
++	struct tevent_req *req =
++		tevent_req_callback_data(subreq,
++					 struct tevent_req);
++	struct rpc_pipe_bind_state *state =
++		tevent_req_data(req,
++				struct rpc_pipe_bind_state);
++	struct schannel_state *schannel_auth =
++		talloc_get_type_abort(state->cli->auth->auth_ctx,
++				      struct schannel_state);
++	NTSTATUS status;
++
++	status = dcerpc_netr_LogonGetCapabilities_r_recv(subreq, talloc_tos());
++	TALLOC_FREE(subreq);
++	if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) {
++		if (state->cli->dc->negotiate_flags &
++		    NETLOGON_NEG_SUPPORTS_AES) {
++			DEBUG(5, ("AES is not supported and the error was %s\n",
++				  nt_errstr(status)));
++			tevent_req_nterror(req,
++					   NT_STATUS_INVALID_NETWORK_RESPONSE);
++			return;
++		}
++
++		/* This is probably NT */
++		DEBUG(5, ("We are checking against an NT - %s\n",
++			  nt_errstr(status)));
++		tevent_req_done(req);
++		return;
++	} else if (!NT_STATUS_IS_OK(status)) {
++		DEBUG(0, ("dcerpc_netr_LogonGetCapabilities_r_recv failed with %s\n",
++			  nt_errstr(status)));
++		tevent_req_nterror(req, status);
++		return;
++	}
++
++	if (NT_STATUS_EQUAL(state->r.out.result, NT_STATUS_NOT_IMPLEMENTED)) {
++		if (state->creds->negotiate_flags & NETLOGON_NEG_SUPPORTS_AES) {
++			/* This means AES isn't supported. */
++			DEBUG(5, ("AES is not supported and the error was %s\n",
++				  nt_errstr(state->r.out.result)));
++			tevent_req_nterror(req,
++					   NT_STATUS_INVALID_NETWORK_RESPONSE);
++			return;
++		}
++
++		/* This is probably an old Samba version */
++		DEBUG(5, ("We are checking against an old Samba version - %s\n",
++			  nt_errstr(state->r.out.result)));
++		tevent_req_done(req);
++		return;
++	}
++
++	/* We need to check the credential state here, cause win2k3 and earlier
++	 * returns NT_STATUS_NOT_IMPLEMENTED */
++	if (!netlogon_creds_client_check(state->creds,
++					 &state->r.out.return_authenticator->cred)) {
++		/*
++		 * Server replied with bad credential. Fail.
++		 */
++		DEBUG(0,("rpc_pipe_bind_step_two_done: server %s "
++			 "replied with bad credential\n",
++			 state->cli->desthost));
++		tevent_req_nterror(req, NT_STATUS_UNSUCCESSFUL);
++		return;
++	}
++
++	TALLOC_FREE(schannel_auth->creds);
++	schannel_auth->creds = talloc_steal(state->cli, state->creds);
++
++	if (!NT_STATUS_IS_OK(state->r.out.result)) {
++		DEBUG(0, ("dcerpc_netr_LogonGetCapabilities_r_recv failed with %s\n",
++			  nt_errstr(state->r.out.result)));
++		tevent_req_nterror(req, state->r.out.result);
++		return;
++	}
++
++	if (state->creds->negotiate_flags !=
++	    state->r.out.capabilities->server_capabilities) {
++		DEBUG(0, ("The client capabilities don't match the server "
++			  "capabilities: local[0x%08X] remote[0x%08X]\n",
++			  state->creds->negotiate_flags,
++			  state->capabilities.server_capabilities));
++		tevent_req_nterror(req,
++				   NT_STATUS_INVALID_NETWORK_RESPONSE);
++		return;
++	}
++
++	/* TODO: Add downgrade dectection. */
++
++	tevent_req_done(req);
++	return;
++}
++
+ static NTSTATUS rpc_bind_next_send(struct tevent_req *req,
+ 				   struct rpc_pipe_bind_state *state,
+ 				   DATA_BLOB *auth_token)
+--- a/source3/librpc/rpc/dcerpc.h
++++ b/source3/librpc/rpc/dcerpc.h
+@@ -39,6 +39,7 @@ struct NL_AUTH_MESSAGE;
+ struct pipe_auth_data {
+ 	enum dcerpc_AuthType auth_type;
+ 	enum dcerpc_AuthLevel auth_level;
++	bool verified_bitmask1;
+ 
+ 	void *auth_ctx;
+ 
+--- a/source3/rpc_client/rpc_client.h
++++ b/source3/rpc_client/rpc_client.h
+@@ -39,6 +39,7 @@ struct rpc_pipe_client {
+ 
+ 	struct ndr_syntax_id abstract_syntax;
+ 	struct ndr_syntax_id transfer_syntax;
++	bool verified_pcontext;
+ 
+ 	char *desthost;
+ 	char *srv_name_slash;
+--- /dev/null
++++ b/librpc/ndr/ndr_dcerpc.h
+@@ -0,0 +1,25 @@
++/*
++   Unix SMB/CIFS implementation.
++
++   Manually parsed structures found in the DCERPC protocol
++
++   Copyright (C) Stefan Metzmacher 2014
++   Copyright (C) Gregor Beck 2014
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.
++*/
++
++enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer(
++	struct ndr_pull *ndr, TALLOC_CTX *mem_ctx,
++	struct dcerpc_sec_verification_trailer **_r);
+--- /dev/null
++++ b/librpc/ABI/ndr-0.0.3.sigs
+@@ -0,0 +1,251 @@
++GUID_all_zero: bool (const struct GUID *)
++GUID_compare: int (const struct GUID *, const struct GUID *)
++GUID_equal: bool (const struct GUID *, const struct GUID *)
++GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
++GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
++GUID_from_string: NTSTATUS (const char *, struct GUID *)
++GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *)
++GUID_random: struct GUID (void)
++GUID_string: char *(TALLOC_CTX *, const struct GUID *)
++GUID_string2: char *(TALLOC_CTX *, const struct GUID *)
++GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *)
++GUID_zero: struct GUID (void)
++ndr_align_size: size_t (uint32_t, size_t)
++ndr_charset_length: uint32_t (const void *, charset_t)
++ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
++ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
++ndr_check_padding: void (struct ndr_pull *, size_t)
++ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t)
++ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t)
++ndr_get_array_length: uint32_t (struct ndr_pull *, const void *)
++ndr_get_array_size: uint32_t (struct ndr_pull *, const void *)
++ndr_map_error2errno: int (enum ndr_err_code)
++ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code)
++ndr_map_error2string: const char *(enum ndr_err_code)
++ndr_policy_handle_empty: bool (const struct policy_handle *)
++ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *)
++ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB)
++ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *)
++ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *)
++ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS)
++ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME)
++ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME)
++ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME)
++ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR)
++ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t)
++ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t)
++ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t)
++ndr_print_bool: void (struct ndr_print *, const char *, const bool)
++ndr_print_debug: void (ndr_print_fn_t, const char *, void *)
++ndr_print_debug_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *)
++ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_dlong: void (struct ndr_print *, const char *, int64_t)
++ndr_print_double: void (struct ndr_print *, const char *, double)
++ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t)
++ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *)
++ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *)
++ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *)
++ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t)
++ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t)
++ndr_print_int16: void (struct ndr_print *, const char *, int16_t)
++ndr_print_int32: void (struct ndr_print *, const char *, int32_t)
++ndr_print_int3264: void (struct ndr_print *, const char *, int32_t)
++ndr_print_int8: void (struct ndr_print *, const char *, int8_t)
++ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *)
++ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *)
++ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *)
++ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID)
++ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType)
++ndr_print_null: void (struct ndr_print *)
++ndr_print_pointer: void (struct ndr_print *, const char *, void *)
++ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *)
++ndr_print_printf_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_ptr: void (struct ndr_print *, const char *, const void *)
++ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t)
++ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *)
++ndr_print_string: void (struct ndr_print *, const char *, const char *)
++ndr_print_string_array: void (struct ndr_print *, const char *, const char **)
++ndr_print_string_helper: void (struct ndr_print *, const char *, ...)
++ndr_print_struct: void (struct ndr_print *, const char *, const char *)
++ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *)
++ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t)
++ndr_print_time_t: void (struct ndr_print *, const char *, time_t)
++ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *)
++ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *)
++ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t)
++ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t)
++ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t)
++ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t)
++ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t)
++ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t)
++ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t)
++ndr_print_union: void (struct ndr_print *, const char *, int, const char *)
++ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *)
++ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *)
++ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *)
++ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type)
++ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *)
++ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *)
++ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *)
++ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *)
++ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
++ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
++ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
++ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *)
++ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t)
++ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t)
++ndr_pull_append: enum ndr_err_code (struct ndr_pull *, DATA_BLOB *)
++ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t)
++ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t)
++ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
++ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
++ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *)
++ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *)
++ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
++ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...)
++ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
++ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *)
++ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *)
++ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *)
++ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
++ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *)
++ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *)
++ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *)
++ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *)
++ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **)
++ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **)
++ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *)
++ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *)
++ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *)
++ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **)
++ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *)
++ndr_pull_pop: enum ndr_err_code (struct ndr_pull *)
++ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
++ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
++ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *)
++ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t)
++ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
++ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
++ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *)
++ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **)
++ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***)
++ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
++ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
++ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t)
++ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t)
++ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *)
++ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *)
++ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *)
++ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t)
++ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
++ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
++ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *)
++ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
++ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
++ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
++ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t)
++ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
++ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
++ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *)
++ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *)
++ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB)
++ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *)
++ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *)
++ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS)
++ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME)
++ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME)
++ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME)
++ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR)
++ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t)
++ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t)
++ndr_push_blob: DATA_BLOB (struct ndr_push *)
++ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t)
++ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t)
++ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t)
++ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double)
++ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
++ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...)
++ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t)
++ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *)
++ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *)
++ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t)
++ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t)
++ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *)
++ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t)
++ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t)
++ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t)
++ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *)
++ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *)
++ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *)
++ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID)
++ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType)
++ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *)
++ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *)
++ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *)
++ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t)
++ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
++ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
++ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *)
++ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **)
++ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t)
++ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t)
++ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t)
++ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t)
++ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *)
++ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *)
++ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t)
++ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t)
++ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t)
++ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t)
++ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
++ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t)
++ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
++ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t)
++ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t)
++ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *)
++ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *)
++ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type)
++ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t)
++ndr_set_flags: void (uint32_t *, uint32_t)
++ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int)
++ndr_size_GUID: size_t (const struct GUID *, int)
++ndr_size_string: uint32_t (int, const char * const *, int)
++ndr_size_string_array: size_t (const char **, uint32_t, int)
++ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t)
++ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t)
++ndr_string_array_size: size_t (struct ndr_push *, const char *)
++ndr_string_length: uint32_t (const void *, uint32_t)
++ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *)
++ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *)
++ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0
++ndr_syntax_id_to_string: char *(TALLOC_CTX *, const struct ndr_syntax_id *)
++ndr_token_peek: uint32_t (struct ndr_token_list **, const void *)
++ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *)
++ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *, comparison_fn_t, bool)
++ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list **, const void *, uint32_t)
++ndr_transfer_syntax_ndr: uuid = {time_low = 2324192516, time_mid = 7403, time_hi_and_version = 4553, clock_seq = "\237\350", node = "\b\000+\020H`"}, if_version = 2
++ndr_transfer_syntax_ndr64: uuid = {time_low = 1903232307, time_mid = 48826, time_hi_and_version = 18743, clock_seq = "\203\031", node = "\265\333\357\234\314\066"}, if_version = 1
+--- a/librpc/ndr/ndr_misc.c
++++ b/librpc/ndr/ndr_misc.c
+@@ -35,3 +35,50 @@ bool ndr_syntax_id_equal(const struct nd
+ 	return GUID_equal(&i1->uuid, &i2->uuid)
+ 		&& (i1->if_version == i2->if_version);
+ }
++
++_PUBLIC_ char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id)
++{
++	return talloc_asprintf(mem_ctx,
++			       "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x",
++			       id->uuid.time_low, id->uuid.time_mid,
++			       id->uuid.time_hi_and_version,
++			       id->uuid.clock_seq[0],
++			       id->uuid.clock_seq[1],
++			       id->uuid.node[0], id->uuid.node[1],
++			       id->uuid.node[2], id->uuid.node[3],
++			       id->uuid.node[4], id->uuid.node[5],
++			       (unsigned)id->if_version);
++}
++
++_PUBLIC_ bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id)
++{
++	int ret;
++	size_t i;
++	uint32_t time_low;
++	uint32_t time_mid, time_hi_and_version;
++	uint32_t clock_seq[2];
++	uint32_t node[6];
++	uint32_t if_version;
++
++	ret = sscanf(s,
++		     "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x",
++		     &time_low, &time_mid, &time_hi_and_version,
++		     &clock_seq[0], &clock_seq[1],
++		     &node[0], &node[1], &node[2], &node[3], &node[4], &node[5],
++		     &if_version);
++	if (ret != 12) {
++		return false;
++	}
++
++	id->uuid.time_low = time_low;
++	id->uuid.time_mid = time_mid;
++	id->uuid.time_hi_and_version = time_hi_and_version;
++	id->uuid.clock_seq[0] = clock_seq[0];
++	id->uuid.clock_seq[1] = clock_seq[1];
++	for (i=0; i<6; i++) {
++		id->uuid.node[i] = node[i];
++	}
++	id->if_version = if_version;
++
++	return true;
++}
+--- a/librpc/rpc/dcerpc_util.c
++++ b/librpc/rpc/dcerpc_util.c
+@@ -27,6 +27,7 @@
+ #include "librpc/rpc/dcerpc.h"
+ #include "librpc/gen_ndr/ndr_dcerpc.h"
+ #include "rpc_common.h"
++#include "lib/util/bitmap.h"
+ 
+ /* we need to be able to get/set the fragment length without doing a full
+    decode */
+@@ -341,3 +342,194 @@ NTSTATUS dcerpc_read_ncacn_packet_recv(s
+ 	tevent_req_received(req);
+ 	return NT_STATUS_OK;
+ }
++
++struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt)
++{
++	struct dcerpc_sec_vt_header2 ret;
++
++	ZERO_STRUCT(ret);
++	ret.ptype = pkt->ptype;
++	memcpy(&ret.drep, pkt->drep, sizeof(ret.drep));
++	ret.call_id = pkt->call_id;
++
++	switch (pkt->ptype) {
++	case DCERPC_PKT_REQUEST:
++		ret.context_id = pkt->u.request.context_id;
++		ret.opnum      = pkt->u.request.opnum;
++		break;
++
++	case DCERPC_PKT_RESPONSE:
++		ret.context_id = pkt->u.response.context_id;
++		break;
++
++	case DCERPC_PKT_FAULT:
++		ret.context_id = pkt->u.fault.context_id;
++		break;
++
++	default:
++		break;
++	}
++
++	return ret;
++}
++
++bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1,
++				 const struct dcerpc_sec_vt_header2 *v2)
++{
++	if (v1->ptype != v2->ptype) {
++		return false;
++	}
++
++	if (memcmp(v1->drep, v2->drep, sizeof(v1->drep)) != 0) {
++		return false;
++	}
++
++	if (v1->call_id != v2->call_id) {
++		return false;
++	}
++
++	if (v1->context_id != v2->context_id) {
++		return false;
++	}
++
++	if (v1->opnum != v2->opnum) {
++		return false;
++	}
++
++	return true;
++}
++
++static bool dcerpc_sec_vt_is_valid(const struct dcerpc_sec_verification_trailer *r)
++{
++	bool ret = false;
++	TALLOC_CTX *frame = talloc_stackframe();
++	struct bitmap *commands_seen;
++	int i;
++
++	if (r->count.count == 0) {
++		ret = true;
++		goto done;
++	}
++
++	if (memcmp(r->magic, DCERPC_SEC_VT_MAGIC, sizeof(r->magic)) != 0) {
++		goto done;
++	}
++
++	commands_seen = bitmap_talloc(frame, DCERPC_SEC_VT_COMMAND_ENUM + 1);
++	if (commands_seen == NULL) {
++		goto done;
++	}
++
++	for (i=0; i < r->count.count; i++) {
++		enum dcerpc_sec_vt_command_enum cmd =
++			r->commands[i].command & DCERPC_SEC_VT_COMMAND_ENUM;
++
++		if (bitmap_query(commands_seen, cmd)) {
++			/* Each command must appear at most once. */
++			goto done;
++		}
++		bitmap_set(commands_seen, cmd);
++
++		switch (cmd) {
++		case DCERPC_SEC_VT_COMMAND_BITMASK1:
++		case DCERPC_SEC_VT_COMMAND_PCONTEXT:
++		case DCERPC_SEC_VT_COMMAND_HEADER2:
++			break;
++		default:
++			if ((r->commands[i].u._unknown.length % 4) != 0) {
++				goto done;
++			}
++			break;
++		}
++	}
++	ret = true;
++done:
++	TALLOC_FREE(frame);
++	return ret;
++}
++
++#define CHECK(msg, ok)						\
++do {								\
++	if (!ok) {						\
++		DEBUG(10, ("SEC_VT check %s failed\n", msg));	\
++		return false;					\
++	}							\
++} while(0)
++
++#define CHECK_SYNTAX(msg, s1, s2)					\
++do {								\
++	if (!ndr_syntax_id_equal(&s1, &s2)) {				\
++		TALLOC_CTX *frame = talloc_stackframe();		\
++		DEBUG(10, ("SEC_VT check %s failed: %s vs. %s\n", msg,	\
++			   ndr_syntax_id_to_string(frame, &s1),		\
++			   ndr_syntax_id_to_string(frame, &s1)));	\
++		TALLOC_FREE(frame);					\
++		return false;						\
++	}								\
++} while(0)
++
++
++bool dcerpc_sec_verification_trailer_check(
++		const struct dcerpc_sec_verification_trailer *vt,
++		const uint32_t *bitmask1,
++		const struct dcerpc_sec_vt_pcontext *pcontext,
++		const struct dcerpc_sec_vt_header2 *header2)
++{
++	size_t i;
++
++	if (!dcerpc_sec_vt_is_valid(vt)) {
++		return false;
++	}
++
++	for (i=0; i < vt->count.count; i++) {
++		struct dcerpc_sec_vt *c = &vt->commands[i];
++
++		switch (c->command & DCERPC_SEC_VT_COMMAND_ENUM) {
++		case DCERPC_SEC_VT_COMMAND_BITMASK1:
++			if (bitmask1 == NULL) {
++				CHECK("Bitmask1 must_process_command",
++				      !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
++				break;
++			}
++
++			if (c->u.bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING) {
++				CHECK("Bitmask1 client_header_signing",
++				      *bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING);
++			}
++			break;
++
++		case DCERPC_SEC_VT_COMMAND_PCONTEXT:
++			if (pcontext == NULL) {
++				CHECK("Pcontext must_process_command",
++				      !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
++				break;
++			}
++
++			CHECK_SYNTAX("Pcontect abstract_syntax",
++				     pcontext->abstract_syntax,
++				     c->u.pcontext.abstract_syntax);
++			CHECK_SYNTAX("Pcontext transfer_syntax",
++				     pcontext->transfer_syntax,
++				     c->u.pcontext.transfer_syntax);
++			break;
++
++		case DCERPC_SEC_VT_COMMAND_HEADER2: {
++			if (header2 == NULL) {
++				CHECK("Header2 must_process_command",
++				      !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
++				break;
++			}
++
++			CHECK("Header2", dcerpc_sec_vt_header2_equal(header2, &c->u.header2));
++			break;
++		}
++
++		default:
++			CHECK("Unknown must_process_command",
++			      !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
++			break;
++		}
++	}
++
++	return true;
++}
+--- a/librpc/rpc/rpc_common.h
++++ b/librpc/rpc/rpc_common.h
+@@ -296,4 +296,45 @@ NTSTATUS dcerpc_binding_handle_call(stru
+ 				    TALLOC_CTX *r_mem,
+ 				    void *r_ptr);
+ 
++/**
++ * Extract header information from a ncacn_packet
++ * as a dcerpc_sec_vt_header2 as used by the security verification trailer.
++ *
++ * @param[in] pkt a packet
++ *
++ * @return a dcerpc_sec_vt_header2
++ */
++struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt);
++
++
++/**
++ * Test if two dcerpc_sec_vt_header2 structures are equal
++ * without consideration of reserved fields.
++ *
++ * @param v1 a pointer to a dcerpc_sec_vt_header2 structure
++ * @param v2 a pointer to a dcerpc_sec_vt_header2 structure
++ *
++ * @retval true if *v1 equals *v2
++ */
++bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1,
++				 const struct dcerpc_sec_vt_header2 *v2);
++
++/**
++ * Check for consistency of the security verification trailer with the PDU header.
++ * See <a href="http://msdn.microsoft.com/en-us/library/cc243559.aspx">MS-RPCE 2.2.2.13</a>.
++ * A check with an empty trailer succeeds.
++ *
++ * @param[in] vt a pointer to the security verification trailer.
++ * @param[in] bitmask1 which flags were negotiated on the connection.
++ * @param[in] pcontext the syntaxes negotiatied for the presentation context.
++ * @param[in] header2 some fields from the PDU header.
++ *
++ * @retval true on success.
++ */
++bool dcerpc_sec_verification_trailer_check(
++		const struct dcerpc_sec_verification_trailer *vt,
++		const uint32_t *bitmask1,
++		const struct dcerpc_sec_vt_pcontext *pcontext,
++		const struct dcerpc_sec_vt_header2 *header2);
++
+ #endif /* __DEFAULT_LIBRPC_RPCCOMMON_H__ */
+--- a/source4/torture/ndr/ndr.c
++++ b/source4/torture/ndr/ndr.c
+@@ -29,40 +29,65 @@ struct ndr_pull_test_data {
+ 	DATA_BLOB data_context;
+ 	size_t struct_size;
+ 	ndr_pull_flags_fn_t pull_fn;
++	ndr_push_flags_fn_t push_fn;
+ 	int ndr_flags;
++	int flags;
+ };
+ 
+-static bool wrap_ndr_pull_test(struct torture_context *tctx,
+-			       struct torture_tcase *tcase,
+-			       struct torture_test *test)
++static bool wrap_ndr_pullpush_test(struct torture_context *tctx,
++				   struct torture_tcase *tcase,
++				   struct torture_test *test)
+ {
+ 	bool (*check_fn) (struct torture_context *ctx, void *data) = test->fn;
+ 	const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data;
+-	void *ds = talloc_zero_size(tctx, data->struct_size);
+ 	struct ndr_pull *ndr = ndr_pull_init_blob(&(data->data), tctx);
++	void *ds = talloc_zero_size(ndr, data->struct_size);
++	bool ret;
++	uint32_t highest_ofs;
++
++	ndr->flags |= data->flags;
+ 
+ 	ndr->flags |= LIBNDR_FLAG_REF_ALLOC;
+ 
+ 	torture_assert_ndr_success(tctx, data->pull_fn(ndr, data->ndr_flags, ds),
+ 				   "pulling");
+ 
+-	torture_assert(tctx, ndr->offset == ndr->data_size,
++	if (ndr->offset > ndr->relative_highest_offset) {
++		highest_ofs = ndr->offset;
++	} else {
++		highest_ofs = ndr->relative_highest_offset;
++	}
++
++	torture_assert(tctx, highest_ofs == ndr->data_size,
+ 				   talloc_asprintf(tctx,
+-					   "%d unread bytes", ndr->data_size - ndr->offset));
++					   "%d unread bytes", ndr->data_size - highest_ofs));
+ 
+-	if (check_fn != NULL)
+-		return check_fn(tctx, ds);
+-	else
+-		return true;
++	if (check_fn != NULL) {
++		ret = check_fn(tctx, ds);
++	} else {
++		ret = true;
++	}
++
++	if (data->push_fn != NULL) {
++		DATA_BLOB outblob;
++		torture_assert_ndr_success(tctx, ndr_push_struct_blob(&outblob, ndr, ds, data->push_fn), "pushing");
++		torture_assert_data_blob_equal(tctx, outblob, data->data, "ndr push compare");
++	}
++
++	talloc_free(ndr);
++	return ret;
+ }
+ 
+-_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test(
+-					struct torture_suite *suite,
+-					const char *name, ndr_pull_flags_fn_t pull_fn,
+-					DATA_BLOB db,
+-					size_t struct_size,
+-					int ndr_flags,
+-					bool (*check_fn) (struct torture_context *ctx, void *data))
++_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test(
++	struct torture_suite *suite,
++	const char *name,
++	ndr_pull_flags_fn_t pull_fn,
++	ndr_push_flags_fn_t push_fn,
++	DATA_BLOB db,
++	size_t struct_size,
++	int ndr_flags,
++	int flags,
++	bool (*check_fn) (struct torture_context *ctx, void *data))
+ {
+ 	struct torture_test *test;
+ 	struct torture_tcase *tcase;
+@@ -74,12 +99,16 @@ _PUBLIC_ struct torture_test *_torture_s
+ 
+ 	test->name = talloc_strdup(test, name);
+ 	test->description = NULL;
+-	test->run = wrap_ndr_pull_test;
++	test->run = wrap_ndr_pullpush_test;
++
+ 	data = talloc(test, struct ndr_pull_test_data);
+ 	data->data = db;
+ 	data->ndr_flags = ndr_flags;
++	data->flags = flags;
+ 	data->struct_size = struct_size;
+ 	data->pull_fn = pull_fn;
++	data->push_fn = push_fn;
++
+ 	test->data = data;
+ 	test->fn = check_fn;
+ 	test->dangerous = false;
+@@ -89,6 +118,7 @@ _PUBLIC_ struct torture_test *_torture_s
+ 	return test;
+ }
+ 
++
+ static bool wrap_ndr_inout_pull_test(struct torture_context *tctx,
+ 				     struct torture_tcase *tcase,
+ 				     struct torture_test *test)
+@@ -97,6 +127,7 @@ static bool wrap_ndr_inout_pull_test(str
+ 	const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data;
+ 	void *ds = talloc_zero_size(tctx, data->struct_size);
+ 	struct ndr_pull *ndr;
++	uint32_t highest_ofs;
+ 
+ 	/* handle NDR_IN context */
+ 
+@@ -109,8 +140,14 @@ static bool wrap_ndr_inout_pull_test(str
+ 		data->pull_fn(ndr, NDR_IN, ds),
+ 		"ndr pull of context failed");
+ 
+-	torture_assert(tctx, ndr->offset == ndr->data_size,
+-		talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset));
++	if (ndr->offset > ndr->relative_highest_offset) {
++		highest_ofs = ndr->offset;
++	} else {
++		highest_ofs = ndr->relative_highest_offset;
++	}
++
++	torture_assert(tctx, highest_ofs == ndr->data_size,
++		talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs));
+ 
+ 	talloc_free(ndr);
+ 
+@@ -125,8 +162,14 @@ static bool wrap_ndr_inout_pull_test(str
+ 		data->pull_fn(ndr, NDR_OUT, ds),
+ 		"ndr pull failed");
+ 
+-	torture_assert(tctx, ndr->offset == ndr->data_size,
+-		talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset));
++	if (ndr->offset > ndr->relative_highest_offset) {
++		highest_ofs = ndr->offset;
++	} else {
++		highest_ofs = ndr->relative_highest_offset;
++	}
++
++	torture_assert(tctx, highest_ofs == ndr->data_size,
++		talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs));
+ 
+ 	talloc_free(ndr);
+ 
+--- a/source4/torture/ndr/ndr.h
++++ b/source4/torture/ndr/ndr.h
+@@ -24,12 +24,15 @@
+ #include "librpc/ndr/libndr.h"
+ #include "libcli/security/security.h"
+ 
+-_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test(
++_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test(
+ 					struct torture_suite *suite,
+-					const char *name, ndr_pull_flags_fn_t fn,
++					const char *name,
++					ndr_pull_flags_fn_t pull_fn,
++					ndr_push_flags_fn_t push_fn,
+ 					DATA_BLOB db,
+ 					size_t struct_size,
+ 					int ndr_flags,
++					int flags,
+ 					bool (*check_fn) (struct torture_context *, void *data));
+ 
+ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test(
+@@ -41,20 +44,32 @@ _PUBLIC_ struct torture_test *_torture_s
+ 					bool (*check_fn) (struct torture_context *ctx, void *data));
+ 
+ #define torture_suite_add_ndr_pull_test(suite,name,data,check_fn) \
+-		_torture_suite_add_ndr_pull_test(suite, #name, \
+-			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \
+-			 sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, (bool (*) (struct torture_context *, void *)) check_fn);
++		_torture_suite_add_ndr_pullpush_test(suite, #name, \
++			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \
++			 sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn);
+ 
+ #define torture_suite_add_ndr_pull_fn_test(suite,name,data,flags,check_fn) \
+-		_torture_suite_add_ndr_pull_test(suite, #name "_" #flags, \
+-			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \
+-			 sizeof(struct name), flags, (bool (*) (struct torture_context *, void *)) check_fn);
++		_torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags, \
++			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \
++			 sizeof(struct name), flags, 0, (bool (*) (struct torture_context *, void *)) check_fn);
++
++#define torture_suite_add_ndr_pull_fn_test_flags(suite,name,data,flags,flags2,check_fn) \
++		_torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags "_" #flags2, \
++			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \
++			 sizeof(struct name), flags, flags2, (bool (*) (struct torture_context *, void *)) check_fn);
++
++#define torture_suite_add_ndr_pullpush_test(suite,name,data_blob,check_fn) \
++		_torture_suite_add_ndr_pullpush_test(suite, #name, \
++			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, \
++			 (ndr_push_flags_fn_t)ndr_push_ ## name, \
++			 data_blob, \
++			 sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn);
+ 
+ #define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \
+ 		_torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT", \
+ 			 (ndr_pull_flags_fn_t)ndr_pull_ ## name, \
+-			 data_blob_talloc(suite, data_in, sizeof(data_in)), \
+-			 data_blob_talloc(suite, data_out, sizeof(data_out)), \
++			 data_blob_const(data_in, sizeof(data_in)), \
++			 data_blob_const(data_out, sizeof(data_out)), \
+ 			 sizeof(struct name), \
+ 			 (bool (*) (struct torture_context *, void *)) check_fn_out);
+ 
+--- a/source4/torture/ndr/dfsblob.c
++++ b/source4/torture/ndr/dfsblob.c
+@@ -74,11 +74,11 @@ struct torture_suite *ndr_dfsblob_suite(
+ {
+ 	struct torture_suite *suite = torture_suite_create(ctx, "dfsblob");
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, dfs_GetDFSReferral_in, dfs_get_ref_in, NDR_IN, NULL);
++	torture_suite_add_ndr_pull_test(suite, dfs_GetDFSReferral_in, dfs_get_ref_in, NULL);
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, dfs_referral_resp, dfs_get_ref_out2, NDR_BUFFERS|NDR_SCALARS, NULL);
++	torture_suite_add_ndr_pull_test(suite, dfs_referral_resp, dfs_get_ref_out2, NULL);
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, dfs_referral_resp, dfs_get_ref_out, NDR_BUFFERS|NDR_SCALARS,dfs_referral_out_check);
++	torture_suite_add_ndr_pull_test(suite, dfs_referral_resp, dfs_get_ref_out,dfs_referral_out_check);
+ 
+ 	return suite;
+ }
+--- a/source4/torture/ndr/nbt.c
++++ b/source4/torture/ndr/nbt.c
+@@ -62,9 +62,9 @@ struct torture_suite *ndr_nbt_suite(TALL
+ {
+ 	struct torture_suite *suite = torture_suite_create(ctx, "nbt");
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, nbt_netlogon_packet, netlogon_logon_request_req_data, NDR_IN, netlogon_logon_request_req_check);
++	torture_suite_add_ndr_pull_test(suite, nbt_netlogon_packet, netlogon_logon_request_req_data, netlogon_logon_request_req_check);
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, nbt_netlogon_response2, netlogon_logon_request_resp_data, NDR_IN, netlogon_logon_request_resp_check);
++	torture_suite_add_ndr_pull_test(suite, nbt_netlogon_response2, netlogon_logon_request_resp_data, netlogon_logon_request_resp_check);
+ 
+ 	return suite;
+ }
+--- a/source4/torture/ndr/ntlmssp.c
++++ b/source4/torture/ndr/ntlmssp.c
+@@ -111,9 +111,10 @@ struct torture_suite *ndr_ntlmssp_suite(
+ {
+ 	struct torture_suite *suite = torture_suite_create(ctx, "ntlmssp");
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, NEGOTIATE_MESSAGE, ntlmssp_NEGOTIATE_MESSAGE_data, NDR_IN, ntlmssp_NEGOTIATE_MESSAGE_check);
+-	/* torture_suite_add_ndr_pull_fn_test(suite, CHALLENGE_MESSAGE, ntlmssp_CHALLENGE_MESSAGE_data, NDR_IN, ntlmssp_CHALLENGE_MESSAGE_check);
+-	torture_suite_add_ndr_pull_fn_test(suite, AUTHENTICATE_MESSAGE, ntlmssp_AUTHENTICATE_MESSAGE_data, NDR_IN, ntlmssp_AUTHENTICATE_MESSAGE_check); */
+-
++	torture_suite_add_ndr_pull_test(suite, NEGOTIATE_MESSAGE, ntlmssp_NEGOTIATE_MESSAGE_data, ntlmssp_NEGOTIATE_MESSAGE_check);
++#if 0
++	torture_suite_add_ndr_pull_test(suite, CHALLENGE_MESSAGE, ntlmssp_CHALLENGE_MESSAGE_data, ntlmssp_CHALLENGE_MESSAGE_check);
++	torture_suite_add_ndr_pull_test(suite, AUTHENTICATE_MESSAGE, ntlmssp_AUTHENTICATE_MESSAGE_data, ntlmssp_AUTHENTICATE_MESSAGE_check);
++#endif
+ 	return suite;
+ }
+--- a/source4/torture/ndr/drsblobs.c
++++ b/source4/torture/ndr/drsblobs.c
+@@ -115,6 +115,34 @@ static const uint8_t trust_domain_passwo
+ 	0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00
+ };
+ 
++/* these are taken from the trust objects of a w2k8r2 forest, with a
++ * trust relationship between the forest parent and a child domain
++ */
++static const char *trustAuthIncoming =
++"AQAAAAwAAAAcAQAASuQ+RXJdzAECAAAAAAEAAMOWL6UVfVKiJOUsGcT03H"
++"jHxr2ACsMMOV5ynM617Tp7idNC+c4egdqk4S9YEpvR2YvHmdZdymL6F7QKm8OkXazYZF2r/gZ/bI+"
++"jkWbsn4O8qyAc3OUKQRZwBbf+lxBW+vM4O3ZpUjz5BSKCcFQgM+MY91yVU8Nji3HNnvGnDquobFAZ"
++"hxjL+S1l5+QZgkfyfv5mQScGRbU1Lar1xg9G3JznUb7S6pvrBO2nwK8g+KZBfJy5UeULigDH4IWo/"
++"JmtaEGkKE2uiKIjdsEQd/uwnkouW26XzRc0ulfJnPFftGnT9KIcShPf7DLj/tstmQAAceRMFHJTY3"
++"PmxoowoK8HUyBK5D5Fcl3MAQIAAAAAAQAAw5YvpRV9UqIk5SwZxPTceMfGvYAKwww5XnKczrXtOnu"
++"J00L5zh6B2qThL1gSm9HZi8eZ1l3KYvoXtAqbw6RdrNhkXav+Bn9sj6ORZuyfg7yrIBzc5QpBFnAF"
++"t/6XEFb68zg7dmlSPPkFIoJwVCAz4xj3XJVTw2OLcc2e8acOq6hsUBmHGMv5LWXn5BmCR/J+/mZBJ"
++"wZFtTUtqvXGD0bcnOdRvtLqm+sE7afAryD4pkF8nLlR5QuKAMfghaj8ma1oQaQoTa6IoiN2wRB3+7"
++"CeSi5bbpfNFzS6V8mc8V+0adP0ohxKE9/sMuP+2y2ZAABx5EwUclNjc+bGijCgrwdTIA==";
++
++static const char *trustAuthOutgoing =
++"AQAAAAwAAAAcAQAASuQ+RXJdzAECAAAAAAEAAMOWL6UVfVKiJOUsGcT03H"
++"jHxr2ACsMMOV5ynM617Tp7idNC+c4egdqk4S9YEpvR2YvHmdZdymL6F7QKm8OkXazYZF2r/gZ/bI+"
++"jkWbsn4O8qyAc3OUKQRZwBbf+lxBW+vM4O3ZpUjz5BSKCcFQgM+MY91yVU8Nji3HNnvGnDquobFAZ"
++"hxjL+S1l5+QZgkfyfv5mQScGRbU1Lar1xg9G3JznUb7S6pvrBO2nwK8g+KZBfJy5UeULigDH4IWo/"
++"JmtaEGkKE2uiKIjdsEQd/uwnkouW26XzRc0ulfJnPFftGnT9KIcShPf7DLj/tstmQAAceRMFHJTY3"
++"PmxoowoK8HUyBK5D5Fcl3MAQIAAAAAAQAAw5YvpRV9UqIk5SwZxPTceMfGvYAKwww5XnKczrXtOnu"
++"J00L5zh6B2qThL1gSm9HZi8eZ1l3KYvoXtAqbw6RdrNhkXav+Bn9sj6ORZuyfg7yrIBzc5QpBFnAF"
++"t/6XEFb68zg7dmlSPPkFIoJwVCAz4xj3XJVTw2OLcc2e8acOq6hsUBmHGMv5LWXn5BmCR/J+/mZBJ"
++"wZFtTUtqvXGD0bcnOdRvtLqm+sE7afAryD4pkF8nLlR5QuKAMfghaj8ma1oQaQoTa6IoiN2wRB3+7"
++"CeSi5bbpfNFzS6V8mc8V+0adP0ohxKE9/sMuP+2y2ZAABx5EwUclNjc+bGijCgrwdTIA==";
++
++
+ static bool trust_domain_passwords_check_in(struct torture_context *tctx,
+ 					    struct trustDomainPasswords *r)
+ {
+@@ -154,8 +182,20 @@ struct torture_suite *ndr_drsblobs_suite
+ {
+ 	struct torture_suite *suite = torture_suite_create(ctx, "drsblobs");
+ 
+-	torture_suite_add_ndr_pull_fn_test(suite, ForestTrustInfo, forest_trust_info_data_out, NDR_IN, forest_trust_info_check_out);
+-	torture_suite_add_ndr_pull_fn_test(suite, trustDomainPasswords, trust_domain_passwords_in, NDR_IN, trust_domain_passwords_check_in);
++	torture_suite_add_ndr_pull_test(suite, ForestTrustInfo, forest_trust_info_data_out, forest_trust_info_check_out);
++	torture_suite_add_ndr_pull_test(suite, trustDomainPasswords, trust_domain_passwords_in, trust_domain_passwords_check_in);
++
++#if 0
++	torture_suite_add_ndr_pullpush_test(suite,
++					    trustAuthInOutBlob,
++					    base64_decode_data_blob_talloc(suite, trustAuthIncoming),
++					    NULL);
++
++	torture_suite_add_ndr_pullpush_test(suite,
++					    trustAuthInOutBlob,
++					    base64_decode_data_blob_talloc(suite, trustAuthOutgoing),
++					    NULL);
++#endif
+ 
+ 	return suite;
+ }
+--- a/source3/rpcclient/rpcclient.c
++++ b/source3/rpcclient/rpcclient.c
+@@ -1031,6 +1031,10 @@ out_free:
+ 		binding->transport = NCACN_NP;
+ 	}
+ 
++	if (binding->flags & DCERPC_CONNECT) {
++		pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
++		pipe_default_auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
++	}
+ 	if (binding->flags & DCERPC_SIGN) {
+ 		pipe_default_auth_level = DCERPC_AUTH_LEVEL_INTEGRITY;
+ 		pipe_default_auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
+@@ -1044,12 +1048,6 @@ out_free:
+ 		pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;
+ 	}
+ 	if (binding->flags & DCERPC_AUTH_NTLM) {
+-		/* If neither Integrity or Privacy are requested then
+-		 * Use just Connect level */
+-		if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
+-			pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
+-		}
+-
+ 		if (pipe_default_auth_type == DCERPC_AUTH_TYPE_SPNEGO) {
+ 			pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;
+ 		} else {
+@@ -1057,18 +1055,19 @@ out_free:
+ 		}
+ 	}
+ 	if (binding->flags & DCERPC_AUTH_KRB5) {
+-		/* If neither Integrity or Privacy are requested then
+-		 * Use just Connect level */
+-		if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
+-			pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
+-		}
+-
+ 		if (pipe_default_auth_type == DCERPC_AUTH_TYPE_SPNEGO) {
+ 			pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_KRB5;
+ 		} else {
+ 			pipe_default_auth_type = DCERPC_AUTH_TYPE_KRB5;
+ 		}
+ 	}
++	if (pipe_default_auth_type != DCERPC_AUTH_TYPE_NONE) {
++		/* If neither Integrity or Privacy are requested then
++		 * Use just Connect level */
++		if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
++			pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
++		}
++	}
+ 
+ 	if (get_cmdline_auth_info_use_kerberos(rpcclient_auth_info)) {
+ 		flags |= CLI_FULL_CONNECTION_USE_KERBEROS |
+--- /dev/null
++++ b/source3/script/tests/test_rpcclient.sh
+@@ -0,0 +1,19 @@
++#!/bin/sh
++
++if [ $# -lt 1 ]; then
++cat <<EOF
++Usage: test_rpcclient.sh ccache binding <rpcclient commands>
++EOF
++exit 1;
++fi
++
++KRB5CCNAME=$1
++shift 1
++export KRB5CCNAME
++ADDARGS="$*"
++
++incdir=`dirname $0`/../../../testprogs/blackbox
++. $incdir/subunit.sh
++testit "rpcclient" $VALGRIND $BINDIR/rpcclient -c 'getusername' $ADDARGS || failed=`expr $failed + 1`
++
++testok $0 $failed
+--- a/source3/selftest/tests.py
++++ b/source3/selftest/tests.py
+@@ -208,7 +208,7 @@ if sub.returncode == 0:
+             plansmbtorturetestsuite(t, "s3dc", '//$SERVER_IP/tmpcase -U$USERNAME%$PASSWORD')
+ 
+     test = 'rpc.lsa.lookupsids'
+-    auth_options = ["", "ntlm", "spnego" ]
++    auth_options = ["", "ntlm", "spnego", "spnego,ntlm" ]
+     signseal_options = ["", ",connect", ",sign", ",seal"]
+     smb_options = ["", ",smb2"]
+     endianness_options = ["", ",bigendian"]
+@@ -219,6 +219,9 @@ if sub.returncode == 0:
+                     binding_string = "ncacn_np:$SERVER_IP[%s%s%s%s]" % (a, s, z, e)
+                     options = binding_string + " -U$USERNAME%$PASSWORD"
+                     plansmbtorturetestsuite(test, "s3dc", options, 'over ncacn_np with [%s%s%s%s] ' % (a, s, z, e))
++                    plantestsuite("samba3.blackbox.rpcclient over ncacn_np with [%s%s%s%s] " % (a, s, z, e), "s3dc:local", [os.path.join(samba3srcdir, "script/tests/test_rpcclient.sh"),
++                                                                 "none", options, configuration])
++
+     for e in endianness_options:
+         for a in auth_options:
+             for s in signseal_options:
+--- a/source4/torture/rpc/rpc.c
++++ b/source4/torture/rpc/rpc.c
+@@ -501,6 +501,7 @@ NTSTATUS torture_rpc_init(void)
+ 	torture_suite_add_suite(suite, torture_rpc_samr_passwords_pwdlastset(suite));
+ 	torture_suite_add_suite(suite, torture_rpc_samr_passwords_badpwdcount(suite));
+ 	torture_suite_add_suite(suite, torture_rpc_samr_passwords_lockout(suite));
++	torture_suite_add_suite(suite, torture_rpc_samr_passwords_validate(suite));
+ 	torture_suite_add_suite(suite, torture_rpc_samr_user_privileges(suite));
+ 	torture_suite_add_suite(suite, torture_rpc_samr_large_dc(suite));
+ 	torture_suite_add_suite(suite, torture_rpc_epmapper(suite));
+--- a/source4/torture/rpc/samr.c
++++ b/source4/torture/rpc/samr.c
+@@ -7938,8 +7938,8 @@ static bool test_Connect(struct dcerpc_b
+ }
+ 
+ 
+-static bool test_samr_ValidatePassword(struct dcerpc_pipe *p,
+-				       struct torture_context *tctx)
++static bool test_samr_ValidatePassword(struct torture_context *tctx,
++				       struct dcerpc_pipe *p)
+ {
+ 	struct samr_ValidatePassword r;
+ 	union samr_ValidatePasswordReq req;
+@@ -7951,6 +7951,10 @@ static bool test_samr_ValidatePassword(s
+ 
+ 	torture_comment(tctx, "Testing samr_ValidatePassword\n");
+ 
++	if (p->conn->transport.transport != NCACN_IP_TCP) {
++		torture_comment(tctx, "samr_ValidatePassword only should succeed over NCACN_IP_TCP!\n");
++	}
++
+ 	ZERO_STRUCT(r);
+ 	r.in.level = NetValidatePasswordReset;
+ 	r.in.req = &req;
+@@ -8074,8 +8078,6 @@ bool torture_rpc_samr_passwords(struct t
+ 
+ 	ret &= test_samr_handle_Close(b, torture, &ctx->handle);
+ 
+-	ret &= test_samr_ValidatePassword(p, torture);
+-
+ 	return ret;
+ }
+ 
+@@ -8370,4 +8372,15 @@ struct torture_suite *torture_rpc_samr_p
+ 	return suite;
+ }
+ 
++struct torture_suite *torture_rpc_samr_passwords_validate(TALLOC_CTX *mem_ctx)
++{
++	struct torture_suite *suite = torture_suite_create(mem_ctx, "samr.passwords.validate");
++	struct torture_rpc_tcase *tcase;
++
++	tcase = torture_suite_add_rpc_iface_tcase(suite, "samr",
++						  &ndr_table_samr);
++	torture_rpc_tcase_add_test(tcase, "validate",
++				   test_samr_ValidatePassword);
+ 
++	return suite;
++}
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -42,6 +42,7 @@
+ #include "auth.h"
+ #include "ntdomain.h"
+ #include "rpc_server/srv_pipe.h"
++#include "../librpc/ndr/ndr_dcerpc.h"
+ 
+ #undef DBGC_CLASS
+ #define DBGC_CLASS DBGC_RPC_SRV
+@@ -202,7 +203,7 @@ bool create_next_pdu(struct pipes_struct
+ 	 * the pipe gets closed. JRA.
+ 	 */
+ 	if (p->fault_state) {
+-		setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
++		setup_fault_pdu(p, NT_STATUS(p->fault_state));
+ 		return true;
+ 	}
+ 
+@@ -336,7 +337,7 @@ static bool check_bind_req(struct pipes_
+ 	struct pipe_rpc_fns *context_fns;
+ 
+ 	DEBUG(3,("check_bind_req for %s\n",
+-		 get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
++		 get_pipe_name_from_syntax(talloc_tos(), abstract)));
+ 
+ 	/* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */
+ 	if (rpc_srv_pipe_exists_by_id(abstract) &&
+@@ -358,6 +359,7 @@ static bool check_bind_req(struct pipes_
+ 	context_fns->n_cmds = rpc_srv_get_pipe_num_cmds(abstract);
+ 	context_fns->cmds = rpc_srv_get_pipe_cmds(abstract);
+ 	context_fns->context_id = context_id;
++	context_fns->syntax = *abstract;
+ 
+ 	/* add to the list of open contexts */
+ 
+@@ -1541,7 +1543,42 @@ static PIPE_RPC_FNS* find_pipe_fns_by_co
+ }
+ 
+ static bool api_rpcTNP(struct pipes_struct *p, struct ncacn_packet *pkt,
+-		       const struct api_struct *api_rpc_cmds, int n_cmds);
++		       const struct api_struct *api_rpc_cmds, int n_cmds,
++		       const struct ndr_syntax_id *syntax);
++
++static bool srv_pipe_check_verification_trailer(struct pipes_struct *p,
++						struct ncacn_packet *pkt,
++						struct pipe_rpc_fns *pipe_fns)
++{
++	TALLOC_CTX *frame = talloc_stackframe();
++	struct dcerpc_sec_verification_trailer *vt = NULL;
++	const uint32_t bitmask1 = 0;
++	const struct dcerpc_sec_vt_pcontext pcontext = {
++		.abstract_syntax = pipe_fns->syntax,
++		.transfer_syntax = ndr_transfer_syntax,
++	};
++	const struct dcerpc_sec_vt_header2 header2 =
++	       dcerpc_sec_vt_header2_from_ncacn_packet(pkt);
++	struct ndr_pull *ndr;
++	enum ndr_err_code ndr_err;
++	bool ret = false;
++
++	ndr = ndr_pull_init_blob(&p->in_data.data, frame);
++	if (ndr == NULL) {
++		goto done;
++	}
++
++	ndr_err = ndr_pop_dcerpc_sec_verification_trailer(ndr, frame, &vt);
++	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
++		goto done;
++	}
++
++	ret = dcerpc_sec_verification_trailer_check(vt, &bitmask1,
++						    &pcontext, &header2);
++done:
++	TALLOC_FREE(frame);
++	return ret;
++}
+ 
+ /****************************************************************************
+  Find the correct RPC function to call for this request.
+@@ -1552,46 +1589,53 @@ static bool api_rpcTNP(struct pipes_stru
+ static bool api_pipe_request(struct pipes_struct *p,
+ 				struct ncacn_packet *pkt)
+ {
++	TALLOC_CTX *frame = talloc_stackframe();
+ 	bool ret = False;
+-	bool changed_user = False;
+ 	PIPE_RPC_FNS *pipe_fns;
+ 
+-	if (p->pipe_bound &&
+-	    ((p->auth.auth_type == DCERPC_AUTH_TYPE_NTLMSSP) ||
+-	     (p->auth.auth_type == DCERPC_AUTH_TYPE_KRB5) ||
+-	     (p->auth.auth_type == DCERPC_AUTH_TYPE_SPNEGO))) {
+-		if(!become_authenticated_pipe_user(p->session_info)) {
+-			data_blob_free(&p->out_data.rdata);
+-			return False;
+-		}
+-		changed_user = True;
++	if (!p->pipe_bound) {
++		DEBUG(1, ("Pipe not bound!\n"));
++		data_blob_free(&p->out_data.rdata);
++		TALLOC_FREE(frame);
++		return false;
+ 	}
+ 
+-	DEBUG(5, ("Requested \\PIPE\\%s\n",
+-		  get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
+-
+ 	/* get the set of RPC functions for this context */
+ 
+ 	pipe_fns = find_pipe_fns_by_context(p->contexts,
+ 					    pkt->u.request.context_id);
+-
+-	if ( pipe_fns ) {
+-		TALLOC_CTX *frame = talloc_stackframe();
+-		ret = api_rpcTNP(p, pkt, pipe_fns->cmds, pipe_fns->n_cmds);
++	if (pipe_fns == NULL) {
++		DEBUG(0, ("No rpc function table associated with context "
++			  "[%d]\n",
++			  pkt->u.request.context_id));
++		data_blob_free(&p->out_data.rdata);
+ 		TALLOC_FREE(frame);
++		return false;
+ 	}
+-	else {
+-		DEBUG(0, ("No rpc function table associated with context "
+-			  "[%d] on pipe [%s]\n",
+-			  pkt->u.request.context_id,
+-			  get_pipe_name_from_syntax(talloc_tos(),
+-						    &p->syntax)));
++
++	DEBUG(5, ("Requested \\PIPE\\%s\n",
++		  get_pipe_name_from_syntax(talloc_tos(), &pipe_fns->syntax)));
++
++	if (!srv_pipe_check_verification_trailer(p, pkt, pipe_fns)) {
++		DEBUG(1, ("srv_pipe_check_verification_trailer: failed\n"));
++		setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_ACCESS_DENIED));
++		data_blob_free(&p->out_data.rdata);
++		TALLOC_FREE(frame);
++		return true;
+ 	}
+ 
+-	if (changed_user) {
+-		unbecome_authenticated_pipe_user();
++	if (!become_authenticated_pipe_user(p->session_info)) {
++		DEBUG(1, ("Failed to become pipe user!\n"));
++		data_blob_free(&p->out_data.rdata);
++		TALLOC_FREE(frame);
++		return false;
+ 	}
+ 
++	ret = api_rpcTNP(p, pkt, pipe_fns->cmds, pipe_fns->n_cmds,
++			 &pipe_fns->syntax);
++	unbecome_authenticated_pipe_user();
++
++	TALLOC_FREE(frame);
+ 	return ret;
+ }
+ 
+@@ -1600,20 +1644,21 @@ static bool api_pipe_request(struct pipe
+  ********************************************************************/
+ 
+ static bool api_rpcTNP(struct pipes_struct *p, struct ncacn_packet *pkt,
+-		       const struct api_struct *api_rpc_cmds, int n_cmds)
++		       const struct api_struct *api_rpc_cmds, int n_cmds,
++		       const struct ndr_syntax_id *syntax)
+ {
+ 	int fn_num;
+ 	uint32_t offset1;
+ 
+ 	/* interpret the command */
+ 	DEBUG(4,("api_rpcTNP: %s op 0x%x - ",
+-		 get_pipe_name_from_syntax(talloc_tos(), &p->syntax),
++		 get_pipe_name_from_syntax(talloc_tos(), syntax),
+ 		 pkt->u.request.opnum));
+ 
+ 	if (DEBUGLEVEL >= 50) {
+ 		fstring name;
+ 		slprintf(name, sizeof(name)-1, "in_%s",
+-			 get_pipe_name_from_syntax(talloc_tos(), &p->syntax));
++			 get_pipe_name_from_syntax(talloc_tos(), syntax));
+ 		dump_pdu_region(name, pkt->u.request.opnum,
+ 				&p->in_data.data, 0,
+ 				p->in_data.data.length);
+@@ -1646,37 +1691,30 @@ static bool api_rpcTNP(struct pipes_stru
+ 	/* do the actual command */
+ 	if(!api_rpc_cmds[fn_num].fn(p)) {
+ 		DEBUG(0,("api_rpcTNP: %s: %s failed.\n",
+-			 get_pipe_name_from_syntax(talloc_tos(), &p->syntax),
++			 get_pipe_name_from_syntax(talloc_tos(), syntax),
+ 			 api_rpc_cmds[fn_num].name));
+ 		data_blob_free(&p->out_data.rdata);
+ 		return False;
+ 	}
+ 
+-	if (p->bad_handle_fault_state) {
+-		DEBUG(4,("api_rpcTNP: bad handle fault return.\n"));
+-		p->bad_handle_fault_state = False;
+-		setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_CONTEXT_MISMATCH));
+-		return True;
+-	}
+-
+-	if (p->rng_fault_state) {
+-		DEBUG(4, ("api_rpcTNP: rng fault return\n"));
+-		p->rng_fault_state = False;
+-		setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
+-		return True;
++	if (p->fault_state) {
++		DEBUG(4,("api_rpcTNP: fault(%d) return.\n", p->fault_state));
++		setup_fault_pdu(p, NT_STATUS(p->fault_state));
++		p->fault_state = 0;
++		return true;
+ 	}
+ 
+ 	if (DEBUGLEVEL >= 50) {
+ 		fstring name;
+ 		slprintf(name, sizeof(name)-1, "out_%s",
+-			 get_pipe_name_from_syntax(talloc_tos(), &p->syntax));
++			 get_pipe_name_from_syntax(talloc_tos(), syntax));
+ 		dump_pdu_region(name, pkt->u.request.opnum,
+ 				&p->out_data.rdata, offset1,
+ 				p->out_data.rdata.length);
+ 	}
+ 
+ 	DEBUG(5,("api_rpcTNP: called %s successfully\n",
+-		 get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
++		 get_pipe_name_from_syntax(talloc_tos(), syntax)));
+ 
+ 	/* Check for buffer underflow in rpc parsing */
+ 	if ((DEBUGLEVEL >= 10) &&
+@@ -1718,9 +1756,9 @@ void set_incoming_fault(struct pipes_str
+ 	data_blob_free(&p->in_data.data);
+ 	p->in_data.pdu_needed_len = 0;
+ 	p->in_data.pdu.length = 0;
+-	p->fault_state = True;
+-	DEBUG(10, ("set_incoming_fault: Setting fault state on pipe %s\n",
+-		   get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
++	p->fault_state = DCERPC_FAULT_CANT_PERFORM;
++
++	DEBUG(10, ("Setting fault state\n"));
+ }
+ 
+ static NTSTATUS dcesrv_auth_request(struct pipe_auth_data *auth,
+--- a/source3/include/ntdomain.h
++++ b/source3/include/ntdomain.h
+@@ -87,6 +87,7 @@ typedef struct pipe_rpc_fns {
+ 	const struct api_struct *cmds;
+ 	int n_cmds;
+ 	uint32 context_id;
++	struct ndr_syntax_id syntax;
+ 
+ } PIPE_RPC_FNS;
+ 
+@@ -134,22 +135,10 @@ struct pipes_struct {
+ 	bool pipe_bound;
+ 
+ 	/*
+-	 * Set to true when we should return fault PDU's for everything.
+-	 */
+-
+-	bool fault_state;
+-
+-	/*
+-	 * Set to true when we should return fault PDU's for a bad handle.
+-	 */
+-
+-	bool bad_handle_fault_state;
+-
+-	/*
+-	 * Set to true when the backend does not support a call.
++	 * Set the DCERPC_FAULT to return.
+ 	 */
+ 
+-	bool rng_fault_state;
++	int fault_state;
+ 
+ 	/*
+ 	 * Set to RPC_BIG_ENDIAN when dealing with big-endian PDU's
+--- a/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
++++ b/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
+@@ -183,7 +183,7 @@ sub ParseFunction($$)
+ 	);
+ 
+ 	pidl "";
+-	pidl "if (p->rng_fault_state) {";
++	pidl "if (p->fault_state) {";
+ 	pidl "\ttalloc_free(r);";
+ 	pidl "\t/* Return true here, srv_pipe_hnd.c will take care */";
+ 	pidl "\treturn true;";
+--- a/source3/rpc_server/dfs/srv_dfs_nt.c
++++ b/source3/rpc_server/dfs/srv_dfs_nt.c
+@@ -411,125 +411,125 @@ WERROR _dfs_GetInfo(struct pipes_struct
+ WERROR _dfs_SetInfo(struct pipes_struct *p, struct dfs_SetInfo *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_Rename(struct pipes_struct *p, struct dfs_Rename *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_Move(struct pipes_struct *p, struct dfs_Move *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_ManagerGetConfigInfo(struct pipes_struct *p, struct dfs_ManagerGetConfigInfo *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_ManagerSendSiteInfo(struct pipes_struct *p, struct dfs_ManagerSendSiteInfo *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_AddFtRoot(struct pipes_struct *p, struct dfs_AddFtRoot *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_RemoveFtRoot(struct pipes_struct *p, struct dfs_RemoveFtRoot *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_AddStdRoot(struct pipes_struct *p, struct dfs_AddStdRoot *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_RemoveStdRoot(struct pipes_struct *p, struct dfs_RemoveStdRoot *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_ManagerInitialize(struct pipes_struct *p, struct dfs_ManagerInitialize *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_AddStdRootForced(struct pipes_struct *p, struct dfs_AddStdRootForced *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_GetDcAddress(struct pipes_struct *p, struct dfs_GetDcAddress *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_SetDcAddress(struct pipes_struct *p, struct dfs_SetDcAddress *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_FlushFtTable(struct pipes_struct *p, struct dfs_FlushFtTable *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_Add2(struct pipes_struct *p, struct dfs_Add2 *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_Remove2(struct pipes_struct *p, struct dfs_Remove2 *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_EnumEx(struct pipes_struct *p, struct dfs_EnumEx *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _dfs_SetInfo2(struct pipes_struct *p, struct dfs_SetInfo2 *r)
+ {
+ 	/* FIXME: Implement your code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/dssetup/srv_dssetup_nt.c
++++ b/source3/rpc_server/dssetup/srv_dssetup_nt.c
+@@ -130,7 +130,7 @@ WERROR _dssetup_DsRoleGetPrimaryDomainIn
+ WERROR _dssetup_DsRoleDnsNameToFlatName(struct pipes_struct *p,
+ 					struct dssetup_DsRoleDnsNameToFlatName *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -140,7 +140,7 @@ WERROR _dssetup_DsRoleDnsNameToFlatName(
+ WERROR _dssetup_DsRoleDcAsDc(struct pipes_struct *p,
+ 			     struct dssetup_DsRoleDcAsDc *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -150,7 +150,7 @@ WERROR _dssetup_DsRoleDcAsDc(struct pipe
+ WERROR _dssetup_DsRoleDcAsReplica(struct pipes_struct *p,
+ 				  struct dssetup_DsRoleDcAsReplica *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -160,7 +160,7 @@ WERROR _dssetup_DsRoleDcAsReplica(struct
+ WERROR _dssetup_DsRoleDemoteDc(struct pipes_struct *p,
+ 			       struct dssetup_DsRoleDemoteDc *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -170,7 +170,7 @@ WERROR _dssetup_DsRoleDemoteDc(struct pi
+ WERROR _dssetup_DsRoleGetDcOperationProgress(struct pipes_struct *p,
+ 					     struct dssetup_DsRoleGetDcOperationProgress *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -180,7 +180,7 @@ WERROR _dssetup_DsRoleGetDcOperationProg
+ WERROR _dssetup_DsRoleGetDcOperationResults(struct pipes_struct *p,
+ 					    struct dssetup_DsRoleGetDcOperationResults *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -190,7 +190,7 @@ WERROR _dssetup_DsRoleGetDcOperationResu
+ WERROR _dssetup_DsRoleCancel(struct pipes_struct *p,
+ 			     struct dssetup_DsRoleCancel *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -200,7 +200,7 @@ WERROR _dssetup_DsRoleCancel(struct pipe
+ WERROR _dssetup_DsRoleServerSaveStateForUpgrade(struct pipes_struct *p,
+ 						struct dssetup_DsRoleServerSaveStateForUpgrade *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -210,7 +210,7 @@ WERROR _dssetup_DsRoleServerSaveStateFor
+ WERROR _dssetup_DsRoleUpgradeDownlevelServer(struct pipes_struct *p,
+ 					     struct dssetup_DsRoleUpgradeDownlevelServer *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -220,6 +220,6 @@ WERROR _dssetup_DsRoleUpgradeDownlevelSe
+ WERROR _dssetup_DsRoleAbortDownlevelServerUpgrade(struct pipes_struct *p,
+ 						  struct dssetup_DsRoleAbortDownlevelServerUpgrade *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/echo/srv_echo_nt.c
++++ b/source3/rpc_server/echo/srv_echo_nt.c
+@@ -87,13 +87,13 @@ void _echo_SourceData(struct pipes_struc
+ 
+ void _echo_TestCall(struct pipes_struct *p, struct echo_TestCall *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return;
+ }
+ 
+ NTSTATUS _echo_TestCall2(struct pipes_struct *p, struct echo_TestCall2 *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_OK;
+ }
+ 
+@@ -105,18 +105,18 @@ uint32 _echo_TestSleep(struct pipes_stru
+ 
+ void _echo_TestEnum(struct pipes_struct *p, struct echo_TestEnum *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return;
+ }
+ 
+ void _echo_TestSurrounding(struct pipes_struct *p, struct echo_TestSurrounding *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return;
+ }
+ 
+ uint16 _echo_TestDoublePointer(struct pipes_struct *p, struct echo_TestDoublePointer *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return 0;
+ }
+--- a/source3/rpc_server/epmapper/srv_epmapper.c
++++ b/source3/rpc_server/epmapper/srv_epmapper.c
+@@ -297,6 +297,7 @@ error_status_t _epm_Insert(struct pipes_
+ 	/* If this is not a priviledged users, return */
+ 	if (p->transport != NCALRPC ||
+ 	    !is_priviledged_pipe(p->session_info)) {
++		p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 		return EPMAPPER_STATUS_CANT_PERFORM_OP;
+ 	}
+ 
+@@ -433,6 +434,7 @@ error_status_t _epm_Delete(struct pipes_
+ 	/* If this is not a priviledged users, return */
+ 	if (p->transport != NCALRPC ||
+ 	    !is_priviledged_pipe(p->session_info)) {
++		p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 		return EPMAPPER_STATUS_CANT_PERFORM_OP;
+ 	}
+ 
+@@ -1096,7 +1098,7 @@ error_status_t _epm_LookupHandleFree(str
+ error_status_t _epm_InqObject(struct pipes_struct *p,
+ 		      struct epm_InqObject *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return EPMAPPER_STATUS_CANT_PERFORM_OP;
+ }
+ 
+@@ -1110,7 +1112,7 @@ error_status_t _epm_InqObject(struct pip
+ error_status_t _epm_MgmtDelete(struct pipes_struct *p,
+ 		       struct epm_MgmtDelete *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return EPMAPPER_STATUS_CANT_PERFORM_OP;
+ }
+ 
+@@ -1121,7 +1123,7 @@ error_status_t _epm_MgmtDelete(struct pi
+ error_status_t _epm_MapAuth(struct pipes_struct *p,
+ 		    struct epm_MapAuth *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return EPMAPPER_STATUS_CANT_PERFORM_OP;
+ }
+ 
+--- a/source3/rpc_server/eventlog/srv_eventlog_nt.c
++++ b/source3/rpc_server/eventlog/srv_eventlog_nt.c
+@@ -695,7 +695,7 @@ NTSTATUS _eventlog_GetNumRecords(struct
+ 
+ NTSTATUS _eventlog_BackupEventLogW(struct pipes_struct *p, struct eventlog_BackupEventLogW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -838,104 +838,104 @@ NTSTATUS _eventlog_ReportEventW(struct p
+ NTSTATUS _eventlog_DeregisterEventSource(struct pipes_struct *p,
+ 					 struct eventlog_DeregisterEventSource *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_ChangeNotify(struct pipes_struct *p,
+ 				struct eventlog_ChangeNotify *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_RegisterEventSourceW(struct pipes_struct *p,
+ 					struct eventlog_RegisterEventSourceW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_OpenBackupEventLogW(struct pipes_struct *p,
+ 				       struct eventlog_OpenBackupEventLogW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_ClearEventLogA(struct pipes_struct *p,
+ 				  struct eventlog_ClearEventLogA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_BackupEventLogA(struct pipes_struct *p,
+ 				   struct eventlog_BackupEventLogA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_OpenEventLogA(struct pipes_struct *p,
+ 				 struct eventlog_OpenEventLogA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_RegisterEventSourceA(struct pipes_struct *p,
+ 					struct eventlog_RegisterEventSourceA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_OpenBackupEventLogA(struct pipes_struct *p,
+ 				       struct eventlog_OpenBackupEventLogA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_ReadEventLogA(struct pipes_struct *p,
+ 				 struct eventlog_ReadEventLogA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_ReportEventA(struct pipes_struct *p,
+ 				struct eventlog_ReportEventA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_RegisterClusterSvc(struct pipes_struct *p,
+ 				      struct eventlog_RegisterClusterSvc *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_DeregisterClusterSvc(struct pipes_struct *p,
+ 					struct eventlog_DeregisterClusterSvc *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_WriteClusterEvents(struct pipes_struct *p,
+ 				      struct eventlog_WriteClusterEvents *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _eventlog_ReportEventAndSourceW(struct pipes_struct *p,
+ 					 struct eventlog_ReportEventAndSourceW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+--- a/source3/rpc_server/lsa/srv_lsa_nt.c
++++ b/source3/rpc_server/lsa/srv_lsa_nt.c
+@@ -817,7 +817,7 @@ NTSTATUS _lsa_QueryInfoPolicy2(struct pi
+ 	struct lsa_QueryInfoPolicy r;
+ 
+ 	if ((pdb_capabilities() & PDB_CAP_ADS) == 0) {
+-		p->rng_fault_state = True;
++		p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 		return NT_STATUS_NOT_IMPLEMENTED;
+ 	}
+ 
+@@ -3210,88 +3210,88 @@ NTSTATUS _lsa_Delete(struct pipes_struct
+ 
+ NTSTATUS _lsa_SetSecObj(struct pipes_struct *p, struct lsa_SetSecObj *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_ChangePassword(struct pipes_struct *p,
+ 			     struct lsa_ChangePassword *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetInfoPolicy(struct pipes_struct *p, struct lsa_SetInfoPolicy *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_ClearAuditLog(struct pipes_struct *p, struct lsa_ClearAuditLog *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_GetQuotasForAccount(struct pipes_struct *p,
+ 				  struct lsa_GetQuotasForAccount *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetQuotasForAccount(struct pipes_struct *p,
+ 				  struct lsa_SetQuotasForAccount *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetInformationTrustedDomain(struct pipes_struct *p,
+ 					  struct lsa_SetInformationTrustedDomain *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_QuerySecret(struct pipes_struct *p, struct lsa_QuerySecret *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetTrustedDomainInfo(struct pipes_struct *p,
+ 				   struct lsa_SetTrustedDomainInfo *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_StorePrivateData(struct pipes_struct *p,
+ 			       struct lsa_StorePrivateData *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_RetrievePrivateData(struct pipes_struct *p,
+ 				  struct lsa_RetrievePrivateData *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetInfoPolicy2(struct pipes_struct *p,
+ 			     struct lsa_SetInfoPolicy2 *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetTrustedDomainInfoByName(struct pipes_struct *p,
+ 					 struct lsa_SetTrustedDomainInfoByName *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -3310,7 +3310,7 @@ NTSTATUS _lsa_EnumTrustedDomainsEx(struc
+ 	 * _lsa_EnumTrustedDomains() afterwards - gd */
+ 
+ 	if (!(pdb_capabilities() & PDB_CAP_TRUSTED_DOMAINS_EX)) {
+-		p->rng_fault_state = True;
++		p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 		return NT_STATUS_NOT_IMPLEMENTED;
+ 	}
+ 
+@@ -3379,107 +3379,107 @@ NTSTATUS _lsa_EnumTrustedDomainsEx(struc
+ NTSTATUS _lsa_QueryDomainInformationPolicy(struct pipes_struct *p,
+ 					   struct lsa_QueryDomainInformationPolicy *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_SetDomainInformationPolicy(struct pipes_struct *p,
+ 					 struct lsa_SetDomainInformationPolicy *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_TestCall(struct pipes_struct *p, struct lsa_TestCall *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRWRITE(struct pipes_struct *p, struct lsa_CREDRWRITE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRREAD(struct pipes_struct *p, struct lsa_CREDRREAD *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRENUMERATE(struct pipes_struct *p, struct lsa_CREDRENUMERATE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRWRITEDOMAINCREDENTIALS(struct pipes_struct *p,
+ 					  struct lsa_CREDRWRITEDOMAINCREDENTIALS *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRREADDOMAINCREDENTIALS(struct pipes_struct *p,
+ 					 struct lsa_CREDRREADDOMAINCREDENTIALS *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRDELETE(struct pipes_struct *p, struct lsa_CREDRDELETE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRGETTARGETINFO(struct pipes_struct *p,
+ 				 struct lsa_CREDRGETTARGETINFO *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRPROFILELOADED(struct pipes_struct *p,
+ 				 struct lsa_CREDRPROFILELOADED *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_CREDRGETSESSIONTYPES(struct pipes_struct *p,
+ 				   struct lsa_CREDRGETSESSIONTYPES *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSARREGISTERAUDITEVENT(struct pipes_struct *p,
+ 				     struct lsa_LSARREGISTERAUDITEVENT *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSARGENAUDITEVENT(struct pipes_struct *p,
+ 				struct lsa_LSARGENAUDITEVENT *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSARUNREGISTERAUDITEVENT(struct pipes_struct *p,
+ 				       struct lsa_LSARUNREGISTERAUDITEVENT *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_lsaRQueryForestTrustInformation(struct pipes_struct *p,
+ 					      struct lsa_lsaRQueryForestTrustInformation *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -3992,34 +3992,34 @@ NTSTATUS _lsa_lsaRSetForestTrustInformat
+ NTSTATUS _lsa_CREDRRENAME(struct pipes_struct *p,
+ 			  struct lsa_CREDRRENAME *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSAROPENPOLICYSCE(struct pipes_struct *p,
+ 				struct lsa_LSAROPENPOLICYSCE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p,
+ 						 struct lsa_LSARADTREGISTERSECURITYEVENTSOURCE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p,
+ 						   struct lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+ NTSTATUS _lsa_LSARADTREPORTSECURITYEVENT(struct pipes_struct *p,
+ 					 struct lsa_LSARADTREPORTSECURITYEVENT *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+--- a/source3/rpc_server/netlogon/srv_netlog_nt.c
++++ b/source3/rpc_server/netlogon/srv_netlog_nt.c
+@@ -1787,7 +1787,7 @@ NTSTATUS _netr_LogonSamLogonEx(struct pi
+ WERROR _netr_LogonUasLogon(struct pipes_struct *p,
+ 			   struct netr_LogonUasLogon *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -1797,7 +1797,7 @@ WERROR _netr_LogonUasLogon(struct pipes_
+ WERROR _netr_LogonUasLogoff(struct pipes_struct *p,
+ 			    struct netr_LogonUasLogoff *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -1807,7 +1807,7 @@ WERROR _netr_LogonUasLogoff(struct pipes
+ NTSTATUS _netr_DatabaseDeltas(struct pipes_struct *p,
+ 			      struct netr_DatabaseDeltas *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -1817,7 +1817,7 @@ NTSTATUS _netr_DatabaseDeltas(struct pip
+ NTSTATUS _netr_DatabaseSync(struct pipes_struct *p,
+ 			    struct netr_DatabaseSync *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -1827,7 +1827,7 @@ NTSTATUS _netr_DatabaseSync(struct pipes
+ NTSTATUS _netr_AccountDeltas(struct pipes_struct *p,
+ 			     struct netr_AccountDeltas *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -1837,7 +1837,7 @@ NTSTATUS _netr_AccountDeltas(struct pipe
+ NTSTATUS _netr_AccountSync(struct pipes_struct *p,
+ 			   struct netr_AccountSync *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -1978,7 +1978,7 @@ WERROR _netr_GetAnyDCName(struct pipes_s
+ NTSTATUS _netr_DatabaseSync2(struct pipes_struct *p,
+ 			     struct netr_DatabaseSync2 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -1988,7 +1988,7 @@ NTSTATUS _netr_DatabaseSync2(struct pipe
+ NTSTATUS _netr_DatabaseRedo(struct pipes_struct *p,
+ 			    struct netr_DatabaseRedo *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -1998,7 +1998,7 @@ NTSTATUS _netr_DatabaseRedo(struct pipes
+ WERROR _netr_DsRGetDCName(struct pipes_struct *p,
+ 			  struct netr_DsRGetDCName *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2017,7 +2017,7 @@ NTSTATUS _netr_LogonGetCapabilities(stru
+ WERROR _netr_NETRLOGONSETSERVICEBITS(struct pipes_struct *p,
+ 				     struct netr_NETRLOGONSETSERVICEBITS *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2027,7 +2027,7 @@ WERROR _netr_NETRLOGONSETSERVICEBITS(str
+ WERROR _netr_LogonGetTrustRid(struct pipes_struct *p,
+ 			      struct netr_LogonGetTrustRid *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2037,7 +2037,7 @@ WERROR _netr_LogonGetTrustRid(struct pip
+ WERROR _netr_NETRLOGONCOMPUTESERVERDIGEST(struct pipes_struct *p,
+ 					  struct netr_NETRLOGONCOMPUTESERVERDIGEST *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2047,7 +2047,7 @@ WERROR _netr_NETRLOGONCOMPUTESERVERDIGES
+ WERROR _netr_NETRLOGONCOMPUTECLIENTDIGEST(struct pipes_struct *p,
+ 					  struct netr_NETRLOGONCOMPUTECLIENTDIGEST *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2057,7 +2057,7 @@ WERROR _netr_NETRLOGONCOMPUTECLIENTDIGES
+ WERROR _netr_DsRGetDCNameEx(struct pipes_struct *p,
+ 			    struct netr_DsRGetDCNameEx *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2067,7 +2067,7 @@ WERROR _netr_DsRGetDCNameEx(struct pipes
+ WERROR _netr_DsRGetSiteName(struct pipes_struct *p,
+ 			    struct netr_DsRGetSiteName *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2077,7 +2077,7 @@ WERROR _netr_DsRGetSiteName(struct pipes
+ NTSTATUS _netr_LogonGetDomainInfo(struct pipes_struct *p,
+ 				  struct netr_LogonGetDomainInfo *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -2087,7 +2087,7 @@ NTSTATUS _netr_LogonGetDomainInfo(struct
+ WERROR _netr_ServerPasswordGet(struct pipes_struct *p,
+ 			       struct netr_ServerPasswordGet *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2097,7 +2097,7 @@ WERROR _netr_ServerPasswordGet(struct pi
+ WERROR _netr_NETRLOGONSENDTOSAM(struct pipes_struct *p,
+ 				struct netr_NETRLOGONSENDTOSAM *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2107,7 +2107,7 @@ WERROR _netr_NETRLOGONSENDTOSAM(struct p
+ WERROR _netr_DsRAddressToSitenamesW(struct pipes_struct *p,
+ 				    struct netr_DsRAddressToSitenamesW *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2117,7 +2117,7 @@ WERROR _netr_DsRAddressToSitenamesW(stru
+ WERROR _netr_DsRGetDCNameEx2(struct pipes_struct *p,
+ 			     struct netr_DsRGetDCNameEx2 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2127,7 +2127,7 @@ WERROR _netr_DsRGetDCNameEx2(struct pipe
+ WERROR _netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN(struct pipes_struct *p,
+ 						 struct netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2137,7 +2137,7 @@ WERROR _netr_NETRLOGONGETTIMESERVICEPARE
+ WERROR _netr_NetrEnumerateTrustedDomainsEx(struct pipes_struct *p,
+ 					   struct netr_NetrEnumerateTrustedDomainsEx *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2147,7 +2147,7 @@ WERROR _netr_NetrEnumerateTrustedDomains
+ WERROR _netr_DsRAddressToSitenamesExW(struct pipes_struct *p,
+ 				      struct netr_DsRAddressToSitenamesExW *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2157,7 +2157,7 @@ WERROR _netr_DsRAddressToSitenamesExW(st
+ WERROR _netr_DsrGetDcSiteCoverageW(struct pipes_struct *p,
+ 				   struct netr_DsrGetDcSiteCoverageW *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2167,7 +2167,7 @@ WERROR _netr_DsrGetDcSiteCoverageW(struc
+ WERROR _netr_DsrEnumerateDomainTrusts(struct pipes_struct *p,
+ 				      struct netr_DsrEnumerateDomainTrusts *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2177,7 +2177,7 @@ WERROR _netr_DsrEnumerateDomainTrusts(st
+ WERROR _netr_DsrDeregisterDNSHostRecords(struct pipes_struct *p,
+ 					 struct netr_DsrDeregisterDNSHostRecords *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2187,7 +2187,7 @@ WERROR _netr_DsrDeregisterDNSHostRecords
+ NTSTATUS _netr_ServerTrustPasswordsGet(struct pipes_struct *p,
+ 				       struct netr_ServerTrustPasswordsGet *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -2197,7 +2197,7 @@ NTSTATUS _netr_ServerTrustPasswordsGet(s
+ WERROR _netr_DsRGetForestTrustInformation(struct pipes_struct *p,
+ 					  struct netr_DsRGetForestTrustInformation *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -2476,7 +2476,7 @@ NTSTATUS _netr_ServerGetTrustInfo(struct
+ NTSTATUS _netr_Unused47(struct pipes_struct *p,
+ 			struct netr_Unused47 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -2486,6 +2486,6 @@ NTSTATUS _netr_Unused47(struct pipes_str
+ NTSTATUS _netr_DsrUpdateReadOnlyServerDnsRecords(struct pipes_struct *p,
+ 						 struct netr_DsrUpdateReadOnlyServerDnsRecords *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+--- a/source3/rpc_server/ntsvcs/srv_ntsvcs_nt.c
++++ b/source3/rpc_server/ntsvcs/srv_ntsvcs_nt.c
+@@ -227,7 +227,7 @@ WERROR _PNP_HwProfFlags(struct pipes_str
+ WERROR _PNP_Disconnect(struct pipes_struct *p,
+ 		       struct PNP_Disconnect *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -237,7 +237,7 @@ WERROR _PNP_Disconnect(struct pipes_stru
+ WERROR _PNP_Connect(struct pipes_struct *p,
+ 		    struct PNP_Connect *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -247,7 +247,7 @@ WERROR _PNP_Connect(struct pipes_struct
+ WERROR _PNP_GetGlobalState(struct pipes_struct *p,
+ 			   struct PNP_GetGlobalState *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -257,7 +257,7 @@ WERROR _PNP_GetGlobalState(struct pipes_
+ WERROR _PNP_InitDetection(struct pipes_struct *p,
+ 			  struct PNP_InitDetection *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -267,7 +267,7 @@ WERROR _PNP_InitDetection(struct pipes_s
+ WERROR _PNP_ReportLogOn(struct pipes_struct *p,
+ 			struct PNP_ReportLogOn *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -277,7 +277,7 @@ WERROR _PNP_ReportLogOn(struct pipes_str
+ WERROR _PNP_GetRootDeviceInstance(struct pipes_struct *p,
+ 				  struct PNP_GetRootDeviceInstance *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -287,7 +287,7 @@ WERROR _PNP_GetRootDeviceInstance(struct
+ WERROR _PNP_GetRelatedDeviceInstance(struct pipes_struct *p,
+ 				     struct PNP_GetRelatedDeviceInstance *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -297,7 +297,7 @@ WERROR _PNP_GetRelatedDeviceInstance(str
+ WERROR _PNP_EnumerateSubKeys(struct pipes_struct *p,
+ 			     struct PNP_EnumerateSubKeys *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -307,7 +307,7 @@ WERROR _PNP_EnumerateSubKeys(struct pipe
+ WERROR _PNP_GetDepth(struct pipes_struct *p,
+ 		     struct PNP_GetDepth *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -317,7 +317,7 @@ WERROR _PNP_GetDepth(struct pipes_struct
+ WERROR _PNP_SetDeviceRegProp(struct pipes_struct *p,
+ 			     struct PNP_SetDeviceRegProp *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -327,7 +327,7 @@ WERROR _PNP_SetDeviceRegProp(struct pipe
+ WERROR _PNP_GetClassInstance(struct pipes_struct *p,
+ 			     struct PNP_GetClassInstance *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -337,7 +337,7 @@ WERROR _PNP_GetClassInstance(struct pipe
+ WERROR _PNP_CreateKey(struct pipes_struct *p,
+ 		      struct PNP_CreateKey *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -347,7 +347,7 @@ WERROR _PNP_CreateKey(struct pipes_struc
+ WERROR _PNP_DeleteRegistryKey(struct pipes_struct *p,
+ 			      struct PNP_DeleteRegistryKey *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -357,7 +357,7 @@ WERROR _PNP_DeleteRegistryKey(struct pip
+ WERROR _PNP_GetClassCount(struct pipes_struct *p,
+ 			  struct PNP_GetClassCount *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -367,7 +367,7 @@ WERROR _PNP_GetClassCount(struct pipes_s
+ WERROR _PNP_GetClassName(struct pipes_struct *p,
+ 			 struct PNP_GetClassName *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -377,7 +377,7 @@ WERROR _PNP_GetClassName(struct pipes_st
+ WERROR _PNP_DeleteClassKey(struct pipes_struct *p,
+ 			   struct PNP_DeleteClassKey *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -387,7 +387,7 @@ WERROR _PNP_DeleteClassKey(struct pipes_
+ WERROR _PNP_GetInterfaceDeviceAlias(struct pipes_struct *p,
+ 				    struct PNP_GetInterfaceDeviceAlias *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -397,7 +397,7 @@ WERROR _PNP_GetInterfaceDeviceAlias(stru
+ WERROR _PNP_GetInterfaceDeviceList(struct pipes_struct *p,
+ 				   struct PNP_GetInterfaceDeviceList *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -407,7 +407,7 @@ WERROR _PNP_GetInterfaceDeviceList(struc
+ WERROR _PNP_GetInterfaceDeviceListSize(struct pipes_struct *p,
+ 				       struct PNP_GetInterfaceDeviceListSize *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -417,7 +417,7 @@ WERROR _PNP_GetInterfaceDeviceListSize(s
+ WERROR _PNP_RegisterDeviceClassAssociation(struct pipes_struct *p,
+ 					   struct PNP_RegisterDeviceClassAssociation *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -427,7 +427,7 @@ WERROR _PNP_RegisterDeviceClassAssociati
+ WERROR _PNP_UnregisterDeviceClassAssociation(struct pipes_struct *p,
+ 					     struct PNP_UnregisterDeviceClassAssociation *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -437,7 +437,7 @@ WERROR _PNP_UnregisterDeviceClassAssocia
+ WERROR _PNP_GetClassRegProp(struct pipes_struct *p,
+ 			    struct PNP_GetClassRegProp *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -447,7 +447,7 @@ WERROR _PNP_GetClassRegProp(struct pipes
+ WERROR _PNP_SetClassRegProp(struct pipes_struct *p,
+ 			    struct PNP_SetClassRegProp *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -457,7 +457,7 @@ WERROR _PNP_SetClassRegProp(struct pipes
+ WERROR _PNP_CreateDevInst(struct pipes_struct *p,
+ 			  struct PNP_CreateDevInst *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -467,7 +467,7 @@ WERROR _PNP_CreateDevInst(struct pipes_s
+ WERROR _PNP_DeviceInstanceAction(struct pipes_struct *p,
+ 				 struct PNP_DeviceInstanceAction *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -477,7 +477,7 @@ WERROR _PNP_DeviceInstanceAction(struct
+ WERROR _PNP_GetDeviceStatus(struct pipes_struct *p,
+ 			    struct PNP_GetDeviceStatus *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -487,7 +487,7 @@ WERROR _PNP_GetDeviceStatus(struct pipes
+ WERROR _PNP_SetDeviceProblem(struct pipes_struct *p,
+ 			     struct PNP_SetDeviceProblem *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -497,7 +497,7 @@ WERROR _PNP_SetDeviceProblem(struct pipe
+ WERROR _PNP_DisableDevInst(struct pipes_struct *p,
+ 			   struct PNP_DisableDevInst *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -507,7 +507,7 @@ WERROR _PNP_DisableDevInst(struct pipes_
+ WERROR _PNP_UninstallDevInst(struct pipes_struct *p,
+ 			     struct PNP_UninstallDevInst *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -517,7 +517,7 @@ WERROR _PNP_UninstallDevInst(struct pipe
+ WERROR _PNP_AddID(struct pipes_struct *p,
+ 		  struct PNP_AddID *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -527,7 +527,7 @@ WERROR _PNP_AddID(struct pipes_struct *p
+ WERROR _PNP_RegisterDriver(struct pipes_struct *p,
+ 			   struct PNP_RegisterDriver *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -537,7 +537,7 @@ WERROR _PNP_RegisterDriver(struct pipes_
+ WERROR _PNP_QueryRemove(struct pipes_struct *p,
+ 			struct PNP_QueryRemove *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -547,7 +547,7 @@ WERROR _PNP_QueryRemove(struct pipes_str
+ WERROR _PNP_RequestDeviceEject(struct pipes_struct *p,
+ 			       struct PNP_RequestDeviceEject *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -557,7 +557,7 @@ WERROR _PNP_RequestDeviceEject(struct pi
+ WERROR _PNP_IsDockStationPresent(struct pipes_struct *p,
+ 				 struct PNP_IsDockStationPresent *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -567,7 +567,7 @@ WERROR _PNP_IsDockStationPresent(struct
+ WERROR _PNP_RequestEjectPC(struct pipes_struct *p,
+ 			   struct PNP_RequestEjectPC *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -577,7 +577,7 @@ WERROR _PNP_RequestEjectPC(struct pipes_
+ WERROR _PNP_AddEmptyLogConf(struct pipes_struct *p,
+ 			    struct PNP_AddEmptyLogConf *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -587,7 +587,7 @@ WERROR _PNP_AddEmptyLogConf(struct pipes
+ WERROR _PNP_FreeLogConf(struct pipes_struct *p,
+ 			struct PNP_FreeLogConf *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -597,7 +597,7 @@ WERROR _PNP_FreeLogConf(struct pipes_str
+ WERROR _PNP_GetFirstLogConf(struct pipes_struct *p,
+ 			    struct PNP_GetFirstLogConf *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -607,7 +607,7 @@ WERROR _PNP_GetFirstLogConf(struct pipes
+ WERROR _PNP_GetNextLogConf(struct pipes_struct *p,
+ 			   struct PNP_GetNextLogConf *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -617,7 +617,7 @@ WERROR _PNP_GetNextLogConf(struct pipes_
+ WERROR _PNP_GetLogConfPriority(struct pipes_struct *p,
+ 			       struct PNP_GetLogConfPriority *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -627,7 +627,7 @@ WERROR _PNP_GetLogConfPriority(struct pi
+ WERROR _PNP_AddResDes(struct pipes_struct *p,
+ 		      struct PNP_AddResDes *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -637,7 +637,7 @@ WERROR _PNP_AddResDes(struct pipes_struc
+ WERROR _PNP_FreeResDes(struct pipes_struct *p,
+ 		       struct PNP_FreeResDes *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -647,7 +647,7 @@ WERROR _PNP_FreeResDes(struct pipes_stru
+ WERROR _PNP_GetNextResDes(struct pipes_struct *p,
+ 			  struct PNP_GetNextResDes *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -657,7 +657,7 @@ WERROR _PNP_GetNextResDes(struct pipes_s
+ WERROR _PNP_GetResDesData(struct pipes_struct *p,
+ 			  struct PNP_GetResDesData *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -667,7 +667,7 @@ WERROR _PNP_GetResDesData(struct pipes_s
+ WERROR _PNP_GetResDesDataSize(struct pipes_struct *p,
+ 			      struct PNP_GetResDesDataSize *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -677,7 +677,7 @@ WERROR _PNP_GetResDesDataSize(struct pip
+ WERROR _PNP_ModifyResDes(struct pipes_struct *p,
+ 			 struct PNP_ModifyResDes *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -687,7 +687,7 @@ WERROR _PNP_ModifyResDes(struct pipes_st
+ WERROR _PNP_DetectResourceLimit(struct pipes_struct *p,
+ 				struct PNP_DetectResourceLimit *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -697,7 +697,7 @@ WERROR _PNP_DetectResourceLimit(struct p
+ WERROR _PNP_QueryResConfList(struct pipes_struct *p,
+ 			     struct PNP_QueryResConfList *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -707,7 +707,7 @@ WERROR _PNP_QueryResConfList(struct pipe
+ WERROR _PNP_SetHwProf(struct pipes_struct *p,
+ 		      struct PNP_SetHwProf *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -717,7 +717,7 @@ WERROR _PNP_SetHwProf(struct pipes_struc
+ WERROR _PNP_QueryArbitratorFreeData(struct pipes_struct *p,
+ 				    struct PNP_QueryArbitratorFreeData *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -727,7 +727,7 @@ WERROR _PNP_QueryArbitratorFreeData(stru
+ WERROR _PNP_QueryArbitratorFreeSize(struct pipes_struct *p,
+ 				    struct PNP_QueryArbitratorFreeSize *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -737,7 +737,7 @@ WERROR _PNP_QueryArbitratorFreeSize(stru
+ WERROR _PNP_RunDetection(struct pipes_struct *p,
+ 			 struct PNP_RunDetection *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -747,7 +747,7 @@ WERROR _PNP_RunDetection(struct pipes_st
+ WERROR _PNP_RegisterNotification(struct pipes_struct *p,
+ 				 struct PNP_RegisterNotification *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -757,7 +757,7 @@ WERROR _PNP_RegisterNotification(struct
+ WERROR _PNP_UnregisterNotification(struct pipes_struct *p,
+ 				   struct PNP_UnregisterNotification *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -767,7 +767,7 @@ WERROR _PNP_UnregisterNotification(struc
+ WERROR _PNP_GetCustomDevProp(struct pipes_struct *p,
+ 			     struct PNP_GetCustomDevProp *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -777,7 +777,7 @@ WERROR _PNP_GetCustomDevProp(struct pipe
+ WERROR _PNP_GetVersionInternal(struct pipes_struct *p,
+ 			       struct PNP_GetVersionInternal *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -787,7 +787,7 @@ WERROR _PNP_GetVersionInternal(struct pi
+ WERROR _PNP_GetBlockedDriverInfo(struct pipes_struct *p,
+ 				 struct PNP_GetBlockedDriverInfo *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -797,6 +797,6 @@ WERROR _PNP_GetBlockedDriverInfo(struct
+ WERROR _PNP_GetServerSideDeviceInstallFlags(struct pipes_struct *p,
+ 					    struct PNP_GetServerSideDeviceInstallFlags *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/rpc_handles.c
++++ b/source3/rpc_server/rpc_handles.c
+@@ -242,7 +242,7 @@ static struct dcesrv_handle *find_policy
+ 	DEBUG(4,("Policy not found: "));
+ 	dump_data(4, (uint8_t *)hnd, sizeof(*hnd));
+ 
+-	p->bad_handle_fault_state = true;
++	p->fault_state = DCERPC_FAULT_CONTEXT_MISMATCH;
+ 
+ 	return NULL;
+ }
+--- a/source3/rpc_server/rpc_ncacn_np.c
++++ b/source3/rpc_server/rpc_ncacn_np.c
+@@ -216,24 +216,13 @@ static NTSTATUS rpcint_dispatch(struct p
+ 	}
+ 
+ 	if (p->fault_state) {
+-		p->fault_state = false;
+-		data_blob_free(&p->out_data.rdata);
+-		talloc_free_children(p->mem_ctx);
+-		return NT_STATUS_RPC_CALL_FAILED;
+-	}
+-
+-	if (p->bad_handle_fault_state) {
+-		p->bad_handle_fault_state = false;
+-		data_blob_free(&p->out_data.rdata);
+-		talloc_free_children(p->mem_ctx);
+-		return NT_STATUS_RPC_SS_CONTEXT_MISMATCH;
+-	}
++		NTSTATUS status;
+ 
+-	if (p->rng_fault_state) {
+-		p->rng_fault_state = false;
++		status = NT_STATUS(p->fault_state);
++		p->fault_state = 0;
+ 		data_blob_free(&p->out_data.rdata);
+ 		talloc_free_children(p->mem_ctx);
+-		return NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE;
++		return status;
+ 	}
+ 
+ 	*out_data = p->out_data.rdata;
+--- a/source3/rpc_server/samr/srv_samr_nt.c
++++ b/source3/rpc_server/samr/srv_samr_nt.c
+@@ -6682,7 +6682,7 @@ NTSTATUS _samr_ValidatePassword(struct p
+ NTSTATUS _samr_Shutdown(struct pipes_struct *p,
+ 			struct samr_Shutdown *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6692,7 +6692,7 @@ NTSTATUS _samr_Shutdown(struct pipes_str
+ NTSTATUS _samr_SetMemberAttributesOfGroup(struct pipes_struct *p,
+ 					  struct samr_SetMemberAttributesOfGroup *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6702,6 +6702,7 @@ NTSTATUS _samr_SetMemberAttributesOfGrou
+ NTSTATUS _samr_TestPrivateFunctionsDomain(struct pipes_struct *p,
+ 					  struct samr_TestPrivateFunctionsDomain *r)
+ {
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6711,6 +6712,7 @@ NTSTATUS _samr_TestPrivateFunctionsDomai
+ NTSTATUS _samr_TestPrivateFunctionsUser(struct pipes_struct *p,
+ 					struct samr_TestPrivateFunctionsUser *r)
+ {
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6720,7 +6722,7 @@ NTSTATUS _samr_TestPrivateFunctionsUser(
+ NTSTATUS _samr_AddMultipleMembersToAlias(struct pipes_struct *p,
+ 					 struct samr_AddMultipleMembersToAlias *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6730,7 +6732,7 @@ NTSTATUS _samr_AddMultipleMembersToAlias
+ NTSTATUS _samr_RemoveMultipleMembersFromAlias(struct pipes_struct *p,
+ 					      struct samr_RemoveMultipleMembersFromAlias *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6740,7 +6742,7 @@ NTSTATUS _samr_RemoveMultipleMembersFrom
+ NTSTATUS _samr_SetBootKeyInformation(struct pipes_struct *p,
+ 				     struct samr_SetBootKeyInformation *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6750,7 +6752,7 @@ NTSTATUS _samr_SetBootKeyInformation(str
+ NTSTATUS _samr_GetBootKeyInformation(struct pipes_struct *p,
+ 				     struct samr_GetBootKeyInformation *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+ 
+@@ -6760,6 +6762,6 @@ NTSTATUS _samr_GetBootKeyInformation(str
+ NTSTATUS _samr_SetDsrmPassword(struct pipes_struct *p,
+ 			       struct samr_SetDsrmPassword *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return NT_STATUS_NOT_IMPLEMENTED;
+ }
+--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
++++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
+@@ -10156,7 +10156,7 @@ WERROR _spoolss_AddPort(struct pipes_str
+ WERROR _spoolss_GetPrinterDriver(struct pipes_struct *p,
+ 				 struct spoolss_GetPrinterDriver *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10167,7 +10167,7 @@ WERROR _spoolss_GetPrinterDriver(struct
+ WERROR _spoolss_ReadPrinter(struct pipes_struct *p,
+ 			    struct spoolss_ReadPrinter *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10178,7 +10178,7 @@ WERROR _spoolss_ReadPrinter(struct pipes
+ WERROR _spoolss_WaitForPrinterChange(struct pipes_struct *p,
+ 				     struct spoolss_WaitForPrinterChange *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10189,7 +10189,7 @@ WERROR _spoolss_WaitForPrinterChange(str
+ WERROR _spoolss_ConfigurePort(struct pipes_struct *p,
+ 			      struct spoolss_ConfigurePort *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10200,7 +10200,7 @@ WERROR _spoolss_ConfigurePort(struct pip
+ WERROR _spoolss_DeletePort(struct pipes_struct *p,
+ 			   struct spoolss_DeletePort *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10211,7 +10211,7 @@ WERROR _spoolss_DeletePort(struct pipes_
+ WERROR _spoolss_CreatePrinterIC(struct pipes_struct *p,
+ 				struct spoolss_CreatePrinterIC *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10222,7 +10222,7 @@ WERROR _spoolss_CreatePrinterIC(struct p
+ WERROR _spoolss_PlayGDIScriptOnPrinterIC(struct pipes_struct *p,
+ 					 struct spoolss_PlayGDIScriptOnPrinterIC *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10233,7 +10233,7 @@ WERROR _spoolss_PlayGDIScriptOnPrinterIC
+ WERROR _spoolss_DeletePrinterIC(struct pipes_struct *p,
+ 				struct spoolss_DeletePrinterIC *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10244,7 +10244,7 @@ WERROR _spoolss_DeletePrinterIC(struct p
+ WERROR _spoolss_AddPrinterConnection(struct pipes_struct *p,
+ 				     struct spoolss_AddPrinterConnection *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10255,7 +10255,7 @@ WERROR _spoolss_AddPrinterConnection(str
+ WERROR _spoolss_DeletePrinterConnection(struct pipes_struct *p,
+ 					struct spoolss_DeletePrinterConnection *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10266,7 +10266,7 @@ WERROR _spoolss_DeletePrinterConnection(
+ WERROR _spoolss_PrinterMessageBox(struct pipes_struct *p,
+ 				  struct spoolss_PrinterMessageBox *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10277,7 +10277,7 @@ WERROR _spoolss_PrinterMessageBox(struct
+ WERROR _spoolss_AddMonitor(struct pipes_struct *p,
+ 			   struct spoolss_AddMonitor *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10288,7 +10288,7 @@ WERROR _spoolss_AddMonitor(struct pipes_
+ WERROR _spoolss_DeleteMonitor(struct pipes_struct *p,
+ 			      struct spoolss_DeleteMonitor *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10299,7 +10299,7 @@ WERROR _spoolss_DeleteMonitor(struct pip
+ WERROR _spoolss_DeletePrintProcessor(struct pipes_struct *p,
+ 				     struct spoolss_DeletePrintProcessor *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10310,7 +10310,7 @@ WERROR _spoolss_DeletePrintProcessor(str
+ WERROR _spoolss_AddPrintProvidor(struct pipes_struct *p,
+ 				 struct spoolss_AddPrintProvidor *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10321,7 +10321,7 @@ WERROR _spoolss_AddPrintProvidor(struct
+ WERROR _spoolss_DeletePrintProvidor(struct pipes_struct *p,
+ 				    struct spoolss_DeletePrintProvidor *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10332,7 +10332,7 @@ WERROR _spoolss_DeletePrintProvidor(stru
+ WERROR _spoolss_FindFirstPrinterChangeNotification(struct pipes_struct *p,
+ 						   struct spoolss_FindFirstPrinterChangeNotification *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10343,7 +10343,7 @@ WERROR _spoolss_FindFirstPrinterChangeNo
+ WERROR _spoolss_FindNextPrinterChangeNotification(struct pipes_struct *p,
+ 						  struct spoolss_FindNextPrinterChangeNotification *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10354,7 +10354,7 @@ WERROR _spoolss_FindNextPrinterChangeNot
+ WERROR _spoolss_RouterFindFirstPrinterChangeNotificationOld(struct pipes_struct *p,
+ 							    struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10365,7 +10365,7 @@ WERROR _spoolss_RouterFindFirstPrinterCh
+ WERROR _spoolss_ReplyOpenPrinter(struct pipes_struct *p,
+ 				 struct spoolss_ReplyOpenPrinter *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10376,7 +10376,7 @@ WERROR _spoolss_ReplyOpenPrinter(struct
+ WERROR _spoolss_RouterReplyPrinter(struct pipes_struct *p,
+ 				   struct spoolss_RouterReplyPrinter *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10387,7 +10387,7 @@ WERROR _spoolss_RouterReplyPrinter(struc
+ WERROR _spoolss_ReplyClosePrinter(struct pipes_struct *p,
+ 				  struct spoolss_ReplyClosePrinter *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10398,7 +10398,7 @@ WERROR _spoolss_ReplyClosePrinter(struct
+ WERROR _spoolss_AddPortEx(struct pipes_struct *p,
+ 			  struct spoolss_AddPortEx *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10409,7 +10409,7 @@ WERROR _spoolss_AddPortEx(struct pipes_s
+ WERROR _spoolss_RouterFindFirstPrinterChangeNotification(struct pipes_struct *p,
+ 							 struct spoolss_RouterFindFirstPrinterChangeNotification *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10420,7 +10420,7 @@ WERROR _spoolss_RouterFindFirstPrinterCh
+ WERROR _spoolss_SpoolerInit(struct pipes_struct *p,
+ 			    struct spoolss_SpoolerInit *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10431,7 +10431,7 @@ WERROR _spoolss_SpoolerInit(struct pipes
+ WERROR _spoolss_ResetPrinterEx(struct pipes_struct *p,
+ 			       struct spoolss_ResetPrinterEx *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10442,7 +10442,7 @@ WERROR _spoolss_ResetPrinterEx(struct pi
+ WERROR _spoolss_RouterReplyPrinterEx(struct pipes_struct *p,
+ 				     struct spoolss_RouterReplyPrinterEx *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10453,7 +10453,7 @@ WERROR _spoolss_RouterReplyPrinterEx(str
+ WERROR _spoolss_44(struct pipes_struct *p,
+ 		   struct spoolss_44 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10464,7 +10464,7 @@ WERROR _spoolss_44(struct pipes_struct *
+ WERROR _spoolss_SetPort(struct pipes_struct *p,
+ 			struct spoolss_SetPort *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10475,7 +10475,7 @@ WERROR _spoolss_SetPort(struct pipes_str
+ WERROR _spoolss_4a(struct pipes_struct *p,
+ 		   struct spoolss_4a *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10486,7 +10486,7 @@ WERROR _spoolss_4a(struct pipes_struct *
+ WERROR _spoolss_4b(struct pipes_struct *p,
+ 		   struct spoolss_4b *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10497,7 +10497,7 @@ WERROR _spoolss_4b(struct pipes_struct *
+ WERROR _spoolss_4c(struct pipes_struct *p,
+ 		   struct spoolss_4c *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10508,7 +10508,7 @@ WERROR _spoolss_4c(struct pipes_struct *
+ WERROR _spoolss_53(struct pipes_struct *p,
+ 		   struct spoolss_53 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10519,7 +10519,7 @@ WERROR _spoolss_53(struct pipes_struct *
+ WERROR _spoolss_AddPerMachineConnection(struct pipes_struct *p,
+ 					struct spoolss_AddPerMachineConnection *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10530,7 +10530,7 @@ WERROR _spoolss_AddPerMachineConnection(
+ WERROR _spoolss_DeletePerMachineConnection(struct pipes_struct *p,
+ 					   struct spoolss_DeletePerMachineConnection *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10541,7 +10541,7 @@ WERROR _spoolss_DeletePerMachineConnecti
+ WERROR _spoolss_EnumPerMachineConnections(struct pipes_struct *p,
+ 					  struct spoolss_EnumPerMachineConnections *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10552,7 +10552,7 @@ WERROR _spoolss_EnumPerMachineConnection
+ WERROR _spoolss_5a(struct pipes_struct *p,
+ 		   struct spoolss_5a *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10563,7 +10563,7 @@ WERROR _spoolss_5a(struct pipes_struct *
+ WERROR _spoolss_5b(struct pipes_struct *p,
+ 		   struct spoolss_5b *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10574,7 +10574,7 @@ WERROR _spoolss_5b(struct pipes_struct *
+ WERROR _spoolss_5c(struct pipes_struct *p,
+ 		   struct spoolss_5c *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10585,7 +10585,7 @@ WERROR _spoolss_5c(struct pipes_struct *
+ WERROR _spoolss_5d(struct pipes_struct *p,
+ 		   struct spoolss_5d *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10596,7 +10596,7 @@ WERROR _spoolss_5d(struct pipes_struct *
+ WERROR _spoolss_5e(struct pipes_struct *p,
+ 		   struct spoolss_5e *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10607,7 +10607,7 @@ WERROR _spoolss_5e(struct pipes_struct *
+ WERROR _spoolss_5f(struct pipes_struct *p,
+ 		   struct spoolss_5f *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10618,7 +10618,7 @@ WERROR _spoolss_5f(struct pipes_struct *
+ WERROR _spoolss_60(struct pipes_struct *p,
+ 		   struct spoolss_60 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10629,7 +10629,7 @@ WERROR _spoolss_60(struct pipes_struct *
+ WERROR _spoolss_61(struct pipes_struct *p,
+ 		   struct spoolss_61 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10640,7 +10640,7 @@ WERROR _spoolss_61(struct pipes_struct *
+ WERROR _spoolss_62(struct pipes_struct *p,
+ 		   struct spoolss_62 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10651,7 +10651,7 @@ WERROR _spoolss_62(struct pipes_struct *
+ WERROR _spoolss_63(struct pipes_struct *p,
+ 		   struct spoolss_63 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10662,7 +10662,7 @@ WERROR _spoolss_63(struct pipes_struct *
+ WERROR _spoolss_64(struct pipes_struct *p,
+ 		   struct spoolss_64 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10673,7 +10673,7 @@ WERROR _spoolss_64(struct pipes_struct *
+ WERROR _spoolss_65(struct pipes_struct *p,
+ 		   struct spoolss_65 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10684,7 +10684,7 @@ WERROR _spoolss_65(struct pipes_struct *
+ WERROR _spoolss_GetCorePrinterDrivers(struct pipes_struct *p,
+ 				      struct spoolss_GetCorePrinterDrivers *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10695,7 +10695,7 @@ WERROR _spoolss_GetCorePrinterDrivers(st
+ WERROR _spoolss_67(struct pipes_struct *p,
+ 		   struct spoolss_67 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10706,7 +10706,7 @@ WERROR _spoolss_67(struct pipes_struct *
+ WERROR _spoolss_GetPrinterDriverPackagePath(struct pipes_struct *p,
+ 					    struct spoolss_GetPrinterDriverPackagePath *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10717,7 +10717,7 @@ WERROR _spoolss_GetPrinterDriverPackageP
+ WERROR _spoolss_69(struct pipes_struct *p,
+ 		   struct spoolss_69 *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10728,7 +10728,7 @@ WERROR _spoolss_69(struct pipes_struct *
+ WERROR _spoolss_6a(struct pipes_struct *p,
+ 		   struct spoolss_6a *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10739,7 +10739,7 @@ WERROR _spoolss_6a(struct pipes_struct *
+ WERROR _spoolss_6b(struct pipes_struct *p,
+ 		   struct spoolss_6b *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10750,7 +10750,7 @@ WERROR _spoolss_6b(struct pipes_struct *
+ WERROR _spoolss_6c(struct pipes_struct *p,
+ 		   struct spoolss_6c *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -10761,6 +10761,6 @@ WERROR _spoolss_6c(struct pipes_struct *
+ WERROR _spoolss_6d(struct pipes_struct *p,
+ 		   struct spoolss_6d *r)
+ {
+-	p->rng_fault_state = true;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
++++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+@@ -2548,244 +2548,244 @@ WERROR _srvsvc_NetFileClose(struct pipes
+ WERROR _srvsvc_NetCharDevEnum(struct pipes_struct *p,
+ 			      struct srvsvc_NetCharDevEnum *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevGetInfo(struct pipes_struct *p,
+ 				 struct srvsvc_NetCharDevGetInfo *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevControl(struct pipes_struct *p,
+ 				 struct srvsvc_NetCharDevControl *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevQEnum(struct pipes_struct *p,
+ 			       struct srvsvc_NetCharDevQEnum *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevQGetInfo(struct pipes_struct *p,
+ 				  struct srvsvc_NetCharDevQGetInfo *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevQSetInfo(struct pipes_struct *p,
+ 				  struct srvsvc_NetCharDevQSetInfo *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevQPurge(struct pipes_struct *p,
+ 				struct srvsvc_NetCharDevQPurge *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetCharDevQPurgeSelf(struct pipes_struct *p,
+ 				    struct srvsvc_NetCharDevQPurgeSelf *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetFileGetInfo(struct pipes_struct *p,
+ 			      struct srvsvc_NetFileGetInfo *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetShareCheck(struct pipes_struct *p,
+ 			     struct srvsvc_NetShareCheck *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetServerStatisticsGet(struct pipes_struct *p,
+ 				      struct srvsvc_NetServerStatisticsGet *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetTransportAdd(struct pipes_struct *p,
+ 			       struct srvsvc_NetTransportAdd *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetTransportEnum(struct pipes_struct *p,
+ 				struct srvsvc_NetTransportEnum *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetTransportDel(struct pipes_struct *p,
+ 			       struct srvsvc_NetTransportDel *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetSetServiceBits(struct pipes_struct *p,
+ 				 struct srvsvc_NetSetServiceBits *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetPathType(struct pipes_struct *p,
+ 			   struct srvsvc_NetPathType *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetPathCanonicalize(struct pipes_struct *p,
+ 				   struct srvsvc_NetPathCanonicalize *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetPathCompare(struct pipes_struct *p,
+ 			      struct srvsvc_NetPathCompare *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRPRNAMECANONICALIZE(struct pipes_struct *p,
+ 				      struct srvsvc_NETRPRNAMECANONICALIZE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetPRNameCompare(struct pipes_struct *p,
+ 				struct srvsvc_NetPRNameCompare *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetShareDelStart(struct pipes_struct *p,
+ 				struct srvsvc_NetShareDelStart *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetShareDelCommit(struct pipes_struct *p,
+ 				 struct srvsvc_NetShareDelCommit *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetServerTransportAddEx(struct pipes_struct *p,
+ 				       struct srvsvc_NetServerTransportAddEx *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NetServerSetServiceBitsEx(struct pipes_struct *p,
+ 					 struct srvsvc_NetServerSetServiceBitsEx *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSGETVERSION(struct pipes_struct *p,
+ 				 struct srvsvc_NETRDFSGETVERSION *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(struct pipes_struct *p,
+ 					   struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(struct pipes_struct *p,
+ 					   struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct pipes_struct *p,
+ 					  struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSSETSERVERINFO(struct pipes_struct *p,
+ 				    struct srvsvc_NETRDFSSETSERVERINFO *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSCREATEEXITPOINT(struct pipes_struct *p,
+ 				      struct srvsvc_NETRDFSCREATEEXITPOINT *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSDELETEEXITPOINT(struct pipes_struct *p,
+ 				      struct srvsvc_NETRDFSDELETEEXITPOINT *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSMODIFYPREFIX(struct pipes_struct *p,
+ 				   struct srvsvc_NETRDFSMODIFYPREFIX *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(struct pipes_struct *p,
+ 				     struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct pipes_struct *p,
+ 					    struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(struct pipes_struct *p,
+ 					struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/svcctl/srv_svcctl_nt.c
++++ b/source3/rpc_server/svcctl/srv_svcctl_nt.c
+@@ -1004,195 +1004,195 @@ WERROR _svcctl_SetServiceObjectSecurity(
+ WERROR _svcctl_DeleteService(struct pipes_struct *p,
+ 			     struct svcctl_DeleteService *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_SetServiceStatus(struct pipes_struct *p,
+ 				struct svcctl_SetServiceStatus *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_NotifyBootConfigStatus(struct pipes_struct *p,
+ 				      struct svcctl_NotifyBootConfigStatus *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_SCSetServiceBitsW(struct pipes_struct *p,
+ 				 struct svcctl_SCSetServiceBitsW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_ChangeServiceConfigW(struct pipes_struct *p,
+ 				    struct svcctl_ChangeServiceConfigW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_CreateServiceW(struct pipes_struct *p,
+ 			      struct svcctl_CreateServiceW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_QueryServiceLockStatusW(struct pipes_struct *p,
+ 				       struct svcctl_QueryServiceLockStatusW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_GetServiceKeyNameW(struct pipes_struct *p,
+ 				  struct svcctl_GetServiceKeyNameW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_SCSetServiceBitsA(struct pipes_struct *p,
+ 				 struct svcctl_SCSetServiceBitsA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_ChangeServiceConfigA(struct pipes_struct *p,
+ 				    struct svcctl_ChangeServiceConfigA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_CreateServiceA(struct pipes_struct *p,
+ 			      struct svcctl_CreateServiceA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_EnumDependentServicesA(struct pipes_struct *p,
+ 				      struct svcctl_EnumDependentServicesA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_EnumServicesStatusA(struct pipes_struct *p,
+ 				   struct svcctl_EnumServicesStatusA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_OpenSCManagerA(struct pipes_struct *p,
+ 			      struct svcctl_OpenSCManagerA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_OpenServiceA(struct pipes_struct *p,
+ 			    struct svcctl_OpenServiceA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_QueryServiceConfigA(struct pipes_struct *p,
+ 				   struct svcctl_QueryServiceConfigA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_QueryServiceLockStatusA(struct pipes_struct *p,
+ 				       struct svcctl_QueryServiceLockStatusA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_StartServiceA(struct pipes_struct *p,
+ 			     struct svcctl_StartServiceA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_GetServiceDisplayNameA(struct pipes_struct *p,
+ 				      struct svcctl_GetServiceDisplayNameA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_GetServiceKeyNameA(struct pipes_struct *p,
+ 				  struct svcctl_GetServiceKeyNameA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_GetCurrentGroupeStateW(struct pipes_struct *p,
+ 				      struct svcctl_GetCurrentGroupeStateW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_EnumServiceGroupW(struct pipes_struct *p,
+ 				 struct svcctl_EnumServiceGroupW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_ChangeServiceConfig2A(struct pipes_struct *p,
+ 				     struct svcctl_ChangeServiceConfig2A *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_ChangeServiceConfig2W(struct pipes_struct *p,
+ 				     struct svcctl_ChangeServiceConfig2W *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_QueryServiceConfig2A(struct pipes_struct *p,
+ 				    struct svcctl_QueryServiceConfig2A *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _EnumServicesStatusExA(struct pipes_struct *p,
+ 			      struct EnumServicesStatusExA *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _EnumServicesStatusExW(struct pipes_struct *p,
+ 			      struct EnumServicesStatusExW *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+ WERROR _svcctl_SCSendTSMessage(struct pipes_struct *p,
+ 			       struct svcctl_SCSendTSMessage *r)
+ {
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/winreg/srv_winreg_nt.c
++++ b/source3/rpc_server/winreg/srv_winreg_nt.c
+@@ -760,7 +760,7 @@ WERROR _winreg_SaveKeyEx(struct pipes_st
+ 	/* fill in your code here if you think this call should
+ 	   do anything */
+ 
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -948,7 +948,7 @@ WERROR _winreg_UnLoadKey(struct pipes_st
+ 	/* fill in your code here if you think this call should
+ 	   do anything */
+ 
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -962,7 +962,7 @@ WERROR _winreg_ReplaceKey(struct pipes_s
+ 	/* fill in your code here if you think this call should
+ 	   do anything */
+ 
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -976,7 +976,7 @@ WERROR _winreg_LoadKey(struct pipes_stru
+ 	/* fill in your code here if you think this call should
+ 	   do anything */
+ 
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -1139,6 +1139,6 @@ WERROR _winreg_DeleteKeyEx(struct pipes_
+ 	/* fill in your code here if you think this call should
+ 	   do anything */
+ 
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
++++ b/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
+@@ -405,7 +405,7 @@ WERROR _wkssvc_NetWkstaSetInfo(struct pi
+ 			       struct wkssvc_NetWkstaSetInfo *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -608,7 +608,7 @@ WERROR _wkssvc_NetrWkstaUserGetInfo(stru
+ 				    struct wkssvc_NetrWkstaUserGetInfo *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -619,7 +619,7 @@ WERROR _wkssvc_NetrWkstaUserSetInfo(stru
+ 				    struct wkssvc_NetrWkstaUserSetInfo *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -630,7 +630,7 @@ WERROR _wkssvc_NetWkstaTransportEnum(str
+ 				     struct wkssvc_NetWkstaTransportEnum *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -641,7 +641,7 @@ WERROR _wkssvc_NetrWkstaTransportAdd(str
+ 				     struct wkssvc_NetrWkstaTransportAdd *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -652,7 +652,7 @@ WERROR _wkssvc_NetrWkstaTransportDel(str
+ 				     struct wkssvc_NetrWkstaTransportDel *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -663,7 +663,7 @@ WERROR _wkssvc_NetrUseAdd(struct pipes_s
+ 			  struct wkssvc_NetrUseAdd *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -674,7 +674,7 @@ WERROR _wkssvc_NetrUseGetInfo(struct pip
+ 			      struct wkssvc_NetrUseGetInfo *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -685,7 +685,7 @@ WERROR _wkssvc_NetrUseDel(struct pipes_s
+ 			  struct wkssvc_NetrUseDel *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -696,7 +696,7 @@ WERROR _wkssvc_NetrUseEnum(struct pipes_
+ 			   struct wkssvc_NetrUseEnum *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -707,7 +707,7 @@ WERROR _wkssvc_NetrMessageBufferSend(str
+ 				     struct wkssvc_NetrMessageBufferSend *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -718,7 +718,7 @@ WERROR _wkssvc_NetrWorkstationStatistics
+ 					    struct wkssvc_NetrWorkstationStatisticsGet *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -729,7 +729,7 @@ WERROR _wkssvc_NetrLogonDomainNameAdd(st
+ 				      struct wkssvc_NetrLogonDomainNameAdd *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -740,7 +740,7 @@ WERROR _wkssvc_NetrLogonDomainNameDel(st
+ 				      struct wkssvc_NetrLogonDomainNameDel *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -751,7 +751,7 @@ WERROR _wkssvc_NetrJoinDomain(struct pip
+ 			      struct wkssvc_NetrJoinDomain *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -762,7 +762,7 @@ WERROR _wkssvc_NetrUnjoinDomain(struct p
+ 				struct wkssvc_NetrUnjoinDomain *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -773,7 +773,7 @@ WERROR _wkssvc_NetrRenameMachineInDomain
+ 					 struct wkssvc_NetrRenameMachineInDomain *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -784,7 +784,7 @@ WERROR _wkssvc_NetrValidateName(struct p
+ 				struct wkssvc_NetrValidateName *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -795,7 +795,7 @@ WERROR _wkssvc_NetrGetJoinInformation(st
+ 				      struct wkssvc_NetrGetJoinInformation *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -806,7 +806,7 @@ WERROR _wkssvc_NetrGetJoinableOus(struct
+ 				  struct wkssvc_NetrGetJoinableOus *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -962,6 +962,7 @@ WERROR _wkssvc_NetrRenameMachineInDomain
+ 					  struct wkssvc_NetrRenameMachineInDomain2 *r)
+ {
+ 	/* for now just return not supported */
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -972,7 +973,7 @@ WERROR _wkssvc_NetrValidateName2(struct
+ 				 struct wkssvc_NetrValidateName2 *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -983,7 +984,7 @@ WERROR _wkssvc_NetrGetJoinableOus2(struc
+ 				   struct wkssvc_NetrGetJoinableOus2 *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -994,7 +995,7 @@ WERROR _wkssvc_NetrAddAlternateComputerN
+ 					    struct wkssvc_NetrAddAlternateComputerName *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -1005,7 +1006,7 @@ WERROR _wkssvc_NetrRemoveAlternateComput
+ 					       struct wkssvc_NetrRemoveAlternateComputerName *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -1016,7 +1017,7 @@ WERROR _wkssvc_NetrSetPrimaryComputernam
+ 					  struct wkssvc_NetrSetPrimaryComputername *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+ 
+@@ -1027,6 +1028,6 @@ WERROR _wkssvc_NetrEnumerateComputerName
+ 					  struct wkssvc_NetrEnumerateComputerNames *r)
+ {
+ 	/* FIXME: Add implementation code here */
+-	p->rng_fault_state = True;
++	p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
+ 	return WERR_NOT_SUPPORTED;
+ }
+--- a/libcli/auth/smbencrypt.c
++++ b/libcli/auth/smbencrypt.c
+@@ -355,11 +355,18 @@ DATA_BLOB NTLMv2_generate_names_blob(TAL
+ 	DATA_BLOB names_blob = data_blob_talloc(mem_ctx, NULL, 0);
+ 
+ 	/* Deliberately ignore return here.. */
+-	(void)msrpc_gen(mem_ctx, &names_blob,
+-		  "aaa",
+-		  MsvAvNbDomainName, domain,
+-		  MsvAvNbComputerName, hostname,
+-		  MsvAvEOL, "");
++	if (hostname != NULL) {
++		(void)msrpc_gen(mem_ctx, &names_blob,
++			  "aaa",
++			  MsvAvNbDomainName, domain,
++			  MsvAvNbComputerName, hostname,
++			  MsvAvEOL, "");
++	} else {
++		(void)msrpc_gen(mem_ctx, &names_blob,
++			  "aa",
++			  MsvAvNbDomainName, domain,
++			  MsvAvEOL, "");
++	}
+ 	return names_blob;
+ }
+ 
diff --git a/package/network/services/samba36/patches/021-CVE-preparation-v3-6-addition.patch b/package/network/services/samba36/patches/021-CVE-preparation-v3-6-addition.patch
new file mode 100644
index 0000000000000000000000000000000000000000..dedd453be2095f8801defc56c1b477541f47babe
--- /dev/null
+++ b/package/network/services/samba36/patches/021-CVE-preparation-v3-6-addition.patch
@@ -0,0 +1,9515 @@
+--- a/source3/librpc/gen_ndr/srv_atsvc.c
++++ b/source3/librpc/gen_ndr/srv_atsvc.c
+@@ -51,7 +51,7 @@ static bool api_atsvc_JobAdd(struct pipe
+ 
+ 	r->out.result = _atsvc_JobAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -124,7 +124,7 @@ static bool api_atsvc_JobDel(struct pipe
+ 
+ 	r->out.result = _atsvc_JobDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -206,7 +206,7 @@ static bool api_atsvc_JobEnum(struct pip
+ 
+ 	r->out.result = _atsvc_JobEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -286,7 +286,7 @@ static bool api_atsvc_JobGetInfo(struct
+ 
+ 	r->out.result = _atsvc_JobGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_audiosrv.c
++++ b/source3/librpc/gen_ndr/srv_audiosrv.c
+@@ -44,7 +44,7 @@ static bool api_audiosrv_CreatezoneFacto
+ 
+ 	_audiosrv_CreatezoneFactoriesList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_audiosrv_CreateGfxFactor
+ 
+ 	_audiosrv_CreateGfxFactoriesList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_audiosrv_CreateGfxList(s
+ 
+ 	_audiosrv_CreateGfxList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_audiosrv_RemoveGfx(struc
+ 
+ 	_audiosrv_RemoveGfx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_audiosrv_AddGfx(struct p
+ 
+ 	_audiosrv_AddGfx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -409,7 +409,7 @@ static bool api_audiosrv_ModifyGfx(struc
+ 
+ 	_audiosrv_ModifyGfx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -482,7 +482,7 @@ static bool api_audiosrv_OpenGfx(struct
+ 
+ 	_audiosrv_OpenGfx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -555,7 +555,7 @@ static bool api_audiosrv_Logon(struct pi
+ 
+ 	_audiosrv_Logon(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -628,7 +628,7 @@ static bool api_audiosrv_Logoff(struct p
+ 
+ 	_audiosrv_Logoff(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -701,7 +701,7 @@ static bool api_audiosrv_RegisterSession
+ 
+ 	_audiosrv_RegisterSessionNotificationEvent(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -774,7 +774,7 @@ static bool api_audiosrv_UnregisterSessi
+ 
+ 	_audiosrv_UnregisterSessionNotificationEvent(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -847,7 +847,7 @@ static bool api_audiosrv_SessionConnectS
+ 
+ 	_audiosrv_SessionConnectState(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -920,7 +920,7 @@ static bool api_audiosrv_DriverOpenDrvRe
+ 
+ 	_audiosrv_DriverOpenDrvRegKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -993,7 +993,7 @@ static bool api_audiosrv_AdvisePreferred
+ 
+ 	_audiosrv_AdvisePreferredDeviceChange(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1066,7 +1066,7 @@ static bool api_audiosrv_GetPnpInfo(stru
+ 
+ 	_audiosrv_GetPnpInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_backupkey.c
++++ b/source3/librpc/gen_ndr/srv_backupkey.c
+@@ -57,7 +57,7 @@ static bool api_bkrp_BackupKey(struct pi
+ 
+ 	r->out.result = _bkrp_BackupKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_browser.c
++++ b/source3/librpc/gen_ndr/srv_browser.c
+@@ -44,7 +44,7 @@ static bool api_BrowserrServerEnum(struc
+ 
+ 	_BrowserrServerEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_BrowserrDebugCall(struct
+ 
+ 	_BrowserrDebugCall(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -198,7 +198,7 @@ static bool api_BrowserrQueryOtherDomain
+ 
+ 	r->out.result = _BrowserrQueryOtherDomains(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -271,7 +271,7 @@ static bool api_BrowserrResetNetlogonSta
+ 
+ 	_BrowserrResetNetlogonState(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -344,7 +344,7 @@ static bool api_BrowserrDebugTrace(struc
+ 
+ 	_BrowserrDebugTrace(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -417,7 +417,7 @@ static bool api_BrowserrQueryStatistics(
+ 
+ 	_BrowserrQueryStatistics(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -490,7 +490,7 @@ static bool api_BrowserResetStatistics(s
+ 
+ 	_BrowserResetStatistics(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -563,7 +563,7 @@ static bool api_NetrBrowserStatisticsCle
+ 
+ 	_NetrBrowserStatisticsClear(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -636,7 +636,7 @@ static bool api_NetrBrowserStatisticsGet
+ 
+ 	_NetrBrowserStatisticsGet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -709,7 +709,7 @@ static bool api_BrowserrSetNetlogonState
+ 
+ 	_BrowserrSetNetlogonState(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -782,7 +782,7 @@ static bool api_BrowserrQueryEmulatedDom
+ 
+ 	_BrowserrQueryEmulatedDomains(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -855,7 +855,7 @@ static bool api_BrowserrServerEnumEx(str
+ 
+ 	_BrowserrServerEnumEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dbgidl.c
++++ b/source3/librpc/gen_ndr/srv_dbgidl.c
+@@ -44,7 +44,7 @@ static bool api_dummy_dbgidl(struct pipe
+ 
+ 	_dummy_dbgidl(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dcom.c
++++ b/source3/librpc/gen_ndr/srv_dcom.c
+@@ -44,7 +44,7 @@ static bool api_UseProtSeq(struct pipes_
+ 
+ 	_UseProtSeq(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_GetCustomProtseqInfo(str
+ 
+ 	_GetCustomProtseqInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_UpdateResolverBindings(s
+ 
+ 	_UpdateResolverBindings(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -300,7 +300,7 @@ static bool api_QueryInterface(struct pi
+ 
+ 	r->out.result = _QueryInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -380,7 +380,7 @@ static bool api_AddRef(struct pipes_stru
+ 
+ 	r->out.result = _AddRef(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -460,7 +460,7 @@ static bool api_Release(struct pipes_str
+ 
+ 	r->out.result = _Release(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -570,7 +570,7 @@ static bool api_CreateInstance(struct pi
+ 
+ 	r->out.result = _CreateInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -650,7 +650,7 @@ static bool api_RemoteCreateInstance(str
+ 
+ 	r->out.result = _RemoteCreateInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -730,7 +730,7 @@ static bool api_LockServer(struct pipes_
+ 
+ 	r->out.result = _LockServer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -810,7 +810,7 @@ static bool api_RemoteLockServer(struct
+ 
+ 	r->out.result = _RemoteLockServer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -921,7 +921,7 @@ static bool api_RemQueryInterface(struct
+ 
+ 	r->out.result = _RemQueryInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1007,7 +1007,7 @@ static bool api_RemAddRef(struct pipes_s
+ 
+ 	r->out.result = _RemAddRef(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1087,7 +1087,7 @@ static bool api_RemRelease(struct pipes_
+ 
+ 	r->out.result = _RemRelease(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1197,7 +1197,7 @@ static bool api_GetClassObject(struct pi
+ 
+ 	_GetClassObject(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1299,7 +1299,7 @@ static bool api_ISCMLocalActivator_Creat
+ 
+ 	r->out.result = _ISCMLocalActivator_CreateInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1394,7 +1394,7 @@ static bool api_IMachineLocalActivator_f
+ 
+ 	r->out.result = _IMachineLocalActivator_foo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1489,7 +1489,7 @@ static bool api_ILocalObjectExporter_Foo
+ 
+ 	r->out.result = _ILocalObjectExporter_Foo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1603,7 +1603,7 @@ static bool api_ISystemActivatorRemoteCr
+ 
+ 	r->out.result = _ISystemActivatorRemoteCreateInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1717,7 +1717,7 @@ static bool api_RemQueryInterface2(struc
+ 
+ 	r->out.result = _RemQueryInterface2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1825,7 +1825,7 @@ static bool api_GetTypeInfoCount(struct
+ 
+ 	r->out.result = _GetTypeInfoCount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1911,7 +1911,7 @@ static bool api_GetTypeInfo(struct pipes
+ 
+ 	r->out.result = _GetTypeInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1997,7 +1997,7 @@ static bool api_GetIDsOfNames(struct pip
+ 
+ 	r->out.result = _GetIDsOfNames(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2096,7 +2096,7 @@ static bool api_Invoke(struct pipes_stru
+ 
+ 	r->out.result = _Invoke(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2201,7 +2201,7 @@ static bool api_MarshalInterface(struct
+ 
+ 	r->out.result = _MarshalInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2281,7 +2281,7 @@ static bool api_UnMarshalInterface(struc
+ 
+ 	r->out.result = _UnMarshalInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2384,7 +2384,7 @@ static bool api_MakeCoffee(struct pipes_
+ 
+ 	r->out.result = _MakeCoffee(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2498,7 +2498,7 @@ static bool api_Read(struct pipes_struct
+ 
+ 	r->out.result = _Read(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2584,7 +2584,7 @@ static bool api_Write(struct pipes_struc
+ 
+ 	r->out.result = _Write(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dfsblobs.c
++++ b/source3/librpc/gen_ndr/srv_dfsblobs.c
+@@ -51,7 +51,7 @@ static bool api_dfs_GetDFSReferral(struc
+ 
+ 	_dfs_GetDFSReferral(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dfs.c
++++ b/source3/librpc/gen_ndr/srv_dfs.c
+@@ -51,7 +51,7 @@ static bool api_dfs_GetManagerVersion(st
+ 
+ 	_dfs_GetManagerVersion(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -124,7 +124,7 @@ static bool api_dfs_Add(struct pipes_str
+ 
+ 	r->out.result = _dfs_Add(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -197,7 +197,7 @@ static bool api_dfs_Remove(struct pipes_
+ 
+ 	r->out.result = _dfs_Remove(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -270,7 +270,7 @@ static bool api_dfs_SetInfo(struct pipes
+ 
+ 	r->out.result = _dfs_SetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -350,7 +350,7 @@ static bool api_dfs_GetInfo(struct pipes
+ 
+ 	r->out.result = _dfs_GetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -426,7 +426,7 @@ static bool api_dfs_Enum(struct pipes_st
+ 	r->out.total = r->in.total;
+ 	r->out.result = _dfs_Enum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -499,7 +499,7 @@ static bool api_dfs_Rename(struct pipes_
+ 
+ 	r->out.result = _dfs_Rename(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -572,7 +572,7 @@ static bool api_dfs_Move(struct pipes_st
+ 
+ 	r->out.result = _dfs_Move(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -645,7 +645,7 @@ static bool api_dfs_ManagerGetConfigInfo
+ 
+ 	r->out.result = _dfs_ManagerGetConfigInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -718,7 +718,7 @@ static bool api_dfs_ManagerSendSiteInfo(
+ 
+ 	r->out.result = _dfs_ManagerSendSiteInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -793,7 +793,7 @@ static bool api_dfs_AddFtRoot(struct pip
+ 	r->out.unknown2 = r->in.unknown2;
+ 	r->out.result = _dfs_AddFtRoot(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -868,7 +868,7 @@ static bool api_dfs_RemoveFtRoot(struct
+ 	r->out.unknown = r->in.unknown;
+ 	r->out.result = _dfs_RemoveFtRoot(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -941,7 +941,7 @@ static bool api_dfs_AddStdRoot(struct pi
+ 
+ 	r->out.result = _dfs_AddStdRoot(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1014,7 +1014,7 @@ static bool api_dfs_RemoveStdRoot(struct
+ 
+ 	r->out.result = _dfs_RemoveStdRoot(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1087,7 +1087,7 @@ static bool api_dfs_ManagerInitialize(st
+ 
+ 	r->out.result = _dfs_ManagerInitialize(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1160,7 +1160,7 @@ static bool api_dfs_AddStdRootForced(str
+ 
+ 	r->out.result = _dfs_AddStdRootForced(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1237,7 +1237,7 @@ static bool api_dfs_GetDcAddress(struct
+ 	r->out.ttl = r->in.ttl;
+ 	r->out.result = _dfs_GetDcAddress(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1310,7 +1310,7 @@ static bool api_dfs_SetDcAddress(struct
+ 
+ 	r->out.result = _dfs_SetDcAddress(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1383,7 +1383,7 @@ static bool api_dfs_FlushFtTable(struct
+ 
+ 	r->out.result = _dfs_FlushFtTable(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1456,7 +1456,7 @@ static bool api_dfs_Add2(struct pipes_st
+ 
+ 	r->out.result = _dfs_Add2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1529,7 +1529,7 @@ static bool api_dfs_Remove2(struct pipes
+ 
+ 	r->out.result = _dfs_Remove2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1605,7 +1605,7 @@ static bool api_dfs_EnumEx(struct pipes_
+ 	r->out.total = r->in.total;
+ 	r->out.result = _dfs_EnumEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1678,7 +1678,7 @@ static bool api_dfs_SetInfo2(struct pipe
+ 
+ 	r->out.result = _dfs_SetInfo2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dns.c
++++ b/source3/librpc/gen_ndr/srv_dns.c
+@@ -44,7 +44,7 @@ static bool api_decode_dns_name_packet(s
+ 
+ 	_decode_dns_name_packet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dnsp.c
++++ b/source3/librpc/gen_ndr/srv_dnsp.c
+@@ -44,7 +44,7 @@ static bool api_decode_DnssrvRpcRecord(s
+ 
+ 	_decode_DnssrvRpcRecord(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dnsserver.c
++++ b/source3/librpc/gen_ndr/srv_dnsserver.c
+@@ -44,7 +44,7 @@ static bool api_dnsserver_foo(struct pip
+ 
+ 	_dnsserver_foo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_drsblobs.c
++++ b/source3/librpc/gen_ndr/srv_drsblobs.c
+@@ -44,7 +44,7 @@ static bool api_decode_replPropertyMetaD
+ 
+ 	_decode_replPropertyMetaData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_decode_replUpToDateVecto
+ 
+ 	_decode_replUpToDateVector(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_decode_repsFromTo(struct
+ 
+ 	_decode_repsFromTo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_decode_partialAttributeS
+ 
+ 	_decode_partialAttributeSet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_decode_prefixMap(struct
+ 
+ 	_decode_prefixMap(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -409,7 +409,7 @@ static bool api_decode_ldapControlDirSyn
+ 
+ 	_decode_ldapControlDirSync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -482,7 +482,7 @@ static bool api_decode_supplementalCrede
+ 
+ 	_decode_supplementalCredentials(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -555,7 +555,7 @@ static bool api_decode_Packages(struct p
+ 
+ 	_decode_Packages(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -628,7 +628,7 @@ static bool api_decode_PrimaryKerberos(s
+ 
+ 	_decode_PrimaryKerberos(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -701,7 +701,7 @@ static bool api_decode_PrimaryCLEARTEXT(
+ 
+ 	_decode_PrimaryCLEARTEXT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -774,7 +774,7 @@ static bool api_decode_PrimaryWDigest(st
+ 
+ 	_decode_PrimaryWDigest(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -847,7 +847,7 @@ static bool api_decode_trustAuthInOut(st
+ 
+ 	_decode_trustAuthInOut(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -920,7 +920,7 @@ static bool api_decode_trustDomainPasswo
+ 
+ 	_decode_trustDomainPasswords(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -993,7 +993,7 @@ static bool api_decode_ExtendedErrorInfo
+ 
+ 	_decode_ExtendedErrorInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1066,7 +1066,7 @@ static bool api_decode_ForestTrustInfo(s
+ 
+ 	_decode_ForestTrustInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_drsuapi.c
++++ b/source3/librpc/gen_ndr/srv_drsuapi.c
+@@ -52,7 +52,7 @@ static bool api_drsuapi_DsBind(struct pi
+ 
+ 	r->out.result = _drsuapi_DsBind(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -127,7 +127,7 @@ static bool api_drsuapi_DsUnbind(struct
+ 	r->out.bind_handle = r->in.bind_handle;
+ 	r->out.result = _drsuapi_DsUnbind(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -200,7 +200,7 @@ static bool api_drsuapi_DsReplicaSync(st
+ 
+ 	r->out.result = _drsuapi_DsReplicaSync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -286,7 +286,7 @@ static bool api_drsuapi_DsGetNCChanges(s
+ 
+ 	r->out.result = _drsuapi_DsGetNCChanges(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -359,7 +359,7 @@ static bool api_drsuapi_DsReplicaUpdateR
+ 
+ 	r->out.result = _drsuapi_DsReplicaUpdateRefs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -432,7 +432,7 @@ static bool api_drsuapi_DsReplicaAdd(str
+ 
+ 	r->out.result = _drsuapi_DsReplicaAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -505,7 +505,7 @@ static bool api_drsuapi_DsReplicaDel(str
+ 
+ 	r->out.result = _drsuapi_DsReplicaDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -578,7 +578,7 @@ static bool api_drsuapi_DsReplicaMod(str
+ 
+ 	r->out.result = _drsuapi_DsReplicaMod(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -651,7 +651,7 @@ static bool api_DRSUAPI_VERIFY_NAMES(str
+ 
+ 	r->out.result = _DRSUAPI_VERIFY_NAMES(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -737,7 +737,7 @@ static bool api_drsuapi_DsGetMemberships
+ 
+ 	r->out.result = _drsuapi_DsGetMemberships(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -810,7 +810,7 @@ static bool api_DRSUAPI_INTER_DOMAIN_MOV
+ 
+ 	r->out.result = _DRSUAPI_INTER_DOMAIN_MOVE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -896,7 +896,7 @@ static bool api_drsuapi_DsGetNT4ChangeLo
+ 
+ 	r->out.result = _drsuapi_DsGetNT4ChangeLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -982,7 +982,7 @@ static bool api_drsuapi_DsCrackNames(str
+ 
+ 	r->out.result = _drsuapi_DsCrackNames(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1068,7 +1068,7 @@ static bool api_drsuapi_DsWriteAccountSp
+ 
+ 	r->out.result = _drsuapi_DsWriteAccountSpn(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1154,7 +1154,7 @@ static bool api_drsuapi_DsRemoveDSServer
+ 
+ 	r->out.result = _drsuapi_DsRemoveDSServer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1227,7 +1227,7 @@ static bool api_DRSUAPI_REMOVE_DS_DOMAIN
+ 
+ 	r->out.result = _DRSUAPI_REMOVE_DS_DOMAIN(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1313,7 +1313,7 @@ static bool api_drsuapi_DsGetDomainContr
+ 
+ 	r->out.result = _drsuapi_DsGetDomainControllerInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1399,7 +1399,7 @@ static bool api_drsuapi_DsAddEntry(struc
+ 
+ 	r->out.result = _drsuapi_DsAddEntry(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1472,7 +1472,7 @@ static bool api_drsuapi_DsExecuteKCC(str
+ 
+ 	r->out.result = _drsuapi_DsExecuteKCC(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1558,7 +1558,7 @@ static bool api_drsuapi_DsReplicaGetInfo
+ 
+ 	r->out.result = _drsuapi_DsReplicaGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1631,7 +1631,7 @@ static bool api_DRSUAPI_ADD_SID_HISTORY(
+ 
+ 	r->out.result = _DRSUAPI_ADD_SID_HISTORY(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1717,7 +1717,7 @@ static bool api_drsuapi_DsGetMemberships
+ 
+ 	r->out.result = _drsuapi_DsGetMemberships2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1790,7 +1790,7 @@ static bool api_DRSUAPI_REPLICA_VERIFY_O
+ 
+ 	r->out.result = _DRSUAPI_REPLICA_VERIFY_OBJECTS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1863,7 +1863,7 @@ static bool api_DRSUAPI_GET_OBJECT_EXIST
+ 
+ 	r->out.result = _DRSUAPI_GET_OBJECT_EXISTENCE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1949,7 +1949,7 @@ static bool api_drsuapi_QuerySitesByCost
+ 
+ 	r->out.result = _drsuapi_QuerySitesByCost(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dsbackup.c
++++ b/source3/librpc/gen_ndr/srv_dsbackup.c
+@@ -44,7 +44,7 @@ static bool api_HrRBackupPrepare(struct
+ 
+ 	_HrRBackupPrepare(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_HrRBackupEnd(struct pipe
+ 
+ 	_HrRBackupEnd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_HrRBackupGetAttachmentIn
+ 
+ 	_HrRBackupGetAttachmentInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_HrRBackupOpenFile(struct
+ 
+ 	_HrRBackupOpenFile(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_HrRBackupRead(struct pip
+ 
+ 	_HrRBackupRead(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -409,7 +409,7 @@ static bool api_HrRBackupClose(struct pi
+ 
+ 	_HrRBackupClose(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -482,7 +482,7 @@ static bool api_HrRBackupGetBackupLogs(s
+ 
+ 	_HrRBackupGetBackupLogs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -555,7 +555,7 @@ static bool api_HrRBackupTruncateLogs(st
+ 
+ 	_HrRBackupTruncateLogs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -628,7 +628,7 @@ static bool api_HrRBackupPing(struct pip
+ 
+ 	_HrRBackupPing(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -731,7 +731,7 @@ static bool api_HrRIsNTDSOnline(struct p
+ 
+ 	_HrRIsNTDSOnline(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -804,7 +804,7 @@ static bool api_HrRRestorePrepare(struct
+ 
+ 	_HrRRestorePrepare(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -877,7 +877,7 @@ static bool api_HrRRestoreRegister(struc
+ 
+ 	_HrRRestoreRegister(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -950,7 +950,7 @@ static bool api_HrRRestoreRegisterComple
+ 
+ 	_HrRRestoreRegisterComplete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1023,7 +1023,7 @@ static bool api_HrRRestoreGetDatabaseLoc
+ 
+ 	_HrRRestoreGetDatabaseLocations(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1096,7 +1096,7 @@ static bool api_HrRRestoreEnd(struct pip
+ 
+ 	_HrRRestoreEnd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1169,7 +1169,7 @@ static bool api_HrRRestoreSetCurrentLogN
+ 
+ 	_HrRRestoreSetCurrentLogNumber(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1242,7 +1242,7 @@ static bool api_HrRRestoreCheckLogsForBa
+ 
+ 	_HrRRestoreCheckLogsForBackup(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_dssetup.c
++++ b/source3/librpc/gen_ndr/srv_dssetup.c
+@@ -51,7 +51,7 @@ static bool api_dssetup_DsRoleGetPrimary
+ 
+ 	r->out.result = _dssetup_DsRoleGetPrimaryDomainInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -124,7 +124,7 @@ static bool api_dssetup_DsRoleDnsNameToF
+ 
+ 	r->out.result = _dssetup_DsRoleDnsNameToFlatName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -197,7 +197,7 @@ static bool api_dssetup_DsRoleDcAsDc(str
+ 
+ 	r->out.result = _dssetup_DsRoleDcAsDc(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -270,7 +270,7 @@ static bool api_dssetup_DsRoleDcAsReplic
+ 
+ 	r->out.result = _dssetup_DsRoleDcAsReplica(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -343,7 +343,7 @@ static bool api_dssetup_DsRoleDemoteDc(s
+ 
+ 	r->out.result = _dssetup_DsRoleDemoteDc(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -416,7 +416,7 @@ static bool api_dssetup_DsRoleGetDcOpera
+ 
+ 	r->out.result = _dssetup_DsRoleGetDcOperationProgress(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -489,7 +489,7 @@ static bool api_dssetup_DsRoleGetDcOpera
+ 
+ 	r->out.result = _dssetup_DsRoleGetDcOperationResults(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -562,7 +562,7 @@ static bool api_dssetup_DsRoleCancel(str
+ 
+ 	r->out.result = _dssetup_DsRoleCancel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -635,7 +635,7 @@ static bool api_dssetup_DsRoleServerSave
+ 
+ 	r->out.result = _dssetup_DsRoleServerSaveStateForUpgrade(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -708,7 +708,7 @@ static bool api_dssetup_DsRoleUpgradeDow
+ 
+ 	r->out.result = _dssetup_DsRoleUpgradeDownlevelServer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -781,7 +781,7 @@ static bool api_dssetup_DsRoleAbortDownl
+ 
+ 	r->out.result = _dssetup_DsRoleAbortDownlevelServerUpgrade(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_echo.c
++++ b/source3/librpc/gen_ndr/srv_echo.c
+@@ -51,7 +51,7 @@ static bool api_echo_AddOne(struct pipes
+ 
+ 	_echo_AddOne(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -131,7 +131,7 @@ static bool api_echo_EchoData(struct pip
+ 
+ 	_echo_EchoData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -204,7 +204,7 @@ static bool api_echo_SinkData(struct pip
+ 
+ 	_echo_SinkData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -284,7 +284,7 @@ static bool api_echo_SourceData(struct p
+ 
+ 	_echo_SourceData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -364,7 +364,7 @@ static bool api_echo_TestCall(struct pip
+ 
+ 	_echo_TestCall(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -444,7 +444,7 @@ static bool api_echo_TestCall2(struct pi
+ 
+ 	r->out.result = _echo_TestCall2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -517,7 +517,7 @@ static bool api_echo_TestSleep(struct pi
+ 
+ 	r->out.result = _echo_TestSleep(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -594,7 +594,7 @@ static bool api_echo_TestEnum(struct pip
+ 	r->out.foo3 = r->in.foo3;
+ 	_echo_TestEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -669,7 +669,7 @@ static bool api_echo_TestSurrounding(str
+ 	r->out.data = r->in.data;
+ 	_echo_TestSurrounding(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -742,7 +742,7 @@ static bool api_echo_TestDoublePointer(s
+ 
+ 	r->out.result = _echo_TestDoublePointer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_efs.c
++++ b/source3/librpc/gen_ndr/srv_efs.c
+@@ -51,7 +51,7 @@ static bool api_EfsRpcOpenFileRaw(struct
+ 
+ 	r->out.result = _EfsRpcOpenFileRaw(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -124,7 +124,7 @@ static bool api_EfsRpcReadFileRaw(struct
+ 
+ 	r->out.result = _EfsRpcReadFileRaw(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -197,7 +197,7 @@ static bool api_EfsRpcWriteFileRaw(struc
+ 
+ 	r->out.result = _EfsRpcWriteFileRaw(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -272,7 +272,7 @@ static bool api_EfsRpcCloseRaw(struct pi
+ 	r->out.pvContext = r->in.pvContext;
+ 	_EfsRpcCloseRaw(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -345,7 +345,7 @@ static bool api_EfsRpcEncryptFileSrv(str
+ 
+ 	r->out.result = _EfsRpcEncryptFileSrv(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -418,7 +418,7 @@ static bool api_EfsRpcDecryptFileSrv(str
+ 
+ 	r->out.result = _EfsRpcDecryptFileSrv(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -498,7 +498,7 @@ static bool api_EfsRpcQueryUsersOnFile(s
+ 
+ 	r->out.result = _EfsRpcQueryUsersOnFile(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -578,7 +578,7 @@ static bool api_EfsRpcQueryRecoveryAgent
+ 
+ 	r->out.result = _EfsRpcQueryRecoveryAgents(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -651,7 +651,7 @@ static bool api_EfsRpcRemoveUsersFromFil
+ 
+ 	r->out.result = _EfsRpcRemoveUsersFromFile(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -724,7 +724,7 @@ static bool api_EfsRpcAddUsersToFile(str
+ 
+ 	r->out.result = _EfsRpcAddUsersToFile(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -797,7 +797,7 @@ static bool api_EfsRpcSetFileEncryptionK
+ 
+ 	r->out.result = _EfsRpcSetFileEncryptionKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -870,7 +870,7 @@ static bool api_EfsRpcNotSupported(struc
+ 
+ 	r->out.result = _EfsRpcNotSupported(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -943,7 +943,7 @@ static bool api_EfsRpcFileKeyInfo(struct
+ 
+ 	r->out.result = _EfsRpcFileKeyInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1016,7 +1016,7 @@ static bool api_EfsRpcDuplicateEncryptio
+ 
+ 	r->out.result = _EfsRpcDuplicateEncryptionInfoFile(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_epmapper.c
++++ b/source3/librpc/gen_ndr/srv_epmapper.c
+@@ -44,7 +44,7 @@ static bool api_epm_Insert(struct pipes_
+ 
+ 	r->out.result = _epm_Insert(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_epm_Delete(struct pipes_
+ 
+ 	r->out.result = _epm_Delete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -204,7 +204,7 @@ static bool api_epm_Lookup(struct pipes_
+ 
+ 	r->out.result = _epm_Lookup(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -291,7 +291,7 @@ static bool api_epm_Map(struct pipes_str
+ 
+ 	r->out.result = _epm_Map(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -366,7 +366,7 @@ static bool api_epm_LookupHandleFree(str
+ 	r->out.entry_handle = r->in.entry_handle;
+ 	r->out.result = _epm_LookupHandleFree(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -439,7 +439,7 @@ static bool api_epm_InqObject(struct pip
+ 
+ 	r->out.result = _epm_InqObject(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -512,7 +512,7 @@ static bool api_epm_MgmtDelete(struct pi
+ 
+ 	r->out.result = _epm_MgmtDelete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -585,7 +585,7 @@ static bool api_epm_MapAuth(struct pipes
+ 
+ 	r->out.result = _epm_MapAuth(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_eventlog6.c
++++ b/source3/librpc/gen_ndr/srv_eventlog6.c
+@@ -75,7 +75,7 @@ static bool api_eventlog6_EvtRpcRegister
+ 
+ 	r->out.result = _eventlog6_EvtRpcRegisterRemoteSubscription(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -179,7 +179,7 @@ static bool api_eventlog6_EvtRpcRemoteSu
+ 
+ 	r->out.result = _eventlog6_EvtRpcRemoteSubscriptionNextAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -283,7 +283,7 @@ static bool api_eventlog6_EvtRpcRemoteSu
+ 
+ 	r->out.result = _eventlog6_EvtRpcRemoteSubscriptionNext(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -356,7 +356,7 @@ static bool api_eventlog6_EvtRpcRemoteSu
+ 
+ 	r->out.result = _eventlog6_EvtRpcRemoteSubscriptionWaitAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -436,7 +436,7 @@ static bool api_eventlog6_EvtRpcRegister
+ 
+ 	r->out.result = _eventlog6_EvtRpcRegisterControllableOperation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -540,7 +540,7 @@ static bool api_eventlog6_EvtRpcRegister
+ 
+ 	r->out.result = _eventlog6_EvtRpcRegisterLogQuery(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -620,7 +620,7 @@ static bool api_eventlog6_EvtRpcClearLog
+ 
+ 	r->out.result = _eventlog6_EvtRpcClearLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -700,7 +700,7 @@ static bool api_eventlog6_EvtRpcExportLo
+ 
+ 	r->out.result = _eventlog6_EvtRpcExportLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -780,7 +780,7 @@ static bool api_eventlog6_EvtRpcLocalize
+ 
+ 	r->out.result = _eventlog6_EvtRpcLocalizeExportLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -878,7 +878,7 @@ static bool api_eventlog6_EvtRpcMessageR
+ 
+ 	r->out.result = _eventlog6_EvtRpcMessageRender(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -976,7 +976,7 @@ static bool api_eventlog6_EvtRpcMessageR
+ 
+ 	r->out.result = _eventlog6_EvtRpcMessageRenderDefault(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1080,7 +1080,7 @@ static bool api_eventlog6_EvtRpcQueryNex
+ 
+ 	r->out.result = _eventlog6_EvtRpcQueryNext(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1160,7 +1160,7 @@ static bool api_eventlog6_EvtRpcQuerySee
+ 
+ 	r->out.result = _eventlog6_EvtRpcQuerySeek(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1235,7 +1235,7 @@ static bool api_eventlog6_EvtRpcClose(st
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _eventlog6_EvtRpcClose(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1308,7 +1308,7 @@ static bool api_eventlog6_EvtRpcCancel(s
+ 
+ 	r->out.result = _eventlog6_EvtRpcCancel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1381,7 +1381,7 @@ static bool api_eventlog6_EvtRpcAssertCo
+ 
+ 	r->out.result = _eventlog6_EvtRpcAssertConfig(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1454,7 +1454,7 @@ static bool api_eventlog6_EvtRpcRetractC
+ 
+ 	r->out.result = _eventlog6_EvtRpcRetractConfig(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1540,7 +1540,7 @@ static bool api_eventlog6_EvtRpcOpenLogH
+ 
+ 	r->out.result = _eventlog6_EvtRpcOpenLogHandle(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1626,7 +1626,7 @@ static bool api_eventlog6_EvtRpcGetLogFi
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetLogFileInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1712,7 +1712,7 @@ static bool api_eventlog6_EvtRpcGetChann
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetChannelList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1792,7 +1792,7 @@ static bool api_eventlog6_EvtRpcGetChann
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetChannelConfig(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1872,7 +1872,7 @@ static bool api_eventlog6_EvtRpcPutChann
+ 
+ 	r->out.result = _eventlog6_EvtRpcPutChannelConfig(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1958,7 +1958,7 @@ static bool api_eventlog6_EvtRpcGetPubli
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetPublisherList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2044,7 +2044,7 @@ static bool api_eventlog6_EvtRpcGetPubli
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetPublisherListForChannel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2130,7 +2130,7 @@ static bool api_eventlog6_EvtRpcGetPubli
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetPublisherMetadata(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2210,7 +2210,7 @@ static bool api_eventlog6_EvtRpcGetPubli
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetPublisherResourceMetadata(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2290,7 +2290,7 @@ static bool api_eventlog6_EvtRpcGetEvent
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetEventMetadataEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2376,7 +2376,7 @@ static bool api_eventlog6_EvtRpcGetNextE
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetNextEventMetadata(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2456,7 +2456,7 @@ static bool api_eventlog6_EvtRpcGetClass
+ 
+ 	r->out.result = _eventlog6_EvtRpcGetClassicLogDisplayName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_eventlog.c
++++ b/source3/librpc/gen_ndr/srv_eventlog.c
+@@ -44,7 +44,7 @@ static bool api_eventlog_ClearEventLogW(
+ 
+ 	r->out.result = _eventlog_ClearEventLogW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_eventlog_BackupEventLogW
+ 
+ 	r->out.result = _eventlog_BackupEventLogW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -192,7 +192,7 @@ static bool api_eventlog_CloseEventLog(s
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _eventlog_CloseEventLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -267,7 +267,7 @@ static bool api_eventlog_DeregisterEvent
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _eventlog_DeregisterEventSource(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -347,7 +347,7 @@ static bool api_eventlog_GetNumRecords(s
+ 
+ 	r->out.result = _eventlog_GetNumRecords(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -427,7 +427,7 @@ static bool api_eventlog_GetOldestRecord
+ 
+ 	r->out.result = _eventlog_GetOldestRecord(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -500,7 +500,7 @@ static bool api_eventlog_ChangeNotify(st
+ 
+ 	r->out.result = _eventlog_ChangeNotify(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -580,7 +580,7 @@ static bool api_eventlog_OpenEventLogW(s
+ 
+ 	r->out.result = _eventlog_OpenEventLogW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -660,7 +660,7 @@ static bool api_eventlog_RegisterEventSo
+ 
+ 	r->out.result = _eventlog_RegisterEventSourceW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -740,7 +740,7 @@ static bool api_eventlog_OpenBackupEvent
+ 
+ 	r->out.result = _eventlog_OpenBackupEventLogW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -832,7 +832,7 @@ static bool api_eventlog_ReadEventLogW(s
+ 
+ 	r->out.result = _eventlog_ReadEventLogW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -908,7 +908,7 @@ static bool api_eventlog_ReportEventW(st
+ 	r->out.time_written = r->in.time_written;
+ 	r->out.result = _eventlog_ReportEventW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -981,7 +981,7 @@ static bool api_eventlog_ClearEventLogA(
+ 
+ 	r->out.result = _eventlog_ClearEventLogA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1054,7 +1054,7 @@ static bool api_eventlog_BackupEventLogA
+ 
+ 	r->out.result = _eventlog_BackupEventLogA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1127,7 +1127,7 @@ static bool api_eventlog_OpenEventLogA(s
+ 
+ 	r->out.result = _eventlog_OpenEventLogA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1200,7 +1200,7 @@ static bool api_eventlog_RegisterEventSo
+ 
+ 	r->out.result = _eventlog_RegisterEventSourceA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1273,7 +1273,7 @@ static bool api_eventlog_OpenBackupEvent
+ 
+ 	r->out.result = _eventlog_OpenBackupEventLogA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1346,7 +1346,7 @@ static bool api_eventlog_ReadEventLogA(s
+ 
+ 	r->out.result = _eventlog_ReadEventLogA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1419,7 +1419,7 @@ static bool api_eventlog_ReportEventA(st
+ 
+ 	r->out.result = _eventlog_ReportEventA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1492,7 +1492,7 @@ static bool api_eventlog_RegisterCluster
+ 
+ 	r->out.result = _eventlog_RegisterClusterSvc(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1565,7 +1565,7 @@ static bool api_eventlog_DeregisterClust
+ 
+ 	r->out.result = _eventlog_DeregisterClusterSvc(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1638,7 +1638,7 @@ static bool api_eventlog_WriteClusterEve
+ 
+ 	r->out.result = _eventlog_WriteClusterEvents(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1724,7 +1724,7 @@ static bool api_eventlog_GetLogInformati
+ 
+ 	r->out.result = _eventlog_GetLogInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1797,7 +1797,7 @@ static bool api_eventlog_FlushEventLog(s
+ 
+ 	r->out.result = _eventlog_FlushEventLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1873,7 +1873,7 @@ static bool api_eventlog_ReportEventAndS
+ 	r->out.time_written = r->in.time_written;
+ 	r->out.result = _eventlog_ReportEventAndSourceW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_frsapi.c
++++ b/source3/librpc/gen_ndr/srv_frsapi.c
+@@ -44,7 +44,7 @@ static bool api_FRSAPI_VERIFY_PROMOTION(
+ 
+ 	_FRSAPI_VERIFY_PROMOTION(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_FRSAPI_PROMOTION_STATUS(
+ 
+ 	_FRSAPI_PROMOTION_STATUS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_FRSAPI_START_DEMOTION(st
+ 
+ 	_FRSAPI_START_DEMOTION(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_FRSAPI_COMMIT_DEMOTION(s
+ 
+ 	_FRSAPI_COMMIT_DEMOTION(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_frsapi_SetDsPollingInter
+ 
+ 	r->out.result = _frsapi_SetDsPollingIntervalW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -428,7 +428,7 @@ static bool api_frsapi_GetDsPollingInter
+ 
+ 	r->out.result = _frsapi_GetDsPollingIntervalW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -501,7 +501,7 @@ static bool api_FRSAPI_VERIFY_PROMOTION_
+ 
+ 	_FRSAPI_VERIFY_PROMOTION_W(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -576,7 +576,7 @@ static bool api_frsapi_InfoW(struct pipe
+ 	r->out.info = r->in.info;
+ 	r->out.result = _frsapi_InfoW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -674,7 +674,7 @@ static bool api_frsapi_IsPathReplicated(
+ 
+ 	r->out.result = _frsapi_IsPathReplicated(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -747,7 +747,7 @@ static bool api_frsapi_WriterCommand(str
+ 
+ 	r->out.result = _frsapi_WriterCommand(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -820,7 +820,7 @@ static bool api_frsapi_ForceReplication(
+ 
+ 	r->out.result = _frsapi_ForceReplication(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_frsrpc.c
++++ b/source3/librpc/gen_ndr/srv_frsrpc.c
+@@ -44,7 +44,7 @@ static bool api_frsrpc_FrsSendCommPkt(st
+ 
+ 	r->out.result = _frsrpc_FrsSendCommPkt(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_frsrpc_FrsVerifyPromotio
+ 
+ 	r->out.result = _frsrpc_FrsVerifyPromotionParent(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -192,7 +192,7 @@ static bool api_frsrpc_FrsStartPromotion
+ 	r->out.parent_guid = r->in.parent_guid;
+ 	r->out.result = _frsrpc_FrsStartPromotionParent(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -265,7 +265,7 @@ static bool api_frsrpc_FrsNOP(struct pip
+ 
+ 	r->out.result = _frsrpc_FrsNOP(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -338,7 +338,7 @@ static bool api_FRSRPC_BACKUP_COMPLETE(s
+ 
+ 	_FRSRPC_BACKUP_COMPLETE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -411,7 +411,7 @@ static bool api_FRSRPC_BACKUP_COMPLETE_5
+ 
+ 	_FRSRPC_BACKUP_COMPLETE_5(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -484,7 +484,7 @@ static bool api_FRSRPC_BACKUP_COMPLETE_6
+ 
+ 	_FRSRPC_BACKUP_COMPLETE_6(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -557,7 +557,7 @@ static bool api_FRSRPC_BACKUP_COMPLETE_7
+ 
+ 	_FRSRPC_BACKUP_COMPLETE_7(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -630,7 +630,7 @@ static bool api_FRSRPC_BACKUP_COMPLETE_8
+ 
+ 	_FRSRPC_BACKUP_COMPLETE_8(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -703,7 +703,7 @@ static bool api_FRSRPC_BACKUP_COMPLETE_9
+ 
+ 	_FRSRPC_BACKUP_COMPLETE_9(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -776,7 +776,7 @@ static bool api_FRSRPC_VERIFY_PROMOTION_
+ 
+ 	_FRSRPC_VERIFY_PROMOTION_PARENT_EX(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_frstrans.c
++++ b/source3/librpc/gen_ndr/srv_frstrans.c
+@@ -44,7 +44,7 @@ static bool api_frstrans_CheckConnectivi
+ 
+ 	r->out.result = _frstrans_CheckConnectivity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -130,7 +130,7 @@ static bool api_frstrans_EstablishConnec
+ 
+ 	r->out.result = _frstrans_EstablishConnection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -203,7 +203,7 @@ static bool api_frstrans_EstablishSessio
+ 
+ 	r->out.result = _frstrans_EstablishSession(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -307,7 +307,7 @@ static bool api_frstrans_RequestUpdates(
+ 
+ 	r->out.result = _frstrans_RequestUpdates(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -380,7 +380,7 @@ static bool api_frstrans_RequestVersionV
+ 
+ 	r->out.result = _frstrans_RequestVersionVector(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -460,7 +460,7 @@ static bool api_frstrans_AsyncPoll(struc
+ 
+ 	r->out.result = _frstrans_AsyncPoll(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -533,7 +533,7 @@ static bool api_FRSTRANS_REQUEST_RECORDS
+ 
+ 	_FRSTRANS_REQUEST_RECORDS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -606,7 +606,7 @@ static bool api_FRSTRANS_UPDATE_CANCEL(s
+ 
+ 	_FRSTRANS_UPDATE_CANCEL(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -679,7 +679,7 @@ static bool api_FRSTRANS_RAW_GET_FILE_DA
+ 
+ 	_FRSTRANS_RAW_GET_FILE_DATA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -752,7 +752,7 @@ static bool api_FRSTRANS_RDC_GET_SIGNATU
+ 
+ 	_FRSTRANS_RDC_GET_SIGNATURES(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -825,7 +825,7 @@ static bool api_FRSTRANS_RDC_PUSH_SOURCE
+ 
+ 	_FRSTRANS_RDC_PUSH_SOURCE_NEEDS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -898,7 +898,7 @@ static bool api_FRSTRANS_RDC_GET_FILE_DA
+ 
+ 	_FRSTRANS_RDC_GET_FILE_DATA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -971,7 +971,7 @@ static bool api_FRSTRANS_RDC_CLOSE(struc
+ 
+ 	_FRSTRANS_RDC_CLOSE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1077,7 +1077,7 @@ static bool api_frstrans_InitializeFileT
+ 
+ 	r->out.result = _frstrans_InitializeFileTransferAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1150,7 +1150,7 @@ static bool api_FRSTRANS_OPNUM_0E_NOT_US
+ 
+ 	_FRSTRANS_OPNUM_0E_NOT_USED_ON_THE_WIRE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1230,7 +1230,7 @@ static bool api_frstrans_RawGetFileDataA
+ 
+ 	r->out.result = _frstrans_RawGetFileDataAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1310,7 +1310,7 @@ static bool api_frstrans_RdcGetFileDataA
+ 
+ 	r->out.result = _frstrans_RdcGetFileDataAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_initshutdown.c
++++ b/source3/librpc/gen_ndr/srv_initshutdown.c
+@@ -44,7 +44,7 @@ static bool api_initshutdown_Init(struct
+ 
+ 	r->out.result = _initshutdown_Init(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_initshutdown_Abort(struc
+ 
+ 	r->out.result = _initshutdown_Abort(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_initshutdown_InitEx(stru
+ 
+ 	r->out.result = _initshutdown_InitEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_keysvc.c
++++ b/source3/librpc/gen_ndr/srv_keysvc.c
+@@ -44,7 +44,7 @@ static bool api_keysvc_Unknown0(struct p
+ 
+ 	r->out.result = _keysvc_Unknown0(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_krb5pac.c
++++ b/source3/librpc/gen_ndr/srv_krb5pac.c
+@@ -44,7 +44,7 @@ static bool api_decode_pac(struct pipes_
+ 
+ 	_decode_pac(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_decode_pac_raw(struct pi
+ 
+ 	_decode_pac_raw(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_decode_login_info(struct
+ 
+ 	_decode_login_info(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_decode_login_info_ctr(st
+ 
+ 	_decode_login_info_ctr(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_decode_pac_validate(stru
+ 
+ 	_decode_pac_validate(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_libnetapi.c
++++ b/source3/librpc/gen_ndr/srv_libnetapi.c
+@@ -44,7 +44,7 @@ static bool api_NetJoinDomain(struct pip
+ 
+ 	r->out.result = _NetJoinDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_NetUnjoinDomain(struct p
+ 
+ 	r->out.result = _NetUnjoinDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -203,7 +203,7 @@ static bool api_NetGetJoinInformation(st
+ 
+ 	r->out.result = _NetGetJoinInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -289,7 +289,7 @@ static bool api_NetGetJoinableOUs(struct
+ 
+ 	r->out.result = _NetGetJoinableOUs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -362,7 +362,7 @@ static bool api_NetRenameMachineInDomain
+ 
+ 	r->out.result = _NetRenameMachineInDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -442,7 +442,7 @@ static bool api_NetServerGetInfo(struct
+ 
+ 	r->out.result = _NetServerGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -522,7 +522,7 @@ static bool api_NetServerSetInfo(struct
+ 
+ 	r->out.result = _NetServerSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -602,7 +602,7 @@ static bool api_NetGetDCName(struct pipe
+ 
+ 	r->out.result = _NetGetDCName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -682,7 +682,7 @@ static bool api_NetGetAnyDCName(struct p
+ 
+ 	r->out.result = _NetGetAnyDCName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -762,7 +762,7 @@ static bool api_DsGetDcName(struct pipes
+ 
+ 	r->out.result = _DsGetDcName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -842,7 +842,7 @@ static bool api_NetUserAdd(struct pipes_
+ 
+ 	r->out.result = _NetUserAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -915,7 +915,7 @@ static bool api_NetUserDel(struct pipes_
+ 
+ 	r->out.result = _NetUserDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1008,7 +1008,7 @@ static bool api_NetUserEnum(struct pipes
+ 
+ 	r->out.result = _NetUserEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1081,7 +1081,7 @@ static bool api_NetUserChangePassword(st
+ 
+ 	r->out.result = _NetUserChangePassword(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1161,7 +1161,7 @@ static bool api_NetUserGetInfo(struct pi
+ 
+ 	r->out.result = _NetUserGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1241,7 +1241,7 @@ static bool api_NetUserSetInfo(struct pi
+ 
+ 	r->out.result = _NetUserSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1333,7 +1333,7 @@ static bool api_NetUserGetGroups(struct
+ 
+ 	r->out.result = _NetUserGetGroups(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1406,7 +1406,7 @@ static bool api_NetUserSetGroups(struct
+ 
+ 	r->out.result = _NetUserSetGroups(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1498,7 +1498,7 @@ static bool api_NetUserGetLocalGroups(st
+ 
+ 	r->out.result = _NetUserGetLocalGroups(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1578,7 +1578,7 @@ static bool api_NetUserModalsGet(struct
+ 
+ 	r->out.result = _NetUserModalsGet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1658,7 +1658,7 @@ static bool api_NetUserModalsSet(struct
+ 
+ 	r->out.result = _NetUserModalsSet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1744,7 +1744,7 @@ static bool api_NetQueryDisplayInformati
+ 
+ 	r->out.result = _NetQueryDisplayInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1824,7 +1824,7 @@ static bool api_NetGroupAdd(struct pipes
+ 
+ 	r->out.result = _NetGroupAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1897,7 +1897,7 @@ static bool api_NetGroupDel(struct pipes
+ 
+ 	r->out.result = _NetGroupDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1990,7 +1990,7 @@ static bool api_NetGroupEnum(struct pipe
+ 
+ 	r->out.result = _NetGroupEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2070,7 +2070,7 @@ static bool api_NetGroupSetInfo(struct p
+ 
+ 	r->out.result = _NetGroupSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2150,7 +2150,7 @@ static bool api_NetGroupGetInfo(struct p
+ 
+ 	r->out.result = _NetGroupGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2223,7 +2223,7 @@ static bool api_NetGroupAddUser(struct p
+ 
+ 	r->out.result = _NetGroupAddUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2296,7 +2296,7 @@ static bool api_NetGroupDelUser(struct p
+ 
+ 	r->out.result = _NetGroupDelUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2389,7 +2389,7 @@ static bool api_NetGroupGetUsers(struct
+ 
+ 	r->out.result = _NetGroupGetUsers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2462,7 +2462,7 @@ static bool api_NetGroupSetUsers(struct
+ 
+ 	r->out.result = _NetGroupSetUsers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2542,7 +2542,7 @@ static bool api_NetLocalGroupAdd(struct
+ 
+ 	r->out.result = _NetLocalGroupAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2615,7 +2615,7 @@ static bool api_NetLocalGroupDel(struct
+ 
+ 	r->out.result = _NetLocalGroupDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2695,7 +2695,7 @@ static bool api_NetLocalGroupGetInfo(str
+ 
+ 	r->out.result = _NetLocalGroupGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2775,7 +2775,7 @@ static bool api_NetLocalGroupSetInfo(str
+ 
+ 	r->out.result = _NetLocalGroupSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2868,7 +2868,7 @@ static bool api_NetLocalGroupEnum(struct
+ 
+ 	r->out.result = _NetLocalGroupEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2941,7 +2941,7 @@ static bool api_NetLocalGroupAddMembers(
+ 
+ 	r->out.result = _NetLocalGroupAddMembers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3014,7 +3014,7 @@ static bool api_NetLocalGroupDelMembers(
+ 
+ 	r->out.result = _NetLocalGroupDelMembers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3107,7 +3107,7 @@ static bool api_NetLocalGroupGetMembers(
+ 
+ 	r->out.result = _NetLocalGroupGetMembers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3180,7 +3180,7 @@ static bool api_NetLocalGroupSetMembers(
+ 
+ 	r->out.result = _NetLocalGroupSetMembers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3260,7 +3260,7 @@ static bool api_NetRemoteTOD(struct pipe
+ 
+ 	r->out.result = _NetRemoteTOD(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3340,7 +3340,7 @@ static bool api_NetShareAdd(struct pipes
+ 
+ 	r->out.result = _NetShareAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3413,7 +3413,7 @@ static bool api_NetShareDel(struct pipes
+ 
+ 	r->out.result = _NetShareDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3506,7 +3506,7 @@ static bool api_NetShareEnum(struct pipe
+ 
+ 	r->out.result = _NetShareEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3586,7 +3586,7 @@ static bool api_NetShareGetInfo(struct p
+ 
+ 	r->out.result = _NetShareGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3666,7 +3666,7 @@ static bool api_NetShareSetInfo(struct p
+ 
+ 	r->out.result = _NetShareSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3739,7 +3739,7 @@ static bool api_NetFileClose(struct pipe
+ 
+ 	r->out.result = _NetFileClose(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3819,7 +3819,7 @@ static bool api_NetFileGetInfo(struct pi
+ 
+ 	r->out.result = _NetFileGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3912,7 +3912,7 @@ static bool api_NetFileEnum(struct pipes
+ 
+ 	r->out.result = _NetFileEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3985,7 +3985,7 @@ static bool api_NetShutdownInit(struct p
+ 
+ 	r->out.result = _NetShutdownInit(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4058,7 +4058,7 @@ static bool api_NetShutdownAbort(struct
+ 
+ 	r->out.result = _NetShutdownAbort(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4138,7 +4138,7 @@ static bool api_I_NetLogonControl(struct
+ 
+ 	r->out.result = _I_NetLogonControl(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4218,7 +4218,7 @@ static bool api_I_NetLogonControl2(struc
+ 
+ 	r->out.result = _I_NetLogonControl2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_lsa.c
++++ b/source3/librpc/gen_ndr/srv_lsa.c
+@@ -46,7 +46,7 @@ static bool api_lsa_Close(struct pipes_s
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _lsa_Close(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -119,7 +119,7 @@ static bool api_lsa_Delete(struct pipes_
+ 
+ 	r->out.result = _lsa_Delete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -200,7 +200,7 @@ static bool api_lsa_EnumPrivs(struct pip
+ 
+ 	r->out.result = _lsa_EnumPrivs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -280,7 +280,7 @@ static bool api_lsa_QuerySecurity(struct
+ 
+ 	r->out.result = _lsa_QuerySecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -353,7 +353,7 @@ static bool api_lsa_SetSecObj(struct pip
+ 
+ 	r->out.result = _lsa_SetSecObj(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -426,7 +426,7 @@ static bool api_lsa_ChangePassword(struc
+ 
+ 	r->out.result = _lsa_ChangePassword(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -506,7 +506,7 @@ static bool api_lsa_OpenPolicy(struct pi
+ 
+ 	r->out.result = _lsa_OpenPolicy(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -586,7 +586,7 @@ static bool api_lsa_QueryInfoPolicy(stru
+ 
+ 	r->out.result = _lsa_QueryInfoPolicy(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -659,7 +659,7 @@ static bool api_lsa_SetInfoPolicy(struct
+ 
+ 	r->out.result = _lsa_SetInfoPolicy(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -732,7 +732,7 @@ static bool api_lsa_ClearAuditLog(struct
+ 
+ 	r->out.result = _lsa_ClearAuditLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -812,7 +812,7 @@ static bool api_lsa_CreateAccount(struct
+ 
+ 	r->out.result = _lsa_CreateAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -893,7 +893,7 @@ static bool api_lsa_EnumAccounts(struct
+ 
+ 	r->out.result = _lsa_EnumAccounts(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -973,7 +973,7 @@ static bool api_lsa_CreateTrustedDomain(
+ 
+ 	r->out.result = _lsa_CreateTrustedDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1054,7 +1054,7 @@ static bool api_lsa_EnumTrustDom(struct
+ 
+ 	r->out.result = _lsa_EnumTrustDom(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1136,7 +1136,7 @@ static bool api_lsa_LookupNames(struct p
+ 
+ 	r->out.result = _lsa_LookupNames(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1218,7 +1218,7 @@ static bool api_lsa_LookupSids(struct pi
+ 
+ 	r->out.result = _lsa_LookupSids(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1298,7 +1298,7 @@ static bool api_lsa_CreateSecret(struct
+ 
+ 	r->out.result = _lsa_CreateSecret(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1378,7 +1378,7 @@ static bool api_lsa_OpenAccount(struct p
+ 
+ 	r->out.result = _lsa_OpenAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1458,7 +1458,7 @@ static bool api_lsa_EnumPrivsAccount(str
+ 
+ 	r->out.result = _lsa_EnumPrivsAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1531,7 +1531,7 @@ static bool api_lsa_AddPrivilegesToAccou
+ 
+ 	r->out.result = _lsa_AddPrivilegesToAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1604,7 +1604,7 @@ static bool api_lsa_RemovePrivilegesFrom
+ 
+ 	r->out.result = _lsa_RemovePrivilegesFromAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1677,7 +1677,7 @@ static bool api_lsa_GetQuotasForAccount(
+ 
+ 	r->out.result = _lsa_GetQuotasForAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1750,7 +1750,7 @@ static bool api_lsa_SetQuotasForAccount(
+ 
+ 	r->out.result = _lsa_SetQuotasForAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1830,7 +1830,7 @@ static bool api_lsa_GetSystemAccessAccou
+ 
+ 	r->out.result = _lsa_GetSystemAccessAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1903,7 +1903,7 @@ static bool api_lsa_SetSystemAccessAccou
+ 
+ 	r->out.result = _lsa_SetSystemAccessAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1983,7 +1983,7 @@ static bool api_lsa_OpenTrustedDomain(st
+ 
+ 	r->out.result = _lsa_OpenTrustedDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2063,7 +2063,7 @@ static bool api_lsa_QueryTrustedDomainIn
+ 
+ 	r->out.result = _lsa_QueryTrustedDomainInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2136,7 +2136,7 @@ static bool api_lsa_SetInformationTruste
+ 
+ 	r->out.result = _lsa_SetInformationTrustedDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2216,7 +2216,7 @@ static bool api_lsa_OpenSecret(struct pi
+ 
+ 	r->out.result = _lsa_OpenSecret(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2289,7 +2289,7 @@ static bool api_lsa_SetSecret(struct pip
+ 
+ 	r->out.result = _lsa_SetSecret(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2367,7 +2367,7 @@ static bool api_lsa_QuerySecret(struct p
+ 	r->out.old_mtime = r->in.old_mtime;
+ 	r->out.result = _lsa_QuerySecret(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2447,7 +2447,7 @@ static bool api_lsa_LookupPrivValue(stru
+ 
+ 	r->out.result = _lsa_LookupPrivValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2527,7 +2527,7 @@ static bool api_lsa_LookupPrivName(struc
+ 
+ 	r->out.result = _lsa_LookupPrivName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2613,7 +2613,7 @@ static bool api_lsa_LookupPrivDisplayNam
+ 
+ 	r->out.result = _lsa_LookupPrivDisplayName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2688,7 +2688,7 @@ static bool api_lsa_DeleteObject(struct
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _lsa_DeleteObject(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2768,7 +2768,7 @@ static bool api_lsa_EnumAccountsWithUser
+ 
+ 	r->out.result = _lsa_EnumAccountsWithUserRight(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2848,7 +2848,7 @@ static bool api_lsa_EnumAccountRights(st
+ 
+ 	r->out.result = _lsa_EnumAccountRights(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2921,7 +2921,7 @@ static bool api_lsa_AddAccountRights(str
+ 
+ 	r->out.result = _lsa_AddAccountRights(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2994,7 +2994,7 @@ static bool api_lsa_RemoveAccountRights(
+ 
+ 	r->out.result = _lsa_RemoveAccountRights(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3074,7 +3074,7 @@ static bool api_lsa_QueryTrustedDomainIn
+ 
+ 	r->out.result = _lsa_QueryTrustedDomainInfoBySid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3147,7 +3147,7 @@ static bool api_lsa_SetTrustedDomainInfo
+ 
+ 	r->out.result = _lsa_SetTrustedDomainInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3220,7 +3220,7 @@ static bool api_lsa_DeleteTrustedDomain(
+ 
+ 	r->out.result = _lsa_DeleteTrustedDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3293,7 +3293,7 @@ static bool api_lsa_StorePrivateData(str
+ 
+ 	r->out.result = _lsa_StorePrivateData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3368,7 +3368,7 @@ static bool api_lsa_RetrievePrivateData(
+ 	r->out.val = r->in.val;
+ 	r->out.result = _lsa_RetrievePrivateData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3448,7 +3448,7 @@ static bool api_lsa_OpenPolicy2(struct p
+ 
+ 	r->out.result = _lsa_OpenPolicy2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3524,7 +3524,7 @@ static bool api_lsa_GetUserName(struct p
+ 	r->out.authority_name = r->in.authority_name;
+ 	r->out.result = _lsa_GetUserName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3604,7 +3604,7 @@ static bool api_lsa_QueryInfoPolicy2(str
+ 
+ 	r->out.result = _lsa_QueryInfoPolicy2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3677,7 +3677,7 @@ static bool api_lsa_SetInfoPolicy2(struc
+ 
+ 	r->out.result = _lsa_SetInfoPolicy2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3757,7 +3757,7 @@ static bool api_lsa_QueryTrustedDomainIn
+ 
+ 	r->out.result = _lsa_QueryTrustedDomainInfoByName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3830,7 +3830,7 @@ static bool api_lsa_SetTrustedDomainInfo
+ 
+ 	r->out.result = _lsa_SetTrustedDomainInfoByName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3911,7 +3911,7 @@ static bool api_lsa_EnumTrustedDomainsEx
+ 
+ 	r->out.result = _lsa_EnumTrustedDomainsEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3991,7 +3991,7 @@ static bool api_lsa_CreateTrustedDomainE
+ 
+ 	r->out.result = _lsa_CreateTrustedDomainEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4066,7 +4066,7 @@ static bool api_lsa_CloseTrustedDomainEx
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _lsa_CloseTrustedDomainEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4146,7 +4146,7 @@ static bool api_lsa_QueryDomainInformati
+ 
+ 	r->out.result = _lsa_QueryDomainInformationPolicy(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4219,7 +4219,7 @@ static bool api_lsa_SetDomainInformation
+ 
+ 	r->out.result = _lsa_SetDomainInformationPolicy(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4299,7 +4299,7 @@ static bool api_lsa_OpenTrustedDomainByN
+ 
+ 	r->out.result = _lsa_OpenTrustedDomainByName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4372,7 +4372,7 @@ static bool api_lsa_TestCall(struct pipe
+ 
+ 	r->out.result = _lsa_TestCall(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4454,7 +4454,7 @@ static bool api_lsa_LookupSids2(struct p
+ 
+ 	r->out.result = _lsa_LookupSids2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4536,7 +4536,7 @@ static bool api_lsa_LookupNames2(struct
+ 
+ 	r->out.result = _lsa_LookupNames2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4616,7 +4616,7 @@ static bool api_lsa_CreateTrustedDomainE
+ 
+ 	r->out.result = _lsa_CreateTrustedDomainEx2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4689,7 +4689,7 @@ static bool api_lsa_CREDRWRITE(struct pi
+ 
+ 	r->out.result = _lsa_CREDRWRITE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4762,7 +4762,7 @@ static bool api_lsa_CREDRREAD(struct pip
+ 
+ 	r->out.result = _lsa_CREDRREAD(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4835,7 +4835,7 @@ static bool api_lsa_CREDRENUMERATE(struc
+ 
+ 	r->out.result = _lsa_CREDRENUMERATE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4908,7 +4908,7 @@ static bool api_lsa_CREDRWRITEDOMAINCRED
+ 
+ 	r->out.result = _lsa_CREDRWRITEDOMAINCREDENTIALS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4981,7 +4981,7 @@ static bool api_lsa_CREDRREADDOMAINCREDE
+ 
+ 	r->out.result = _lsa_CREDRREADDOMAINCREDENTIALS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5054,7 +5054,7 @@ static bool api_lsa_CREDRDELETE(struct p
+ 
+ 	r->out.result = _lsa_CREDRDELETE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5127,7 +5127,7 @@ static bool api_lsa_CREDRGETTARGETINFO(s
+ 
+ 	r->out.result = _lsa_CREDRGETTARGETINFO(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5200,7 +5200,7 @@ static bool api_lsa_CREDRPROFILELOADED(s
+ 
+ 	r->out.result = _lsa_CREDRPROFILELOADED(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5282,7 +5282,7 @@ static bool api_lsa_LookupNames3(struct
+ 
+ 	r->out.result = _lsa_LookupNames3(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5355,7 +5355,7 @@ static bool api_lsa_CREDRGETSESSIONTYPES
+ 
+ 	r->out.result = _lsa_CREDRGETSESSIONTYPES(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5428,7 +5428,7 @@ static bool api_lsa_LSARREGISTERAUDITEVE
+ 
+ 	r->out.result = _lsa_LSARREGISTERAUDITEVENT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5501,7 +5501,7 @@ static bool api_lsa_LSARGENAUDITEVENT(st
+ 
+ 	r->out.result = _lsa_LSARGENAUDITEVENT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5574,7 +5574,7 @@ static bool api_lsa_LSARUNREGISTERAUDITE
+ 
+ 	r->out.result = _lsa_LSARUNREGISTERAUDITEVENT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5654,7 +5654,7 @@ static bool api_lsa_lsaRQueryForestTrust
+ 
+ 	r->out.result = _lsa_lsaRQueryForestTrustInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5734,7 +5734,7 @@ static bool api_lsa_lsaRSetForestTrustIn
+ 
+ 	r->out.result = _lsa_lsaRSetForestTrustInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5807,7 +5807,7 @@ static bool api_lsa_CREDRRENAME(struct p
+ 
+ 	r->out.result = _lsa_CREDRRENAME(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5889,7 +5889,7 @@ static bool api_lsa_LookupSids3(struct p
+ 
+ 	r->out.result = _lsa_LookupSids3(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5971,7 +5971,7 @@ static bool api_lsa_LookupNames4(struct
+ 
+ 	r->out.result = _lsa_LookupNames4(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6044,7 +6044,7 @@ static bool api_lsa_LSAROPENPOLICYSCE(st
+ 
+ 	r->out.result = _lsa_LSAROPENPOLICYSCE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6117,7 +6117,7 @@ static bool api_lsa_LSARADTREGISTERSECUR
+ 
+ 	r->out.result = _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6190,7 +6190,7 @@ static bool api_lsa_LSARADTUNREGISTERSEC
+ 
+ 	r->out.result = _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6263,7 +6263,7 @@ static bool api_lsa_LSARADTREPORTSECURIT
+ 
+ 	r->out.result = _lsa_LSARADTREPORTSECURITYEVENT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_mgmt.c
++++ b/source3/librpc/gen_ndr/srv_mgmt.c
+@@ -51,7 +51,7 @@ static bool api_mgmt_inq_if_ids(struct p
+ 
+ 	r->out.result = _mgmt_inq_if_ids(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -131,7 +131,7 @@ static bool api_mgmt_inq_stats(struct pi
+ 
+ 	r->out.result = _mgmt_inq_stats(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -211,7 +211,7 @@ static bool api_mgmt_is_server_listening
+ 
+ 	r->out.result = _mgmt_is_server_listening(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -284,7 +284,7 @@ static bool api_mgmt_stop_server_listeni
+ 
+ 	r->out.result = _mgmt_stop_server_listening(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -364,7 +364,7 @@ static bool api_mgmt_inq_princ_name(stru
+ 
+ 	r->out.result = _mgmt_inq_princ_name(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_msgsvc.c
++++ b/source3/librpc/gen_ndr/srv_msgsvc.c
+@@ -44,7 +44,7 @@ static bool api_NetrMessageNameAdd(struc
+ 
+ 	_NetrMessageNameAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_NetrMessageNameEnum(stru
+ 
+ 	_NetrMessageNameEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_NetrMessageNameGetInfo(s
+ 
+ 	_NetrMessageNameGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_NetrMessageNameDel(struc
+ 
+ 	_NetrMessageNameDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -361,7 +361,7 @@ static bool api_NetrSendMessage(struct p
+ 
+ 	_NetrSendMessage(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_nbt.c
++++ b/source3/librpc/gen_ndr/srv_nbt.c
+@@ -44,7 +44,7 @@ static bool api_decode_nbt_netlogon_pack
+ 
+ 	_decode_nbt_netlogon_packet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_netlogon.c
++++ b/source3/librpc/gen_ndr/srv_netlogon.c
+@@ -51,7 +51,7 @@ static bool api_netr_LogonUasLogon(struc
+ 
+ 	r->out.result = _netr_LogonUasLogon(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -131,7 +131,7 @@ static bool api_netr_LogonUasLogoff(stru
+ 
+ 	r->out.result = _netr_LogonUasLogoff(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -218,7 +218,7 @@ static bool api_netr_LogonSamLogon(struc
+ 
+ 	r->out.result = _netr_LogonSamLogon(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -293,7 +293,7 @@ static bool api_netr_LogonSamLogoff(stru
+ 	r->out.return_authenticator = r->in.return_authenticator;
+ 	r->out.result = _netr_LogonSamLogoff(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -373,7 +373,7 @@ static bool api_netr_ServerReqChallenge(
+ 
+ 	r->out.result = _netr_ServerReqChallenge(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -453,7 +453,7 @@ static bool api_netr_ServerAuthenticate(
+ 
+ 	r->out.result = _netr_ServerAuthenticate(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -533,7 +533,7 @@ static bool api_netr_ServerPasswordSet(s
+ 
+ 	r->out.result = _netr_ServerPasswordSet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -615,7 +615,7 @@ static bool api_netr_DatabaseDeltas(stru
+ 
+ 	r->out.result = _netr_DatabaseDeltas(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -697,7 +697,7 @@ static bool api_netr_DatabaseSync(struct
+ 
+ 	r->out.result = _netr_DatabaseSync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -796,7 +796,7 @@ static bool api_netr_AccountDeltas(struc
+ 
+ 	r->out.result = _netr_AccountDeltas(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -896,7 +896,7 @@ static bool api_netr_AccountSync(struct
+ 
+ 	r->out.result = _netr_AccountSync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -976,7 +976,7 @@ static bool api_netr_GetDcName(struct pi
+ 
+ 	r->out.result = _netr_GetDcName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1056,7 +1056,7 @@ static bool api_netr_LogonControl(struct
+ 
+ 	r->out.result = _netr_LogonControl(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1136,7 +1136,7 @@ static bool api_netr_GetAnyDCName(struct
+ 
+ 	r->out.result = _netr_GetAnyDCName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1216,7 +1216,7 @@ static bool api_netr_LogonControl2(struc
+ 
+ 	r->out.result = _netr_LogonControl2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1297,7 +1297,7 @@ static bool api_netr_ServerAuthenticate2
+ 
+ 	r->out.result = _netr_ServerAuthenticate2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1379,7 +1379,7 @@ static bool api_netr_DatabaseSync2(struc
+ 
+ 	r->out.result = _netr_DatabaseSync2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1460,7 +1460,7 @@ static bool api_netr_DatabaseRedo(struct
+ 
+ 	r->out.result = _netr_DatabaseRedo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1540,7 +1540,7 @@ static bool api_netr_LogonControl2Ex(str
+ 
+ 	r->out.result = _netr_LogonControl2Ex(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1620,7 +1620,7 @@ static bool api_netr_NetrEnumerateTruste
+ 
+ 	r->out.result = _netr_NetrEnumerateTrustedDomains(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1700,7 +1700,7 @@ static bool api_netr_DsRGetDCName(struct
+ 
+ 	r->out.result = _netr_DsRGetDCName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1781,7 +1781,7 @@ static bool api_netr_LogonGetCapabilitie
+ 
+ 	r->out.result = _netr_LogonGetCapabilities(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1854,7 +1854,7 @@ static bool api_netr_NETRLOGONSETSERVICE
+ 
+ 	r->out.result = _netr_NETRLOGONSETSERVICEBITS(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1934,7 +1934,7 @@ static bool api_netr_LogonGetTrustRid(st
+ 
+ 	r->out.result = _netr_LogonGetTrustRid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2007,7 +2007,7 @@ static bool api_netr_NETRLOGONCOMPUTESER
+ 
+ 	r->out.result = _netr_NETRLOGONCOMPUTESERVERDIGEST(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2080,7 +2080,7 @@ static bool api_netr_NETRLOGONCOMPUTECLI
+ 
+ 	r->out.result = _netr_NETRLOGONCOMPUTECLIENTDIGEST(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2167,7 +2167,7 @@ static bool api_netr_ServerAuthenticate3
+ 
+ 	r->out.result = _netr_ServerAuthenticate3(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2247,7 +2247,7 @@ static bool api_netr_DsRGetDCNameEx(stru
+ 
+ 	r->out.result = _netr_DsRGetDCNameEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2327,7 +2327,7 @@ static bool api_netr_DsRGetSiteName(stru
+ 
+ 	r->out.result = _netr_DsRGetSiteName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2408,7 +2408,7 @@ static bool api_netr_LogonGetDomainInfo(
+ 
+ 	r->out.result = _netr_LogonGetDomainInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2488,7 +2488,7 @@ static bool api_netr_ServerPasswordSet2(
+ 
+ 	r->out.result = _netr_ServerPasswordSet2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2574,7 +2574,7 @@ static bool api_netr_ServerPasswordGet(s
+ 
+ 	r->out.result = _netr_ServerPasswordGet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2647,7 +2647,7 @@ static bool api_netr_NETRLOGONSENDTOSAM(
+ 
+ 	r->out.result = _netr_NETRLOGONSENDTOSAM(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2727,7 +2727,7 @@ static bool api_netr_DsRAddressToSitenam
+ 
+ 	r->out.result = _netr_DsRAddressToSitenamesW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2807,7 +2807,7 @@ static bool api_netr_DsRGetDCNameEx2(str
+ 
+ 	r->out.result = _netr_DsRGetDCNameEx2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2880,7 +2880,7 @@ static bool api_netr_NETRLOGONGETTIMESER
+ 
+ 	r->out.result = _netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2960,7 +2960,7 @@ static bool api_netr_NetrEnumerateTruste
+ 
+ 	r->out.result = _netr_NetrEnumerateTrustedDomainsEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3040,7 +3040,7 @@ static bool api_netr_DsRAddressToSitenam
+ 
+ 	r->out.result = _netr_DsRAddressToSitenamesExW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3120,7 +3120,7 @@ static bool api_netr_DsrGetDcSiteCoverag
+ 
+ 	r->out.result = _netr_DsrGetDcSiteCoverageW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3207,7 +3207,7 @@ static bool api_netr_LogonSamLogonEx(str
+ 
+ 	r->out.result = _netr_LogonSamLogonEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3287,7 +3287,7 @@ static bool api_netr_DsrEnumerateDomainT
+ 
+ 	r->out.result = _netr_DsrEnumerateDomainTrusts(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3360,7 +3360,7 @@ static bool api_netr_DsrDeregisterDNSHos
+ 
+ 	r->out.result = _netr_DsrDeregisterDNSHostRecords(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3452,7 +3452,7 @@ static bool api_netr_ServerTrustPassword
+ 
+ 	r->out.result = _netr_ServerTrustPasswordsGet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3532,7 +3532,7 @@ static bool api_netr_DsRGetForestTrustIn
+ 
+ 	r->out.result = _netr_DsRGetForestTrustInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3618,7 +3618,7 @@ static bool api_netr_GetForestTrustInfor
+ 
+ 	r->out.result = _netr_GetForestTrustInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3706,7 +3706,7 @@ static bool api_netr_LogonSamLogonWithFl
+ 
+ 	r->out.result = _netr_LogonSamLogonWithFlags(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3804,7 +3804,7 @@ static bool api_netr_ServerGetTrustInfo(
+ 
+ 	r->out.result = _netr_ServerGetTrustInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3877,7 +3877,7 @@ static bool api_netr_Unused47(struct pip
+ 
+ 	r->out.result = _netr_Unused47(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3958,7 +3958,7 @@ static bool api_netr_DsrUpdateReadOnlySe
+ 
+ 	r->out.result = _netr_DsrUpdateReadOnlyServerDnsRecords(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_ntlmssp.c
++++ b/source3/librpc/gen_ndr/srv_ntlmssp.c
+@@ -44,7 +44,7 @@ static bool api_decode_NEGOTIATE_MESSAGE
+ 
+ 	_decode_NEGOTIATE_MESSAGE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_decode_CHALLENGE_MESSAGE
+ 
+ 	_decode_CHALLENGE_MESSAGE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_decode_AUTHENTICATE_MESS
+ 
+ 	_decode_AUTHENTICATE_MESSAGE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_decode_NTLMv2_CLIENT_CHA
+ 
+ 	_decode_NTLMv2_CLIENT_CHALLENGE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_decode_NTLMv2_RESPONSE(s
+ 
+ 	_decode_NTLMv2_RESPONSE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_ntprinting.c
++++ b/source3/librpc/gen_ndr/srv_ntprinting.c
+@@ -44,7 +44,7 @@ static bool api_decode_ntprinting_form(s
+ 
+ 	_decode_ntprinting_form(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_decode_ntprinting_driver
+ 
+ 	_decode_ntprinting_driver(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_decode_ntprinting_printe
+ 
+ 	_decode_ntprinting_printer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_ntsvcs.c
++++ b/source3/librpc/gen_ndr/srv_ntsvcs.c
+@@ -44,7 +44,7 @@ static bool api_PNP_Disconnect(struct pi
+ 
+ 	r->out.result = _PNP_Disconnect(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_PNP_Connect(struct pipes
+ 
+ 	r->out.result = _PNP_Connect(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -197,7 +197,7 @@ static bool api_PNP_GetVersion(struct pi
+ 
+ 	r->out.result = _PNP_GetVersion(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -270,7 +270,7 @@ static bool api_PNP_GetGlobalState(struc
+ 
+ 	r->out.result = _PNP_GetGlobalState(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -343,7 +343,7 @@ static bool api_PNP_InitDetection(struct
+ 
+ 	r->out.result = _PNP_InitDetection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -416,7 +416,7 @@ static bool api_PNP_ReportLogOn(struct p
+ 
+ 	r->out.result = _PNP_ReportLogOn(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -489,7 +489,7 @@ static bool api_PNP_ValidateDeviceInstan
+ 
+ 	r->out.result = _PNP_ValidateDeviceInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -562,7 +562,7 @@ static bool api_PNP_GetRootDeviceInstanc
+ 
+ 	r->out.result = _PNP_GetRootDeviceInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -635,7 +635,7 @@ static bool api_PNP_GetRelatedDeviceInst
+ 
+ 	r->out.result = _PNP_GetRelatedDeviceInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -708,7 +708,7 @@ static bool api_PNP_EnumerateSubKeys(str
+ 
+ 	r->out.result = _PNP_EnumerateSubKeys(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -789,7 +789,7 @@ static bool api_PNP_GetDeviceList(struct
+ 
+ 	r->out.result = _PNP_GetDeviceList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -869,7 +869,7 @@ static bool api_PNP_GetDeviceListSize(st
+ 
+ 	r->out.result = _PNP_GetDeviceListSize(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -942,7 +942,7 @@ static bool api_PNP_GetDepth(struct pipe
+ 
+ 	r->out.result = _PNP_GetDepth(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1025,7 +1025,7 @@ static bool api_PNP_GetDeviceRegProp(str
+ 
+ 	r->out.result = _PNP_GetDeviceRegProp(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1098,7 +1098,7 @@ static bool api_PNP_SetDeviceRegProp(str
+ 
+ 	r->out.result = _PNP_SetDeviceRegProp(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1171,7 +1171,7 @@ static bool api_PNP_GetClassInstance(str
+ 
+ 	r->out.result = _PNP_GetClassInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1244,7 +1244,7 @@ static bool api_PNP_CreateKey(struct pip
+ 
+ 	r->out.result = _PNP_CreateKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1317,7 +1317,7 @@ static bool api_PNP_DeleteRegistryKey(st
+ 
+ 	r->out.result = _PNP_DeleteRegistryKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1390,7 +1390,7 @@ static bool api_PNP_GetClassCount(struct
+ 
+ 	r->out.result = _PNP_GetClassCount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1463,7 +1463,7 @@ static bool api_PNP_GetClassName(struct
+ 
+ 	r->out.result = _PNP_GetClassName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1536,7 +1536,7 @@ static bool api_PNP_DeleteClassKey(struc
+ 
+ 	r->out.result = _PNP_DeleteClassKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1609,7 +1609,7 @@ static bool api_PNP_GetInterfaceDeviceAl
+ 
+ 	r->out.result = _PNP_GetInterfaceDeviceAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1682,7 +1682,7 @@ static bool api_PNP_GetInterfaceDeviceLi
+ 
+ 	r->out.result = _PNP_GetInterfaceDeviceList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1755,7 +1755,7 @@ static bool api_PNP_GetInterfaceDeviceLi
+ 
+ 	r->out.result = _PNP_GetInterfaceDeviceListSize(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1828,7 +1828,7 @@ static bool api_PNP_RegisterDeviceClassA
+ 
+ 	r->out.result = _PNP_RegisterDeviceClassAssociation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1901,7 +1901,7 @@ static bool api_PNP_UnregisterDeviceClas
+ 
+ 	r->out.result = _PNP_UnregisterDeviceClassAssociation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1974,7 +1974,7 @@ static bool api_PNP_GetClassRegProp(stru
+ 
+ 	r->out.result = _PNP_GetClassRegProp(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2047,7 +2047,7 @@ static bool api_PNP_SetClassRegProp(stru
+ 
+ 	r->out.result = _PNP_SetClassRegProp(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2120,7 +2120,7 @@ static bool api_PNP_CreateDevInst(struct
+ 
+ 	r->out.result = _PNP_CreateDevInst(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2193,7 +2193,7 @@ static bool api_PNP_DeviceInstanceAction
+ 
+ 	r->out.result = _PNP_DeviceInstanceAction(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2266,7 +2266,7 @@ static bool api_PNP_GetDeviceStatus(stru
+ 
+ 	r->out.result = _PNP_GetDeviceStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2339,7 +2339,7 @@ static bool api_PNP_SetDeviceProblem(str
+ 
+ 	r->out.result = _PNP_SetDeviceProblem(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2412,7 +2412,7 @@ static bool api_PNP_DisableDevInst(struc
+ 
+ 	r->out.result = _PNP_DisableDevInst(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2485,7 +2485,7 @@ static bool api_PNP_UninstallDevInst(str
+ 
+ 	r->out.result = _PNP_UninstallDevInst(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2558,7 +2558,7 @@ static bool api_PNP_AddID(struct pipes_s
+ 
+ 	r->out.result = _PNP_AddID(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2631,7 +2631,7 @@ static bool api_PNP_RegisterDriver(struc
+ 
+ 	r->out.result = _PNP_RegisterDriver(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2704,7 +2704,7 @@ static bool api_PNP_QueryRemove(struct p
+ 
+ 	r->out.result = _PNP_QueryRemove(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2777,7 +2777,7 @@ static bool api_PNP_RequestDeviceEject(s
+ 
+ 	r->out.result = _PNP_RequestDeviceEject(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2850,7 +2850,7 @@ static bool api_PNP_IsDockStationPresent
+ 
+ 	r->out.result = _PNP_IsDockStationPresent(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2923,7 +2923,7 @@ static bool api_PNP_RequestEjectPC(struc
+ 
+ 	r->out.result = _PNP_RequestEjectPC(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3005,7 +3005,7 @@ static bool api_PNP_HwProfFlags(struct p
+ 
+ 	r->out.result = _PNP_HwProfFlags(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3080,7 +3080,7 @@ static bool api_PNP_GetHwProfInfo(struct
+ 	r->out.info = r->in.info;
+ 	r->out.result = _PNP_GetHwProfInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3153,7 +3153,7 @@ static bool api_PNP_AddEmptyLogConf(stru
+ 
+ 	r->out.result = _PNP_AddEmptyLogConf(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3226,7 +3226,7 @@ static bool api_PNP_FreeLogConf(struct p
+ 
+ 	r->out.result = _PNP_FreeLogConf(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3299,7 +3299,7 @@ static bool api_PNP_GetFirstLogConf(stru
+ 
+ 	r->out.result = _PNP_GetFirstLogConf(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3372,7 +3372,7 @@ static bool api_PNP_GetNextLogConf(struc
+ 
+ 	r->out.result = _PNP_GetNextLogConf(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3445,7 +3445,7 @@ static bool api_PNP_GetLogConfPriority(s
+ 
+ 	r->out.result = _PNP_GetLogConfPriority(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3518,7 +3518,7 @@ static bool api_PNP_AddResDes(struct pip
+ 
+ 	r->out.result = _PNP_AddResDes(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3591,7 +3591,7 @@ static bool api_PNP_FreeResDes(struct pi
+ 
+ 	r->out.result = _PNP_FreeResDes(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3664,7 +3664,7 @@ static bool api_PNP_GetNextResDes(struct
+ 
+ 	r->out.result = _PNP_GetNextResDes(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3737,7 +3737,7 @@ static bool api_PNP_GetResDesData(struct
+ 
+ 	r->out.result = _PNP_GetResDesData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3810,7 +3810,7 @@ static bool api_PNP_GetResDesDataSize(st
+ 
+ 	r->out.result = _PNP_GetResDesDataSize(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3883,7 +3883,7 @@ static bool api_PNP_ModifyResDes(struct
+ 
+ 	r->out.result = _PNP_ModifyResDes(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3956,7 +3956,7 @@ static bool api_PNP_DetectResourceLimit(
+ 
+ 	r->out.result = _PNP_DetectResourceLimit(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4029,7 +4029,7 @@ static bool api_PNP_QueryResConfList(str
+ 
+ 	r->out.result = _PNP_QueryResConfList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4102,7 +4102,7 @@ static bool api_PNP_SetHwProf(struct pip
+ 
+ 	r->out.result = _PNP_SetHwProf(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4175,7 +4175,7 @@ static bool api_PNP_QueryArbitratorFreeD
+ 
+ 	r->out.result = _PNP_QueryArbitratorFreeData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4248,7 +4248,7 @@ static bool api_PNP_QueryArbitratorFreeS
+ 
+ 	r->out.result = _PNP_QueryArbitratorFreeSize(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4321,7 +4321,7 @@ static bool api_PNP_RunDetection(struct
+ 
+ 	r->out.result = _PNP_RunDetection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4394,7 +4394,7 @@ static bool api_PNP_RegisterNotification
+ 
+ 	r->out.result = _PNP_RegisterNotification(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4467,7 +4467,7 @@ static bool api_PNP_UnregisterNotificati
+ 
+ 	r->out.result = _PNP_UnregisterNotification(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4540,7 +4540,7 @@ static bool api_PNP_GetCustomDevProp(str
+ 
+ 	r->out.result = _PNP_GetCustomDevProp(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4613,7 +4613,7 @@ static bool api_PNP_GetVersionInternal(s
+ 
+ 	r->out.result = _PNP_GetVersionInternal(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4686,7 +4686,7 @@ static bool api_PNP_GetBlockedDriverInfo
+ 
+ 	r->out.result = _PNP_GetBlockedDriverInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4759,7 +4759,7 @@ static bool api_PNP_GetServerSideDeviceI
+ 
+ 	r->out.result = _PNP_GetServerSideDeviceInstallFlags(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_oxidresolver.c
++++ b/source3/librpc/gen_ndr/srv_oxidresolver.c
+@@ -63,7 +63,7 @@ static bool api_ResolveOxid(struct pipes
+ 
+ 	r->out.result = _ResolveOxid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -136,7 +136,7 @@ static bool api_SimplePing(struct pipes_
+ 
+ 	r->out.result = _SimplePing(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -217,7 +217,7 @@ static bool api_ComplexPing(struct pipes
+ 
+ 	r->out.result = _ComplexPing(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -290,7 +290,7 @@ static bool api_ServerAlive(struct pipes
+ 
+ 	r->out.result = _ServerAlive(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -388,7 +388,7 @@ static bool api_ResolveOxid2(struct pipe
+ 
+ 	r->out.result = _ResolveOxid2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -492,7 +492,7 @@ static bool api_ServerAlive2(struct pipe
+ 
+ 	r->out.result = _ServerAlive2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_policyagent.c
++++ b/source3/librpc/gen_ndr/srv_policyagent.c
+@@ -44,7 +44,7 @@ static bool api_policyagent_Dummy(struct
+ 
+ 	r->out.result = _policyagent_Dummy(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_preg.c
++++ b/source3/librpc/gen_ndr/srv_preg.c
+@@ -44,7 +44,7 @@ static bool api_decode_preg_file(struct
+ 
+ 	_decode_preg_file(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_rap.c
++++ b/source3/librpc/gen_ndr/srv_rap.c
+@@ -51,7 +51,7 @@ static bool api_rap_NetShareEnum(struct
+ 
+ 	_rap_NetShareEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -125,7 +125,7 @@ static bool api_rap_NetShareAdd(struct p
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetShareAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -205,7 +205,7 @@ static bool api_rap_NetServerEnum2(struc
+ 
+ 	_rap_NetServerEnum2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -279,7 +279,7 @@ static bool api_rap_WserverGetInfo(struc
+ 	ZERO_STRUCT(r->out);
+ 	_rap_WserverGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -359,7 +359,7 @@ static bool api_rap_NetPrintQEnum(struct
+ 
+ 	_rap_NetPrintQEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -433,7 +433,7 @@ static bool api_rap_NetPrintQGetInfo(str
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintQGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -507,7 +507,7 @@ static bool api_rap_NetPrintJobPause(str
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintJobPause(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -581,7 +581,7 @@ static bool api_rap_NetPrintJobContinue(
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintJobContinue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -655,7 +655,7 @@ static bool api_rap_NetPrintJobDelete(st
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintJobDelete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -729,7 +729,7 @@ static bool api_rap_NetPrintQueuePause(s
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintQueuePause(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -803,7 +803,7 @@ static bool api_rap_NetPrintQueueResume(
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintQueueResume(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -877,7 +877,7 @@ static bool api_rap_NetPrintQueuePurge(s
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintQueuePurge(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -957,7 +957,7 @@ static bool api_rap_NetPrintJobEnum(stru
+ 
+ 	_rap_NetPrintJobEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1031,7 +1031,7 @@ static bool api_rap_NetPrintJobGetInfo(s
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintJobGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1105,7 +1105,7 @@ static bool api_rap_NetPrintJobSetInfo(s
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintJobSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1185,7 +1185,7 @@ static bool api_rap_NetPrintDestEnum(str
+ 
+ 	_rap_NetPrintDestEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1259,7 +1259,7 @@ static bool api_rap_NetPrintDestGetInfo(
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetPrintDestGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1333,7 +1333,7 @@ static bool api_rap_NetUserPasswordSet2(
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetUserPasswordSet2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1407,7 +1407,7 @@ static bool api_rap_NetOEMChangePassword
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetOEMChangePassword(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1481,7 +1481,7 @@ static bool api_rap_NetUserGetInfo(struc
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetUserGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1561,7 +1561,7 @@ static bool api_rap_NetSessionEnum(struc
+ 
+ 	_rap_NetSessionEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1635,7 +1635,7 @@ static bool api_rap_NetSessionGetInfo(st
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetSessionGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1709,7 +1709,7 @@ static bool api_rap_NetUserAdd(struct pi
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetUserAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1783,7 +1783,7 @@ static bool api_rap_NetUserDelete(struct
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetUserDelete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1857,7 +1857,7 @@ static bool api_rap_NetRemoteTOD(struct
+ 	ZERO_STRUCT(r->out);
+ 	_rap_NetRemoteTOD(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_remact.c
++++ b/source3/librpc/gen_ndr/srv_remact.c
+@@ -99,7 +99,7 @@ static bool api_RemoteActivation(struct
+ 
+ 	r->out.result = _RemoteActivation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_rot.c
++++ b/source3/librpc/gen_ndr/srv_rot.c
+@@ -51,7 +51,7 @@ static bool api_rot_add(struct pipes_str
+ 
+ 	r->out.result = _rot_add(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -124,7 +124,7 @@ static bool api_rot_remove(struct pipes_
+ 
+ 	r->out.result = _rot_remove(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -197,7 +197,7 @@ static bool api_rot_is_listed(struct pip
+ 
+ 	r->out.result = _rot_is_listed(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -277,7 +277,7 @@ static bool api_rot_get_interface_pointe
+ 
+ 	r->out.result = _rot_get_interface_pointer(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -350,7 +350,7 @@ static bool api_rot_set_modification_tim
+ 
+ 	r->out.result = _rot_set_modification_time(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -430,7 +430,7 @@ static bool api_rot_get_modification_tim
+ 
+ 	r->out.result = _rot_get_modification_time(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -510,7 +510,7 @@ static bool api_rot_enum(struct pipes_st
+ 
+ 	r->out.result = _rot_enum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_samr.c
++++ b/source3/librpc/gen_ndr/srv_samr.c
+@@ -51,7 +51,7 @@ static bool api_samr_Connect(struct pipe
+ 
+ 	r->out.result = _samr_Connect(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -126,7 +126,7 @@ static bool api_samr_Close(struct pipes_
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _samr_Close(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -199,7 +199,7 @@ static bool api_samr_SetSecurity(struct
+ 
+ 	r->out.result = _samr_SetSecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -279,7 +279,7 @@ static bool api_samr_QuerySecurity(struc
+ 
+ 	r->out.result = _samr_QuerySecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -352,7 +352,7 @@ static bool api_samr_Shutdown(struct pip
+ 
+ 	r->out.result = _samr_Shutdown(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -432,7 +432,7 @@ static bool api_samr_LookupDomain(struct
+ 
+ 	r->out.result = _samr_LookupDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -519,7 +519,7 @@ static bool api_samr_EnumDomains(struct
+ 
+ 	r->out.result = _samr_EnumDomains(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -599,7 +599,7 @@ static bool api_samr_OpenDomain(struct p
+ 
+ 	r->out.result = _samr_OpenDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -679,7 +679,7 @@ static bool api_samr_QueryDomainInfo(str
+ 
+ 	r->out.result = _samr_QueryDomainInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -752,7 +752,7 @@ static bool api_samr_SetDomainInfo(struc
+ 
+ 	r->out.result = _samr_SetDomainInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -838,7 +838,7 @@ static bool api_samr_CreateDomainGroup(s
+ 
+ 	r->out.result = _samr_CreateDomainGroup(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -925,7 +925,7 @@ static bool api_samr_EnumDomainGroups(st
+ 
+ 	r->out.result = _samr_EnumDomainGroups(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1011,7 +1011,7 @@ static bool api_samr_CreateUser(struct p
+ 
+ 	r->out.result = _samr_CreateUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1098,7 +1098,7 @@ static bool api_samr_EnumDomainUsers(str
+ 
+ 	r->out.result = _samr_EnumDomainUsers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1184,7 +1184,7 @@ static bool api_samr_CreateDomAlias(stru
+ 
+ 	r->out.result = _samr_CreateDomAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1271,7 +1271,7 @@ static bool api_samr_EnumDomainAliases(s
+ 
+ 	r->out.result = _samr_EnumDomainAliases(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1351,7 +1351,7 @@ static bool api_samr_GetAliasMembership(
+ 
+ 	r->out.result = _samr_GetAliasMembership(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1437,7 +1437,7 @@ static bool api_samr_LookupNames(struct
+ 
+ 	r->out.result = _samr_LookupNames(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1523,7 +1523,7 @@ static bool api_samr_LookupRids(struct p
+ 
+ 	r->out.result = _samr_LookupRids(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1603,7 +1603,7 @@ static bool api_samr_OpenGroup(struct pi
+ 
+ 	r->out.result = _samr_OpenGroup(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1683,7 +1683,7 @@ static bool api_samr_QueryGroupInfo(stru
+ 
+ 	r->out.result = _samr_QueryGroupInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1756,7 +1756,7 @@ static bool api_samr_SetGroupInfo(struct
+ 
+ 	r->out.result = _samr_SetGroupInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1829,7 +1829,7 @@ static bool api_samr_AddGroupMember(stru
+ 
+ 	r->out.result = _samr_AddGroupMember(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1904,7 +1904,7 @@ static bool api_samr_DeleteDomainGroup(s
+ 	r->out.group_handle = r->in.group_handle;
+ 	r->out.result = _samr_DeleteDomainGroup(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1977,7 +1977,7 @@ static bool api_samr_DeleteGroupMember(s
+ 
+ 	r->out.result = _samr_DeleteGroupMember(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2057,7 +2057,7 @@ static bool api_samr_QueryGroupMember(st
+ 
+ 	r->out.result = _samr_QueryGroupMember(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2130,7 +2130,7 @@ static bool api_samr_SetMemberAttributes
+ 
+ 	r->out.result = _samr_SetMemberAttributesOfGroup(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2210,7 +2210,7 @@ static bool api_samr_OpenAlias(struct pi
+ 
+ 	r->out.result = _samr_OpenAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2290,7 +2290,7 @@ static bool api_samr_QueryAliasInfo(stru
+ 
+ 	r->out.result = _samr_QueryAliasInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2363,7 +2363,7 @@ static bool api_samr_SetAliasInfo(struct
+ 
+ 	r->out.result = _samr_SetAliasInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2438,7 +2438,7 @@ static bool api_samr_DeleteDomAlias(stru
+ 	r->out.alias_handle = r->in.alias_handle;
+ 	r->out.result = _samr_DeleteDomAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2511,7 +2511,7 @@ static bool api_samr_AddAliasMember(stru
+ 
+ 	r->out.result = _samr_AddAliasMember(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2584,7 +2584,7 @@ static bool api_samr_DeleteAliasMember(s
+ 
+ 	r->out.result = _samr_DeleteAliasMember(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2664,7 +2664,7 @@ static bool api_samr_GetMembersInAlias(s
+ 
+ 	r->out.result = _samr_GetMembersInAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2744,7 +2744,7 @@ static bool api_samr_OpenUser(struct pip
+ 
+ 	r->out.result = _samr_OpenUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2819,7 +2819,7 @@ static bool api_samr_DeleteUser(struct p
+ 	r->out.user_handle = r->in.user_handle;
+ 	r->out.result = _samr_DeleteUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2899,7 +2899,7 @@ static bool api_samr_QueryUserInfo(struc
+ 
+ 	r->out.result = _samr_QueryUserInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2972,7 +2972,7 @@ static bool api_samr_SetUserInfo(struct
+ 
+ 	r->out.result = _samr_SetUserInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3045,7 +3045,7 @@ static bool api_samr_ChangePasswordUser(
+ 
+ 	r->out.result = _samr_ChangePasswordUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3125,7 +3125,7 @@ static bool api_samr_GetGroupsForUser(st
+ 
+ 	r->out.result = _samr_GetGroupsForUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3217,7 +3217,7 @@ static bool api_samr_QueryDisplayInfo(st
+ 
+ 	r->out.result = _samr_QueryDisplayInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3297,7 +3297,7 @@ static bool api_samr_GetDisplayEnumerati
+ 
+ 	r->out.result = _samr_GetDisplayEnumerationIndex(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3370,7 +3370,7 @@ static bool api_samr_TestPrivateFunction
+ 
+ 	r->out.result = _samr_TestPrivateFunctionsDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3443,7 +3443,7 @@ static bool api_samr_TestPrivateFunction
+ 
+ 	r->out.result = _samr_TestPrivateFunctionsUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3523,7 +3523,7 @@ static bool api_samr_GetUserPwInfo(struc
+ 
+ 	r->out.result = _samr_GetUserPwInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3596,7 +3596,7 @@ static bool api_samr_RemoveMemberFromFor
+ 
+ 	r->out.result = _samr_RemoveMemberFromForeignDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3676,7 +3676,7 @@ static bool api_samr_QueryDomainInfo2(st
+ 
+ 	r->out.result = _samr_QueryDomainInfo2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3756,7 +3756,7 @@ static bool api_samr_QueryUserInfo2(stru
+ 
+ 	r->out.result = _samr_QueryUserInfo2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3848,7 +3848,7 @@ static bool api_samr_QueryDisplayInfo2(s
+ 
+ 	r->out.result = _samr_QueryDisplayInfo2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3928,7 +3928,7 @@ static bool api_samr_GetDisplayEnumerati
+ 
+ 	r->out.result = _samr_GetDisplayEnumerationIndex2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4020,7 +4020,7 @@ static bool api_samr_CreateUser2(struct
+ 
+ 	r->out.result = _samr_CreateUser2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4112,7 +4112,7 @@ static bool api_samr_QueryDisplayInfo3(s
+ 
+ 	r->out.result = _samr_QueryDisplayInfo3(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4185,7 +4185,7 @@ static bool api_samr_AddMultipleMembersT
+ 
+ 	r->out.result = _samr_AddMultipleMembersToAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4258,7 +4258,7 @@ static bool api_samr_RemoveMultipleMembe
+ 
+ 	r->out.result = _samr_RemoveMultipleMembersFromAlias(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4331,7 +4331,7 @@ static bool api_samr_OemChangePasswordUs
+ 
+ 	r->out.result = _samr_OemChangePasswordUser2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4404,7 +4404,7 @@ static bool api_samr_ChangePasswordUser2
+ 
+ 	r->out.result = _samr_ChangePasswordUser2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4484,7 +4484,7 @@ static bool api_samr_GetDomPwInfo(struct
+ 
+ 	r->out.result = _samr_GetDomPwInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4564,7 +4564,7 @@ static bool api_samr_Connect2(struct pip
+ 
+ 	r->out.result = _samr_Connect2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4637,7 +4637,7 @@ static bool api_samr_SetUserInfo2(struct
+ 
+ 	r->out.result = _samr_SetUserInfo2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4710,7 +4710,7 @@ static bool api_samr_SetBootKeyInformati
+ 
+ 	r->out.result = _samr_SetBootKeyInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4790,7 +4790,7 @@ static bool api_samr_GetBootKeyInformati
+ 
+ 	r->out.result = _samr_GetBootKeyInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4870,7 +4870,7 @@ static bool api_samr_Connect3(struct pip
+ 
+ 	r->out.result = _samr_Connect3(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4950,7 +4950,7 @@ static bool api_samr_Connect4(struct pip
+ 
+ 	r->out.result = _samr_Connect4(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5036,7 +5036,7 @@ static bool api_samr_ChangePasswordUser3
+ 
+ 	r->out.result = _samr_ChangePasswordUser3(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5128,7 +5128,7 @@ static bool api_samr_Connect5(struct pip
+ 
+ 	r->out.result = _samr_Connect5(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5208,7 +5208,7 @@ static bool api_samr_RidToSid(struct pip
+ 
+ 	r->out.result = _samr_RidToSid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5281,7 +5281,7 @@ static bool api_samr_SetDsrmPassword(str
+ 
+ 	r->out.result = _samr_SetDsrmPassword(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5361,7 +5361,7 @@ static bool api_samr_ValidatePassword(st
+ 
+ 	r->out.result = _samr_ValidatePassword(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_scerpc.c
++++ b/source3/librpc/gen_ndr/srv_scerpc.c
+@@ -44,7 +44,7 @@ static bool api_scerpc_Unknown0(struct p
+ 
+ 	r->out.result = _scerpc_Unknown0(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_spoolss.c
++++ b/source3/librpc/gen_ndr/srv_spoolss.c
+@@ -63,7 +63,7 @@ static bool api_spoolss_EnumPrinters(str
+ 
+ 	r->out.result = _spoolss_EnumPrinters(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -143,7 +143,7 @@ static bool api_spoolss_OpenPrinter(stru
+ 
+ 	r->out.result = _spoolss_OpenPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -216,7 +216,7 @@ static bool api_spoolss_SetJob(struct pi
+ 
+ 	r->out.result = _spoolss_SetJob(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -302,7 +302,7 @@ static bool api_spoolss_GetJob(struct pi
+ 
+ 	r->out.result = _spoolss_GetJob(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -394,7 +394,7 @@ static bool api_spoolss_EnumJobs(struct
+ 
+ 	r->out.result = _spoolss_EnumJobs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -474,7 +474,7 @@ static bool api_spoolss_AddPrinter(struc
+ 
+ 	r->out.result = _spoolss_AddPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -547,7 +547,7 @@ static bool api_spoolss_DeletePrinter(st
+ 
+ 	r->out.result = _spoolss_DeletePrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -620,7 +620,7 @@ static bool api_spoolss_SetPrinter(struc
+ 
+ 	r->out.result = _spoolss_SetPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -706,7 +706,7 @@ static bool api_spoolss_GetPrinter(struc
+ 
+ 	r->out.result = _spoolss_GetPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -779,7 +779,7 @@ static bool api_spoolss_AddPrinterDriver
+ 
+ 	r->out.result = _spoolss_AddPrinterDriver(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -871,7 +871,7 @@ static bool api_spoolss_EnumPrinterDrive
+ 
+ 	r->out.result = _spoolss_EnumPrinterDrivers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -957,7 +957,7 @@ static bool api_spoolss_GetPrinterDriver
+ 
+ 	r->out.result = _spoolss_GetPrinterDriver(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1043,7 +1043,7 @@ static bool api_spoolss_GetPrinterDriver
+ 
+ 	r->out.result = _spoolss_GetPrinterDriverDirectory(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1116,7 +1116,7 @@ static bool api_spoolss_DeletePrinterDri
+ 
+ 	r->out.result = _spoolss_DeletePrinterDriver(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1189,7 +1189,7 @@ static bool api_spoolss_AddPrintProcesso
+ 
+ 	r->out.result = _spoolss_AddPrintProcessor(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1281,7 +1281,7 @@ static bool api_spoolss_EnumPrintProcess
+ 
+ 	r->out.result = _spoolss_EnumPrintProcessors(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1367,7 +1367,7 @@ static bool api_spoolss_GetPrintProcesso
+ 
+ 	r->out.result = _spoolss_GetPrintProcessorDirectory(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1447,7 +1447,7 @@ static bool api_spoolss_StartDocPrinter(
+ 
+ 	r->out.result = _spoolss_StartDocPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1520,7 +1520,7 @@ static bool api_spoolss_StartPagePrinter
+ 
+ 	r->out.result = _spoolss_StartPagePrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1600,7 +1600,7 @@ static bool api_spoolss_WritePrinter(str
+ 
+ 	r->out.result = _spoolss_WritePrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1673,7 +1673,7 @@ static bool api_spoolss_EndPagePrinter(s
+ 
+ 	r->out.result = _spoolss_EndPagePrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1746,7 +1746,7 @@ static bool api_spoolss_AbortPrinter(str
+ 
+ 	r->out.result = _spoolss_AbortPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1832,7 +1832,7 @@ static bool api_spoolss_ReadPrinter(stru
+ 
+ 	r->out.result = _spoolss_ReadPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1905,7 +1905,7 @@ static bool api_spoolss_EndDocPrinter(st
+ 
+ 	r->out.result = _spoolss_EndDocPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1986,7 +1986,7 @@ static bool api_spoolss_AddJob(struct pi
+ 
+ 	r->out.result = _spoolss_AddJob(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2059,7 +2059,7 @@ static bool api_spoolss_ScheduleJob(stru
+ 
+ 	r->out.result = _spoolss_ScheduleJob(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2151,7 +2151,7 @@ static bool api_spoolss_GetPrinterData(s
+ 
+ 	r->out.result = _spoolss_GetPrinterData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2224,7 +2224,7 @@ static bool api_spoolss_SetPrinterData(s
+ 
+ 	r->out.result = _spoolss_SetPrinterData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2297,7 +2297,7 @@ static bool api_spoolss_WaitForPrinterCh
+ 
+ 	r->out.result = _spoolss_WaitForPrinterChange(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2372,7 +2372,7 @@ static bool api_spoolss_ClosePrinter(str
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _spoolss_ClosePrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2445,7 +2445,7 @@ static bool api_spoolss_AddForm(struct p
+ 
+ 	r->out.result = _spoolss_AddForm(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2518,7 +2518,7 @@ static bool api_spoolss_DeleteForm(struc
+ 
+ 	r->out.result = _spoolss_DeleteForm(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2604,7 +2604,7 @@ static bool api_spoolss_GetForm(struct p
+ 
+ 	r->out.result = _spoolss_GetForm(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2677,7 +2677,7 @@ static bool api_spoolss_SetForm(struct p
+ 
+ 	r->out.result = _spoolss_SetForm(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2769,7 +2769,7 @@ static bool api_spoolss_EnumForms(struct
+ 
+ 	r->out.result = _spoolss_EnumForms(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2861,7 +2861,7 @@ static bool api_spoolss_EnumPorts(struct
+ 
+ 	r->out.result = _spoolss_EnumPorts(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2953,7 +2953,7 @@ static bool api_spoolss_EnumMonitors(str
+ 
+ 	r->out.result = _spoolss_EnumMonitors(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3026,7 +3026,7 @@ static bool api_spoolss_AddPort(struct p
+ 
+ 	r->out.result = _spoolss_AddPort(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3099,7 +3099,7 @@ static bool api_spoolss_ConfigurePort(st
+ 
+ 	r->out.result = _spoolss_ConfigurePort(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3172,7 +3172,7 @@ static bool api_spoolss_DeletePort(struc
+ 
+ 	r->out.result = _spoolss_DeletePort(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3252,7 +3252,7 @@ static bool api_spoolss_CreatePrinterIC(
+ 
+ 	r->out.result = _spoolss_CreatePrinterIC(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3325,7 +3325,7 @@ static bool api_spoolss_PlayGDIScriptOnP
+ 
+ 	r->out.result = _spoolss_PlayGDIScriptOnPrinterIC(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3400,7 +3400,7 @@ static bool api_spoolss_DeletePrinterIC(
+ 	r->out.gdi_handle = r->in.gdi_handle;
+ 	r->out.result = _spoolss_DeletePrinterIC(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3473,7 +3473,7 @@ static bool api_spoolss_AddPrinterConnec
+ 
+ 	r->out.result = _spoolss_AddPrinterConnection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3546,7 +3546,7 @@ static bool api_spoolss_DeletePrinterCon
+ 
+ 	r->out.result = _spoolss_DeletePrinterConnection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3619,7 +3619,7 @@ static bool api_spoolss_PrinterMessageBo
+ 
+ 	r->out.result = _spoolss_PrinterMessageBox(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3692,7 +3692,7 @@ static bool api_spoolss_AddMonitor(struc
+ 
+ 	r->out.result = _spoolss_AddMonitor(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3765,7 +3765,7 @@ static bool api_spoolss_DeleteMonitor(st
+ 
+ 	r->out.result = _spoolss_DeleteMonitor(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3838,7 +3838,7 @@ static bool api_spoolss_DeletePrintProce
+ 
+ 	r->out.result = _spoolss_DeletePrintProcessor(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3911,7 +3911,7 @@ static bool api_spoolss_AddPrintProvidor
+ 
+ 	r->out.result = _spoolss_AddPrintProvidor(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3984,7 +3984,7 @@ static bool api_spoolss_DeletePrintProvi
+ 
+ 	r->out.result = _spoolss_DeletePrintProvidor(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4076,7 +4076,7 @@ static bool api_spoolss_EnumPrintProcDat
+ 
+ 	r->out.result = _spoolss_EnumPrintProcDataTypes(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4149,7 +4149,7 @@ static bool api_spoolss_ResetPrinter(str
+ 
+ 	r->out.result = _spoolss_ResetPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4247,7 +4247,7 @@ static bool api_spoolss_GetPrinterDriver
+ 
+ 	r->out.result = _spoolss_GetPrinterDriver2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4320,7 +4320,7 @@ static bool api_spoolss_FindFirstPrinter
+ 
+ 	r->out.result = _spoolss_FindFirstPrinterChangeNotification(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4393,7 +4393,7 @@ static bool api_spoolss_FindNextPrinterC
+ 
+ 	r->out.result = _spoolss_FindNextPrinterChangeNotification(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4466,7 +4466,7 @@ static bool api_spoolss_FindClosePrinter
+ 
+ 	r->out.result = _spoolss_FindClosePrinterNotify(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4539,7 +4539,7 @@ static bool api_spoolss_RouterFindFirstP
+ 
+ 	r->out.result = _spoolss_RouterFindFirstPrinterChangeNotificationOld(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4619,7 +4619,7 @@ static bool api_spoolss_ReplyOpenPrinter
+ 
+ 	r->out.result = _spoolss_ReplyOpenPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4692,7 +4692,7 @@ static bool api_spoolss_RouterReplyPrint
+ 
+ 	r->out.result = _spoolss_RouterReplyPrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4767,7 +4767,7 @@ static bool api_spoolss_ReplyClosePrinte
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _spoolss_ReplyClosePrinter(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4840,7 +4840,7 @@ static bool api_spoolss_AddPortEx(struct
+ 
+ 	r->out.result = _spoolss_AddPortEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4913,7 +4913,7 @@ static bool api_spoolss_RouterFindFirstP
+ 
+ 	r->out.result = _spoolss_RouterFindFirstPrinterChangeNotification(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4986,7 +4986,7 @@ static bool api_spoolss_SpoolerInit(stru
+ 
+ 	r->out.result = _spoolss_SpoolerInit(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5059,7 +5059,7 @@ static bool api_spoolss_ResetPrinterEx(s
+ 
+ 	r->out.result = _spoolss_ResetPrinterEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5132,7 +5132,7 @@ static bool api_spoolss_RemoteFindFirstP
+ 
+ 	r->out.result = _spoolss_RemoteFindFirstPrinterChangeNotifyEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5212,7 +5212,7 @@ static bool api_spoolss_RouterReplyPrint
+ 
+ 	r->out.result = _spoolss_RouterReplyPrinterEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5292,7 +5292,7 @@ static bool api_spoolss_RouterRefreshPri
+ 
+ 	r->out.result = _spoolss_RouterRefreshPrinterChangeNotify(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5365,7 +5365,7 @@ static bool api_spoolss_44(struct pipes_
+ 
+ 	r->out.result = _spoolss_44(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5445,7 +5445,7 @@ static bool api_spoolss_OpenPrinterEx(st
+ 
+ 	r->out.result = _spoolss_OpenPrinterEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5525,7 +5525,7 @@ static bool api_spoolss_AddPrinterEx(str
+ 
+ 	r->out.result = _spoolss_AddPrinterEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5598,7 +5598,7 @@ static bool api_spoolss_SetPort(struct p
+ 
+ 	r->out.result = _spoolss_SetPort(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5702,7 +5702,7 @@ static bool api_spoolss_EnumPrinterData(
+ 
+ 	r->out.result = _spoolss_EnumPrinterData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5775,7 +5775,7 @@ static bool api_spoolss_DeletePrinterDat
+ 
+ 	r->out.result = _spoolss_DeletePrinterData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5848,7 +5848,7 @@ static bool api_spoolss_4a(struct pipes_
+ 
+ 	r->out.result = _spoolss_4a(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5921,7 +5921,7 @@ static bool api_spoolss_4b(struct pipes_
+ 
+ 	r->out.result = _spoolss_4b(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -5994,7 +5994,7 @@ static bool api_spoolss_4c(struct pipes_
+ 
+ 	r->out.result = _spoolss_4c(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6067,7 +6067,7 @@ static bool api_spoolss_SetPrinterDataEx
+ 
+ 	r->out.result = _spoolss_SetPrinterDataEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6159,7 +6159,7 @@ static bool api_spoolss_GetPrinterDataEx
+ 
+ 	r->out.result = _spoolss_GetPrinterDataEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6251,7 +6251,7 @@ static bool api_spoolss_EnumPrinterDataE
+ 
+ 	r->out.result = _spoolss_EnumPrinterDataEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6343,7 +6343,7 @@ static bool api_spoolss_EnumPrinterKey(s
+ 
+ 	r->out.result = _spoolss_EnumPrinterKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6416,7 +6416,7 @@ static bool api_spoolss_DeletePrinterDat
+ 
+ 	r->out.result = _spoolss_DeletePrinterDataEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6489,7 +6489,7 @@ static bool api_spoolss_DeletePrinterKey
+ 
+ 	r->out.result = _spoolss_DeletePrinterKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6562,7 +6562,7 @@ static bool api_spoolss_53(struct pipes_
+ 
+ 	r->out.result = _spoolss_53(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6635,7 +6635,7 @@ static bool api_spoolss_DeletePrinterDri
+ 
+ 	r->out.result = _spoolss_DeletePrinterDriverEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6708,7 +6708,7 @@ static bool api_spoolss_AddPerMachineCon
+ 
+ 	r->out.result = _spoolss_AddPerMachineConnection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6781,7 +6781,7 @@ static bool api_spoolss_DeletePerMachine
+ 
+ 	r->out.result = _spoolss_DeletePerMachineConnection(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6854,7 +6854,7 @@ static bool api_spoolss_EnumPerMachineCo
+ 
+ 	r->out.result = _spoolss_EnumPerMachineConnections(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -6941,7 +6941,7 @@ static bool api_spoolss_XcvData(struct p
+ 
+ 	r->out.result = _spoolss_XcvData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7014,7 +7014,7 @@ static bool api_spoolss_AddPrinterDriver
+ 
+ 	r->out.result = _spoolss_AddPrinterDriverEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7087,7 +7087,7 @@ static bool api_spoolss_5a(struct pipes_
+ 
+ 	r->out.result = _spoolss_5a(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7160,7 +7160,7 @@ static bool api_spoolss_5b(struct pipes_
+ 
+ 	r->out.result = _spoolss_5b(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7233,7 +7233,7 @@ static bool api_spoolss_5c(struct pipes_
+ 
+ 	r->out.result = _spoolss_5c(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7306,7 +7306,7 @@ static bool api_spoolss_5d(struct pipes_
+ 
+ 	r->out.result = _spoolss_5d(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7379,7 +7379,7 @@ static bool api_spoolss_5e(struct pipes_
+ 
+ 	r->out.result = _spoolss_5e(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7452,7 +7452,7 @@ static bool api_spoolss_5f(struct pipes_
+ 
+ 	r->out.result = _spoolss_5f(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7525,7 +7525,7 @@ static bool api_spoolss_60(struct pipes_
+ 
+ 	r->out.result = _spoolss_60(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7598,7 +7598,7 @@ static bool api_spoolss_61(struct pipes_
+ 
+ 	r->out.result = _spoolss_61(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7671,7 +7671,7 @@ static bool api_spoolss_62(struct pipes_
+ 
+ 	r->out.result = _spoolss_62(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7744,7 +7744,7 @@ static bool api_spoolss_63(struct pipes_
+ 
+ 	r->out.result = _spoolss_63(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7817,7 +7817,7 @@ static bool api_spoolss_64(struct pipes_
+ 
+ 	r->out.result = _spoolss_64(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7890,7 +7890,7 @@ static bool api_spoolss_65(struct pipes_
+ 
+ 	r->out.result = _spoolss_65(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -7970,7 +7970,7 @@ static bool api_spoolss_GetCorePrinterDr
+ 
+ 	r->out.result = _spoolss_GetCorePrinterDrivers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8043,7 +8043,7 @@ static bool api_spoolss_67(struct pipes_
+ 
+ 	r->out.result = _spoolss_67(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8124,7 +8124,7 @@ static bool api_spoolss_GetPrinterDriver
+ 
+ 	r->out.result = _spoolss_GetPrinterDriverPackagePath(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8197,7 +8197,7 @@ static bool api_spoolss_69(struct pipes_
+ 
+ 	r->out.result = _spoolss_69(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8270,7 +8270,7 @@ static bool api_spoolss_6a(struct pipes_
+ 
+ 	r->out.result = _spoolss_6a(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8343,7 +8343,7 @@ static bool api_spoolss_6b(struct pipes_
+ 
+ 	r->out.result = _spoolss_6b(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8416,7 +8416,7 @@ static bool api_spoolss_6c(struct pipes_
+ 
+ 	r->out.result = _spoolss_6c(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -8489,7 +8489,7 @@ static bool api_spoolss_6d(struct pipes_
+ 
+ 	r->out.result = _spoolss_6d(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_srvsvc.c
++++ b/source3/librpc/gen_ndr/srv_srvsvc.c
+@@ -53,7 +53,7 @@ static bool api_srvsvc_NetCharDevEnum(st
+ 
+ 	r->out.result = _srvsvc_NetCharDevEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -133,7 +133,7 @@ static bool api_srvsvc_NetCharDevGetInfo
+ 
+ 	r->out.result = _srvsvc_NetCharDevGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -206,7 +206,7 @@ static bool api_srvsvc_NetCharDevControl
+ 
+ 	r->out.result = _srvsvc_NetCharDevControl(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -288,7 +288,7 @@ static bool api_srvsvc_NetCharDevQEnum(s
+ 
+ 	r->out.result = _srvsvc_NetCharDevQEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -368,7 +368,7 @@ static bool api_srvsvc_NetCharDevQGetInf
+ 
+ 	r->out.result = _srvsvc_NetCharDevQGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -443,7 +443,7 @@ static bool api_srvsvc_NetCharDevQSetInf
+ 	r->out.parm_error = r->in.parm_error;
+ 	r->out.result = _srvsvc_NetCharDevQSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -516,7 +516,7 @@ static bool api_srvsvc_NetCharDevQPurge(
+ 
+ 	r->out.result = _srvsvc_NetCharDevQPurge(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -589,7 +589,7 @@ static bool api_srvsvc_NetCharDevQPurgeS
+ 
+ 	r->out.result = _srvsvc_NetCharDevQPurgeSelf(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -671,7 +671,7 @@ static bool api_srvsvc_NetConnEnum(struc
+ 
+ 	r->out.result = _srvsvc_NetConnEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -753,7 +753,7 @@ static bool api_srvsvc_NetFileEnum(struc
+ 
+ 	r->out.result = _srvsvc_NetFileEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -833,7 +833,7 @@ static bool api_srvsvc_NetFileGetInfo(st
+ 
+ 	r->out.result = _srvsvc_NetFileGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -906,7 +906,7 @@ static bool api_srvsvc_NetFileClose(stru
+ 
+ 	r->out.result = _srvsvc_NetFileClose(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -988,7 +988,7 @@ static bool api_srvsvc_NetSessEnum(struc
+ 
+ 	r->out.result = _srvsvc_NetSessEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1061,7 +1061,7 @@ static bool api_srvsvc_NetSessDel(struct
+ 
+ 	r->out.result = _srvsvc_NetSessDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1136,7 +1136,7 @@ static bool api_srvsvc_NetShareAdd(struc
+ 	r->out.parm_error = r->in.parm_error;
+ 	r->out.result = _srvsvc_NetShareAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1218,7 +1218,7 @@ static bool api_srvsvc_NetShareEnumAll(s
+ 
+ 	r->out.result = _srvsvc_NetShareEnumAll(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1298,7 +1298,7 @@ static bool api_srvsvc_NetShareGetInfo(s
+ 
+ 	r->out.result = _srvsvc_NetShareGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1373,7 +1373,7 @@ static bool api_srvsvc_NetShareSetInfo(s
+ 	r->out.parm_error = r->in.parm_error;
+ 	r->out.result = _srvsvc_NetShareSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1446,7 +1446,7 @@ static bool api_srvsvc_NetShareDel(struc
+ 
+ 	r->out.result = _srvsvc_NetShareDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1519,7 +1519,7 @@ static bool api_srvsvc_NetShareDelSticky
+ 
+ 	r->out.result = _srvsvc_NetShareDelSticky(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1599,7 +1599,7 @@ static bool api_srvsvc_NetShareCheck(str
+ 
+ 	r->out.result = _srvsvc_NetShareCheck(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1679,7 +1679,7 @@ static bool api_srvsvc_NetSrvGetInfo(str
+ 
+ 	r->out.result = _srvsvc_NetSrvGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1754,7 +1754,7 @@ static bool api_srvsvc_NetSrvSetInfo(str
+ 	r->out.parm_error = r->in.parm_error;
+ 	r->out.result = _srvsvc_NetSrvSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1836,7 +1836,7 @@ static bool api_srvsvc_NetDiskEnum(struc
+ 
+ 	r->out.result = _srvsvc_NetDiskEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1916,7 +1916,7 @@ static bool api_srvsvc_NetServerStatisti
+ 
+ 	r->out.result = _srvsvc_NetServerStatisticsGet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1989,7 +1989,7 @@ static bool api_srvsvc_NetTransportAdd(s
+ 
+ 	r->out.result = _srvsvc_NetTransportAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2071,7 +2071,7 @@ static bool api_srvsvc_NetTransportEnum(
+ 
+ 	r->out.result = _srvsvc_NetTransportEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2144,7 +2144,7 @@ static bool api_srvsvc_NetTransportDel(s
+ 
+ 	r->out.result = _srvsvc_NetTransportDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2224,7 +2224,7 @@ static bool api_srvsvc_NetRemoteTOD(stru
+ 
+ 	r->out.result = _srvsvc_NetRemoteTOD(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2297,7 +2297,7 @@ static bool api_srvsvc_NetSetServiceBits
+ 
+ 	r->out.result = _srvsvc_NetSetServiceBits(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2377,7 +2377,7 @@ static bool api_srvsvc_NetPathType(struc
+ 
+ 	r->out.result = _srvsvc_NetPathType(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2458,7 +2458,7 @@ static bool api_srvsvc_NetPathCanonicali
+ 
+ 	r->out.result = _srvsvc_NetPathCanonicalize(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2531,7 +2531,7 @@ static bool api_srvsvc_NetPathCompare(st
+ 
+ 	r->out.result = _srvsvc_NetPathCompare(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2604,7 +2604,7 @@ static bool api_srvsvc_NetNameValidate(s
+ 
+ 	r->out.result = _srvsvc_NetNameValidate(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2677,7 +2677,7 @@ static bool api_srvsvc_NETRPRNAMECANONIC
+ 
+ 	r->out.result = _srvsvc_NETRPRNAMECANONICALIZE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2750,7 +2750,7 @@ static bool api_srvsvc_NetPRNameCompare(
+ 
+ 	r->out.result = _srvsvc_NetPRNameCompare(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2832,7 +2832,7 @@ static bool api_srvsvc_NetShareEnum(stru
+ 
+ 	r->out.result = _srvsvc_NetShareEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2912,7 +2912,7 @@ static bool api_srvsvc_NetShareDelStart(
+ 
+ 	r->out.result = _srvsvc_NetShareDelStart(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2987,7 +2987,7 @@ static bool api_srvsvc_NetShareDelCommit
+ 	r->out.hnd = r->in.hnd;
+ 	r->out.result = _srvsvc_NetShareDelCommit(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3067,7 +3067,7 @@ static bool api_srvsvc_NetGetFileSecurit
+ 
+ 	r->out.result = _srvsvc_NetGetFileSecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3140,7 +3140,7 @@ static bool api_srvsvc_NetSetFileSecurit
+ 
+ 	r->out.result = _srvsvc_NetSetFileSecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3213,7 +3213,7 @@ static bool api_srvsvc_NetServerTranspor
+ 
+ 	r->out.result = _srvsvc_NetServerTransportAddEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3286,7 +3286,7 @@ static bool api_srvsvc_NetServerSetServi
+ 
+ 	r->out.result = _srvsvc_NetServerSetServiceBitsEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3359,7 +3359,7 @@ static bool api_srvsvc_NETRDFSGETVERSION
+ 
+ 	r->out.result = _srvsvc_NETRDFSGETVERSION(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3432,7 +3432,7 @@ static bool api_srvsvc_NETRDFSCREATELOCA
+ 
+ 	r->out.result = _srvsvc_NETRDFSCREATELOCALPARTITION(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3505,7 +3505,7 @@ static bool api_srvsvc_NETRDFSDELETELOCA
+ 
+ 	r->out.result = _srvsvc_NETRDFSDELETELOCALPARTITION(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3578,7 +3578,7 @@ static bool api_srvsvc_NETRDFSSETLOCALVO
+ 
+ 	r->out.result = _srvsvc_NETRDFSSETLOCALVOLUMESTATE(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3651,7 +3651,7 @@ static bool api_srvsvc_NETRDFSSETSERVERI
+ 
+ 	r->out.result = _srvsvc_NETRDFSSETSERVERINFO(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3724,7 +3724,7 @@ static bool api_srvsvc_NETRDFSCREATEEXIT
+ 
+ 	r->out.result = _srvsvc_NETRDFSCREATEEXITPOINT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3797,7 +3797,7 @@ static bool api_srvsvc_NETRDFSDELETEEXIT
+ 
+ 	r->out.result = _srvsvc_NETRDFSDELETEEXITPOINT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3870,7 +3870,7 @@ static bool api_srvsvc_NETRDFSMODIFYPREF
+ 
+ 	r->out.result = _srvsvc_NETRDFSMODIFYPREFIX(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3943,7 +3943,7 @@ static bool api_srvsvc_NETRDFSFIXLOCALVO
+ 
+ 	r->out.result = _srvsvc_NETRDFSFIXLOCALVOLUME(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4016,7 +4016,7 @@ static bool api_srvsvc_NETRDFSMANAGERREP
+ 
+ 	r->out.result = _srvsvc_NETRDFSMANAGERREPORTSITEINFO(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4089,7 +4089,7 @@ static bool api_srvsvc_NETRSERVERTRANSPO
+ 
+ 	r->out.result = _srvsvc_NETRSERVERTRANSPORTDELEX(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_svcctl.c
++++ b/source3/librpc/gen_ndr/srv_svcctl.c
+@@ -46,7 +46,7 @@ static bool api_svcctl_CloseServiceHandl
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _svcctl_CloseServiceHandle(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -126,7 +126,7 @@ static bool api_svcctl_ControlService(st
+ 
+ 	r->out.result = _svcctl_ControlService(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -199,7 +199,7 @@ static bool api_svcctl_DeleteService(str
+ 
+ 	r->out.result = _svcctl_DeleteService(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -279,7 +279,7 @@ static bool api_svcctl_LockServiceDataba
+ 
+ 	r->out.result = _svcctl_LockServiceDatabase(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -365,7 +365,7 @@ static bool api_svcctl_QueryServiceObjec
+ 
+ 	r->out.result = _svcctl_QueryServiceObjectSecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -438,7 +438,7 @@ static bool api_svcctl_SetServiceObjectS
+ 
+ 	r->out.result = _svcctl_SetServiceObjectSecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -518,7 +518,7 @@ static bool api_svcctl_QueryServiceStatu
+ 
+ 	r->out.result = _svcctl_QueryServiceStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -591,7 +591,7 @@ static bool api_svcctl_SetServiceStatus(
+ 
+ 	r->out.result = _svcctl_SetServiceStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -666,7 +666,7 @@ static bool api_svcctl_UnlockServiceData
+ 	r->out.lock = r->in.lock;
+ 	r->out.result = _svcctl_UnlockServiceDatabase(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -739,7 +739,7 @@ static bool api_svcctl_NotifyBootConfigS
+ 
+ 	r->out.result = _svcctl_NotifyBootConfigStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -812,7 +812,7 @@ static bool api_svcctl_SCSetServiceBitsW
+ 
+ 	r->out.result = _svcctl_SCSetServiceBitsW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -892,7 +892,7 @@ static bool api_svcctl_ChangeServiceConf
+ 
+ 	r->out.result = _svcctl_ChangeServiceConfigW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -973,7 +973,7 @@ static bool api_svcctl_CreateServiceW(st
+ 
+ 	r->out.result = _svcctl_CreateServiceW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1065,7 +1065,7 @@ static bool api_svcctl_EnumDependentServ
+ 
+ 	r->out.result = _svcctl_EnumDependentServicesW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1158,7 +1158,7 @@ static bool api_svcctl_EnumServicesStatu
+ 
+ 	r->out.result = _svcctl_EnumServicesStatusW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1238,7 +1238,7 @@ static bool api_svcctl_OpenSCManagerW(st
+ 
+ 	r->out.result = _svcctl_OpenSCManagerW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1318,7 +1318,7 @@ static bool api_svcctl_OpenServiceW(stru
+ 
+ 	r->out.result = _svcctl_OpenServiceW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1404,7 +1404,7 @@ static bool api_svcctl_QueryServiceConfi
+ 
+ 	r->out.result = _svcctl_QueryServiceConfigW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1490,7 +1490,7 @@ static bool api_svcctl_QueryServiceLockS
+ 
+ 	r->out.result = _svcctl_QueryServiceLockStatusW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1563,7 +1563,7 @@ static bool api_svcctl_StartServiceW(str
+ 
+ 	r->out.result = _svcctl_StartServiceW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1644,7 +1644,7 @@ static bool api_svcctl_GetServiceDisplay
+ 
+ 	r->out.result = _svcctl_GetServiceDisplayNameW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1725,7 +1725,7 @@ static bool api_svcctl_GetServiceKeyName
+ 
+ 	r->out.result = _svcctl_GetServiceKeyNameW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1798,7 +1798,7 @@ static bool api_svcctl_SCSetServiceBitsA
+ 
+ 	r->out.result = _svcctl_SCSetServiceBitsA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1878,7 +1878,7 @@ static bool api_svcctl_ChangeServiceConf
+ 
+ 	r->out.result = _svcctl_ChangeServiceConfigA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1958,7 +1958,7 @@ static bool api_svcctl_CreateServiceA(st
+ 
+ 	r->out.result = _svcctl_CreateServiceA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2050,7 +2050,7 @@ static bool api_svcctl_EnumDependentServ
+ 
+ 	r->out.result = _svcctl_EnumDependentServicesA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2143,7 +2143,7 @@ static bool api_svcctl_EnumServicesStatu
+ 
+ 	r->out.result = _svcctl_EnumServicesStatusA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2223,7 +2223,7 @@ static bool api_svcctl_OpenSCManagerA(st
+ 
+ 	r->out.result = _svcctl_OpenSCManagerA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2296,7 +2296,7 @@ static bool api_svcctl_OpenServiceA(stru
+ 
+ 	r->out.result = _svcctl_OpenServiceA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2382,7 +2382,7 @@ static bool api_svcctl_QueryServiceConfi
+ 
+ 	r->out.result = _svcctl_QueryServiceConfigA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2468,7 +2468,7 @@ static bool api_svcctl_QueryServiceLockS
+ 
+ 	r->out.result = _svcctl_QueryServiceLockStatusA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2541,7 +2541,7 @@ static bool api_svcctl_StartServiceA(str
+ 
+ 	r->out.result = _svcctl_StartServiceA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2622,7 +2622,7 @@ static bool api_svcctl_GetServiceDisplay
+ 
+ 	r->out.result = _svcctl_GetServiceDisplayNameA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2703,7 +2703,7 @@ static bool api_svcctl_GetServiceKeyName
+ 
+ 	r->out.result = _svcctl_GetServiceKeyNameA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2776,7 +2776,7 @@ static bool api_svcctl_GetCurrentGroupeS
+ 
+ 	r->out.result = _svcctl_GetCurrentGroupeStateW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2849,7 +2849,7 @@ static bool api_svcctl_EnumServiceGroupW
+ 
+ 	r->out.result = _svcctl_EnumServiceGroupW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2922,7 +2922,7 @@ static bool api_svcctl_ChangeServiceConf
+ 
+ 	r->out.result = _svcctl_ChangeServiceConfig2A(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2995,7 +2995,7 @@ static bool api_svcctl_ChangeServiceConf
+ 
+ 	r->out.result = _svcctl_ChangeServiceConfig2W(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3081,7 +3081,7 @@ static bool api_svcctl_QueryServiceConfi
+ 
+ 	r->out.result = _svcctl_QueryServiceConfig2A(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3167,7 +3167,7 @@ static bool api_svcctl_QueryServiceConfi
+ 
+ 	r->out.result = _svcctl_QueryServiceConfig2W(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3253,7 +3253,7 @@ static bool api_svcctl_QueryServiceStatu
+ 
+ 	r->out.result = _svcctl_QueryServiceStatusEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3352,7 +3352,7 @@ static bool api_EnumServicesStatusExA(st
+ 
+ 	r->out.result = _EnumServicesStatusExA(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3445,7 +3445,7 @@ static bool api_EnumServicesStatusExW(st
+ 
+ 	r->out.result = _EnumServicesStatusExW(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3518,7 +3518,7 @@ static bool api_svcctl_SCSendTSMessage(s
+ 
+ 	r->out.result = _svcctl_SCSendTSMessage(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_trkwks.c
++++ b/source3/librpc/gen_ndr/srv_trkwks.c
+@@ -44,7 +44,7 @@ static bool api_trkwks_Unknown0(struct p
+ 
+ 	r->out.result = _trkwks_Unknown0(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_unixinfo.c
++++ b/source3/librpc/gen_ndr/srv_unixinfo.c
+@@ -51,7 +51,7 @@ static bool api_unixinfo_SidToUid(struct
+ 
+ 	r->out.result = _unixinfo_SidToUid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -131,7 +131,7 @@ static bool api_unixinfo_UidToSid(struct
+ 
+ 	r->out.result = _unixinfo_UidToSid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -211,7 +211,7 @@ static bool api_unixinfo_SidToGid(struct
+ 
+ 	r->out.result = _unixinfo_SidToGid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -291,7 +291,7 @@ static bool api_unixinfo_GidToSid(struct
+ 
+ 	r->out.result = _unixinfo_GidToSid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -372,7 +372,7 @@ static bool api_unixinfo_GetPWUid(struct
+ 
+ 	r->out.result = _unixinfo_GetPWUid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_w32time.c
++++ b/source3/librpc/gen_ndr/srv_w32time.c
+@@ -44,7 +44,7 @@ static bool api_w32time_SyncTime(struct
+ 
+ 	r->out.result = _w32time_SyncTime(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_w32time_GetNetLogonServi
+ 
+ 	r->out.result = _w32time_GetNetLogonServiceBits(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_w32time_QueryProviderSta
+ 
+ 	r->out.result = _w32time_QueryProviderStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_wbint.c
++++ b/source3/librpc/gen_ndr/srv_wbint.c
+@@ -51,7 +51,7 @@ static bool api_wbint_Ping(struct pipes_
+ 
+ 	_wbint_Ping(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -143,7 +143,7 @@ static bool api_wbint_LookupSid(struct p
+ 
+ 	r->out.result = _wbint_LookupSid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -229,7 +229,7 @@ static bool api_wbint_LookupSids(struct
+ 
+ 	r->out.result = _wbint_LookupSids(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -315,7 +315,7 @@ static bool api_wbint_LookupName(struct
+ 
+ 	r->out.result = _wbint_LookupName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -395,7 +395,7 @@ static bool api_wbint_Sid2Uid(struct pip
+ 
+ 	r->out.result = _wbint_Sid2Uid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -475,7 +475,7 @@ static bool api_wbint_Sid2Gid(struct pip
+ 
+ 	r->out.result = _wbint_Sid2Gid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -550,7 +550,7 @@ static bool api_wbint_Sids2UnixIDs(struc
+ 	r->out.ids = r->in.ids;
+ 	r->out.result = _wbint_Sids2UnixIDs(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -630,7 +630,7 @@ static bool api_wbint_Uid2Sid(struct pip
+ 
+ 	r->out.result = _wbint_Uid2Sid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -710,7 +710,7 @@ static bool api_wbint_Gid2Sid(struct pip
+ 
+ 	r->out.result = _wbint_Gid2Sid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -790,7 +790,7 @@ static bool api_wbint_AllocateUid(struct
+ 
+ 	r->out.result = _wbint_AllocateUid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -870,7 +870,7 @@ static bool api_wbint_AllocateGid(struct
+ 
+ 	r->out.result = _wbint_AllocateGid(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -950,7 +950,7 @@ static bool api_wbint_QueryUser(struct p
+ 
+ 	r->out.result = _wbint_QueryUser(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1030,7 +1030,7 @@ static bool api_wbint_LookupUserAliases(
+ 
+ 	r->out.result = _wbint_LookupUserAliases(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1110,7 +1110,7 @@ static bool api_wbint_LookupUserGroups(s
+ 
+ 	r->out.result = _wbint_LookupUserGroups(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1190,7 +1190,7 @@ static bool api_wbint_QuerySequenceNumbe
+ 
+ 	r->out.result = _wbint_QuerySequenceNumber(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1270,7 +1270,7 @@ static bool api_wbint_LookupGroupMembers
+ 
+ 	r->out.result = _wbint_LookupGroupMembers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1350,7 +1350,7 @@ static bool api_wbint_QueryUserList(stru
+ 
+ 	r->out.result = _wbint_QueryUserList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1430,7 +1430,7 @@ static bool api_wbint_QueryGroupList(str
+ 
+ 	r->out.result = _wbint_QueryGroupList(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1510,7 +1510,7 @@ static bool api_wbint_DsGetDcName(struct
+ 
+ 	r->out.result = _wbint_DsGetDcName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1596,7 +1596,7 @@ static bool api_wbint_LookupRids(struct
+ 
+ 	r->out.result = _wbint_LookupRids(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1669,7 +1669,7 @@ static bool api_wbint_CheckMachineAccoun
+ 
+ 	r->out.result = _wbint_CheckMachineAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1742,7 +1742,7 @@ static bool api_wbint_ChangeMachineAccou
+ 
+ 	r->out.result = _wbint_ChangeMachineAccount(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1815,7 +1815,7 @@ static bool api_wbint_PingDc(struct pipe
+ 
+ 	r->out.result = _wbint_PingDc(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_winreg.c
++++ b/source3/librpc/gen_ndr/srv_winreg.c
+@@ -51,7 +51,7 @@ static bool api_winreg_OpenHKCR(struct p
+ 
+ 	r->out.result = _winreg_OpenHKCR(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -131,7 +131,7 @@ static bool api_winreg_OpenHKCU(struct p
+ 
+ 	r->out.result = _winreg_OpenHKCU(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -211,7 +211,7 @@ static bool api_winreg_OpenHKLM(struct p
+ 
+ 	r->out.result = _winreg_OpenHKLM(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -291,7 +291,7 @@ static bool api_winreg_OpenHKPD(struct p
+ 
+ 	r->out.result = _winreg_OpenHKPD(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -371,7 +371,7 @@ static bool api_winreg_OpenHKU(struct pi
+ 
+ 	r->out.result = _winreg_OpenHKU(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -446,7 +446,7 @@ static bool api_winreg_CloseKey(struct p
+ 	r->out.handle = r->in.handle;
+ 	r->out.result = _winreg_CloseKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -527,7 +527,7 @@ static bool api_winreg_CreateKey(struct
+ 
+ 	r->out.result = _winreg_CreateKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -600,7 +600,7 @@ static bool api_winreg_DeleteKey(struct
+ 
+ 	r->out.result = _winreg_DeleteKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -673,7 +673,7 @@ static bool api_winreg_DeleteValue(struc
+ 
+ 	r->out.result = _winreg_DeleteValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -750,7 +750,7 @@ static bool api_winreg_EnumKey(struct pi
+ 	r->out.last_changed_time = r->in.last_changed_time;
+ 	r->out.result = _winreg_EnumKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -829,7 +829,7 @@ static bool api_winreg_EnumValue(struct
+ 	r->out.length = r->in.length;
+ 	r->out.result = _winreg_EnumValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -902,7 +902,7 @@ static bool api_winreg_FlushKey(struct p
+ 
+ 	r->out.result = _winreg_FlushKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -977,7 +977,7 @@ static bool api_winreg_GetKeySecurity(st
+ 	r->out.sd = r->in.sd;
+ 	r->out.result = _winreg_GetKeySecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1050,7 +1050,7 @@ static bool api_winreg_LoadKey(struct pi
+ 
+ 	r->out.result = _winreg_LoadKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1123,7 +1123,7 @@ static bool api_winreg_NotifyChangeKeyVa
+ 
+ 	r->out.result = _winreg_NotifyChangeKeyValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1203,7 +1203,7 @@ static bool api_winreg_OpenKey(struct pi
+ 
+ 	r->out.result = _winreg_OpenKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1326,7 +1326,7 @@ static bool api_winreg_QueryInfoKey(stru
+ 
+ 	r->out.result = _winreg_QueryInfoKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1404,7 +1404,7 @@ static bool api_winreg_QueryValue(struct
+ 	r->out.data_length = r->in.data_length;
+ 	r->out.result = _winreg_QueryValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1477,7 +1477,7 @@ static bool api_winreg_ReplaceKey(struct
+ 
+ 	r->out.result = _winreg_ReplaceKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1550,7 +1550,7 @@ static bool api_winreg_RestoreKey(struct
+ 
+ 	r->out.result = _winreg_RestoreKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1623,7 +1623,7 @@ static bool api_winreg_SaveKey(struct pi
+ 
+ 	r->out.result = _winreg_SaveKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1696,7 +1696,7 @@ static bool api_winreg_SetKeySecurity(st
+ 
+ 	r->out.result = _winreg_SetKeySecurity(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1769,7 +1769,7 @@ static bool api_winreg_SetValue(struct p
+ 
+ 	r->out.result = _winreg_SetValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1842,7 +1842,7 @@ static bool api_winreg_UnLoadKey(struct
+ 
+ 	r->out.result = _winreg_UnLoadKey(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1915,7 +1915,7 @@ static bool api_winreg_InitiateSystemShu
+ 
+ 	r->out.result = _winreg_InitiateSystemShutdown(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1988,7 +1988,7 @@ static bool api_winreg_AbortSystemShutdo
+ 
+ 	r->out.result = _winreg_AbortSystemShutdown(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2068,7 +2068,7 @@ static bool api_winreg_GetVersion(struct
+ 
+ 	r->out.result = _winreg_GetVersion(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2148,7 +2148,7 @@ static bool api_winreg_OpenHKCC(struct p
+ 
+ 	r->out.result = _winreg_OpenHKCC(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2228,7 +2228,7 @@ static bool api_winreg_OpenHKDD(struct p
+ 
+ 	r->out.result = _winreg_OpenHKDD(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2310,7 +2310,7 @@ static bool api_winreg_QueryMultipleValu
+ 
+ 	r->out.result = _winreg_QueryMultipleValues(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2383,7 +2383,7 @@ static bool api_winreg_InitiateSystemShu
+ 
+ 	r->out.result = _winreg_InitiateSystemShutdownEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2456,7 +2456,7 @@ static bool api_winreg_SaveKeyEx(struct
+ 
+ 	r->out.result = _winreg_SaveKeyEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2536,7 +2536,7 @@ static bool api_winreg_OpenHKPT(struct p
+ 
+ 	r->out.result = _winreg_OpenHKPT(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2616,7 +2616,7 @@ static bool api_winreg_OpenHKPN(struct p
+ 
+ 	r->out.result = _winreg_OpenHKPN(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2703,7 +2703,7 @@ static bool api_winreg_QueryMultipleValu
+ 
+ 	r->out.result = _winreg_QueryMultipleValues2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2776,7 +2776,7 @@ static bool api_winreg_DeleteKeyEx(struc
+ 
+ 	r->out.result = _winreg_DeleteKeyEx(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_wkssvc.c
++++ b/source3/librpc/gen_ndr/srv_wkssvc.c
+@@ -51,7 +51,7 @@ static bool api_wkssvc_NetWkstaGetInfo(s
+ 
+ 	r->out.result = _wkssvc_NetWkstaGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -126,7 +126,7 @@ static bool api_wkssvc_NetWkstaSetInfo(s
+ 	r->out.parm_error = r->in.parm_error;
+ 	r->out.result = _wkssvc_NetWkstaSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -208,7 +208,7 @@ static bool api_wkssvc_NetWkstaEnumUsers
+ 
+ 	r->out.result = _wkssvc_NetWkstaEnumUsers(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -288,7 +288,7 @@ static bool api_wkssvc_NetrWkstaUserGetI
+ 
+ 	r->out.result = _wkssvc_NetrWkstaUserGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -363,7 +363,7 @@ static bool api_wkssvc_NetrWkstaUserSetI
+ 	r->out.parm_err = r->in.parm_err;
+ 	r->out.result = _wkssvc_NetrWkstaUserSetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -445,7 +445,7 @@ static bool api_wkssvc_NetWkstaTransport
+ 
+ 	r->out.result = _wkssvc_NetWkstaTransportEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -520,7 +520,7 @@ static bool api_wkssvc_NetrWkstaTranspor
+ 	r->out.parm_err = r->in.parm_err;
+ 	r->out.result = _wkssvc_NetrWkstaTransportAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -593,7 +593,7 @@ static bool api_wkssvc_NetrWkstaTranspor
+ 
+ 	r->out.result = _wkssvc_NetrWkstaTransportDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -668,7 +668,7 @@ static bool api_wkssvc_NetrUseAdd(struct
+ 	r->out.parm_err = r->in.parm_err;
+ 	r->out.result = _wkssvc_NetrUseAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -748,7 +748,7 @@ static bool api_wkssvc_NetrUseGetInfo(st
+ 
+ 	r->out.result = _wkssvc_NetrUseGetInfo(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -821,7 +821,7 @@ static bool api_wkssvc_NetrUseDel(struct
+ 
+ 	r->out.result = _wkssvc_NetrUseDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -903,7 +903,7 @@ static bool api_wkssvc_NetrUseEnum(struc
+ 
+ 	r->out.result = _wkssvc_NetrUseEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -976,7 +976,7 @@ static bool api_wkssvc_NetrMessageBuffer
+ 
+ 	r->out.result = _wkssvc_NetrMessageBufferSend(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1056,7 +1056,7 @@ static bool api_wkssvc_NetrWorkstationSt
+ 
+ 	r->out.result = _wkssvc_NetrWorkstationStatisticsGet(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1129,7 +1129,7 @@ static bool api_wkssvc_NetrLogonDomainNa
+ 
+ 	r->out.result = _wkssvc_NetrLogonDomainNameAdd(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1202,7 +1202,7 @@ static bool api_wkssvc_NetrLogonDomainNa
+ 
+ 	r->out.result = _wkssvc_NetrLogonDomainNameDel(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1275,7 +1275,7 @@ static bool api_wkssvc_NetrJoinDomain(st
+ 
+ 	r->out.result = _wkssvc_NetrJoinDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1348,7 +1348,7 @@ static bool api_wkssvc_NetrUnjoinDomain(
+ 
+ 	r->out.result = _wkssvc_NetrUnjoinDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1421,7 +1421,7 @@ static bool api_wkssvc_NetrRenameMachine
+ 
+ 	r->out.result = _wkssvc_NetrRenameMachineInDomain(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1494,7 +1494,7 @@ static bool api_wkssvc_NetrValidateName(
+ 
+ 	r->out.result = _wkssvc_NetrValidateName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1575,7 +1575,7 @@ static bool api_wkssvc_NetrGetJoinInform
+ 
+ 	r->out.result = _wkssvc_NetrGetJoinInformation(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1656,7 +1656,7 @@ static bool api_wkssvc_NetrGetJoinableOu
+ 
+ 	r->out.result = _wkssvc_NetrGetJoinableOus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1729,7 +1729,7 @@ static bool api_wkssvc_NetrJoinDomain2(s
+ 
+ 	r->out.result = _wkssvc_NetrJoinDomain2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1802,7 +1802,7 @@ static bool api_wkssvc_NetrUnjoinDomain2
+ 
+ 	r->out.result = _wkssvc_NetrUnjoinDomain2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1875,7 +1875,7 @@ static bool api_wkssvc_NetrRenameMachine
+ 
+ 	r->out.result = _wkssvc_NetrRenameMachineInDomain2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1948,7 +1948,7 @@ static bool api_wkssvc_NetrValidateName2
+ 
+ 	r->out.result = _wkssvc_NetrValidateName2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2029,7 +2029,7 @@ static bool api_wkssvc_NetrGetJoinableOu
+ 
+ 	r->out.result = _wkssvc_NetrGetJoinableOus2(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2102,7 +2102,7 @@ static bool api_wkssvc_NetrAddAlternateC
+ 
+ 	r->out.result = _wkssvc_NetrAddAlternateComputerName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2175,7 +2175,7 @@ static bool api_wkssvc_NetrRemoveAlterna
+ 
+ 	r->out.result = _wkssvc_NetrRemoveAlternateComputerName(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2248,7 +2248,7 @@ static bool api_wkssvc_NetrSetPrimaryCom
+ 
+ 	r->out.result = _wkssvc_NetrSetPrimaryComputername(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2328,7 +2328,7 @@ static bool api_wkssvc_NetrEnumerateComp
+ 
+ 	r->out.result = _wkssvc_NetrEnumerateComputerNames(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_wmi.c
++++ b/source3/librpc/gen_ndr/srv_wmi.c
+@@ -51,7 +51,7 @@ static bool api_Delete(struct pipes_stru
+ 
+ 	r->out.result = _Delete(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -155,7 +155,7 @@ static bool api_OpenNamespace(struct pip
+ 
+ 	r->out.result = _OpenNamespace(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -235,7 +235,7 @@ static bool api_CancelAsyncCall(struct p
+ 
+ 	r->out.result = _CancelAsyncCall(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -321,7 +321,7 @@ static bool api_QueryObjectSink(struct p
+ 
+ 	r->out.result = _QueryObjectSink(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -403,7 +403,7 @@ static bool api_GetObject(struct pipes_s
+ 
+ 	r->out.result = _GetObject(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -483,7 +483,7 @@ static bool api_GetObjectAsync(struct pi
+ 
+ 	r->out.result = _GetObjectAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -564,7 +564,7 @@ static bool api_PutClass(struct pipes_st
+ 
+ 	r->out.result = _PutClass(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -644,7 +644,7 @@ static bool api_PutClassAsync(struct pip
+ 
+ 	r->out.result = _PutClassAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -725,7 +725,7 @@ static bool api_DeleteClass(struct pipes
+ 
+ 	r->out.result = _DeleteClass(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -805,7 +805,7 @@ static bool api_DeleteClassAsync(struct
+ 
+ 	r->out.result = _DeleteClassAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -891,7 +891,7 @@ static bool api_CreateClassEnum(struct p
+ 
+ 	r->out.result = _CreateClassEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -971,7 +971,7 @@ static bool api_CreateClassEnumAsync(str
+ 
+ 	r->out.result = _CreateClassEnumAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1052,7 +1052,7 @@ static bool api_PutInstance(struct pipes
+ 
+ 	r->out.result = _PutInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1132,7 +1132,7 @@ static bool api_PutInstanceAsync(struct
+ 
+ 	r->out.result = _PutInstanceAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1213,7 +1213,7 @@ static bool api_DeleteInstance(struct pi
+ 
+ 	r->out.result = _DeleteInstance(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1293,7 +1293,7 @@ static bool api_DeleteInstanceAsync(stru
+ 
+ 	r->out.result = _DeleteInstanceAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1379,7 +1379,7 @@ static bool api_CreateInstanceEnum(struc
+ 
+ 	r->out.result = _CreateInstanceEnum(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1459,7 +1459,7 @@ static bool api_CreateInstanceEnumAsync(
+ 
+ 	r->out.result = _CreateInstanceEnumAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1545,7 +1545,7 @@ static bool api_ExecQuery(struct pipes_s
+ 
+ 	r->out.result = _ExecQuery(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1625,7 +1625,7 @@ static bool api_ExecQueryAsync(struct pi
+ 
+ 	r->out.result = _ExecQueryAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1711,7 +1711,7 @@ static bool api_ExecNotificationQuery(st
+ 
+ 	r->out.result = _ExecNotificationQuery(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1791,7 +1791,7 @@ static bool api_ExecNotificationQueryAsy
+ 
+ 	r->out.result = _ExecNotificationQueryAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1873,7 +1873,7 @@ static bool api_ExecMethod(struct pipes_
+ 
+ 	r->out.result = _ExecMethod(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1953,7 +1953,7 @@ static bool api_ExecMethodAsync(struct p
+ 
+ 	r->out.result = _ExecMethodAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2077,7 +2077,7 @@ static bool api_Reset(struct pipes_struc
+ 
+ 	r->out.result = _Reset(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2169,7 +2169,7 @@ static bool api_IEnumWbemClassObject_Nex
+ 
+ 	r->out.result = _IEnumWbemClassObject_Next(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2249,7 +2249,7 @@ static bool api_NextAsync(struct pipes_s
+ 
+ 	r->out.result = _NextAsync(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2335,7 +2335,7 @@ static bool api_IEnumWbemClassObject_Clo
+ 
+ 	r->out.result = _IEnumWbemClassObject_Clone(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2415,7 +2415,7 @@ static bool api_Skip(struct pipes_struct
+ 
+ 	r->out.result = _Skip(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2527,7 +2527,7 @@ static bool api_Clone(struct pipes_struc
+ 
+ 	r->out.result = _Clone(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2607,7 +2607,7 @@ static bool api_GetNames(struct pipes_st
+ 
+ 	r->out.result = _GetNames(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2687,7 +2687,7 @@ static bool api_BeginEnumeration(struct
+ 
+ 	r->out.result = _BeginEnumeration(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2767,7 +2767,7 @@ static bool api_Next(struct pipes_struct
+ 
+ 	r->out.result = _Next(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2847,7 +2847,7 @@ static bool api_EndEnumeration(struct pi
+ 
+ 	r->out.result = _EndEnumeration(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -2927,7 +2927,7 @@ static bool api_SetValue(struct pipes_st
+ 
+ 	r->out.result = _SetValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3007,7 +3007,7 @@ static bool api_GetValue(struct pipes_st
+ 
+ 	r->out.result = _GetValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3087,7 +3087,7 @@ static bool api_DeleteValue(struct pipes
+ 
+ 	r->out.result = _DeleteValue(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3167,7 +3167,7 @@ static bool api_DeleteAll(struct pipes_s
+ 
+ 	r->out.result = _DeleteAll(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3283,7 +3283,7 @@ static bool api_EstablishPosition(struct
+ 
+ 	r->out.result = _EstablishPosition(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3369,7 +3369,7 @@ static bool api_RequestChallenge(struct
+ 
+ 	r->out.result = _RequestChallenge(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3455,7 +3455,7 @@ static bool api_WBEMLogin(struct pipes_s
+ 
+ 	r->out.result = _WBEMLogin(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3541,7 +3541,7 @@ static bool api_NTLMLogin(struct pipes_s
+ 
+ 	r->out.result = _NTLMLogin(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3664,7 +3664,7 @@ static bool api_IWbemWCOSmartEnum_Next(s
+ 
+ 	r->out.result = _IWbemWCOSmartEnum_Next(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3772,7 +3772,7 @@ static bool api_Fetch(struct pipes_struc
+ 
+ 	r->out.result = _Fetch(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3858,7 +3858,7 @@ static bool api_Test(struct pipes_struct
+ 
+ 	r->out.result = _Test(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -3967,7 +3967,7 @@ static bool api_GetResultObject(struct p
+ 
+ 	r->out.result = _GetResultObject(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4053,7 +4053,7 @@ static bool api_GetResultString(struct p
+ 
+ 	r->out.result = _GetResultString(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4139,7 +4139,7 @@ static bool api_GetResultServices(struct
+ 
+ 	r->out.result = _GetResultServices(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4225,7 +4225,7 @@ static bool api_GetCallStatus(struct pip
+ 
+ 	r->out.result = _GetCallStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4330,7 +4330,7 @@ static bool api_SetStatus(struct pipes_s
+ 
+ 	r->out.result = _SetStatus(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -4410,7 +4410,7 @@ static bool api_Indicate(struct pipes_st
+ 
+ 	r->out.result = _Indicate(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_wzcsvc.c
++++ b/source3/librpc/gen_ndr/srv_wzcsvc.c
+@@ -44,7 +44,7 @@ static bool api_wzcsvc_EnumInterfaces(st
+ 
+ 	_wzcsvc_EnumInterfaces(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -117,7 +117,7 @@ static bool api_wzcsvc_QueryInterface(st
+ 
+ 	_wzcsvc_QueryInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -190,7 +190,7 @@ static bool api_wzcsvc_SetInterface(stru
+ 
+ 	_wzcsvc_SetInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -263,7 +263,7 @@ static bool api_wzcsvc_RefreshInterface(
+ 
+ 	_wzcsvc_RefreshInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -336,7 +336,7 @@ static bool api_wzcsvc_QueryContext(stru
+ 
+ 	_wzcsvc_QueryContext(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -409,7 +409,7 @@ static bool api_wzcsvc_SetContext(struct
+ 
+ 	_wzcsvc_SetContext(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -482,7 +482,7 @@ static bool api_wzcsvc_EapolUIResponse(s
+ 
+ 	_wzcsvc_EapolUIResponse(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -555,7 +555,7 @@ static bool api_wzcsvc_EapolGetCustomAut
+ 
+ 	_wzcsvc_EapolGetCustomAuthData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -628,7 +628,7 @@ static bool api_wzcsvc_EapolSetCustomAut
+ 
+ 	_wzcsvc_EapolSetCustomAuthData(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -701,7 +701,7 @@ static bool api_wzcsvc_EapolGetInterface
+ 
+ 	_wzcsvc_EapolGetInterfaceParams(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -774,7 +774,7 @@ static bool api_wzcsvc_EapolSetInterface
+ 
+ 	_wzcsvc_EapolSetInterfaceParams(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -847,7 +847,7 @@ static bool api_wzcsvc_EapolReAuthentica
+ 
+ 	_wzcsvc_EapolReAuthenticateInterface(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -920,7 +920,7 @@ static bool api_wzcsvc_EapolQueryInterfa
+ 
+ 	_wzcsvc_EapolQueryInterfaceState(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -993,7 +993,7 @@ static bool api_wzcsvc_OpenWZCDbLogSessi
+ 
+ 	_wzcsvc_OpenWZCDbLogSession(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1066,7 +1066,7 @@ static bool api_wzcsvc_CloseWZCDbLogSess
+ 
+ 	_wzcsvc_CloseWZCDbLogSession(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1139,7 +1139,7 @@ static bool api_wzcsvc_EnumWZCDbLogRecor
+ 
+ 	_wzcsvc_EnumWZCDbLogRecords(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1212,7 +1212,7 @@ static bool api_wzcsvc_FlushWZCdbLog(str
+ 
+ 	_wzcsvc_FlushWZCdbLog(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+@@ -1285,7 +1285,7 @@ static bool api_wzcsvc_GetWZCDbLogRecord
+ 
+ 	_wzcsvc_GetWZCDbLogRecord(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
+--- a/source3/librpc/gen_ndr/srv_xattr.c
++++ b/source3/librpc/gen_ndr/srv_xattr.c
+@@ -44,7 +44,7 @@ static bool api_xattr_parse_DOSATTRIB(st
+ 
+ 	_xattr_parse_DOSATTRIB(p, r);
+ 
+-	if (p->rng_fault_state) {
++	if (p->fault_state) {
+ 		talloc_free(r);
+ 		/* Return true here, srv_pipe_hnd.c will take care */
+ 		return true;
diff --git a/package/network/services/samba36/patches/022-CVE-2015-5370-v3-6.patch b/package/network/services/samba36/patches/022-CVE-2015-5370-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..36656ab882d8a484c93167115eeaff88abb2f463
--- /dev/null
+++ b/package/network/services/samba36/patches/022-CVE-2015-5370-v3-6.patch
@@ -0,0 +1,1791 @@
+From 8716bb5e03cc4f10e2d4edc704d8defe7e8045f1 Mon Sep 17 00:00:00 2001
+From: Stefan Metzmacher <metze@samba.org>
+Date: Thu, 16 Jul 2015 22:46:05 +0200
+Subject: [PATCH 01/40] CVE-2015-5370: dcerpc.idl: add
+ DCERPC_{NCACN_PAYLOAD,FRAG}_MAX_SIZE defines
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BUG: https://bugzilla.samba.org/show_bug.cgi?id=11344
+
+Signed-off-by: Stefan Metzmacher <metze@samba.org>
+Reviewed-by: Günther Deschner <gd@samba.org>
+---
+ librpc/idl/dcerpc.idl | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/librpc/idl/dcerpc.idl
++++ b/librpc/idl/dcerpc.idl
+@@ -475,9 +475,11 @@ interface dcerpc
+ 	const uint8 DCERPC_PFC_OFFSET      =  3;
+ 	const uint8 DCERPC_DREP_OFFSET     =  4;
+ 	const uint8 DCERPC_FRAG_LEN_OFFSET =  8;
++	const uint32 DCERPC_FRAG_MAX_SIZE  = 5840;
+ 	const uint8 DCERPC_AUTH_LEN_OFFSET = 10;
+ 	const uint8 DCERPC_CALL_ID_OFFSET  = 12;
+ 	const uint8 DCERPC_NCACN_PAYLOAD_OFFSET = 16;
++	const uint32 DCERPC_NCACN_PAYLOAD_MAX_SIZE = 0x400000; /* 4 MByte */
+ 
+ 	/* little-endian flag */
+ 	const uint8 DCERPC_DREP_LE  = 0x10;
+--- a/librpc/rpc/dcerpc_util.c
++++ b/librpc/rpc/dcerpc_util.c
+@@ -92,31 +92,49 @@ uint8_t dcerpc_get_endian_flag(DATA_BLOB
+ *
+ * @return		- A NTSTATUS error code.
+ */
+-NTSTATUS dcerpc_pull_auth_trailer(struct ncacn_packet *pkt,
++NTSTATUS dcerpc_pull_auth_trailer(const struct ncacn_packet *pkt,
+ 				  TALLOC_CTX *mem_ctx,
+-				  DATA_BLOB *pkt_trailer,
++				  const DATA_BLOB *pkt_trailer,
+ 				  struct dcerpc_auth *auth,
+-				  uint32_t *auth_length,
++				  uint32_t *_auth_length,
+ 				  bool auth_data_only)
+ {
+ 	struct ndr_pull *ndr;
+ 	enum ndr_err_code ndr_err;
+-	uint32_t data_and_pad;
++	uint16_t data_and_pad;
++	uint16_t auth_length;
++	uint32_t tmp_length;
+ 
+-	data_and_pad = pkt_trailer->length
+-			- (DCERPC_AUTH_TRAILER_LENGTH + pkt->auth_length);
++	ZERO_STRUCTP(auth);
++	if (_auth_length != NULL) {
++		*_auth_length = 0;
++	}
++
++	/* Paranoia checks for auth_length. The caller should check this... */
++	if (pkt->auth_length == 0) {
++		return NT_STATUS_INTERNAL_ERROR;
++	}
++
++	/* Paranoia checks for auth_length. The caller should check this... */
++	if (pkt->auth_length > pkt->frag_length) {
++		return NT_STATUS_INTERNAL_ERROR;
++	}
++	tmp_length = DCERPC_NCACN_PAYLOAD_OFFSET;
++	tmp_length += DCERPC_AUTH_TRAILER_LENGTH;
++	tmp_length += pkt->auth_length;
++	if (tmp_length > pkt->frag_length) {
++		return NT_STATUS_INTERNAL_ERROR;
++	}
++	if (pkt_trailer->length > UINT16_MAX) {
++		return NT_STATUS_INTERNAL_ERROR;
++	}
+ 
+-	/* paranoia check for pad size. This would be caught anyway by
+-	   the ndr_pull_advance() a few lines down, but it scared
+-	   Jeremy enough for him to call me, so we might as well check
+-	   it now, just to prevent someone posting a bogus YouTube
+-	   video in the future.
+-	*/
+-	if (data_and_pad > pkt_trailer->length) {
+-		return NT_STATUS_INFO_LENGTH_MISMATCH;
++	auth_length = DCERPC_AUTH_TRAILER_LENGTH + pkt->auth_length;
++	if (pkt_trailer->length < auth_length) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
+ 	}
+ 
+-	*auth_length = pkt_trailer->length - data_and_pad;
++	data_and_pad = pkt_trailer->length - auth_length;
+ 
+ 	ndr = ndr_pull_init_blob(pkt_trailer, mem_ctx);
+ 	if (!ndr) {
+@@ -136,14 +154,28 @@ NTSTATUS dcerpc_pull_auth_trailer(struct
+ 	ndr_err = ndr_pull_dcerpc_auth(ndr, NDR_SCALARS|NDR_BUFFERS, auth);
+ 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ 		talloc_free(ndr);
++		ZERO_STRUCTP(auth);
+ 		return ndr_map_error2ntstatus(ndr_err);
+ 	}
+ 
++	if (data_and_pad < auth->auth_pad_length) {
++		DEBUG(1, (__location__ ": ERROR: pad length mismatch. "
++			  "Calculated %u  got %u\n",
++			  (unsigned)data_and_pad,
++			  (unsigned)auth->auth_pad_length));
++		talloc_free(ndr);
++		ZERO_STRUCTP(auth);
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
+ 	if (auth_data_only && data_and_pad != auth->auth_pad_length) {
+-		DEBUG(1, (__location__ ": WARNING: pad length mismatch. "
++		DEBUG(1, (__location__ ": ERROR: pad length mismatch. "
+ 			  "Calculated %u  got %u\n",
+ 			  (unsigned)data_and_pad,
+ 			  (unsigned)auth->auth_pad_length));
++		talloc_free(ndr);
++		ZERO_STRUCTP(auth);
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
+ 	}
+ 
+ 	DEBUG(6,(__location__ ": auth_pad_length %u\n",
+@@ -152,6 +184,83 @@ NTSTATUS dcerpc_pull_auth_trailer(struct
+ 	talloc_steal(mem_ctx, auth->credentials.data);
+ 	talloc_free(ndr);
+ 
++	if (_auth_length != NULL) {
++		*_auth_length = auth_length;
++	}
++
++	return NT_STATUS_OK;
++}
++
++/**
++* @brief	Verify the fields in ncacn_packet header.
++*
++* @param pkt		- The ncacn_packet strcuture
++* @param ptype		- The expected PDU type
++* @param max_auth_info	- The maximum size of a possible auth trailer
++* @param required_flags	- The required flags for the pdu.
++* @param optional_flags	- The possible optional flags for the pdu.
++*
++* @return		- A NTSTATUS error code.
++*/
++NTSTATUS dcerpc_verify_ncacn_packet_header(const struct ncacn_packet *pkt,
++					   enum dcerpc_pkt_type ptype,
++					   size_t max_auth_info,
++					   uint8_t required_flags,
++					   uint8_t optional_flags)
++{
++	if (pkt->rpc_vers != 5) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
++	if (pkt->rpc_vers_minor != 0) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
++	if (pkt->auth_length > pkt->frag_length) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
++	if (pkt->ptype != ptype) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
++	if (max_auth_info > UINT16_MAX) {
++		return NT_STATUS_INTERNAL_ERROR;
++	}
++
++	if (pkt->auth_length > 0) {
++		size_t max_auth_length;
++
++		if (max_auth_info <= DCERPC_AUTH_TRAILER_LENGTH) {
++			return NT_STATUS_RPC_PROTOCOL_ERROR;
++		}
++		max_auth_length = max_auth_info - DCERPC_AUTH_TRAILER_LENGTH;
++
++		if (pkt->auth_length > max_auth_length) {
++			return NT_STATUS_RPC_PROTOCOL_ERROR;
++		}
++	}
++
++	if ((pkt->pfc_flags & required_flags) != required_flags) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++	if (pkt->pfc_flags & ~(optional_flags|required_flags)) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
++	if (pkt->drep[0] & ~DCERPC_DREP_LE) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++	if (pkt->drep[1] != 0) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++	if (pkt->drep[2] != 0) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++	if (pkt->drep[3] != 0) {
++		return NT_STATUS_RPC_PROTOCOL_ERROR;
++	}
++
+ 	return NT_STATUS_OK;
+ }
+ 
+--- a/librpc/rpc/rpc_common.h
++++ b/librpc/rpc/rpc_common.h
+@@ -158,12 +158,17 @@ uint8_t dcerpc_get_endian_flag(DATA_BLOB
+ *
+ * @return		- A NTSTATUS error code.
+ */
+-NTSTATUS dcerpc_pull_auth_trailer(struct ncacn_packet *pkt,
++NTSTATUS dcerpc_pull_auth_trailer(const struct ncacn_packet *pkt,
+ 				  TALLOC_CTX *mem_ctx,
+-				  DATA_BLOB *pkt_trailer,
++				  const DATA_BLOB *pkt_trailer,
+ 				  struct dcerpc_auth *auth,
+ 				  uint32_t *auth_length,
+ 				  bool auth_data_only);
++NTSTATUS dcerpc_verify_ncacn_packet_header(const struct ncacn_packet *pkt,
++					   enum dcerpc_pkt_type ptype,
++					   size_t max_auth_info,
++					   uint8_t required_flags,
++					   uint8_t optional_flags);
+ struct tevent_req *dcerpc_read_ncacn_packet_send(TALLOC_CTX *mem_ctx,
+ 						 struct tevent_context *ev,
+ 						 struct tstream_context *stream);
+--- a/source3/librpc/rpc/dcerpc_helpers.c
++++ b/source3/librpc/rpc/dcerpc_helpers.c
+@@ -210,47 +210,6 @@ NTSTATUS dcerpc_push_dcerpc_auth(TALLOC_
+ }
+ 
+ /**
+-* @brief Decodes a dcerpc_auth blob
+-*
+-* @param mem_ctx	The memory context on which to allocate the packet
+-*			elements
+-* @param blob		The blob of data to decode
+-* @param r		An empty dcerpc_auth structure, must not be NULL
+-*
+-* @return a NTSTATUS error code
+-*/
+-NTSTATUS dcerpc_pull_dcerpc_auth(TALLOC_CTX *mem_ctx,
+-				 const DATA_BLOB *blob,
+-				 struct dcerpc_auth *r,
+-				 bool bigendian)
+-{
+-	enum ndr_err_code ndr_err;
+-	struct ndr_pull *ndr;
+-
+-	ndr = ndr_pull_init_blob(blob, mem_ctx);
+-	if (!ndr) {
+-		return NT_STATUS_NO_MEMORY;
+-	}
+-	if (bigendian) {
+-		ndr->flags |= LIBNDR_FLAG_BIGENDIAN;
+-	}
+-
+-	ndr_err = ndr_pull_dcerpc_auth(ndr, NDR_SCALARS|NDR_BUFFERS, r);
+-
+-	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+-		talloc_free(ndr);
+-		return ndr_map_error2ntstatus(ndr_err);
+-	}
+-	talloc_free(ndr);
+-
+-	if (DEBUGLEVEL >= 10) {
+-		NDR_PRINT_DEBUG(dcerpc_auth, r);
+-	}
+-
+-	return NT_STATUS_OK;
+-}
+-
+-/**
+ * @brief Calculate how much data we can in a packet, including calculating
+ *	 auth token and pad lengths.
+ *
+@@ -782,7 +741,7 @@ NTSTATUS dcerpc_add_auth_footer(struct p
+ 					 auth->auth_type,
+ 					 auth->auth_level,
+ 					 pad_len,
+-					 1 /* context id. */,
++					 auth->auth_context_id,
+ 					 &auth_blob,
+ 					 &auth_info);
+ 	if (!NT_STATUS_IS_OK(status)) {
+@@ -844,19 +803,18 @@ NTSTATUS dcerpc_add_auth_footer(struct p
+ *
+ * @param auth		The auth data for the connection
+ * @param pkt		The actual ncacn_packet
+-* @param pkt_trailer	The stub_and_verifier part of the packet
++* @param pkt_trailer [in][out]	The stub_and_verifier part of the packet,
++* 			the auth_trailer and padding will be removed.
+ * @param header_size	The header size
+ * @param raw_pkt	The whole raw packet data blob
+-* @param pad_len	[out] The padding length used in the packet
+ *
+ * @return A NTSTATUS error code
+ */
+ NTSTATUS dcerpc_check_auth(struct pipe_auth_data *auth,
+ 			   struct ncacn_packet *pkt,
+ 			   DATA_BLOB *pkt_trailer,
+-			   size_t header_size,
+-			   DATA_BLOB *raw_pkt,
+-			   size_t *pad_len)
++			   uint8_t header_size,
++			   DATA_BLOB *raw_pkt)
+ {
+ 	struct schannel_state *schannel_auth;
+ 	struct auth_ntlmssp_state *ntlmssp_ctx;
+@@ -868,6 +826,14 @@ NTSTATUS dcerpc_check_auth(struct pipe_a
+ 	DATA_BLOB full_pkt;
+ 	DATA_BLOB data;
+ 
++	/*
++	 * These check should be done in the caller.
++	 */
++	SMB_ASSERT(raw_pkt->length == pkt->frag_length);
++	SMB_ASSERT(header_size <= pkt->frag_length);
++	SMB_ASSERT(pkt_trailer->length < pkt->frag_length);
++	SMB_ASSERT((pkt_trailer->length + header_size) <= pkt->frag_length);
++
+ 	switch (auth->auth_level) {
+ 	case DCERPC_AUTH_LEVEL_PRIVACY:
+ 		DEBUG(10, ("Requested Privacy.\n"));
+@@ -881,7 +847,6 @@ NTSTATUS dcerpc_check_auth(struct pipe_a
+ 		if (pkt->auth_length != 0) {
+ 			break;
+ 		}
+-		*pad_len = 0;
+ 		return NT_STATUS_OK;
+ 
+ 	case DCERPC_AUTH_LEVEL_NONE:
+@@ -890,7 +855,6 @@ NTSTATUS dcerpc_check_auth(struct pipe_a
+ 				  "authenticated connection!\n"));
+ 			return NT_STATUS_INVALID_PARAMETER;
+ 		}
+-		*pad_len = 0;
+ 		return NT_STATUS_OK;
+ 
+ 	default:
+@@ -899,16 +863,8 @@ NTSTATUS dcerpc_check_auth(struct pipe_a
+ 		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
+-	/* Paranioa checks for auth_length. */
+-	if (pkt->auth_length > pkt->frag_length) {
+-		return NT_STATUS_INFO_LENGTH_MISMATCH;
+-	}
+-	if (((unsigned int)pkt->auth_length
+-	     + DCERPC_AUTH_TRAILER_LENGTH < (unsigned int)pkt->auth_length) ||
+-	    ((unsigned int)pkt->auth_length
+-	     + DCERPC_AUTH_TRAILER_LENGTH < DCERPC_AUTH_TRAILER_LENGTH)) {
+-		/* Integer wrap attempt. */
+-		return NT_STATUS_INFO_LENGTH_MISMATCH;
++	if (pkt->auth_length == 0) {
++		return NT_STATUS_INVALID_PARAMETER;
+ 	}
+ 
+ 	status = dcerpc_pull_auth_trailer(pkt, pkt, pkt_trailer,
+@@ -917,10 +873,23 @@ NTSTATUS dcerpc_check_auth(struct pipe_a
+ 		return status;
+ 	}
+ 
++	if (auth_info.auth_type != auth->auth_type) {
++		return NT_STATUS_INVALID_PARAMETER;
++	}
++
++	if (auth_info.auth_level != auth->auth_level) {
++		return NT_STATUS_INVALID_PARAMETER;
++	}
++
++	if (auth_info.auth_context_id != auth->auth_context_id) {
++		return NT_STATUS_INVALID_PARAMETER;
++	}
++
++	pkt_trailer->length -= auth_length;
+ 	data = data_blob_const(raw_pkt->data + header_size,
+-				pkt_trailer->length - auth_length);
+-	full_pkt = data_blob_const(raw_pkt->data,
+-				raw_pkt->length - auth_info.credentials.length);
++			       pkt_trailer->length);
++	full_pkt = data_blob_const(raw_pkt->data, raw_pkt->length);
++	full_pkt.length -= auth_info.credentials.length;
+ 
+ 	switch (auth->auth_type) {
+ 	case DCERPC_AUTH_TYPE_NONE:
+@@ -996,10 +965,13 @@ NTSTATUS dcerpc_check_auth(struct pipe_a
+ 	 * pkt_trailer actually has a copy of the raw data, and they
+ 	 * are still both used in later calls */
+ 	if (auth->auth_level == DCERPC_AUTH_LEVEL_PRIVACY) {
++		if (pkt_trailer->length != data.length) {
++			return NT_STATUS_INVALID_PARAMETER;
++		}
+ 		memcpy(pkt_trailer->data, data.data, data.length);
+ 	}
+ 
+-	*pad_len = auth_info.auth_pad_length;
++	pkt_trailer->length -= auth_info.auth_pad_length;
+ 	data_blob_free(&auth_info.credentials);
+ 	return NT_STATUS_OK;
+ }
+--- a/source3/rpc_client/cli_pipe.c
++++ b/source3/rpc_client/cli_pipe.c
+@@ -404,9 +404,9 @@ static NTSTATUS cli_pipe_validate_curren
+ 						DATA_BLOB *rdata,
+ 						DATA_BLOB *reply_pdu)
+ {
+-	struct dcerpc_response *r;
++	const struct dcerpc_response *r = NULL;
++	DATA_BLOB tmp_stub = data_blob_null;
+ 	NTSTATUS ret = NT_STATUS_OK;
+-	size_t pad_len = 0;
+ 
+ 	/*
+ 	 * Point the return values at the real data including the RPC
+@@ -414,50 +414,128 @@ static NTSTATUS cli_pipe_validate_curren
+ 	 */
+ 	*rdata = *pdu;
+ 
++	if ((pkt->ptype == DCERPC_PKT_BIND_ACK) &&
++	    !(pkt->pfc_flags & DCERPC_PFC_FLAG_LAST)) {
++		/*
++		 * TODO: do we still need this hack which was introduced
++		 * in commit a42afcdcc7ab9aa9ed193ae36d3dbb10843447f0.
++		 *
++		 * I don't even know what AS/U might be...
++		 */
++		DEBUG(5, (__location__ ": bug in server (AS/U?), setting "
++			  "fragment first/last ON.\n"));
++		pkt->pfc_flags |= DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST;
++	}
++
+ 	/* Ensure we have the correct type. */
+ 	switch (pkt->ptype) {
+-	case DCERPC_PKT_ALTER_RESP:
++	case DCERPC_PKT_BIND_NAK:
++		DEBUG(1, (__location__ ": Bind NACK received from %s!\n",
++			  rpccli_pipe_txt(talloc_tos(), cli)));
++
++		ret = dcerpc_verify_ncacn_packet_header(pkt,
++						DCERPC_PKT_BIND_NAK,
++						0, /* max_auth_info */
++						DCERPC_PFC_FLAG_FIRST |
++						DCERPC_PFC_FLAG_LAST,
++						0); /* optional flags */
++		if (!NT_STATUS_IS_OK(ret)) {
++			DEBUG(1, (__location__ ": Connection to %s got an unexpected "
++				  "RPC packet type - %u, expected %u: %s\n",
++				  rpccli_pipe_txt(talloc_tos(), cli),
++				  pkt->ptype, expected_pkt_type,
++				  nt_errstr(ret)));
++			NDR_PRINT_DEBUG(ncacn_packet, pkt);
++			return ret;
++		}
++
++		/* Use this for now... */
++		return NT_STATUS_NETWORK_ACCESS_DENIED;
++
+ 	case DCERPC_PKT_BIND_ACK:
++		ret = dcerpc_verify_ncacn_packet_header(pkt,
++					expected_pkt_type,
++					pkt->u.bind_ack.auth_info.length,
++					DCERPC_PFC_FLAG_FIRST |
++					DCERPC_PFC_FLAG_LAST,
++					DCERPC_PFC_FLAG_CONC_MPX |
++					DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN);
++		if (!NT_STATUS_IS_OK(ret)) {
++			DEBUG(1, (__location__ ": Connection to %s got an unexpected "
++				  "RPC packet type - %u, expected %u: %s\n",
++				  rpccli_pipe_txt(talloc_tos(), cli),
++				  pkt->ptype, expected_pkt_type,
++				  nt_errstr(ret)));
++			NDR_PRINT_DEBUG(ncacn_packet, pkt);
++			return ret;
++		}
+ 
+-		/* Client code never receives this kind of packets */
+ 		break;
+ 
++	case DCERPC_PKT_ALTER_RESP:
++		ret = dcerpc_verify_ncacn_packet_header(pkt,
++					expected_pkt_type,
++					pkt->u.alter_resp.auth_info.length,
++					DCERPC_PFC_FLAG_FIRST |
++					DCERPC_PFC_FLAG_LAST,
++					DCERPC_PFC_FLAG_CONC_MPX |
++					DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN);
++		if (!NT_STATUS_IS_OK(ret)) {
++			DEBUG(1, (__location__ ": Connection to %s got an unexpected "
++				  "RPC packet type - %u, expected %u: %s\n",
++				  rpccli_pipe_txt(talloc_tos(), cli),
++				  pkt->ptype, expected_pkt_type,
++				  nt_errstr(ret)));
++			NDR_PRINT_DEBUG(ncacn_packet, pkt);
++			return ret;
++		}
++
++		break;
+ 
+ 	case DCERPC_PKT_RESPONSE:
+ 
+ 		r = &pkt->u.response;
+ 
++		ret = dcerpc_verify_ncacn_packet_header(pkt,
++						expected_pkt_type,
++						r->stub_and_verifier.length,
++						0, /* required_flags */
++						DCERPC_PFC_FLAG_FIRST |
++						DCERPC_PFC_FLAG_LAST);
++		if (!NT_STATUS_IS_OK(ret)) {
++			DEBUG(1, (__location__ ": Connection to %s got an unexpected "
++				  "RPC packet type - %u, expected %u: %s\n",
++				  rpccli_pipe_txt(talloc_tos(), cli),
++				  pkt->ptype, expected_pkt_type,
++				  nt_errstr(ret)));
++			NDR_PRINT_DEBUG(ncacn_packet, pkt);
++			return ret;
++		}
++
++		tmp_stub.data = r->stub_and_verifier.data;
++		tmp_stub.length = r->stub_and_verifier.length;
++
+ 		/* Here's where we deal with incoming sign/seal. */
+ 		ret = dcerpc_check_auth(cli->auth, pkt,
+-					&r->stub_and_verifier,
++					&tmp_stub,
+ 					DCERPC_RESPONSE_LENGTH,
+-					pdu, &pad_len);
++					pdu);
+ 		if (!NT_STATUS_IS_OK(ret)) {
++			DEBUG(1, (__location__ ": Connection to %s got an unexpected "
++				  "RPC packet type - %u, expected %u: %s\n",
++				  rpccli_pipe_txt(talloc_tos(), cli),
++				  pkt->ptype, expected_pkt_type,
++				  nt_errstr(ret)));
++			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+-		if (pkt->frag_length < DCERPC_RESPONSE_LENGTH + pad_len) {
+-			return NT_STATUS_BUFFER_TOO_SMALL;
+-		}
+-
+ 		/* Point the return values at the NDR data. */
+-		rdata->data = r->stub_and_verifier.data;
++		*rdata = tmp_stub;
+ 
+-		if (pkt->auth_length) {
+-			/* We've already done integer wrap tests in
+-			 * dcerpc_check_auth(). */
+-			rdata->length = r->stub_and_verifier.length
+-					 - pad_len
+-					 - DCERPC_AUTH_TRAILER_LENGTH
+-					 - pkt->auth_length;
+-		} else {
+-			rdata->length = r->stub_and_verifier.length;
+-		}
+-
+-		DEBUG(10, ("Got pdu len %lu, data_len %lu, ss_len %u\n",
++		DEBUG(10, ("Got pdu len %lu, data_len %lu\n",
+ 			   (long unsigned int)pdu->length,
+-			   (long unsigned int)rdata->length,
+-			   (unsigned int)pad_len));
++			   (long unsigned int)rdata->length));
+ 
+ 		/*
+ 		 * If this is the first reply, and the allocation hint is
+@@ -478,14 +556,24 @@ static NTSTATUS cli_pipe_validate_curren
+ 
+ 		break;
+ 
+-	case DCERPC_PKT_BIND_NAK:
+-		DEBUG(1, (__location__ ": Bind NACK received from %s!\n",
+-			  rpccli_pipe_txt(talloc_tos(), cli)));
+-		/* Use this for now... */
+-		return NT_STATUS_NETWORK_ACCESS_DENIED;
+-
+ 	case DCERPC_PKT_FAULT:
+ 
++		ret = dcerpc_verify_ncacn_packet_header(pkt,
++						DCERPC_PKT_FAULT,
++						0, /* max_auth_info */
++						DCERPC_PFC_FLAG_FIRST |
++						DCERPC_PFC_FLAG_LAST,
++						DCERPC_PFC_FLAG_DID_NOT_EXECUTE);
++		if (!NT_STATUS_IS_OK(ret)) {
++			DEBUG(1, (__location__ ": Connection to %s got an unexpected "
++				  "RPC packet type - %u, expected %u: %s\n",
++				  rpccli_pipe_txt(talloc_tos(), cli),
++				  pkt->ptype, expected_pkt_type,
++				  nt_errstr(ret)));
++			NDR_PRINT_DEBUG(ncacn_packet, pkt);
++			return ret;
++		}
++
+ 		DEBUG(1, (__location__ ": RPC fault code %s received "
+ 			  "from %s!\n",
+ 			  dcerpc_errstr(talloc_tos(),
+@@ -502,13 +590,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 		return NT_STATUS_RPC_PROTOCOL_ERROR;
+ 	}
+ 
+-	if (pkt->ptype != expected_pkt_type) {
+-		DEBUG(3, (__location__ ": Connection to %s got an unexpected "
+-			  "RPC packet type - %u, not %u\n",
+-			  rpccli_pipe_txt(talloc_tos(), cli),
+-			  pkt->ptype, expected_pkt_type));
+-		return NT_STATUS_RPC_PROTOCOL_ERROR;
+-	}
+ 
+ 	if (pkt->call_id != call_id) {
+ 		DEBUG(3, (__location__ ": Connection to %s got an unexpected "
+@@ -518,17 +599,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 		return NT_STATUS_RPC_PROTOCOL_ERROR;
+ 	}
+ 
+-	/* Do this just before return - we don't want to modify any rpc header
+-	   data before now as we may have needed to do cryptographic actions on
+-	   it before. */
+-
+-	if ((pkt->ptype == DCERPC_PKT_BIND_ACK) &&
+-	    !(pkt->pfc_flags & DCERPC_PFC_FLAG_LAST)) {
+-		DEBUG(5, (__location__ ": bug in server (AS/U?), setting "
+-			  "fragment first/last ON.\n"));
+-		pkt->pfc_flags |= DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST;
+-	}
+-
+ 	return NT_STATUS_OK;
+ }
+ 
+@@ -883,6 +953,12 @@ static void rpc_api_pipe_got_pdu(struct
+ 
+ 	state->pkt = talloc(state, struct ncacn_packet);
+ 	if (!state->pkt) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
+ 		tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+ 		return;
+ 	}
+@@ -892,18 +968,16 @@ static void rpc_api_pipe_got_pdu(struct
+ 					  state->pkt,
+ 					  !state->endianess);
+ 	if (!NT_STATUS_IS_OK(status)) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
+ 		tevent_req_nterror(req, status);
+ 		return;
+ 	}
+ 
+-	if (state->incoming_frag.length != state->pkt->frag_length) {
+-		DEBUG(5, ("Incorrect pdu length %u, expected %u\n",
+-			  (unsigned int)state->incoming_frag.length,
+-			  (unsigned int)state->pkt->frag_length));
+-		tevent_req_nterror(req,  NT_STATUS_INVALID_PARAMETER);
+-		return;
+-	}
+-
+ 	status = cli_pipe_validate_current_pdu(state,
+ 						state->cli, state->pkt,
+ 						&state->incoming_frag,
+@@ -917,6 +991,28 @@ static void rpc_api_pipe_got_pdu(struct
+ 		  (unsigned)state->reply_pdu_offset,
+ 		  nt_errstr(status)));
+ 
++	if (state->pkt->ptype != DCERPC_PKT_FAULT && !NT_STATUS_IS_OK(status)) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
++	} else if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROTOCOL_ERROR)) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
++	} else if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_SEC_PKG_ERROR)) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
++	}
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		tevent_req_nterror(req, status);
+ 		return;
+@@ -941,7 +1037,24 @@ static void rpc_api_pipe_got_pdu(struct
+ 			 "%s\n",
+ 			 state->endianess?"little":"big",
+ 			 state->pkt->drep[0]?"little":"big"));
+-		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
++		tevent_req_nterror(req, NT_STATUS_RPC_PROTOCOL_ERROR);
++		return;
++	}
++
++	if (state->reply_pdu_offset + rdata.length > MAX_RPC_DATA_SIZE) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
++		tevent_req_nterror(req, NT_STATUS_RPC_PROTOCOL_ERROR);
+ 		return;
+ 	}
+ 
+@@ -949,6 +1062,12 @@ static void rpc_api_pipe_got_pdu(struct
+ 	if (state->reply_pdu.length < state->reply_pdu_offset + rdata.length) {
+ 		if (!data_blob_realloc(NULL, &state->reply_pdu,
+ 				state->reply_pdu_offset + rdata.length)) {
++			/*
++			 * TODO: do a real async disconnect ...
++			 *
++			 * For now do it sync...
++			 */
++			TALLOC_FREE(state->cli->transport);
+ 			tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+ 			return;
+ 		}
+@@ -978,6 +1097,14 @@ static void rpc_api_pipe_got_pdu(struct
+ 	subreq = get_complete_frag_send(state, state->ev, state->cli,
+ 					state->call_id,
+ 					&state->incoming_frag);
++	if (subreq == NULL) {
++		/*
++		 * TODO: do a real async disconnect ...
++		 *
++		 * For now do it sync...
++		 */
++		TALLOC_FREE(state->cli->transport);
++	}
+ 	if (tevent_req_nomem(subreq, req)) {
+ 		return;
+ 	}
+@@ -1247,7 +1374,7 @@ static NTSTATUS create_rpc_bind_req(TALL
+ 						auth->auth_type,
+ 						auth->auth_level,
+ 						0, /* auth_pad_length */
+-						1, /* auth_context_id */
++						auth->auth_context_id,
+ 						&auth_token,
+ 						&auth_info);
+ 		if (!NT_STATUS_IS_OK(ret)) {
+@@ -1749,9 +1876,8 @@ static bool check_bind_response(const st
+ 
+ static NTSTATUS create_rpc_bind_auth3(TALLOC_CTX *mem_ctx,
+ 				struct rpc_pipe_client *cli,
+-				uint32 rpc_call_id,
+-				enum dcerpc_AuthType auth_type,
+-				enum dcerpc_AuthLevel auth_level,
++				struct pipe_auth_data *auth,
++				uint32_t rpc_call_id,
+ 				DATA_BLOB *pauth_blob,
+ 				DATA_BLOB *rpc_out)
+ {
+@@ -1761,10 +1887,10 @@ static NTSTATUS create_rpc_bind_auth3(TA
+ 	u.auth3._pad = 0;
+ 
+ 	status = dcerpc_push_dcerpc_auth(mem_ctx,
+-					 auth_type,
+-					 auth_level,
++					 auth->auth_type,
++					 auth->auth_level,
+ 					 0, /* auth_pad_length */
+-					 1, /* auth_context_id */
++					 auth->auth_context_id,
+ 					 pauth_blob,
+ 					 &u.auth3.auth_info);
+ 	if (!NT_STATUS_IS_OK(status)) {
+@@ -1794,9 +1920,8 @@ static NTSTATUS create_rpc_bind_auth3(TA
+  ********************************************************************/
+ 
+ static NTSTATUS create_rpc_alter_context(TALLOC_CTX *mem_ctx,
+-					enum dcerpc_AuthType auth_type,
+-					enum dcerpc_AuthLevel auth_level,
+-					uint32 rpc_call_id,
++					struct pipe_auth_data *auth,
++					uint32_t rpc_call_id,
+ 					const struct ndr_syntax_id *abstract,
+ 					const struct ndr_syntax_id *transfer,
+ 					const DATA_BLOB *pauth_blob, /* spnego auth blob already created. */
+@@ -1806,10 +1931,10 @@ static NTSTATUS create_rpc_alter_context
+ 	NTSTATUS status;
+ 
+ 	status = dcerpc_push_dcerpc_auth(mem_ctx,
+-					 auth_type,
+-					 auth_level,
++					 auth->auth_type,
++					 auth->auth_level,
+ 					 0, /* auth_pad_length */
+-					 1, /* auth_context_id */
++					 auth->auth_context_id,
+ 					 pauth_blob,
+ 					 &auth_info);
+ 	if (!NT_STATUS_IS_OK(status)) {
+@@ -1957,30 +2082,45 @@ static void rpc_pipe_bind_step_one_done(
+ 		rpc_pipe_bind_step_two_trigger(req);
+ 		return;
+ 
+-	case DCERPC_AUTH_TYPE_NTLMSSP:
+-	case DCERPC_AUTH_TYPE_SPNEGO:
+-	case DCERPC_AUTH_TYPE_KRB5:
+-		/* Paranoid lenght checks */
+-		if (pkt->frag_length < DCERPC_AUTH_TRAILER_LENGTH
+-						+ pkt->auth_length) {
+-			tevent_req_nterror(req,
+-					NT_STATUS_INFO_LENGTH_MISMATCH);
++	default:
++		if (pkt->auth_length == 0) {
++			tevent_req_nterror(req, NT_STATUS_RPC_PROTOCOL_ERROR);
+ 			return;
+ 		}
+ 		/* get auth credentials */
+-		status = dcerpc_pull_dcerpc_auth(talloc_tos(),
+-						 &pkt->u.bind_ack.auth_info,
+-						 &auth, false);
++		status = dcerpc_pull_auth_trailer(pkt, talloc_tos(),
++						  &pkt->u.bind_ack.auth_info,
++						  &auth, NULL, true);
+ 		if (!NT_STATUS_IS_OK(status)) {
+ 			DEBUG(0, ("Failed to pull dcerpc auth: %s.\n",
+ 				  nt_errstr(status)));
+ 			tevent_req_nterror(req, status);
+ 			return;
+ 		}
+-		break;
+ 
+-	default:
+-		goto err_out;
++		if (auth.auth_type != pauth->auth_type) {
++			DEBUG(0, (__location__ " Auth type %u mismatch expected %u.\n",
++				  auth.auth_type, pauth->auth_type));
++			tevent_req_nterror(req, NT_STATUS_RPC_PROTOCOL_ERROR);
++			return;
++		}
++
++		if (auth.auth_level != pauth->auth_level) {
++			DEBUG(0, (__location__ " Auth level %u mismatch expected %u.\n",
++				  auth.auth_level, pauth->auth_level));
++			tevent_req_nterror(req, NT_STATUS_RPC_PROTOCOL_ERROR);
++			return;
++		}
++
++		if (auth.auth_context_id != pauth->auth_context_id) {
++			DEBUG(0, (__location__ " Auth context id %u mismatch expected %u.\n",
++				  (unsigned)auth.auth_context_id,
++				  (unsigned)pauth->auth_context_id));
++			tevent_req_nterror(req, NT_STATUS_RPC_PROTOCOL_ERROR);
++			return;
++		}
++
++		break;
+ 	}
+ 
+ 	/*
+@@ -2226,9 +2366,7 @@ static NTSTATUS rpc_bind_next_send(struc
+ 	/* Now prepare the alter context pdu. */
+ 	data_blob_free(&state->rpc_out);
+ 
+-	status = create_rpc_alter_context(state,
+-					  auth->auth_type,
+-					  auth->auth_level,
++	status = create_rpc_alter_context(state, auth,
+ 					  state->rpc_call_id,
+ 					  &state->cli->abstract_syntax,
+ 					  &state->cli->transfer_syntax,
+@@ -2261,10 +2399,8 @@ static NTSTATUS rpc_bind_finish_send(str
+ 	/* Now prepare the auth3 context pdu. */
+ 	data_blob_free(&state->rpc_out);
+ 
+-	status = create_rpc_bind_auth3(state, state->cli,
++	status = create_rpc_bind_auth3(state, state->cli, auth,
+ 					state->rpc_call_id,
+-					auth->auth_type,
+-					auth->auth_level,
+ 					auth_token,
+ 					&state->rpc_out);
+ 	if (!NT_STATUS_IS_OK(status)) {
+@@ -2498,8 +2634,9 @@ static struct tevent_req *rpccli_bh_disc
+ 	/*
+ 	 * TODO: do a real async disconnect ...
+ 	 *
+-	 * For now the caller needs to free rpc_cli
++	 * For now we do it sync...
+ 	 */
++	TALLOC_FREE(hs->rpc_cli->transport);
+ 	hs->rpc_cli = NULL;
+ 
+ 	tevent_req_done(req);
+@@ -2636,6 +2773,7 @@ NTSTATUS rpccli_ncalrpc_bind_data(TALLOC
+ 
+ 	result->auth_type = DCERPC_AUTH_TYPE_NCALRPC_AS_SYSTEM;
+ 	result->auth_level = DCERPC_AUTH_LEVEL_CONNECT;
++	result->auth_context_id = 1;
+ 
+ 	result->user_name = talloc_strdup(result, "");
+ 	result->domain = talloc_strdup(result, "");
+@@ -2660,6 +2798,7 @@ NTSTATUS rpccli_anon_bind_data(TALLOC_CT
+ 
+ 	result->auth_type = DCERPC_AUTH_TYPE_NONE;
+ 	result->auth_level = DCERPC_AUTH_LEVEL_NONE;
++	result->auth_context_id = 0;
+ 
+ 	result->user_name = talloc_strdup(result, "");
+ 	result->domain = talloc_strdup(result, "");
+@@ -2697,6 +2836,7 @@ static NTSTATUS rpccli_ntlmssp_bind_data
+ 
+ 	result->auth_type = auth_type;
+ 	result->auth_level = auth_level;
++	result->auth_context_id = 1;
+ 
+ 	result->user_name = talloc_strdup(result, username);
+ 	result->domain = talloc_strdup(result, domain);
+@@ -2768,6 +2908,7 @@ NTSTATUS rpccli_schannel_bind_data(TALLO
+ 
+ 	result->auth_type = DCERPC_AUTH_TYPE_SCHANNEL;
+ 	result->auth_level = auth_level;
++	result->auth_context_id = 1;
+ 
+ 	result->user_name = talloc_strdup(result, "");
+ 	result->domain = talloc_strdup(result, domain);
+@@ -3432,6 +3573,7 @@ NTSTATUS cli_rpc_pipe_open_krb5(struct c
+ 	}
+ 	auth->auth_type = DCERPC_AUTH_TYPE_KRB5;
+ 	auth->auth_level = auth_level;
++	auth->auth_context_id = 1;
+ 
+ 	if (!username) {
+ 		username = "";
+@@ -3502,6 +3644,7 @@ NTSTATUS cli_rpc_pipe_open_spnego_krb5(s
+ 	}
+ 	auth->auth_type = DCERPC_AUTH_TYPE_SPNEGO;
+ 	auth->auth_level = auth_level;
++	auth->auth_context_id = 1;
+ 
+ 	if (!username) {
+ 		username = "";
+@@ -3576,6 +3719,7 @@ NTSTATUS cli_rpc_pipe_open_spnego_ntlmss
+ 	}
+ 	auth->auth_type = DCERPC_AUTH_TYPE_SPNEGO;
+ 	auth->auth_level = auth_level;
++	auth->auth_context_id = 1;
+ 
+ 	if (!username) {
+ 		username = "";
+--- a/source4/rpc_server/dcesrv_auth.c
++++ b/source4/rpc_server/dcesrv_auth.c
+@@ -46,7 +46,7 @@ bool dcesrv_auth_bind(struct dcesrv_call
+ 	NTSTATUS status;
+ 	uint32_t auth_length;
+ 
+-	if (pkt->u.bind.auth_info.length == 0) {
++	if (pkt->auth_length == 0) {
+ 		dce_conn->auth_state.auth_info = NULL;
+ 		return true;
+ 	}
+@@ -108,7 +108,7 @@ NTSTATUS dcesrv_auth_bind_ack(struct dce
+ 	struct dcesrv_connection *dce_conn = call->conn;
+ 	NTSTATUS status;
+ 
+-	if (!call->conn->auth_state.gensec_security) {
++	if (call->pkt.auth_length == 0) {
+ 		return NT_STATUS_OK;
+ 	}
+ 
+@@ -155,10 +155,16 @@ bool dcesrv_auth_auth3(struct dcesrv_cal
+ 	NTSTATUS status;
+ 	uint32_t auth_length;
+ 
+-	/* We can't work without an existing gensec state, and an new blob to feed it */
+-	if (!dce_conn->auth_state.auth_info ||
+-	    !dce_conn->auth_state.gensec_security ||
+-	    pkt->u.auth3.auth_info.length == 0) {
++	if (pkt->auth_length == 0) {
++		return false;
++	}
++
++	if (!dce_conn->auth_state.auth_info) {
++		return false;
++	}
++
++	/* We can't work without an existing gensec state */
++	if (!dce_conn->auth_state.gensec_security) {
+ 		return false;
+ 	}
+ 
+@@ -203,7 +209,7 @@ bool dcesrv_auth_alter(struct dcesrv_cal
+ 	uint32_t auth_length;
+ 
+ 	/* on a pure interface change there is no auth blob */
+-	if (pkt->u.alter.auth_info.length == 0) {
++	if (pkt->auth_length == 0) {
+ 		return true;
+ 	}
+ 
+@@ -238,8 +244,7 @@ NTSTATUS dcesrv_auth_alter_ack(struct dc
+ 
+ 	/* on a pure interface change there is no auth_info structure
+ 	   setup */
+-	if (!call->conn->auth_state.auth_info ||
+-	    dce_conn->auth_state.auth_info->credentials.length == 0) {
++	if (call->pkt.auth_length == 0) {
+ 		return NT_STATUS_OK;
+ 	}
+ 
+@@ -315,6 +320,11 @@ bool dcesrv_auth_request(struct dcesrv_c
+ 		return false;
+ 	}
+ 
++	if (pkt->auth_length == 0) {
++		DEBUG(1,("dcesrv_auth_request: unexpected auth_length of 0\n"));
++		return false;
++	}
++
+ 	status = dcerpc_pull_auth_trailer(pkt, call,
+ 					  &pkt->u.request.stub_and_verifier,
+ 					  &auth, &auth_length, false);
+--- a/source4/librpc/rpc/dcerpc.c
++++ b/source4/librpc/rpc/dcerpc.c
+@@ -701,6 +701,14 @@ static NTSTATUS ncacn_pull_request_auth(
+ 		return NT_STATUS_INVALID_LEVEL;
+ 	}
+ 
++	if (pkt->auth_length == 0) {
++		return NT_STATUS_INVALID_NETWORK_RESPONSE;
++	}
++
++	if (c->security_state.generic_state == NULL) {
++		return NT_STATUS_INTERNAL_ERROR;
++	}
++
+ 	status = dcerpc_pull_auth_trailer(pkt, mem_ctx,
+ 					  &pkt->u.response.stub_and_verifier,
+ 					  &auth, &auth_length, false);
+@@ -1074,7 +1082,7 @@ static void dcerpc_bind_recv_handler(str
+ 	}
+ 
+ 	/* the bind_ack might contain a reply set of credentials */
+-	if (conn->security_state.auth_info && pkt->u.bind_ack.auth_info.length) {
++	if (conn->security_state.auth_info && pkt->auth_length) {
+ 		NTSTATUS status;
+ 		uint32_t auth_length;
+ 		status = dcerpc_pull_auth_trailer(pkt, conn, &pkt->u.bind_ack.auth_info,
+@@ -1847,8 +1855,7 @@ static void dcerpc_alter_recv_handler(st
+ 	}
+ 
+ 	/* the alter_resp might contain a reply set of credentials */
+-	if (recv_pipe->conn->security_state.auth_info &&
+-	    pkt->u.alter_resp.auth_info.length) {
++	if (recv_pipe->conn->security_state.auth_info && pkt->auth_length) {
+ 		struct dcecli_connection *conn = recv_pipe->conn;
+ 		NTSTATUS status;
+ 		uint32_t auth_length;
+--- a/source3/librpc/rpc/dcerpc.h
++++ b/source3/librpc/rpc/dcerpc.h
+@@ -42,6 +42,7 @@ struct pipe_auth_data {
+ 	bool verified_bitmask1;
+ 
+ 	void *auth_ctx;
++	uint32_t auth_context_id;
+ 
+ 	/* Only the client code uses these 3 for now */
+ 	char *domain;
+@@ -71,10 +72,6 @@ NTSTATUS dcerpc_push_dcerpc_auth(TALLOC_
+ 				 uint32_t auth_context_id,
+ 				 const DATA_BLOB *credentials,
+ 				 DATA_BLOB *blob);
+-NTSTATUS dcerpc_pull_dcerpc_auth(TALLOC_CTX *mem_ctx,
+-				 const DATA_BLOB *blob,
+-				 struct dcerpc_auth *r,
+-				 bool bigendian);
+ NTSTATUS dcerpc_guess_sizes(struct pipe_auth_data *auth,
+ 			    size_t header_len, size_t data_left,
+ 			    size_t max_xmit_frag, size_t pad_alignment,
+@@ -85,9 +82,8 @@ NTSTATUS dcerpc_add_auth_footer(struct p
+ NTSTATUS dcerpc_check_auth(struct pipe_auth_data *auth,
+ 			   struct ncacn_packet *pkt,
+ 			   DATA_BLOB *pkt_trailer,
+-			   size_t header_size,
+-			   DATA_BLOB *raw_pkt,
+-			   size_t *pad_len);
++			   uint8_t header_size,
++			   DATA_BLOB *raw_pkt);
+ 
+ /* The following definitions come from librpc/rpc/rpc_common.c  */
+ 
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -42,6 +42,7 @@
+ #include "auth.h"
+ #include "ntdomain.h"
+ #include "rpc_server/srv_pipe.h"
++#include "../librpc/gen_ndr/ndr_dcerpc.h"
+ #include "../librpc/ndr/ndr_dcerpc.h"
+ 
+ #undef DBGC_CLASS
+@@ -270,10 +271,14 @@ static bool setup_bind_nak(struct pipes_
+ 	p->out_data.data_sent_length = 0;
+ 	p->out_data.current_pdu_sent = 0;
+ 
++	set_incoming_fault(p);
+ 	TALLOC_FREE(p->auth.auth_ctx);
+ 	p->auth.auth_level = DCERPC_AUTH_LEVEL_NONE;
+ 	p->auth.auth_type = DCERPC_AUTH_TYPE_NONE;
+ 	p->pipe_bound = False;
++	p->allow_bind = false;
++	p->allow_alter = false;
++	p->allow_auth3 = false;
+ 
+ 	return True;
+ }
+@@ -339,16 +344,46 @@ static bool check_bind_req(struct pipes_
+ 	DEBUG(3,("check_bind_req for %s\n",
+ 		 get_pipe_name_from_syntax(talloc_tos(), abstract)));
+ 
++	ok = ndr_syntax_id_equal(transfer, &ndr_transfer_syntax);
++	if (!ok) {
++		DEBUG(1,("check_bind_req unknown transfer syntax for "
++			 "%s context_id=%u\n",
++			 get_pipe_name_from_syntax(talloc_tos(), abstract),
++			 (unsigned)context_id));
++		return false;
++	}
++
++	for (context_fns = p->contexts;
++	     context_fns != NULL;
++	     context_fns = context_fns->next)
++	{
++		if (context_fns->context_id != context_id) {
++			continue;
++		}
++
++		ok = ndr_syntax_id_equal(&context_fns->syntax,
++					 abstract);
++		if (ok) {
++			return true;
++		}
++
++		DEBUG(1,("check_bind_req: changing abstract syntax for "
++			 "%s context_id=%u into %s not supported\n",
++			 get_pipe_name_from_syntax(talloc_tos(), &context_fns->syntax),
++			 (unsigned)context_id,
++			 get_pipe_name_from_syntax(talloc_tos(), abstract)));
++		return false;
++	}
++
+ 	/* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */
+-	if (rpc_srv_pipe_exists_by_id(abstract) &&
+-	   ndr_syntax_id_equal(transfer, &ndr_transfer_syntax)) {
+-		DEBUG(3, ("check_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
+-			rpc_srv_get_pipe_cli_name(abstract),
+-			rpc_srv_get_pipe_srv_name(abstract)));
+-	} else {
++	if (!rpc_srv_pipe_exists_by_id(abstract)) {
+ 		return false;
+ 	}
+ 
++	DEBUG(3, ("check_bind_req: %s -> %s rpc service\n",
++		  rpc_srv_get_pipe_cli_name(abstract),
++		  rpc_srv_get_pipe_srv_name(abstract)));
++
+ 	context_fns = SMB_MALLOC_P(struct pipe_rpc_fns);
+ 	if (context_fns == NULL) {
+ 		DEBUG(0,("check_bind_req: malloc() failed!\n"));
+@@ -447,6 +482,7 @@ static bool pipe_spnego_auth_bind(struct
+ 
+ 	p->auth.auth_ctx = spnego_ctx;
+ 	p->auth.auth_type = DCERPC_AUTH_TYPE_SPNEGO;
++	p->auth.auth_context_id = auth_info->auth_context_id;
+ 
+ 	DEBUG(10, ("SPNEGO auth started\n"));
+ 
+@@ -557,6 +593,7 @@ static bool pipe_schannel_auth_bind(stru
+ 	/* We're finished with this bind - no more packets. */
+ 	p->auth.auth_ctx = schannel_auth;
+ 	p->auth.auth_type = DCERPC_AUTH_TYPE_SCHANNEL;
++	p->auth.auth_context_id = auth_info->auth_context_id;
+ 
+ 	p->pipe_bound = True;
+ 
+@@ -601,6 +638,7 @@ static bool pipe_ntlmssp_auth_bind(struc
+ 
+ 	p->auth.auth_ctx = ntlmssp_state;
+ 	p->auth.auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
++	p->auth.auth_context_id = auth_info->auth_context_id;
+ 
+ 	DEBUG(10, (__location__ ": NTLMSSP auth started\n"));
+ 
+@@ -776,6 +814,11 @@ static NTSTATUS pipe_auth_verify_final(s
+ 	void *mech_ctx;
+ 	NTSTATUS status;
+ 
++	if (p->auth.auth_type == DCERPC_AUTH_TYPE_NONE) {
++		p->pipe_bound = true;
++		return NT_STATUS_OK;
++	}
++
+ 	switch (p->auth.auth_type) {
+ 	case DCERPC_AUTH_TYPE_NTLMSSP:
+ 		ntlmssp_ctx = talloc_get_type_abort(p->auth.auth_ctx,
+@@ -867,16 +910,38 @@ static bool api_pipe_bind_req(struct pip
+ 	DATA_BLOB auth_resp = data_blob_null;
+ 	DATA_BLOB auth_blob = data_blob_null;
+ 
+-	/* No rebinds on a bound pipe - use alter context. */
+-	if (p->pipe_bound) {
+-		DEBUG(2,("api_pipe_bind_req: rejecting bind request on bound "
+-			 "pipe %s.\n",
+-			 get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
++	if (!p->allow_bind) {
++		DEBUG(2,("Pipe not in allow bind state\n"));
+ 		return setup_bind_nak(p, pkt);
+ 	}
++	p->allow_bind = false;
++
++	status = dcerpc_verify_ncacn_packet_header(pkt,
++			DCERPC_PKT_BIND,
++			pkt->u.bind.auth_info.length,
++			0, /* required flags */
++			DCERPC_PFC_FLAG_FIRST |
++			DCERPC_PFC_FLAG_LAST |
++			DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN |
++			0x08 | /* this is not defined, but should be ignored */
++			DCERPC_PFC_FLAG_CONC_MPX |
++			DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
++			DCERPC_PFC_FLAG_MAYBE |
++			DCERPC_PFC_FLAG_OBJECT_UUID);
++	if (!NT_STATUS_IS_OK(status)) {
++		DEBUG(1, ("api_pipe_bind_req: invalid pdu: %s\n",
++			  nt_errstr(status)));
++		NDR_PRINT_DEBUG(ncacn_packet, pkt);
++		goto err_exit;
++	}
+ 
+ 	if (pkt->u.bind.num_contexts == 0) {
+-		DEBUG(0, ("api_pipe_bind_req: no rpc contexts around\n"));
++		DEBUG(1, ("api_pipe_bind_req: no rpc contexts around\n"));
++		goto err_exit;
++	}
++
++	if (pkt->u.bind.ctx_list[0].num_transfer_syntaxes == 0) {
++		DEBUG(1, ("api_pipe_bind_req: no transfer syntaxes around\n"));
+ 		goto err_exit;
+ 	}
+ 
+@@ -960,25 +1025,12 @@ static bool api_pipe_bind_req(struct pip
+ 	 * Check if this is an authenticated bind request.
+ 	 */
+ 	if (pkt->auth_length) {
+-		/* Quick length check. Won't catch a bad auth footer,
+-		 * prevents overrun. */
+-
+-		if (pkt->frag_length < RPC_HEADER_LEN +
+-					DCERPC_AUTH_TRAILER_LENGTH +
+-					pkt->auth_length) {
+-			DEBUG(0,("api_pipe_bind_req: auth_len (%u) "
+-				"too long for fragment %u.\n",
+-				(unsigned int)pkt->auth_length,
+-				(unsigned int)pkt->frag_length));
+-			goto err_exit;
+-		}
+-
+ 		/*
+ 		 * Decode the authentication verifier.
+ 		 */
+-		status = dcerpc_pull_dcerpc_auth(pkt,
+-						 &pkt->u.bind.auth_info,
+-						 &auth_info, p->endian);
++		status = dcerpc_pull_auth_trailer(pkt, pkt,
++						  &pkt->u.bind.auth_info,
++						  &auth_info, NULL, true);
+ 		if (!NT_STATUS_IS_OK(status)) {
+ 			DEBUG(0, ("Unable to unmarshall dcerpc_auth.\n"));
+ 			goto err_exit;
+@@ -1072,6 +1124,7 @@ static bool api_pipe_bind_req(struct pip
+ 		p->pipe_bound = True;
+ 		/* The session key was initialized from the SMB
+ 		 * session in make_internal_rpc_pipe_p */
++		p->auth.auth_context_id = 0;
+ 	}
+ 
+ 	ZERO_STRUCT(u.bind_ack);
+@@ -1113,15 +1166,15 @@ static bool api_pipe_bind_req(struct pip
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		DEBUG(0, ("Failed to marshall bind_ack packet. (%s)\n",
+ 			  nt_errstr(status)));
++		goto err_exit;
+ 	}
+ 
+ 	if (auth_resp.length) {
+-
+ 		status = dcerpc_push_dcerpc_auth(pkt,
+ 						 auth_type,
+ 						 auth_info.auth_level,
+-						 0,
+-						 1, /* auth_context_id */
++						 0, /* pad_len */
++						 p->auth.auth_context_id,
+ 						 &auth_resp,
+ 						 &auth_blob);
+ 		if (!NT_STATUS_IS_OK(status)) {
+@@ -1152,6 +1205,22 @@ static bool api_pipe_bind_req(struct pip
+ 	p->out_data.current_pdu_sent = 0;
+ 
+ 	TALLOC_FREE(auth_blob.data);
++
++	if (bind_ack_ctx.result == 0) {
++		p->allow_alter = true;
++		p->allow_auth3 = true;
++		if (p->auth.auth_type == DCERPC_AUTH_TYPE_NONE) {
++			status = pipe_auth_verify_final(p);
++			if (!NT_STATUS_IS_OK(status)) {
++				DEBUG(0, ("pipe_auth_verify_final failed: %s\n",
++					  nt_errstr(status)));
++				goto err_exit;
++			}
++		}
++	} else {
++		goto err_exit;
++	}
++
+ 	return True;
+ 
+   err_exit:
+@@ -1176,18 +1245,39 @@ bool api_pipe_bind_auth3(struct pipes_st
+ 
+ 	DEBUG(5, ("api_pipe_bind_auth3: decode request. %d\n", __LINE__));
+ 
+-	if (pkt->auth_length == 0) {
+-		DEBUG(0, ("No auth field sent for bind request!\n"));
++	if (!p->allow_auth3) {
++		DEBUG(1, ("Pipe not in allow auth3 state.\n"));
+ 		goto err;
+ 	}
+ 
+-	/* Ensure there's enough data for an authenticated request. */
+-	if (pkt->frag_length < RPC_HEADER_LEN
+-				+ DCERPC_AUTH_TRAILER_LENGTH
+-				+ pkt->auth_length) {
+-			DEBUG(0,("api_pipe_ntlmssp_auth_process: auth_len "
+-				"%u is too large.\n",
+-                        (unsigned int)pkt->auth_length));
++	status = dcerpc_verify_ncacn_packet_header(pkt,
++			DCERPC_PKT_AUTH3,
++			pkt->u.auth3.auth_info.length,
++			0, /* required flags */
++			DCERPC_PFC_FLAG_FIRST |
++			DCERPC_PFC_FLAG_LAST |
++			DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN |
++			0x08 | /* this is not defined, but should be ignored */
++			DCERPC_PFC_FLAG_CONC_MPX |
++			DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
++			DCERPC_PFC_FLAG_MAYBE |
++			DCERPC_PFC_FLAG_OBJECT_UUID);
++	if (!NT_STATUS_IS_OK(status)) {
++		DEBUG(1, ("api_pipe_bind_auth3: invalid pdu: %s\n",
++			  nt_errstr(status)));
++		NDR_PRINT_DEBUG(ncacn_packet, pkt);
++		goto err;
++	}
++
++	/* We can only finish if the pipe is unbound for now */
++	if (p->pipe_bound) {
++		DEBUG(0, (__location__ ": Pipe already bound, "
++			  "AUTH3 not supported!\n"));
++		goto err;
++	}
++
++	if (pkt->auth_length == 0) {
++		DEBUG(1, ("No auth field sent for auth3 request!\n"));
+ 		goto err;
+ 	}
+ 
+@@ -1195,9 +1285,9 @@ bool api_pipe_bind_auth3(struct pipes_st
+ 	 * Decode the authentication verifier response.
+ 	 */
+ 
+-	status = dcerpc_pull_dcerpc_auth(pkt,
+-					 &pkt->u.auth3.auth_info,
+-					 &auth_info, p->endian);
++	status = dcerpc_pull_auth_trailer(pkt, pkt,
++					  &pkt->u.auth3.auth_info,
++					  &auth_info, NULL, true);
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		DEBUG(0, ("Failed to unmarshall dcerpc_auth.\n"));
+ 		goto err;
+@@ -1215,6 +1305,21 @@ bool api_pipe_bind_auth3(struct pipes_st
+ 		goto err;
+ 	}
+ 
++	if (auth_info.auth_level != p->auth.auth_level) {
++		DEBUG(1, ("Auth level mismatch! Client sent %d, "
++			  "but auth was started as level %d!\n",
++			  auth_info.auth_level, p->auth.auth_level));
++		goto err;
++	}
++
++	if (auth_info.auth_context_id != p->auth.auth_context_id) {
++		DEBUG(0, ("Auth context id mismatch! Client sent %u, "
++			  "but auth was started as level %u!\n",
++			  (unsigned)auth_info.auth_context_id,
++			  (unsigned)p->auth.auth_context_id));
++		goto err;
++	}
++
+ 	switch (auth_info.auth_type) {
+ 	case DCERPC_AUTH_TYPE_NTLMSSP:
+ 		ntlmssp_ctx = talloc_get_type_abort(p->auth.auth_ctx,
+@@ -1267,6 +1372,10 @@ bool api_pipe_bind_auth3(struct pipes_st
+ 	return true;
+ 
+ err:
++	p->pipe_bound = false;
++	p->allow_bind = false;
++	p->allow_alter = false;
++	p->allow_auth3 = false;
+ 
+ 	TALLOC_FREE(p->auth.auth_ctx);
+ 	return false;
+@@ -1284,7 +1393,7 @@ static bool api_pipe_alter_context(struc
+ 	uint16 assoc_gid;
+ 	NTSTATUS status;
+ 	union dcerpc_payload u;
+-	struct dcerpc_ack_ctx bind_ack_ctx;
++	struct dcerpc_ack_ctx alter_ack_ctx;
+ 	DATA_BLOB auth_resp = data_blob_null;
+ 	DATA_BLOB auth_blob = data_blob_null;
+ 	int pad_len = 0;
+@@ -1294,8 +1403,42 @@ static bool api_pipe_alter_context(struc
+ 
+ 	DEBUG(5,("api_pipe_alter_context: make response. %d\n", __LINE__));
+ 
+-	if (pkt->u.bind.assoc_group_id != 0) {
+-		assoc_gid = pkt->u.bind.assoc_group_id;
++	if (!p->allow_alter) {
++		DEBUG(1, ("Pipe not in allow alter state.\n"));
++		goto err_exit;
++	}
++
++	status = dcerpc_verify_ncacn_packet_header(pkt,
++			DCERPC_PKT_ALTER,
++			pkt->u.alter.auth_info.length,
++			0, /* required flags */
++			DCERPC_PFC_FLAG_FIRST |
++			DCERPC_PFC_FLAG_LAST |
++			DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN |
++			0x08 | /* this is not defined, but should be ignored */
++			DCERPC_PFC_FLAG_CONC_MPX |
++			DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
++			DCERPC_PFC_FLAG_MAYBE |
++			DCERPC_PFC_FLAG_OBJECT_UUID);
++	if (!NT_STATUS_IS_OK(status)) {
++		DEBUG(1, ("api_pipe_alter_context: invalid pdu: %s\n",
++			  nt_errstr(status)));
++		NDR_PRINT_DEBUG(ncacn_packet, pkt);
++		goto err_exit;
++	}
++
++	if (pkt->u.alter.num_contexts == 0) {
++		DEBUG(1, ("api_pipe_alter_context: no rpc contexts around\n"));
++		goto err_exit;
++	}
++
++	if (pkt->u.alter.ctx_list[0].num_transfer_syntaxes == 0) {
++		DEBUG(1, ("api_pipe_alter_context: no transfer syntaxes around\n"));
++		goto err_exit;
++	}
++
++	if (pkt->u.alter.assoc_group_id != 0) {
++		assoc_gid = pkt->u.alter.assoc_group_id;
+ 	} else {
+ 		assoc_gid = 0x53f0;
+ 	}
+@@ -1305,59 +1448,45 @@ static bool api_pipe_alter_context(struc
+ 	 */
+ 
+ 	/* If the requested abstract synt uuid doesn't match our client pipe,
+-		reject the bind_ack & set the transfer interface synt to all 0's,
++		reject the alter_ack & set the transfer interface synt to all 0's,
+ 		ver 0 (observed when NT5 attempts to bind to abstract interfaces
+ 		unknown to NT4)
+ 		Needed when adding entries to a DACL from NT5 - SK */
+ 
+ 	if (check_bind_req(p,
+-			&pkt->u.bind.ctx_list[0].abstract_syntax,
+-			&pkt->u.bind.ctx_list[0].transfer_syntaxes[0],
+-			pkt->u.bind.ctx_list[0].context_id)) {
+-
+-		bind_ack_ctx.result = 0;
+-		bind_ack_ctx.reason = 0;
+-		bind_ack_ctx.syntax = pkt->u.bind.ctx_list[0].transfer_syntaxes[0];
++			&pkt->u.alter.ctx_list[0].abstract_syntax,
++			&pkt->u.alter.ctx_list[0].transfer_syntaxes[0],
++			pkt->u.alter.ctx_list[0].context_id)) {
++
++		alter_ack_ctx.result = 0;
++		alter_ack_ctx.reason = 0;
++		alter_ack_ctx.syntax = pkt->u.alter.ctx_list[0].transfer_syntaxes[0];
+ 	} else {
+-		p->pipe_bound = False;
+ 		/* Rejection reason: abstract syntax not supported */
+-		bind_ack_ctx.result = DCERPC_BIND_PROVIDER_REJECT;
+-		bind_ack_ctx.reason = DCERPC_BIND_REASON_ASYNTAX;
+-		bind_ack_ctx.syntax = null_ndr_syntax_id;
++		alter_ack_ctx.result = DCERPC_BIND_PROVIDER_REJECT;
++		alter_ack_ctx.reason = DCERPC_BIND_REASON_ASYNTAX;
++		alter_ack_ctx.syntax = null_ndr_syntax_id;
+ 	}
+ 
+ 	/*
+ 	 * Check if this is an authenticated alter context request.
+ 	 */
+ 	if (pkt->auth_length) {
+-		/* Quick length check. Won't catch a bad auth footer,
+-		 * prevents overrun. */
+-
+-		if (pkt->frag_length < RPC_HEADER_LEN +
+-					DCERPC_AUTH_TRAILER_LENGTH +
+-					pkt->auth_length) {
+-			DEBUG(0,("api_pipe_alter_context: auth_len (%u) "
+-				"too long for fragment %u.\n",
+-				(unsigned int)pkt->auth_length,
+-				(unsigned int)pkt->frag_length ));
++		/* We can only finish if the pipe is unbound for now */
++		if (p->pipe_bound) {
++			DEBUG(0, (__location__ ": Pipe already bound, "
++				  "Altering Context not yet supported!\n"));
+ 			goto err_exit;
+ 		}
+ 
+-		status = dcerpc_pull_dcerpc_auth(pkt,
+-						 &pkt->u.bind.auth_info,
+-						 &auth_info, p->endian);
++		status = dcerpc_pull_auth_trailer(pkt, pkt,
++						  &pkt->u.alter.auth_info,
++						  &auth_info, NULL, true);
+ 		if (!NT_STATUS_IS_OK(status)) {
+ 			DEBUG(0, ("Unable to unmarshall dcerpc_auth.\n"));
+ 			goto err_exit;
+ 		}
+ 
+-		/* We can only finish if the pipe is unbound for now */
+-		if (p->pipe_bound) {
+-			DEBUG(0, (__location__ ": Pipe already bound, "
+-				  "Altering Context not yet supported!\n"));
+-			goto err_exit;
+-		}
+-
+ 		if (auth_info.auth_type != p->auth.auth_type) {
+ 			DEBUG(0, ("Auth type mismatch! Client sent %d, "
+ 				  "but auth was started as type %d!\n",
+@@ -1365,6 +1494,20 @@ static bool api_pipe_alter_context(struc
+ 			goto err_exit;
+ 		}
+ 
++		if (auth_info.auth_level != p->auth.auth_level) {
++			DEBUG(0, ("Auth level mismatch! Client sent %d, "
++				  "but auth was started as level %d!\n",
++				  auth_info.auth_level, p->auth.auth_level));
++			goto err_exit;
++		}
++
++		if (auth_info.auth_context_id != p->auth.auth_context_id) {
++			DEBUG(0, ("Auth context id mismatch! Client sent %u, "
++				  "but auth was started as level %u!\n",
++				  (unsigned)auth_info.auth_context_id,
++				  (unsigned)p->auth.auth_context_id));
++			goto err_exit;
++		}
+ 
+ 		switch (auth_info.auth_type) {
+ 		case DCERPC_AUTH_TYPE_SPNEGO:
+@@ -1431,7 +1574,7 @@ static bool api_pipe_alter_context(struc
+ 	u.alter_resp.secondary_address_size = 1;
+ 
+ 	u.alter_resp.num_results = 1;
+-	u.alter_resp.ctx_list = &bind_ack_ctx;
++	u.alter_resp.ctx_list = &alter_ack_ctx;
+ 
+ 	/* NOTE: We leave the auth_info empty so we can calculate the padding
+ 	 * later and then append the auth_info --simo */
+@@ -1451,8 +1594,9 @@ static bool api_pipe_alter_context(struc
+ 					  &u,
+ 					  &p->out_data.frag);
+ 	if (!NT_STATUS_IS_OK(status)) {
+-		DEBUG(0, ("Failed to marshall bind_ack packet. (%s)\n",
++		DEBUG(0, ("Failed to marshall alter_resp packet. (%s)\n",
+ 			  nt_errstr(status)));
++		goto err_exit;
+ 	}
+ 
+ 	if (auth_resp.length) {
+@@ -1469,7 +1613,7 @@ static bool api_pipe_alter_context(struc
+ 						 auth_info.auth_type,
+ 						 auth_info.auth_level,
+ 						 pad_len,
+-						 1, /* auth_context_id */
++						 p->auth.auth_context_id,
+ 						 &auth_resp,
+ 						 &auth_blob);
+ 		if (!NT_STATUS_IS_OK(status)) {
+@@ -1618,6 +1762,7 @@ static bool api_pipe_request(struct pipe
+ 
+ 	if (!srv_pipe_check_verification_trailer(p, pkt, pipe_fns)) {
+ 		DEBUG(1, ("srv_pipe_check_verification_trailer: failed\n"));
++		set_incoming_fault(p);
+ 		setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_ACCESS_DENIED));
+ 		data_blob_free(&p->out_data.rdata);
+ 		TALLOC_FREE(frame);
+@@ -1756,7 +1901,11 @@ void set_incoming_fault(struct pipes_str
+ 	data_blob_free(&p->in_data.data);
+ 	p->in_data.pdu_needed_len = 0;
+ 	p->in_data.pdu.length = 0;
+-	p->fault_state = DCERPC_FAULT_CANT_PERFORM;
++	p->fault_state = DCERPC_NCA_S_PROTO_ERROR;
++
++	p->allow_alter = false;
++	p->allow_auth3 = false;
++	p->pipe_bound = false;
+ 
+ 	DEBUG(10, ("Setting fault state\n"));
+ }
+@@ -1767,7 +1916,6 @@ static NTSTATUS dcesrv_auth_request(stru
+ {
+ 	NTSTATUS status;
+ 	size_t hdr_size = DCERPC_REQUEST_LENGTH;
+-	size_t pad_len;
+ 
+ 	DEBUG(10, ("Checking request auth.\n"));
+ 
+@@ -1778,25 +1926,11 @@ static NTSTATUS dcesrv_auth_request(stru
+ 	/* in case of sealing this function will unseal the data in place */
+ 	status = dcerpc_check_auth(auth, pkt,
+ 				   &pkt->u.request.stub_and_verifier,
+-				   hdr_size, raw_pkt,
+-				   &pad_len);
++				   hdr_size, raw_pkt);
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		return status;
+ 	}
+ 
+-
+-	/* remove padding and auth trailer,
+-	 * this way the caller will get just the data */
+-	if (pkt->auth_length) {
+-		size_t trail_len = pad_len
+-					+ DCERPC_AUTH_TRAILER_LENGTH
+-					+ pkt->auth_length;
+-		if (pkt->u.request.stub_and_verifier.length < trail_len) {
+-			return NT_STATUS_INFO_LENGTH_MISMATCH;
+-		}
+-		pkt->u.request.stub_and_verifier.length -= trail_len;
+-	}
+-
+ 	return NT_STATUS_OK;
+ }
+ 
+@@ -1816,6 +1950,29 @@ static bool process_request_pdu(struct p
+ 		return False;
+ 	}
+ 
++	/*
++	 * We don't ignore DCERPC_PFC_FLAG_PENDING_CANCEL.
++	 * TODO: we can reject it with DCERPC_FAULT_NO_CALL_ACTIVE later.
++	 */
++	status = dcerpc_verify_ncacn_packet_header(pkt,
++			DCERPC_PKT_REQUEST,
++			pkt->u.request.stub_and_verifier.length,
++			0, /* required_flags */
++			DCERPC_PFC_FLAG_FIRST |
++			DCERPC_PFC_FLAG_LAST |
++			0x08 | /* this is not defined, but should be ignored */
++			DCERPC_PFC_FLAG_CONC_MPX |
++			DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
++			DCERPC_PFC_FLAG_MAYBE |
++			DCERPC_PFC_FLAG_OBJECT_UUID);
++	if (!NT_STATUS_IS_OK(status)) {
++		DEBUG(1, ("process_request_pdu: invalid pdu: %s\n",
++			  nt_errstr(status)));
++		NDR_PRINT_DEBUG(ncacn_packet, pkt);
++		set_incoming_fault(p);
++		return false;
++	}
++
+ 	/* Store the opnum */
+ 	p->opnum = pkt->u.request.opnum;
+ 
+@@ -2065,7 +2222,7 @@ done:
+ 			 "pipe %s\n", get_pipe_name_from_syntax(talloc_tos(),
+ 								&p->syntax)));
+ 		set_incoming_fault(p);
+-		setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
++		setup_fault_pdu(p, NT_STATUS(DCERPC_NCA_S_PROTO_ERROR));
+ 		TALLOC_FREE(pkt);
+ 	} else {
+ 		/*
+--- a/source3/include/ntdomain.h
++++ b/source3/include/ntdomain.h
+@@ -135,6 +135,13 @@ struct pipes_struct {
+ 	bool pipe_bound;
+ 
+ 	/*
++	 * States we can be in.
++	 */
++	bool allow_alter;
++	bool allow_bind;
++	bool allow_auth3;
++
++	/*
+ 	 * Set the DCERPC_FAULT to return.
+ 	 */
+ 
+--- a/source3/rpc_server/rpc_ncacn_np.c
++++ b/source3/rpc_server/rpc_ncacn_np.c
+@@ -171,6 +171,7 @@ struct pipes_struct *make_internal_rpc_p
+ 
+ 	p->syntax = *syntax;
+ 	p->transport = NCALRPC;
++	p->allow_bind = true;
+ 
+ 	DEBUG(4,("Created internal pipe %s (pipes_open=%d)\n",
+ 		 get_pipe_name_from_syntax(talloc_tos(), syntax), pipes_open));
+@@ -780,6 +781,7 @@ static NTSTATUS rpc_pipe_open_external(T
+ 	}
+ 	result->auth->auth_type = DCERPC_AUTH_TYPE_NONE;
+ 	result->auth->auth_level = DCERPC_AUTH_LEVEL_NONE;
++	result->auth->auth_context_id = 0;
+ 
+ 	status = rpccli_anon_bind_data(result, &auth);
+ 	if (!NT_STATUS_IS_OK(status)) {
+--- a/source3/rpc_server/rpc_server.c
++++ b/source3/rpc_server/rpc_server.c
+@@ -102,6 +102,7 @@ static int make_server_pipes_struct(TALL
+ 	p->syntax = id;
+ 	p->transport = transport;
+ 	p->ncalrpc_as_system = ncalrpc_as_system;
++	p->allow_bind = true;
+ 
+ 	p->mem_ctx = talloc_named(p, 0, "pipe %s %p", pipe_name, p);
+ 	if (!p->mem_ctx) {
+@@ -663,6 +664,12 @@ static void named_pipe_packet_done(struc
+ 		goto fail;
+ 	}
+ 
++	if (npc->p->fault_state != 0) {
++		DEBUG(2, ("Disconnect after fault\n"));
++		sys_errno = EINVAL;
++		goto fail;
++	}
++
+ 	/* clear out any data that may have been left around */
+ 	npc->count = 0;
+ 	TALLOC_FREE(npc->iov);
+@@ -1391,6 +1398,12 @@ static void dcerpc_ncacn_packet_done(str
+ 		goto fail;
+ 	}
+ 
++	if (ncacn_conn->p->fault_state != 0) {
++		DEBUG(2, ("Disconnect after fault\n"));
++		sys_errno = EINVAL;
++		goto fail;
++	}
++
+ 	/* clear out any data that may have been left around */
+ 	ncacn_conn->count = 0;
+ 	TALLOC_FREE(ncacn_conn->iov);
diff --git a/package/network/services/samba36/patches/023-CVE-2016-2110-v3-6.patch b/package/network/services/samba36/patches/023-CVE-2016-2110-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0da66bf4870781e0331f4c4045cafdc94c961132
--- /dev/null
+++ b/package/network/services/samba36/patches/023-CVE-2016-2110-v3-6.patch
@@ -0,0 +1,255 @@
+From 202d69267c8550b850438877fb51c3d2c992949d Mon Sep 17 00:00:00 2001
+From: Stefan Metzmacher <metze@samba.org>
+Date: Tue, 1 Dec 2015 08:46:45 +0100
+Subject: [PATCH 01/10] CVE-2016-2110: s3:ntlmssp: set and use
+ ntlmssp_state->allow_lm_key
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BUG: https://bugzilla.samba.org/show_bug.cgi?id=11644
+
+Signed-off-by: Stefan Metzmacher <metze@samba.org>
+Reviewed-by: Günther Deschner <gd@samba.org>
+---
+ source3/libsmb/ntlmssp.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/source3/libsmb/ntlmssp.c
++++ b/source3/libsmb/ntlmssp.c
+@@ -176,17 +176,19 @@ void ntlmssp_want_feature_list(struct nt
+ 	 * also add  NTLMSSP_NEGOTIATE_SEAL here. JRA.
+ 	 */
+ 	if (in_list("NTLMSSP_FEATURE_SESSION_KEY", feature_list, True)) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SIGN;
+ 	}
+ 	if (in_list("NTLMSSP_FEATURE_SIGN", feature_list, True)) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SIGN;
+ 	}
+ 	if(in_list("NTLMSSP_FEATURE_SEAL", feature_list, True)) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_SEAL;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SEAL;
+ 	}
+ 	if (in_list("NTLMSSP_FEATURE_CCACHE", feature_list, true)) {
+ 		ntlmssp_state->use_ccache = true;
+ 	}
++
++	ntlmssp_state->neg_flags |= ntlmssp_state->required_flags;
+ }
+ 
+ /**
+@@ -199,17 +201,20 @@ void ntlmssp_want_feature(struct ntlmssp
+ {
+ 	/* As per JRA's comment above */
+ 	if (feature & NTLMSSP_FEATURE_SESSION_KEY) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SIGN;
+ 	}
+ 	if (feature & NTLMSSP_FEATURE_SIGN) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SIGN;
+ 	}
+ 	if (feature & NTLMSSP_FEATURE_SEAL) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_SEAL;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SIGN;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_SEAL;
+ 	}
+ 	if (feature & NTLMSSP_FEATURE_CCACHE) {
+ 		ntlmssp_state->use_ccache = true;
+ 	}
++
++	ntlmssp_state->neg_flags |= ntlmssp_state->required_flags;
+ }
+ 
+ /**
+@@ -387,7 +392,12 @@ static NTSTATUS ntlmssp_client_initial(s
+ 	}
+ 
+ 	if (ntlmssp_state->use_ntlmv2) {
+-		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_NTLM2;
++		ntlmssp_state->required_flags |= NTLMSSP_NEGOTIATE_NTLM2;
++		ntlmssp_state->allow_lm_key = false;
++	}
++
++	if (ntlmssp_state->allow_lm_key) {
++		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_LM_KEY;
+ 	}
+ 
+ 	/* generate the ntlmssp negotiate packet */
+@@ -422,6 +432,86 @@ static NTSTATUS ntlmssp_client_initial(s
+ 	return NT_STATUS_MORE_PROCESSING_REQUIRED;
+ }
+ 
++static NTSTATUS ntlmssp3_handle_neg_flags(struct ntlmssp_state *ntlmssp_state,
++					  uint32_t flags)
++{
++	uint32_t missing_flags = ntlmssp_state->required_flags;
++
++	if (flags & NTLMSSP_NEGOTIATE_UNICODE) {
++		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_UNICODE;
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_OEM;
++		ntlmssp_state->unicode = true;
++	} else {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_UNICODE;
++		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_OEM;
++		ntlmssp_state->unicode = false;
++	}
++
++	/*
++	 * NTLMSSP_NEGOTIATE_NTLM2 (NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY)
++	 * has priority over NTLMSSP_NEGOTIATE_LM_KEY
++	 */
++	if (!(flags & NTLMSSP_NEGOTIATE_NTLM2)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_NTLM2;
++	}
++
++	if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_LM_KEY;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_LM_KEY)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_LM_KEY;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_ALWAYS_SIGN)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_128)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_128;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_56)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_56;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_KEY_EXCH)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_KEY_EXCH;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_SIGN)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_SIGN;
++	}
++
++	if (!(flags & NTLMSSP_NEGOTIATE_SEAL)) {
++		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_SEAL;
++	}
++
++	if ((flags & NTLMSSP_REQUEST_TARGET)) {
++		ntlmssp_state->neg_flags |= NTLMSSP_REQUEST_TARGET;
++	}
++
++	missing_flags &= ~ntlmssp_state->neg_flags;
++	if (missing_flags != 0) {
++		NTSTATUS status = NT_STATUS_RPC_SEC_PKG_ERROR;
++		DEBUG(1, ("%s: Got challenge flags[0x%08x] "
++			  "- possible downgrade detected! "
++			  "missing_flags[0x%08x] - %s\n",
++			  __func__,
++			  (unsigned)flags,
++			  (unsigned)missing_flags,
++			  nt_errstr(status)));
++		debug_ntlmssp_flags(missing_flags);
++		DEBUGADD(4, ("neg_flags[0x%08x]\n",
++			     (unsigned)ntlmssp_state->neg_flags));
++		debug_ntlmssp_flags(ntlmssp_state->neg_flags);
++
++		return status;
++	}
++
++	return NT_STATUS_OK;
++}
++
+ /**
+  * Next state function for the Challenge Packet.  Generate an auth packet.
+  *
+@@ -448,6 +538,26 @@ static NTSTATUS ntlmssp_client_challenge
+ 	DATA_BLOB encrypted_session_key = data_blob_null;
+ 	NTSTATUS nt_status = NT_STATUS_OK;
+ 
++	if (!msrpc_parse(ntlmssp_state, &reply, "CdBd",
++			 "NTLMSSP",
++			 &ntlmssp_command,
++			 &server_domain_blob,
++			 &chal_flags)) {
++		DEBUG(1, ("Failed to parse the NTLMSSP Challenge: (#1)\n"));
++		dump_data(2, reply.data, reply.length);
++
++		return NT_STATUS_INVALID_PARAMETER;
++	}
++	data_blob_free(&server_domain_blob);
++
++	DEBUG(3, ("Got challenge flags:\n"));
++	debug_ntlmssp_flags(chal_flags);
++
++	nt_status = ntlmssp3_handle_neg_flags(ntlmssp_state, chal_flags);
++	if (!NT_STATUS_IS_OK(nt_status)) {
++		return nt_status;
++	}
++
+ 	if (ntlmssp_state->use_ccache) {
+ 		struct wbcCredentialCacheParams params;
+ 		struct wbcCredentialCacheInfo *info = NULL;
+@@ -498,17 +608,6 @@ static NTSTATUS ntlmssp_client_challenge
+ 
+ noccache:
+ 
+-	if (!msrpc_parse(ntlmssp_state, &reply, "CdBd",
+-			 "NTLMSSP",
+-			 &ntlmssp_command,
+-			 &server_domain_blob,
+-			 &chal_flags)) {
+-		DEBUG(1, ("Failed to parse the NTLMSSP Challenge: (#1)\n"));
+-		dump_data(2, reply.data, reply.length);
+-
+-		return NT_STATUS_INVALID_PARAMETER;
+-	}
+-
+ 	if (DEBUGLEVEL >= 10) {
+ 		struct CHALLENGE_MESSAGE *challenge = talloc(
+ 			talloc_tos(), struct CHALLENGE_MESSAGE);
+@@ -525,13 +624,6 @@ noccache:
+ 		}
+ 	}
+ 
+-	data_blob_free(&server_domain_blob);
+-
+-	DEBUG(3, ("Got challenge flags:\n"));
+-	debug_ntlmssp_flags(chal_flags);
+-
+-	ntlmssp_handle_neg_flags(ntlmssp_state, chal_flags, lp_client_lanman_auth());
+-
+ 	if (ntlmssp_state->unicode) {
+ 		if (chal_flags & NTLMSSP_NEGOTIATE_TARGET_INFO) {
+ 			chal_parse_string = "CdUdbddB";
+@@ -769,6 +861,7 @@ NTSTATUS ntlmssp_client_start(TALLOC_CTX
+ 	ntlmssp_state->unicode = True;
+ 
+ 	ntlmssp_state->use_ntlmv2 = use_ntlmv2;
++	ntlmssp_state->allow_lm_key = lp_client_lanman_auth();
+ 
+ 	ntlmssp_state->expected_state = NTLMSSP_INITIAL;
+ 
+@@ -780,6 +873,10 @@ NTSTATUS ntlmssp_client_start(TALLOC_CTX
+ 		NTLMSSP_NEGOTIATE_KEY_EXCH |
+ 		NTLMSSP_REQUEST_TARGET;
+ 
++	if (ntlmssp_state->use_ntlmv2) {
++		ntlmssp_state->allow_lm_key = false;
++	}
++
+ 	ntlmssp_state->client.netbios_name = talloc_strdup(ntlmssp_state, netbios_name);
+ 	if (!ntlmssp_state->client.netbios_name) {
+ 		talloc_free(ntlmssp_state);
+--- a/libcli/auth/ntlmssp.h
++++ b/libcli/auth/ntlmssp.h
+@@ -83,6 +83,7 @@ struct ntlmssp_state
+ 	DATA_BLOB nt_resp;
+ 	DATA_BLOB session_key;
+ 
++	uint32_t required_flags;
+ 	uint32_t neg_flags; /* the current state of negotiation with the NTLMSSP partner */
+ 
+ 	/**
diff --git a/package/network/services/samba36/patches/024-CVE-2016-2111-v3-6.patch b/package/network/services/samba36/patches/024-CVE-2016-2111-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7f7f413c2f9577e9124407e74bfa5f47ad016b24
--- /dev/null
+++ b/package/network/services/samba36/patches/024-CVE-2016-2111-v3-6.patch
@@ -0,0 +1,681 @@
+From ee105156fa151ebfd34b8febc2928e144b3b7b0e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org>
+Date: Sat, 26 Sep 2015 01:29:10 +0200
+Subject: [PATCH 01/15] CVE-2016-2111: s3:rpc_server/netlogon: always go
+ through netr_creds_server_step_check()
+
+The ensures we apply the "server schannel = yes" restrictions.
+
+BUG: https://bugzilla.samba.org/show_bug.cgi?id=11749
+
+Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>
+
+Signed-off-by: Guenther Deschner <gd@samba.org>
+Signed-off-by: Stefan Metzmacher <metze@samba.org>
+---
+ source3/rpc_server/netlogon/srv_netlog_nt.c | 24 ++++++++++++++----------
+ 1 file changed, 14 insertions(+), 10 deletions(-)
+
+--- a/source3/rpc_server/netlogon/srv_netlog_nt.c
++++ b/source3/rpc_server/netlogon/srv_netlog_nt.c
+@@ -1508,6 +1508,7 @@ static NTSTATUS _netr_LogonSamLogon_base
+ 	case NetlogonNetworkTransitiveInformation:
+ 	{
+ 		const char *wksname = nt_workstation;
++		const char *workgroup = lp_workgroup();
+ 
+ 		status = make_auth_context_fixed(talloc_tos(), &auth_context,
+ 						 logon->network->challenge);
+@@ -1532,6 +1533,14 @@ static NTSTATUS _netr_LogonSamLogon_base
+ 						     logon->network->nt.length)) {
+ 			status = NT_STATUS_NO_MEMORY;
+ 		}
++
++		if (NT_STATUS_IS_OK(status)) {
++			status = NTLMv2_RESPONSE_verify_netlogon_creds(
++						user_info->client.account_name,
++						user_info->client.domain_name,
++						user_info->password.response.nt,
++						creds, workgroup);
++		}
+ 		break;
+ 	}
+ 	case NetlogonInteractiveInformation:
+@@ -1636,6 +1645,14 @@ static NTSTATUS _netr_LogonSamLogon_base
+ 						r->out.validation->sam3);
+ 		break;
+ 	case 6:
++		/* Only allow this if the pipe is protected. */
++		if (p->auth.auth_level < DCERPC_AUTH_LEVEL_PRIVACY) {
++			DEBUG(0,("netr_Validation6: client %s not using privacy for netlogon\n",
++				get_remote_machine_name()));
++			status = NT_STATUS_INVALID_PARAMETER;
++			break;
++		}
++
+ 		status = serverinfo_to_SamInfo6(server_info, pipe_session_key, 16,
+ 						r->out.validation->sam6);
+ 		break;
+@@ -2271,11 +2288,13 @@ NTSTATUS _netr_GetForestTrustInformation
+ 
+ 	/* TODO: check server name */
+ 
+-	status = schannel_check_creds_state(p->mem_ctx, lp_private_dir(),
+-					    r->in.computer_name,
+-					    r->in.credential,
+-					    r->out.return_authenticator,
+-					    &creds);
++	become_root();
++	status = netr_creds_server_step_check(p, p->mem_ctx,
++					      r->in.computer_name,
++					      r->in.credential,
++					      r->out.return_authenticator,
++					      &creds);
++	unbecome_root();
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		return status;
+ 	}
+@@ -2371,11 +2390,13 @@ NTSTATUS _netr_ServerGetTrustInfo(struct
+ 
+ 	/* TODO: check server name */
+ 
+-	status = schannel_check_creds_state(p->mem_ctx, lp_private_dir(),
+-					    r->in.computer_name,
+-					    r->in.credential,
+-					    r->out.return_authenticator,
+-					    &creds);
++	become_root();
++	status = netr_creds_server_step_check(p, p->mem_ctx,
++					      r->in.computer_name,
++					      r->in.credential,
++					      r->out.return_authenticator,
++					      &creds);
++	unbecome_root();
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		return status;
+ 	}
+--- a/source4/torture/rpc/samba3rpc.c
++++ b/source4/torture/rpc/samba3rpc.c
+@@ -1122,8 +1122,8 @@ static bool schan(struct torture_context
+ 		generate_random_buffer(chal.data, chal.length);
+ 		names_blob = NTLMv2_generate_names_blob(
+ 			mem_ctx,
+-			cli_credentials_get_workstation(user_creds),
+-			cli_credentials_get_domain(user_creds));
++			cli_credentials_get_workstation(wks_creds),
++			cli_credentials_get_domain(wks_creds));
+ 		status = cli_credentials_get_ntlm_response(
+ 			user_creds, mem_ctx, &flags, chal, names_blob,
+ 			&lm_resp, &nt_resp, NULL, NULL);
+--- a/libcli/auth/proto.h
++++ b/libcli/auth/proto.h
+@@ -139,6 +139,11 @@ bool SMBNTLMv2encrypt(TALLOC_CTX *mem_ct
+ 		      const DATA_BLOB *names_blob,
+ 		      DATA_BLOB *lm_response, DATA_BLOB *nt_response, 
+ 		      DATA_BLOB *lm_session_key, DATA_BLOB *user_session_key) ;
++NTSTATUS NTLMv2_RESPONSE_verify_netlogon_creds(const char *account_name,
++			const char *account_domain,
++			const DATA_BLOB response,
++			const struct netlogon_creds_CredentialState *creds,
++			const char *workgroup);
+ 
+ /***********************************************************
+  encode a password buffer with a unicode password.  The buffer
+--- a/libcli/auth/smbencrypt.c
++++ b/libcli/auth/smbencrypt.c
+@@ -26,7 +26,7 @@
+ #include "../libcli/auth/msrpc_parse.h"
+ #include "../lib/crypto/crypto.h"
+ #include "../libcli/auth/libcli_auth.h"
+-#include "../librpc/gen_ndr/ntlmssp.h"
++#include "../librpc/gen_ndr/ndr_ntlmssp.h"
+ 
+ void SMBencrypt_hash(const uint8_t lm_hash[16], const uint8_t *c8, uint8_t p24[24])
+ {
+@@ -522,6 +522,146 @@ bool SMBNTLMv2encrypt(TALLOC_CTX *mem_ct
+ 				     lm_response, nt_response, lm_session_key, user_session_key);
+ }
+ 
++NTSTATUS NTLMv2_RESPONSE_verify_netlogon_creds(const char *account_name,
++			const char *account_domain,
++			const DATA_BLOB response,
++			const struct netlogon_creds_CredentialState *creds,
++			const char *workgroup)
++{
++	TALLOC_CTX *frame = NULL;
++	/* RespType + HiRespType */
++	static const char *magic = "\x01\x01";
++	int cmp;
++	struct NTLMv2_RESPONSE v2_resp;
++	enum ndr_err_code err;
++	const struct AV_PAIR *av_nb_cn = NULL;
++	const struct AV_PAIR *av_nb_dn = NULL;
++
++	if (response.length < 48) {
++		/*
++		 * NTLMv2_RESPONSE has at least 48 bytes.
++		 */
++		return NT_STATUS_OK;
++	}
++
++	cmp = memcmp(response.data + 16, magic, 2);
++	if (cmp != 0) {
++		/*
++		 * It doesn't look like a valid NTLMv2_RESPONSE
++		 */
++		return NT_STATUS_OK;
++	}
++
++	frame = talloc_stackframe();
++
++	err = ndr_pull_struct_blob(&response, frame, &v2_resp,
++		(ndr_pull_flags_fn_t)ndr_pull_NTLMv2_RESPONSE);
++	if (!NDR_ERR_CODE_IS_SUCCESS(err)) {
++		NTSTATUS status;
++		status = ndr_map_error2ntstatus(err);
++		DEBUG(2,("Failed to parse NTLMv2_RESPONSE "
++			 "length %u - %s - %s\n",
++			 (unsigned)response.length,
++			 ndr_map_error2string(err),
++			 nt_errstr(status)));
++		dump_data(2, response.data, response.length);
++		TALLOC_FREE(frame);
++		return status;
++	}
++
++	if (DEBUGLVL(10)) {
++		NDR_PRINT_DEBUG(NTLMv2_RESPONSE, &v2_resp);
++	}
++
++	/*
++	 * Make sure the netbios computer name in the
++	 * NTLMv2_RESPONSE matches the computer name
++	 * in the secure channel credentials for workstation
++	 * trusts.
++	 *
++	 * And the netbios domain name matches our
++	 * workgroup.
++	 *
++	 * This prevents workstations from requesting
++	 * the session key of NTLMSSP sessions of clients
++	 * to other hosts.
++	 */
++	if (creds->secure_channel_type == SEC_CHAN_WKSTA) {
++		av_nb_cn = ndr_ntlmssp_find_av(&v2_resp.Challenge.AvPairs,
++					       MsvAvNbComputerName);
++		av_nb_dn = ndr_ntlmssp_find_av(&v2_resp.Challenge.AvPairs,
++					       MsvAvNbDomainName);
++	}
++
++	if (av_nb_cn != NULL) {
++		const char *v = NULL;
++		char *a = NULL;
++		size_t len;
++
++		v = av_nb_cn->Value.AvNbComputerName;
++
++		a = talloc_strdup(frame, creds->account_name);
++		if (a == NULL) {
++			TALLOC_FREE(frame);
++			return NT_STATUS_NO_MEMORY;
++		}
++		len = strlen(a);
++		if (len > 0 && a[len - 1] == '$') {
++			a[len - 1] = '\0';
++		}
++
++#ifdef SAMBA4_INTERNAL_HEIMDAL /* smbtorture4 for make test */
++		cmp = strcasecmp_m(a, v);
++#else /* smbd */
++		cmp = StrCaseCmp(a, v);
++#endif
++		if (cmp != 0) {
++			DEBUG(2,("%s: NTLMv2_RESPONSE with "
++				 "NbComputerName[%s] rejected "
++				 "for user[%s\\%s] "
++				 "against SEC_CHAN_WKSTA[%s/%s] "
++				 "in workgroup[%s]\n",
++				 __func__, v,
++				 account_domain,
++				 account_name,
++				 creds->computer_name,
++				 creds->account_name,
++				 workgroup));
++			TALLOC_FREE(frame);
++			return NT_STATUS_LOGON_FAILURE;
++		}
++	}
++	if (av_nb_dn != NULL) {
++		const char *v = NULL;
++
++		v = av_nb_dn->Value.AvNbDomainName;
++
++#ifdef SAMBA4_INTERNAL_HEIMDAL /* smbtorture4 for make test */
++		cmp = strcasecmp_m(workgroup, v);
++#else /* smbd */
++		cmp = StrCaseCmp(workgroup, v);
++#endif
++		if (cmp != 0) {
++			DEBUG(2,("%s: NTLMv2_RESPONSE with "
++				 "NbDomainName[%s] rejected "
++				 "for user[%s\\%s] "
++				 "against SEC_CHAN_WKSTA[%s/%s] "
++				 "in workgroup[%s]\n",
++				 __func__, v,
++				 account_domain,
++				 account_name,
++				 creds->computer_name,
++				 creds->account_name,
++				 workgroup));
++			TALLOC_FREE(frame);
++			return NT_STATUS_LOGON_FAILURE;
++		}
++	}
++
++	TALLOC_FREE(frame);
++	return NT_STATUS_OK;
++}
++
+ /***********************************************************
+  encode a password buffer with a unicode password.  The buffer
+  is filled with random data to make it harder to attack.
+--- a/libcli/auth/wscript_build
++++ b/libcli/auth/wscript_build
+@@ -19,7 +19,7 @@ bld.SAMBA_SUBSYSTEM('MSRPC_PARSE',
+ 
+ bld.SAMBA_SUBSYSTEM('LIBCLI_AUTH',
+ 	source='credentials.c session.c smbencrypt.c smbdes.c',
+-	public_deps='MSRPC_PARSE',
++	public_deps='MSRPC_PARSE NDR_NTLMSSP',
+ 	public_headers='credentials.h:domain_credentials.h'
+ 	)
+ 
+--- a/source3/Makefile.in
++++ b/source3/Makefile.in
+@@ -783,6 +783,7 @@ GROUPDB_OBJ = groupdb/mapping.o groupdb/
+ PROFILE_OBJ = profile/profile.o
+ PROFILES_OBJ = utils/profiles.o \
+ 	       $(LIBSMB_ERR_OBJ) \
++	       $(LIBNDR_NTLMSSP_OBJ) \
+ 	       $(PARAM_OBJ) \
+                $(LIB_OBJ) $(LIB_DUMMY_OBJ) \
+                $(POPT_LIB_OBJ) \
+@@ -995,10 +996,10 @@ SWAT_OBJ = $(SWAT_OBJ1) $(PARAM_OBJ) $(P
+ STATUS_OBJ = utils/status.o utils/status_profile.o \
+ 	     $(LOCKING_OBJ) $(PARAM_OBJ) \
+              $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
+-	     $(LIBSMB_ERR_OBJ) $(FNAME_UTIL_OBJ)
++	     $(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ) $(FNAME_UTIL_OBJ)
+ 
+ SMBCONTROL_OBJ = utils/smbcontrol.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
+-	$(LIBSMB_ERR_OBJ) $(POPT_LIB_OBJ) $(PRINTBASE_OBJ)
++	$(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ) $(POPT_LIB_OBJ) $(PRINTBASE_OBJ)
+ 
+ SMBTREE_OBJ = utils/smbtree.o $(PARAM_OBJ) \
+              $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_OBJ) \
+@@ -1012,11 +1013,11 @@ SMBTREE_OBJ = utils/smbtree.o $(PARAM_OB
+ 
+ TESTPARM_OBJ = utils/testparm.o \
+                $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
+-	       $(LIBSMB_ERR_OBJ)
++	       $(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ)
+ 
+ SMBTA_UTIL_OBJ = utils/smbta-util.o $(PARAM_OBJ) $(POPT_LIB_OBJ) \
+ 	$(LIB_NONSMBD_OBJ) \
+-	$(LIBSMB_ERR_OBJ) $(FNAME_UTIL_OBJ)
++	$(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ) $(FNAME_UTIL_OBJ)
+ 
+ TEST_LP_LOAD_OBJ = param/test_lp_load.o \
+ 		   $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
+@@ -1146,6 +1147,7 @@ SMBCONFTORT_OBJ = $(SMBCONFTORT_OBJ0) \
+ 		  $(LIB_NONSMBD_OBJ) \
+ 		  $(PARAM_OBJ) \
+ 		  $(LIBSMB_ERR_OBJ) \
++		  $(LIBNDR_NTLMSSP_OBJ) \
+ 		  $(POPT_LIB_OBJ)
+ 
+ PTHREADPOOLTEST_OBJ = lib/pthreadpool/pthreadpool.o \
+@@ -1229,7 +1231,7 @@ CUPS_OBJ = client/smbspool.o $(PARAM_OBJ
+ 	  $(LIBNDR_GEN_OBJ0)
+ 
+ NMBLOOKUP_OBJ = utils/nmblookup.o $(PARAM_OBJ) $(LIBNMB_OBJ) \
+-               $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(LIBSMB_ERR_OBJ)
++               $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ)
+ 
+ SMBTORTURE_OBJ1 = torture/torture.o torture/nbio.o torture/scanner.o torture/utable.o \
+ 		torture/denytest.o torture/mangle_test.o \
+@@ -1253,6 +1255,7 @@ MASKTEST_OBJ = torture/masktest.o $(PARA
+ 		 $(LIBNDR_GEN_OBJ0)
+ 
+ MSGTEST_OBJ = torture/msgtest.o $(PARAM_OBJ) $(LIBSMB_ERR_OBJ) \
++		 $(LIBNDR_NTLMSSP_OBJ) \
+                  $(LIB_NONSMBD_OBJ) \
+ 		 $(LIBNDR_GEN_OBJ0)
+ 
+@@ -1269,7 +1272,7 @@ PDBTEST_OBJ = torture/pdbtest.o $(PARAM_
+ 
+ VFSTEST_OBJ = torture/cmd_vfs.o torture/vfstest.o $(SMBD_OBJ_BASE) $(READLINE_OBJ)
+ 
+-SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(LIBSMB_ERR_OBJ)
++SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ)
+ 
+ LOG2PCAP_OBJ = utils/log2pcaphex.o
+ 
+@@ -1297,17 +1300,17 @@ SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LI
+ EVTLOGADM_OBJ0	= utils/eventlogadm.o
+ 
+ EVTLOGADM_OBJ	= $(EVTLOGADM_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
+-		$(LIBSMB_ERR_OBJ) $(LIB_EVENTLOG_OBJ) \
++		$(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ) $(LIB_EVENTLOG_OBJ) \
+ 		librpc/gen_ndr/ndr_eventlog.o \
+ 		librpc/gen_ndr/ndr_lsa.o
+ 
+ SHARESEC_OBJ0 = utils/sharesec.o
+ SHARESEC_OBJ  = $(SHARESEC_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
+-		$(LIBSMB_ERR_OBJ) \
++		$(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ) \
+                 $(POPT_LIB_OBJ)
+ 
+ TALLOCTORT_OBJ = @tallocdir@/testsuite.o @tallocdir@/testsuite_main.o \
+-		$(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_ERR_OBJ)
++		$(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ)
+ 
+ REPLACETORT_OBJ = @libreplacedir@/test/testsuite.o \
+ 		@libreplacedir@/test/getifaddrs.o \
+@@ -1323,7 +1326,7 @@ SMBFILTER_OBJ = utils/smbfilter.o $(PARA
+ 		 $(LIBNDR_GEN_OBJ0)
+ 
+ WINBIND_WINS_NSS_OBJ = ../nsswitch/wins.o $(PARAM_OBJ) \
+-	$(LIB_NONSMBD_OBJ) $(LIBSMB_ERR_OBJ) $(LIBNMB_OBJ)
++	$(LIB_NONSMBD_OBJ) $(LIBSMB_ERR_OBJ) $(LIBNDR_NTLMSSP_OBJ) $(LIBNMB_OBJ)
+ 
+ PAM_SMBPASS_OBJ_0 = pam_smbpass/pam_smb_auth.o pam_smbpass/pam_smb_passwd.o \
+ 		pam_smbpass/pam_smb_acct.o pam_smbpass/support.o ../lib/util/asn1.o
+@@ -1531,12 +1534,14 @@ RPC_OPEN_TCP_OBJ = torture/rpc_open_tcp.
+ DBWRAP_TOOL_OBJ = utils/dbwrap_tool.o \
+ 		  $(PARAM_OBJ) \
+ 		  $(LIB_NONSMBD_OBJ) \
+-		  $(LIBSMB_ERR_OBJ)
++		  $(LIBSMB_ERR_OBJ) \
++		  $(LIBNDR_NTLMSSP_OBJ)
+ 
+ DBWRAP_TORTURE_OBJ = utils/dbwrap_torture.o \
+ 		     $(PARAM_OBJ) \
+ 		     $(LIB_NONSMBD_OBJ) \
+ 		     $(LIBSMB_ERR_OBJ) \
++		     $(LIBNDR_NTLMSSP_OBJ) \
+ 		     $(POPT_LIB_OBJ)
+ 
+ SPLIT_TOKENS_OBJ = utils/split_tokens.o \
+--- a/source4/torture/raw/samba3misc.c
++++ b/source4/torture/raw/samba3misc.c
+@@ -340,6 +340,7 @@ bool torture_samba3_badpath(struct tortu
+ 	bool ret = true;
+ 	TALLOC_CTX *mem_ctx;
+ 	bool nt_status_support;
++	bool client_ntlmv2_auth;
+ 
+ 	if (!(mem_ctx = talloc_init("torture_samba3_badpath"))) {
+ 		d_printf("talloc_init failed\n");
+@@ -347,20 +348,17 @@ bool torture_samba3_badpath(struct tortu
+ 	}
+ 
+ 	nt_status_support = lpcfg_nt_status_support(torture->lp_ctx);
++	client_ntlmv2_auth = lpcfg_client_ntlmv2_auth(torture->lp_ctx);
+ 
+-	if (!lpcfg_set_cmdline(torture->lp_ctx, "nt status support", "yes")) {
+-		printf("Could not set 'nt status support = yes'\n");
+-		goto fail;
+-	}
++	torture_assert_goto(torture, lpcfg_set_cmdline(torture->lp_ctx, "nt status support", "yes"), ret, fail, "Could not set 'nt status support = yes'\n");
++	torture_assert_goto(torture, lpcfg_set_cmdline(torture->lp_ctx, "client ntlmv2 auth", "yes"), ret, fail, "Could not set 'client ntlmv2 auth = yes'\n");
+ 
+ 	if (!torture_open_connection(&cli_nt, torture, 0)) {
+ 		goto fail;
+ 	}
+ 
+-	if (!lpcfg_set_cmdline(torture->lp_ctx, "nt status support", "no")) {
+-		printf("Could not set 'nt status support = yes'\n");
+-		goto fail;
+-	}
++	torture_assert_goto(torture, lpcfg_set_cmdline(torture->lp_ctx, "nt status support", "no"), ret, fail, "Could not set 'nt status support = no'\n");
++	torture_assert_goto(torture, lpcfg_set_cmdline(torture->lp_ctx, "client ntlmv2 auth", "no"), ret, fail, "Could not set 'client ntlmv2 auth = no'\n");
+ 
+ 	if (!torture_open_connection(&cli_dos, torture, 1)) {
+ 		goto fail;
+@@ -373,6 +371,12 @@ bool torture_samba3_badpath(struct tortu
+ 	}
+ 
+ 	smbcli_deltree(cli_nt->tree, dirname);
++	torture_assert_goto(torture, lpcfg_set_cmdline(torture->lp_ctx, "nt status support",
++						       nt_status_support ? "yes":"no"),
++			    ret, fail, "Could not set 'nt status support' back to where it was\n");
++	torture_assert_goto(torture, lpcfg_set_cmdline(torture->lp_ctx, "client ntlmv2 auth",
++						       client_ntlmv2_auth ? "yes":"no"),
++			    ret, fail, "Could not set 'client ntlmv2 auth' back to where it was\n");
+ 
+ 	status = smbcli_mkdir(cli_nt->tree, dirname);
+ 	if (!NT_STATUS_IS_OK(status)) {
+--- a/source4/torture/basic/base.c
++++ b/source4/torture/basic/base.c
+@@ -1476,6 +1476,7 @@ static bool torture_chkpath_test(struct
+ static bool torture_samba3_errorpaths(struct torture_context *tctx)
+ {
+ 	bool nt_status_support;
++	bool client_ntlmv2_auth;
+ 	struct smbcli_state *cli_nt = NULL, *cli_dos = NULL;
+ 	bool result = false;
+ 	int fnum;
+@@ -1485,18 +1486,27 @@ static bool torture_samba3_errorpaths(st
+ 	NTSTATUS status;
+ 
+ 	nt_status_support = lpcfg_nt_status_support(tctx->lp_ctx);
++	client_ntlmv2_auth = lpcfg_client_ntlmv2_auth(tctx->lp_ctx);
+ 
+ 	if (!lpcfg_set_cmdline(tctx->lp_ctx, "nt status support", "yes")) {
+ 		torture_comment(tctx, "Could not set 'nt status support = yes'\n");
+ 		goto fail;
+ 	}
++	if (!lpcfg_set_cmdline(tctx->lp_ctx, "client ntlmv2 auth", "yes")) {
++		torture_result(tctx, TORTURE_FAIL, "Could not set 'client ntlmv2 auth = yes'\n");
++		goto fail;
++	}
+ 
+ 	if (!torture_open_connection(&cli_nt, tctx, 0)) {
+ 		goto fail;
+ 	}
+ 
+ 	if (!lpcfg_set_cmdline(tctx->lp_ctx, "nt status support", "no")) {
+-		torture_comment(tctx, "Could not set 'nt status support = yes'\n");
++		torture_result(tctx, TORTURE_FAIL, "Could not set 'nt status support = no'\n");
++		goto fail;
++	}
++	if (!lpcfg_set_cmdline(tctx->lp_ctx, "client ntlmv2 auth", "no")) {
++		torture_result(tctx, TORTURE_FAIL, "Could not set 'client ntlmv2 auth = no'\n");
+ 		goto fail;
+ 	}
+ 
+@@ -1506,7 +1516,12 @@ static bool torture_samba3_errorpaths(st
+ 
+ 	if (!lpcfg_set_cmdline(tctx->lp_ctx, "nt status support",
+ 			    nt_status_support ? "yes":"no")) {
+-		torture_comment(tctx, "Could not reset 'nt status support = yes'");
++		torture_result(tctx, TORTURE_FAIL, "Could not reset 'nt status support'");
++		goto fail;
++	}
++	if (!lpcfg_set_cmdline(tctx->lp_ctx, "client ntlmv2 auth",
++			       client_ntlmv2_auth ? "yes":"no")) {
++		torture_result(tctx, TORTURE_FAIL, "Could not reset 'client ntlmv2 auth'");
+ 		goto fail;
+ 	}
+ 
+--- a/source3/libsmb/cliconnect.c
++++ b/source3/libsmb/cliconnect.c
+@@ -2077,6 +2077,17 @@ NTSTATUS cli_session_setup(struct cli_st
+ 		NTSTATUS status;
+ 
+ 		/* otherwise do a NT1 style session setup */
++		if (lp_client_ntlmv2_auth() && lp_client_use_spnego()) {
++			/*
++			 * Don't send an NTLMv2 response without NTLMSSP
++			 * if we want to use spnego support
++			 */
++			DEBUG(1, ("Server does not support EXTENDED_SECURITY "
++				  " but 'client use spnego = yes"
++				  " and 'client ntlmv2 auth = yes'\n"));
++			return NT_STATUS_ACCESS_DENIED;
++		}
++
+ 		status = cli_session_setup_nt1(cli, user, pass, passlen,
+ 					       ntpass, ntpasslen, workgroup);
+ 		if (!NT_STATUS_IS_OK(status)) {
+--- a/docs-xml/smbdotconf/protocol/clientusespnego.xml
++++ b/docs-xml/smbdotconf/protocol/clientusespnego.xml
+@@ -9,6 +9,11 @@
+     supporting servers (including WindowsXP, Windows2000 and Samba
+     3.0) to agree upon an authentication
+     mechanism.  This enables Kerberos authentication in particular.</para>
++
++    <para>When <smbconfoption name="client NTLMv2 auth"/> is also set to
++    <constant>yes</constant> extended security (SPNEGO) is required
++    in order to use NTLMv2 only within NTLMSSP. This behavior was
++    introduced with the patches for CVE-2016-2111.</para>
+ </description>
+ 
+ <value type="default">yes</value>
+--- a/docs-xml/smbdotconf/security/clientntlmv2auth.xml
++++ b/docs-xml/smbdotconf/security/clientntlmv2auth.xml
+@@ -28,6 +28,11 @@
+     NTLMv2 by default, and some sites (particularly those following
+     'best practice' security polices) only allow NTLMv2 responses, and
+     not the weaker LM or NTLM.</para>
++
++    <para>When <smbconfoption name="client use spnego"/> is also set to
++    <constant>yes</constant> extended security (SPNEGO) is required
++    in order to use NTLMv2 only within NTLMSSP. This behavior was
++    introduced with the patches for CVE-2016-2111.</para>
+ </description>
+ <value type="default">yes</value>
+ </samba:parameter>
+--- /dev/null
++++ b/docs-xml/smbdotconf/security/rawntlmv2auth.xml
+@@ -0,0 +1,19 @@
++<samba:parameter name="raw NTLMv2 auth"
++                 context="G"
++                 type="boolean"
++                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
++<description>
++    <para>This parameter determines whether or not <citerefentry><refentrytitle>smbd</refentrytitle>
++    <manvolnum>8</manvolnum></citerefentry> will allow SMB1 clients without
++    extended security (without SPNEGO) to use NTLMv2 authentication.</para>
++
++    <para>If this option, <command moreinfo="none">lanman auth</command>
++    and <command moreinfo="none">ntlm auth</command> are all disabled,
++    then only clients with SPNEGO support will be permitted.
++    That means NTLMv2 is only supported within NTLMSSP.</para>
++</description>
++
++<related>lanman auth</related>
++<related>ntlm auth</related>
++<value type="default">no</value>
++</samba:parameter>
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -1489,6 +1489,7 @@ bool lp_map_untrusted_to_domain(void);
+ int lp_restrict_anonymous(void);
+ bool lp_lanman_auth(void);
+ bool lp_ntlm_auth(void);
++bool lp_raw_ntlmv2_auth(void);
+ bool lp_client_plaintext_auth(void);
+ bool lp_client_lanman_auth(void);
+ bool lp_client_ntlmv2_auth(void);
+--- a/source3/param/loadparm.c
++++ b/source3/param/loadparm.c
+@@ -336,6 +336,7 @@ struct global {
+ 	bool bAllowTrustedDomains;
+ 	bool bLanmanAuth;
+ 	bool bNTLMAuth;
++	bool bRawNTLMv2Auth;
+ 	bool bUseSpnego;
+ 	bool bClientLanManAuth;
+ 	bool bClientNTLMv2Auth;
+@@ -1383,6 +1384,15 @@ static struct parm_struct parm_table[] =
+ 		.flags		= FLAG_ADVANCED,
+ 	},
+ 	{
++		.label		= "raw NTLMv2 auth",
++		.type		= P_BOOL,
++		.p_class	= P_GLOBAL,
++		.ptr		= &Globals.bRawNTLMv2Auth,
++		.special	= NULL,
++		.enum_list	= NULL,
++		.flags		= FLAG_ADVANCED,
++	},
++	{
+ 		.label		= "client NTLMv2 auth",
+ 		.type		= P_BOOL,
+ 		.p_class	= P_GLOBAL,
+@@ -5337,6 +5347,7 @@ static void init_globals(bool reinit_glo
+ 	Globals.bClientPlaintextAuth = False;	/* Do NOT use a plaintext password even if is requested by the server */
+ 	Globals.bLanmanAuth = False;	/* Do NOT use the LanMan hash, even if it is supplied */
+ 	Globals.bNTLMAuth = True;	/* Do use NTLMv1 if it is supplied by the client (otherwise NTLMv2) */
++	Globals.bRawNTLMv2Auth = false;	/* Allow NTLMv2 without NTLMSSP */
+ 	Globals.bClientNTLMv2Auth = True; /* Client should always use use NTLMv2, as we can't tell that the server supports it, but most modern servers do */
+ 	/* Note, that we will also use NTLM2 session security (which is different), if it is available */
+ 
+@@ -5819,6 +5830,7 @@ FN_GLOBAL_BOOL(lp_map_untrusted_to_domai
+ FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
+ FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
+ FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
++FN_GLOBAL_BOOL(lp_raw_ntlmv2_auth, &Globals.bRawNTLMv2Auth)
+ FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
+ FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
+ FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
+--- a/source3/auth/auth_util.c
++++ b/source3/auth/auth_util.c
+@@ -30,6 +30,7 @@
+ #include "../lib/util/util_pw.h"
+ #include "lib/winbind_util.h"
+ #include "passdb.h"
++#include "../lib/tsocket/tsocket.h"
+ 
+ #undef DBGC_CLASS
+ #define DBGC_CLASS DBGC_AUTH
+@@ -367,6 +368,19 @@ NTSTATUS make_user_info_for_reply_enc(st
+                                       const char *client_domain, 
+                                       DATA_BLOB lm_resp, DATA_BLOB nt_resp)
+ {
++	bool allow_raw = lp_raw_ntlmv2_auth();
++
++	if (!allow_raw && nt_resp.length >= 48) {
++		/*
++		 * NTLMv2_RESPONSE has at least 48 bytes
++		 * and should only be supported via NTLMSSP.
++		 */
++		DEBUG(2,("Rejecting raw NTLMv2 authentication with "
++			 "user [%s\\%s]\n",
++			 client_domain, smb_name));
++		return NT_STATUS_INVALID_PARAMETER;
++	}
++
+ 	return make_user_info_map(user_info, smb_name, 
+ 				  client_domain, 
+ 				  get_remote_machine_name(), 
+--- a/selftest/target/Samba3.pm
++++ b/selftest/target/Samba3.pm
+@@ -127,6 +127,7 @@ sub setup_dc($$)
+ 	domain master = yes
+ 	domain logons = yes
+ 	lanman auth = yes
++	raw NTLMv2 auth = yes
+ ";
+ 
+ 	my $vars = $self->provision($path,
+@@ -230,6 +231,7 @@ sub setup_secserver($$$)
+ 	my $secserver_options = "
+ 	security = server
+         password server = $s3dcvars->{SERVER_IP}
++	client ntlmv2 auth = no
+ ";
+ 
+ 	my $ret = $self->provision($prefix,
diff --git a/package/network/services/samba36/patches/025-CVE-2016-2112-v3-6.patch b/package/network/services/samba36/patches/025-CVE-2016-2112-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..78e0a66979d23463a6925bf4d1836c5ed2833aab
--- /dev/null
+++ b/package/network/services/samba36/patches/025-CVE-2016-2112-v3-6.patch
@@ -0,0 +1,129 @@
+From 126e3e992bed7174d60ee19212db9b717647ab2e Mon Sep 17 00:00:00 2001
+From: Andreas Schneider <asn@cryptomilk.org>
+Date: Wed, 30 Mar 2016 16:55:44 +0200
+Subject: [PATCH 1/3] CVE-2016-2112: s3:ntlmssp: Implement missing
+ ntlmssp_have_feature()
+
+Signed-off-by: Andreas Schneider <asn@samba.org>
+---
+ source3/include/proto.h  |  1 +
+ source3/libsmb/ntlmssp.c | 30 ++++++++++++++++++++++++++++++
+ 2 files changed, 31 insertions(+)
+
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -1260,6 +1260,7 @@ NTSTATUS ntlmssp_set_password(struct ntl
+ NTSTATUS ntlmssp_set_domain(struct ntlmssp_state *ntlmssp_state, const char *domain) ;
+ void ntlmssp_want_feature_list(struct ntlmssp_state *ntlmssp_state, char *feature_list);
+ void ntlmssp_want_feature(struct ntlmssp_state *ntlmssp_state, uint32_t feature);
++bool ntlmssp_have_feature(struct ntlmssp_state *ntlmssp_state, uint32_t feature);
+ NTSTATUS ntlmssp_update(struct ntlmssp_state *ntlmssp_state,
+ 			const DATA_BLOB in, DATA_BLOB *out) ;
+ NTSTATUS ntlmssp_server_start(TALLOC_CTX *mem_ctx,
+--- a/source3/libsmb/ntlmssp.c
++++ b/source3/libsmb/ntlmssp.c
+@@ -162,6 +162,36 @@ NTSTATUS ntlmssp_set_domain(struct ntlms
+ 	return NT_STATUS_OK;
+ }
+ 
++bool ntlmssp_have_feature(struct ntlmssp_state *ntlmssp_state,
++			  uint32_t feature)
++{
++	if (feature & NTLMSSP_FEATURE_SIGN) {
++		if (ntlmssp_state->session_key.length == 0) {
++			return false;
++		}
++		if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SIGN) {
++			return true;
++		}
++	}
++
++	if (feature & NTLMSSP_FEATURE_SEAL) {
++		if (ntlmssp_state->session_key.length == 0) {
++			return false;
++		}
++		if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_SEAL) {
++			return true;
++		}
++	}
++
++	if (feature & NTLMSSP_FEATURE_SESSION_KEY) {
++		if (ntlmssp_state->session_key.length > 0) {
++			return true;
++		}
++	}
++
++	return false;
++}
++
+ /**
+  * Request features for the NTLMSSP negotiation
+  *
+--- a/source3/libads/sasl.c
++++ b/source3/libads/sasl.c
+@@ -261,6 +261,37 @@ static ADS_STATUS ads_sasl_spnego_ntlmss
+ 	/* we have a reference conter on ntlmssp_state, if we are signing
+ 	   then the state will be kept by the signing engine */
+ 
++	if (ads->ldap.wrap_type >= ADS_SASLWRAP_TYPE_SEAL) {
++		bool ok;
++
++		ok = ntlmssp_have_feature(ntlmssp_state,
++					  NTLMSSP_FEATURE_SEAL);
++		if (!ok) {
++			DEBUG(0,("The ntlmssp feature sealing request, but unavailable\n"));
++			TALLOC_FREE(ntlmssp_state);
++			return ADS_ERROR_NT(NT_STATUS_INVALID_NETWORK_RESPONSE);
++		}
++
++		ok = ntlmssp_have_feature(ntlmssp_state,
++					  NTLMSSP_FEATURE_SIGN);
++		if (!ok) {
++			DEBUG(0,("The ntlmssp feature signing request, but unavailable\n"));
++			TALLOC_FREE(ntlmssp_state);
++			return ADS_ERROR_NT(NT_STATUS_INVALID_NETWORK_RESPONSE);
++		}
++
++	} else if (ads->ldap.wrap_type >= ADS_SASLWRAP_TYPE_SIGN) {
++		bool ok;
++
++		ok = ntlmssp_have_feature(ntlmssp_state,
++					  NTLMSSP_FEATURE_SIGN);
++		if (!ok) {
++			DEBUG(0,("The gensec feature signing request, but unavailable\n"));
++			TALLOC_FREE(ntlmssp_state);
++			return ADS_ERROR_NT(NT_STATUS_INVALID_NETWORK_RESPONSE);
++		}
++	}
++
+ 	if (ads->ldap.wrap_type > ADS_SASLWRAP_TYPE_PLAIN) {
+ 		ads->ldap.out.max_unwrapped = ADS_SASL_WRAPPING_OUT_MAX_WRAPPED - NTLMSSP_SIG_SIZE;
+ 		ads->ldap.out.sig_size = NTLMSSP_SIG_SIZE;
+--- a/docs-xml/smbdotconf/ldap/clientldapsaslwrapping.xml
++++ b/docs-xml/smbdotconf/ldap/clientldapsaslwrapping.xml
+@@ -34,11 +34,9 @@
+ 	</para>
+ 
+ 	<para>
+-	The default value is <emphasis>plain</emphasis> which is not irritable 
+-	to KRB5 clock skew errors. That implies synchronizing the time
+-	with the KDC in the case of using <emphasis>sign</emphasis> or 
+-	<emphasis>seal</emphasis>.
++	The default value is <emphasis>sign</emphasis>. That implies synchronizing the time
++	with the KDC in the case of using <emphasis>Kerberos</emphasis>.
+ 	</para>
+ </description>
+-<value type="default">plain</value>
++<value type="default">sign</value>
+ </samba:parameter>
+--- a/source3/param/loadparm.c
++++ b/source3/param/loadparm.c
+@@ -5392,6 +5392,8 @@ static void init_globals(bool reinit_glo
+ 	Globals.ldap_debug_level = 0;
+ 	Globals.ldap_debug_threshold = 10;
+ 
++	Globals.client_ldap_sasl_wrapping = ADS_AUTH_SASL_SIGN;
++
+ 	/* This is what we tell the afs client. in reality we set the token 
+ 	 * to never expire, though, when this runs out the afs client will 
+ 	 * forget the token. Set to 0 to get NEVERDATE.*/
diff --git a/package/network/services/samba36/patches/026-CVE-2016-2115-v3-6.patch b/package/network/services/samba36/patches/026-CVE-2016-2115-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5618fb4eff055bfcedbf65b6c83696cbd9c3ca64
--- /dev/null
+++ b/package/network/services/samba36/patches/026-CVE-2016-2115-v3-6.patch
@@ -0,0 +1,256 @@
+From 513bd34e4523e49e742487be32a7239111486a12 Mon Sep 17 00:00:00 2001
+From: Stefan Metzmacher <metze@samba.org>
+Date: Sat, 27 Feb 2016 03:43:58 +0100
+Subject: [PATCH 1/4] CVE-2016-2115: docs-xml: add "client ipc signing" option
+
+BUG: https://bugzilla.samba.org/show_bug.cgi?id=11756
+
+Signed-off-by: Stefan Metzmacher <metze@samba.org>
+Reviewed-by: Ralph Boehme <slow@samba.org>
+---
+ docs-xml/smbdotconf/security/clientipcsigning.xml | 23 +++++++++++++++++++++++
+ docs-xml/smbdotconf/security/clientsigning.xml    |  3 +++
+ source3/include/proto.h                           |  1 +
+ source3/param/loadparm.c                          | 12 ++++++++++++
+ 4 files changed, 39 insertions(+)
+ create mode 100644 docs-xml/smbdotconf/security/clientipcsigning.xml
+
+--- /dev/null
++++ b/docs-xml/smbdotconf/security/clientipcsigning.xml
+@@ -0,0 +1,23 @@
++<samba:parameter name="client ipc signing"
++                 context="G"
++                 type="enum"
++                 enumlist="enum_smb_signing_vals"
++                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
++<description>
++    <para>This controls whether the client is allowed or required to use SMB signing for IPC$
++    connections as DCERPC transport inside of winbind. Possible values
++    are <emphasis>auto</emphasis>, <emphasis>mandatory</emphasis>
++    and <emphasis>disabled</emphasis>.
++    </para>
++
++    <para>When set to auto, SMB signing is offered, but not enforced and if set
++    to disabled, SMB signing is not offered either.</para>
++
++    <para>Connections from winbindd to Active Directory Domain Controllers
++    always enforce signing.</para>
++</description>
++
++<related>client signing</related>
++
++<value type="default">mandatory</value>
++</samba:parameter>
+--- a/docs-xml/smbdotconf/security/clientsigning.xml
++++ b/docs-xml/smbdotconf/security/clientsigning.xml
+@@ -12,6 +12,9 @@
+     <para>When set to auto, SMB signing is offered, but not enforced. 
+     When set to mandatory, SMB signing is required and if set 
+ 	to disabled, SMB signing is not offered either.
++
++    <para>IPC$ connections for DCERPC e.g. in winbindd, are handled by the
++    <smbconfoption name="client ipc signing"/> option.</para>
+ </para>
+ </description>
+ 
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -1690,9 +1690,11 @@ int lp_winbind_cache_time(void);
+ int lp_winbind_reconnect_delay(void);
+ int lp_winbind_max_clients(void);
+ const char **lp_winbind_nss_info(void);
++bool lp_winbind_sealed_pipes(void);
+ int lp_algorithmic_rid_base(void);
+ int lp_name_cache_timeout(void);
+ int lp_client_signing(void);
++int lp_client_ipc_signing(void);
+ int lp_server_signing(void);
+ int lp_client_ldap_sasl_wrapping(void);
+ char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def);
+--- a/source3/param/loadparm.c
++++ b/source3/param/loadparm.c
+@@ -215,6 +215,7 @@ struct global {
+ 	int  winbind_expand_groups;
+ 	bool bWinbindRefreshTickets;
+ 	bool bWinbindOfflineLogon;
++	bool bWinbindSealedPipes;
+ 	bool bWinbindNormalizeNames;
+ 	bool bWinbindRpcOnly;
+ 	bool bCreateKrb5Conf;
+@@ -366,6 +367,7 @@ struct global {
+ 	int restrict_anonymous;
+ 	int name_cache_timeout;
+ 	int client_signing;
++	int client_ipc_signing;
+ 	int server_signing;
+ 	int client_ldap_sasl_wrapping;
+ 	int iUsershareMaxShares;
+@@ -2319,6 +2321,15 @@ static struct parm_struct parm_table[] =
+ 		.flags		= FLAG_ADVANCED,
+ 	},
+ 	{
++		.label		= "client ipc signing",
++		.type		= P_ENUM,
++		.p_class	= P_GLOBAL,
++		.ptr		= &Globals.client_ipc_signing,
++		.special	= NULL,
++		.enum_list	= enum_smb_signing_vals,
++		.flags		= FLAG_ADVANCED,
++	},
++	{
+ 		.label		= "server signing",
+ 		.type		= P_ENUM,
+ 		.p_class	= P_GLOBAL,
+@@ -4765,6 +4776,15 @@ static struct parm_struct parm_table[] =
+ 		.flags		= FLAG_ADVANCED,
+ 	},
+ 	{
++		.label		= "winbind sealed pipes",
++		.type		= P_BOOL,
++		.p_class	= P_GLOBAL,
++		.ptr		= &Globals.bWinbindSealedPipes,
++		.special	= NULL,
++		.enum_list	= NULL,
++		.flags		= FLAG_ADVANCED,
++	},
++	{
+ 		.label		= "winbind normalize names",
+ 		.type		= P_BOOL,
+ 		.p_class	= P_GLOBAL,
+@@ -5458,6 +5478,7 @@ static void init_globals(bool reinit_glo
+ 	Globals.szWinbindNssInfo = str_list_make_v3(NULL, "template", NULL);
+ 	Globals.bWinbindRefreshTickets = False;
+ 	Globals.bWinbindOfflineLogon = False;
++	Globals.bWinbindSealedPipes = True;
+ 
+ 	Globals.iIdmapCacheTime = 86400 * 7; /* a week by default */
+ 	Globals.iIdmapNegativeCacheTime = 120; /* 2 minutes by default */
+@@ -5470,6 +5491,7 @@ static void init_globals(bool reinit_glo
+ 	Globals.bClientUseSpnego = True;
+ 
+ 	Globals.client_signing = Auto;
++	Globals.client_ipc_signing = Required;
+ 	Globals.server_signing = False;
+ 
+ 	Globals.bDeferSharingViolations = True;
+@@ -5736,6 +5758,7 @@ FN_GLOBAL_BOOL(lp_winbind_nested_groups,
+ FN_GLOBAL_INTEGER(lp_winbind_expand_groups, &Globals.winbind_expand_groups)
+ FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets)
+ FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon)
++FN_GLOBAL_BOOL(lp_winbind_sealed_pipes, &Globals.bWinbindSealedPipes)
+ FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames)
+ FN_GLOBAL_BOOL(lp_winbind_rpc_only, &Globals.bWinbindRpcOnly)
+ FN_GLOBAL_BOOL(lp_create_krb5_conf, &Globals.bCreateKrb5Conf)
+@@ -6071,6 +6094,7 @@ FN_GLOBAL_LIST(lp_winbind_nss_info, &Glo
+ FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
+ FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
+ FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
++FN_GLOBAL_INTEGER(lp_client_ipc_signing, &Globals.client_ipc_signing)
+ FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
+ FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
+ 
+@@ -9700,6 +9724,20 @@ static bool lp_load_ex(const char *pszFn
+ 		lp_do_parameter(GLOBAL_SECTION_SNUM, "wins server", "127.0.0.1");
+ 	}
+ 
++	if (!lp_is_in_client()) {
++		switch (lp_client_ipc_signing()) {
++		case Required:
++			lp_set_cmdline("client signing", "mandatory");
++			break;
++		case Auto:
++			lp_set_cmdline("client signing", "auto");
++			break;
++		case False:
++			lp_set_cmdline("client signing", "disabled");
++			break;
++		}
++	}
++
+ 	init_iconv();
+ 
+ 	bAllowIncludeRegistry = true;
+--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
++++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
+@@ -2480,7 +2480,7 @@ static bool spoolss_connect_to_client(st
+ 		"", /* username */
+ 		"", /* domain */
+ 		"", /* password */
+-		0, lp_client_signing());
++		0, False);
+ 
+ 	if ( !NT_STATUS_IS_OK( ret ) ) {
+ 		DEBUG(2,("spoolss_connect_to_client: connection to [%s] failed!\n",
+--- /dev/null
++++ b/docs-xml/smbdotconf/winbind/winbindsealedpipes.xml
+@@ -0,0 +1,15 @@
++<samba:parameter name="winbind sealed pipes"
++                 context="G"
++                 type="boolean"
++                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
++<description>
++	<para>This option controls whether any requests from winbindd to domain controllers
++		pipe will be sealed. Disabling sealing can be useful for debugging
++		purposes.</para>
++
++	<para>The behavior can be controlled per netbios domain
++	by using 'winbind sealed pipes:NETBIOSDOMAIN = no' as option.</para>
++</description>
++
++<value type="default">yes</value>
++</samba:parameter>
+--- a/source3/winbindd/winbindd_cm.c
++++ b/source3/winbindd/winbindd_cm.c
+@@ -2384,6 +2384,15 @@ NTSTATUS cm_connect_sam(struct winbindd_
+ 	TALLOC_FREE(conn->samr_pipe);
+ 
+  anonymous:
++	if (lp_winbind_sealed_pipes() && (IS_DC || domain->primary)) {
++		status = NT_STATUS_DOWNGRADE_DETECTED;
++		DEBUG(1, ("Unwilling to make SAMR connection to domain %s "
++			  "without connection level security, "
++			  "must set 'winbind sealed pipes = false' "
++			  "to proceed: %s\n",
++			  domain->name, nt_errstr(status)));
++		goto done;
++	}
+ 
+ 	/* Finally fall back to anonymous. */
+ 	status = cli_rpc_pipe_open_noauth(conn->cli, &ndr_table_samr.syntax_id,
+@@ -2610,6 +2619,16 @@ NTSTATUS cm_connect_lsa(struct winbindd_
+ 
+  anonymous:
+ 
++	if (lp_winbind_sealed_pipes() && (IS_DC || domain->primary)) {
++		result = NT_STATUS_DOWNGRADE_DETECTED;
++		DEBUG(1, ("Unwilling to make LSA connection to domain %s "
++			  "without connection level security, "
++			  "must set 'winbind sealed pipes = false' "
++			  "to proceed: %s\n",
++			  domain->name, nt_errstr(result)));
++		goto done;
++	}
++
+ 	result = cli_rpc_pipe_open_noauth(conn->cli,
+ 					  &ndr_table_lsarpc.syntax_id,
+ 					  &conn->lsa_pipe);
+@@ -2749,7 +2768,18 @@ NTSTATUS cm_connect_netlogon(struct winb
+ 
+  no_schannel:
+ 	if ((lp_client_schannel() == False) ||
+-			((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
++		((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) {
++		if (lp_winbind_sealed_pipes() && (IS_DC || domain->primary)) {
++			result = NT_STATUS_DOWNGRADE_DETECTED;
++			DEBUG(1, ("Unwilling to make connection to domain %s "
++				  "without connection level security, "
++				  "must set 'winbind sealed pipes = false' "
++				  "to proceed: %s\n",
++				  domain->name, nt_errstr(result)));
++			TALLOC_FREE(netlogon_pipe);
++			invalidate_cm_connection(conn);
++			return result;
++		}
+ 		/*
+ 		 * NetSamLogonEx only works for schannel
+ 		 */
diff --git a/package/network/services/samba36/patches/027-CVE-2016-2118-v3-6.patch b/package/network/services/samba36/patches/027-CVE-2016-2118-v3-6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..06c1b0b521bff068eb97431f175b2cdb6f3d81ac
--- /dev/null
+++ b/package/network/services/samba36/patches/027-CVE-2016-2118-v3-6.patch
@@ -0,0 +1,308 @@
+From d68424b5ef92f5810760f90e9eeb664572a61e4e Mon Sep 17 00:00:00 2001
+From: Stefan Metzmacher <metze@samba.org>
+Date: Tue, 15 Dec 2015 14:49:36 +0100
+Subject: [PATCH 01/10] CVE-2016-2118: s3: rpcclient: change the default auth
+ level from DCERPC_AUTH_LEVEL_CONNECT to DCERPC_AUTH_LEVEL_INTEGRITY
+
+ncacn_ip_tcp:server should get the same protection as ncacn_np:server
+if authentication and smb signing is used.
+
+BUG: https://bugzilla.samba.org/show_bug.cgi?id=11616
+
+Signed-off-by: Stefan Metzmacher <metze@samba.org>
+
+(cherry picked from commit dab41dee8a4fb27dbf3913b0e44a4cc726e3ac98)
+---
+ source3/rpcclient/rpcclient.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/source3/rpcclient/rpcclient.c
++++ b/source3/rpcclient/rpcclient.c
+@@ -1062,10 +1062,9 @@ out_free:
+ 		}
+ 	}
+ 	if (pipe_default_auth_type != DCERPC_AUTH_TYPE_NONE) {
+-		/* If neither Integrity or Privacy are requested then
+-		 * Use just Connect level */
++		/* If nothing is requested then default to integrity */
+ 		if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
+-			pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
++			pipe_default_auth_level = DCERPC_AUTH_LEVEL_INTEGRITY;
+ 		}
+ 	}
+ 
+--- a/source4/librpc/rpc/dcerpc_util.c
++++ b/source4/librpc/rpc/dcerpc_util.c
+@@ -593,15 +593,15 @@ struct composite_context *dcerpc_pipe_au
+ 
+ 	/* Perform an authenticated DCE-RPC bind
+ 	 */
+-	if (!(conn->flags & (DCERPC_SIGN|DCERPC_SEAL))) {
++	if (!(conn->flags & (DCERPC_CONNECT|DCERPC_SEAL))) {
+ 		/*
+ 		  we are doing an authenticated connection,
+-		  but not using sign or seal. We must force
+-		  the CONNECT dcerpc auth type as a NONE auth
+-		  type doesn't allow authentication
+-		  information to be passed.
++		  which needs to use [connect], [sign] or [seal].
++		  If nothing is specified, we default to [sign] now.
++		  This give roughly the same protection as
++		  ncacn_np with smb signing.
+ 		*/
+-		conn->flags |= DCERPC_CONNECT;
++		conn->flags |= DCERPC_SIGN;
+ 	}
+ 
+ 	if (s->binding->flags & DCERPC_AUTH_SPNEGO) {
+--- /dev/null
++++ b/docs-xml/smbdotconf/security/allowdcerpcauthlevelconnect.xml
+@@ -0,0 +1,22 @@
++<samba:parameter name="allow dcerpc auth level connect"
++                 context="G"
++                 type="boolean"
++                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
++<description>
++	<para>This option controls whether DCERPC services are allowed to
++	be used with DCERPC_AUTH_LEVEL_CONNECT, which provides authentication,
++	but no per message integrity nor privacy protection.</para>
++
++	<para>The behavior can be controlled per interface name (e.g. lsarpc, netlogon, samr, srvsvc,
++	winreg, wkssvc ...) by using 'allow dcerpc auth level connect:interface = no' as option.</para>
++
++	<para>This option yields precedence to the implentation specific restrictions.
++	E.g. the drsuapi and backupkey protocols require DCERPC_AUTH_LEVEL_PRIVACY.
++	While others like samr and lsarpc have a hardcoded default of <constant>no</constant>.
++	</para>
++</description>
++
++<value type="default">no</value>
++<value type="example">yes</value>
++
++</samba:parameter>
+--- a/source3/include/proto.h
++++ b/source3/include/proto.h
+@@ -1821,6 +1821,7 @@ char* lp_perfcount_module(void);
+ void lp_set_passdb_backend(const char *backend);
+ void widelinks_warning(int snum);
+ char *lp_ncalrpc_dir(void);
++bool lp_allow_dcerpc_auth_level_connect(void);
+ 
+ /* The following definitions come from param/loadparm_server_role.c  */
+ 
+--- a/source3/param/loadparm.c
++++ b/source3/param/loadparm.c
+@@ -355,6 +355,7 @@ struct global {
+ 	bool bUseMmap;
+ 	bool bHostnameLookups;
+ 	bool bUnixExtensions;
++	bool bAllowDcerpcAuthLevelConnect;
+ 	bool bDisableNetbios;
+ 	char * szDedicatedKeytabFile;
+ 	int  iKerberosMethod;
+@@ -2303,6 +2304,15 @@ static struct parm_struct parm_table[] =
+ 		.flags		= FLAG_ADVANCED,
+ 	},
+ 	{
++		.label		= "allow dcerpc auth level connect",
++		.type		= P_BOOL,
++		.p_class	= P_GLOBAL,
++		.ptr		= &Globals.bAllowDcerpcAuthLevelConnect,
++		.special	= NULL,
++		.enum_list	= NULL,
++		.flags		= FLAG_ADVANCED,
++	},
++	{
+ 		.label		= "use spnego",
+ 		.type		= P_BOOL,
+ 		.p_class	= P_GLOBAL,
+@@ -5371,6 +5381,8 @@ static void init_globals(bool reinit_glo
+ 	Globals.bClientNTLMv2Auth = True; /* Client should always use use NTLMv2, as we can't tell that the server supports it, but most modern servers do */
+ 	/* Note, that we will also use NTLM2 session security (which is different), if it is available */
+ 
++	Globals.bAllowDcerpcAuthLevelConnect = false; /* we don't allow this by default */
++
+ 	Globals.map_to_guest = 0;	/* By Default, "Never" */
+ 	Globals.oplock_break_wait_time = 0;	/* By Default, 0 msecs. */
+ 	Globals.enhanced_browsing = true;
+@@ -5745,6 +5757,7 @@ FN_GLOBAL_INTEGER(lp_username_map_cache_
+ 
+ FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
+ 
++FN_GLOBAL_BOOL(lp_allow_dcerpc_auth_level_connect, &Globals.bAllowDcerpcAuthLevelConnect)
+ FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
+ FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
+ FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
+--- a/source3/include/ntdomain.h
++++ b/source3/include/ntdomain.h
+@@ -89,6 +89,10 @@ typedef struct pipe_rpc_fns {
+ 	uint32 context_id;
+ 	struct ndr_syntax_id syntax;
+ 
++	/*
++	 * shall we allow "connect" auth level for this interface ?
++	 */
++	bool allow_connect;
+ } PIPE_RPC_FNS;
+ 
+ /*
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -44,6 +44,11 @@
+ #include "rpc_server/srv_pipe.h"
+ #include "../librpc/gen_ndr/ndr_dcerpc.h"
+ #include "../librpc/ndr/ndr_dcerpc.h"
++#include "../librpc/gen_ndr/ndr_samr.h"
++#include "../librpc/gen_ndr/ndr_lsa.h"
++#include "../librpc/gen_ndr/ndr_netlogon.h"
++#include "../librpc/gen_ndr/ndr_epmapper.h"
++#include "../librpc/gen_ndr/ndr_echo.h"
+ 
+ #undef DBGC_CLASS
+ #define DBGC_CLASS DBGC_RPC_SRV
+@@ -340,6 +345,8 @@ static bool check_bind_req(struct pipes_
+ 			   uint32 context_id)
+ {
+ 	struct pipe_rpc_fns *context_fns;
++	const char *interface_name = NULL;
++	bool ok;
+ 
+ 	DEBUG(3,("check_bind_req for %s\n",
+ 		 get_pipe_name_from_syntax(talloc_tos(), abstract)));
+@@ -390,12 +397,57 @@ static bool check_bind_req(struct pipes_
+ 		return False;
+ 	}
+ 
++	interface_name = get_pipe_name_from_syntax(talloc_tos(),
++						   abstract);
++
++	SMB_ASSERT(interface_name != NULL);
++
+ 	context_fns->next = context_fns->prev = NULL;
+ 	context_fns->n_cmds = rpc_srv_get_pipe_num_cmds(abstract);
+ 	context_fns->cmds = rpc_srv_get_pipe_cmds(abstract);
+ 	context_fns->context_id = context_id;
+ 	context_fns->syntax = *abstract;
+ 
++	context_fns->allow_connect = lp_allow_dcerpc_auth_level_connect();
++	/*
++	 * for the samr and the lsarpc interfaces we don't allow "connect"
++	 * auth_level by default.
++	 */
++	ok = ndr_syntax_id_equal(abstract, &ndr_table_samr.syntax_id);
++	if (ok) {
++		context_fns->allow_connect = false;
++	}
++	ok = ndr_syntax_id_equal(abstract, &ndr_table_lsarpc.syntax_id);
++	if (ok) {
++		context_fns->allow_connect = false;
++	}
++	ok = ndr_syntax_id_equal(abstract, &ndr_table_netlogon.syntax_id);
++	if (ok) {
++		context_fns->allow_connect = false;
++	}
++	/*
++	 * for the epmapper and echo interfaces we allow "connect"
++	 * auth_level by default.
++	 */
++	ok = ndr_syntax_id_equal(abstract, &ndr_table_epmapper.syntax_id);
++	if (ok) {
++		context_fns->allow_connect = true;
++	}
++	ok = ndr_syntax_id_equal(abstract, &ndr_table_rpcecho.syntax_id);
++	if (ok) {
++		context_fns->allow_connect = true;
++	}
++	/*
++	 * every interface can be modified to allow "connect" auth_level by
++	 * using a parametric option like:
++	 * allow dcerpc auth level connect:<interface>
++	 * e.g.
++	 * allow dcerpc auth level connect:samr = yes
++	 */
++	context_fns->allow_connect = lp_parm_bool(-1,
++		"allow dcerpc auth level connect",
++		interface_name, context_fns->allow_connect);
++
+ 	/* add to the list of open contexts */
+ 
+ 	DLIST_ADD( p->contexts, context_fns );
+@@ -1736,6 +1788,7 @@ static bool api_pipe_request(struct pipe
+ 	TALLOC_CTX *frame = talloc_stackframe();
+ 	bool ret = False;
+ 	PIPE_RPC_FNS *pipe_fns;
++	const char *interface_name = NULL;
+ 
+ 	if (!p->pipe_bound) {
+ 		DEBUG(1, ("Pipe not bound!\n"));
+@@ -1757,8 +1810,36 @@ static bool api_pipe_request(struct pipe
+ 		return false;
+ 	}
+ 
++	interface_name = get_pipe_name_from_syntax(talloc_tos(),
++						   &pipe_fns->syntax);
++
++	SMB_ASSERT(interface_name != NULL);
++
+ 	DEBUG(5, ("Requested \\PIPE\\%s\n",
+-		  get_pipe_name_from_syntax(talloc_tos(), &pipe_fns->syntax)));
++		  interface_name));
++
++	switch (p->auth.auth_level) {
++	case DCERPC_AUTH_LEVEL_NONE:
++	case DCERPC_AUTH_LEVEL_INTEGRITY:
++	case DCERPC_AUTH_LEVEL_PRIVACY:
++		break;
++	default:
++		if (!pipe_fns->allow_connect) {
++			DEBUG(1, ("%s: restrict auth_level_connect access "
++				  "to [%s] with auth[type=0x%x,level=0x%x] "
++				  "on [%s] from [%s]\n",
++				  __func__, interface_name,
++				  p->auth.auth_type,
++				  p->auth.auth_level,
++				  derpc_transport_string_by_transport(p->transport),
++				  p->client_id->name));
++
++			setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_ACCESS_DENIED));
++			TALLOC_FREE(frame);
++			return true;
++		}
++		break;
++	}
+ 
+ 	if (!srv_pipe_check_verification_trailer(p, pkt, pipe_fns)) {
+ 		DEBUG(1, ("srv_pipe_check_verification_trailer: failed\n"));
+--- a/source3/selftest/knownfail
++++ b/source3/selftest/knownfail
+@@ -18,3 +18,5 @@ samba3.posix_s3.nbt.dgram.*netlogon2
+ samba3.*rap.sam.*.useradd # Not provided by Samba 3
+ samba3.*rap.sam.*.userdelete # Not provided by Samba 3
+ samba3.*rap.basic.*.netsessiongetinfo # Not provided by Samba 3
++samba3.blackbox.rpcclient.over.ncacn_np.with.*connect.* # we don't allow auth_level_connect anymore
++samba3.posix_s3.rpc.lsa.lookupsids.*ncacn_ip_tcp.*connect.* # we don't allow auth_level_connect anymore
+--- a/source3/selftest/tests.py
++++ b/source3/selftest/tests.py
+@@ -201,6 +201,8 @@ if sub.returncode == 0:
+             plansmbtorturetestsuite(t, "s3dc", '//$SERVER_IP/tmpguest -U$USERNAME%$PASSWORD')
+         elif t == "raw.samba3posixtimedlock":
+             plansmbtorturetestsuite(t, "s3dc", '//$SERVER_IP/tmpguest -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/dc/share')
++        elif t == "rpc.samr.passwords.validate":
++            plansmbtorturetestsuite(t, "s3dc", 'ncacn_np:$SERVER_IP[seal] -U$USERNAME%$PASSWORD', 'over ncacn_np ')
+         else:
+             plansmbtorturetestsuite(t, "s3dc", '//$SERVER_IP/tmp -U$USERNAME%$PASSWORD')
+ 
+--- a/source3/rpc_server/samr/srv_samr_nt.c
++++ b/source3/rpc_server/samr/srv_samr_nt.c
+@@ -6628,6 +6628,11 @@ NTSTATUS _samr_ValidatePassword(struct p
+ 	struct samr_GetDomPwInfo pw;
+ 	struct samr_PwInfo dom_pw_info;
+ 
++	if (p->auth.auth_level != DCERPC_AUTH_LEVEL_PRIVACY) {
++		p->fault_state = DCERPC_FAULT_ACCESS_DENIED;
++		return NT_STATUS_ACCESS_DENIED;
++	}
++
+ 	if (r->in.level < 1 || r->in.level > 3) {
+ 		return NT_STATUS_INVALID_INFO_CLASS;
+ 	}
diff --git a/package/network/services/samba36/patches/110-multicall.patch b/package/network/services/samba36/patches/110-multicall.patch
index 22e6a3c1b37a9993f23763b2610dc968d8790c03..98a03b654ca80289a895cd5ee34a143b2d270a99 100644
--- a/package/network/services/samba36/patches/110-multicall.patch
+++ b/package/network/services/samba36/patches/110-multicall.patch
@@ -36,7 +36,7 @@
  
  BIN_PROGS1 = bin/smbclient@EXEEXT@ bin/net@EXEEXT@ bin/smbspool@EXEEXT@ \
  	bin/testparm@EXEEXT@ bin/smbstatus@EXEEXT@ bin/smbget@EXEEXT@ \
-@@ -1777,6 +1777,42 @@ bin/.dummy:
+@@ -1799,6 +1799,42 @@ bin/.dummy:
  	  dir=bin $(MAKEDIR); fi
  	@: >> $@ || : > $@ # what a fancy emoticon!
  
diff --git a/package/network/services/samba36/patches/111-owrt_smbpasswd.patch b/package/network/services/samba36/patches/111-owrt_smbpasswd.patch
index 79abea581da247dc45299673bd51ae2dbb85c056..25fde6de2eaa50225b5d10e32ef4d37e4c469374 100644
--- a/package/network/services/samba36/patches/111-owrt_smbpasswd.patch
+++ b/package/network/services/samba36/patches/111-owrt_smbpasswd.patch
@@ -1,6 +1,6 @@
 --- a/source3/Makefile.in
 +++ b/source3/Makefile.in
-@@ -1019,7 +1019,7 @@ TEST_LP_LOAD_OBJ = param/test_lp_load.o
+@@ -1025,7 +1025,7 @@ TEST_LP_LOAD_OBJ = param/test_lp_load.o
  
  PASSWD_UTIL_OBJ = utils/passwd_util.o
  
@@ -9,7 +9,7 @@
  		$(PARAM_OBJ) $(LIBSMB_OBJ) $(PASSDB_OBJ) \
  		$(GROUPDB_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
  		$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \
-@@ -1791,7 +1791,7 @@ nmbd/nmbd_multicall.o: nmbd/nmbd.c nmbd/
+@@ -1813,7 +1813,7 @@ nmbd/nmbd_multicall.o: nmbd/nmbd.c nmbd/
  		echo "$(COMPILE_CC_PATH)" 1>&2;\
  		$(COMPILE_CC_PATH) >/dev/null 2>&1
  
@@ -18,7 +18,7 @@
  	@echo Compiling $<.c
  	@$(COMPILE_CC_PATH) -Dmain=smbpasswd_main && exit 0;\
  		echo "The following command failed:" 1>&2;\
-@@ -1800,7 +1800,7 @@ utils/smbpasswd_multicall.o: utils/smbpa
+@@ -1822,7 +1822,7 @@ utils/smbpasswd_multicall.o: utils/smbpa
  
  SMBD_MULTI_O = $(patsubst smbd/server.o,smbd/server_multicall.o,$(SMBD_OBJ))
  NMBD_MULTI_O = $(patsubst nmbd/nmbd.o,nmbd/nmbd_multicall.o,$(filter-out $(LIB_DUMMY_OBJ),$(NMBD_OBJ)))
diff --git a/package/network/services/samba36/patches/120-add_missing_ifdef.patch b/package/network/services/samba36/patches/120-add_missing_ifdef.patch
index dbd9adc1d7b929ca702f3c9d3417f80c66951ad9..3c0ef8ab3f38f2309d3ba5327b49df241d69e151 100644
--- a/package/network/services/samba36/patches/120-add_missing_ifdef.patch
+++ b/package/network/services/samba36/patches/120-add_missing_ifdef.patch
@@ -24,3 +24,18 @@
  	epmapper_commands,
  	shutdown_commands,
   	test_commands,
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -433,10 +433,12 @@ static bool check_bind_req(struct pipes_
+ 	if (ok) {
+ 		context_fns->allow_connect = true;
+ 	}
++#ifdef DEVELOPER
+ 	ok = ndr_syntax_id_equal(abstract, &ndr_table_rpcecho.syntax_id);
+ 	if (ok) {
+ 		context_fns->allow_connect = true;
+ 	}
++#endif
+ 	/*
+ 	 * every interface can be modified to allow "connect" auth_level by
+ 	 * using a parametric option like:
diff --git a/package/network/services/samba36/patches/210-remove_ad_support.patch b/package/network/services/samba36/patches/210-remove_ad_support.patch
index 6742dc047951efd472e49a8dc5c2c83cc0ceb966..a2051869a116997a88adc0e692f5187bc73044b8 100644
--- a/package/network/services/samba36/patches/210-remove_ad_support.patch
+++ b/package/network/services/samba36/patches/210-remove_ad_support.patch
@@ -71,7 +71,7 @@
  #endif
 --- a/source3/rpc_client/cli_pipe.c
 +++ b/source3/rpc_client/cli_pipe.c
-@@ -2904,12 +2904,14 @@ NTSTATUS cli_rpc_pipe_open_noauth_transp
+@@ -3391,12 +3391,14 @@ NTSTATUS cli_rpc_pipe_open_noauth_transp
  	status = rpc_pipe_bind(result, auth);
  	if (!NT_STATUS_IS_OK(status)) {
  		int lvl = 0;
diff --git a/package/network/services/samba36/patches/250-remove_domain_logon.patch b/package/network/services/samba36/patches/250-remove_domain_logon.patch
index f7582ef3bdb252d46a62e8a87ca6bffe51c33e14..9b434c515a14f54a2ad1e9d3bcde7d43069a7c09 100644
--- a/package/network/services/samba36/patches/250-remove_domain_logon.patch
+++ b/package/network/services/samba36/patches/250-remove_domain_logon.patch
@@ -183,3 +183,31 @@
  
          /*
  	 * Force a log file check.
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -421,10 +421,12 @@ static bool check_bind_req(struct pipes_
+ 	if (ok) {
+ 		context_fns->allow_connect = false;
+ 	}
++#ifdef NETLOGON_SUPPORT
+ 	ok = ndr_syntax_id_equal(abstract, &ndr_table_netlogon.syntax_id);
+ 	if (ok) {
+ 		context_fns->allow_connect = false;
+ 	}
++#endif
+ 	/*
+ 	 * for the epmapper and echo interfaces we allow "connect"
+ 	 * auth_level by default.
+--- a/source3/rpc_client/cli_pipe.c
++++ b/source3/rpc_client/cli_pipe.c
+@@ -2221,6 +2221,10 @@ static void rpc_pipe_bind_step_two_trigg
+ 				      struct schannel_state);
+ 	struct tevent_req *subreq;
+ 
++#ifndef NETLOGON_SUPPORT
++	tevent_req_nterror(req, NT_STATUS_UNSUCCESSFUL);
++	return;
++#endif
+ 	if (schannel_auth == NULL ||
+ 	    !ndr_syntax_id_equal(&state->cli->abstract_syntax,
+ 				 &ndr_table_netlogon.syntax_id)) {
diff --git a/package/network/services/samba36/patches/260-remove_samr.patch b/package/network/services/samba36/patches/260-remove_samr.patch
index 7e5557305607ac5fa4c0fe639f773fdcbf8b7194..aeca3ed5563f819eb547cca677cc074d9334a30a 100644
--- a/package/network/services/samba36/patches/260-remove_samr.patch
+++ b/package/network/services/samba36/patches/260-remove_samr.patch
@@ -142,3 +142,21 @@
  	if (!str1 || !str2 || !UserName || !p) {
  		return False;
  	}
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -409,6 +409,7 @@ static bool check_bind_req(struct pipes_
+ 	context_fns->syntax = *abstract;
+ 
+ 	context_fns->allow_connect = lp_allow_dcerpc_auth_level_connect();
++#ifdef SAMR_SUPPORT
+ 	/*
+ 	 * for the samr and the lsarpc interfaces we don't allow "connect"
+ 	 * auth_level by default.
+@@ -417,6 +418,7 @@ static bool check_bind_req(struct pipes_
+ 	if (ok) {
+ 		context_fns->allow_connect = false;
+ 	}
++#endif
+ 	ok = ndr_syntax_id_equal(abstract, &ndr_table_lsarpc.syntax_id);
+ 	if (ok) {
+ 		context_fns->allow_connect = false;
diff --git a/package/network/services/samba36/patches/290-remove_lsa.patch b/package/network/services/samba36/patches/290-remove_lsa.patch
index fe37d5dae12317abbf04e46be4852e08e8bc40d2..6dc35753b105ad3a2b2db67a2b43efd2b85652a4 100644
--- a/package/network/services/samba36/patches/290-remove_lsa.patch
+++ b/package/network/services/samba36/patches/290-remove_lsa.patch
@@ -71,3 +71,18 @@
  }
  
  size_t num_pipe_handles(struct pipes_struct *p)
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -419,10 +419,12 @@ static bool check_bind_req(struct pipes_
+ 		context_fns->allow_connect = false;
+ 	}
+ #endif
++#ifdef LSA_SUPPORT
+ 	ok = ndr_syntax_id_equal(abstract, &ndr_table_lsarpc.syntax_id);
+ 	if (ok) {
+ 		context_fns->allow_connect = false;
+ 	}
++#endif
+ #ifdef NETLOGON_SUPPORT
+ 	ok = ndr_syntax_id_equal(abstract, &ndr_table_netlogon.syntax_id);
+ 	if (ok) {
diff --git a/package/network/services/samba36/patches/310-remove_error_strings.patch b/package/network/services/samba36/patches/310-remove_error_strings.patch
index 8c7ae2d7d0a35c193d648b994a3776a39bb3a713..ee3460dfdb1db8013eaa06d0a7b575c8f026177f 100644
--- a/package/network/services/samba36/patches/310-remove_error_strings.patch
+++ b/package/network/services/samba36/patches/310-remove_error_strings.patch
@@ -65,7 +65,7 @@
  }
 --- a/librpc/ndr/libndr.h
 +++ b/librpc/ndr/libndr.h
-@@ -604,4 +604,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_enum
+@@ -663,4 +663,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_enum
  
  _PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b);
  
@@ -251,3 +251,87 @@
  	print "	       return;";
  	print "       }";
  	print "";
+--- a/source3/rpc_client/cli_pipe.c
++++ b/source3/rpc_client/cli_pipe.c
+@@ -445,7 +445,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 				  rpccli_pipe_txt(talloc_tos(), cli),
+ 				  pkt->ptype, expected_pkt_type,
+ 				  nt_errstr(ret)));
+-			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+@@ -466,7 +465,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 				  rpccli_pipe_txt(talloc_tos(), cli),
+ 				  pkt->ptype, expected_pkt_type,
+ 				  nt_errstr(ret)));
+-			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+@@ -486,7 +484,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 				  rpccli_pipe_txt(talloc_tos(), cli),
+ 				  pkt->ptype, expected_pkt_type,
+ 				  nt_errstr(ret)));
+-			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+@@ -508,7 +505,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 				  rpccli_pipe_txt(talloc_tos(), cli),
+ 				  pkt->ptype, expected_pkt_type,
+ 				  nt_errstr(ret)));
+-			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+@@ -526,7 +522,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 				  rpccli_pipe_txt(talloc_tos(), cli),
+ 				  pkt->ptype, expected_pkt_type,
+ 				  nt_errstr(ret)));
+-			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+@@ -570,7 +565,6 @@ static NTSTATUS cli_pipe_validate_curren
+ 				  rpccli_pipe_txt(talloc_tos(), cli),
+ 				  pkt->ptype, expected_pkt_type,
+ 				  nt_errstr(ret)));
+-			NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 			return ret;
+ 		}
+ 
+--- a/source3/rpc_server/srv_pipe.c
++++ b/source3/rpc_server/srv_pipe.c
+@@ -991,7 +991,6 @@ static bool api_pipe_bind_req(struct pip
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		DEBUG(1, ("api_pipe_bind_req: invalid pdu: %s\n",
+ 			  nt_errstr(status)));
+-		NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 		goto err_exit;
+ 	}
+ 
+@@ -1325,7 +1324,6 @@ bool api_pipe_bind_auth3(struct pipes_st
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		DEBUG(1, ("api_pipe_bind_auth3: invalid pdu: %s\n",
+ 			  nt_errstr(status)));
+-		NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 		goto err;
+ 	}
+ 
+@@ -1483,7 +1481,6 @@ static bool api_pipe_alter_context(struc
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		DEBUG(1, ("api_pipe_alter_context: invalid pdu: %s\n",
+ 			  nt_errstr(status)));
+-		NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 		goto err_exit;
+ 	}
+ 
+@@ -2057,7 +2054,6 @@ static bool process_request_pdu(struct p
+ 	if (!NT_STATUS_IS_OK(status)) {
+ 		DEBUG(1, ("process_request_pdu: invalid pdu: %s\n",
+ 			  nt_errstr(status)));
+-		NDR_PRINT_DEBUG(ncacn_packet, pkt);
+ 		set_incoming_fault(p);
+ 		return false;
+ 	}
diff --git a/package/network/services/samba36/patches/330-librpc_default_print.patch b/package/network/services/samba36/patches/330-librpc_default_print.patch
index f9c2e0e6874c858b3e21e48006d7417ec31a81c3..aa4bfe32c9ddbbf2a7b952059d37d752064955a0 100644
--- a/package/network/services/samba36/patches/330-librpc_default_print.patch
+++ b/package/network/services/samba36/patches/330-librpc_default_print.patch
@@ -8844,7 +8844,7 @@
 +done
 --- a/librpc/ndr/libndr.h
 +++ b/librpc/ndr/libndr.h
-@@ -603,6 +603,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_enum
+@@ -662,6 +662,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_enum
  _PUBLIC_ enum ndr_err_code ndr_push_enum_uint1632(struct ndr_push *ndr, int ndr_flags, uint16_t v);
  
  _PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b);
diff --git a/package/network/utils/curl/Makefile b/package/network/utils/curl/Makefile
index 7f6d35575a05d1d8841927c1e89622773605f952..734b423929a0046c3d2fa1c0e075269b2573fa5b 100644
--- a/package/network/utils/curl/Makefile
+++ b/package/network/utils/curl/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2007-2015 OpenWrt.org
+# Copyright (C) 2007-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=curl
 PKG_VERSION:=7.40.0
-PKG_RELEASE:=3
+PKG_RELEASE:=3.2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://curl.haxx.se/download/ \
diff --git a/package/network/utils/curl/patches/018-CVE-2016-0755.patch b/package/network/utils/curl/patches/018-CVE-2016-0755.patch
new file mode 100644
index 0000000000000000000000000000000000000000..dd5529792d33791beb029bda3788faf82b89db08
--- /dev/null
+++ b/package/network/utils/curl/patches/018-CVE-2016-0755.patch
@@ -0,0 +1,126 @@
+From d41dcba4e9b69d6b761e3460cc6ae7e8fd8f621f Mon Sep 17 00:00:00 2001
+From: Isaac Boukris <iboukris@gmail.com>
+Date: Wed, 13 Jan 2016 11:05:51 +0200
+Subject: [PATCH] NTLM: Fix ConnectionExists to compare Proxy credentials
+
+Proxy NTLM authentication should compare credentials when
+re-using a connection similar to host authentication, as it
+authenticate the connection.
+
+Example:
+curl -v -x http://proxy:port http://host/ -U good_user:good_pwd
+  --proxy-ntlm --next -x http://proxy:port http://host/
+    [-U fake_user:fake_pwd --proxy-ntlm]
+
+CVE-2016-0755
+
+Bug: http://curl.haxx.se/docs/adv_20160127A.html
+---
+ lib/url.c | 62 ++++++++++++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 40 insertions(+), 22 deletions(-)
+
+--- a/lib/url.c
++++ b/lib/url.c
+@@ -3044,11 +3044,16 @@ ConnectionExists(struct SessionHandle *d
+   struct connectdata *check;
+   struct connectdata *chosen = 0;
+   bool canPipeline = IsPipeliningPossible(data, needle);
+-  bool wantNTLMhttp = ((data->state.authhost.want & CURLAUTH_NTLM) ||
+-                       (data->state.authhost.want & CURLAUTH_NTLM_WB)) &&
+-    (needle->handler->protocol & PROTO_FAMILY_HTTP) ? TRUE : FALSE;
+   struct connectbundle *bundle;
+ 
++  bool wantNTLMhttp = ((data->state.authhost.want &
++                      (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
++                      (needle->handler->protocol & PROTO_FAMILY_HTTP));
++  bool wantProxyNTLMhttp = (needle->bits.proxy_user_passwd &&
++                           ((data->state.authproxy.want &
++                           (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
++                           (needle->handler->protocol & PROTO_FAMILY_HTTP)));
++
+   *force_reuse = FALSE;
+ 
+   /* We can't pipe if the site is blacklisted */
+@@ -3077,9 +3082,6 @@ ConnectionExists(struct SessionHandle *d
+     curr = bundle->conn_list->head;
+     while(curr) {
+       bool match = FALSE;
+-#if defined(USE_NTLM)
+-      bool credentialsMatch = FALSE;
+-#endif
+       size_t pipeLen;
+ 
+       /*
+@@ -3185,21 +3187,14 @@ ConnectionExists(struct SessionHandle *d
+       }
+ 
+       if((!(needle->handler->flags & PROTOPT_CREDSPERREQUEST)) ||
+-#if defined(USE_NTLM)
+-         (wantNTLMhttp || check->ntlm.state != NTLMSTATE_NONE)) {
+-#else
+          wantNTLMhttp) {
+-#endif
+-        /* This protocol requires credentials per connection or is HTTP+NTLM,
++        /* This protocol requires credentials per connection,
+            so verify that we're using the same name and password as well */
+         if(!strequal(needle->user, check->user) ||
+            !strequal(needle->passwd, check->passwd)) {
+           /* one of them was different */
+           continue;
+         }
+-#if defined(USE_NTLM)
+-        credentialsMatch = TRUE;
+-#endif
+       }
+ 
+       if(!needle->bits.httpproxy || needle->handler->flags&PROTOPT_SSL ||
+@@ -3258,20 +3253,43 @@ ConnectionExists(struct SessionHandle *d
+            possible. (Especially we must not reuse the same connection if
+            partway through a handshake!) */
+         if(wantNTLMhttp) {
+-          if(credentialsMatch && check->ntlm.state != NTLMSTATE_NONE) {
+-            chosen = check;
++          if(!strequal(needle->user, check->user) ||
++             !strequal(needle->passwd, check->passwd))
++            continue;
++        }
++        else if(check->ntlm.state != NTLMSTATE_NONE) {
++          /* Connection is using NTLM auth but we don't want NTLM */
++          continue;
++        }
+ 
++        /* Same for Proxy NTLM authentication */
++        if(wantProxyNTLMhttp) {
++          if(!strequal(needle->proxyuser, check->proxyuser) ||
++             !strequal(needle->proxypasswd, check->proxypasswd))
++            continue;
++        }
++        else if(check->proxyntlm.state != NTLMSTATE_NONE) {
++          /* Proxy connection is using NTLM auth but we don't want NTLM */
++          continue;
++        }
++
++        if(wantNTLMhttp || wantProxyNTLMhttp) {
++          /* Credentials are already checked, we can use this connection */
++          chosen = check;
++
++          if((wantNTLMhttp &&
++             (check->ntlm.state != NTLMSTATE_NONE)) ||
++              (wantProxyNTLMhttp &&
++               (check->proxyntlm.state != NTLMSTATE_NONE))) {
+             /* We must use this connection, no other */
+             *force_reuse = TRUE;
+             break;
+           }
+-          else if(credentialsMatch)
+-            /* this is a backup choice */
+-            chosen = check;
++
++          /* Continue look up for a better connection */
+           continue;
+         }
+ #endif
+-
+         if(canPipeline) {
+           /* We can pipeline if we want to. Let's continue looking for
+              the optimal connection to use, i.e the shortest pipe that is not
diff --git a/package/network/utils/curl/patches/110-cyassl-detect-the-library-as-renamed-wolfssl.patch b/package/network/utils/curl/patches/110-cyassl-detect-the-library-as-renamed-wolfssl.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3b4229f901b794cb14adac58543bcc2b1e81c137
--- /dev/null
+++ b/package/network/utils/curl/patches/110-cyassl-detect-the-library-as-renamed-wolfssl.patch
@@ -0,0 +1,101 @@
+From 7868dc7103b40484d177985bb04270250a50e262 Mon Sep 17 00:00:00 2001
+From: Dan Fandrich <dan@coneharvesters.com>
+Date: Thu, 19 Mar 2015 23:41:10 +0100
+Subject: [PATCH] cyassl: detect the library as renamed wolfssl
+
+This change was made in CyaSSL/WolfSSL ver. 3.4.0
+---
+ configure.ac | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 57 insertions(+), 3 deletions(-)
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -1578,8 +1578,10 @@ if test "$curl_ssl_msg" = "$init_ssl_msg
+                 AC_CHECK_FUNCS( ENGINE_load_builtin_engines )
+               ])
+ 
+-    dnl these can only exist if openssl exists
+-    dnl yassl doesn't have SSL_get_shutdown
++    dnl These can only exist if OpenSSL exists
++    dnl Older versions of Cyassl (some time before 2.9.4) don't have
++    dnl SSL_get_shutdown (but this check won't actually detect it there
++    dnl as it's a macro that needs the header files be included)
+ 
+     AC_CHECK_FUNCS( RAND_status \
+                     RAND_screen \
+@@ -1943,6 +1945,10 @@ if test "$curl_ssl_msg" = "$init_ssl_msg
+       OPT_CYASSL=""
+     fi
+ 
++    dnl This should be reworked to use pkg-config instead
++
++    cyassllibname=cyassl
++
+     if test -z "$OPT_CYASSL" ; then
+       dnl check for lib in system default first
+ 
+@@ -1984,7 +1990,55 @@ if test "$curl_ssl_msg" = "$init_ssl_msg
+        [
+          CPPFLAGS=$_cppflags
+          LDFLAGS=$_ldflags
++         cyassllib=""
++       ])
++    fi
++
++    addld=""
++    addlib=""
++    addcflags=""
++
++    if test "x$USE_CYASSL" != "xyes"; then
++      dnl libcyassl renamed to libwolfssl as of 3.4.0
++      addld=-L$OPT_CYASSL/lib$libsuff
++      addcflags=-I$OPT_CYASSL/include
++      cyassllib=$OPT_CYASSL/lib$libsuff
++
++      LDFLAGS="$LDFLAGS $addld"
++      if test "$addcflags" != "-I/usr/include"; then
++         CPPFLAGS="$CPPFLAGS $addcflags"
++      fi
++
++      cyassllibname=wolfssl
++      my_ac_save_LIBS="$LIBS"
++      LIBS="-l$cyassllibname -lm $LIBS"
++
++      AC_MSG_CHECKING([for CyaSSL_Init in -lwolfssl])
++      AC_LINK_IFELSE([
++	AC_LANG_PROGRAM([[
++/* These aren't needed for detection and confuse WolfSSL.
++   They are set up properly later if it is detected.  */
++#undef SIZEOF_LONG
++#undef SIZEOF_LONG_LONG
++#include <cyassl/ssl.h>
++	]],[[
++	  return CyaSSL_Init();
++	]])
++      ],[
++         AC_MSG_RESULT(yes)
++         AC_DEFINE(USE_CYASSL, 1, [if CyaSSL is enabled])
++         AC_SUBST(USE_CYASSL, [1])
++         CYASSL_ENABLED=1
++         USE_CYASSL="yes"
++         curl_ssl_msg="enabled (CyaSSL)"
++       ],
++       [
++         AC_MSG_RESULT(no)
++         CPPFLAGS=$_cppflags
++         LDFLAGS=$_ldflags
++         cyassllib=""
+        ])
++      LIBS="$my_ac_save_LIBS"
+     fi
+ 
+     if test "x$USE_CYASSL" = "xyes"; then
+@@ -1996,7 +2050,7 @@ if test "$curl_ssl_msg" = "$init_ssl_msg
+       dnl Versions since at least 2.9.4 renamed error.h to error-ssl.h
+       AC_CHECK_HEADERS(cyassl/error-ssl.h)
+ 
+-      LIBS="-lcyassl -lm $LIBS"
++      LIBS="-l$cyassllibname -lm $LIBS"
+ 
+       if test -n "$cyassllib"; then
+         dnl when shared libs were found in a path that the run-time
diff --git a/package/network/utils/iw/Makefile b/package/network/utils/iw/Makefile
index 05ecd8adadb9deb13b2078465303cf52864b447e..ad82081570395bfba8d60428996194d834f73321 100644
--- a/package/network/utils/iw/Makefile
+++ b/package/network/utils/iw/Makefile
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iw
-PKG_VERSION:=3.17
+PKG_VERSION:=4.3
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://www.kernel.org/pub/software/network/iw
-PKG_MD5SUM:=69c4a2f29cf560247febc6cad7161a72
+PKG_MD5SUM:=7adec72e91ebdd9c55429fa34a23a6f5
 
 PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
 PKG_LICENSE:=GPL-2.0
diff --git a/package/network/utils/iw/patches/001-nl80211_h_sync.patch b/package/network/utils/iw/patches/001-nl80211_h_sync.patch
index 03a3d38c66e5833c1f24fa14640dfe857a107723..7de225859b71c2bb7627503b676aa7f2a122ccd9 100644
--- a/package/network/utils/iw/patches/001-nl80211_h_sync.patch
+++ b/package/network/utils/iw/patches/001-nl80211_h_sync.patch
@@ -1,672 +1,111 @@
 --- a/nl80211.h
 +++ b/nl80211.h
-@@ -25,10 +25,30 @@
-  *
-  */
- 
-+/*
-+ * This header file defines the userspace API to the wireless stack. Please
-+ * be careful not to break things - i.e. don't move anything around or so
-+ * unless you can demonstrate that it breaks neither API nor ABI.
-+ *
-+ * Additions to the API should be accompanied by actual implementations in
-+ * an upstream driver, so that example implementations exist in case there
-+ * are ever concerns about the precise semantics of the API or changes are
-+ * needed, and to ensure that code for dead (no longer implemented) API
-+ * can actually be identified and removed.
-+ * Nonetheless, semantics should also be documented carefully in this file.
-+ */
-+
- #include <linux/types.h>
- 
- #define NL80211_GENL_NAME "nl80211"
- 
-+#define NL80211_MULTICAST_GROUP_CONFIG		"config"
-+#define NL80211_MULTICAST_GROUP_SCAN		"scan"
-+#define NL80211_MULTICAST_GROUP_REG		"regulatory"
-+#define NL80211_MULTICAST_GROUP_MLME		"mlme"
-+#define NL80211_MULTICAST_GROUP_VENDOR		"vendor"
-+#define NL80211_MULTICAST_GROUP_TESTMODE	"testmode"
-+
- /**
-  * DOC: Station handling
-  *
-@@ -173,8 +193,8 @@
-  *	%NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME.
-  *
-  * @NL80211_CMD_GET_INTERFACE: Request an interface's configuration;
-- *	either a dump request on a %NL80211_ATTR_WIPHY or a specific get
-- *	on an %NL80211_ATTR_IFINDEX is supported.
-+ *	either a dump request for all interfaces or a specific get with a
-+ *	single %NL80211_ATTR_IFINDEX is supported.
-  * @NL80211_CMD_SET_INTERFACE: Set type of a virtual interface, requires
-  *	%NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE.
-  * @NL80211_CMD_NEW_INTERFACE: Newly created virtual interface or response
-@@ -227,7 +247,11 @@
-  *	the interface identified by %NL80211_ATTR_IFINDEX.
-  * @NL80211_CMD_DEL_STATION: Remove a station identified by %NL80211_ATTR_MAC
-  *	or, if no MAC address given, all stations, on the interface identified
-- *	by %NL80211_ATTR_IFINDEX.
-+ *	by %NL80211_ATTR_IFINDEX. %NL80211_ATTR_MGMT_SUBTYPE and
-+ *	%NL80211_ATTR_REASON_CODE can optionally be used to specify which type
-+ *	of disconnection indication should be sent to the station
-+ *	(Deauthentication or Disassociation frame and reason code for that
-+ *	frame).
-  *
-  * @NL80211_CMD_GET_MPATH: Get mesh path attributes for mesh path to
-  * 	destination %NL80211_ATTR_MAC on the interface identified by
-@@ -248,7 +272,18 @@
-  *	%NL80211_ATTR_IFINDEX.
-  *
-  * @NL80211_CMD_GET_REG: ask the wireless core to send us its currently set
-- * 	regulatory domain.
-+ *	regulatory domain. If %NL80211_ATTR_WIPHY is specified and the device
-+ *	has a private regulatory domain, it will be returned. Otherwise, the
-+ *	global regdomain will be returned.
-+ *	A device will have a private regulatory domain if it uses the
-+ *	regulatory_hint() API. Even when a private regdomain is used the channel
-+ *	information will still be mended according to further hints from
-+ *	the regulatory core to help with compliance. A dump version of this API
-+ *	is now available which will returns the global regdomain as well as
-+ *	all private regdomains of present wiphys (for those that have it).
-+ *	If a wiphy is self-managed (%NL80211_ATTR_WIPHY_SELF_MANAGED_REG), then
-+ *	its private regdomain is the only valid one for it. The regulatory
-+ *	core is not used to help with compliance in this case.
-  * @NL80211_CMD_SET_REG: Set current regulatory domain. CRDA sends this command
-  *	after being queried by the kernel. CRDA replies by sending a regulatory
-  *	domain structure which consists of %NL80211_ATTR_REG_ALPHA set to our
-@@ -302,7 +337,9 @@
-  *	if passed, define which channels should be scanned; if not
-  *	passed, all channels allowed for the current regulatory domain
-  *	are used.  Extra IEs can also be passed from the userspace by
-- *	using the %NL80211_ATTR_IE attribute.
-+ *	using the %NL80211_ATTR_IE attribute.  The first cycle of the
-+ *	scheduled scan can be delayed by %NL80211_ATTR_SCHED_SCAN_DELAY
-+ *	is supplied.
-  * @NL80211_CMD_STOP_SCHED_SCAN: stop a scheduled scan. Returns -ENOENT if
-  *	scheduled scan is not running. The caller may assume that as soon
-  *	as the call returns, it is safe to start a new scheduled scan again.
-@@ -639,7 +676,18 @@
-  * @NL80211_CMD_CH_SWITCH_NOTIFY: An AP or GO may decide to switch channels
-  *	independently of the userspace SME, send this event indicating
-  *	%NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ and the
-- *	attributes determining channel width.
-+ *	attributes determining channel width.  This indication may also be
-+ *	sent when a remotely-initiated switch (e.g., when a STA receives a CSA
-+ *	from the remote AP) is completed;
-+ *
-+ * @NL80211_CMD_CH_SWITCH_STARTED_NOTIFY: Notify that a channel switch
-+ *	has been started on an interface, regardless of the initiator
-+ *	(ie. whether it was requested from a remote device or
-+ *	initiated on our own).  It indicates that
-+ *	%NL80211_ATTR_IFINDEX will be on %NL80211_ATTR_WIPHY_FREQ
-+ *	after %NL80211_ATTR_CH_SWITCH_COUNT TBTT's.  The userspace may
-+ *	decide to react to this indication by requesting other
-+ *	interfaces to change channel as well.
-  *
-  * @NL80211_CMD_START_P2P_DEVICE: Start the given P2P Device, identified by
-  *	its %NL80211_ATTR_WDEV identifier. It must have been created with
-@@ -738,6 +786,31 @@
-  *	before removing a station entry entirely, or before disassociating
-  *	or similar, cleanup will happen in the driver/device in this case.
-  *
-+ * @NL80211_CMD_GET_MPP: Get mesh path attributes for mesh proxy path to
-+ *	destination %NL80211_ATTR_MAC on the interface identified by
-+ *	%NL80211_ATTR_IFINDEX.
-+ *
-+ * @NL80211_CMD_JOIN_OCB: Join the OCB network. The center frequency and
-+ *	bandwidth of a channel must be given.
-+ * @NL80211_CMD_LEAVE_OCB: Leave the OCB network -- no special arguments, the
-+ *	network is determined by the network interface.
-+ *
-+ * @NL80211_CMD_TDLS_CHANNEL_SWITCH: Start channel-switching with a TDLS peer,
-+ *	identified by the %NL80211_ATTR_MAC parameter. A target channel is
-+ *	provided via %NL80211_ATTR_WIPHY_FREQ and other attributes determining
-+ *	channel width/type. The target operating class is given via
-+ *	%NL80211_ATTR_OPER_CLASS.
-+ *	The driver is responsible for continually initiating channel-switching
-+ *	operations and returning to the base channel for communication with the
-+ *	AP.
-+ * @NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH: Stop channel-switching with a TDLS
-+ *	peer given by %NL80211_ATTR_MAC. Both peers must be on the base channel
-+ *	when this command completes.
-+ *
-+ * @NL80211_CMD_WIPHY_REG_CHANGE: Similar to %NL80211_CMD_REG_CHANGE, but used
-+ *	as an event to indicate changes for devices with wiphy-specific regdom
-+ *	management.
-+ *
-  * @NL80211_CMD_MAX: highest used command number
-  * @__NL80211_CMD_AFTER_LAST: internal use
-  */
-@@ -912,6 +985,18 @@ enum nl80211_commands {
- 	NL80211_CMD_ADD_TX_TS,
- 	NL80211_CMD_DEL_TX_TS,
- 
-+	NL80211_CMD_GET_MPP,
-+
-+	NL80211_CMD_JOIN_OCB,
-+	NL80211_CMD_LEAVE_OCB,
-+
-+	NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
-+
-+	NL80211_CMD_TDLS_CHANNEL_SWITCH,
-+	NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
-+
-+	NL80211_CMD_WIPHY_REG_CHANGE,
-+
- 	/* add new commands above here */
- 
- 	/* used to define NL80211_CMD_MAX below */
-@@ -1606,9 +1691,16 @@ enum nl80211_commands {
-  * @NL80211_ATTR_TDLS_PEER_CAPABILITY: flags for TDLS peer capabilities, u32.
-  *	As specified in the &enum nl80211_tdls_peer_capability.
-  *
-- * @NL80211_ATTR_IFACE_SOCKET_OWNER: flag attribute, if set during interface
-+ * @NL80211_ATTR_SOCKET_OWNER: Flag attribute, if set during interface
-  *	creation then the new interface will be owned by the netlink socket
-- *	that created it and will be destroyed when the socket is closed
-+ *	that created it and will be destroyed when the socket is closed.
-+ *	If set during scheduled scan start then the new scan req will be
-+ *	owned by the netlink socket that created it and the scheduled scan will
-+ *	be stopped when the socket is closed.
-+ *	If set during configuration of regulatory indoor operation then the
-+ *	regulatory indoor configuration would be owned by the netlink socket
-+ *	that configured the indoor setting, and the indoor operation would be
-+ *	cleared when the socket is closed.
-  *
-  * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is
-  *	the TDLS link initiator.
-@@ -1638,6 +1730,40 @@ enum nl80211_commands {
-  * @NL80211_ATTR_SMPS_MODE: SMPS mode to use (ap mode). see
-  *	&enum nl80211_smps_mode.
-  *
-+ * @NL80211_ATTR_OPER_CLASS: operating class
-+ *
-+ * @NL80211_ATTR_MAC_MASK: MAC address mask
-+ *
-+ * @NL80211_ATTR_WIPHY_SELF_MANAGED_REG: flag attribute indicating this device
-+ *	is self-managing its regulatory information and any regulatory domain
-+ *	obtained from it is coming from the device's wiphy and not the global
-+ *	cfg80211 regdomain.
-+ *
-+ * @NL80211_ATTR_EXT_FEATURES: extended feature flags contained in a byte
-+ *	array. The feature flags are identified by their bit index (see &enum
-+ *	nl80211_ext_feature_index). The bit index is ordered starting at the
-+ *	least-significant bit of the first byte in the array, ie. bit index 0
-+ *	is located at bit 0 of byte 0. bit index 25 would be located at bit 1
-+ *	of byte 3 (u8 array).
-+ *
-+ * @NL80211_ATTR_SURVEY_RADIO_STATS: Request overall radio statistics to be
-+ *	returned along with other survey data. If set, @NL80211_CMD_GET_SURVEY
-+ *	may return a survey entry without a channel indicating global radio
-+ *	statistics (only some values are valid and make sense.)
-+ *	For devices that don't return such an entry even then, the information
-+ *	should be contained in the result as the sum of the respective counters
-+ *	over all channels.
-+ *
-+ * @NL80211_ATTR_SCHED_SCAN_DELAY: delay before a scheduled scan (or a
-+ *	WoWLAN net-detect scan) is started, u32 in seconds.
-+
-+ * @NL80211_ATTR_REG_INDOOR: flag attribute, if set indicates that the device
-+ *      is operating in an indoor environment.
+@@ -10,6 +10,7 @@
+  * Copyright 2008, 2009 Luis R. Rodriguez <lrodriguez@atheros.com>
+  * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
+  * Copyright 2008 Colin McCabe <colin@cozybit.com>
++ * Copyright 2015	Intel Deutschland GmbH
+  *
+  * Permission to use, copy, modify, and/or distribute this software for any
+  * purpose with or without fee is hereby granted, provided that the above
+@@ -328,7 +329,15 @@
+  *	partial scan results may be available
+  *
+  * @NL80211_CMD_START_SCHED_SCAN: start a scheduled scan at certain
+- *	intervals, as specified by %NL80211_ATTR_SCHED_SCAN_INTERVAL.
++ *	intervals and certain number of cycles, as specified by
++ *	%NL80211_ATTR_SCHED_SCAN_PLANS. If %NL80211_ATTR_SCHED_SCAN_PLANS is
++ *	not specified and only %NL80211_ATTR_SCHED_SCAN_INTERVAL is specified,
++ *	scheduled scan will run in an infinite loop with the specified interval.
++ *	These attributes are mutually exculsive,
++ *	i.e. NL80211_ATTR_SCHED_SCAN_INTERVAL must not be passed if
++ *	NL80211_ATTR_SCHED_SCAN_PLANS is defined.
++ *	If for some reason scheduled scan is aborted by the driver, all scan
++ *	plans are canceled (including scan plans that did not start yet).
+  *	Like with normal scans, if SSIDs (%NL80211_ATTR_SCAN_SSIDS)
+  *	are passed, they are used in the probe requests.  For
+  *	broadcast, a broadcast SSID must be passed (ie. an empty
+@@ -1761,6 +1770,22 @@ enum nl80211_commands {
+  * @NL80211_ATTR_REG_INDOOR: flag attribute, if set indicates that the device
+  *      is operating in an indoor environment.
+  *
++ * @NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS: maximum number of scan plans for
++ *	scheduled scan supported by the device (u32), a wiphy attribute.
++ * @NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL: maximum interval (in seconds) for
++ *	a scan plan (u32), a wiphy attribute.
++ * @NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS: maximum number of iterations in
++ *	a scan plan (u32), a wiphy attribute.
++ * @NL80211_ATTR_SCHED_SCAN_PLANS: a list of scan plans for scheduled scan.
++ *	Each scan plan defines the number of scan iterations and the interval
++ *	between scans. The last scan plan will always run infinitely,
++ *	thus it must not specify the number of iterations, only the interval
++ *	between scans. The scan plans are executed sequentially.
++ *	Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan.
 + *
 + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
 + *	transmit power to stay within regulatory limits. u32, dBi.
 + *
-+ * @NUM_NL80211_ATTR: total number of nl80211_attrs available
+  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
   * @NL80211_ATTR_MAX: highest attribute number currently defined
   * @__NL80211_ATTR_AFTER_LAST: internal use
-  */
-@@ -1973,7 +2099,7 @@ enum nl80211_attrs {
- 
- 	NL80211_ATTR_TDLS_PEER_CAPABILITY,
+@@ -2130,6 +2155,13 @@ enum nl80211_attrs {
  
--	NL80211_ATTR_IFACE_SOCKET_OWNER,
-+	NL80211_ATTR_SOCKET_OWNER,
+ 	NL80211_ATTR_REG_INDOOR,
  
- 	NL80211_ATTR_CSA_C_OFFSETS_TX,
- 	NL80211_ATTR_MAX_CSA_COUNTERS,
-@@ -1990,15 +2116,35 @@ enum nl80211_attrs {
- 
- 	NL80211_ATTR_SMPS_MODE,
- 
-+	NL80211_ATTR_OPER_CLASS,
-+
-+	NL80211_ATTR_MAC_MASK,
-+
-+	NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
-+
-+	NL80211_ATTR_EXT_FEATURES,
-+
-+	NL80211_ATTR_SURVEY_RADIO_STATS,
-+
-+	NL80211_ATTR_NETNS_FD,
-+
-+	NL80211_ATTR_SCHED_SCAN_DELAY,
-+
-+	NL80211_ATTR_REG_INDOOR,
++	NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
++	NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
++	NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
++	NL80211_ATTR_SCHED_SCAN_PLANS,
 +
 +	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +
  	/* add attributes here, update the policy in nl80211.c */
  
  	__NL80211_ATTR_AFTER_LAST,
-+	NUM_NL80211_ATTR = __NL80211_ATTR_AFTER_LAST,
- 	NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
- };
- 
- /* source-level API compatibility */
- #define NL80211_ATTR_SCAN_GENERATION NL80211_ATTR_GENERATION
- #define	NL80211_ATTR_MESH_PARAMS NL80211_ATTR_MESH_CONFIG
-+#define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
- 
- /*
-  * Allow user space programs to use #ifdef on new attributes by defining them
-@@ -2028,7 +2174,7 @@ enum nl80211_attrs {
- 
- #define NL80211_MAX_SUPP_RATES			32
- #define NL80211_MAX_SUPP_HT_RATES		77
--#define NL80211_MAX_SUPP_REG_RULES		32
-+#define NL80211_MAX_SUPP_REG_RULES		64
- #define NL80211_TKIP_DATA_OFFSET_ENCR_KEY	0
- #define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY	16
- #define NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY	24
-@@ -2064,6 +2210,8 @@ enum nl80211_attrs {
-  *	and therefore can't be created in the normal ways, use the
-  *	%NL80211_CMD_START_P2P_DEVICE and %NL80211_CMD_STOP_P2P_DEVICE
-  *	commands to create and destroy one
-+ * @NL80211_IF_TYPE_OCB: Outside Context of a BSS
-+ *	This mode corresponds to the MIB variable dot11OCBActivated=true
-  * @NL80211_IFTYPE_MAX: highest interface type number currently defined
-  * @NUM_NL80211_IFTYPES: number of defined interface types
-  *
-@@ -2083,6 +2231,7 @@ enum nl80211_iftype {
- 	NL80211_IFTYPE_P2P_CLIENT,
- 	NL80211_IFTYPE_P2P_GO,
- 	NL80211_IFTYPE_P2P_DEVICE,
-+	NL80211_IFTYPE_OCB,
- 
- 	/* keep last */
- 	NUM_NL80211_IFTYPES,
-@@ -2165,8 +2314,15 @@ struct nl80211_sta_flag_update {
-  * @NL80211_RATE_INFO_VHT_MCS: MCS index for VHT (u8)
-  * @NL80211_RATE_INFO_VHT_NSS: number of streams in VHT (u8)
-  * @NL80211_RATE_INFO_80_MHZ_WIDTH: 80 MHz VHT rate
-- * @NL80211_RATE_INFO_80P80_MHZ_WIDTH: 80+80 MHz VHT rate
-+ * @NL80211_RATE_INFO_80P80_MHZ_WIDTH: unused - 80+80 is treated the
-+ *	same as 160 for purposes of the bitrates
-  * @NL80211_RATE_INFO_160_MHZ_WIDTH: 160 MHz VHT rate
-+ * @NL80211_RATE_INFO_10_MHZ_WIDTH: 10 MHz width - note that this is
-+ *	a legacy rate and will be reported as the actual bitrate, i.e.
-+ *	half the base (20 MHz) rate
-+ * @NL80211_RATE_INFO_5_MHZ_WIDTH: 5 MHz width - note that this is
-+ *	a legacy rate and will be reported as the actual bitrate, i.e.
-+ *	a quarter of the base (20 MHz) rate
-  * @__NL80211_RATE_INFO_AFTER_LAST: internal use
-  */
- enum nl80211_rate_info {
-@@ -2181,6 +2337,8 @@ enum nl80211_rate_info {
- 	NL80211_RATE_INFO_80_MHZ_WIDTH,
- 	NL80211_RATE_INFO_80P80_MHZ_WIDTH,
- 	NL80211_RATE_INFO_160_MHZ_WIDTH,
-+	NL80211_RATE_INFO_10_MHZ_WIDTH,
-+	NL80211_RATE_INFO_5_MHZ_WIDTH,
- 
- 	/* keep last */
- 	__NL80211_RATE_INFO_AFTER_LAST,
-@@ -2225,18 +2383,24 @@ enum nl80211_sta_bss_param {
-  *
-  * @__NL80211_STA_INFO_INVALID: attribute number 0 is reserved
-  * @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs)
-- * @NL80211_STA_INFO_RX_BYTES: total received bytes (u32, from this station)
-- * @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (u32, to this station)
-- * @NL80211_STA_INFO_RX_BYTES64: total received bytes (u64, from this station)
-- * @NL80211_STA_INFO_TX_BYTES64: total transmitted bytes (u64, to this station)
-+ * @NL80211_STA_INFO_RX_BYTES: total received bytes (MPDU length)
-+ *	(u32, from this station)
-+ * @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (MPDU length)
-+ *	(u32, to this station)
-+ * @NL80211_STA_INFO_RX_BYTES64: total received bytes (MPDU length)
-+ *	(u64, from this station)
-+ * @NL80211_STA_INFO_TX_BYTES64: total transmitted bytes (MPDU length)
-+ *	(u64, to this station)
-  * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm)
-  * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute
-  * 	containing info as possible, see &enum nl80211_rate_info
-- * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station)
-- * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this
-- *	station)
-- * @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station)
-- * @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station)
-+ * @NL80211_STA_INFO_RX_PACKETS: total received packet (MSDUs and MMPDUs)
-+ *	(u32, from this station)
-+ * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (MSDUs and MMPDUs)
-+ *	(u32, to this station)
-+ * @NL80211_STA_INFO_TX_RETRIES: total retries (MPDUs) (u32, to this station)
-+ * @NL80211_STA_INFO_TX_FAILED: total failed packets (MPDUs)
-+ *	(u32, to this station)
-  * @NL80211_STA_INFO_SIGNAL_AVG: signal strength average (u8, dBm)
-  * @NL80211_STA_INFO_LLID: the station's mesh LLID
-  * @NL80211_STA_INFO_PLID: the station's mesh PLID
-@@ -2260,6 +2424,16 @@ enum nl80211_sta_bss_param {
-  *	Same format as NL80211_STA_INFO_CHAIN_SIGNAL.
-  * @NL80211_STA_EXPECTED_THROUGHPUT: expected throughput considering also the
-  *	802.11 header (u32, kbps)
-+ * @NL80211_STA_INFO_RX_DROP_MISC: RX packets dropped for unspecified reasons
-+ *	(u64)
-+ * @NL80211_STA_INFO_BEACON_RX: number of beacons received from this peer (u64)
-+ * @NL80211_STA_INFO_BEACON_SIGNAL_AVG: signal strength average
-+ *	for beacons only (u8, dBm)
-+ * @NL80211_STA_INFO_TID_STATS: per-TID statistics (see &enum nl80211_tid_stats)
-+ *	This is a nested attribute where each the inner attribute number is the
-+ *	TID+1 and the special TID 16 (i.e. value 17) is used for non-QoS frames;
-+ *	each one of those is again nested with &enum nl80211_tid_stats
-+ *	attributes carrying the actual values.
-  * @__NL80211_STA_INFO_AFTER_LAST: internal
-  * @NL80211_STA_INFO_MAX: highest possible station info attribute
+@@ -3364,6 +3396,9 @@ enum nl80211_bss_scan_width {
+  *	(not present if no beacon frame has been received yet)
+  * @NL80211_BSS_PRESP_DATA: the data in @NL80211_BSS_INFORMATION_ELEMENTS and
+  *	@NL80211_BSS_TSF is known to be from a probe response (flag attribute)
++ * @NL80211_BSS_LAST_SEEN_BOOTTIME: CLOCK_BOOTTIME timestamp when this entry
++ *	was last updated by a received frame. The value is expected to be
++ *	accurate to about 10ms. (u64, nanoseconds)
+  * @__NL80211_BSS_AFTER_LAST: internal
+  * @NL80211_BSS_MAX: highest BSS attribute
   */
-@@ -2292,6 +2466,10 @@ enum nl80211_sta_info {
- 	NL80211_STA_INFO_CHAIN_SIGNAL,
- 	NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
- 	NL80211_STA_INFO_EXPECTED_THROUGHPUT,
-+	NL80211_STA_INFO_RX_DROP_MISC,
-+	NL80211_STA_INFO_BEACON_RX,
-+	NL80211_STA_INFO_BEACON_SIGNAL_AVG,
-+	NL80211_STA_INFO_TID_STATS,
+@@ -3383,6 +3418,7 @@ enum nl80211_bss {
+ 	NL80211_BSS_CHAN_WIDTH,
+ 	NL80211_BSS_BEACON_TSF,
+ 	NL80211_BSS_PRESP_DATA,
++	NL80211_BSS_LAST_SEEN_BOOTTIME,
  
  	/* keep last */
- 	__NL80211_STA_INFO_AFTER_LAST,
-@@ -2299,6 +2477,31 @@ enum nl80211_sta_info {
+ 	__NL80211_BSS_AFTER_LAST,
+@@ -4589,4 +4625,28 @@ enum nl80211_tdls_peer_capability {
+ 	NL80211_TDLS_PEER_WMM = 1<<2,
  };
  
- /**
-+ * enum nl80211_tid_stats - per TID statistics attributes
-+ * @__NL80211_TID_STATS_INVALID: attribute number 0 is reserved
-+ * @NL80211_TID_STATS_RX_MSDU: number of MSDUs received (u64)
-+ * @NL80211_TID_STATS_TX_MSDU: number of MSDUs transmitted (or
-+ *	attempted to transmit; u64)
-+ * @NL80211_TID_STATS_TX_MSDU_RETRIES: number of retries for
-+ *	transmitted MSDUs (not counting the first attempt; u64)
-+ * @NL80211_TID_STATS_TX_MSDU_FAILED: number of failed transmitted
-+ *	MSDUs (u64)
-+ * @NUM_NL80211_TID_STATS: number of attributes here
-+ * @NL80211_TID_STATS_MAX: highest numbered attribute here
++/**
++ * enum nl80211_sched_scan_plan - scanning plan for scheduled scan
++ * @__NL80211_SCHED_SCAN_PLAN_INVALID: attribute number 0 is reserved
++ * @NL80211_SCHED_SCAN_PLAN_INTERVAL: interval between scan iterations. In
++ *	seconds (u32).
++ * @NL80211_SCHED_SCAN_PLAN_ITERATIONS: number of scan iterations in this
++ *	scan plan (u32). The last scan plan must not specify this attribute
++ *	because it will run infinitely. A value of zero is invalid as it will
++ *	make the scan plan meaningless.
++ * @NL80211_SCHED_SCAN_PLAN_MAX: highest scheduled scan plan attribute number
++ *	currently defined
++ * @__NL80211_SCHED_SCAN_PLAN_AFTER_LAST: internal use
 + */
-+enum nl80211_tid_stats {
-+	__NL80211_TID_STATS_INVALID,
-+	NL80211_TID_STATS_RX_MSDU,
-+	NL80211_TID_STATS_TX_MSDU,
-+	NL80211_TID_STATS_TX_MSDU_RETRIES,
-+	NL80211_TID_STATS_TX_MSDU_FAILED,
++enum nl80211_sched_scan_plan {
++	__NL80211_SCHED_SCAN_PLAN_INVALID,
++	NL80211_SCHED_SCAN_PLAN_INTERVAL,
++	NL80211_SCHED_SCAN_PLAN_ITERATIONS,
 +
 +	/* keep last */
-+	NUM_NL80211_TID_STATS,
-+	NL80211_TID_STATS_MAX = NUM_NL80211_TID_STATS - 1
++	__NL80211_SCHED_SCAN_PLAN_AFTER_LAST,
++	NL80211_SCHED_SCAN_PLAN_MAX =
++		__NL80211_SCHED_SCAN_PLAN_AFTER_LAST - 1
 +};
 +
-+/**
-  * enum nl80211_mpath_flags - nl80211 mesh path flags
-  *
-  * @NL80211_MPATH_FLAG_ACTIVE: the mesh path is active
-@@ -2631,6 +2834,11 @@ enum nl80211_sched_scan_match_attr {
-  * @NL80211_RRF_AUTO_BW: maximum available bandwidth should be calculated
-  *	base on contiguous rules and wider channels will be allowed to cross
-  *	multiple contiguous/overlapping frequency ranges.
-+ * @NL80211_RRF_GO_CONCURRENT: See &NL80211_FREQUENCY_ATTR_GO_CONCURRENT
-+ * @NL80211_RRF_NO_HT40MINUS: channels can't be used in HT40- operation
-+ * @NL80211_RRF_NO_HT40PLUS: channels can't be used in HT40+ operation
-+ * @NL80211_RRF_NO_80MHZ: 80MHz operation not allowed
-+ * @NL80211_RRF_NO_160MHZ: 160MHz operation not allowed
-  */
- enum nl80211_reg_rule_flags {
- 	NL80211_RRF_NO_OFDM		= 1<<0,
-@@ -2643,11 +2851,18 @@ enum nl80211_reg_rule_flags {
- 	NL80211_RRF_NO_IR		= 1<<7,
- 	__NL80211_RRF_NO_IBSS		= 1<<8,
- 	NL80211_RRF_AUTO_BW		= 1<<11,
-+	NL80211_RRF_GO_CONCURRENT	= 1<<12,
-+	NL80211_RRF_NO_HT40MINUS	= 1<<13,
-+	NL80211_RRF_NO_HT40PLUS		= 1<<14,
-+	NL80211_RRF_NO_80MHZ		= 1<<15,
-+	NL80211_RRF_NO_160MHZ		= 1<<16,
- };
- 
- #define NL80211_RRF_PASSIVE_SCAN	NL80211_RRF_NO_IR
- #define NL80211_RRF_NO_IBSS		NL80211_RRF_NO_IR
- #define NL80211_RRF_NO_IR		NL80211_RRF_NO_IR
-+#define NL80211_RRF_NO_HT40		(NL80211_RRF_NO_HT40MINUS |\
-+					 NL80211_RRF_NO_HT40PLUS)
- 
- /* For backport compatibility with older userspace */
- #define NL80211_RRF_NO_IR_ALL		(NL80211_RRF_NO_IR | __NL80211_RRF_NO_IBSS)
-@@ -2700,16 +2915,18 @@ enum nl80211_user_reg_hint_type {
-  * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel
-  * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm)
-  * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used
-- * @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio
-- *	spent on this channel
-- * @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary
-+ * @NL80211_SURVEY_INFO_TIME: amount of time (in ms) that the radio
-+ *	was turned on (on channel or globally)
-+ * @NL80211_SURVEY_INFO_TIME_BUSY: amount of the time the primary
-  *	channel was sensed busy (either due to activity or energy detect)
-- * @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension
-+ * @NL80211_SURVEY_INFO_TIME_EXT_BUSY: amount of time the extension
-  *	channel was sensed busy
-- * @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent
-- *	receiving data
-- * @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent
-- *	transmitting data
-+ * @NL80211_SURVEY_INFO_TIME_RX: amount of time the radio spent
-+ *	receiving data (on channel or globally)
-+ * @NL80211_SURVEY_INFO_TIME_TX: amount of time the radio spent
-+ *	transmitting data (on channel or globally)
-+ * @NL80211_SURVEY_INFO_TIME_SCAN: time the radio spent for scan
-+ *	(on this channel or globally)
-  * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
-  *	currently defined
-  * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
-@@ -2719,17 +2936,25 @@ enum nl80211_survey_info {
- 	NL80211_SURVEY_INFO_FREQUENCY,
- 	NL80211_SURVEY_INFO_NOISE,
- 	NL80211_SURVEY_INFO_IN_USE,
--	NL80211_SURVEY_INFO_CHANNEL_TIME,
--	NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
--	NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
--	NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
--	NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
-+	NL80211_SURVEY_INFO_TIME,
-+	NL80211_SURVEY_INFO_TIME_BUSY,
-+	NL80211_SURVEY_INFO_TIME_EXT_BUSY,
-+	NL80211_SURVEY_INFO_TIME_RX,
-+	NL80211_SURVEY_INFO_TIME_TX,
-+	NL80211_SURVEY_INFO_TIME_SCAN,
- 
- 	/* keep last */
- 	__NL80211_SURVEY_INFO_AFTER_LAST,
- 	NL80211_SURVEY_INFO_MAX = __NL80211_SURVEY_INFO_AFTER_LAST - 1
- };
- 
-+/* keep old names for compatibility */
-+#define NL80211_SURVEY_INFO_CHANNEL_TIME		NL80211_SURVEY_INFO_TIME
-+#define NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY		NL80211_SURVEY_INFO_TIME_BUSY
-+#define NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY	NL80211_SURVEY_INFO_TIME_EXT_BUSY
-+#define NL80211_SURVEY_INFO_CHANNEL_TIME_RX		NL80211_SURVEY_INFO_TIME_RX
-+#define NL80211_SURVEY_INFO_CHANNEL_TIME_TX		NL80211_SURVEY_INFO_TIME_TX
-+
- /**
-  * enum nl80211_mntr_flags - monitor configuration flags
-  *
-@@ -2894,7 +3119,8 @@ enum nl80211_mesh_power_mode {
-  *
-  * @NL80211_MESHCONF_PLINK_TIMEOUT: If no tx activity is seen from a STA we've
-  *	established peering with for longer than this time (in seconds), then
-- *	remove it from the STA's list of peers.  Default is 30 minutes.
-+ *	remove it from the STA's list of peers. You may set this to 0 to disable
-+ *	the removal of the STA. Default is 30 minutes.
-  *
-  * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
-  */
-@@ -3166,6 +3392,9 @@ enum nl80211_bss {
- /**
-  * enum nl80211_bss_status - BSS "status"
-  * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS.
-+ *	Note that this is no longer used since cfg80211 no longer
-+ *	keeps track of whether or not authentication was done with
-+ *	a given BSS.
-  * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS.
-  * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS.
-  *
-@@ -3379,6 +3608,8 @@ enum nl80211_ps_state {
-  *	interval in which %NL80211_ATTR_CQM_TXE_PKTS and
-  *	%NL80211_ATTR_CQM_TXE_RATE must be satisfied before generating an
-  *	%NL80211_CMD_NOTIFY_CQM. Set to 0 to turn off TX error reporting.
-+ * @NL80211_ATTR_CQM_BEACON_LOSS_EVENT: flag attribute that's set in a beacon
-+ *	loss event
-  * @__NL80211_ATTR_CQM_AFTER_LAST: internal
-  * @NL80211_ATTR_CQM_MAX: highest key attribute
-  */
-@@ -3391,6 +3622,7 @@ enum nl80211_attr_cqm {
- 	NL80211_ATTR_CQM_TXE_RATE,
- 	NL80211_ATTR_CQM_TXE_PKTS,
- 	NL80211_ATTR_CQM_TXE_INTVL,
-+	NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
- 
- 	/* keep last */
- 	__NL80211_ATTR_CQM_AFTER_LAST,
-@@ -3403,9 +3635,7 @@ enum nl80211_attr_cqm {
-  *      configured threshold
-  * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the
-  *      configured threshold
-- * @NL80211_CQM_RSSI_BEACON_LOSS_EVENT: The device experienced beacon loss.
-- *	(Note that deauth/disassoc will still follow if the AP is not
-- *	available. This event might get used as roaming event, etc.)
-+ * @NL80211_CQM_RSSI_BEACON_LOSS_EVENT: (reserved, never sent)
-  */
- enum nl80211_cqm_rssi_threshold_event {
- 	NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
-@@ -3492,6 +3722,8 @@ struct nl80211_pattern_support {
-  * @NL80211_WOWLAN_TRIG_ANY: wake up on any activity, do not really put
-  *	the chip into a special state -- works best with chips that have
-  *	support for low-power operation already (flag)
-+ *	Note that this mode is incompatible with all of the others, if
-+ *	any others are even supported by the device.
-  * @NL80211_WOWLAN_TRIG_DISCONNECT: wake up on disconnect, the way disconnect
-  *	is detected is implementation-specific (flag)
-  * @NL80211_WOWLAN_TRIG_MAGIC_PKT: wake up on magic packet (6x 0xff, followed
-@@ -3545,6 +3777,28 @@ struct nl80211_pattern_support {
-  * @NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS: For wakeup reporting only,
-  *	the TCP connection ran out of tokens to use for data to send to the
-  *	service
-+ * @NL80211_WOWLAN_TRIG_NET_DETECT: wake up when a configured network
-+ *	is detected.  This is a nested attribute that contains the
-+ *	same attributes used with @NL80211_CMD_START_SCHED_SCAN.  It
-+ *	specifies how the scan is performed (e.g. the interval, the
-+ *	channels to scan and the initial delay) as well as the scan
-+ *	results that will trigger a wake (i.e. the matchsets).  This
-+ *	attribute is also sent in a response to
-+ *	@NL80211_CMD_GET_WIPHY, indicating the number of match sets
-+ *	supported by the driver (u32).
-+ * @NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS: nested attribute
-+ *	containing an array with information about what triggered the
-+ *	wake up.  If no elements are present in the array, it means
-+ *	that the information is not available.  If more than one
-+ *	element is present, it means that more than one match
-+ *	occurred.
-+ *	Each element in the array is a nested attribute that contains
-+ *	one optional %NL80211_ATTR_SSID attribute and one optional
-+ *	%NL80211_ATTR_SCAN_FREQUENCIES attribute.  At least one of
-+ *	these attributes must be present.  If
-+ *	%NL80211_ATTR_SCAN_FREQUENCIES contains more than one
-+ *	frequency, it means that the match occurred in more than one
-+ *	channel.
-  * @NUM_NL80211_WOWLAN_TRIG: number of wake on wireless triggers
-  * @MAX_NL80211_WOWLAN_TRIG: highest wowlan trigger attribute number
-  *
-@@ -3570,6 +3824,8 @@ enum nl80211_wowlan_triggers {
- 	NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH,
- 	NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST,
- 	NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS,
-+	NL80211_WOWLAN_TRIG_NET_DETECT,
-+	NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS,
- 
- 	/* keep last */
- 	NUM_NL80211_WOWLAN_TRIG,
-@@ -4042,6 +4298,27 @@ enum nl80211_ap_sme_features {
-  *	multiplexing powersave, ie. can turn off all but one chain
-  *	and then wake the rest up as required after, for example,
-  *	rts/cts handshake.
-+ * @NL80211_FEATURE_SUPPORTS_WMM_ADMISSION: the device supports setting up WMM
-+ *	TSPEC sessions (TID aka TSID 0-7) with the %NL80211_CMD_ADD_TX_TS
-+ *	command. Standard IEEE 802.11 TSPEC setup is not yet supported, it
-+ *	needs to be able to handle Block-Ack agreements and other things.
-+ * @NL80211_FEATURE_MAC_ON_CREATE: Device supports configuring
-+ *	the vif's MAC address upon creation.
-+ *	See 'macaddr' field in the vif_params (cfg80211.h).
-+ * @NL80211_FEATURE_TDLS_CHANNEL_SWITCH: Driver supports channel switching when
-+ *	operating as a TDLS peer.
-+ * @NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR: This device/driver supports using a
-+ *	random MAC address during scan (if the device is unassociated); the
-+ *	%NL80211_SCAN_FLAG_RANDOM_ADDR flag may be set for scans and the MAC
-+ *	address mask/value will be used.
-+ * @NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR: This device/driver supports
-+ *	using a random MAC address for every scan iteration during scheduled
-+ *	scan (while not associated), the %NL80211_SCAN_FLAG_RANDOM_ADDR may
-+ *	be set for scheduled scan and the MAC address mask/value will be used.
-+ * @NL80211_FEATURE_ND_RANDOM_MAC_ADDR: This device/driver supports using a
-+ *	random MAC address for every scan iteration during "net detect", i.e.
-+ *	scan in unassociated WoWLAN, the %NL80211_SCAN_FLAG_RANDOM_ADDR may
-+ *	be set for scheduled scan and the MAC address mask/value will be used.
-  */
- enum nl80211_feature_flags {
- 	NL80211_FEATURE_SK_TX_STATUS			= 1 << 0,
-@@ -4070,6 +4347,27 @@ enum nl80211_feature_flags {
- 	NL80211_FEATURE_ACKTO_ESTIMATION		= 1 << 23,
- 	NL80211_FEATURE_STATIC_SMPS			= 1 << 24,
- 	NL80211_FEATURE_DYNAMIC_SMPS			= 1 << 25,
-+	NL80211_FEATURE_SUPPORTS_WMM_ADMISSION		= 1 << 26,
-+	NL80211_FEATURE_MAC_ON_CREATE			= 1 << 27,
-+	NL80211_FEATURE_TDLS_CHANNEL_SWITCH		= 1 << 28,
-+	NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR		= 1 << 29,
-+	NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR	= 1 << 30,
-+	NL80211_FEATURE_ND_RANDOM_MAC_ADDR		= 1 << 31,
-+};
-+
-+/**
-+ * enum nl80211_ext_feature_index - bit index of extended features.
-+ * @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates.
-+ *
-+ * @NUM_NL80211_EXT_FEATURES: number of extended features.
-+ * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-+ */
-+enum nl80211_ext_feature_index {
-+	NL80211_EXT_FEATURE_VHT_IBSS,
-+
-+	/* add new features before the definition below */
-+	NUM_NL80211_EXT_FEATURES,
-+	MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1
- };
- 
- /**
-@@ -4118,11 +4416,21 @@ enum nl80211_connect_failed_reason {
-  *	dangerous because will destroy stations performance as a lot of frames
-  *	will be lost while scanning off-channel, therefore it must be used only
-  *	when really needed
-+ * @NL80211_SCAN_FLAG_RANDOM_ADDR: use a random MAC address for this scan (or
-+ *	for scheduled scan: a different one for every scan iteration). When the
-+ *	flag is set, depending on device capabilities the @NL80211_ATTR_MAC and
-+ *	@NL80211_ATTR_MAC_MASK attributes may also be given in which case only
-+ *	the masked bits will be preserved from the MAC address and the remainder
-+ *	randomised. If the attributes are not given full randomisation (46 bits,
-+ *	locally administered 1, multicast 0) is assumed.
-+ *	This flag must not be requested when the feature isn't supported, check
-+ *	the nl80211 feature flags for the device.
-  */
- enum nl80211_scan_flags {
- 	NL80211_SCAN_FLAG_LOW_PRIORITY			= 1<<0,
- 	NL80211_SCAN_FLAG_FLUSH				= 1<<1,
- 	NL80211_SCAN_FLAG_AP				= 1<<2,
-+	NL80211_SCAN_FLAG_RANDOM_ADDR			= 1<<3,
- };
- 
- /**
+ #endif /* __LINUX_NL80211_H */
diff --git a/package/network/utils/iw/patches/120-antenna_gain.patch b/package/network/utils/iw/patches/120-antenna_gain.patch
index cf6a3fa221664dff02d16e90f55eb7cc622ec53d..6a45c70b8082fa86a4fb62464c9c5fb5207ba7fd 100644
--- a/package/network/utils/iw/patches/120-antenna_gain.patch
+++ b/package/network/utils/iw/patches/120-antenna_gain.patch
@@ -1,12 +1,11 @@
 --- a/phy.c
 +++ b/phy.c
-@@ -495,3 +495,31 @@ COMMAND(set, antenna, "<bitmap> | all | 
+@@ -524,3 +524,30 @@ COMMAND(set, antenna, "<bitmap> | all |
  	NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_antenna,
  	"Set a bitmap of allowed antennas to use for TX and RX.\n"
  	"The driver may reject antenna configurations it cannot support.");
 +
 +static int handle_antenna_gain(struct nl80211_state *state,
-+			       struct nl_cb *cb,
 +			       struct nl_msg *msg,
 +			       int argc, char **argv,
 +			       enum id_input id)
diff --git a/package/network/utils/iw/patches/200-reduce_size.patch b/package/network/utils/iw/patches/200-reduce_size.patch
index 882cf89f8d4a9a6c7b1ed7a73eeeaa217a6e6208..dea24fb4956d7ff4289822a250464cbc38e45908 100644
--- a/package/network/utils/iw/patches/200-reduce_size.patch
+++ b/package/network/utils/iw/patches/200-reduce_size.patch
@@ -2,18 +2,56 @@
 +++ b/Makefile
 @@ -15,8 +15,8 @@ CFLAGS += -Wall -Wundef -Wstrict-prototy
  OBJS = iw.o genl.o event.o info.o phy.o \
- 	interface.o ibss.o station.o survey.o util.o \
- 	mesh.o mpath.o scan.o reg.o version.o \
+ 	interface.o ibss.o station.o survey.o util.o ocb.o \
+ 	mesh.o mpath.o mpp.o scan.o reg.o version.o \
 -	reason.o status.o connect.o link.o offch.o ps.o cqm.o \
--	bitrate.o wowlan.o coalesce.o roc.o p2p.o
-+	reason.o status.o connect.o link.o ps.o \
-+	bitrate.o
+-	bitrate.o wowlan.o coalesce.o roc.o p2p.o vendor.o
++	reason.o status.o link.o offch.o ps.o cqm.o \
++	bitrate.o vendor.o
  OBJS += sections.o
  
  OBJS-$(HWSIM) += hwsim.o
+--- a/event.c
++++ b/event.c
+@@ -342,6 +342,7 @@ static int print_event(struct nl_msg *ms
+ 	}
+ 
+ 	switch (gnlh->cmd) {
++#if 0
+ 	case NL80211_CMD_NEW_WIPHY:
+ 		printf("renamed to %s\n", nla_get_string(tb[NL80211_ATTR_WIPHY_NAME]));
+ 		break;
+@@ -376,6 +377,7 @@ static int print_event(struct nl_msg *ms
+ 	case NL80211_CMD_SCHED_SCAN_RESULTS:
+ 		printf("got scheduled scan results\n");
+ 		break;
++#endif
+ 	case NL80211_CMD_REG_CHANGE:
+ 		printf("regulatory domain change: ");
+ 
+@@ -454,6 +456,7 @@ static int print_event(struct nl_msg *ms
+ 		mac_addr_n2a(macbuf, nla_data(tb[NL80211_ATTR_MAC]));
+ 		printf("del station %s\n", macbuf);
+ 		break;
++#if 0
+ 	case NL80211_CMD_JOIN_IBSS:
+ 		mac_addr_n2a(macbuf, nla_data(tb[NL80211_ATTR_MAC]));
+ 		printf("IBSS %s joined\n", macbuf);
+@@ -610,9 +613,9 @@ static int print_event(struct nl_msg *ms
+ 	case NL80211_CMD_DEL_WIPHY:
+ 		printf("delete wiphy\n");
+ 		break;
++#endif
+ 	default:
+-		printf("unknown event %d (%s)\n",
+-		       gnlh->cmd, command_name(gnlh->cmd));
++		printf("unknown event %d\n", gnlh->cmd);
+ 		break;
+ 	}
+ 
 --- a/info.c
 +++ b/info.c
-@@ -207,6 +207,7 @@ next:
+@@ -219,6 +219,7 @@ next:
  				}
  			}
  
@@ -21,7 +59,7 @@
  			if (tb_band[NL80211_BAND_ATTR_RATES]) {
  			printf("\t\tBitrates (non-HT):\n");
  			nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
-@@ -223,6 +224,7 @@ next:
+@@ -235,6 +236,7 @@ next:
  				printf("\n");
  			}
  			}
@@ -29,7 +67,7 @@
  		}
  	}
  
-@@ -273,6 +275,7 @@ next:
+@@ -291,6 +293,7 @@ next:
  		printf("\tCoverage class: %d (up to %dm)\n", coverage, 450 * coverage);
  	}
  
@@ -37,7 +75,7 @@
  	if (tb_msg[NL80211_ATTR_CIPHER_SUITES]) {
  		int num = nla_len(tb_msg[NL80211_ATTR_CIPHER_SUITES]) / sizeof(__u32);
  		int i;
-@@ -284,6 +287,7 @@ next:
+@@ -302,6 +305,7 @@ next:
  					cipher_name(ciphers[i]));
  		}
  	}
@@ -45,7 +83,7 @@
  
  	if (tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX] &&
  	    tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX])
-@@ -303,11 +307,13 @@ next:
+@@ -321,11 +325,13 @@ next:
  			printf("\t\t * %s\n", iftype_name(nla_type(nl_mode)));
  	}
  
@@ -59,7 +97,7 @@
  
  	if (tb_msg[NL80211_ATTR_INTERFACE_COMBINATIONS]) {
  		struct nlattr *nl_combi;
-@@ -404,6 +410,7 @@ broken_combination:
+@@ -422,6 +428,7 @@ broken_combination:
  			printf("\tinterface combinations are not supported\n");
  	}
  
@@ -67,7 +105,7 @@
  	if (tb_msg[NL80211_ATTR_SUPPORTED_COMMANDS]) {
  		printf("\tSupported commands:\n");
  		nla_for_each_nested(nl_cmd, tb_msg[NL80211_ATTR_SUPPORTED_COMMANDS], rem_cmd)
-@@ -496,6 +503,7 @@ broken_combination:
+@@ -518,6 +525,7 @@ broken_combination:
  				printf("\t\t * wake up on TCP connection\n");
  		}
  	}
@@ -75,7 +113,7 @@
  
  	if (tb_msg[NL80211_ATTR_ROAM_SUPPORT])
  		printf("\tDevice supports roaming.\n");
-@@ -532,6 +540,7 @@ broken_combination:
+@@ -554,6 +562,7 @@ broken_combination:
  		}
  	}
  
@@ -83,23 +121,23 @@
  	if (tb_msg[NL80211_ATTR_FEATURE_FLAGS]) {
  		unsigned int features = nla_get_u32(tb_msg[NL80211_ATTR_FEATURE_FLAGS]);
  
-@@ -584,6 +593,7 @@ broken_combination:
- 		if (features & NL80211_FEATURE_DYNAMIC_SMPS)
- 			printf("\tDevice supports dynamic SMPS\n");
+@@ -612,6 +621,7 @@ broken_combination:
+ 		if (features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)
+ 			printf("\tDevice supports TDLS channel switching\n");
  	}
 +#endif
  
- 	if (tb_msg[NL80211_ATTR_TDLS_SUPPORT])
- 		printf("\tDevice supports T-DLS.\n");
-@@ -633,6 +643,7 @@ TOPLEVEL(list, NULL, NL80211_CMD_GET_WIP
+ 	if (tb_msg[NL80211_ATTR_EXT_FEATURES]) {
+ 		struct nlattr *tb = tb_msg[NL80211_ATTR_EXT_FEATURES];
+@@ -668,6 +678,7 @@ TOPLEVEL(list, NULL, NL80211_CMD_GET_WIP
  	 "List all wireless devices and their capabilities.");
  TOPLEVEL(phy, NULL, NL80211_CMD_GET_WIPHY, NLM_F_DUMP, CIB_NONE, handle_info, NULL);
  
 +#if 0
- static int handle_commands(struct nl80211_state *state,
- 			   struct nl_cb *cb, struct nl_msg *msg,
+ static int handle_commands(struct nl80211_state *state, struct nl_msg *msg,
  			   int argc, char **argv, enum id_input id)
-@@ -645,6 +656,7 @@ static int handle_commands(struct nl8021
+ {
+@@ -679,6 +690,7 @@ static int handle_commands(struct nl8021
  }
  TOPLEVEL(commands, NULL, NL80211_CMD_GET_WIPHY, 0, CIB_NONE, handle_commands,
  	 "list all known commands and their decimal & hex value");
@@ -107,3 +145,111 @@
  
  static int print_feature_handler(struct nl_msg *msg, void *arg)
  {
+--- a/scan.c
++++ b/scan.c
+@@ -1081,6 +1081,7 @@ static void print_ht_op(const uint8_t ty
+ 	printf("\t\t * secondary channel offset: %s\n",
+ 		ht_secondary_offset[data[1] & 0x3]);
+ 	printf("\t\t * STA channel width: %s\n", sta_chan_width[(data[1] & 0x4)>>2]);
++	return;
+ 	printf("\t\t * RIFS: %d\n", (data[1] & 0x8)>>3);
+ 	printf("\t\t * HT protection: %s\n", protection[data[2] & 0x3]);
+ 	printf("\t\t * non-GF present: %d\n", (data[2] & 0x4) >> 2);
+@@ -1312,6 +1313,13 @@ static void print_ie(const struct ie_pri
+ 
+ static const struct ie_print ieprinters[] = {
+ 	[0] = { "SSID", print_ssid, 0, 32, BIT(PRINT_SCAN) | BIT(PRINT_LINK), },
++	[45] = { "HT capabilities", print_ht_capa, 26, 26, BIT(PRINT_SCAN), },
++	[48] = { "RSN", print_rsn, 2, 255, BIT(PRINT_SCAN), },
++	[61] = { "HT operation", print_ht_op, 22, 22, BIT(PRINT_SCAN), },
++	[62] = { "Secondary Channel Offset", print_secchan_offs, 1, 1, BIT(PRINT_SCAN), },
++	[191] = { "VHT capabilities", print_vht_capa, 12, 255, BIT(PRINT_SCAN), },
++	[192] = { "VHT operation", print_vht_oper, 5, 255, BIT(PRINT_SCAN), },
++#if 0
+ 	[1] = { "Supported rates", print_supprates, 0, 255, BIT(PRINT_SCAN), },
+ 	[3] = { "DS Parameter set", print_ds, 1, 1, BIT(PRINT_SCAN), },
+ 	[5] = { "TIM", print_tim, 4, 255, BIT(PRINT_SCAN), },
+@@ -1321,14 +1329,8 @@ static const struct ie_print ieprinters[
+ 	[32] = { "Power constraint", print_powerconstraint, 1, 1, BIT(PRINT_SCAN), },
+ 	[35] = { "TPC report", print_tpcreport, 2, 2, BIT(PRINT_SCAN), },
+ 	[42] = { "ERP", print_erp, 1, 255, BIT(PRINT_SCAN), },
+-	[45] = { "HT capabilities", print_ht_capa, 26, 26, BIT(PRINT_SCAN), },
+ 	[47] = { "ERP D4.0", print_erp, 1, 255, BIT(PRINT_SCAN), },
+ 	[74] = { "Overlapping BSS scan params", print_obss_scan_params, 14, 255, BIT(PRINT_SCAN), },
+-	[61] = { "HT operation", print_ht_op, 22, 22, BIT(PRINT_SCAN), },
+-	[62] = { "Secondary Channel Offset", print_secchan_offs, 1, 1, BIT(PRINT_SCAN), },
+-	[191] = { "VHT capabilities", print_vht_capa, 12, 255, BIT(PRINT_SCAN), },
+-	[192] = { "VHT operation", print_vht_oper, 5, 255, BIT(PRINT_SCAN), },
+-	[48] = { "RSN", print_rsn, 2, 255, BIT(PRINT_SCAN), },
+ 	[50] = { "Extended supported rates", print_supprates, 0, 255, BIT(PRINT_SCAN), },
+ 	[113] = { "MESH Configuration", print_mesh_conf, 7, 7, BIT(PRINT_SCAN), },
+ 	[114] = { "MESH ID", print_ssid, 0, 32, BIT(PRINT_SCAN) | BIT(PRINT_LINK), },
+@@ -1336,6 +1338,7 @@ static const struct ie_print ieprinters[
+ 	[107] = { "802.11u Interworking", print_interworking, 0, 255, BIT(PRINT_SCAN), },
+ 	[108] = { "802.11u Advertisement", print_11u_advert, 0, 255, BIT(PRINT_SCAN), },
+ 	[111] = { "802.11u Roaming Consortium", print_11u_rcon, 0, 255, BIT(PRINT_SCAN), },
++#endif
+ };
+ 
+ static void print_wifi_wpa(const uint8_t type, uint8_t len, const uint8_t *data)
+@@ -1767,6 +1770,7 @@ void print_ies(unsigned char *ie, int ie
+ 		    ieprinters[ie[0]].name &&
+ 		    ieprinters[ie[0]].flags & BIT(ptype)) {
+ 			print_ie(&ieprinters[ie[0]], ie[0], ie[1], ie + 2);
++#if 0
+ 		} else if (ie[0] == 221 /* vendor */) {
+ 			print_vendor(ie[1], ie + 2, unknown, ptype);
+ 		} else if (unknown) {
+@@ -1776,6 +1780,7 @@ void print_ies(unsigned char *ie, int ie
+ 			for (i=0; i<ie[1]; i++)
+ 				printf(" %.2x", ie[2+i]);
+ 			printf("\n");
++#endif
+ 		}
+ 		ielen -= ie[1] + 2;
+ 		ie += ie[1] + 2;
+@@ -1816,6 +1821,7 @@ static void print_capa_non_dmg(__u16 cap
+ 		printf(" ESS");
+ 	if (capa & WLAN_CAPABILITY_IBSS)
+ 		printf(" IBSS");
++#if 0
+ 	if (capa & WLAN_CAPABILITY_CF_POLLABLE)
+ 		printf(" CfPollable");
+ 	if (capa & WLAN_CAPABILITY_CF_POLL_REQUEST)
+@@ -1844,6 +1850,7 @@ static void print_capa_non_dmg(__u16 cap
+ 		printf(" DelayedBACK");
+ 	if (capa & WLAN_CAPABILITY_IMM_BACK)
+ 		printf(" ImmediateBACK");
++#endif
+ }
+ 
+ static int print_bss_handler(struct nl_msg *msg, void *arg)
+@@ -1922,8 +1929,10 @@ static int print_bss_handler(struct nl_m
+ 	if (bss[NL80211_BSS_FREQUENCY]) {
+ 		int freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]);
+ 		printf("\tfreq: %d\n", freq);
++#if 0
+ 		if (freq > 45000)
+ 			is_dmg = true;
++#endif
+ 	}
+ 	if (bss[NL80211_BSS_BEACON_INTERVAL])
+ 		printf("\tbeacon interval: %d TUs\n",
+--- a/util.c
++++ b/util.c
+@@ -267,6 +267,7 @@ static const char *commands[NL80211_CMD_
+ 
+ static char cmdbuf[100];
+ 
++#if 0
+ const char *command_name(enum nl80211_commands cmd)
+ {
+ 	if (cmd <= NL80211_CMD_MAX && commands[cmd])
+@@ -274,6 +275,7 @@ const char *command_name(enum nl80211_co
+ 	sprintf(cmdbuf, "Unknown command (%d)", cmd);
+ 	return cmdbuf;
+ }
++#endif
+ 
+ int ieee80211_channel_to_frequency(int chan, enum nl80211_band band)
+ {
diff --git a/package/network/utils/iw/patches/300-display_interface_TX_power.patch b/package/network/utils/iw/patches/300-display_interface_TX_power.patch
new file mode 100644
index 0000000000000000000000000000000000000000..574c490318d03d09f6c6762be892b0814718dbbe
--- /dev/null
+++ b/package/network/utils/iw/patches/300-display_interface_TX_power.patch
@@ -0,0 +1,32 @@
+From: =?utf-8?q?Rafa=C5=82_Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 1 Sep 2015 09:55:52 +0200
+Subject: iw: display interface TX power if available
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+[print dBm]
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+ interface.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/interface.c b/interface.c
+index 73ccecd..4f0821d 100644
+--- a/interface.c
++++ b/interface.c
+@@ -368,6 +368,13 @@ static int print_iface_handler(struct nl_msg *msg, void *arg)
+ 		printf("\n");
+ 	}
+ 
++	if (tb_msg[NL80211_ATTR_WIPHY_TX_POWER_LEVEL]) {
++		uint32_t txp = nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_TX_POWER_LEVEL]);
++
++		printf("%s\ttxpower %d.%.2d dBm\n",
++		       indent, txp / 100, txp % 100);
++	}
++
+ 	return NL_SKIP;
+ }
+ 
diff --git a/package/network/utils/iw/patches/301-ibss_add_VHT80.patch b/package/network/utils/iw/patches/301-ibss_add_VHT80.patch
new file mode 100644
index 0000000000000000000000000000000000000000..709fbb29146b3fe80f7af240d04dec8f5e96795a
--- /dev/null
+++ b/package/network/utils/iw/patches/301-ibss_add_VHT80.patch
@@ -0,0 +1,104 @@
+From: "Janusz.Dziedzic@tieto.com" <Janusz.Dziedzic@tieto.com>
+Date: Thu, 10 Sep 2015 12:04:13 +0200
+Subject: ibss: add VHT80 support for IBSS
+
+Add VHT80 support for IBSS.
+
+eg. iw wlan0 ibss join 5180 80MHZ
+    iw wlan0 ibbs join 5220 80MHZ
+
+Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
+[fix formatting]
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+ ibss.c | 49 +++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 41 insertions(+), 8 deletions(-)
+
+diff --git a/ibss.c b/ibss.c
+index 7a0b707..a99a262 100644
+--- a/ibss.c
++++ b/ibss.c
+@@ -16,6 +16,39 @@
+ 
+ SECTION(ibss);
+ 
++struct chanmode {
++	const char *name;
++	unsigned int width;
++	int freq1_diff;
++	int chantype; /* for older kernel */
++};
++
++static int get_cf1(const struct chanmode *chanmode, unsigned long freq)
++{
++	int cf1 = freq, j;
++	int vht80[] = { 5180, 5260, 5500, 5580, 5660, 5745 };
++
++	switch (chanmode->width) {
++	case NL80211_CHAN_WIDTH_80:
++	        /* setup center_freq1 */
++		for (j = 0; j < ARRAY_SIZE(vht80); j++) {
++			if (freq >= vht80[j] && freq < vht80[j] + 80)
++				break;
++		}
++
++		if (j == ARRAY_SIZE(vht80))
++			break;
++
++		cf1 = vht80[j] + 30;
++		break;
++	default:
++		cf1 = freq + chanmode->freq1_diff;
++		break;
++	}
++
++	return cf1;
++}
++
+ static int join_ibss(struct nl80211_state *state,
+ 		     struct nl_msg *msg,
+ 		     int argc, char **argv,
+@@ -30,12 +63,8 @@ static int join_ibss(struct nl80211_state *state,
+ 	int bintval;
+ 	int i;
+ 	unsigned long freq;
+-	static const struct {
+-		const char *name;
+-		unsigned int width;
+-		int freq1_diff;
+-		int chantype; /* for older kernel */
+-	} *chanmode_selected = NULL, chanmode[] = {
++	const struct chanmode *chanmode_selected = NULL;
++	static const struct chanmode chanmode[] = {
+ 		{ .name = "HT20",
+ 		  .width = NL80211_CHAN_WIDTH_20,
+ 		  .freq1_diff = 0,
+@@ -60,6 +89,10 @@ static int join_ibss(struct nl80211_state *state,
+ 		  .width = NL80211_CHAN_WIDTH_10,
+ 		  .freq1_diff = 0,
+ 		  .chantype = -1 },
++		{ .name = "80MHZ",
++		  .width = NL80211_CHAN_WIDTH_80,
++		  .freq1_diff = 0,
++		  .chantype = -1 },
+ 	};
+ 
+ 	if (argc < 2)
+@@ -90,7 +123,7 @@ static int join_ibss(struct nl80211_state *state,
+ 			NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH,
+ 				    chanmode_selected->width);
+ 			NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1,
+-				    freq + chanmode_selected->freq1_diff);
++				    get_cf1(chanmode_selected, freq));
+ 			if (chanmode_selected->chantype != -1)
+ 				NLA_PUT_U32(msg,
+ 					    NL80211_ATTR_WIPHY_CHANNEL_TYPE,
+@@ -192,7 +225,7 @@ COMMAND(ibss, leave, NULL,
+ 	NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
+ 	"Leave the current IBSS cell.");
+ COMMAND(ibss, join,
+-	"<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
++	"<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ|80MHZ] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
+ 	" [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
+ 	"[key d:0:abcde]",
+ 	NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
diff --git a/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch b/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch
new file mode 100644
index 0000000000000000000000000000000000000000..fc4442792d4e55d14cfd85823202755b3c4678c0
--- /dev/null
+++ b/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch
@@ -0,0 +1,41 @@
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Fri, 18 Sep 2015 11:11:38 +0200
+Subject: ibss: use correct "MHz" instead of "MHZ"
+
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+ ibss.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/ibss.c b/ibss.c
+index a99a262..23bda70 100644
+--- a/ibss.c
++++ b/ibss.c
+@@ -81,15 +81,15 @@ static int join_ibss(struct nl80211_state *state,
+ 		  .width = NL80211_CHAN_WIDTH_20_NOHT,
+ 		  .freq1_diff = 0,
+ 		  .chantype = NL80211_CHAN_NO_HT },
+-		{ .name = "5MHZ",
++		{ .name = "5MHz",
+ 		  .width = NL80211_CHAN_WIDTH_5,
+ 		  .freq1_diff = 0,
+ 		  .chantype = -1 },
+-		{ .name = "10MHZ",
++		{ .name = "10MHz",
+ 		  .width = NL80211_CHAN_WIDTH_10,
+ 		  .freq1_diff = 0,
+ 		  .chantype = -1 },
+-		{ .name = "80MHZ",
++		{ .name = "80MHz",
+ 		  .width = NL80211_CHAN_WIDTH_80,
+ 		  .freq1_diff = 0,
+ 		  .chantype = -1 },
+@@ -225,7 +225,7 @@ COMMAND(ibss, leave, NULL,
+ 	NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
+ 	"Leave the current IBSS cell.");
+ COMMAND(ibss, join,
+-	"<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ|80MHZ] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
++	"<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHz|10MHz|80MHz] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
+ 	" [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
+ 	"[key d:0:abcde]",
+ 	NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
diff --git a/package/network/utils/iw/patches/303-mesh_add_VHT80.patch b/package/network/utils/iw/patches/303-mesh_add_VHT80.patch
new file mode 100644
index 0000000000000000000000000000000000000000..fe8dc21a19db12b056efcaa79b30987d0c1f8e10
--- /dev/null
+++ b/package/network/utils/iw/patches/303-mesh_add_VHT80.patch
@@ -0,0 +1,170 @@
+From: Sven Eckelmann <sven@open-mesh.com>
+Date: Tue, 24 Nov 2015 17:55:22 +0100
+Subject: iw: add VHT80 support for 802.11s
+
+Support next to the non-HT/HT channel widths like HT20 or NOHT also VHT80
+channels during the mesh join
+
+    iw dev mesh0 mesh join "meshnet" freq 5180 80MHz
+
+Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
+---
+ ibss.c | 33 ---------------------------------
+ iw.h   |  9 +++++++++
+ mesh.c | 16 ++++++++--------
+ util.c | 26 ++++++++++++++++++++++++++
+ 4 files changed, 43 insertions(+), 41 deletions(-)
+
+diff --git a/ibss.c b/ibss.c
+index 23bda70..ac06fc5 100644
+--- a/ibss.c
++++ b/ibss.c
+@@ -16,39 +16,6 @@
+ 
+ SECTION(ibss);
+ 
+-struct chanmode {
+-	const char *name;
+-	unsigned int width;
+-	int freq1_diff;
+-	int chantype; /* for older kernel */
+-};
+-
+-static int get_cf1(const struct chanmode *chanmode, unsigned long freq)
+-{
+-	int cf1 = freq, j;
+-	int vht80[] = { 5180, 5260, 5500, 5580, 5660, 5745 };
+-
+-	switch (chanmode->width) {
+-	case NL80211_CHAN_WIDTH_80:
+-	        /* setup center_freq1 */
+-		for (j = 0; j < ARRAY_SIZE(vht80); j++) {
+-			if (freq >= vht80[j] && freq < vht80[j] + 80)
+-				break;
+-		}
+-
+-		if (j == ARRAY_SIZE(vht80))
+-			break;
+-
+-		cf1 = vht80[j] + 30;
+-		break;
+-	default:
+-		cf1 = freq + chanmode->freq1_diff;
+-		break;
+-	}
+-
+-	return cf1;
+-}
+-
+ static int join_ibss(struct nl80211_state *state,
+ 		     struct nl_msg *msg,
+ 		     int argc, char **argv,
+diff --git a/iw.h b/iw.h
+index cef9da8..8e1a37a 100644
+--- a/iw.h
++++ b/iw.h
+@@ -59,6 +59,13 @@ struct cmd {
+ 	const struct cmd *parent;
+ };
+ 
++struct chanmode {
++	const char *name;
++	unsigned int width;
++	int freq1_diff;
++	int chantype; /* for older kernel */
++};
++
+ #define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0]))
+ #define DIV_ROUND_UP(x, y) (((x) + (y - 1)) / (y))
+ 
+@@ -174,6 +181,8 @@ void print_ies(unsigned char *ie, int ielen, bool unknown,
+ void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen);
+ void iw_hexdump(const char *prefix, const __u8 *data, size_t len);
+ 
++int get_cf1(const struct chanmode *chanmode, unsigned long freq);
++
+ #define SCHED_SCAN_OPTIONS "interval <in_msecs> [delay <in_secs>] " \
+ 	"[freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] [randomise[=<addr>/<mask>]]"
+ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv);
+diff --git a/mesh.c b/mesh.c
+index 0090530..930d58f 100644
+--- a/mesh.c
++++ b/mesh.c
+@@ -439,12 +439,8 @@ static int join_mesh(struct nl80211_state *state,
+ 	int bintval, dtim_period, i, n_rates = 0;
+ 	char *end, *value = NULL, *sptr = NULL;
+ 	unsigned long freq = 0;
+-	static const struct {
+-		const char *name;
+-		unsigned int width;
+-		int freq1_diff;
+-		int chantype; /* for older kernel */
+-	} *chanmode_selected = NULL, chanmode[] = {
++	const struct chanmode *chanmode_selected = NULL;
++	static const struct chanmode chanmode[] = {
+ 		{ .name = "HT20",
+ 		  .width = NL80211_CHAN_WIDTH_20,
+ 		  .freq1_diff = 0,
+@@ -461,6 +457,10 @@ static int join_mesh(struct nl80211_state *state,
+ 		  .width = NL80211_CHAN_WIDTH_20_NOHT,
+ 		  .freq1_diff = 0,
+ 		  .chantype = NL80211_CHAN_NO_HT },
++		{ .name = "80MHz",
++		  .width = NL80211_CHAN_WIDTH_80,
++		  .freq1_diff = 0,
++		  .chantype = -1 },
+ 	};
+ 
+ 	if (argc < 1)
+@@ -497,7 +497,7 @@ static int join_mesh(struct nl80211_state *state,
+ 			NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH,
+ 				    chanmode_selected->width);
+ 			NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1,
+-				    freq + chanmode_selected->freq1_diff);
++				    get_cf1(chanmode_selected, freq));
+ 			if (chanmode_selected->chantype != -1)
+ 				NLA_PUT_U32(msg,
+ 					    NL80211_ATTR_WIPHY_CHANNEL_TYPE,
+@@ -599,7 +599,7 @@ static int join_mesh(struct nl80211_state *state,
+  nla_put_failure:
+ 	return -ENOBUFS;
+ }
+-COMMAND(mesh, join, "<mesh ID> [[freq <freq in MHz> <HT20|HT40+|HT40-|NOHT>]"
++COMMAND(mesh, join, "<mesh ID> [[freq <freq in MHz> <HT20|HT40+|HT40-|NOHT|80MHz>]"
+ 	" [basic-rates <rate in Mbps,rate2,...>]], [mcast-rate <rate in Mbps>]"
+ 	" [beacon-interval <time in TUs>] [dtim-period <value>]"
+ 	" [vendor_sync on|off] [<param>=<value>]*",
+diff --git a/util.c b/util.c
+index 4efc4c8..d75ffe0 100644
+--- a/util.c
++++ b/util.c
+@@ -728,3 +728,29 @@ void iw_hexdump(const char *prefix, const __u8 *buf, size_t size)
+ 	}
+ 	printf("\n\n");
+ }
++
++int get_cf1(const struct chanmode *chanmode, unsigned long freq)
++{
++	int cf1 = freq, j;
++	int vht80[] = { 5180, 5260, 5500, 5580, 5660, 5745 };
++
++	switch (chanmode->width) {
++	case NL80211_CHAN_WIDTH_80:
++	        /* setup center_freq1 */
++		for (j = 0; j < ARRAY_SIZE(vht80); j++) {
++			if (freq >= vht80[j] && freq < vht80[j] + 80)
++				break;
++		}
++
++		if (j == ARRAY_SIZE(vht80))
++			break;
++
++		cf1 = vht80[j] + 30;
++		break;
++	default:
++		cf1 = freq + chanmode->freq1_diff;
++		break;
++	}
++
++	return cf1;
++}
diff --git a/package/system/mtd/src/Makefile b/package/system/mtd/src/Makefile
index 40a165e4e64dbd760396cee8d57bd3439d019bc2..26a8a997ba7960781ec75655e676d96a64f92a42 100644
--- a/package/system/mtd/src/Makefile
+++ b/package/system/mtd/src/Makefile
@@ -7,7 +7,7 @@ obj.seama = seama.o md5.o
 obj.ar71xx = trx.o $(obj.seama)
 obj.brcm = trx.o
 obj.brcm47xx = $(obj.brcm)
-obj.bcm53xx = $(obj.brcm)
+obj.bcm53xx = $(obj.brcm) $(obj.seama)
 obj.brcm63xx = imagetag.o
 obj.ramips = $(obj.seama)
 obj.mvebu = linksys_bootcount.o
diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile
index badd3e4b3391562ba44878e0e59e87499e595e58..d343f7481f3bb627b3e7ad79f45864de82a42371 100644
--- a/package/system/procd/Makefile
+++ b/package/system/procd/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2014-2015 OpenWrt.org
+# Copyright (C) 2014-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=procd
-PKG_VERSION:=2015-10-29
+PKG_VERSION:=2015-10-29.1
 
 PKG_RELEASE=$(PKG_SOURCE_VERSION)
 
diff --git a/package/system/procd/patches/0001-Align-early-init-PATH-with-system-wide-OpenWrt-path.patch b/package/system/procd/patches/0001-Align-early-init-PATH-with-system-wide-OpenWrt-path.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c8072ea1fb3763aaa97d93177884ebd875084b1d
--- /dev/null
+++ b/package/system/procd/patches/0001-Align-early-init-PATH-with-system-wide-OpenWrt-path.patch
@@ -0,0 +1,32 @@
+From 45cb04fd85d788a37367a5385e5e90dd98a0a991 Mon Sep 17 00:00:00 2001
+From: Jo-Philipp Wich <jow@openwrt.org>
+Date: Thu, 14 Jan 2016 13:51:36 +0100
+Subject: [PATCH] Align early init PATH with system wide OpenWrt path value
+
+Changeset r47080 globally unified the executable search path in OpenWrt,
+now update procd to use the same path value.
+
+This fixes diverging path values observed in programs launched by netifd
+which inherits the early path value from procd.
+
+Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
+---
+ initd/early.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/initd/early.c b/initd/early.c
+index e87774f..5821c58 100644
+--- a/initd/early.c
++++ b/initd/early.c
+@@ -90,7 +90,7 @@ early_mounts(void)
+ static void
+ early_env(void)
+ {
+-	setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin", 1);
++	setenv("PATH", "/usr/sbin:/usr/bin:/sbin:/bin", 1);
+ }
+ 
+ void
+-- 
+2.1.4
+
diff --git a/package/system/rpcd/Makefile b/package/system/rpcd/Makefile
index dc7284af625e48b3ef1df1efcb2b8c060bc79a68..86bd8c56863b6073682f3786ecda28bd366c218f 100644
--- a/package/system/rpcd/Makefile
+++ b/package/system/rpcd/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2013-2015 OpenWrt.org
+# Copyright (C) 2013-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=rpcd
-PKG_VERSION:=2015-01-10
+PKG_VERSION:=2016-04-13
 PKG_RELEASE=$(PKG_SOURCE_VERSION)
 
 PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=git://nbd.name/luci2/rpcd.git
+PKG_SOURCE_URL=$(OPENWRT_GIT)/project/rpcd.git
 PKG_SOURCE_SUBDIR:=$(PKG_NAME)
-PKG_SOURCE_VERSION:=f00890cd6eb47ad9bb5da0fb6c50aedc8406e7c5
+PKG_SOURCE_VERSION:=73aea9b8b621a1ce034bc6ee00c9d058a40c8a3d
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
 PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
 
diff --git a/scripts/config/confdata.c b/scripts/config/confdata.c
index d9e1b5c4c58b690dd400a0701177ae17f699bc6b..052347ce06cdf483edec0938d6713169b7a5ec82 100644
--- a/scripts/config/confdata.c
+++ b/scripts/config/confdata.c
@@ -1166,6 +1166,8 @@ bool conf_set_all_new_symbols(enum conf_def_mode mode)
 	}
 	bool has_changed = false;
 
+	sym_clear_all_valid();
+
 	for_all_symbols(i, sym) {
 		if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
 			continue;
@@ -1209,8 +1211,6 @@ bool conf_set_all_new_symbols(enum conf_def_mode mode)
 
 	}
 
-	sym_clear_all_valid();
-
 	/*
 	 * We have different type of choice blocks.
 	 * If curr.tri equals to mod then we can select several
diff --git a/scripts/download.pl b/scripts/download.pl
index cd68a7bcd0cf4ade9caf82cf305e43ed155539d5..111d03c63320d0c4f7b19902a4a5e23acb3b8a4d 100755
--- a/scripts/download.pl
+++ b/scripts/download.pl
@@ -11,15 +11,19 @@ use warnings;
 use File::Basename;
 use File::Copy;
 
-@ARGV > 2 or die "Syntax: $0 <target dir> <filename> <md5sum> [<mirror> ...]\n";
+@ARGV > 2 or die "Syntax: $0 <target dir> <filename> <md5sum> <url filename> [<mirror> ...]\n";
 
+my $url_filename;
 my $target = shift @ARGV;
 my $filename = shift @ARGV;
 my $md5sum = shift @ARGV;
+$url_filename = shift @ARGV unless $ARGV[0] =~ /:\/\//;
 my $scriptdir = dirname($0);
 my @mirrors;
 my $ok;
 
+$url_filename or $url_filename = $filename;
+
 sub localmirrors {
 	my @mlist;
 	open LM, "$scriptdir/localmirrors" and do {
@@ -106,7 +110,7 @@ sub download
 			return;
 		}
 	} else {
-		open WGET, "wget -t5 --timeout=20 --no-check-certificate $options -O- '$mirror/$filename' |" or die "Cannot launch wget.\n";
+		open WGET, "wget -t5 --timeout=20 --no-check-certificate $options -O- '$mirror/$url_filename' |" or die "Cannot launch wget.\n";
 		open MD5SUM, "| $md5cmd > '$target/$filename.md5sum'" or die "Cannot launch md5sum.\n";
 		open OUTPUT, "> $target/$filename.dl" or die "Cannot create file $target/$filename.dl: $!\n";
 		my $buffer;
diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh
index 89fe53cefa6c3f84e67e887d8e374713929fd992..5a184cd79bbc0d186fe100bda94d302e45596430 100644
--- a/target/linux/ar71xx/base-files/etc/diag.sh
+++ b/target/linux/ar71xx/base-files/etc/diag.sh
@@ -255,6 +255,7 @@ get_status_led() {
 	tl-wa901nd | \
 	tl-wa901nd-v2 | \
 	tl-wa901nd-v3 | \
+	tl-wa901nd-v4 | \
 	tl-wdr3500 | \
 	tl-wr1041n-v2 | \
 	tl-wr1043nd | \
@@ -279,7 +280,8 @@ get_status_led() {
 	tl-wdr4300 | \
 	tl-wr703n | \
 	tl-wr710n | \
-	tl-wr720n-v3)
+	tl-wr720n-v3 | \
+	tl-wr941nd-v6)
 		status_led="tp-link:blue:system"
 		;;
 	tl-wr841n-v9)
@@ -324,7 +326,8 @@ get_status_led() {
 	wnr2000 | \
 	wnr2200 |\
 	wnr612-v2 |\
-	wnr1000-v2)
+	wnr1000-v2 |\
+	wpn824n)
 		status_led="netgear:green:power"
 		;;
 	wp543)
diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index dd3f546b9e180312e528799e4aec2e432939220b..e6fcec8d1c4d4313da8e76dbf7876aa5a79b0f7c 100644
--- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -8,50 +8,96 @@ ath10kcal_die() {
 ath10kcal_from_file() {
 	local source=$1
 	local offset=$2
-	local target=$3
+	local count=$3
 
-	dd if=$source of=$target bs=1 skip=$offset count=2116 2>/dev/null || \
+	dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
 		ath10kcal_die "failed to extract calibration data from $source"
 }
 
+ath10kcal_extract() {
+	local part=$1
+	local offset=$2
+	local count=$3
+	local mtd
+
+	mtd=$(find_mtd_chardev $part)
+	[ -n "$mtd" ] || \
+		ath10kcal_die "no mtd device found for partition $part"
+
+	dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
+		ath10kcal_die "failed to extract calibration data from $mtd"
+}
+
+ath10kcal_patch_mac() {
+	local mac=$1
+
+	[ -z "$mac" ] && return
+
+	macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
+}
+
 [ -e /lib/firmware/$FIRMWARE ] && exit 0
 
 . /lib/ar71xx.sh
 . /lib/functions.sh
 . /lib/functions/system.sh
 
-ath10kcal_mac=""
-ath10kcal_tmp="/tmp/ath10k-caldata.bin"
-
 board=$(ar71xx_board_name)
 
 case "$FIRMWARE" in
-"ath10k/cal-pci-0000:01:00.0.bin")
-	case $board in
-	rb-911g-5hpacd)
-		ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 20480 $ath10kcal_tmp
-		;;
-	esac
-	;;
-
 "ath10k/cal-pci-0000:00:00.0.bin")
 	case $board in
 	dlan-pro-1200-ac)
-		ath10kcal_from_file $(find_mtd_part "art") 20480 $ath10kcal_tmp
+		ath10kcal_extract "art" 20480 2116
+		;;
+	mc-mac1200r)
+		ath10kcal_extract "art" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -1)
+		;;
+	tl-wdr6500-v2)
+		ath10kcal_extract "art" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
+		;;
+	r6100)
+		ath10kcal_extract "caldata" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) +2)
+		;;
+	qihoo-c301)
+		ath10kcal_extract "radiocfg" 20480 2116
+		ath10kcal_patch_mac $(mtd_get_mac_ascii devdata wlan5mac)
 		;;
 	esr1750 | \
 	epg5000)
-		ath10kcal_from_file $(find_mtd_part "caldata") 20480 $ath10kcal_tmp
+		ath10kcal_extract "caldata" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
+		;;
+	mr1750)
+		ath10kcal_extract "ART" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16)
+		;;
+	unifiac)
+		ath10kcal_extract "EEPROM" 20480 2116
+		;;
+	esac
+	;;
+"ath10k/cal-pci-0000:01:00.0.bin")
+	case $board in
+	archer-c5 | \
+	archer-c7)
+		ath10kcal_extract "art" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
+		;;
+	nbg6616 | \
+	nbg6716)
+		ath10kcal_extract "RFdata" 20480 2116
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
+		;;
+	rb-911g-5hpacd)
+		ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 20480 2116
 		;;
 	esac
 	;;
-
 *)
 	exit 1
 	;;
 esac
-
-[ -f $ath10kcal_tmp ] && {
-	cp $ath10kcal_tmp /lib/firmware/$FIRMWARE
-	rm -f $ath10kcal_tmp
-}
diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds
index 5241db277c456a31a5f0f0991cef8337d55ab162..a4b355a536699ee61e9f8e1467812d0d833cbce7 100644
--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds
+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds
@@ -407,6 +407,11 @@ tl-wa901nd-v2)
 	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
 	;;
 
+tl-wa901nd-v4)
+	ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0"
+	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
+	;;
+
 tl-wdr3500)
 	ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1"
 	ucidef_set_led_wlan "wlan2g" "WLAN2G" "tp-link:green:wlan2g" "phy0tpt"
@@ -460,6 +465,15 @@ tl-wr941nd-v5)
 	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
 	;;
 
+tl-wr941nd-v6)
+	ucidef_set_led_netdev "wan" "WAN" "tp-link:blue:wan" "eth0"
+	ucidef_set_led_switch "lan1" "LAN1" "tp-link:blue:lan1" "switch0" "0x10"
+	ucidef_set_led_switch "lan2" "LAN2" "tp-link:blue:lan2" "switch0" "0x08"
+	ucidef_set_led_switch "lan3" "LAN3" "tp-link:blue:lan3" "switch0" "0x04"
+	ucidef_set_led_switch "lan4" "LAN4" "tp-link:blue:lan4" "switch0" "0x02"
+	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:blue:wlan" "phy0tpt"
+	;;
+
 tl-wa830re-v2)
 	ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0"
 	ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
@@ -563,7 +577,25 @@ wnr2000-v4)
 	ucidef_set_led_switch "lan3" "LAN3" "netgear:amber:lan3" "switch0" "0x08"
 	ucidef_set_led_switch "lan4" "LAN4" "netgear:amber:lan4" "switch0" "0x10"
 	ucidef_set_led_usbdev "usb" "USB" "netgear:amber:status" "1-1"
-    ;;
+	;;
+
+wpn824n)
+	ucidef_set_led_netdev "wan-amber" "WAN (amber)" "netgear:amber:wan" "eth0"
+	ucidef_set_led_wlan "wlan" "WLAN" "netgear:blue:wlan" "phy0tpt"
+	ucidef_set_led_switch "lan1amber" "LAN1 (amber)" "netgear:amber:lan1" "switch0" "0x02"
+	ucidef_set_led_switch "lan2amber" "LAN2 (amber)" "netgear:amber:lan2" "switch0" "0x04"
+	ucidef_set_led_switch "lan3amber" "LAN3 (amber)" "netgear:amber:lan3" "switch0" "0x08"
+	ucidef_set_led_switch "lan4amber" "LAN4 (amber)" "netgear:amber:lan4" "switch0" "0x10"
+	ucidef_set_led_default "lan1green" "LAN1 (green)" "netgear:green:lan1" "0"
+	ucidef_set_led_default "lan2green" "LAN2 (green)" "netgear:green:lan2" "0"
+	ucidef_set_led_default "lan3green" "LAN3 (green)" "netgear:green:lan3" "0"
+	ucidef_set_led_default "lan4green" "LAN4 (green)" "netgear:green:lan4" "0"
+	ucidef_set_led_default "wan-green" "WAN (green)" "netgear:green:wan" "0"
+	ucidef_set_led_default "wps1" "WPS1" "netgear:blue:wps1" "0"
+	ucidef_set_led_default "wps2" "WPS2" "netgear:blue:wps2" "0"
+	ucidef_set_led_default "status" "STATUS" "netgear:amber:status" "0"
+	ucidef_set_led_default "test" "TEST" "netgear:amber:test" "0"
+	;;
 
 wzr-hp-ag300h)
 	ucidef_set_led_default "diag" "DIAG" "buffalo:red:diag" "0"
diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network
index 8143d2d613bde78b777968678c1988426044fb67..b2e15bbf53ef251083bde83d8ac37ac6f2c9a53d 100755
--- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network
+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network
@@ -226,11 +226,13 @@ tl-mr3420-v2 |\
 tl-wr841n-v8 |\
 tl-wr842n-v2 |\
 tl-wr941nd-v5 |\
+tl-wr941nd-v6 |\
 wnr2000-v3 |\
 wnr2000-v4 |\
 wnr2200 |\
 wnr612-v2 |\
-wnr1000-v2)
+wnr1000-v2 |\
+wpn824n)
 	ucidef_set_interfaces_lan_wan "eth1" "eth0"
 	ucidef_add_switch "switch0" "1" "1"
 	ucidef_add_switch_vlan "switch0" "1" "0 1 2 3 4"
@@ -321,6 +323,7 @@ dlan-pro-1200-ac)
 	ucidef_add_switch_vlan "switch0" "0" "0 2 3 4"
 	;;
 
+alfa-ap120c |\
 all0305 |\
 antminer-s1 |\
 antminer-s3 |\
@@ -360,6 +363,7 @@ tl-wa801nd-v2 |\
 tl-wa901nd |\
 tl-wa901nd-v2 |\
 tl-wa901nd-v3 |\
+tl-wa901nd-v4 |\
 tl-wr703n |\
 tube2h |\
 wndap360 |\
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
index 0b2857d8b3860a02413b32588640bb293c0ab6e0..dab4d2c7c9e4d2e6d2609b19fed41fb2fe8e581a 100755
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
@@ -123,7 +123,7 @@ tplink_board_detect() {
 	"3C0002"*)
 		model="MINIBOX_V1"
 		;;
-	"070300"*)
+	"070301"*)
 		model="TP-Link TL-WR703N"
 		;;
 	"071000"*)
@@ -330,6 +330,9 @@ ar71xx_board_detect() {
 	*"AirRouter")
 		name="airrouter"
 		;;
+	*"ALFA Network AP120C")
+		name="alfa-ap120c"
+		;;
 	*"ALFA Network AP96")
 		name="alfa-ap96"
 		;;
@@ -764,6 +767,9 @@ ar71xx_board_detect() {
 	*"TL-WA901ND v3")
 		name="tl-wa901nd-v3"
 		;;
+	*"TL-WA901ND v4")
+		name="tl-wa901nd-v4"
+		;;
 	*"TL-WDR3500")
 		name="tl-wdr3500"
 		;;
@@ -800,6 +806,9 @@ ar71xx_board_detect() {
 	*"TL-WR941N/ND v5")
 		name="tl-wr941nd-v5"
 		;;
+	*"TL-WR941N/ND v6")
+		name="tl-wr941nd-v6"
+		;;
 	*"TL-WR703N v1")
 		name="tl-wr703n"
 		;;
@@ -896,6 +905,9 @@ ar71xx_board_detect() {
 	*"WNR1000 V2")
 		name="wnr1000-v2"
 		;;
+	*WPN824N)
+		name="wpn824n"
+		;;
 	*WRT160NL)
 		name="wrt160nl"
 		;;
diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx
index f11ea8cb32cd54b463ff306003f92c2a0255a35b..f552453e43363c5ab687116eee1889af8171dbb6 100644
--- a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx
+++ b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx
@@ -35,10 +35,12 @@ set_preinit_iface() {
 	tl-wr720n-v3 |\
 	tl-wr841n-v8 |\
 	tl-wr842n-v2 |\
+	tl-wr941nd-v6 |\
 	wnr2000-v3 |\
 	wnr2200 |\
 	wnr612-v2 |\
 	wnr1000-v2 |\
+	wpn824n |\
 	wpe72)
 		ifname=eth1
 		;;
diff --git a/target/linux/ar71xx/base-files/lib/preinit/81_load_ath10k_board_bin b/target/linux/ar71xx/base-files/lib/preinit/81_load_ath10k_board_bin
deleted file mode 100644
index 9a32dfcd7772b4fbf271dcf847a6b7ea8073042f..0000000000000000000000000000000000000000
--- a/target/linux/ar71xx/base-files/lib/preinit/81_load_ath10k_board_bin
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/sh
-
-. /lib/functions/system.sh
-. /lib/ar71xx.sh
-
-do_load_ath10k_board_bin() {
-	# load board.bin
-	case $(ar71xx_board_name) in
-		nbg6716)
-			dd if=/dev/mtdblock2 \
-				bs=1 skip=20480 count=2116 \
-				of=/tmp/ath10k-board.bin
-		;;
-		archer-c5 | \
-		archer-c7)
-			local mac
-			mac=$(macaddr_add $(cat /sys/class/net/eth1/address) -2)
-
-			dd if=/dev/mtdblock4 \
-				bs=1 skip=20480 count=6 \
-				of=/tmp/ath10k-board.bin
-			macaddr_2bin $mac >> /tmp/ath10k-board.bin
-			dd if=/dev/mtdblock4 \
-				bs=1 skip=20492 count=2104 >> /tmp/ath10k-board.bin
-		;;
-		mc-mac1200r)
-			local mac
-			mac=$(macaddr_add $(cat /sys/class/net/eth1/address) -1)
-
-			dd if=/dev/mtdblock4 \
-				bs=1 skip=20480 count=6 \
-				of=/tmp/ath10k-board.bin
-			macaddr_2bin $mac >> /tmp/ath10k-board.bin
-			dd if=/dev/mtdblock4 \
-				bs=1 skip=20492 count=2104 >> /tmp/ath10k-board.bin
-		;;
-		r6100)
-			local mac
-			mac=$(macaddr_add $(cat /sys/class/net/eth1/address) +2)
-
-			dd if=/dev/mtdblock2 \
-				bs=1 skip=20480 count=6 \
-				of=/tmp/ath10k-board.bin
-			macaddr_2bin $mac >> /tmp/ath10k-board.bin
-			dd if=/dev/mtdblock2 \
-				bs=1 skip=20492 count=2104 >> /tmp/ath10k-board.bin
-		;;
-		qihoo-c301)
-			local mac
-
-			mac=$(mtd_get_mac_ascii devdata wlan5mac)
-
-			if [ -z "$mac" ]; then
-				mac=$(macaddr_add $(cat /sys/class/net/eth0/address) -2)
-			fi
-
-			dd if=/dev/mtdblock10 \
-				bs=1 skip=20480 count=6 \
-				of=/tmp/ath10k-board.bin
-			macaddr_2bin $mac >> /tmp/ath10k-board.bin
-			dd if=/dev/mtdblock10 \
-				bs=1 skip=20492 count=2104 >> /tmp/ath10k-board.bin
-
-		;;
-	esac
-	[ -f /tmp/ath10k-board.bin ] || {
-		return
-	}
-	cmp -s /tmp/ath10k-board.bin /lib/firmware/ath10k/QCA988X/hw2.0/board.bin || {
-		cp /tmp/ath10k-board.bin /lib/firmware/ath10k/QCA988X/hw2.0/board.bin
-		rm /tmp/ath10k-board.bin
-	}
-}
-
-boot_hook_add preinit_main do_load_ath10k_board_bin
diff --git a/target/linux/ar71xx/base-files/lib/preinit/82_patch_ath10k b/target/linux/ar71xx/base-files/lib/preinit/82_patch_ath10k
index 4511162ac4a5c68e12ea52f0f82efa009ac85212..af12bd5d927181b3461573a330550d2d6c557995 100644
--- a/target/linux/ar71xx/base-files/lib/preinit/82_patch_ath10k
+++ b/target/linux/ar71xx/base-files/lib/preinit/82_patch_ath10k
@@ -5,14 +5,14 @@
 
 
 do_patch_ath10k_firmware() {
-	local firmware_file="/lib/firmware/ath10k/QCA988X/hw2.0/firmware-4.bin"
+	local firmware_file="/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin"
 
 	# bail out if firmware does not exist
 	[ -f "$firmware_file" ] || {
 		return
 	}
 
-	local firmware_md5_orig="ab36ef267d15cfc02317ceeb38e8f548"
+	local firmware_md5_orig="fcb2fbd42d73a63fbf603505c718cbde"
 	local firmware_md5_current="$(md5sum $firmware_file)"
 	local firmware_md5_current="${firmware_md5_current%% *}"
 
@@ -23,7 +23,7 @@ do_patch_ath10k_firmware() {
 
 	# some boards have bogus mac in otp, patch the default mac in the firmware
 	case $(ar71xx_board_name) in
-		dgl-5500-a1)
+		dgl-5500-a1 | tew-823dru)
 			local mac
 			mac=$(mtd_get_mac_ascii nvram wlan1_mac)
 
@@ -42,7 +42,7 @@ do_patch_ath10k_firmware() {
 
 check_patch_ath10k_firmware() {
 	case $(ar71xx_board_name) in
-		dgl-5500-a1)
+		dgl-5500-a1 | tew-823dru)
 			do_patch_ath10k_firmware
 		;;
 	esac
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
index 8dea48f719d16ea4ba7b96e960bd2fa9df8440a6..d0256328cd40b18a8e16e91cc819337126229988 100755
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
@@ -338,6 +338,7 @@ platform_check_image() {
 	tl-wa901nd | \
 	tl-wa901nd-v2 | \
 	tl-wa901nd-v3 | \
+	tl-wa901nd-v4 | \
 	tl-wdr3500 | \
 	tl-wdr4300 | \
 	tl-wdr4900-v2 | \
@@ -354,6 +355,7 @@ platform_check_image() {
 	tl-wr842n-v2 | \
 	tl-wr941nd | \
 	tl-wr941nd-v5 | \
+	tl-wr941nd-v6 | \
 	tl-wr1041n-v2 | \
 	tl-wr1043nd | \
 	tl-wr1043nd-v2 | \
@@ -401,7 +403,8 @@ platform_check_image() {
 	wndr3700 | \
 	wnr2000-v3 | \
 	wnr612-v2 | \
-	wnr1000-v2)
+	wnr1000-v2 | \
+	wpn824n)
 		local hw_magic
 
 		hw_magic="$(ar71xx_get_mtd_part_magic firmware)"
diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18
index e9b3c7c6ef4a037f2614e72832829b45eed6bddf..e2ff8267bf5208775d46adde333b2bd2483f58a2 100644
--- a/target/linux/ar71xx/config-3.18
+++ b/target/linux/ar71xx/config-3.18
@@ -27,6 +27,7 @@ CONFIG_ATH79_DEV_NFC=y
 CONFIG_ATH79_DEV_SPI=y
 CONFIG_ATH79_DEV_USB=y
 CONFIG_ATH79_DEV_WMAC=y
+CONFIG_ATH79_MACH_ALFA_AP120C=y
 CONFIG_ATH79_MACH_ALFA_AP96=y
 CONFIG_ATH79_MACH_ALFA_NX=y
 CONFIG_ATH79_MACH_ALL0258N=y
@@ -117,6 +118,7 @@ CONFIG_ATH79_MACH_TL_WA7210N_V2=y
 CONFIG_ATH79_MACH_TL_WA830RE_V2=y
 CONFIG_ATH79_MACH_TL_WA901ND=y
 CONFIG_ATH79_MACH_TL_WA901ND_V2=y
+CONFIG_ATH79_MACH_TL_WA901ND_V4=y
 CONFIG_ATH79_MACH_TL_WAX50RE=y
 CONFIG_ATH79_MACH_TL_WDR3500=y
 CONFIG_ATH79_MACH_TL_WDR4300=y
@@ -132,6 +134,7 @@ CONFIG_ATH79_MACH_TL_WR841N_V1=y
 CONFIG_ATH79_MACH_TL_WR841N_V8=y
 CONFIG_ATH79_MACH_TL_WR841N_V9=y
 CONFIG_ATH79_MACH_TL_WR941ND=y
+CONFIG_ATH79_MACH_TL_WR941ND_V6=y
 CONFIG_ATH79_MACH_TUBE2H=y
 CONFIG_ATH79_MACH_UBNT=y
 CONFIG_ATH79_MACH_UBNT_XM=y
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
index ae3db4c3ef9ff35aee63cc9e15295cbbf2dc9875..ff94e2ec3733b9473c4c3191cb47bd4ba8ac784d 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
@@ -198,6 +198,8 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask)
 	case ATH79_SOC_AR9330:
 	case ATH79_SOC_AR9331:
 	case ATH79_SOC_QCA9533:
+	case ATH79_SOC_QCA9561:
+	case ATH79_SOC_TP9343:
 		mdio_dev = &ath79_mdio1_device;
 		mdio_data = &ath79_mdio1_data;
 		break;
@@ -256,6 +258,8 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask)
 		break;
 
 	case ATH79_SOC_QCA9533:
+	case ATH79_SOC_QCA9561:
+	case ATH79_SOC_TP9343:
 		mdio_data->builtin_switch = 1;
 		break;
 
@@ -571,6 +575,8 @@ static void __init ath79_init_eth_pll_data(unsigned int id)
 	case ATH79_SOC_QCA9533:
 	case ATH79_SOC_QCA9556:
 	case ATH79_SOC_QCA9558:
+	case ATH79_SOC_QCA9561:
+	case ATH79_SOC_TP9343:
 		pll_10 = AR934X_PLL_VAL_10;
 		pll_100 = AR934X_PLL_VAL_100;
 		pll_1000 = AR934X_PLL_VAL_1000;
@@ -627,6 +633,8 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
 		case ATH79_SOC_AR9330:
 		case ATH79_SOC_AR9331:
 		case ATH79_SOC_QCA9533:
+		case ATH79_SOC_QCA9561:
+		case ATH79_SOC_TP9343:
 			pdata->phy_if_mode = PHY_INTERFACE_MODE_MII;
 			break;
 
@@ -687,7 +695,8 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
 		case ATH79_SOC_AR7241:
 		case ATH79_SOC_AR9330:
 		case ATH79_SOC_AR9331:
-		case ATH79_SOC_QCA9533:
+		case ATH79_SOC_QCA9561:
+		case ATH79_SOC_TP9343:
 			pdata->phy_if_mode = PHY_INTERFACE_MODE_GMII;
 			break;
 
@@ -697,6 +706,7 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
 		case ATH79_SOC_AR9341:
 		case ATH79_SOC_AR9342:
 		case ATH79_SOC_AR9344:
+		case ATH79_SOC_QCA9533:
 			switch (pdata->phy_if_mode) {
 			case PHY_INTERFACE_MODE_MII:
 			case PHY_INTERFACE_MODE_GMII:
@@ -986,6 +996,7 @@ void __init ath79_register_eth(unsigned int id)
 	case ATH79_SOC_AR9341:
 	case ATH79_SOC_AR9342:
 	case ATH79_SOC_AR9344:
+	case ATH79_SOC_QCA9533:
 		if (id == 0) {
 			pdata->reset_bit = AR934X_RESET_GE0_MAC |
 					   AR934X_RESET_GE0_MDIO;
@@ -1017,7 +1028,8 @@ void __init ath79_register_eth(unsigned int id)
 			pdata->fifo_cfg3 = 0x01f00140;
 		break;
 
-	case ATH79_SOC_QCA9533:
+	case ATH79_SOC_QCA9561:
+	case ATH79_SOC_TP9343:
 		if (id == 0) {
 			pdata->reset_bit = AR933X_RESET_GE0_MAC |
 					   AR933X_RESET_GE0_MDIO;
@@ -1123,6 +1135,8 @@ void __init ath79_register_eth(unsigned int id)
 		case ATH79_SOC_AR9330:
 		case ATH79_SOC_AR9331:
 		case ATH79_SOC_QCA9533:
+		case ATH79_SOC_QCA9561:
+		case ATH79_SOC_TP9343:
 			pdata->mii_bus_dev = &ath79_mdio1_device.dev;
 			break;
 
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-alfa-ap120c.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-alfa-ap120c.c
new file mode 100644
index 0000000000000000000000000000000000000000..524f93d2644d9a1c4ad0a79c06d64b5d6895dfbe
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-alfa-ap120c.c
@@ -0,0 +1,147 @@
+/*
+ *  ALFA Network AP120C board support
+ *
+ *  Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2016 Luka Perkov <luka@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/bitops.h>
+#include <linux/gpio.h>
+#include <linux/platform_device.h>
+#include <linux/spi/spi.h>
+#include <linux/ar8216_platform.h>
+#include <linux/ath9k_platform.h>
+
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+
+#include "common.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+#include "dev-spi.h"
+#include "dev-ap9x-pci.h"
+#include "dev-wmac.h"
+#include "machtypes.h"
+
+#define ALFA_AP120C_GPIO_LED	0
+
+#define ALFA_AP120C_GPIO_BUTTON_WIFI	16
+
+#define ALFA_AP120C_GPIO_WATCH_DOG	20
+
+#define ALFA_AP120C_KEYS_POLL_INTERVAL		20	/* msecs */
+#define ALFA_AP120C_KEYS_DEBOUNCE_INTERVAL	(3 * ALFA_AP120C_KEYS_POLL_INTERVAL)
+
+#define ALFA_AP120C_MAC_OFFSET		0x1002
+#define ALFA_AP120C_CAL0_OFFSET		0x1000
+
+static struct gpio_keys_button alfa_ap120c_gpio_keys[] __initdata = {
+	{
+		.desc		= "Wireless button",
+		.type		= EV_KEY,
+		.code		= KEY_RFKILL,
+		.debounce_interval = ALFA_AP120C_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= ALFA_AP120C_GPIO_BUTTON_WIFI,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led alfa_ap120c_leds_gpio[] __initdata = {
+	{
+			.name		= "ap120c:red:wlan",
+			.gpio		= ALFA_AP120C_GPIO_LED,
+			.active_low = 0,
+	}
+};
+
+static struct ar8327_pad_cfg ap120c_ar8327_pad0_cfg = {
+	.mode = AR8327_PAD_MAC_RGMII,
+	.txclk_delay_en = true,
+	.rxclk_delay_en = true,
+	.txclk_delay_sel = AR8327_CLK_DELAY_SEL1,
+	.rxclk_delay_sel = AR8327_CLK_DELAY_SEL2,
+};
+
+static struct ar8327_platform_data ap120c_ar8327_data = {
+	.pad0_cfg = &ap120c_ar8327_pad0_cfg,
+	.port0_cfg = {
+		.force_link = 1,
+		.speed = AR8327_PORT_SPEED_1000,
+		.duplex = 1,
+		.txpause = 1,
+		.rxpause = 1,
+	},
+};
+
+static struct mdio_board_info ap120c_mdio0_info[] = {
+	{
+		.bus_id = "ag71xx-mdio.0",
+		.phy_addr = 0,
+		.platform_data = &ap120c_ar8327_data,
+	},
+};
+
+static struct flash_platform_data flash __initdata = { NULL, NULL, 0 };
+
+#define ALFA_AP120C_LAN_PHYMASK		BIT(5)
+#define ALFA_AP120C_MDIO_PHYMASK	ALFA_AP120C_LAN_PHYMASK
+
+static void __init alfa_ap120c_init(void)
+{
+	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
+	u8 mac[ETH_ALEN];
+
+	struct ath9k_platform_data *pdata;
+
+	ath79_register_leds_gpio(-1, ARRAY_SIZE(alfa_ap120c_leds_gpio),
+							 alfa_ap120c_leds_gpio);
+	ath79_register_gpio_keys_polled(-1, ALFA_AP120C_KEYS_POLL_INTERVAL,
+									ARRAY_SIZE(alfa_ap120c_gpio_keys),
+									alfa_ap120c_gpio_keys);
+
+	ath79_gpio_function_enable(AR71XX_GPIO_FUNC_SPI_CS1_EN |
+							   AR71XX_GPIO_FUNC_SPI_CS2_EN);
+
+	ath79_register_m25p80_multi(&flash);
+
+	ath79_init_mac(mac, art + ALFA_AP120C_MAC_OFFSET, 1);
+	ath79_register_wmac(art + ALFA_AP120C_CAL0_OFFSET, mac);
+
+	ath79_init_mac(mac, art + ALFA_AP120C_MAC_OFFSET, 2);
+	ap91_pci_init(NULL, mac);
+	pdata = ap9x_pci_get_wmac_data(0);
+	if (!pdata) {
+		pr_err("ap120c: unable to get address of wlan data\n");
+		return;
+	}
+	pdata->use_eeprom = true;
+
+	ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_RGMII_GMAC0 |
+							   BIT(15) | BIT(17) | BIT(19) | BIT(21));
+
+	ath79_register_mdio(0, 0x0);
+
+	ath79_init_mac(ath79_eth0_data.mac_addr, art + ALFA_AP120C_MAC_OFFSET, 0);
+
+	mdiobus_register_board_info(ap120c_mdio0_info, ARRAY_SIZE(ap120c_mdio0_info));
+
+	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
+	ath79_eth0_data.phy_mask = ALFA_AP120C_LAN_PHYMASK;
+
+	ath79_eth0_pll_data.pll_1000 = 0x42000000;
+	ath79_eth0_pll_data.pll_10 = 0x00001313;
+
+	ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
+
+	ath79_register_eth(0);
+}
+
+MIPS_MACHINE(ATH79_MACH_ALFA_AP120C, "ALFA-AP120C", "ALFA Network AP120C",
+			 alfa_ap120c_init);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa901nd-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa901nd-v4.c
new file mode 100644
index 0000000000000000000000000000000000000000..9c651bb1d256bc13a3fe31b664f2cd3590e8092f
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa901nd-v4.c
@@ -0,0 +1,112 @@
+/*
+ *  TP-LINK TL-WA901ND v4 board
+ *
+ *  Copyright (C) 2015 Matthias Schiffer <mschiffer@universe-factory.net>
+ *  Copyright (C) 2016 Tiziano Bacocco <tizbac2@gmail.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/gpio.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+
+#include "common.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+#include "dev-wmac.h"
+#include "machtypes.h"
+
+
+#define TL_WA901ND_V4_GPIO_LED_QSS		3
+#define TL_WA901ND_V4_GPIO_LED_LAN		7
+#define TL_WA901ND_V4_GPIO_LED_WLAN		8
+#define TL_WA901ND_V4_GPIO_LED_SYSTEM		18
+
+#define TL_WA901ND_V4_GPIO_BTN_RESET		1
+
+#define TL_WA901ND_V4_KEYS_POLL_INTERVAL	20
+#define TL_WA901ND_V4_KEYS_DEBOUNCE_INTERVAL	(3 * TL_WA901ND_V4_KEYS_POLL_INTERVAL)
+
+
+static struct gpio_led TL_WA901ND_V4_leds_gpio[] __initdata = {
+	{
+		.name		= "tp-link:green:qss",
+		.gpio		= TL_WA901ND_V4_GPIO_LED_QSS,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:green:lan",
+		.gpio		= TL_WA901ND_V4_GPIO_LED_LAN,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:green:wlan",
+		.gpio		= TL_WA901ND_V4_GPIO_LED_WLAN,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:green:system",
+		.gpio		= TL_WA901ND_V4_GPIO_LED_SYSTEM,
+		.active_low	= 1,
+	},
+};
+
+static struct gpio_keys_button TL_WA901ND_V4_gpio_keys[] __initdata = {
+	{
+		.desc		= "Reset button",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = TL_WA901ND_V4_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= TL_WA901ND_V4_GPIO_BTN_RESET,
+		.active_low	= 1,
+	}
+};
+
+
+static const char *tl_wa901nd_v4_part_probes[] = {
+	"tp-link",
+	NULL,
+};
+
+static struct flash_platform_data tl_wa901nd_v4_flash_data = {
+	.part_probes	= tl_wa901nd_v4_part_probes,
+};
+
+
+static void __init TL_WA901ND_V4_setup(void)
+{
+	u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
+	u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
+
+	ath79_register_m25p80(&tl_wa901nd_v4_flash_data);
+
+	ath79_register_leds_gpio(-1, ARRAY_SIZE(TL_WA901ND_V4_leds_gpio),
+				 TL_WA901ND_V4_leds_gpio);
+
+	ath79_register_gpio_keys_polled(-1, TL_WA901ND_V4_KEYS_POLL_INTERVAL,
+					ARRAY_SIZE(TL_WA901ND_V4_gpio_keys),
+					TL_WA901ND_V4_gpio_keys);
+
+	ath79_register_mdio(0, 0x0);
+
+	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
+	ath79_init_mac(ath79_eth1_data.mac_addr, mac, -1);
+
+	ath79_switch_data.phy4_mii_en = 1;
+
+	ath79_register_eth(0);
+	ath79_register_eth(1);
+
+	ath79_register_wmac(ee, mac);
+
+}
+
+MIPS_MACHINE(ATH79_MACH_TL_WA901ND_V4, "TL-WA901ND-v4", "TP-LINK TL-WA901ND v4",
+	     TL_WA901ND_V4_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c
index c28afc6cebfaf1ab92e4463b49da8bdef9dc79fc..3e5c2a2522b5d08b8a1112e2df43655daae37609 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c
@@ -109,12 +109,18 @@ static void __init tl_ap143_setup(void)
 	ath79_register_mdio(0, 0x0);
 
 	/* LAN */
+	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+	ath79_eth1_data.duplex = DUPLEX_FULL;
+	ath79_switch_data.phy_poll_mask |= BIT(4);
 	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0);
 	ath79_register_eth(1);
 
 	/* WAN */
 	ath79_switch_data.phy4_mii_en = 1;
 	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+	ath79_eth0_data.duplex = DUPLEX_FULL;
+	ath79_eth0_data.speed = SPEED_100;
+	ath79_eth0_data.phy_mask = BIT(4);
 	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
 	ath79_register_eth(0);
 
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr941nd-v6.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr941nd-v6.c
new file mode 100644
index 0000000000000000000000000000000000000000..8c788e28411d47c05fb5e1b07eebcc7bc017cb9c
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr941nd-v6.c
@@ -0,0 +1,149 @@
+/*
+ *  TP-LINK TL-WR941N/ND v6 board support
+ *
+ *  Copyright (C) 2015 Matthias Schiffer <mschiffer@universe-factory.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/gpio.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+
+#include "common.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-m25p80.h"
+#include "dev-wmac.h"
+#include "machtypes.h"
+
+
+#define TL_WR941ND_V6_GPIO_LED_QSS		3
+#define TL_WR941ND_V6_GPIO_LED_WAN		14
+#define TL_WR941ND_V6_GPIO_LED_WAN_RED		15
+#define TL_WR941ND_V6_GPIO_LED_LAN1		7
+#define TL_WR941ND_V6_GPIO_LED_LAN2		6
+#define TL_WR941ND_V6_GPIO_LED_LAN3		5
+#define TL_WR941ND_V6_GPIO_LED_LAN4		4
+#define TL_WR941ND_V6_GPIO_LED_WLAN		8
+#define TL_WR941ND_V6_GPIO_LED_SYSTEM		18
+
+#define TL_WR941ND_V6_GPIO_BTN_RESET		1
+#define TL_WR941ND_V6_GPIO_BTN_RFKILL		2
+
+#define TL_WR941ND_V6_KEYS_POLL_INTERVAL	20
+#define TL_WR941ND_V6_KEYS_DEBOUNCE_INTERVAL	(3 * TL_WR941ND_V6_KEYS_POLL_INTERVAL)
+
+
+static struct gpio_led tl_wr941nd_v6_leds_gpio[] __initdata = {
+	{
+		.name		= "tp-link:blue:qss",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_QSS,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:blue:wan",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_WAN,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:red:wan",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_WAN_RED,
+		.active_low	= 0,
+	},
+	{
+		.name		= "tp-link:blue:lan1",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_LAN1,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:blue:lan2",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_LAN2,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:blue:lan3",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_LAN3,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:blue:lan4",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_LAN4,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:blue:wlan",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_WLAN,
+		.active_low	= 1,
+	},
+	{
+		.name		= "tp-link:blue:system",
+		.gpio		= TL_WR941ND_V6_GPIO_LED_SYSTEM,
+		.active_low	= 1,
+	},
+};
+
+static struct gpio_keys_button tl_wr941nd_v6_gpio_keys[] __initdata = {
+	{
+		.desc		= "Reset button",
+		.type		= EV_KEY,
+		.code		= KEY_RESTART,
+		.debounce_interval = TL_WR941ND_V6_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= TL_WR941ND_V6_GPIO_BTN_RESET,
+		.active_low	= 1,
+	}, {
+		.desc		= "RFKILL button",
+		.type		= EV_KEY,
+		.code		= KEY_RFKILL,
+		.debounce_interval = TL_WR941ND_V6_KEYS_DEBOUNCE_INTERVAL,
+		.gpio		= TL_WR941ND_V6_GPIO_BTN_RFKILL,
+		.active_low	= 1,
+	}
+};
+
+
+static const char *tl_wr941n_v6_part_probes[] = {
+	"tp-link",
+	NULL,
+};
+
+static struct flash_platform_data tl_wr941n_v6_flash_data = {
+	.part_probes	= tl_wr941n_v6_part_probes,
+};
+
+
+static void __init tl_wr941nd_v6_setup(void)
+{
+	u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
+	u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
+
+	ath79_register_m25p80(&tl_wr941n_v6_flash_data);
+
+	ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr941nd_v6_leds_gpio),
+				 tl_wr941nd_v6_leds_gpio);
+
+	ath79_register_gpio_keys_polled(-1, TL_WR941ND_V6_KEYS_POLL_INTERVAL,
+					ARRAY_SIZE(tl_wr941nd_v6_gpio_keys),
+					tl_wr941nd_v6_gpio_keys);
+
+	ath79_register_mdio(0, 0x0);
+
+	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
+	ath79_init_mac(ath79_eth1_data.mac_addr, mac, -1);
+
+	ath79_switch_data.phy4_mii_en = 1;
+
+	ath79_register_eth(0);
+	ath79_register_eth(1);
+
+	ath79_register_wmac(ee, mac);
+
+}
+
+MIPS_MACHINE(ATH79_MACH_TL_WR941ND_V6, "TL-WR941ND-v6", "TP-LINK TL-WR941N/ND v6",
+	     tl_wr941nd_v6_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c
index 2e14782200740072a4e9c93e53e8adbbb19ce359..205c2e7d5ad8446e121f86940bea3e239cbe3b65 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2000-v3.c
@@ -1,7 +1,8 @@
 /*
- *  NETGEAR WNR2000v3/WNR612v2/WNR1000v2 board support
+ *  NETGEAR WNR2000v3/WNR612v2/WNR1000v2/WPN824N board support
  *
- *  Copytight (C) 2013 Mathieu Olivari <mathieu.olivari@gmail.com>
+ *  Copyright (C) 2015 Hartmut Knaack <knaack.h@gmx.de>
+ *  Copyright (C) 2013 Mathieu Olivari <mathieu.olivari@gmail.com>
  *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  *  Copyright (C) 2008-2009 Andy Boyett <agb@openwrt.org>
@@ -15,6 +16,8 @@
 #include <linux/mtd/partitions.h>
 
 #include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/ar71xx_regs.h> /* needed to disable switch LEDs */
+#include "common.h" /* needed to disable switch LEDs */
 
 #include "dev-ap9x-pci.h"
 #include "dev-eth.h"
@@ -34,6 +37,29 @@
 #define WNR1000V2_GPIO_LED_PWR_AMBER	1
 #define WNR1000V2_GPIO_LED_PWR_GREEN	11
 
+/* Connected through AR7240 */
+#define WPN824N_GPIO_LED_WAN_AMBER	0
+#define WPN824N_GPIO_LED_STATUS_AMBER	1
+#define WPN824N_GPIO_LED_LAN1_AMBER	6 /* AR724X_GPIO_FUNC_JTAG_DISABLE */
+#define WPN824N_GPIO_LED_LAN2_AMBER	7 /* AR724X_GPIO_FUNC_JTAG_DISABLE */
+#define WPN824N_GPIO_LED_LAN3_AMBER	8 /* AR724X_GPIO_FUNC_JTAG_DISABLE */
+#define WPN824N_GPIO_LED_LAN4_AMBER	12
+#define WPN824N_GPIO_LED_LAN1_GREEN	13
+#define WPN824N_GPIO_LED_LAN2_GREEN	14
+#define WPN824N_GPIO_LED_LAN3_GREEN	15 /* AR724X_GPIO_FUNC_CLK_OBS3_EN */
+#define WPN824N_GPIO_LED_LAN4_GREEN	16
+#define WPN824N_GPIO_LED_WAN_GREEN	17
+
+/* Connected through AR9285 */
+#define WPN824N_WGPIO_LED_PWR_GREEN	0
+#define WPN824N_WGPIO_LED_WLAN_BLUE	1
+#define WPN824N_WGPIO_LED_WPS1_BLUE	5
+#define WPN824N_WGPIO_LED_WPS2_BLUE	9
+#define WPN824N_WGPIO_LED_TEST_AMBER	10
+#define WPN824N_WGPIO_BTN_PUSH		6	/* currently unused */
+#define WPN824N_WGPIO_BTN_RESET		7	/* currently unused */
+#define WPN824N_WGPIO_BTN_WLAN		8	/* currently unused */
+
 #define WNR2000V3_KEYS_POLL_INTERVAL	20	/* msecs */
 #define WNR2000V3_KEYS_DEBOUNCE_INTERVAL	(3 * WNR2000V3_KEYS_POLL_INTERVAL)
 
@@ -73,6 +99,78 @@ static struct gpio_led wnr1000v2_leds_gpio[] __initdata = {
 	}
 };
 
+static struct gpio_led wpn824n_leds_gpio[] __initdata = {
+	{
+		.name		= "netgear:amber:wan",
+		.gpio		= WPN824N_GPIO_LED_WAN_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:status",
+		.gpio		= WPN824N_GPIO_LED_STATUS_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan1",
+		.gpio		= WPN824N_GPIO_LED_LAN1_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan2",
+		.gpio		= WPN824N_GPIO_LED_LAN2_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan3",
+		.gpio		= WPN824N_GPIO_LED_LAN3_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:lan4",
+		.gpio		= WPN824N_GPIO_LED_LAN4_AMBER,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan1",
+		.gpio		= WPN824N_GPIO_LED_LAN1_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan2",
+		.gpio		= WPN824N_GPIO_LED_LAN2_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan3",
+		.gpio		= WPN824N_GPIO_LED_LAN3_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:lan4",
+		.gpio		= WPN824N_GPIO_LED_LAN4_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:green:wan",
+		.gpio		= WPN824N_GPIO_LED_WAN_GREEN,
+		.active_low	= 1,
+	}
+};
+
+static struct gpio_led wpn824n_wmac_leds_gpio[] = {
+	{
+		.name		= "netgear:green:power",
+		.gpio		= WPN824N_WGPIO_LED_PWR_GREEN,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:blue:wlan",
+		.gpio		= WPN824N_WGPIO_LED_WLAN_BLUE,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:blue:wps1",
+		.gpio		= WPN824N_WGPIO_LED_WPS1_BLUE,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:blue:wps2",
+		.gpio		= WPN824N_WGPIO_LED_WPS2_BLUE,
+		.active_low	= 1,
+	}, {
+		.name		= "netgear:amber:test",
+		.gpio		= WPN824N_WGPIO_LED_TEST_AMBER,
+		.active_low	= 1,
+	}
+};
+
 static struct gpio_keys_button wnr2000v3_gpio_keys[] __initdata = {
 	{
 		.desc		= "wps",
@@ -138,3 +236,25 @@ static void __init wnr1000v2_setup(void)
 }
 
 MIPS_MACHINE(ATH79_MACH_WNR1000_V2, "WNR1000V2", "NETGEAR WNR1000 V2", wnr1000v2_setup);
+
+static void __init wpn824n_setup(void)
+{
+	ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE,
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN |
+				  AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN |
+				  AR724X_GPIO_FUNC_CLK_OBS3_EN);
+
+	wnr_common_setup();
+
+	ath79_register_leds_gpio(-1, ARRAY_SIZE(wpn824n_leds_gpio),
+				 wpn824n_leds_gpio);
+
+	ap9x_pci_setup_wmac_led_pin(0, WPN824N_WGPIO_LED_WLAN_BLUE);
+	ap9x_pci_setup_wmac_leds(0, wpn824n_wmac_leds_gpio,
+				 ARRAY_SIZE(wpn824n_wmac_leds_gpio));
+}
+
+MIPS_MACHINE(ATH79_MACH_WPN824N, "WPN824N", "NETGEAR WPN824N", wpn824n_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wpj531.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wpj531.c
index bc13d7019f0fa896977f4340de55f6b40cd7c9c7..8a238da7d596d6280625484c56ca0a60ad504b17 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wpj531.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wpj531.c
@@ -94,9 +94,8 @@ static struct gpio_keys_button wpj531_gpio_keys[] __initdata = {
 
 static void __init common_setup(void)
 {
-	u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
-	u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
-	u8 tmpmac[ETH_ALEN];
+	u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
+	u8 *mac = (u8 *) KSEG1ADDR(0x1f02e000);
 
 	ath79_register_m25p80(NULL);
 
@@ -105,18 +104,26 @@ static void __init common_setup(void)
 	ath79_register_mdio(0, 0x0);
 
 	/* LAN */
-	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
+	ath79_eth0_data.duplex = DUPLEX_FULL;
+	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
+	ath79_eth0_data.speed = SPEED_100;
+	ath79_eth0_data.phy_mask = BIT(4);
+	ath79_init_mac(ath79_eth0_data.mac_addr, mac + WPJ531_MAC0_OFFSET, 0);
 	ath79_register_eth(0);
 
 	/* WAN */
 	ath79_switch_data.phy4_mii_en = 1;
-	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
-	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1);
+	ath79_eth1_data.duplex = DUPLEX_FULL;
+	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
+	ath79_eth1_data.speed = SPEED_1000;
+	ath79_switch_data.phy_poll_mask |= BIT(4);
+	ath79_init_mac(ath79_eth1_data.mac_addr, mac + WPJ531_MAC1_OFFSET, 0);
 	ath79_register_eth(1);
 
-	ath79_register_wmac(ee, tmpmac);
+	ath79_register_wmac(art + WPJ531_WMAC_CALDATA_OFFSET, NULL);
 
 	ath79_register_pci();
+	ath79_register_usb();
 }
 
 static void __init wpj531_setup(void)
diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
index 7241f1452069a2998ec11f57d0ba2388e315d296..f06ef3455b9acf566234a336b8c5f2b5ae1de447 100644
--- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
+++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
@@ -498,14 +498,16 @@ static void ag71xx_fast_reset(struct ag71xx *ag)
 	struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
 	struct net_device *dev = ag->dev;
 	u32 reset_mask = pdata->reset_bit;
-	u32 rx_ds, tx_ds;
+	u32 rx_ds;
 	u32 mii_reg;
 
 	reset_mask &= AR71XX_RESET_GE0_MAC | AR71XX_RESET_GE1_MAC;
 
+	ag71xx_hw_stop(ag);
+	wmb();
+
 	mii_reg = ag71xx_rr(ag, AG71XX_REG_MII_CFG);
 	rx_ds = ag71xx_rr(ag, AG71XX_REG_RX_DESC);
-	tx_ds = ag71xx_rr(ag, AG71XX_REG_TX_DESC);
 
 	ath79_device_reset_set(reset_mask);
 	udelay(10);
@@ -515,13 +517,16 @@ static void ag71xx_fast_reset(struct ag71xx *ag)
 	ag71xx_dma_reset(ag);
 	ag71xx_hw_setup(ag);
 	ag71xx_tx_packets(ag, true);
+	ag->tx_ring.curr = 0;
+	ag->tx_ring.dirty = 0;
+	netdev_reset_queue(ag->dev);
 
 	/* setup max frame length */
 	ag71xx_wr(ag, AG71XX_REG_MAC_MFL,
 		  ag71xx_max_frame_len(ag->dev->mtu));
 
 	ag71xx_wr(ag, AG71XX_REG_RX_DESC, rx_ds);
-	ag71xx_wr(ag, AG71XX_REG_TX_DESC, tx_ds);
+	ag71xx_wr(ag, AG71XX_REG_TX_DESC, ag->tx_ring.descs_dma);
 	ag71xx_wr(ag, AG71XX_REG_MII_CFG, mii_reg);
 
 	ag71xx_hw_set_macaddr(ag, dev->dev_addr);
@@ -538,7 +543,8 @@ static void ag71xx_hw_start(struct ag71xx *ag)
 	netif_wake_queue(ag->dev);
 }
 
-void ag71xx_link_adjust(struct ag71xx *ag)
+static void
+__ag71xx_link_adjust(struct ag71xx *ag, bool update)
 {
 	struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
 	u32 cfg2;
@@ -546,7 +552,7 @@ void ag71xx_link_adjust(struct ag71xx *ag)
 	u32 fifo5;
 	u32 fifo3;
 
-	if (!ag->link) {
+	if (!ag->link && update) {
 		ag71xx_hw_stop(ag);
 		netif_carrier_off(ag->dev);
 		if (netif_msg_link(ag))
@@ -598,7 +604,7 @@ void ag71xx_link_adjust(struct ag71xx *ag)
 
 	ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, fifo3);
 
-	if (pdata->set_speed)
+	if (update && pdata->set_speed)
 		pdata->set_speed(ag->speed);
 
 	ag71xx_wr(ag, AG71XX_REG_MAC_CFG2, cfg2);
@@ -607,7 +613,7 @@ void ag71xx_link_adjust(struct ag71xx *ag)
 	ag71xx_hw_start(ag);
 
 	netif_carrier_on(ag->dev);
-	if (netif_msg_link(ag))
+	if (update && netif_msg_link(ag))
 		pr_info("%s: link up (%sMbps/%s duplex)\n",
 			ag->dev->name,
 			ag71xx_speed_str(ag),
@@ -631,34 +637,66 @@ void ag71xx_link_adjust(struct ag71xx *ag)
 		ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL));
 }
 
+void ag71xx_link_adjust(struct ag71xx *ag)
+{
+	__ag71xx_link_adjust(ag, true);
+}
+
+static int ag71xx_hw_enable(struct ag71xx *ag)
+{
+	int ret;
+
+	ret = ag71xx_rings_init(ag);
+	if (ret)
+		return ret;
+
+	napi_enable(&ag->napi);
+	ag71xx_wr(ag, AG71XX_REG_TX_DESC, ag->tx_ring.descs_dma);
+	ag71xx_wr(ag, AG71XX_REG_RX_DESC, ag->rx_ring.descs_dma);
+	netif_start_queue(ag->dev);
+
+	return 0;
+}
+
+static void ag71xx_hw_disable(struct ag71xx *ag)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&ag->lock, flags);
+
+	netif_stop_queue(ag->dev);
+
+	ag71xx_hw_stop(ag);
+	ag71xx_dma_reset(ag);
+
+	napi_disable(&ag->napi);
+	del_timer_sync(&ag->oom_timer);
+
+	spin_unlock_irqrestore(&ag->lock, flags);
+
+	ag71xx_rings_cleanup(ag);
+}
+
 static int ag71xx_open(struct net_device *dev)
 {
 	struct ag71xx *ag = netdev_priv(dev);
 	unsigned int max_frame_len;
 	int ret;
 
+	netif_carrier_off(dev);
 	max_frame_len = ag71xx_max_frame_len(dev->mtu);
 	ag->rx_buf_size = max_frame_len + NET_SKB_PAD + NET_IP_ALIGN;
 
 	/* setup max frame length */
 	ag71xx_wr(ag, AG71XX_REG_MAC_MFL, max_frame_len);
+	ag71xx_hw_set_macaddr(ag, dev->dev_addr);
 
-	ret = ag71xx_rings_init(ag);
+	ret = ag71xx_hw_enable(ag);
 	if (ret)
 		goto err;
 
-	napi_enable(&ag->napi);
-
-	netif_carrier_off(dev);
 	ag71xx_phy_start(ag);
 
-	ag71xx_wr(ag, AG71XX_REG_TX_DESC, ag->tx_ring.descs_dma);
-	ag71xx_wr(ag, AG71XX_REG_RX_DESC, ag->rx_ring.descs_dma);
-
-	ag71xx_hw_set_macaddr(ag, dev->dev_addr);
-
-	netif_start_queue(dev);
-
 	return 0;
 
 err:
@@ -669,24 +707,10 @@ err:
 static int ag71xx_stop(struct net_device *dev)
 {
 	struct ag71xx *ag = netdev_priv(dev);
-	unsigned long flags;
 
 	netif_carrier_off(dev);
 	ag71xx_phy_stop(ag);
-
-	spin_lock_irqsave(&ag->lock, flags);
-
-	netif_stop_queue(dev);
-
-	ag71xx_hw_stop(ag);
-	ag71xx_dma_reset(ag);
-
-	napi_disable(&ag->napi);
-	del_timer_sync(&ag->oom_timer);
-
-	spin_unlock_irqrestore(&ag->lock, flags);
-
-	ag71xx_rings_cleanup(ag);
+	ag71xx_hw_disable(ag);
 
 	return 0;
 }
@@ -870,14 +894,12 @@ static void ag71xx_restart_work_func(struct work_struct *work)
 {
 	struct ag71xx *ag = container_of(work, struct ag71xx, restart_work);
 
-	if (ag71xx_get_pdata(ag)->is_ar724x) {
-		ag->link = 0;
-		ag71xx_link_adjust(ag);
-		return;
-	}
-
-	ag71xx_stop(ag->dev);
-	ag71xx_open(ag->dev);
+	rtnl_lock();
+	ag71xx_hw_disable(ag);
+	ag71xx_hw_enable(ag);
+	if (ag->link)
+		__ag71xx_link_adjust(ag, false);
+	rtnl_unlock();
 }
 
 static bool ag71xx_check_dma_stuck(struct ag71xx *ag, unsigned long timestamp)
@@ -919,12 +941,15 @@ static int ag71xx_tx_packets(struct ag71xx *ag, bool flush)
 		struct sk_buff *skb = ring->buf[i].skb;
 
 		if (!flush && !ag71xx_desc_empty(desc)) {
-			if (pdata->is_ar7240 &&
+			if (pdata->is_ar724x &&
 			    ag71xx_check_dma_stuck(ag, ring->buf[i].timestamp))
 				schedule_work(&ag->restart_work);
 			break;
 		}
 
+		if (flush)
+			desc->ctrl |= DESC_EMPTY;
+
 		n++;
 		if (!skb)
 			continue;
diff --git a/target/linux/ar71xx/generic/profiles/alfa.mk b/target/linux/ar71xx/generic/profiles/alfa.mk
index 6e259dc602bae64b6c133f0d21b000cc91bd91db..397e96192fa4fdec17f1ebc43263a37b9e9adf63 100644
--- a/target/linux/ar71xx/generic/profiles/alfa.mk
+++ b/target/linux/ar71xx/generic/profiles/alfa.mk
@@ -17,6 +17,18 @@ endef
 $(eval $(call Profile,ALFAAP96))
 
 
+define Profile/ALFAAP120C
+	NAME:=ALFA Network AP120C board
+	PACKAGES:=uboot-envtools
+endef
+
+define Profile/ALFAAP120C/Description
+	Package set optimized for the ALFA Network AP120C board.
+endef
+
+$(eval $(call Profile,ALFAAP120C))
+
+
 define Profile/HORNETUB
 	NAME:=ALFA Network Hornet-UB board (8MB flash, 32MB ram)
 	PACKAGES:=kmod-usb-core kmod-usb2 kmod-ledtrig-usbdev
diff --git a/target/linux/ar71xx/generic/profiles/netgear.mk b/target/linux/ar71xx/generic/profiles/netgear.mk
index 16b1087635df49e1c2cb61ec47675cdfa27de5b4..ca22a18dd5980ebd2ef725fcdd5b608d6a2c2989 100644
--- a/target/linux/ar71xx/generic/profiles/netgear.mk
+++ b/target/linux/ar71xx/generic/profiles/netgear.mk
@@ -82,3 +82,13 @@ define Profile/WNR2200/Description
 endef
 
 $(eval $(call Profile,WNR2200))
+
+define Profile/WPN824N
+	NAME:=NETGEAR WPN824N
+endef
+
+define Profile/WPN824N/Description
+	Package set optimized for the NETGEAR WPN824N
+endef
+
+$(eval $(call Profile,WPN824N))
diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile
index 43366971bc8b2b8ca08f3fe531b5355b1eafbb1b..9a7acbdc72bff03c6027b658ea06e79d1942a597 100644
--- a/target/linux/ar71xx/image/Makefile
+++ b/target/linux/ar71xx/image/Makefile
@@ -501,6 +501,21 @@ define Device/tl-wr740n-v4
     CONSOLE := ttyATH0,115200
 endef
 
+define Device/tl-wr740n-v5
+    $(Device/tplink-4mlzma)
+    BOARDNAME := TL-WR741ND-v4
+    DEVICE_PROFILE := TLWR740
+    TPLINK_HWID := 0x07400005
+    CONSOLE := ttyATH0,115200
+endef
+
+define Device/tl-wr740n-v6
+    $(Device/tplink-4mlzma)
+    BOARDNAME := TL-WR841N-v9
+    DEVICE_PROFILE := TLWR740
+    TPLINK_HWID := 0x07400006
+endef
+
 define Device/tl-wr741nd-v1
     $(Device/tplink-4m)
     BOARDNAME := TL-WR741ND
@@ -523,6 +538,14 @@ define Device/tl-wr741nd-v4
     CONSOLE := ttyATH0,115200
 endef
 
+define Device/tl-wr741nd-v5
+    $(Device/tplink-4mlzma)
+    BOARDNAME := TL-WR741ND-v4
+    DEVICE_PROFILE := TLWR741
+    TPLINK_HWID := 0x07400005
+    CONSOLE := ttyATH0,115200
+endef
+
 define Device/tl-wr743nd-v2
     $(Device/tplink-4mlzma)
     BOARDNAME := TL-WR741ND-v4
@@ -530,7 +553,7 @@ define Device/tl-wr743nd-v2
     TPLINK_HWID := 0x07430002
     CONSOLE := ttyATH0,115200
 endef
-TARGET_DEVICES += tl-wr740n-v4 tl-wr741nd-v1 tl-wr741nd-v2 tl-wr741nd-v4 tl-wr743nd-v2
+TARGET_DEVICES += tl-wr740n-v4 tl-wr740n-v5 tl-wr740n-v6 tl-wr741nd-v1 tl-wr741nd-v2 tl-wr741nd-v4 tl-wr741nd-v5 tl-wr743nd-v2
 
 define Device/tl-wr841n-v8
     $(Device/tplink-4mlzma)
@@ -553,6 +576,13 @@ define Device/tl-wr841n-v10
     TPLINK_HWID := 0x08410010
 endef
 
+define Device/tl-wr841n-v11
+    $(Device/tplink-4mlzma)
+    BOARDNAME := TL-WR841N-v9
+    DEVICE_PROFILE := TLWR841
+    TPLINK_HWID := 0x08410011
+endef
+
 define Device/tl-wr842n-v2
     $(Device/tplink-8mlzma)
     BOARDNAME := TL-WR842N-v2
@@ -573,7 +603,7 @@ define Device/tl-wr847n-v8
     DEVICE_PROFILE := TLWR841
     TPLINK_HWID := 0x08470008
 endef
-TARGET_DEVICES += tl-wr841n-v8 tl-wr841n-v9 tl-wr841n-v10 tl-wr842n-v2 tl-wr843nd-v1 tl-wr847n-v8
+TARGET_DEVICES += tl-wr841n-v8 tl-wr841n-v9 tl-wr841n-v10 tl-wr841n-v11 tl-wr842n-v2 tl-wr843nd-v1 tl-wr847n-v8
 
 define Device/tl-wr941nd-v5
     $(Device/tplink-4mlzma)
@@ -583,12 +613,20 @@ define Device/tl-wr941nd-v5
 endef
 
 define Device/tl-wr941nd-v6
+    $(Device/tplink-4mlzma)
+    BOARDNAME := TL-WR941ND-v6
+    DEVICE_PROFILE := TLWR941
+    TPLINK_HWID := 0x09410006
+endef
+
+# Chinese version (unlike European) is similar to the TL-WDR3500
+define Device/tl-wr941nd-v6-cn
     $(Device/tplink-4mlzma)
     BOARDNAME := TL-WDR3500
     DEVICE_PROFILE := TLWR941
     TPLINK_HWID := 0x09410006
 endef
-TARGET_DEVICES += tl-wr941nd-v5 tl-wr941nd-v6
+TARGET_DEVICES += tl-wr941nd-v5 tl-wr941nd-v6 tl-wr941nd-v6-cn
 
 define Device/tl-wr1041n-v2
     $(Device/tplink-4mlzma)
@@ -657,7 +695,15 @@ define Device/tl-wa901nd-v3
     DEVICE_PROFILE := TLWA901
     TPLINK_HWID := 0x09010003
 endef
-TARGET_DEVICES += tl-wa901nd-v3
+
+define Device/tl-wa901nd-v4
+    $(Device/tplink-4mlzma)
+    BOARDNAME := TL-WA901ND-v4
+    DEVICE_PROFILE := TLWA901
+    TPLINK_HWID := 0x09010004
+endef
+
+TARGET_DEVICES += tl-wa901nd-v3 tl-wa901nd-v4
 
 define Device/tl-wa7210n-v2
     $(Device/tplink-4mlzma)
@@ -948,6 +994,7 @@ define Build/Clean
 endef
 
 
+alfa_ap120c_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,13312k(rootfs),1536k(kernel),1152k(unknown)ro,64k(art)ro;spi0.1:-(unknown)
 alfa_ap96_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,256k(u-boot-env)ro,13312k(rootfs),2048k(kernel),512k(caldata)ro,15360k@0x80000(firmware)
 alfa_mtdlayout_8M=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6144k(rootfs),1600k(kernel),64k(nvram),64k(art)ro,7744k@0x50000(firmware)
 alfa_mtdlayout_16M=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,15936k(firmware),64k(nvram),64k(art)ro
@@ -1869,6 +1916,7 @@ $(eval $(call SingleProfile,AthGzip,64k,AP96,ap96,AP96,ttyS0,115200,$$(ap96_mtdl
 $(eval $(call SingleProfile,AthGzip,64k,WNDAP360,wndap360,WNDAP360,ttyS0,9600,$$(wndap360_mtdlayout),KRuImage))
 
 $(eval $(call SingleProfile,AthLzma,64k,ALFAAP96,alfa-ap96,ALFA-AP96,ttyS0,115200,$$(alfa_ap96_mtdlayout),RKuImage))
+$(eval $(call SingleProfile,AthLzma,64k,ALFAAP120C,alfa-ap120c,ALFA-AP120C,ttyS0,115200,$$(alfa_ap120c_mtdlayout),RKuImage))
 $(eval $(call SingleProfile,AthLzma,64k,ALL0258N,all0258n,ALL0258N,ttyS0,115200,$$(all0258n_mtdlayout),KRuImage,65536))
 $(eval $(call SingleProfile,AthLzma,256k,ALL0315N,all0315n,ALL0315N,ttyS0,115200,$$(all0315n_mtdlayout),KRuImage,262144))
 $(eval $(call SingleProfile,AthLzma,64k,AP113,ap113,AP113,ttyS0,115200,$$(ap113_mtd_layout),RK))
@@ -1958,6 +2006,7 @@ $(eval $(call SingleProfile,Netgear,64kraw,REALWNR612V2,wnr612v2,WNR612V2,ttyS0,
 $(eval $(call SingleProfile,Netgear,64kraw,N150R,n150r,WNR612V2,ttyS0,115200,$$(wnr2000v3_mtdlayout),0x32303631,N150R,"",))
 $(eval $(call SingleProfile,Netgear,64kraw,REALWNR1000V2,wnr1000v2,WNR1000V2,ttyS0,115200,$$(wnr2000v3_mtdlayout),0x31303031,WNR1000V2,"",))
 $(eval $(call SingleProfile,Netgear,64kraw,WNR1000V2_VC,wnr1000v2-vc,WNR1000V2,ttyS0,115200,$$(wnr2000v3_mtdlayout),0x31303030,WNR1000V2-VC,"",))
+$(eval $(call SingleProfile,Netgear,64kraw,WPN824N,wpn824n,WPN824N,ttyS0,115200,$$(wnr2000v3_mtdlayout),0x31313030,WPN824N,"" NA,))
 
 $(eval $(call SingleProfile,OpenMesh,squashfs-only,OM2P,om2p,,,,OM2P))
 $(eval $(call SingleProfile,OpenMesh,squashfs-only,OM5P,om5p,,,,OM5P))
@@ -2007,6 +2056,7 @@ $(eval $(call SingleProfile,TPLINK,64kraw,TLWR941NV4,tl-wr941nd-v4,TL-WR741ND,tt
 $(eval $(call SingleProfile,TPLINK,64kraw,TLWR1043V1,tl-wr1043nd-v1,TL-WR1043ND,ttyS0,115200,0x10430001,1,8M))
 
 $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR1043ND-v2,ttyS0,115200,0x10430002,1,8M))
+$(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V3,tl-wr1043nd-v3,TL-WR1043ND-v2,ttyS0,115200,0x10430003,1,8M))
 $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR2543,tl-wr2543-v1,TL-WR2543N,ttyS0,115200,0x25430001,1,8Mlzma,-v 3.13.99))
 
 $(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE510,cpe210-220-510-520,CPE510,ttyS0,115200,$$(cpe510_mtdlayout),CPE510))
@@ -2014,7 +2064,7 @@ $(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE510,cpe210-220-510-520,C
 $(eval $(call SingleProfile,UAPPRO,64k,UAPPRO,ubnt-uap-pro,UAP-PRO,ttyS0,115200,BZ,BZ,ar934x))
 $(eval $(call SingleProfile,UAPPRO,64k,UBNTUNIFIOUTDOORPLUS,ubnt-unifi-outdoor-plus,UBNT-UOP,ttyS0,115200,BZ,BZ,ar7240))
 
-$(eval $(call SingleProfile,UBDEV,64kraw,UBDEV01,ubdev01,UBNT-UF,ttyS0,115200,XM,XM,ar7240))
+$(eval $(call SingleProfile,UBDEV,64kraw,UBDEV01,ubdev01,UBNT-UF,ttyS0,115200,UBDEV01,XM,ar7240))
 
 $(eval $(call SingleProfile,UBNT,64k,UBNTRS,ubnt-rs,UBNT-RS,ttyS0,115200,RS,RSx,ar7100))
 $(eval $(call SingleProfile,UBNT,64k,UBNTRSPRO,ubnt-rspro,UBNT-RSPRO,ttyS0,115200,RSPRO,RSPRO,ar7100pro))
@@ -2071,7 +2121,7 @@ $(eval $(call MultiProfile,TLWR743,TLWR743NV1))
 $(eval $(call MultiProfile,TLWR841,TLWR841NV15 TLWR841NV3 TLWR841NV5 TLWR841NV7))
 $(eval $(call MultiProfile,TLWR842,TLWR842V1))
 $(eval $(call MultiProfile,TLWR941,TLWR941NV2 TLWR941NV3 TLWR941NV4))
-$(eval $(call MultiProfile,TLWR1043,TLWR1043V1 TLWR1043V2))
+$(eval $(call MultiProfile,TLWR1043,TLWR1043V1 TLWR1043V2 TLWR1043V3))
 $(eval $(call MultiProfile,TLWDR4300,TLWDR3500V1 TLWDR3600V1 TLWDR4300V1 TLWDR4300V1IL TLWDR4310V1 MW4530RV1))
 $(eval $(call MultiProfile,TUBE2H,TUBE2H8M TUBE2H16M))
 $(eval $(call MultiProfile,UBNT,UBNTAIRROUTER UBNTRS UBNTRSPRO UBNTLSSR71 UBNTBULLETM UBNTROCKETM UBNTROCKETMXW UBNTNANOM UBNTNANOMXW UBNTLOCOXW UBNTUNIFI UBNTUNIFIOUTDOOR UBNTUNIFIOUTDOORPLUS UAPPRO UBNTAIRGW))
diff --git a/target/linux/ar71xx/image/lzma-loader/src/head.S b/target/linux/ar71xx/image/lzma-loader/src/head.S
index 543996a0da4701cca80481aa181cd7bddc6df5c6..47a7c9bd6300ad92e6a0d426c5f44bc0f3e7e85f 100644
--- a/target/linux/ar71xx/image/lzma-loader/src/head.S
+++ b/target/linux/ar71xx/image/lzma-loader/src/head.S
@@ -109,6 +109,9 @@ __bss_check:
 	/* Setup new "C" stack */
 	la	sp, _stack
 
+	/* reserve stack space for a0-a3 registers */
+	subu	sp, 16
+
 	/* jump to the decompressor routine */
 	la	t0, loader_main
 	jr	t0
diff --git a/target/linux/ar71xx/patches-3.18/003-MIPS-ath79-make-bootconsole-wait-for-both-THRE-and-T.patch b/target/linux/ar71xx/patches-3.18/003-MIPS-ath79-make-bootconsole-wait-for-both-THRE-and-T.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2eba263732a39d71922252d8276450cd8c4851e3
--- /dev/null
+++ b/target/linux/ar71xx/patches-3.18/003-MIPS-ath79-make-bootconsole-wait-for-both-THRE-and-T.patch
@@ -0,0 +1,49 @@
+From f1ba020af5076172c9d29006a747ccf40027fedc Mon Sep 17 00:00:00 2001
+Message-Id: <f1ba020af5076172c9d29006a747ccf40027fedc.1458840219.git.mschiffer@universe-factory.net>
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Thu, 24 Mar 2016 15:34:05 +0100
+Subject: [PATCH] MIPS: ath79: make bootconsole wait for both THRE and TEMT
+
+This makes the ath79 bootconsole behave the same way as the generic 8250
+bootconsole.
+
+Also waiting for TEMT (transmit buffer is empty) instead of just THRE
+(transmit buffer is not full) ensures that all characters have been
+transmitted before the real serial driver starts reconfiguring the serial
+controller (which would sometimes result in garbage being transmitted.)
+This change does not cause a visible performance loss.
+
+In addition, this seems to fix a hang observed in certain configurations on
+many AR7xxx/AR9xxx SoCs during autoconfig of the real serial driver.
+
+A more complete follow-up patch will disable 8250 autoconfig for ath79
+altogether (the serial controller is detected as a 16550A, which is not
+fully compatible with the ath79 serial, and the autoconfig may lead to
+undefined behavior on ath79.)
+
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
+---
+ arch/mips/ath79/early_printk.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/arch/mips/ath79/early_printk.c
++++ b/arch/mips/ath79/early_printk.c
+@@ -31,13 +31,15 @@ static inline void prom_putchar_wait(voi
+ 	} while (1);
+ }
+ 
++#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
++
+ static void prom_putchar_ar71xx(unsigned char ch)
+ {
+ 	void __iomem *base = (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE));
+ 
+-	prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE);
++	prom_putchar_wait(base + UART_LSR * 4, BOTH_EMPTY, BOTH_EMPTY);
+ 	__raw_writel(ch, base + UART_TX * 4);
+-	prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE);
++	prom_putchar_wait(base + UART_LSR * 4, BOTH_EMPTY, BOTH_EMPTY);
+ }
+ 
+ static void prom_putchar_ar933x(unsigned char ch)
diff --git a/target/linux/ar71xx/patches-3.18/521-MIPS-ath79-enable-UART-for-early_serial.patch b/target/linux/ar71xx/patches-3.18/521-MIPS-ath79-enable-UART-for-early_serial.patch
index 3d6ddfe18c58a7d95fab10bc9eb0cd9691ebcf34..e546ff26fedd0e971a6ead9f9c9acca6fa9c7572 100644
--- a/target/linux/ar71xx/patches-3.18/521-MIPS-ath79-enable-UART-for-early_serial.patch
+++ b/target/linux/ar71xx/patches-3.18/521-MIPS-ath79-enable-UART-for-early_serial.patch
@@ -1,6 +1,6 @@
 --- a/arch/mips/ath79/early_printk.c
 +++ b/arch/mips/ath79/early_printk.c
-@@ -56,6 +56,46 @@ static void prom_putchar_dummy(unsigned
+@@ -58,6 +58,46 @@ static void prom_putchar_dummy(unsigned
  	/* nothing to do */
  }
  
@@ -47,7 +47,7 @@
  static void prom_putchar_init(void)
  {
  	void __iomem *base;
-@@ -86,8 +126,10 @@ static void prom_putchar_init(void)
+@@ -88,8 +128,10 @@ static void prom_putchar_init(void)
  
  	default:
  		_prom_putchar = prom_putchar_dummy;
diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch
index 2fa041ba933d90257d39ab5e5f66585d830f33c2..d6e786dd6264fd9f72e9078ddea6f254ccbe3102 100644
--- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch
+++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch
@@ -1,9 +1,10 @@
 --- a/arch/mips/ath79/machtypes.h
 +++ b/arch/mips/ath79/machtypes.h
-@@ -16,22 +16,197 @@
+@@ -16,22 +16,199 @@
  
  enum ath79_mach_type {
  	ATH79_MACH_GENERIC = 0,
++	ATH79_MACH_ALFA_AP120C,		/* ALFA Network AP120C board */
 +	ATH79_MACH_ALFA_AP96,		/* ALFA Network AP96 board */
 +	ATH79_MACH_ALFA_NX,		/* ALFA Network N2/N5 board */
 +	ATH79_MACH_ALL0258N,		/* Allnet ALL0258N */
@@ -148,6 +149,7 @@
 +	ATH79_MACH_TL_WR842N_V2,	/* TP-LINK TL-WR842N/ND v2 */
 +	ATH79_MACH_TL_WR941ND,		/* TP-LINK TL-WR941ND */
 +	ATH79_MACH_TL_WR941ND_V5,	/* TP-LINK TL-WR941ND v5 */
++	ATH79_MACH_TL_WR941ND_V6,	/* TP-LINK TL-WR941ND v6 */
 +	ATH79_MACH_TUBE2H,		/* Alfa Network Tube2H */
 +	ATH79_MACH_UBNT_AIRGW,		/* Ubiquiti AirGateway */
  	ATH79_MACH_UBNT_AIRROUTER,	/* Ubiquiti AirRouter */
@@ -200,10 +202,19 @@
  #endif /* _ATH79_MACHTYPE_H */
 --- a/arch/mips/ath79/Kconfig
 +++ b/arch/mips/ath79/Kconfig
-@@ -2,6 +2,70 @@ if ATH79
+@@ -2,6 +2,79 @@ if ATH79
  
  menu "Atheros AR71XX/AR724X/AR913X machine selection"
  
++config ATH79_MACH_ALFA_AP120C
++	bool "ALFA Network AP120C board support"
++	select SOC_AR71XX
++	select ATH79_DEV_AP9X_PCI if PCI
++	select ATH79_DEV_ETH
++	select ATH79_DEV_GPIO_BUTTONS
++	select ATH79_DEV_M25P80
++	select ATH79_DEV_WMAC
++
 +config ATH79_MACH_ALFA_AP96
 +	bool "ALFA Network AP96 board support"
 +	select SOC_AR71XX
@@ -271,7 +282,7 @@
  config ATH79_MACH_AP121
  	bool "Atheros AP121 reference board"
  	select SOC_AR933X
-@@ -11,62 +75,1041 @@ config ATH79_MACH_AP121
+@@ -11,62 +84,1050 @@ config ATH79_MACH_AP121
  	select ATH79_DEV_M25P80
  	select ATH79_DEV_USB
  	select ATH79_DEV_WMAC
@@ -1246,6 +1257,15 @@
 +	select ATH79_DEV_M25P80
 +	select ATH79_DEV_WMAC
 +
++config ATH79_MACH_TL_WR941ND_V6
++	bool "TP-LINK TL-WR941ND v6 support"
++	select SOC_QCA956X
++	select ATH79_DEV_ETH
++	select ATH79_DEV_GPIO_BUTTONS
++	select ATH79_DEV_LEDS_GPIO
++	select ATH79_DEV_M25P80
++	select ATH79_DEV_WMAC
++
 +config ATH79_MACH_TL_WR1041N_V2
 +	bool "TP-LINK TL-WR1041N v2 support"
 +	select SOC_AR934X
@@ -1341,7 +1361,7 @@
  
  config ATH79_MACH_UBNT_XM
  	bool "Ubiquiti Networks XM/UniFi boards"
-@@ -83,6 +1126,106 @@ config ATH79_MACH_UBNT_XM
+@@ -83,6 +1144,106 @@ config ATH79_MACH_UBNT_XM
  	  Say 'Y' here if you want your kernel to support the
  	  Ubiquiti Networks XM (rev 1.0) board.
  
@@ -1448,7 +1468,7 @@
  endmenu
  
  config SOC_AR71XX
-@@ -124,7 +1267,10 @@ config ATH79_DEV_DSA
+@@ -124,7 +1285,10 @@ config ATH79_DEV_DSA
  config ATH79_DEV_ETH
  	def_bool n
  
@@ -1460,7 +1480,7 @@
  	def_bool n
  
  config ATH79_DEV_GPIO_BUTTONS
-@@ -154,6 +1300,11 @@ config ATH79_PCI_ATH9K_FIXUP
+@@ -154,6 +1318,11 @@ config ATH79_PCI_ATH9K_FIXUP
  	def_bool n
  
  config ATH79_ROUTERBOOT
@@ -1474,10 +1494,11 @@
  endif
 --- a/arch/mips/ath79/Makefile
 +++ b/arch/mips/ath79/Makefile
-@@ -38,9 +38,126 @@ obj-$(CONFIG_ATH79_ROUTERBOOT)		+= route
+@@ -38,9 +38,128 @@ obj-$(CONFIG_ATH79_ROUTERBOOT)		+= route
  #
  # Machines
  #
++obj-$(CONFIG_ATH79_MACH_ALFA_AP120C)	+= mach-alfa-ap120c.o
 +obj-$(CONFIG_ATH79_MACH_ALFA_AP96)	+= mach-alfa-ap96.o
 +obj-$(CONFIG_ATH79_MACH_ALFA_NX)	+= mach-alfa-nx.o
 +obj-$(CONFIG_ATH79_MACH_ALL0258N)	+= mach-all0258n.o
@@ -1566,6 +1587,7 @@
 +obj-$(CONFIG_ATH79_MACH_TL_WR841N_V8)	+= mach-tl-wr841n-v8.o
 +obj-$(CONFIG_ATH79_MACH_TL_WR841N_V9)	+= mach-tl-wr841n-v9.o
 +obj-$(CONFIG_ATH79_MACH_TL_WR941ND)	+= mach-tl-wr941nd.o
++obj-$(CONFIG_ATH79_MACH_TL_WR941ND_V6)	+= mach-tl-wr941nd-v6.o
 +obj-$(CONFIG_ATH79_MACH_TL_WR1041N_V2)	+= mach-tl-wr1041n-v2.o
 +obj-$(CONFIG_ATH79_MACH_TL_WR1043ND)	+= mach-tl-wr1043nd.o
 +obj-$(CONFIG_ATH79_MACH_TL_WR1043ND_V2)	+= mach-tl-wr1043nd-v2.o
diff --git a/target/linux/ar71xx/patches-3.18/707-MIPS-ath79-add-support-for-QCA953x-SoC.patch b/target/linux/ar71xx/patches-3.18/707-MIPS-ath79-add-support-for-QCA953x-SoC.patch
index f3b444639d02b77c64fb34f3117177ef554441f3..e432c6f3b66d22491b4a982f0e8222eed65fde40 100644
--- a/target/linux/ar71xx/patches-3.18/707-MIPS-ath79-add-support-for-QCA953x-SoC.patch
+++ b/target/linux/ar71xx/patches-3.18/707-MIPS-ath79-add-support-for-QCA953x-SoC.patch
@@ -22,7 +22,7 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
 
 --- a/arch/mips/ath79/Kconfig
 +++ b/arch/mips/ath79/Kconfig
-@@ -1248,6 +1248,10 @@ config SOC_AR934X
+@@ -1266,6 +1266,10 @@ config SOC_AR934X
  	select PCI_AR724X if PCI
  	def_bool n
  
@@ -33,7 +33,7 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  config SOC_QCA955X
  	select HW_HAS_PCI
  	select PCI_AR724X if PCI
-@@ -1290,7 +1294,7 @@ config ATH79_DEV_USB
+@@ -1308,7 +1312,7 @@ config ATH79_DEV_USB
  	def_bool n
  
  config ATH79_DEV_WMAC
@@ -175,6 +175,48 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  	    soc_is_qca955x()) {
  		ath79_uart_data[0].uartclk = uart_clk_rate;
  		platform_device_register(&ath79_uart_device);
+--- a/arch/mips/ath79/dev-usb.c
++++ b/arch/mips/ath79/dev-usb.c
+@@ -236,6 +236,30 @@ static void __init ar934x_usb_setup(void
+ 			   &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
+ }
+ 
++static void __init qca953x_usb_setup(void)
++{
++	u32 bootstrap;
++
++	bootstrap = ath79_reset_rr(QCA953X_RESET_REG_BOOTSTRAP);
++
++	ath79_device_reset_set(QCA953X_RESET_USBSUS_OVERRIDE);
++	udelay(1000);
++
++	ath79_device_reset_clear(QCA953X_RESET_USB_PHY);
++	udelay(1000);
++
++	ath79_device_reset_clear(QCA953X_RESET_USB_PHY_ANALOG);
++	udelay(1000);
++
++	ath79_device_reset_clear(QCA953X_RESET_USB_HOST);
++	udelay(1000);
++
++	ath79_usb_register("ehci-platform", -1,
++			   QCA953X_EHCI_BASE, QCA953X_EHCI_SIZE,
++			   ATH79_CPU_IRQ(3),
++			   &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
++}
++
+ static void qca955x_usb_reset_notifier(struct platform_device *pdev)
+ {
+ 	u32 base;
+@@ -286,6 +310,8 @@ void __init ath79_register_usb(void)
+ 		ar933x_usb_setup();
+ 	else if (soc_is_ar934x())
+ 		ar934x_usb_setup();
++	else if (soc_is_qca953x())
++		qca953x_usb_setup();
+ 	else if (soc_is_qca955x())
+ 		qca955x_usb_setup();
+ 	else
 --- a/arch/mips/ath79/dev-wmac.c
 +++ b/arch/mips/ath79/dev-wmac.c
 @@ -101,7 +101,7 @@ static int ar933x_wmac_reset(void)
@@ -207,8 +249,8 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
 +
 +	ath79_wmac_resources[0].start = QCA953X_WMAC_BASE;
 +	ath79_wmac_resources[0].end = QCA953X_WMAC_BASE + QCA953X_WMAC_SIZE - 1;
-+	ath79_wmac_resources[1].start = ATH79_CPU_IRQ(2);
-+	ath79_wmac_resources[1].end = ATH79_CPU_IRQ(2);
++	ath79_wmac_resources[1].start = ATH79_IP2_IRQ(1);
++	ath79_wmac_resources[1].end = ATH79_IP2_IRQ(1);
 +
 +	t = ath79_reset_rr(QCA953X_RESET_REG_BOOTSTRAP);
 +	if (t & QCA953X_BOOTSTRAP_REF_CLK_40)
@@ -233,7 +275,7 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  	else
 --- a/arch/mips/ath79/early_printk.c
 +++ b/arch/mips/ath79/early_printk.c
-@@ -114,6 +114,8 @@ static void prom_putchar_init(void)
+@@ -116,6 +116,8 @@ static void prom_putchar_init(void)
  	case REV_ID_MAJOR_AR9341:
  	case REV_ID_MAJOR_AR9342:
  	case REV_ID_MAJOR_AR9344:
@@ -244,6 +286,24 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  		_prom_putchar = prom_putchar_ar71xx;
 --- a/arch/mips/ath79/gpio.c
 +++ b/arch/mips/ath79/gpio.c
+@@ -148,7 +148,7 @@ static void __iomem *ath79_gpio_get_func
+ 	    soc_is_ar913x() ||
+ 	    soc_is_ar933x())
+ 		reg = AR71XX_GPIO_REG_FUNC;
+-	else if (soc_is_ar934x())
++	else if (soc_is_ar934x() || soc_is_qca953x())
+ 		reg = AR934X_GPIO_REG_FUNC;
+ 	else
+ 		BUG();
+@@ -187,7 +187,7 @@ void __init ath79_gpio_output_select(uns
+ 	unsigned int reg;
+ 	u32 t, s;
+ 
+-	BUG_ON(!soc_is_ar934x());
++	BUG_ON(!soc_is_ar934x() && !soc_is_qca953x());
+ 
+ 	if (gpio >= AR934X_GPIO_COUNT)
+ 		return;
 @@ -224,6 +224,8 @@ void __init ath79_gpio_init(void)
  		ath79_gpio_count = AR933X_GPIO_COUNT;
  	else if (soc_is_ar934x())
@@ -272,16 +332,77 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  		 soc_is_qca955x())
  		ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack;
  	else
-@@ -352,6 +353,9 @@ void __init arch_init_irq(void)
+@@ -153,6 +154,38 @@ static void ar934x_ip2_irq_init(void)
+ 	irq_set_chained_handler(ATH79_CPU_IRQ(2), ar934x_ip2_irq_dispatch);
+ }
+ 
++static void qca953x_ip2_irq_dispatch(unsigned int irq, struct irq_desc *desc)
++{
++	u32 status;
++
++	disable_irq_nosync(irq);
++
++	status = ath79_reset_rr(QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS);
++
++	if (status & QCA953X_PCIE_WMAC_INT_PCIE_ALL) {
++		ath79_ddr_wb_flush(QCA953X_DDR_REG_FLUSH_PCIE);
++		generic_handle_irq(ATH79_IP2_IRQ(0));
++	} else if (status & QCA953X_PCIE_WMAC_INT_WMAC_ALL) {
++		ath79_ddr_wb_flush(QCA953X_DDR_REG_FLUSH_WMAC);
++		generic_handle_irq(ATH79_IP2_IRQ(1));
++	} else {
++		spurious_interrupt();
++	}
++
++	enable_irq(irq);
++}
++
++static void qca953x_irq_init(void)
++{
++	int i;
++
++	for (i = ATH79_IP2_IRQ_BASE;
++	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
++		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq);
++
++	irq_set_chained_handler(ATH79_CPU_IRQ(2), qca953x_ip2_irq_dispatch);
++}
++
+ static void qca955x_ip2_irq_dispatch(unsigned int irq, struct irq_desc *desc)
+ {
+ 	u32 status;
+@@ -335,6 +368,12 @@ static void ar934x_ip3_handler(void)
+ 	do_IRQ(ATH79_CPU_IRQ(3));
+ }
+ 
++static void qca953x_ip3_handler(void)
++{
++	ath79_ddr_wb_flush(QCA953X_DDR_REG_FLUSH_USB);
++	do_IRQ(ATH79_CPU_IRQ(3));
++}
++
+ void __init arch_init_irq(void)
+ {
+ 	if (soc_is_ar71xx()) {
+@@ -352,6 +391,9 @@ void __init arch_init_irq(void)
  	} else if (soc_is_ar934x()) {
  		ath79_ip2_handler = ath79_default_ip2_handler;
  		ath79_ip3_handler = ar934x_ip3_handler;
 +	} else if (soc_is_qca953x()) {
 +		ath79_ip2_handler = ath79_default_ip2_handler;
-+		ath79_ip3_handler = ath79_default_ip3_handler;
++		ath79_ip3_handler = qca953x_ip3_handler;
  	} else if (soc_is_qca955x()) {
  		ath79_ip2_handler = ath79_default_ip2_handler;
  		ath79_ip3_handler = ath79_default_ip3_handler;
+@@ -365,6 +407,8 @@ void __init arch_init_irq(void)
+ 
+ 	if (soc_is_ar934x())
+ 		ar934x_ip2_irq_init();
++	else if (soc_is_qca953x())
++		qca953x_irq_init();
+ 	else if (soc_is_qca955x())
+ 		qca955x_irq_init();
+ }
 --- a/arch/mips/ath79/setup.c
 +++ b/arch/mips/ath79/setup.c
 @@ -59,6 +59,7 @@ static void __init ath79_detect_sys_type
@@ -329,23 +450,49 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  	pr_info("SoC: %s\n", ath79_sys_type);
 --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
 +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
-@@ -105,6 +105,9 @@
+@@ -105,6 +105,21 @@
  #define AR934X_SRIF_BASE	(AR71XX_APB_BASE + 0x00116000)
  #define AR934X_SRIF_SIZE	0x1000
  
++#define QCA953X_GMAC_BASE	(AR71XX_APB_BASE + 0x00070000)
++#define QCA953X_GMAC_SIZE	0x14
 +#define QCA953X_WMAC_BASE	(AR71XX_APB_BASE + 0x00100000)
 +#define QCA953X_WMAC_SIZE	0x20000
++#define QCA953X_EHCI_BASE	0x1b000000
++#define QCA953X_EHCI_SIZE	0x200
++#define QCA953X_SRIF_BASE	(AR71XX_APB_BASE + 0x00116000)
++#define QCA953X_SRIF_SIZE	0x1000
++
++#define QCA953X_PCI_CFG_BASE0	0x14000000
++#define QCA953X_PCI_CTRL_BASE0	(AR71XX_APB_BASE + 0x000f0000)
++#define QCA953X_PCI_CRP_BASE0	(AR71XX_APB_BASE + 0x000c0000)
++#define QCA953X_PCI_MEM_BASE0	0x10000000
++#define QCA953X_PCI_MEM_SIZE	0x02000000
 +
  #define QCA955X_PCI_MEM_BASE0	0x10000000
  #define QCA955X_PCI_MEM_BASE1	0x12000000
  #define QCA955X_PCI_MEM_SIZE	0x02000000
-@@ -279,6 +282,43 @@
+@@ -173,6 +188,12 @@
+ #define AR934X_DDR_REG_FLUSH_PCIE	0xa8
+ #define AR934X_DDR_REG_FLUSH_WMAC	0xac
+ 
++#define QCA953X_DDR_REG_FLUSH_GE0	0x9c
++#define QCA953X_DDR_REG_FLUSH_GE1	0xa0
++#define QCA953X_DDR_REG_FLUSH_USB	0xa4
++#define QCA953X_DDR_REG_FLUSH_PCIE	0xa8
++#define QCA953X_DDR_REG_FLUSH_WMAC	0xac
++
+ /*
+  * PLL block
+  */
+@@ -279,6 +300,44 @@
  
  #define AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL	BIT(6)
  
 +#define QCA953X_PLL_CPU_CONFIG_REG		0x00
 +#define QCA953X_PLL_DDR_CONFIG_REG		0x04
 +#define QCA953X_PLL_CLK_CTRL_REG		0x08
++#define QCA953X_PLL_SWITCH_CLOCK_CONTROL_REG	0x24
 +#define QCA953X_PLL_ETH_XMII_CONTROL_REG	0x2c
 +#define QCA953X_PLL_ETH_SGMII_CONTROL_REG	0x48
 +
@@ -356,7 +503,7 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
 +#define QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT	12
 +#define QCA953X_PLL_CPU_CONFIG_REFDIV_MASK	0x1f
 +#define QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT	19
-+#define QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK	0x3
++#define QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK	0x7
 +
 +#define QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT	0
 +#define QCA953X_PLL_DDR_CONFIG_NFRAC_MASK	0x3ff
@@ -383,27 +530,85 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  #define QCA955X_PLL_CPU_CONFIG_REG		0x00
  #define QCA955X_PLL_DDR_CONFIG_REG		0x04
  #define QCA955X_PLL_CLK_CTRL_REG		0x08
-@@ -355,6 +395,10 @@
+@@ -355,6 +414,10 @@
  #define AR934X_RESET_REG_BOOTSTRAP		0xb0
  #define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS	0xac
  
 +#define QCA953X_RESET_REG_RESET_MODULE		0x1c
 +#define QCA953X_RESET_REG_BOOTSTRAP		0xb0
-+#define QCA953X_RESET_REG_EXT_INT_STATUS	0xac
++#define QCA953X_RESET_REG_PCIE_WMAC_INT_STATUS	0xac
 +
  #define QCA955X_RESET_REG_RESET_MODULE		0x1c
  #define QCA955X_RESET_REG_BOOTSTRAP		0xb0
  #define QCA955X_RESET_REG_EXT_INT_STATUS	0xac
-@@ -503,6 +547,8 @@
+@@ -450,6 +513,27 @@
+ #define AR934X_RESET_MBOX		BIT(1)
+ #define AR934X_RESET_I2S		BIT(0)
+ 
++#define QCA953X_RESET_USB_EXT_PWR	BIT(29)
++#define QCA953X_RESET_EXTERNAL		BIT(28)
++#define QCA953X_RESET_RTC		BIT(27)
++#define QCA953X_RESET_FULL_CHIP		BIT(24)
++#define QCA953X_RESET_GE1_MDIO		BIT(23)
++#define QCA953X_RESET_GE0_MDIO		BIT(22)
++#define QCA953X_RESET_CPU_NMI		BIT(21)
++#define QCA953X_RESET_CPU_COLD		BIT(20)
++#define QCA953X_RESET_DDR		BIT(16)
++#define QCA953X_RESET_USB_PHY_PLL_PWD_EXT BIT(15)
++#define QCA953X_RESET_GE1_MAC		BIT(13)
++#define QCA953X_RESET_ETH_SWITCH_ANALOG	BIT(12)
++#define QCA953X_RESET_USB_PHY_ANALOG	BIT(11)
++#define QCA953X_RESET_GE0_MAC		BIT(9)
++#define QCA953X_RESET_ETH_SWITCH	BIT(8)
++#define QCA953X_RESET_PCIE_PHY		BIT(7)
++#define QCA953X_RESET_PCIE		BIT(6)
++#define QCA953X_RESET_USB_HOST		BIT(5)
++#define QCA953X_RESET_USB_PHY		BIT(4)
++#define QCA953X_RESET_USBSUS_OVERRIDE	BIT(3)
++
+ #define QCA955X_RESET_HOST		BIT(31)
+ #define QCA955X_RESET_SLIC		BIT(30)
+ #define QCA955X_RESET_HDMA		BIT(29)
+@@ -503,6 +587,13 @@
  #define AR934X_BOOTSTRAP_SDRAM_DISABLED BIT(1)
  #define AR934X_BOOTSTRAP_DDR1		BIT(0)
  
++#define QCA953X_BOOTSTRAP_SW_OPTION2	BIT(12)
++#define QCA953X_BOOTSTRAP_SW_OPTION1	BIT(11)
++#define QCA953X_BOOTSTRAP_EJTAG_MODE	BIT(5)
 +#define QCA953X_BOOTSTRAP_REF_CLK_40	BIT(4)
++#define QCA953X_BOOTSTRAP_SDRAM_DISABLED BIT(1)
++#define QCA953X_BOOTSTRAP_DDR1		BIT(0)
 +
  #define QCA955X_BOOTSTRAP_REF_CLK_40	BIT(4)
  
  #define AR934X_PCIE_WMAC_INT_WMAC_MISC		BIT(0)
-@@ -565,6 +611,8 @@
+@@ -523,6 +614,24 @@
+ 	 AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \
+ 	 AR934X_PCIE_WMAC_INT_PCIE_RC3)
+ 
++#define QCA953X_PCIE_WMAC_INT_WMAC_MISC		BIT(0)
++#define QCA953X_PCIE_WMAC_INT_WMAC_TX		BIT(1)
++#define QCA953X_PCIE_WMAC_INT_WMAC_RXLP		BIT(2)
++#define QCA953X_PCIE_WMAC_INT_WMAC_RXHP		BIT(3)
++#define QCA953X_PCIE_WMAC_INT_PCIE_RC		BIT(4)
++#define QCA953X_PCIE_WMAC_INT_PCIE_RC0		BIT(5)
++#define QCA953X_PCIE_WMAC_INT_PCIE_RC1		BIT(6)
++#define QCA953X_PCIE_WMAC_INT_PCIE_RC2		BIT(7)
++#define QCA953X_PCIE_WMAC_INT_PCIE_RC3		BIT(8)
++#define QCA953X_PCIE_WMAC_INT_WMAC_ALL \
++	(QCA953X_PCIE_WMAC_INT_WMAC_MISC | QCA953X_PCIE_WMAC_INT_WMAC_TX | \
++	 QCA953X_PCIE_WMAC_INT_WMAC_RXLP | QCA953X_PCIE_WMAC_INT_WMAC_RXHP)
++
++#define QCA953X_PCIE_WMAC_INT_PCIE_ALL \
++	(QCA953X_PCIE_WMAC_INT_PCIE_RC | QCA953X_PCIE_WMAC_INT_PCIE_RC0 | \
++	 QCA953X_PCIE_WMAC_INT_PCIE_RC1 | QCA953X_PCIE_WMAC_INT_PCIE_RC2 | \
++	 QCA953X_PCIE_WMAC_INT_PCIE_RC3)
++
+ #define QCA955X_EXT_INT_WMAC_MISC		BIT(0)
+ #define QCA955X_EXT_INT_WMAC_TX			BIT(1)
+ #define QCA955X_EXT_INT_WMAC_RXLP		BIT(2)
+@@ -565,6 +674,8 @@
  #define REV_ID_MAJOR_AR9341		0x0120
  #define REV_ID_MAJOR_AR9342		0x1120
  #define REV_ID_MAJOR_AR9344		0x2120
@@ -412,7 +617,7 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  #define REV_ID_MAJOR_QCA9556		0x0130
  #define REV_ID_MAJOR_QCA9558		0x1130
  
-@@ -587,6 +635,8 @@
+@@ -587,6 +698,8 @@
  
  #define AR934X_REV_ID_REVISION_MASK	0xf
  
@@ -421,14 +626,81 @@ meaning of the bits CPUCLK_FROM_CPUPLL and DDRCLK_FROM_DDRPLL is reversed.
  #define QCA955X_REV_ID_REVISION_MASK	0xf
  
  /*
-@@ -640,6 +690,7 @@
+@@ -634,12 +747,32 @@
+ #define AR934X_GPIO_REG_OUT_FUNC5	0x40
+ #define AR934X_GPIO_REG_FUNC		0x6c
+ 
++#define QCA953X_GPIO_REG_OUT_FUNC0	0x2c
++#define QCA953X_GPIO_REG_OUT_FUNC1	0x30
++#define QCA953X_GPIO_REG_OUT_FUNC2	0x34
++#define QCA953X_GPIO_REG_OUT_FUNC3	0x38
++#define QCA953X_GPIO_REG_OUT_FUNC4	0x3c
++#define QCA953X_GPIO_REG_IN_ENABLE0	0x44
++#define QCA953X_GPIO_REG_FUNC		0x6c
++
++#define QCA953X_GPIO_OUT_MUX_SPI_CS1		10
++#define QCA953X_GPIO_OUT_MUX_SPI_CS2		11
++#define QCA953X_GPIO_OUT_MUX_SPI_CS0		9
++#define QCA953X_GPIO_OUT_MUX_SPI_CLK		8
++#define QCA953X_GPIO_OUT_MUX_SPI_MOSI		12
++#define QCA953X_GPIO_OUT_MUX_LED_LINK1		41
++#define QCA953X_GPIO_OUT_MUX_LED_LINK2		42
++#define QCA953X_GPIO_OUT_MUX_LED_LINK3		43
++#define QCA953X_GPIO_OUT_MUX_LED_LINK4		44
++#define QCA953X_GPIO_OUT_MUX_LED_LINK5		45
++
+ #define AR71XX_GPIO_COUNT		16
+ #define AR7240_GPIO_COUNT		18
+ #define AR7241_GPIO_COUNT		20
  #define AR913X_GPIO_COUNT		22
  #define AR933X_GPIO_COUNT		30
  #define AR934X_GPIO_COUNT		23
-+#define QCA953X_GPIO_COUNT		24
++#define QCA953X_GPIO_COUNT		18
  #define QCA955X_GPIO_COUNT		24
  
  /*
+@@ -663,6 +796,24 @@
+ #define AR934X_SRIF_DPLL2_OUTDIV_SHIFT	13
+ #define AR934X_SRIF_DPLL2_OUTDIV_MASK	0x7
+ 
++#define QCA953X_SRIF_CPU_DPLL1_REG	0x1c0
++#define QCA953X_SRIF_CPU_DPLL2_REG	0x1c4
++#define QCA953X_SRIF_CPU_DPLL3_REG	0x1c8
++
++#define QCA953X_SRIF_DDR_DPLL1_REG	0x240
++#define QCA953X_SRIF_DDR_DPLL2_REG	0x244
++#define QCA953X_SRIF_DDR_DPLL3_REG	0x248
++
++#define QCA953X_SRIF_DPLL1_REFDIV_SHIFT	27
++#define QCA953X_SRIF_DPLL1_REFDIV_MASK	0x1f
++#define QCA953X_SRIF_DPLL1_NINT_SHIFT	18
++#define QCA953X_SRIF_DPLL1_NINT_MASK	0x1ff
++#define QCA953X_SRIF_DPLL1_NFRAC_MASK	0x0003ffff
++
++#define QCA953X_SRIF_DPLL2_LOCAL_PLL	BIT(30)
++#define QCA953X_SRIF_DPLL2_OUTDIV_SHIFT	13
++#define QCA953X_SRIF_DPLL2_OUTDIV_MASK	0x7
++
+ #define AR71XX_GPIO_FUNC_STEREO_EN		BIT(17)
+ #define AR71XX_GPIO_FUNC_SLIC_EN		BIT(16)
+ #define AR71XX_GPIO_FUNC_SPI_CS2_EN		BIT(13)
+@@ -804,6 +955,16 @@
+ #define AR934X_ETH_CFG_RDV_DELAY_SHIFT  16
+ 
+ /*
++ * QCA953X GMAC Interface
++ */
++#define QCA953X_GMAC_REG_ETH_CFG		0x00
++
++#define QCA953X_ETH_CFG_SW_ONLY_MODE		BIT(6)
++#define QCA953X_ETH_CFG_SW_PHY_SWAP		BIT(7)
++#define QCA953X_ETH_CFG_SW_APB_ACCESS		BIT(9)
++#define QCA953X_ETH_CFG_SW_ACC_MSB_FIRST	BIT(13)
++
++/*
+  * QCA955X GMAC Interface
+  */
+ 
 --- a/arch/mips/include/asm/mach-ath79/ath79.h
 +++ b/arch/mips/include/asm/mach-ath79/ath79.h
 @@ -32,6 +32,7 @@ enum ath79_soc_type {
diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
index ab2bc38d4ddedf54ee9789400296ed3478026ef7..b5c88e9b99a2b96a9c3ec2ea61e0100e1d86e244 100644
--- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
+++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch
@@ -142,74 +142,9 @@
  		ath79_uart_data[0].uartclk = uart_clk_rate;
  		platform_device_register(&ath79_uart_device);
  	} else if (soc_is_ar933x()) {
---- a/arch/mips/ath79/dev-eth.c
-+++ b/arch/mips/ath79/dev-eth.c
-@@ -198,6 +198,8 @@ void __init ath79_register_mdio(unsigned
- 	case ATH79_SOC_AR9330:
- 	case ATH79_SOC_AR9331:
- 	case ATH79_SOC_QCA9533:
-+	case ATH79_SOC_QCA9561:
-+	case ATH79_SOC_TP9343:
- 		mdio_dev = &ath79_mdio1_device;
- 		mdio_data = &ath79_mdio1_data;
- 		break;
-@@ -256,6 +258,8 @@ void __init ath79_register_mdio(unsigned
- 		break;
- 
- 	case ATH79_SOC_QCA9533:
-+	case ATH79_SOC_QCA9561:
-+	case ATH79_SOC_TP9343:
- 		mdio_data->builtin_switch = 1;
- 		break;
- 
-@@ -571,6 +575,8 @@ static void __init ath79_init_eth_pll_da
- 	case ATH79_SOC_QCA9533:
- 	case ATH79_SOC_QCA9556:
- 	case ATH79_SOC_QCA9558:
-+	case ATH79_SOC_QCA9561:
-+	case ATH79_SOC_TP9343:
- 		pll_10 = AR934X_PLL_VAL_10;
- 		pll_100 = AR934X_PLL_VAL_100;
- 		pll_1000 = AR934X_PLL_VAL_1000;
-@@ -627,6 +633,8 @@ static int __init ath79_setup_phy_if_mod
- 		case ATH79_SOC_AR9330:
- 		case ATH79_SOC_AR9331:
- 		case ATH79_SOC_QCA9533:
-+		case ATH79_SOC_QCA9561:
-+		case ATH79_SOC_TP9343:
- 			pdata->phy_if_mode = PHY_INTERFACE_MODE_MII;
- 			break;
- 
-@@ -688,6 +696,8 @@ static int __init ath79_setup_phy_if_mod
- 		case ATH79_SOC_AR9330:
- 		case ATH79_SOC_AR9331:
- 		case ATH79_SOC_QCA9533:
-+		case ATH79_SOC_QCA9561:
-+		case ATH79_SOC_TP9343:
- 			pdata->phy_if_mode = PHY_INTERFACE_MODE_GMII;
- 			break;
- 
-@@ -1018,6 +1028,8 @@ void __init ath79_register_eth(unsigned
- 		break;
- 
- 	case ATH79_SOC_QCA9533:
-+	case ATH79_SOC_QCA9561:
-+	case ATH79_SOC_TP9343:
- 		if (id == 0) {
- 			pdata->reset_bit = AR933X_RESET_GE0_MAC |
- 					   AR933X_RESET_GE0_MDIO;
-@@ -1123,6 +1135,8 @@ void __init ath79_register_eth(unsigned
- 		case ATH79_SOC_AR9330:
- 		case ATH79_SOC_AR9331:
- 		case ATH79_SOC_QCA9533:
-+		case ATH79_SOC_QCA9561:
-+		case ATH79_SOC_TP9343:
- 			pdata->mii_bus_dev = &ath79_mdio1_device.dev;
- 			break;
- 
 --- a/arch/mips/ath79/dev-usb.c
 +++ b/arch/mips/ath79/dev-usb.c
-@@ -272,6 +272,19 @@ static void __init qca955x_usb_setup(voi
+@@ -296,6 +296,19 @@ static void __init qca955x_usb_setup(voi
  			   &ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
  }
  
@@ -229,8 +164,8 @@
  void __init ath79_register_usb(void)
  {
  	if (soc_is_ar71xx())
-@@ -288,6 +301,8 @@ void __init ath79_register_usb(void)
- 		ar934x_usb_setup();
+@@ -314,6 +327,8 @@ void __init ath79_register_usb(void)
+ 		qca953x_usb_setup();
  	else if (soc_is_qca955x())
  		qca955x_usb_setup();
 +	else if (soc_is_qca9561())
@@ -276,7 +211,7 @@
  
 --- a/arch/mips/ath79/early_printk.c
 +++ b/arch/mips/ath79/early_printk.c
-@@ -118,6 +118,8 @@ static void prom_putchar_init(void)
+@@ -120,6 +120,8 @@ static void prom_putchar_init(void)
  	case REV_ID_MAJOR_QCA9533_V2:
  	case REV_ID_MAJOR_QCA9556:
  	case REV_ID_MAJOR_QCA9558:
@@ -291,9 +226,9 @@
  	    soc_is_ar913x() ||
  	    soc_is_ar933x())
  		reg = AR71XX_GPIO_REG_FUNC;
--	else if (soc_is_ar934x())
+-	else if (soc_is_ar934x() || soc_is_qca953x())
 +	else if (soc_is_ar934x() ||
-+		 soc_is_qca956x())
++		 soc_is_qca953x() || soc_is_qca956x())
  		reg = AR934X_GPIO_REG_FUNC;
  	else
  		BUG();
@@ -326,7 +261,7 @@
  		ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack;
  	else
  		BUG();
-@@ -236,6 +237,99 @@ static void qca955x_irq_init(void)
+@@ -268,6 +269,97 @@ static void qca955x_irq_init(void)
  	irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch);
  }
  
@@ -406,15 +341,13 @@
 +
 +	for (i = ATH79_IP2_IRQ_BASE;
 +	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
-+		irq_set_chip_and_handler(i, &dummy_irq_chip,
-+					 handle_level_irq);
++		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq);
 +
 +	irq_set_chained_handler(ATH79_CPU_IRQ(2), qca956x_ip2_irq_dispatch);
 +
 +	for (i = ATH79_IP3_IRQ_BASE;
 +	     i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++)
-+		irq_set_chip_and_handler(i, &dummy_irq_chip,
-+					 handle_level_irq);
++		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq);
 +
 +	irq_set_chained_handler(ATH79_CPU_IRQ(3), qca956x_ip3_irq_dispatch);
 +
@@ -426,7 +359,7 @@
  asmlinkage void plat_irq_dispatch(void)
  {
  	unsigned long pending;
-@@ -359,6 +453,9 @@ void __init arch_init_irq(void)
+@@ -397,6 +489,9 @@ void __init arch_init_irq(void)
  	} else if (soc_is_qca955x()) {
  		ath79_ip2_handler = ath79_default_ip2_handler;
  		ath79_ip3_handler = ath79_default_ip3_handler;
@@ -436,8 +369,8 @@
  	} else {
  		BUG();
  	}
-@@ -371,4 +468,6 @@ void __init arch_init_irq(void)
- 		ar934x_ip2_irq_init();
+@@ -411,4 +506,6 @@ void __init arch_init_irq(void)
+ 		qca953x_irq_init();
  	else if (soc_is_qca955x())
  		qca955x_irq_init();
 +	else if (soc_is_qca956x())
@@ -445,7 +378,7 @@
  }
 --- a/arch/mips/ath79/Kconfig
 +++ b/arch/mips/ath79/Kconfig
-@@ -1268,6 +1268,12 @@ config SOC_QCA955X
+@@ -1286,6 +1286,12 @@ config SOC_QCA955X
  	select PCI_AR724X if PCI
  	def_bool n
  
@@ -458,7 +391,7 @@
  config ATH79_DEV_M25P80
  	select ATH79_DEV_SPI
  	def_bool n
-@@ -1305,7 +1311,7 @@ config ATH79_DEV_USB
+@@ -1323,7 +1329,7 @@ config ATH79_DEV_USB
  	def_bool n
  
  config ATH79_DEV_WMAC
@@ -554,7 +487,7 @@
  	pr_info("SoC: %s\n", ath79_sys_type);
 --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
 +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
-@@ -131,6 +131,23 @@
+@@ -143,6 +143,23 @@
  #define QCA955X_NFC_BASE	0x1b800200
  #define QCA955X_NFC_SIZE	0xb8
  
@@ -578,7 +511,7 @@
  #define AR9300_OTP_BASE		0x14000
  #define AR9300_OTP_STATUS	0x15f18
  #define AR9300_OTP_STATUS_TYPE		0x7
-@@ -356,6 +373,49 @@
+@@ -375,6 +392,49 @@
  #define QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL		BIT(21)
  #define QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL		BIT(24)
  
@@ -628,7 +561,7 @@
  /*
   * USB_CONFIG block
   */
-@@ -403,6 +463,11 @@
+@@ -422,6 +482,11 @@
  #define QCA955X_RESET_REG_BOOTSTRAP		0xb0
  #define QCA955X_RESET_REG_EXT_INT_STATUS	0xac
  
@@ -640,7 +573,7 @@
  #define MISC_INT_ETHSW			BIT(12)
  #define MISC_INT_TIMER4			BIT(10)
  #define MISC_INT_TIMER3			BIT(9)
-@@ -551,6 +616,8 @@
+@@ -596,6 +661,8 @@
  
  #define QCA955X_BOOTSTRAP_REF_CLK_40	BIT(4)
  
@@ -649,7 +582,7 @@
  #define AR934X_PCIE_WMAC_INT_WMAC_MISC		BIT(0)
  #define AR934X_PCIE_WMAC_INT_WMAC_TX		BIT(1)
  #define AR934X_PCIE_WMAC_INT_WMAC_RXLP		BIT(2)
-@@ -600,6 +667,37 @@
+@@ -663,6 +730,37 @@
  	 QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \
  	 QCA955X_EXT_INT_PCIE_RC2_INT3)
  
@@ -687,7 +620,7 @@
  #define REV_ID_MAJOR_MASK		0xfff0
  #define REV_ID_MAJOR_AR71XX		0x00a0
  #define REV_ID_MAJOR_AR913X		0x00b0
-@@ -615,6 +713,8 @@
+@@ -678,6 +776,8 @@
  #define REV_ID_MAJOR_QCA9533_V2		0x0160
  #define REV_ID_MAJOR_QCA9556		0x0130
  #define REV_ID_MAJOR_QCA9558		0x1130
@@ -696,7 +629,7 @@
  
  #define AR71XX_REV_ID_MINOR_MASK	0x3
  #define AR71XX_REV_ID_MINOR_AR7130	0x0
-@@ -639,6 +739,8 @@
+@@ -702,6 +802,8 @@
  
  #define QCA955X_REV_ID_REVISION_MASK	0xf
  
@@ -705,9 +638,9 @@
  /*
   * SPI block
   */
-@@ -684,6 +786,19 @@
- #define AR934X_GPIO_REG_OUT_FUNC5	0x40
- #define AR934X_GPIO_REG_FUNC		0x6c
+@@ -766,6 +868,19 @@
+ #define QCA953X_GPIO_OUT_MUX_LED_LINK4		44
+ #define QCA953X_GPIO_OUT_MUX_LED_LINK5		45
  
 +#define QCA956X_GPIO_REG_OUT_FUNC0	0x2c
 +#define QCA956X_GPIO_REG_OUT_FUNC1	0x30
@@ -725,9 +658,9 @@
  #define AR71XX_GPIO_COUNT		16
  #define AR7240_GPIO_COUNT		18
  #define AR7241_GPIO_COUNT		20
-@@ -692,6 +807,7 @@
+@@ -774,6 +889,7 @@
  #define AR934X_GPIO_COUNT		23
- #define QCA953X_GPIO_COUNT		24
+ #define QCA953X_GPIO_COUNT		18
  #define QCA955X_GPIO_COUNT		24
 +#define QCA956X_GPIO_COUNT		23
  
diff --git a/target/linux/ar71xx/patches-3.18/736-MIPS-ath79-fix-chained-irq-disable.patch b/target/linux/ar71xx/patches-3.18/736-MIPS-ath79-fix-chained-irq-disable.patch
index 8cb38d3971678e3cf951d36e6ab2f4b170cd1f0c..8c0cc953842237c851132ae5529a1fd4a3ed98ca 100644
--- a/target/linux/ar71xx/patches-3.18/736-MIPS-ath79-fix-chained-irq-disable.patch
+++ b/target/linux/ar71xx/patches-3.18/736-MIPS-ath79-fix-chained-irq-disable.patch
@@ -19,7 +19,16 @@
  
  	irq_set_chained_handler(ATH79_CPU_IRQ(2), ar934x_ip2_irq_dispatch);
  }
-@@ -224,15 +225,13 @@ static void qca955x_irq_init(void)
+@@ -182,7 +183,7 @@ static void qca953x_irq_init(void)
+ 
+ 	for (i = ATH79_IP2_IRQ_BASE;
+ 	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
+-		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq);
++		irq_set_chip_and_handler(i, &ip2_chip, handle_level_irq);
+ 
+ 	irq_set_chained_handler(ATH79_CPU_IRQ(2), qca953x_ip2_irq_dispatch);
+ }
+@@ -256,15 +257,13 @@ static void qca955x_irq_init(void)
  
  	for (i = ATH79_IP2_IRQ_BASE;
  	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
@@ -37,25 +46,23 @@
  
  	irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch);
  }
-@@ -313,15 +312,13 @@ static void qca956x_irq_init(void)
+@@ -345,13 +344,13 @@ static void qca956x_irq_init(void)
  
  	for (i = ATH79_IP2_IRQ_BASE;
  	     i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
--		irq_set_chip_and_handler(i, &dummy_irq_chip,
--					 handle_level_irq);
+-		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq);
 +		irq_set_chip_and_handler(i, &ip2_chip, handle_level_irq);
  
  	irq_set_chained_handler(ATH79_CPU_IRQ(2), qca956x_ip2_irq_dispatch);
  
  	for (i = ATH79_IP3_IRQ_BASE;
  	     i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++)
--		irq_set_chip_and_handler(i, &dummy_irq_chip,
--					 handle_level_irq);
+-		irq_set_chip_and_handler(i, &dummy_irq_chip, handle_level_irq);
 +		irq_set_chip_and_handler(i, &ip3_chip, handle_level_irq);
  
  	irq_set_chained_handler(ATH79_CPU_IRQ(3), qca956x_ip3_irq_dispatch);
  
-@@ -430,8 +427,35 @@ static void ar934x_ip3_handler(void)
+@@ -466,8 +465,35 @@ static void qca953x_ip3_handler(void)
  	do_IRQ(ATH79_CPU_IRQ(3));
  }
  
diff --git a/target/linux/ar71xx/patches-3.18/902-unaligned_access_hacks.patch b/target/linux/ar71xx/patches-3.18/902-unaligned_access_hacks.patch
index 3a9ca14204a866ef20bc3df0949311e791f2463b..d077b60bc8ba9edb7131147c300905866291289a 100644
--- a/target/linux/ar71xx/patches-3.18/902-unaligned_access_hacks.patch
+++ b/target/linux/ar71xx/patches-3.18/902-unaligned_access_hacks.patch
@@ -210,7 +210,7 @@
  #include <linux/uaccess.h>
  #include <linux/ipv6.h>
  #include <linux/icmpv6.h>
-@@ -833,10 +834,10 @@ static void tcp_v6_send_response(struct
+@@ -837,10 +838,10 @@ static void tcp_v6_send_response(struct
  	topt = (__be32 *)(t1 + 1);
  
  	if (tsecr) {
@@ -237,7 +237,7 @@
   */
 --- a/net/ipv6/datagram.c
 +++ b/net/ipv6/datagram.c
-@@ -384,7 +384,7 @@ int ipv6_recv_error(struct sock *sk, str
+@@ -386,7 +386,7 @@ int ipv6_recv_error(struct sock *sk, str
  				ipv6_iface_scope_id(&sin->sin6_addr,
  						    IP6CB(skb)->iif);
  		} else {
@@ -246,7 +246,7 @@
  					       &sin->sin6_addr);
  			sin->sin6_scope_id = 0;
  		}
-@@ -718,12 +718,12 @@ int ip6_datagram_send_ctl(struct net *ne
+@@ -720,12 +720,12 @@ int ip6_datagram_send_ctl(struct net *ne
  			}
  
  			if (fl6->flowlabel&IPV6_FLOWINFO_MASK) {
@@ -342,7 +342,7 @@
  #endif /* _LINUX_TYPES_H */
 --- a/net/ipv4/af_inet.c
 +++ b/net/ipv4/af_inet.c
-@@ -1326,8 +1326,8 @@ static struct sk_buff **inet_gro_receive
+@@ -1329,8 +1329,8 @@ static struct sk_buff **inet_gro_receive
  	if (unlikely(ip_fast_csum((u8 *)iph, 5)))
  		goto out_unlock;
  
@@ -637,14 +637,19 @@
  #include <linux/netdevice.h>
 --- a/include/net/inet_ecn.h
 +++ b/include/net/inet_ecn.h
-@@ -115,13 +115,13 @@ static inline int IP6_ECN_set_ce(struct
- {
+@@ -124,9 +124,9 @@ static inline int IP6_ECN_set_ce(struct
  	if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
  		return 0;
--	*(__be32*)iph |= htonl(INET_ECN_CE << 20);
-+	net_hdr_word(iph) |= htonl(INET_ECN_CE << 20);
+ 
+-	from = *(__be32 *)iph;
++	from = net_hdr_word(iph);
+ 	to = from | htonl(INET_ECN_CE << 20);
+-	*(__be32 *)iph = to;
++	net_hdr_word(iph) = to;
+ 	if (skb->ip_summed == CHECKSUM_COMPLETE)
+ 		skb->csum = csum_add(csum_sub(skb->csum, from), to);
  	return 1;
- }
+@@ -134,7 +134,7 @@ static inline int IP6_ECN_set_ce(struct
  
  static inline void IP6_ECN_clear(struct ipv6hdr *iph)
  {
@@ -664,7 +669,7 @@
  
  #define	IP6_MF		0x0001
  #define	IP6_OFFSET	0xFFF8
-@@ -398,8 +398,8 @@ static inline void __ipv6_addr_set_half(
+@@ -417,8 +417,8 @@ static inline void __ipv6_addr_set_half(
  	}
  #endif
  #endif
@@ -675,7 +680,7 @@
  }
  
  static inline void ipv6_addr_set(struct in6_addr *addr, 
-@@ -458,6 +458,8 @@ static inline bool ipv6_prefix_equal(con
+@@ -477,6 +477,8 @@ static inline bool ipv6_prefix_equal(con
  	const __be32 *a1 = addr1->s6_addr32;
  	const __be32 *a2 = addr2->s6_addr32;
  	unsigned int pdw, pbi;
@@ -684,7 +689,7 @@
  
  	/* check complete u32 in prefix */
  	pdw = prefixlen >> 5;
-@@ -466,7 +468,9 @@ static inline bool ipv6_prefix_equal(con
+@@ -485,7 +487,9 @@ static inline bool ipv6_prefix_equal(con
  
  	/* check incomplete u32 in prefix */
  	pbi = prefixlen & 0x1f;
@@ -695,7 +700,7 @@
  		return false;
  
  	return true;
-@@ -609,13 +613,13 @@ static inline void ipv6_addr_set_v4mappe
+@@ -629,13 +633,13 @@ static inline void ipv6_addr_set_v4mappe
   */
  static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
  {
@@ -711,7 +716,7 @@
  		if (xb)
  			return i * 32 + 31 - __fls(ntohl(xb));
  	}
-@@ -739,17 +743,18 @@ static inline __be32 ip6_make_flowlabel(
+@@ -759,17 +763,18 @@ static inline __be32 ip6_make_flowlabel(
  static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
  				__be32 flowlabel)
  {
diff --git a/target/linux/ar71xx/patches-3.18/903-MIPS-ath79-ubnt-rocket-m-xw-support.patch b/target/linux/ar71xx/patches-3.18/903-MIPS-ath79-ubnt-rocket-m-xw-support.patch
index a1674a7a872234062534e3913e752d5587469f54..96a16c28bce5234ff6193960231cd45b1fba84c4 100644
--- a/target/linux/ar71xx/patches-3.18/903-MIPS-ath79-ubnt-rocket-m-xw-support.patch
+++ b/target/linux/ar71xx/patches-3.18/903-MIPS-ath79-ubnt-rocket-m-xw-support.patch
@@ -1,6 +1,6 @@
 --- a/arch/mips/ath79/machtypes.h
 +++ b/arch/mips/ath79/machtypes.h
-@@ -177,6 +177,7 @@ enum ath79_mach_type {
+@@ -178,6 +178,7 @@ enum ath79_mach_type {
  	ATH79_MACH_UBNT_NANO_M, 	/* Ubiquiti NanoStation M */
  	ATH79_MACH_UBNT_NANO_M_XW, 	/* Ubiquiti NanoStation M XW */
  	ATH79_MACH_UBNT_ROCKET_M,	/* Ubiquiti Rocket M */
diff --git a/target/linux/ar71xx/patches-3.18/907-MIPS-ath79-add-WPN824N.patch b/target/linux/ar71xx/patches-3.18/907-MIPS-ath79-add-WPN824N.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2f0c964d38a1f2e6742dfb080cabbe13fe8566b4
--- /dev/null
+++ b/target/linux/ar71xx/patches-3.18/907-MIPS-ath79-add-WPN824N.patch
@@ -0,0 +1,21 @@
+--- a/arch/mips/ath79/Kconfig
++++ b/arch/mips/ath79/Kconfig
+@@ -741,7 +741,7 @@ config ATH79_MACH_WNR2000
+ 	select ATH79_DEV_WMAC
+ 
+ config ATH79_MACH_WNR2000_V3
+-	bool "NETGEAR WNR2000 V3/WNR612 v2/WNR1000 v2 board support"
++	bool "NETGEAR WNR2000 V3/WNR612 v2/WNR1000 v2/WPN824N board support"
+ 	select SOC_AR724X
+ 	select ATH79_DEV_AP9X_PCI if PCI
+ 	select ATH79_DEV_ETH
+--- a/arch/mips/ath79/machtypes.h
++++ b/arch/mips/ath79/machtypes.h
+@@ -204,6 +204,7 @@ enum ath79_mach_type {
+ 	ATH79_MACH_WNR2200,		/* NETGEAR WNR2200 */
+ 	ATH79_MACH_WNR612_V2,		/* NETGEAR WNR612 v2 */
+ 	ATH79_MACH_WNR1000_V2,		/* NETGEAR WNR1000 v2 */
++	ATH79_MACH_WPN824N,		/* NETGEAR WPN824N */
+ 	ATH79_MACH_WP543,		/* Compex WP543 */
+ 	ATH79_MACH_WPE72,		/* Compex WPE72 */
+ 	ATH79_MACH_WPJ344,		/* Compex WPJ344 */
diff --git a/target/linux/ar71xx/patches-3.18/907-MIPS-ath79-add-tl-wa901nd-v4-support.patch b/target/linux/ar71xx/patches-3.18/907-MIPS-ath79-add-tl-wa901nd-v4-support.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ebd9e52e19bf9d7c6b5dfbb0e6a00784e12209cf
--- /dev/null
+++ b/target/linux/ar71xx/patches-3.18/907-MIPS-ath79-add-tl-wa901nd-v4-support.patch
@@ -0,0 +1,38 @@
+--- a/arch/mips/ath79/machtypes.h	2016-04-12 21:08:09.309541276 +0200
++++ b/arch/mips/ath79/machtypes.h	2016-04-12 21:08:43.200013377 +0200
+@@ -152,6 +152,7 @@
+	ATH79_MACH_TL_WA901ND,		/* TP-LINK TL-WA901ND */
+	ATH79_MACH_TL_WA901ND_V2,	/* TP-LINK TL-WA901ND v2 */
+	ATH79_MACH_TL_WA901ND_V3,	/* TP-LINK TL-WA901ND v3 */
++	ATH79_MACH_TL_WA901ND_V4,	/* TP-LINK TL-WA901ND v4 */
+	ATH79_MACH_TL_WDR3500,		/* TP-LINK TL-WDR3500 */
+	ATH79_MACH_TL_WDR4300,		/* TP-LINK TL-WDR4300 */
+	ATH79_MACH_TL_WDR4900_V2,	/* TP-LINK TL-WDR4900 v2 */
+--- a/arch/mips/ath79/Kconfig	2016-04-12 21:00:07.267269819 +0200
++++ b/arch/mips/ath79/Kconfig	2016-04-12 21:00:08.803199911 +0200
+@@ -1023,6 +1023,15 @@
+	select ATH79_DEV_M25P80
+	select ATH79_DEV_WMAC
+
++config ATH79_MACH_TL_WA901ND_V4
++	bool "TP-LINK TL-WA901ND v4 support"
++	select SOC_QCA956X
++	select ATH79_DEV_ETH
++	select ATH79_DEV_GPIO_BUTTONS
++	select ATH79_DEV_LEDS_GPIO
++	select ATH79_DEV_M25P80
++	select ATH79_DEV_WMAC
++
+ config ATH79_MACH_TL_WDR3500
+	bool "TP-LINK TL-WDR3500 board support"
+	select SOC_AR934X
+--- a/arch/mips/ath79/Makefile	2016-04-12 21:03:21.974455904 +0200
++++ b/arch/mips/ath79/Makefile	2016-04-12 21:02:56.115621524 +0200
+@@ -128,6 +128,7 @@
+ obj-$(CONFIG_ATH79_MACH_TL_WA830RE_V2)	+= mach-tl-wa830re-v2.o
+ obj-$(CONFIG_ATH79_MACH_TL_WA901ND)	+= mach-tl-wa901nd.o
+ obj-$(CONFIG_ATH79_MACH_TL_WA901ND_V2)	+= mach-tl-wa901nd-v2.o
++obj-$(CONFIG_ATH79_MACH_TL_WA901ND_V4)	+= mach-tl-wa901nd-v4.o
+ obj-$(CONFIG_ATH79_MACH_TL_WDR3500)     += mach-tl-wdr3500.o
+ obj-$(CONFIG_ATH79_MACH_TL_WDR4300)     += mach-tl-wdr4300.o
+ obj-$(CONFIG_ATH79_MACH_TL_WR741ND)	+= mach-tl-wr741nd.o
diff --git a/target/linux/bcm53xx/base-files/etc/board.d/02_network b/target/linux/bcm53xx/base-files/etc/board.d/02_network
index a164251c6a85a1b4c2f21e353c574ca9fbc58e83..ea83ac75db1dc14d130b46f0a9597a2b685a9395 100755
--- a/target/linux/bcm53xx/base-files/etc/board.d/02_network
+++ b/target/linux/bcm53xx/base-files/etc/board.d/02_network
@@ -15,6 +15,9 @@ asus,rt-ac87u)
 netgear,r8000)
 	ifname=eth2
 	;;
+netgear,r8500)
+	ifname=eth2
+	;;
 *)
 	ifname=eth0
 	;;
diff --git a/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc b/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc
index 346a53299871ce13b8d6e85badf84244d82d9f2d..abbb04ae0fde0061890f1ead861f742cebe246a4 100644
--- a/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc
+++ b/target/linux/bcm53xx/base-files/etc/uci-defaults/09_fix_crc
@@ -4,4 +4,4 @@
 #
 #
 
-mtd fixtrx firmware
+mtd fixtrx firmware || mtd fixseama firmware
diff --git a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
index eff7affe0469701aa56c8b8c095a3fdf89608b68..b1420f56dfc09d5e50295175ff5ece990e208583 100644
--- a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
@@ -28,6 +28,7 @@ platform_expected_image() {
 		"netgear,r6300v2")	echo "chk U12H240T00_NETGEAR"; return;;
 		"netgear,r7000")	echo "chk U12H270T00_NETGEAR"; return;;
 		"netgear,r8000")	echo "chk U12H315T00_NETGEAR"; return;;
+		"netgear,r8500")	echo "chk U12H334T00_NETGEAR"; return;;
 	esac
 }
 
diff --git a/target/linux/bcm53xx/image/Makefile b/target/linux/bcm53xx/image/Makefile
index 0aeb6ea5b52282cd7cd8d82d9ec98e3df3259971..da75104938f09c5ff83982cd22fca33826bf6482 100644
--- a/target/linux/bcm53xx/image/Makefile
+++ b/target/linux/bcm53xx/image/Makefile
@@ -37,6 +37,7 @@ endef
 define Build/trx-serial
 	$(STAGING_DIR_HOST)/bin/trx \
 		-o $@ \
+		-m 33554432 \
 		-f $(word 1,$^) -a 1024 \
 		-f $(KDIR)/root.squashfs -a 0x10000 -A $(KDIR)/fs_mark
 endef
@@ -66,7 +67,24 @@ define Build/netgear-chk
 	mv $@.new $@
 endef
 
-DEVICE_VARS += DT PRODUCTID BOARD_ID REGION
+define Build/seama-nand
+	# Seama entity
+	$(STAGING_DIR_HOST)/bin/oseama \
+		entity $@.entity \
+		-m "dev=/dev/mtdblock/7" \
+		-m "type=firmware" \
+		-f $(word 1,$^) \
+		-b 0x400000 \
+		-f $(KDIR)/root-block-0x20000-min-0x800.ubi \
+		-f $(KDIR)/ubi_mark
+	# Seama container
+	$(STAGING_DIR_HOST)/bin/seama \
+		-s $@ \
+		-m "signature=$(SIGNATURE)" \
+		-i $@.entity
+endef
+
+DEVICE_VARS += DT PRODUCTID SIGNATURE BOARD_ID REGION
 
 define Device/Default
   # .dtb files are prefixed by SoC type, e.g. bcm4708- which is not included in device/image names
@@ -93,6 +111,19 @@ define AsusDevice
   TARGET_DEVICES += asus-$(1)
 endef
 
+define Device/dlink
+  IMAGES := bin
+  IMAGE/bin := seama-nand
+endef
+
+define DLinkDevice
+  define Device/dlink-$(1)
+	$$(Device/dlink)
+	SIGNATURE := $(2)
+  endef
+  TARGET_DEVICES += dlink-$(1)
+endef
+
 define Device/netgear
   IMAGES := chk
   IMAGE/chk := trx-nand | netgear-chk
@@ -137,6 +168,8 @@ $(eval $(call AsusDevice,rt-ac56u,RT-AC56U))
 $(eval $(call AsusDevice,rt-ac68u,RT-AC68U))
 $(eval $(call AsusDevice,rt-ac87u,RT-AC87U))
 $(eval $(call AsusDevice,rt-n18u,RT-N18U))
+# $(eval $(call DLinkDevice,dir-885l,wrgac42_dlink.2015_dir885l))
 $(eval $(call NetgearDevice,r7000,U12H270T00_NETGEAR))
+# $(eval $(call NetgearDevice,r8500,U12H334T00_NETGEAR))
 
 $(eval $(call BuildImage))
diff --git a/target/linux/bcm53xx/patches-3.18/003-mtd-spi-nor-from-3.19.patch b/target/linux/bcm53xx/patches-3.18/003-mtd-spi-nor-from-3.19.patch
index 815097949e4f720425e0f46b290d164c780a094a..e7e84433ca318cf72d0771a0cb889a16c95a92df 100644
--- a/target/linux/bcm53xx/patches-3.18/003-mtd-spi-nor-from-3.19.patch
+++ b/target/linux/bcm53xx/patches-3.18/003-mtd-spi-nor-from-3.19.patch
@@ -333,7 +333,7 @@
  	/* GigaDevice */
  	{ "gd25q32", INFO(0xc84016, 0, 64 * 1024,  64, SECT_4K) },
  	{ "gd25q64", INFO(0xc84017, 0, 64 * 1024, 128, SECT_4K) },
-@@ -536,6 +564,7 @@ static const struct spi_device_id spi_no
+@@ -537,6 +565,7 @@ static const struct spi_device_id spi_no
  	{ "mx66l1g55g",  INFO(0xc2261b, 0, 64 * 1024, 2048, SPI_NOR_QUAD_READ) },
  
  	/* Micron */
@@ -341,7 +341,7 @@
  	{ "n25q064",     INFO(0x20ba17, 0, 64 * 1024,  128, 0) },
  	{ "n25q128a11",  INFO(0x20bb18, 0, 64 * 1024,  256, 0) },
  	{ "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024,  256, 0) },
-@@ -560,6 +589,7 @@ static const struct spi_device_id spi_no
+@@ -561,6 +590,7 @@ static const struct spi_device_id spi_no
  	{ "s70fl01gs",  INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
  	{ "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
  	{ "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
@@ -349,7 +349,7 @@
  	{ "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, 0) },
  	{ "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, 0) },
  	{ "s25sl004a",  INFO(0x010212,      0,  64 * 1024,   8, 0) },
-@@ -581,6 +611,7 @@ static const struct spi_device_id spi_no
+@@ -582,6 +612,7 @@ static const struct spi_device_id spi_no
  	{ "sst25wf010",  INFO(0xbf2502, 0, 64 * 1024,  2, SECT_4K | SST_WRITE) },
  	{ "sst25wf020",  INFO(0xbf2503, 0, 64 * 1024,  4, SECT_4K | SST_WRITE) },
  	{ "sst25wf040",  INFO(0xbf2504, 0, 64 * 1024,  8, SECT_4K | SST_WRITE) },
@@ -357,7 +357,7 @@
  
  	/* ST Microelectronics -- newer production may have feature updates */
  	{ "m25p05",  INFO(0x202010,  0,  32 * 1024,   2, 0) },
-@@ -592,7 +623,6 @@ static const struct spi_device_id spi_no
+@@ -593,7 +624,6 @@ static const struct spi_device_id spi_no
  	{ "m25p32",  INFO(0x202016,  0,  64 * 1024,  64, 0) },
  	{ "m25p64",  INFO(0x202017,  0,  64 * 1024, 128, 0) },
  	{ "m25p128", INFO(0x202018,  0, 256 * 1024,  64, 0) },
@@ -365,7 +365,7 @@
  
  	{ "m25p05-nonjedec",  INFO(0, 0,  32 * 1024,   2, 0) },
  	{ "m25p10-nonjedec",  INFO(0, 0,  32 * 1024,   4, 0) },
-@@ -648,32 +678,24 @@ static const struct spi_device_id spi_no
+@@ -649,32 +679,24 @@ static const struct spi_device_id spi_no
  static const struct spi_device_id *spi_nor_read_id(struct spi_nor *nor)
  {
  	int			tmp;
@@ -404,7 +404,7 @@
  	return ERR_PTR(-ENODEV);
  }
  
-@@ -708,11 +730,6 @@ static int sst_write(struct mtd_info *mt
+@@ -709,11 +731,6 @@ static int sst_write(struct mtd_info *mt
  	if (ret)
  		return ret;
  
@@ -416,7 +416,7 @@
  	write_enable(nor);
  
  	nor->sst_write_second = false;
-@@ -724,7 +741,7 @@ static int sst_write(struct mtd_info *mt
+@@ -725,7 +742,7 @@ static int sst_write(struct mtd_info *mt
  
  		/* write one byte. */
  		nor->write(nor, to, 1, retlen, buf);
@@ -425,7 +425,7 @@
  		if (ret)
  			goto time_out;
  	}
-@@ -736,7 +753,7 @@ static int sst_write(struct mtd_info *mt
+@@ -737,7 +754,7 @@ static int sst_write(struct mtd_info *mt
  
  		/* write two bytes. */
  		nor->write(nor, to, 2, retlen, buf + actual);
@@ -434,7 +434,7 @@
  		if (ret)
  			goto time_out;
  		to += 2;
-@@ -745,7 +762,7 @@ static int sst_write(struct mtd_info *mt
+@@ -746,7 +763,7 @@ static int sst_write(struct mtd_info *mt
  	nor->sst_write_second = false;
  
  	write_disable(nor);
@@ -443,7 +443,7 @@
  	if (ret)
  		goto time_out;
  
-@@ -756,7 +773,7 @@ static int sst_write(struct mtd_info *mt
+@@ -757,7 +774,7 @@ static int sst_write(struct mtd_info *mt
  		nor->program_opcode = SPINOR_OP_BP;
  		nor->write(nor, to, 1, retlen, buf + actual);
  
@@ -452,7 +452,7 @@
  		if (ret)
  			goto time_out;
  		write_disable(nor);
-@@ -784,11 +801,6 @@ static int spi_nor_write(struct mtd_info
+@@ -785,11 +802,6 @@ static int spi_nor_write(struct mtd_info
  	if (ret)
  		return ret;
  
@@ -464,7 +464,7 @@
  	write_enable(nor);
  
  	page_offset = to & (nor->page_size - 1);
-@@ -807,16 +819,20 @@ static int spi_nor_write(struct mtd_info
+@@ -808,16 +820,20 @@ static int spi_nor_write(struct mtd_info
  			if (page_size > nor->page_size)
  				page_size = nor->page_size;
  
@@ -487,7 +487,7 @@
  }
  
  static int macronix_quad_enable(struct spi_nor *nor)
-@@ -829,7 +845,7 @@ static int macronix_quad_enable(struct s
+@@ -830,7 +846,7 @@ static int macronix_quad_enable(struct s
  	nor->cmd_buf[0] = val | SR_QUAD_EN_MX;
  	nor->write_reg(nor, SPINOR_OP_WRSR, nor->cmd_buf, 1, 0);
  
@@ -496,7 +496,7 @@
  		return 1;
  
  	ret = read_sr(nor);
-@@ -879,11 +895,11 @@ static int spansion_quad_enable(struct s
+@@ -880,11 +896,11 @@ static int spansion_quad_enable(struct s
  	return 0;
  }
  
@@ -510,7 +510,7 @@
  	case CFI_MFR_MACRONIX:
  		status = macronix_quad_enable(nor);
  		if (status) {
-@@ -909,11 +925,6 @@ static int spi_nor_check(struct spi_nor
+@@ -910,11 +926,6 @@ static int spi_nor_check(struct spi_nor
  		return -EINVAL;
  	}
  
@@ -522,7 +522,7 @@
  	return 0;
  }
  
-@@ -931,16 +942,24 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -932,16 +943,24 @@ int spi_nor_scan(struct spi_nor *nor, co
  	if (ret)
  		return ret;
  
@@ -551,20 +551,22 @@
  		if (IS_ERR(jid)) {
  			return PTR_ERR(jid);
  		} else if (jid != id) {
-@@ -965,9 +984,9 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -966,10 +985,10 @@ int spi_nor_scan(struct spi_nor *nor, co
  	 * up with the software protection bits set
  	 */
  
 -	if (JEDEC_MFR(info->jedec_id) == CFI_MFR_ATMEL ||
 -	    JEDEC_MFR(info->jedec_id) == CFI_MFR_INTEL ||
+-	    JEDEC_MFR(info->jedec_id) == CFI_MFR_MACRONIX ||
 -	    JEDEC_MFR(info->jedec_id) == CFI_MFR_SST) {
 +	if (JEDEC_MFR(info) == CFI_MFR_ATMEL ||
 +	    JEDEC_MFR(info) == CFI_MFR_INTEL ||
++	    JEDEC_MFR(info) == CFI_MFR_MACRONIX ||
 +	    JEDEC_MFR(info) == CFI_MFR_SST) {
  		write_enable(nor);
  		write_sr(nor, 0);
  	}
-@@ -982,7 +1001,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -984,7 +1003,7 @@ int spi_nor_scan(struct spi_nor *nor, co
  	mtd->_read = spi_nor_read;
  
  	/* nor protection support for STmicro chips */
@@ -573,7 +575,7 @@
  		mtd->_lock = spi_nor_lock;
  		mtd->_unlock = spi_nor_unlock;
  	}
-@@ -993,9 +1012,8 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -995,9 +1014,8 @@ int spi_nor_scan(struct spi_nor *nor, co
  	else
  		mtd->_write = spi_nor_write;
  
@@ -585,7 +587,7 @@
  
  #ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
  	/* prefer "small sector" erase if possible */
-@@ -1036,7 +1054,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1038,7 +1056,7 @@ int spi_nor_scan(struct spi_nor *nor, co
  
  	/* Quad/Dual-read mode takes precedence over fast/normal */
  	if (mode == SPI_NOR_QUAD && info->flags & SPI_NOR_QUAD_READ) {
@@ -594,7 +596,7 @@
  		if (ret) {
  			dev_err(dev, "quad mode not supported\n");
  			return ret;
-@@ -1072,7 +1090,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1074,7 +1092,7 @@ int spi_nor_scan(struct spi_nor *nor, co
  	else if (mtd->size > 0x1000000) {
  		/* enable 4-byte addressing if the device exceeds 16MiB */
  		nor->addr_width = 4;
@@ -603,7 +605,7 @@
  			/* Dedicated 4-byte command set */
  			switch (nor->flash_read) {
  			case SPI_NOR_QUAD:
-@@ -1093,7 +1111,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1095,7 +1113,7 @@ int spi_nor_scan(struct spi_nor *nor, co
  			nor->erase_opcode = SPINOR_OP_SE_4B;
  			mtd->erasesize = info->sector_size;
  		} else
diff --git a/target/linux/bcm53xx/patches-3.18/004-mtd-spi-nor-from-3.20.patch b/target/linux/bcm53xx/patches-3.18/004-mtd-spi-nor-from-3.20.patch
index ab7b0bb5738778520b1a2e90e6bd67d75bd255a3..1238785e47359b20e8079a0858ed4af9c0136979 100644
--- a/target/linux/bcm53xx/patches-3.18/004-mtd-spi-nor-from-3.20.patch
+++ b/target/linux/bcm53xx/patches-3.18/004-mtd-spi-nor-from-3.20.patch
@@ -1,14 +1,6 @@
 --- a/drivers/mtd/spi-nor/spi-nor.c
 +++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -538,6 +538,7 @@ static const struct spi_device_id spi_no
- 	/* GigaDevice */
- 	{ "gd25q32", INFO(0xc84016, 0, 64 * 1024,  64, SECT_4K) },
- 	{ "gd25q64", INFO(0xc84017, 0, 64 * 1024, 128, SECT_4K) },
-+	{ "gd25q128", INFO(0xc84018, 0, 64 * 1024, 256, SECT_4K) },
- 
- 	/* Intel/Numonyx -- xxxs33b */
- 	{ "160s33b",  INFO(0x898911, 0, 64 * 1024,  32, 0) },
-@@ -564,14 +565,14 @@ static const struct spi_device_id spi_no
+@@ -565,14 +565,14 @@ static const struct spi_device_id spi_no
  	{ "mx66l1g55g",  INFO(0xc2261b, 0, 64 * 1024, 2048, SPI_NOR_QUAD_READ) },
  
  	/* Micron */
@@ -31,7 +23,7 @@
  
  	/* PMC */
  	{ "pm25lv512",   INFO(0,        0, 32 * 1024,    2, SECT_4K_PMC) },
-@@ -895,6 +896,45 @@ static int spansion_quad_enable(struct s
+@@ -896,6 +896,45 @@ static int spansion_quad_enable(struct s
  	return 0;
  }
  
@@ -77,7 +69,7 @@
  static int set_quad_mode(struct spi_nor *nor, struct flash_info *info)
  {
  	int status;
-@@ -907,6 +947,13 @@ static int set_quad_mode(struct spi_nor
+@@ -908,6 +947,13 @@ static int set_quad_mode(struct spi_nor
  			return -EINVAL;
  		}
  		return status;
diff --git a/target/linux/bcm53xx/patches-3.18/067-ARM-BCM5301X-Enable-UART0-on-tested-devices.patch b/target/linux/bcm53xx/patches-3.18/067-ARM-BCM5301X-Enable-UART0-on-tested-devices.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8218bb0cff5423bc2802a7f8629686a945ea067b
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/067-ARM-BCM5301X-Enable-UART0-on-tested-devices.patch
@@ -0,0 +1,85 @@
+From 0dfc7f687917a93175d469a2dc1254fd2f77fb63 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Mon, 29 Jun 2015 07:22:16 +0200
+Subject: [PATCH] ARM: BCM5301X: Enable UART0 on tested devices
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+There are two possible UARTs so we have (both of) them disabled by
+default. Override uart0 status on devices that were verified to use it.
+In case of Netgear R6250 also drop an old (and invalid) overwrite. It
+doesn't have uart1 connected.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+
+--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
++++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
+@@ -135,3 +135,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
++++ b/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
+@@ -55,3 +55,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
++++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
+@@ -24,16 +24,6 @@
+ 		reg = <0x00000000 0x08000000>;
+ 	};
+ 
+-	chipcommonA {
+-		uart0: serial@0300 {
+-			status = "okay";
+-		};
+-
+-		uart1: serial@0400 {
+-			status = "okay";
+-		};
+-	};
+-
+ 	leds {
+ 		compatible = "gpio-leds";
+ 
+@@ -92,3 +82,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
++++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
+@@ -118,3 +118,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
++++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
+@@ -122,3 +122,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
diff --git a/target/linux/bcm53xx/patches-3.18/340-ARM-BCM5301X-Add-profiling-support.patch b/target/linux/bcm53xx/patches-3.18/068-ARM-BCM5301X-Add-profiling-support.patch
similarity index 58%
rename from target/linux/bcm53xx/patches-3.18/340-ARM-BCM5301X-Add-profiling-support.patch
rename to target/linux/bcm53xx/patches-3.18/068-ARM-BCM5301X-Add-profiling-support.patch
index 291ec72f2cc1c34b1964b1f1fd3309b1d45989ed..ef3d35fdb5f4456fb0087636862be2ad5b705c4a 100644
--- a/target/linux/bcm53xx/patches-3.18/340-ARM-BCM5301X-Add-profiling-support.patch
+++ b/target/linux/bcm53xx/patches-3.18/068-ARM-BCM5301X-Add-profiling-support.patch
@@ -1,7 +1,14 @@
+From 1ff80363524cf78e2894b1c6fdd5b7b03ea41994 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Wed, 29 Jul 2015 23:51:00 +0200
 Subject: [PATCH] ARM: BCM5301X: Add profiling support
 
 Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Olof Johansson <olof@lixom.net>
 ---
+
 --- a/arch/arm/boot/dts/bcm5301x.dtsi
 +++ b/arch/arm/boot/dts/bcm5301x.dtsi
 @@ -82,6 +82,13 @@
diff --git a/target/linux/bcm53xx/patches-3.18/071-ARM-BCM5301X-Netgear-R6250-add-USB-GPIO.patch b/target/linux/bcm53xx/patches-3.18/071-ARM-BCM5301X-Netgear-R6250-add-USB-GPIO.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d1f9f048bbd8ae16d00271d422f3389e0371d608
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/071-ARM-BCM5301X-Netgear-R6250-add-USB-GPIO.patch
@@ -0,0 +1,30 @@
+From 6c8c58b38f17e92691dd648c0e3b66f1a6942433 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Sat, 19 Sep 2015 13:25:54 +0200
+Subject: [PATCH] ARM: BCM5301X: Netgear R6250 add USB GPIO
+
+Add GPIO number which is needed to activate the USB power supply.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
++++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
+@@ -24,6 +24,17 @@
+ 		reg = <0x00000000 0x08000000>;
+ 	};
+ 
++	axi@18000000 {
++		usb3@23000 {
++			reg = <0x00023000 0x1000>;
++
++			#address-cells = <1>;
++			#size-cells = <1>;
++
++			vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
++		};
++	};
++
+ 	leds {
+ 		compatible = "gpio-leds";
+ 
diff --git a/target/linux/bcm53xx/patches-3.18/132-ARM-BCM5301X-Add-missing-Netgear-R8000-LEDs.patch b/target/linux/bcm53xx/patches-3.18/072-ARM-BCM5301X-Add-missing-Netgear-R8000-LEDs.patch
similarity index 77%
rename from target/linux/bcm53xx/patches-3.18/132-ARM-BCM5301X-Add-missing-Netgear-R8000-LEDs.patch
rename to target/linux/bcm53xx/patches-3.18/072-ARM-BCM5301X-Add-missing-Netgear-R8000-LEDs.patch
index c117774b0b8d52b60fca60239d3ccac297844e2c..64dbda418d129658851bfbbbdf5aa6d1eb6b6aa8 100644
--- a/target/linux/bcm53xx/patches-3.18/132-ARM-BCM5301X-Add-missing-Netgear-R8000-LEDs.patch
+++ b/target/linux/bcm53xx/patches-3.18/072-ARM-BCM5301X-Add-missing-Netgear-R8000-LEDs.patch
@@ -1,18 +1,17 @@
-From b58682598541262f967ecd6db04bacac38026d3c Mon Sep 17 00:00:00 2001
+From da41efd6041c694d93febdabee94552a2140dfbd Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Fri, 30 Oct 2015 15:29:52 +0100
+Date: Fri, 30 Oct 2015 15:44:01 +0100
 Subject: [PATCH] ARM: BCM5301X: Add missing Netgear R8000 LEDs
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
+Add a bunch of LEDs missing for the Netgear R8000: wireless, wps, 5Ghz radio
+and USB LEDs.
+
 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
 ---
- arch/arm/boot/dts/bcm4709-netgear-r8000.dts | 30 +++++++++++++++++++++++++++++
- 1 file changed, 30 insertions(+)
-
-diff --git a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
-index 446c586..b52927c 100644
 --- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
 +++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
 @@ -50,6 +50,36 @@
@@ -52,6 +51,3 @@ index 446c586..b52927c 100644
  	};
  
  	gpio-keys {
--- 
-1.8.4.5
-
diff --git a/target/linux/bcm53xx/patches-3.18/073-ARM-BCM5301X-Add-DT-for-D-Link-DIR-885L.patch b/target/linux/bcm53xx/patches-3.18/073-ARM-BCM5301X-Add-DT-for-D-Link-DIR-885L.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7f2a0f090f33bc061bbb1a91a22538fb4e6264db
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/073-ARM-BCM5301X-Add-DT-for-D-Link-DIR-885L.patch
@@ -0,0 +1,142 @@
+From 3ea03a9d512ca19d59315492230e954a1653ff6e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 26 Jan 2016 23:35:16 +0100
+Subject: [PATCH] ARM: BCM5301X: Add DT for D-Link DIR-885L
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It's device based on BCM47094 which is quite similar to BCM4709 except
+for higher CPU frequency. This device has 2 flash memories, it boots
+from serial one and stores firmware on NAND. Other than that we define
+standard stuff like LEDs, buttons and UART.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -68,7 +68,8 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
+ 	bcm4709-asus-rt-ac87u.dtb \
+ 	bcm4709-buffalo-wxr-1900dhp.dtb \
+ 	bcm4709-netgear-r7000.dtb \
+-	bcm4709-netgear-r8000.dtb
++	bcm4709-netgear-r8000.dtb \
++	bcm47094-dlink-dir-885l.dtb
+ dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
+ dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \
+ 	bcm21664-garnet.dtb
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
+@@ -0,0 +1,111 @@
++/*
++ * Broadcom BCM470X / BCM5301X ARM platform code.
++ * DTS for D-Link DIR-885L
++ *
++ * Copyright (C) 2016 Rafał Miłecki <zajec5@gmail.com>
++ *
++ * Licensed under the GNU/GPL. See COPYING for details.
++ */
++
++/dts-v1/;
++
++#include "bcm4708.dtsi"
++#include "bcm5301x-nand-cs0-bch8.dtsi"
++
++/ {
++	compatible = "dlink,dir-885l", "brcm,bcm47094", "brcm,bcm4708";
++	model = "D-Link DIR-885L";
++
++	chosen {
++		bootargs = "console=ttyS0,115200";
++	};
++
++	memory {
++		reg = <0x00000000 0x08000000>;
++	};
++
++	nand: nand@18028000 {
++		nandcs@0 {
++			partition@0 {
++				label = "firmware";
++				reg = <0x00000000 0x08000000>;
++			};
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++
++		power-white {
++			label = "bcm53xx:white:power";
++			gpios = <&chipcommon 0 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-on";
++		};
++
++		wan-white {
++			label = "bcm53xx:white:wan";
++			gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		power-amber {
++			label = "bcm53xx:amber:power";
++			gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		wan-amber {
++			label = "bcm53xx:amber:wan";
++			gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		usb3-white {
++			label = "bcm53xx:white:usb3";
++			gpios = <&chipcommon 8 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		2ghz {
++			label = "bcm53xx:white:2ghz";
++			gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		5ghz {
++			label = "bcm53xx:white:5ghz";
++			gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++	};
++
++	gpio-keys {
++		compatible = "gpio-keys";
++		#address-cells = <1>;
++		#size-cells = <0>;
++
++		wps {
++			label = "WPS";
++			linux,code = <KEY_WPS_BUTTON>;
++			gpios = <&chipcommon 7 GPIO_ACTIVE_LOW>;
++		};
++
++		/* Switch: router / extender */
++		extender {
++			label = "Extender";
++			linux,code = <BTN_0>;
++			gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
++		};
++
++		restart {
++			label = "Reset";
++			linux,code = <KEY_RESTART>;
++			gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
++		};
++	};
++};
++
++&uart0 {
++	status = "okay";
++	clock-frequency = <125000000>;
++};
diff --git a/target/linux/bcm53xx/patches-3.18/074-ARM-BCM5301X-Set-vcc-gpio-for-USB-controllers-of-few.patch b/target/linux/bcm53xx/patches-3.18/074-ARM-BCM5301X-Set-vcc-gpio-for-USB-controllers-of-few.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e763ad5b0f0632e854e6c86de47604737380534c
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/074-ARM-BCM5301X-Set-vcc-gpio-for-USB-controllers-of-few.patch
@@ -0,0 +1,117 @@
+From dd70ccfaa79189feaa78609d44f7c3e7fa1dc6ff Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Wed, 23 Mar 2016 16:52:47 +0100
+Subject: [PATCH] ARM: BCM5301X: Set vcc-gpio for USB controllers of few
+ devices
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+There are few devices that have USB power controlled using GPIO. Linux
+USB host driver (bcma-hcd) already supports this by reading vcc-gpio
+from DT. Set it properly for all known devices.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+
+--- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
++++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
+@@ -139,3 +139,11 @@
+ &uart0 {
+ 	status = "okay";
+ };
++
++&usb2 {
++	vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
++};
++
++&usb3 {
++	vcc-gpio = <&chipcommon 10 GPIO_ACTIVE_LOW>;
++};
+--- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
++++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
+@@ -24,17 +24,6 @@
+ 		reg = <0x00000000 0x08000000>;
+ 	};
+ 
+-	axi@18000000 {
+-		usb3@23000 {
+-			reg = <0x00023000 0x1000>;
+-
+-			#address-cells = <1>;
+-			#size-cells = <1>;
+-
+-			vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
+-		};
+-	};
+-
+ 	leds {
+ 		compatible = "gpio-leds";
+ 
+@@ -97,3 +86,7 @@
+ &uart0 {
+ 	status = "okay";
+ };
++
++&usb3 {
++	vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
++};
+--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
++++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
+@@ -126,3 +126,8 @@
+ 		};
+ 	};
+ };
++
++
++&usb2 {
++	vcc-gpio = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
++};
+--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
++++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
+@@ -106,3 +106,11 @@
+ 		};
+ 	};
+ };
++
++&usb2 {
++	vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
++};
++
++&usb3 {
++	vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
++};
+--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
++++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
+@@ -109,3 +109,7 @@
+ 	status = "okay";
+ 	clock-frequency = <125000000>;
+ };
++
++&usb3 {
++	vcc-gpio = <&chipcommon 18 GPIO_ACTIVE_HIGH>;
++};
+--- a/arch/arm/boot/dts/bcm5301x.dtsi
++++ b/arch/arm/boot/dts/bcm5301x.dtsi
+@@ -173,6 +173,20 @@
+ 			gpio-controller;
+ 			#gpio-cells = <2>;
+ 		};
++
++		usb2: usb2@21000 {
++			reg = <0x00021000 0x1000>;
++
++			#address-cells = <1>;
++			#size-cells = <1>;
++		};
++
++		usb3: usb3@23000 {
++			reg = <0x00023000 0x1000>;
++
++			#address-cells = <1>;
++			#size-cells = <1>;
++		};
+ 	};
+ 
+ 	nand: nand@18028000 {
diff --git a/target/linux/bcm53xx/patches-3.18/170-pcie2-bcma-add-new-PCIe2-driver-for-bcma.patch b/target/linux/bcm53xx/patches-3.18/170-pcie2-bcma-add-new-PCIe2-driver-for-bcma.patch
index 9c8aa3bd0ef888a714a406cdea177be6ee829e5d..6c8e0a648576a3a420356ab978b3797e8d17bb70 100644
--- a/target/linux/bcm53xx/patches-3.18/170-pcie2-bcma-add-new-PCIe2-driver-for-bcma.patch
+++ b/target/linux/bcm53xx/patches-3.18/170-pcie2-bcma-add-new-PCIe2-driver-for-bcma.patch
@@ -72,7 +72,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
 +obj-$(CONFIG_PCI_BCM5301X) += pci-host-bcm5301x.o
 --- /dev/null
 +++ b/drivers/pci/host/pci-host-bcm5301x.c
-@@ -0,0 +1,460 @@
+@@ -0,0 +1,461 @@
 +/*
 + * Northstar PCI-Express driver
 + * Only supports Root-Complex (RC) mode
@@ -221,6 +221,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
 +}
 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8011, bcma_pcie2_fixup_class);
 +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8012, bcma_pcie2_fixup_class);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd612, bcma_pcie2_fixup_class);
 +
 +/*
 + * Check link status, return 0 if link is up in RC mode,
diff --git a/target/linux/bcm53xx/patches-3.18/186-USB-bcma-switch-to-GPIO-descriptor-for-power-control.patch b/target/linux/bcm53xx/patches-3.18/186-USB-bcma-switch-to-GPIO-descriptor-for-power-control.patch
index 5031886f00f232b0aa5b6ae413f24cab8828e88d..f1995d1e6d421f3534a858f705b65177e5f48c24 100644
--- a/target/linux/bcm53xx/patches-3.18/186-USB-bcma-switch-to-GPIO-descriptor-for-power-control.patch
+++ b/target/linux/bcm53xx/patches-3.18/186-USB-bcma-switch-to-GPIO-descriptor-for-power-control.patch
@@ -17,8 +17,6 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  drivers/usb/host/bcma-hcd.c | 21 ++++++++++-----------
  1 file changed, 10 insertions(+), 11 deletions(-)
 
-diff --git a/drivers/usb/host/bcma-hcd.c b/drivers/usb/host/bcma-hcd.c
-index 5398e3d..291aaa2 100644
 --- a/drivers/usb/host/bcma-hcd.c
 +++ b/drivers/usb/host/bcma-hcd.c
 @@ -21,6 +21,7 @@
@@ -37,7 +35,7 @@ index 5398e3d..291aaa2 100644
  };
  
  /* Wait for bitmask in a register to get set or cleared.
-@@ -228,19 +230,12 @@ static void bcma_hcd_init_chip_arm(struct bcma_device *dev)
+@@ -228,19 +230,12 @@ static void bcma_hcd_init_chip_arm(struc
  
  static void bcma_hci_platform_power_gpio(struct bcma_device *dev, bool val)
  {
@@ -60,7 +58,7 @@ index 5398e3d..291aaa2 100644
  }
  
  static const struct usb_ehci_pdata ehci_pdata = {
-@@ -314,7 +309,11 @@ static int bcma_hcd_probe(struct bcma_device *dev)
+@@ -314,7 +309,11 @@ static int bcma_hcd_probe(struct bcma_de
  	if (!usb_dev)
  		return -ENOMEM;
  
diff --git a/target/linux/bcm53xx/patches-3.18/301-ARM-BCM5301X-Add-SPROM.patch b/target/linux/bcm53xx/patches-3.18/301-ARM-BCM5301X-Add-SPROM.patch
index ca6462e3c7eeea60c73d0c7507db5106ea339b60..3d054a80d687de190ca1bf338e65df3d668fc8aa 100644
--- a/target/linux/bcm53xx/patches-3.18/301-ARM-BCM5301X-Add-SPROM.patch
+++ b/target/linux/bcm53xx/patches-3.18/301-ARM-BCM5301X-Add-SPROM.patch
@@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/arch/arm/boot/dts/bcm5301x.dtsi
 +++ b/arch/arm/boot/dts/bcm5301x.dtsi
-@@ -95,6 +95,10 @@
+@@ -102,6 +102,10 @@
  		};
  	};
  
diff --git a/target/linux/bcm53xx/patches-3.18/302-ARM-BCM5301X-Add-DT-for-Netgear-R8500.patch b/target/linux/bcm53xx/patches-3.18/302-ARM-BCM5301X-Add-DT-for-Netgear-R8500.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b787e3e7ceeeb0d7f50576e0af2b25ae417c9637
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/302-ARM-BCM5301X-Add-DT-for-Netgear-R8500.patch
@@ -0,0 +1,135 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Subject: [PATCH] ARM: BCM5301X: Add DT for Netgear R8500
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ arch/arm/boot/dts/Makefile                   |  1 +
+ arch/arm/boot/dts/bcm47094-netgear-r8500.dts | 31 ++++++++++++++++++++++++++++
+ 2 files changed, 32 insertions(+)
+ create mode 100644 arch/arm/boot/dts/bcm47094-netgear-r8500.dts
+
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -69,7 +69,8 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
+ 	bcm4709-buffalo-wxr-1900dhp.dtb \
+ 	bcm4709-netgear-r7000.dtb \
+ 	bcm4709-netgear-r8000.dtb \
+-	bcm47094-dlink-dir-885l.dtb
++	bcm47094-dlink-dir-885l.dtb \
++	bcm47094-netgear-r8500.dtb
+ dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
+ dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \
+ 	bcm21664-garnet.dtb
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
+@@ -0,0 +1,107 @@
++/*
++ * Broadcom BCM470X / BCM5301X ARM platform code.
++ * DTS for Netgear R8500
++ *
++ * Copyright (C) 2016 Rafał Miłecki <zajec5@gmail.com>
++ *
++ * Licensed under the GNU/GPL. See COPYING for details.
++ */
++
++/dts-v1/;
++
++#include "bcm4708.dtsi"
++#include "bcm5301x-nand-cs0-bch8.dtsi"
++
++/ {
++	compatible = "netgear,r8500", "brcm,bcm47094", "brcm,bcm4708";
++	model = "Netgear R8500";
++
++	chosen {
++		bootargs = "console=ttyS0,115200";
++	};
++
++	memory {
++		reg = <0x00000000 0x08000000>;
++	};
++
++	leds {
++		compatible = "gpio-leds";
++
++		power0 {
++			label = "bcm53xx:white:power";
++			gpios = <&chipcommon 2 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-on";
++		};
++
++		power1 {
++			label = "bcm53xx:amber:power";
++			gpios = <&chipcommon 3 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		5ghz-1 {
++			label = "bcm53xx:white:5ghz-1";
++			gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		5ghz-2 {
++			label = "bcm53xx:white:5ghz-2";
++			gpios = <&chipcommon 12 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		2ghz {
++			label = "bcm53xx:white:2ghz";
++			gpios = <&chipcommon 13 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		usb2 {
++			label = "bcm53xx:white:usb2";
++			gpios = <&chipcommon 17 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++
++		usb3 {
++			label = "bcm53xx:white:usb3";
++			gpios = <&chipcommon 18 GPIO_ACTIVE_LOW>;
++			linux,default-trigger = "default-off";
++		};
++	};
++
++	gpio-keys {
++		compatible = "gpio-keys";
++		#address-cells = <1>;
++		#size-cells = <0>;
++
++		brightness {
++			label = "Backlight";
++			linux,code = <KEY_BRIGHTNESS_ZERO>;
++			gpios = <&chipcommon 1 GPIO_ACTIVE_LOW>;
++		};
++
++		restart {
++			label = "Reset";
++			linux,code = <KEY_RESTART>;
++			gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
++		};
++
++		wps {
++			label = "WPS";
++			linux,code = <KEY_WPS_BUTTON>;
++			gpios = <&chipcommon 14 GPIO_ACTIVE_LOW>;
++		};
++
++		rfkill {
++			label = "WiFi";
++			linux,code = <KEY_RFKILL>;
++			gpios = <&chipcommon 20 GPIO_ACTIVE_LOW>;
++		};
++	};
++};
++
++&uart0 {
++	status = "okay";
++	clock-frequency = <125000000>;
++};
diff --git a/target/linux/bcm53xx/patches-3.18/303-ARM-BCM5310X-Enable-earlyprintk-on-tested-devices.patch b/target/linux/bcm53xx/patches-3.18/303-ARM-BCM5310X-Enable-earlyprintk-on-tested-devices.patch
index 216d8e69d9b7121403a75112c15119ad202b8738..c21192ad7a8acff77ccb91ae7d8d6a375fb1d60b 100644
--- a/target/linux/bcm53xx/patches-3.18/303-ARM-BCM5310X-Enable-earlyprintk-on-tested-devices.patch
+++ b/target/linux/bcm53xx/patches-3.18/303-ARM-BCM5310X-Enable-earlyprintk-on-tested-devices.patch
@@ -156,4 +156,26 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +		bootargs = "console=ttyS0,115200 earlyprintk";
  	};
  
+ 	memory {
+--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
++++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
+@@ -17,7 +17,7 @@
+ 	model = "Netgear R8500";
+ 
+ 	chosen {
+-		bootargs = "console=ttyS0,115200";
++		bootargs = "console=ttyS0,115200 earlyprintk";
+ 	};
+ 
+ 	memory {
+--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
++++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
+@@ -17,7 +17,7 @@
+ 	model = "D-Link DIR-885L";
+ 
+ 	chosen {
+-		bootargs = "console=ttyS0,115200";
++		bootargs = "console=ttyS0,115200 earlyprintk";
+ 	};
+ 
  	memory {
diff --git a/target/linux/bcm53xx/patches-3.18/306-ARM-BCM5301X-Specify-RAM-on-devices-by-including-HIG.patch b/target/linux/bcm53xx/patches-3.18/306-ARM-BCM5301X-Specify-RAM-on-devices-by-including-HIG.patch
index efa7c76ae8cd3526be2e4ef7b20d8705546d2658..86c2833e666b62e914d9552bf258f28a356e66bb 100644
--- a/target/linux/bcm53xx/patches-3.18/306-ARM-BCM5301X-Specify-RAM-on-devices-by-including-HIG.patch
+++ b/target/linux/bcm53xx/patches-3.18/306-ARM-BCM5301X-Specify-RAM-on-devices-by-including-HIG.patch
@@ -38,7 +38,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +		       0x88000000 0x08000000>;
  	};
  
- 	chipcommonA {
+ 	leds {
 --- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
 +++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
 @@ -21,7 +21,8 @@
@@ -171,3 +171,27 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	};
  
  	leds {
+--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
++++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
+@@ -21,7 +21,8 @@
+ 	};
+ 
+ 	memory {
+-		reg = <0x00000000 0x08000000>;
++		reg = <0x00000000 0x08000000
++		       0x88000000 0x18000000>;
+ 	};
+ 
+ 	leds {
+--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
++++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
+@@ -21,7 +21,8 @@
+ 	};
+ 
+ 	memory {
+-		reg = <0x00000000 0x08000000>;
++		reg = <0x00000000 0x08000000
++		       0x88000000 0x08000000>;
+ 	};
+ 
+ 	nand: nand@18028000 {
diff --git a/target/linux/bcm53xx/patches-3.18/321-ARM-BCM5301X-Set-vcc-gpio-for-USB-controllers.patch b/target/linux/bcm53xx/patches-3.18/321-ARM-BCM5301X-Set-vcc-gpio-for-USB-controllers.patch
deleted file mode 100644
index 34a9b4f130122b0f317a26b70f96757166efd1f4..0000000000000000000000000000000000000000
--- a/target/linux/bcm53xx/patches-3.18/321-ARM-BCM5301X-Set-vcc-gpio-for-USB-controllers.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From f1ee1275f65e87e035260f4d09a0f0ba98c6854d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Sun, 21 Jun 2015 12:56:32 +0200
-Subject: [PATCH] ARM: BCM5301X: Set vcc-gpio for USB controllers
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts | 20 ++++++++++++++++++++
- arch/arm/boot/dts/bcm4708-netgear-r6250.dts       | 11 +++++++++++
- 2 files changed, 31 insertions(+)
-
---- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
-+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
-@@ -25,6 +25,26 @@
- 		       0x88000000 0x18000000>;
- 	};
- 
-+	axi@18000000 {
-+		usb2@21000 {
-+			reg = <0x00021000 0x1000>;
-+
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			vcc-gpio = <&chipcommon 9 GPIO_ACTIVE_HIGH>;
-+		};
-+
-+		usb3@23000 {
-+			reg = <0x00023000 0x1000>;
-+
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			vcc-gpio = <&chipcommon 10 GPIO_ACTIVE_LOW>;
-+		};
-+	};
-+
- 	spi {
- 		compatible = "spi-gpio";
- 		num-chipselects = <1>;
---- a/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
-+++ b/arch/arm/boot/dts/bcm4708-netgear-r6250.dts
-@@ -35,6 +35,17 @@
- 		};
- 	};
- 
-+	axi@18000000 {
-+		usb3@23000 {
-+			reg = <0x00023000 0x1000>;
-+
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
-+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
-@@ -25,6 +25,26 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	axi@18000000 {
-+		usb2@21000 {
-+			reg = <0x00021000 0x1000>;
-+
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
-+		};
-+
-+		usb3@23000 {
-+			reg = <0x00023000 0x1000>;
-+
-+			#address-cells = <1>;
-+			#size-cells = <1>;
-+
-+			vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
diff --git a/target/linux/bcm53xx/patches-3.18/332-ARM-BCM5301X-Add-power-button-for-Buffalo-WZR-1750DHP.patch b/target/linux/bcm53xx/patches-3.18/332-ARM-BCM5301X-Add-power-button-for-Buffalo-WZR-1750DHP.patch
index f9ca7eb7c181b168c5c7b9ee1f2e1fe0be99a325..849537e0328d8ada49a52bc28d262e44c55e0a8c 100644
--- a/target/linux/bcm53xx/patches-3.18/332-ARM-BCM5301X-Add-power-button-for-Buffalo-WZR-1750DHP.patch
+++ b/target/linux/bcm53xx/patches-3.18/332-ARM-BCM5301X-Add-power-button-for-Buffalo-WZR-1750DHP.patch
@@ -5,7 +5,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
 ---
 --- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
 +++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
-@@ -123,6 +123,12 @@
+@@ -103,6 +103,12 @@
  		#address-cells = <1>;
  		#size-cells = <0>;
  
diff --git a/target/linux/bcm53xx/patches-3.18/351-ARM-BCM5301X-Enable-ChipCommon-UART-on-untested-devi.patch b/target/linux/bcm53xx/patches-3.18/351-ARM-BCM5301X-Enable-ChipCommon-UART-on-untested-devi.patch
new file mode 100644
index 0000000000000000000000000000000000000000..44ed519e0b82db7a5fa69a2114e9f3c7a799971c
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/351-ARM-BCM5301X-Enable-ChipCommon-UART-on-untested-devi.patch
@@ -0,0 +1,112 @@
+From 6c223da976a9225ba9fae8d6f891a8fffaae6092 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Fri, 5 Dec 2014 17:38:40 +0100
+Subject: [PATCH] ARM: BCM5301X: Enable ChipCommon UART (serial console)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts  | 10 ++++++++++
+ arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts     | 10 ++++++++++
+ arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts        | 10 ++++++++++
+ arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 10 ++++++++++
+ 4 files changed, 40 insertions(+)
+
+--- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
++++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
+@@ -83,3 +83,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
++++ b/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
+@@ -77,3 +77,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
++++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
+@@ -37,3 +37,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
++++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
+@@ -65,3 +65,8 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++	clock-frequency = <125000000>;
++};
+--- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
++++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
+@@ -108,6 +108,11 @@
+ 	};
+ };
+ 
++&uart0 {
++	status = "okay";
++	clock-frequency = <125000000>;
++};
++
+ &usb2 {
+ 	vcc-gpio = <&chipcommon 0 GPIO_ACTIVE_HIGH>;
+ };
+--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
++++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
+@@ -96,3 +96,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
++++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
+@@ -83,3 +83,7 @@
+ 		};
+ 	};
+ };
++
++&uart0 {
++	status = "okay";
++};
+--- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
++++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
+@@ -145,6 +145,10 @@
+ 	};
+ };
+ 
++&uart0 {
++	status = "okay";
++	clock-frequency = <125000000>;
++};
+ 
+ &usb2 {
+ 	vcc-gpio = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
+--- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
++++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
+@@ -104,4 +104,5 @@
+ 
+ &uart0 {
+ 	status = "okay";
++	clock-frequency = <125000000>;
+ };
diff --git a/target/linux/bcm53xx/patches-3.18/351-ARM-BCM5301X-Enable-ChipCommon-UART-serial-console.patch b/target/linux/bcm53xx/patches-3.18/351-ARM-BCM5301X-Enable-ChipCommon-UART-serial-console.patch
deleted file mode 100644
index 5dc077a049ca7644bd5129d6c3e41d1fa43a492a..0000000000000000000000000000000000000000
--- a/target/linux/bcm53xx/patches-3.18/351-ARM-BCM5301X-Enable-ChipCommon-UART-serial-console.patch
+++ /dev/null
@@ -1,266 +0,0 @@
-From 6c223da976a9225ba9fae8d6f891a8fffaae6092 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Fri, 5 Dec 2014 17:38:40 +0100
-Subject: [PATCH] ARM: BCM5301X: Enable ChipCommon UART (serial console)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts  | 10 ++++++++++
- arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts     | 10 ++++++++++
- arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts        | 10 ++++++++++
- arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts | 10 ++++++++++
- 4 files changed, 40 insertions(+)
-
---- a/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
-+++ b/arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x18000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	axi@18000000 {
- 		usb2@21000 {
- 			reg = <0x00021000 0x1000>;
---- a/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
-+++ b/arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
-+++ b/arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
-+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	spi {
- 		compatible = "spi-gpio";
- 		num-chipselects = <1>;
---- a/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
-+++ b/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
-@@ -23,6 +23,16 @@
- 	memory {
- 		reg = <0x00000000 0x08000000>;
- 	};
-+ 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
- 
- 	nand: nand@18028000 {
- 		nandcs@0 {
---- a/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
-+++ b/arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	gpio-keys {
- 		compatible = "gpio-keys";
- 		#address-cells = <1>;
---- a/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
-+++ b/arch/arm/boot/dts/bcm4709-asus-rt-ac87u.dts
-@@ -47,6 +47,18 @@
- 		};
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+	};
-+
- 	gpio-keys {
- 		compatible = "gpio-keys";
- 		#address-cells = <1>;
---- a/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
-+++ b/arch/arm/boot/dts/bcm4709-netgear-r8000.dts
-@@ -45,6 +45,18 @@
- 		};
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
-+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
-+++ b/arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
-+++ b/arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dts
-@@ -25,6 +25,18 @@
- 		       0x88000000 0x18000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+	};
-+
- 	clocks {
- 		clk_periph: periph {
- 			clock-frequency = <500000000>;
---- a/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
-+++ b/arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
-@@ -25,6 +25,16 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+		};
-+
-+		uart1: serial@0400 {
-+			status = "okay";
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
---- a/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
-+++ b/arch/arm/boot/dts/bcm4709-netgear-r7000.dts
-@@ -25,6 +25,13 @@
- 		       0x88000000 0x08000000>;
- 	};
- 
-+	chipcommonA {
-+		uart0: serial@0300 {
-+			status = "okay";
-+			clock-frequency = <125000000>;
-+		};
-+	};
-+
- 	leds {
- 		compatible = "gpio-leds";
- 
diff --git a/target/linux/bcm53xx/patches-3.18/352-ARM-BCM5301X-Add-back-Luxul-XWC-1000-NAND-flash-layo.patch b/target/linux/bcm53xx/patches-3.18/352-ARM-BCM5301X-Add-duplicated-NAND-entries-for-bcm_nand.patch
similarity index 56%
rename from target/linux/bcm53xx/patches-3.18/352-ARM-BCM5301X-Add-back-Luxul-XWC-1000-NAND-flash-layo.patch
rename to target/linux/bcm53xx/patches-3.18/352-ARM-BCM5301X-Add-duplicated-NAND-entries-for-bcm_nand.patch
index df65e0d03d7d124801460ee83109db03c21542d3..9c1015f311d06ed9997a2813856c1f4622db1046 100644
--- a/target/linux/bcm53xx/patches-3.18/352-ARM-BCM5301X-Add-back-Luxul-XWC-1000-NAND-flash-layo.patch
+++ b/target/linux/bcm53xx/patches-3.18/352-ARM-BCM5301X-Add-duplicated-NAND-entries-for-bcm_nand.patch
@@ -1,7 +1,6 @@
-From b97e582cd05f6ba80bdb63d9f677a3395edc7ff1 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
 Date: Sun, 7 Jun 2015 15:37:43 +0200
-Subject: [PATCH] ARM: BCM5301X: Add back Luxul XWC-1000 NAND flash layout
+Subject: [PATCH] ARM: BCM5301X: Add duplicated NAND entries for bcm_nand
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
@@ -11,13 +10,10 @@ we need to add this DT entry back.
 
 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 ---
- arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
-
 --- a/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
 +++ b/arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
-@@ -34,6 +34,18 @@
- 		};
+@@ -24,6 +24,18 @@
+ 		reg = <0x00000000 0x08000000>;
  	};
  
 +	axi@18000000 {
@@ -35,3 +31,25 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	nand: nand@18028000 {
  		nandcs@0 {
  			partition@0 {
+--- a/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
++++ b/arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
+@@ -25,6 +25,19 @@
+ 		       0x88000000 0x08000000>;
+ 	};
+ 
++	axi@18000000 {
++		nand@28000 {
++			reg = <0x00028000 0x1000>;
++			#address-cells = <1>;
++			#size-cells = <1>;
++
++			partition@0 {
++				label = "firmware";
++				reg = <0x00000000 0x08000000>;
++			};
++		};
++	};
++
+ 	nand: nand@18028000 {
+ 		nandcs@0 {
+ 			partition@0 {
diff --git a/target/linux/bcm53xx/patches-3.18/353-ARM-BCM5301X-Fix-fixed-clock-frequency-for-some-devi.patch b/target/linux/bcm53xx/patches-3.18/353-ARM-BCM5301X-Fix-fixed-clock-frequency-for-some-devi.patch
index ccee2687e40a65f46f6a2d9ec1065a90dc0ac63e..c0ad9b87ce2eedb63fedff7c8026e65d0c972dc8 100644
--- a/target/linux/bcm53xx/patches-3.18/353-ARM-BCM5301X-Fix-fixed-clock-frequency-for-some-devi.patch
+++ b/target/linux/bcm53xx/patches-3.18/353-ARM-BCM5301X-Fix-fixed-clock-frequency-for-some-devi.patch
@@ -24,6 +24,21 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +		};
 +	};
 +
- 	axi@18000000 {
- 		usb2@21000 {
- 			reg = <0x00021000 0x1000>;
+ 	leds {
+ 		compatible = "gpio-leds";
+ 
+--- a/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
++++ b/arch/arm/boot/dts/bcm47094-netgear-r8500.dts
+@@ -25,6 +25,12 @@
+ 		       0x88000000 0x18000000>;
+ 	};
+ 
++	clocks {
++		clk_periph: periph {
++			clock-frequency = <700000000>;
++		};
++	};
++
+ 	leds {
+ 		compatible = "gpio-leds";
+ 
diff --git a/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch b/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch
index 6be75bb8062a921ad89fc0c41ff096b08c0bd94d..36894fec243a0a73c08a7f1720f00226392e5d1e 100644
--- a/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch
+++ b/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch
@@ -17,7 +17,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/drivers/net/ethernet/broadcom/bgmac.c
 +++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1561,11 +1561,20 @@ static int bgmac_probe(struct bcma_devic
+@@ -1566,11 +1566,20 @@ static int bgmac_probe(struct bcma_devic
  	struct net_device *net_dev;
  	struct bgmac *bgmac;
  	struct ssb_sprom *sprom = &core->bus->sprom;
@@ -41,7 +41,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  		pr_err("Unsupported core_unit %d\n", core->core_unit);
  		return -ENOTSUPP;
  	}
-@@ -1600,8 +1609,17 @@ static int bgmac_probe(struct bcma_devic
+@@ -1605,8 +1614,17 @@ static int bgmac_probe(struct bcma_devic
  	}
  	bgmac->cmn = core->bus->drv_gmac_cmn.core;
  
diff --git a/target/linux/bcm53xx/patches-3.18/710-b53-add-hacky-CPU-port-fixes-for-devices-not-using-p.patch b/target/linux/bcm53xx/patches-3.18/710-b53-add-hacky-CPU-port-fixes-for-devices-not-using-p.patch
index dfc422ee3ef4251fc6f09f97558d967a285e6ec8..43c1978f49135e12a5e8cfae50bc851aa087c695 100644
--- a/target/linux/bcm53xx/patches-3.18/710-b53-add-hacky-CPU-port-fixes-for-devices-not-using-p.patch
+++ b/target/linux/bcm53xx/patches-3.18/710-b53-add-hacky-CPU-port-fixes-for-devices-not-using-p.patch
@@ -21,7 +21,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  #include "b53_regs.h"
  #include "b53_priv.h"
-@@ -1313,6 +1314,18 @@ static int b53_switch_init(struct b53_de
+@@ -1313,6 +1314,20 @@ static int b53_switch_init(struct b53_de
  			sw_dev->cpu_port = 5;
  	}
  
@@ -29,6 +29,8 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +		sw_dev->cpu_port = 7;
 +	else if (of_machine_is_compatible("netgear,r8000"))
 +		sw_dev->cpu_port = 8;
++	else if (of_machine_is_compatible("netgear,r8500"))
++		sw_dev->cpu_port = 8;
 +
 +	/*
 +	 * Workaround for devices using port 8 (connected to the 3rd iface).
diff --git a/target/linux/bcm53xx/patches-3.18/800-bcma-use-two-different-initcalls-if-built-in.patch b/target/linux/bcm53xx/patches-3.18/800-bcma-use-two-different-initcalls-if-built-in.patch
deleted file mode 100644
index 9f2cd396aedd8b19afc4d15cff0f77a4dbe49e77..0000000000000000000000000000000000000000
--- a/target/linux/bcm53xx/patches-3.18/800-bcma-use-two-different-initcalls-if-built-in.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 666bdfc027cde41a171862dc698987a378c8b66a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Mon, 9 Feb 2015 18:00:42 +0100
-Subject: [PATCH RFC] bcma: use two different initcalls if built-in
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This is needed as we can't initialize bus during fs_initcall.
-Initialization requires SPROM which depends on NVRAM which depends on
-mtd. Since mtd, spi, nand, spi-nor use standard module_init, we have to
-do the same in bcma.
-Without this we'll try to initialize SPROM without having a ready SPROM
-proviver registered using bcma_arch_register_fallback_sprom.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
-While this patch seems to work and I can compile bcma as built-in and
-module, I'm not too proud of it. I don't really like these #if(n)def
-tricks and I'm afraid bcma_modinit may be called even if
-bcma_modinit_early failed.
-
-Do you see any better idea of solving this?
----
- drivers/bcma/main.c | 16 ++++++++++++++--
- 1 file changed, 14 insertions(+), 2 deletions(-)
-
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -637,13 +637,25 @@ static int bcma_device_uevent(struct dev
- 			      core->id.rev, core->id.class);
- }
- 
-+/* Bus has to be registered early, before any bcma driver */
-+static int __init bcma_modinit_early(void)
-+{
-+	return bus_register(&bcma_bus_type);
-+}
-+#ifndef MODULE
-+fs_initcall(bcma_modinit_early);
-+#endif
-+
-+/* Initialization has to be done later with SPI/mtd/NAND/SPROM available */
- static int __init bcma_modinit(void)
- {
- 	int err;
- 
--	err = bus_register(&bcma_bus_type);
-+#ifdef MODULE
-+	err = bcma_modinit_early();
- 	if (err)
- 		return err;
-+#endif
- 
- 	err = bcma_host_soc_register_driver();
- 	if (err) {
-@@ -660,7 +672,7 @@ static int __init bcma_modinit(void)
- 
- 	return err;
- }
--fs_initcall(bcma_modinit);
-+module_init(bcma_modinit);
- 
- static void __exit bcma_modexit(void)
- {
diff --git a/target/linux/bcm53xx/patches-3.18/812-USB-bcma-add-USB-3.0-support.patch b/target/linux/bcm53xx/patches-3.18/812-USB-bcma-add-USB-3.0-support.patch
index 0414c44776290e32f044394f5ab01b77205ab7ab..52d423164950d8dc71646c0c7e2f38506458b7c0 100644
--- a/target/linux/bcm53xx/patches-3.18/812-USB-bcma-add-USB-3.0-support.patch
+++ b/target/linux/bcm53xx/patches-3.18/812-USB-bcma-add-USB-3.0-support.patch
@@ -21,7 +21,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	struct gpio_desc *gpio_desc;
  };
  
-@@ -338,6 +339,215 @@ err_unregister_ohci_dev:
+@@ -338,6 +339,166 @@ err_unregister_ohci_dev:
  	return err;
  }
  
@@ -55,6 +55,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +	u32 cru_straps_ctrl;
 +
 +	if (chipinfo->id != BCMA_CHIP_ID_BCM4707 &&
++	    chipinfo->id != BCMA_CHIP_ID_BCM47094 &&
 +	    chipinfo->id != BCMA_CHIP_ID_BCM53018)
 +		return;
 +
@@ -78,9 +79,9 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +	iowrite32(0x0000009a, ccb->mii + 0x000);
 +	udelay(2);
 +
-+	switch (chipinfo->id) {
-+	case BCMA_CHIP_ID_BCM4707:
-+		if (chipinfo->rev == 4) {
++	if (chipinfo->id == BCMA_CHIP_ID_BCM53018 ||
++	    (chipinfo->id == BCMA_CHIP_ID_BCM4707 && (chipinfo->rev == 4 || chipinfo->rev == 6)) ||
++	    chipinfo->id == BCMA_CHIP_ID_BCM47094) {
 +			/* For NS-B0, USB3 PLL Block */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
 +			iowrite32(0x587e8000, ccb->mii + 0x004);
@@ -101,32 +102,39 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
 +			iowrite32(0x582e8000, ccb->mii + 0x004);
 +
++			/* Waiting MII Mgt interface idle */
++			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
++
 +			/* Deasserting USB3 system reset */
 +			bcma_awrite32(core, BCMA_RESET_CTL, 0);
 +
-+			/* Set ana_pllSeqStart */
++			/* PLL frequency monitor enable */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
 +			iowrite32(0x58069000, ccb->mii + 0x004);
 +
-+			/* RXPMD block */
++			/* PIPE Block */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+			iowrite32(0x587e8020, ccb->mii + 0x004);
++			iowrite32(0x587e8060, ccb->mii + 0x004);
 +
-+			/* CDR int loop locking BW to 1 */
++			/* CMPMAX & CMPMINTH setting */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+			iowrite32(0x58120049, ccb->mii + 0x004);
++			iowrite32(0x580af30d, ccb->mii + 0x004);
 +
-+			/* CDR int loop acquisition BW to 1 */
++			/* DEGLITCH MIN & MAX setting */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+			iowrite32(0x580e0049, ccb->mii + 0x004);
++			iowrite32(0x580e6302, ccb->mii + 0x004);
++
++			/* TXPMD block */
++			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
++			iowrite32(0x587e8040, ccb->mii + 0x004);
 +
-+			/* CDR prop loop BW to 1 */
++			/* Enabling SSC */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+			iowrite32(0x580a005c, ccb->mii + 0x004);
++			iowrite32(0x58061003, ccb->mii + 0x004);
 +
 +			/* Waiting MII Mgt interface idle */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		} else {
++	} else if (chipinfo->id == BCMA_CHIP_ID_BCM4707) {
 +			/* PLL30 block */
 +			bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
 +			iowrite32(0x587e8000, ccb->mii + 0x004);
@@ -155,63 +163,6 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 +
 +			/* Deasserting USB3 system reset */
 +			bcma_awrite32(core, BCMA_RESET_CTL, 0);
-+		}
-+		break;
-+	case BCMA_CHIP_ID_BCM53018:
-+		/* USB3 PLL Block */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x587e8000, ccb->mii + 0x004);
-+
-+		/* Assert Ana_Pllseq start */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x58061000, ccb->mii + 0x004);
-+
-+		/* Assert CML Divider ratio to 26 */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x582a6400, ccb->mii + 0x004);
-+
-+		/* Asserting PLL Reset */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x582ec000, ccb->mii + 0x004);
-+
-+		/* Deaaserting PLL Reset */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x582e8000, ccb->mii + 0x004);
-+
-+		/* Waiting MII Mgt interface idle */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+
-+		/* Deasserting USB3 system reset */
-+		bcma_awrite32(core, BCMA_RESET_CTL, 0);
-+
-+		/* PLL frequency monitor enable */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x58069000, ccb->mii + 0x004);
-+
-+		/* PIPE Block */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x587e8060, ccb->mii + 0x004);
-+
-+		/* CMPMAX & CMPMINTH setting */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x580af30d, ccb->mii + 0x004);
-+
-+		/* DEGLITCH MIN & MAX setting */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x580e6302, ccb->mii + 0x004);
-+
-+		/* TXPMD block */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x587e8040, ccb->mii + 0x004);
-+
-+		/* Enabling SSC */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+		iowrite32(0x58061003, ccb->mii + 0x004);
-+
-+		/* Waiting MII Mgt interface idle */
-+		bcma_wait_reg(bus, ccb->mii + 0x000, 0x0100, 0x0000, 1000);
-+
-+		break;
 +	}
 +out:
 +	if (dmu)
@@ -237,7 +188,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  static int bcma_hcd_probe(struct bcma_device *dev)
  {
  	int err;
-@@ -364,6 +574,11 @@ static int bcma_hcd_probe(struct bcma_de
+@@ -364,6 +525,11 @@ static int bcma_hcd_probe(struct bcma_de
  		if (err)
  			return err;
  		break;
@@ -249,7 +200,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  	default:
  		return -ENODEV;
  	}
-@@ -377,11 +592,14 @@ static void bcma_hcd_remove(struct bcma_
+@@ -377,11 +543,14 @@ static void bcma_hcd_remove(struct bcma_
  	struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);
  	struct platform_device *ohci_dev = usb_dev->ohci_dev;
  	struct platform_device *ehci_dev = usb_dev->ehci_dev;
@@ -264,7 +215,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  	bcma_core_disable(dev, 0);
  }
-@@ -418,6 +636,7 @@ static int bcma_hcd_resume(struct bcma_d
+@@ -418,6 +587,7 @@ static int bcma_hcd_resume(struct bcma_d
  static const struct bcma_device_id bcma_hcd_table[] = {
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_USB20_HOST, BCMA_ANY_REV, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_USB20, BCMA_ANY_REV, BCMA_ANY_CLASS),
diff --git a/target/linux/bcm53xx/patches-3.18/813-USB-bcma-use-simpler-devm_gpiod_get.patch b/target/linux/bcm53xx/patches-3.18/813-USB-bcma-use-simpler-devm_gpiod_get.patch
index ebad06630e8c663b473cb8a47781689b829fb3ef..84355ac274f3c488f42829f5068bc3055d786ce0 100644
--- a/target/linux/bcm53xx/patches-3.18/813-USB-bcma-use-simpler-devm_gpiod_get.patch
+++ b/target/linux/bcm53xx/patches-3.18/813-USB-bcma-use-simpler-devm_gpiod_get.patch
@@ -12,7 +12,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/drivers/usb/host/bcma-hcd.c
 +++ b/drivers/usb/host/bcma-hcd.c
-@@ -562,8 +562,7 @@ static int bcma_hcd_probe(struct bcma_de
+@@ -513,8 +513,7 @@ static int bcma_hcd_probe(struct bcma_de
  	usb_dev->core = dev;
  
  	if (dev->dev.of_node)
diff --git a/target/linux/bcm53xx/patches-3.18/814-USB-bcma-improve-USB-2.0-PHY-support-for-BCM4709-and.patch b/target/linux/bcm53xx/patches-3.18/814-USB-bcma-improve-USB-2.0-PHY-support-for-BCM4709-and.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a687a93ee52aa0917459fd73208fcb6c5a8755b2
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.18/814-USB-bcma-improve-USB-2.0-PHY-support-for-BCM4709-and.patch
@@ -0,0 +1,122 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Subject: [PATCH] USB: bcma: improve USB 2.0 PHY support for BCM4709 and
+ BCM47094
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+--- a/drivers/usb/host/bcma-hcd.c
++++ b/drivers/usb/host/bcma-hcd.c
+@@ -30,6 +30,17 @@
+ #include <linux/usb/ehci_pdriver.h>
+ #include <linux/usb/ohci_pdriver.h>
+ 
++/* DMU (Device Management Unit) */
++#define BCMA_DMU_CRU_USB2_CONTROL			0x0164
++#define  BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_MASK	0x00000FFC
++#define  BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_SHIFT	2
++#define  BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_MASK	0x00007000
++#define  BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_SHIFT	12
++#define BCMA_DMU_CRU_CLKSET_KEY				0x0180
++#define BCMA_DMU_CRU_STRAPS_CTRL			0x02A0
++#define  BCMA_DMU_CRU_STRAPS_CTRL_USB3			0x00000010
++#define  BCMA_DMU_CRU_STRAPS_CTRL_4BYTE			0x00008000
++
+ MODULE_AUTHOR("Hauke Mehrtens");
+ MODULE_DESCRIPTION("Common USB driver for BCMA Bus");
+ MODULE_LICENSE("GPL");
+@@ -166,10 +177,35 @@ static void bcma_hcd_init_chip_mips(stru
+ 	}
+ }
+ 
++static u32 bcma_hcd_usb_ref_clk_get_rate(void __iomem *dmu)
++{
++	u32 val, ndiv, pdiv, ch2_mdiv, ch2_freq;
++
++	/* get divider integer from the cru_genpll_control5 */
++	val = ioread32(dmu + 0x154);
++	ndiv = (val >> 20) & 0x3ff;
++	if (ndiv == 0)
++		ndiv = 1 << 10;
++
++	/* get pdiv and ch2_mdiv from the cru_genpll_control6 */
++	val = ioread32(dmu + 0x158);
++	pdiv = (val >> 24) & 0x7;
++	pdiv = (pdiv == 0) ? (1 << 3) : pdiv;
++
++	ch2_mdiv = val & 0xff;
++	ch2_mdiv = (ch2_mdiv == 0) ? (1 << 8) : ch2_mdiv;
++
++	/* calculate ch2_freq based on 25MHz reference clock */
++	ch2_freq = (25000000 / (pdiv * ch2_mdiv)) * ndiv;
++
++	return ch2_freq;
++}
++
+ static void bcma_hcd_init_chip_arm_phy(struct bcma_device *dev)
+ {
+ 	struct bcma_device *arm_core;
+ 	void __iomem *dmu;
++	u32 ref_clk_rate, usb2ctl, usb_pll_ndiv, usb_pll_pdiv;
+ 
+ 	arm_core = bcma_find_core(dev->bus, BCMA_CORE_ARMCA9);
+ 	if (!arm_core) {
+@@ -183,14 +219,29 @@ static void bcma_hcd_init_chip_arm_phy(s
+ 		return;
+ 	}
+ 
++	ref_clk_rate = bcma_hcd_usb_ref_clk_get_rate(dmu);
++
++	usb2ctl = ioread32(dmu + BCMA_DMU_CRU_USB2_CONTROL);
++
++	usb_pll_pdiv = usb2ctl;
++	usb_pll_pdiv &= BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_MASK;
++	usb_pll_pdiv >>= BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_PDIV_SHIFT;
++	if (!usb_pll_pdiv)
++		usb_pll_pdiv = 1 << 3;
++
++	/* Calculate ndiv based on a solid 1920 MHz that is for USB2 PHY */
++	usb_pll_ndiv = (1920000000 * usb_pll_pdiv) / ref_clk_rate;
++
+ 	/* Unlock DMU PLL settings */
+-	iowrite32(0x0000ea68, dmu + 0x180);
++	iowrite32(0x0000ea68, dmu + BCMA_DMU_CRU_CLKSET_KEY);
+ 
+ 	/* Write USB 2.0 PLL control setting */
+-	iowrite32(0x00dd10c3, dmu + 0x164);
++	usb2ctl &= ~BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_MASK;
++	usb2ctl |= usb_pll_ndiv << BCMA_DMU_CRU_USB2_CONTROL_USB_PLL_NDIV_SHIFT;
++	iowrite32(usb2ctl, dmu + BCMA_DMU_CRU_USB2_CONTROL);
+ 
+ 	/* Lock DMU PLL settings */
+-	iowrite32(0x00000000, dmu + 0x180);
++	iowrite32(0x00000000, dmu + BCMA_DMU_CRU_CLKSET_KEY);
+ 
+ 	iounmap(dmu);
+ }
+@@ -218,15 +269,17 @@ static void bcma_hcd_init_chip_arm_hc(st
+ 
+ static void bcma_hcd_init_chip_arm(struct bcma_device *dev)
+ {
++	struct bcma_chipinfo *chipinfo = &dev->bus->chipinfo;
++
+ 	bcma_core_enable(dev, 0);
+ 
+-	if (dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM4707 ||
+-	    dev->bus->chipinfo.id == BCMA_CHIP_ID_BCM53018) {
+-		if (dev->bus->chipinfo.pkg == BCMA_PKG_ID_BCM4707 ||
+-		    dev->bus->chipinfo.pkg == BCMA_PKG_ID_BCM4708)
+-			bcma_hcd_init_chip_arm_phy(dev);
++	if (chipinfo->id == BCMA_CHIP_ID_BCM4707 ||
++	    chipinfo->id == BCMA_CHIP_ID_BCM47094 ||
++	    chipinfo->id == BCMA_CHIP_ID_BCM53018) {
++		bcma_hcd_init_chip_arm_phy(dev);
+ 
+-		bcma_hcd_init_chip_arm_hc(dev);
++		if (1) /* TODO: Exclude BCM53573 */
++			bcma_hcd_init_chip_arm_hc(dev);
+ 	}
+ }
+ 
diff --git a/target/linux/brcm2708/Makefile b/target/linux/brcm2708/Makefile
index 30f6e1dfa44895d32699c9fffb2333043d7cb06d..015aa9c2a85120cf2af31229cbd2f1071759d75f 100644
--- a/target/linux/brcm2708/Makefile
+++ b/target/linux/brcm2708/Makefile
@@ -19,7 +19,7 @@ SUBTARGETS:=bcm2708 bcm2709
 KERNEL_PATCHVER:=3.18
 
 include $(INCLUDE_DIR)/target.mk
-DEFAULT_PACKAGES += brcm2708-gpu-fw kmod-usb-hid kmod-sound-core kmod-sound-arm-bcm2835
+DEFAULT_PACKAGES += brcm2708-gpu-fw kmod-usb-hid kmod-sound-core kmod-sound-arm-bcm2835 kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1
 
 define Target/Description
 	Build firmware image for Broadcom BCM2708/BCM2709 SoC devices.
diff --git a/target/linux/brcm2708/patches-3.18/0024-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch b/target/linux/brcm2708/patches-3.18/0024-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
index e720949304dfd629322b486f2f30ceede908c2e7..e67b4714f5f90a7781fef0a96cac253135f53f3b 100644
--- a/target/linux/brcm2708/patches-3.18/0024-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
+++ b/target/linux/brcm2708/patches-3.18/0024-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
@@ -54,7 +54,7 @@ Subject: [PATCH 024/114] config: Enable CONFIG_MEMCG, but leave it disabled
  	printk("cgroup: using legacy files on the default hierarchy\n");
 --- a/mm/memcontrol.c
 +++ b/mm/memcontrol.c
-@@ -6207,6 +6207,7 @@ struct cgroup_subsys memory_cgrp_subsys
+@@ -6208,6 +6208,7 @@ struct cgroup_subsys memory_cgrp_subsys
  	.bind = mem_cgroup_bind,
  	.legacy_cftypes = mem_cgroup_files,
  	.early_init = 0,
diff --git a/target/linux/brcm2708/patches-3.18/0055-usb-core-make-overcurrent-messages-more-prominent.patch b/target/linux/brcm2708/patches-3.18/0055-usb-core-make-overcurrent-messages-more-prominent.patch
index 0c339d3a2f0345251563c796f2e4f885abbbfd5b..82d36f84ef4c47f13feadb3ef8693e015a984eb4 100644
--- a/target/linux/brcm2708/patches-3.18/0055-usb-core-make-overcurrent-messages-more-prominent.patch
+++ b/target/linux/brcm2708/patches-3.18/0055-usb-core-make-overcurrent-messages-more-prominent.patch
@@ -10,7 +10,7 @@ Hub overcurrent messages are more serious than "debug". Increase loglevel.
 
 --- a/drivers/usb/core/hub.c
 +++ b/drivers/usb/core/hub.c
-@@ -4907,7 +4907,7 @@ static void port_event(struct usb_hub *h
+@@ -4928,7 +4928,7 @@ static void port_event(struct usb_hub *h
  	if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
  		u16 status = 0, unused;
  
diff --git a/target/linux/brcm47xx/image/Makefile b/target/linux/brcm47xx/image/Makefile
index 4e1c6642c1286f828075428c6a86cc76e9c323fa..42a239e87bd90ad9b9d186949e604b1602cf832e 100644
--- a/target/linux/brcm47xx/image/Makefile
+++ b/target/linux/brcm47xx/image/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2012 OpenWrt.org
+# Copyright (C) 2006-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -34,58 +34,6 @@ endif
 	$(call prepare_generic_squashfs,$(KDIR)/fs_mark)
 endef
 
-define Image/Build/wgt634u
-	dd if=$(KDIR)/loader.elf of=$(BIN_DIR)/$(IMG_PREFIX)-wgt634u-$(2).bin bs=131072 conv=sync
-	cat $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx >> $(BIN_DIR)/$(IMG_PREFIX)-wgt634u-$(2).bin
-endef
-
-define Image/Build/dwl3150
-	cp $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx $(BIN_DIR)/$(IMG_PREFIX)-dwl3150-$(2).bin
-	echo "BCM-5352-2050-0000000-01" >> $(BIN_DIR)/$(IMG_PREFIX)-dwl3150-$(2).bin
-endef
-
-# $(1): filesystem type.
-# $(2): device model (used for output file).
-# $(3): pattern (device specific magic).
-# $(4): version.
-# $(5): simplified filesystem type (without block size).
-define Image/Build/CyberTAN
-	$(STAGING_DIR_HOST)/bin/addpattern -4 -p $(3) -v v$(4) -i $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(5).bin $(if $(6),-s $(6))
-endef
-define Image/Build/CyberTAN2
-	$(STAGING_DIR_HOST)/bin/addpattern -4 -p $(3) -v v$(4) -i $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(5).noheader.bin -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(5).bin $(if $(6),-s $(6))
-endef
-define Image/Build/CyberTANHead
-	$(STAGING_DIR_HOST)/bin/addpattern -5 -p $(3) -v v$(4) -i /dev/null -o $(KDIR)/$(IMG_PREFIX)-$(2)-header.bin $(if $(6),-s $(6))
-endef
-
-define Image/Build/Motorola
-	$(STAGING_DIR_HOST)/bin/motorola-bin -$(3) $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(4).bin
-endef
-
-define Image/Build/USR
-	$(STAGING_DIR_HOST)/bin/trx2usr $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3).bin
-endef
-
-define Image/Build/Edi
-	$(STAGING_DIR_HOST)/bin/trx2edips $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3).bin
-endef
-
-define Image/Build/Huawei
-	dd if=/dev/zero of=$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3)-gz.bin bs=92 count=1
-	echo -ne 'HDR0\x08\x00\x00\x00' >> $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3)-gz.bin
-	cat $(BIN_DIR)/$(IMG_PREFIX)-$(1)-gz.trx >> $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3)-gz.bin
-endef
-
-# $(1): filesystem type.
-# $(2): device model (used for output file).
-# $(3): board_id (device specific magic).
-# $(4): region.
-# $(5): simplified filesystem type (without block size).
-define Image/Build/Chk
-	$(STAGING_DIR_HOST)/bin/mkchkimg -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(5).chk -k $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx -b $(3) -r $(4)
-endef
-
 define trxalign/jffs2-128k
 -a 0x20000 -f $(KDIR)/root.$(1)
 endef
@@ -96,14 +44,6 @@ define trxalign/squashfs
 -a 1024 -f $(KDIR)/root.$(1) $(if $(2),-f $(2)) -a 0x10000 -A $(KDIR)/fs_mark
 endef
 
-define Image/Build/trxV2
-	$(call Image/Build/CyberTANHead,$(1),$(2),$(3),$(4),$(5),$(if $(6),$(6)))
-	$(STAGING_DIR_HOST)/bin/trx -2 -o $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(5).noheader.bin \
-		-f $(KDIR)/loader.gz -f $(KDIR)/vmlinux.lzma \
-		$(call trxalign/$(1),$(1),$(KDIR)/$(IMG_PREFIX)-$(2)-header.bin)
-	$(call Image/Build/CyberTAN2,$(1),$(2),$(3),$(4),$(5),$(if $(6),$(6)))
-endef
-
 #################################################
 # Images
 #################################################
@@ -116,13 +56,53 @@ define Build/trx-with-loader
 		$(call trxalign/$(FILESYSTEM),$(FILESYSTEM))
 endef
 
+define Build/trx-v2-with-loader
+	$(STAGING_DIR_HOST)/bin/trx \
+		-2 \
+		-m 33554432 \
+		-o $@.new \
+		-f $(KDIR)/loader.gz \
+		-f $(KDIR)/vmlinux.lzma \
+		$(call trxalign/$(FILESYSTEM),$(FILESYSTEM),$@)
+	mv $@.new $@
+endef
+
+define Build/trx-without-loader
+	$(STAGING_DIR_HOST)/bin/trx \
+		-m 33554432 \
+		-o $@ \
+		-f $(word 1,$^) \
+		$(call trxalign/$(FILESYSTEM),$(FILESYSTEM))
+endef
+
 define Build/asus-trx
 	$(STAGING_DIR_HOST)/bin/asustrx -p "$(PRODUCTID)" -i $@ -o $@.new
 	mv $@.new $@
 endef
 
+define Build/edimax-bin
+	$(STAGING_DIR_HOST)/bin/trx2edips $@ $@.new
+	mv $@.new $@
+endef
+
+define Build/huawei-bin
+	dd if=/dev/zero of=$@.new bs=92 count=1
+	echo -ne 'HDR0\x08\x00\x00\x00' >> $@.new
+	cat $@ >> $@.new
+	mv $@.new $@
+endef
+
 define Build/linksys-bin
-	$(STAGING_DIR_HOST)/bin/addpattern -4 -p $(DEVICE_ID) -v v$(VERSION) -i $@ -o $@.new
+	$(STAGING_DIR_HOST)/bin/addpattern -4 -p $(DEVICE_ID) -v v$(VERSION) $(if $(SERIAL),-s $(SERIAL)) -i $@ -o $@.new
+	mv $@.new $@
+endef
+
+define Build/linksys-pattern-partition
+	$(STAGING_DIR_HOST)/bin/addpattern -5 -p $(DEVICE_ID) -v v$(VERSION) $(if $(SERIAL),-s $(SERIAL)) -i /dev/null -o $@
+endef
+
+define Build/motorola-bin
+	$(STAGING_DIR_HOST)/bin/motorola-bin -$(MOTOROLA_DEVICE) $@ $@.new
 	mv $@.new $@
 endef
 
@@ -135,13 +115,30 @@ define Build/netgear-chk
 	mv $@.new $@
 endef
 
+define Build/prepend-with-elf
+	mv $@ $@.old
+	dd if=$(KDIR)/loader.elf of=$@ bs=131072 conv=sync
+	cat $@.old >> $@
+endef
+
+define Build/tailed-bin
+	echo $(BIN_TAIL) >> $@
+endef
+
+define Build/usrobotics-bin
+	$(STAGING_DIR_HOST)/bin/trx2usr $@ $@.new
+	mv $@.new $@
+endef
+
 #################################################
 # Devices
 #################################################
 
 DEVICE_VARS += PRODUCTID
-DEVICE_VARS += DEVICE_ID VERSION
+DEVICE_VARS += DEVICE_ID VERSION SERIAL
 DEVICE_VARS += BOARD_ID REGION
+DEVICE_VARS += MOTOROLA_DEVICE
+DEVICE_VARS += BIN_TAIL
 
 define Device/Default
 	KERNEL := kernel-bin
@@ -152,6 +149,19 @@ define Device/Default
 	IMAGE/trx := trx-with-loader
 endef
 
+define Device/standard
+endef
+
+define Device/standard-noloader-gz
+	KERNEL_NAME = vmlinux.gz
+	IMAGE/trx := trx-without-loader
+endef
+
+define Device/standard-noloader-nodictionarylzma
+	KERNEL_NAME = vmlinux-nodictionary.lzma
+	IMAGE/trx := trx-without-loader
+endef
+
 define Device/asus
 	IMAGES := trx
 	IMAGE/trx := trx-with-loader | asus-trx
@@ -179,6 +189,19 @@ define LinksysDevice
   TARGET_DEVICES += linksys-$(1)
 endef
 
+define Device/motorola
+	IMAGES := bin
+	IMAGE/bin := trx-with-loader | motorola-bin
+endef
+
+define MotorolaDevice
+  define Device/motorola-$(1)
+	$$(Device/motorola)
+	MOTOROLA_DEVICE := $(2)
+  endef
+  TARGET_DEVICES += motorola-$(1)
+endef
+
 define Device/netgear
 	IMAGES := chk
 	IMAGE/chk := trx-with-loader | netgear-chk
@@ -207,43 +230,39 @@ ifeq ($(SUBTARGET),generic)
   # BCMA SoC with SSB WiFi
   $(eval $(call LinksysDevice,wrt610n-v2,610N,2.0.0))
   $(eval $(call LinksysDevice,e3000-v1,61XN,1.0.3))
+
+  TARGET_DEVICES += standard
 endif
 
 #################################################
 # Subtarget legacy
 #################################################
 
-# $(1): filesystem type.
-define Image/Build/legacy/devices-with-128k-blocks
-	$(call Image/Build/trxV2,$(1),wrt54g3gv2-vf,3G2V,3.00.24,$(patsubst jffs2-%,jffs2,$(1)),6)
-	$(call Image/Build/wgt634u,$(1),$(patsubst jffs2-%,jffs2,$(1)))
-endef
-
-# $(1): filesystem type.
-define Image/Build/legacy/devices-with-64k-blocks
-	$(call Image/Build/dwl3150,$(1),$(patsubst jffs2-%,jffs2,$(1)))
-	$(call Image/Build/Edi,$(1),ps1208mfg,$(patsubst jffs2-%,jffs2,$(1)))
-	$(call Image/Build/Huawei,$(1),e970,$(1))
-	$(call Image/Build/Motorola,$(1),wa840g,2,$(patsubst jffs2-%,jffs2,$(1)))
-	$(call Image/Build/Motorola,$(1),we800g,3,$(patsubst jffs2-%,jffs2,$(1)))
-	$(call Image/Build/Motorola,$(1),wr850g,1,$(1))
-	$(call Image/Build/USR,$(1),usr5461,$(1))
+define Device/dlink-dwl-3150
+	IMAGES := bin
+	IMAGE/bin := trx-with-loader | tailed-bin
+	BIN_TAIL := BCM-5352-2050-0000000-01
 endef
 
-# $(1): filesystem type.
-define Image/Build/legacy/jffs2-64k
-	$(call Image/Build/legacy/devices-with-64k-blocks,$(1))
+define Device/edimax-ps1208-mfg
+	IMAGES := bin
+	IMAGE/bin := trx-with-loader | edimax-bin
 endef
 
-# $(1): filesystem type.
-define Image/Build/legacy/jffs2-128k
-	$(call Image/Build/legacy/devices-with-128k-blocks,$(1))
+define Device/huawei-e970
+	KERNEL_NAME = vmlinux.gz
+	IMAGES := bin
+	IMAGE/bin := trx-without-loader | huawei-bin
 endef
 
-# $(1): filesystem type.
-define Image/Build/legacy/squashfs
-	$(call Image/Build/legacy/devices-with-64k-blocks,$(1))
-	$(call Image/Build/legacy/devices-with-128k-blocks,$(1))
+define Device/linksys-wrt54g3gv2-vf
+	FILESYSTEMS := $(FS_128K)
+	IMAGES := noheader.bin bin
+	IMAGE/noheader.bin := linksys-pattern-partition | trx-v2-with-loader
+	IMAGE/bin := linksys-pattern-partition | trx-v2-with-loader | linksys-bin
+	DEVICE_ID := 3G2V
+	VERSION := 3.00.24
+	SERIAL := 6
 endef
 
 define Device/linksys-wrt54gs
@@ -260,10 +279,27 @@ define Device/linksys-wrtsl54gs
 	VERSION := 2.08.1
 endef
 
+define Device/netgear-wgt634u
+	FILESYSTEMS := $(FS_128K)
+	IMAGES := bin
+	IMAGE/bin := trx-with-loader | prepend-with-elf
+endef
+
+define Device/usrobotics-usr5461
+	IMAGES := bin
+	IMAGE/bin := trx-with-loader | usrobotics-bin
+endef
+
 ifeq ($(SUBTARGET),legacy)
   TARGET_DEVICES += \
+	dlink-dwl-3150 \
+	edimax-ps1208-mfg \
+	huawei-e970 \
+	linksys-wrt54g3gv2-vf \
 	linksys-wrt54gs \
-	linksys-wrtsl54gs
+	linksys-wrtsl54gs \
+	netgear-wgt634u \
+	usrobotics-usr5461
 
   $(eval $(call AsusDevice,wl-300g,WL300g      ))
   $(eval $(call AsusDevice,wl-320gp,WL320gP     ))
@@ -281,9 +317,14 @@ ifeq ($(SUBTARGET),legacy)
   $(eval $(call LinksysDevice,wrt150n,N150,1.51.3))
   $(eval $(call LinksysDevice,wrt160n-v1,N150,1.50.1))
   $(eval $(call LinksysDevice,wrt300n-v1,EWCB,1.03.6))
+  $(eval $(call MotorolaDevice,wa840g,2))
+  $(eval $(call MotorolaDevice,we800g,3))
+  $(eval $(call MotorolaDevice,wr850g,1))
   $(eval $(call NetgearDevice,wgr614-v8,U12H072T00_NETGEAR,2))
   $(eval $(call NetgearDevice,wndr3300-v1,U12H093T00_NETGEAR,2))
   $(eval $(call NetgearDevice,wnr834b-v2,U12H081T00_NETGEAR,2))
+
+  TARGET_DEVICES += standard standard-noloader-gz
 endif
 
 #################################################
@@ -331,6 +372,7 @@ ifeq ($(SUBTARGET),mips74k)
   $(eval $(call NetgearDevice,wndr3400-v2,U12H187T00_NETGEAR,2))
   $(eval $(call NetgearDevice,wndr3400-v3,U12H208T00_NETGEAR,1))
   $(eval $(call NetgearDevice,wndr3700-v3,U12H194T00_NETGEAR,2))
+#  $(eval $(call NetgearDevice,wndr3400-vcna,U12H155T01_NETGEAR,2))
   $(eval $(call NetgearDevice,wndr4000,U12H181T00_NETGEAR,2))
   $(eval $(call NetgearDevice,wnr1000-v3,U12H139T00_NETGEAR,2))
   $(eval $(call NetgearDevice,wnr2000v2,U12H114T00_NETGEAR,2))
@@ -338,7 +380,11 @@ ifeq ($(SUBTARGET),mips74k)
   $(eval $(call NetgearDevice,wnr3500l-v1-north-america,U12H136T99_NETGEAR,2))
   $(eval $(call NetgearDevice,wnr3500l-v1-other-regions,U12H136T99_NETGEAR,1))
   $(eval $(call NetgearDevice,wnr3500l-v2,U12H172T00_NETGEAR,1))
+#  $(eval $(call NetgearDevice,wnr3500u,U12H136T00_NETGEAR,2))
   $(eval $(call NetgearDevice,wnr3500-v2,U12H127T00_NETGEAR,2))
+#  $(eval $(call NetgearDevice,wnr3500-v2-vc,U12H127T70_NETGEAR,2))
+
+  TARGET_DEVICES += standard standard-noloader-nodictionarylzma
 endif
 
 #################################################
@@ -352,20 +398,7 @@ endef
 
 # $(1): filesystem type.
 define Image/Build
-	$(STAGING_DIR_HOST)/bin/trx -o $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx \
-		-f $(KDIR)/loader.gz -f $(KDIR)/vmlinux.lzma \
-		$(call trxalign/$(1),$(1))
-	$(STAGING_DIR_HOST)/bin/trx -o $(BIN_DIR)/$(IMG_PREFIX)-$(1)-noloader-nodictionary.trx \
-		-f $(KDIR)/vmlinux-nodictionary.lzma \
-		$(call trxalign/$(1),$(1))
-	$(STAGING_DIR_HOST)/bin/trx -o $(BIN_DIR)/$(IMG_PREFIX)-$(1)-gz.trx \
-		-f $(KDIR)/vmlinux.gz \
-		$(call trxalign/$(1),$(1))
-	$(call Image/Build/$(SUBTARGET)/$(1),$(1))
-#	$(call Image/Build/Chk,$(1),wgr614_v9,U12H094T00_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1)))
-#	$(call Image/Build/Chk,$(1),wndr3400_vcna,U12H155T01_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1)))
-#	$(call Image/Build/Chk,$(1),wnr3500U,U12H136T00_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1)))
-#	$(call Image/Build/Chk,$(1),wnr3500v2_VC,U12H127T70_NETGEAR,2,$(patsubst jffs2-%,jffs2,$(1)))
+	# TODO: Move it to Device/*
 ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
 	$(call Image/Build/Initramfs)
 endif
diff --git a/target/linux/brcm47xx/patches-3.18/031-05-MIPS-BCM47xx-Move-NVRAM-header-to-the-include-linux.patch b/target/linux/brcm47xx/patches-3.18/031-05-MIPS-BCM47xx-Move-NVRAM-header-to-the-include-linux.patch
index c1c0927ceca62153cbc7e4cf5afe75821587950a..e9e387354528ad5f2e3b4de0dc68d0df7c4f3ee5 100644
--- a/target/linux/brcm47xx/patches-3.18/031-05-MIPS-BCM47xx-Move-NVRAM-header-to-the-include-linux.patch
+++ b/target/linux/brcm47xx/patches-3.18/031-05-MIPS-BCM47xx-Move-NVRAM-header-to-the-include-linux.patch
@@ -182,40 +182,3 @@ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  #endif
  
  #include "ssb_private.h"
---- /dev/null
-+++ b/include/linux/bcm47xx_nvram.h
-@@ -0,0 +1,34 @@
-+/*
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ */
-+
-+#ifndef __BCM47XX_NVRAM_H
-+#define __BCM47XX_NVRAM_H
-+
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+
-+#ifdef CONFIG_BCM47XX
-+int bcm47xx_nvram_init_from_mem(u32 base, u32 lim);
-+int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len);
-+int bcm47xx_nvram_gpio_pin(const char *name);
-+#else
-+static inline int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
-+{
-+	return -ENOTSUPP;
-+};
-+static inline int bcm47xx_nvram_getenv(const char *name, char *val,
-+				       size_t val_len)
-+{
-+	return -ENOTSUPP;
-+};
-+static inline int bcm47xx_nvram_gpio_pin(const char *name)
-+{
-+	return -ENOTSUPP;
-+};
-+#endif
-+
-+#endif /* __BCM47XX_NVRAM_H */
diff --git a/target/linux/brcm47xx/patches-3.18/032-08-mips-bcm47xx-allow-retrieval-of-complete-nvram-conte.patch b/target/linux/brcm47xx/patches-3.18/032-08-mips-bcm47xx-allow-retrieval-of-complete-nvram-conte.patch
index 105c65142a8e2b9bd610b000f678ebac78a2a32f..254be461000589591807c8fd9932bf7e6c1daf51 100644
--- a/target/linux/brcm47xx/patches-3.18/032-08-mips-bcm47xx-allow-retrieval-of-complete-nvram-conte.patch
+++ b/target/linux/brcm47xx/patches-3.18/032-08-mips-bcm47xx-allow-retrieval-of-complete-nvram-conte.patch
@@ -119,39 +119,3 @@ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
 +	return nvram;
 +}
 +EXPORT_SYMBOL(bcm47xx_nvram_get_contents);
---- a/include/linux/bcm47xx_nvram.h
-+++ b/include/linux/bcm47xx_nvram.h
-@@ -10,11 +10,17 @@
- 
- #include <linux/types.h>
- #include <linux/kernel.h>
-+#include <linux/vmalloc.h>
- 
- #ifdef CONFIG_BCM47XX
- int bcm47xx_nvram_init_from_mem(u32 base, u32 lim);
- int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len);
- int bcm47xx_nvram_gpio_pin(const char *name);
-+char *bcm47xx_nvram_get_contents(size_t *val_len);
-+static inline void bcm47xx_nvram_release_contents(char *nvram)
-+{
-+	vfree(nvram);
-+};
- #else
- static inline int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
- {
-@@ -29,6 +35,15 @@ static inline int bcm47xx_nvram_gpio_pin
- {
- 	return -ENOTSUPP;
- };
-+
-+static inline char *bcm47xx_nvram_get_contents(size_t *val_len)
-+{
-+	return NULL;
-+};
-+
-+static inline void bcm47xx_nvram_release_contents(char *nvram)
-+{
-+};
- #endif
- 
- #endif /* __BCM47XX_NVRAM_H */
diff --git a/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-get-nvram.patch b/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-get-nvram.patch
index de109e35f4da61850dd5a22f60ed904764a8f667..4fb8a87d4c2d2df7fd3e45eed1cd84b3cd06e93e 100644
--- a/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-get-nvram.patch
+++ b/target/linux/brcm47xx/patches-3.18/400-mtd-bcm47xxpart-get-nvram.patch
@@ -1,6 +1,6 @@
 --- a/drivers/mtd/bcm47xxpart.c
 +++ b/drivers/mtd/bcm47xxpart.c
-@@ -100,6 +100,7 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -127,6 +127,7 @@ static int bcm47xxpart_parse(struct mtd_
  	int last_trx_part = -1;
  	int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
  	int err;
@@ -8,7 +8,7 @@
  
  	/*
  	 * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
-@@ -306,12 +307,23 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -334,12 +335,23 @@ static int bcm47xxpart_parse(struct mtd_
  		if (buf[0] == NVRAM_HEADER) {
  			bcm47xxpart_add_part(&parts[curr_part++], "nvram",
  					     master->size - blocksize, 0);
diff --git a/target/linux/brcm47xx/patches-3.18/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch b/target/linux/brcm47xx/patches-3.18/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch
index 99d909bc037e6462a409b940d617cd5ba0c4bb40..318dc55810c684635a61122116a17c2a5d61978c 100644
--- a/target/linux/brcm47xx/patches-3.18/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch
+++ b/target/linux/brcm47xx/patches-3.18/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch
@@ -21,7 +21,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  
  static struct resource bcma_sflash_resource = {
  	.name	= "bcma_sflash",
-@@ -41,6 +42,13 @@ static const struct bcma_sflash_tbl_e bc
+@@ -42,6 +43,13 @@ static const struct bcma_sflash_tbl_e bc
  	{ NULL },
  };
  
@@ -35,7 +35,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
  	{ "SST25WF512", 1, 0x1000, 16, },
  	{ "SST25VF512", 0x48, 0x1000, 16, },
-@@ -84,6 +92,24 @@ static void bcma_sflash_cmd(struct bcma_
+@@ -85,6 +93,24 @@ static void bcma_sflash_cmd(struct bcma_
  	bcma_err(cc->core->bus, "SFLASH control command failed (timeout)!\n");
  }
  
@@ -60,7 +60,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  /* Initialize serial flash access */
  int bcma_sflash_init(struct bcma_drv_cc *cc)
  {
-@@ -114,6 +140,10 @@ int bcma_sflash_init(struct bcma_drv_cc
+@@ -115,6 +141,10 @@ int bcma_sflash_init(struct bcma_drv_cc
  		case 0x13:
  			return -ENOTSUPP;
  		default:
diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c
index 2602f98b55666fa561cc59287d720a3b3b8f1239..b815869a6b1bc77fa42b5a0f87f527d077300c85 100644
--- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c
+++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c
@@ -252,6 +252,7 @@ static struct mtd_part_parser uimage_generic_parser = {
 #define FW_MAGIC_WNR1000V2_VC	0x31303030
 #define FW_MAGIC_WNDR3700	0x33373030
 #define FW_MAGIC_WNDR3700V2	0x33373031
+#define FW_MAGIC_WPN824N	0x31313030
 
 static ssize_t uimage_verify_wndr3700(u_char *buf, size_t len)
 {
@@ -266,6 +267,7 @@ static ssize_t uimage_verify_wndr3700(u_char *buf, size_t len)
 	case FW_MAGIC_WNR2200:
 	case FW_MAGIC_WNDR3700:
 	case FW_MAGIC_WNDR3700V2:
+	case FW_MAGIC_WPN824N:
 		break;
 	case FW_MAGIC_WNR2000V4:
 		expected_type = IH_TYPE_KERNEL;
diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
index 9fa70167e61aef467b121a7b42ca2c6ee8886ef7..30ce2165cb4fbd8513ef045930f6a4a5dbb59a3a 100644
--- a/target/linux/generic/files/include/linux/ath9k_platform.h
+++ b/target/linux/generic/files/include/linux/ath9k_platform.h
@@ -36,6 +36,7 @@ struct ath9k_platform_data {
 	bool tx_gain_buffalo;
 	bool disable_2ghz;
 	bool disable_5ghz;
+	bool led_active_high;
 
 	int (*get_mac_revision)(void);
 	int (*external_reset)(void);
diff --git a/target/linux/bcm53xx/files/include/linux/bcm47xx_nvram.h b/target/linux/generic/files/include/linux/bcm47xx_nvram.h
similarity index 95%
rename from target/linux/bcm53xx/files/include/linux/bcm47xx_nvram.h
rename to target/linux/generic/files/include/linux/bcm47xx_nvram.h
index 2793652fbf66ebc2429e6146ce52fcdadbe39490..778abd425af3eda8caa465b5c598ae13edb5a818 100644
--- a/target/linux/bcm53xx/files/include/linux/bcm47xx_nvram.h
+++ b/target/linux/generic/files/include/linux/bcm47xx_nvram.h
@@ -12,7 +12,7 @@
 #include <linux/kernel.h>
 #include <linux/vmalloc.h>
 
-#ifdef CONFIG_BCM47XX_NVRAM
+#if defined(CONFIG_BCM47XX_NVRAM) || defined(CONFIG_BCM47XX)
 int bcm47xx_nvram_init_from_mem(u32 base, u32 lim);
 int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len);
 int bcm47xx_nvram_gpio_pin(const char *name);
diff --git a/target/linux/generic/patches-3.18/031-bcma-from-4.5.patch b/target/linux/generic/patches-3.18/031-bcma-from-4.5.patch
new file mode 100644
index 0000000000000000000000000000000000000000..171395dcecbd2449ada2fccb23d7aaaea03a863d
--- /dev/null
+++ b/target/linux/generic/patches-3.18/031-bcma-from-4.5.patch
@@ -0,0 +1,49 @@
+--- a/drivers/bcma/main.c
++++ b/drivers/bcma/main.c
+@@ -637,11 +637,36 @@ static int bcma_device_uevent(struct dev
+ 			      core->id.rev, core->id.class);
+ }
+ 
+-static int __init bcma_modinit(void)
++static unsigned int bcma_bus_registered;
++
++/*
++ * If built-in, bus has to be registered early, before any driver calls
++ * bcma_driver_register.
++ * Otherwise registering driver would trigger BUG in driver_register.
++ */
++static int __init bcma_init_bus_register(void)
+ {
+ 	int err;
+ 
++	if (bcma_bus_registered)
++		return 0;
++
+ 	err = bus_register(&bcma_bus_type);
++	if (!err)
++		bcma_bus_registered = 1;
++
++	return err;
++}
++#ifndef MODULE
++fs_initcall(bcma_init_bus_register);
++#endif
++
++/* Main initialization has to be done with SPI/mtd/NAND/SPROM available */
++static int __init bcma_modinit(void)
++{
++	int err;
++
++	err = bcma_init_bus_register();
+ 	if (err)
+ 		return err;
+ 
+@@ -660,7 +685,7 @@ static int __init bcma_modinit(void)
+ 
+ 	return err;
+ }
+-fs_initcall(bcma_modinit);
++module_init(bcma_modinit);
+ 
+ static void __exit bcma_modexit(void)
+ {
diff --git a/target/linux/generic/patches-3.18/032-bcma-from-4.6.patch b/target/linux/generic/patches-3.18/032-bcma-from-4.6.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a74d9eead9cdeaf0527d59e16f7ff2acb50281ba
--- /dev/null
+++ b/target/linux/generic/patches-3.18/032-bcma-from-4.6.patch
@@ -0,0 +1,444 @@
+--- a/drivers/bcma/driver_chipcommon.c
++++ b/drivers/bcma/driver_chipcommon.c
+@@ -15,6 +15,8 @@
+ #include <linux/platform_device.h>
+ #include <linux/bcma/bcma.h>
+ 
++static void bcma_chipco_serial_init(struct bcma_drv_cc *cc);
++
+ static inline u32 bcma_cc_write32_masked(struct bcma_drv_cc *cc, u16 offset,
+ 					 u32 mask, u32 value)
+ {
+@@ -115,6 +117,8 @@ int bcma_chipco_watchdog_register(struct
+ 
+ void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc)
+ {
++	struct bcma_bus *bus = cc->core->bus;
++
+ 	if (cc->early_setup_done)
+ 		return;
+ 
+@@ -129,6 +133,9 @@ void bcma_core_chipcommon_early_init(str
+ 	if (cc->capabilities & BCMA_CC_CAP_PMU)
+ 		bcma_pmu_early_init(cc);
+ 
++	if (IS_BUILTIN(CONFIG_BCM47XX) && bus->hosttype == BCMA_HOSTTYPE_SOC)
++		bcma_chipco_serial_init(cc);
++
+ 	cc->early_setup_done = true;
+ }
+ 
+@@ -185,11 +192,12 @@ u32 bcma_chipco_watchdog_timer_set(struc
+ 			ticks = 2;
+ 		else if (ticks > maxt)
+ 			ticks = maxt;
+-		bcma_cc_write32(cc, BCMA_CC_PMU_WATCHDOG, ticks);
++		bcma_pmu_write32(cc, BCMA_CC_PMU_WATCHDOG, ticks);
+ 	} else {
+ 		struct bcma_bus *bus = cc->core->bus;
+ 
+ 		if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4707 &&
++		    bus->chipinfo.id != BCMA_CHIP_ID_BCM47094 &&
+ 		    bus->chipinfo.id != BCMA_CHIP_ID_BCM53018)
+ 			bcma_core_set_clockmode(cc->core,
+ 						ticks ? BCMA_CLKMODE_FAST : BCMA_CLKMODE_DYNAMIC);
+@@ -314,9 +322,9 @@ u32 bcma_chipco_gpio_pulldown(struct bcm
+ 	return res;
+ }
+ 
+-#ifdef CONFIG_BCMA_DRIVER_MIPS
+-void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
++static void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
+ {
++#if IS_BUILTIN(CONFIG_BCM47XX)
+ 	unsigned int irq;
+ 	u32 baud_base;
+ 	u32 i;
+@@ -358,5 +366,5 @@ void bcma_chipco_serial_init(struct bcma
+ 		ports[i].baud_base = baud_base;
+ 		ports[i].reg_shift = 0;
+ 	}
++#endif /* CONFIG_BCM47XX */
+ }
+-#endif /* CONFIG_BCMA_DRIVER_MIPS */
+--- a/drivers/bcma/driver_chipcommon_pmu.c
++++ b/drivers/bcma/driver_chipcommon_pmu.c
+@@ -15,44 +15,44 @@
+ 
+ u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset)
+ {
+-	bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset);
+-	bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR);
+-	return bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
++	bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_ADDR);
++	return bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_DATA);
+ }
+ EXPORT_SYMBOL_GPL(bcma_chipco_pll_read);
+ 
+ void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, u32 value)
+ {
+-	bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset);
+-	bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR);
+-	bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, value);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
++	bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_ADDR);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, value);
+ }
+ EXPORT_SYMBOL_GPL(bcma_chipco_pll_write);
+ 
+ void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask,
+ 			     u32 set)
+ {
+-	bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset);
+-	bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR);
+-	bcma_cc_maskset32(cc, BCMA_CC_PLLCTL_DATA, mask, set);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
++	bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_ADDR);
++	bcma_pmu_maskset32(cc, BCMA_CC_PMU_PLLCTL_DATA, mask, set);
+ }
+ EXPORT_SYMBOL_GPL(bcma_chipco_pll_maskset);
+ 
+ void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc,
+ 				 u32 offset, u32 mask, u32 set)
+ {
+-	bcma_cc_write32(cc, BCMA_CC_CHIPCTL_ADDR, offset);
+-	bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR);
+-	bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL_DATA, mask, set);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_CHIPCTL_ADDR, offset);
++	bcma_pmu_read32(cc, BCMA_CC_PMU_CHIPCTL_ADDR);
++	bcma_pmu_maskset32(cc, BCMA_CC_PMU_CHIPCTL_DATA, mask, set);
+ }
+ EXPORT_SYMBOL_GPL(bcma_chipco_chipctl_maskset);
+ 
+ void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask,
+ 				u32 set)
+ {
+-	bcma_cc_write32(cc, BCMA_CC_REGCTL_ADDR, offset);
+-	bcma_cc_read32(cc, BCMA_CC_REGCTL_ADDR);
+-	bcma_cc_maskset32(cc, BCMA_CC_REGCTL_DATA, mask, set);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_REGCTL_ADDR, offset);
++	bcma_pmu_read32(cc, BCMA_CC_PMU_REGCTL_ADDR);
++	bcma_pmu_maskset32(cc, BCMA_CC_PMU_REGCTL_DATA, mask, set);
+ }
+ EXPORT_SYMBOL_GPL(bcma_chipco_regctl_maskset);
+ 
+@@ -60,18 +60,18 @@ static u32 bcma_pmu_xtalfreq(struct bcma
+ {
+ 	u32 ilp_ctl, alp_hz;
+ 
+-	if (!(bcma_cc_read32(cc, BCMA_CC_PMU_STAT) &
++	if (!(bcma_pmu_read32(cc, BCMA_CC_PMU_STAT) &
+ 	      BCMA_CC_PMU_STAT_EXT_LPO_AVAIL))
+ 		return 0;
+ 
+-	bcma_cc_write32(cc, BCMA_CC_PMU_XTAL_FREQ,
+-			BIT(BCMA_CC_PMU_XTAL_FREQ_MEASURE_SHIFT));
++	bcma_pmu_write32(cc, BCMA_CC_PMU_XTAL_FREQ,
++			 BIT(BCMA_CC_PMU_XTAL_FREQ_MEASURE_SHIFT));
+ 	usleep_range(1000, 2000);
+ 
+-	ilp_ctl = bcma_cc_read32(cc, BCMA_CC_PMU_XTAL_FREQ);
++	ilp_ctl = bcma_pmu_read32(cc, BCMA_CC_PMU_XTAL_FREQ);
+ 	ilp_ctl &= BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK;
+ 
+-	bcma_cc_write32(cc, BCMA_CC_PMU_XTAL_FREQ, 0);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_XTAL_FREQ, 0);
+ 
+ 	alp_hz = ilp_ctl * 32768 / 4;
+ 	return (alp_hz + 50000) / 100000 * 100;
+@@ -127,8 +127,8 @@ static void bcma_pmu2_pll_init0(struct b
+ 		mask = (u32)~(BCMA_RES_4314_HT_AVAIL |
+ 			      BCMA_RES_4314_MACPHY_CLK_AVAIL);
+ 
+-		bcma_cc_mask32(cc, BCMA_CC_PMU_MINRES_MSK, mask);
+-		bcma_cc_mask32(cc, BCMA_CC_PMU_MAXRES_MSK, mask);
++		bcma_pmu_mask32(cc, BCMA_CC_PMU_MINRES_MSK, mask);
++		bcma_pmu_mask32(cc, BCMA_CC_PMU_MAXRES_MSK, mask);
+ 		bcma_wait_value(cc->core, BCMA_CLKCTLST,
+ 				BCMA_CLKCTLST_HAVEHT, 0, 20000);
+ 		break;
+@@ -140,7 +140,7 @@ static void bcma_pmu2_pll_init0(struct b
+ 
+ 	/* Flush */
+ 	if (cc->pmu.rev >= 2)
+-		bcma_cc_set32(cc, BCMA_CC_PMU_CTL, BCMA_CC_PMU_CTL_PLL_UPD);
++		bcma_pmu_set32(cc, BCMA_CC_PMU_CTL, BCMA_CC_PMU_CTL_PLL_UPD);
+ 
+ 	/* TODO: Do we need to update OTP? */
+ }
+@@ -195,9 +195,9 @@ static void bcma_pmu_resources_init(stru
+ 
+ 	/* Set the resource masks. */
+ 	if (min_msk)
+-		bcma_cc_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk);
++		bcma_pmu_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk);
+ 	if (max_msk)
+-		bcma_cc_write32(cc, BCMA_CC_PMU_MAXRES_MSK, max_msk);
++		bcma_pmu_write32(cc, BCMA_CC_PMU_MAXRES_MSK, max_msk);
+ 
+ 	/*
+ 	 * Add some delay; allow resources to come up and settle.
+@@ -269,23 +269,33 @@ static void bcma_pmu_workarounds(struct
+ 
+ void bcma_pmu_early_init(struct bcma_drv_cc *cc)
+ {
++	struct bcma_bus *bus = cc->core->bus;
+ 	u32 pmucap;
+ 
+-	pmucap = bcma_cc_read32(cc, BCMA_CC_PMU_CAP);
++	if (cc->core->id.rev >= 35 &&
++	    cc->capabilities_ext & BCMA_CC_CAP_EXT_AOB_PRESENT) {
++		cc->pmu.core = bcma_find_core(bus, BCMA_CORE_PMU);
++		if (!cc->pmu.core)
++			bcma_warn(bus, "Couldn't find expected PMU core");
++	}
++	if (!cc->pmu.core)
++		cc->pmu.core = cc->core;
++
++	pmucap = bcma_pmu_read32(cc, BCMA_CC_PMU_CAP);
+ 	cc->pmu.rev = (pmucap & BCMA_CC_PMU_CAP_REVISION);
+ 
+-	bcma_debug(cc->core->bus, "Found rev %u PMU (capabilities 0x%08X)\n",
+-		   cc->pmu.rev, pmucap);
++	bcma_debug(bus, "Found rev %u PMU (capabilities 0x%08X)\n", cc->pmu.rev,
++		   pmucap);
+ }
+ 
+ void bcma_pmu_init(struct bcma_drv_cc *cc)
+ {
+ 	if (cc->pmu.rev == 1)
+-		bcma_cc_mask32(cc, BCMA_CC_PMU_CTL,
+-			      ~BCMA_CC_PMU_CTL_NOILPONW);
++		bcma_pmu_mask32(cc, BCMA_CC_PMU_CTL,
++				~BCMA_CC_PMU_CTL_NOILPONW);
+ 	else
+-		bcma_cc_set32(cc, BCMA_CC_PMU_CTL,
+-			     BCMA_CC_PMU_CTL_NOILPONW);
++		bcma_pmu_set32(cc, BCMA_CC_PMU_CTL,
++			       BCMA_CC_PMU_CTL_NOILPONW);
+ 
+ 	bcma_pmu_pll_init(cc);
+ 	bcma_pmu_resources_init(cc);
+@@ -472,8 +482,8 @@ u32 bcma_pmu_get_cpu_clock(struct bcma_d
+ static void bcma_pmu_spuravoid_pll_write(struct bcma_drv_cc *cc, u32 offset,
+ 					 u32 value)
+ {
+-	bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset);
+-	bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, value);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, value);
+ }
+ 
+ void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid)
+@@ -497,20 +507,20 @@ void bcma_pmu_spuravoid_pllupdate(struct
+ 		       bus->chipinfo.id == BCMA_CHIP_ID_BCM53572) ? 6 : 0;
+ 
+ 		/* RMW only the P1 divider */
+-		bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR,
++		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR,
+ 				BCMA_CC_PMU_PLL_CTL0 + phypll_offset);
+-		tmp = bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA);
++		tmp = bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_DATA);
+ 		tmp &= (~(BCMA_CC_PMU1_PLL0_PC0_P1DIV_MASK));
+ 		tmp |= (bcm5357_bcm43236_p1div[spuravoid] << BCMA_CC_PMU1_PLL0_PC0_P1DIV_SHIFT);
+-		bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, tmp);
++		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, tmp);
+ 
+ 		/* RMW only the int feedback divider */
+-		bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR,
++		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR,
+ 				BCMA_CC_PMU_PLL_CTL2 + phypll_offset);
+-		tmp = bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA);
++		tmp = bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_DATA);
+ 		tmp &= ~(BCMA_CC_PMU1_PLL0_PC2_NDIV_INT_MASK);
+ 		tmp |= (bcm5357_bcm43236_ndiv[spuravoid]) << BCMA_CC_PMU1_PLL0_PC2_NDIV_INT_SHIFT;
+-		bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, tmp);
++		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, tmp);
+ 
+ 		tmp = BCMA_CC_PMU_CTL_PLL_UPD;
+ 		break;
+@@ -646,7 +656,7 @@ void bcma_pmu_spuravoid_pllupdate(struct
+ 		break;
+ 	}
+ 
+-	tmp |= bcma_cc_read32(cc, BCMA_CC_PMU_CTL);
+-	bcma_cc_write32(cc, BCMA_CC_PMU_CTL, tmp);
++	tmp |= bcma_pmu_read32(cc, BCMA_CC_PMU_CTL);
++	bcma_pmu_write32(cc, BCMA_CC_PMU_CTL, tmp);
+ }
+ EXPORT_SYMBOL_GPL(bcma_pmu_spuravoid_pllupdate);
+--- a/drivers/bcma/driver_chipcommon_sflash.c
++++ b/drivers/bcma/driver_chipcommon_sflash.c
+@@ -38,6 +38,7 @@ static const struct bcma_sflash_tbl_e bc
+ 	{ "M25P32", 0x15, 0x10000, 64, },
+ 	{ "M25P64", 0x16, 0x10000, 128, },
+ 	{ "M25FL128", 0x17, 0x10000, 256, },
++	{ "MX25L25635F", 0x18, 0x10000, 512, },
+ 	{ NULL },
+ };
+ 
+--- a/drivers/bcma/scan.c
++++ b/drivers/bcma/scan.c
+@@ -98,6 +98,9 @@ static const struct bcma_device_id_name
+ 	{ BCMA_CORE_SHIM, "SHIM" },
+ 	{ BCMA_CORE_PCIE2, "PCIe Gen2" },
+ 	{ BCMA_CORE_ARM_CR4, "ARM CR4" },
++	{ BCMA_CORE_GCI, "GCI" },
++	{ BCMA_CORE_CMEM, "CNDS DDR2/3 memory controller" },
++	{ BCMA_CORE_ARM_CA7, "ARM CA7" },
+ 	{ BCMA_CORE_DEFAULT, "Default" },
+ };
+ 
+@@ -315,6 +318,8 @@ static int bcma_get_next_core(struct bcm
+ 		switch (core->id.id) {
+ 		case BCMA_CORE_4706_MAC_GBIT_COMMON:
+ 		case BCMA_CORE_NS_CHIPCOMMON_B:
++		case BCMA_CORE_PMU:
++		case BCMA_CORE_GCI:
+ 		/* Not used yet: case BCMA_CORE_OOB_ROUTER: */
+ 			break;
+ 		default:
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -1215,10 +1215,10 @@ void b43_wireless_core_phy_pll_reset(str
+ 	case B43_BUS_BCMA:
+ 		bcma_cc = &dev->dev->bdev->bus->drv_cc;
+ 
+-		bcma_cc_write32(bcma_cc, BCMA_CC_CHIPCTL_ADDR, 0);
+-		bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4);
+-		bcma_cc_set32(bcma_cc, BCMA_CC_CHIPCTL_DATA, 0x4);
+-		bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4);
++		bcma_cc_write32(bcma_cc, BCMA_CC_PMU_CHIPCTL_ADDR, 0);
++		bcma_cc_mask32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, ~0x4);
++		bcma_cc_set32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, 0x4);
++		bcma_cc_mask32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, ~0x4);
+ 		break;
+ #endif
+ #ifdef CONFIG_B43_SSB
+--- a/include/linux/bcma/bcma.h
++++ b/include/linux/bcma/bcma.h
+@@ -151,6 +151,8 @@ struct bcma_host_ops {
+ #define BCMA_CORE_PCIE2			0x83C	/* PCI Express Gen2 */
+ #define BCMA_CORE_USB30_DEV		0x83D
+ #define BCMA_CORE_ARM_CR4		0x83E
++#define BCMA_CORE_GCI			0x840
++#define BCMA_CORE_CMEM			0x846	/* CNDS DDR2/3 memory controller */
+ #define BCMA_CORE_ARM_CA7		0x847
+ #define BCMA_CORE_SYS_MEM		0x849
+ #define BCMA_CORE_DEFAULT		0xFFF
+@@ -199,6 +201,7 @@ struct bcma_host_ops {
+ #define  BCMA_PKG_ID_BCM4707	1
+ #define  BCMA_PKG_ID_BCM4708	2
+ #define  BCMA_PKG_ID_BCM4709	0
++#define BCMA_CHIP_ID_BCM47094	53030
+ #define BCMA_CHIP_ID_BCM53018	53018
+ 
+ /* Board types (on PCI usually equals to the subsystem dev id) */
+--- a/include/linux/bcma/bcma_driver_chipcommon.h
++++ b/include/linux/bcma/bcma_driver_chipcommon.h
+@@ -217,6 +217,11 @@
+ #define	 BCMA_CC_CLKDIV_JTAG_SHIFT	8
+ #define	 BCMA_CC_CLKDIV_UART		0x000000FF
+ #define BCMA_CC_CAP_EXT			0x00AC		/* Capabilities */
++#define  BCMA_CC_CAP_EXT_SECI_PRESENT	0x00000001
++#define  BCMA_CC_CAP_EXT_GSIO_PRESENT	0x00000002
++#define  BCMA_CC_CAP_EXT_GCI_PRESENT	0x00000004
++#define  BCMA_CC_CAP_EXT_SECI_PUART_PRESENT		0x00000008    /* UART present */
++#define  BCMA_CC_CAP_EXT_AOB_PRESENT	0x00000040
+ #define BCMA_CC_PLLONDELAY		0x00B0		/* Rev >= 4 only */
+ #define BCMA_CC_FREFSELDELAY		0x00B4		/* Rev >= 4 only */
+ #define BCMA_CC_SLOWCLKCTL		0x00B8		/* 6 <= Rev <= 9 only */
+@@ -351,12 +356,12 @@
+ #define BCMA_CC_PMU_RES_REQTS		0x0640 /* PMU res req timer sel */
+ #define BCMA_CC_PMU_RES_REQT		0x0644 /* PMU res req timer */
+ #define BCMA_CC_PMU_RES_REQM		0x0648 /* PMU res req mask */
+-#define BCMA_CC_CHIPCTL_ADDR		0x0650
+-#define BCMA_CC_CHIPCTL_DATA		0x0654
+-#define BCMA_CC_REGCTL_ADDR		0x0658
+-#define BCMA_CC_REGCTL_DATA		0x065C
+-#define BCMA_CC_PLLCTL_ADDR		0x0660
+-#define BCMA_CC_PLLCTL_DATA		0x0664
++#define BCMA_CC_PMU_CHIPCTL_ADDR	0x0650
++#define BCMA_CC_PMU_CHIPCTL_DATA	0x0654
++#define BCMA_CC_PMU_REGCTL_ADDR		0x0658
++#define BCMA_CC_PMU_REGCTL_DATA		0x065C
++#define BCMA_CC_PMU_PLLCTL_ADDR		0x0660
++#define BCMA_CC_PMU_PLLCTL_DATA		0x0664
+ #define BCMA_CC_PMU_STRAPOPT		0x0668 /* (corerev >= 28) */
+ #define BCMA_CC_PMU_XTAL_FREQ		0x066C /* (pmurev >= 10) */
+ #define  BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK	0x00001FFF
+@@ -566,6 +571,7 @@
+  * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)
+  */
+ struct bcma_chipcommon_pmu {
++	struct bcma_device *core;	/* Can be separated core or just ChipCommon one */
+ 	u8 rev;			/* PMU revision */
+ 	u32 crystalfreq;	/* The active crystal frequency (in kHz) */
+ };
+@@ -663,6 +669,19 @@ struct bcma_drv_cc_b {
+ #define bcma_cc_maskset32(cc, offset, mask, set) \
+ 	bcma_cc_write32(cc, offset, (bcma_cc_read32(cc, offset) & (mask)) | (set))
+ 
++/* PMU registers access */
++#define bcma_pmu_read32(cc, offset) \
++	bcma_read32((cc)->pmu.core, offset)
++#define bcma_pmu_write32(cc, offset, val) \
++	bcma_write32((cc)->pmu.core, offset, val)
++
++#define bcma_pmu_mask32(cc, offset, mask) \
++	bcma_pmu_write32(cc, offset, bcma_pmu_read32(cc, offset) & (mask))
++#define bcma_pmu_set32(cc, offset, set) \
++	bcma_pmu_write32(cc, offset, bcma_pmu_read32(cc, offset) | (set))
++#define bcma_pmu_maskset32(cc, offset, mask, set) \
++	bcma_pmu_write32(cc, offset, (bcma_pmu_read32(cc, offset) & (mask)) | (set))
++
+ extern u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks);
+ 
+ extern u32 bcma_chipco_get_alp_clock(struct bcma_drv_cc *cc);
+--- a/drivers/bcma/bcma_private.h
++++ b/drivers/bcma/bcma_private.h
+@@ -47,7 +47,6 @@ void bcma_core_chipcommon_early_init(str
+ void bcma_core_chipcommon_init(struct bcma_drv_cc *cc);
+ void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable);
+ #ifdef CONFIG_BCMA_DRIVER_MIPS
+-void bcma_chipco_serial_init(struct bcma_drv_cc *cc);
+ extern struct platform_device bcma_pflash_dev;
+ #endif /* CONFIG_BCMA_DRIVER_MIPS */
+ 
+--- a/drivers/bcma/driver_gpio.c
++++ b/drivers/bcma/driver_gpio.c
+@@ -229,6 +229,7 @@ int bcma_gpio_init(struct bcma_drv_cc *c
+ 	case BCMA_CHIP_ID_BCM4707:
+ 	case BCMA_CHIP_ID_BCM5357:
+ 	case BCMA_CHIP_ID_BCM53572:
++	case BCMA_CHIP_ID_BCM47094:
+ 		chip->ngpio	= 32;
+ 		break;
+ 	default:
+--- a/drivers/bcma/driver_mips.c
++++ b/drivers/bcma/driver_mips.c
+@@ -328,12 +328,9 @@ static void bcma_core_mips_flash_detect(
+ 
+ void bcma_core_mips_early_init(struct bcma_drv_mips *mcore)
+ {
+-	struct bcma_bus *bus = mcore->core->bus;
+-
+ 	if (mcore->early_setup_done)
+ 		return;
+ 
+-	bcma_chipco_serial_init(&bus->drv_cc);
+ 	bcma_core_mips_flash_detect(mcore);
+ 
+ 	mcore->early_setup_done = true;
+--- a/drivers/bcma/host_pci.c
++++ b/drivers/bcma/host_pci.c
+@@ -294,7 +294,7 @@ static const struct pci_device_id bcma_p
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) },
+-	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
++	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_DELL, 0x0016) },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
diff --git a/target/linux/generic/patches-3.18/043-mtd_GD25Q128B_support_backport_from_3.19.patch b/target/linux/generic/patches-3.18/043-mtd_GD25Q128B_support_backport_from_3.19.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4d0403bfd8a4a076cc9e91349463593adb79047c
--- /dev/null
+++ b/target/linux/generic/patches-3.18/043-mtd_GD25Q128B_support_backport_from_3.19.patch
@@ -0,0 +1,10 @@
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -510,6 +510,7 @@ static const struct spi_device_id spi_no
+ 	/* GigaDevice */
+ 	{ "gd25q32", INFO(0xc84016, 0, 64 * 1024,  64, SECT_4K) },
+ 	{ "gd25q64", INFO(0xc84017, 0, 64 * 1024, 128, SECT_4K) },
++	{ "gd25q128", INFO(0xc84018, 0, 64 * 1024, 256, SECT_4K) },
+ 
+ 	/* Intel/Numonyx -- xxxs33b */
+ 	{ "160s33b",  INFO(0x898911, 0, 64 * 1024,  32, 0) },
diff --git a/target/linux/generic/patches-3.18/078-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch b/target/linux/generic/patches-3.18/078-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8e794180ac33a8db51a85bb38730a46775a830c1
--- /dev/null
+++ b/target/linux/generic/patches-3.18/078-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch
@@ -0,0 +1,106 @@
+From 387b75f8b31437792e8334390fdf5cf060d1e3da Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 2 Feb 2016 07:47:14 +0100
+Subject: [PATCH] bgmac: add helper checking for BCM4707 / BCM53018 chip id
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Chipsets with BCM4707 / BCM53018 ID require special handling at a few
+places in the code. It's likely there will be more IDs to check in the
+future. To simplify it add this trivial helper.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 30 ++++++++++++++++--------------
+ 1 file changed, 16 insertions(+), 14 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -26,6 +26,17 @@ static const struct bcma_device_id bgmac
+ };
+ MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl);
+ 
++static inline bool bgmac_is_bcm4707_family(struct bgmac *bgmac)
++{
++	switch (bgmac->core->bus->chipinfo.id) {
++	case BCMA_CHIP_ID_BCM4707:
++	case BCMA_CHIP_ID_BCM53018:
++		return true;
++	default:
++		return false;
++	}
++}
++
+ static bool bgmac_wait_value(struct bcma_device *core, u16 reg, u32 mask,
+ 			     u32 value, int timeout)
+ {
+@@ -982,11 +993,9 @@ static void bgmac_mac_speed(struct bgmac
+ static void bgmac_miiconfig(struct bgmac *bgmac)
+ {
+ 	struct bcma_device *core = bgmac->core;
+-	struct bcma_chipinfo *ci = &core->bus->chipinfo;
+ 	u8 imode;
+ 
+-	if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+-	    ci->id == BCMA_CHIP_ID_BCM53018) {
++	if (bgmac_is_bcm4707_family(bgmac)) {
+ 		bcma_awrite32(core, BCMA_IOCTL,
+ 			      bcma_aread32(core, BCMA_IOCTL) | 0x40 |
+ 			      BGMAC_BCMA_IOCTL_SW_CLKEN);
+@@ -1050,9 +1059,7 @@ static void bgmac_chip_reset(struct bgma
+ 	}
+ 
+ 	/* Request Misc PLL for corerev > 2 */
+-	if (core->id.rev > 2 &&
+-	    ci->id != BCMA_CHIP_ID_BCM4707 &&
+-	    ci->id != BCMA_CHIP_ID_BCM53018) {
++	if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
+ 		bgmac_set(bgmac, BCMA_CLKCTLST,
+ 			  BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
+ 		bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
+@@ -1188,8 +1195,7 @@ static void bgmac_enable(struct bgmac *b
+ 		break;
+ 	}
+ 
+-	if (ci->id != BCMA_CHIP_ID_BCM4707 &&
+-	    ci->id != BCMA_CHIP_ID_BCM53018) {
++	if (!bgmac_is_bcm4707_family(bgmac)) {
+ 		rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
+ 		rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
+ 		bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
+@@ -1467,14 +1473,12 @@ static int bgmac_fixed_phy_register(stru
+ 
+ static int bgmac_mii_register(struct bgmac *bgmac)
+ {
+-	struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
+ 	struct mii_bus *mii_bus;
+ 	struct phy_device *phy_dev;
+ 	char bus_id[MII_BUS_ID_SIZE + 3];
+ 	int i, err = 0;
+ 
+-	if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+-	    ci->id == BCMA_CHIP_ID_BCM53018)
++	if (bgmac_is_bcm4707_family(bgmac))
+ 		return bgmac_fixed_phy_register(bgmac);
+ 
+ 	mii_bus = mdiobus_alloc();
+@@ -1545,7 +1549,6 @@ static void bgmac_mii_unregister(struct
+ /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipattach */
+ static int bgmac_probe(struct bcma_device *core)
+ {
+-	struct bcma_chipinfo *ci = &core->bus->chipinfo;
+ 	struct net_device *net_dev;
+ 	struct bgmac *bgmac;
+ 	struct ssb_sprom *sprom = &core->bus->sprom;
+@@ -1608,8 +1611,7 @@ static int bgmac_probe(struct bcma_devic
+ 	bgmac_chip_reset(bgmac);
+ 
+ 	/* For Northstar, we have to take all GMAC core out of reset */
+-	if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+-	    ci->id == BCMA_CHIP_ID_BCM53018) {
++	if (bgmac_is_bcm4707_family(bgmac)) {
+ 		struct bcma_device *ns_core;
+ 		int ns_gmac;
+ 
diff --git a/target/linux/generic/patches-3.18/079-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch b/target/linux/generic/patches-3.18/079-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch
new file mode 100644
index 0000000000000000000000000000000000000000..88db7b2fff9ec38c255406c1687df156b15eedfe
--- /dev/null
+++ b/target/linux/generic/patches-3.18/079-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch
@@ -0,0 +1,39 @@
+From 9e4e6206c67ae11d68fc96882256f37c237087d4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Mon, 22 Feb 2016 22:51:13 +0100
+Subject: [PATCH] bgmac: support Ethernet device on BCM47094 SoC
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It needs very similar workarounds to the one on BCM4707. It was tested
+on D-Link DIR-885L home router.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -30,6 +30,7 @@ static inline bool bgmac_is_bcm4707_fami
+ {
+ 	switch (bgmac->core->bus->chipinfo.id) {
+ 	case BCMA_CHIP_ID_BCM4707:
++	case BCMA_CHIP_ID_BCM47094:
+ 	case BCMA_CHIP_ID_BCM53018:
+ 		return true;
+ 	default:
+@@ -1047,8 +1048,9 @@ static void bgmac_chip_reset(struct bgma
+ 	    (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
+ 		iost &= ~BGMAC_BCMA_IOST_ATTACHED;
+ 
+-	/* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
+-	if (ci->id != BCMA_CHIP_ID_BCM4707) {
++	/* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
++	if (ci->id != BCMA_CHIP_ID_BCM4707 &&
++	    ci->id != BCMA_CHIP_ID_BCM47094) {
+ 		flags = 0;
+ 		if (iost & BGMAC_BCMA_IOST_ATTACHED) {
+ 			flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
diff --git a/target/linux/generic/patches-3.18/081-01-pppoe-Use-workqueue-to-die-properly-when-a-PADT-is-r.patch b/target/linux/generic/patches-3.18/081-01-pppoe-Use-workqueue-to-die-properly-when-a-PADT-is-r.patch
index de8583058f4065cb0f78249076ea4bca637cbb45..347049a9243e61d2e3990e312fa69cad11fb2b90 100644
--- a/target/linux/generic/patches-3.18/081-01-pppoe-Use-workqueue-to-die-properly-when-a-PADT-is-r.patch
+++ b/target/linux/generic/patches-3.18/081-01-pppoe-Use-workqueue-to-die-properly-when-a-PADT-is-r.patch
@@ -31,7 +31,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 
 --- a/drivers/net/ppp/pppoe.c
 +++ b/drivers/net/ppp/pppoe.c
-@@ -455,6 +455,18 @@ out:
+@@ -454,6 +454,18 @@ out:
  	return NET_RX_DROP;
  }
  
@@ -50,7 +50,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
  /************************************************************************
   *
   * Receive a PPPoE Discovery frame.
-@@ -500,7 +512,8 @@ static int pppoe_disc_rcv(struct sk_buff
+@@ -499,7 +511,8 @@ static int pppoe_disc_rcv(struct sk_buff
  		}
  
  		bh_unlock_sock(sk);
@@ -60,7 +60,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
  	}
  
  abort:
-@@ -613,6 +626,8 @@ static int pppoe_connect(struct socket *
+@@ -612,6 +625,8 @@ static int pppoe_connect(struct socket *
  
  	lock_sock(sk);
  
diff --git a/target/linux/generic/patches-3.18/081-02-pppoe-Lacks-DST-MAC-address-check.patch b/target/linux/generic/patches-3.18/081-02-pppoe-Lacks-DST-MAC-address-check.patch
index 3ce778e301289ebd726258e22d89383ce2317fa9..f592929b3e0b6ed9268a66d39e0ca0491cb9dd3c 100644
--- a/target/linux/generic/patches-3.18/081-02-pppoe-Lacks-DST-MAC-address-check.patch
+++ b/target/linux/generic/patches-3.18/081-02-pppoe-Lacks-DST-MAC-address-check.patch
@@ -13,7 +13,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 
 --- a/drivers/net/ppp/pppoe.c
 +++ b/drivers/net/ppp/pppoe.c
-@@ -380,6 +380,9 @@ static int pppoe_rcv_core(struct sock *s
+@@ -379,6 +379,9 @@ static int pppoe_rcv_core(struct sock *s
  	 * can't change.
  	 */
  
diff --git a/target/linux/generic/patches-3.18/081-03-pppoe-drop-pppoe-device-in-pppoe_unbind_sock_work.patch b/target/linux/generic/patches-3.18/081-03-pppoe-drop-pppoe-device-in-pppoe_unbind_sock_work.patch
index f672c67b90bf6e8dabbb0cce9c93941d242deb46..fc26b8ffafccf823959a8e73d3414607e6f12461 100644
--- a/target/linux/generic/patches-3.18/081-03-pppoe-drop-pppoe-device-in-pppoe_unbind_sock_work.patch
+++ b/target/linux/generic/patches-3.18/081-03-pppoe-drop-pppoe-device-in-pppoe_unbind_sock_work.patch
@@ -15,7 +15,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 
 --- a/drivers/net/ppp/pppoe.c
 +++ b/drivers/net/ppp/pppoe.c
-@@ -465,6 +465,10 @@ static void pppoe_unbind_sock_work(struc
+@@ -464,6 +464,10 @@ static void pppoe_unbind_sock_work(struc
  	struct sock *sk = sk_pppox(po);
  
  	lock_sock(sk);
diff --git a/target/linux/generic/patches-3.18/081-04-ppp-don-t-override-sk-sk_state-in-pppoe_flush_dev.patch b/target/linux/generic/patches-3.18/081-04-ppp-don-t-override-sk-sk_state-in-pppoe_flush_dev.patch
deleted file mode 100644
index 73f2e3d47ad41c7a66a5ca489bc3fc224a23b821..0000000000000000000000000000000000000000
--- a/target/linux/generic/patches-3.18/081-04-ppp-don-t-override-sk-sk_state-in-pppoe_flush_dev.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From: Guillaume Nault <g.nault@alphalink.fr>
-Date: Wed, 30 Sep 2015 11:45:33 +0200
-Subject: [PATCH] ppp: don't override sk->sk_state in pppoe_flush_dev()
-
-Since commit 2b018d57ff18 ("pppoe: drop PPPOX_ZOMBIEs in pppoe_release"),
-pppoe_release() calls dev_put(po->pppoe_dev) if sk is in the
-PPPOX_ZOMBIE state. But pppoe_flush_dev() can set sk->sk_state to
-PPPOX_ZOMBIE _and_ reset po->pppoe_dev to NULL. This leads to the
-following oops:
-
-[  570.140800] BUG: unable to handle kernel NULL pointer dereference at 00000000000004e0
-[  570.142931] IP: [<ffffffffa018c701>] pppoe_release+0x50/0x101 [pppoe]
-[  570.144601] PGD 3d119067 PUD 3dbc1067 PMD 0
-[  570.144601] Oops: 0000 [#1] SMP
-[  570.144601] Modules linked in: l2tp_ppp l2tp_netlink l2tp_core ip6_udp_tunnel udp_tunnel pppoe pppox ppp_generic slhc loop crc32c_intel ghash_clmulni_intel jitterentropy_rng sha256_generic hmac drbg ansi_cprng aesni_intel aes_x86_64 ablk_helper cryptd lrw gf128mul glue_helper acpi_cpufreq evdev serio_raw processor button ext4 crc16 mbcache jbd2 virtio_net virtio_blk virtio_pci virtio_ring virtio
-[  570.144601] CPU: 1 PID: 15738 Comm: ppp-apitest Not tainted 4.2.0 #1
-[  570.144601] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014
-[  570.144601] task: ffff88003d30d600 ti: ffff880036b60000 task.ti: ffff880036b60000
-[  570.144601] RIP: 0010:[<ffffffffa018c701>]  [<ffffffffa018c701>] pppoe_release+0x50/0x101 [pppoe]
-[  570.144601] RSP: 0018:ffff880036b63e08  EFLAGS: 00010202
-[  570.144601] RAX: 0000000000000000 RBX: ffff880034340000 RCX: 0000000000000206
-[  570.144601] RDX: 0000000000000006 RSI: ffff88003d30dd20 RDI: ffff88003d30dd20
-[  570.144601] RBP: ffff880036b63e28 R08: 0000000000000001 R09: 0000000000000000
-[  570.144601] R10: 00007ffee9b50420 R11: ffff880034340078 R12: ffff8800387ec780
-[  570.144601] R13: ffff8800387ec7b0 R14: ffff88003e222aa0 R15: ffff8800387ec7b0
-[  570.144601] FS:  00007f5672f48700(0000) GS:ffff88003fc80000(0000) knlGS:0000000000000000
-[  570.144601] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-[  570.144601] CR2: 00000000000004e0 CR3: 0000000037f7e000 CR4: 00000000000406a0
-[  570.144601] Stack:
-[  570.144601]  ffffffffa018f240 ffff8800387ec780 ffffffffa018f240 ffff8800387ec7b0
-[  570.144601]  ffff880036b63e48 ffffffff812caabe ffff880039e4e000 0000000000000008
-[  570.144601]  ffff880036b63e58 ffffffff812cabad ffff880036b63ea8 ffffffff811347f5
-[  570.144601] Call Trace:
-[  570.144601]  [<ffffffff812caabe>] sock_release+0x1a/0x75
-[  570.144601]  [<ffffffff812cabad>] sock_close+0xd/0x11
-[  570.144601]  [<ffffffff811347f5>] __fput+0xff/0x1a5
-[  570.144601]  [<ffffffff811348cb>] ____fput+0x9/0xb
-[  570.144601]  [<ffffffff81056682>] task_work_run+0x66/0x90
-[  570.144601]  [<ffffffff8100189e>] prepare_exit_to_usermode+0x8c/0xa7
-[  570.144601]  [<ffffffff81001a26>] syscall_return_slowpath+0x16d/0x19b
-[  570.144601]  [<ffffffff813babb1>] int_ret_from_sys_call+0x25/0x9f
-[  570.144601] Code: 48 8b 83 c8 01 00 00 a8 01 74 12 48 89 df e8 8b 27 14 e1 b8 f7 ff ff ff e9 b7 00 00 00 8a 43 12 a8 0b 74 1c 48 8b 83 a8 04 00 00 <48> 8b 80 e0 04 00 00 65 ff 08 48 c7 83 a8 04 00 00 00 00 00 00
-[  570.144601] RIP  [<ffffffffa018c701>] pppoe_release+0x50/0x101 [pppoe]
-[  570.144601]  RSP <ffff880036b63e08>
-[  570.144601] CR2: 00000000000004e0
-[  570.200518] ---[ end trace 46956baf17349563 ]---
-
-pppoe_flush_dev() has no reason to override sk->sk_state with
-PPPOX_ZOMBIE. pppox_unbind_sock() already sets sk->sk_state to
-PPPOX_DEAD, which is the correct state given that sk is unbound and
-po->pppoe_dev is NULL.
-
-Fixes: 2b018d57ff18 ("pppoe: drop PPPOX_ZOMBIEs in pppoe_release")
-Tested-by: Oleksii Berezhniak <core@irc.lg.ua>
-Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ppp/pppoe.c
-+++ b/drivers/net/ppp/pppoe.c
-@@ -313,7 +313,6 @@ static void pppoe_flush_dev(struct net_d
- 			if (po->pppoe_dev == dev &&
- 			    sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) {
- 				pppox_unbind_sock(sk);
--				sk->sk_state = PPPOX_ZOMBIE;
- 				sk->sk_state_change(sk);
- 				po->pppoe_dev = NULL;
- 				dev_put(dev);
diff --git a/target/linux/generic/patches-3.18/081-05-ppp-fix-pppoe_dev-deletion-condition-in-pppoe_releas.patch b/target/linux/generic/patches-3.18/081-05-ppp-fix-pppoe_dev-deletion-condition-in-pppoe_releas.patch
deleted file mode 100644
index b1ae60b02815d327c4b78e9feed1c77a8553f004..0000000000000000000000000000000000000000
--- a/target/linux/generic/patches-3.18/081-05-ppp-fix-pppoe_dev-deletion-condition-in-pppoe_releas.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Guillaume Nault <g.nault@alphalink.fr>
-Date: Thu, 22 Oct 2015 16:57:10 +0200
-Subject: [PATCH] ppp: fix pppoe_dev deletion condition in pppoe_release()
-
-We can't rely on PPPOX_ZOMBIE to decide whether to clear po->pppoe_dev.
-PPPOX_ZOMBIE can be set by pppoe_disc_rcv() even when po->pppoe_dev is
-NULL. So we have no guarantee that (sk->sk_state & PPPOX_ZOMBIE) implies
-(po->pppoe_dev != NULL).
-Since we're releasing a PPPoE socket, we want to release the pppoe_dev
-if it exists and reset sk_state to PPPOX_DEAD, no matter the previous
-value of sk_state. So we can just check for po->pppoe_dev and avoid any
-assumption on sk->sk_state.
-
-Fixes: 2b018d57ff18 ("pppoe: drop PPPOX_ZOMBIEs in pppoe_release")
-Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ppp/pppoe.c
-+++ b/drivers/net/ppp/pppoe.c
-@@ -589,7 +589,7 @@ static int pppoe_release(struct socket *
- 
- 	po = pppox_sk(sk);
- 
--	if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) {
-+	if (po->pppoe_dev) {
- 		dev_put(po->pppoe_dev);
- 		po->pppoe_dev = NULL;
- 	}
diff --git a/target/linux/generic/patches-3.18/082-ipv6-ip6_fragment-fix-headroom-tests-and-skb-leak.patch b/target/linux/generic/patches-3.18/082-ipv6-ip6_fragment-fix-headroom-tests-and-skb-leak.patch
index 7c833c41021b116fc238bae905dbe38f347d9ff5..d3da41e91805393b51785d3f32312a3266d5338e 100644
--- a/target/linux/generic/patches-3.18/082-ipv6-ip6_fragment-fix-headroom-tests-and-skb-leak.patch
+++ b/target/linux/generic/patches-3.18/082-ipv6-ip6_fragment-fix-headroom-tests-and-skb-leak.patch
@@ -44,7 +44,7 @@ Closes 20532
 
 --- a/net/ipv6/ip6_output.c
 +++ b/net/ipv6/ip6_output.c
-@@ -594,20 +594,22 @@ int ip6_fragment(struct sk_buff *skb, in
+@@ -597,20 +597,22 @@ int ip6_fragment(struct sk_buff *skb, in
  	}
  	mtu -= hlen + sizeof(struct frag_hdr);
  
@@ -69,7 +69,7 @@ Closes 20532
  				goto slow_path_clean;
  
  			/* Partially cloned skb? */
-@@ -624,8 +626,6 @@ int ip6_fragment(struct sk_buff *skb, in
+@@ -627,8 +629,6 @@ int ip6_fragment(struct sk_buff *skb, in
  
  		err = 0;
  		offset = 0;
@@ -78,7 +78,7 @@ Closes 20532
  		/* BUILD HEADER */
  
  		*prevhdr = NEXTHDR_FRAGMENT;
-@@ -633,8 +633,11 @@ int ip6_fragment(struct sk_buff *skb, in
+@@ -636,8 +636,11 @@ int ip6_fragment(struct sk_buff *skb, in
  		if (!tmp_hdr) {
  			IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
  				      IPSTATS_MIB_FRAGFAILS);
@@ -91,7 +91,7 @@ Closes 20532
  
  		__skb_pull(skb, hlen);
  		fh = (struct frag_hdr *)__skb_push(skb, sizeof(struct frag_hdr));
-@@ -732,7 +735,6 @@ slow_path:
+@@ -735,7 +738,6 @@ slow_path:
  	 */
  
  	*prevhdr = NEXTHDR_FRAGMENT;
diff --git a/target/linux/generic/patches-3.18/090-overlayfs-fallback-to-readonly-when-full.patch b/target/linux/generic/patches-3.18/090-overlayfs-fallback-to-readonly-when-full.patch
index 6fbbc25ae052febc6964827273c6deadcf12ff11..1bcd5159dbb7a62665fc1942da7ef06c13433745 100644
--- a/target/linux/generic/patches-3.18/090-overlayfs-fallback-to-readonly-when-full.patch
+++ b/target/linux/generic/patches-3.18/090-overlayfs-fallback-to-readonly-when-full.patch
@@ -44,7 +44,7 @@ Miklos
 
 --- a/fs/overlayfs/copy_up.c
 +++ b/fs/overlayfs/copy_up.c
-@@ -300,6 +300,9 @@ int ovl_copy_up_one(struct dentry *paren
+@@ -311,6 +311,9 @@ int ovl_copy_up_one(struct dentry *paren
  	struct cred *override_cred;
  	char *link = NULL;
  
diff --git a/target/linux/generic/patches-3.18/099-module_arch_freeing_init-new-hook-for-archs-before-m.patch b/target/linux/generic/patches-3.18/099-module_arch_freeing_init-new-hook-for-archs-before-m.patch
index d00f751cdcdab1e587a9816da9ed3b55e5aeb2a4..a6310c625c24bcfcfaffbea046b77ae214868d7c 100644
--- a/target/linux/generic/patches-3.18/099-module_arch_freeing_init-new-hook-for-archs-before-m.patch
+++ b/target/linux/generic/patches-3.18/099-module_arch_freeing_init-new-hook-for-archs-before-m.patch
@@ -145,7 +145,7 @@ Origin: backport, https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.gi
  #endif
 --- a/kernel/module.c
 +++ b/kernel/module.c
-@@ -1833,6 +1833,10 @@ void __weak module_arch_cleanup(struct m
+@@ -1837,6 +1837,10 @@ void __weak module_arch_cleanup(struct m
  {
  }
  
@@ -156,7 +156,7 @@ Origin: backport, https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.gi
  /* Free a module, remove from lists, etc. */
  static void free_module(struct module *mod)
  {
-@@ -1865,6 +1869,7 @@ static void free_module(struct module *m
+@@ -1869,6 +1873,7 @@ static void free_module(struct module *m
  
  	/* This may be NULL, but that's OK */
  	unset_module_init_ro_nx(mod);
@@ -164,7 +164,7 @@ Origin: backport, https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.gi
  	module_free(mod, mod->module_init);
  	kfree(mod->args);
  	percpu_modfree(mod);
-@@ -2954,6 +2959,7 @@ static struct module *layout_and_allocat
+@@ -2958,6 +2963,7 @@ static struct module *layout_and_allocat
  static void module_deallocate(struct module *mod, struct load_info *info)
  {
  	percpu_modfree(mod);
@@ -172,7 +172,7 @@ Origin: backport, https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.gi
  	module_free(mod, mod->module_init);
  	module_free(mod, mod->module_core);
  }
-@@ -3077,6 +3083,7 @@ static int do_init_module(struct module
+@@ -3081,6 +3087,7 @@ static int do_init_module(struct module
  	mod->strtab = mod->core_strtab;
  #endif
  	unset_module_init_ro_nx(mod);
diff --git a/target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch b/target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
index aa315143fe2837b0357b237852e2f2052a412e7b..761cff316d0426ac707fc8b2651cf92799417d43 100644
--- a/target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
+++ b/target/linux/generic/patches-3.18/141-mtd-bcm47xxpart-limit-scanned-flash-area-on-BCM47XX-.patch
@@ -20,7 +20,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/drivers/mtd/bcm47xxpart.c
 +++ b/drivers/mtd/bcm47xxpart.c
-@@ -118,8 +118,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -118,8 +118,8 @@ static int bcm47xxpart_parse(struct mtd_
  	/* Parse block by block looking for magics */
  	for (offset = 0; offset <= master->size - blocksize;
  	     offset += blocksize) {
diff --git a/target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch b/target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
index f9e81f939594b18a321f31328ba8fa6328c61f5e..9073f795e2e356c172996b24037396e8861a236e 100644
--- a/target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
+++ b/target/linux/generic/patches-3.18/142-mtd-bcm47xxpart-don-t-fail-because-of-bit-flips.patch
@@ -14,11 +14,9 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  drivers/mtd/bcm47xxpart.c | 38 ++++++++++++++++++++++----------------
  1 file changed, 22 insertions(+), 16 deletions(-)
 
-diff --git a/drivers/mtd/bcm47xxpart.c b/drivers/mtd/bcm47xxpart.c
-index 4450e74..1ab3451 100644
 --- a/drivers/mtd/bcm47xxpart.c
 +++ b/drivers/mtd/bcm47xxpart.c
-@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
+@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_
  {
  	uint32_t buf;
  	size_t bytes_read;
@@ -36,7 +34,7 @@ index 4450e74..1ab3451 100644
  		goto out_default;
  	}
  
-@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_
  	int trx_part = -1;
  	int last_trx_part = -1;
  	int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
@@ -44,7 +42,7 @@ index 4450e74..1ab3451 100644
  
  	/*
  	 * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
-@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_
  		}
  
  		/* Read beginning of the block */
@@ -60,7 +58,7 @@ index 4450e74..1ab3451 100644
  			continue;
  		}
  
-@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_
  		}
  
  		/* Read middle of the block */
@@ -76,7 +74,7 @@ index 4450e74..1ab3451 100644
  			continue;
  		}
  
-@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_
  		}
  
  		offset = master->size - possible_nvram_sizes[i];
@@ -92,6 +90,3 @@ index 4450e74..1ab3451 100644
  			continue;
  		}
  
--- 
-1.8.4.5
-
diff --git a/target/linux/generic/patches-3.18/204-module_strip.patch b/target/linux/generic/patches-3.18/204-module_strip.patch
index 09bffe0673595ec402c788aa3680459d805c6447..deef6b0c9a692bc1b348594e787f414b18420a43 100644
--- a/target/linux/generic/patches-3.18/204-module_strip.patch
+++ b/target/linux/generic/patches-3.18/204-module_strip.patch
@@ -109,7 +109,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  config INIT_ALL_POSSIBLE
 --- a/kernel/module.c
 +++ b/kernel/module.c
-@@ -2670,6 +2670,7 @@ static struct module *setup_load_info(st
+@@ -2674,6 +2674,7 @@ static struct module *setup_load_info(st
  
  static int check_modinfo(struct module *mod, struct load_info *info, int flags)
  {
@@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  	const char *modmagic = get_modinfo(info, "vermagic");
  	int err;
  
-@@ -2695,6 +2696,7 @@ static int check_modinfo(struct module *
+@@ -2699,6 +2700,7 @@ static int check_modinfo(struct module *
  		pr_warn("%s: module is from the staging directory, the quality "
  			"is unknown, you have been warned.\n", mod->name);
  	}
diff --git a/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
index 6adac7766959d6e4025792a0e0d9f65cfc3a2194..5ad82f1f51d3fb39b24c6aad31c38d8ba420397c 100644
--- a/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
+++ b/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
@@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/drivers/mtd/bcm47xxpart.c
 +++ b/drivers/mtd/bcm47xxpart.c
-@@ -61,6 +61,34 @@ static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name,
+@@ -61,6 +61,34 @@ static void bcm47xxpart_add_part(struct
  	part->mask_flags = mask_flags;
  }
  
@@ -48,7 +48,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
  						  size_t offset)
  {
-@@ -182,6 +210,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -182,6 +210,8 @@ static int bcm47xxpart_parse(struct mtd_
  
  		/* TRX */
  		if (buf[0x000 / 4] == TRX_MAGIC) {
@@ -57,7 +57,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  			if (BCM47XXPART_MAX_PARTS - curr_part < 4) {
  				pr_warn("Not enough partitions left to register trx, scanning stopped!\n");
  				break;
-@@ -196,18 +226,18 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -196,18 +226,18 @@ static int bcm47xxpart_parse(struct mtd_
  			i = 0;
  			/* We have LZMA loader if offset[2] points to sth */
  			if (trx->offset[2]) {
@@ -82,7 +82,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
  				i++;
  			}
  
-@@ -219,11 +249,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
+@@ -219,11 +249,11 @@ static int bcm47xxpart_parse(struct mtd_
  			if (trx->offset[i]) {
  				const char *name;
  
diff --git a/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch b/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch
new file mode 100644
index 0000000000000000000000000000000000000000..fef483a67d0f7c3f25a105f5f1d0faef4dfd1a38
--- /dev/null
+++ b/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch
@@ -0,0 +1,10 @@
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -963,6 +963,7 @@ int spi_nor_scan(struct spi_nor *nor, co
+ 
+ 	if (JEDEC_MFR(info->jedec_id) == CFI_MFR_ATMEL ||
+ 	    JEDEC_MFR(info->jedec_id) == CFI_MFR_INTEL ||
++	    JEDEC_MFR(info->jedec_id) == CFI_MFR_MACRONIX ||
+ 	    JEDEC_MFR(info->jedec_id) == CFI_MFR_SST) {
+ 		write_enable(nor);
+ 		write_sr(nor, 0);
diff --git a/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch b/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch
index 6bf516c71bcb5e8108b88790e7bb13650a14721d..dca6895c1448a302f829bcfdde4842f0a000061d 100644
--- a/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch
+++ b/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch
@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 
 --- a/drivers/mtd/spi-nor/spi-nor.c
 +++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -616,6 +616,7 @@ static const struct spi_device_id spi_no
+@@ -617,6 +617,7 @@ static const struct spi_device_id spi_no
  	{ "m25px80",    INFO(0x207114,  0, 64 * 1024, 16, 0) },
  
  	/* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
diff --git a/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch b/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch
index 8082fa6c1e92642bbf2e4a1620293bec09cef7c7..9ba7a4ab2f701440e78da0f9a2e2845f68652267 100644
--- a/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch
+++ b/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch
@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 
 --- a/drivers/mtd/spi-nor/spi-nor.c
 +++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -517,6 +517,7 @@ static const struct spi_device_id spi_no
+@@ -518,6 +518,7 @@ static const struct spi_device_id spi_no
  	{ "640s33b",  INFO(0x898913, 0, 64 * 1024, 128, 0) },
  
  	/* Macronix */
diff --git a/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch b/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch
index f5722379d2eb794f3daf724be9f1977744d53a4e..b06ac73fae3fac808067b8643ac939adc56d35cb 100644
--- a/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch
+++ b/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch
@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 
 --- a/drivers/mtd/spi-nor/spi-nor.c
 +++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -516,6 +516,9 @@ static const struct spi_device_id spi_no
+@@ -517,6 +517,9 @@ static const struct spi_device_id spi_no
  	{ "320s33b",  INFO(0x898912, 0, 64 * 1024,  64, 0) },
  	{ "640s33b",  INFO(0x898913, 0, 64 * 1024, 128, 0) },
  
diff --git a/target/linux/generic/patches-3.18/532-jffs2_eofdetect.patch b/target/linux/generic/patches-3.18/532-jffs2_eofdetect.patch
index 9cbe183138889dc558857d2d565562acfcbd7afa..8ce53d8bed54ce225da77dc65e150d89dcf93301 100644
--- a/target/linux/generic/patches-3.18/532-jffs2_eofdetect.patch
+++ b/target/linux/generic/patches-3.18/532-jffs2_eofdetect.patch
@@ -1,6 +1,6 @@
 --- a/fs/jffs2/build.c
 +++ b/fs/jffs2/build.c
-@@ -114,6 +114,16 @@ static int jffs2_build_filesystem(struct
+@@ -116,6 +116,16 @@ static int jffs2_build_filesystem(struct
  	dbg_fsbuild("scanned flash completely\n");
  	jffs2_dbg_dump_block_lists_nolock(c);
  
diff --git a/target/linux/generic/patches-3.18/630-packet_socket_type.patch b/target/linux/generic/patches-3.18/630-packet_socket_type.patch
index 31f4bca2a023069c60edcaef0f069cc9e89132ce..c3c0fe46644fde0f4d4bf2e32e461c3a4bcae9c3 100644
--- a/target/linux/generic/patches-3.18/630-packet_socket_type.patch
+++ b/target/linux/generic/patches-3.18/630-packet_socket_type.patch
@@ -26,7 +26,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  #define PACKET_FANOUT_LB		1
 --- a/net/packet/af_packet.c
 +++ b/net/packet/af_packet.c
-@@ -1516,6 +1516,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1530,6 +1530,7 @@ static int packet_rcv_spkt(struct sk_buf
  {
  	struct sock *sk;
  	struct sockaddr_pkt *spkt;
@@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  
  	/*
  	 *	When we registered the protocol we saved the socket in the data
-@@ -1523,6 +1524,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1537,6 +1538,7 @@ static int packet_rcv_spkt(struct sk_buf
  	 */
  
  	sk = pt->af_packet_priv;
@@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  
  	/*
  	 *	Yank back the headers [hope the device set this
-@@ -1535,7 +1537,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1549,7 +1551,7 @@ static int packet_rcv_spkt(struct sk_buf
  	 *	so that this procedure is noop.
  	 */
  
@@ -51,7 +51,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  		goto out;
  
  	if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -1742,12 +1744,12 @@ static int packet_rcv(struct sk_buff *sk
+@@ -1748,12 +1750,12 @@ static int packet_rcv(struct sk_buff *sk
  	int skb_len = skb->len;
  	unsigned int snaplen, res;
  
@@ -67,7 +67,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  	if (!net_eq(dev_net(dev), sock_net(sk)))
  		goto drop;
  
-@@ -1867,12 +1869,12 @@ static int tpacket_rcv(struct sk_buff *s
+@@ -1873,12 +1875,12 @@ static int tpacket_rcv(struct sk_buff *s
  	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
  	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
  
@@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  	if (!net_eq(dev_net(dev), sock_net(sk)))
  		goto drop;
  
-@@ -2807,6 +2809,7 @@ static int packet_create(struct net *net
+@@ -2828,6 +2830,7 @@ static int packet_create(struct net *net
  	spin_lock_init(&po->bind_lock);
  	mutex_init(&po->pg_vec_lock);
  	po->prot_hook.func = packet_rcv;
@@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  
  	if (sock->type == SOCK_PACKET)
  		po->prot_hook.func = packet_rcv_spkt;
-@@ -3387,6 +3390,16 @@ packet_setsockopt(struct socket *sock, i
+@@ -3408,6 +3411,16 @@ packet_setsockopt(struct socket *sock, i
  		po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
  		return 0;
  	}
@@ -108,7 +108,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  	default:
  		return -ENOPROTOOPT;
  	}
-@@ -3438,6 +3451,13 @@ static int packet_getsockopt(struct sock
+@@ -3459,6 +3472,13 @@ static int packet_getsockopt(struct sock
  	case PACKET_VNET_HDR:
  		val = po->has_vnet_hdr;
  		break;
diff --git a/target/linux/generic/patches-3.18/643-bridge_remove_ipv6_dependency.patch b/target/linux/generic/patches-3.18/643-bridge_remove_ipv6_dependency.patch
index 3f0dcd3ae27fe42f548e8968ad17697d0fc40f78..aef3832b0fa5d09a0634001515bee1d53f72d279 100644
--- a/target/linux/generic/patches-3.18/643-bridge_remove_ipv6_dependency.patch
+++ b/target/linux/generic/patches-3.18/643-bridge_remove_ipv6_dependency.patch
@@ -35,7 +35,7 @@
  obj-$(CONFIG_NET_UDP_TUNNEL) += ip6_udp_tunnel.o
 --- a/net/ipv6/addrconf.c
 +++ b/net/ipv6/addrconf.c
-@@ -1317,7 +1317,7 @@ out:
+@@ -1318,7 +1318,7 @@ out:
  	return ret;
  }
  
@@ -44,7 +44,7 @@
  		       const struct in6_addr *daddr, unsigned int prefs,
  		       struct in6_addr *saddr)
  {
-@@ -1442,7 +1442,6 @@ try_nextdev:
+@@ -1443,7 +1443,6 @@ try_nextdev:
  	in6_ifa_put(hiscore->ifa);
  	return 0;
  }
@@ -52,7 +52,7 @@
  
  int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
  		      u32 banned_flags)
-@@ -5451,6 +5450,9 @@ int __init addrconf_init(void)
+@@ -5467,6 +5466,9 @@ int __init addrconf_init(void)
  
  	ipv6_addr_label_rtnl_register();
  
@@ -62,7 +62,7 @@
  	return 0;
  errout:
  	rtnl_af_unregister(&inet6_ops);
-@@ -5470,6 +5472,9 @@ void addrconf_cleanup(void)
+@@ -5486,6 +5488,9 @@ void addrconf_cleanup(void)
  	struct net_device *dev;
  	int i;
  
diff --git a/target/linux/generic/patches-3.18/662-use_fq_codel_by_default.patch b/target/linux/generic/patches-3.18/662-use_fq_codel_by_default.patch
index ba7c384ad22937a57ed05bfd686af9312f117fef..5caf9337642749e17580440846ab686f0b99eda6 100644
--- a/target/linux/generic/patches-3.18/662-use_fq_codel_by_default.patch
+++ b/target/linux/generic/patches-3.18/662-use_fq_codel_by_default.patch
@@ -51,7 +51,7 @@
  EXPORT_SYMBOL(default_qdisc_ops);
  
  /* Main transmission queue. */
-@@ -737,7 +737,7 @@ static void attach_one_default_qdisc(str
+@@ -739,7 +739,7 @@ static void attach_one_default_qdisc(str
  
  	if (dev->tx_queue_len) {
  		qdisc = qdisc_create_dflt(dev_queue,
diff --git a/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch b/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch
index d02e08501c8afdde92180fa667080450e4e31dea..0c951069c24e8295b939003149029f0a2a14479e 100644
--- a/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch
+++ b/target/linux/generic/patches-3.18/667-ipv6-Fixed-source-specific-default-route-handling.patch
@@ -26,7 +26,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
 
 --- a/net/ipv6/ip6_output.c
 +++ b/net/ipv6/ip6_output.c
-@@ -900,21 +900,45 @@ static int ip6_dst_lookup_tail(struct so
+@@ -903,21 +903,45 @@ static int ip6_dst_lookup_tail(struct so
  #endif
  	int err;
  
diff --git a/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch b/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch
index b883d73af3ae953ecd2e0ef7b954740570185e6a..559731300ba714e2d4f5d333f4b18ed3f5aff07b 100644
--- a/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch
+++ b/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch
@@ -12,7 +12,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  #include <bcm47xx_nvram.h>
  
  static const struct bcma_device_id bgmac_bcma_tbl[] = {
-@@ -1538,6 +1539,17 @@ static void bgmac_mii_unregister(struct
+@@ -1544,6 +1545,17 @@ static void bgmac_mii_unregister(struct
  	mdiobus_free(mii_bus);
  }
  
@@ -30,13 +30,11 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  /**************************************************
   * BCMA bus ops
   **************************************************/
-@@ -1664,6 +1676,16 @@ static int bgmac_probe(struct bcma_devic
+@@ -1668,6 +1680,14 @@ static int bgmac_probe(struct bcma_devic
  	net_dev->hw_features = net_dev->features;
  	net_dev->vlan_features = net_dev->features;
  
-+	if ((ci->id == BCMA_CHIP_ID_BCM4707 ||
-+	     ci->id == BCMA_CHIP_ID_BCM53018) &&
-+	    !bgmac_b53_pdata.regs) {
++	if (bgmac_is_bcm4707_family(bgmac) && !bgmac_b53_pdata.regs) {
 +		bgmac_b53_pdata.regs = ioremap_nocache(0x18007000, 0x1000);
 +
 +		err = platform_device_register(&bgmac_b53_dev);
@@ -47,7 +45,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  	err = register_netdev(bgmac->net_dev);
  	if (err) {
  		bgmac_err(bgmac, "Cannot register net device\n");
-@@ -1690,6 +1712,10 @@ static void bgmac_remove(struct bcma_dev
+@@ -1694,6 +1714,10 @@ static void bgmac_remove(struct bcma_dev
  {
  	struct bgmac *bgmac = bcma_get_drvdata(core);
  
diff --git a/target/linux/generic/patches-3.18/810-pci_disable_common_quirks.patch b/target/linux/generic/patches-3.18/810-pci_disable_common_quirks.patch
index b9b3e0aba8e398ee926830721d05c8a99ad722e1..1b7bead486444facfe9e7952c8324b39e2baedc8 100644
--- a/target/linux/generic/patches-3.18/810-pci_disable_common_quirks.patch
+++ b/target/linux/generic/patches-3.18/810-pci_disable_common_quirks.patch
@@ -23,7 +23,7 @@
  /* The Mellanox Tavor device gives false positive parity errors
   * Mark this device with a broken_parity_status, to allow
   * PCI scanning code to "skip" this now blacklisted device.
-@@ -2908,6 +2909,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
+@@ -2917,6 +2918,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);
  
@@ -31,7 +31,7 @@
  
  /*
   * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum.  To
-@@ -2964,6 +2966,8 @@ static void fixup_debug_report(struct pc
+@@ -2973,6 +2975,8 @@ static void fixup_debug_report(struct pc
  	}
  }
  
@@ -40,7 +40,7 @@
  /*
   * Some BIOS implementations leave the Intel GPU interrupts enabled,
   * even though no one is handling them (f.e. i915 driver is never loaded).
-@@ -2998,6 +3002,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
+@@ -3007,6 +3011,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
  
diff --git a/target/linux/generic/patches-3.18/902-debloat_proc.patch b/target/linux/generic/patches-3.18/902-debloat_proc.patch
index 5cecd1e6770573d76a334ee767654c7dfb140351..79cecf90d4693d5182214afa0ceca37222d0d50a 100644
--- a/target/linux/generic/patches-3.18/902-debloat_proc.patch
+++ b/target/linux/generic/patches-3.18/902-debloat_proc.patch
@@ -1,6 +1,6 @@
 --- a/fs/locks.c
 +++ b/fs/locks.c
-@@ -2611,6 +2611,8 @@ static const struct file_operations proc
+@@ -2620,6 +2620,8 @@ static const struct file_operations proc
  
  static int __init proc_locks_init(void)
  {
@@ -173,7 +173,7 @@
  		goto err;
 --- a/net/core/sock.c
 +++ b/net/core/sock.c
-@@ -2934,6 +2934,8 @@ static __net_initdata struct pernet_oper
+@@ -2933,6 +2933,8 @@ static __net_initdata struct pernet_oper
  
  static int __init proto_init(void)
  {
diff --git a/target/linux/generic/patches-3.18/903-debloat_direct_io.patch b/target/linux/generic/patches-3.18/903-debloat_direct_io.patch
index 92190e47a9b65a6e04aa2a81802da8f80de06f10..dbb08ca4e7fa123c05e5445b2ca5c6c69b7d1046 100644
--- a/target/linux/generic/patches-3.18/903-debloat_direct_io.patch
+++ b/target/linux/generic/patches-3.18/903-debloat_direct_io.patch
@@ -26,7 +26,7 @@
  endif
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -2528,12 +2528,25 @@ enum {
+@@ -2529,12 +2529,25 @@ enum {
  	DIO_ASYNC_EXTEND = 0x04,
  };
  
diff --git a/target/linux/generic/patches-3.18/904-debloat_dma_buf.patch b/target/linux/generic/patches-3.18/904-debloat_dma_buf.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3faf97a880206d9e3c95abc277079c50d7c5977e
--- /dev/null
+++ b/target/linux/generic/patches-3.18/904-debloat_dma_buf.patch
@@ -0,0 +1,44 @@
+--- a/drivers/base/Kconfig
++++ b/drivers/base/Kconfig
+@@ -229,7 +229,7 @@ config SOC_BUS
+ source "drivers/base/regmap/Kconfig"
+ 
+ config DMA_SHARED_BUFFER
+-	bool
++	tristate
+ 	default n
+ 	select ANON_INODES
+ 	help
+--- a/drivers/dma-buf/Makefile
++++ b/drivers/dma-buf/Makefile
+@@ -1 +1,2 @@
+-obj-y := dma-buf.o fence.o reservation.o seqno-fence.o
++obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o
++dma-shared-buffer-objs := dma-buf.o fence.o reservation.o seqno-fence.o
+--- a/drivers/dma-buf/dma-buf.c
++++ b/drivers/dma-buf/dma-buf.c
+@@ -32,6 +32,7 @@
+ #include <linux/seq_file.h>
+ #include <linux/poll.h>
+ #include <linux/reservation.h>
++#include <linux/module.h>
+ 
+ static inline int is_dma_buf_file(struct file *);
+ 
+@@ -904,4 +905,5 @@ static void __exit dma_buf_deinit(void)
+ {
+ 	dma_buf_uninit_debugfs();
+ }
+-__exitcall(dma_buf_deinit);
++module_exit(dma_buf_deinit);
++MODULE_LICENSE("GPL");
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -1801,6 +1801,7 @@ int wake_up_state(struct task_struct *p,
+ {
+ 	return try_to_wake_up(p, state, 0);
+ }
++EXPORT_SYMBOL_GPL(wake_up_state);
+ 
+ /*
+  * This function clears the sched_dl_entity static params.
diff --git a/target/linux/imx6/patches-3.18/201-pci_imx6_ventana_fixup-for-IRQ-mismapping.patch b/target/linux/imx6/patches-3.18/201-pci_imx6_ventana_fixup-for-IRQ-mismapping.patch
index 4db1569d895f8ca7b822ed129a1a11abaa06806b..4e75086c9ef3942b33b772efee16ddd444f3f6f8 100644
--- a/target/linux/imx6/patches-3.18/201-pci_imx6_ventana_fixup-for-IRQ-mismapping.patch
+++ b/target/linux/imx6/patches-3.18/201-pci_imx6_ventana_fixup-for-IRQ-mismapping.patch
@@ -19,7 +19,7 @@ Date:   Thu Feb 27 00:59:53 2014 -0800
 
 --- a/drivers/pci/host/pci-imx6.c
 +++ b/drivers/pci/host/pci-imx6.c
-@@ -553,6 +553,39 @@ static int __init imx6_add_pcie_port(str
+@@ -554,6 +554,39 @@ static int __init imx6_add_pcie_port(str
  	return 0;
  }
  
@@ -59,7 +59,7 @@ Date:   Thu Feb 27 00:59:53 2014 -0800
  static int __init imx6_pcie_probe(struct platform_device *pdev)
  {
  	struct imx6_pcie *imx6_pcie;
-@@ -618,6 +651,9 @@ static int __init imx6_pcie_probe(struct
+@@ -619,6 +652,9 @@ static int __init imx6_pcie_probe(struct
  		return PTR_ERR(imx6_pcie->iomuxc_gpr);
  	}
  
diff --git a/target/linux/lantiq/base-files/etc/diag.sh b/target/linux/lantiq/base-files/etc/diag.sh
index 26f0a3c8a91fffda9a23f1dd34ac63f705f3801b..57a70551274deaee0b026729561ddfc508e827ca 100644
--- a/target/linux/lantiq/base-files/etc/diag.sh
+++ b/target/linux/lantiq/base-files/etc/diag.sh
@@ -3,40 +3,48 @@
 
 . /lib/functions/leds.sh
 
-status_led="power"
+status_led=power
+[ ! -d /sys/class/leds/power/ ] && [ ! -d /sys/class/leds/power1/ ] && [ ! -d /sys/class/leds/power2/ ] && [ -d /sys/class/leds/wps/ ] && status_led=wps
 
 set_state() {
-	[ -d /sys/class/leds/power2/ ] && {
-
-		case "$1" in
-		preinit)
-			led_set_attr "power2" "trigger" "heartbeat"
-			status_led_on
-			;;
-		failsafe)
-			led_off "power2"
-			status_led_set_timer 100 100
-			;;
-		done)
-			led_off "power2"
-			;;
-		esac
-		return
-	}
-
 	case "$1" in
 	preinit)
-		status_led_set_heartbeat
+		if [ -d /sys/class/leds/power2/ ]; then
+			status_led_on
+			status_led=power2
+			status_led_blink_preinit
+			status_led=power
+		else
+			status_led_blink_preinit
+		fi
 		;;
 	failsafe)
-		[ -d /sys/class/leds/power1 ] && {
+		if [ -d /sys/class/leds/power2/ ]; then
+			led_off power2
+			status_led_blink_failsafe
+		elif [ -d /sys/class/leds/power1/ ]; then
 			status_led_off
-			led_timer "power1" 100 100
-		} || status_led_set_timer 100 100
+			status_led=power1
+			status_led_blink_failsafe
+			status_led=power
+		else
+			status_led_blink_failsafe
+		fi
+		;;
+	preinit_regular)
+		if [ -d /sys/class/leds/power2/ ]; then
+			status_led_on
+			status_led=power2
+			status_led_blink_preinit_regular
+			status_led=power
+		else
+			status_led_blink_preinit_regular
+		fi
 		;;
 	done)
 		status_led_on
-		led_off "power1"
+		led_off power1
+		led_off power2
 		;;
 	esac
 }
diff --git a/target/linux/lantiq/base-files/etc/uci-defaults/01_leds b/target/linux/lantiq/base-files/etc/uci-defaults/01_leds
index 6956d616af75e7c716e1ae6d9c7a7cf129e104fa..5643f7f2be6abea6d7dd78abf11f5a45bef45b9d 100644
--- a/target/linux/lantiq/base-files/etc/uci-defaults/01_leds
+++ b/target/linux/lantiq/base-files/etc/uci-defaults/01_leds
@@ -30,6 +30,9 @@ BTHOMEHUBV3A)
 	ucidef_set_led_wlan "wifi" "wifi" "soc:blue:wireless" "phy0tpt"
 	ucidef_set_led_netdev "internet" "internet" "soc:blue:broadband" "pppoa-wan"
 	;;
+TDW8970)
+	ucidef_set_led_wlan "wifi" "wifi" "ath9k-phy0" "phy0tpt"
+	;;
 VGV7510KW22)
 	ucidef_set_led_default "power" "power" "power" "1"
 	ucidef_set_led_default "power2" "power2" "power2" "0"
diff --git a/target/linux/lantiq/dts/TDW8970.dts b/target/linux/lantiq/dts/TDW8970.dts
index d8dcb5d836626bd5107bda3d508e38c09615265b..cb4d88b1604afbc564b8ea0742470eb712b784f4 100644
--- a/target/linux/lantiq/dts/TDW8970.dts
+++ b/target/linux/lantiq/dts/TDW8970.dts
@@ -202,6 +202,8 @@
 		ath,mac-offset = <0xf100>;
 		ath,mac-increment;
 		ath,led-pin = <0>;
+		ath,disable-5ghz;
+		ath,led-active-high;
 	};
 
 	gpio-keys-polled {
diff --git a/target/linux/lantiq/patches-3.18/0001-MIPS-lantiq-add-pcie-driver.patch b/target/linux/lantiq/patches-3.18/0001-MIPS-lantiq-add-pcie-driver.patch
index a123ce384fb12e9b8effba5a81807379c6489785..85311c21f2a766415fcaf214890df798cd30b07c 100644
--- a/target/linux/lantiq/patches-3.18/0001-MIPS-lantiq-add-pcie-driver.patch
+++ b/target/linux/lantiq/patches-3.18/0001-MIPS-lantiq-add-pcie-driver.patch
@@ -5514,7 +5514,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  	  (transaction layer end-to-end CRC checking).
 --- a/include/linux/pci.h
 +++ b/include/linux/pci.h
-@@ -1156,6 +1156,8 @@ void pci_walk_bus(struct pci_bus *top, i
+@@ -1160,6 +1160,8 @@ void pci_walk_bus(struct pci_bus *top, i
  		  void *userdata);
  int pci_cfg_space_size(struct pci_dev *dev);
  unsigned char pci_bus_max_busnr(struct pci_bus *bus);
diff --git a/target/linux/lantiq/patches-3.18/0032-USB-fix-roothub-for-IFXHCD.patch b/target/linux/lantiq/patches-3.18/0032-USB-fix-roothub-for-IFXHCD.patch
index cf2c5cbd5bd434f9e2f96c602c745c6c3d972aed..dcd8461a0ef8f70ba66c0996eb435859acffc9f9 100644
--- a/target/linux/lantiq/patches-3.18/0032-USB-fix-roothub-for-IFXHCD.patch
+++ b/target/linux/lantiq/patches-3.18/0032-USB-fix-roothub-for-IFXHCD.patch
@@ -20,7 +20,7 @@ Subject: [PATCH 32/36] USB: fix roothub for IFXHCD
  choice
 --- a/drivers/usb/core/hub.c
 +++ b/drivers/usb/core/hub.c
-@@ -4303,7 +4303,7 @@ hub_port_init (struct usb_hub *hub, stru
+@@ -4323,7 +4323,7 @@ hub_port_init (struct usb_hub *hub, stru
  		udev->ttport = hdev->ttport;
  	} else if (udev->speed != USB_SPEED_HIGH
  			&& hdev->speed == USB_SPEED_HIGH) {
diff --git a/target/linux/lantiq/patches-3.18/0035-owrt-lantiq-wifi-and-ethernet-eeprom-handling.patch b/target/linux/lantiq/patches-3.18/0035-owrt-lantiq-wifi-and-ethernet-eeprom-handling.patch
index 04c2071f320ce76876a5128b69861050621f07ff..9198fe580a15ce05e4b0d7032022dc87aa3d8720 100644
--- a/target/linux/lantiq/patches-3.18/0035-owrt-lantiq-wifi-and-ethernet-eeprom-handling.patch
+++ b/target/linux/lantiq/patches-3.18/0035-owrt-lantiq-wifi-and-ethernet-eeprom-handling.patch
@@ -51,13 +51,14 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  obj-$(CONFIG_XRX200_PHY_FW) += xrx200_phy_fw.o
 --- /dev/null
 +++ b/arch/mips/lantiq/xway/ath_eep.c
-@@ -0,0 +1,282 @@
+@@ -0,0 +1,298 @@
 +/*
 + *  Copyright (C) 2011 Luca Olivetti <luca@ventoso.org>
 + *  Copyright (C) 2011 John Crispin <blogic@openwrt.org>
 + *  Copyright (C) 2011 Andrej Vlašić <andrej.vlasic0@gmail.com>
 + *  Copyright (C) 2013 Álvaro Fernández Rojas <noltari@gmail.com>
 + *  Copyright (C) 2013 Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
++ *  Copyright (C) 2015 Vittorio Gambaletta <openwrt@vittgam.net>
 + *
 + *  This program is free software; you can redistribute it and/or modify it
 + *  under the terms of the GNU General Public License version 2 as published
@@ -192,6 +193,21 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +		dev_info(&pdev->dev, "using led pin %d.\n", led_pin);
 +	}
 +
++	if (of_property_read_bool(np, "ath,led-active-high")) {
++		ath9k_pdata.led_active_high = true;
++		dev_info(&pdev->dev, "inverted LED polarity\n");
++	}
++
++	if (of_property_read_bool(np, "ath,disable-2ghz")) {
++		ath9k_pdata.disable_2ghz = true;
++		dev_info(&pdev->dev, "disabled 2.4 GHz band\n");
++	}
++
++	if (of_property_read_bool(np, "ath,disable-5ghz")) {
++		ath9k_pdata.disable_5ghz = true;
++		dev_info(&pdev->dev, "disabled 5 GHz band\n");
++	}
++
 +	dev_info(&pdev->dev, "loaded ath9k eeprom\n");
 +
 +	return 0;
diff --git a/target/linux/malta/config-3.18 b/target/linux/malta/config-3.18
index d9757de1207dcca098d60cb31d234d5c7f7ac3f6..daf3b256e800899f41c331c8926aa58685deac62 100644
--- a/target/linux/malta/config-3.18
+++ b/target/linux/malta/config-3.18
@@ -7,6 +7,8 @@ CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
 CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
 CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
 # CONFIG_AX88796_93CX6 is not set
+CONFIG_ATA=y
+CONFIG_ATA_PIIX=y
 CONFIG_BLK_DEV_BSG=y
 CONFIG_BLK_DEV_BSGLIB=y
 # CONFIG_BLK_DEV_DM is not set
@@ -15,6 +17,7 @@ CONFIG_BLK_DEV_BSGLIB=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_SD=y
 CONFIG_BOARD_SCACHE=y
 CONFIG_BOOT_ELF32=y
 CONFIG_BOUNCE=y
@@ -52,6 +55,7 @@ CONFIG_DNOTIFY=y
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_EXT4_FS=y
 CONFIG_FIRMWARE_IN_KERNEL=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_GENERIC_ATOMIC64=y
diff --git a/target/linux/mvebu/base-files/etc/uci-defaults/02_network b/target/linux/mvebu/base-files/etc/uci-defaults/02_network
index d1da59fb487e7cac049a8e65ac002ea42f13f9b6..cb034f782daea22434d94ee5286298f5de763f65 100644
--- a/target/linux/mvebu/base-files/etc/uci-defaults/02_network
+++ b/target/linux/mvebu/base-files/etc/uci-defaults/02_network
@@ -36,6 +36,9 @@ armada-385-db-ap)
 armada-xp-gp)
 	ucidef_set_interface_lan "eth0 eth1 eth2 eth3"
 	;;
+armada-388-clearfog)
+	ucidef_set_interfaces_lan_wan "eth0 eth1" "eth2"
+	;;
 *)
 	ucidef_set_interface_lan "eth0"
 	;;
diff --git a/target/linux/mvebu/base-files/lib/mvebu.sh b/target/linux/mvebu/base-files/lib/mvebu.sh
index 09ebff3edcac3c395526578abaf0f377d9d66d64..836717d7f6be07b40961d149ac941ec984fc6485 100755
--- a/target/linux/mvebu/base-files/lib/mvebu.sh
+++ b/target/linux/mvebu/base-files/lib/mvebu.sh
@@ -49,6 +49,9 @@ mvebu_board_detect() {
 	*"Marvell Armada XP Development Board DB-MV784MP-GP")
 		name="armada-xp-gp"
 		;;
+	*"SolidRun Clearfog A1")
+		name="armada-388-clearfog"
+		;;
 	esac
 
 	[ -z "$name" ] && name="unknown"
diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-388-clearfog.dts b/target/linux/mvebu/files/arch/arm/boot/dts/armada-388-clearfog.dts
new file mode 100644
index 0000000000000000000000000000000000000000..c6e180eb3b114e060a5471c3261fe0fddf95ff6d
--- /dev/null
+++ b/target/linux/mvebu/files/arch/arm/boot/dts/armada-388-clearfog.dts
@@ -0,0 +1,456 @@
+/*
+ * Device Tree file for SolidRun Clearfog revision A1 rev 2.0 (88F6828)
+ *
+ *  Copyright (C) 2015 Russell King
+ *
+ * This board is in development; the contents of this file work with
+ * the A1 rev 2.0 of the board, which does not represent final
+ * production board.  Things will change, don't expect this file to
+ * remain compatible info the future.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License
+ *     version 2 as published by the Free Software Foundation.
+ *
+ *     This file is distributed in the hope that it will be useful
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "armada-388.dtsi"
+#include "armada-38x-solidrun-microsom.dtsi"
+
+/ {
+	model = "SolidRun Clearfog A1";
+	compatible = "solidrun,clearfog-a1", "marvell,armada388",
+		"marvell,armada385", "marvell,armada380";
+
+	aliases {
+		/* So that mvebu u-boot can update the MAC addresses */
+		ethernet1 = &eth0;
+		ethernet2 = &eth1;
+		ethernet3 = &eth2;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+
+	reg_3p3v: regulator-3p3v {
+		compatible = "regulator-fixed";
+		regulator-name = "3P3V";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-always-on;
+	};
+
+	soc {
+		internal-regs {
+			ethernet@30000 {
+				phy-mode = "sgmii";
+				status = "okay";
+
+				fixed-link {
+					speed = <1000>;
+					full-duplex;
+				};
+			};
+
+			ethernet@34000 {
+				phy-mode = "sgmii";
+				status = "okay";
+
+				fixed-link {
+					speed = <1000>;
+					full-duplex;
+				};
+			};
+
+			i2c@11000 {
+				/* Is there anything on this? */
+				clock-frequency = <100000>;
+				pinctrl-0 = <&i2c0_pins>;
+				pinctrl-names = "default";
+				status = "okay";
+
+				/*
+				 * PCA9655 GPIO expander, up to 1MHz clock.
+				 *  0-CON3 CLKREQ#
+				 *  1-CON3 PERST#
+				 *  2-CON2 PERST#
+				 *  3-CON3 W_DISABLE
+				 *  4-CON2 CLKREQ#
+				 *  5-USB3 overcurrent
+				 *  6-USB3 power
+				 *  7-CON2 W_DISABLE
+				 *  8-JP4 P1
+				 *  9-JP4 P4
+				 * 10-JP4 P5
+				 * 11-m.2 DEVSLP
+				 * 12-SFP_LOS
+				 * 13-SFP_TX_FAULT
+				 * 14-SFP_TX_DISABLE
+				 * 15-SFP_MOD_DEF0
+				 */
+				expander0: gpio-expander@20 {
+					/*
+					 * This is how it should be:
+					 * compatible = "onnn,pca9655",
+					 *	 "nxp,pca9555";
+					 * but you can't do this because of
+					 * the way I2C works.
+					 */
+					compatible = "nxp,pca9555";
+					gpio-controller;
+					#gpio-cells = <2>;
+					reg = <0x20>;
+
+					pcie1_0_clkreq {
+						gpio-hog;
+						gpios = <0 GPIO_ACTIVE_LOW>;
+						input;
+						line-name = "pcie1.0-clkreq";
+					};
+					pcie1_0_w_disable {
+						gpio-hog;
+						gpios = <3 GPIO_ACTIVE_LOW>;
+						output-low;
+						line-name = "pcie1.0-w-disable";
+					};
+					pcie2_0_clkreq {
+						gpio-hog;
+						gpios = <4 GPIO_ACTIVE_LOW>;
+						input;
+						line-name = "pcie2.0-clkreq";
+					};
+					pcie2_0_w_disable {
+						gpio-hog;
+						gpios = <7 GPIO_ACTIVE_LOW>;
+						output-low;
+						line-name = "pcie2.0-w-disable";
+					};
+					usb3_ilimit {
+						gpio-hog;
+						gpios = <5 GPIO_ACTIVE_LOW>;
+						input;
+						line-name = "usb3-current-limit";
+					};
+					usb3_power {
+						gpio-hog;
+						gpios = <6 GPIO_ACTIVE_HIGH>;
+						output-high;
+						line-name = "usb3-power";
+					};
+					m2_devslp {
+						gpio-hog;
+						gpios = <11 GPIO_ACTIVE_HIGH>;
+						output-low;
+						line-name = "m.2 devslp";
+					};
+					sfp_los {
+						/* SFP loss of signal */
+						gpio-hog;
+						gpios = <12 GPIO_ACTIVE_HIGH>;
+						input;
+						line-name = "sfp-los";
+					};
+					sfp_tx_fault {
+						/* SFP laser fault */
+						gpio-hog;
+						gpios = <13 GPIO_ACTIVE_HIGH>;
+						input;
+						line-name = "sfp-tx-fault";
+					};
+					sfp_tx_disable {
+						/* SFP transmit disable */
+						gpio-hog;
+						gpios = <14 GPIO_ACTIVE_HIGH>;
+						output-low;
+						line-name = "sfp-tx-disable";
+					};
+					sfp_mod_def0 {
+						/* SFP module present */
+						gpio-hog;
+						gpios = <15 GPIO_ACTIVE_LOW>;
+						input;
+						line-name = "sfp-mod-def0";
+					};
+				};
+
+				/* The MCP3021 is 100kHz clock only */
+				mikrobus_adc: mcp3021@4c {
+					compatible = "microchip,mcp3021";
+					reg = <0x4c>;
+				};
+
+				/* Also something at 0x64 */
+			};
+
+			i2c@11100 {
+				/*
+				 * Routed to SFP, mikrobus, and PCIe.
+				 * SFP limits this to 100kHz, and requires
+				 *  an AT24C01A/02/04 with address pins tied
+				 *  low, which takes addresses 0x50 and 0x51.
+				 * Mikrobus doesn't specify beyond an I2C
+				 *  bus being present.
+				 * PCIe uses ARP to assign addresses, or
+				 *  0x63-0x64.
+				 */
+				clock-frequency = <100000>;
+				pinctrl-0 = <&clearfog_i2c1_pins>;
+				pinctrl-names = "default";
+				status = "okay";
+			};
+
+			mdio@72004 {
+				pinctrl-0 = <&mdio_pins>;
+				pinctrl-names = "default";
+
+				phy_dedicated: ethernet-phy@0 {
+					/*
+					 * Annoyingly, the marvell phy driver
+					 * configures the LED register, rather
+					 * than preserving reset-loaded setting.
+					 * We undo that rubbish here.
+					 */
+					marvell,reg-init = <3 16 0 0x101e>;
+					reg = <0>;
+				};
+			};
+
+			pinctrl@18000 {
+				clearfog_dsa0_clk_pins: clearfog-dsa0-clk-pins {
+					marvell,pins = "mpp46";
+					marvell,function = "ref";
+				};
+				clearfog_dsa0_pins: clearfog-dsa0-pins {
+					marvell,pins = "mpp23", "mpp41";
+					marvell,function = "gpio";
+				};
+				clearfog_i2c1_pins: i2c1-pins {
+					/* SFP, PCIe, mSATA, mikrobus */
+					marvell,pins = "mpp26", "mpp27";
+					marvell,function = "i2c1";
+				};
+				clearfog_sdhci_cd_pins: clearfog-sdhci-cd-pins {
+					marvell,pins = "mpp20";
+					marvell,function = "gpio";
+				};
+				clearfog_sdhci_pins: clearfog-sdhci-pins {
+					marvell,pins = "mpp21", "mpp28",
+						       "mpp37", "mpp38",
+						       "mpp39", "mpp40";
+					marvell,function = "sd0";
+				};
+				clearfog_spi1_cs_pins: spi1-cs-pins {
+					marvell,pins = "mpp55";
+					marvell,function = "spi1";
+				};
+				mikro_pins: mikro-pins {
+					/* int: mpp22 rst: mpp29 */
+					marvell,pins = "mpp22", "mpp29";
+					marvell,function = "gpio";
+				};
+				mikro_spi_pins: mikro-spi-pins {
+					marvell,pins = "mpp43";
+					marvell,function = "spi1";
+				};
+				mikro_uart_pins: mikro-uart-pins {
+					marvell,pins = "mpp24", "mpp25";
+					marvell,function = "ua1";
+				};
+				rear_button_pins: rear-button-pins {
+					marvell,pins = "mpp34";
+					marvell,function = "gpio";
+				};
+			};
+
+			sata@a8000 {
+				/* pinctrl? */
+				status = "okay";
+			};
+
+			sata@e0000 {
+				/* pinctrl? */
+				status = "okay";
+			};
+
+			sdhci@d8000 {
+				bus-width = <4>;
+				cd-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
+				no-1-8-v;
+				pinctrl-0 = <&clearfog_sdhci_pins
+					     &clearfog_sdhci_cd_pins>;
+				pinctrl-names = "default";
+				status = "okay";
+				vmmc = <&reg_3p3v>;
+				wp-inverted;
+			};
+
+			serial@12100 {
+				/* mikrobus uart */
+				pinctrl-0 = <&mikro_uart_pins>;
+				pinctrl-names = "default";
+				status = "okay";
+			};
+
+			spi@10680 {
+				/*
+				 * We don't seem to have the W25Q32 on the
+				 * A1 Rev 2.0 boards, so disable SPI.
+				 * CS0: W25Q32 (doesn't appear to be present)
+				 * CS1:
+				 * CS2: mikrobus
+				 */
+				pinctrl-0 = <&spi1_pins
+					     &clearfog_spi1_cs_pins
+					     &mikro_spi_pins>;
+				pinctrl-names = "default";
+				status = "okay";
+
+				spi-flash@0 {
+					#address-cells = <1>;
+					#size-cells = <0>;
+					compatible = "w25q32", "jedec,spi-nor";
+					reg = <0>; /* Chip select 0 */
+					spi-max-frequency = <3000000>;
+					status = "disabled";
+				};
+			};
+
+			usb@58000 {
+				/* CON3, nearest  power. */
+				status = "okay";
+			};
+
+			usb3@f0000 {
+				/* CON2, nearest CPU, USB2 only. */
+				status = "okay";
+			};
+
+			usb3@f8000 {
+				/* CON7 */
+				status = "okay";
+			};
+		};
+
+		pcie-controller {
+			status = "okay";
+			/*
+			 * The two PCIe units are accessible through
+			 * the mini-PCIe connectors on the board.
+			 */
+			pcie@2,0 {
+				/* Port 1, Lane 0. CON3, nearest power. */
+				reset-gpios = <&expander0 1 GPIO_ACTIVE_LOW>;
+				status = "okay";
+			};
+			pcie@3,0 {
+				/* Port 2, Lane 0. CON2, nearest CPU. */
+				reset-gpios = <&expander0 2 GPIO_ACTIVE_LOW>;
+				status = "okay";
+			};
+		};
+	};
+
+	dsa@0 {
+		compatible = "marvell,dsa";
+		dsa,ethernet = <&eth1>;
+		dsa,mii-bus = <&mdio>;
+		pinctrl-0 = <&clearfog_dsa0_clk_pins &clearfog_dsa0_pins>;
+		pinctrl-names = "default";
+		#address-cells = <2>;
+		#size-cells = <0>;
+
+		switch@0 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			reg = <4 0>;
+
+			port@0 {
+				reg = <0>;
+				label = "lan1";
+			};
+
+			port@1 {
+				reg = <1>;
+				label = "lan2";
+			};
+
+			port@2 {
+				reg = <2>;
+				label = "lan3";
+			};
+
+			port@3 {
+				reg = <3>;
+				label = "lan4";
+			};
+
+			port@4 {
+				reg = <4>;
+				label = "lan5";
+			};
+
+			port@5 {
+				reg = <5>;
+				label = "cpu";
+			};
+
+			port@6 {
+				/* 88E1512 external phy */
+				reg = <6>;
+				label = "lan6";
+				fixed-link {
+					speed = <1000>;
+					full-duplex;
+				};
+			};
+		};
+	};
+
+	gpio-keys {
+		compatible = "gpio-keys";
+		pinctrl-0 = <&rear_button_pins>;
+		pinctrl-names = "default";
+
+		button_0 {
+			/* The rear SW3 button */
+			label = "Rear Button";
+			gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
+			linux,can-disable;
+			linux,code = <BTN_0>;
+		};
+	};
+};
diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-388.dtsi b/target/linux/mvebu/files/arch/arm/boot/dts/armada-388.dtsi
new file mode 100644
index 0000000000000000000000000000000000000000..564fa5937e258f96a0cdfb82b3eed94877e07879
--- /dev/null
+++ b/target/linux/mvebu/files/arch/arm/boot/dts/armada-388.dtsi
@@ -0,0 +1,70 @@
+/*
+ * Device Tree Include file for Marvell Armada 388 SoC.
+ *
+ * Copyright (C) 2015 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is licensed under the terms of the GNU General Public
+ *     License version 2.  This program is licensed "as is" without
+ *     any warranty of any kind, whether express or implied.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *
+ * The main difference with the Armada 385 is that the 388 can handle two more
+ * SATA ports. So we can reuse the dtsi of the Armada 385, override the pinctrl
+ * property and the name of the SoC, and add the second SATA host which control
+ * the 2 other ports.
+ */
+
+#include "armada-385.dtsi"
+
+/ {
+	model = "Marvell Armada 388 family SoC";
+	compatible = "marvell,armada388", "marvell,armada385",
+		"marvell,armada380";
+
+	soc {
+		internal-regs {
+			pinctrl@18000 {
+				compatible = "marvell,mv88f6828-pinctrl";
+			};
+
+			sata@e0000 {
+				compatible = "marvell,armada-380-ahci";
+				reg = <0xe0000 0x2000>;
+				interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+				clocks = <&gateclk 30>;
+				status = "disabled";
+			};
+
+		};
+	};
+};
diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-38x-solidrun-microsom.dtsi b/target/linux/mvebu/files/arch/arm/boot/dts/armada-38x-solidrun-microsom.dtsi
new file mode 100644
index 0000000000000000000000000000000000000000..3f792a563c0598cbc308539b1e3ada08677ffc4e
--- /dev/null
+++ b/target/linux/mvebu/files/arch/arm/boot/dts/armada-38x-solidrun-microsom.dtsi
@@ -0,0 +1,115 @@
+/*
+ * Device Tree file for SolidRun Armada 38x Microsom
+ *
+ *  Copyright (C) 2015 Russell King
+ *
+ * This board is in development; the contents of this file work with
+ * the A1 rev 2.0 of the board, which does not represent final
+ * production board.  Things will change, don't expect this file to
+ * remain compatible info the future.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License
+ *     version 2 as published by the Free Software Foundation.
+ *
+ *     This file is distributed in the hope that it will be useful
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+	memory {
+		device_type = "memory";
+		reg = <0x00000000 0x10000000>; /* 256 MB */
+	};
+
+	soc {
+		ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
+			  MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
+			  MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
+			  MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000>;
+
+		internal-regs {
+			ethernet@70000 {
+				pinctrl-0 = <&ge0_rgmii_pins>;
+				pinctrl-names = "default";
+				phy = <&phy_dedicated>;
+				phy-mode = "rgmii-id";
+				status = "okay";
+			};
+
+			mdio@72004 {
+				/*
+				 * Add the phy clock here, so the phy can be
+				 * accessed to read its IDs prior to binding
+				 * with the driver.
+				 */
+				pinctrl-0 = <&mdio_pins &microsom_phy_clk_pins>;
+				pinctrl-names = "default";
+
+				phy_dedicated: ethernet-phy@0 {
+					/*
+					 * Annoyingly, the marvell phy driver
+					 * configures the LED register, rather
+					 * than preserving reset-loaded setting.
+					 * We undo that rubbish here.
+					 */
+					marvell,reg-init = <3 16 0 0x101e>;
+					reg = <0>;
+				};
+			};
+
+			pinctrl@18000 {
+				microsom_phy_clk_pins: microsom-phy-clk-pins {
+					marvell,pins = "mpp45";
+					marvell,function = "ref";
+				};
+			};
+
+			rtc@a3800 {
+				/*
+				 * If the rtc doesn't work, run "date reset"
+				 * twice in u-boot.
+				 */
+				status = "okay";
+			};
+
+			serial@12000 {
+				pinctrl-0 = <&uart0_pins>;
+				pinctrl-names = "default";
+				status = "okay";
+			};
+		};
+	};
+};
diff --git a/target/linux/mvebu/image/Makefile b/target/linux/mvebu/image/Makefile
index 6e1c2b22bc8db7a473b3fbcb70d2b332a66351a9..4bf51e56b8db5f8c6a9c8aa12a6c15f0801d6cba 100644
--- a/target/linux/mvebu/image/Makefile
+++ b/target/linux/mvebu/image/Makefile
@@ -99,6 +99,26 @@ define NORProfile
   PROFILES_LIST += $(1)
 endef
 
+# $(1): Profile Name
+# $(2): DTB Name
+define MMCProfile
+  define Image/BuildKernel/Profile/$(1)
+	$(call Image/Build/DTB,$(2))
+	cp $(KDIR)/zImage-$(2) $(BIN_DIR)/zImage-$(1);
+	cp $(DTS_DIR)/$(2).dtb $(BIN_DIR)/$(1).dtb;
+    ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
+	$(call Image/Build/Profile,$(1)/Initramfs)
+    endif
+  endef
+
+  define Image/Build/Profile/$(1)/Initramfs
+	$(call Image/Build/DTB,$(2),-initramfs)
+	cp $(KDIR)/uImage-initramfs-$(2) $(BIN_DIR)/$(IMG_PREFIX)-$(2)-initramfs
+  endef
+
+  PROFILES_LIST += $(1)
+endef
+
 # $(1): Profile Name
 # $(2): Sub Profiles list
 define MultiProfile
@@ -143,6 +163,8 @@ $(eval $(call UBINORProfile,OpenBlocks-AX-3-4,armada-xp-openblocks-ax3-4,128KiB)
 # Boards with small NOR, where UBI doesn't make sense
 $(eval $(call NORProfile,385-RD,armada-385-rd,256KiB))
 
+$(eval $(call MMCProfile,Solidrun-Clearfog-A1,armada-388-clearfog))
+
 ###
 ### Linksys
 ###
diff --git a/target/linux/mvebu/patches-3.18/209-solidrun_clearfog.patch b/target/linux/mvebu/patches-3.18/209-solidrun_clearfog.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ff6c2179bcd94b5a949e7e9420f12df3cfe0ef88
--- /dev/null
+++ b/target/linux/mvebu/patches-3.18/209-solidrun_clearfog.patch
@@ -0,0 +1,10 @@
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -504,6 +504,7 @@ dtb-$(CONFIG_MACH_ARMADA_38X) += \
+ 	armada-385-linksys-caiman.dtb \
+ 	armada-385-linksys-cobra.dtb \
+ 	armada-385-linksys-shelby.dtb \
++	armada-388-clearfog.dtb \
+ 	armada-385-rd.dtb
+ dtb-$(CONFIG_MACH_ARMADA_XP) += \
+ 	armada-xp-axpwifiap.dtb \
diff --git a/target/linux/mvebu/profiles/solidrun.mk b/target/linux/mvebu/profiles/solidrun.mk
new file mode 100644
index 0000000000000000000000000000000000000000..5aa61e28a27175bf79f49b9ebb84c64357be9fcd
--- /dev/null
+++ b/target/linux/mvebu/profiles/solidrun.mk
@@ -0,0 +1,21 @@
+#
+# Copyright (C) 2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/Solidrun-Clearfog-A1
+  NAME:=SolidRun ClearFog A1 board
+  PACKAGES:= \
+	kmod-usb3 kmod-usb2 kmod-usb-storage \
+	kmod-of-i2c kmod-i2c-core kmod-i2c-mv64xxx \
+	kmod-ata-core kmod-ata-marvell-sata \
+	kmod-thermal-armada kmod-rtc-marvell
+endef
+
+define Profile/Solidrun-Clearfog-A1/Description
+ Package set compatible with the SolidRun ClearFog A1 board
+endef
+
+$(eval $(call Profile,Solidrun-Clearfog-A1))
diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds
index 5946f98bdb1251b5b25cfbc64a4ed97880615bb8..5327d006299ed94c645542f687e20962c83e842d 100755
--- a/target/linux/ramips/base-files/etc/board.d/01_leds
+++ b/target/linux/ramips/base-files/etc/board.d/01_leds
@@ -114,6 +114,10 @@ case $board in
 	esr-9753)
 		set_wifi_led "rt2800pci-phy0::radio"
 		;;
+	ex2700)
+		ucidef_set_led_default "power_r" "POWER (red)" "ex2700:red:power" "0"
+		set_wifi_led "ex2700:green:router"
+		;;
 	f5d8235-v1)
 		set_usb_led "f5d8235-v1:blue:storage"
 		;;
diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network
index d7d016befe19e95095d753218989a4e29b8fdad0..a78912dbc9b5ecdc8a9fb0c583c1e47fdb579015 100755
--- a/target/linux/ramips/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/base-files/etc/board.d/02_network
@@ -113,7 +113,8 @@ ramips_setup_interfaces()
 		ucidef_add_switch_vlan "switch0" "1" "1 2 3 4 6t"
 		;;
 
-	cf-wr800n)
+	cf-wr800n|\
+	ex2700)
 		ucidef_set_interface_lan "eth0.1"
 		ucidef_add_switch "switch0" "1" "1"
 		ucidef_add_switch_vlan "switch0" "1" "4 6t"
diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh
index a7e2501e09fee933f81aafb01034e687883d59b2..6474ebdde354b51648fcafd426e3256f0b6fe8b4 100644
--- a/target/linux/ramips/base-files/etc/diag.sh
+++ b/target/linux/ramips/base-files/etc/diag.sh
@@ -63,6 +63,9 @@ get_status_led() {
 	esr-9753)
 		status_led="esr-9753:orange:power"
 		;;
+	ex2700)
+		status_led="ex2700:red:power"
+		;;
 	f5d8235-v2)
 		status_led="f5d8235v2:blue:router"
 		;;
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index 4141ddd68b034211188a7d0deac02116107c991f..8dc05b060c8be19bf94101f5d3061acc436d8a91 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -223,6 +223,9 @@ ramips_board_detect() {
 	*"Netgear WNCE2001")
 		name="wnce2001"
 		;;
+	*"Netgear EX2700")
+		name="ex2700"
+		;;
 	*"NexAira BC2")
 		name="bc2"
 		;;
diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
index 2f64d8c0c4863b03d15493f52777239f6972977c..a3d0175dcfe49ee5c4775ba5ec4db24638f0c203 100755
--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
@@ -49,6 +49,7 @@ platform_check_image() {
 	dir-620-d1 | \
 	dir-810l | \
 	e1700 | \
+	ex2700 |\
 	esr-9753 | \
 	f7c027 | \
 	fonera20n | \
diff --git a/target/linux/ramips/dts/EX2700.dts b/target/linux/ramips/dts/EX2700.dts
new file mode 100644
index 0000000000000000000000000000000000000000..da98bd8ef1a0cce7f71a52ca72b28117830c2847
--- /dev/null
+++ b/target/linux/ramips/dts/EX2700.dts
@@ -0,0 +1,148 @@
+/*
+ * Device Tree file for the Netgear EX2700
+ *
+ * Copyright (C) 2016 Joseph C. Lehner <joseph.c.lehner@gmail.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+/dts-v1/;
+
+/include/ "mt7620a.dtsi"
+
+/ {
+	compatible = "ralink,mt7620a-soc";
+	model = "Netgear EX2700";
+
+	chosen {
+		bootargs = "console=ttyS0,57600";
+	};
+
+	palmbus@10000000 {
+
+		gpio0: gpio@600 {
+			status = "okay";
+		};
+
+		gpio1: gpio@638 {
+			status = "okay";
+		};
+
+		spi@b00 {
+			status = "okay";
+
+			m25p80@0 {
+				#address-cells = <1>;
+				#size-cells = <1>;
+				compatible = "mx25l3205d";
+				reg = <0 0>;
+				linux,modalias = "m25p80", "mx25l3205d";
+				spi-max-frequency = <10000000>;
+
+				partition@0 {
+					label = "u-boot";
+					reg = <0x0 0x30000>;
+					read-only;
+				};
+
+				partition@30000 {
+					label = "u-boot-env";
+					reg = <0x30000 0x10000>;
+					read-only;
+				};
+
+				partition@40000 {
+					label = "firmware";
+					reg = <0x40000 0x3b0000>;
+				};
+
+				art: partition@3f0000 {
+					label = "art";
+					reg = <0x3f0000 0x10000>;
+					read-only;
+				};
+			};
+		};
+	};
+
+	ethernet@10100000 {
+		mtd-mac-address = <&art 0x0>;
+	};
+
+	wmac@10180000 {
+		ralink,mtd-eeprom = <&art 0x1000>;
+	};
+
+	pinctrl {
+		state_default: pinctrl0 {
+			default {
+				//  spi refclk: pins 37, 38, 39
+				//       uartf: pins 8, 9, 10, 11, 12, 13, 14
+				//         i2c: pins 1, 2
+				ralink,group = "i2c", "uartf", "spi refclk";
+				ralink,function = "gpio";
+			};
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		power_g {
+			label = "ex2700:green:power";
+			gpios = <&gpio0 9 1>;
+			default-state = "on";
+		};
+
+		power_r {
+			label = "ex2700:red:power";
+			gpios = <&gpio0 11 1>;
+		};
+
+		device_g {
+			label = "ex2700:green:device";
+			gpios = <&gpio0 13 1>;
+		};
+
+		device_r {
+			label = "ex2700:red:device";
+			gpios = <&gpio0 10 1>;
+		};
+
+		router_g {
+			label = "ex2700:green:router";
+			gpios = <&gpio0 12 1>;
+		};
+
+		router_r {
+			label = "ex2700:red:router";
+			gpios = <&gpio0 14 1>;
+		};
+
+		wps {
+			label = "ex2700:green:wps";
+			gpios = <&gpio1 15 1>;
+		};
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 1 1>;
+			linux,code = <0x198>;
+		};
+
+		wps {
+			label = "wps";
+			gpios = <&gpio0 2 1>;
+			linux,code = <0x211>;
+		};
+	};
+};
diff --git a/target/linux/ramips/dts/mt7628an.dtsi b/target/linux/ramips/dts/mt7628an.dtsi
index bd8ccdb3e21a1aa1ac4ab2df68fe9202aa492d44..dde572bf9db973cd36dfa2d48234564d563105b7 100644
--- a/target/linux/ramips/dts/mt7628an.dtsi
+++ b/target/linux/ramips/dts/mt7628an.dtsi
@@ -337,12 +337,13 @@
 		#reset-cells = <1>;
 	};
 
-	usbphy: usbphy {
+	usbphy: usbphy@10120000 {
 		compatible = "ralink,mt7628an-usbphy", "ralink,mt7620a-usbphy";
+		reg = <0x10120000 1000>;
 		#phy-cells = <1>;
 
-		resets = <&rstctrl 22>;
-		reset-names = "host";
+		resets = <&rstctrl 22 &rstctrl 25>;
+		reset-names = "host", "device";
 	};
 
 	sdhci@10130000 {
diff --git a/target/linux/ramips/dts/rt3352.dtsi b/target/linux/ramips/dts/rt3352.dtsi
index 7dffddb8698ea6cba3de6583103b5520ff1c3dfa..dacb047a122e8743f315ac0ca584ebb5a36f23ba 100644
--- a/target/linux/ramips/dts/rt3352.dtsi
+++ b/target/linux/ramips/dts/rt3352.dtsi
@@ -222,8 +222,9 @@
 		interrupts = <17>;
 	};
 
-	usbphy {
+	usbphy: usbphy {
 		compatible = "ralink,rt3xxx-usbphy";
+		#phy-cells = <1>;
 
 		resets = <&rstctrl 22 &rstctrl 25>;
 		reset-names = "host", "device";
@@ -243,6 +244,9 @@
 		compatible = "ralink,rt3xxx-ehci", "ehci-platform";
 		reg = <0x101c0000 0x1000>;
 
+		phys = <&usbphy 1>;
+		phy-names = "usb";
+
 		interrupt-parent = <&intc>;
 		interrupts = <18>;
 
@@ -253,6 +257,9 @@
 		compatible = "ralink,rt3xxx-ohci", "ohci-platform";
 		reg = <0x101c1000 0x1000>;
 
+		phys = <&usbphy 1>;
+		phy-names = "usb";
+
 		interrupt-parent = <&intc>;
 		interrupts = <18>;
 
diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile
index 0dd46ca19c692c50d53951efce73b8306218daa4..c4f4028cb93de83231ae5746d11dfb8bef21ea07 100644
--- a/target/linux/ramips/image/Makefile
+++ b/target/linux/ramips/image/Makefile
@@ -546,7 +546,7 @@ define BuildFirmware/HLKRM04/initramfs
 	$(call BuildFirmware/OF/initramfs,$(1),$(2),$(3),$(4))
 	mkhilinkfw -e -i$(call imgname,$(1),$(2))-uImage.bin -o $(call imgname,$(1),$(2))-factory.bin;
 endef
-Image/Build/Profile/HLKRM04=$(call BuildFirmware/HLKRM04/$(1),$(1),hlk-rm04,HLKRM04,HLK-RM02)
+Image/Build/Profile/HLKRM04=$(call BuildFirmware/HLKRM04/$(1),$(1),hlk-rm04,HLKRM04,HLK-RM04)
 
 Image/Build/Profile/HT-TM02=$(call BuildFirmware/Default8M/$(1),$(1),ht-tm02,HT-TM02)
 
@@ -854,7 +854,34 @@ endif
 # MT7620A Profiles
 #
 
+# $(1): (ignored)
+# $(2): lowercase board name
+# $(3): uppercase board name (must match DTS filename w/o extension)
+# $(4): erase block size
+# $(5): hardware id for mkdniimg
+# $(6): maximum image size
+define BuildFirmware/Netgear/squashfs
+	$(call PatchKernelLzmaDtb,$(2),$(3))
+	# Pad kernel to eraseblock boundary, minus 2 uImage headers (=128 bytes):
+	# bs = (eraseblock * (1 + (128 + kernelsize)/eraseblock)) - 128
+	dd if=$(KDIR)/vmlinux-$(2).bin.lzma \
+		of=$(KDIR)/vmlinux-$(2).bin.lzma.tmp \
+		bs=`expr \( $(4) \* \( 1 + \( 128 + \`wc -c < $(KDIR)/vmlinux-$(2).bin.lzma\` \) / $(4) \) \) - 128` \
+		count=1 conv=sync
+
+	$(call MkImage,lzma,$(KDIR)/vmlinux-$(2).bin.lzma.tmp,$(KDIR)/vmlinux-$(2).uImage)
+	cat ex2700-fakeroot.uImage >> $(KDIR)/vmlinux-$(2).uImage
+	$(call MkImageSysupgrade/squashfs,squashfs,$(2),$(6))
+
+	$(STAGING_DIR_HOST)/bin/mkdniimg \
+		-B $(3) -H $(5) -v OpenWrt \
+		-i $(call imgname,squashfs,$(2))-sysupgrade.bin \
+		-o $(call imgname,squashfs,$(2))-factory.bin
+endef
+
 Image/Build/Profile/E1700=$(call BuildFirmware/UMedia/$(1),$(1),e1700,E1700,0x013326)
+ex2700_mtd_size=3866624
+Image/Build/Profile/EX2700=$(call BuildFirmware/Netgear/$(1),$(1),ex2700,EX2700,65536,29764623+4+0+32+2x2+0,$(ex2700_mtd_size))
 Image/Build/Profile/MT7620a=$(call BuildFirmware/Default8M/$(1),$(1),mt7620a,MT7620a)
 Image/Build/Profile/MT7620a_MT7610e=$(call BuildFirmware/Default8M/$(1),$(1),mt7620a_mt7610e,MT7620a_MT7610e)
 Image/Build/Profile/MT7620a_MT7530=$(call BuildFirmware/Default8M/$(1),$(1),mt7620a_mt7530,MT7620a_MT7530)
@@ -893,6 +920,7 @@ Image/Build/Profile/MicroWRT=$(call BuildFirmware/CustomFlash/$(1),$(1),microwrt
 ifeq ($(SUBTARGET),mt7620)
 define Image/Build/Profile/Default
 	$(call Image/Build/Profile/E1700,$(1))
+	$(call Image/Build/Profile/EX2700,$(1))
 	$(call Image/Build/Profile/MT7620a,$(1))
 	$(call Image/Build/Profile/MT7620a_MT7610e,$(1))
 	$(call Image/Build/Profile/MT7620a_MT7530,$(1))
diff --git a/target/linux/ramips/image/ex2700-fakeroot.uImage b/target/linux/ramips/image/ex2700-fakeroot.uImage
new file mode 100644
index 0000000000000000000000000000000000000000..340f736141e84e425fe66b372eef80b217146df5
Binary files /dev/null and b/target/linux/ramips/image/ex2700-fakeroot.uImage differ
diff --git a/target/linux/ramips/mt7620/profiles/netgear.mk b/target/linux/ramips/mt7620/profiles/netgear.mk
new file mode 100644
index 0000000000000000000000000000000000000000..c40f7c9f68b8a54d7455757e3a413cc3a84a6505
--- /dev/null
+++ b/target/linux/ramips/mt7620/profiles/netgear.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2016 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/EX2700
+	NAME:=Netgear EX2700
+	PACKAGES:=-kmod-usb-core -kmod-usb2 -kmod-usb-ohci -kmod-ledtrig-usbdev \
+		-kmod-mt76
+endef
+
+define Profile/EX2700/Description
+	Support for Netgear EX2700
+endef
+$(eval $(call Profile,EX2700))
diff --git a/target/linux/ramips/patches-3.18/0037-USB-phy-add-ralink-SoC-driver.patch b/target/linux/ramips/patches-3.18/0037-USB-phy-add-ralink-SoC-driver.patch
index 2448d0ab3130b4e05f5f4917a124cf7ed13cc2bd..4dc5a7528b0413ff3f33eb797e9c8a19fb844c5d 100644
--- a/target/linux/ramips/patches-3.18/0037-USB-phy-add-ralink-SoC-driver.patch
+++ b/target/linux/ramips/patches-3.18/0037-USB-phy-add-ralink-SoC-driver.patch
@@ -21,11 +21,11 @@
 +obj-$(CONFIG_PHY_RALINK_USB)		+= phy-ralink-usb.o
 --- /dev/null
 +++ b/drivers/phy/phy-ralink-usb.c
-@@ -0,0 +1,175 @@
+@@ -0,0 +1,228 @@
 +/*
 + * Allwinner ralink USB phy driver
 + *
-+ * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
++ * Copyright (C) 2016 John Crispin <blogic@openwrt.org>
 + *
 + * Based on code from
 + * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
@@ -58,6 +58,20 @@
 +#define RT_SYSC_REG_CLKCFG1		0x030
 +#define RT_SYSC_REG_USB_PHY_CFG		0x05c
 +
++#define OFS_U2_PHY_AC0                  0x00
++#define OFS_U2_PHY_AC1                  0x04
++#define OFS_U2_PHY_AC2                  0x08
++#define OFS_U2_PHY_ACR0                 0x10
++#define OFS_U2_PHY_ACR1                 0x14
++#define OFS_U2_PHY_ACR2                 0x18
++#define OFS_U2_PHY_ACR3                 0x1C
++#define OFS_U2_PHY_ACR4                 0x20
++#define OFS_U2_PHY_AMON0                0x24
++#define OFS_U2_PHY_DCR0                 0x60
++#define OFS_U2_PHY_DCR1                 0x64
++#define OFS_U2_PHY_DTM0                 0x68
++#define OFS_U2_PHY_DTM1                 0x6C
++
 +#define RT_RSTCTRL_UDEV			BIT(25)
 +#define RT_RSTCTRL_UHST			BIT(22)
 +#define RT_SYSCFG1_USB0_HOST_MODE	BIT(10)
@@ -70,117 +84,156 @@
 +#define USB_PHY_UTMI_8B60M		BIT(1)
 +#define UDEV_WAKEUP			BIT(0)
 +
-+static atomic_t usb_pwr_ref = ATOMIC_INIT(0);
-+static struct reset_control *rstdev;
-+static struct reset_control *rsthost;
-+static u32 phy_clk;
-+static struct phy *rt_phy;
++struct ralink_usb_phy {
++	struct reset_control	*rstdev;
++	struct reset_control	*rsthost;
++	u32			clk;
++	struct phy		*phy;
++	void __iomem		*base;
++};
 +
-+static void usb_phy_enable(int state)
++static void u2_phy_w32(struct ralink_usb_phy *phy, u32 val, u32 reg)
 +{
-+	if (state)
-+		rt_sysc_m32(0, phy_clk, RT_SYSC_REG_CLKCFG1);
-+	else
-+		rt_sysc_m32(phy_clk, 0, RT_SYSC_REG_CLKCFG1);
-+	mdelay(100);
++	iowrite32(val, phy->base + reg);
 +}
 +
-+static int ralink_usb_phy_init(struct phy *_phy)
++static u32 u2_phy_r32(struct ralink_usb_phy *phy, u32 reg)
 +{
-+	return 0;
++	return ioread32(phy->base + reg);
 +}
 +
-+static int ralink_usb_phy_exit(struct phy *_phy)
++static void
++u2_phy_init(struct ralink_usb_phy *phy)
 +{
-+	return 0;
++	u2_phy_r32(phy, OFS_U2_PHY_AC2);
++	u2_phy_r32(phy, OFS_U2_PHY_ACR0);
++	u2_phy_r32(phy, OFS_U2_PHY_DCR0);
++
++	u2_phy_w32(phy, 0x00ffff02, OFS_U2_PHY_DCR0);
++	u2_phy_r32(phy, OFS_U2_PHY_DCR0);
++	u2_phy_w32(phy, 0x00555502, OFS_U2_PHY_DCR0);
++	u2_phy_r32(phy, OFS_U2_PHY_DCR0);
++	u2_phy_w32(phy, 0x00aaaa02, OFS_U2_PHY_DCR0);
++	u2_phy_r32(phy, OFS_U2_PHY_DCR0);
++	u2_phy_w32(phy, 0x00000402, OFS_U2_PHY_DCR0);
++	u2_phy_r32(phy, OFS_U2_PHY_DCR0);
++	u2_phy_w32(phy, 0x0048086a, OFS_U2_PHY_AC0);
++	u2_phy_w32(phy, 0x4400001c, OFS_U2_PHY_AC1);
++	u2_phy_w32(phy, 0xc0200000, OFS_U2_PHY_ACR3);
++	u2_phy_w32(phy, 0x02000000, OFS_U2_PHY_DTM0);
 +}
 +
 +static int ralink_usb_phy_power_on(struct phy *_phy)
 +{
-+	if (atomic_inc_return(&usb_pwr_ref) == 1) {
-+		int host = 1;
-+		u32 t;
-+
-+		usb_phy_enable(1);
-+
-+		if (host) {
-+			rt_sysc_m32(0, RT_SYSCFG1_USB0_HOST_MODE, RT_SYSC_REG_SYSCFG1);
-+			if (!IS_ERR(rsthost))
-+				reset_control_deassert(rsthost);
-+			if (!IS_ERR(rstdev))
-+				reset_control_deassert(rstdev);
-+		} else {
-+			rt_sysc_m32(RT_SYSCFG1_USB0_HOST_MODE, 0, RT_SYSC_REG_SYSCFG1);
-+			if (!IS_ERR(rstdev))
-+				reset_control_deassert(rstdev);
-+		}
-+		mdelay(100);
-+
-+		t = rt_sysc_r32(RT_SYSC_REG_USB_PHY_CFG);
-+		dev_info(&_phy->dev, "remote usb device wakeup %s\n",
-+			(t & UDEV_WAKEUP) ? ("enabbled") : ("disabled"));
-+		if (t & USB_PHY_UTMI_8B60M)
-+			dev_info(&_phy->dev, "UTMI 8bit 60MHz\n");
-+		else
-+			dev_info(&_phy->dev, "UTMI 16bit 30MHz\n");
-+	}
++	struct ralink_usb_phy *phy = phy_get_drvdata(_phy);
++	u32 t;
++
++	/* enable the phy */
++	rt_sysc_m32(0, phy->clk, RT_SYSC_REG_CLKCFG1);
++
++	/* setup host mode */
++	rt_sysc_m32(0, RT_SYSCFG1_USB0_HOST_MODE, RT_SYSC_REG_SYSCFG1);
++
++	/* deassert the reset lines */
++	reset_control_deassert(phy->rsthost);
++	reset_control_deassert(phy->rstdev);
++
++	/*
++	 * The SDK kernel had a delay of 100ms. however on device
++	 * testing showed that 10ms is enough
++	 */
++	mdelay(10);
++
++	if (!IS_ERR(phy->base))
++		u2_phy_init(phy);
++
++	/* print some status info */
++	t = rt_sysc_r32(RT_SYSC_REG_USB_PHY_CFG);
++	dev_info(&phy->phy->dev, "remote usb device wakeup %s\n",
++		(t & UDEV_WAKEUP) ? ("enabled") : ("disabled"));
++	if (t & USB_PHY_UTMI_8B60M)
++		dev_info(&phy->phy->dev, "UTMI 8bit 60MHz\n");
++	else
++		dev_info(&phy->phy->dev, "UTMI 16bit 30MHz\n");
 +
 +	return 0;
 +}
 +
 +static int ralink_usb_phy_power_off(struct phy *_phy)
 +{
-+	if (atomic_dec_return(&usb_pwr_ref) == 0) {
-+		usb_phy_enable(0);
-+		if (!IS_ERR(rstdev))
-+			reset_control_assert(rstdev);
-+		if (!IS_ERR(rsthost))
-+			reset_control_assert(rsthost);
-+	}
++	struct ralink_usb_phy *phy = phy_get_drvdata(_phy);
++
++	/* assert the reset lines */
++	reset_control_assert(phy->rstdev);
++	reset_control_assert(phy->rsthost);
++
++	/* disable the phy */
++	rt_sysc_m32(phy->clk, 0, RT_SYSC_REG_CLKCFG1);
 +
 +	return 0;
 +}
 +
 +static struct phy_ops ralink_usb_phy_ops = {
-+	.init		= ralink_usb_phy_init,
-+	.exit		= ralink_usb_phy_exit,
 +	.power_on	= ralink_usb_phy_power_on,
 +	.power_off	= ralink_usb_phy_power_off,
 +	.owner		= THIS_MODULE,
 +};
 +
-+static struct phy *ralink_usb_phy_xlate(struct device *dev,
-+					struct of_phandle_args *args)
-+{
-+	return rt_phy;
-+}
-+
 +static const struct of_device_id ralink_usb_phy_of_match[] = {
-+	{ .compatible = "ralink,rt3xxx-usbphy", .data = (void *) (RT_CLKCFG1_UPHY1_CLK_EN | RT_CLKCFG1_UPHY0_CLK_EN) },
-+	{ .compatible = "ralink,mt7620a-usbphy", .data = (void *) (MT7620_CLKCFG1_UPHY1_CLK_EN | MT7620_CLKCFG1_UPHY0_CLK_EN) },
++	{
++		.compatible = "ralink,rt3xxx-usbphy",
++		.data = (void *) (RT_CLKCFG1_UPHY1_CLK_EN |
++				  RT_CLKCFG1_UPHY0_CLK_EN)
++	},
++	{
++		.compatible = "ralink,mt7620a-usbphy",
++		.data = (void *) (MT7620_CLKCFG1_UPHY1_CLK_EN |
++				  MT7620_CLKCFG1_UPHY0_CLK_EN) },
 +	{ },
 +};
 +MODULE_DEVICE_TABLE(of, ralink_usb_phy_of_match);
 +
 +static int ralink_usb_phy_probe(struct platform_device *pdev)
 +{
++	struct resource *res;
 +	struct device *dev = &pdev->dev;
 +	struct phy_provider *phy_provider;
 +	const struct of_device_id *match;
++	struct ralink_usb_phy *phy;
++
++	phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
++	if (!phy)
++		return -ENOMEM;
 +
 +	match = of_match_device(ralink_usb_phy_of_match, &pdev->dev);
-+	phy_clk = (int) match->data;
++	if (!match)
++		return -ENODEV;
++
++	phy->clk = (int) match->data;
 +
-+	rsthost = devm_reset_control_get(&pdev->dev, "host");
-+	rstdev = devm_reset_control_get(&pdev->dev, "device");
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	phy->base = devm_ioremap_resource(&pdev->dev, res);
++
++	phy->rsthost = devm_reset_control_get(&pdev->dev, "host");
++	if (IS_ERR(phy->rsthost)) {
++		dev_err(dev, "host reset is missing\n");
++		return PTR_ERR(phy->rsthost);
++	}
++
++	phy->rstdev = devm_reset_control_get(&pdev->dev, "device");
++	if (IS_ERR(phy->rstdev)) {
++		dev_err(dev, "device reset is missing\n");
++		return PTR_ERR(phy->rstdev);
++	}
 +
-+	rt_phy = devm_phy_create(dev, NULL, &ralink_usb_phy_ops, NULL);
-+	if (IS_ERR(rt_phy)) {
++	phy->phy = devm_phy_create(dev, NULL, &ralink_usb_phy_ops, NULL);
++	if (IS_ERR(phy->phy)) {
 +		dev_err(dev, "failed to create PHY\n");
-+		return PTR_ERR(rt_phy);
++		return PTR_ERR(phy->phy);
 +	}
++	phy_set_drvdata(phy->phy, phy);
 +
-+	phy_provider = devm_of_phy_provider_register(dev, ralink_usb_phy_xlate);
++	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
 +
 +	return PTR_ERR_OR_ZERO(phy_provider);
 +}
diff --git a/target/linux/ramips/patches-3.18/0052-i2c-MIPS-adds-ralink-I2C-driver.patch b/target/linux/ramips/patches-3.18/0052-i2c-MIPS-adds-ralink-I2C-driver.patch
index 5618652dff71acab112638536fc3ac2599021cae..40c61072d1b81df6c6b904ada01fff021af5f18c 100644
--- a/target/linux/ramips/patches-3.18/0052-i2c-MIPS-adds-ralink-I2C-driver.patch
+++ b/target/linux/ramips/patches-3.18/0052-i2c-MIPS-adds-ralink-I2C-driver.patch
@@ -45,7 +45,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +};
 --- a/drivers/i2c/busses/Kconfig
 +++ b/drivers/i2c/busses/Kconfig
-@@ -711,6 +711,10 @@ config I2C_RK3X
+@@ -711,6 +711,10 @@
  	  This driver can also be built as a module. If so, the module will
  	  be called i2c-rk3x.
  
@@ -58,7 +58,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  	help
 --- a/drivers/i2c/busses/Makefile
 +++ b/drivers/i2c/busses/Makefile
-@@ -66,6 +66,7 @@ obj-$(CONFIG_I2C_PNX)		+= i2c-pnx.o
+@@ -66,6 +66,7 @@
  obj-$(CONFIG_I2C_PUV3)		+= i2c-puv3.o
  obj-$(CONFIG_I2C_PXA)		+= i2c-pxa.o
  obj-$(CONFIG_I2C_PXA_PCI)	+= i2c-pxa-pci.o
@@ -68,7 +68,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  obj-$(CONFIG_I2C_RK3X)		+= i2c-rk3x.o
 --- /dev/null
 +++ b/drivers/i2c/busses/i2c-ralink.c
-@@ -0,0 +1,327 @@
+@@ -0,0 +1,308 @@
 +/*
 + * drivers/i2c/busses/i2c-ralink.c
 + *
@@ -113,9 +113,12 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +#define REG_STATUS_REG		0x18
 +#define REG_STARTXFR_REG	0x1C
 +#define REG_BYTECNT_REG		0x20
-+#define REG_SM0CFG2		0x28
-+#define REG_SM0CTL0		0x40
++#define REG_SM0CFG2			0x28
++#define REG_SM0CTL0			0x40
 +
++#define SYSC_REG_RESET_CTRL	0x34
++
++#define I2C_RST			(1<<16)
 +#define I2C_STARTERR		BIT(4)
 +#define I2C_ACKERR		BIT(3)
 +#define I2C_DATARDY		BIT(2)
@@ -125,8 +128,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +#define I2C_DEVADLEN_7		(6 << 2)
 +#define I2C_ADDRDIS		BIT(1)
 +
-+#define CLKDIV_VALUE		200 // clock rate is 40M, 40M / (200*2) = 100k (standard i2c bus rate).
-+//#define CLKDIV_VALUE		50 // clock rate is 40M, 40M / (50*2) = 400k (fast i2c bus rate).
++#define CLKDIV_VALUE		200
 +
 +#define READ_CMD		0x01
 +#define WRITE_CMD		0x00
@@ -138,8 +140,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +#define SM0CTL0_STRETCH		BIT(1)
 +#define SM0CTL0_DEFAULT		(SM0CTL0_OD | SM0CTL0_VTRIG | SM0CTL0_OUTHI | SM0CTL0_STRETCH)
 +
-+/* timeout waiting for I2C devices to respond (clock streching) */
-+#define RT_I2C_TIMEOUT (msecs_to_jiffies(1000))
++#define MAX_SIZE			63
 +
 +enum {
 +	I2C_TYPE_RALINK,
@@ -160,54 +161,50 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +	return ioread32(membase + reg);
 +}
 +
-+static inline int rt_i2c_get_ack(void)
++static void rt_i2c_default_speed(void)
 +{
-+        return (rt_i2c_r32(REG_STATUS_REG) & I2C_ACKERR) ? -EIO : 0;
++	if (hw_type == I2C_TYPE_RALINK) {
++		rt_i2c_w32(CLKDIV_VALUE, REG_CLKDIV_REG);
++	} else {
++		rt_i2c_w32((CLKDIV_VALUE << 16) | SM0CTL0_DEFAULT, REG_SM0CTL0);
++		rt_i2c_w32(1, REG_SM0CFG2);
++	}
++}
++
++static void rt_i2c_init(struct i2c_adapter *a)
++{/*
++	u32 val;
++	
++	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
++	val |= I2C_RST;
++	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
++	
++	val &= ~I2C_RST;
++	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
++*/
++	device_reset(a->dev.parent);
++	
++	udelay(500);
++	rt_i2c_w32(I2C_DEVADLEN_7 | I2C_ADDRDIS, REG_CONFIG_REG);
++	
++	rt_i2c_default_speed();
 +}
 +
 +static inline int rt_i2c_wait_rx_done(void)
 +{
-+	unsigned long timeout;
-+
-+	timeout = jiffies + RT_I2C_TIMEOUT;
-+
-+	do {
-+		if (time_after(jiffies, timeout))
-+			return (-ETIMEDOUT);
-+
-+	} while (!(rt_i2c_r32(REG_STATUS_REG) & I2C_DATARDY));
-+
++	while (!(rt_i2c_r32(REG_STATUS_REG) & I2C_DATARDY));
 +	return 0;
 +}
 +
 +static inline int rt_i2c_wait_idle(void)
 +{
-+	unsigned long timeout;
-+
-+	timeout = jiffies + RT_I2C_TIMEOUT;
-+
-+	do {
-+		if (time_after(jiffies, timeout)) {
-+			printk("i2c-read line busy\n");
-+			return 1;
-+		}
-+	} while (rt_i2c_r32(REG_STATUS_REG) & I2C_BUSY);
-+
++	while (rt_i2c_r32(REG_STATUS_REG) & I2C_BUSY);
 +	return 0;
 +}
 +
 +static inline int rt_i2c_wait_tx_done(void)
 +{
-+	unsigned long timeout;
-+
-+	timeout = jiffies + RT_I2C_TIMEOUT;
-+
-+	do {
-+		if (time_after(jiffies, timeout))
-+			return (-ETIMEDOUT);
-+
-+	} while (!(rt_i2c_r32(REG_STATUS_REG) & I2C_SDOEMPTY));
-+
++	while (!(rt_i2c_r32(REG_STATUS_REG) & I2C_SDOEMPTY));
 +	return 0;
 +}
 +
@@ -215,7 +212,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +{
 +	int i = 0, j = 0, pos = 0;
 +	int nblock = msg->len / READ_BLOCK;
-+        int rem = msg->len % READ_BLOCK;
++	int rem = msg->len % READ_BLOCK;
 +	int ret = 0;
 +
 +	if (msg->flags & I2C_M_TEN) {
@@ -223,48 +220,41 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +		return -EINVAL;
 +	}
 +
++	if (msg->len > MAX_SIZE) {
++		printk("Notice! The FIFO data length is 64 Byte\n");
++		return -EINVAL;
++	}
++
 +	if (msg->flags & I2C_M_RD) {
 +		for (i = 0; i < nblock; i++) {
-+	                if (rt_i2c_wait_idle())
-+				return -ETIMEDOUT;
++			rt_i2c_wait_idle();
 +			rt_i2c_w32(READ_BLOCK - 1, REG_BYTECNT_REG);
 +			rt_i2c_w32(READ_CMD, REG_STARTXFR_REG);
 +			for (j = 0; j < READ_BLOCK; j++) {
-+				if (rt_i2c_wait_rx_done() < 0)
-+					ret = rt_i2c_wait_rx_done();
-+                                if (rt_i2c_get_ack() < 0)
-+					ret = rt_i2c_get_ack();
++				rt_i2c_wait_rx_done();
 +				msg->buf[pos++] = rt_i2c_r32(REG_DATAIN_REG);
 +			}
 +		}
 +
-+		if (rt_i2c_wait_idle())
-+			return -ETIMEDOUT;
++		rt_i2c_wait_idle();
 +		if (rem) {
 +			rt_i2c_w32(rem - 1, REG_BYTECNT_REG);
 +			rt_i2c_w32(READ_CMD, REG_STARTXFR_REG);
 +		}
 +		for (i = 0; i < rem; i++) {
-+			if (rt_i2c_wait_rx_done() < 0)
-+				ret = rt_i2c_wait_rx_done();
-+                        if (rt_i2c_get_ack() < 0)
-+				ret = rt_i2c_get_ack();
-+
++			rt_i2c_wait_rx_done();
 +			msg->buf[pos++] = rt_i2c_r32(REG_DATAIN_REG);
 +		}
 +	} else {
-+		if (rt_i2c_wait_idle())
-+			return -ETIMEDOUT;
++		rt_i2c_wait_idle();
 +		rt_i2c_w32(msg->len - 1, REG_BYTECNT_REG);
 +		for (i = 0; i < msg->len; i++) {
 +			rt_i2c_w32(msg->buf[i], REG_DATAOUT_REG);
-+			rt_i2c_w32(WRITE_CMD, REG_STARTXFR_REG);
-+
-+			if (rt_i2c_wait_tx_done() < 0)
-+				ret = rt_i2c_wait_tx_done();
-+                        if (rt_i2c_get_ack() < 0)
-+				ret = rt_i2c_get_ack();
++			if (i == 0)
++				rt_i2c_w32(WRITE_CMD, REG_STARTXFR_REG);
++			rt_i2c_wait_tx_done();
 +		}
++		//mdelay(2);
 +	}
 +
 +	return ret;
@@ -275,21 +265,10 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +	int i = 0;
 +	int ret = 0;
 +
-+	if (rt_i2c_wait_idle())
-+		return -ETIMEDOUT;
-+
-+	device_reset(a->dev.parent);
-+
 +	rt_i2c_w32(m->addr, REG_DEVADDR_REG);
-+	rt_i2c_w32(I2C_DEVADLEN_7 | I2C_ADDRDIS, REG_CONFIG_REG);
-+	if (hw_type == I2C_TYPE_RALINK) {
-+		rt_i2c_w32(CLKDIV_VALUE, REG_CLKDIV_REG);
-+	} else {
-+		rt_i2c_w32((CLKDIV_VALUE << 16) | SM0CTL0_DEFAULT, REG_SM0CTL0);
-+		rt_i2c_w32(1, REG_SM0CFG2);
-+	}
++	rt_i2c_w32(0, REG_ADDR_REG);
 +
-+	for (i = 0; i < n && !ret; i++) {
++	for (i = 0; ret == 0 && i !=n; i++) {
 +		ret = rt_i2c_handle_msg(a, &m[i]);
 +
 +		if (ret < 0) {
@@ -297,7 +276,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +		}
 +	}
 +
-+	return n;
++	return i;
 +}
 +
 +static u32 rt_i2c_func(struct i2c_adapter *a)
@@ -357,6 +336,8 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +
 +	platform_set_drvdata(pdev, adapter);
 +
++	rt_i2c_init(adapter);
++
 +	dev_info(&pdev->dev, "loaded\n");
 +
 +	return 0;
diff --git a/target/linux/ramips/patches-3.18/0061-SPI-ralink-add-mt7621-SoC-spi-driver.patch b/target/linux/ramips/patches-3.18/0061-SPI-ralink-add-mt7621-SoC-spi-driver.patch
index 5aa119e1df08ba9e34d5ea78ad605c789d68d70d..d52cd2e09dddbcc275fa7f6496674c3f796f5b86 100644
--- a/target/linux/ramips/patches-3.18/0061-SPI-ralink-add-mt7621-SoC-spi-driver.patch
+++ b/target/linux/ramips/patches-3.18/0061-SPI-ralink-add-mt7621-SoC-spi-driver.patch
@@ -1,6 +1,6 @@
 --- a/drivers/spi/Kconfig
 +++ b/drivers/spi/Kconfig
-@@ -439,6 +439,12 @@ config SPI_RT2880
+@@ -439,6 +439,12 @@
  	help
  	  This selects a driver for the Ralink RT288x/RT305x SPI Controller.
  
@@ -15,7 +15,7 @@
  	depends on ARCH_S3C24XX
 --- a/drivers/spi/Makefile
 +++ b/drivers/spi/Makefile
-@@ -46,6 +46,7 @@ obj-$(CONFIG_SPI_LM70_LLP)		+= spi-lm70l
+@@ -46,6 +46,7 @@
  obj-$(CONFIG_SPI_MPC512x_PSC)		+= spi-mpc512x-psc.o
  obj-$(CONFIG_SPI_MPC52xx_PSC)		+= spi-mpc52xx-psc.o
  obj-$(CONFIG_SPI_MPC52xx)		+= spi-mpc52xx.o
@@ -25,7 +25,7 @@
  obj-$(CONFIG_SPI_OC_TINY)		+= spi-oc-tiny.o
 --- /dev/null
 +++ b/drivers/spi/spi-mt7621.c
-@@ -0,0 +1,480 @@
+@@ -0,0 +1,391 @@
 +/*
 + * spi-mt7621.c -- MediaTek MT7621 SPI controller driver
 + *
@@ -113,16 +113,13 @@
 +	iowrite32(val, rs->base + reg);
 +}
 +
-+static void mt7621_spi_reset(struct mt7621_spi *rs, int duplex)
++static void mt7621_spi_reset(struct mt7621_spi *rs)
 +{
 +	u32 master = mt7621_spi_read(rs, MT7621_SPI_MASTER);
 +
 +	master |= 7 << 29;
 +	master |= 1 << 2;
-+	if (duplex)
-+		master |= 1 << 10;
-+	else
-+		master &= ~(1 << 10);
++	master &= ~(1 << 10);
 +
 +	mt7621_spi_write(rs, MT7621_SPI_MASTER, master);
 +}
@@ -133,7 +130,7 @@
 +	int cs = spi->chip_select;
 +	u32 polar = 0;
 +
-+        mt7621_spi_reset(rs, cs);
++        mt7621_spi_reset(rs);
 +	if (enable)
 +		polar = BIT(cs);
 +	mt7621_spi_write(rs, MT7621_SPI_POLAR, polar);
@@ -220,19 +217,20 @@
 +
 +	list_for_each_entry(t, &m->transfers, transfer_list) {
 +		const u8 *buf = t->tx_buf;
++		int rlen = t->len;
 +
 +		if (t->rx_buf)
-+			rx_len += t->len;
++			rx_len += rlen;
 +
 +		if (!buf)
 +			continue;
 +
-+		if (WARN_ON(len + t->len > 36)) {
++		if (WARN_ON(len + rlen > 36)) {
 +			status = -EIO;
 +			goto msg_done;
 +		}
 +
-+		for (i = 0; i < t->len; i++, len++)
++		for (i = 0; i < rlen; i++, len++)
 +			data[len / 4] |= buf[i] << (8 * (len & 3));
 +	}
 +
@@ -291,99 +289,12 @@
 +	return 0;
 +}
 +
-+static int mt7621_spi_transfer_full_duplex(struct spi_master *master,
-+					   struct spi_message *m)
-+{
-+	struct mt7621_spi *rs = spi_master_get_devdata(master);
-+	struct spi_device *spi = m->spi;
-+	unsigned int speed = spi->max_speed_hz;
-+	struct spi_transfer *t = NULL;
-+	int status = 0;
-+	int i, len = 0;
-+	int rx_len = 0;
-+	u32 data[9] = { 0 };
-+	u32 val = 0;
-+
-+	mt7621_spi_wait_till_ready(spi);
-+
-+	list_for_each_entry(t, &m->transfers, transfer_list) {
-+		const u8 *buf = t->tx_buf;
-+
-+		if (t->rx_buf)
-+			rx_len += t->len;
-+
-+		if (!buf)
-+			continue;
-+
-+		if (WARN_ON(len + t->len > 16)) {
-+			status = -EIO;
-+			goto msg_done;
-+		}
-+
-+		for (i = 0; i < t->len; i++, len++)
-+			data[len / 4] |= buf[i] << (8 * (len & 3));
-+		if (speed > t->speed_hz)
-+			speed = t->speed_hz;
-+	}
-+
-+	if (WARN_ON(rx_len > 16)) {
-+		status = -EIO;
-+		goto msg_done;
-+	}
-+
-+	if (mt7621_spi_prepare(spi, speed)) {
-+		status = -EIO;
-+		goto msg_done;
-+	}
-+
-+	for (i = 0; i < len; i += 4)
-+		mt7621_spi_write(rs, MT7621_SPI_DATA0 + i, data[i / 4]);
-+
-+	val |= len * 8;
-+	val |= (rx_len * 8) << 12;
-+	mt7621_spi_write(rs, MT7621_SPI_MOREBUF, val);
-+
-+	mt7621_spi_set_cs(spi, 1);
-+
-+	val = mt7621_spi_read(rs, MT7621_SPI_TRANS);
-+	val |= SPI_CTL_START;
-+	mt7621_spi_write(rs, MT7621_SPI_TRANS, val);
-+
-+	mt7621_spi_wait_till_ready(spi);
-+
-+	mt7621_spi_set_cs(spi, 0);
-+
-+	for (i = 0; i < rx_len; i += 4)
-+		data[i / 4] = mt7621_spi_read(rs, MT7621_SPI_DATA4 + i);
-+
-+	m->actual_length = rx_len;
-+
-+	len = 0;
-+	list_for_each_entry(t, &m->transfers, transfer_list) {
-+		u8 *buf = t->rx_buf;
-+
-+		if (!buf)
-+			continue;
-+
-+		for (i = 0; i < t->len; i++, len++)
-+			buf[i] = data[len / 4] >> (8 * (len & 3));
-+	}
-+
-+msg_done:
-+	m->status = status;
-+	spi_finalize_current_message(master);
-+
-+	return 0;
-+}
-+
 +static int mt7621_spi_transfer_one_message(struct spi_master *master,
 +					   struct spi_message *m)
 +{
 +	struct spi_device *spi = m->spi;
 +	int cs = spi->chip_select;
 +
-+	if (cs)
-+		return mt7621_spi_transfer_full_duplex(master, m);
 +	return mt7621_spi_transfer_half_duplex(master, m);
 +}
 +
@@ -453,7 +364,7 @@
 +
 +	master->setup = mt7621_spi_setup;
 +	master->transfer_one_message = mt7621_spi_transfer_one_message;
-+	master->bits_per_word_mask = SPI_BPW_MASK(8);
++	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 16);
 +	master->dev.of_node = pdev->dev.of_node;
 +	master->num_chipselect = 2;
 +
@@ -470,7 +381,7 @@
 +
 +	device_reset(&pdev->dev);
 +
-+	mt7621_spi_reset(rs, 0);
++	mt7621_spi_reset(rs);
 +
 +	return spi_register_master(master);
 +}
diff --git a/target/linux/ramips/patches-3.18/0062-mt7621-add-ECHI-OCHI-XCHI-support.patch b/target/linux/ramips/patches-3.18/0062-mt7621-add-ECHI-OCHI-XCHI-support.patch
index f407578762b911b4ef24e3c0cbb96fbec4aa8b5d..4df5b3e7e5ea53477cf8eb1c21eb3dd80a1015f2 100644
--- a/target/linux/ramips/patches-3.18/0062-mt7621-add-ECHI-OCHI-XCHI-support.patch
+++ b/target/linux/ramips/patches-3.18/0062-mt7621-add-ECHI-OCHI-XCHI-support.patch
@@ -16,7 +16,7 @@
  		/* EHCI, OHCI */
 --- a/drivers/usb/core/hub.c
 +++ b/drivers/usb/core/hub.c
-@@ -1286,7 +1286,7 @@ static void hub_quiesce(struct usb_hub *
+@@ -1306,7 +1306,7 @@ static void hub_quiesce(struct usb_hub *
  	if (type != HUB_SUSPEND) {
  		/* Disconnect all the children */
  		for (i = 0; i < hdev->maxchild; ++i) {
@@ -5087,7 +5087,7 @@
  
  	return 1;
  }
-@@ -2810,6 +2814,7 @@ static int prepare_ring(struct xhci_hcd
+@@ -2820,6 +2824,7 @@ static int prepare_ring(struct xhci_hcd
  		next = ring->enqueue;
  
  		while (last_trb(xhci, ring, ring->enq_seg, next)) {
@@ -5095,7 +5095,7 @@
  			/* If we're not dealing with 0.95 hardware or isoc rings
  			 * on AMD 0.96 host, clear the chain bit.
  			 */
-@@ -2819,6 +2824,9 @@ static int prepare_ring(struct xhci_hcd
+@@ -2829,6 +2834,9 @@ static int prepare_ring(struct xhci_hcd
  				next->link.control &= cpu_to_le32(~TRB_CHAIN);
  			else
  				next->link.control |= cpu_to_le32(TRB_CHAIN);
@@ -5105,7 +5105,7 @@
  
  			wmb();
  			next->link.control ^= cpu_to_le32(TRB_CYCLE);
-@@ -2949,6 +2957,9 @@ static void giveback_first_trb(struct xh
+@@ -2959,6 +2967,9 @@ static void giveback_first_trb(struct xh
  		start_trb->field[3] |= cpu_to_le32(start_cycle);
  	else
  		start_trb->field[3] &= cpu_to_le32(~TRB_CYCLE);
@@ -5115,7 +5115,7 @@
  	xhci_ring_ep_doorbell(xhci, slot_id, ep_index, stream_id);
  }
  
-@@ -3004,6 +3015,29 @@ static u32 xhci_td_remainder(unsigned in
+@@ -3014,6 +3025,29 @@ static u32 xhci_td_remainder(unsigned in
  		return (remainder >> 10) << 17;
  }
  
@@ -5145,7 +5145,7 @@
  /*
   * For xHCI 1.0 host controllers, TD size is the number of max packet sized
   * packets remaining in the TD (*not* including this TRB).
-@@ -3161,6 +3195,7 @@ static int queue_bulk_sg_tx(struct xhci_
+@@ -3171,6 +3205,7 @@ static int queue_bulk_sg_tx(struct xhci_
  		}
  
  		/* Set the TRB length, TD size, and interrupter fields. */
@@ -5153,7 +5153,7 @@
  		if (xhci->hci_version < 0x100) {
  			remainder = xhci_td_remainder(
  					urb->transfer_buffer_length -
-@@ -3170,6 +3205,12 @@ static int queue_bulk_sg_tx(struct xhci_
+@@ -3180,6 +3215,12 @@ static int queue_bulk_sg_tx(struct xhci_
  					trb_buff_len, total_packet_count, urb,
  					num_trbs - 1);
  		}
@@ -5166,7 +5166,7 @@
  		length_field = TRB_LEN(trb_buff_len) |
  			remainder |
  			TRB_INTR_TARGET(0);
-@@ -3234,6 +3275,9 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3244,6 +3285,9 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
  	int running_total, trb_buff_len, ret;
  	unsigned int total_packet_count;
  	u64 addr;
@@ -5176,7 +5176,7 @@
  
  	if (urb->num_sgs)
  		return queue_bulk_sg_tx(xhci, mem_flags, urb, slot_id, ep_index);
-@@ -3258,6 +3302,25 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3268,6 +3312,25 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
  		num_trbs++;
  		running_total += TRB_MAX_BUFF_SIZE;
  	}
@@ -5202,7 +5202,7 @@
  
  	ret = prepare_transfer(xhci, xhci->devs[slot_id],
  			ep_index, urb->stream_id,
-@@ -3334,6 +3397,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3344,6 +3407,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
  			field |= TRB_ISP;
  
  		/* Set the TRB length, TD size, and interrupter fields. */
@@ -5210,7 +5210,7 @@
  		if (xhci->hci_version < 0x100) {
  			remainder = xhci_td_remainder(
  					urb->transfer_buffer_length -
-@@ -3343,6 +3407,10 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3353,6 +3417,10 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
  					trb_buff_len, total_packet_count, urb,
  					num_trbs - 1);
  		}
@@ -5221,7 +5221,7 @@
  		length_field = TRB_LEN(trb_buff_len) |
  			remainder |
  			TRB_INTR_TARGET(0);
-@@ -3432,7 +3500,11 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
+@@ -3442,7 +3510,11 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
  		field |= 0x1;
  
  	/* xHCI 1.0/1.1 6.4.1.2.1: Transfer Type field */
@@ -5233,7 +5233,7 @@
  		if (urb->transfer_buffer_length > 0) {
  			if (setup->bRequestType & USB_DIR_IN)
  				field |= TRB_TX_TYPE(TRB_DATA_IN);
-@@ -3456,7 +3528,12 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
+@@ -3466,7 +3538,12 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
  		field = TRB_TYPE(TRB_DATA);
  
  	length_field = TRB_LEN(urb->transfer_buffer_length) |
@@ -5246,7 +5246,7 @@
  		TRB_INTR_TARGET(0);
  	if (urb->transfer_buffer_length > 0) {
  		if (setup->bRequestType & USB_DIR_IN)
-@@ -3579,6 +3656,9 @@ static int xhci_queue_isoc_tx(struct xhc
+@@ -3589,6 +3666,9 @@ static int xhci_queue_isoc_tx(struct xhc
  	u64 start_addr, addr;
  	int i, j;
  	bool more_trbs_coming;
@@ -5256,7 +5256,7 @@
  
  	ep_ring = xhci->devs[slot_id]->eps[ep_index].ring;
  
-@@ -3592,6 +3672,21 @@ static int xhci_queue_isoc_tx(struct xhc
+@@ -3602,6 +3682,21 @@ static int xhci_queue_isoc_tx(struct xhc
  	start_trb = &ep_ring->enqueue->generic;
  	start_cycle = ep_ring->cycle_state;
  
@@ -5278,7 +5278,7 @@
  	urb_priv = urb->hcpriv;
  	/* Queue the first TRB, even if it's zero-length */
  	for (i = 0; i < num_tds; i++) {
-@@ -3663,9 +3758,13 @@ static int xhci_queue_isoc_tx(struct xhc
+@@ -3673,9 +3768,13 @@ static int xhci_queue_isoc_tx(struct xhc
  			} else {
  				td->last_trb = ep_ring->enqueue;
  				field |= TRB_IOC;
@@ -5292,7 +5292,7 @@
  					/* Set BEI bit except for the last td */
  					if (i < num_tds - 1)
  						field |= TRB_BEI;
-@@ -3680,6 +3779,7 @@ static int xhci_queue_isoc_tx(struct xhc
+@@ -3690,6 +3789,7 @@ static int xhci_queue_isoc_tx(struct xhc
  				trb_buff_len = td_remain_len;
  
  			/* Set the TRB length, TD size, & interrupter fields. */
@@ -5300,7 +5300,7 @@
  			if (xhci->hci_version < 0x100) {
  				remainder = xhci_td_remainder(
  						td_len - running_total);
-@@ -3689,6 +3789,10 @@ static int xhci_queue_isoc_tx(struct xhc
+@@ -3699,6 +3799,10 @@ static int xhci_queue_isoc_tx(struct xhc
  						total_packet_count, urb,
  						(trbs_per_td - j - 1));
  			}
@@ -5413,7 +5413,7 @@
  	xhci_dbg_trace(xhci, trace_xhci_dbg_init,
  			"Finished xhci_run for USB2 roothub");
  	return 0;
-@@ -1648,6 +1689,14 @@ int xhci_drop_endpoint(struct usb_hcd *h
+@@ -1650,6 +1691,14 @@ int xhci_drop_endpoint(struct usb_hcd *h
  	u32 drop_flag;
  	u32 new_add_flags, new_drop_flags;
  	int ret;
@@ -5428,7 +5428,7 @@
  
  	ret = xhci_check_args(hcd, udev, ep, 1, true, __func__);
  	if (ret <= 0)
-@@ -1695,6 +1744,40 @@ int xhci_drop_endpoint(struct usb_hcd *h
+@@ -1697,6 +1746,40 @@ int xhci_drop_endpoint(struct usb_hcd *h
  
  	xhci_endpoint_zero(xhci, xhci->devs[udev->slot_id], ep);
  
@@ -5469,7 +5469,7 @@
  	xhci_dbg(xhci, "drop ep 0x%x, slot id %d, new drop flags = %#x, new add flags = %#x\n",
  			(unsigned int) ep->desc.bEndpointAddress,
  			udev->slot_id,
-@@ -1727,6 +1810,19 @@ int xhci_add_endpoint(struct usb_hcd *hc
+@@ -1729,6 +1812,19 @@ int xhci_add_endpoint(struct usb_hcd *hc
  	u32 new_add_flags, new_drop_flags;
  	struct xhci_virt_device *virt_dev;
  	int ret = 0;
@@ -5489,7 +5489,7 @@
  
  	ret = xhci_check_args(hcd, udev, ep, 1, true, __func__);
  	if (ret <= 0) {
-@@ -1793,6 +1889,56 @@ int xhci_add_endpoint(struct usb_hcd *hc
+@@ -1795,6 +1891,56 @@ int xhci_add_endpoint(struct usb_hcd *hc
  		return -ENOMEM;
  	}
  
@@ -5546,7 +5546,7 @@
  	ctrl_ctx->add_flags |= cpu_to_le32(added_ctxs);
  	new_add_flags = le32_to_cpu(ctrl_ctx->add_flags);
  
-@@ -4463,8 +4609,14 @@ static u16 xhci_call_host_update_timeout
+@@ -4465,8 +4611,14 @@ static u16 xhci_call_host_update_timeout
  		u16 *timeout)
  {
  	if (state == USB3_LPM_U1)
@@ -5561,7 +5561,7 @@
  		return xhci_calculate_u2_timeout(xhci, udev, desc);
  
  	return USB3_LPM_DISABLED;
-@@ -4849,7 +5001,9 @@ int xhci_gen_setup(struct usb_hcd *hcd,
+@@ -4851,7 +5003,9 @@ int xhci_gen_setup(struct usb_hcd *hcd,
  	hcd->self.no_sg_constraint = 1;
  
  	/* XHCI controllers don't stop the ep queue on short packets :| */
@@ -5571,7 +5571,7 @@
  
  	if (usb_hcd_is_primary_hcd(hcd)) {
  		xhci = kzalloc(sizeof(struct xhci_hcd), GFP_KERNEL);
-@@ -4912,6 +5066,10 @@ int xhci_gen_setup(struct usb_hcd *hcd,
+@@ -4914,6 +5068,10 @@ int xhci_gen_setup(struct usb_hcd *hcd,
  		goto error;
  	xhci_dbg(xhci, "Reset complete\n");
  
@@ -5582,7 +5582,7 @@
  	/* Set dma_mask and coherent_dma_mask to 64-bits,
  	 * if xHC supports 64-bit addressing */
  	if (HCC_64BIT_ADDR(xhci->hcc_params) &&
-@@ -5006,8 +5164,57 @@ MODULE_DESCRIPTION(DRIVER_DESC);
+@@ -5008,8 +5166,57 @@ MODULE_DESCRIPTION(DRIVER_DESC);
  MODULE_AUTHOR(DRIVER_AUTHOR);
  MODULE_LICENSE("GPL");
  
@@ -5664,7 +5664,7 @@
  /* xHCI PCI Configuration Registers */
  #define XHCI_SBRN_OFFSET	(0x60)
  
-@@ -1587,8 +1602,12 @@ struct xhci_hcd {
+@@ -1588,8 +1603,12 @@ struct xhci_hcd {
  	/* Compliance Mode Recovery Data */
  	struct timer_list	comp_mode_recovery_timer;
  	u32			port_status_u0;
@@ -5677,7 +5677,7 @@
  };
  
  /* convert between an HCD pointer and the corresponding EHCI_HCD */
-@@ -1736,6 +1755,26 @@ void xhci_urb_free_priv(struct xhci_hcd
+@@ -1737,6 +1756,26 @@ void xhci_urb_free_priv(struct xhci_hcd
  void xhci_free_command(struct xhci_hcd *xhci,
  		struct xhci_command *command);
  
diff --git a/target/linux/ramips/patches-3.18/0301-mt7688-detect.patch b/target/linux/ramips/patches-3.18/0301-mt7688-detect.patch
index e3f2887d8cc40fac68a07d6c437bac30d6385955..74e1c859da7c90456487535e7884738256be6940 100644
--- a/target/linux/ramips/patches-3.18/0301-mt7688-detect.patch
+++ b/target/linux/ramips/patches-3.18/0301-mt7688-detect.patch
@@ -94,7 +94,7 @@
  
 --- a/drivers/net/ethernet/ralink/esw_rt3052.c
 +++ b/drivers/net/ethernet/ralink/esw_rt3052.c
-@@ -611,7 +611,7 @@ static void esw_hw_init(struct rt305x_es
+@@ -618,7 +618,7 @@ static void esw_hw_init(struct rt305x_es
  		rt305x_mii_write(esw, 0, 29, 0x598b);
  		/* select local register */
  		rt305x_mii_write(esw, 0, 31, 0x8000);
@@ -103,7 +103,7 @@
  		int i;
  //		u32 phy_val;
  		u32 val;
-@@ -1042,7 +1042,7 @@ esw_get_port_tr_badgood(struct switch_de
+@@ -1049,7 +1049,7 @@ esw_get_port_tr_badgood(struct switch_de
  	int shift = attr->id == RT5350_ESW_ATTR_PORT_TR_GOOD ? 0 : 16;
  	u32 reg;
  
diff --git a/target/linux/ramips/patches-3.18/500-alsa.patch b/target/linux/ramips/patches-3.18/500-alsa.patch
index 41fbb8407c7901c223e521f8ae4dc901ce4980f9..d43e7d5f6b3f49bd93e0814406e65dc26fd74815 100644
--- a/target/linux/ramips/patches-3.18/500-alsa.patch
+++ b/target/linux/ramips/patches-3.18/500-alsa.patch
@@ -66,7 +66,7 @@
 +
 --- /dev/null
 +++ b/sound/soc/mtk/Makefile
-@@ -0,0 +1,39 @@
+@@ -0,0 +1,40 @@
 +KBUILD_CFLAGS += -I$(srctree)
 +
 +ifeq ($(CONFIG_SND_MT76XX_SOC_MT7620),y)
@@ -84,7 +84,8 @@
 +KBUILD_CFLAGS += -DCONFIG_GDMA_EVERYBODY
 +KBUILD_CFLAGS += -DCONFIG_SND_MT76XX_SOC
 +KBUILD_CFLAGS += -DCONFIG_I2S_WM8960
-+KBUILD_CFLAGS += -DCONFIG_I2S_MCLK_12P288MHZ
++#KBUILD_CFLAGS += -DCONFIG_I2S_MCLK_12P288MHZ
++KBUILD_CFLAGS += -DCONFIG_I2S_MCLK_12MHZ
 +KBUILD_CFLAGS += -DCONFIG_GDMA_EVERYBODY
 +KBUILD_CFLAGS += -DSURFBOARDINT_DMA=15
 +KBUILD_CFLAGS += -DRALINK_INTCTL_DMA=128
@@ -8084,15 +8085,7 @@
 +}
 --- a/sound/soc/codecs/wm8960.c
 +++ b/sound/soc/codecs/wm8960.c
-@@ -26,6 +26,7 @@
- #include <sound/wm8960.h>
- 
- #include "wm8960.h"
-+#include "../mtk/i2c_wm8960.h"
- 
- /* R25 - Power 1 */
- #define WM8960_VMID_MASK 0x180
-@@ -53,10 +54,10 @@
+@@ -53,10 +53,10 @@
   * using 2 wire for device control, so we cache them instead.
   */
  static const struct reg_default wm8960_reg_defaults[] = {
@@ -8107,7 +8100,7 @@
  	{  0x4, 0x0000 },
  	{  0x5, 0x0008 },
  	{  0x6, 0x0000 },
-@@ -88,8 +89,8 @@ static const struct reg_default wm8960_r
+@@ -88,8 +88,8 @@ static const struct reg_default wm8960_r
  	{ 0x25, 0x0050 },
  	{ 0x26, 0x0000 },
  	{ 0x27, 0x0000 },
@@ -8118,24 +8111,17 @@
  	{ 0x2a, 0x0040 },
  	{ 0x2b, 0x0000 },
  	{ 0x2c, 0x0000 },
-@@ -127,8 +128,15 @@ struct wm8960_priv {
+@@ -126,8 +126,7 @@ struct wm8960_priv {
+ 	bool deemph;
  	int playback_fs;
  };
- 
-+#if 1
-+#define wm8960_reset(c)        do{ \
-+       int i = 0;\
-+       snd_soc_write(c, WM8960_RESET, 0);\
-+       for(i = 0; i < 1000*HZ; i++);\
-+       }while(0)
-+#else
- #define wm8960_reset(c)	snd_soc_write(c, WM8960_RESET, 0)
 -
-+#endif
+-#define wm8960_reset(c)	snd_soc_write(c, WM8960_RESET, 0)
++static char init_mtk;
+ 
  /* enumerated controls */
  static const char *wm8960_polarity[] = {"No Inversion", "Left Inverted",
- 	"Right Inverted", "Stereo Inversion"};
-@@ -181,8 +189,8 @@ static int wm8960_get_deemph(struct snd_
+@@ -181,8 +180,8 @@ static int wm8960_get_deemph(struct snd_
  	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  	struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
  
@@ -8146,33 +8132,29 @@
  }
  
  static int wm8960_put_deemph(struct snd_kcontrol *kcontrol,
-@@ -200,6 +208,70 @@ static int wm8960_put_deemph(struct snd_
+@@ -200,6 +199,65 @@ static int wm8960_put_deemph(struct snd_
  	return wm8960_set_deemph(codec);
  }
  
-+static int wm8960_preinit(struct snd_soc_codec *codec)
++static void wm8960_reset(struct snd_soc_codec *codec)
 +{
-+	//printk("****** %s ******\n", __func__);
 +	snd_soc_write(codec, WM8960_RESET, 0);
-+	mdelay(500);
-+
-+	return 0;
++	init_mtk = false;
 +}
 +
-+static int wm8960_postinit(struct snd_soc_codec *codec)
++static int wm8960_init(struct snd_soc_codec *codec)
 +{
 +	u32 data;
-+	//printk("****** %s ******\n", __func__);
 +	// In
 +	data = snd_soc_read(codec, WM8960_POWER1);
-+	snd_soc_write(codec, WM8960_POWER1, data|WM8960_PWR1_ADCL|WM8960_PWR1_ADCR|WM8960_PWR1_AINL |WM8960_PWR1_AINR|WM8960_PWR1_MICB);//0x19
++	snd_soc_write(codec, WM8960_POWER1, data|WM8960_PWR1_ADCL|WM8960_PWR1_ADCR|WM8960_PWR1_AINL |WM8960_PWR1_AINR|WM8960_PWR1_MICB|WM8960_PWR1_VMIDSEL_5K|WM8960_PWR1_VREF);//0x19
 +	data = snd_soc_read(codec, WM8960_ADDCTL1);
 +	snd_soc_write(codec, WM8960_ADDCTL1, data|ADDITIONAL1_DATSEL(0x01));//0x17
-+	snd_soc_write(codec, WM8960_LADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xc3));//0x15
-+	snd_soc_write(codec, WM8960_RADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xc3));//0x16
-+	snd_soc_write(codec, WM8960_LINPATH, 0x148);//0x20
-+	snd_soc_write(codec, WM8960_RINPATH, 0x148);//0x21
-+	snd_soc_write(codec, WM8960_POWER3, WM8960_PWR3_LMIC|WM8960_PWR3_RMIC);//0x2f
++	snd_soc_write(codec, WM8960_LADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xce));//0x15
++	snd_soc_write(codec, WM8960_RADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xce));//0x16
++	snd_soc_write(codec, WM8960_LINPATH, 0x168);//0x20
++	snd_soc_write(codec, WM8960_RINPATH, 0x168);//0x21
++	snd_soc_write(codec, WM8960_POWER3, WM8960_PWR3_LMIC|WM8960_PWR3_RMIC|WM8960_PWR3_ROMIX|WM8960_PWR3_LOMIX);//0x2f
 +
 +	// Out
 +	data = snd_soc_read(codec, WM8960_POWER2);
@@ -8184,23 +8166,22 @@
 +	snd_soc_write(codec, WM8960_LOUTMIX, 0x100);//0x22
 +	snd_soc_write(codec, WM8960_ROUTMIX, 0x100);//0x25
 +
-+	data = snd_soc_read(codec, WM8960_POWER3);
-+	snd_soc_write(codec, WM8960_POWER3, data|WM8960_PWR3_ROMIX|WM8960_PWR3_LOMIX);//0x2f
-+
 +	snd_soc_write(codec, WM8960_CLASSD1, 0xf7);//0x31
 +	snd_soc_write(codec, WM8960_CLASSD3, 0xad);//0x33
 +	snd_soc_write(codec, WM8960_DACCTL1,  0x000);//0x05
 +
-+	data = snd_soc_read(codec, WM8960_POWER1);
-+	snd_soc_write(codec, WM8960_POWER1,  data|0x1c0);//0x19
-+
-+
-+	snd_soc_write(codec, WM8960_LOUT1, LOUT1_LO1VU|LOUT1_LO1ZC|LOUT1_LOUT1VOL(115));//0x02
-+	snd_soc_write(codec, WM8960_ROUT1, ROUT1_RO1VU|ROUT1_RO1ZC|ROUT1_ROUT1VOL(115));//0x03
-+
-+	snd_soc_write(codec, WM8960_LINVOL, LINV_IPVU|LINV_LINVOL(110)); //LINV(0x00)=>0x12b
-+	snd_soc_write(codec, WM8960_RINVOL, RINV_IPVU|RINV_RINVOL(110)); //LINV(0x01)=>0x12b
++	snd_soc_write(codec, WM8960_LOUT1, LOUT1_LO1VU|LOUT1_LO1ZC|LOUT1_LOUT1VOL(120));//0x02
++	snd_soc_write(codec, WM8960_ROUT1, ROUT1_RO1VU|ROUT1_RO1ZC|ROUT1_ROUT1VOL(120));//0x03
++	
++	data = snd_soc_read(codec, WM8960_LINVOL);
++	data &= ~LINV_LINMUTE;
++	snd_soc_write(codec, WM8960_LINVOL, data|LINV_IPVU|LINV_LINVOL(96));//LINV(0x00)
++	
++	data = snd_soc_read(codec, WM8960_RINVOL);
++	data &= ~RINV_RINMUTE;
++	snd_soc_write(codec, WM8960_RINVOL, data|RINV_IPVU|RINV_RINVOL(96)); //LINV(0x01)
 +
++	init_mtk = true;
 +	return 0;
 +}
 +
@@ -8217,15 +8198,17 @@
  static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 0);
  static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1);
  static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0);
-@@ -542,6 +614,7 @@ static int wm8960_set_dai_fmt(struct snd
+@@ -542,6 +600,9 @@ static int wm8960_set_dai_fmt(struct snd
  
  	/* set iface */
  	snd_soc_write(codec, WM8960_IFACE1, iface);
-+	wm8960_postinit(codec);
++	if (!init_mtk)
++		wm8960_init(codec);
++
  	return 0;
  }
  
-@@ -623,11 +696,16 @@ static int wm8960_set_bias_level_out3(st
+@@ -623,11 +684,15 @@ static int wm8960_set_bias_level_out3(st
  		break;
  
  	case SND_SOC_BIAS_PREPARE:
@@ -8236,13 +8219,12 @@
  		break;
  
  	case SND_SOC_BIAS_STANDBY:
-+#if 1
-+		wm8960_preinit(codec);
-+#else
++#if 0
++
  		if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
  			regcache_sync(wm8960->regmap);
  
-@@ -650,9 +728,13 @@ static int wm8960_set_bias_level_out3(st
+@@ -650,9 +715,13 @@ static int wm8960_set_bias_level_out3(st
  
  		/* Set VMID to 2x250k */
  		snd_soc_update_bits(codec, WM8960_POWER1, 0x180, 0x100);
@@ -8250,13 +8232,13 @@
  		break;
  
  	case SND_SOC_BIAS_OFF:
-+#if 1
++#if 0
 +		wm8960_close(codec);
-+#else
++
  		/* Enable anti-pop features */
  		snd_soc_write(codec, WM8960_APOP1,
  			     WM8960_POBCTRL | WM8960_SOFT_ST |
-@@ -661,6 +743,7 @@ static int wm8960_set_bias_level_out3(st
+@@ -661,6 +730,7 @@ static int wm8960_set_bias_level_out3(st
  		/* Disable VMID and VREF, let them discharge */
  		snd_soc_write(codec, WM8960_POWER1, 0);
  		msleep(600);
@@ -8264,36 +8246,15 @@
  		break;
  	}
  
-@@ -853,10 +936,15 @@ static int wm8960_set_dai_pll(struct snd
+@@ -853,7 +923,6 @@ static int wm8960_set_dai_pll(struct snd
  
  	if (pll_div.k) {
  		reg |= 0x20;
 -
-+#if 1
  		snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 16) & 0xff);
  		snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 8) & 0xff);
  		snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0xff);
-+#else
-+		snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 16) & 0xff);
-+		snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 8) & 0xff);
-+		snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0xff);
-+#endif
- 	}
- 	snd_soc_write(codec, WM8960_PLL1, reg);
- 
-@@ -888,7 +976,11 @@ static int wm8960_set_dai_clkdiv(struct
- 		snd_soc_write(codec, WM8960_PLL1, reg | div);
- 		break;
- 	case WM8960_DCLKDIV:
-+#if 1
- 		reg = snd_soc_read(codec, WM8960_CLOCK2) & 0x03f;
-+#else
-+		reg = snd_soc_read(codec, WM8960_CLOCK2) & 0x03f;
-+#endif
- 		snd_soc_write(codec, WM8960_CLOCK2, reg | div);
- 		break;
- 	case WM8960_TOCLKSEL:
-@@ -962,7 +1054,7 @@ static int wm8960_probe(struct snd_soc_c
+@@ -962,7 +1031,7 @@ static int wm8960_probe(struct snd_soc_c
  {
  	struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
  	struct wm8960_data *pdata = dev_get_platdata(codec->dev);
@@ -8302,7 +8263,7 @@
  
  	wm8960->set_bias_level = wm8960_set_bias_level_out3;
  
-@@ -973,11 +1065,7 @@ static int wm8960_probe(struct snd_soc_c
+@@ -973,26 +1042,9 @@ static int wm8960_probe(struct snd_soc_c
  			wm8960->set_bias_level = wm8960_set_bias_level_capless;
  	}
  
@@ -8311,10 +8272,27 @@
 -		dev_err(codec->dev, "Failed to issue reset\n");
 -		return ret;
 -	}
+-
+-	wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+-
+-	/* Latch the update bits */
+-	snd_soc_update_bits(codec, WM8960_LINVOL, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_RINVOL, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_LADC, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_RADC, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_LDAC, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_RDAC, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_LOUT1, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_ROUT1, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_LOUT2, 0x100, 0x100);
+-	snd_soc_update_bits(codec, WM8960_ROUT2, 0x100, 0x100);
+-
 +	wm8960_reset(codec);
- 
- 	wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
- 
++	//mdelay(400);
++	
+ 	snd_soc_add_codec_controls(codec, wm8960_snd_controls,
+ 				     ARRAY_SIZE(wm8960_snd_controls));
+ 	wm8960_add_widgets(codec);
 --- a/sound/soc/codecs/wm8960.h
 +++ b/sound/soc/codecs/wm8960.h
 @@ -110,4 +110,68 @@
@@ -8384,5 +8362,5 @@
 +#define RINV_RINMUTE                    (1 << 7)
 +#define RINV_RIZC                       (1 << 6)
 +#define RINV_RINVOL(x)                  ((x) & 0x3f)
-+
++#define MBSEL                       	(1 << 0)
  #endif
diff --git a/target/linux/sunxi/image/Makefile b/target/linux/sunxi/image/Makefile
index 6fcd61f5dbb6e2cb142f76f888a87c1b8ce4b00e..d3f440941d4a5a6f0f5b596398743b3bdc353910 100644
--- a/target/linux/sunxi/image/Makefile
+++ b/target/linux/sunxi/image/Makefile
@@ -11,28 +11,12 @@ include $(INCLUDE_DIR)/host.mk
 FAT32_BLOCK_SIZE=1024
 FAT32_BLOCKS=$(shell echo $$(($(CONFIG_SUNXI_SD_BOOT_PARTSIZE)*1024*1024/$(FAT32_BLOCK_SIZE))))
 
-BOARDS:= \
-	sun4i-a10-cubieboard \
-	sun4i-a10-olinuxino-lime \
-	sun4i-a10-pcduino \
-	sun5i-a13-olinuxino \
-	sun6i-a31-colombus \
-	sun6i-a31-m9 \
-	sun7i-a20-bananapi \
-	sun7i-a20-bananapro \
-	sun7i-a20-cubieboard2 \
-	sun7i-a20-cubietruck \
-	sun7i-a20-olinuxino-lime \
-	sun7i-a20-olinuxino-micro \
-	sun7i-a20-pcduino3 \
-	sun7i-a20-lamobo-r1
-
 define Image/BuildKernel
 	mkimage -A arm -O linux -T kernel -C none \
 		-a 0x40008000 -e 0x40008000 \
 		-n 'ARM OpenWrt Linux-$(LINUX_VERSION)' \
 		-d $(KDIR)/zImage $(BIN_DIR)/$(IMG_PREFIX)-uImage
-	
+
     ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
 	$(CP) $(KDIR)/zImage-initramfs $(BIN_DIR)/$(IMG_PREFIX)-zImage-initramfs
 	echo -ne '\x00\x00\x00\x00' >> $(BIN_DIR)/$(IMG_PREFIX)-zImage-initramfs
@@ -42,27 +26,27 @@ define Image/BuildKernel
 		$(BIN_DIR)/$(IMG_PREFIX)-uImage-initramfs \
 	)
     endif
-
-	$(foreach board,$(BOARDS),
-		$(CP) $(DTS_DIR)/$(board).dtb $(BIN_DIR)/
-	)
 endef
 
 define Image/Build/SDCard
 	rm -f $(KDIR)/boot.img
 	mkdosfs $(KDIR)/boot.img -C $(FAT32_BLOCKS)
-	
-	mcopy -i $(KDIR)/boot.img $(BIN_DIR)/uboot-sunxi-$(PROFILE)/$(IMG_PREFIX)-$(PROFILE)-boot.scr ::boot.scr
-	mcopy -i $(KDIR)/boot.img $(BIN_DIR)/$(2).dtb ::dtb
+
+	mcopy -i $(KDIR)/boot.img $(KDIR)/uboot-sunxi-$(PROFILE)-boot.scr ::boot.scr
+	mcopy -i $(KDIR)/boot.img $(DTS_DIR)/$(2).dtb ::dtb
 	mcopy -i $(KDIR)/boot.img $(BIN_DIR)/$(IMG_PREFIX)-uImage ::uImage
-	
+
 	./gen_sunxi_sdcard_img.sh \
 		$(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE)-sdcard-vfat-$(1).img \
 		$(KDIR)/boot.img \
 		$(KDIR)/root.$(1) \
 		$(CONFIG_SUNXI_SD_BOOT_PARTSIZE) \
 		$(CONFIG_TARGET_ROOTFS_PARTSIZE) \
-		$(BIN_DIR)/uboot-sunxi-$(PROFILE)/$(IMG_PREFIX)-$(PROFILE)-u-boot-with-spl.bin
+		$(KDIR)/uboot-sunxi-$(PROFILE)-u-boot-with-spl.bin
+
+  ifneq ($(CONFIG_TARGET_IMAGES_GZIP),)
+	gzip -f9n $(BIN_DIR)/$(IMG_PREFIX)-$(PROFILE)-sdcard-vfat-$(1).img
+  endif
 endef
 
 define Image/Build/Profile/A10-OLinuXino-Lime
@@ -124,7 +108,7 @@ endef
 define Image/Build
 	$(call Image/Build/$(1),$(1))
 	$(call Image/Build/Profile/$(PROFILE),$(1))
-	
+
 	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=128k conv=sync
 endef
 
diff --git a/target/linux/sunxi/patches-3.18/200-mmc-add-sdio-function-subnode.patch b/target/linux/sunxi/patches-3.18/200-mmc-add-sdio-function-subnode.patch
index 96662d81d0778df573ebe07f16bd5ce29c1bf7cf..dcbb3a4767d30143ec1260780bd7299e6d494a96 100644
--- a/target/linux/sunxi/patches-3.18/200-mmc-add-sdio-function-subnode.patch
+++ b/target/linux/sunxi/patches-3.18/200-mmc-add-sdio-function-subnode.patch
@@ -49,7 +49,7 @@ Signed-off-by: Hans de Goede <hdegoede@redhat.com>
  	put_device(&card->dev);
 --- a/drivers/mmc/core/core.c
 +++ b/drivers/mmc/core/core.c
-@@ -1207,6 +1207,34 @@ EXPORT_SYMBOL(mmc_of_parse_voltage);
+@@ -1231,6 +1231,34 @@ EXPORT_SYMBOL(mmc_of_parse_voltage);
  
  #endif /* CONFIG_OF */
  
diff --git a/target/linux/x86/generic/config-default b/target/linux/x86/generic/config-default
index eb4b357edddf678cbd905885af944dd2306c4bde..9e963bf725b222dc94792dc8760f6f747cfffb78 100644
--- a/target/linux/x86/generic/config-default
+++ b/target/linux/x86/generic/config-default
@@ -153,6 +153,7 @@ CONFIG_NLS=y
 CONFIG_NO_HZ=y
 # CONFIG_PANASONIC_LAPTOP is not set
 CONFIG_PATA_AMD=y
+CONFIG_PATA_ATIIXP=y
 CONFIG_PATA_LEGACY=y
 CONFIG_PATA_MPIIX=y
 CONFIG_PATA_OLDPIIX=y
diff --git a/toolchain/glibc/Config.version b/toolchain/glibc/Config.version
index 2ac01d7d736eb8beda602123d281d8c20e996280..4ceed09adfcfdb2a2f1c59ab74dbb3ccba5daaaf 100644
--- a/toolchain/glibc/Config.version
+++ b/toolchain/glibc/Config.version
@@ -12,12 +12,6 @@ config EGLIBC_VERSION_2_19
 config GLIBC_VERSION_2_21
 	bool
 
-config GLIBC_REVISION
-	string
-	default "25243" if EGLIBC_VERSION_2_19
-	default "4e42b5b8f8" if GLIBC_VERSION_2_21
-	default ""
-
 endif
 
 menu "eglibc configuration"
diff --git a/toolchain/glibc/common.mk b/toolchain/glibc/common.mk
index 7487ca2782d9068101372b07742e8ed731e13b52..3d680bbcf600f3bc3495d5de92dfccae672d58c1 100644
--- a/toolchain/glibc/common.mk
+++ b/toolchain/glibc/common.mk
@@ -6,9 +6,19 @@
 #
 include $(TOPDIR)/rules.mk
 
+
+MD5SUM_2.19 = 42dad4edd3bcb38006d13b5640b00b38
+REVISION_2.19 = 25243
+
+MD5SUM_2.21 = 76050a65c444d58b5c4aa0d6034736ed
+REVISION_2.21 = 16d0a0c
+
+
 PKG_NAME:=glibc
 PKG_VERSION:=$(call qstrip,$(CONFIG_GLIBC_VERSION))
-PKG_REVISION:=$(call qstrip,$(CONFIG_GLIBC_REVISION))
+
+PKG_REVISION:=$(REVISION_$(PKG_VERSION))
+PKG_MIRROR_MD5SUM:=$(MD5SUM_$(PKG_VERSION))
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL:=git://sourceware.org/git/glibc.git
diff --git a/toolchain/glibc/patches/2.21/200-add-dl-search-paths.patch b/toolchain/glibc/patches/2.21/200-add-dl-search-paths.patch
index a6200f783b7030c4a1459f2a0fb1755874df1c19..070f938fe363093cd7e899c6696ade7d579be74d 100644
--- a/toolchain/glibc/patches/2.21/200-add-dl-search-paths.patch
+++ b/toolchain/glibc/patches/2.21/200-add-dl-search-paths.patch
@@ -2,7 +2,7 @@ add /usr/lib to default search path for the dynamic linker
 
 --- a/Makeconfig
 +++ b/Makeconfig
-@@ -501,6 +501,9 @@ else
+@@ -499,6 +499,9 @@ else
  default-rpath = $(libdir)
  endif
  
diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile
index ba76875ee6a2c8735ddf176894ac11488e16013f..1b925cf4f47a1e5c5ff31bc85b6d02dfa28915a8 100644
--- a/tools/firmware-utils/Makefile
+++ b/tools/firmware-utils/Makefile
@@ -32,7 +32,7 @@ define Host/Compile
 	$(call cc,mkzynfw)
 	$(call cc,lzma2eva,-lz)
 	$(call cc,mkcasfw)
-	$(call cc,mkfwimage,-lz)
+	$(call cc,mkfwimage,-lz -Wall)
 	$(call cc,mkfwimage2,-lz)
 	$(call cc,imagetag imagetag_cmdline cyg_crc32)
 	$(call cc,imagetag_nand)
@@ -65,6 +65,7 @@ define Host/Compile
 	$(call cc,mkdapimg)
 	$(call cc, mkcameofw, -Wall)
 	$(call cc,seama md5)
+	$(call cc,oseama md5, -Wall)
 	$(call cc,fix-u-media-header cyg_crc32,-Wall)
 	$(call cc,hcsmakeimage bcmalgo)
 	$(call cc,mkporayfw, -Wall)
diff --git a/tools/firmware-utils/src/mkfwimage.c b/tools/firmware-utils/src/mkfwimage.c
index e3a03c191c0d383d73b8999ac3e40cc52706de2a..d8d5239cc55d1986459ce404c414f098500bf5ab 100644
--- a/tools/firmware-utils/src/mkfwimage.c
+++ b/tools/firmware-utils/src/mkfwimage.c
@@ -79,6 +79,12 @@ fw_layout_t fw_layout_data[] = {
 		.name		=	"XM",
 		.kern_start	=	0x9f050000,
 		.kern_entry	=	0x80002000,
+		.firmware_max_length=	0x00760000,
+	},
+	{
+		.name		=	"UBDEV01",
+		.kern_start	=	0x9f050000,
+		.kern_entry	=	0x80002000,
 		.firmware_max_length=	0x006A0000,
 	},
 	{	.name		=	"",
@@ -104,8 +110,6 @@ typedef struct part_data {
 
 #define OPTIONS "B:hv:m:o:r:k:"
 
-static int debug = 0;
-
 typedef struct image_info {
 	char magic[16];
 	char version[256];
@@ -236,9 +240,9 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
 	fw_layout_t* p;
 
 	p = &fw_layout_data[0];
-	while ((strlen(p->name) != 0) && (strncmp(p->name, board_name, sizeof(board_name)) != 0))
+	while (*p->name && (strcmp(p->name, board_name) != 0))
 		p++;
-	if (p->name == NULL) {
+	if (!*p->name) {
 		printf("BUG! Unable to find default fw layout!\n");
 		exit(-1);
 	}
@@ -247,7 +251,7 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
 	strcpy(kernel->partition_name, "kernel");
 	kernel->partition_index = 1;
 	kernel->partition_baseaddr = p->kern_start;
-	if ( (kernel->partition_length = filelength(kernelfile)) < 0) return (-1);
+	if ( (kernel->partition_length = filelength(kernelfile)) == (u_int32_t)-1) return (-1);
 	kernel->partition_memaddr = p->kern_entry;
 	kernel->partition_entryaddr = p->kern_entry;
 	strncpy(kernel->filename, kernelfile, sizeof(kernel->filename));
@@ -263,8 +267,8 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
 	rootfs->partition_entryaddr = 0x00000000;
 	strncpy(rootfs->filename, rootfsfile, sizeof(rootfs->filename));
 
-printf("kernel: %d 0x%08x\n", kernel->partition_length, kernel->partition_baseaddr);
-printf("root: %d 0x%08x\n", rootfs->partition_length, rootfs->partition_baseaddr);
+	printf("kernel: %d 0x%08x\n", kernel->partition_length, kernel->partition_baseaddr);
+	printf("root: %d 0x%08x\n", rootfs->partition_length, rootfs->partition_baseaddr);
 	im->part_count = 2;
 
 	return 0;
diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c
index 43840a953ce7998fb215226893b9b553a89bd985..6df869d59a6138d4c0dd1fbec5337a71c31eccd3 100644
--- a/tools/firmware-utils/src/mktplinkfw.c
+++ b/tools/firmware-utils/src/mktplinkfw.c
@@ -52,6 +52,7 @@
 #define HWID_TL_WA801ND_V2	0x08010002
 #define HWID_TL_WA901ND_V1	0x09010001
 #define HWID_TL_WA901ND_V2	0x09010002
+#define HWID_TL_WA901ND_V4	0x09010004
 #define HWID_TL_WDR4300_V1_IL	0x43008001
 #define HWID_TL_WDR4900_V1	0x49000001
 #define HWID_TL_WR703N_V1	0x07030101
@@ -305,6 +306,11 @@ static struct board_info boards[] = {
 		.hw_id          = HWID_TL_WA901ND_V2,
 		.hw_rev         = 1,
 		.layout_id	= "4M",
+	}, {
+		.id             = "TL-WA901NDv4",
+		.hw_id          = HWID_TL_WA901ND_V4,
+		.hw_rev         = 1,
+		.layout_id	= "4Mlzma",
 	}, {
 		.id             = "TL-WDR4300v1",
 		.hw_id          = HWID_TL_WDR4300_V1_IL,
diff --git a/tools/firmware-utils/src/oseama.c b/tools/firmware-utils/src/oseama.c
new file mode 100644
index 0000000000000000000000000000000000000000..37a2171574b881c3c47c2d6efd6ff7f500d7e5eb
--- /dev/null
+++ b/tools/firmware-utils/src/oseama.c
@@ -0,0 +1,422 @@
+/*
+ * oseama
+ *
+ * Copyright (C) 2016 Rafał Miłecki <zajec5@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ */
+
+#include <byteswap.h>
+#include <endian.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "md5.h"
+
+#if !defined(__BYTE_ORDER)
+#error "Unknown byte order"
+#endif
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define cpu_to_be32(x)	(x)
+#define be32_to_cpu(x)	(x)
+#define cpu_to_be16(x)	(x)
+#define be16_to_cpu(x)	(x)
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+#define cpu_to_be32(x)	bswap_32(x)
+#define be32_to_cpu(x)	bswap_32(x)
+#define cpu_to_be16(x)	bswap_16(x)
+#define be16_to_cpu(x)	bswap_16(x)
+#else
+#error "Unsupported endianness"
+#endif
+
+#define SEAMA_MAGIC			0x5ea3a417
+
+struct seama_seal_header {
+	uint32_t magic;
+	uint16_t reserved;
+	uint16_t metasize;
+	uint32_t imagesize;
+} __attribute__ ((packed));
+
+struct seama_entity_header {
+	uint32_t magic;
+	uint16_t reserved;
+	uint16_t metasize;
+	uint32_t imagesize;
+	uint8_t md5[16];
+} __attribute__ ((packed));
+
+char *seama_path;
+int entity_idx = -1;
+
+static inline size_t oseama_min(size_t x, size_t y) {
+	return x < y ? x : y;
+}
+
+/**************************************************
+ * Info
+ **************************************************/
+
+static void oseama_info_parse_options(int argc, char **argv) {
+	int c;
+
+	while ((c = getopt(argc, argv, "e:")) != -1) {
+		switch (c) {
+		case 'e':
+			entity_idx = atoi(optarg);
+			break;
+		}
+	}
+}
+
+static int oseama_info_entities(FILE *seama) {
+	struct seama_entity_header hdr;
+	size_t bytes, metasize, imagesize;
+	uint8_t buf[1024];
+	char *end, *tmp;
+	int i = 0;
+	int err = 0;
+
+	while ((bytes = fread(&hdr, 1, sizeof(hdr), seama)) == sizeof(hdr)) {
+		if (be32_to_cpu(hdr.magic) != SEAMA_MAGIC) {
+			fprintf(stderr, "Invalid Seama magic: 0x%08x\n", be32_to_cpu(hdr.magic));
+			err =  -EINVAL;
+			goto err_out;
+		}
+		metasize = be16_to_cpu(hdr.metasize);
+		imagesize = be32_to_cpu(hdr.imagesize);
+
+		if (entity_idx >= 0 && i != entity_idx) {
+			fseek(seama, metasize + imagesize, SEEK_CUR);
+			i++;
+			continue;
+		}
+
+		if (metasize >= sizeof(buf)) {
+			fprintf(stderr, "Too small buffer (%zu B) to read all meta info (%zd B)\n", sizeof(buf), metasize);
+			err =  -EINVAL;
+			goto err_out;
+		}
+
+		if (entity_idx < 0)
+			printf("\n");
+		printf("Entity offset:\t%ld\n", ftell(seama) - sizeof(hdr));
+		printf("Entity size:\t%zd\n", sizeof(hdr) + metasize + imagesize);
+		printf("Meta size:\t%zd\n", metasize);
+		printf("Image size:\t%zd\n", imagesize);
+
+		bytes = fread(buf, 1, metasize, seama);
+		if (bytes != metasize) {
+			fprintf(stderr, "Couldn't read %zd B of meta\n", metasize);
+			err =  -EIO;
+			goto err_out;
+		}
+
+		end = (char *)&buf[metasize - 1];
+		*end = '\0';
+		for (tmp = (char *)buf; tmp < end && strlen(tmp); tmp += strlen(tmp) + 1) {
+			printf("Meta entry:\t%s\n", tmp);
+		}
+
+		fseek(seama, imagesize, SEEK_CUR);
+		i++;
+	}
+
+err_out:
+	return err;
+}
+
+static int oseama_info(int argc, char **argv) {
+	FILE *seama;
+	struct seama_seal_header hdr;
+	size_t bytes;
+	uint16_t metasize;
+	uint32_t imagesize;
+	uint8_t buf[1024];
+	int err = 0;
+
+	if (argc < 3) {
+		fprintf(stderr, "No Seama file passed\n");
+		err = -EINVAL;
+		goto out;
+	}
+	seama_path = argv[2];
+
+	optind = 3;
+	oseama_info_parse_options(argc, argv);
+
+	seama = fopen(seama_path, "r");
+	if (!seama) {
+		fprintf(stderr, "Couldn't open %s\n", seama_path);
+		err = -EACCES;
+		goto out;
+	}
+
+	bytes = fread(&hdr, 1, sizeof(hdr), seama);
+	if (bytes != sizeof(hdr)) {
+		fprintf(stderr, "Couldn't read %s header\n", seama_path);
+		err =  -EIO;
+		goto err_close;
+	}
+	metasize = be16_to_cpu(hdr.metasize);
+	imagesize = be32_to_cpu(hdr.imagesize);
+
+	if (be32_to_cpu(hdr.magic) != SEAMA_MAGIC) {
+		fprintf(stderr, "Invalid Seama magic: 0x%08x\n", be32_to_cpu(hdr.magic));
+		err =  -EINVAL;
+		goto err_close;
+	}
+
+	if (metasize >= sizeof(buf)) {
+		fprintf(stderr, "Too small buffer (%zu B) to read all meta info (%d B)\n", sizeof(buf), metasize);
+		err =  -EINVAL;
+		goto err_close;
+	}
+
+	if (imagesize) {
+		fprintf(stderr, "Invalid Seama image size: 0x%08x (should be 0)\n", imagesize);
+		err =  -EINVAL;
+		goto err_close;
+	}
+
+	bytes = fread(buf, 1, metasize, seama);
+	if (bytes != metasize) {
+		fprintf(stderr, "Couldn't read %d B of meta\n", metasize);
+		err =  -EIO;
+		goto err_close;
+	}
+
+	if (entity_idx < 0) {
+		char *end, *tmp;
+
+		printf("Meta size:\t%d\n", metasize);
+		printf("Image size:\t%d\n", imagesize);
+
+		end = (char *)&buf[metasize - 1];
+		*end = '\0';
+		for (tmp = (char *)buf; tmp < end && strlen(tmp); tmp += strlen(tmp) + 1) {
+			printf("Meta entry:\t%s\n", tmp);
+		}
+	}
+
+	oseama_info_entities(seama);
+
+err_close:
+	fclose(seama);
+out:
+	return err;
+}
+
+/**************************************************
+ * Create
+ **************************************************/
+
+static ssize_t oseama_entity_append_file(FILE *seama, const char *in_path) {
+	FILE *in;
+	size_t bytes;
+	ssize_t length = 0;
+	uint8_t buf[128];
+
+	in = fopen(in_path, "r");
+	if (!in) {
+		fprintf(stderr, "Couldn't open %s\n", in_path);
+		return -EACCES;
+	}
+
+	while ((bytes = fread(buf, 1, sizeof(buf), in)) > 0) {
+		if (fwrite(buf, 1, bytes, seama) != bytes) {
+			fprintf(stderr, "Couldn't write %zu B to %s\n", bytes, seama_path);
+			length = -EIO;
+			break;
+		}
+		length += bytes;
+	}
+
+	fclose(in);
+
+	return length;
+}
+
+static ssize_t oseama_entity_append_zeros(FILE *seama, size_t length) {
+	uint8_t *buf;
+
+	buf = malloc(length);
+	if (!buf)
+		return -ENOMEM;
+	memset(buf, 0, length);
+
+	if (fwrite(buf, 1, length, seama) != length) {
+		fprintf(stderr, "Couldn't write %zu B to %s\n", length, seama_path);
+		return -EIO;
+	}
+
+	return length;
+}
+
+static ssize_t oseama_entity_align(FILE *seama, size_t curr_offset, size_t alignment) {
+	if (curr_offset & (alignment - 1)) {
+		size_t length = alignment - (curr_offset % alignment);
+
+		return oseama_entity_append_zeros(seama, length);
+	}
+
+	return 0;
+}
+
+static int oseama_entity_write_hdr(FILE *seama, size_t metasize, size_t imagesize) {
+	struct seama_entity_header hdr = {};
+	uint8_t buf[128];
+	size_t length = imagesize;
+	size_t bytes;
+	MD5_CTX ctx;
+
+	fseek(seama, sizeof(hdr) + metasize, SEEK_SET);
+	MD5_Init(&ctx);
+	while ((bytes = fread(buf, 1, oseama_min(sizeof(buf), length), seama)) > 0) {
+		MD5_Update(&ctx, buf, bytes);
+		length -= bytes;
+	}
+	MD5_Final(hdr.md5, &ctx);
+
+	hdr.magic = cpu_to_be32(SEAMA_MAGIC);
+	hdr.metasize = cpu_to_be16(metasize);
+	hdr.imagesize = cpu_to_be32(imagesize);
+
+	fseek(seama, 0, SEEK_SET);
+	bytes = fwrite(&hdr, 1, sizeof(hdr), seama);
+	if (bytes != sizeof(hdr)) {
+		fprintf(stderr, "Couldn't write Seama entity header to %s\n", seama_path);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int oseama_entity(int argc, char **argv) {
+	FILE *seama;
+	ssize_t sbytes;
+	size_t curr_offset = sizeof(struct seama_entity_header);
+	size_t metasize = 0, imagesize = 0;
+	int c;
+	int err = 0;
+
+	if (argc < 3) {
+		fprintf(stderr, "No Seama file passed\n");
+		err = -EINVAL;
+		goto out;
+	}
+	seama_path = argv[2];
+
+	seama = fopen(seama_path, "w+");
+	if (!seama) {
+		fprintf(stderr, "Couldn't open %s\n", seama_path);
+		err = -EACCES;
+		goto out;
+	}
+	fseek(seama, curr_offset, SEEK_SET);
+
+	optind = 3;
+	while ((c = getopt(argc, argv, "m:f:b:")) != -1) {
+		switch (c) {
+		case 'm':
+			sbytes = fwrite(optarg, 1, strlen(optarg) + 1, seama);
+			if (sbytes < 0) {
+				fprintf(stderr, "Failed to write meta %s\n", optarg);
+			} else {
+				curr_offset += sbytes;
+				metasize += sbytes;
+			}
+
+			sbytes = oseama_entity_align(seama, curr_offset, 4);
+			if (sbytes < 0) {
+				fprintf(stderr, "Failed to append zeros\n");
+			} else {
+				curr_offset += sbytes;
+				metasize += sbytes;
+			}
+
+			break;
+		case 'f':
+		case 'b':
+			break;
+		}
+	}
+
+	optind = 3;
+	while ((c = getopt(argc, argv, "m:f:b:")) != -1) {
+		switch (c) {
+		case 'm':
+			break;
+		case 'f':
+			sbytes = oseama_entity_append_file(seama, optarg);
+			if (sbytes < 0) {
+				fprintf(stderr, "Failed to append file %s\n", optarg);
+			} else {
+				curr_offset += sbytes;
+				imagesize += sbytes;
+			}
+			break;
+		case 'b':
+			sbytes = strtol(optarg, NULL, 0) - curr_offset;
+			if (sbytes < 0) {
+				fprintf(stderr, "Current Seama entity length is 0x%zx, can't pad it with zeros to 0x%lx\n", curr_offset, strtol(optarg, NULL, 0));
+			} else {
+				sbytes = oseama_entity_append_zeros(seama, sbytes);
+				if (sbytes < 0) {
+					fprintf(stderr, "Failed to append zeros\n");
+				} else {
+					curr_offset += sbytes;
+					imagesize += sbytes;
+				}
+			}
+			break;
+		}
+		if (err)
+			break;
+	}
+
+	oseama_entity_write_hdr(seama, metasize, imagesize);
+
+	fclose(seama);
+out:
+	return err;
+}
+
+/**************************************************
+ * Start
+ **************************************************/
+
+static void usage() {
+	printf("Usage:\n");
+	printf("\n");
+	printf("Info about Seama seal (container):\n");
+	printf("\toseama info <file> [options]\n");
+	printf("\t-e\t\t\t\tprint info about specified entity only\n");
+	printf("\n");
+	printf("Create Seama entity:\n");
+	printf("\toseama entity <file> [options]\n");
+	printf("\t-m meta\t\t\t\tmeta into to put in header\n");
+	printf("\t-f file\t\t\t\tappend content from file\n");
+	printf("\t-b offset\t\t\tappend zeros till reaching absolute offset\n");
+}
+
+int main(int argc, char **argv) {
+	if (argc > 1) {
+		if (!strcmp(argv[1], "info"))
+			return oseama_info(argc, argv);
+		else if (!strcmp(argv[1], "entity"))
+			return oseama_entity(argc, argv);
+	}
+
+	usage();
+	return 0;
+}
diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
index 9c5bb54ffb1b8fe7b9a23f7d977e740a07579c25..77a894b237281f6211dd1123ead4b5b0f2f58370 100644
--- a/tools/firmware-utils/src/tplink-safeloader.c
+++ b/tools/firmware-utils/src/tplink-safeloader.c
@@ -103,7 +103,7 @@ static const uint8_t md5_salt[16] = {
 
 
 /** Vendor information for CPE210/220/510/520 */
-static const unsigned char cpe510_vendor[] = "\x00\x00\x00\x1f""CPE510(TP-LINK|UN|N300-5):1.0\r\n";
+static const char cpe510_vendor[] = "CPE510(TP-LINK|UN|N300-5):1.0\r\n";
 
 
 /**
@@ -129,18 +129,17 @@ static const struct flash_partition_entry cpe510_partitions[] = {
 
 /**
    The support list for CPE210/220/510/520
-
-   The stock images also contain strings for two more devices: BS510 and BS210.
-   At the moment, there exists no public information about these devices.
 */
-static const unsigned char cpe510_support_list[] =
-	"\x00\x00\x00\xc8\x00\x00\x00\x00"
+static const char cpe510_support_list[] =
 	"SupportList:\r\n"
 	"CPE510(TP-LINK|UN|N300-5):1.0\r\n"
+	"CPE510(TP-LINK|UN|N300-5):1.1\r\n"
 	"CPE520(TP-LINK|UN|N300-5):1.0\r\n"
+	"CPE520(TP-LINK|UN|N300-5):1.1\r\n"
 	"CPE210(TP-LINK|UN|N300-2):1.0\r\n"
+	"CPE210(TP-LINK|UN|N300-2):1.1\r\n"
 	"CPE220(TP-LINK|UN|N300-2):1.0\r\n"
-	"\r\n\xff";
+	"CPE220(TP-LINK|UN|N300-2):1.1\r\n";
 
 #define error(_ret, _errno, _str, ...)				\
 	do {							\
@@ -151,8 +150,16 @@ static const unsigned char cpe510_support_list[] =
 	} while (0)
 
 
+/** Stores a uint32 as big endian */
+static inline void put32(uint8_t *buf, uint32_t val) {
+	buf[0] = val >> 24;
+	buf[1] = val >> 16;
+	buf[2] = val >> 8;
+	buf[3] = val;
+}
+
 /** Allocates a new image partition */
-struct image_partition_entry alloc_image_partition(const char *name, size_t len) {
+static struct image_partition_entry alloc_image_partition(const char *name, size_t len) {
 	struct image_partition_entry entry = {name, len, malloc(len)};
 	if (!entry.data)
 		error(1, errno, "malloc");
@@ -161,12 +168,12 @@ struct image_partition_entry alloc_image_partition(const char *name, size_t len)
 }
 
 /** Frees an image partition */
-void free_image_partition(struct image_partition_entry entry) {
+static void free_image_partition(struct image_partition_entry entry) {
 	free(entry.data);
 }
 
 /** Generates the partition-table partition */
-struct image_partition_entry make_partition_table(const struct flash_partition_entry *p) {
+static struct image_partition_entry make_partition_table(const struct flash_partition_entry *p) {
 	struct image_partition_entry entry = alloc_image_partition("partition-table", 0x800);
 
 	char *s = (char *)entry.data, *end = (char *)(s+entry.size);
@@ -202,7 +209,7 @@ static inline uint8_t bcd(uint8_t v) {
 
 
 /** Generates the soft-version partition */
-struct image_partition_entry make_soft_version(uint32_t rev) {
+static struct image_partition_entry make_soft_version(uint32_t rev) {
 	struct image_partition_entry entry = alloc_image_partition("soft-version", sizeof(struct soft_version));
 	struct soft_version *s = (struct soft_version *)entry.data;
 
@@ -233,14 +240,20 @@ struct image_partition_entry make_soft_version(uint32_t rev) {
 }
 
 /** Generates the support-list partition */
-struct image_partition_entry make_support_list(const unsigned char *support_list, size_t len) {
-	struct image_partition_entry entry = alloc_image_partition("support-list", len);
-	memcpy(entry.data, support_list, len);
+static struct image_partition_entry make_support_list(const char *support_list) {
+	size_t len = strlen(support_list);
+	struct image_partition_entry entry = alloc_image_partition("support-list", len + 9);
+
+	put32(entry.data, len);
+	memset(entry.data+4, 0, 4);
+	memcpy(entry.data+8, support_list, len);
+	entry.data[len+8] = '\xff';
+
 	return entry;
 }
 
 /** Creates a new image partition with an arbitrary name from a file */
-struct image_partition_entry read_file(const char *part_name, const char *filename, bool add_jffs2_eof) {
+static struct image_partition_entry read_file(const char *part_name, const char *filename, bool add_jffs2_eof) {
 	struct stat statbuf;
 
 	if (stat(filename, &statbuf) < 0)
@@ -300,7 +313,7 @@ struct image_partition_entry read_file(const char *part_name, const char *filena
 
    I think partition-table must be the first partition in the firmware image.
 */
-void put_partitions(uint8_t *buffer, const struct image_partition_entry *parts) {
+static void put_partitions(uint8_t *buffer, const struct image_partition_entry *parts) {
 	size_t i;
 	char *image_pt = (char *)buffer, *end = image_pt + 0x800;
 
@@ -325,7 +338,7 @@ void put_partitions(uint8_t *buffer, const struct image_partition_entry *parts)
 }
 
 /** Generates and writes the image MD5 checksum */
-void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) {
+static void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) {
 	MD5_CTX ctx;
 
 	MD5_Init(&ctx);
@@ -344,12 +357,13 @@ void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) {
      -----------  -----
      0000-0003    Image size (4 bytes, big endian)
      0004-0013    MD5 hash (hash of a 16 byte salt and the image data starting with byte 0x14)
-     0014-1013    Vendor information (4096 bytes, padded with 0xff; there seem to be older
+     0014-0017    Vendor information length (without padding) (4 bytes, big endian)
+     0018-1013    Vendor information (4092 bytes, padded with 0xff; there seem to be older
                   (VxWorks-based) TP-LINK devices which use a smaller vendor information block)
      1014-1813    Image partition table (2048 bytes, padded with 0xff)
      1814-xxxx    Firmware partitions
 */
-void * generate_factory_image(const unsigned char *vendor, size_t vendor_len, const struct image_partition_entry *parts, size_t *len) {
+static void * generate_factory_image(const char *vendor, const struct image_partition_entry *parts, size_t *len) {
 	*len = 0x1814;
 
 	size_t i;
@@ -360,13 +374,12 @@ void * generate_factory_image(const unsigned char *vendor, size_t vendor_len, co
 	if (!image)
 		error(1, errno, "malloc");
 
-	image[0] = *len >> 24;
-	image[1] = *len >> 16;
-	image[2] = *len >> 8;
-	image[3] = *len;
+	put32(image, *len);
 
-	memcpy(image+0x14, vendor, vendor_len);
-	memset(image+0x14+vendor_len, 0xff, 4096-vendor_len);
+	size_t vendor_len = strlen(vendor);
+	put32(image+0x14, vendor_len);
+	memcpy(image+0x18, vendor, vendor_len);
+	memset(image+0x18+vendor_len, 0xff, 4092-vendor_len);
 
 	put_partitions(image + 0x1014, parts);
 	put_md5(image+0x04, image+0x14, *len-0x14);
@@ -381,7 +394,7 @@ void * generate_factory_image(const unsigned char *vendor, size_t vendor_len, co
    should be generalized when TP-LINK starts building its safeloader into hardware with
    different flash layouts.
 */
-void * generate_sysupgrade_image(const struct flash_partition_entry *flash_parts, const struct image_partition_entry *image_parts, size_t *len) {
+static void * generate_sysupgrade_image(const struct flash_partition_entry *flash_parts, const struct image_partition_entry *image_parts, size_t *len) {
 	const struct flash_partition_entry *flash_os_image = &flash_parts[5];
 	const struct flash_partition_entry *flash_soft_version = &flash_parts[6];
 	const struct flash_partition_entry *flash_support_list = &flash_parts[7];
@@ -430,7 +443,7 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
 
 	parts[0] = make_partition_table(cpe510_partitions);
 	parts[1] = make_soft_version(rev);
-	parts[2] = make_support_list(cpe510_support_list, sizeof(cpe510_support_list)-1);
+	parts[2] = make_support_list(cpe510_support_list);
 	parts[3] = read_file("os-image", kernel_image, false);
 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
 
@@ -439,7 +452,7 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
 	if (sysupgrade)
 		image = generate_sysupgrade_image(cpe510_partitions, parts, &len);
 	else
-		image = generate_factory_image(cpe510_vendor, sizeof(cpe510_vendor)-1, parts, &len);
+		image = generate_factory_image(cpe510_vendor, parts, &len);
 
 	FILE *file = fopen(output, "wb");
 	if (!file)
@@ -459,7 +472,7 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
 
 
 /** Usage output */
-void usage(const char *argv0) {
+static void usage(const char *argv0) {
 	fprintf(stderr,
 		"Usage: %s [OPTIONS...]\n"
 		"\n"