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(®, RXCSR0_DROP_CONTROL, + !(filter_flags & FIF_CONTROL)); +- rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, 1); ++ rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, ++ !rt2x00dev->is_monitoring); + rt2x00_set_field32(®, RXCSR0_DROP_TODS, ++ !rt2x00dev->is_monitoring && + !rt2x00dev->intf_ap_count); + rt2x00_set_field32(®, 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(®, RXCSR0_DROP_CONTROL, + !(filter_flags & FIF_CONTROL)); +- rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, 1); ++ rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, ++ !rt2x00dev->is_monitoring); + rt2x00_set_field32(®, RXCSR0_DROP_TODS, ++ !rt2x00dev->is_monitoring && + !rt2x00dev->intf_ap_count); + rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); + rt2x00_set_field32(®, 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(®, TXRX_CSR2_DROP_CONTROL, + !(filter_flags & FIF_CONTROL)); +- rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, 1); ++ rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, ++ !rt2x00dev->is_monitoring); + rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS, ++ !rt2x00dev->is_monitoring && + !rt2x00dev->intf_ap_count); + rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1); + rt2x00_set_field16(®, 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(®, RX_FILTER_CFG_DROP_PHY_ERROR, + !(filter_flags & FIF_PLCPFAIL)); +- rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, 1); ++ rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, ++ !rt2x00dev->is_monitoring); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_VER_ERROR, 1); + rt2x00_set_field32(®, 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(®, TXRX_CSR0_DROP_CONTROL, + !(filter_flags & (FIF_CONTROL | FIF_PSPOLL))); +- rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, 1); ++ rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, ++ !rt2x00dev->is_monitoring); + rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, ++ !rt2x00dev->is_monitoring && + !rt2x00dev->intf_ap_count); + rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); + rt2x00_set_field32(®, 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(®, TXRX_CSR0_DROP_CONTROL, + !(filter_flags & (FIF_CONTROL | FIF_PSPOLL))); +- rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, 1); ++ rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, ++ !rt2x00dev->is_monitoring); + rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, ++ !rt2x00dev->is_monitoring && + !rt2x00dev->intf_ap_count); + rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); + rt2x00_set_field32(®, 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, ð, 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, ð, 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)), ð, 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, ¶ms->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(®, H2M_MAILBOX_CSR_CMD_TOKEN, token); rt2x00_set_field32(®, 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(®, 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(®, 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, ®); rt2x00_set_field32(®, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE); @@ -63,7 +63,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> rt2x00_set_field32(®, MAX_LEN_CFG_MAX_PSDU, 2); else rt2x00_set_field32(®, 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(®, RF_CSR_CFG_REGNUM_MT7620, word); + rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 1); + rt2x00_set_field32(®, 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(®, RF_CSR_CFG_REGNUM, word); + rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); + rt2x00_set_field32(®, 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 = ¶ms->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 = ð0; + ethernet2 = ð1; + ethernet3 = ð2; + }; + + 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 = <®_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 = <ð1>; + 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 µsom_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"