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 | ||||
| 		bool "Select all target specific packages by default" | ||||
| 		default ALL | ||||
| 		default ALL || BUILDBOT | ||||
|  | ||||
| 	config ALL_KMODS | ||||
| 		bool "Select all kernel module packages by default" | ||||
| @@ -19,6 +19,16 @@ menu "Global build settings" | ||||
| 		bool "Select all userspace packages by default" | ||||
| 		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 | ||||
| 		bool "Cryptographically signed package lists" | ||||
| 		default y | ||||
| @@ -61,7 +71,7 @@ menu "Global build settings" | ||||
| 		bool | ||||
| 		prompt "Collect kernel debug information" | ||||
| 		select KERNEL_DEBUG_INFO | ||||
| 		default n | ||||
| 		default BUILDBOT | ||||
| 		help | ||||
| 		  This collects debugging symbols from the kernel and all compiled modules. | ||||
| 		  Useful for release builds, so that kernel issues can be debugged offline | ||||
|   | ||||
| @@ -59,7 +59,7 @@ menuconfig DEVEL | ||||
| 		bool "Use ccache" if DEVEL | ||||
| 		default n | ||||
| 		help | ||||
| 		  Compiler cache; see http://ccache.samba.org/. | ||||
| 		  Compiler cache; see https://ccache.samba.org/ | ||||
|  | ||||
| 	config EXTERNAL_KERNEL_TREE | ||||
| 		string "Use external kernel tree" if DEVEL | ||||
|   | ||||
| @@ -201,7 +201,6 @@ menu "Target Images" | ||||
| 		int "Serial port baud rate" | ||||
| 		depends on GRUB_IMAGES | ||||
| 		default 38400 if TARGET_x86_generic | ||||
| 		default 38400 if TARGET_x86_geode | ||||
| 		default 115200 | ||||
|  | ||||
| 	config GRUB_BOOTOPTS | ||||
|   | ||||
| @@ -1,8 +1,4 @@ | ||||
| src-git packages https://git.lede-project.org/feed/packages.git | ||||
| src-git luci https://git.lede-project.org/project/luci.git | ||||
| src-git routing https://git.lede-project.org/feed/routing.git | ||||
| src-git telephony https://git.lede-project.org/feed/telephony.git | ||||
| #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 | ||||
| src-git packages https://git.lede-project.org/feed/packages.git^ed90827282851ad93294e370860320f1af428bb2 | ||||
| src-git luci https://git.lede-project.org/project/luci.git^a100738163585ae1edc24d832ca9bef1f34beef0 | ||||
| src-git routing https://git.lede-project.org/feed/routing.git^dd36dd47bbd75defcb3c517cafe7a19ee425f0af | ||||
| src-git telephony https://git.lede-project.org/feed/telephony.git^1f0fb2538ba6fc306198fe2a9a4b976d63adb304 | ||||
|   | ||||
| @@ -67,6 +67,12 @@ HOST_CONFIGURE_ARGS = \ | ||||
| 	--localstatedir=$(HOST_BUILD_PREFIX)/var \ | ||||
| 	--sbindir=$(HOST_BUILD_PREFIX)/bin | ||||
|  | ||||
| HOST_MAKE_VARS = \ | ||||
| 	CFLAGS="$(HOST_CFLAGS)" \ | ||||
| 	CPPFLAGS="$(HOST_CPPFLAGS)" \ | ||||
| 	CXXFLAGS="$(HOST_CXXFLAGS)" \ | ||||
| 	LDFLAGS="$(HOST_LDFLAGS)" | ||||
|  | ||||
| HOST_MAKE_FLAGS = | ||||
|  | ||||
| HOST_CONFIGURE_CMD = $(BASH) ./configure | ||||
| @@ -89,7 +95,8 @@ define Host/Configure | ||||
| endef | ||||
|  | ||||
| define Host/Compile/Default | ||||
| 	+$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) \ | ||||
| 	+$(HOST_MAKE_VARS) \ | ||||
| 	$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) \ | ||||
| 		$(HOST_MAKE_FLAGS) \ | ||||
| 		$(1) | ||||
| endef | ||||
|   | ||||
| @@ -60,7 +60,7 @@ define Download/git-kernel | ||||
|   PROTO:=git | ||||
|   VERSION:=$(CONFIG_KERNEL_GIT_BRANCH) | ||||
|   FILE:=$(LINUX_SOURCE) | ||||
|   SUBDIR:=linux-$(KERNEL_PATCHVER) | ||||
|   SUBDIR:=linux-$(LINUX_VERSION) | ||||
|   OPTS:=$(KERNEL_GIT_OPTS) | ||||
| endef | ||||
|  | ||||
|   | ||||
| @@ -3,10 +3,10 @@ | ||||
| LINUX_RELEASE?=1 | ||||
|  | ||||
| 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-4.4.42 = 324747568e92f203e3ee5ec8b291a868f58b870f1ad214fa64aa3507ed42e878 | ||||
| LINUX_KERNEL_HASH-4.4.50 = e4944ca5bb0bdf63a7e97dc7fbdd38bcc820d8b3b57c4a3a7b3bf9c8a48216b7 | ||||
|  | ||||
| ifdef KERNEL_PATCHVER | ||||
|   LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) | ||||
|   | ||||
| @@ -209,11 +209,13 @@ $(_endef) | ||||
| 		( \ | ||||
| 			echo "#!/bin/sh"; \ | ||||
| 			echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \ | ||||
| 			echo "[ -x "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \ | ||||
| 			echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ | ||||
| 			echo "default_postinst \$$$$0 \$$$$@"; \ | ||||
| 		) > postinst; \ | ||||
| 		( \ | ||||
| 			echo "#!/bin/sh"; \ | ||||
| 			echo "[ -x "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \ | ||||
| 			echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ | ||||
| 			echo "default_prerm \$$$$0 \$$$$@"; \ | ||||
| 		) > prerm; \ | ||||
|   | ||||
| @@ -47,6 +47,14 @@ opkg = \ | ||||
|  | ||||
| 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 | ||||
| 	@if [ -d $(TOPDIR)/files ]; then \ | ||||
| 		$(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/info/*.postinst* | ||||
| 	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)) | ||||
| endef | ||||
|   | ||||
| @@ -164,17 +164,15 @@ ifeq ($(DUMP),1) | ||||
|     endif | ||||
|     CPU_CFLAGS += -mno-branch-likely | ||||
|     CPU_CFLAGS_mips32 = -mips32 -mtune=mips32 | ||||
|     CPU_CFLAGS_mips32r2 = -mips32r2 -mtune=mips32r2 | ||||
|     CPU_CFLAGS_mips64 = -mips64 -mtune=mips64 -mabi=64 | ||||
|     CPU_CFLAGS_24kc = -mips32r2 -mtune=24kc | ||||
|     CPU_CFLAGS_74kc = -mips32r2 -mtune=74kc | ||||
|     CPU_CFLAGS_octeon = -march=octeon -mabi=64 | ||||
|   endif | ||||
|   ifeq ($(ARCH),i386) | ||||
|     CPU_TYPE ?= i486 | ||||
|     CPU_CFLAGS_i486 = -march=i486 | ||||
|     CPU_TYPE ?= pentium | ||||
|     CPU_CFLAGS_pentium = -march=pentium-mmx | ||||
|     CPU_CFLAGS_pentium4 = -march=pentium4 | ||||
|     CPU_CFLAGS_geode = -march=geode -mmmx -m3dnow | ||||
|   endif | ||||
|   ifneq ($(findstring arm,$(ARCH)),) | ||||
|     CPU_TYPE ?= xscale | ||||
| @@ -259,6 +257,9 @@ ifeq ($(DUMP),1) | ||||
|     ifneq ($(CONFIG_VIRTIO),) | ||||
|       FEATURES += virtio | ||||
|     endif | ||||
|     ifneq ($(CONFIG_CPU_MIPS32_R2),) | ||||
|       FEATURES += mips16 | ||||
|     endif | ||||
|     FEATURES += $(foreach v,6 7,$(if $(CONFIG_CPU_V$(v)),arm_v$(v))) | ||||
|  | ||||
|     # remove duplicates | ||||
|   | ||||
| @@ -31,16 +31,16 @@ qstrip_escape=$(subst ','\'',$(call qstrip,$(1))) | ||||
| sanitize = $(call tolower,$(subst _,-,$(subst $(space),-,$(1)))) | ||||
|  | ||||
| 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:=$(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:=$(if $(VERSION_NICK),$(VERSION_NICK),$(RELEASE)) | ||||
|  | ||||
| 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:=$(if $(VERSION_DIST),$(VERSION_DIST),LEDE) | ||||
|   | ||||
| @@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk | ||||
| include $(INCLUDE_DIR)/version.mk | ||||
|  | ||||
| PKG_NAME:=base-files | ||||
| PKG_RELEASE:=171 | ||||
| PKG_RELEASE:=172 | ||||
| PKG_FLAGS:=nonshared | ||||
|  | ||||
| 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/ | ||||
| /etc/iproute2/rt_tables | ||||
| /etc/iproute2/rt_protos | ||||
| $(call $(TARGET)/conffiles) | ||||
| endef | ||||
|  | ||||
|   | ||||
| @@ -226,7 +226,7 @@ generate_static_system() { | ||||
| 	uci -q batch <<-EOF | ||||
| 		delete system.@system[0] | ||||
| 		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].ttylogin='0' | ||||
| 		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 | ||||
|  | ||||
| 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%.control}" | ||||
| 	add_group_and_user "${file}" | ||||
|   | ||||
| @@ -3,7 +3,7 @@ do_sysinfo_generic() { | ||||
| 	mkdir -p /tmp/sysinfo | ||||
| 	[ -e /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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -190,7 +190,7 @@ if VERSIONOPT | ||||
| 	config VERSION_REPO | ||||
| 		string | ||||
| 		prompt "Release repository" | ||||
| 		default "http://downloads.lede-project.org/snapshots" | ||||
| 		default "http://downloads.lede-project.org/releases/17.01.0" | ||||
| 		help | ||||
| 			This is the repository address embedded in the image, it defaults | ||||
| 			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 | ||||
| 		bool "Comment out not enabled feeds" | ||||
| 		default y | ||||
| 		default !BUILDBOT | ||||
| 		depends on PER_FEED_REPO && PER_FEED_REPO_ADD_DISABLED | ||||
| 		help | ||||
| 		  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_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/host-build.mk | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,8 @@ PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) | ||||
|  | ||||
| PKG_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define Package/rbcfg | ||||
|   | ||||
| @@ -14,6 +14,8 @@ touch /etc/config/ubootenv | ||||
| board=$(ar71xx_board_name) | ||||
|  | ||||
| case "$board" in | ||||
| a40|\ | ||||
| a60|\ | ||||
| alfa-ap120c|\ | ||||
| all0258n|\ | ||||
| ap90q|\ | ||||
| @@ -52,8 +54,10 @@ om2p|\ | ||||
| om2p-hs|\ | ||||
| om2p-hsv2|\ | ||||
| om2p-hsv3|\ | ||||
| om2p-hsv4|\ | ||||
| om2p-lc|\ | ||||
| om2pv2) | ||||
| om2pv2|\ | ||||
| om2pv4) | ||||
| 	ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x40000" | ||||
| 	;; | ||||
| dap-2695-a1|\ | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| -	"bootm 0x800000" | ||||
| +	"ubi part ubi; " \ | ||||
| +	"ubi read 0x800000 kernel; " \ | ||||
| +	"bootz 0x800000" | ||||
| +	"bootm 0x800000" | ||||
|   | ||||
|  #define CONFIG_MTDPARTS \ | ||||
| -	"mtdparts=orion_nand:1m(uboot),6M(uImage),-(root)\0" | ||||
|   | ||||
| @@ -17,6 +17,8 @@ PKG_HASH:=466eca9cdad2c15e957fb9ce7d0b6927ecd17d85c4cc2dff37e97a3e6b209c67 | ||||
|  | ||||
| PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) | ||||
|  | ||||
| PKG_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| 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_FILES:=Licenses/README | ||||
|  | ||||
| PKG_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| 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_FILES:=Licenses/README | ||||
|  | ||||
| PKG_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| 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_FILES:=Licenses/README | ||||
|  | ||||
| PKG_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define rcw/Default | ||||
|   | ||||
| @@ -12,10 +12,10 @@ PKG_NAME:=sched-cake | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_URL:=https://github.com/kdarbyshirebryant/sch_cake.git | ||||
| PKG_SOURCE_DATE:=2016-12-19 | ||||
| PKG_SOURCE_VERSION:=70c8eb766d5afcf3cf187594b7cd776da92bee3c | ||||
| PKG_MIRROR_HASH:=16174db5dad0a5b5ba522d4cfc058cff9851ed013a3a05166b04eb127bb12a24 | ||||
| PKG_SOURCE_URL:=https://github.com/dtaht/sch_cake.git | ||||
| PKG_SOURCE_DATE:=2017-01-28 | ||||
| PKG_SOURCE_VERSION:=9789742cfc596d48583ba4cdbc8f38d026121fa6 | ||||
| PKG_MIRROR_HASH:=2a5afc45722c28ca8778eb50452eb305306e7898b32d7d6d73d3e77edf3cce99 | ||||
| PKG_MAINTAINER:=Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk> | ||||
|  | ||||
| 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_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_EXTRA = $(filter-out $(SCHED_MODULES_FILTER),$(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:= \ | ||||
| 	CONFIG_NET_SCHED=y \ | ||||
| 	CONFIG_NET_SCH_HFSC \ | ||||
| 	CONFIG_NET_SCH_HTB \ | ||||
| 	CONFIG_NET_SCH_TBF \ | ||||
| 	CONFIG_NET_SCH_INGRESS \ | ||||
| 	CONFIG_NET_SCH_FQ_CODEL \ | ||||
| 	CONFIG_NET_CLS=y \ | ||||
| @@ -789,12 +791,10 @@ define KernelPackage/sched | ||||
|   KCONFIG:= \ | ||||
| 	CONFIG_NET_SCH_CODEL \ | ||||
| 	CONFIG_NET_SCH_DSMARK \ | ||||
| 	CONFIG_NET_SCH_HTB \ | ||||
| 	CONFIG_NET_SCH_FIFO \ | ||||
| 	CONFIG_NET_SCH_GRED \ | ||||
| 	CONFIG_NET_SCH_PRIO \ | ||||
| 	CONFIG_NET_SCH_RED \ | ||||
| 	CONFIG_NET_SCH_TBF \ | ||||
| 	CONFIG_NET_SCH_SFQ \ | ||||
| 	CONFIG_NET_SCH_TEQL \ | ||||
| 	CONFIG_NET_SCH_FQ \ | ||||
|   | ||||
| @@ -756,7 +756,7 @@ drv_mac80211_setup() { | ||||
| 	for_each_interface "ap" mac80211_prepare_vif | ||||
|  | ||||
| 	[ -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="$?" | ||||
| 		wireless_add_process "$(cat /var/run/wifi-$phy.pid)" "/usr/sbin/hostapd" 1 | ||||
| 		[ "$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") | ||||
| 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> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/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 total; | ||||
|  	u32 chaninfo; | ||||
| @@ -35,7 +36,7 @@ Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
|   | ||||
|  	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) | ||||
|  			continue; | ||||
|   | ||||
| @@ -84,7 +85,7 @@ Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
|  			ch.bw = BRCMU_CHAN_BW_20; | ||||
|  			cfg->d11inf.encchspec(&ch); | ||||
|  			chaninfo = ch.chspec; | ||||
| @@ -5995,11 +5997,11 @@ static int brcmf_construct_chaninfo(stru
 | ||||
| @@ -5905,11 +5907,11 @@ static int brcmf_construct_chaninfo(stru
 | ||||
|  						       &chaninfo); | ||||
|  			if (!err) { | ||||
|  				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. | ||||
| 
 | ||||
| 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
 | ||||
| +++ 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,		\ | ||||
|  	.center_freq		= (_freq),			\ | ||||
|  	.hw_value		= (_channel),			\ | ||||
| @@ -24,7 +25,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
|  	.max_antenna_gain	= 0,				\ | ||||
|  	.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,		\ | ||||
|  	.center_freq		= 5000 + (5 * (_channel)),	\ | ||||
|  	.hw_value		= (_channel),			\ | ||||
| @@ -20,11 +20,12 @@ due to hardware setup (design). | ||||
| 
 | ||||
| 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> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/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; | ||||
|  		} | ||||
|  	} | ||||
| @@ -34,7 +35,7 @@ Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
|  } | ||||
|   | ||||
|  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; | ||||
|  	} | ||||
|   | ||||
| @@ -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> | ||||
| Date: Sat, 7 Jan 2017 23:43:45 +0100 | ||||
| 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. | ||||
| 
 | ||||
| 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
 | ||||
| +++ 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 | ||||
| +++ 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) }, | ||||
|  	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) | | ||||
|  				 BIT(NL80211_IFTYPE_P2P_GO) }, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| --- a/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; | ||||
|   | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| --- a/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 | ||||
|  void ath_init_leds(struct ath_softc *sc); | ||||
|  void ath_deinit_leds(struct ath_softc *sc); | ||||
| @@ -10,9 +10,9 @@ | ||||
|  #else | ||||
|  static inline void ath_init_leds(struct ath_softc *sc) | ||||
|  { | ||||
| @@ -963,6 +966,13 @@ void ath_ant_comb_scan(struct ath_softc | ||||
|   | ||||
|  #define ATH9K_NUM_CHANCTX  2 /* supports 2 operating channels */ | ||||
| @@ -991,6 +994,13 @@ void ath_ant_comb_scan(struct ath_softc | ||||
|  #define AIRTIME_USE_NEW_QUEUES	BIT(2) | ||||
|  #define AIRTIME_ACTIVE(flags) (!!(flags & (AIRTIME_USE_TX|AIRTIME_USE_RX))) | ||||
|   | ||||
| +struct ath_led { | ||||
| +	struct list_head list; | ||||
| @@ -24,7 +24,7 @@ | ||||
|  struct ath_softc { | ||||
|  	struct ieee80211_hw *hw; | ||||
|  	struct device *dev; | ||||
| @@ -1015,9 +1025,8 @@ struct ath_softc { | ||||
| @@ -1046,9 +1056,8 @@ struct ath_softc { | ||||
|  	spinlock_t chan_lock; | ||||
|   | ||||
|  #ifdef CPTCFG_MAC80211_LEDS | ||||
| @@ -181,7 +181,7 @@ | ||||
|   | ||||
| --- a/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 | ||||
|  	/* must be initialized before ieee80211_register_hw */ | ||||
|   | ||||
| @@ -94,7 +94,7 @@ | ||||
|  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, | ||||
| --- a/drivers/net/wireless/ath/ath9k/hw.c | ||||
| +++ b/drivers/net/wireless/ath/ath9k/hw.c | ||||
| @@ -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); | ||||
|   | ||||
| @@ -115,7 +115,7 @@ | ||||
|  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | ||||
|  		   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); | ||||
|   | ||||
|  	ath9k_hw_apply_gpio_override(ah); | ||||
| @@ -125,7 +125,7 @@ | ||||
|  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); | ||||
| --- a/drivers/net/wireless/ath/ath9k/main.c | ||||
| +++ b/drivers/net/wireless/ath/ath9k/main.c | ||||
| @@ -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)) | ||||
|  		return IRQ_HANDLED; | ||||
|   | ||||
|   | ||||
| @@ -55,7 +55,7 @@ | ||||
|  	ops->spectral_scan_config = ar9003_hw_spectral_scan_config; | ||||
| --- a/drivers/net/wireless/ath/ath9k/init.c | ||||
| +++ b/drivers/net/wireless/ath/ath9k/init.c | ||||
| @@ -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) | ||||
|  		ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ); | ||||
|   | ||||
| @@ -65,7 +65,7 @@ | ||||
|  } | ||||
|   | ||||
|  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); | ||||
|  } | ||||
|   | ||||
| @@ -84,7 +84,7 @@ | ||||
|  int ath9k_init_device(u16 devid, struct ath_softc *sc, | ||||
|  		    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)); | ||||
|  #endif | ||||
|   | ||||
|   | ||||
| @@ -40,7 +40,7 @@ | ||||
|  	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)) | ||||
|  		ar9002_hw_load_ani_reg(ah, chan); | ||||
|   | ||||
| @@ -55,7 +55,7 @@ | ||||
|  	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); | ||||
|  	} | ||||
|   | ||||
|   | ||||
| @@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  #include "common.h" | ||||
|  #include "debug.h" | ||||
| @@ -973,6 +974,14 @@ struct ath_led { | ||||
| @@ -1001,6 +1002,14 @@ struct ath_led { | ||||
|  	struct led_classdev cdev; | ||||
|  }; | ||||
|   | ||||
| @@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  struct ath_softc { | ||||
|  	struct ieee80211_hw *hw; | ||||
|  	struct device *dev; | ||||
| @@ -1027,6 +1036,9 @@ struct ath_softc { | ||||
| @@ -1058,6 +1067,9 @@ struct ath_softc { | ||||
|  #ifdef CPTCFG_MAC80211_LEDS | ||||
|  	const char *led_default_trigger; | ||||
|  	struct list_head leds; | ||||
|   | ||||
| @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- | ||||
| --- a/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; | ||||
|  #ifdef CONFIG_GPIOLIB | ||||
|  	struct ath9k_gpio_chip *gpiochip; | ||||
|   | ||||
| @@ -329,7 +329,7 @@ Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> | ||||
|  					       &ratesArray[0], cfgCtl, | ||||
| --- a/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) { | ||||
|  			u8 power_ht40delta; | ||||
|  			struct ar5416_eeprom_def *eep = &ah->eeprom.def; | ||||
|   | ||||
| @@ -343,7 +343,7 @@ | ||||
|   | ||||
|  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) | ||||
|  { | ||||
|  	struct ath_softc *sc = hw->priv; | ||||
| @@ -351,7 +351,7 @@ | ||||
|  	struct ath_hw *ah = sc->sc_ah; | ||||
|  	struct ath_common *common = ath9k_hw_common(ah); | ||||
|  	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); | ||||
|  	} | ||||
|   | ||||
|   | ||||
| @@ -9,7 +9,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
| 
 | ||||
| --- a/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; | ||||
|  		} | ||||
|   | ||||
| @@ -19,7 +19,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
|  		/* assuming the chanspecs order is HT20, | ||||
|  		 * 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; | ||||
|  		} | ||||
|  	} | ||||
| @@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com> | ||||
|  | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||||
| @@ -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)) | ||||
|  		return -EBUSY; | ||||
|   | ||||
| @@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com> | ||||
|  | ||||
| --- a/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, | ||||
|  						     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 | ||||
| +++ 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 | ||||
|  	 * FW later while initializing the dongle | ||||
|  	 */ | ||||
| +#if defined(CONFIG_BCM2708) || defined(CONFIG_BCM2709) | ||||
| +	pr_info("power management disabled\n"); | ||||
| +#if defined(CONFIG_ARCH_BCM2708) || defined(CONFIG_ARCH_BCM2709) | ||||
| +	brcmf_dbg(INFO, "power management disabled\n"); | ||||
| +	enabled = false; | ||||
| +#endif | ||||
|  	cfg->pwr_save = enabled; | ||||
|   | ||||
| @@ -24,8 +24,8 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
| +		{ "JP", "JP", 78 }, | ||||
| +		{ "US", "Q2", 86 }, | ||||
| +	}; | ||||
| +	struct brcmfmac_pd_cc_entry *cc_ent; | ||||
| +	int table_size; | ||||
| +	struct brcmfmac_pd_cc_entry *cc_ent = NULL; | ||||
| +	int table_size = 0; | ||||
| + | ||||
| +	if (of_machine_is_compatible("netgear,r8000")) { | ||||
| +		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_WRITE_MT7620, 1); | ||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); | ||||
| + | ||||
|   | ||||
| -		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); | ||||
| +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); | ||||
| +		} | ||||
| +		break; | ||||
| @@ -103,8 +104,7 @@ | ||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); | ||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); | ||||
| +			rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); | ||||
|   | ||||
| -		rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); | ||||
| + | ||||
| +			rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); | ||||
| +		} | ||||
| +		break; | ||||
| @@ -523,7 +523,7 @@ | ||||
|  static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, | ||||
|  					   const unsigned int word, | ||||
|  					   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) | ||||
|  { | ||||
|  	u32 reg; | ||||
| @@ -532,7 +532,7 @@ | ||||
|  	u8 bbp, rfcsr; | ||||
|   | ||||
|  	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: | ||||
|  		rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info); | ||||
|  		break; | ||||
| @@ -542,7 +542,7 @@ | ||||
|  	default: | ||||
|  		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) || | ||||
|  			 rt2x00_rt(rt2x00dev, RT3883)) | ||||
|  			rt2800_bbp_write(rt2x00dev, 82, 0x82); | ||||
| @@ -551,7 +551,7 @@ | ||||
|  			rt2800_bbp_write(rt2x00dev, 82, 0xf2); | ||||
|   | ||||
|  		if (rt2x00_rt(rt2x00dev, RT3593) || | ||||
| @@ -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)) | ||||
|  		rt2800_rfcsr_write(rt2x00dev, 8, 0); | ||||
|   | ||||
| @@ -560,7 +560,7 @@ | ||||
|   | ||||
|  	switch (rt2x00dev->default_ant.tx_chain_num) { | ||||
|  	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_TRSW_EN, 1); | ||||
| @@ -568,7 +568,7 @@ | ||||
|   | ||||
|  	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); | ||||
|  		rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); | ||||
|  		break; | ||||
| @@ -583,7 +583,7 @@ | ||||
|  	default: | ||||
|  		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) || | ||||
|  		   rt2x00_rt(rt2x00dev, RT5392) || | ||||
|  		   rt2x00_rt(rt2x00dev, RT5592)) { | ||||
| @@ -629,7 +629,7 @@ | ||||
|  	} else if (rt2x00_rt(rt2x00dev, RT5350)) { | ||||
|  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); | ||||
|  	} else { | ||||
| @@ -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); | ||||
|  } | ||||
|   | ||||
| @@ -855,7 +855,7 @@ | ||||
|  static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) | ||||
|  { | ||||
|  	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; | ||||
|  	case RT5390: | ||||
|  	case RT5392: | ||||
| @@ -867,7 +867,7 @@ | ||||
|  		break; | ||||
|  	case RT5592: | ||||
|  		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); | ||||
|  } | ||||
|   | ||||
| @@ -1164,7 +1164,7 @@ | ||||
|  static void rt2800_init_rfcsr(struct rt2x00_dev *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); | ||||
|  		break; | ||||
|  	case RT5390: | ||||
| @@ -1176,7 +1176,7 @@ | ||||
|  		break; | ||||
|  	case RT5392: | ||||
|  		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 RF5392: | ||||
|  	case RF5592: | ||||
| @@ -1184,7 +1184,7 @@ | ||||
|  		break; | ||||
|  	default: | ||||
|  		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 RF5390: | ||||
|  	case RF5392: | ||||
| @@ -1192,7 +1192,7 @@ | ||||
|  		spec->num_channels = 14; | ||||
|  		if (spec->clk_is_20mhz) | ||||
|  			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 RF5390: | ||||
|  	case RF5392: | ||||
|   | ||||
| @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= | ||||
|  | ||||
| PKG_SOURCE_URL:=https://github.com/openwrt/mt76 | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_DATE:=2017-01-15 | ||||
| PKG_SOURCE_VERSION:=85d12fea1abe8654f694dc6594781f85168aa2c2 | ||||
| PKG_MIRROR_HASH:=d07c019a3f836860409c58c303195df832f5dc31168201c3fa7d23f4f5927a79 | ||||
| PKG_SOURCE_DATE:=2017-01-31 | ||||
| PKG_SOURCE_VERSION:=3c8caafc5e150db79f714b958a51cee8f242f309 | ||||
| PKG_MIRROR_HASH:=c03c166466cb7ea825e52cd085511045e3847d927ba2bde2b8fb46595a3ed13a | ||||
|  | ||||
| PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | ||||
| PKG_BUILD_PARALLEL:=1 | ||||
|   | ||||
| @@ -16,7 +16,7 @@ PKG_LICENSE_FILES:= | ||||
|  | ||||
| PKG_SOURCE_URL:=https://github.com/kaloz/mwlwifi | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_VERSION:=88550a0261ac9718eda7f28022d239c0053e2f94 | ||||
| PKG_SOURCE_VERSION:=ccdfdac28f7666474745b1f46f0769f3a2879b5f | ||||
| PKG_MIRROR_HASH:=a903d87cbd252019d2dee84ca331e3c865be611e989301aadaaee86ca4ce2435 | ||||
|  | ||||
| PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org> | ||||
|   | ||||
| @@ -17,9 +17,11 @@ get_gpio() { | ||||
|  | ||||
| 		case "$board" in | ||||
| 			"om2p" | \ | ||||
| 			"om2pv4" | \ | ||||
| 			"om2p-hs" | \ | ||||
| 			"om2p-hsv2" | \ | ||||
| 			"om2p-hsv3" | \ | ||||
| 			"om2p-hsv4" | \ | ||||
| 			"om5p-acv2") | ||||
| 				return 12 | ||||
| 				;; | ||||
| @@ -40,7 +42,9 @@ get_gpio() { | ||||
| 			"mr900" | \ | ||||
| 			"mr900v2" | \ | ||||
| 			"mr1750" | \ | ||||
| 			"mr1750v2") | ||||
| 			"mr1750v2" | \ | ||||
| 			"a40" | \ | ||||
| 			"a60") | ||||
| 				return 16 | ||||
| 				;; | ||||
| 		esac | ||||
|   | ||||
| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=libtool | ||||
| PKG_VERSION:=2.4 | ||||
| PKG_RELEASE:=1 | ||||
| PKG_RELEASE:=2 | ||||
|  | ||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | ||||
| PKG_SOURCE_URL:=@GNU/libtool | ||||
| @@ -34,14 +34,14 @@ endef | ||||
|  | ||||
| define Build/InstallDev | ||||
| 	$(MAKE) -C $(PKG_BUILD_DIR) \ | ||||
| 		bindir="$(2)/bin" \ | ||||
| 		datadir="$(2)/share" \ | ||||
| 		prefix="$(2)" \ | ||||
| 		exec_prefix="$(2)" \ | ||||
| 		bindir="$(2)/libltdl/bin" \ | ||||
| 		datadir="$(2)/libltdl/share" \ | ||||
| 		prefix="$(2)/libltdl" \ | ||||
| 		exec_prefix="$(2)/libltdl" \ | ||||
| 		install | ||||
| 	$(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include | ||||
| 	mv $(2)/lib/* $(1)/usr/lib/ | ||||
| 	mv $(2)/include/* $(1)/usr/include/ | ||||
| 	mv $(2)/libltdl/lib/* $(1)/usr/lib/ | ||||
| 	mv $(2)/libltdl/include/* $(1)/usr/include/ | ||||
| endef | ||||
|  | ||||
| define Package/libltdl/install | ||||
|   | ||||
| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=openssl | ||||
| PKG_BASE:=1.0.2 | ||||
| PKG_BUGFIX:=j | ||||
| PKG_BUGFIX:=k | ||||
| PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX) | ||||
| PKG_RELEASE:=1 | ||||
| PKG_USE_MIPS16:=0 | ||||
| @@ -23,7 +23,7 @@ PKG_SOURCE_URL:=http://www.openssl.org/source/ \ | ||||
| 	http://www.openssl.org/source/old/$(PKG_BASE)/ \ | ||||
| 	ftp://ftp.funet.fi/pub/crypt/mirrors/ftp.openssl.org/source \ | ||||
| 	ftp://ftp.sunet.se/pub/security/tools/net/openssl/source/ | ||||
| PKG_HASH:=e7aff292be21c259c6af26469c7a9b3ba26e9abaaffd325e3dccc9785256c431 | ||||
| PKG_HASH:=6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0 | ||||
|  | ||||
| PKG_LICENSE:=OpenSSL | ||||
| PKG_LICENSE_FILES:=LICENSE | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| --- a/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+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 | ||||
| +++ b/Configure | ||||
| @@ -2114,6 +2114,11 @@ EOF | ||||
| @@ -2128,6 +2128,11 @@ EOF | ||||
|  	close(OUT); | ||||
|    } | ||||
|     | ||||
|   | ||||
| @@ -27,7 +27,7 @@ | ||||
|  WDIRS=  windows | ||||
|  LIBS=   libcrypto.a libssl.a | ||||
|  SHARED_CRYPTO=libcrypto$(SHLIB_EXT) | ||||
| @@ -275,7 +275,7 @@ reflect: | ||||
| @@ -276,7 +276,7 @@ reflect: | ||||
|   | ||||
|  sub_all: build_all | ||||
|   | ||||
| @@ -36,7 +36,7 @@ | ||||
|   | ||||
|  build_libs: build_libcrypto build_libssl openssl.pc | ||||
|   | ||||
| @@ -533,7 +533,7 @@ dist: | ||||
| @@ -534,7 +534,7 @@ dist: | ||||
|  	@$(MAKE) SDIRS='$(SDIRS)' clean | ||||
|  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar | ||||
|   | ||||
| @@ -47,7 +47,7 @@ | ||||
|  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ | ||||
| --- a/Makefile.org | ||||
| +++ b/Makefile.org | ||||
| @@ -531,7 +531,7 @@ dist: | ||||
| @@ -532,7 +532,7 @@ dist: | ||||
|  	@$(MAKE) SDIRS='$(SDIRS)' clean | ||||
|  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar | ||||
|   | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|   | ||||
|  # as we stick to -e, CLEARENV ensures that local variables in lower | ||||
|  # Makefiles remain local and variable. $${VAR+VAR} is tribute to Korn | ||||
| @@ -403,11 +403,6 @@ openssl.pc: Makefile | ||||
| @@ -404,11 +404,6 @@ openssl.pc: Makefile | ||||
|  	    echo 'Version: '$(VERSION); \ | ||||
|  	    echo 'Requires: libssl libcrypto' ) > openssl.pc | ||||
|   | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| --- a/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_crypto: | ||||
| @@ -24,7 +24,7 @@ | ||||
|   | ||||
|  all_testapps: build_libs 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) | ||||
|   | ||||
|  depend: | ||||
| @@ -33,7 +33,7 @@ | ||||
|   | ||||
|  lint: | ||||
|  	@set -e; target=lint; $(RECURSIVE_BUILD_CMD) | ||||
| @@ -526,9 +526,9 @@ dist: | ||||
| @@ -527,9 +527,9 @@ dist: | ||||
|  	@$(MAKE) SDIRS='$(SDIRS)' clean | ||||
|  	@$(MAKE) TAR='$(TAR)' TARFLAGS='$(TARFLAGS)' $(DISTTARVARS) tar | ||||
|   | ||||
| @@ -45,7 +45,7 @@ | ||||
|  	@$(PERL) $(TOP)/util/mkdir-p.pl $(INSTALL_PREFIX)$(INSTALLTOP)/bin \ | ||||
|  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR) \ | ||||
|  		$(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines \ | ||||
| @@ -537,12 +537,19 @@ install_sw: | ||||
| @@ -538,12 +538,19 @@ install_sw: | ||||
|  		$(INSTALL_PREFIX)$(OPENSSLDIR)/misc \ | ||||
|  		$(INSTALL_PREFIX)$(OPENSSLDIR)/certs \ | ||||
|  		$(INSTALL_PREFIX)$(OPENSSLDIR)/private | ||||
| @@ -66,7 +66,7 @@ | ||||
|  	@set -e; liblist="$(LIBS)"; for i in $$liblist ;\ | ||||
|  	do \ | ||||
|  		if [ -f "$$i" ]; then \ | ||||
| @@ -626,12 +633,7 @@ install_html_docs: | ||||
| @@ -627,12 +634,7 @@ install_html_docs: | ||||
|  		done; \ | ||||
|  	done | ||||
|   | ||||
|   | ||||
| @@ -8,12 +8,12 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=zlib | ||||
| PKG_VERSION:=1.2.10 | ||||
| PKG_VERSION:=1.2.11 | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz | ||||
| PKG_SOURCE_URL:=http://www.zlib.net @SF/libpng | ||||
| PKG_HASH:=9612bf086047078ce3a1c154fc9052113fc1a2a97234a059da17a6299bd4dd32 | ||||
| PKG_SOURCE_URL:=@SF/libpng http://www.zlib.net | ||||
| PKG_HASH:=4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066 | ||||
|  | ||||
| PKG_LICENSE:=Zlib | ||||
| 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_FLAGS:=nonshared | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define Package/ltq-adsl-app | ||||
|   | ||||
| @@ -5,9 +5,9 @@ PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_URL=$(LEDE_GIT)/project/netifd.git | ||||
| PKG_SOURCE_DATE:=2017-01-13 | ||||
| PKG_SOURCE_VERSION:=52541140f8138e31958cdc3d7e42a4029fa6bbc9 | ||||
| PKG_MIRROR_HASH:=8b74721b3c3b2912df4271f0a60c2137642eeb7753d3e656f7a508d8cac013e9 | ||||
| PKG_SOURCE_DATE:=2017-01-25 | ||||
| PKG_SOURCE_VERSION:=650758b16e5185505a3fbc1307949340af70b611 | ||||
| PKG_MIRROR_HASH:=d09c740bc1bf6269678bd75c9af52ecd4be3d1d59402a543ceb9d4459cecfa2b | ||||
| PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| 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 | ||||
| 	add_insmod cls_fw | ||||
| 	add_insmod sch_hfsc | ||||
| 	add_insmod sch_fq_codel | ||||
|  | ||||
| 	cat <<EOF | ||||
| ${INSMOD:+$INSMOD$N}${dev_up:+$dev_up | ||||
| @@ -466,7 +465,7 @@ EOF | ||||
|  | ||||
| start_firewall() { | ||||
| 	add_insmod xt_multiport | ||||
| 	add_insmod xt_CONNMARK | ||||
| 	add_insmod xt_connmark | ||||
| 	stop_firewall | ||||
| 	for group in $CG; do | ||||
| 		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