Compare commits
	
		
			213 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | ac733df99c | ||
|   | 59508e309e | ||
|   | 06f3b91902 | ||
|   | 5612114090 | ||
|   | 4d1ab84f1e | ||
|   | cdeb2322ea | ||
|   | f79926cb94 | ||
|   | 0a26490fe4 | ||
|   | 6a6e3a4928 | ||
|   | c5879b0676 | ||
|   | c835c9ebe5 | ||
|   | 6ebb8723a6 | ||
|   | f527436364 | ||
|   | f88bd7cd0f | ||
|   | 828a024c81 | ||
|   | 63a8424702 | ||
|   | 808f6a500c | ||
|   | 6d6db65d82 | ||
|   | bd5b5c749a | ||
|   | 06e0c30336 | ||
|   | 982dd01ac3 | ||
|   | 25b7295617 | ||
|   | 71ea3b4814 | ||
|   | 44aec27112 | ||
|   | 7efe538ac1 | ||
|   | be007c580e | ||
|   | dbb8e04472 | ||
|   | 853bad5af2 | ||
|   | df49e49bc7 | ||
|   | 72d045b2a6 | ||
|   | b8c9ded999 | ||
|   | eea6df8255 | ||
|   | 30a4966053 | ||
|   | 152f57f509 | ||
|   | fcba5ee47a | ||
|   | f30f25c33e | ||
|   | d6d9f256ff | ||
|   | e6057ed207 | ||
|   | 4a36180970 | ||
|   | 552bc355d1 | ||
|   | 14add3f724 | ||
|   | b194b3d97f | ||
|   | facbdec0b5 | ||
|   | 8785ebc471 | ||
|   | eb383710e2 | ||
|   | b7361c5b35 | ||
|   | 72c65c6213 | ||
|   | 5ad9164b9c | ||
|   | 72d8d8c6f3 | ||
|   | a3061e57e8 | ||
|   | 8a35c489ad | ||
|   | d536c1d04f | ||
|   | b2f3d9b05c | ||
|   | 9f0f4c1494 | ||
|   | 68ba0525a0 | ||
|   | cbd69f7e4e | ||
|   | 367a3bb36f | ||
|   | 4817e61f45 | ||
|   | 034a80009c | ||
|   | e5060b32e5 | ||
|   | b72dcd5457 | ||
|   | 57dfbac6ff | ||
|   | 32c9d467e3 | ||
|   | e967f4dd27 | ||
|   | eac4851bfd | ||
|   | 02515f0187 | ||
|   | f49efcd325 | ||
|   | 921cecbdf8 | ||
|   | b8567cb44e | ||
|   | 03ff2d7359 | ||
|   | f25d9cbe48 | ||
|   | bd64568d27 | ||
|   | 4e2c2b51f5 | ||
|   | 86bd886697 | ||
|   | 083854f06f | ||
|   | 42f3c1fe1c | ||
|   | 2ad4383b74 | ||
|   | f2b885d82e | ||
|   | 054ce1624c | ||
|   | b786a5ffc3 | ||
|   | c656cbc56b | ||
|   | ee3067c588 | ||
|   | 518bb7ae5a | ||
|   | 8ff8e51cda | ||
|   | 81f9cd56a2 | ||
|   | 29c0b575ee | ||
|   | 5c4b2eb3dd | ||
|   | 52add1988c | ||
|   | c578da6198 | ||
|   | 4b9bdb48d9 | ||
|   | 85d128f145 | ||
|   | e48b1c2c07 | ||
|   | e8f42223be | ||
|   | 41dc50fc27 | ||
|   | aec04e1deb | ||
|   | f61044a9b0 | ||
|   | 36288db2fd | ||
|   | bc49d7902c | ||
|   | a0bc62fe08 | ||
|   | 3f9a194e04 | ||
|   | c53bb974b2 | ||
|   | 5ed23223fd | ||
|   | 41de9a2e12 | ||
|   | 1b51a49a9d | ||
|   | 0224e32cd0 | ||
|   | bce140ebb9 | ||
|   | b313f0d189 | ||
|   | 581285c6dc | ||
|   | 0880105144 | ||
|   | 2a14335d95 | ||
|   | faea9bea44 | ||
|   | e9b60b587b | ||
|   | af3ae4b37c | ||
|   | d6a830ac7e | ||
|   | 9c915d1e7b | ||
|   | 4d561b3a30 | ||
|   | f8d8b60f1b | ||
|   | 4cd9625dd4 | ||
|   | 4f5ff0041a | ||
|   | d1d970e235 | ||
|   | e5bc7bff85 | ||
|   | 83c9bfad1e | ||
|   | 82009d4e30 | ||
|   | 786160cd76 | ||
|   | 4d9106afa6 | ||
|   | 02d511818f | ||
|   | 036cf93edf | ||
|   | cd99f3c744 | ||
|   | ef170bff32 | ||
|   | fe253bcb99 | ||
|   | 718c201b82 | ||
|   | 754f474568 | ||
|   | be7480cb5a | ||
|   | 7c5bc827b7 | ||
|   | acebb4a990 | ||
|   | 06fca0c48b | ||
|   | ff813588fd | ||
|   | 2f9568ac2a | ||
|   | f9519636f5 | ||
|   | d7cae5f0b4 | ||
|   | b2cd9b80ef | ||
|   | 977eb2c019 | ||
|   | ea43d60c18 | ||
|   | d5b5339540 | ||
|   | 01888f90a0 | ||
|   | 198d73b26f | ||
|   | 0780fd5ee6 | ||
|   | 2cf64afd4e | ||
|   | 51b6dd1aed | ||
|   | 3e4b00e6fa | ||
|   | ca2a03d1f6 | ||
|   | 0656bee36b | ||
|   | e53e44a0ad | ||
|   | 47fa00a3d4 | ||
|   | b2437a02a4 | ||
|   | f4162bf3ca | ||
|   | e3849823e0 | ||
|   | 5f2a1ac59a | ||
|   | 406f85a328 | ||
|   | 76f1b9457d | ||
|   | bda982b97f | ||
|   | e038c60049 | ||
|   | 4fa8f2a7a1 | ||
|   | 31b0640906 | ||
|   | ec095b5bf3 | ||
|   | b8fcbbf31d | ||
|   | 70a6bbd53d | ||
|   | f5e8c908bd | ||
|   | 69f773daa3 | ||
|   | d46ce9498c | ||
|   | c170848254 | ||
|   | 2ee7bc0a5e | ||
|   | f5ab082243 | ||
|   | 66211d0781 | ||
|   | 36db143690 | ||
|   | ecc362ed04 | ||
|   | a1f918cd92 | ||
|   | 04a5085127 | ||
|   | dfe77be01f | ||
|   | f9022964cf | ||
|   | acd1795a60 | ||
|   | a6f3ea5e84 | ||
|   | 6b68635047 | ||
|   | e9ecb228c9 | ||
|   | e9d2173921 | ||
|   | 81f2196bb1 | ||
|   | 86b4b027cf | ||
|   | 806d3cc2c3 | ||
|   | f6de4a5025 | ||
|   | fc366fde07 | ||
|   | b630d525c8 | ||
|   | c2ecf9c37a | ||
|   | 4d73b6b8d0 | ||
|   | 0a4d20fa9c | ||
|   | 392cccb7f4 | ||
|   | e775adead8 | ||
|   | 6193e3cdee | ||
|   | b36e24f39e | ||
|   | 296772f939 | ||
|   | b850218584 | ||
|   | ef08595c3f | ||
|   | 3a9926e40f | ||
|   | 12392e5600 | ||
|   | cfb3ef3a97 | ||
|   | 2c4d158d80 | ||
|   | cf5f7aa0b6 | ||
|   | 4039b3eba1 | ||
|   | 6538961d6a | ||
|   | c76da77573 | ||
|   | 29a4a17f55 | ||
|   | c71e13a81a | ||
|   | 2ac776ac76 | ||
|   | 1e1e3ef2fb | 
| @@ -9,7 +9,7 @@ menu "Global build settings" | |||||||
|  |  | ||||||
| 	config ALL_NONSHARED | 	config ALL_NONSHARED | ||||||
| 		bool "Select all target specific packages by default" | 		bool "Select all target specific packages by default" | ||||||
| 		default ALL | 		default ALL || BUILDBOT | ||||||
|  |  | ||||||
| 	config ALL_KMODS | 	config ALL_KMODS | ||||||
| 		bool "Select all kernel module packages by default" | 		bool "Select all kernel module packages by default" | ||||||
| @@ -19,6 +19,16 @@ menu "Global build settings" | |||||||
| 		bool "Select all userspace packages by default" | 		bool "Select all userspace packages by default" | ||||||
| 		default n | 		default n | ||||||
|  |  | ||||||
|  | 	config BUILDBOT | ||||||
|  | 		bool "Set build defaults for automatic builds (e.g. via buildbot)" | ||||||
|  | 		default n | ||||||
|  | 		help | ||||||
|  | 		  This option changes several defaults to be more suitable for | ||||||
|  | 		  automatic builds. This includes the following changes: | ||||||
|  | 		  - Deleting build directories after compiling (to save space) | ||||||
|  | 		  - Enabling per-device rootfs support | ||||||
|  | 		  ... | ||||||
|  |  | ||||||
| 	config SIGNED_PACKAGES | 	config SIGNED_PACKAGES | ||||||
| 		bool "Cryptographically signed package lists" | 		bool "Cryptographically signed package lists" | ||||||
| 		default y | 		default y | ||||||
| @@ -61,7 +71,7 @@ menu "Global build settings" | |||||||
| 		bool | 		bool | ||||||
| 		prompt "Collect kernel debug information" | 		prompt "Collect kernel debug information" | ||||||
| 		select KERNEL_DEBUG_INFO | 		select KERNEL_DEBUG_INFO | ||||||
| 		default n | 		default BUILDBOT | ||||||
| 		help | 		help | ||||||
| 		  This collects debugging symbols from the kernel and all compiled modules. | 		  This collects debugging symbols from the kernel and all compiled modules. | ||||||
| 		  Useful for release builds, so that kernel issues can be debugged offline | 		  Useful for release builds, so that kernel issues can be debugged offline | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ menuconfig DEVEL | |||||||
| 		bool "Use ccache" if DEVEL | 		bool "Use ccache" if DEVEL | ||||||
| 		default n | 		default n | ||||||
| 		help | 		help | ||||||
| 		  Compiler cache; see http://ccache.samba.org/. | 		  Compiler cache; see https://ccache.samba.org/ | ||||||
|  |  | ||||||
| 	config EXTERNAL_KERNEL_TREE | 	config EXTERNAL_KERNEL_TREE | ||||||
| 		string "Use external kernel tree" if DEVEL | 		string "Use external kernel tree" if DEVEL | ||||||
|   | |||||||
| @@ -201,7 +201,6 @@ menu "Target Images" | |||||||
| 		int "Serial port baud rate" | 		int "Serial port baud rate" | ||||||
| 		depends on GRUB_IMAGES | 		depends on GRUB_IMAGES | ||||||
| 		default 38400 if TARGET_x86_generic | 		default 38400 if TARGET_x86_generic | ||||||
| 		default 38400 if TARGET_x86_geode |  | ||||||
| 		default 115200 | 		default 115200 | ||||||
|  |  | ||||||
| 	config GRUB_BOOTOPTS | 	config GRUB_BOOTOPTS | ||||||
|   | |||||||
| @@ -1,8 +1,4 @@ | |||||||
| src-git packages https://git.lede-project.org/feed/packages.git | src-git packages https://git.lede-project.org/feed/packages.git^ed90827282851ad93294e370860320f1af428bb2 | ||||||
| src-git luci https://git.lede-project.org/project/luci.git | src-git luci https://git.lede-project.org/project/luci.git^a100738163585ae1edc24d832ca9bef1f34beef0 | ||||||
| src-git routing https://git.lede-project.org/feed/routing.git | src-git routing https://git.lede-project.org/feed/routing.git^dd36dd47bbd75defcb3c517cafe7a19ee425f0af | ||||||
| src-git telephony https://git.lede-project.org/feed/telephony.git | src-git telephony https://git.lede-project.org/feed/telephony.git^1f0fb2538ba6fc306198fe2a9a4b976d63adb304 | ||||||
| #src-git targets https://github.com/openwrt/targets.git |  | ||||||
| #src-git management https://github.com/openwrt-management/packages.git |  | ||||||
| #src-git oldpackages http://git.openwrt.org/packages.git |  | ||||||
| #src-link custom /usr/src/openwrt/custom-feed |  | ||||||
|   | |||||||
| @@ -67,6 +67,12 @@ HOST_CONFIGURE_ARGS = \ | |||||||
| 	--localstatedir=$(HOST_BUILD_PREFIX)/var \ | 	--localstatedir=$(HOST_BUILD_PREFIX)/var \ | ||||||
| 	--sbindir=$(HOST_BUILD_PREFIX)/bin | 	--sbindir=$(HOST_BUILD_PREFIX)/bin | ||||||
|  |  | ||||||
|  | HOST_MAKE_VARS = \ | ||||||
|  | 	CFLAGS="$(HOST_CFLAGS)" \ | ||||||
|  | 	CPPFLAGS="$(HOST_CPPFLAGS)" \ | ||||||
|  | 	CXXFLAGS="$(HOST_CXXFLAGS)" \ | ||||||
|  | 	LDFLAGS="$(HOST_LDFLAGS)" | ||||||
|  |  | ||||||
| HOST_MAKE_FLAGS = | HOST_MAKE_FLAGS = | ||||||
|  |  | ||||||
| HOST_CONFIGURE_CMD = $(BASH) ./configure | HOST_CONFIGURE_CMD = $(BASH) ./configure | ||||||
| @@ -89,7 +95,8 @@ define Host/Configure | |||||||
| endef | endef | ||||||
|  |  | ||||||
| define Host/Compile/Default | define Host/Compile/Default | ||||||
| 	+$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) \ | 	+$(HOST_MAKE_VARS) \ | ||||||
|  | 	$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) \ | ||||||
| 		$(HOST_MAKE_FLAGS) \ | 		$(HOST_MAKE_FLAGS) \ | ||||||
| 		$(1) | 		$(1) | ||||||
| endef | endef | ||||||
|   | |||||||
| @@ -60,7 +60,7 @@ define Download/git-kernel | |||||||
|   PROTO:=git |   PROTO:=git | ||||||
|   VERSION:=$(CONFIG_KERNEL_GIT_BRANCH) |   VERSION:=$(CONFIG_KERNEL_GIT_BRANCH) | ||||||
|   FILE:=$(LINUX_SOURCE) |   FILE:=$(LINUX_SOURCE) | ||||||
|   SUBDIR:=linux-$(KERNEL_PATCHVER) |   SUBDIR:=linux-$(LINUX_VERSION) | ||||||
|   OPTS:=$(KERNEL_GIT_OPTS) |   OPTS:=$(KERNEL_GIT_OPTS) | ||||||
| endef | endef | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,10 +3,10 @@ | |||||||
| LINUX_RELEASE?=1 | LINUX_RELEASE?=1 | ||||||
|  |  | ||||||
| LINUX_VERSION-3.18 = .43 | LINUX_VERSION-3.18 = .43 | ||||||
| LINUX_VERSION-4.4 = .42 | LINUX_VERSION-4.4 = .50 | ||||||
|  |  | ||||||
| LINUX_KERNEL_HASH-3.18.43 = 1236e8123a6ce537d5029232560966feed054ae31776fe8481dd7d18cdd5492c | LINUX_KERNEL_HASH-3.18.43 = 1236e8123a6ce537d5029232560966feed054ae31776fe8481dd7d18cdd5492c | ||||||
| LINUX_KERNEL_HASH-4.4.42 = 324747568e92f203e3ee5ec8b291a868f58b870f1ad214fa64aa3507ed42e878 | LINUX_KERNEL_HASH-4.4.50 = e4944ca5bb0bdf63a7e97dc7fbdd38bcc820d8b3b57c4a3a7b3bf9c8a48216b7 | ||||||
|  |  | ||||||
| ifdef KERNEL_PATCHVER | ifdef KERNEL_PATCHVER | ||||||
|   LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) |   LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) | ||||||
|   | |||||||
| @@ -209,11 +209,13 @@ $(_endef) | |||||||
| 		( \ | 		( \ | ||||||
| 			echo "#!/bin/sh"; \ | 			echo "#!/bin/sh"; \ | ||||||
| 			echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \ | 			echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \ | ||||||
|  | 			echo "[ -x "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \ | ||||||
| 			echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ | 			echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ | ||||||
| 			echo "default_postinst \$$$$0 \$$$$@"; \ | 			echo "default_postinst \$$$$0 \$$$$@"; \ | ||||||
| 		) > postinst; \ | 		) > postinst; \ | ||||||
| 		( \ | 		( \ | ||||||
| 			echo "#!/bin/sh"; \ | 			echo "#!/bin/sh"; \ | ||||||
|  | 			echo "[ -x "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \ | ||||||
| 			echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ | 			echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ | ||||||
| 			echo "default_prerm \$$$$0 \$$$$@"; \ | 			echo "default_prerm \$$$$0 \$$$$@"; \ | ||||||
| 		) > prerm; \ | 		) > prerm; \ | ||||||
|   | |||||||
| @@ -47,6 +47,14 @@ opkg = \ | |||||||
|  |  | ||||||
| TARGET_DIR_ORIG := $(TARGET_ROOTFS_DIR)/root.orig-$(BOARD) | TARGET_DIR_ORIG := $(TARGET_ROOTFS_DIR)/root.orig-$(BOARD) | ||||||
|  |  | ||||||
|  | ifdef CONFIG_CLEAN_IPKG | ||||||
|  |   define clean_ipkg | ||||||
|  | 	-find $(1)/usr/lib/opkg -type f -and -not -name '*.control' | $(XARGS) rm -rf | ||||||
|  | 	-sed -i -ne '/^Require-User: /p' $(1)/usr/lib/opkg/info/*.control | ||||||
|  | 	-find $(1)/usr/lib/opkg -empty | $(XARGS) rm -rf | ||||||
|  |   endef | ||||||
|  | endif | ||||||
|  |  | ||||||
| define prepare_rootfs | define prepare_rootfs | ||||||
| 	@if [ -d $(TOPDIR)/files ]; then \ | 	@if [ -d $(TOPDIR)/files ]; then \ | ||||||
| 		$(call file_copy,$(TOPDIR)/files/.,$(1)); \ | 		$(call file_copy,$(TOPDIR)/files/.,$(1)); \ | ||||||
| @@ -75,6 +83,6 @@ define prepare_rootfs | |||||||
| 	rm -f $(1)/usr/lib/opkg/lists/* | 	rm -f $(1)/usr/lib/opkg/lists/* | ||||||
| 	rm -f $(1)/usr/lib/opkg/info/*.postinst* | 	rm -f $(1)/usr/lib/opkg/info/*.postinst* | ||||||
| 	rm -f $(1)/usr/lib/opkg/info/*.prerm* | 	rm -f $(1)/usr/lib/opkg/info/*.prerm* | ||||||
| 	$(if $(CONFIG_CLEAN_IPKG),rm -rf $(1)/usr/lib/opkg) | 	$(call clean_ipkg,$(1)) | ||||||
| 	$(call mklibs,$(1)) | 	$(call mklibs,$(1)) | ||||||
| endef | endef | ||||||
|   | |||||||
| @@ -164,17 +164,15 @@ ifeq ($(DUMP),1) | |||||||
|     endif |     endif | ||||||
|     CPU_CFLAGS += -mno-branch-likely |     CPU_CFLAGS += -mno-branch-likely | ||||||
|     CPU_CFLAGS_mips32 = -mips32 -mtune=mips32 |     CPU_CFLAGS_mips32 = -mips32 -mtune=mips32 | ||||||
|     CPU_CFLAGS_mips32r2 = -mips32r2 -mtune=mips32r2 |  | ||||||
|     CPU_CFLAGS_mips64 = -mips64 -mtune=mips64 -mabi=64 |     CPU_CFLAGS_mips64 = -mips64 -mtune=mips64 -mabi=64 | ||||||
|     CPU_CFLAGS_24kc = -mips32r2 -mtune=24kc |     CPU_CFLAGS_24kc = -mips32r2 -mtune=24kc | ||||||
|     CPU_CFLAGS_74kc = -mips32r2 -mtune=74kc |     CPU_CFLAGS_74kc = -mips32r2 -mtune=74kc | ||||||
|     CPU_CFLAGS_octeon = -march=octeon -mabi=64 |     CPU_CFLAGS_octeon = -march=octeon -mabi=64 | ||||||
|   endif |   endif | ||||||
|   ifeq ($(ARCH),i386) |   ifeq ($(ARCH),i386) | ||||||
|     CPU_TYPE ?= i486 |     CPU_TYPE ?= pentium | ||||||
|     CPU_CFLAGS_i486 = -march=i486 |     CPU_CFLAGS_pentium = -march=pentium-mmx | ||||||
|     CPU_CFLAGS_pentium4 = -march=pentium4 |     CPU_CFLAGS_pentium4 = -march=pentium4 | ||||||
|     CPU_CFLAGS_geode = -march=geode -mmmx -m3dnow |  | ||||||
|   endif |   endif | ||||||
|   ifneq ($(findstring arm,$(ARCH)),) |   ifneq ($(findstring arm,$(ARCH)),) | ||||||
|     CPU_TYPE ?= xscale |     CPU_TYPE ?= xscale | ||||||
| @@ -259,6 +257,9 @@ ifeq ($(DUMP),1) | |||||||
|     ifneq ($(CONFIG_VIRTIO),) |     ifneq ($(CONFIG_VIRTIO),) | ||||||
|       FEATURES += virtio |       FEATURES += virtio | ||||||
|     endif |     endif | ||||||
|  |     ifneq ($(CONFIG_CPU_MIPS32_R2),) | ||||||
|  |       FEATURES += mips16 | ||||||
|  |     endif | ||||||
|     FEATURES += $(foreach v,6 7,$(if $(CONFIG_CPU_V$(v)),arm_v$(v))) |     FEATURES += $(foreach v,6 7,$(if $(CONFIG_CPU_V$(v)),arm_v$(v))) | ||||||
|  |  | ||||||
|     # remove duplicates |     # remove duplicates | ||||||
|   | |||||||
| @@ -31,16 +31,16 @@ qstrip_escape=$(subst ','\'',$(call qstrip,$(1))) | |||||||
| sanitize = $(call tolower,$(subst _,-,$(subst $(space),-,$(1)))) | sanitize = $(call tolower,$(subst _,-,$(subst $(space),-,$(1)))) | ||||||
|  |  | ||||||
| VERSION_NUMBER:=$(call qstrip_escape,$(CONFIG_VERSION_NUMBER)) | VERSION_NUMBER:=$(call qstrip_escape,$(CONFIG_VERSION_NUMBER)) | ||||||
| VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),SNAPSHOT) | VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),17.01.0) | ||||||
|  |  | ||||||
| VERSION_CODE:=$(call qstrip_escape,$(CONFIG_VERSION_CODE)) | VERSION_CODE:=$(call qstrip_escape,$(CONFIG_VERSION_CODE)) | ||||||
| VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),$(REVISION)) | VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),r3205-59508e3) | ||||||
|  |  | ||||||
| VERSION_NICK:=$(call qstrip_escape,$(CONFIG_VERSION_NICK)) | VERSION_NICK:=$(call qstrip_escape,$(CONFIG_VERSION_NICK)) | ||||||
| VERSION_NICK:=$(if $(VERSION_NICK),$(VERSION_NICK),$(RELEASE)) | VERSION_NICK:=$(if $(VERSION_NICK),$(VERSION_NICK),$(RELEASE)) | ||||||
|  |  | ||||||
| VERSION_REPO:=$(call qstrip_escape,$(CONFIG_VERSION_REPO)) | VERSION_REPO:=$(call qstrip_escape,$(CONFIG_VERSION_REPO)) | ||||||
| VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.lede-project.org/snapshots) | VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.lede-project.org/releases/17.01.0) | ||||||
|  |  | ||||||
| VERSION_DIST:=$(call qstrip_escape,$(CONFIG_VERSION_DIST)) | VERSION_DIST:=$(call qstrip_escape,$(CONFIG_VERSION_DIST)) | ||||||
| VERSION_DIST:=$(if $(VERSION_DIST),$(VERSION_DIST),LEDE) | VERSION_DIST:=$(if $(VERSION_DIST),$(VERSION_DIST),LEDE) | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk | |||||||
| include $(INCLUDE_DIR)/version.mk | include $(INCLUDE_DIR)/version.mk | ||||||
|  |  | ||||||
| PKG_NAME:=base-files | PKG_NAME:=base-files | ||||||
| PKG_RELEASE:=171 | PKG_RELEASE:=172 | ||||||
| PKG_FLAGS:=nonshared | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ | PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ | ||||||
| @@ -57,6 +57,7 @@ define Package/base-files/conffiles | |||||||
| /etc/sysctl.d/local.conf | /etc/sysctl.d/local.conf | ||||||
| /etc/sysctl.d/ | /etc/sysctl.d/ | ||||||
| /etc/iproute2/rt_tables | /etc/iproute2/rt_tables | ||||||
|  | /etc/iproute2/rt_protos | ||||||
| $(call $(TARGET)/conffiles) | $(call $(TARGET)/conffiles) | ||||||
| endef | endef | ||||||
|  |  | ||||||
|   | |||||||
| @@ -226,7 +226,7 @@ generate_static_system() { | |||||||
| 	uci -q batch <<-EOF | 	uci -q batch <<-EOF | ||||||
| 		delete system.@system[0] | 		delete system.@system[0] | ||||||
| 		add system system | 		add system system | ||||||
| 		set system.@system[-1].hostname='lede' | 		set system.@system[-1].hostname='LEDE' | ||||||
| 		set system.@system[-1].timezone='UTC' | 		set system.@system[-1].timezone='UTC' | ||||||
| 		set system.@system[-1].ttylogin='0' | 		set system.@system[-1].ttylogin='0' | ||||||
| 		set system.@system[-1].log_size='64' | 		set system.@system[-1].log_size='64' | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								package/base-files/files/etc/iproute2/rt_protos
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								package/base-files/files/etc/iproute2/rt_protos
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | # | ||||||
|  | # Reserved protocols. | ||||||
|  | # | ||||||
|  | 0	unspec | ||||||
|  | 1	redirect | ||||||
|  | 2	kernel | ||||||
|  | 3	boot | ||||||
|  | 4	static | ||||||
|  | 8	gated | ||||||
|  | 9	ra | ||||||
|  | 10	mrt | ||||||
|  | 11	zebra | ||||||
|  | 12	bird | ||||||
|  | 13	dnrouted | ||||||
|  | 14	xorp | ||||||
|  | 15	ntk | ||||||
|  | 16	dhcp | ||||||
|  | 42	babel | ||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| . /lib/functions.sh | . /lib/functions.sh | ||||||
|  |  | ||||||
| for file in `grep Require-User /usr/lib/opkg/info/*.control | cut -d: -f1`; do | for file in `grep -sl Require-User /usr/lib/opkg/info/*.control`; do | ||||||
| 	file="${file##*/}" | 	file="${file##*/}" | ||||||
| 	file="${file%.control}" | 	file="${file%.control}" | ||||||
| 	add_group_and_user "${file}" | 	add_group_and_user "${file}" | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ do_sysinfo_generic() { | |||||||
| 	mkdir -p /tmp/sysinfo | 	mkdir -p /tmp/sysinfo | ||||||
| 	[ -e /tmp/sysinfo/board_name ] || \ | 	[ -e /tmp/sysinfo/board_name ] || \ | ||||||
| 		echo "$(strings /proc/device-tree/compatible | head -1)" > /tmp/sysinfo/board_name | 		echo "$(strings /proc/device-tree/compatible | head -1)" > /tmp/sysinfo/board_name | ||||||
| 	[ -n /tmp/sysinfo/model -a -e /proc/device-tree/model ] && \ | 	[ ! -e /tmp/sysinfo/model -a -e /proc/device-tree/model ] && \ | ||||||
| 		echo "$(cat /proc/device-tree/model)" > /tmp/sysinfo/model | 		echo "$(cat /proc/device-tree/model)" > /tmp/sysinfo/model | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -190,7 +190,7 @@ if VERSIONOPT | |||||||
| 	config VERSION_REPO | 	config VERSION_REPO | ||||||
| 		string | 		string | ||||||
| 		prompt "Release repository" | 		prompt "Release repository" | ||||||
| 		default "http://downloads.lede-project.org/snapshots" | 		default "http://downloads.lede-project.org/releases/17.01.0" | ||||||
| 		help | 		help | ||||||
| 			This is the repository address embedded in the image, it defaults | 			This is the repository address embedded in the image, it defaults | ||||||
| 			to the trunk snapshot repo; the url may contain the following placeholders: | 			to the trunk snapshot repo; the url may contain the following placeholders: | ||||||
| @@ -286,7 +286,7 @@ menuconfig PER_FEED_REPO | |||||||
|  |  | ||||||
| 	config PER_FEED_REPO_ADD_COMMENTED | 	config PER_FEED_REPO_ADD_COMMENTED | ||||||
| 		bool "Comment out not enabled feeds" | 		bool "Comment out not enabled feeds" | ||||||
| 		default y | 		default !BUILDBOT | ||||||
| 		depends on PER_FEED_REPO && PER_FEED_REPO_ADD_DISABLED | 		depends on PER_FEED_REPO && PER_FEED_REPO_ADD_DISABLED | ||||||
| 		help | 		help | ||||||
| 		  Add not enabled feeds as commented out source lines to opkg.conf. | 		  Add not enabled feeds as commented out source lines to opkg.conf. | ||||||
|   | |||||||
| @@ -25,6 +25,8 @@ PKG_BUILD_DEPENDS:=grub2/host | |||||||
|  |  | ||||||
| PKG_SSP:=0 | PKG_SSP:=0 | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/host-build.mk | include $(INCLUDE_DIR)/host-build.mk | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,8 @@ PKG_RELEASE:=1 | |||||||
|  |  | ||||||
| PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) | PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
| define Package/rbcfg | define Package/rbcfg | ||||||
|   | |||||||
| @@ -14,6 +14,8 @@ touch /etc/config/ubootenv | |||||||
| board=$(ar71xx_board_name) | board=$(ar71xx_board_name) | ||||||
|  |  | ||||||
| case "$board" in | case "$board" in | ||||||
|  | a40|\ | ||||||
|  | a60|\ | ||||||
| alfa-ap120c|\ | alfa-ap120c|\ | ||||||
| all0258n|\ | all0258n|\ | ||||||
| ap90q|\ | ap90q|\ | ||||||
| @@ -52,8 +54,10 @@ om2p|\ | |||||||
| om2p-hs|\ | om2p-hs|\ | ||||||
| om2p-hsv2|\ | om2p-hsv2|\ | ||||||
| om2p-hsv3|\ | om2p-hsv3|\ | ||||||
|  | om2p-hsv4|\ | ||||||
| om2p-lc|\ | om2p-lc|\ | ||||||
| om2pv2) | om2pv2|\ | ||||||
|  | om2pv4) | ||||||
| 	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x40000" | 	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x40000" | ||||||
| 	;; | 	;; | ||||||
| dap-2695-a1|\ | dap-2695-a1|\ | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| -	"bootm 0x800000" | -	"bootm 0x800000" | ||||||
| +	"ubi part ubi; " \ | +	"ubi part ubi; " \ | ||||||
| +	"ubi read 0x800000 kernel; " \ | +	"ubi read 0x800000 kernel; " \ | ||||||
| +	"bootz 0x800000" | +	"bootm 0x800000" | ||||||
|   |   | ||||||
|  #define CONFIG_MTDPARTS \ |  #define CONFIG_MTDPARTS \ | ||||||
| -	"mtdparts=orion_nand:1m(uboot),6M(uImage),-(root)\0" | -	"mtdparts=orion_nand:1m(uboot),6M(uImage),-(root)\0" | ||||||
|   | |||||||
| @@ -17,6 +17,8 @@ PKG_HASH:=466eca9cdad2c15e957fb9ce7d0b6927ecd17d85c4cc2dff37e97a3e6b209c67 | |||||||
|  |  | ||||||
| PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) | PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
| define Package/yamonenv | define Package/yamonenv | ||||||
|   | |||||||
| @@ -22,6 +22,8 @@ PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAM | |||||||
| PKG_LICENSE:=GPL-2.0 GPL-2.0+ | PKG_LICENSE:=GPL-2.0 GPL-2.0+ | ||||||
| PKG_LICENSE_FILES:=Licenses/README | PKG_LICENSE_FILES:=Licenses/README | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
| define fman/Default | define fman/Default | ||||||
|   | |||||||
| @@ -20,6 +20,8 @@ PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAM | |||||||
| PKG_LICENSE:=GPL-2.0 GPL-2.0+ | PKG_LICENSE:=GPL-2.0 GPL-2.0+ | ||||||
| PKG_LICENSE_FILES:=Licenses/README | PKG_LICENSE_FILES:=Licenses/README | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
| define ppfe/Default | define ppfe/Default | ||||||
|   | |||||||
| @@ -22,6 +22,8 @@ PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(BUILD_VARIANT)/$(PKG_NAM | |||||||
| PKG_LICENSE:=GPL-2.0 GPL-2.0+ | PKG_LICENSE:=GPL-2.0 GPL-2.0+ | ||||||
| PKG_LICENSE_FILES:=Licenses/README | PKG_LICENSE_FILES:=Licenses/README | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
| define rcw/Default | define rcw/Default | ||||||
|   | |||||||
| @@ -12,10 +12,10 @@ PKG_NAME:=sched-cake | |||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
|  |  | ||||||
| PKG_SOURCE_PROTO:=git | PKG_SOURCE_PROTO:=git | ||||||
| PKG_SOURCE_URL:=https://github.com/kdarbyshirebryant/sch_cake.git | PKG_SOURCE_URL:=https://github.com/dtaht/sch_cake.git | ||||||
| PKG_SOURCE_DATE:=2016-12-19 | PKG_SOURCE_DATE:=2017-01-28 | ||||||
| PKG_SOURCE_VERSION:=70c8eb766d5afcf3cf187594b7cd776da92bee3c | PKG_SOURCE_VERSION:=9789742cfc596d48583ba4cdbc8f38d026121fa6 | ||||||
| PKG_MIRROR_HASH:=16174db5dad0a5b5ba522d4cfc058cff9851ed013a3a05166b04eb127bb12a24 | PKG_MIRROR_HASH:=2a5afc45722c28ca8778eb50452eb305306e7898b32d7d6d73d3e77edf3cce99 | ||||||
| PKG_MAINTAINER:=Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk> | PKG_MAINTAINER:=Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk> | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|   | |||||||
| @@ -736,7 +736,7 @@ $(eval $(call KernelPackage,mppe)) | |||||||
|  |  | ||||||
|  |  | ||||||
| SCHED_MODULES = $(patsubst $(LINUX_DIR)/net/sched/%.ko,%,$(wildcard $(LINUX_DIR)/net/sched/*.ko)) | SCHED_MODULES = $(patsubst $(LINUX_DIR)/net/sched/%.ko,%,$(wildcard $(LINUX_DIR)/net/sched/*.ko)) | ||||||
| SCHED_MODULES_CORE = sch_ingress sch_fq_codel sch_hfsc cls_fw cls_route cls_flow cls_tcindex cls_u32 em_u32 act_mirred act_skbedit | SCHED_MODULES_CORE = sch_ingress sch_fq_codel sch_hfsc sch_htb sch_tbf cls_fw cls_route cls_flow cls_tcindex cls_u32 em_u32 act_mirred act_skbedit | ||||||
| SCHED_MODULES_FILTER = $(SCHED_MODULES_CORE) act_connmark sch_netem | SCHED_MODULES_FILTER = $(SCHED_MODULES_CORE) act_connmark sch_netem | ||||||
| SCHED_MODULES_EXTRA = $(filter-out $(SCHED_MODULES_FILTER),$(SCHED_MODULES)) | SCHED_MODULES_EXTRA = $(filter-out $(SCHED_MODULES_FILTER),$(SCHED_MODULES)) | ||||||
| SCHED_FILES = $(patsubst %,$(LINUX_DIR)/net/sched/%.ko,$(filter $(SCHED_MODULES_CORE),$(SCHED_MODULES))) | SCHED_FILES = $(patsubst %,$(LINUX_DIR)/net/sched/%.ko,$(filter $(SCHED_MODULES_CORE),$(SCHED_MODULES))) | ||||||
| @@ -748,6 +748,8 @@ define KernelPackage/sched-core | |||||||
|   KCONFIG:= \ |   KCONFIG:= \ | ||||||
| 	CONFIG_NET_SCHED=y \ | 	CONFIG_NET_SCHED=y \ | ||||||
| 	CONFIG_NET_SCH_HFSC \ | 	CONFIG_NET_SCH_HFSC \ | ||||||
|  | 	CONFIG_NET_SCH_HTB \ | ||||||
|  | 	CONFIG_NET_SCH_TBF \ | ||||||
| 	CONFIG_NET_SCH_INGRESS \ | 	CONFIG_NET_SCH_INGRESS \ | ||||||
| 	CONFIG_NET_SCH_FQ_CODEL \ | 	CONFIG_NET_SCH_FQ_CODEL \ | ||||||
| 	CONFIG_NET_CLS=y \ | 	CONFIG_NET_CLS=y \ | ||||||
| @@ -789,12 +791,10 @@ define KernelPackage/sched | |||||||
|   KCONFIG:= \ |   KCONFIG:= \ | ||||||
| 	CONFIG_NET_SCH_CODEL \ | 	CONFIG_NET_SCH_CODEL \ | ||||||
| 	CONFIG_NET_SCH_DSMARK \ | 	CONFIG_NET_SCH_DSMARK \ | ||||||
| 	CONFIG_NET_SCH_HTB \ |  | ||||||
| 	CONFIG_NET_SCH_FIFO \ | 	CONFIG_NET_SCH_FIFO \ | ||||||
| 	CONFIG_NET_SCH_GRED \ | 	CONFIG_NET_SCH_GRED \ | ||||||
| 	CONFIG_NET_SCH_PRIO \ | 	CONFIG_NET_SCH_PRIO \ | ||||||
| 	CONFIG_NET_SCH_RED \ | 	CONFIG_NET_SCH_RED \ | ||||||
| 	CONFIG_NET_SCH_TBF \ |  | ||||||
| 	CONFIG_NET_SCH_SFQ \ | 	CONFIG_NET_SCH_SFQ \ | ||||||
| 	CONFIG_NET_SCH_TEQL \ | 	CONFIG_NET_SCH_TEQL \ | ||||||
| 	CONFIG_NET_SCH_FQ \ | 	CONFIG_NET_SCH_FQ \ | ||||||
|   | |||||||
| @@ -756,7 +756,7 @@ drv_mac80211_setup() { | |||||||
| 	for_each_interface "ap" mac80211_prepare_vif | 	for_each_interface "ap" mac80211_prepare_vif | ||||||
|  |  | ||||||
| 	[ -n "$hostapd_ctrl" ] && { | 	[ -n "$hostapd_ctrl" ] && { | ||||||
| 		/usr/sbin/hostapd -P /var/run/wifi-$phy.pid -B "$hostapd_conf_file" | 		/usr/sbin/hostapd -s -P /var/run/wifi-$phy.pid -B "$hostapd_conf_file" | ||||||
| 		ret="$?" | 		ret="$?" | ||||||
| 		wireless_add_process "$(cat /var/run/wifi-$phy.pid)" "/usr/sbin/hostapd" 1 | 		wireless_add_process "$(cat /var/run/wifi-$phy.pid)" "/usr/sbin/hostapd" 1 | ||||||
| 		[ "$ret" != 0 ] && { | 		[ "$ret" != 0 ] && { | ||||||
|   | |||||||
| @@ -0,0 +1,651 @@ | |||||||
|  | From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@toke.dk> | ||||||
|  | Date: Mon, 5 Dec 2016 13:27:37 +0200 | ||||||
|  | Subject: [PATCH] ath9k: Introduce airtime fairness scheduling between stations | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | This reworks the ath9k driver to schedule transmissions to connected | ||||||
|  | stations in a way that enforces airtime fairness between them. It | ||||||
|  | accomplishes this by measuring the time spent transmitting to or | ||||||
|  | receiving from a station at TX and RX completion, and accounting this to | ||||||
|  | a per-station, per-QoS level airtime deficit. Then, an FQ-CoDel based | ||||||
|  | deficit scheduler is employed at packet dequeue time, to control which | ||||||
|  | station gets the next transmission opportunity. | ||||||
|  |  | ||||||
|  | Airtime fairness can significantly improve the efficiency of the network | ||||||
|  | when station rates vary. The following throughput values are from a | ||||||
|  | simple three-station test scenario, where two stations operate at the | ||||||
|  | highest HT20 rate, and one station at the lowest, and the scheduler is | ||||||
|  | employed at the access point: | ||||||
|  |  | ||||||
|  |                   Before   /   After | ||||||
|  | Fast station 1:    19.17   /   25.09 Mbps | ||||||
|  | Fast station 2:    19.83   /   25.21 Mbps | ||||||
|  | Slow station:       2.58   /    1.77 Mbps | ||||||
|  | Total:             41.58   /   52.07 Mbps | ||||||
|  |  | ||||||
|  | The benefit of airtime fairness goes up the more stations are present. | ||||||
|  | In a 30-station test with one station artificially limited to 1 Mbps, | ||||||
|  | we have seen aggregate throughput go from 2.14 to 17.76 Mbps. | ||||||
|  |  | ||||||
|  | Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | @@ -112,6 +112,8 @@ int ath_descdma_setup(struct ath_softc * | ||||||
|  |  #define ATH_TXFIFO_DEPTH           8 | ||||||
|  |  #define ATH_TX_ERROR               0x01 | ||||||
|  |   | ||||||
|  | +#define ATH_AIRTIME_QUANTUM        300 /* usec */ | ||||||
|  | + | ||||||
|  |  /* Stop tx traffic 1ms before the GO goes away */ | ||||||
|  |  #define ATH_P2P_PS_STOP_TIME       1000 | ||||||
|  |   | ||||||
|  | @@ -247,6 +249,9 @@ struct ath_atx_tid { | ||||||
|  |  	bool has_queued; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +void __ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid); | ||||||
|  | +void ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid); | ||||||
|  | + | ||||||
|  |  struct ath_node { | ||||||
|  |  	struct ath_softc *sc; | ||||||
|  |  	struct ieee80211_sta *sta; /* station struct we're part of */ | ||||||
|  | @@ -258,9 +263,12 @@ struct ath_node { | ||||||
|  |   | ||||||
|  |  	bool sleeping; | ||||||
|  |  	bool no_ps_filter; | ||||||
|  | +	s64 airtime_deficit[IEEE80211_NUM_ACS]; | ||||||
|  | +	u32 airtime_rx_start; | ||||||
|  |   | ||||||
|  |  #ifdef CPTCFG_ATH9K_STATION_STATISTICS | ||||||
|  |  	struct ath_rx_rate_stats rx_rate_stats; | ||||||
|  | +	struct ath_airtime_stats airtime_stats; | ||||||
|  |  #endif | ||||||
|  |  	u8 key_idx[4]; | ||||||
|  |   | ||||||
|  | @@ -317,10 +325,16 @@ struct ath_rx { | ||||||
|  |  /* Channel Context */ | ||||||
|  |  /*******************/ | ||||||
|  |   | ||||||
|  | +struct ath_acq { | ||||||
|  | +	struct list_head acq_new; | ||||||
|  | +	struct list_head acq_old; | ||||||
|  | +	spinlock_t lock; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  struct ath_chanctx { | ||||||
|  |  	struct cfg80211_chan_def chandef; | ||||||
|  |  	struct list_head vifs; | ||||||
|  | -	struct list_head acq[IEEE80211_NUM_ACS]; | ||||||
|  | +	struct ath_acq acq[IEEE80211_NUM_ACS]; | ||||||
|  |  	int hw_queue_base; | ||||||
|  |   | ||||||
|  |  	/* do not dereference, use for comparison only */ | ||||||
|  | @@ -575,6 +589,8 @@ void ath_txq_schedule_all(struct ath_sof | ||||||
|  |  int ath_tx_init(struct ath_softc *sc, int nbufs); | ||||||
|  |  int ath_txq_update(struct ath_softc *sc, int qnum, | ||||||
|  |  		   struct ath9k_tx_queue_info *q); | ||||||
|  | +u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, int pktlen, | ||||||
|  | +		     int width, int half_gi, bool shortPreamble); | ||||||
|  |  void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop); | ||||||
|  |  void ath_assign_seq(struct ath_common *common, struct sk_buff *skb); | ||||||
|  |  int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | ||||||
|  | @@ -963,6 +979,11 @@ void ath_ant_comb_scan(struct ath_softc | ||||||
|  |   | ||||||
|  |  #define ATH9K_NUM_CHANCTX  2 /* supports 2 operating channels */ | ||||||
|  |   | ||||||
|  | +#define AIRTIME_USE_TX		BIT(0) | ||||||
|  | +#define AIRTIME_USE_RX		BIT(1) | ||||||
|  | +#define AIRTIME_USE_NEW_QUEUES	BIT(2) | ||||||
|  | +#define AIRTIME_ACTIVE(flags) (!!(flags & (AIRTIME_USE_TX|AIRTIME_USE_RX))) | ||||||
|  | + | ||||||
|  |  struct ath_softc { | ||||||
|  |  	struct ieee80211_hw *hw; | ||||||
|  |  	struct device *dev; | ||||||
|  | @@ -1005,6 +1026,8 @@ struct ath_softc { | ||||||
|  |  	short nbcnvifs; | ||||||
|  |  	unsigned long ps_usecount; | ||||||
|  |   | ||||||
|  | +	u16 airtime_flags; /* AIRTIME_* */ | ||||||
|  | + | ||||||
|  |  	struct ath_rx rx; | ||||||
|  |  	struct ath_tx tx; | ||||||
|  |  	struct ath_beacon beacon; | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/channel.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/channel.c | ||||||
|  | @@ -118,8 +118,11 @@ void ath_chanctx_init(struct ath_softc * | ||||||
|  |  		INIT_LIST_HEAD(&ctx->vifs); | ||||||
|  |  		ctx->txpower = ATH_TXPOWER_MAX; | ||||||
|  |  		ctx->flush_timeout = HZ / 5; /* 200ms */ | ||||||
|  | -		for (j = 0; j < ARRAY_SIZE(ctx->acq); j++) | ||||||
|  | -			INIT_LIST_HEAD(&ctx->acq[j]); | ||||||
|  | +		for (j = 0; j < ARRAY_SIZE(ctx->acq); j++) { | ||||||
|  | +			INIT_LIST_HEAD(&ctx->acq[j].acq_new); | ||||||
|  | +			INIT_LIST_HEAD(&ctx->acq[j].acq_old); | ||||||
|  | +			spin_lock_init(&ctx->acq[j].lock); | ||||||
|  | +		} | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -1345,8 +1348,11 @@ void ath9k_offchannel_init(struct ath_so | ||||||
|  |  	ctx->txpower = ATH_TXPOWER_MAX; | ||||||
|  |  	cfg80211_chandef_create(&ctx->chandef, chan, NL80211_CHAN_HT20); | ||||||
|  |   | ||||||
|  | -	for (i = 0; i < ARRAY_SIZE(ctx->acq); i++) | ||||||
|  | -		INIT_LIST_HEAD(&ctx->acq[i]); | ||||||
|  | +	for (i = 0; i < ARRAY_SIZE(ctx->acq); i++) { | ||||||
|  | +		INIT_LIST_HEAD(&ctx->acq[i].acq_new); | ||||||
|  | +		INIT_LIST_HEAD(&ctx->acq[i].acq_old); | ||||||
|  | +		spin_lock_init(&ctx->acq[i].lock); | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  |  	sc->offchannel.chan.offchannel = true; | ||||||
|  |  } | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/debug.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/debug.c | ||||||
|  | @@ -1399,5 +1399,8 @@ int ath9k_init_debug(struct ath_hw *ah) | ||||||
|  |  	debugfs_create_file("tpc", S_IRUSR | S_IWUSR, | ||||||
|  |  			    sc->debug.debugfs_phy, sc, &fops_tpc); | ||||||
|  |   | ||||||
|  | +	debugfs_create_u16("airtime_flags", S_IRUSR | S_IWUSR, | ||||||
|  | +			   sc->debug.debugfs_phy, &sc->airtime_flags); | ||||||
|  | + | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/debug.h | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/debug.h | ||||||
|  | @@ -221,6 +221,11 @@ struct ath_rx_rate_stats { | ||||||
|  |  	} cck_stats[4]; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +struct ath_airtime_stats { | ||||||
|  | +	u32 rx_airtime; | ||||||
|  | +	u32 tx_airtime; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  #define ANT_MAIN 0 | ||||||
|  |  #define ANT_ALT  1 | ||||||
|  |   | ||||||
|  | @@ -314,12 +319,20 @@ ath9k_debug_sync_cause(struct ath_softc | ||||||
|  |  void ath_debug_rate_stats(struct ath_softc *sc, | ||||||
|  |  			  struct ath_rx_status *rs, | ||||||
|  |  			  struct sk_buff *skb); | ||||||
|  | +void ath_debug_airtime(struct ath_softc *sc, | ||||||
|  | +		       struct ath_node *an, | ||||||
|  | +		       u32 rx, u32 tx); | ||||||
|  |  #else | ||||||
|  |  static inline void ath_debug_rate_stats(struct ath_softc *sc, | ||||||
|  |  					struct ath_rx_status *rs, | ||||||
|  |  					struct sk_buff *skb) | ||||||
|  |  { | ||||||
|  |  } | ||||||
|  | +static inline void ath_debug_airtime(struct ath_softc *sc, | ||||||
|  | +			      struct ath_node *an, | ||||||
|  | +			      u32 rx, u32 tx) | ||||||
|  | +{ | ||||||
|  | +} | ||||||
|  |  #endif /* CPTCFG_ATH9K_STATION_STATISTICS */ | ||||||
|  |   | ||||||
|  |  #endif /* DEBUG_H */ | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/debug_sta.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/debug_sta.c | ||||||
|  | @@ -242,6 +242,59 @@ static const struct file_operations fops | ||||||
|  |  	.llseek = default_llseek, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +void ath_debug_airtime(struct ath_softc *sc, | ||||||
|  | +		struct ath_node *an, | ||||||
|  | +		u32 rx, | ||||||
|  | +		u32 tx) | ||||||
|  | +{ | ||||||
|  | +	struct ath_airtime_stats *astats = &an->airtime_stats; | ||||||
|  | + | ||||||
|  | +	astats->rx_airtime += rx; | ||||||
|  | +	astats->tx_airtime += tx; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static ssize_t read_airtime(struct file *file, char __user *user_buf, | ||||||
|  | +			size_t count, loff_t *ppos) | ||||||
|  | +{ | ||||||
|  | +	struct ath_node *an = file->private_data; | ||||||
|  | +	struct ath_airtime_stats *astats; | ||||||
|  | +	static const char *qname[4] = { | ||||||
|  | +		"VO", "VI", "BE", "BK" | ||||||
|  | +	}; | ||||||
|  | +	u32 len = 0, size = 256; | ||||||
|  | +	char *buf; | ||||||
|  | +	size_t retval; | ||||||
|  | +	int i; | ||||||
|  | + | ||||||
|  | +	buf = kzalloc(size, GFP_KERNEL); | ||||||
|  | +	if (buf == NULL) | ||||||
|  | +		return -ENOMEM; | ||||||
|  | + | ||||||
|  | +	astats = &an->airtime_stats; | ||||||
|  | + | ||||||
|  | +	len += scnprintf(buf + len, size - len, "RX: %u us\n", astats->rx_airtime); | ||||||
|  | +	len += scnprintf(buf + len, size - len, "TX: %u us\n", astats->tx_airtime); | ||||||
|  | +	len += scnprintf(buf + len, size - len, "Deficit: "); | ||||||
|  | +	for (i = 0; i < 4; i++) | ||||||
|  | +		len += scnprintf(buf+len, size - len, "%s: %lld us ", qname[i], an->airtime_deficit[i]); | ||||||
|  | +	if (len < size) | ||||||
|  | +		buf[len++] = '\n'; | ||||||
|  | + | ||||||
|  | +	retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||||||
|  | +	kfree(buf); | ||||||
|  | + | ||||||
|  | +	return retval; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +static const struct file_operations fops_airtime = { | ||||||
|  | +	.read = read_airtime, | ||||||
|  | +	.open = simple_open, | ||||||
|  | +	.owner = THIS_MODULE, | ||||||
|  | +	.llseek = default_llseek, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | + | ||||||
|  |  void ath9k_sta_add_debugfs(struct ieee80211_hw *hw, | ||||||
|  |  			   struct ieee80211_vif *vif, | ||||||
|  |  			   struct ieee80211_sta *sta, | ||||||
|  | @@ -251,4 +304,5 @@ void ath9k_sta_add_debugfs(struct ieee80 | ||||||
|  |   | ||||||
|  |  	debugfs_create_file("node_aggr", S_IRUGO, dir, an, &fops_node_aggr); | ||||||
|  |  	debugfs_create_file("node_recv", S_IRUGO, dir, an, &fops_node_recv); | ||||||
|  | +	debugfs_create_file("airtime", S_IRUGO, dir, an, &fops_airtime); | ||||||
|  |  } | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
|  | @@ -620,6 +620,8 @@ static int ath9k_init_softc(u16 devid, s | ||||||
|  |   | ||||||
|  |  	/* Will be cleared in ath9k_start() */ | ||||||
|  |  	set_bit(ATH_OP_INVALID, &common->op_flags); | ||||||
|  | +	sc->airtime_flags = (AIRTIME_USE_TX | AIRTIME_USE_RX | | ||||||
|  | +			     AIRTIME_USE_NEW_QUEUES); | ||||||
|  |   | ||||||
|  |  	sc->sc_ah = ah; | ||||||
|  |  	sc->dfs_detector = dfs_pattern_detector_init(common, NL80211_DFS_UNSET); | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/main.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||||||
|  | @@ -70,10 +70,10 @@ static bool ath9k_has_pending_frames(str | ||||||
|  |  		goto out; | ||||||
|  |   | ||||||
|  |  	if (txq->mac80211_qnum >= 0) { | ||||||
|  | -		struct list_head *list; | ||||||
|  | +		struct ath_acq *acq; | ||||||
|  |   | ||||||
|  | -		list = &sc->cur_chan->acq[txq->mac80211_qnum]; | ||||||
|  | -		if (!list_empty(list)) | ||||||
|  | +		acq = &sc->cur_chan->acq[txq->mac80211_qnum]; | ||||||
|  | +		if (!list_empty(&acq->acq_new) || !list_empty(&acq->acq_old)) | ||||||
|  |  			pending = true; | ||||||
|  |  	} | ||||||
|  |  out: | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/recv.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/recv.c | ||||||
|  | @@ -991,6 +991,70 @@ static void ath9k_apply_ampdu_details(st | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static void ath_rx_count_airtime(struct ath_softc *sc, | ||||||
|  | +				 struct ath_rx_status *rs, | ||||||
|  | +				 struct sk_buff *skb) | ||||||
|  | +{ | ||||||
|  | +	struct ath_node *an; | ||||||
|  | +	struct ath_acq *acq; | ||||||
|  | +	struct ath_vif *avp; | ||||||
|  | +	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||||||
|  | +	struct ath_hw *ah = sc->sc_ah; | ||||||
|  | +	struct ath_common *common = ath9k_hw_common(ah); | ||||||
|  | +	struct ieee80211_sta *sta; | ||||||
|  | +	struct ieee80211_rx_status *rxs; | ||||||
|  | +	const struct ieee80211_rate *rate; | ||||||
|  | +	bool is_sgi, is_40, is_sp; | ||||||
|  | +	int phy; | ||||||
|  | +	u16 len = rs->rs_datalen; | ||||||
|  | +	u32 airtime = 0; | ||||||
|  | +	u8 tidno, acno; | ||||||
|  | + | ||||||
|  | +	if (!ieee80211_is_data(hdr->frame_control)) | ||||||
|  | +		return; | ||||||
|  | + | ||||||
|  | +	rcu_read_lock(); | ||||||
|  | + | ||||||
|  | +	sta = ieee80211_find_sta_by_ifaddr(sc->hw, hdr->addr2, NULL); | ||||||
|  | +	if (!sta) | ||||||
|  | +		goto exit; | ||||||
|  | +	an = (struct ath_node *) sta->drv_priv; | ||||||
|  | +	avp = (struct ath_vif *) an->vif->drv_priv; | ||||||
|  | +	tidno = skb->priority & IEEE80211_QOS_CTL_TID_MASK; | ||||||
|  | +	acno = TID_TO_WME_AC(tidno); | ||||||
|  | +	acq = &avp->chanctx->acq[acno]; | ||||||
|  | + | ||||||
|  | +	rxs = IEEE80211_SKB_RXCB(skb); | ||||||
|  | + | ||||||
|  | +	is_sgi = !!(rxs->flag & RX_FLAG_SHORT_GI); | ||||||
|  | +	is_40 = !!(rxs->flag & RX_FLAG_40MHZ); | ||||||
|  | +	is_sp = !!(rxs->flag & RX_FLAG_SHORTPRE); | ||||||
|  | + | ||||||
|  | +	if (!!(rxs->flag & RX_FLAG_HT)) { | ||||||
|  | +		/* MCS rates */ | ||||||
|  | + | ||||||
|  | +		airtime += ath_pkt_duration(sc, rxs->rate_idx, len, | ||||||
|  | +					is_40, is_sgi, is_sp); | ||||||
|  | +	} else { | ||||||
|  | + | ||||||
|  | +		phy = IS_CCK_RATE(rs->rs_rate) ? WLAN_RC_PHY_CCK : WLAN_RC_PHY_OFDM; | ||||||
|  | +		rate = &common->sbands[rxs->band].bitrates[rxs->rate_idx]; | ||||||
|  | +		airtime += ath9k_hw_computetxtime(ah, phy, rate->bitrate * 100, | ||||||
|  | +						len, rxs->rate_idx, is_sp); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | + 	if (!!(sc->airtime_flags & AIRTIME_USE_RX)) { | ||||||
|  | +		spin_lock_bh(&acq->lock); | ||||||
|  | +		an->airtime_deficit[acno] -= airtime; | ||||||
|  | +		if (an->airtime_deficit[acno] <= 0) | ||||||
|  | +			__ath_tx_queue_tid(sc, ATH_AN_2_TID(an, tidno)); | ||||||
|  | +		spin_unlock_bh(&acq->lock); | ||||||
|  | +	} | ||||||
|  | +	ath_debug_airtime(sc, an, airtime, 0); | ||||||
|  | +exit: | ||||||
|  | +	rcu_read_unlock(); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | ||||||
|  |  { | ||||||
|  |  	struct ath_rxbuf *bf; | ||||||
|  | @@ -1137,6 +1201,7 @@ int ath_rx_tasklet(struct ath_softc *sc, | ||||||
|  |  		ath9k_antenna_check(sc, &rs); | ||||||
|  |  		ath9k_apply_ampdu_details(sc, &rs, rxs); | ||||||
|  |  		ath_debug_rate_stats(sc, &rs, skb); | ||||||
|  | +		ath_rx_count_airtime(sc, &rs, skb); | ||||||
|  |   | ||||||
|  |  		hdr = (struct ieee80211_hdr *)skb->data; | ||||||
|  |  		if (ieee80211_is_ack(hdr->frame_control)) | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | @@ -125,21 +125,44 @@ void ath_txq_unlock_complete(struct ath_ | ||||||
|  |  		ath_tx_status(hw, skb); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void ath_tx_queue_tid(struct ath_softc *sc, struct ath_txq *txq, | ||||||
|  | -			     struct ath_atx_tid *tid) | ||||||
|  | +void __ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | ||||||
|  |  { | ||||||
|  | -	struct list_head *list; | ||||||
|  |  	struct ath_vif *avp = (struct ath_vif *) tid->an->vif->drv_priv; | ||||||
|  |  	struct ath_chanctx *ctx = avp->chanctx; | ||||||
|  | +	struct ath_acq *acq; | ||||||
|  | +	struct list_head *tid_list; | ||||||
|  | +	u8 acno = TID_TO_WME_AC(tid->tidno); | ||||||
|  |   | ||||||
|  | -	if (!ctx) | ||||||
|  | +	if (!ctx || !list_empty(&tid->list)) | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  | -	list = &ctx->acq[TID_TO_WME_AC(tid->tidno)]; | ||||||
|  | -	if (list_empty(&tid->list)) | ||||||
|  | -		list_add_tail(&tid->list, list); | ||||||
|  | + | ||||||
|  | +	acq = &ctx->acq[acno]; | ||||||
|  | +	if ((sc->airtime_flags & AIRTIME_USE_NEW_QUEUES) && | ||||||
|  | +	    tid->an->airtime_deficit[acno] > 0) | ||||||
|  | +		tid_list = &acq->acq_new; | ||||||
|  | +	else | ||||||
|  | +		tid_list = &acq->acq_old; | ||||||
|  | + | ||||||
|  | +	list_add_tail(&tid->list, tid_list); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +void ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | ||||||
|  | +{ | ||||||
|  | +	struct ath_vif *avp = (struct ath_vif *) tid->an->vif->drv_priv; | ||||||
|  | +	struct ath_chanctx *ctx = avp->chanctx; | ||||||
|  | +	struct ath_acq *acq; | ||||||
|  | + | ||||||
|  | +	if (!ctx || !list_empty(&tid->list)) | ||||||
|  | +		return; | ||||||
|  | + | ||||||
|  | +	acq = &ctx->acq[TID_TO_WME_AC(tid->tidno)]; | ||||||
|  | +	spin_lock_bh(&acq->lock); | ||||||
|  | +	__ath_tx_queue_tid(sc, tid); | ||||||
|  | +	spin_unlock_bh(&acq->lock); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | + | ||||||
|  |  void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue) | ||||||
|  |  { | ||||||
|  |  	struct ath_softc *sc = hw->priv; | ||||||
|  | @@ -154,7 +177,7 @@ void ath9k_wake_tx_queue(struct ieee8021 | ||||||
|  |  	ath_txq_lock(sc, txq); | ||||||
|  |   | ||||||
|  |  	tid->has_queued = true; | ||||||
|  | -	ath_tx_queue_tid(sc, txq, tid); | ||||||
|  | +	ath_tx_queue_tid(sc, tid); | ||||||
|  |  	ath_txq_schedule(sc, txq); | ||||||
|  |   | ||||||
|  |  	ath_txq_unlock(sc, txq); | ||||||
|  | @@ -684,7 +707,7 @@ static void ath_tx_complete_aggr(struct | ||||||
|  |   | ||||||
|  |  		skb_queue_splice_tail(&bf_pending, &tid->retry_q); | ||||||
|  |  		if (!an->sleeping) { | ||||||
|  | -			ath_tx_queue_tid(sc, txq, tid); | ||||||
|  | +			ath_tx_queue_tid(sc, tid); | ||||||
|  |   | ||||||
|  |  			if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) | ||||||
|  |  				tid->clear_ps_filter = true; | ||||||
|  | @@ -712,6 +735,53 @@ static bool bf_is_ampdu_not_probing(stru | ||||||
|  |      return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_txq *txq, | ||||||
|  | +				 struct ath_buf *bf, struct ath_tx_status *ts) | ||||||
|  | +{ | ||||||
|  | +	struct ath_node *an; | ||||||
|  | +	struct ath_acq *acq = &sc->cur_chan->acq[txq->mac80211_qnum]; | ||||||
|  | +	struct sk_buff *skb; | ||||||
|  | +	struct ieee80211_hdr *hdr; | ||||||
|  | +	struct ieee80211_hw *hw = sc->hw; | ||||||
|  | +	struct ieee80211_tx_rate rates[4]; | ||||||
|  | +	struct ieee80211_sta *sta; | ||||||
|  | +	int i; | ||||||
|  | +	u32 airtime = 0; | ||||||
|  | + | ||||||
|  | +	skb = bf->bf_mpdu; | ||||||
|  | +	if(!skb) | ||||||
|  | +		return; | ||||||
|  | + | ||||||
|  | +	hdr = (struct ieee80211_hdr *)skb->data; | ||||||
|  | +	memcpy(rates, bf->rates, sizeof(rates)); | ||||||
|  | + | ||||||
|  | +	rcu_read_lock(); | ||||||
|  | + | ||||||
|  | +	sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); | ||||||
|  | +	if(!sta) | ||||||
|  | +		goto exit; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +	an = (struct ath_node *) sta->drv_priv; | ||||||
|  | + | ||||||
|  | +	airtime += ts->duration * (ts->ts_longretry + 1); | ||||||
|  | + | ||||||
|  | +	for(i=0; i < ts->ts_rateindex; i++) | ||||||
|  | +		airtime += ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i) * rates[i].count; | ||||||
|  | + | ||||||
|  | +	if (!!(sc->airtime_flags & AIRTIME_USE_TX)) { | ||||||
|  | +		spin_lock_bh(&acq->lock); | ||||||
|  | +		an->airtime_deficit[txq->mac80211_qnum] -= airtime; | ||||||
|  | +		if (an->airtime_deficit[txq->mac80211_qnum] <= 0) | ||||||
|  | +			__ath_tx_queue_tid(sc, ath_get_skb_tid(sc, an, skb)); | ||||||
|  | +		spin_unlock_bh(&acq->lock); | ||||||
|  | +	} | ||||||
|  | +	ath_debug_airtime(sc, an, 0, airtime); | ||||||
|  | + | ||||||
|  | +exit: | ||||||
|  | +	rcu_read_unlock(); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, | ||||||
|  |  				  struct ath_tx_status *ts, struct ath_buf *bf, | ||||||
|  |  				  struct list_head *bf_head) | ||||||
|  | @@ -733,6 +803,7 @@ static void ath_tx_process_buffer(struct | ||||||
|  |   | ||||||
|  |  	ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, | ||||||
|  |  					     ts->ts_rateindex); | ||||||
|  | +	ath_tx_count_airtime(sc, txq, bf, ts); | ||||||
|  |   | ||||||
|  |  	hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; | ||||||
|  |  	sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); | ||||||
|  | @@ -1094,8 +1165,8 @@ finish: | ||||||
|  |   * width  - 0 for 20 MHz, 1 for 40 MHz | ||||||
|  |   * half_gi - to use 4us v/s 3.6 us for symbol time | ||||||
|  |   */ | ||||||
|  | -static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, int pktlen, | ||||||
|  | -			    int width, int half_gi, bool shortPreamble) | ||||||
|  | +u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, int pktlen, | ||||||
|  | +		     int width, int half_gi, bool shortPreamble) | ||||||
|  |  { | ||||||
|  |  	u32 nbits, nsymbits, duration, nsymbols; | ||||||
|  |  	int streams; | ||||||
|  | @@ -1493,7 +1564,7 @@ ath_tx_form_burst(struct ath_softc *sc, | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static bool ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq, | ||||||
|  | -			      struct ath_atx_tid *tid, bool *stop) | ||||||
|  | +			      struct ath_atx_tid *tid) | ||||||
|  |  { | ||||||
|  |  	struct ath_buf *bf; | ||||||
|  |  	struct ieee80211_tx_info *tx_info; | ||||||
|  | @@ -1515,7 +1586,6 @@ static bool ath_tx_sched_aggr(struct ath | ||||||
|  |  	if ((aggr && txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) || | ||||||
|  |  	    (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { | ||||||
|  |  		__skb_queue_tail(&tid->retry_q, bf->bf_mpdu); | ||||||
|  | -		*stop = true; | ||||||
|  |  		return false; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | @@ -1639,7 +1709,7 @@ void ath_tx_aggr_wakeup(struct ath_softc | ||||||
|  |  		ath_txq_lock(sc, txq); | ||||||
|  |  		tid->clear_ps_filter = true; | ||||||
|  |  		if (ath_tid_has_buffered(tid)) { | ||||||
|  | -			ath_tx_queue_tid(sc, txq, tid); | ||||||
|  | +			ath_tx_queue_tid(sc, tid); | ||||||
|  |  			ath_txq_schedule(sc, txq); | ||||||
|  |  		} | ||||||
|  |  		ath_txq_unlock_complete(sc, txq); | ||||||
|  | @@ -1956,9 +2026,10 @@ void ath_tx_cleanupq(struct ath_softc *s | ||||||
|  |  void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) | ||||||
|  |  { | ||||||
|  |  	struct ath_common *common = ath9k_hw_common(sc->sc_ah); | ||||||
|  | -	struct ath_atx_tid *tid, *last_tid; | ||||||
|  | +	struct ath_atx_tid *tid; | ||||||
|  |  	struct list_head *tid_list; | ||||||
|  | -	bool sent = false; | ||||||
|  | +	struct ath_acq *acq; | ||||||
|  | +	bool active = AIRTIME_ACTIVE(sc->airtime_flags); | ||||||
|  |   | ||||||
|  |  	if (txq->mac80211_qnum < 0) | ||||||
|  |  		return; | ||||||
|  | @@ -1967,48 +2038,55 @@ void ath_txq_schedule(struct ath_softc * | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  |  	spin_lock_bh(&sc->chan_lock); | ||||||
|  | -	tid_list = &sc->cur_chan->acq[txq->mac80211_qnum]; | ||||||
|  | - | ||||||
|  | -	if (list_empty(tid_list)) { | ||||||
|  | -		spin_unlock_bh(&sc->chan_lock); | ||||||
|  | -		return; | ||||||
|  | -	} | ||||||
|  | - | ||||||
|  |  	rcu_read_lock(); | ||||||
|  | +	acq = &sc->cur_chan->acq[txq->mac80211_qnum]; | ||||||
|  |   | ||||||
|  | -	last_tid = list_entry(tid_list->prev, struct ath_atx_tid, list); | ||||||
|  | -	while (!list_empty(tid_list)) { | ||||||
|  | -		bool stop = false; | ||||||
|  | - | ||||||
|  | -		if (sc->cur_chan->stopped) | ||||||
|  | -			break; | ||||||
|  | - | ||||||
|  | -		tid = list_first_entry(tid_list, struct ath_atx_tid, list); | ||||||
|  | -		list_del_init(&tid->list); | ||||||
|  | +	if (sc->cur_chan->stopped) | ||||||
|  | +		goto out; | ||||||
|  |   | ||||||
|  | -		if (ath_tx_sched_aggr(sc, txq, tid, &stop)) | ||||||
|  | -			sent = true; | ||||||
|  | +begin: | ||||||
|  | +	tid_list = &acq->acq_new; | ||||||
|  | +	if (list_empty(tid_list)) { | ||||||
|  | +		tid_list = &acq->acq_old; | ||||||
|  | +		if (list_empty(tid_list)) | ||||||
|  | +			goto out; | ||||||
|  | +	} | ||||||
|  | +	tid = list_first_entry(tid_list, struct ath_atx_tid, list); | ||||||
|  |   | ||||||
|  | -		/* | ||||||
|  | -		 * add tid to round-robin queue if more frames | ||||||
|  | -		 * are pending for the tid | ||||||
|  | -		 */ | ||||||
|  | -		if (ath_tid_has_buffered(tid)) | ||||||
|  | -			ath_tx_queue_tid(sc, txq, tid); | ||||||
|  | +	if (active && tid->an->airtime_deficit[txq->mac80211_qnum] <= 0) { | ||||||
|  | +		spin_lock_bh(&acq->lock); | ||||||
|  | +		tid->an->airtime_deficit[txq->mac80211_qnum] += ATH_AIRTIME_QUANTUM; | ||||||
|  | +		list_move_tail(&tid->list, &acq->acq_old); | ||||||
|  | +		spin_unlock_bh(&acq->lock); | ||||||
|  | +		goto begin; | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  | -		if (stop) | ||||||
|  | -			break; | ||||||
|  | +	if (!ath_tid_has_buffered(tid)) { | ||||||
|  | +		spin_lock_bh(&acq->lock); | ||||||
|  | +		if ((tid_list == &acq->acq_new) && !list_empty(&acq->acq_old)) | ||||||
|  | +			list_move_tail(&tid->list, &acq->acq_old); | ||||||
|  | +		else { | ||||||
|  | +			list_del_init(&tid->list); | ||||||
|  | +		} | ||||||
|  | +		spin_unlock_bh(&acq->lock); | ||||||
|  | +		goto begin; | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  | -		if (tid == last_tid) { | ||||||
|  | -			if (!sent) | ||||||
|  | -				break; | ||||||
|  |   | ||||||
|  | -			sent = false; | ||||||
|  | -			last_tid = list_entry(tid_list->prev, | ||||||
|  | -					      struct ath_atx_tid, list); | ||||||
|  | +	/* | ||||||
|  | +	 * If we succeed in scheduling something, immediately restart to make | ||||||
|  | +	 * sure we keep the HW busy. | ||||||
|  | +	 */ | ||||||
|  | +	if(ath_tx_sched_aggr(sc, txq, tid)) { | ||||||
|  | +		if (!active) { | ||||||
|  | +			spin_lock_bh(&acq->lock); | ||||||
|  | +			list_move_tail(&tid->list, &acq->acq_old); | ||||||
|  | +			spin_unlock_bh(&acq->lock); | ||||||
|  |  		} | ||||||
|  | +		goto begin; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +out: | ||||||
|  |  	rcu_read_unlock(); | ||||||
|  |  	spin_unlock_bh(&sc->chan_lock); | ||||||
|  |  } | ||||||
|  | @@ -2862,6 +2940,9 @@ void ath_tx_node_init(struct ath_softc * | ||||||
|  |  	struct ath_atx_tid *tid; | ||||||
|  |  	int tidno, acno; | ||||||
|  |   | ||||||
|  | +	for (acno = 0; acno < IEEE80211_NUM_ACS; acno++) | ||||||
|  | +		an->airtime_deficit[acno] = ATH_AIRTIME_QUANTUM; | ||||||
|  | + | ||||||
|  |  	for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { | ||||||
|  |  		tid = ath_node_to_tid(an, tidno); | ||||||
|  |  		tid->an        = an; | ||||||
| @@ -0,0 +1,62 @@ | |||||||
|  | From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@toke.dk> | ||||||
|  | Date: Mon, 5 Dec 2016 13:27:38 +0200 | ||||||
|  | Subject: [PATCH] ath9k: Turn ath_txq_lock/unlock() into static inlines. | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | These are one-line functions that just call spin_lock/unlock_bh(); turn | ||||||
|  | them into static inlines to avoid the function call overhead. | ||||||
|  |  | ||||||
|  | Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | @@ -569,6 +569,15 @@ static inline void ath_chanctx_check_act | ||||||
|  |   | ||||||
|  |  #endif /* CPTCFG_ATH9K_CHANNEL_CONTEXT */ | ||||||
|  |   | ||||||
|  | +static inline void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq) | ||||||
|  | +{ | ||||||
|  | +	spin_lock_bh(&txq->axq_lock); | ||||||
|  | +} | ||||||
|  | +static inline void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq) | ||||||
|  | +{ | ||||||
|  | +	spin_unlock_bh(&txq->axq_lock); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  void ath_startrecv(struct ath_softc *sc); | ||||||
|  |  bool ath_stoprecv(struct ath_softc *sc); | ||||||
|  |  u32 ath_calcrxfilter(struct ath_softc *sc); | ||||||
|  | @@ -576,8 +585,6 @@ int ath_rx_init(struct ath_softc *sc, in | ||||||
|  |  void ath_rx_cleanup(struct ath_softc *sc); | ||||||
|  |  int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp); | ||||||
|  |  struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); | ||||||
|  | -void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq); | ||||||
|  | -void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq); | ||||||
|  |  void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq); | ||||||
|  |  void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); | ||||||
|  |  bool ath_drain_all_txq(struct ath_softc *sc); | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | @@ -98,18 +98,6 @@ static void ath_tx_status(struct ieee802 | ||||||
|  |  	dev_kfree_skb(skb); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq) | ||||||
|  | -	__acquires(&txq->axq_lock) | ||||||
|  | -{ | ||||||
|  | -	spin_lock_bh(&txq->axq_lock); | ||||||
|  | -} | ||||||
|  | - | ||||||
|  | -void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq) | ||||||
|  | -	__releases(&txq->axq_lock) | ||||||
|  | -{ | ||||||
|  | -	spin_unlock_bh(&txq->axq_lock); | ||||||
|  | -} | ||||||
|  | - | ||||||
|  |  void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq) | ||||||
|  |  	__releases(&txq->axq_lock) | ||||||
|  |  { | ||||||
| @@ -0,0 +1,175 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Date: Wed, 25 Jan 2017 12:57:05 +0100 | ||||||
|  | Subject: [PATCH] ath9k: rename tx_complete_work to hw_check_work | ||||||
|  |  | ||||||
|  | Also include common MAC alive check. This should make the hang checks | ||||||
|  | more reliable for modes where beacons are not sent and is used as a | ||||||
|  | starting point for further hang check improvements | ||||||
|  |  | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | @@ -108,7 +108,7 @@ int ath_descdma_setup(struct ath_softc * | ||||||
|  |  #define ATH_AGGR_MIN_QDEPTH        2 | ||||||
|  |  /* minimum h/w qdepth for non-aggregated traffic */ | ||||||
|  |  #define ATH_NON_AGGR_MIN_QDEPTH    8 | ||||||
|  | -#define ATH_TX_COMPLETE_POLL_INT   1000 | ||||||
|  | +#define ATH_HW_CHECK_POLL_INT      1000 | ||||||
|  |  #define ATH_TXFIFO_DEPTH           8 | ||||||
|  |  #define ATH_TX_ERROR               0x01 | ||||||
|  |   | ||||||
|  | @@ -745,7 +745,7 @@ void ath9k_csa_update(struct ath_softc * | ||||||
|  |  #define ATH_PAPRD_TIMEOUT         100 /* msecs */ | ||||||
|  |  #define ATH_PLL_WORK_INTERVAL     100 | ||||||
|  |   | ||||||
|  | -void ath_tx_complete_poll_work(struct work_struct *work); | ||||||
|  | +void ath_hw_check_work(struct work_struct *work); | ||||||
|  |  void ath_reset_work(struct work_struct *work); | ||||||
|  |  bool ath_hw_check(struct ath_softc *sc); | ||||||
|  |  void ath_hw_pll_work(struct work_struct *work); | ||||||
|  | @@ -1053,7 +1053,7 @@ struct ath_softc { | ||||||
|  |  #ifdef CPTCFG_ATH9K_DEBUGFS | ||||||
|  |  	struct ath9k_debug debug; | ||||||
|  |  #endif | ||||||
|  | -	struct delayed_work tx_complete_work; | ||||||
|  | +	struct delayed_work hw_check_work; | ||||||
|  |  	struct delayed_work hw_pll_work; | ||||||
|  |  	struct timer_list sleep_timer; | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
|  | @@ -681,6 +681,7 @@ static int ath9k_init_softc(u16 devid, s | ||||||
|  |  	INIT_WORK(&sc->hw_reset_work, ath_reset_work); | ||||||
|  |  	INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); | ||||||
|  |  	INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work); | ||||||
|  | +	INIT_DELAYED_WORK(&sc->hw_check_work, ath_hw_check_work); | ||||||
|  |   | ||||||
|  |  	ath9k_init_channel_context(sc); | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/link.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/link.c | ||||||
|  | @@ -20,20 +20,13 @@ | ||||||
|  |   * TX polling - checks if the TX engine is stuck somewhere | ||||||
|  |   * and issues a chip reset if so. | ||||||
|  |   */ | ||||||
|  | -void ath_tx_complete_poll_work(struct work_struct *work) | ||||||
|  | +static bool ath_tx_complete_check(struct ath_softc *sc) | ||||||
|  |  { | ||||||
|  | -	struct ath_softc *sc = container_of(work, struct ath_softc, | ||||||
|  | -					    tx_complete_work.work); | ||||||
|  |  	struct ath_txq *txq; | ||||||
|  |  	int i; | ||||||
|  | -	bool needreset = false; | ||||||
|  | - | ||||||
|  |   | ||||||
|  | -	if (sc->tx99_state) { | ||||||
|  | -		ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, | ||||||
|  | -			"skip tx hung detection on tx99\n"); | ||||||
|  | -		return; | ||||||
|  | -	} | ||||||
|  | +	if (sc->tx99_state) | ||||||
|  | +		return true; | ||||||
|  |   | ||||||
|  |  	for (i = 0; i < IEEE80211_NUM_ACS; i++) { | ||||||
|  |  		txq = sc->tx.txq_map[i]; | ||||||
|  | @@ -41,25 +34,36 @@ void ath_tx_complete_poll_work(struct wo | ||||||
|  |  		ath_txq_lock(sc, txq); | ||||||
|  |  		if (txq->axq_depth) { | ||||||
|  |  			if (txq->axq_tx_inprogress) { | ||||||
|  | -				needreset = true; | ||||||
|  |  				ath_txq_unlock(sc, txq); | ||||||
|  | -				break; | ||||||
|  | -			} else { | ||||||
|  | -				txq->axq_tx_inprogress = true; | ||||||
|  | +				goto reset; | ||||||
|  |  			} | ||||||
|  | + | ||||||
|  | +			txq->axq_tx_inprogress = true; | ||||||
|  |  		} | ||||||
|  |  		ath_txq_unlock(sc, txq); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (needreset) { | ||||||
|  | -		ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, | ||||||
|  | -			"tx hung, resetting the chip\n"); | ||||||
|  | -		ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); | ||||||
|  | +	return true; | ||||||
|  | + | ||||||
|  | +reset: | ||||||
|  | +	ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, | ||||||
|  | +		"tx hung, resetting the chip\n"); | ||||||
|  | +	ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); | ||||||
|  | +	return false; | ||||||
|  | + | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void ath_hw_check_work(struct work_struct *work) | ||||||
|  | +{ | ||||||
|  | +	struct ath_softc *sc = container_of(work, struct ath_softc, | ||||||
|  | +					    hw_check_work.work); | ||||||
|  | + | ||||||
|  | +	if (!ath_hw_check(sc) || | ||||||
|  | +	    !ath_tx_complete_check(sc)) | ||||||
|  |  		return; | ||||||
|  | -	} | ||||||
|  |   | ||||||
|  | -	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, | ||||||
|  | -				     msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); | ||||||
|  | +	ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work, | ||||||
|  | +				     msecs_to_jiffies(ATH_HW_CHECK_POLL_INT)); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/main.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||||||
|  | @@ -181,7 +181,7 @@ void ath9k_ps_restore(struct ath_softc * | ||||||
|  |  static void __ath_cancel_work(struct ath_softc *sc) | ||||||
|  |  { | ||||||
|  |  	cancel_work_sync(&sc->paprd_work); | ||||||
|  | -	cancel_delayed_work_sync(&sc->tx_complete_work); | ||||||
|  | +	cancel_delayed_work_sync(&sc->hw_check_work); | ||||||
|  |  	cancel_delayed_work_sync(&sc->hw_pll_work); | ||||||
|  |   | ||||||
|  |  #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT | ||||||
|  | @@ -198,7 +198,8 @@ void ath_cancel_work(struct ath_softc *s | ||||||
|  |   | ||||||
|  |  void ath_restart_work(struct ath_softc *sc) | ||||||
|  |  { | ||||||
|  | -	ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); | ||||||
|  | +	ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work, | ||||||
|  | +				     ATH_HW_CHECK_POLL_INT); | ||||||
|  |   | ||||||
|  |  	if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9330(sc->sc_ah)) | ||||||
|  |  		ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, | ||||||
|  | @@ -2091,7 +2092,7 @@ void __ath9k_flush(struct ieee80211_hw * | ||||||
|  |  	int timeout; | ||||||
|  |  	bool drain_txq; | ||||||
|  |   | ||||||
|  | -	cancel_delayed_work_sync(&sc->tx_complete_work); | ||||||
|  | +	cancel_delayed_work_sync(&sc->hw_check_work); | ||||||
|  |   | ||||||
|  |  	if (ah->ah_flags & AH_UNPLUGGED) { | ||||||
|  |  		ath_dbg(common, ANY, "Device has been unplugged!\n"); | ||||||
|  | @@ -2129,7 +2130,8 @@ void __ath9k_flush(struct ieee80211_hw * | ||||||
|  |  		ath9k_ps_restore(sc); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); | ||||||
|  | +	ieee80211_queue_delayed_work(hw, &sc->hw_check_work, | ||||||
|  | +				     ATH_HW_CHECK_POLL_INT); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw) | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | @@ -2915,8 +2915,6 @@ int ath_tx_init(struct ath_softc *sc, in | ||||||
|  |  		return error; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work); | ||||||
|  | - | ||||||
|  |  	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||||||
|  |  		error = ath_tx_edma_init(sc); | ||||||
|  |   | ||||||
| @@ -0,0 +1,30 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Date: Wed, 25 Jan 2017 12:58:17 +0100 | ||||||
|  | Subject: [PATCH] ath9k_hw: check if the chip failed to wake up | ||||||
|  |  | ||||||
|  | In an RFC patch, Sven Eckelmann and Simon Wunderlich reported: | ||||||
|  |  | ||||||
|  | "QCA 802.11n chips (especially AR9330/AR9340) sometimes end up in a | ||||||
|  | state in which a read of AR_CFG always returns 0xdeadbeef. | ||||||
|  | This should not happen when when the power_mode of the device is | ||||||
|  | ATH9K_PM_AWAKE." | ||||||
|  |  | ||||||
|  | Include the check for the default register state in the existing MAC | ||||||
|  | hang check. | ||||||
|  |  | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/hw.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/hw.c | ||||||
|  | @@ -1624,6 +1624,10 @@ bool ath9k_hw_check_alive(struct ath_hw | ||||||
|  |  	int count = 50; | ||||||
|  |  	u32 reg, last_val; | ||||||
|  |   | ||||||
|  | +	/* Check if chip failed to wake up */ | ||||||
|  | +	if (REG_READ(ah, AR_CFG) == 0xdeadbeef) | ||||||
|  | +		return false; | ||||||
|  | + | ||||||
|  |  	if (AR_SREV_9300(ah)) | ||||||
|  |  		return !ath9k_hw_detect_mac_hang(ah); | ||||||
|  |   | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | From d3532ea6ce4ea501e421d130555e59edc2945f99 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arnd Bergmann <arnd@arndb.de> | ||||||
|  | Date: Tue, 18 Oct 2016 00:13:40 +0200 | ||||||
|  | Subject: [PATCH] brcmfmac: avoid maybe-uninitialized warning in | ||||||
|  |  brcmf_cfg80211_start_ap | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | A bugfix added a sanity check around the assignment and use of the | ||||||
|  | 'is_11d' variable, which looks correct to me, but as the function is | ||||||
|  | rather complex already, this confuses the compiler to the point where | ||||||
|  | it can no longer figure out if the variable is always initialized | ||||||
|  | correctly: | ||||||
|  |  | ||||||
|  | brcm80211/brcmfmac/cfg80211.c: In function ‘brcmf_cfg80211_start_ap’: | ||||||
|  | brcm80211/brcmfmac/cfg80211.c:4586:10: error: ‘is_11d’ may be used uninitialized in this function [-Werror=maybe-uninitialized] | ||||||
|  |  | ||||||
|  | This adds an initialization for the newly introduced case in which | ||||||
|  | the variable should not really be used, in order to make the warning | ||||||
|  | go away. | ||||||
|  |  | ||||||
|  | Fixes: b3589dfe0212 ("brcmfmac: ignore 11d configuration errors") | ||||||
|  | Cc: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Cc: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Cc: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | Signed-off-by: Arnd Bergmann <arnd@arndb.de> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -4516,7 +4516,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi | ||||||
|  |  	/* store current 11d setting */ | ||||||
|  |  	if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, | ||||||
|  |  				  &ifp->vif->is_11d)) { | ||||||
|  | -		supports_11d = false; | ||||||
|  | +		is_11d = supports_11d = false; | ||||||
|  |  	} else { | ||||||
|  |  		country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, | ||||||
|  |  					      settings->beacon.tail_len, | ||||||
| @@ -0,0 +1,174 @@ | |||||||
|  | From b073ac1fcf42376018f6db6acc885dfd2cc9ff02 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Mon, 26 Sep 2016 23:51:44 +0200 | ||||||
|  | Subject: [PATCH] brcmfmac: proto: add callback for queuing TX data | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | So far our core code was calling brcmf_fws_process_skb which wasn't | ||||||
|  | a proper thing to do. If case of devices using msgbuf protocol fwsignal | ||||||
|  | shouldn't be used. It was an unnecessary extra layer simply calling | ||||||
|  | a protocol specifix txdata function. | ||||||
|  |  | ||||||
|  | Please note we already have txdata callback, but it's used for calls | ||||||
|  | between bcdc and fwsignal so it couldn't be simply used there. | ||||||
|  |  | ||||||
|  | This makes core code more generic (instead of bcdc/fwsignal specific). | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c   | 12 ++++++++++++ | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c   |  8 +++++++- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c   | 15 +++++---------- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h   |  1 + | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c |  6 +++--- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c  |  2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h  |  9 +++++++++ | ||||||
|  |  7 files changed, 38 insertions(+), 15 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | ||||||
|  | @@ -326,6 +326,17 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static int brcmf_proto_bcdc_tx_queue_data(struct brcmf_pub *drvr, int ifidx, | ||||||
|  | +					  struct sk_buff *skb) | ||||||
|  | +{ | ||||||
|  | +	struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx); | ||||||
|  | + | ||||||
|  | +	if (!brcmf_fws_queue_skbs(drvr->fws)) | ||||||
|  | +		return brcmf_proto_txdata(drvr, ifidx, 0, skb); | ||||||
|  | + | ||||||
|  | +	return brcmf_fws_process_skb(ifp, skb); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static int | ||||||
|  |  brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset, | ||||||
|  |  			struct sk_buff *pktbuf) | ||||||
|  | @@ -375,6 +386,7 @@ int brcmf_proto_bcdc_attach(struct brcmf | ||||||
|  |  	drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull; | ||||||
|  |  	drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd; | ||||||
|  |  	drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd; | ||||||
|  | +	drvr->proto->tx_queue_data = brcmf_proto_bcdc_tx_queue_data; | ||||||
|  |  	drvr->proto->txdata = brcmf_proto_bcdc_txdata; | ||||||
|  |  	drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode; | ||||||
|  |  	drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer; | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
|  | @@ -239,7 +239,13 @@ static netdev_tx_t brcmf_netdev_start_xm | ||||||
|  |  	if (eh->h_proto == htons(ETH_P_PAE)) | ||||||
|  |  		atomic_inc(&ifp->pend_8021x_cnt); | ||||||
|  |   | ||||||
|  | -	ret = brcmf_fws_process_skb(ifp, skb); | ||||||
|  | +	/* determine the priority */ | ||||||
|  | +	if ((skb->priority == 0) || (skb->priority > 7)) | ||||||
|  | +		skb->priority = cfg80211_classify8021d(skb, NULL); | ||||||
|  | + | ||||||
|  | +	ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb); | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		brcmf_txfinalize(ifp, skb, false); | ||||||
|  |   | ||||||
|  |  done: | ||||||
|  |  	if (ret) { | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | ||||||
|  | @@ -2100,16 +2100,6 @@ int brcmf_fws_process_skb(struct brcmf_i | ||||||
|  |  	int rc = 0; | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto)); | ||||||
|  | -	/* determine the priority */ | ||||||
|  | -	if ((skb->priority == 0) || (skb->priority > 7)) | ||||||
|  | -		skb->priority = cfg80211_classify8021d(skb, NULL); | ||||||
|  | - | ||||||
|  | -	if (fws->avoid_queueing) { | ||||||
|  | -		rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb); | ||||||
|  | -		if (rc < 0) | ||||||
|  | -			brcmf_txfinalize(ifp, skb, false); | ||||||
|  | -		return rc; | ||||||
|  | -	} | ||||||
|  |   | ||||||
|  |  	/* set control buffer information */ | ||||||
|  |  	skcb->if_flags = 0; | ||||||
|  | @@ -2442,6 +2432,11 @@ void brcmf_fws_deinit(struct brcmf_pub * | ||||||
|  |  	kfree(fws); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws) | ||||||
|  | +{ | ||||||
|  | +	return !fws->avoid_queueing; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  bool brcmf_fws_fc_active(struct brcmf_fws_info *fws) | ||||||
|  |  { | ||||||
|  |  	if (!fws->creditmap_received) | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h | ||||||
|  | @@ -20,6 +20,7 @@ | ||||||
|  |   | ||||||
|  |  int brcmf_fws_init(struct brcmf_pub *drvr); | ||||||
|  |  void brcmf_fws_deinit(struct brcmf_pub *drvr); | ||||||
|  | +bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws); | ||||||
|  |  bool brcmf_fws_fc_active(struct brcmf_fws_info *fws); | ||||||
|  |  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); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||||||
|  | @@ -782,8 +782,8 @@ static int brcmf_msgbuf_schedule_txdata( | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |   | ||||||
|  | -static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx, | ||||||
|  | -			       u8 offset, struct sk_buff *skb) | ||||||
|  | +static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx, | ||||||
|  | +				      struct sk_buff *skb) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; | ||||||
|  |  	struct brcmf_flowring *flow = msgbuf->flow; | ||||||
|  | @@ -1467,7 +1467,7 @@ int brcmf_proto_msgbuf_attach(struct brc | ||||||
|  |  	drvr->proto->hdrpull = brcmf_msgbuf_hdrpull; | ||||||
|  |  	drvr->proto->query_dcmd = brcmf_msgbuf_query_dcmd; | ||||||
|  |  	drvr->proto->set_dcmd = brcmf_msgbuf_set_dcmd; | ||||||
|  | -	drvr->proto->txdata = brcmf_msgbuf_txdata; | ||||||
|  | +	drvr->proto->tx_queue_data = brcmf_msgbuf_tx_queue_data; | ||||||
|  |  	drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode; | ||||||
|  |  	drvr->proto->delete_peer = brcmf_msgbuf_delete_peer; | ||||||
|  |  	drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer; | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c | ||||||
|  | @@ -51,7 +51,7 @@ int brcmf_proto_attach(struct brcmf_pub | ||||||
|  |  			  drvr->bus_if->proto_type); | ||||||
|  |  		goto fail; | ||||||
|  |  	} | ||||||
|  | -	if ((proto->txdata == NULL) || (proto->hdrpull == NULL) || | ||||||
|  | +	if (!proto->tx_queue_data || (proto->hdrpull == NULL) || | ||||||
|  |  	    (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) || | ||||||
|  |  	    (proto->configure_addr_mode == NULL) || | ||||||
|  |  	    (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) { | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | ||||||
|  | @@ -33,6 +33,8 @@ struct brcmf_proto { | ||||||
|  |  			  void *buf, uint len); | ||||||
|  |  	int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, | ||||||
|  |  			uint len); | ||||||
|  | +	int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx, | ||||||
|  | +			     struct sk_buff *skb); | ||||||
|  |  	int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset, | ||||||
|  |  		      struct sk_buff *skb); | ||||||
|  |  	void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx, | ||||||
|  | @@ -74,6 +76,13 @@ static inline int brcmf_proto_set_dcmd(s | ||||||
|  |  { | ||||||
|  |  	return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len); | ||||||
|  |  } | ||||||
|  | + | ||||||
|  | +static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx, | ||||||
|  | +					    struct sk_buff *skb) | ||||||
|  | +{ | ||||||
|  | +	return drvr->proto->tx_queue_data(drvr, ifidx, skb); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx, | ||||||
|  |  				     u8 offset, struct sk_buff *skb) | ||||||
|  |  { | ||||||
| @@ -0,0 +1,62 @@ | |||||||
|  | From e1c122d55f9ec5608ca98a9a846fd39cdf3ed7d7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Fri, 14 Oct 2016 09:45:59 +0200 | ||||||
|  | Subject: [PATCH] brcmfmac: print name of connect status event | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | This simplifies debugging. Format %s (%u) comes from similar debugging | ||||||
|  | message in brcmf_fweh_event_worker. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c     | 4 ++-- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h     | 2 ++ | ||||||
|  |  3 files changed, 6 insertions(+), 3 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -5506,7 +5506,8 @@ brcmf_notify_connect_status_ap(struct br | ||||||
|  |  	u32 reason = e->reason; | ||||||
|  |  	struct station_info sinfo; | ||||||
|  |   | ||||||
|  | -	brcmf_dbg(CONN, "event %d, reason %d\n", event, reason); | ||||||
|  | +	brcmf_dbg(CONN, "event %s (%u), reason %d\n", | ||||||
|  | +		  brcmf_fweh_event_name(event), event, reason); | ||||||
|  |  	if (event == BRCMF_E_LINK && reason == BRCMF_E_REASON_LINK_BSSCFG_DIS && | ||||||
|  |  	    ndev != cfg_to_ndev(cfg)) { | ||||||
|  |  		brcmf_dbg(CONN, "AP mode link down\n"); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c | ||||||
|  | @@ -69,7 +69,7 @@ static struct brcmf_fweh_event_name fweh | ||||||
|  |   * | ||||||
|  |   * @code: code to lookup. | ||||||
|  |   */ | ||||||
|  | -static const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code) | ||||||
|  | +const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code) | ||||||
|  |  { | ||||||
|  |  	int i; | ||||||
|  |  	for (i = 0; i < ARRAY_SIZE(fweh_event_names); i++) { | ||||||
|  | @@ -79,7 +79,7 @@ static const char *brcmf_fweh_event_name | ||||||
|  |  	return "unknown"; | ||||||
|  |  } | ||||||
|  |  #else | ||||||
|  | -static const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code) | ||||||
|  | +const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code) | ||||||
|  |  { | ||||||
|  |  	return "nodebug"; | ||||||
|  |  } | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h | ||||||
|  | @@ -287,6 +287,8 @@ struct brcmf_fweh_info { | ||||||
|  |  					 void *data); | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code); | ||||||
|  | + | ||||||
|  |  void brcmf_fweh_attach(struct brcmf_pub *drvr); | ||||||
|  |  void brcmf_fweh_detach(struct brcmf_pub *drvr); | ||||||
|  |  int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code, | ||||||
| @@ -0,0 +1,45 @@ | |||||||
|  | From f25ba69c638b24097840a96bd3caf5599f9a3616 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Wright Feng <wefe@cypress.com> | ||||||
|  | Date: Fri, 18 Nov 2016 09:59:52 +0800 | ||||||
|  | Subject: [PATCH] brcmfmac: update beacon IE after bss up and clear when AP | ||||||
|  |  stopped | ||||||
|  |  | ||||||
|  | Firmware doesn't update beacon/Probe Response vendor IEs correctly when | ||||||
|  | bss is down, so we move brcmf_config_ap_mgmt_ie after BSS up. And host | ||||||
|  | driver should clear IEs when AP stopped so that the IEs in host side will | ||||||
|  | be synced with in firmware side. | ||||||
|  |  | ||||||
|  | Signed-off-by: Wright Feng <wright.feng@cypress.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +++-- | ||||||
|  |  1 file changed, 3 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -4578,8 +4578,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wi | ||||||
|  |  		brcmf_configure_opensecurity(ifp); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); | ||||||
|  | - | ||||||
|  |  	/* Parameters shared by all radio interfaces */ | ||||||
|  |  	if (!mbss) { | ||||||
|  |  		if ((supports_11d) && (is_11d != ifp->vif->is_11d)) { | ||||||
|  | @@ -4708,6 +4706,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi | ||||||
|  |  		WARN_ON(1); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); | ||||||
|  |  	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); | ||||||
|  |  	brcmf_net_setcarrier(ifp, true); | ||||||
|  |   | ||||||
|  | @@ -4764,6 +4763,8 @@ static int brcmf_cfg80211_stop_ap(struct | ||||||
|  |  		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); | ||||||
|  |  		if (err < 0) | ||||||
|  |  			brcmf_err("BRCMF_C_UP error %d\n", err); | ||||||
|  | + | ||||||
|  | +		brcmf_vif_clear_mgmt_ies(ifp->vif); | ||||||
|  |  	} else { | ||||||
|  |  		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx); | ||||||
|  |  		bss_enable.enable = cpu_to_le32(0); | ||||||
| @@ -0,0 +1,197 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Date: Wed, 25 Jan 2017 15:10:37 +0100 | ||||||
|  | Subject: [PATCH] ath9k: fix race condition in enabling/disabling IRQs | ||||||
|  |  | ||||||
|  | The code currently relies on refcounting to disable IRQs from within the | ||||||
|  | IRQ handler and re-enabling them again after the tasklet has run. | ||||||
|  |  | ||||||
|  | However, due to race conditions sometimes the IRQ handler might be | ||||||
|  | called twice, or the tasklet may not run at all (if interrupted in the | ||||||
|  | middle of a reset). | ||||||
|  |  | ||||||
|  | This can cause nasty imbalances in the irq-disable refcount which will | ||||||
|  | get the driver permanently stuck until the entire radio has been stopped | ||||||
|  | and started again (ath_reset will not recover from this). | ||||||
|  |  | ||||||
|  | Instead of using this fragile logic, change the code to ensure that | ||||||
|  | running the irq handler during tasklet processing is safe, and leave the | ||||||
|  | refcount untouched. | ||||||
|  |  | ||||||
|  | Cc: stable@vger.kernel.org | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
|  | @@ -998,6 +998,7 @@ struct ath_softc { | ||||||
|  |  	struct survey_info *cur_survey; | ||||||
|  |  	struct survey_info survey[ATH9K_NUM_CHANNELS]; | ||||||
|  |   | ||||||
|  | +	spinlock_t intr_lock; | ||||||
|  |  	struct tasklet_struct intr_tq; | ||||||
|  |  	struct tasklet_struct bcon_tasklet; | ||||||
|  |  	struct ath_hw *sc_ah; | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
|  | @@ -669,6 +669,7 @@ static int ath9k_init_softc(u16 devid, s | ||||||
|  |  		common->bt_ant_diversity = 1; | ||||||
|  |   | ||||||
|  |  	spin_lock_init(&common->cc_lock); | ||||||
|  | +	spin_lock_init(&sc->intr_lock); | ||||||
|  |  	spin_lock_init(&sc->sc_serial_rw); | ||||||
|  |  	spin_lock_init(&sc->sc_pm_lock); | ||||||
|  |  	spin_lock_init(&sc->chan_lock); | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/mac.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/mac.c | ||||||
|  | @@ -810,21 +810,12 @@ void ath9k_hw_disable_interrupts(struct | ||||||
|  |  } | ||||||
|  |  EXPORT_SYMBOL(ath9k_hw_disable_interrupts); | ||||||
|  |   | ||||||
|  | -void ath9k_hw_enable_interrupts(struct ath_hw *ah) | ||||||
|  | +static void __ath9k_hw_enable_interrupts(struct ath_hw *ah) | ||||||
|  |  { | ||||||
|  |  	struct ath_common *common = ath9k_hw_common(ah); | ||||||
|  |  	u32 sync_default = AR_INTR_SYNC_DEFAULT; | ||||||
|  |  	u32 async_mask; | ||||||
|  |   | ||||||
|  | -	if (!(ah->imask & ATH9K_INT_GLOBAL)) | ||||||
|  | -		return; | ||||||
|  | - | ||||||
|  | -	if (!atomic_inc_and_test(&ah->intr_ref_cnt)) { | ||||||
|  | -		ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", | ||||||
|  | -			atomic_read(&ah->intr_ref_cnt)); | ||||||
|  | -		return; | ||||||
|  | -	} | ||||||
|  | - | ||||||
|  |  	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah) || | ||||||
|  |  	    AR_SREV_9561(ah)) | ||||||
|  |  		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL; | ||||||
|  | @@ -846,6 +837,39 @@ void ath9k_hw_enable_interrupts(struct a | ||||||
|  |  	ath_dbg(common, INTERRUPT, "AR_IMR 0x%x IER 0x%x\n", | ||||||
|  |  		REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER)); | ||||||
|  |  } | ||||||
|  | + | ||||||
|  | +void ath9k_hw_resume_interrupts(struct ath_hw *ah) | ||||||
|  | +{ | ||||||
|  | +	struct ath_common *common = ath9k_hw_common(ah); | ||||||
|  | + | ||||||
|  | +	if (!(ah->imask & ATH9K_INT_GLOBAL)) | ||||||
|  | +		return; | ||||||
|  | + | ||||||
|  | +	if (atomic_read(&ah->intr_ref_cnt) != 0) { | ||||||
|  | +		ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", | ||||||
|  | +			atomic_read(&ah->intr_ref_cnt)); | ||||||
|  | +		return; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	__ath9k_hw_enable_interrupts(ah); | ||||||
|  | +} | ||||||
|  | +EXPORT_SYMBOL(ath9k_hw_resume_interrupts); | ||||||
|  | + | ||||||
|  | +void ath9k_hw_enable_interrupts(struct ath_hw *ah) | ||||||
|  | +{ | ||||||
|  | +	struct ath_common *common = ath9k_hw_common(ah); | ||||||
|  | + | ||||||
|  | +	if (!(ah->imask & ATH9K_INT_GLOBAL)) | ||||||
|  | +		return; | ||||||
|  | + | ||||||
|  | +	if (!atomic_inc_and_test(&ah->intr_ref_cnt)) { | ||||||
|  | +		ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", | ||||||
|  | +			atomic_read(&ah->intr_ref_cnt)); | ||||||
|  | +		return; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	__ath9k_hw_enable_interrupts(ah); | ||||||
|  | +} | ||||||
|  |  EXPORT_SYMBOL(ath9k_hw_enable_interrupts); | ||||||
|  |   | ||||||
|  |  void ath9k_hw_set_interrupts(struct ath_hw *ah) | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/mac.h | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/mac.h | ||||||
|  | @@ -744,6 +744,7 @@ void ath9k_hw_set_interrupts(struct ath_ | ||||||
|  |  void ath9k_hw_enable_interrupts(struct ath_hw *ah); | ||||||
|  |  void ath9k_hw_disable_interrupts(struct ath_hw *ah); | ||||||
|  |  void ath9k_hw_kill_interrupts(struct ath_hw *ah); | ||||||
|  | +void ath9k_hw_resume_interrupts(struct ath_hw *ah); | ||||||
|  |   | ||||||
|  |  void ar9002_hw_attach_mac_ops(struct ath_hw *ah); | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/main.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||||||
|  | @@ -374,21 +374,20 @@ void ath9k_tasklet(unsigned long data) | ||||||
|  |  	struct ath_common *common = ath9k_hw_common(ah); | ||||||
|  |  	enum ath_reset_type type; | ||||||
|  |  	unsigned long flags; | ||||||
|  | -	u32 status = sc->intrstatus; | ||||||
|  | +	u32 status; | ||||||
|  |  	u32 rxmask; | ||||||
|  |   | ||||||
|  | +	spin_lock_irqsave(&sc->intr_lock, flags); | ||||||
|  | +	status = sc->intrstatus; | ||||||
|  | +	sc->intrstatus = 0; | ||||||
|  | +	spin_unlock_irqrestore(&sc->intr_lock, flags); | ||||||
|  | + | ||||||
|  |  	ath9k_ps_wakeup(sc); | ||||||
|  |  	spin_lock(&sc->sc_pcu_lock); | ||||||
|  |   | ||||||
|  |  	if (status & ATH9K_INT_FATAL) { | ||||||
|  |  		type = RESET_TYPE_FATAL_INT; | ||||||
|  |  		ath9k_queue_reset(sc, type); | ||||||
|  | - | ||||||
|  | -		/* | ||||||
|  | -		 * Increment the ref. counter here so that | ||||||
|  | -		 * interrupts are enabled in the reset routine. | ||||||
|  | -		 */ | ||||||
|  | -		atomic_inc(&ah->intr_ref_cnt); | ||||||
|  |  		ath_dbg(common, RESET, "FATAL: Skipping interrupts\n"); | ||||||
|  |  		goto out; | ||||||
|  |  	} | ||||||
|  | @@ -404,11 +403,6 @@ void ath9k_tasklet(unsigned long data) | ||||||
|  |  			type = RESET_TYPE_BB_WATCHDOG; | ||||||
|  |  			ath9k_queue_reset(sc, type); | ||||||
|  |   | ||||||
|  | -			/* | ||||||
|  | -			 * Increment the ref. counter here so that | ||||||
|  | -			 * interrupts are enabled in the reset routine. | ||||||
|  | -			 */ | ||||||
|  | -			atomic_inc(&ah->intr_ref_cnt); | ||||||
|  |  			ath_dbg(common, RESET, | ||||||
|  |  				"BB_WATCHDOG: Skipping interrupts\n"); | ||||||
|  |  			goto out; | ||||||
|  | @@ -421,7 +415,6 @@ void ath9k_tasklet(unsigned long data) | ||||||
|  |  		if ((sc->gtt_cnt >= MAX_GTT_CNT) && !ath9k_hw_check_alive(ah)) { | ||||||
|  |  			type = RESET_TYPE_TX_GTT; | ||||||
|  |  			ath9k_queue_reset(sc, type); | ||||||
|  | -			atomic_inc(&ah->intr_ref_cnt); | ||||||
|  |  			ath_dbg(common, RESET, | ||||||
|  |  				"GTT: Skipping interrupts\n"); | ||||||
|  |  			goto out; | ||||||
|  | @@ -478,7 +471,7 @@ void ath9k_tasklet(unsigned long data) | ||||||
|  |  	ath9k_btcoex_handle_interrupt(sc, status); | ||||||
|  |   | ||||||
|  |  	/* re-enable hardware interrupt */ | ||||||
|  | -	ath9k_hw_enable_interrupts(ah); | ||||||
|  | +	ath9k_hw_resume_interrupts(ah); | ||||||
|  |  out: | ||||||
|  |  	spin_unlock(&sc->sc_pcu_lock); | ||||||
|  |  	ath9k_ps_restore(sc); | ||||||
|  | @@ -542,7 +535,9 @@ irqreturn_t ath_isr(int irq, void *dev) | ||||||
|  |  		return IRQ_NONE; | ||||||
|  |   | ||||||
|  |  	/* Cache the status */ | ||||||
|  | -	sc->intrstatus = status; | ||||||
|  | +	spin_lock(&sc->intr_lock); | ||||||
|  | +	sc->intrstatus |= status; | ||||||
|  | +	spin_unlock(&sc->intr_lock); | ||||||
|  |   | ||||||
|  |  	if (status & SCHED_INTR) | ||||||
|  |  		sched = true; | ||||||
|  | @@ -588,7 +583,7 @@ chip_reset: | ||||||
|  |   | ||||||
|  |  	if (sched) { | ||||||
|  |  		/* turn off every interrupt */ | ||||||
|  | -		ath9k_hw_disable_interrupts(ah); | ||||||
|  | +		ath9k_hw_kill_interrupts(ah); | ||||||
|  |  		tasklet_schedule(&sc->intr_tq); | ||||||
|  |  	} | ||||||
|  |   | ||||||
| @@ -0,0 +1,490 @@ | |||||||
|  | From be4b092cab84b2ecc01ee7f4da6a044279430b6f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:20 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: add pcie host dongle interface rev6 support | ||||||
|  |  | ||||||
|  | In rev6 of pcie host dongle interface protocol, host needs to maximum | ||||||
|  | supported ring number from dongle shared memory and set up ring buffer | ||||||
|  | and ring indices offset accordingly. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  10 +- | ||||||
|  |  .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  |  38 +++-- | ||||||
|  |  .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.h  |   4 + | ||||||
|  |  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 171 ++++++++++++--------- | ||||||
|  |  4 files changed, 132 insertions(+), 91 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | ||||||
|  | @@ -22,10 +22,12 @@ | ||||||
|  |  /* IDs of the 6 default common rings of msgbuf protocol */ | ||||||
|  |  #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT	0 | ||||||
|  |  #define BRCMF_H2D_MSGRING_RXPOST_SUBMIT		1 | ||||||
|  | +#define BRCMF_H2D_MSGRING_FLOWRING_IDSTART	2 | ||||||
|  |  #define BRCMF_D2H_MSGRING_CONTROL_COMPLETE	2 | ||||||
|  |  #define BRCMF_D2H_MSGRING_TX_COMPLETE		3 | ||||||
|  |  #define BRCMF_D2H_MSGRING_RX_COMPLETE		4 | ||||||
|  |   | ||||||
|  | + | ||||||
|  |  #define BRCMF_NROF_H2D_COMMON_MSGRINGS		2 | ||||||
|  |  #define BRCMF_NROF_D2H_COMMON_MSGRINGS		3 | ||||||
|  |  #define BRCMF_NROF_COMMON_MSGRINGS	(BRCMF_NROF_H2D_COMMON_MSGRINGS + \ | ||||||
|  | @@ -95,14 +97,18 @@ struct brcmf_bus_ops { | ||||||
|  |   * @flowrings: commonrings which are dynamically created and destroyed for data. | ||||||
|  |   * @rx_dataoffset: if set then all rx data has this this offset. | ||||||
|  |   * @max_rxbufpost: maximum number of buffers to post for rx. | ||||||
|  | - * @nrof_flowrings: number of flowrings. | ||||||
|  | + * @max_flowrings: maximum number of tx flow rings supported. | ||||||
|  | + * @max_submissionrings: maximum number of submission rings(h2d) supported. | ||||||
|  | + * @max_completionrings: maximum number of completion rings(d2h) supported. | ||||||
|  |   */ | ||||||
|  |  struct brcmf_bus_msgbuf { | ||||||
|  |  	struct brcmf_commonring *commonrings[BRCMF_NROF_COMMON_MSGRINGS]; | ||||||
|  |  	struct brcmf_commonring **flowrings; | ||||||
|  |  	u32 rx_dataoffset; | ||||||
|  |  	u32 max_rxbufpost; | ||||||
|  | -	u32 nrof_flowrings; | ||||||
|  | +	u16 max_flowrings; | ||||||
|  | +	u16 max_submissionrings; | ||||||
|  | +	u16 max_completionrings; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | ||||||
|  | @@ -87,11 +87,6 @@ struct msgbuf_common_hdr { | ||||||
|  |  	__le32				request_id; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -struct msgbuf_buf_addr { | ||||||
|  | -	__le32				low_addr; | ||||||
|  | -	__le32				high_addr; | ||||||
|  | -}; | ||||||
|  | - | ||||||
|  |  struct msgbuf_ioctl_req_hdr { | ||||||
|  |  	struct msgbuf_common_hdr	msg; | ||||||
|  |  	__le32				cmd; | ||||||
|  | @@ -227,7 +222,10 @@ struct brcmf_msgbuf { | ||||||
|  |  	struct brcmf_commonring **commonrings; | ||||||
|  |  	struct brcmf_commonring **flowrings; | ||||||
|  |  	dma_addr_t *flowring_dma_handle; | ||||||
|  | -	u16 nrof_flowrings; | ||||||
|  | + | ||||||
|  | +	u16 max_flowrings; | ||||||
|  | +	u16 max_submissionrings; | ||||||
|  | +	u16 max_completionrings; | ||||||
|  |   | ||||||
|  |  	u16 rx_dataoffset; | ||||||
|  |  	u32 max_rxbufpost; | ||||||
|  | @@ -610,7 +608,7 @@ brcmf_msgbuf_flowring_create_worker(stru | ||||||
|  |  	create->msg.request_id = 0; | ||||||
|  |  	create->tid = brcmf_flowring_tid(msgbuf->flow, flowid); | ||||||
|  |  	create->flow_ring_id = cpu_to_le16(flowid + | ||||||
|  | -					   BRCMF_NROF_H2D_COMMON_MSGRINGS); | ||||||
|  | +					   BRCMF_H2D_MSGRING_FLOWRING_IDSTART); | ||||||
|  |  	memcpy(create->sa, work->sa, ETH_ALEN); | ||||||
|  |  	memcpy(create->da, work->da, ETH_ALEN); | ||||||
|  |  	address = (u64)msgbuf->flowring_dma_handle[flowid]; | ||||||
|  | @@ -760,7 +758,7 @@ static void brcmf_msgbuf_txflow_worker(s | ||||||
|  |  	u32 flowid; | ||||||
|  |   | ||||||
|  |  	msgbuf = container_of(worker, struct brcmf_msgbuf, txflow_work); | ||||||
|  | -	for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->nrof_flowrings) { | ||||||
|  | +	for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->max_flowrings) { | ||||||
|  |  		clear_bit(flowid, msgbuf->flow_map); | ||||||
|  |  		brcmf_msgbuf_txflow(msgbuf, flowid); | ||||||
|  |  	} | ||||||
|  | @@ -866,7 +864,7 @@ brcmf_msgbuf_process_txstatus(struct brc | ||||||
|  |  	tx_status = (struct msgbuf_tx_status *)buf; | ||||||
|  |  	idx = le32_to_cpu(tx_status->msg.request_id); | ||||||
|  |  	flowid = le16_to_cpu(tx_status->compl_hdr.flow_ring_id); | ||||||
|  | -	flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; | ||||||
|  | +	flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART; | ||||||
|  |  	skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, | ||||||
|  |  				     msgbuf->tx_pktids, idx); | ||||||
|  |  	if (!skb) | ||||||
|  | @@ -1174,7 +1172,7 @@ brcmf_msgbuf_process_flow_ring_create_re | ||||||
|  |  	flowring_create_resp = (struct msgbuf_flowring_create_resp *)buf; | ||||||
|  |   | ||||||
|  |  	flowid = le16_to_cpu(flowring_create_resp->compl_hdr.flow_ring_id); | ||||||
|  | -	flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; | ||||||
|  | +	flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART; | ||||||
|  |  	status =  le16_to_cpu(flowring_create_resp->compl_hdr.status); | ||||||
|  |   | ||||||
|  |  	if (status) { | ||||||
|  | @@ -1202,7 +1200,7 @@ brcmf_msgbuf_process_flow_ring_delete_re | ||||||
|  |  	flowring_delete_resp = (struct msgbuf_flowring_delete_resp *)buf; | ||||||
|  |   | ||||||
|  |  	flowid = le16_to_cpu(flowring_delete_resp->compl_hdr.flow_ring_id); | ||||||
|  | -	flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; | ||||||
|  | +	flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART; | ||||||
|  |  	status =  le16_to_cpu(flowring_delete_resp->compl_hdr.status); | ||||||
|  |   | ||||||
|  |  	if (status) { | ||||||
|  | @@ -1307,7 +1305,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct | ||||||
|  |  	brcmf_msgbuf_process_rx(msgbuf, buf); | ||||||
|  |   | ||||||
|  |  	for_each_set_bit(flowid, msgbuf->txstatus_done_map, | ||||||
|  | -			 msgbuf->nrof_flowrings) { | ||||||
|  | +			 msgbuf->max_flowrings) { | ||||||
|  |  		clear_bit(flowid, msgbuf->txstatus_done_map); | ||||||
|  |  		commonring = msgbuf->flowrings[flowid]; | ||||||
|  |  		qlen = brcmf_flowring_qlen(msgbuf->flow, flowid); | ||||||
|  | @@ -1349,7 +1347,7 @@ void brcmf_msgbuf_delete_flowring(struct | ||||||
|  |  	delete->msg.request_id = 0; | ||||||
|  |   | ||||||
|  |  	delete->flow_ring_id = cpu_to_le16(flowid + | ||||||
|  | -					   BRCMF_NROF_H2D_COMMON_MSGRINGS); | ||||||
|  | +					   BRCMF_H2D_MSGRING_FLOWRING_IDSTART); | ||||||
|  |  	delete->reason = 0; | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(MSGBUF, "Send Flow Delete Req flow ID %d, ifindex %d\n", | ||||||
|  | @@ -1427,10 +1425,10 @@ int brcmf_proto_msgbuf_attach(struct brc | ||||||
|  |   | ||||||
|  |  	if_msgbuf = drvr->bus_if->msgbuf; | ||||||
|  |   | ||||||
|  | -	if (if_msgbuf->nrof_flowrings >= BRCMF_FLOWRING_HASHSIZE) { | ||||||
|  | +	if (if_msgbuf->max_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; | ||||||
|  | +			  if_msgbuf->max_flowrings); | ||||||
|  | +		if_msgbuf->max_flowrings = BRCMF_FLOWRING_HASHSIZE - 1; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL); | ||||||
|  | @@ -1443,7 +1441,7 @@ int brcmf_proto_msgbuf_attach(struct brc | ||||||
|  |  		goto fail; | ||||||
|  |  	} | ||||||
|  |  	INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker); | ||||||
|  | -	count = BITS_TO_LONGS(if_msgbuf->nrof_flowrings); | ||||||
|  | +	count = BITS_TO_LONGS(if_msgbuf->max_flowrings); | ||||||
|  |  	count = count * sizeof(unsigned long); | ||||||
|  |  	msgbuf->flow_map = kzalloc(count, GFP_KERNEL); | ||||||
|  |  	if (!msgbuf->flow_map) | ||||||
|  | @@ -1479,8 +1477,8 @@ int brcmf_proto_msgbuf_attach(struct brc | ||||||
|  |  	msgbuf->commonrings = | ||||||
|  |  		(struct brcmf_commonring **)if_msgbuf->commonrings; | ||||||
|  |  	msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings; | ||||||
|  | -	msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings; | ||||||
|  | -	msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings * | ||||||
|  | +	msgbuf->max_flowrings = if_msgbuf->max_flowrings; | ||||||
|  | +	msgbuf->flowring_dma_handle = kzalloc(msgbuf->max_flowrings * | ||||||
|  |  		sizeof(*msgbuf->flowring_dma_handle), GFP_KERNEL); | ||||||
|  |  	if (!msgbuf->flowring_dma_handle) | ||||||
|  |  		goto fail; | ||||||
|  | @@ -1501,7 +1499,7 @@ int brcmf_proto_msgbuf_attach(struct brc | ||||||
|  |  		goto fail; | ||||||
|  |   | ||||||
|  |  	msgbuf->flow = brcmf_flowring_attach(drvr->bus_if->dev, | ||||||
|  | -					     if_msgbuf->nrof_flowrings); | ||||||
|  | +					     if_msgbuf->max_flowrings); | ||||||
|  |  	if (!msgbuf->flow) | ||||||
|  |  		goto fail; | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | ||||||
|  | @@ -31,6 +31,10 @@ | ||||||
|  |  #define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE		32 | ||||||
|  |  #define BRCMF_H2D_TXFLOWRING_ITEMSIZE			48 | ||||||
|  |   | ||||||
|  | +struct msgbuf_buf_addr { | ||||||
|  | +	__le32		low_addr; | ||||||
|  | +	__le32		high_addr; | ||||||
|  | +}; | ||||||
|  |   | ||||||
|  |  int brcmf_proto_msgbuf_rx_trigger(struct device *dev); | ||||||
|  |  void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | ||||||
|  | @@ -135,7 +135,7 @@ static struct brcmf_firmware_mapping brc | ||||||
|  |  						 BRCMF_PCIE_MB_INT_D2H3_DB1) | ||||||
|  |   | ||||||
|  |  #define BRCMF_PCIE_MIN_SHARED_VERSION		5 | ||||||
|  | -#define BRCMF_PCIE_MAX_SHARED_VERSION		5 | ||||||
|  | +#define BRCMF_PCIE_MAX_SHARED_VERSION		6 | ||||||
|  |  #define BRCMF_PCIE_SHARED_VERSION_MASK		0x00FF | ||||||
|  |  #define BRCMF_PCIE_SHARED_DMA_INDEX		0x10000 | ||||||
|  |  #define BRCMF_PCIE_SHARED_DMA_2B_IDX		0x100000 | ||||||
|  | @@ -166,17 +166,6 @@ static struct brcmf_firmware_mapping brc | ||||||
|  |  #define BRCMF_RING_MEM_SZ			16 | ||||||
|  |  #define BRCMF_RING_STATE_SZ			8 | ||||||
|  |   | ||||||
|  | -#define BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET	4 | ||||||
|  | -#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 | ||||||
|  | - | ||||||
|  |  #define BRCMF_DEF_MAX_RXBUFPOST			255 | ||||||
|  |   | ||||||
|  |  #define BRCMF_CONSOLE_BUFADDR_OFFSET		8 | ||||||
|  | @@ -231,7 +220,9 @@ struct brcmf_pcie_shared_info { | ||||||
|  |  	struct brcmf_pcie_ringbuf *commonrings[BRCMF_NROF_COMMON_MSGRINGS]; | ||||||
|  |  	struct brcmf_pcie_ringbuf *flowrings; | ||||||
|  |  	u16 max_rxbufpost; | ||||||
|  | -	u32 nrof_flowrings; | ||||||
|  | +	u16 max_flowrings; | ||||||
|  | +	u16 max_submissionrings; | ||||||
|  | +	u16 max_completionrings; | ||||||
|  |  	u32 rx_dataoffset; | ||||||
|  |  	u32 htod_mb_data_addr; | ||||||
|  |  	u32 dtoh_mb_data_addr; | ||||||
|  | @@ -241,6 +232,7 @@ struct brcmf_pcie_shared_info { | ||||||
|  |  	dma_addr_t scratch_dmahandle; | ||||||
|  |  	void *ringupd; | ||||||
|  |  	dma_addr_t ringupd_dmahandle; | ||||||
|  | +	u8 version; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  struct brcmf_pcie_core_info { | ||||||
|  | @@ -284,6 +276,36 @@ struct brcmf_pcie_ringbuf { | ||||||
|  |  	u8 id; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +/** | ||||||
|  | + * struct brcmf_pcie_dhi_ringinfo - dongle/host interface shared ring info | ||||||
|  | + * | ||||||
|  | + * @ringmem: dongle memory pointer to ring memory location | ||||||
|  | + * @h2d_w_idx_ptr: h2d ring write indices dongle memory pointers | ||||||
|  | + * @h2d_r_idx_ptr: h2d ring read indices dongle memory pointers | ||||||
|  | + * @d2h_w_idx_ptr: d2h ring write indices dongle memory pointers | ||||||
|  | + * @d2h_r_idx_ptr: d2h ring read indices dongle memory pointers | ||||||
|  | + * @h2d_w_idx_hostaddr: h2d ring write indices host memory pointers | ||||||
|  | + * @h2d_r_idx_hostaddr: h2d ring read indices host memory pointers | ||||||
|  | + * @d2h_w_idx_hostaddr: d2h ring write indices host memory pointers | ||||||
|  | + * @d2h_r_idx_hostaddr: d2h ring reaD indices host memory pointers | ||||||
|  | + * @max_flowrings: maximum number of tx flow rings supported. | ||||||
|  | + * @max_submissionrings: maximum number of submission rings(h2d) supported. | ||||||
|  | + * @max_completionrings: maximum number of completion rings(d2h) supported. | ||||||
|  | + */ | ||||||
|  | +struct brcmf_pcie_dhi_ringinfo { | ||||||
|  | +	__le32			ringmem; | ||||||
|  | +	__le32			h2d_w_idx_ptr; | ||||||
|  | +	__le32			h2d_r_idx_ptr; | ||||||
|  | +	__le32			d2h_w_idx_ptr; | ||||||
|  | +	__le32			d2h_r_idx_ptr; | ||||||
|  | +	struct msgbuf_buf_addr	h2d_w_idx_hostaddr; | ||||||
|  | +	struct msgbuf_buf_addr	h2d_r_idx_hostaddr; | ||||||
|  | +	struct msgbuf_buf_addr	d2h_w_idx_hostaddr; | ||||||
|  | +	struct msgbuf_buf_addr	d2h_r_idx_hostaddr; | ||||||
|  | +	__le16			max_flowrings; | ||||||
|  | +	__le16			max_submissionrings; | ||||||
|  | +	__le16			max_completionrings; | ||||||
|  | +}; | ||||||
|  |   | ||||||
|  |  static const u32 brcmf_ring_max_item[BRCMF_NROF_COMMON_MSGRINGS] = { | ||||||
|  |  	BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM, | ||||||
|  | @@ -1054,26 +1076,35 @@ static int brcmf_pcie_init_ringbuffers(s | ||||||
|  |  { | ||||||
|  |  	struct brcmf_pcie_ringbuf *ring; | ||||||
|  |  	struct brcmf_pcie_ringbuf *rings; | ||||||
|  | -	u32 ring_addr; | ||||||
|  |  	u32 d2h_w_idx_ptr; | ||||||
|  |  	u32 d2h_r_idx_ptr; | ||||||
|  |  	u32 h2d_w_idx_ptr; | ||||||
|  |  	u32 h2d_r_idx_ptr; | ||||||
|  | -	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); | ||||||
|  | +	struct brcmf_pcie_dhi_ringinfo ringinfo; | ||||||
|  | +	u16 max_flowrings; | ||||||
|  | +	u16 max_submissionrings; | ||||||
|  | +	u16 max_completionrings; | ||||||
|  | + | ||||||
|  | +	memcpy_fromio(&ringinfo, devinfo->tcm + devinfo->shared.ring_info_addr, | ||||||
|  | +		      sizeof(ringinfo)); | ||||||
|  | +	if (devinfo->shared.version >= 6) { | ||||||
|  | +		max_submissionrings = le16_to_cpu(ringinfo.max_submissionrings); | ||||||
|  | +		max_flowrings = le16_to_cpu(ringinfo.max_flowrings); | ||||||
|  | +		max_completionrings = le16_to_cpu(ringinfo.max_completionrings); | ||||||
|  | +	} else { | ||||||
|  | +		max_submissionrings = le16_to_cpu(ringinfo.max_flowrings); | ||||||
|  | +		max_flowrings = max_submissionrings - | ||||||
|  | +				BRCMF_NROF_H2D_COMMON_MSGRINGS; | ||||||
|  | +		max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS; | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  |  	if (devinfo->dma_idx_sz != 0) { | ||||||
|  | -		bufsz = (BRCMF_NROF_D2H_COMMON_MSGRINGS + max_sub_queues) * | ||||||
|  | +		bufsz = (max_submissionrings + max_completionrings) * | ||||||
|  |  			devinfo->dma_idx_sz * 2; | ||||||
|  |  		devinfo->idxbuf = dma_alloc_coherent(&devinfo->pdev->dev, bufsz, | ||||||
|  |  						     &devinfo->idxbuf_dmahandle, | ||||||
|  | @@ -1083,14 +1114,10 @@ static int brcmf_pcie_init_ringbuffers(s | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	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); | ||||||
|  | +		d2h_w_idx_ptr = le32_to_cpu(ringinfo.d2h_w_idx_ptr); | ||||||
|  | +		d2h_r_idx_ptr = le32_to_cpu(ringinfo.d2h_r_idx_ptr); | ||||||
|  | +		h2d_w_idx_ptr = le32_to_cpu(ringinfo.h2d_w_idx_ptr); | ||||||
|  | +		h2d_r_idx_ptr = le32_to_cpu(ringinfo.h2d_r_idx_ptr); | ||||||
|  |  		idx_offset = sizeof(u32); | ||||||
|  |  		devinfo->write_ptr = brcmf_pcie_write_tcm16; | ||||||
|  |  		devinfo->read_ptr = brcmf_pcie_read_tcm16; | ||||||
|  | @@ -1103,34 +1130,42 @@ static int brcmf_pcie_init_ringbuffers(s | ||||||
|  |  		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); | ||||||
|  | +		ringinfo.h2d_w_idx_hostaddr.low_addr = | ||||||
|  | +			cpu_to_le32(address & 0xffffffff); | ||||||
|  | +		ringinfo.h2d_w_idx_hostaddr.high_addr = | ||||||
|  | +			cpu_to_le32(address >> 32); | ||||||
|  | + | ||||||
|  | +		h2d_r_idx_ptr = h2d_w_idx_ptr + | ||||||
|  | +				max_submissionrings * idx_offset; | ||||||
|  | +		address += max_submissionrings * idx_offset; | ||||||
|  | +		ringinfo.h2d_r_idx_hostaddr.low_addr = | ||||||
|  | +			cpu_to_le32(address & 0xffffffff); | ||||||
|  | +		ringinfo.h2d_r_idx_hostaddr.high_addr = | ||||||
|  | +			cpu_to_le32(address >> 32); | ||||||
|  | + | ||||||
|  | +		d2h_w_idx_ptr = h2d_r_idx_ptr + | ||||||
|  | +				max_submissionrings * idx_offset; | ||||||
|  | +		address += max_submissionrings * idx_offset; | ||||||
|  | +		ringinfo.d2h_w_idx_hostaddr.low_addr = | ||||||
|  | +			cpu_to_le32(address & 0xffffffff); | ||||||
|  | +		ringinfo.d2h_w_idx_hostaddr.high_addr = | ||||||
|  | +			cpu_to_le32(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); | ||||||
|  | +				max_completionrings * idx_offset; | ||||||
|  | +		address += max_completionrings * idx_offset; | ||||||
|  | +		ringinfo.d2h_r_idx_hostaddr.low_addr = | ||||||
|  | +			cpu_to_le32(address & 0xffffffff); | ||||||
|  | +		ringinfo.d2h_r_idx_hostaddr.high_addr = | ||||||
|  | +			cpu_to_le32(address >> 32); | ||||||
|  | + | ||||||
|  | +		memcpy_toio(devinfo->tcm + devinfo->shared.ring_info_addr, | ||||||
|  | +			    &ringinfo, sizeof(ringinfo)); | ||||||
|  |  		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); | ||||||
|  | +	ring_mem_ptr = le32_to_cpu(ringinfo.ringmem); | ||||||
|  |   | ||||||
|  |  	for (i = 0; i < BRCMF_NROF_H2D_COMMON_MSGRINGS; i++) { | ||||||
|  |  		ring = brcmf_pcie_alloc_dma_and_ring(devinfo, i, ring_mem_ptr); | ||||||
|  | @@ -1161,20 +1196,19 @@ static int brcmf_pcie_init_ringbuffers(s | ||||||
|  |  		ring_mem_ptr += BRCMF_RING_MEM_SZ; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	devinfo->shared.nrof_flowrings = | ||||||
|  | -			max_sub_queues - BRCMF_NROF_H2D_COMMON_MSGRINGS; | ||||||
|  | -	rings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*ring), | ||||||
|  | -			GFP_KERNEL); | ||||||
|  | +	devinfo->shared.max_flowrings = max_flowrings; | ||||||
|  | +	devinfo->shared.max_submissionrings = max_submissionrings; | ||||||
|  | +	devinfo->shared.max_completionrings = max_completionrings; | ||||||
|  | +	rings = kcalloc(max_flowrings, sizeof(*ring), GFP_KERNEL); | ||||||
|  |  	if (!rings) | ||||||
|  |  		goto fail; | ||||||
|  |   | ||||||
|  | -	brcmf_dbg(PCIE, "Nr of flowrings is %d\n", | ||||||
|  | -		  devinfo->shared.nrof_flowrings); | ||||||
|  | +	brcmf_dbg(PCIE, "Nr of flowrings is %d\n", max_flowrings); | ||||||
|  |   | ||||||
|  | -	for (i = 0; i < devinfo->shared.nrof_flowrings; i++) { | ||||||
|  | +	for (i = 0; i < max_flowrings; i++) { | ||||||
|  |  		ring = &rings[i]; | ||||||
|  |  		ring->devinfo = devinfo; | ||||||
|  | -		ring->id = i + BRCMF_NROF_COMMON_MSGRINGS; | ||||||
|  | +		ring->id = i + BRCMF_H2D_MSGRING_FLOWRING_IDSTART; | ||||||
|  |  		brcmf_commonring_register_cb(&ring->commonring, | ||||||
|  |  					     brcmf_pcie_ring_mb_ring_bell, | ||||||
|  |  					     brcmf_pcie_ring_mb_update_rptr, | ||||||
|  | @@ -1357,17 +1391,16 @@ brcmf_pcie_init_share_ram_info(struct br | ||||||
|  |  { | ||||||
|  |  	struct brcmf_pcie_shared_info *shared; | ||||||
|  |  	u32 addr; | ||||||
|  | -	u32 version; | ||||||
|  |   | ||||||
|  |  	shared = &devinfo->shared; | ||||||
|  |  	shared->tcm_base_address = sharedram_addr; | ||||||
|  |   | ||||||
|  |  	shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr); | ||||||
|  | -	version = shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK; | ||||||
|  | -	brcmf_dbg(PCIE, "PCIe protocol version %d\n", version); | ||||||
|  | -	if ((version > BRCMF_PCIE_MAX_SHARED_VERSION) || | ||||||
|  | -	    (version < BRCMF_PCIE_MIN_SHARED_VERSION)) { | ||||||
|  | -		brcmf_err("Unsupported PCIE version %d\n", version); | ||||||
|  | +	shared->version = (u8)(shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK); | ||||||
|  | +	brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version); | ||||||
|  | +	if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) || | ||||||
|  | +	    (shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) { | ||||||
|  | +		brcmf_err("Unsupported PCIE version %d\n", shared->version); | ||||||
|  |  		return -EINVAL; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | @@ -1661,18 +1694,18 @@ 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.max_flowrings, sizeof(*flowrings), | ||||||
|  |  			    GFP_KERNEL); | ||||||
|  |  	if (!flowrings) | ||||||
|  |  		goto fail; | ||||||
|  |   | ||||||
|  | -	for (i = 0; i < devinfo->shared.nrof_flowrings; i++) | ||||||
|  | +	for (i = 0; i < devinfo->shared.max_flowrings; i++) | ||||||
|  |  		flowrings[i] = &devinfo->shared.flowrings[i].commonring; | ||||||
|  |  	bus->msgbuf->flowrings = flowrings; | ||||||
|  |   | ||||||
|  |  	bus->msgbuf->rx_dataoffset = devinfo->shared.rx_dataoffset; | ||||||
|  |  	bus->msgbuf->max_rxbufpost = devinfo->shared.max_rxbufpost; | ||||||
|  | -	bus->msgbuf->nrof_flowrings = devinfo->shared.nrof_flowrings; | ||||||
|  | +	bus->msgbuf->max_flowrings = devinfo->shared.max_flowrings; | ||||||
|  |   | ||||||
|  |  	init_waitqueue_head(&devinfo->mbdata_resp_wait); | ||||||
|  |   | ||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | From dc630dc5c753ccba97ce174f9c2894f802f9bd93 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:21 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: add support for 43341 chip | ||||||
|  |  | ||||||
|  | This chip was already supported, but seems a device came up giving | ||||||
|  | a different chip identifier. So adding that effectively mapping to | ||||||
|  | the same firmware file as for 43340 chip. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c       | 1 + | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 + | ||||||
|  |  2 files changed, 2 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | ||||||
|  | @@ -621,6 +621,7 @@ static struct brcmf_firmware_mapping brc | ||||||
|  |  	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_43341_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), | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | ||||||
|  | @@ -36,6 +36,7 @@ | ||||||
|  |  #define BRCM_CC_4330_CHIP_ID		0x4330 | ||||||
|  |  #define BRCM_CC_4334_CHIP_ID		0x4334 | ||||||
|  |  #define BRCM_CC_43340_CHIP_ID		43340 | ||||||
|  | +#define BRCM_CC_43341_CHIP_ID		43341 | ||||||
|  |  #define BRCM_CC_43362_CHIP_ID		43362 | ||||||
|  |  #define BRCM_CC_4335_CHIP_ID		0x4335 | ||||||
|  |  #define BRCM_CC_4339_CHIP_ID		0x4339 | ||||||
| @@ -0,0 +1,319 @@ | |||||||
|  | From ac55136f43d3336c7b40238b779c404008229929 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:22 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: move pno helper functions in separate source file | ||||||
|  |  | ||||||
|  | Introducing new source file for pno related functionality. Moving | ||||||
|  | existing pno functions. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../wireless/broadcom/brcm80211/brcmfmac/Makefile  |   3 +- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  93 ++----------------- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 100 +++++++++++++++++++++ | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h |  40 +++++++++ | ||||||
|  |  4 files changed, 150 insertions(+), 86 deletions(-) | ||||||
|  |  create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  |  create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile | ||||||
|  | @@ -35,7 +35,8 @@ brcmfmac-objs += \ | ||||||
|  |  		firmware.o \ | ||||||
|  |  		feature.o \ | ||||||
|  |  		btcoex.o \ | ||||||
|  | -		vendor.o | ||||||
|  | +		vendor.o \ | ||||||
|  | +		pno.o | ||||||
|  |  brcmfmac-$(CPTCFG_BRCMFMAC_PROTO_BCDC) += \ | ||||||
|  |  		bcdc.o | ||||||
|  |  brcmfmac-$(CPTCFG_BRCMFMAC_PROTO_MSGBUF) += \ | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -32,6 +32,7 @@ | ||||||
|  |  #include "fwil_types.h" | ||||||
|  |  #include "p2p.h" | ||||||
|  |  #include "btcoex.h" | ||||||
|  | +#include "pno.h" | ||||||
|  |  #include "cfg80211.h" | ||||||
|  |  #include "feature.h" | ||||||
|  |  #include "fwil.h" | ||||||
|  | @@ -41,16 +42,6 @@ | ||||||
|  |  #include "common.h" | ||||||
|  |   | ||||||
|  |  #define BRCMF_SCAN_IE_LEN_MAX		2048 | ||||||
|  | -#define BRCMF_PNO_VERSION		2 | ||||||
|  | -#define BRCMF_PNO_TIME			30 | ||||||
|  | -#define BRCMF_PNO_REPEAT		4 | ||||||
|  | -#define BRCMF_PNO_FREQ_EXPO_MAX		3 | ||||||
|  | -#define BRCMF_PNO_MAX_PFN_COUNT		16 | ||||||
|  | -#define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT	6 | ||||||
|  | -#define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  | -#define BRCMF_PNO_WPA_AUTH_ANY		0xFFFFFFFF | ||||||
|  | -#define BRCMF_PNO_SCAN_COMPLETE		1 | ||||||
|  | -#define BRCMF_PNO_SCAN_INCOMPLETE	0 | ||||||
|  |   | ||||||
|  |  #define WPA_OUI				"\x00\x50\xF2"	/* WPA OUI */ | ||||||
|  |  #define WPA_OUI_TYPE			1 | ||||||
|  | @@ -3323,76 +3314,6 @@ out_err: | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static int brcmf_dev_pno_clean(struct net_device *ndev) | ||||||
|  | -{ | ||||||
|  | -	int ret; | ||||||
|  | - | ||||||
|  | -	/* Disable pfn */ | ||||||
|  | -	ret = brcmf_fil_iovar_int_set(netdev_priv(ndev), "pfn", 0); | ||||||
|  | -	if (ret == 0) { | ||||||
|  | -		/* clear pfn */ | ||||||
|  | -		ret = brcmf_fil_iovar_data_set(netdev_priv(ndev), "pfnclear", | ||||||
|  | -					       NULL, 0); | ||||||
|  | -	} | ||||||
|  | -	if (ret < 0) | ||||||
|  | -		brcmf_err("failed code %d\n", ret); | ||||||
|  | - | ||||||
|  | -	return ret; | ||||||
|  | -} | ||||||
|  | - | ||||||
|  | -static int brcmf_dev_pno_config(struct brcmf_if *ifp, | ||||||
|  | -				struct cfg80211_sched_scan_request *request) | ||||||
|  | -{ | ||||||
|  | -	struct brcmf_pno_param_le pfn_param; | ||||||
|  | -	struct brcmf_pno_macaddr_le pfn_mac; | ||||||
|  | -	s32 err; | ||||||
|  | -	u8 *mac_mask; | ||||||
|  | -	int i; | ||||||
|  | - | ||||||
|  | -	memset(&pfn_param, 0, sizeof(pfn_param)); | ||||||
|  | -	pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION); | ||||||
|  | - | ||||||
|  | -	/* set extra pno params */ | ||||||
|  | -	pfn_param.flags = cpu_to_le16(1 << BRCMF_PNO_ENABLE_ADAPTSCAN_BIT); | ||||||
|  | -	pfn_param.repeat = BRCMF_PNO_REPEAT; | ||||||
|  | -	pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX; | ||||||
|  | - | ||||||
|  | -	/* set up pno scan fr */ | ||||||
|  | -	pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME); | ||||||
|  | - | ||||||
|  | -	err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param, | ||||||
|  | -				       sizeof(pfn_param)); | ||||||
|  | -	if (err) { | ||||||
|  | -		brcmf_err("pfn_set failed, err=%d\n", err); | ||||||
|  | -		return err; | ||||||
|  | -	} | ||||||
|  | - | ||||||
|  | -	/* Find out if mac randomization should be turned on */ | ||||||
|  | -	if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)) | ||||||
|  | -		return 0; | ||||||
|  | - | ||||||
|  | -	pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER; | ||||||
|  | -	pfn_mac.flags = BRCMF_PFN_MAC_OUI_ONLY | BRCMF_PFN_SET_MAC_UNASSOC; | ||||||
|  | - | ||||||
|  | -	memcpy(pfn_mac.mac, request->mac_addr, ETH_ALEN); | ||||||
|  | -	mac_mask = request->mac_addr_mask; | ||||||
|  | -	for (i = 0; i < ETH_ALEN; i++) { | ||||||
|  | -		pfn_mac.mac[i] &= mac_mask[i]; | ||||||
|  | -		pfn_mac.mac[i] |= get_random_int() & ~(mac_mask[i]); | ||||||
|  | -	} | ||||||
|  | -	/* Clear multi bit */ | ||||||
|  | -	pfn_mac.mac[0] &= 0xFE; | ||||||
|  | -	/* Set locally administered */ | ||||||
|  | -	pfn_mac.mac[0] |= 0x02; | ||||||
|  | - | ||||||
|  | -	err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac, | ||||||
|  | -				       sizeof(pfn_mac)); | ||||||
|  | -	if (err) | ||||||
|  | -		brcmf_err("pfn_macaddr failed, err=%d\n", err); | ||||||
|  | - | ||||||
|  | -	return err; | ||||||
|  | -} | ||||||
|  | - | ||||||
|  |  static int | ||||||
|  |  brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy, | ||||||
|  |  				struct net_device *ndev, | ||||||
|  | @@ -3436,15 +3357,16 @@ brcmf_cfg80211_sched_scan_start(struct w | ||||||
|  |   | ||||||
|  |  	if (request->n_match_sets > 0) { | ||||||
|  |  		/* clean up everything */ | ||||||
|  | -		ret = brcmf_dev_pno_clean(ndev); | ||||||
|  | +		ret = brcmf_pno_clean(ifp); | ||||||
|  |  		if  (ret < 0) { | ||||||
|  |  			brcmf_err("failed error=%d\n", ret); | ||||||
|  |  			return ret; | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  |  		/* configure pno */ | ||||||
|  | -		if (brcmf_dev_pno_config(ifp, request)) | ||||||
|  | -			return -EINVAL; | ||||||
|  | +		ret = brcmf_pno_config(ifp, request); | ||||||
|  | +		if (ret < 0) | ||||||
|  | +			return ret; | ||||||
|  |   | ||||||
|  |  		/* configure each match set */ | ||||||
|  |  		for (i = 0; i < request->n_match_sets; i++) { | ||||||
|  | @@ -3486,11 +3408,12 @@ static int brcmf_cfg80211_sched_scan_sto | ||||||
|  |  					  struct net_device *ndev) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); | ||||||
|  | +	struct brcmf_if *ifp = netdev_priv(ndev); | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(SCAN, "enter\n"); | ||||||
|  | -	brcmf_dev_pno_clean(ndev); | ||||||
|  | +	brcmf_pno_clean(ifp); | ||||||
|  |  	if (cfg->sched_escan) | ||||||
|  | -		brcmf_notify_escan_complete(cfg, netdev_priv(ndev), true, true); | ||||||
|  | +		brcmf_notify_escan_complete(cfg, ifp, true, true); | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | --- /dev/null | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -0,0 +1,100 @@ | ||||||
|  | +/* | ||||||
|  | + * Copyright (c) 2016 Broadcom | ||||||
|  | + * | ||||||
|  | + * Permission to use, copy, modify, and/or distribute this software for any | ||||||
|  | + * purpose with or without fee is hereby granted, provided that the above | ||||||
|  | + * copyright notice and this permission notice appear in all copies. | ||||||
|  | + * | ||||||
|  | + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||||
|  | + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  | + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||||||
|  | + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  | + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||||||
|  | + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||||
|  | + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  | + */ | ||||||
|  | +#include <linux/netdevice.h> | ||||||
|  | +#include <net/cfg80211.h> | ||||||
|  | + | ||||||
|  | +#include "core.h" | ||||||
|  | +#include "debug.h" | ||||||
|  | +#include "pno.h" | ||||||
|  | +#include "fwil.h" | ||||||
|  | +#include "fwil_types.h" | ||||||
|  | + | ||||||
|  | +#define BRCMF_PNO_VERSION		2 | ||||||
|  | +#define BRCMF_PNO_TIME			30 | ||||||
|  | +#define BRCMF_PNO_REPEAT		4 | ||||||
|  | +#define BRCMF_PNO_FREQ_EXPO_MAX		3 | ||||||
|  | +#define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT	6 | ||||||
|  | +#define BRCMF_PNO_SCAN_INCOMPLETE	0 | ||||||
|  | + | ||||||
|  | +int brcmf_pno_clean(struct brcmf_if *ifp) | ||||||
|  | +{ | ||||||
|  | +	int ret; | ||||||
|  | + | ||||||
|  | +	/* Disable pfn */ | ||||||
|  | +	ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0); | ||||||
|  | +	if (ret == 0) { | ||||||
|  | +		/* clear pfn */ | ||||||
|  | +		ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0); | ||||||
|  | +	} | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		brcmf_err("failed code %d\n", ret); | ||||||
|  | + | ||||||
|  | +	return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +int brcmf_pno_config(struct brcmf_if *ifp, | ||||||
|  | +		     struct cfg80211_sched_scan_request *request) | ||||||
|  | +{ | ||||||
|  | +	struct brcmf_pno_param_le pfn_param; | ||||||
|  | +	struct brcmf_pno_macaddr_le pfn_mac; | ||||||
|  | +	s32 err; | ||||||
|  | +	u8 *mac_mask; | ||||||
|  | +	int i; | ||||||
|  | + | ||||||
|  | +	memset(&pfn_param, 0, sizeof(pfn_param)); | ||||||
|  | +	pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION); | ||||||
|  | + | ||||||
|  | +	/* set extra pno params */ | ||||||
|  | +	pfn_param.flags = cpu_to_le16(1 << BRCMF_PNO_ENABLE_ADAPTSCAN_BIT); | ||||||
|  | +	pfn_param.repeat = BRCMF_PNO_REPEAT; | ||||||
|  | +	pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX; | ||||||
|  | + | ||||||
|  | +	/* set up pno scan fr */ | ||||||
|  | +	pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME); | ||||||
|  | + | ||||||
|  | +	err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param, | ||||||
|  | +				       sizeof(pfn_param)); | ||||||
|  | +	if (err) { | ||||||
|  | +		brcmf_err("pfn_set failed, err=%d\n", err); | ||||||
|  | +		return err; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* Find out if mac randomization should be turned on */ | ||||||
|  | +	if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)) | ||||||
|  | +		return 0; | ||||||
|  | + | ||||||
|  | +	pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER; | ||||||
|  | +	pfn_mac.flags = BRCMF_PFN_MAC_OUI_ONLY | BRCMF_PFN_SET_MAC_UNASSOC; | ||||||
|  | + | ||||||
|  | +	memcpy(pfn_mac.mac, request->mac_addr, ETH_ALEN); | ||||||
|  | +	mac_mask = request->mac_addr_mask; | ||||||
|  | +	for (i = 0; i < ETH_ALEN; i++) { | ||||||
|  | +		pfn_mac.mac[i] &= mac_mask[i]; | ||||||
|  | +		pfn_mac.mac[i] |= get_random_int() & ~(mac_mask[i]); | ||||||
|  | +	} | ||||||
|  | +	/* Clear multi bit */ | ||||||
|  | +	pfn_mac.mac[0] &= 0xFE; | ||||||
|  | +	/* Set locally administered */ | ||||||
|  | +	pfn_mac.mac[0] |= 0x02; | ||||||
|  | + | ||||||
|  | +	err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac, | ||||||
|  | +				       sizeof(pfn_mac)); | ||||||
|  | +	if (err) | ||||||
|  | +		brcmf_err("pfn_macaddr failed, err=%d\n", err); | ||||||
|  | + | ||||||
|  | +	return err; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | --- /dev/null | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | @@ -0,0 +1,40 @@ | ||||||
|  | +/* | ||||||
|  | + * Copyright (c) 2016 Broadcom | ||||||
|  | + * | ||||||
|  | + * Permission to use, copy, modify, and/or distribute this software for any | ||||||
|  | + * purpose with or without fee is hereby granted, provided that the above | ||||||
|  | + * copyright notice and this permission notice appear in all copies. | ||||||
|  | + * | ||||||
|  | + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||||
|  | + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  | + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||||||
|  | + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  | + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||||||
|  | + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||||
|  | + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  | + */ | ||||||
|  | +#ifndef _BRCMF_PNO_H | ||||||
|  | +#define _BRCMF_PNO_H | ||||||
|  | + | ||||||
|  | +#define BRCMF_PNO_SCAN_COMPLETE		1 | ||||||
|  | +#define BRCMF_PNO_WPA_AUTH_ANY		0xFFFFFFFF | ||||||
|  | +#define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  | +#define BRCMF_PNO_MAX_PFN_COUNT		16 | ||||||
|  | + | ||||||
|  | +/** | ||||||
|  | + * brcmf_pno_clean - disable and clear pno in firmware. | ||||||
|  | + * | ||||||
|  | + * @ifp: interface object used. | ||||||
|  | + */ | ||||||
|  | +int brcmf_pno_clean(struct brcmf_if *ifp); | ||||||
|  | + | ||||||
|  | +/** | ||||||
|  | + * brcmf_pno_config - configure pno parameters. | ||||||
|  | + * | ||||||
|  | + * @ifp: interface object used. | ||||||
|  | + * @request: scheduled scan parameters. | ||||||
|  | + */ | ||||||
|  | +int brcmf_pno_config(struct brcmf_if *ifp, | ||||||
|  | +		     struct cfg80211_sched_scan_request *request); | ||||||
|  | + | ||||||
|  | +#endif /* _BRCMF_PNO_H */ | ||||||
| @@ -0,0 +1,221 @@ | |||||||
|  | From 3e2e86ab19c2a43953de30089c5411c580ddb5f7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:23 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: fix handling ssids in .sched_scan_start() callback | ||||||
|  |  | ||||||
|  | The ssids list in the scheduled scan request were not properly taken | ||||||
|  | into account when configuring in firmware. The hidden bit was set for | ||||||
|  | any ssid resulting in active scanning for all. Only set it for ssids | ||||||
|  | that are in the ssids list. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 103 ++++++++++----------- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c |  18 ++++ | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h |  12 ++- | ||||||
|  |  3 files changed, 76 insertions(+), 57 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -3314,19 +3314,37 @@ out_err: | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid, | ||||||
|  | +				 struct cfg80211_sched_scan_request *req) | ||||||
|  | +{ | ||||||
|  | +	int i; | ||||||
|  | + | ||||||
|  | +	if (!ssid || !req->ssids || !req->n_ssids) | ||||||
|  | +		return false; | ||||||
|  | + | ||||||
|  | +	for (i = 0; i < req->n_ssids; i++) { | ||||||
|  | +		if (ssid->ssid_len == req->ssids[i].ssid_len) { | ||||||
|  | +			if (!strncmp(ssid->ssid, req->ssids[i].ssid, | ||||||
|  | +				     ssid->ssid_len)) | ||||||
|  | +				return true; | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | +	return false; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static int | ||||||
|  |  brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy, | ||||||
|  |  				struct net_device *ndev, | ||||||
|  | -				struct cfg80211_sched_scan_request *request) | ||||||
|  | +				struct cfg80211_sched_scan_request *req) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_if *ifp = netdev_priv(ndev); | ||||||
|  |  	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); | ||||||
|  | -	struct brcmf_pno_net_param_le pfn; | ||||||
|  | +	struct cfg80211_ssid *ssid; | ||||||
|  |  	int i; | ||||||
|  |  	int ret = 0; | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n", | ||||||
|  | -		  request->n_match_sets, request->n_ssids); | ||||||
|  | +		  req->n_match_sets, req->n_ssids); | ||||||
|  |  	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { | ||||||
|  |  		brcmf_err("Scanning already: status (%lu)\n", cfg->scan_status); | ||||||
|  |  		return -EAGAIN; | ||||||
|  | @@ -3337,71 +3355,46 @@ brcmf_cfg80211_sched_scan_start(struct w | ||||||
|  |  		return -EAGAIN; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (!request->n_ssids || !request->n_match_sets) { | ||||||
|  | -		brcmf_dbg(SCAN, "Invalid sched scan req!! n_ssids:%d\n", | ||||||
|  | -			  request->n_ssids); | ||||||
|  | +	if (req->n_match_sets <= 0) { | ||||||
|  | +		brcmf_dbg(SCAN, "invalid number of matchsets specified: %d\n", | ||||||
|  | +			  req->n_match_sets); | ||||||
|  |  		return -EINVAL; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (request->n_ssids > 0) { | ||||||
|  | -		for (i = 0; i < request->n_ssids; i++) { | ||||||
|  | -			/* Active scan req for ssids */ | ||||||
|  | -			brcmf_dbg(SCAN, ">>> Active scan req for ssid (%s)\n", | ||||||
|  | -				  request->ssids[i].ssid); | ||||||
|  | - | ||||||
|  | -			/* match_set ssids is a supert set of n_ssid list, | ||||||
|  | -			 * so we need not add these set separately. | ||||||
|  | -			 */ | ||||||
|  | -		} | ||||||
|  | +	/* clean up everything */ | ||||||
|  | +	ret = brcmf_pno_clean(ifp); | ||||||
|  | +	if  (ret < 0) { | ||||||
|  | +		brcmf_err("failed error=%d\n", ret); | ||||||
|  | +		return ret; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (request->n_match_sets > 0) { | ||||||
|  | -		/* clean up everything */ | ||||||
|  | -		ret = brcmf_pno_clean(ifp); | ||||||
|  | -		if  (ret < 0) { | ||||||
|  | -			brcmf_err("failed error=%d\n", ret); | ||||||
|  | -			return ret; | ||||||
|  | +	/* configure pno */ | ||||||
|  | +	ret = brcmf_pno_config(ifp, req); | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		return ret; | ||||||
|  | + | ||||||
|  | +	/* configure each match set */ | ||||||
|  | +	for (i = 0; i < req->n_match_sets; i++) { | ||||||
|  | + | ||||||
|  | +		ssid = &req->match_sets[i].ssid; | ||||||
|  | + | ||||||
|  | +		if (!ssid->ssid_len) { | ||||||
|  | +			brcmf_err("skip broadcast ssid\n"); | ||||||
|  | +			continue; | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | -		/* configure pno */ | ||||||
|  | -		ret = brcmf_pno_config(ifp, request); | ||||||
|  | +		ret = brcmf_pno_add_ssid(ifp, ssid, | ||||||
|  | +					 brcmf_is_ssid_active(ssid, req)); | ||||||
|  |  		if (ret < 0) | ||||||
|  | -			return ret; | ||||||
|  | - | ||||||
|  | -		/* configure each match set */ | ||||||
|  | -		for (i = 0; i < request->n_match_sets; i++) { | ||||||
|  | -			struct cfg80211_ssid *ssid; | ||||||
|  | -			u32 ssid_len; | ||||||
|  | - | ||||||
|  | -			ssid = &request->match_sets[i].ssid; | ||||||
|  | -			ssid_len = ssid->ssid_len; | ||||||
|  | - | ||||||
|  | -			if (!ssid_len) { | ||||||
|  | -				brcmf_err("skip broadcast ssid\n"); | ||||||
|  | -				continue; | ||||||
|  | -			} | ||||||
|  | -			pfn.auth = cpu_to_le32(WLAN_AUTH_OPEN); | ||||||
|  | -			pfn.wpa_auth = cpu_to_le32(BRCMF_PNO_WPA_AUTH_ANY); | ||||||
|  | -			pfn.wsec = cpu_to_le32(0); | ||||||
|  | -			pfn.infra = cpu_to_le32(1); | ||||||
|  | -			pfn.flags = cpu_to_le32(1 << BRCMF_PNO_HIDDEN_BIT); | ||||||
|  | -			pfn.ssid.SSID_len = cpu_to_le32(ssid_len); | ||||||
|  | -			memcpy(pfn.ssid.SSID, ssid->ssid, ssid_len); | ||||||
|  | -			ret = brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, | ||||||
|  | -						       sizeof(pfn)); | ||||||
|  |  			brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n", | ||||||
|  |  				  ret == 0 ? "set" : "failed", ssid->ssid); | ||||||
|  | -		} | ||||||
|  | -		/* Enable the PNO */ | ||||||
|  | -		if (brcmf_fil_iovar_int_set(ifp, "pfn", 1) < 0) { | ||||||
|  | -			brcmf_err("PNO enable failed!! ret=%d\n", ret); | ||||||
|  | -			return -EINVAL; | ||||||
|  | -		} | ||||||
|  | -	} else { | ||||||
|  | -		return -EINVAL; | ||||||
|  |  	} | ||||||
|  | +	/* Enable the PNO */ | ||||||
|  | +	ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1); | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		brcmf_err("PNO enable failed!! ret=%d\n", ret); | ||||||
|  |   | ||||||
|  | -	return 0; | ||||||
|  | +	return ret; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int brcmf_cfg80211_sched_scan_stop(struct wiphy *wiphy, | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -28,6 +28,8 @@ | ||||||
|  |  #define BRCMF_PNO_FREQ_EXPO_MAX		3 | ||||||
|  |  #define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT	6 | ||||||
|  |  #define BRCMF_PNO_SCAN_INCOMPLETE	0 | ||||||
|  | +#define BRCMF_PNO_WPA_AUTH_ANY		0xFFFFFFFF | ||||||
|  | +#define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  |   | ||||||
|  |  int brcmf_pno_clean(struct brcmf_if *ifp) | ||||||
|  |  { | ||||||
|  | @@ -98,3 +100,19 @@ int brcmf_pno_config(struct brcmf_if *if | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid, | ||||||
|  | +		       bool active) | ||||||
|  | +{ | ||||||
|  | +	struct brcmf_pno_net_param_le pfn; | ||||||
|  | + | ||||||
|  | +	pfn.auth = cpu_to_le32(WLAN_AUTH_OPEN); | ||||||
|  | +	pfn.wpa_auth = cpu_to_le32(BRCMF_PNO_WPA_AUTH_ANY); | ||||||
|  | +	pfn.wsec = cpu_to_le32(0); | ||||||
|  | +	pfn.infra = cpu_to_le32(1); | ||||||
|  | +	if (active) | ||||||
|  | +		pfn.flags = cpu_to_le32(1 << BRCMF_PNO_HIDDEN_BIT); | ||||||
|  | +	pfn.ssid.SSID_len = cpu_to_le32(ssid->ssid_len); | ||||||
|  | +	memcpy(pfn.ssid.SSID, ssid->ssid, ssid->ssid_len); | ||||||
|  | +	return brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, sizeof(pfn)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | @@ -17,8 +17,6 @@ | ||||||
|  |  #define _BRCMF_PNO_H | ||||||
|  |   | ||||||
|  |  #define BRCMF_PNO_SCAN_COMPLETE		1 | ||||||
|  | -#define BRCMF_PNO_WPA_AUTH_ANY		0xFFFFFFFF | ||||||
|  | -#define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  |  #define BRCMF_PNO_MAX_PFN_COUNT		16 | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  | @@ -37,4 +35,14 @@ int brcmf_pno_clean(struct brcmf_if *ifp | ||||||
|  |  int brcmf_pno_config(struct brcmf_if *ifp, | ||||||
|  |  		     struct cfg80211_sched_scan_request *request); | ||||||
|  |   | ||||||
|  | +/** | ||||||
|  | + * brcmf_pno_add_ssid - add ssid for pno in firmware. | ||||||
|  | + * | ||||||
|  | + * @ifp: interface object used. | ||||||
|  | + * @ssid: ssid information. | ||||||
|  | + * @active: indicate this ssid needs to be actively probed. | ||||||
|  | + */ | ||||||
|  | +int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid, | ||||||
|  | +		       bool active); | ||||||
|  | + | ||||||
|  |  #endif /* _BRCMF_PNO_H */ | ||||||
| @@ -0,0 +1,58 @@ | |||||||
|  | From ab5981c830339b945ddbedc314567a9e5f506d72 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:24 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: change prototype for brcmf_do_escan() | ||||||
|  |  | ||||||
|  | Reduce the number of parameters as the removed ones can be obtained | ||||||
|  | through struct brcmf_if parameter. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 10 +++++----- | ||||||
|  |  1 file changed, 5 insertions(+), 5 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -1080,9 +1080,9 @@ exit: | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static s32 | ||||||
|  | -brcmf_do_escan(struct brcmf_cfg80211_info *cfg, struct wiphy *wiphy, | ||||||
|  | -	       struct brcmf_if *ifp, struct cfg80211_scan_request *request) | ||||||
|  | +brcmf_do_escan(struct brcmf_if *ifp, struct cfg80211_scan_request *request) | ||||||
|  |  { | ||||||
|  | +	struct brcmf_cfg80211_info *cfg = ifp->drvr->config; | ||||||
|  |  	s32 err; | ||||||
|  |  	u32 passive_scan; | ||||||
|  |  	struct brcmf_scan_results *results; | ||||||
|  | @@ -1090,7 +1090,7 @@ brcmf_do_escan(struct brcmf_cfg80211_inf | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(SCAN, "Enter\n"); | ||||||
|  |  	escan->ifp = ifp; | ||||||
|  | -	escan->wiphy = wiphy; | ||||||
|  | +	escan->wiphy = cfg->wiphy; | ||||||
|  |  	escan->escan_state = WL_ESCAN_STATE_SCANNING; | ||||||
|  |  	passive_scan = cfg->active_scan ? 0 : 1; | ||||||
|  |  	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN, | ||||||
|  | @@ -1170,7 +1170,7 @@ brcmf_cfg80211_escan(struct wiphy *wiphy | ||||||
|  |  		if (err) | ||||||
|  |  			goto scan_out; | ||||||
|  |   | ||||||
|  | -		err = brcmf_do_escan(cfg, wiphy, vif->ifp, request); | ||||||
|  | +		err = brcmf_do_escan(vif->ifp, request); | ||||||
|  |  		if (err) | ||||||
|  |  			goto scan_out; | ||||||
|  |  	} else { | ||||||
|  | @@ -3289,7 +3289,7 @@ brcmf_notify_sched_scan_results(struct b | ||||||
|  |   | ||||||
|  |  		set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||||
|  |  		cfg->escan_info.run = brcmf_run_escan; | ||||||
|  | -		err = brcmf_do_escan(cfg, wiphy, ifp, request); | ||||||
|  | +		err = brcmf_do_escan(ifp, request); | ||||||
|  |  		if (err) { | ||||||
|  |  			clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||||
|  |  			goto out_err; | ||||||
| @@ -0,0 +1,306 @@ | |||||||
|  | From fa85b30a908455ff25def3a5f319aad272ef4862 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:25 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: make internal escan more generic | ||||||
|  |  | ||||||
|  | For scheduled scan we initiate an escan in firmware to obtain more | ||||||
|  | info missing from the scheduled scan notification we get from firmware. | ||||||
|  | For upcoming functionality this is also required so make it a bit | ||||||
|  | more generic. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 187 ++++++++++++--------- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.h         |   4 +- | ||||||
|  |  2 files changed, 109 insertions(+), 82 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -757,12 +757,12 @@ s32 brcmf_notify_escan_complete(struct b | ||||||
|  |  	brcmf_scan_config_mpc(ifp, 1); | ||||||
|  |   | ||||||
|  |  	/* | ||||||
|  | -	 * e-scan can be initiated by scheduled scan | ||||||
|  | +	 * e-scan can be initiated internally | ||||||
|  |  	 * which takes precedence. | ||||||
|  |  	 */ | ||||||
|  | -	if (cfg->sched_escan) { | ||||||
|  | +	if (cfg->internal_escan) { | ||||||
|  |  		brcmf_dbg(SCAN, "scheduled scan completed\n"); | ||||||
|  | -		cfg->sched_escan = false; | ||||||
|  | +		cfg->internal_escan = false; | ||||||
|  |  		if (!aborted) | ||||||
|  |  			cfg80211_sched_scan_results(cfg_to_wiphy(cfg)); | ||||||
|  |  	} else if (scan_request) { | ||||||
|  | @@ -3013,7 +3013,7 @@ void brcmf_abort_scanning(struct brcmf_c | ||||||
|  |  	struct escan_info *escan = &cfg->escan_info; | ||||||
|  |   | ||||||
|  |  	set_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status); | ||||||
|  | -	if (cfg->scan_request) { | ||||||
|  | +	if (cfg->internal_escan || cfg->scan_request) { | ||||||
|  |  		escan->escan_state = WL_ESCAN_STATE_IDLE; | ||||||
|  |  		brcmf_notify_escan_complete(cfg, escan->ifp, true, true); | ||||||
|  |  	} | ||||||
|  | @@ -3036,7 +3036,7 @@ static void brcmf_escan_timeout(unsigned | ||||||
|  |  	struct brcmf_cfg80211_info *cfg = | ||||||
|  |  			(struct brcmf_cfg80211_info *)data; | ||||||
|  |   | ||||||
|  | -	if (cfg->scan_request) { | ||||||
|  | +	if (cfg->internal_escan || cfg->scan_request) { | ||||||
|  |  		brcmf_err("timer expired\n"); | ||||||
|  |  		schedule_work(&cfg->escan_timeout_work); | ||||||
|  |  	} | ||||||
|  | @@ -3119,7 +3119,7 @@ brcmf_cfg80211_escan_handler(struct brcm | ||||||
|  |  		if (brcmf_p2p_scan_finding_common_channel(cfg, bss_info_le)) | ||||||
|  |  			goto exit; | ||||||
|  |   | ||||||
|  | -		if (!cfg->scan_request) { | ||||||
|  | +		if (!cfg->internal_escan && !cfg->scan_request) { | ||||||
|  |  			brcmf_dbg(SCAN, "result without cfg80211 request\n"); | ||||||
|  |  			goto exit; | ||||||
|  |  		} | ||||||
|  | @@ -3165,7 +3165,7 @@ brcmf_cfg80211_escan_handler(struct brcm | ||||||
|  |  		cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE; | ||||||
|  |  		if (brcmf_p2p_scan_finding_common_channel(cfg, NULL)) | ||||||
|  |  			goto exit; | ||||||
|  | -		if (cfg->scan_request) { | ||||||
|  | +		if (cfg->internal_escan || cfg->scan_request) { | ||||||
|  |  			brcmf_inform_bss(cfg); | ||||||
|  |  			aborted = status != BRCMF_E_STATUS_SUCCESS; | ||||||
|  |  			brcmf_notify_escan_complete(cfg, ifp, aborted, false); | ||||||
|  | @@ -3190,6 +3190,73 @@ static void brcmf_init_escan(struct brcm | ||||||
|  |  		  brcmf_cfg80211_escan_timeout_worker); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static struct cfg80211_scan_request * | ||||||
|  | +brcmf_alloc_internal_escan_request(struct wiphy *wiphy, u32 n_netinfo) { | ||||||
|  | +	struct cfg80211_scan_request *req; | ||||||
|  | +	size_t req_size; | ||||||
|  | + | ||||||
|  | +	req_size = sizeof(*req) + | ||||||
|  | +		   n_netinfo * sizeof(req->channels[0]) + | ||||||
|  | +		   n_netinfo * sizeof(*req->ssids); | ||||||
|  | + | ||||||
|  | +	req = kzalloc(req_size, GFP_KERNEL); | ||||||
|  | +	if (req) { | ||||||
|  | +		req->wiphy = wiphy; | ||||||
|  | +		req->ssids = (void *)(&req->channels[0]) + | ||||||
|  | +			     n_netinfo * sizeof(req->channels[0]); | ||||||
|  | +	} | ||||||
|  | +	return req; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int brcmf_internal_escan_add_info(struct cfg80211_scan_request *req, | ||||||
|  | +					 u8 *ssid, u8 ssid_len, u8 channel) | ||||||
|  | +{ | ||||||
|  | +	struct ieee80211_channel *chan; | ||||||
|  | +	enum nl80211_band band; | ||||||
|  | +	int freq; | ||||||
|  | + | ||||||
|  | +	if (channel <= CH_MAX_2G_CHANNEL) | ||||||
|  | +		band = NL80211_BAND_2GHZ; | ||||||
|  | +	else | ||||||
|  | +		band = NL80211_BAND_5GHZ; | ||||||
|  | + | ||||||
|  | +	freq = ieee80211_channel_to_frequency(channel, band); | ||||||
|  | +	if (!freq) | ||||||
|  | +		return -EINVAL; | ||||||
|  | + | ||||||
|  | +	chan = ieee80211_get_channel(req->wiphy, freq); | ||||||
|  | +	if (!chan) | ||||||
|  | +		return -EINVAL; | ||||||
|  | + | ||||||
|  | +	req->channels[req->n_channels++] = chan; | ||||||
|  | +	memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len); | ||||||
|  | +	req->ssids[req->n_ssids++].ssid_len = ssid_len; | ||||||
|  | + | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int brcmf_start_internal_escan(struct brcmf_if *ifp, | ||||||
|  | +				      struct cfg80211_scan_request *request) | ||||||
|  | +{ | ||||||
|  | +	struct brcmf_cfg80211_info *cfg = ifp->drvr->config; | ||||||
|  | +	int err; | ||||||
|  | + | ||||||
|  | +	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { | ||||||
|  | +		/* Abort any on-going scan */ | ||||||
|  | +		brcmf_abort_scanning(cfg); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||||
|  | +	cfg->escan_info.run = brcmf_run_escan; | ||||||
|  | +	err = brcmf_do_escan(ifp, request); | ||||||
|  | +	if (err) { | ||||||
|  | +		clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||||
|  | +		return err; | ||||||
|  | +	} | ||||||
|  | +	cfg->internal_escan = true; | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  /* PFN result doesn't have all the info which are required by the supplicant | ||||||
|  |   * (For e.g IEs) Do a target Escan so that sched scan results are reported | ||||||
|  |   * via wl_inform_single_bss in the required format. Escan does require the | ||||||
|  | @@ -3203,12 +3270,8 @@ brcmf_notify_sched_scan_results(struct b | ||||||
|  |  	struct brcmf_cfg80211_info *cfg = ifp->drvr->config; | ||||||
|  |  	struct brcmf_pno_net_info_le *netinfo, *netinfo_start; | ||||||
|  |  	struct cfg80211_scan_request *request = NULL; | ||||||
|  | -	struct cfg80211_ssid *ssid = NULL; | ||||||
|  | -	struct ieee80211_channel *channel = NULL; | ||||||
|  |  	struct wiphy *wiphy = cfg_to_wiphy(cfg); | ||||||
|  | -	int err = 0; | ||||||
|  | -	int channel_req = 0; | ||||||
|  | -	int band = 0; | ||||||
|  | +	int i, err = 0; | ||||||
|  |  	struct brcmf_pno_scanresults_le *pfn_result; | ||||||
|  |  	u32 result_count; | ||||||
|  |  	u32 status; | ||||||
|  | @@ -3234,83 +3297,47 @@ brcmf_notify_sched_scan_results(struct b | ||||||
|  |  	 */ | ||||||
|  |  	WARN_ON(status != BRCMF_PNO_SCAN_COMPLETE); | ||||||
|  |  	brcmf_dbg(SCAN, "PFN NET FOUND event. count: %d\n", result_count); | ||||||
|  | -	if (result_count > 0) { | ||||||
|  | -		int i; | ||||||
|  | - | ||||||
|  | -		request = kzalloc(sizeof(*request), GFP_KERNEL); | ||||||
|  | -		ssid = kcalloc(result_count, sizeof(*ssid), GFP_KERNEL); | ||||||
|  | -		channel = kcalloc(result_count, sizeof(*channel), GFP_KERNEL); | ||||||
|  | -		if (!request || !ssid || !channel) { | ||||||
|  | -			err = -ENOMEM; | ||||||
|  | -			goto out_err; | ||||||
|  | -		} | ||||||
|  | +	if (!result_count) { | ||||||
|  | +		brcmf_err("FALSE PNO Event. (pfn_count == 0)\n"); | ||||||
|  | +		goto out_err; | ||||||
|  | +	} | ||||||
|  | +	request = brcmf_alloc_internal_escan_request(wiphy, | ||||||
|  | +						     result_count); | ||||||
|  | +	if (!request) { | ||||||
|  | +		err = -ENOMEM; | ||||||
|  | +		goto out_err; | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  | -		request->wiphy = wiphy; | ||||||
|  | -		data += sizeof(struct brcmf_pno_scanresults_le); | ||||||
|  | -		netinfo_start = (struct brcmf_pno_net_info_le *)data; | ||||||
|  | - | ||||||
|  | -		for (i = 0; i < result_count; i++) { | ||||||
|  | -			netinfo = &netinfo_start[i]; | ||||||
|  | -			if (!netinfo) { | ||||||
|  | -				brcmf_err("Invalid netinfo ptr. index: %d\n", | ||||||
|  | -					  i); | ||||||
|  | -				err = -EINVAL; | ||||||
|  | -				goto out_err; | ||||||
|  | -			} | ||||||
|  | +	data += sizeof(struct brcmf_pno_scanresults_le); | ||||||
|  | +	netinfo_start = (struct brcmf_pno_net_info_le *)data; | ||||||
|  |   | ||||||
|  | -			brcmf_dbg(SCAN, "SSID:%s Channel:%d\n", | ||||||
|  | -				  netinfo->SSID, netinfo->channel); | ||||||
|  | -			memcpy(ssid[i].ssid, netinfo->SSID, netinfo->SSID_len); | ||||||
|  | -			ssid[i].ssid_len = netinfo->SSID_len; | ||||||
|  | -			request->n_ssids++; | ||||||
|  | - | ||||||
|  | -			channel_req = netinfo->channel; | ||||||
|  | -			if (channel_req <= CH_MAX_2G_CHANNEL) | ||||||
|  | -				band = NL80211_BAND_2GHZ; | ||||||
|  | -			else | ||||||
|  | -				band = NL80211_BAND_5GHZ; | ||||||
|  | -			channel[i].center_freq = | ||||||
|  | -				ieee80211_channel_to_frequency(channel_req, | ||||||
|  | -							       band); | ||||||
|  | -			channel[i].band = band; | ||||||
|  | -			channel[i].flags |= IEEE80211_CHAN_NO_HT40; | ||||||
|  | -			request->channels[i] = &channel[i]; | ||||||
|  | -			request->n_channels++; | ||||||
|  | -		} | ||||||
|  | - | ||||||
|  | -		/* assign parsed ssid array */ | ||||||
|  | -		if (request->n_ssids) | ||||||
|  | -			request->ssids = &ssid[0]; | ||||||
|  | - | ||||||
|  | -		if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { | ||||||
|  | -			/* Abort any on-going scan */ | ||||||
|  | -			brcmf_abort_scanning(cfg); | ||||||
|  | +	for (i = 0; i < result_count; i++) { | ||||||
|  | +		netinfo = &netinfo_start[i]; | ||||||
|  | +		if (!netinfo) { | ||||||
|  | +			brcmf_err("Invalid netinfo ptr. index: %d\n", | ||||||
|  | +				  i); | ||||||
|  | +			err = -EINVAL; | ||||||
|  | +			goto out_err; | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | -		set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||||
|  | -		cfg->escan_info.run = brcmf_run_escan; | ||||||
|  | -		err = brcmf_do_escan(ifp, request); | ||||||
|  | -		if (err) { | ||||||
|  | -			clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||||
|  | +		brcmf_dbg(SCAN, "SSID:%.32s Channel:%d\n", | ||||||
|  | +			  netinfo->SSID, netinfo->channel); | ||||||
|  | +		err = brcmf_internal_escan_add_info(request, | ||||||
|  | +						    netinfo->SSID, | ||||||
|  | +						    netinfo->SSID_len, | ||||||
|  | +						    netinfo->channel); | ||||||
|  | +		if (err) | ||||||
|  |  			goto out_err; | ||||||
|  | -		} | ||||||
|  | -		cfg->sched_escan = true; | ||||||
|  | -		cfg->scan_request = request; | ||||||
|  | -	} else { | ||||||
|  | -		brcmf_err("FALSE PNO Event. (pfn_count == 0)\n"); | ||||||
|  | -		goto out_err; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	kfree(ssid); | ||||||
|  | -	kfree(channel); | ||||||
|  | -	kfree(request); | ||||||
|  | -	return 0; | ||||||
|  | +	err = brcmf_start_internal_escan(ifp, request); | ||||||
|  | +	if (!err) | ||||||
|  | +		goto free_req; | ||||||
|  |   | ||||||
|  |  out_err: | ||||||
|  | -	kfree(ssid); | ||||||
|  | -	kfree(channel); | ||||||
|  | -	kfree(request); | ||||||
|  |  	cfg80211_sched_scan_stopped(wiphy); | ||||||
|  | +free_req: | ||||||
|  | +	kfree(request); | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -3405,7 +3432,7 @@ static int brcmf_cfg80211_sched_scan_sto | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(SCAN, "enter\n"); | ||||||
|  |  	brcmf_pno_clean(ifp); | ||||||
|  | -	if (cfg->sched_escan) | ||||||
|  | +	if (cfg->internal_escan) | ||||||
|  |  		brcmf_notify_escan_complete(cfg, ifp, true, true); | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | ||||||
|  | @@ -271,7 +271,7 @@ struct brcmf_cfg80211_wowl { | ||||||
|  |   * @pub: common driver information. | ||||||
|  |   * @channel: current channel. | ||||||
|  |   * @active_scan: current scan mode. | ||||||
|  | - * @sched_escan: e-scan for scheduled scan support running. | ||||||
|  | + * @internal_escan: indicates internally initiated e-scan is running. | ||||||
|  |   * @ibss_starter: indicates this sta is ibss starter. | ||||||
|  |   * @pwr_save: indicate whether dongle to support power save mode. | ||||||
|  |   * @dongle_up: indicate whether dongle up or not. | ||||||
|  | @@ -303,7 +303,7 @@ struct brcmf_cfg80211_info { | ||||||
|  |  	struct brcmf_pub *pub; | ||||||
|  |  	u32 channel; | ||||||
|  |  	bool active_scan; | ||||||
|  | -	bool sched_escan; | ||||||
|  | +	bool internal_escan; | ||||||
|  |  	bool ibss_starter; | ||||||
|  |  	bool pwr_save; | ||||||
|  |  	bool dongle_up; | ||||||
| @@ -0,0 +1,176 @@ | |||||||
|  | From fca6cb2f059e51dec3fcf3589a5abbbcce5b4043 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:26 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: split up brcmf_pno_config() function | ||||||
|  |  | ||||||
|  | The brcmf_pno_config() function handles two configurations in | ||||||
|  | firmware. Split it and have caller sort out what is needed. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 11 +++- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 60 ++++++++++++++++------ | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h | 17 ++++-- | ||||||
|  |  3 files changed, 68 insertions(+), 20 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -42,6 +42,7 @@ | ||||||
|  |  #include "common.h" | ||||||
|  |   | ||||||
|  |  #define BRCMF_SCAN_IE_LEN_MAX		2048 | ||||||
|  | +#define BRCMF_SCHED_SCAN_PERIOD		30 | ||||||
|  |   | ||||||
|  |  #define WPA_OUI				"\x00\x50\xF2"	/* WPA OUI */ | ||||||
|  |  #define WPA_OUI_TYPE			1 | ||||||
|  | @@ -3396,10 +3397,18 @@ brcmf_cfg80211_sched_scan_start(struct w | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	/* configure pno */ | ||||||
|  | -	ret = brcmf_pno_config(ifp, req); | ||||||
|  | +	ret = brcmf_pno_config(ifp, BRCMF_SCHED_SCAN_PERIOD, 0, 0); | ||||||
|  |  	if (ret < 0) | ||||||
|  |  		return ret; | ||||||
|  |   | ||||||
|  | +	/* configure random mac */ | ||||||
|  | +	if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { | ||||||
|  | +		ret = brcmf_pno_set_random(ifp, req->mac_addr, | ||||||
|  | +					   req->mac_addr_mask); | ||||||
|  | +		if (ret < 0) | ||||||
|  | +			return ret; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  |  	/* configure each match set */ | ||||||
|  |  	for (i = 0; i < req->n_match_sets; i++) { | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -23,10 +23,12 @@ | ||||||
|  |  #include "fwil_types.h" | ||||||
|  |   | ||||||
|  |  #define BRCMF_PNO_VERSION		2 | ||||||
|  | -#define BRCMF_PNO_TIME			30 | ||||||
|  |  #define BRCMF_PNO_REPEAT		4 | ||||||
|  |  #define BRCMF_PNO_FREQ_EXPO_MAX		3 | ||||||
|  | +#define BRCMF_PNO_IMMEDIATE_SCAN_BIT	3 | ||||||
|  | +#define BRCMF_PNO_ENABLE_BD_SCAN_BIT	5 | ||||||
|  |  #define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT	6 | ||||||
|  | +#define BRCMF_PNO_REPORT_SEPARATELY_BIT	11 | ||||||
|  |  #define BRCMF_PNO_SCAN_INCOMPLETE	0 | ||||||
|  |  #define BRCMF_PNO_WPA_AUTH_ANY		0xFFFFFFFF | ||||||
|  |  #define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  | @@ -47,42 +49,68 @@ int brcmf_pno_clean(struct brcmf_if *ifp | ||||||
|  |  	return ret; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int brcmf_pno_config(struct brcmf_if *ifp, | ||||||
|  | -		     struct cfg80211_sched_scan_request *request) | ||||||
|  | +int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, | ||||||
|  | +		     u32 mscan, u32 bestn) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_pno_param_le pfn_param; | ||||||
|  | -	struct brcmf_pno_macaddr_le pfn_mac; | ||||||
|  | +	u16 flags; | ||||||
|  | +	u32 pfnmem; | ||||||
|  |  	s32 err; | ||||||
|  | -	u8 *mac_mask; | ||||||
|  | -	int i; | ||||||
|  |   | ||||||
|  |  	memset(&pfn_param, 0, sizeof(pfn_param)); | ||||||
|  |  	pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION); | ||||||
|  |   | ||||||
|  |  	/* set extra pno params */ | ||||||
|  | -	pfn_param.flags = cpu_to_le16(1 << BRCMF_PNO_ENABLE_ADAPTSCAN_BIT); | ||||||
|  | +	flags = BIT(BRCMF_PNO_IMMEDIATE_SCAN_BIT) | | ||||||
|  | +		BIT(BRCMF_PNO_REPORT_SEPARATELY_BIT) | | ||||||
|  | +		BIT(BRCMF_PNO_ENABLE_ADAPTSCAN_BIT); | ||||||
|  |  	pfn_param.repeat = BRCMF_PNO_REPEAT; | ||||||
|  |  	pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX; | ||||||
|  |   | ||||||
|  |  	/* set up pno scan fr */ | ||||||
|  | -	pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME); | ||||||
|  | +	pfn_param.scan_freq = cpu_to_le32(scan_freq); | ||||||
|  | + | ||||||
|  | +	if (mscan) { | ||||||
|  | +		pfnmem = bestn; | ||||||
|  |   | ||||||
|  | +		/* set bestn in firmware */ | ||||||
|  | +		err = brcmf_fil_iovar_int_set(ifp, "pfnmem", pfnmem); | ||||||
|  | +		if (err < 0) { | ||||||
|  | +			brcmf_err("failed to set pfnmem\n"); | ||||||
|  | +			goto exit; | ||||||
|  | +		} | ||||||
|  | +		/* get max mscan which the firmware supports */ | ||||||
|  | +		err = brcmf_fil_iovar_int_get(ifp, "pfnmem", &pfnmem); | ||||||
|  | +		if (err < 0) { | ||||||
|  | +			brcmf_err("failed to get pfnmem\n"); | ||||||
|  | +			goto exit; | ||||||
|  | +		} | ||||||
|  | +		mscan = min_t(u32, mscan, pfnmem); | ||||||
|  | +		pfn_param.mscan = mscan; | ||||||
|  | +		pfn_param.bestn = bestn; | ||||||
|  | +		flags |= BIT(BRCMF_PNO_ENABLE_BD_SCAN_BIT); | ||||||
|  | +		brcmf_dbg(INFO, "mscan=%d, bestn=%d\n", mscan, bestn); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	pfn_param.flags = cpu_to_le16(flags); | ||||||
|  |  	err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param, | ||||||
|  |  				       sizeof(pfn_param)); | ||||||
|  | -	if (err) { | ||||||
|  | +	if (err) | ||||||
|  |  		brcmf_err("pfn_set failed, err=%d\n", err); | ||||||
|  | -		return err; | ||||||
|  | -	} | ||||||
|  |   | ||||||
|  | -	/* Find out if mac randomization should be turned on */ | ||||||
|  | -	if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)) | ||||||
|  | -		return 0; | ||||||
|  | +exit: | ||||||
|  | +	return err; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask) | ||||||
|  | +{ | ||||||
|  | +	struct brcmf_pno_macaddr_le pfn_mac; | ||||||
|  | +	int err, i; | ||||||
|  |   | ||||||
|  |  	pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER; | ||||||
|  |  	pfn_mac.flags = BRCMF_PFN_MAC_OUI_ONLY | BRCMF_PFN_SET_MAC_UNASSOC; | ||||||
|  |   | ||||||
|  | -	memcpy(pfn_mac.mac, request->mac_addr, ETH_ALEN); | ||||||
|  | -	mac_mask = request->mac_addr_mask; | ||||||
|  | +	memcpy(pfn_mac.mac, mac_addr, ETH_ALEN); | ||||||
|  |  	for (i = 0; i < ETH_ALEN; i++) { | ||||||
|  |  		pfn_mac.mac[i] &= mac_mask[i]; | ||||||
|  |  		pfn_mac.mac[i] |= get_random_int() & ~(mac_mask[i]); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | @@ -30,10 +30,21 @@ int brcmf_pno_clean(struct brcmf_if *ifp | ||||||
|  |   * brcmf_pno_config - configure pno parameters. | ||||||
|  |   * | ||||||
|  |   * @ifp: interface object used. | ||||||
|  | - * @request: scheduled scan parameters. | ||||||
|  | + * @scan_freq: scan frequency period in seconds. | ||||||
|  | + * @mscan: maximum number of scans stored in firmware. | ||||||
|  | + * @bestn: maximum number of APs per scan stored in firmware. | ||||||
|  |   */ | ||||||
|  | -int brcmf_pno_config(struct brcmf_if *ifp, | ||||||
|  | -		     struct cfg80211_sched_scan_request *request); | ||||||
|  | +int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, | ||||||
|  | +		     u32 mscan, u32 bestn); | ||||||
|  | + | ||||||
|  | +/** | ||||||
|  | + * brcmf_pno_set_random - setup randomisation mac address for pno. | ||||||
|  | + * | ||||||
|  | + * @ifp: interface object used. | ||||||
|  | + * @mac_addr: MAC address used with randomisation. | ||||||
|  | + * @mac_mask: MAC address mask used for randomisation. | ||||||
|  | + */ | ||||||
|  | +int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask); | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  |   * brcmf_pno_add_ssid - add ssid for pno in firmware. | ||||||
| @@ -0,0 +1,292 @@ | |||||||
|  | From 3e48611d31dd333be01576902f2dc11adefc9a06 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:27 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: move scheduled scan activation to pno source file | ||||||
|  |  | ||||||
|  | Rework .sched_scan_start() callback moving actual configuration of | ||||||
|  | the device in pno source file. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  65 +----------- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 110 +++++++++++++++++---- | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h |  29 +----- | ||||||
|  |  3 files changed, 94 insertions(+), 110 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -42,7 +42,6 @@ | ||||||
|  |  #include "common.h" | ||||||
|  |   | ||||||
|  |  #define BRCMF_SCAN_IE_LEN_MAX		2048 | ||||||
|  | -#define BRCMF_SCHED_SCAN_PERIOD		30 | ||||||
|  |   | ||||||
|  |  #define WPA_OUI				"\x00\x50\xF2"	/* WPA OUI */ | ||||||
|  |  #define WPA_OUI_TYPE			1 | ||||||
|  | @@ -3342,24 +3341,6 @@ free_req: | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid, | ||||||
|  | -				 struct cfg80211_sched_scan_request *req) | ||||||
|  | -{ | ||||||
|  | -	int i; | ||||||
|  | - | ||||||
|  | -	if (!ssid || !req->ssids || !req->n_ssids) | ||||||
|  | -		return false; | ||||||
|  | - | ||||||
|  | -	for (i = 0; i < req->n_ssids; i++) { | ||||||
|  | -		if (ssid->ssid_len == req->ssids[i].ssid_len) { | ||||||
|  | -			if (!strncmp(ssid->ssid, req->ssids[i].ssid, | ||||||
|  | -				     ssid->ssid_len)) | ||||||
|  | -				return true; | ||||||
|  | -		} | ||||||
|  | -	} | ||||||
|  | -	return false; | ||||||
|  | -} | ||||||
|  | - | ||||||
|  |  static int | ||||||
|  |  brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy, | ||||||
|  |  				struct net_device *ndev, | ||||||
|  | @@ -3367,9 +3348,6 @@ brcmf_cfg80211_sched_scan_start(struct w | ||||||
|  |  { | ||||||
|  |  	struct brcmf_if *ifp = netdev_priv(ndev); | ||||||
|  |  	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); | ||||||
|  | -	struct cfg80211_ssid *ssid; | ||||||
|  | -	int i; | ||||||
|  | -	int ret = 0; | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n", | ||||||
|  |  		  req->n_match_sets, req->n_ssids); | ||||||
|  | @@ -3389,48 +3367,7 @@ brcmf_cfg80211_sched_scan_start(struct w | ||||||
|  |  		return -EINVAL; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	/* clean up everything */ | ||||||
|  | -	ret = brcmf_pno_clean(ifp); | ||||||
|  | -	if  (ret < 0) { | ||||||
|  | -		brcmf_err("failed error=%d\n", ret); | ||||||
|  | -		return ret; | ||||||
|  | -	} | ||||||
|  | - | ||||||
|  | -	/* configure pno */ | ||||||
|  | -	ret = brcmf_pno_config(ifp, BRCMF_SCHED_SCAN_PERIOD, 0, 0); | ||||||
|  | -	if (ret < 0) | ||||||
|  | -		return ret; | ||||||
|  | - | ||||||
|  | -	/* configure random mac */ | ||||||
|  | -	if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { | ||||||
|  | -		ret = brcmf_pno_set_random(ifp, req->mac_addr, | ||||||
|  | -					   req->mac_addr_mask); | ||||||
|  | -		if (ret < 0) | ||||||
|  | -			return ret; | ||||||
|  | -	} | ||||||
|  | - | ||||||
|  | -	/* configure each match set */ | ||||||
|  | -	for (i = 0; i < req->n_match_sets; i++) { | ||||||
|  | - | ||||||
|  | -		ssid = &req->match_sets[i].ssid; | ||||||
|  | - | ||||||
|  | -		if (!ssid->ssid_len) { | ||||||
|  | -			brcmf_err("skip broadcast ssid\n"); | ||||||
|  | -			continue; | ||||||
|  | -		} | ||||||
|  | - | ||||||
|  | -		ret = brcmf_pno_add_ssid(ifp, ssid, | ||||||
|  | -					 brcmf_is_ssid_active(ssid, req)); | ||||||
|  | -		if (ret < 0) | ||||||
|  | -			brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n", | ||||||
|  | -				  ret == 0 ? "set" : "failed", ssid->ssid); | ||||||
|  | -	} | ||||||
|  | -	/* Enable the PNO */ | ||||||
|  | -	ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1); | ||||||
|  | -	if (ret < 0) | ||||||
|  | -		brcmf_err("PNO enable failed!! ret=%d\n", ret); | ||||||
|  | - | ||||||
|  | -	return ret; | ||||||
|  | +	return brcmf_pno_start_sched_scan(ifp, req); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int brcmf_cfg80211_sched_scan_stop(struct wiphy *wiphy, | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -32,25 +32,10 @@ | ||||||
|  |  #define BRCMF_PNO_SCAN_INCOMPLETE	0 | ||||||
|  |  #define BRCMF_PNO_WPA_AUTH_ANY		0xFFFFFFFF | ||||||
|  |  #define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  | +#define BRCMF_PNO_SCHED_SCAN_PERIOD	30 | ||||||
|  |   | ||||||
|  | -int brcmf_pno_clean(struct brcmf_if *ifp) | ||||||
|  | -{ | ||||||
|  | -	int ret; | ||||||
|  | - | ||||||
|  | -	/* Disable pfn */ | ||||||
|  | -	ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0); | ||||||
|  | -	if (ret == 0) { | ||||||
|  | -		/* clear pfn */ | ||||||
|  | -		ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0); | ||||||
|  | -	} | ||||||
|  | -	if (ret < 0) | ||||||
|  | -		brcmf_err("failed code %d\n", ret); | ||||||
|  | - | ||||||
|  | -	return ret; | ||||||
|  | -} | ||||||
|  | - | ||||||
|  | -int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, | ||||||
|  | -		     u32 mscan, u32 bestn) | ||||||
|  | +static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, | ||||||
|  | +			    u32 mscan, u32 bestn) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_pno_param_le pfn_param; | ||||||
|  |  	u16 flags; | ||||||
|  | @@ -102,7 +87,8 @@ exit: | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask) | ||||||
|  | +static int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, | ||||||
|  | +				u8 *mac_mask) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_pno_macaddr_le pfn_mac; | ||||||
|  |  	int err, i; | ||||||
|  | @@ -128,8 +114,8 @@ int brcmf_pno_set_random(struct brcmf_if | ||||||
|  |  	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid, | ||||||
|  | -		       bool active) | ||||||
|  | +static int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid, | ||||||
|  | +			      bool active) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_pno_net_param_le pfn; | ||||||
|  |   | ||||||
|  | @@ -144,3 +130,85 @@ int brcmf_pno_add_ssid(struct brcmf_if * | ||||||
|  |  	return brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, sizeof(pfn)); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid, | ||||||
|  | +				 struct cfg80211_sched_scan_request *req) | ||||||
|  | +{ | ||||||
|  | +	int i; | ||||||
|  | + | ||||||
|  | +	if (!ssid || !req->ssids || !req->n_ssids) | ||||||
|  | +		return false; | ||||||
|  | + | ||||||
|  | +	for (i = 0; i < req->n_ssids; i++) { | ||||||
|  | +		if (ssid->ssid_len == req->ssids[i].ssid_len) { | ||||||
|  | +			if (!strncmp(ssid->ssid, req->ssids[i].ssid, | ||||||
|  | +				     ssid->ssid_len)) | ||||||
|  | +				return true; | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | +	return false; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +int brcmf_pno_clean(struct brcmf_if *ifp) | ||||||
|  | +{ | ||||||
|  | +	int ret; | ||||||
|  | + | ||||||
|  | +	/* Disable pfn */ | ||||||
|  | +	ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0); | ||||||
|  | +	if (ret == 0) { | ||||||
|  | +		/* clear pfn */ | ||||||
|  | +		ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0); | ||||||
|  | +	} | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		brcmf_err("failed code %d\n", ret); | ||||||
|  | + | ||||||
|  | +	return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +int brcmf_pno_start_sched_scan(struct brcmf_if *ifp, | ||||||
|  | +			       struct cfg80211_sched_scan_request *req) | ||||||
|  | +{ | ||||||
|  | +	struct cfg80211_ssid *ssid; | ||||||
|  | +	int i, ret; | ||||||
|  | + | ||||||
|  | +	/* clean up everything */ | ||||||
|  | +	ret = brcmf_pno_clean(ifp); | ||||||
|  | +	if  (ret < 0) { | ||||||
|  | +		brcmf_err("failed error=%d\n", ret); | ||||||
|  | +		return ret; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* configure pno */ | ||||||
|  | +	ret = brcmf_pno_config(ifp, BRCMF_PNO_SCHED_SCAN_PERIOD, 0, 0); | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		return ret; | ||||||
|  | + | ||||||
|  | +	/* configure random mac */ | ||||||
|  | +	if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { | ||||||
|  | +		ret = brcmf_pno_set_random(ifp, req->mac_addr, | ||||||
|  | +					   req->mac_addr_mask); | ||||||
|  | +		if (ret < 0) | ||||||
|  | +			return ret; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* configure each match set */ | ||||||
|  | +	for (i = 0; i < req->n_match_sets; i++) { | ||||||
|  | +		ssid = &req->match_sets[i].ssid; | ||||||
|  | +		if (!ssid->ssid_len) { | ||||||
|  | +			brcmf_err("skip broadcast ssid\n"); | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		ret = brcmf_pno_add_ssid(ifp, ssid, | ||||||
|  | +					 brcmf_is_ssid_active(ssid, req)); | ||||||
|  | +		if (ret < 0) | ||||||
|  | +			brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n", | ||||||
|  | +				  ret == 0 ? "set" : "failed", ssid->ssid); | ||||||
|  | +	} | ||||||
|  | +	/* Enable the PNO */ | ||||||
|  | +	ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1); | ||||||
|  | +	if (ret < 0) | ||||||
|  | +		brcmf_err("PNO enable failed!! ret=%d\n", ret); | ||||||
|  | + | ||||||
|  | +	return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | @@ -27,33 +27,12 @@ | ||||||
|  |  int brcmf_pno_clean(struct brcmf_if *ifp); | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  | - * brcmf_pno_config - configure pno parameters. | ||||||
|  | + * brcmf_pno_start_sched_scan - initiate scheduled scan on device. | ||||||
|  |   * | ||||||
|  |   * @ifp: interface object used. | ||||||
|  | - * @scan_freq: scan frequency period in seconds. | ||||||
|  | - * @mscan: maximum number of scans stored in firmware. | ||||||
|  | - * @bestn: maximum number of APs per scan stored in firmware. | ||||||
|  | + * @req: configuration parameters for scheduled scan. | ||||||
|  |   */ | ||||||
|  | -int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, | ||||||
|  | -		     u32 mscan, u32 bestn); | ||||||
|  | - | ||||||
|  | -/** | ||||||
|  | - * brcmf_pno_set_random - setup randomisation mac address for pno. | ||||||
|  | - * | ||||||
|  | - * @ifp: interface object used. | ||||||
|  | - * @mac_addr: MAC address used with randomisation. | ||||||
|  | - * @mac_mask: MAC address mask used for randomisation. | ||||||
|  | - */ | ||||||
|  | -int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask); | ||||||
|  | - | ||||||
|  | -/** | ||||||
|  | - * brcmf_pno_add_ssid - add ssid for pno in firmware. | ||||||
|  | - * | ||||||
|  | - * @ifp: interface object used. | ||||||
|  | - * @ssid: ssid information. | ||||||
|  | - * @active: indicate this ssid needs to be actively probed. | ||||||
|  | - */ | ||||||
|  | -int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid, | ||||||
|  | -		       bool active); | ||||||
|  | +int brcmf_pno_start_sched_scan(struct brcmf_if *ifp, | ||||||
|  | +			       struct cfg80211_sched_scan_request *req); | ||||||
|  |   | ||||||
|  |  #endif /* _BRCMF_PNO_H */ | ||||||
| @@ -0,0 +1,111 @@ | |||||||
|  | From 331e789443618ca9cc3ed48ada4e670225cca036 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:28 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: use provided channels for scheduled scan | ||||||
|  |  | ||||||
|  | User-space can provide list of channels in the schedule scan request. | ||||||
|  | This was ignored so all channels supported and allowed by the device | ||||||
|  | were used. This patch configures the device to use the channels as | ||||||
|  | listed in the request. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/fwil_types.h       | 16 +++++++++++++ | ||||||
|  |  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 26 +++++++++++++++++++++- | ||||||
|  |  2 files changed, 41 insertions(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | ||||||
|  | @@ -131,6 +131,7 @@ | ||||||
|  |  #define BRCMF_TXBF_MU_BFR_CAP		BIT(1) | ||||||
|  |   | ||||||
|  |  #define	BRCMF_MAXPMKID			16	/* max # PMKID cache entries */ | ||||||
|  | +#define BRCMF_NUMCHANNELS		64 | ||||||
|  |   | ||||||
|  |  #define BRCMF_PFN_MACADDR_CFG_VER	1 | ||||||
|  |  #define BRCMF_PFN_MAC_OUI_ONLY		BIT(0) | ||||||
|  | @@ -719,6 +720,21 @@ struct brcmf_pno_param_le { | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  | + * struct brcmf_pno_config_le - PNO channel configuration. | ||||||
|  | + * | ||||||
|  | + * @reporttype: determines what is reported. | ||||||
|  | + * @channel_num: number of channels specified in @channel_list. | ||||||
|  | + * @channel_list: channels to use in PNO scan. | ||||||
|  | + * @flags: reserved. | ||||||
|  | + */ | ||||||
|  | +struct brcmf_pno_config_le { | ||||||
|  | +	__le32  reporttype; | ||||||
|  | +	__le32  channel_num; | ||||||
|  | +	__le16  channel_list[BRCMF_NUMCHANNELS]; | ||||||
|  | +	__le32  flags; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +/** | ||||||
|  |   * struct brcmf_pno_net_param_le - scan parameters per preferred network. | ||||||
|  |   * | ||||||
|  |   * @ssid: ssid name and its length. | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -18,9 +18,10 @@ | ||||||
|  |   | ||||||
|  |  #include "core.h" | ||||||
|  |  #include "debug.h" | ||||||
|  | -#include "pno.h" | ||||||
|  |  #include "fwil.h" | ||||||
|  |  #include "fwil_types.h" | ||||||
|  | +#include "cfg80211.h" | ||||||
|  | +#include "pno.h" | ||||||
|  |   | ||||||
|  |  #define BRCMF_PNO_VERSION		2 | ||||||
|  |  #define BRCMF_PNO_REPEAT		4 | ||||||
|  | @@ -34,6 +35,15 @@ | ||||||
|  |  #define BRCMF_PNO_HIDDEN_BIT		2 | ||||||
|  |  #define BRCMF_PNO_SCHED_SCAN_PERIOD	30 | ||||||
|  |   | ||||||
|  | +static int brcmf_pno_channel_config(struct brcmf_if *ifp, | ||||||
|  | +				    struct brcmf_pno_config_le *cfg) | ||||||
|  | +{ | ||||||
|  | +	cfg->reporttype = 0; | ||||||
|  | +	cfg->flags = 0; | ||||||
|  | + | ||||||
|  | +	return brcmf_fil_iovar_data_set(ifp, "pfn_cfg", cfg, sizeof(*cfg)); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq, | ||||||
|  |  			    u32 mscan, u32 bestn) | ||||||
|  |  { | ||||||
|  | @@ -167,7 +177,10 @@ int brcmf_pno_clean(struct brcmf_if *ifp | ||||||
|  |  int brcmf_pno_start_sched_scan(struct brcmf_if *ifp, | ||||||
|  |  			       struct cfg80211_sched_scan_request *req) | ||||||
|  |  { | ||||||
|  | +	struct brcmu_d11inf *d11inf; | ||||||
|  | +	struct brcmf_pno_config_le pno_cfg; | ||||||
|  |  	struct cfg80211_ssid *ssid; | ||||||
|  | +	u16 chan; | ||||||
|  |  	int i, ret; | ||||||
|  |   | ||||||
|  |  	/* clean up everything */ | ||||||
|  | @@ -190,6 +203,17 @@ int brcmf_pno_start_sched_scan(struct br | ||||||
|  |  			return ret; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	/* configure channels to use */ | ||||||
|  | +	d11inf = &ifp->drvr->config->d11inf; | ||||||
|  | +	for (i = 0; i < req->n_channels; i++) { | ||||||
|  | +		chan = req->channels[i]->hw_value; | ||||||
|  | +		pno_cfg.channel_list[i] = cpu_to_le16(chan); | ||||||
|  | +	} | ||||||
|  | +	if (req->n_channels) { | ||||||
|  | +		pno_cfg.channel_num = cpu_to_le32(req->n_channels); | ||||||
|  | +		brcmf_pno_channel_config(ifp, &pno_cfg); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  |  	/* configure each match set */ | ||||||
|  |  	for (i = 0; i < req->n_match_sets; i++) { | ||||||
|  |  		ssid = &req->match_sets[i].ssid; | ||||||
| @@ -0,0 +1,34 @@ | |||||||
|  | From dfe5b0d52d5880bd9d4b427e1a53c9e9e4c3c820 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:29 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: remove restriction from .sched_scan_start() | ||||||
|  |  callback | ||||||
|  |  | ||||||
|  | In the .sched_scan_start() callback a condition was checked whether a | ||||||
|  | normal scan was ongoing. However, there is no need for this check as | ||||||
|  | it is ok to start the scheduled scan irrespective whether or not a | ||||||
|  | normal scan is ongoing. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +---- | ||||||
|  |  1 file changed, 1 insertion(+), 4 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -3351,10 +3351,7 @@ brcmf_cfg80211_sched_scan_start(struct w | ||||||
|  |   | ||||||
|  |  	brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n", | ||||||
|  |  		  req->n_match_sets, req->n_ssids); | ||||||
|  | -	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { | ||||||
|  | -		brcmf_err("Scanning already: status (%lu)\n", cfg->scan_status); | ||||||
|  | -		return -EAGAIN; | ||||||
|  | -	} | ||||||
|  | + | ||||||
|  |  	if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) { | ||||||
|  |  		brcmf_err("Scanning suppressed: status (%lu)\n", | ||||||
|  |  			  cfg->scan_status); | ||||||
| @@ -0,0 +1,67 @@ | |||||||
|  | From c6989fd55ceb633d2f18c12ffae01b9123125c89 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:30 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: use requested scan interval in scheduled scan | ||||||
|  |  | ||||||
|  | User-space can specify the interval for the scheduled scan. This | ||||||
|  | interval is found in scheduled scan plan. The driver supports only | ||||||
|  | one plan, which is legacy behaviour. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 1 + | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c      | 6 +++++- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h      | 6 ++++-- | ||||||
|  |  3 files changed, 10 insertions(+), 3 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -6312,6 +6312,7 @@ static void brcmf_wiphy_pno_params(struc | ||||||
|  |  	wiphy->max_sched_scan_ssids = BRCMF_PNO_MAX_PFN_COUNT; | ||||||
|  |  	wiphy->max_match_sets = BRCMF_PNO_MAX_PFN_COUNT; | ||||||
|  |  	wiphy->max_sched_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX; | ||||||
|  | +	wiphy->max_sched_scan_plan_interval = BRCMF_PNO_SCHED_SCAN_MAX_PERIOD; | ||||||
|  |  	wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -63,6 +63,10 @@ static int brcmf_pno_config(struct brcmf | ||||||
|  |  	pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX; | ||||||
|  |   | ||||||
|  |  	/* set up pno scan fr */ | ||||||
|  | +	if (scan_freq < BRCMF_PNO_SCHED_SCAN_MIN_PERIOD) { | ||||||
|  | +		brcmf_dbg(SCAN, "scan period too small, using minimum\n"); | ||||||
|  | +		scan_freq = BRCMF_PNO_SCHED_SCAN_MIN_PERIOD; | ||||||
|  | +	} | ||||||
|  |  	pfn_param.scan_freq = cpu_to_le32(scan_freq); | ||||||
|  |   | ||||||
|  |  	if (mscan) { | ||||||
|  | @@ -191,7 +195,7 @@ int brcmf_pno_start_sched_scan(struct br | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	/* configure pno */ | ||||||
|  | -	ret = brcmf_pno_config(ifp, BRCMF_PNO_SCHED_SCAN_PERIOD, 0, 0); | ||||||
|  | +	ret = brcmf_pno_config(ifp, req->scan_plans[0].interval, 0, 0); | ||||||
|  |  	if (ret < 0) | ||||||
|  |  		return ret; | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h | ||||||
|  | @@ -16,8 +16,10 @@ | ||||||
|  |  #ifndef _BRCMF_PNO_H | ||||||
|  |  #define _BRCMF_PNO_H | ||||||
|  |   | ||||||
|  | -#define BRCMF_PNO_SCAN_COMPLETE		1 | ||||||
|  | -#define BRCMF_PNO_MAX_PFN_COUNT		16 | ||||||
|  | +#define BRCMF_PNO_SCAN_COMPLETE			1 | ||||||
|  | +#define BRCMF_PNO_MAX_PFN_COUNT			16 | ||||||
|  | +#define BRCMF_PNO_SCHED_SCAN_MIN_PERIOD	10 | ||||||
|  | +#define BRCMF_PNO_SCHED_SCAN_MAX_PERIOD	508 | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  |   * brcmf_pno_clean - disable and clear pno in firmware. | ||||||
| @@ -0,0 +1,76 @@ | |||||||
|  | From 53e3a80d80c80bf50ab64cf6c44fb0fa41aa22d8 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Wed, 23 Nov 2016 10:25:31 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: fix scheduled scan result handling for newer chips | ||||||
|  |  | ||||||
|  | The scan results for scheduled scan as retrieved from the device | ||||||
|  | have changed. A field has been added which is not needed. However, | ||||||
|  | the appended info is. Luckily they are versioned so check that to | ||||||
|  | find out the location of the appended data. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 24 +++++++++++++++++++++- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/fwil_types.h       |  7 +++++++ | ||||||
|  |  2 files changed, 30 insertions(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -3257,6 +3257,28 @@ static int brcmf_start_internal_escan(st | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static struct brcmf_pno_net_info_le * | ||||||
|  | +brcmf_get_netinfo_array(struct brcmf_pno_scanresults_le *pfn_v1) | ||||||
|  | +{ | ||||||
|  | +	struct brcmf_pno_scanresults_v2_le *pfn_v2; | ||||||
|  | +	struct brcmf_pno_net_info_le *netinfo; | ||||||
|  | + | ||||||
|  | +	switch (pfn_v1->version) { | ||||||
|  | +	default: | ||||||
|  | +		WARN_ON(1); | ||||||
|  | +		/* fall-thru */ | ||||||
|  | +	case cpu_to_le32(1): | ||||||
|  | +		netinfo = (struct brcmf_pno_net_info_le *)(pfn_v1 + 1); | ||||||
|  | +		break; | ||||||
|  | +	case cpu_to_le32(2): | ||||||
|  | +		pfn_v2 = (struct brcmf_pno_scanresults_v2_le *)pfn_v1; | ||||||
|  | +		netinfo = (struct brcmf_pno_net_info_le *)(pfn_v2 + 1); | ||||||
|  | +		break; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	return netinfo; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  /* PFN result doesn't have all the info which are required by the supplicant | ||||||
|  |   * (For e.g IEs) Do a target Escan so that sched scan results are reported | ||||||
|  |   * via wl_inform_single_bss in the required format. Escan does require the | ||||||
|  | @@ -3309,7 +3331,7 @@ brcmf_notify_sched_scan_results(struct b | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	data += sizeof(struct brcmf_pno_scanresults_le); | ||||||
|  | -	netinfo_start = (struct brcmf_pno_net_info_le *)data; | ||||||
|  | +	netinfo_start = brcmf_get_netinfo_array(pfn_result); | ||||||
|  |   | ||||||
|  |  	for (i = 0; i < result_count; i++) { | ||||||
|  |  		netinfo = &netinfo_start[i]; | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | ||||||
|  | @@ -785,6 +785,13 @@ struct brcmf_pno_scanresults_le { | ||||||
|  |  	__le32 count; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +struct brcmf_pno_scanresults_v2_le { | ||||||
|  | +	__le32 version; | ||||||
|  | +	__le32 status; | ||||||
|  | +	__le32 count; | ||||||
|  | +	__le32 scan_ch_bucket; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  /** | ||||||
|  |   * struct brcmf_pno_macaddr_le - to configure PNO macaddr randomization. | ||||||
|  |   * | ||||||
| @@ -0,0 +1,47 @@ | |||||||
|  | From cb853da3a368c40300a0e940f86be582037bb082 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Fri, 9 Dec 2016 11:34:13 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: fix memory leak in brcmf_cfg80211_attach() | ||||||
|  |  | ||||||
|  | In brcmf_cfg80211_attach() there was one error path not properly | ||||||
|  | handled as it leaked memory allocated in brcmf_btcoex_attach(). | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 7 +++++-- | ||||||
|  |  1 file changed, 5 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -6866,7 +6866,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 | ||||||
|  |   | ||||||
|  |  	err = brcmf_p2p_attach(cfg, p2pdev_forced); | ||||||
|  |  	if (err) { | ||||||
|  | -		brcmf_err("P2P initilisation failed (%d)\n", err); | ||||||
|  | +		brcmf_err("P2P initialisation failed (%d)\n", err); | ||||||
|  |  		goto wiphy_unreg_out; | ||||||
|  |  	} | ||||||
|  |  	err = brcmf_btcoex_attach(cfg); | ||||||
|  | @@ -6891,7 +6891,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 | ||||||
|  |  	err = brcmf_fweh_activate_events(ifp); | ||||||
|  |  	if (err) { | ||||||
|  |  		brcmf_err("FWEH activation failed (%d)\n", err); | ||||||
|  | -		goto wiphy_unreg_out; | ||||||
|  | +		goto detach; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	/* Fill in some of the advertised nl80211 supported features */ | ||||||
|  | @@ -6906,6 +6906,9 @@ struct brcmf_cfg80211_info *brcmf_cfg802 | ||||||
|  |   | ||||||
|  |  	return cfg; | ||||||
|  |   | ||||||
|  | +detach: | ||||||
|  | +	brcmf_btcoex_detach(cfg); | ||||||
|  | +	brcmf_p2p_detach(&cfg->p2p); | ||||||
|  |  wiphy_unreg_out: | ||||||
|  |  	wiphy_unregister(cfg->wiphy); | ||||||
|  |  priv_out: | ||||||
| @@ -0,0 +1,29 @@ | |||||||
|  | From 2b66325d5ea7c2a39ac69ed83b6979afe480d81a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Fri, 9 Dec 2016 11:34:14 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: fix uninitialized field in scheduled scan ssid | ||||||
|  |  configuration | ||||||
|  |  | ||||||
|  | The scheduled scan ssid configuration in firmware has a flags field that | ||||||
|  | was not initialized resulting in unexpected behaviour. | ||||||
|  |  | ||||||
|  | Fixes: e3bdb7cc0300 ("brcmfmac: fix handling ssids in .sched_scan_start() callback") | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 1 + | ||||||
|  |  1 file changed, 1 insertion(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | ||||||
|  | @@ -137,6 +137,7 @@ static int brcmf_pno_add_ssid(struct brc | ||||||
|  |  	pfn.wpa_auth = cpu_to_le32(BRCMF_PNO_WPA_AUTH_ANY); | ||||||
|  |  	pfn.wsec = cpu_to_le32(0); | ||||||
|  |  	pfn.infra = cpu_to_le32(1); | ||||||
|  | +	pfn.flags = 0; | ||||||
|  |  	if (active) | ||||||
|  |  		pfn.flags = cpu_to_le32(1 << BRCMF_PNO_HIDDEN_BIT); | ||||||
|  |  	pfn.ssid.SSID_len = cpu_to_le32(ssid->ssid_len); | ||||||
| @@ -0,0 +1,35 @@ | |||||||
|  | From ad334bbb07b07e2873942571b0c9f3c34571bd47 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Colin Ian King <colin.king@canonical.com> | ||||||
|  | Date: Fri, 23 Dec 2016 00:43:22 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: fix spelling mistakes on "Ivalid" | ||||||
|  |  | ||||||
|  | Trivial fixes to spelling mistake "Ivalid" to "Invalid" in | ||||||
|  | brcmf_err error messages. | ||||||
|  |  | ||||||
|  | Signed-off-by: Colin Ian King <colin.king@canonical.com> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++-- | ||||||
|  |  1 file changed, 2 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -3969,7 +3969,7 @@ brcmf_configure_wpaie(struct brcmf_if *i | ||||||
|  |  			pval |= AES_ENABLED; | ||||||
|  |  			break; | ||||||
|  |  		default: | ||||||
|  | -			brcmf_err("Ivalid unicast security info\n"); | ||||||
|  | +			brcmf_err("Invalid unicast security info\n"); | ||||||
|  |  		} | ||||||
|  |  		offset++; | ||||||
|  |  	} | ||||||
|  | @@ -4013,7 +4013,7 @@ brcmf_configure_wpaie(struct brcmf_if *i | ||||||
|  |  			wpa_auth |= WPA2_AUTH_1X_SHA256; | ||||||
|  |  			break; | ||||||
|  |  		default: | ||||||
|  | -			brcmf_err("Ivalid key mgmt info\n"); | ||||||
|  | +			brcmf_err("Invalid key mgmt info\n"); | ||||||
|  |  		} | ||||||
|  |  		offset++; | ||||||
|  |  	} | ||||||
| @@ -23,11 +23,12 @@ it also avoids using channel[index] over and over. | |||||||
| Fixes: 58de92d2f95e ("brcmfmac: use static superset of channels for wiphy bands") | Fixes: 58de92d2f95e ("brcmfmac: use static superset of channels for wiphy bands") | ||||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
| ---
 | ---
 | ||||||
| 
 | 
 | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| @@ -5913,7 +5913,6 @@ static int brcmf_construct_chaninfo(stru
 | @@ -5823,7 +5823,6 @@ static int brcmf_construct_chaninfo(stru
 | ||||||
|  	u32 i, j; |  	u32 i, j; | ||||||
|  	u32 total; |  	u32 total; | ||||||
|  	u32 chaninfo; |  	u32 chaninfo; | ||||||
| @@ -35,7 +36,7 @@ Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | |||||||
|   |   | ||||||
|  	pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL); |  	pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL); | ||||||
|   |   | ||||||
| @@ -5961,33 +5960,36 @@ static int brcmf_construct_chaninfo(stru
 | @@ -5871,33 +5870,36 @@ static int brcmf_construct_chaninfo(stru
 | ||||||
|  		    ch.bw == BRCMU_CHAN_BW_80) |  		    ch.bw == BRCMU_CHAN_BW_80) | ||||||
|  			continue; |  			continue; | ||||||
|   |   | ||||||
| @@ -84,7 +85,7 @@ Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | |||||||
|  			ch.bw = BRCMU_CHAN_BW_20; |  			ch.bw = BRCMU_CHAN_BW_20; | ||||||
|  			cfg->d11inf.encchspec(&ch); |  			cfg->d11inf.encchspec(&ch); | ||||||
|  			chaninfo = ch.chspec; |  			chaninfo = ch.chspec; | ||||||
| @@ -5995,11 +5997,11 @@ static int brcmf_construct_chaninfo(stru
 | @@ -5905,11 +5907,11 @@ static int brcmf_construct_chaninfo(stru
 | ||||||
|  						       &chaninfo); |  						       &chaninfo); | ||||||
|  			if (!err) { |  			if (!err) { | ||||||
|  				if (chaninfo & WL_CHAN_RADAR) |  				if (chaninfo & WL_CHAN_RADAR) | ||||||
| @@ -12,11 +12,12 @@ It will on the other hand allow more detailed runtime control over | |||||||
| channels which is the main reason for this change. | channels which is the main reason for this change. | ||||||
| 
 | 
 | ||||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
| ---
 | ---
 | ||||||
| 
 | 
 | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| @@ -147,7 +147,6 @@ static struct ieee80211_rate __wl_rates[
 | @@ -138,7 +138,6 @@ static struct ieee80211_rate __wl_rates[
 | ||||||
|  	.band			= NL80211_BAND_2GHZ,		\ |  	.band			= NL80211_BAND_2GHZ,		\ | ||||||
|  	.center_freq		= (_freq),			\ |  	.center_freq		= (_freq),			\ | ||||||
|  	.hw_value		= (_channel),			\ |  	.hw_value		= (_channel),			\ | ||||||
| @@ -24,7 +25,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | |||||||
|  	.max_antenna_gain	= 0,				\ |  	.max_antenna_gain	= 0,				\ | ||||||
|  	.max_power		= 30,				\ |  	.max_power		= 30,				\ | ||||||
|  } |  } | ||||||
| @@ -156,7 +155,6 @@ static struct ieee80211_rate __wl_rates[
 | @@ -147,7 +146,6 @@ static struct ieee80211_rate __wl_rates[
 | ||||||
|  	.band			= NL80211_BAND_5GHZ,		\ |  	.band			= NL80211_BAND_5GHZ,		\ | ||||||
|  	.center_freq		= 5000 + (5 * (_channel)),	\ |  	.center_freq		= 5000 + (5 * (_channel)),	\ | ||||||
|  	.hw_value		= (_channel),			\ |  	.hw_value		= (_channel),			\ | ||||||
| @@ -20,11 +20,12 @@ due to hardware setup (design). | |||||||
| 
 | 
 | ||||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
| ---
 | ---
 | ||||||
| 
 | 
 | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| @@ -6564,8 +6564,7 @@ static int brcmf_setup_wiphy(struct wiph
 | @@ -6475,8 +6475,7 @@ static int brcmf_setup_wiphy(struct wiph
 | ||||||
|  			wiphy->bands[NL80211_BAND_5GHZ] = band; |  			wiphy->bands[NL80211_BAND_5GHZ] = band; | ||||||
|  		} |  		} | ||||||
|  	} |  	} | ||||||
| @@ -34,7 +35,7 @@ Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | |||||||
|  } |  } | ||||||
|   |   | ||||||
|  static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) |  static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) | ||||||
| @@ -6930,6 +6929,12 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | @@ -6841,6 +6840,12 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | ||||||
|  		goto priv_out; |  		goto priv_out; | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | From e457a8a01a19277e96830d3d95887e0e3c1e2f26 Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
| Date: Sat, 7 Jan 2017 23:43:45 +0100 | Date: Sat, 7 Jan 2017 23:43:45 +0100 | ||||||
| Subject: [PATCH] brcmfmac: make brcmf_of_probe more generic | Subject: [PATCH] brcmfmac: make brcmf_of_probe more generic | ||||||
| @@ -13,7 +14,12 @@ Call brcmf_of_probe for all kind of devices & move extra conditions to | |||||||
| the body of that funcion. | the body of that funcion. | ||||||
| 
 | 
 | ||||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
| ---
 | ---
 | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 8 +++----- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c     | 7 +++++-- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h     | 6 ++++-- | ||||||
|  |  3 files changed, 12 insertions(+), 9 deletions(-) | ||||||
| 
 | 
 | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||||
| @@ -0,0 +1,46 @@ | |||||||
|  | From a62a77881b1b6708ffeddd9bf0529494f7b199e3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> | ||||||
|  | Date: Mon, 16 Jan 2017 11:17:57 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: add support for BCM43455 with modalias | ||||||
|  |  sdio:c00v02D0dA9BF | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | BCM43455 is a more recent revision of the BCM4345. Some of the BCM43455 | ||||||
|  | got a dedicated SDIO device ID which is currently not supported by | ||||||
|  | brcmfmac. | ||||||
|  | Adding the new sdio_device_id to brcmfmac is enough to get the BCM43455 | ||||||
|  | supported because the chip itself is already supported (due to BCM4345 | ||||||
|  | support in the driver). | ||||||
|  |  | ||||||
|  | Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Reviewed-by: Andreas Färber <afaerber@suse.de> | ||||||
|  | Tested-by: Andreas Färber <afaerber@suse.de> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 + | ||||||
|  |  include/linux/mmc/sdio_ids.h                              | 1 + | ||||||
|  |  2 files changed, 2 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | ||||||
|  | @@ -1104,6 +1104,7 @@ static const struct sdio_device_id brcmf | ||||||
|  |  	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339), | ||||||
|  |  	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430), | ||||||
|  |  	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345), | ||||||
|  | +	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455), | ||||||
|  |  	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354), | ||||||
|  |  	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356), | ||||||
|  |  	{ /* end: all zeroes */ } | ||||||
|  | --- a/include/linux/mmc/sdio_ids.h | ||||||
|  | +++ b/include/linux/mmc/sdio_ids.h | ||||||
|  | @@ -36,6 +36,7 @@ | ||||||
|  |  #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_43455		0xa9bf | ||||||
|  |  #define SDIO_DEVICE_ID_BROADCOM_4354		0x4354 | ||||||
|  |  #define SDIO_DEVICE_ID_BROADCOM_4356		0x4356 | ||||||
|  |   | ||||||
| @@ -0,0 +1,34 @@ | |||||||
|  | From 8e290cecdd0178f3d4cf7d463c51dc7e462843b4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Gavin Li <git@thegavinli.com> | ||||||
|  | Date: Tue, 17 Jan 2017 15:24:05 -0800 | ||||||
|  | Subject: [PATCH] brcmfmac: fix incorrect event channel deduction | ||||||
|  |  | ||||||
|  | brcmf_sdio_fromevntchan() was being called on the the data frame | ||||||
|  | rather than the software header, causing some frames to be | ||||||
|  | mischaracterized as on the event channel rather than the data channel. | ||||||
|  |  | ||||||
|  | This fixes a major performance regression (due to dropped packets). With | ||||||
|  | this patch the download speed jumped from 1Mbit/s back up to 40MBit/s due | ||||||
|  | to the sheer amount of packets being incorrectly processed. | ||||||
|  |  | ||||||
|  | Fixes: c56caa9db8ab ("brcmfmac: screening firmware event packet") | ||||||
|  | Signed-off-by: Gavin Li <git@thegavinli.com> | ||||||
|  | Cc: <stable@vger.kernel.org> # 4.7+ | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | [kvalo@codeaurora.org: improve commit logs based on email discussion] | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | ||||||
|  | @@ -1661,7 +1661,7 @@ static u8 brcmf_sdio_rxglom(struct brcmf | ||||||
|  |  					   pfirst->len, pfirst->next, | ||||||
|  |  					   pfirst->prev); | ||||||
|  |  			skb_unlink(pfirst, &bus->glom); | ||||||
|  | -			if (brcmf_sdio_fromevntchan(pfirst->data)) | ||||||
|  | +			if (brcmf_sdio_fromevntchan(&dptr[SDPCM_HWHDR_LEN])) | ||||||
|  |  				brcmf_rx_event(bus->sdiodev->dev, pfirst); | ||||||
|  |  			else | ||||||
|  |  				brcmf_rx_frame(bus->sdiodev->dev, pfirst, | ||||||
| @@ -0,0 +1,63 @@ | |||||||
|  | From c8d870794d5dd42d6e05a78cc92d1ff7acf11f6a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Wed, 18 Jan 2017 11:48:51 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: drop unneeded function declarations from headers | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | Functions brcmf_c_prec_enq and brcmf_sdio_init don't exist so we | ||||||
|  | really don't need their declarations. Function brcmf_parse_tlvs is used | ||||||
|  | in cfg80211.c only so make it static and drop from header as well. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h      | 4 ---- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 -- | ||||||
|  |  3 files changed, 1 insertion(+), 7 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | ||||||
|  | @@ -218,9 +218,6 @@ int brcmf_bus_get_memdump(struct brcmf_b | ||||||
|  |   * interface functions from common layer | ||||||
|  |   */ | ||||||
|  |   | ||||||
|  | -bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, struct sk_buff *pkt, | ||||||
|  | -		      int prec); | ||||||
|  | - | ||||||
|  |  /* Receive frame for delivery to OS.  Callee disposes of rxp. */ | ||||||
|  |  void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_event); | ||||||
|  |  /* Receive async event packet from firmware. Callee disposes of rxp. */ | ||||||
|  | @@ -247,7 +244,6 @@ void brcmf_bus_add_txhdrlen(struct devic | ||||||
|  |   | ||||||
|  |  #ifdef CPTCFG_BRCMFMAC_SDIO | ||||||
|  |  void brcmf_sdio_exit(void); | ||||||
|  | -void brcmf_sdio_init(void); | ||||||
|  |  void brcmf_sdio_register(void); | ||||||
|  |  #endif | ||||||
|  |  #ifdef CPTCFG_BRCMFMAC_USB | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -326,7 +326,7 @@ u16 channel_to_chanspec(struct brcmu_d11 | ||||||
|  |   * triples, returning a pointer to the substring whose first element | ||||||
|  |   * matches tag | ||||||
|  |   */ | ||||||
|  | -const struct brcmf_tlv * | ||||||
|  | +static const struct brcmf_tlv * | ||||||
|  |  brcmf_parse_tlvs(const void *buf, int buflen, uint key) | ||||||
|  |  { | ||||||
|  |  	const struct brcmf_tlv *elt = buf; | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | ||||||
|  | @@ -396,8 +396,6 @@ void brcmf_free_vif(struct brcmf_cfg8021 | ||||||
|  |  s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, | ||||||
|  |  			  const u8 *vndr_ie_buf, u32 vndr_ie_len); | ||||||
|  |  s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif); | ||||||
|  | -const struct brcmf_tlv * | ||||||
|  | -brcmf_parse_tlvs(const void *buf, int buflen, uint key); | ||||||
|  |  u16 channel_to_chanspec(struct brcmu_d11inf *d11inf, | ||||||
|  |  			struct ieee80211_channel *ch); | ||||||
|  |  bool brcmf_get_vif_state_any(struct brcmf_cfg80211_info *cfg, | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  | From f5611e038172101561b570554c81e290a39517ed Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Wed, 18 Jan 2017 11:48:52 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: move brcmf_c_set_joinpref_default declaration to | ||||||
|  |  common.h | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | Function brcmf_c_set_joinpref_default is in common.c, so move it to the | ||||||
|  | related header. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | 2 ++ | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h   | 1 - | ||||||
|  |  2 files changed, 2 insertions(+), 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | ||||||
|  | @@ -65,6 +65,8 @@ struct brcmf_mp_device { | ||||||
|  |  	} bus; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +void brcmf_c_set_joinpref_default(struct brcmf_if *ifp); | ||||||
|  | + | ||||||
|  |  struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, | ||||||
|  |  					       enum brcmf_bus_type bus_type, | ||||||
|  |  					       u32 chip, u32 chiprev); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | ||||||
|  | @@ -216,7 +216,6 @@ 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); | ||||||
|  |  void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); | ||||||
|  | -void brcmf_c_set_joinpref_default(struct brcmf_if *ifp); | ||||||
|  |  int __init brcmf_core_init(void); | ||||||
|  |  void __exit brcmf_core_exit(void); | ||||||
|  |   | ||||||
| @@ -0,0 +1,49 @@ | |||||||
|  | From bfa7295e5b4d32cdab28d4cdc3a9791f73aed089 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Wed, 18 Jan 2017 11:48:53 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: drop brcmf_bus_detach and inline its code | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | Driver used to call brcmf_bus_detach only from one place and it already | ||||||
|  | contained a check for drvr not being NULL. We can get rid of this extra | ||||||
|  | function, call brcmf_bus_stop directly and simplify the code. | ||||||
|  | There also isn't brcmf_bus_attach function which one could expect so it | ||||||
|  | looks more consistent this way. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 12 +----------- | ||||||
|  |  1 file changed, 1 insertion(+), 11 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
|  | @@ -1075,16 +1075,6 @@ void brcmf_bus_add_txhdrlen(struct devic | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void brcmf_bus_detach(struct brcmf_pub *drvr) | ||||||
|  | -{ | ||||||
|  | -	brcmf_dbg(TRACE, "Enter\n"); | ||||||
|  | - | ||||||
|  | -	if (drvr) { | ||||||
|  | -		/* Stop the bus module */ | ||||||
|  | -		brcmf_bus_stop(drvr->bus_if); | ||||||
|  | -	} | ||||||
|  | -} | ||||||
|  | - | ||||||
|  |  void brcmf_dev_reset(struct device *dev) | ||||||
|  |  { | ||||||
|  |  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||||
|  | @@ -1131,7 +1121,7 @@ void brcmf_detach(struct device *dev) | ||||||
|  |   | ||||||
|  |  	brcmf_fws_deinit(drvr); | ||||||
|  |   | ||||||
|  | -	brcmf_bus_detach(drvr); | ||||||
|  | +	brcmf_bus_stop(drvr->bus_if); | ||||||
|  |   | ||||||
|  |  	brcmf_proto_detach(drvr); | ||||||
|  |   | ||||||
| @@ -0,0 +1,93 @@ | |||||||
|  | From e8cd47501fa0c0a591bb07d5878dcc8d63d60e57 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Wed, 18 Jan 2017 11:48:54 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: rename brcmf_bus_start function to | ||||||
|  |  brcmf_bus_started | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | This intends to make init/attach process slightly easier to follow. | ||||||
|  |  | ||||||
|  | What driver was doing in brcmf_bus_start wasn't bus specific at all and | ||||||
|  | function brcmf_bus_stop wasn't undoing things done there. This function | ||||||
|  | is supposed to be called by bus specific code when the bus is ready. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h    | 2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c   | 2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c   | 2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 2 +- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c    | 2 +- | ||||||
|  |  6 files changed, 6 insertions(+), 6 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | ||||||
|  | @@ -238,7 +238,7 @@ void brcmf_txcomplete(struct device *dev | ||||||
|  |  /* Configure the "global" bus state used by upper layers */ | ||||||
|  |  void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state); | ||||||
|  |   | ||||||
|  | -int brcmf_bus_start(struct device *dev); | ||||||
|  | +int brcmf_bus_started(struct device *dev); | ||||||
|  |  s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len); | ||||||
|  |  void brcmf_bus_add_txhdrlen(struct device *dev, uint len); | ||||||
|  |   | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||||||
|  | @@ -74,7 +74,7 @@ module_param_named(roamoff, brcmf_roamof | ||||||
|  |  MODULE_PARM_DESC(roamoff, "Do not use internal roaming engine"); | ||||||
|  |   | ||||||
|  |  #ifdef DEBUG | ||||||
|  | -/* always succeed brcmf_bus_start() */ | ||||||
|  | +/* always succeed brcmf_bus_started() */ | ||||||
|  |  static int brcmf_ignore_probe_fail; | ||||||
|  |  module_param_named(ignore_probe_fail, brcmf_ignore_probe_fail, int, 0); | ||||||
|  |  MODULE_PARM_DESC(ignore_probe_fail, "always succeed probe for debugging"); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
|  | @@ -966,7 +966,7 @@ static int brcmf_revinfo_read(struct seq | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int brcmf_bus_start(struct device *dev) | ||||||
|  | +int brcmf_bus_started(struct device *dev) | ||||||
|  |  { | ||||||
|  |  	int ret = -1; | ||||||
|  |  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | ||||||
|  | @@ -1572,7 +1572,7 @@ static int brcmf_pcie_attach_bus(struct | ||||||
|  |  	if (ret) { | ||||||
|  |  		brcmf_err("brcmf_attach failed\n"); | ||||||
|  |  	} else { | ||||||
|  | -		ret = brcmf_bus_start(&devinfo->pdev->dev); | ||||||
|  | +		ret = brcmf_bus_started(&devinfo->pdev->dev); | ||||||
|  |  		if (ret) | ||||||
|  |  			brcmf_err("dongle is not responding\n"); | ||||||
|  |  	} | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | ||||||
|  | @@ -4065,7 +4065,7 @@ static void brcmf_sdio_firmware_callback | ||||||
|  |   | ||||||
|  |  	sdio_release_host(sdiodev->func[1]); | ||||||
|  |   | ||||||
|  | -	err = brcmf_bus_start(dev); | ||||||
|  | +	err = brcmf_bus_started(dev); | ||||||
|  |  	if (err != 0) { | ||||||
|  |  		brcmf_err("dongle is not responding\n"); | ||||||
|  |  		goto fail; | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | ||||||
|  | @@ -1148,7 +1148,7 @@ static int brcmf_usb_bus_setup(struct br | ||||||
|  |  	if (ret) | ||||||
|  |  		goto fail; | ||||||
|  |   | ||||||
|  | -	ret = brcmf_bus_start(devinfo->dev); | ||||||
|  | +	ret = brcmf_bus_started(devinfo->dev); | ||||||
|  |  	if (ret) | ||||||
|  |  		goto fail; | ||||||
|  |   | ||||||
| @@ -0,0 +1,30 @@ | |||||||
|  | From b3d75a81f07c757ab73c9022631170c3baefe380 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Thu, 19 Jan 2017 10:51:25 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: drop duplicated core selection from | ||||||
|  |  brcmf_pcie_attach | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | It was left after reworking PCIe reset in commit 07fe2e38c7fd | ||||||
|  | ("brcmfmac: Reset PCIE devices after recognition."). | ||||||
|  |  | ||||||
|  | Cc: Hante Meuleman <meuleman@broadcom.com> | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 - | ||||||
|  |  1 file changed, 1 deletion(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | ||||||
|  | @@ -601,7 +601,6 @@ static void brcmf_pcie_attach(struct brc | ||||||
|  |  { | ||||||
|  |  	u32 config; | ||||||
|  |   | ||||||
|  | -	brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2); | ||||||
|  |  	/* 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); | ||||||
| @@ -0,0 +1,30 @@ | |||||||
|  | From 2ef0359031b9ed891ca381b2687186fb52b277f8 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Fri, 27 Jan 2017 12:27:45 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: provide a value for struct | ||||||
|  |  wowlan_support::max_nd_match_sets | ||||||
|  |  | ||||||
|  | The driver advertises support for WOWLAN_NETDETECT but did not specify | ||||||
|  | maximum amount of netdetect match sets. This was no issue due to a bug | ||||||
|  | in nl80211. As that has been fixed, brcmfmac also needs fixing. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 ++ | ||||||
|  |  1 file changed, 2 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -6356,6 +6356,8 @@ static void brcmf_wiphy_wowl_params(stru | ||||||
|  |  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) { | ||||||
|  |  		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) { | ||||||
|  |  			brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT; | ||||||
|  | +			brcmf_wowlan_support.max_nd_match_sets = | ||||||
|  | +				BRCMF_PNO_MAX_PFN_COUNT; | ||||||
|  |  			init_waitqueue_head(&cfg->wowl.nd_data_wait); | ||||||
|  |  		} | ||||||
|  |  	} | ||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | From d29afe91af5995306d940b3dfee2419e0bb24a51 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Fri, 27 Jan 2017 12:27:46 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: fix handling firmware results for wowl netdetect | ||||||
|  |  | ||||||
|  | For wowl netdetect the event data changed for newer chips. This | ||||||
|  | was recently fixed for scheduled scan, but same change is needed | ||||||
|  | for wowl netdetect. Removing now pointles += operation from both | ||||||
|  | result handlers. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 +--- | ||||||
|  |  1 file changed, 1 insertion(+), 3 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -3328,7 +3328,6 @@ brcmf_notify_sched_scan_results(struct b | ||||||
|  |  		goto out_err; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	data += sizeof(struct brcmf_pno_scanresults_le); | ||||||
|  |  	netinfo_start = brcmf_get_netinfo_array(pfn_result); | ||||||
|  |   | ||||||
|  |  	for (i = 0; i < result_count; i++) { | ||||||
|  | @@ -3476,8 +3475,7 @@ brcmf_wowl_nd_results(struct brcmf_if *i | ||||||
|  |  		return -EINVAL; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	data += sizeof(struct brcmf_pno_scanresults_le); | ||||||
|  | -	netinfo = (struct brcmf_pno_net_info_le *)data; | ||||||
|  | +	netinfo = brcmf_get_netinfo_array(pfn_result); | ||||||
|  |  	memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len); | ||||||
|  |  	cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len; | ||||||
|  |  	cfg->wowl.nd->n_channels = 1; | ||||||
| @@ -0,0 +1,78 @@ | |||||||
|  | From 0b57010fc18e12c19d14379cd739d4eb7c3898f3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Date: Fri, 27 Jan 2017 12:27:47 +0000 | ||||||
|  | Subject: [PATCH] brcmfmac: allow wowlan support to be per device | ||||||
|  |  | ||||||
|  | The wowlan support is (partially) determined dynamic by checking the | ||||||
|  | device/firmware capabilities. So they can differ per device. So it | ||||||
|  | is not possible to use a static global. Instead use the global as a | ||||||
|  | template and use kmemdup(). When kmemdup() fails the template is used | ||||||
|  | unmodified. | ||||||
|  |  | ||||||
|  | Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||||
|  | Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||||
|  | Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||||
|  | Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 ++++++++++++++++------ | ||||||
|  |  1 file changed, 19 insertions(+), 7 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
|  | @@ -6337,7 +6337,7 @@ static void brcmf_wiphy_pno_params(struc | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  #ifdef CONFIG_PM | ||||||
|  | -static struct wiphy_wowlan_support brcmf_wowlan_support = { | ||||||
|  | +static const struct wiphy_wowlan_support brcmf_wowlan_support = { | ||||||
|  |  	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT, | ||||||
|  |  	.n_patterns = BRCMF_WOWL_MAXPATTERNS, | ||||||
|  |  	.pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE, | ||||||
|  | @@ -6350,21 +6350,29 @@ static void brcmf_wiphy_wowl_params(stru | ||||||
|  |  { | ||||||
|  |  #ifdef CONFIG_PM | ||||||
|  |  	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); | ||||||
|  | +	struct wiphy_wowlan_support *wowl; | ||||||
|  | + | ||||||
|  | +	wowl = kmemdup(&brcmf_wowlan_support, sizeof(brcmf_wowlan_support), | ||||||
|  | +		       GFP_KERNEL); | ||||||
|  | +	if (!wowl) { | ||||||
|  | +		brcmf_err("only support basic wowlan features\n"); | ||||||
|  | +		wiphy->wowlan = &brcmf_wowlan_support; | ||||||
|  | +		return; | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  |  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) { | ||||||
|  |  		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) { | ||||||
|  | -			brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT; | ||||||
|  | -			brcmf_wowlan_support.max_nd_match_sets = | ||||||
|  | -				BRCMF_PNO_MAX_PFN_COUNT; | ||||||
|  | +			wowl->flags |= WIPHY_WOWLAN_NET_DETECT; | ||||||
|  | +			wowl->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT; | ||||||
|  |  			init_waitqueue_head(&cfg->wowl.nd_data_wait); | ||||||
|  |  		} | ||||||
|  |  	} | ||||||
|  |  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) { | ||||||
|  | -		brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY; | ||||||
|  | -		brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE; | ||||||
|  | +		wowl->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY; | ||||||
|  | +		wowl->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	wiphy->wowlan = &brcmf_wowlan_support; | ||||||
|  | +	wiphy->wowlan = wowl; | ||||||
|  |  #endif | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -6745,6 +6753,10 @@ static void brcmf_free_wiphy(struct wiph | ||||||
|  |  		kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels); | ||||||
|  |  		kfree(wiphy->bands[NL80211_BAND_5GHZ]); | ||||||
|  |  	} | ||||||
|  | +#if IS_ENABLED(CONFIG_PM) | ||||||
|  | +	if (wiphy->wowlan != &brcmf_wowlan_support) | ||||||
|  | +		kfree(wiphy->wowlan); | ||||||
|  | +#endif | ||||||
|  |  	wiphy_free(wiphy); | ||||||
|  |  } | ||||||
|  |   | ||||||
| @@ -0,0 +1,55 @@ | |||||||
|  | From f4737a62033d7f3e0db740c449fc62119da7ab8a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Mon, 30 Jan 2017 16:09:51 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: check brcmf_bus_get_memdump result for error | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | This method may be unsupported (see: USB bus) or may just fail (see: | ||||||
|  | SDIO bus). | ||||||
|  | While at it rework logic in brcmf_sdio_bus_get_memdump function to avoid | ||||||
|  | too many conditional code nesting levels. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  .../wireless/broadcom/brcm80211/brcmfmac/debug.c   | 23 +++++++++++++++------- | ||||||
|  |  1 file changed, 16 insertions(+), 7 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c | ||||||
|  | @@ -32,16 +32,25 @@ static int brcmf_debug_create_memdump(st | ||||||
|  |  { | ||||||
|  |  	void *dump; | ||||||
|  |  	size_t ramsize; | ||||||
|  | +	int err; | ||||||
|  |   | ||||||
|  |  	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); | ||||||
|  | +	if (!ramsize) | ||||||
|  | +		return -ENOTSUPP; | ||||||
|  | + | ||||||
|  | +	dump = vzalloc(len + ramsize); | ||||||
|  | +	if (!dump) | ||||||
|  | +		return -ENOMEM; | ||||||
|  | + | ||||||
|  | +	memcpy(dump, data, len); | ||||||
|  | +	err = brcmf_bus_get_memdump(bus, dump + len, ramsize); | ||||||
|  | +	if (err) { | ||||||
|  | +		vfree(dump); | ||||||
|  | +		return err; | ||||||
|  |  	} | ||||||
|  | + | ||||||
|  | +	dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); | ||||||
|  | + | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
| @@ -0,0 +1,41 @@ | |||||||
|  | From 36401cb7ffae731295a6dd1ce2b40d7ad74245f4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||||
|  | Date: Mon, 30 Jan 2017 16:09:52 +0100 | ||||||
|  | Subject: [PATCH] brcmfmac: be more verbose when PSM's watchdog fires | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | It's important to inform user so he knows things went wrong. He may also | ||||||
|  | want to get memory dump for further debugging purposes. | ||||||
|  |  | ||||||
|  | Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||||
|  | Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||||
|  | Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||||
|  | --- | ||||||
|  |  drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c | 12 ++++++++++-- | ||||||
|  |  1 file changed, 10 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c | ||||||
|  | @@ -58,10 +58,18 @@ static int brcmf_debug_psm_watchdog_noti | ||||||
|  |  					   const struct brcmf_event_msg *evtmsg, | ||||||
|  |  					   void *data) | ||||||
|  |  { | ||||||
|  | +	int err; | ||||||
|  | + | ||||||
|  |  	brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx); | ||||||
|  |   | ||||||
|  | -	return brcmf_debug_create_memdump(ifp->drvr->bus_if, data, | ||||||
|  | -					  evtmsg->datalen); | ||||||
|  | +	brcmf_err("PSM's watchdog has fired!\n"); | ||||||
|  | + | ||||||
|  | +	err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data, | ||||||
|  | +					 evtmsg->datalen); | ||||||
|  | +	if (err) | ||||||
|  | +		brcmf_err("Failed to get memory dump, %d\n", err); | ||||||
|  | + | ||||||
|  | +	return err; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  void brcmf_debugfs_init(void) | ||||||
| @@ -0,0 +1,107 @@ | |||||||
|  | From: Felix Fietkau <nbd@nbd.name> | ||||||
|  | Date: Sun, 12 Feb 2017 13:13:05 +0100 | ||||||
|  | Subject: [PATCH] ath9k: clean up and fix ath_tx_count_airtime | ||||||
|  |  | ||||||
|  | ath_tx_count_airtime is doing a lot of unnecessary work: | ||||||
|  |  | ||||||
|  | - Redundant station lookup | ||||||
|  | - Redundant rcu_read_lock/unlock | ||||||
|  | - Useless memcpy of bf->rates | ||||||
|  | - Useless NULL check of bf->bf_mpdu | ||||||
|  | - Redundant lookup of the skb tid | ||||||
|  |  | ||||||
|  | Additionally, it tries to look up the mac80211 queue index from the txq, | ||||||
|  | which fails if the frame was delivered via the power save queue. | ||||||
|  |  | ||||||
|  | This patch fixes all of these issues by passing down the right set of | ||||||
|  | pointers instead of doing extra work | ||||||
|  |  | ||||||
|  | Cc: stable@vger.kernel.org | ||||||
|  | Fixes: 63fefa050477 ("ath9k: Introduce airtime fairness scheduling between stations") | ||||||
|  | Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
|  | @@ -723,51 +723,31 @@ static bool bf_is_ampdu_not_probing(stru | ||||||
|  |      return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_txq *txq, | ||||||
|  | -				 struct ath_buf *bf, struct ath_tx_status *ts) | ||||||
|  | +static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_node *an, | ||||||
|  | +				 struct ath_atx_tid *tid, struct ath_buf *bf, | ||||||
|  | +				 struct ath_tx_status *ts) | ||||||
|  |  { | ||||||
|  | -	struct ath_node *an; | ||||||
|  | -	struct ath_acq *acq = &sc->cur_chan->acq[txq->mac80211_qnum]; | ||||||
|  | -	struct sk_buff *skb; | ||||||
|  | -	struct ieee80211_hdr *hdr; | ||||||
|  | -	struct ieee80211_hw *hw = sc->hw; | ||||||
|  | -	struct ieee80211_tx_rate rates[4]; | ||||||
|  | -	struct ieee80211_sta *sta; | ||||||
|  | -	int i; | ||||||
|  | +	struct ath_txq *txq = tid->txq; | ||||||
|  |  	u32 airtime = 0; | ||||||
|  | - | ||||||
|  | -	skb = bf->bf_mpdu; | ||||||
|  | -	if(!skb) | ||||||
|  | -		return; | ||||||
|  | - | ||||||
|  | -	hdr = (struct ieee80211_hdr *)skb->data; | ||||||
|  | -	memcpy(rates, bf->rates, sizeof(rates)); | ||||||
|  | - | ||||||
|  | -	rcu_read_lock(); | ||||||
|  | - | ||||||
|  | -	sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); | ||||||
|  | -	if(!sta) | ||||||
|  | -		goto exit; | ||||||
|  | - | ||||||
|  | - | ||||||
|  | -	an = (struct ath_node *) sta->drv_priv; | ||||||
|  | +	int i; | ||||||
|  |   | ||||||
|  |  	airtime += ts->duration * (ts->ts_longretry + 1); | ||||||
|  | +	for(i = 0; i < ts->ts_rateindex; i++) { | ||||||
|  | +		int rate_dur = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i); | ||||||
|  | +		airtime += rate_dur * bf->rates[i].count; | ||||||
|  | +	} | ||||||
|  |   | ||||||
|  | -	for(i=0; i < ts->ts_rateindex; i++) | ||||||
|  | -		airtime += ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i) * rates[i].count; | ||||||
|  | +	if (sc->airtime_flags & AIRTIME_USE_TX) { | ||||||
|  | +		int q = txq->mac80211_qnum; | ||||||
|  | +		struct ath_acq *acq = &sc->cur_chan->acq[q]; | ||||||
|  |   | ||||||
|  | -	if (!!(sc->airtime_flags & AIRTIME_USE_TX)) { | ||||||
|  |  		spin_lock_bh(&acq->lock); | ||||||
|  | -		an->airtime_deficit[txq->mac80211_qnum] -= airtime; | ||||||
|  | -		if (an->airtime_deficit[txq->mac80211_qnum] <= 0) | ||||||
|  | -			__ath_tx_queue_tid(sc, ath_get_skb_tid(sc, an, skb)); | ||||||
|  | +		an->airtime_deficit[q] -= airtime; | ||||||
|  | +		if (an->airtime_deficit[q] <= 0) | ||||||
|  | +			__ath_tx_queue_tid(sc, tid); | ||||||
|  |  		spin_unlock_bh(&acq->lock); | ||||||
|  |  	} | ||||||
|  |  	ath_debug_airtime(sc, an, 0, airtime); | ||||||
|  | - | ||||||
|  | -exit: | ||||||
|  | -	rcu_read_unlock(); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, | ||||||
|  | @@ -791,13 +771,13 @@ static void ath_tx_process_buffer(struct | ||||||
|  |   | ||||||
|  |  	ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, | ||||||
|  |  					     ts->ts_rateindex); | ||||||
|  | -	ath_tx_count_airtime(sc, txq, bf, ts); | ||||||
|  |   | ||||||
|  |  	hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; | ||||||
|  |  	sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); | ||||||
|  |  	if (sta) { | ||||||
|  |  		struct ath_node *an = (struct ath_node *)sta->drv_priv; | ||||||
|  |  		tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); | ||||||
|  | +		ath_tx_count_airtime(sc, an, tid, bf, ts); | ||||||
|  |  		if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) | ||||||
|  |  			tid->clear_ps_filter = true; | ||||||
|  |  	} | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/drivers/net/wireless/ath/ath9k/init.c | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/init.c | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
| @@ -773,6 +773,7 @@ static const struct ieee80211_iface_limi | @@ -777,6 +777,7 @@ static const struct ieee80211_iface_limi | ||||||
|  				 BIT(NL80211_IFTYPE_AP) }, |  				 BIT(NL80211_IFTYPE_AP) }, | ||||||
|  	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) | |  	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) | | ||||||
|  				 BIT(NL80211_IFTYPE_P2P_GO) }, |  				 BIT(NL80211_IFTYPE_P2P_GO) }, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/drivers/net/wireless/ath/ath9k/init.c | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/init.c | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
| @@ -1076,23 +1076,23 @@ static int __init ath9k_init(void) | @@ -1080,23 +1080,23 @@ static int __init ath9k_init(void) | ||||||
|  { |  { | ||||||
|  	int error; |  	int error; | ||||||
|   |   | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/drivers/net/wireless/ath/ath9k/ath9k.h | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
| @@ -827,6 +827,9 @@ static inline int ath9k_dump_btcoex(stru | @@ -850,6 +850,9 @@ static inline int ath9k_dump_btcoex(stru | ||||||
|  #ifdef CPTCFG_MAC80211_LEDS |  #ifdef CPTCFG_MAC80211_LEDS | ||||||
|  void ath_init_leds(struct ath_softc *sc); |  void ath_init_leds(struct ath_softc *sc); | ||||||
|  void ath_deinit_leds(struct ath_softc *sc); |  void ath_deinit_leds(struct ath_softc *sc); | ||||||
| @@ -10,9 +10,9 @@ | |||||||
|  #else |  #else | ||||||
|  static inline void ath_init_leds(struct ath_softc *sc) |  static inline void ath_init_leds(struct ath_softc *sc) | ||||||
|  { |  { | ||||||
| @@ -963,6 +966,13 @@ void ath_ant_comb_scan(struct ath_softc | @@ -991,6 +994,13 @@ void ath_ant_comb_scan(struct ath_softc | ||||||
|   |  #define AIRTIME_USE_NEW_QUEUES	BIT(2) | ||||||
|  #define ATH9K_NUM_CHANCTX  2 /* supports 2 operating channels */ |  #define AIRTIME_ACTIVE(flags) (!!(flags & (AIRTIME_USE_TX|AIRTIME_USE_RX))) | ||||||
|   |   | ||||||
| +struct ath_led { | +struct ath_led { | ||||||
| +	struct list_head list; | +	struct list_head list; | ||||||
| @@ -24,7 +24,7 @@ | |||||||
|  struct ath_softc { |  struct ath_softc { | ||||||
|  	struct ieee80211_hw *hw; |  	struct ieee80211_hw *hw; | ||||||
|  	struct device *dev; |  	struct device *dev; | ||||||
| @@ -1015,9 +1025,8 @@ struct ath_softc { | @@ -1046,9 +1056,8 @@ struct ath_softc { | ||||||
|  	spinlock_t chan_lock; |  	spinlock_t chan_lock; | ||||||
|   |   | ||||||
|  #ifdef CPTCFG_MAC80211_LEDS |  #ifdef CPTCFG_MAC80211_LEDS | ||||||
| @@ -181,7 +181,7 @@ | |||||||
|   |   | ||||||
| --- a/drivers/net/wireless/ath/ath9k/init.c | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/init.c | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
| @@ -988,7 +988,7 @@ int ath9k_init_device(u16 devid, struct | @@ -992,7 +992,7 @@ int ath9k_init_device(u16 devid, struct | ||||||
|   |   | ||||||
|  #ifdef CPTCFG_MAC80211_LEDS |  #ifdef CPTCFG_MAC80211_LEDS | ||||||
|  	/* must be initialized before ieee80211_register_hw */ |  	/* must be initialized before ieee80211_register_hw */ | ||||||
|   | |||||||
| @@ -94,7 +94,7 @@ | |||||||
|  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, |  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, | ||||||
| --- a/drivers/net/wireless/ath/ath9k/hw.c | --- a/drivers/net/wireless/ath/ath9k/hw.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/hw.c | +++ b/drivers/net/wireless/ath/ath9k/hw.c | ||||||
| @@ -1838,6 +1838,20 @@ u32 ath9k_hw_get_tsf_offset(struct times | @@ -1842,6 +1842,20 @@ u32 ath9k_hw_get_tsf_offset(struct times | ||||||
|  } |  } | ||||||
|  EXPORT_SYMBOL(ath9k_hw_get_tsf_offset); |  EXPORT_SYMBOL(ath9k_hw_get_tsf_offset); | ||||||
|   |   | ||||||
| @@ -115,7 +115,7 @@ | |||||||
|  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, |  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | ||||||
|  		   struct ath9k_hw_cal_data *caldata, bool fastcc) |  		   struct ath9k_hw_cal_data *caldata, bool fastcc) | ||||||
|  { |  { | ||||||
| @@ -2046,6 +2060,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st | @@ -2050,6 +2064,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st | ||||||
|  		ar9003_hw_disable_phy_restart(ah); |  		ar9003_hw_disable_phy_restart(ah); | ||||||
|   |   | ||||||
|  	ath9k_hw_apply_gpio_override(ah); |  	ath9k_hw_apply_gpio_override(ah); | ||||||
| @@ -125,7 +125,7 @@ | |||||||
|  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); |  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); | ||||||
| --- a/drivers/net/wireless/ath/ath9k/main.c | --- a/drivers/net/wireless/ath/ath9k/main.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/main.c | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||||||
| @@ -533,6 +533,11 @@ irqreturn_t ath_isr(int irq, void *dev) | @@ -527,6 +527,11 @@ irqreturn_t ath_isr(int irq, void *dev) | ||||||
|  	if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) |  	if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) | ||||||
|  		return IRQ_HANDLED; |  		return IRQ_HANDLED; | ||||||
|   |   | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ | |||||||
|  	ops->spectral_scan_config = ar9003_hw_spectral_scan_config; |  	ops->spectral_scan_config = ar9003_hw_spectral_scan_config; | ||||||
| --- a/drivers/net/wireless/ath/ath9k/init.c | --- a/drivers/net/wireless/ath/ath9k/init.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/init.c | +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||||
| @@ -761,7 +761,8 @@ static void ath9k_init_txpower_limits(st | @@ -765,7 +765,8 @@ static void ath9k_init_txpower_limits(st | ||||||
|  	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) |  	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) | ||||||
|  		ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ); |  		ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ); | ||||||
|   |   | ||||||
| @@ -65,7 +65,7 @@ | |||||||
|  } |  } | ||||||
|   |   | ||||||
|  static const struct ieee80211_iface_limit if_limits[] = { |  static const struct ieee80211_iface_limit if_limits[] = { | ||||||
| @@ -948,6 +949,18 @@ static void ath9k_set_hw_capab(struct at | @@ -952,6 +953,18 @@ static void ath9k_set_hw_capab(struct at | ||||||
|  	SET_IEEE80211_PERM_ADDR(hw, common->macaddr); |  	SET_IEEE80211_PERM_ADDR(hw, common->macaddr); | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -84,7 +84,7 @@ | |||||||
|  int ath9k_init_device(u16 devid, struct ath_softc *sc, |  int ath9k_init_device(u16 devid, struct ath_softc *sc, | ||||||
|  		    const struct ath_bus_ops *bus_ops) |  		    const struct ath_bus_ops *bus_ops) | ||||||
|  { |  { | ||||||
| @@ -993,6 +1006,8 @@ int ath9k_init_device(u16 devid, struct | @@ -997,6 +1010,8 @@ int ath9k_init_device(u16 devid, struct | ||||||
|  		ARRAY_SIZE(ath9k_tpt_blink)); |  		ARRAY_SIZE(ath9k_tpt_blink)); | ||||||
|  #endif |  #endif | ||||||
|   |   | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ | |||||||
|  	return true; |  	return true; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -1816,8 +1835,14 @@ static int ath9k_hw_do_fastcc(struct ath | @@ -1820,8 +1839,14 @@ static int ath9k_hw_do_fastcc(struct ath | ||||||
|  	if (AR_SREV_9271(ah)) |  	if (AR_SREV_9271(ah)) | ||||||
|  		ar9002_hw_load_ani_reg(ah, chan); |  		ar9002_hw_load_ani_reg(ah, chan); | ||||||
|   |   | ||||||
| @@ -55,7 +55,7 @@ | |||||||
|  	return -EINVAL; |  	return -EINVAL; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -2071,6 +2096,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st | @@ -2075,6 +2100,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st | ||||||
|  		ath9k_hw_set_radar_params(ah); |  		ath9k_hw_set_radar_params(ah); | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
|  #include "common.h" |  #include "common.h" | ||||||
|  #include "debug.h" |  #include "debug.h" | ||||||
| @@ -973,6 +974,14 @@ struct ath_led { | @@ -1001,6 +1002,14 @@ struct ath_led { | ||||||
|  	struct led_classdev cdev; |  	struct led_classdev cdev; | ||||||
|  }; |  }; | ||||||
|   |   | ||||||
| @@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  struct ath_softc { |  struct ath_softc { | ||||||
|  	struct ieee80211_hw *hw; |  	struct ieee80211_hw *hw; | ||||||
|  	struct device *dev; |  	struct device *dev; | ||||||
| @@ -1027,6 +1036,9 @@ struct ath_softc { | @@ -1058,6 +1067,9 @@ struct ath_softc { | ||||||
|  #ifdef CPTCFG_MAC80211_LEDS |  #ifdef CPTCFG_MAC80211_LEDS | ||||||
|  	const char *led_default_trigger; |  	const char *led_default_trigger; | ||||||
|  	struct list_head leds; |  	struct list_head leds; | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| --- | --- | ||||||
| --- a/drivers/net/wireless/ath/ath9k/ath9k.h | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||||||
| @@ -1038,6 +1038,7 @@ struct ath_softc { | @@ -1069,6 +1069,7 @@ struct ath_softc { | ||||||
|  	struct list_head leds; |  	struct list_head leds; | ||||||
|  #ifdef CONFIG_GPIOLIB |  #ifdef CONFIG_GPIOLIB | ||||||
|  	struct ath9k_gpio_chip *gpiochip; |  	struct ath9k_gpio_chip *gpiochip; | ||||||
|   | |||||||
| @@ -329,7 +329,7 @@ Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> | |||||||
|  					       &ratesArray[0], cfgCtl, |  					       &ratesArray[0], cfgCtl, | ||||||
| --- a/drivers/net/wireless/ath/ath9k/xmit.c | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
| +++ b/drivers/net/wireless/ath/ath9k/xmit.c | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||||||
| @@ -1177,8 +1177,9 @@ static u8 ath_get_rate_txpower(struct at | @@ -1216,8 +1216,9 @@ static u8 ath_get_rate_txpower(struct at | ||||||
|  		if (is_40) { |  		if (is_40) { | ||||||
|  			u8 power_ht40delta; |  			u8 power_ht40delta; | ||||||
|  			struct ar5416_eeprom_def *eep = &ah->eeprom.def; |  			struct ar5416_eeprom_def *eep = &ah->eeprom.def; | ||||||
|   | |||||||
| @@ -343,7 +343,7 @@ | |||||||
|   |   | ||||||
|  u8 ath9k_parse_mpdudensity(u8 mpdudensity) |  u8 ath9k_parse_mpdudensity(u8 mpdudensity) | ||||||
|  { |  { | ||||||
| @@ -652,6 +654,7 @@ void ath_reset_work(struct work_struct * | @@ -648,6 +650,7 @@ void ath_reset_work(struct work_struct * | ||||||
|  static int ath9k_start(struct ieee80211_hw *hw) |  static int ath9k_start(struct ieee80211_hw *hw) | ||||||
|  { |  { | ||||||
|  	struct ath_softc *sc = hw->priv; |  	struct ath_softc *sc = hw->priv; | ||||||
| @@ -351,7 +351,7 @@ | |||||||
|  	struct ath_hw *ah = sc->sc_ah; |  	struct ath_hw *ah = sc->sc_ah; | ||||||
|  	struct ath_common *common = ath9k_hw_common(ah); |  	struct ath_common *common = ath9k_hw_common(ah); | ||||||
|  	struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan; |  	struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan; | ||||||
| @@ -730,6 +733,11 @@ static int ath9k_start(struct ieee80211_ | @@ -726,6 +729,11 @@ static int ath9k_start(struct ieee80211_ | ||||||
|  					  AR_GPIO_OUTPUT_MUX_AS_OUTPUT); |  					  AR_GPIO_OUTPUT_MUX_AS_OUTPUT); | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | |||||||
| 
 | 
 | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||||
| @@ -5974,6 +5974,9 @@ static int brcmf_construct_chaninfo(stru
 | @@ -5882,6 +5882,9 @@ static int brcmf_construct_chaninfo(stru
 | ||||||
|  			continue; |  			continue; | ||||||
|  		} |  		} | ||||||
|   |   | ||||||
| @@ -19,7 +19,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | |||||||
|  		/* assuming the chanspecs order is HT20, |  		/* assuming the chanspecs order is HT20, | ||||||
|  		 * HT40 upper, HT40 lower, and VHT80. |  		 * HT40 upper, HT40 lower, and VHT80. | ||||||
|  		 */ |  		 */ | ||||||
| @@ -6564,6 +6567,9 @@ static int brcmf_setup_wiphy(struct wiph
 | @@ -6483,6 +6486,9 @@ static int brcmf_setup_wiphy(struct wiph
 | ||||||
|  			wiphy->bands[NL80211_BAND_5GHZ] = band; |  			wiphy->bands[NL80211_BAND_5GHZ] = band; | ||||||
|  		} |  		} | ||||||
|  	} |  	} | ||||||
| @@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com> | |||||||
|  |  | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||||
| @@ -1200,6 +1200,7 @@ int __init brcmf_core_init(void) | @@ -1196,6 +1196,7 @@ int __init brcmf_core_init(void) | ||||||
|  { |  { | ||||||
|  	if (!schedule_work(&brcmf_driver_work)) |  	if (!schedule_work(&brcmf_driver_work)) | ||||||
|  		return -EBUSY; |  		return -EBUSY; | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com> | |||||||
|  |  | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
| @@ -663,9 +663,37 @@ static struct wireless_dev *brcmf_cfg802 | @@ -654,9 +654,37 @@ static struct wireless_dev *brcmf_cfg802 | ||||||
|  						     u32 *flags, |  						     u32 *flags, | ||||||
|  						     struct vif_params *params) |  						     struct vif_params *params) | ||||||
|  { |  { | ||||||
|   | |||||||
| @@ -14,12 +14,12 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org> | |||||||
|  |  | ||||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||||||
| @@ -2782,6 +2782,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip | @@ -2773,6 +2773,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip | ||||||
|  	 * preference in cfg struct to apply this to |  	 * preference in cfg struct to apply this to | ||||||
|  	 * FW later while initializing the dongle |  	 * FW later while initializing the dongle | ||||||
|  	 */ |  	 */ | ||||||
| +#if defined(CONFIG_BCM2708) || defined(CONFIG_BCM2709) | +#if defined(CONFIG_ARCH_BCM2708) || defined(CONFIG_ARCH_BCM2709) | ||||||
| +	pr_info("power management disabled\n"); | +	brcmf_dbg(INFO, "power management disabled\n"); | ||||||
| +	enabled = false; | +	enabled = false; | ||||||
| +#endif | +#endif | ||||||
|  	cfg->pwr_save = enabled; |  	cfg->pwr_save = enabled; | ||||||
|   | |||||||
| @@ -24,8 +24,8 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | |||||||
| +		{ "JP", "JP", 78 }, | +		{ "JP", "JP", 78 }, | ||||||
| +		{ "US", "Q2", 86 }, | +		{ "US", "Q2", 86 }, | ||||||
| +	}; | +	}; | ||||||
| +	struct brcmfmac_pd_cc_entry *cc_ent; | +	struct brcmfmac_pd_cc_entry *cc_ent = NULL; | ||||||
| +	int table_size; | +	int table_size = 0; | ||||||
| + | + | ||||||
| +	if (of_machine_is_compatible("netgear,r8000")) { | +	if (of_machine_is_compatible("netgear,r8000")) { | ||||||
| +		cc_ent = netgear_r8000_cc_ent; | +		cc_ent = netgear_r8000_cc_ent; | ||||||
|   | |||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | brcmfmac: do not use internal roaming engine by default | ||||||
|  |  | ||||||
|  | Some evidence of curing disconnects with this disabled, so make it a default. | ||||||
|  | Can be overridden with module parameter roamoff=0 | ||||||
|  | See: http://projectable.me/optimize-my-pi-wi-fi/ | ||||||
|  |  | ||||||
|  | Signed-off-by: Phil Elwell <phil@raspberrypi.org> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||||||
|  | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | ||||||
|  | @@ -69,7 +69,11 @@ static int brcmf_fcmode; | ||||||
|  |  module_param_named(fcmode, brcmf_fcmode, int, 0); | ||||||
|  |  MODULE_PARM_DESC(fcmode, "Mode of firmware signalled flow control"); | ||||||
|  |   | ||||||
|  | +#if defined(CONFIG_ARCH_BCM2708) || defined(CONFIG_ARCH_BCM2709) | ||||||
|  | +static int brcmf_roamoff = 1; | ||||||
|  | +#else | ||||||
|  |  static int brcmf_roamoff; | ||||||
|  | +#endif | ||||||
|  |  module_param_named(roamoff, brcmf_roamoff, int, S_IRUSR); | ||||||
|  |  MODULE_PARM_DESC(roamoff, "Do not use internal roaming engine"); | ||||||
|  |   | ||||||
| @@ -91,7 +91,8 @@ | |||||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, word); | +			rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, word); | ||||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 1); | +			rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 1); | ||||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_BUSY_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); | +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); | ||||||
| +		} | +		} | ||||||
| +		break; | +		break; | ||||||
| @@ -103,8 +104,7 @@ | |||||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); | +			rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); | ||||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); | +			rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); | ||||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 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); | +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); | ||||||
| +		} | +		} | ||||||
| +		break; | +		break; | ||||||
| @@ -523,7 +523,7 @@ | |||||||
|  static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, |  static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, | ||||||
|  					   const unsigned int word, |  					   const unsigned int word, | ||||||
|  					   const u8 value) |  					   const u8 value) | ||||||
| @@ -3459,7 +3838,7 @@ static void rt2800_config_channel(struct | @@ -3459,7 +3844,7 @@ static void rt2800_config_channel(struct | ||||||
|  				  struct channel_info *info) |  				  struct channel_info *info) | ||||||
|  { |  { | ||||||
|  	u32 reg; |  	u32 reg; | ||||||
| @@ -532,7 +532,7 @@ | |||||||
|  	u8 bbp, rfcsr; |  	u8 bbp, rfcsr; | ||||||
|   |   | ||||||
|  	info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel, |  	info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel, | ||||||
| @@ -3513,6 +3892,9 @@ static void rt2800_config_channel(struct | @@ -3513,6 +3898,9 @@ static void rt2800_config_channel(struct | ||||||
|  	case RF5592: |  	case RF5592: | ||||||
|  		rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info); |  		rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info); | ||||||
|  		break; |  		break; | ||||||
| @@ -542,7 +542,7 @@ | |||||||
|  	default: |  	default: | ||||||
|  		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info); |  		rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info); | ||||||
|  	} |  	} | ||||||
| @@ -3615,7 +3997,7 @@ static void rt2800_config_channel(struct | @@ -3615,7 +4003,7 @@ static void rt2800_config_channel(struct | ||||||
|  		else if (rt2x00_rt(rt2x00dev, RT3593) || |  		else if (rt2x00_rt(rt2x00dev, RT3593) || | ||||||
|  			 rt2x00_rt(rt2x00dev, RT3883)) |  			 rt2x00_rt(rt2x00dev, RT3883)) | ||||||
|  			rt2800_bbp_write(rt2x00dev, 82, 0x82); |  			rt2800_bbp_write(rt2x00dev, 82, 0x82); | ||||||
| @@ -551,7 +551,7 @@ | |||||||
|  			rt2800_bbp_write(rt2x00dev, 82, 0xf2); |  			rt2800_bbp_write(rt2x00dev, 82, 0xf2); | ||||||
|   |   | ||||||
|  		if (rt2x00_rt(rt2x00dev, RT3593) || |  		if (rt2x00_rt(rt2x00dev, RT3593) || | ||||||
| @@ -3637,7 +4019,7 @@ static void rt2800_config_channel(struct | @@ -3637,7 +4025,7 @@ static void rt2800_config_channel(struct | ||||||
|  	if (rt2x00_rt(rt2x00dev, RT3572)) |  	if (rt2x00_rt(rt2x00dev, RT3572)) | ||||||
|  		rt2800_rfcsr_write(rt2x00dev, 8, 0); |  		rt2800_rfcsr_write(rt2x00dev, 8, 0); | ||||||
|   |   | ||||||
| @@ -560,7 +560,7 @@ | |||||||
|   |   | ||||||
|  	switch (rt2x00dev->default_ant.tx_chain_num) { |  	switch (rt2x00dev->default_ant.tx_chain_num) { | ||||||
|  	case 3: |  	case 3: | ||||||
| @@ -3686,6 +4068,7 @@ static void rt2800_config_channel(struct | @@ -3686,6 +4074,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_RFTR_EN, 1); | ||||||
|  	rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_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); |  	rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); | ||||||
|   |   | ||||||
| @@ -4702,6 +5085,14 @@ void rt2800_vco_calibration(struct rt2x0 | @@ -4702,6 +5091,14 @@ void rt2800_vco_calibration(struct rt2x0 | ||||||
|  		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); |  		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); | ||||||
|  		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); |  		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); | ||||||
|  		break; |  		break; | ||||||
| @@ -583,7 +583,7 @@ | |||||||
|  	default: |  	default: | ||||||
|  		return; |  		return; | ||||||
|  	} |  	} | ||||||
| @@ -5102,9 +5493,42 @@ static int rt2800_init_registers(struct | @@ -5102,9 +5499,42 @@ static int rt2800_init_registers(struct | ||||||
|  	} else if (rt2x00_rt(rt2x00dev, RT5390) || |  	} else if (rt2x00_rt(rt2x00dev, RT5390) || | ||||||
|  		   rt2x00_rt(rt2x00dev, RT5392) || |  		   rt2x00_rt(rt2x00dev, RT5392) || | ||||||
|  		   rt2x00_rt(rt2x00dev, RT5592)) { |  		   rt2x00_rt(rt2x00dev, RT5592)) { | ||||||
| @@ -629,7 +629,7 @@ | |||||||
|  	} else if (rt2x00_rt(rt2x00dev, RT5350)) { |  	} else if (rt2x00_rt(rt2x00dev, RT5350)) { | ||||||
|  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); |  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); | ||||||
|  	} else { |  	} else { | ||||||
| @@ -6136,6 +6560,225 @@ static void rt2800_init_bbp_5592(struct | @@ -6136,6 +6566,225 @@ static void rt2800_init_bbp_5592(struct | ||||||
|  		rt2800_bbp_write(rt2x00dev, 103, 0xc0); |  		rt2800_bbp_write(rt2x00dev, 103, 0xc0); | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -855,7 +855,7 @@ | |||||||
|  static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) |  static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) | ||||||
|  { |  { | ||||||
|  	unsigned int i; |  	unsigned int i; | ||||||
| @@ -6178,7 +6821,10 @@ static void rt2800_init_bbp(struct rt2x0 | @@ -6178,7 +6827,10 @@ static void rt2800_init_bbp(struct rt2x0 | ||||||
|  		return; |  		return; | ||||||
|  	case RT5390: |  	case RT5390: | ||||||
|  	case RT5392: |  	case RT5392: | ||||||
| @@ -867,7 +867,7 @@ | |||||||
|  		break; |  		break; | ||||||
|  	case RT5592: |  	case RT5592: | ||||||
|  		rt2800_init_bbp_5592(rt2x00dev); |  		rt2800_init_bbp_5592(rt2x00dev); | ||||||
| @@ -7392,6 +8038,296 @@ static void rt2800_init_rfcsr_5592(struc | @@ -7392,6 +8044,296 @@ static void rt2800_init_rfcsr_5592(struc | ||||||
|  	rt2800_led_open_drain_enable(rt2x00dev); |  	rt2800_led_open_drain_enable(rt2x00dev); | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -1164,7 +1164,7 @@ | |||||||
|  static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) |  static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) | ||||||
|  { |  { | ||||||
|  	if (rt2800_is_305x_soc(rt2x00dev)) { |  	if (rt2800_is_305x_soc(rt2x00dev)) { | ||||||
| @@ -7427,7 +8363,10 @@ static void rt2800_init_rfcsr(struct rt2 | @@ -7427,7 +8369,10 @@ static void rt2800_init_rfcsr(struct rt2 | ||||||
|  		rt2800_init_rfcsr_5350(rt2x00dev); |  		rt2800_init_rfcsr_5350(rt2x00dev); | ||||||
|  		break; |  		break; | ||||||
|  	case RT5390: |  	case RT5390: | ||||||
| @@ -1176,7 +1176,7 @@ | |||||||
|  		break; |  		break; | ||||||
|  	case RT5392: |  	case RT5392: | ||||||
|  		rt2800_init_rfcsr_5392(rt2x00dev); |  		rt2800_init_rfcsr_5392(rt2x00dev); | ||||||
| @@ -7856,6 +8795,7 @@ static int rt2800_init_eeprom(struct rt2 | @@ -7856,6 +8801,7 @@ static int rt2800_init_eeprom(struct rt2 | ||||||
|  	case RF5390: |  	case RF5390: | ||||||
|  	case RF5392: |  	case RF5392: | ||||||
|  	case RF5592: |  	case RF5592: | ||||||
| @@ -1184,7 +1184,7 @@ | |||||||
|  		break; |  		break; | ||||||
|  	default: |  	default: | ||||||
|  		rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n", |  		rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n", | ||||||
| @@ -8424,6 +9364,7 @@ static int rt2800_probe_hw_mode(struct r | @@ -8424,6 +9370,7 @@ static int rt2800_probe_hw_mode(struct r | ||||||
|  	case RF5372: |  	case RF5372: | ||||||
|  	case RF5390: |  	case RF5390: | ||||||
|  	case RF5392: |  	case RF5392: | ||||||
| @@ -1192,7 +1192,7 @@ | |||||||
|  		spec->num_channels = 14; |  		spec->num_channels = 14; | ||||||
|  		if (spec->clk_is_20mhz) |  		if (spec->clk_is_20mhz) | ||||||
|  			spec->channels = rf_vals_xtal20mhz_3x; |  			spec->channels = rf_vals_xtal20mhz_3x; | ||||||
| @@ -8564,6 +9505,7 @@ static int rt2800_probe_hw_mode(struct r | @@ -8564,6 +9511,7 @@ static int rt2800_probe_hw_mode(struct r | ||||||
|  	case RF5372: |  	case RF5372: | ||||||
|  	case RF5390: |  	case RF5390: | ||||||
|  	case RF5392: |  	case RF5392: | ||||||
|   | |||||||
| @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= | |||||||
|  |  | ||||||
| PKG_SOURCE_URL:=https://github.com/openwrt/mt76 | PKG_SOURCE_URL:=https://github.com/openwrt/mt76 | ||||||
| PKG_SOURCE_PROTO:=git | PKG_SOURCE_PROTO:=git | ||||||
| PKG_SOURCE_DATE:=2017-01-15 | PKG_SOURCE_DATE:=2017-01-31 | ||||||
| PKG_SOURCE_VERSION:=85d12fea1abe8654f694dc6594781f85168aa2c2 | PKG_SOURCE_VERSION:=3c8caafc5e150db79f714b958a51cee8f242f309 | ||||||
| PKG_MIRROR_HASH:=d07c019a3f836860409c58c303195df832f5dc31168201c3fa7d23f4f5927a79 | PKG_MIRROR_HASH:=c03c166466cb7ea825e52cd085511045e3847d927ba2bde2b8fb46595a3ed13a | ||||||
|  |  | ||||||
| PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | ||||||
| PKG_BUILD_PARALLEL:=1 | PKG_BUILD_PARALLEL:=1 | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ PKG_LICENSE_FILES:= | |||||||
|  |  | ||||||
| PKG_SOURCE_URL:=https://github.com/kaloz/mwlwifi | PKG_SOURCE_URL:=https://github.com/kaloz/mwlwifi | ||||||
| PKG_SOURCE_PROTO:=git | PKG_SOURCE_PROTO:=git | ||||||
| PKG_SOURCE_VERSION:=88550a0261ac9718eda7f28022d239c0053e2f94 | PKG_SOURCE_VERSION:=ccdfdac28f7666474745b1f46f0769f3a2879b5f | ||||||
| PKG_MIRROR_HASH:=a903d87cbd252019d2dee84ca331e3c865be611e989301aadaaee86ca4ce2435 | PKG_MIRROR_HASH:=a903d87cbd252019d2dee84ca331e3c865be611e989301aadaaee86ca4ce2435 | ||||||
|  |  | ||||||
| PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org> | PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org> | ||||||
|   | |||||||
| @@ -17,9 +17,11 @@ get_gpio() { | |||||||
|  |  | ||||||
| 		case "$board" in | 		case "$board" in | ||||||
| 			"om2p" | \ | 			"om2p" | \ | ||||||
|  | 			"om2pv4" | \ | ||||||
| 			"om2p-hs" | \ | 			"om2p-hs" | \ | ||||||
| 			"om2p-hsv2" | \ | 			"om2p-hsv2" | \ | ||||||
| 			"om2p-hsv3" | \ | 			"om2p-hsv3" | \ | ||||||
|  | 			"om2p-hsv4" | \ | ||||||
| 			"om5p-acv2") | 			"om5p-acv2") | ||||||
| 				return 12 | 				return 12 | ||||||
| 				;; | 				;; | ||||||
| @@ -40,7 +42,9 @@ get_gpio() { | |||||||
| 			"mr900" | \ | 			"mr900" | \ | ||||||
| 			"mr900v2" | \ | 			"mr900v2" | \ | ||||||
| 			"mr1750" | \ | 			"mr1750" | \ | ||||||
| 			"mr1750v2") | 			"mr1750v2" | \ | ||||||
|  | 			"a40" | \ | ||||||
|  | 			"a60") | ||||||
| 				return 16 | 				return 16 | ||||||
| 				;; | 				;; | ||||||
| 		esac | 		esac | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | |||||||
|  |  | ||||||
| PKG_NAME:=libtool | PKG_NAME:=libtool | ||||||
| PKG_VERSION:=2.4 | PKG_VERSION:=2.4 | ||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=2 | ||||||
|  |  | ||||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | ||||||
| PKG_SOURCE_URL:=@GNU/libtool | PKG_SOURCE_URL:=@GNU/libtool | ||||||
| @@ -34,14 +34,14 @@ endef | |||||||
|  |  | ||||||
| define Build/InstallDev | define Build/InstallDev | ||||||
| 	$(MAKE) -C $(PKG_BUILD_DIR) \ | 	$(MAKE) -C $(PKG_BUILD_DIR) \ | ||||||
| 		bindir="$(2)/bin" \ | 		bindir="$(2)/libltdl/bin" \ | ||||||
| 		datadir="$(2)/share" \ | 		datadir="$(2)/libltdl/share" \ | ||||||
| 		prefix="$(2)" \ | 		prefix="$(2)/libltdl" \ | ||||||
| 		exec_prefix="$(2)" \ | 		exec_prefix="$(2)/libltdl" \ | ||||||
| 		install | 		install | ||||||
| 	$(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include | 	$(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include | ||||||
| 	mv $(2)/lib/* $(1)/usr/lib/ | 	mv $(2)/libltdl/lib/* $(1)/usr/lib/ | ||||||
| 	mv $(2)/include/* $(1)/usr/include/ | 	mv $(2)/libltdl/include/* $(1)/usr/include/ | ||||||
| endef | endef | ||||||
|  |  | ||||||
| define Package/libltdl/install | define Package/libltdl/install | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | |||||||
|  |  | ||||||
| PKG_NAME:=openssl | PKG_NAME:=openssl | ||||||
| PKG_BASE:=1.0.2 | PKG_BASE:=1.0.2 | ||||||
| PKG_BUGFIX:=j | PKG_BUGFIX:=k | ||||||
| PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX) | PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX) | ||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
| PKG_USE_MIPS16:=0 | PKG_USE_MIPS16:=0 | ||||||
| @@ -23,7 +23,7 @@ PKG_SOURCE_URL:=http://www.openssl.org/source/ \ | |||||||
| 	http://www.openssl.org/source/old/$(PKG_BASE)/ \ | 	http://www.openssl.org/source/old/$(PKG_BASE)/ \ | ||||||
| 	ftp://ftp.funet.fi/pub/crypt/mirrors/ftp.openssl.org/source \ | 	ftp://ftp.funet.fi/pub/crypt/mirrors/ftp.openssl.org/source \ | ||||||
| 	ftp://ftp.sunet.se/pub/security/tools/net/openssl/source/ | 	ftp://ftp.sunet.se/pub/security/tools/net/openssl/source/ | ||||||
| PKG_HASH:=e7aff292be21c259c6af26469c7a9b3ba26e9abaaffd325e3dccc9785256c431 | PKG_HASH:=6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0 | ||||||
|  |  | ||||||
| PKG_LICENSE:=OpenSSL | PKG_LICENSE:=OpenSSL | ||||||
| PKG_LICENSE_FILES:=LICENSE | PKG_LICENSE_FILES:=LICENSE | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/Configure | --- a/Configure | ||||||
| +++ b/Configure | +++ b/Configure | ||||||
| @@ -468,6 +468,12 @@ my %table=( | @@ -470,6 +470,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-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}", |  "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}", | ||||||
|   |   | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/Configure | --- a/Configure | ||||||
| +++ b/Configure | +++ b/Configure | ||||||
| @@ -2114,6 +2114,11 @@ EOF | @@ -2128,6 +2128,11 @@ EOF | ||||||
|  	close(OUT); |  	close(OUT); | ||||||
|    } |    } | ||||||
|     |     | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
|  WDIRS=  windows |  WDIRS=  windows | ||||||
|  LIBS=   libcrypto.a libssl.a |  LIBS=   libcrypto.a libssl.a | ||||||
|  SHARED_CRYPTO=libcrypto$(SHLIB_EXT) |  SHARED_CRYPTO=libcrypto$(SHLIB_EXT) | ||||||
| @@ -275,7 +275,7 @@ reflect: | @@ -276,7 +276,7 @@ reflect: | ||||||
|   |   | ||||||
|  sub_all: build_all |  sub_all: build_all | ||||||
|   |   | ||||||
| @@ -36,7 +36,7 @@ | |||||||
|   |   | ||||||
|  build_libs: build_libcrypto build_libssl openssl.pc |  build_libs: build_libcrypto build_libssl openssl.pc | ||||||
|   |   | ||||||
| @@ -533,7 +533,7 @@ dist: | @@ -534,7 +534,7 @@ dist: | ||||||
|  	@$(MAKE) SDIRS='$(SDIRS)' clean |  	@$(MAKE) SDIRS='$(SDIRS)' clean | ||||||
|  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar |  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar | ||||||
|   |   | ||||||
| @@ -47,7 +47,7 @@ | |||||||
|  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ |  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ | ||||||
| --- a/Makefile.org | --- a/Makefile.org | ||||||
| +++ b/Makefile.org | +++ b/Makefile.org | ||||||
| @@ -531,7 +531,7 @@ dist: | @@ -532,7 +532,7 @@ dist: | ||||||
|  	@$(MAKE) SDIRS='$(SDIRS)' clean |  	@$(MAKE) SDIRS='$(SDIRS)' clean | ||||||
|  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar |  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar | ||||||
|   |   | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|   |   | ||||||
|  # as we stick to -e, CLEARENV ensures that local variables in lower |  # as we stick to -e, CLEARENV ensures that local variables in lower | ||||||
|  # Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn |  # Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn | ||||||
| @@ -403,11 +403,6 @@ openssl.pc: Makefile | @@ -404,11 +404,6 @@ openssl.pc: Makefile | ||||||
|  	    echo 'Version: '$(VERSION); \ |  	    echo 'Version: '$(VERSION); \ | ||||||
|  	    echo 'Requires: libssl libcrypto' ) > openssl.pc |  	    echo 'Requires: libssl libcrypto' ) > openssl.pc | ||||||
|   |   | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| --- a/Makefile.org | --- a/Makefile.org | ||||||
| +++ b/Makefile.org | +++ b/Makefile.org | ||||||
| @@ -281,17 +281,17 @@ build_libcrypto: build_crypto build_engi | @@ -282,17 +282,17 @@ build_libcrypto: build_crypto build_engi | ||||||
|  build_libssl: build_ssl libssl.pc |  build_libssl: build_ssl libssl.pc | ||||||
|   |   | ||||||
|  build_crypto: |  build_crypto: | ||||||
| @@ -24,7 +24,7 @@ | |||||||
|   |   | ||||||
|  all_testapps: build_libs build_testapps |  all_testapps: build_libs build_testapps | ||||||
|  build_testapps: |  build_testapps: | ||||||
| @@ -464,7 +464,7 @@ update: errors stacks util/libeay.num ut | @@ -465,7 +465,7 @@ update: errors stacks util/libeay.num ut | ||||||
|  	@set -e; target=update; $(RECURSIVE_BUILD_CMD) |  	@set -e; target=update; $(RECURSIVE_BUILD_CMD) | ||||||
|   |   | ||||||
|  depend: |  depend: | ||||||
| @@ -33,7 +33,7 @@ | |||||||
|   |   | ||||||
|  lint: |  lint: | ||||||
|  	@set -e; target=lint; $(RECURSIVE_BUILD_CMD) |  	@set -e; target=lint; $(RECURSIVE_BUILD_CMD) | ||||||
| @@ -526,9 +526,9 @@ dist: | @@ -527,9 +527,9 @@ dist: | ||||||
|  	@$(MAKE) SDIRS='$(SDIRS)' clean |  	@$(MAKE) SDIRS='$(SDIRS)' clean | ||||||
|  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar |  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar | ||||||
|   |   | ||||||
| @@ -45,7 +45,7 @@ | |||||||
|  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ |  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ | ||||||
|  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ |  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ | ||||||
|  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ |  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ | ||||||
| @@ -537,12 +537,19 @@ install_sw: | @@ -538,12 +538,19 @@ install_sw: | ||||||
|  		$(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ |  		$(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ | ||||||
|  		$(INSTALL_PREFIX)$(OPENSSLDIR)/certs \ |  		$(INSTALL_PREFIX)$(OPENSSLDIR)/certs \ | ||||||
|  		$(INSTALL_PREFIX)$(OPENSSLDIR)/private |  		$(INSTALL_PREFIX)$(OPENSSLDIR)/private | ||||||
| @@ -66,7 +66,7 @@ | |||||||
|  	@set -e; liblist="$(LIBS)"; for i in $$liblist ;\ |  	@set -e; liblist="$(LIBS)"; for i in $$liblist ;\ | ||||||
|  	do \ |  	do \ | ||||||
|  		if [ -f "$$i" ]; then \ |  		if [ -f "$$i" ]; then \ | ||||||
| @@ -626,12 +633,7 @@ install_html_docs: | @@ -627,12 +634,7 @@ install_html_docs: | ||||||
|  		done; \ |  		done; \ | ||||||
|  	done |  	done | ||||||
|   |   | ||||||
|   | |||||||
| @@ -8,12 +8,12 @@ | |||||||
| include $(TOPDIR)/rules.mk | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
| PKG_NAME:=zlib | PKG_NAME:=zlib | ||||||
| PKG_VERSION:=1.2.10 | PKG_VERSION:=1.2.11 | ||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
|  |  | ||||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | ||||||
| PKG_SOURCE_URL:=http://www.zlib.net @SF/libpng | PKG_SOURCE_URL:=@SF/libpng http://www.zlib.net | ||||||
| PKG_HASH:=9612bf086047078ce3a1c154fc9052113fc1a2a97234a059da17a6299bd4dd32 | PKG_HASH:=4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066 | ||||||
|  |  | ||||||
| PKG_LICENSE:=Zlib | PKG_LICENSE:=Zlib | ||||||
| PKG_LICENSE_FILES:=README | PKG_LICENSE_FILES:=README | ||||||
|   | |||||||
| @@ -26,6 +26,8 @@ PKG_CONFIG_DEPENDS:=\ | |||||||
|  |  | ||||||
| PKG_BUILD_DEPENDS:=TARGET_lantiq_xway:kmod-ltq-adsl-danube TARGET_lantiq_xway_legacy:kmod-ltq-adsl-danube TARGET_lantiq_ase:kmod-ltq-adsl-ase | PKG_BUILD_DEPENDS:=TARGET_lantiq_xway:kmod-ltq-adsl-danube TARGET_lantiq_xway_legacy:kmod-ltq-adsl-danube TARGET_lantiq_ase:kmod-ltq-adsl-ase | ||||||
|  |  | ||||||
|  | PKG_FLAGS:=nonshared | ||||||
|  |  | ||||||
| include $(INCLUDE_DIR)/package.mk | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
| define Package/ltq-adsl-app | define Package/ltq-adsl-app | ||||||
|   | |||||||
| @@ -5,9 +5,9 @@ PKG_RELEASE:=1 | |||||||
|  |  | ||||||
| PKG_SOURCE_PROTO:=git | PKG_SOURCE_PROTO:=git | ||||||
| PKG_SOURCE_URL=$(LEDE_GIT)/project/netifd.git | PKG_SOURCE_URL=$(LEDE_GIT)/project/netifd.git | ||||||
| PKG_SOURCE_DATE:=2017-01-13 | PKG_SOURCE_DATE:=2017-01-25 | ||||||
| PKG_SOURCE_VERSION:=52541140f8138e31958cdc3d7e42a4029fa6bbc9 | PKG_SOURCE_VERSION:=650758b16e5185505a3fbc1307949340af70b611 | ||||||
| PKG_MIRROR_HASH:=8b74721b3c3b2912df4271f0a60c2137642eeb7753d3e656f7a508d8cac013e9 | PKG_MIRROR_HASH:=d09c740bc1bf6269678bd75c9af52ecd4be3d1d59402a543ceb9d4459cecfa2b | ||||||
| PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | ||||||
|  |  | ||||||
| PKG_LICENSE:=GPL-2.0 | PKG_LICENSE:=GPL-2.0 | ||||||
|   | |||||||
| @@ -347,7 +347,6 @@ tc filter add dev $device parent ffff: prio 1 u32 match u32 0 0 flowid 1:1 actio | |||||||
| 	fi | 	fi | ||||||
| 	add_insmod cls_fw | 	add_insmod cls_fw | ||||||
| 	add_insmod sch_hfsc | 	add_insmod sch_hfsc | ||||||
| 	add_insmod sch_fq_codel |  | ||||||
|  |  | ||||||
| 	cat <<EOF | 	cat <<EOF | ||||||
| ${INSMOD:+$INSMOD$N}${dev_up:+$dev_up | ${INSMOD:+$INSMOD$N}${dev_up:+$dev_up | ||||||
| @@ -466,7 +465,7 @@ EOF | |||||||
|  |  | ||||||
| start_firewall() { | start_firewall() { | ||||||
| 	add_insmod xt_multiport | 	add_insmod xt_multiport | ||||||
| 	add_insmod xt_CONNMARK | 	add_insmod xt_connmark | ||||||
| 	stop_firewall | 	stop_firewall | ||||||
| 	for group in $CG; do | 	for group in $CG; do | ||||||
| 		start_cg $group | 		start_cg $group | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user