Compare commits
111 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14fb5b4f15 | ||
|
|
6028f00df0 | ||
|
|
7fbd325649 | ||
|
|
103c42e295 | ||
|
|
fd4e805846 | ||
|
|
dc60dc133a | ||
|
|
fa1ee2bd2b | ||
|
|
076ea9f473 | ||
|
|
6c5c3a2edc | ||
|
|
af50ce32c5 | ||
|
|
d92713d2cf | ||
|
|
c476954633 | ||
|
|
c2f938bf9a | ||
|
|
4f23857011 | ||
|
|
e74b264231 | ||
|
|
3e7fd9275d | ||
|
|
d3bab051cf | ||
|
|
eaef74279c | ||
|
|
981f5f7e40 | ||
|
|
eab6537449 | ||
|
|
fb333a7fec | ||
|
|
f3f21b3d2a | ||
|
|
6c14b29bf1 | ||
|
|
009ecf3149 | ||
|
|
f0115b5011 | ||
|
|
99e5ba3207 | ||
|
|
0c8e8e2dc9 | ||
|
|
484117b478 | ||
|
|
e09592748c | ||
|
|
9d4eed6837 | ||
|
|
834bd86424 | ||
|
|
459a40fce2 | ||
|
|
202c3ceb13 | ||
|
|
65044a50ab | ||
|
|
26b8069604 | ||
|
|
3e6e33f528 | ||
|
|
e84f289a02 | ||
|
|
89ed2d6f78 | ||
|
|
e42415723b | ||
|
|
ecf104c023 | ||
|
|
6cf22507fd | ||
|
|
4c101f8b3a | ||
|
|
0f47ce8180 | ||
|
|
5970e6d466 | ||
|
|
e50a5a9328 | ||
|
|
c11f335275 | ||
|
|
b1fc9b79d0 | ||
|
|
a360d5a18e | ||
|
|
10eb247ee8 | ||
|
|
01a8f0e444 | ||
|
|
184fe11483 | ||
|
|
9a96ec08a9 | ||
|
|
2252731af4 | ||
|
|
d3e325dfef | ||
|
|
6aae528cc3 | ||
|
|
9d3825a027 | ||
|
|
6e8f1c3878 | ||
|
|
f712db9df6 | ||
|
|
55840040df | ||
|
|
bb7c4cff20 | ||
|
|
8a72a868fd | ||
|
|
9c0bab0059 | ||
|
|
8f5c55f63e | ||
|
|
d35a7bf4b4 | ||
|
|
79ac69d9c9 | ||
|
|
5d9114c9cb | ||
|
|
7955fab22a | ||
|
|
866e5b4956 | ||
|
|
a964738a5c | ||
|
|
1e09cbf118 | ||
|
|
9e864bfcce | ||
|
|
13f219569d | ||
|
|
0c76265d08 | ||
|
|
9d8940c5b9 | ||
|
|
84ef414bd4 | ||
|
|
57102f6c06 | ||
|
|
6805e44004 | ||
|
|
e3bc2e488d | ||
|
|
00b4e65677 | ||
|
|
f8c364b720 | ||
|
|
85e6ac468e | ||
|
|
d3b8b5be34 | ||
|
|
f3865bd4ef | ||
|
|
5886a5060a | ||
|
|
9bc43f3e65 | ||
|
|
b3983323a1 | ||
|
|
6449ed1553 | ||
|
|
6e78c5502c | ||
|
|
583fd4b229 | ||
|
|
0a2c984222 | ||
|
|
91d209362b | ||
|
|
b5d9776cd2 | ||
|
|
55ab8649e7 | ||
|
|
309414ee8d | ||
|
|
bcf91e578c | ||
|
|
b7e3f10e80 | ||
|
|
d93ef3c8c8 | ||
|
|
e5b7404f25 | ||
|
|
2725ad8de4 | ||
|
|
28d4e55432 | ||
|
|
21c317a892 | ||
|
|
aee5c53a8d | ||
|
|
54b91c85e7 | ||
|
|
90eac8984a | ||
|
|
91c9400816 | ||
|
|
54c0ef6ff5 | ||
|
|
79c8f2f50b | ||
|
|
828eaeee25 | ||
|
|
8d4da3c589 | ||
|
|
0e1606ba3d | ||
|
|
c6a46c6e1d |
@@ -1,4 +1,4 @@
|
||||
src-git packages https://git.lede-project.org/feed/packages.git^2578f56c298ef8691cc9448dc9f583fc8159260e
|
||||
src-git luci https://git.lede-project.org/project/luci.git^b78664c2cd4046a1e77285834b71f9523c91afe7
|
||||
src-git routing https://git.lede-project.org/feed/routing.git^d09478290f72c6e58833b65baf14d9173eaf98e1
|
||||
src-git telephony https://git.lede-project.org/feed/telephony.git^b60d32979aa1913bf37ae7c09e4773735f9f255f
|
||||
src-git packages https://git.lede-project.org/feed/packages.git^545d2fadd7245783e40f235fe2c5d8c3ab1549cd
|
||||
src-git luci https://git.lede-project.org/project/luci.git^71e2af4f51567061600840040508d642120a8532
|
||||
src-git routing https://git.lede-project.org/feed/routing.git^af18086ba8de36e7fbc696cb39f634f6a7ea34de
|
||||
src-git telephony https://git.lede-project.org/feed/telephony.git^31398a3759c99bdb2dca359b78e25c17b6dd434a
|
||||
|
||||
@@ -6,8 +6,10 @@
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
OPENWRT_GIT = http://git.openwrt.org
|
||||
LEDE_GIT = https://git.lede-project.org
|
||||
PROJECT_GIT = https://git.openwrt.org
|
||||
|
||||
OPENWRT_GIT = $(PROJECT_GIT)
|
||||
LEDE_GIT = $(PROJECT_GIT)
|
||||
|
||||
ifdef PKG_SOURCE_VERSION
|
||||
PKG_VERSION ?= $(if $(PKG_SOURCE_DATE),$(PKG_SOURCE_DATE)-)$(call version_abbrev,$(PKG_SOURCE_VERSION))
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
LINUX_RELEASE?=1
|
||||
|
||||
LINUX_VERSION-3.18 = .43
|
||||
LINUX_VERSION-4.4 = .140
|
||||
LINUX_VERSION-4.4 = .182
|
||||
|
||||
LINUX_KERNEL_HASH-3.18.43 = 1236e8123a6ce537d5029232560966feed054ae31776fe8481dd7d18cdd5492c
|
||||
LINUX_KERNEL_HASH-4.4.140 = 184c8f3cde0caca0d2a15ee2b6ce47e3a5b57038bc15a65e631d6b340886c7bb
|
||||
LINUX_KERNEL_HASH-4.4.182 = c409d88f61cd9a37cbba36d5d9c8162263eb1e5c9380efaf880a3ec10cd88527
|
||||
|
||||
ifdef KERNEL_PATCHVER
|
||||
LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER)))
|
||||
|
||||
@@ -196,7 +196,7 @@ $(_endef)
|
||||
fi; \
|
||||
done; $(Package/$(1)/extra_provides) \
|
||||
) | sort -u > $(PKG_INFO_DIR)/$(1).provides
|
||||
$(if $(PROVIDES),@for pkg in $(PROVIDES); do cp $(PKG_INFO_DIR)/$(1).provides $(PKG_INFO_DIR)/$$$$pkg.provides; done)
|
||||
$(if $(PROVIDES),@for pkg in $(filter-out $(1),$(PROVIDES)); do cp $(PKG_INFO_DIR)/$(1).provides $(PKG_INFO_DIR)/$$$$pkg.provides; done)
|
||||
$(CheckDependencies)
|
||||
|
||||
$(RSTRIP) $$(IDIR_$(1))
|
||||
|
||||
@@ -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),17.01.5)
|
||||
VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),17.01.7)
|
||||
|
||||
VERSION_CODE:=$(call qstrip_escape,$(CONFIG_VERSION_CODE))
|
||||
VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),r3919-38e704be71)
|
||||
VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),r4030-6028f00df0)
|
||||
|
||||
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/releases/17.01.5)
|
||||
VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.lede-project.org/releases/17.01.7)
|
||||
|
||||
VERSION_DIST:=$(call qstrip_escape,$(CONFIG_VERSION_DIST))
|
||||
VERSION_DIST:=$(if $(VERSION_DIST),$(VERSION_DIST),LEDE)
|
||||
|
||||
8
package/base-files/files/etc/iproute2/ematch_map
Normal file
8
package/base-files/files/etc/iproute2/ematch_map
Normal file
@@ -0,0 +1,8 @@
|
||||
# lookup table for ematch kinds
|
||||
1 cmp
|
||||
2 nbyte
|
||||
3 u32
|
||||
4 meta
|
||||
7 canid
|
||||
8 ipset
|
||||
9 ipt
|
||||
@@ -23,6 +23,7 @@ reload() {
|
||||
restart() {
|
||||
trap '' TERM
|
||||
stop "$@"
|
||||
trap - TERM
|
||||
start "$@"
|
||||
}
|
||||
|
||||
|
||||
@@ -165,22 +165,27 @@ insert_modules() {
|
||||
|
||||
default_prerm() {
|
||||
local root="${IPKG_INSTROOT}"
|
||||
local name
|
||||
local pkgname="$(basename ${1%.*})"
|
||||
local ret=0
|
||||
|
||||
name=$(basename ${1%.*})
|
||||
[ -f "$root/usr/lib/opkg/info/${name}.prerm-pkg" ] && . "$root/usr/lib/opkg/info/${name}.prerm-pkg"
|
||||
if [ -f "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" ]; then
|
||||
( . "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" )
|
||||
ret=$?
|
||||
fi
|
||||
|
||||
local shell="$(which bash)"
|
||||
for i in `cat "$root/usr/lib/opkg/info/${name}.list" | grep "^/etc/init.d/"`; do
|
||||
for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
|
||||
if [ -n "$root" ]; then
|
||||
${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
|
||||
else
|
||||
if [ "$PKG_UPGRADE" != "1" ]; then
|
||||
"$i" disable
|
||||
fi
|
||||
"$i" stop || /bin/true
|
||||
"$i" stop
|
||||
fi
|
||||
done
|
||||
|
||||
return $ret
|
||||
}
|
||||
|
||||
add_group_and_user() {
|
||||
@@ -238,10 +243,9 @@ default_postinst() {
|
||||
if [ -z "$root" ] && grep -q -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"; then
|
||||
. /lib/functions/system.sh
|
||||
[ -d /tmp/.uci ] || mkdir -p /tmp/.uci
|
||||
for i in $(sed -ne 's!^/etc/uci-defaults/!!p' "/usr/lib/opkg/info/${pkgname}.list"); do (
|
||||
cd /etc/uci-defaults
|
||||
[ -f "$i" ] && . ./"$i" && rm -f "$i"
|
||||
) done
|
||||
for i in $(grep -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"); do
|
||||
( [ -f "$i" ] && cd "$(dirname $i)" && . "$i" ) && rm -f "$i"
|
||||
done
|
||||
uci commit
|
||||
fi
|
||||
|
||||
|
||||
@@ -190,7 +190,7 @@ if VERSIONOPT
|
||||
config VERSION_REPO
|
||||
string
|
||||
prompt "Release repository"
|
||||
default "http://downloads.lede-project.org/releases/17.01.5"
|
||||
default "http://downloads.lede-project.org/releases/17.01.7"
|
||||
help
|
||||
This is the repository address embedded in the image, it defaults
|
||||
to the trunk snapshot repo; the url may contain the following placeholders:
|
||||
|
||||
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=grub
|
||||
PKG_VERSION:=2.02
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=@GNU/grub
|
||||
|
||||
40
package/boot/grub2/patches/300-CVE-2015-8370.patch
Normal file
40
package/boot/grub2/patches/300-CVE-2015-8370.patch
Normal file
@@ -0,0 +1,40 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Marco-Gisbert <hecmargi@upv.es>
|
||||
Date: Fri, 13 Nov 2015 16:21:09 +0100
|
||||
Subject: [PATCH] Fix security issue when reading username and password
|
||||
|
||||
This patch fixes two integer underflows at:
|
||||
* grub-core/lib/crypto.c
|
||||
* grub-core/normal/auth.c
|
||||
|
||||
Resolves: CVE-2015-8370
|
||||
|
||||
Signed-off-by: Hector Marco-Gisbert <hecmargi@upv.es>
|
||||
Signed-off-by: Ismael Ripoll-Ripoll <iripoll@disca.upv.es>
|
||||
---
|
||||
grub-core/lib/crypto.c | 2 +-
|
||||
grub-core/normal/auth.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/grub-core/lib/crypto.c
|
||||
+++ b/grub-core/lib/crypto.c
|
||||
@@ -468,7 +468,7 @@ grub_password_get (char buf[], unsigned
|
||||
break;
|
||||
}
|
||||
|
||||
- if (key == '\b')
|
||||
+ if (key == '\b' && cur_len)
|
||||
{
|
||||
if (cur_len)
|
||||
cur_len--;
|
||||
--- a/grub-core/normal/auth.c
|
||||
+++ b/grub-core/normal/auth.c
|
||||
@@ -172,7 +172,7 @@ grub_username_get (char buf[], unsigned
|
||||
break;
|
||||
}
|
||||
|
||||
- if (key == '\b')
|
||||
+ if (key == '\b' && cur_len)
|
||||
{
|
||||
if (cur_len)
|
||||
{
|
||||
@@ -26,7 +26,7 @@ include $(INCLUDE_DIR)/package.mk
|
||||
define Package/perf
|
||||
SECTION:=devel
|
||||
CATEGORY:=Development
|
||||
DEPENDS:= +libelf1 +libdw +(mips||mipsel||powerpc||i386||x86_64||arm):libunwind +libpthread +librt +objdump @!LINUX_3_18 @!IN_SDK
|
||||
DEPENDS:= +libelf1 +libdw +(mips||mipsel||powerpc||i386||x86_64||arm||aarch64):libunwind +libpthread +librt +objdump @!LINUX_3_18 @!IN_SDK
|
||||
TITLE:=Linux performance monitoring tool
|
||||
VERSION:=$(LINUX_VERSION)-$(PKG_RELEASE)
|
||||
URL:=http://www.kernel.org
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=amd64-microcode
|
||||
PKG_VERSION:=20171205
|
||||
PKG_VERSION:=20180524
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=amd64-microcode_3.$(PKG_VERSION).$(PKG_RELEASE).tar.xz
|
||||
PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/non-free/a/amd64-microcode/
|
||||
PKG_HASH:=a38bc072f535a3d3c1bf4e9e545197aa5114e979e94ef7e4a67e615df2f853a7
|
||||
PKG_HASH:=7c389c357c242e7161f6872bf4e12011a71e4c0683f06fb1bcfad650a78bf0a9
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-3.$(PKG_VERSION).$(PKG_RELEASE)
|
||||
|
||||
PKG_LICENSE_FILE:=LICENSE.amd-ucode
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=intel-microcode
|
||||
PKG_VERSION:=20180312
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=20180703
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=intel-microcode_3.$(PKG_VERSION).$(PKG_RELEASE).tar.xz
|
||||
PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/non-free/i/intel-microcode/
|
||||
PKG_HASH:=6ccb295d23961c7b96a69280e30fdce939e1d905147b22b8428886b173812d52
|
||||
PKG_HASH:=26dfaa47100ce3d06f968edefa7539da10de7b96d5d8e26ee8174a040ee5cdae
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-3.$(PKG_VERSION).$(PKG_RELEASE)
|
||||
|
||||
PKG_BUILD_DEPENDS:=iucode-tool/host
|
||||
@@ -36,14 +36,14 @@ endef
|
||||
|
||||
define Build/Compile
|
||||
IUCODE_TOOL=$(STAGING_DIR)/../host/bin/iucode_tool $(MAKE) -C $(PKG_BUILD_DIR)
|
||||
mkdir $(PKG_BUILD_DIR)/intel-ucode
|
||||
mkdir $(PKG_BUILD_DIR)/intel-ucode-ipkg
|
||||
$(STAGING_DIR)/../host/bin/iucode_tool -q \
|
||||
--write-firmware=$(PKG_BUILD_DIR)/intel-ucode $(PKG_BUILD_DIR)/$(MICROCODE).bin
|
||||
--write-firmware=$(PKG_BUILD_DIR)/intel-ucode-ipkg $(PKG_BUILD_DIR)/$(MICROCODE).bin
|
||||
endef
|
||||
|
||||
define Package/intel-microcode/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/intel-ucode
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/intel-ucode/* $(1)/lib/firmware/intel-ucode
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/intel-ucode-ipkg/* $(1)/lib/firmware/intel-ucode
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,intel-microcode))
|
||||
|
||||
@@ -13,9 +13,10 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/dtaht/sch_cake.git
|
||||
PKG_SOURCE_DATE:=2018-01-07
|
||||
PKG_SOURCE_VERSION:=568ed96467f41aad37556b0db11fc008e05941e9
|
||||
PKG_MIRROR_HASH:=8f3f962824826d07b1029379d91e01bf97fe0bfce1233af5cfa7a54cb1c3632c
|
||||
PKG_SOURCE_DATE:=2018-07-16
|
||||
PKG_SOURCE_VERSION:=f39ab9a402ad51d7c17d4cde18ca15b2b7022030
|
||||
PKG_MIRROR_HASH:=fc22fc6eb7a24f4595c2777f33758ebcf9a2a404c16d00aa37ae389cd7f9c78f
|
||||
PKG_MAINTAINER:=Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2017-01-31
|
||||
PKG_RELEASE:=5
|
||||
PKG_RELEASE:=15
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_BACKPORT_VERSION:=
|
||||
PKG_HASH:=75e6d39e34cf156212a2509172a4a62b673b69eb4a1d9aaa565f7fa719fa2317
|
||||
|
||||
@@ -14,6 +14,10 @@ MP_CONFIG_INT="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh
|
||||
MP_CONFIG_BOOL="mesh_auto_open_plinks mesh_fwding"
|
||||
MP_CONFIG_STRING="mesh_power_mode"
|
||||
|
||||
iw() {
|
||||
command iw $@ || logger -t mac80211 "Failed command: iw $@"
|
||||
}
|
||||
|
||||
drv_mac80211_init_device_config() {
|
||||
hostapd_common_add_device_config
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
--- a/backport-include/linux/mm.h
|
||||
+++ b/backport-include/linux/mm.h
|
||||
@@ -39,8 +39,20 @@ static inline
|
||||
long backport_get_user_pages_locked(unsigned long start, unsigned long nr_pages,
|
||||
int write, int force, struct page **pages, int *locked)
|
||||
{
|
||||
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,4,168))
|
||||
return get_user_pages_locked(current, current->mm, start, nr_pages,
|
||||
write, force, pages, locked);
|
||||
+#else
|
||||
+ int flags = 0;
|
||||
+
|
||||
+ if (write)
|
||||
+ flags |= FOLL_WRITE;
|
||||
+ if (force)
|
||||
+ flags |= FOLL_FORCE;
|
||||
+
|
||||
+ return get_user_pages_locked(current, current->mm, start, nr_pages,
|
||||
+ flags, pages, locked);
|
||||
+#endif
|
||||
}
|
||||
#define get_user_pages_locked LINUX_BACKPORT(get_user_pages_locked)
|
||||
|
||||
@@ -48,8 +60,20 @@ static inline
|
||||
long backport_get_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
|
||||
int write, int force, struct page **pages)
|
||||
{
|
||||
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,4,168))
|
||||
return get_user_pages_unlocked(current, current->mm, start, nr_pages,
|
||||
write, force, pages);
|
||||
+#else
|
||||
+ int flags = 0;
|
||||
+
|
||||
+ if (write)
|
||||
+ flags |= FOLL_WRITE;
|
||||
+ if (force)
|
||||
+ flags |= FOLL_FORCE;
|
||||
+
|
||||
+ return get_user_pages_unlocked(current, current->mm, start, nr_pages,
|
||||
+ pages, flags);
|
||||
+#endif
|
||||
}
|
||||
#define get_user_pages_unlocked LINUX_BACKPORT(get_user_pages_unlocked)
|
||||
#endif
|
||||
@@ -60,8 +84,20 @@ long backport_get_user_pages(unsigned lo
|
||||
int write, int force, struct page **pages,
|
||||
struct vm_area_struct **vmas)
|
||||
{
|
||||
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,4,168))
|
||||
return get_user_pages(current, current->mm, start, nr_pages,
|
||||
write, force, pages, vmas);
|
||||
+#else
|
||||
+ int flags = 0;
|
||||
+
|
||||
+ if (write)
|
||||
+ flags |= FOLL_WRITE;
|
||||
+ if (force)
|
||||
+ flags |= FOLL_FORCE;
|
||||
+
|
||||
+ return get_user_pages(current, current->mm, start, nr_pages,
|
||||
+ flags, pages, vmas);
|
||||
+#endif
|
||||
}
|
||||
#define get_user_pages LINUX_BACKPORT(get_user_pages)
|
||||
#endif
|
||||
@@ -0,0 +1,61 @@
|
||||
From d77facb88448cdeaaa3adba5b9704a48ac2ac8d6 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 28 Mar 2017 09:11:30 +0100
|
||||
Subject: [PATCH] brcmfmac: use local iftype avoiding use-after-free of virtual
|
||||
interface
|
||||
|
||||
A use-after-free was found using KASAN. In brcmf_p2p_del_if() the virtual
|
||||
interface is removed using call to brcmf_remove_interface(). After that
|
||||
the virtual interface instance has been freed and should not be referenced.
|
||||
Solve this by storing the nl80211 iftype in local variable, which is used
|
||||
in a couple of places anyway.
|
||||
|
||||
Cc: stable@vger.kernel.org # 4.10.x, 4.9.x
|
||||
Reported-by: Daniel J Blueman <daniel@quora.org>
|
||||
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/p2p.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -2240,14 +2240,16 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
struct brcmf_p2p_info *p2p = &cfg->p2p;
|
||||
struct brcmf_cfg80211_vif *vif;
|
||||
+ enum nl80211_iftype iftype;
|
||||
bool wait_for_disable = false;
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "delete P2P vif\n");
|
||||
vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
|
||||
|
||||
+ iftype = vif->wdev.iftype;
|
||||
brcmf_cfg80211_arm_vif_event(cfg, vif);
|
||||
- switch (vif->wdev.iftype) {
|
||||
+ switch (iftype) {
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
if (test_bit(BRCMF_VIF_STATUS_DISCONNECTING, &vif->sme_state))
|
||||
wait_for_disable = true;
|
||||
@@ -2277,7 +2279,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
|
||||
BRCMF_P2P_DISABLE_TIMEOUT);
|
||||
|
||||
err = 0;
|
||||
- if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) {
|
||||
+ if (iftype != NL80211_IFTYPE_P2P_DEVICE) {
|
||||
brcmf_vif_clear_mgmt_ies(vif);
|
||||
err = brcmf_p2p_release_p2p_if(vif);
|
||||
}
|
||||
@@ -2293,7 +2295,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph
|
||||
brcmf_remove_interface(vif->ifp, true);
|
||||
|
||||
brcmf_cfg80211_arm_vif_event(cfg, NULL);
|
||||
- if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE)
|
||||
+ if (iftype != NL80211_IFTYPE_P2P_DEVICE)
|
||||
p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
|
||||
|
||||
return err;
|
||||
@@ -0,0 +1,148 @@
|
||||
From f1ac3aa212af6dd0a36dc07a63f95f91be6f4935 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 24 Feb 2017 17:32:46 +0100
|
||||
Subject: [PATCH] brcmfmac: always print error when PSM's watchdog fires
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far we were attaching BRCMF_E_PSM_WATCHDOG event listener in
|
||||
brcmf_debug_attach which gets compiled only with CONFIG_BRCMDBG. This
|
||||
event means something went wrong and firmware / hardware usually can't
|
||||
be expected to work (reliably).
|
||||
|
||||
Such a problem is significant for user experience so I believe we should
|
||||
print an error unconditionally (even with debugging disabled). What can
|
||||
be indeed optional is dumping bus memory as this is clearly part of
|
||||
debugging process.
|
||||
|
||||
In the future we may also try to extend this listener by trying to
|
||||
recover from the error or at least signal it to the cfg80211.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 22 ++++++++++++++++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/debug.c | 26 +++-------------------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/debug.h | 9 ++++++++
|
||||
3 files changed, 34 insertions(+), 23 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -748,6 +748,24 @@ void brcmf_remove_interface(struct brcmf
|
||||
brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
|
||||
}
|
||||
|
||||
+static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
|
||||
+ const struct brcmf_event_msg *evtmsg,
|
||||
+ void *data)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
+
|
||||
+ brcmf_err("PSM's watchdog has fired!\n");
|
||||
+
|
||||
+ err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
|
||||
+ evtmsg->datalen);
|
||||
+ if (err)
|
||||
+ brcmf_err("Failed to get memory dump, %d\n", err);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_INET
|
||||
#define ARPOL_MAX_ENTRIES 8
|
||||
static int brcmf_inetaddr_changed(struct notifier_block *nb,
|
||||
@@ -927,6 +945,10 @@ int brcmf_attach(struct device *dev, str
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ /* Attach to events important for core code */
|
||||
+ brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
|
||||
+ brcmf_psm_watchdog_notify);
|
||||
+
|
||||
/* attach firmware event handler */
|
||||
brcmf_fweh_attach(drvr);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
|
||||
@@ -27,8 +27,8 @@
|
||||
|
||||
static struct dentry *root_folder;
|
||||
|
||||
-static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
- size_t len)
|
||||
+int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
+ size_t len)
|
||||
{
|
||||
void *dump;
|
||||
size_t ramsize;
|
||||
@@ -54,24 +54,6 @@ static int brcmf_debug_create_memdump(st
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp,
|
||||
- const struct brcmf_event_msg *evtmsg,
|
||||
- void *data)
|
||||
-{
|
||||
- int err;
|
||||
-
|
||||
- brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
-
|
||||
- brcmf_err("PSM's watchdog has fired!\n");
|
||||
-
|
||||
- err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
|
||||
- evtmsg->datalen);
|
||||
- if (err)
|
||||
- brcmf_err("Failed to get memory dump, %d\n", err);
|
||||
-
|
||||
- return err;
|
||||
-}
|
||||
-
|
||||
void brcmf_debugfs_init(void)
|
||||
{
|
||||
root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
|
||||
@@ -99,9 +81,7 @@ int brcmf_debug_attach(struct brcmf_pub
|
||||
if (IS_ERR(drvr->dbgfs_dir))
|
||||
return PTR_ERR(drvr->dbgfs_dir);
|
||||
|
||||
-
|
||||
- return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
|
||||
- brcmf_debug_psm_watchdog_notify);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
void brcmf_debug_detach(struct brcmf_pub *drvr)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -99,6 +99,7 @@ do { \
|
||||
|
||||
extern int brcmf_msg_level;
|
||||
|
||||
+struct brcmf_bus;
|
||||
struct brcmf_pub;
|
||||
#ifdef DEBUG
|
||||
void brcmf_debugfs_init(void);
|
||||
@@ -108,6 +109,8 @@ void brcmf_debug_detach(struct brcmf_pub
|
||||
struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
|
||||
int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
|
||||
int (*read_fn)(struct seq_file *seq, void *data));
|
||||
+int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
+ size_t len);
|
||||
#else
|
||||
static inline void brcmf_debugfs_init(void)
|
||||
{
|
||||
@@ -128,6 +131,12 @@ int brcmf_debugfs_add_entry(struct brcmf
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
+static inline
|
||||
+int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
+ size_t len)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
#endif
|
||||
|
||||
#endif /* BRCMFMAC_DEBUG_H */
|
||||
@@ -0,0 +1,56 @@
|
||||
From d79fe4cb70d8deab7b8dc1de547ed4b915574414 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 8 Mar 2017 14:50:15 +0100
|
||||
Subject: [PATCH] brcmfmac: Do not print the firmware version as an error
|
||||
|
||||
Using pr_err for things which are not errors is a bad idea. E.g. it
|
||||
will cause the plymouth bootsplash screen to drop back to the text
|
||||
console so that the user can see the error, which is not what we
|
||||
normally want to happen.
|
||||
|
||||
Instead add a new brcmf_info macro and use that.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 9 +++++++++
|
||||
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -161,7 +161,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
strsep(&ptr, "\n");
|
||||
|
||||
/* Print fw version info */
|
||||
- brcmf_err("Firmware version = %s\n", buf);
|
||||
+ brcmf_info("Firmware version = %s\n", buf);
|
||||
|
||||
/* locate firmware version number for ethtool */
|
||||
ptr = strrchr(buf, ' ') + 1;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -59,6 +59,10 @@ void __brcmf_err(const char *func, const
|
||||
} while (0)
|
||||
|
||||
#if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
|
||||
+
|
||||
+/* For debug/tracing purposes treat info messages as errors */
|
||||
+#define brcmf_info brcmf_err
|
||||
+
|
||||
__printf(3, 4)
|
||||
void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...);
|
||||
#define brcmf_dbg(level, fmt, ...) \
|
||||
@@ -77,6 +81,11 @@ do { \
|
||||
|
||||
#else /* defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) */
|
||||
|
||||
+#define brcmf_info(fmt, ...) \
|
||||
+ do { \
|
||||
+ pr_info("%s: " fmt, __func__, ##__VA_ARGS__); \
|
||||
+ } while (0)
|
||||
+
|
||||
#define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
|
||||
|
||||
#define BRCMF_DATA_ON() 0
|
||||
@@ -0,0 +1,28 @@
|
||||
From 26e537884a8ef451f5c60f6949b1615069931ffa Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 8 Mar 2017 14:50:16 +0100
|
||||
Subject: [PATCH] brcmfmac: Do not complain about country code "00"
|
||||
|
||||
The country code gets set to "00" by default at boot, ignore this
|
||||
rather then logging an error about it.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6736,6 +6736,10 @@ static void brcmf_cfg80211_reg_notifier(
|
||||
s32 err;
|
||||
int i;
|
||||
|
||||
+ /* The country code gets set to "00" by default at boot, ignore */
|
||||
+ if (req->alpha2[0] == '0' && req->alpha2[1] == '0')
|
||||
+ return;
|
||||
+
|
||||
/* ignore non-ISO3166 country codes */
|
||||
for (i = 0; i < sizeof(req->alpha2); i++)
|
||||
if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
|
||||
@@ -0,0 +1,35 @@
|
||||
From b9472a2e3e452c414634b3ccb1ef6c4098878686 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 8 Mar 2017 14:50:17 +0100
|
||||
Subject: [PATCH] brcmfmac: Handle status == BRCMF_E_STATUS_ABORT in
|
||||
cfg80211_escan_handler
|
||||
|
||||
If a scan gets aborted BRCMF_SCAN_STATUS_BUSY gets cleared in
|
||||
cfg->scan_status and when we receive an abort event from the firmware
|
||||
the BRCMF_SCAN_STATUS_BUSY check in the cfg80211_escan_handler will
|
||||
trigger resulting in multiple errors getting logged.
|
||||
|
||||
Check for a status of BRCMF_E_STATUS_ABORT and in this case simply
|
||||
cleanly exit the cfg80211_escan_handler. This also avoids a
|
||||
BRCMF_E_STATUS_ABORT event arriving after a new scan has been started
|
||||
causing the new scan to complete prematurely without any data.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -3097,6 +3097,9 @@ brcmf_cfg80211_escan_handler(struct brcm
|
||||
|
||||
status = e->status;
|
||||
|
||||
+ if (status == BRCMF_E_STATUS_ABORT)
|
||||
+ goto exit;
|
||||
+
|
||||
if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
|
||||
brcmf_err("scan not ready, bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
return -EPERM;
|
||||
@@ -0,0 +1,29 @@
|
||||
From 49fe9b59f0e9b750f173fbe44637c436ba1030d2 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 28 Mar 2017 11:43:27 +0100
|
||||
Subject: [PATCH] brcmfmac: restore bus state when enter_D3 fails
|
||||
|
||||
In brcmf_pcie_suspend() we inform the firmware on the device that
|
||||
it will enter in D3 state. Before this is done we already bring down
|
||||
the bus state. However, When entering D3 fails we abort the suspend
|
||||
and the bus state need to be restored.
|
||||
|
||||
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/pcie.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1877,6 +1877,7 @@ static int brcmf_pcie_pm_enter_D3(struct
|
||||
BRCMF_PCIE_MBDATA_TIMEOUT);
|
||||
if (!devinfo->mbdata_completed) {
|
||||
brcmf_err("Timeout on response for entering D3 substate\n");
|
||||
+ brcmf_bus_change_state(bus, BRCMF_BUS_UP);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From 6e84ab604bdedaa16239bd1c6e5fcb5660309f02 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 5 Apr 2017 20:33:26 +0200
|
||||
Subject: [PATCH] brcmfmac: properly align buffers on certain platforms with 64
|
||||
bit DMA
|
||||
|
||||
Systems with 64 bit DMA at least partially require buffers to be used
|
||||
for DMA to be 8-byte-aligned. One example is Amlogic Meson GX.
|
||||
Switching the MMC/SDIO driver for this platform to SG DMA mode
|
||||
resulted in problems due to unaligned buffers.
|
||||
|
||||
Fortunately the brcmfmac driver has a global define for the alignment.
|
||||
Changing it to 8 fixed the issues with Meson GX.
|
||||
|
||||
Suggested-by: Helmut Klein <hgkr.klein@gmail.com>
|
||||
Tested-by: Helmut Klein <hgkr.klein@gmail.com>
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -539,7 +539,11 @@ static int qcount[NUMPRIO];
|
||||
/* Limit on rounding up frames */
|
||||
static const uint max_roundup = 512;
|
||||
|
||||
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
||||
+#define ALIGNMENT 8
|
||||
+#else
|
||||
#define ALIGNMENT 4
|
||||
+#endif
|
||||
|
||||
enum brcmf_sdio_frmtype {
|
||||
BRCMF_SDIO_FT_NORMAL,
|
||||
@@ -0,0 +1,61 @@
|
||||
From 4835f37e3bafc138f8bfa3cbed2920dd56fed283 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 6 Apr 2017 13:14:40 +0100
|
||||
Subject: [PATCH] brcmfmac: add length checks in scheduled scan result handler
|
||||
|
||||
Assure the event data buffer is long enough to hold the array
|
||||
of netinfo items and that SSID length does not exceed the maximum
|
||||
of 32 characters as per 802.11 spec.
|
||||
|
||||
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 | 13 +++++++++++--
|
||||
1 file changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -3300,6 +3300,7 @@ brcmf_notify_sched_scan_results(struct b
|
||||
struct brcmf_pno_scanresults_le *pfn_result;
|
||||
u32 result_count;
|
||||
u32 status;
|
||||
+ u32 datalen;
|
||||
|
||||
brcmf_dbg(SCAN, "Enter\n");
|
||||
|
||||
@@ -3326,6 +3327,14 @@ brcmf_notify_sched_scan_results(struct b
|
||||
brcmf_err("FALSE PNO Event. (pfn_count == 0)\n");
|
||||
goto out_err;
|
||||
}
|
||||
+
|
||||
+ netinfo_start = brcmf_get_netinfo_array(pfn_result);
|
||||
+ datalen = e->datalen - ((void *)netinfo_start - (void *)pfn_result);
|
||||
+ if (datalen < result_count * sizeof(*netinfo)) {
|
||||
+ brcmf_err("insufficient event data\n");
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+
|
||||
request = brcmf_alloc_internal_escan_request(wiphy,
|
||||
result_count);
|
||||
if (!request) {
|
||||
@@ -3333,8 +3342,6 @@ brcmf_notify_sched_scan_results(struct b
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
- netinfo_start = brcmf_get_netinfo_array(pfn_result);
|
||||
-
|
||||
for (i = 0; i < result_count; i++) {
|
||||
netinfo = &netinfo_start[i];
|
||||
if (!netinfo) {
|
||||
@@ -3344,6 +3351,8 @@ brcmf_notify_sched_scan_results(struct b
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
+ if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN)
|
||||
+ netinfo->SSID_len = IEEE80211_MAX_SSID_LEN;
|
||||
brcmf_dbg(SCAN, "SSID:%.32s Channel:%d\n",
|
||||
netinfo->SSID, netinfo->channel);
|
||||
err = brcmf_internal_escan_add_info(request,
|
||||
@@ -0,0 +1,32 @@
|
||||
From 6594e1e8343645fe849a2ad42fcab94e2cf5b2c0 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 6 Apr 2017 13:14:41 +0100
|
||||
Subject: [PATCH] brcmfmac: remove bogus check in scheduled scan result handler
|
||||
|
||||
Checking whether the address of an array element is null is bogus
|
||||
so removing it.
|
||||
|
||||
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 | 6 ------
|
||||
1 file changed, 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -3344,12 +3344,6 @@ brcmf_notify_sched_scan_results(struct b
|
||||
|
||||
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;
|
||||
- }
|
||||
|
||||
if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN)
|
||||
netinfo->SSID_len = IEEE80211_MAX_SSID_LEN;
|
||||
@@ -0,0 +1,56 @@
|
||||
From 6ea51fc708aedcf411f355de65a704ecda501bc4 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 6 Apr 2017 13:14:42 +0100
|
||||
Subject: [PATCH] brcmfmac: only add channels and ssids once in scan request
|
||||
|
||||
When receiving pno results there may be duplicate channels and/or
|
||||
ssids. Assure each is added only once when preparing the internal
|
||||
escan 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>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 20 ++++++++++++++++----
|
||||
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -3216,7 +3216,7 @@ static int brcmf_internal_escan_add_info
|
||||
{
|
||||
struct ieee80211_channel *chan;
|
||||
enum nl80211_band band;
|
||||
- int freq;
|
||||
+ int freq, i;
|
||||
|
||||
if (channel <= CH_MAX_2G_CHANNEL)
|
||||
band = NL80211_BAND_2GHZ;
|
||||
@@ -3231,10 +3231,22 @@ static int brcmf_internal_escan_add_info
|
||||
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;
|
||||
-
|
||||
+ for (i = 0; i < req->n_channels; i++) {
|
||||
+ if (req->channels[i] == chan)
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i == req->n_channels)
|
||||
+ req->channels[req->n_channels++] = chan;
|
||||
+
|
||||
+ for (i = 0; i < req->n_ssids; i++) {
|
||||
+ if (req->ssids[i].ssid_len == ssid_len &&
|
||||
+ !memcmp(req->ssids[i].ssid, ssid, ssid_len))
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i == req->n_ssids) {
|
||||
+ memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len);
|
||||
+ req->ssids[req->n_ssids++].ssid_len = ssid_len;
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
From 455a1eb4654c24560eb9dfc634f29cba3d87601e Mon Sep 17 00:00:00 2001
|
||||
From: James Hughes <james.hughes@raspberrypi.org>
|
||||
Date: Mon, 24 Apr 2017 12:40:50 +0100
|
||||
Subject: [PATCH] brcmfmac: Ensure pointer correctly set if skb data location
|
||||
changes
|
||||
|
||||
The incoming skb header may be resized if header space is
|
||||
insufficient, which might change the data adddress in the skb.
|
||||
Ensure that a cached pointer to that data is correctly set by
|
||||
moving assignment to after any possible changes.
|
||||
|
||||
Signed-off-by: James Hughes <james.hughes@raspberrypi.org>
|
||||
|
||||
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 | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -198,7 +198,7 @@ static netdev_tx_t brcmf_netdev_start_xm
|
||||
int ret;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
- struct ethhdr *eh = (struct ethhdr *)(skb->data);
|
||||
+ struct ethhdr *eh;
|
||||
|
||||
brcmf_dbg(DATA, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
|
||||
|
||||
@@ -236,6 +236,8 @@ static netdev_tx_t brcmf_netdev_start_xm
|
||||
goto done;
|
||||
}
|
||||
|
||||
+ eh = (struct ethhdr *)(skb->data);
|
||||
+
|
||||
if (eh->h_proto == htons(ETH_P_PAE))
|
||||
atomic_inc(&ifp->pend_8021x_cnt);
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
From 9cc4b7cb86cbcc6330a3faa8cd65268cd2d3c227 Mon Sep 17 00:00:00 2001
|
||||
From: James Hughes <james.hughes@raspberrypi.org>
|
||||
Date: Tue, 25 Apr 2017 10:15:06 +0100
|
||||
Subject: [PATCH] brcmfmac: Make skb header writable before use
|
||||
|
||||
The driver was making changes to the skb_header without
|
||||
ensuring it was writable (i.e. uncloned).
|
||||
This patch also removes some boiler plate header size
|
||||
checking/adjustment code as that is also handled by the
|
||||
skb_cow_header function used to make header writable.
|
||||
|
||||
Signed-off-by: James Hughes <james.hughes@raspberrypi.org>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 19 +++++--------------
|
||||
1 file changed, 5 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -211,22 +211,13 @@ static netdev_tx_t brcmf_netdev_start_xm
|
||||
goto done;
|
||||
}
|
||||
|
||||
- /* Make sure there's enough room for any header */
|
||||
- if (skb_headroom(skb) < drvr->hdrlen) {
|
||||
- struct sk_buff *skb2;
|
||||
-
|
||||
- brcmf_dbg(INFO, "%s: insufficient headroom\n",
|
||||
+ /* Make sure there's enough writable headroom*/
|
||||
+ ret = skb_cow_head(skb, drvr->hdrlen);
|
||||
+ if (ret < 0) {
|
||||
+ brcmf_err("%s: skb_cow_head failed\n",
|
||||
brcmf_ifname(ifp));
|
||||
- drvr->bus_if->tx_realloc++;
|
||||
- skb2 = skb_realloc_headroom(skb, drvr->hdrlen);
|
||||
dev_kfree_skb(skb);
|
||||
- skb = skb2;
|
||||
- if (skb == NULL) {
|
||||
- brcmf_err("%s: skb_realloc_headroom failed\n",
|
||||
- brcmf_ifname(ifp));
|
||||
- ret = -ENOMEM;
|
||||
- goto done;
|
||||
- }
|
||||
+ goto done;
|
||||
}
|
||||
|
||||
/* validate length for ether packet */
|
||||
@@ -0,0 +1,40 @@
|
||||
From 1dbf647f31751a4e94fa0435c34f0f5ad5ce0adc Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Fri, 26 May 2017 13:02:55 +0200
|
||||
Subject: [PATCH] brcmfmac: fix alignment configuration on host using 64-bit
|
||||
DMA
|
||||
|
||||
For SDIO the alignment requirement for transfers from device to host
|
||||
is configured in firmware. This configuration is limited to minimum
|
||||
of 4-byte alignment. However, this is not correct for platforms using
|
||||
64-bit DMA when the minimum alignment should be 8 bytes. This issue
|
||||
appeared when the ALIGNMENT definition was set according the DMA
|
||||
configuration. The configuration in firmware was not using that macro
|
||||
defintion, but a hardcoded value of 4. Hence the driver reported
|
||||
alignment failures for data coming from the device and causing
|
||||
transfers to fail.
|
||||
|
||||
Fixes: 6e84ab604bde ("brcmfmac: properly align buffers on certain platforms
|
||||
Reported-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Tested-by: Hans de Goede <hdegoede@redhat.com>
|
||||
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: Hans de Goede <hdegoede@redhat.com>
|
||||
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
|
||||
@@ -3420,7 +3420,7 @@ static int brcmf_sdio_bus_preinit(struct
|
||||
/* otherwise, set txglomalign */
|
||||
value = sdiodev->settings->bus.sdio.sd_sgentry_align;
|
||||
/* SDIO ADMA requires at least 32 bit alignment */
|
||||
- value = max_t(u32, value, 4);
|
||||
+ value = max_t(u32, value, ALIGNMENT);
|
||||
err = brcmf_iovar_data_set(dev, "bus:txglomalign", &value,
|
||||
sizeof(u32));
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
From 9029679f66d976f8c720eb03c4898274803c9923 Mon Sep 17 00:00:00 2001
|
||||
From: Chi-hsien Lin <Chi-Hsien.Lin@cypress.com>
|
||||
Date: Thu, 18 May 2017 17:22:19 +0800
|
||||
Subject: [PATCH] brcmfmac: remove setting IBSS mode when stopping AP
|
||||
|
||||
Upon stopping an AP interface the driver disable INFRA mode effectively
|
||||
setting the interface in IBSS mode. However, this may affect other
|
||||
interfaces running in INFRA mode. For instance, if user creates and stops
|
||||
hostap daemon on virtual interface, then association cannot work on
|
||||
primary interface because default BSS has been set to IBSS mode in
|
||||
firmware side. The IBSS mode should be set when cfg80211 changes the
|
||||
interface.
|
||||
|
||||
Reviewed-by: Wright Feng <wright.feng@cypress.com>
|
||||
Signed-off-by: Chi-hsien Lin <Chi-Hsien.Lin@cypress.com>
|
||||
[kvalo@codeaurora.org: rephased commit log based on discussion]
|
||||
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 | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -4676,9 +4676,6 @@ static int brcmf_cfg80211_stop_ap(struct
|
||||
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
|
||||
if (err < 0)
|
||||
brcmf_err("setting AP mode failed %d\n", err);
|
||||
- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 0);
|
||||
- if (err < 0)
|
||||
- brcmf_err("setting INFRA mode failed %d\n", err);
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
|
||||
brcmf_fil_iovar_int_set(ifp, "mbss", 0);
|
||||
brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
|
||||
@@ -0,0 +1,53 @@
|
||||
From 5ea59db8a375216e6c915c5586f556766673b5a7 Mon Sep 17 00:00:00 2001
|
||||
From: "Peter S. Housel" <housel@acm.org>
|
||||
Date: Mon, 12 Jun 2017 11:46:22 +0100
|
||||
Subject: [PATCH] brcmfmac: Fix glom_skb leak in brcmf_sdiod_recv_chain
|
||||
|
||||
An earlier change to this function (3bdae810721b) fixed a leak in the
|
||||
case of an unsuccessful call to brcmf_sdiod_buffrw(). However, the
|
||||
glom_skb buffer, used for emulating a scattering read, is never used
|
||||
or referenced after its contents are copied into the destination
|
||||
buffers, and therefore always needs to be freed by the end of the
|
||||
function.
|
||||
|
||||
Fixes: 3bdae810721b ("brcmfmac: Fix glob_skb leak in brcmf_sdiod_recv_chain")
|
||||
Fixes: a413e39a38573 ("brcmfmac: fix brcmf_sdcard_recv_chain() for host without sg support")
|
||||
Cc: stable@vger.kernel.org # 4.9.x-
|
||||
Signed-off-by: Peter S. Housel <housel@acm.org>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
@@ -705,7 +705,7 @@ done:
|
||||
int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
|
||||
struct sk_buff_head *pktq, uint totlen)
|
||||
{
|
||||
- struct sk_buff *glom_skb;
|
||||
+ struct sk_buff *glom_skb = NULL;
|
||||
struct sk_buff *skb;
|
||||
u32 addr = sdiodev->sbwad;
|
||||
int err = 0;
|
||||
@@ -726,10 +726,8 @@ int brcmf_sdiod_recv_chain(struct brcmf_
|
||||
return -ENOMEM;
|
||||
err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
|
||||
glom_skb);
|
||||
- if (err) {
|
||||
- brcmu_pkt_buf_free_skb(glom_skb);
|
||||
+ if (err)
|
||||
goto done;
|
||||
- }
|
||||
|
||||
skb_queue_walk(pktq, skb) {
|
||||
memcpy(skb->data, glom_skb->data, skb->len);
|
||||
@@ -740,6 +738,7 @@ int brcmf_sdiod_recv_chain(struct brcmf_
|
||||
pktq);
|
||||
|
||||
done:
|
||||
+ brcmu_pkt_buf_free_skb(glom_skb);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
From 1278bd149839f2281db45a910082ba143546a148 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 16 Jun 2017 15:14:49 +0200
|
||||
Subject: [PATCH] brcmfmac: Use separate firmware for revision 0 of the
|
||||
brcm43430 chip
|
||||
|
||||
The brcm43430 chip needs different firmware files for chip revision 0
|
||||
and 1. The file currently in linux-firmware is for revision 1 only.
|
||||
|
||||
This commit makes brcmfmac request brcmfmac43430a0-sdio.bin instead
|
||||
of brcmfmac43430-sdio.bin for revision 0 chips.
|
||||
|
||||
Note that the behavior for revision 1 chips is not changed, ideally those
|
||||
would load brcmfmac43430a1-sdio.bin, but that will break existing setups.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -611,7 +611,9 @@ BRCMF_FW_NVRAM_DEF(43340, "brcmfmac43340
|
||||
BRCMF_FW_NVRAM_DEF(4335, "brcmfmac4335-sdio.bin", "brcmfmac4335-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(43362, "brcmfmac43362-sdio.bin", "brcmfmac43362-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(4339, "brcmfmac4339-sdio.bin", "brcmfmac4339-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43430, "brcmfmac43430-sdio.bin", "brcmfmac43430-sdio.txt");
|
||||
+BRCMF_FW_NVRAM_DEF(43430A0, "brcmfmac43430a0-sdio.bin", "brcmfmac43430a0-sdio.txt");
|
||||
+/* Note the names are not postfixed with a1 for backward compatibility */
|
||||
+BRCMF_FW_NVRAM_DEF(43430A1, "brcmfmac43430-sdio.bin", "brcmfmac43430-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(43455, "brcmfmac43455-sdio.bin", "brcmfmac43455-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(4354, "brcmfmac4354-sdio.bin", "brcmfmac4354-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-sdio.bin", "brcmfmac4356-sdio.txt");
|
||||
@@ -629,7 +631,8 @@ static struct brcmf_firmware_mapping brc
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, 43430),
|
||||
+ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0x00000001, 43430A0),
|
||||
+ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356)
|
||||
@@ -0,0 +1,46 @@
|
||||
From 3f426c96895556bb49adfa52f3aeafdedb2d02e7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= <mirq-linux@rere.qmqm.pl>
|
||||
Date: Tue, 13 Jun 2017 18:02:03 +0200
|
||||
Subject: [PATCH] brcmfmac: initialize oob irq data before request_irq()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This fixes spin-forever in irq handler when IRQ is already asserted
|
||||
at request_irq() time.
|
||||
|
||||
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
@@ -107,12 +107,14 @@ int brcmf_sdiod_intr_register(struct brc
|
||||
int ret = 0;
|
||||
u8 data;
|
||||
u32 addr, gpiocontrol;
|
||||
- unsigned long flags;
|
||||
|
||||
pdata = &sdiodev->settings->bus.sdio;
|
||||
if (pdata->oob_irq_supported) {
|
||||
brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n",
|
||||
pdata->oob_irq_nr);
|
||||
+ spin_lock_init(&sdiodev->irq_en_lock);
|
||||
+ sdiodev->irq_en = true;
|
||||
+
|
||||
ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler,
|
||||
pdata->oob_irq_flags, "brcmf_oob_intr",
|
||||
&sdiodev->func[1]->dev);
|
||||
@@ -121,10 +123,6 @@ int brcmf_sdiod_intr_register(struct brc
|
||||
return ret;
|
||||
}
|
||||
sdiodev->oob_irq_requested = true;
|
||||
- spin_lock_init(&sdiodev->irq_en_lock);
|
||||
- spin_lock_irqsave(&sdiodev->irq_en_lock, flags);
|
||||
- sdiodev->irq_en = true;
|
||||
- spin_unlock_irqrestore(&sdiodev->irq_en_lock, flags);
|
||||
|
||||
ret = enable_irq_wake(pdata->oob_irq_nr);
|
||||
if (ret != 0) {
|
||||
@@ -0,0 +1,36 @@
|
||||
From 57c00f2fac512837f8de73474ec1f54020015bae Mon Sep 17 00:00:00 2001
|
||||
From: Christophe Jaillet <christophe.jaillet@wanadoo.fr>
|
||||
Date: Wed, 21 Jun 2017 07:45:53 +0200
|
||||
Subject: [PATCH] brcmfmac: Fix a memory leak in error handling path in
|
||||
'brcmf_cfg80211_attach'
|
||||
|
||||
If 'wiphy_new()' fails, we leak 'ops'. Add a new label in the error
|
||||
handling path to free it in such a case.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 5c22fb85102a7 ("brcmfmac: add wowl gtk rekeying offload support")
|
||||
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6842,7 +6842,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
wiphy = wiphy_new(ops, sizeof(struct brcmf_cfg80211_info));
|
||||
if (!wiphy) {
|
||||
brcmf_err("Could not allocate wiphy device\n");
|
||||
- return NULL;
|
||||
+ goto ops_out;
|
||||
}
|
||||
memcpy(wiphy->perm_addr, drvr->mac, ETH_ALEN);
|
||||
set_wiphy_dev(wiphy, busdev);
|
||||
@@ -6985,6 +6985,7 @@ priv_out:
|
||||
ifp->vif = NULL;
|
||||
wiphy_out:
|
||||
brcmf_free_wiphy(wiphy);
|
||||
+ops_out:
|
||||
kfree(ops);
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
From 8f44c9a41386729fea410e688959ddaa9d51be7c Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Fri, 7 Jul 2017 21:09:06 +0100
|
||||
Subject: [PATCH] brcmfmac: fix possible buffer overflow in
|
||||
brcmf_cfg80211_mgmt_tx()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The lower level nl80211 code in cfg80211 ensures that "len" is between
|
||||
25 and NL80211_ATTR_FRAME (2304). We subtract DOT11_MGMT_HDR_LEN (24) from
|
||||
"len" so thats's max of 2280. However, the action_frame->data[] buffer is
|
||||
only BRCMF_FIL_ACTION_FRAME_SIZE (1800) bytes long so this memcpy() can
|
||||
overflow.
|
||||
|
||||
memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
|
||||
le16_to_cpu(action_frame->len));
|
||||
|
||||
Cc: stable@vger.kernel.org # 3.9.x
|
||||
Fixes: 18e2f61db3b70 ("brcmfmac: P2P action frame tx.")
|
||||
Reported-by: "freenerguo(郭大兴)" <freenerguo@tencent.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -4850,6 +4850,11 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wip
|
||||
cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true,
|
||||
GFP_KERNEL);
|
||||
} else if (ieee80211_is_action(mgmt->frame_control)) {
|
||||
+ if (len > BRCMF_FIL_ACTION_FRAME_SIZE + DOT11_MGMT_HDR_LEN) {
|
||||
+ brcmf_err("invalid action frame length\n");
|
||||
+ err = -EINVAL;
|
||||
+ goto exit;
|
||||
+ }
|
||||
af_params = kzalloc(sizeof(*af_params), GFP_KERNEL);
|
||||
if (af_params == NULL) {
|
||||
brcmf_err("unable to allocate frame\n");
|
||||
@@ -0,0 +1,139 @@
|
||||
From 0ec9eb90feec4933637fbde9d5bfbc3b62aea218 Mon Sep 17 00:00:00 2001
|
||||
From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Date: Thu, 3 Aug 2017 17:37:58 +0800
|
||||
Subject: [PATCH] brcmfmac: Add support for CYW4373 SDIO/USB chipset
|
||||
|
||||
Add support for CYW4373 SDIO/USB chipset.
|
||||
CYW4373 is a 1x1 dual-band 11ac chipset with 20/40/80Mhz channel support.
|
||||
It's a WiFi/BT combo device.
|
||||
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 2 ++
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 +++-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 9 ++++++++-
|
||||
drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 3 +++
|
||||
include/linux/mmc/sdio_ids.h | 1 +
|
||||
6 files changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
--- 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_43455),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
|
||||
+ BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -690,6 +690,8 @@ static u32 brcmf_chip_tcm_rambase(struct
|
||||
case BRCM_CC_4365_CHIP_ID:
|
||||
case BRCM_CC_4366_CHIP_ID:
|
||||
return 0x200000;
|
||||
+ case CY_CC_4373_CHIP_ID:
|
||||
+ return 0x160000;
|
||||
default:
|
||||
brcmf_err("unknown chip: %s\n", ci->pub.name);
|
||||
break;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -617,6 +617,7 @@ BRCMF_FW_NVRAM_DEF(43430A1, "brcmfmac434
|
||||
BRCMF_FW_NVRAM_DEF(43455, "brcmfmac43455-sdio.bin", "brcmfmac43455-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(4354, "brcmfmac4354-sdio.bin", "brcmfmac4354-sdio.txt");
|
||||
BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-sdio.bin", "brcmfmac4356-sdio.txt");
|
||||
+BRCMF_FW_NVRAM_DEF(4373, "brcmfmac4373-sdio.bin", "brcmfmac4373-sdio.txt");
|
||||
|
||||
static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
@@ -635,7 +636,8 @@ static struct brcmf_firmware_mapping brc
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
|
||||
BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356)
|
||||
+ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
+ BRCMF_FW_NVRAM_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
|
||||
};
|
||||
|
||||
static void pkt_align(struct sk_buff *p, int len, int align)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -49,6 +49,7 @@ BRCMF_FW_DEF(43143, "brcmfmac43143.bin")
|
||||
BRCMF_FW_DEF(43236B, "brcmfmac43236b.bin");
|
||||
BRCMF_FW_DEF(43242A, "brcmfmac43242a.bin");
|
||||
BRCMF_FW_DEF(43569, "brcmfmac43569.bin");
|
||||
+BRCMF_FW_DEF(4373, "brcmfmac4373.bin");
|
||||
|
||||
static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
@@ -57,7 +58,8 @@ static struct brcmf_firmware_mapping brc
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43238_CHIP_ID, 0x00000008, 43236B),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43242_CHIP_ID, 0xFFFFFFFF, 43242A),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43566_CHIP_ID, 0xFFFFFFFF, 43569),
|
||||
- BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43569)
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43569),
|
||||
+ BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
|
||||
};
|
||||
|
||||
#define TRX_MAGIC 0x30524448 /* "HDR0" */
|
||||
@@ -1461,15 +1463,20 @@ static int brcmf_usb_reset_resume(struct
|
||||
#define LINKSYS_USB_DEVICE(dev_id) \
|
||||
{ USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) }
|
||||
|
||||
+#define CYPRESS_USB_DEVICE(dev_id) \
|
||||
+ { USB_DEVICE(CY_USB_VENDOR_ID_CYPRESS, dev_id) }
|
||||
+
|
||||
static struct usb_device_id brcmf_usb_devid_table[] = {
|
||||
BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID),
|
||||
BRCMF_USB_DEVICE(BRCM_USB_43236_DEVICE_ID),
|
||||
BRCMF_USB_DEVICE(BRCM_USB_43242_DEVICE_ID),
|
||||
BRCMF_USB_DEVICE(BRCM_USB_43569_DEVICE_ID),
|
||||
LINKSYS_USB_DEVICE(BRCM_USB_43235_LINKSYS_DEVICE_ID),
|
||||
+ CYPRESS_USB_DEVICE(CY_USB_4373_DEVICE_ID),
|
||||
{ USB_DEVICE(BRCM_USB_VENDOR_ID_LG, BRCM_USB_43242_LG_DEVICE_ID) },
|
||||
/* special entry for device with firmware loaded and running */
|
||||
BRCMF_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID),
|
||||
+ CYPRESS_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID),
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -23,6 +23,7 @@
|
||||
#define BRCM_USB_VENDOR_ID_BROADCOM 0x0a5c
|
||||
#define BRCM_USB_VENDOR_ID_LG 0x043e
|
||||
#define BRCM_USB_VENDOR_ID_LINKSYS 0x13b1
|
||||
+#define CY_USB_VENDOR_ID_CYPRESS 0x04b4
|
||||
#define BRCM_PCIE_VENDOR_ID_BROADCOM PCI_VENDOR_ID_BROADCOM
|
||||
|
||||
/* Chipcommon Core Chip IDs */
|
||||
@@ -57,6 +58,7 @@
|
||||
#define BRCM_CC_4365_CHIP_ID 0x4365
|
||||
#define BRCM_CC_4366_CHIP_ID 0x4366
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
+#define CY_CC_4373_CHIP_ID 0x4373
|
||||
|
||||
/* USB Device IDs */
|
||||
#define BRCM_USB_43143_DEVICE_ID 0xbd1e
|
||||
@@ -66,6 +68,7 @@
|
||||
#define BRCM_USB_43242_LG_DEVICE_ID 0x3101
|
||||
#define BRCM_USB_43569_DEVICE_ID 0xbd27
|
||||
#define BRCM_USB_BCMFW_DEVICE_ID 0x0bdc
|
||||
+#define CY_USB_4373_DEVICE_ID 0xbd29
|
||||
|
||||
/* PCIE Device IDs */
|
||||
#define BRCM_PCIE_4350_DEVICE_ID 0x43a3
|
||||
--- a/include/linux/mmc/sdio_ids.h
|
||||
+++ b/include/linux/mmc/sdio_ids.h
|
||||
@@ -39,6 +39,7 @@
|
||||
#define SDIO_DEVICE_ID_BROADCOM_43455 0xa9bf
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4354 0x4354
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4356 0x4356
|
||||
+#define SDIO_DEVICE_ID_CYPRESS_4373 0x4373
|
||||
|
||||
#define SDIO_VENDOR_ID_INTEL 0x0089
|
||||
#define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX 0x1402
|
||||
@@ -0,0 +1,47 @@
|
||||
From 99976fc084129e07df3a066dc15651853386da19 Mon Sep 17 00:00:00 2001
|
||||
From: Wright Feng <wright.feng@cypress.com>
|
||||
Date: Thu, 3 Aug 2017 17:37:59 +0800
|
||||
Subject: [PATCH] brcmfmac: fix wrong num_different_channels when mchan feature
|
||||
enabled
|
||||
|
||||
When the device/firmware supports multi-channel, it can have P2P
|
||||
connection and regular connection with AP simultaneous. In this case,
|
||||
the num_different_channels in wiphy info was not correct when firmware
|
||||
supports multi-channel (The iw wiphy# info showed "#channels <= 1" in
|
||||
interface combinations). It caused association failed and error message
|
||||
"CTRL-EVENT-FREQ-CONFLICT error" in wpa_supplicant when P2P GO interface
|
||||
was running at the same time.
|
||||
The root cause is that the num_different_channels was always overridden
|
||||
to 1 in brcmf_setup_ifmodes even multi-channel was enabled.
|
||||
We correct the logic by moving num_different_channels setting forward.
|
||||
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.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, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6311,6 +6311,8 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
if (p2p) {
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
|
||||
combo[c].num_different_channels = 2;
|
||||
+ else
|
||||
+ combo[c].num_different_channels = 1;
|
||||
wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
@@ -6320,10 +6322,10 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
} else {
|
||||
+ combo[c].num_different_channels = 1;
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
}
|
||||
- combo[c].num_different_channels = 1;
|
||||
combo[c].max_interfaces = i;
|
||||
combo[c].n_limits = i;
|
||||
combo[c].limits = c0_limits;
|
||||
@@ -0,0 +1,27 @@
|
||||
From f38966a7ace842afd3a9bf5d0fb56640f49df60c Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 30 Aug 2017 15:54:49 +0200
|
||||
Subject: [PATCH] brcmfmac: Log chip id and revision
|
||||
|
||||
For debugging some problems, it is useful to know the chip revision
|
||||
add a brcmf_info message logging this.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -602,6 +602,9 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
if ((nvram_name) && (mapping_table[i].nvram))
|
||||
strlcat(nvram_name, mapping_table[i].nvram, BRCMF_FW_NAME_LEN);
|
||||
|
||||
+ brcmf_info("using %s for chip %#08x(%d) rev %#08x\n",
|
||||
+ fw_name, chip, chip, chiprev);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
struct brcmf_bss_info_le *bss_info_le;
|
||||
struct brcmf_bss_info_le *bss = NULL;
|
||||
u32 bi_length;
|
||||
@@ -3104,11 +3105,23 @@ brcmf_cfg80211_escan_handler(struct brcm
|
||||
@@ -3107,11 +3108,23 @@ brcmf_cfg80211_escan_handler(struct brcm
|
||||
|
||||
if (status == BRCMF_E_STATUS_PARTIAL) {
|
||||
brcmf_dbg(SCAN, "ESCAN Partial result\n");
|
||||
@@ -49,7 +49,7 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
if (le16_to_cpu(escan_result_le->bss_count) != 1) {
|
||||
brcmf_err("Invalid bss_count %d: ignoring\n",
|
||||
escan_result_le->bss_count);
|
||||
@@ -3125,9 +3138,8 @@ brcmf_cfg80211_escan_handler(struct brcm
|
||||
@@ -3128,9 +3141,8 @@ brcmf_cfg80211_escan_handler(struct brcm
|
||||
}
|
||||
|
||||
bi_length = le32_to_cpu(bss_info_le->length);
|
||||
@@ -0,0 +1,32 @@
|
||||
From dd2349121bb1b8ff688c3ca6a2a0bea9d8c142ca Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Cernekee <cernekee@chromium.org>
|
||||
Date: Sat, 16 Sep 2017 21:08:24 -0700
|
||||
Subject: [PATCH] brcmfmac: Add check for short event packets
|
||||
|
||||
The length of the data in the received skb is currently passed into
|
||||
brcmf_fweh_process_event() as packet_len, but this value is not checked.
|
||||
event_packet should be followed by DATALEN bytes of additional event
|
||||
data. Ensure that the received packet actually contains at least
|
||||
DATALEN bytes of additional data, to avoid copying uninitialized memory
|
||||
into event->data.
|
||||
|
||||
Cc: <stable@vger.kernel.org> # v3.8
|
||||
Suggested-by: Mattias Nissler <mnissler@chromium.org>
|
||||
Signed-off-by: Kevin Cernekee <cernekee@chromium.org>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
|
||||
@@ -429,7 +429,8 @@ void brcmf_fweh_process_event(struct brc
|
||||
if (code != BRCMF_E_IF && !fweh->evt_handler[code])
|
||||
return;
|
||||
|
||||
- if (datalen > BRCMF_DCMD_MAXLEN)
|
||||
+ if (datalen > BRCMF_DCMD_MAXLEN ||
|
||||
+ datalen + sizeof(*event_packet) > packet_len)
|
||||
return;
|
||||
|
||||
if (in_interrupt())
|
||||
@@ -0,0 +1,39 @@
|
||||
From 73f2c8e933b1dcf432ac8c6965a6e67af630077f Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Cernekee <cernekee@chromium.org>
|
||||
Date: Sat, 16 Sep 2017 21:08:22 -0700
|
||||
Subject: [PATCH] brcmfmac: Avoid possible out-of-bounds read
|
||||
|
||||
In brcmf_p2p_notify_rx_mgmt_p2p_probereq(), chanspec is assigned before
|
||||
the length of rxframe is validated. This could lead to uninitialized
|
||||
data being accessed (but not printed). Since we already have a
|
||||
perfectly good endian-swapped copy of rxframe->chanspec in ch.chspec,
|
||||
and ch.chspec is not modified by decchspec(), avoid the extra
|
||||
assignment and use ch.chspec in the debug print.
|
||||
|
||||
Suggested-by: Mattias Nissler <mnissler@chromium.org>
|
||||
Signed-off-by: Kevin Cernekee <cernekee@chromium.org>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -1853,7 +1853,6 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere
|
||||
struct afx_hdl *afx_hdl = &p2p->afx_hdl;
|
||||
struct brcmf_cfg80211_vif *vif = ifp->vif;
|
||||
struct brcmf_rx_mgmt_data *rxframe = (struct brcmf_rx_mgmt_data *)data;
|
||||
- u16 chanspec = be16_to_cpu(rxframe->chanspec);
|
||||
struct brcmu_chan ch;
|
||||
u8 *mgmt_frame;
|
||||
u32 mgmt_frame_len;
|
||||
@@ -1906,7 +1905,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere
|
||||
cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len, 0);
|
||||
|
||||
brcmf_dbg(INFO, "mgmt_frame_len (%d) , e->datalen (%d), chanspec (%04x), freq (%d)\n",
|
||||
- mgmt_frame_len, e->datalen, chanspec, freq);
|
||||
+ mgmt_frame_len, e->datalen, ch.chspec, freq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
From 2fd3877b5bb7d39782c3205a1dcda02023b8514a Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 8 Nov 2017 14:36:31 +0100
|
||||
Subject: [PATCH] brcmfmac: handle FWHALT mailbox indication
|
||||
|
||||
The firmware uses a mailbox to communicate to the host what is going
|
||||
on. In the driver we validate the bit received. Various people seen
|
||||
the following message:
|
||||
|
||||
brcmfmac: brcmf_sdio_hostmail: Unknown mailbox data content: 0x40012
|
||||
|
||||
Bit 4 is cause of this message, but this actually indicates the firmware
|
||||
has halted. Handle this bit by giving a more meaningful error message.
|
||||
|
||||
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 | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -259,10 +259,11 @@ struct rte_console {
|
||||
#define I_HMB_HOST_INT I_HMB_SW3 /* Miscellaneous Interrupt */
|
||||
|
||||
/* tohostmailboxdata */
|
||||
-#define HMB_DATA_NAKHANDLED 1 /* retransmit NAK'd frame */
|
||||
-#define HMB_DATA_DEVREADY 2 /* talk to host after enable */
|
||||
-#define HMB_DATA_FC 4 /* per prio flowcontrol update flag */
|
||||
-#define HMB_DATA_FWREADY 8 /* fw ready for protocol activity */
|
||||
+#define HMB_DATA_NAKHANDLED 0x0001 /* retransmit NAK'd frame */
|
||||
+#define HMB_DATA_DEVREADY 0x0002 /* talk to host after enable */
|
||||
+#define HMB_DATA_FC 0x0004 /* per prio flowcontrol update flag */
|
||||
+#define HMB_DATA_FWREADY 0x0008 /* fw ready for protocol activity */
|
||||
+#define HMB_DATA_FWHALT 0x0010 /* firmware halted */
|
||||
|
||||
#define HMB_DATA_FCDATA_MASK 0xff000000
|
||||
#define HMB_DATA_FCDATA_SHIFT 24
|
||||
@@ -1093,6 +1094,10 @@ static u32 brcmf_sdio_hostmail(struct br
|
||||
offsetof(struct sdpcmd_regs, tosbmailbox));
|
||||
bus->sdcnt.f1regdata += 2;
|
||||
|
||||
+ /* dongle indicates the firmware has halted/crashed */
|
||||
+ if (hmb_data & HMB_DATA_FWHALT)
|
||||
+ brcmf_err("mailbox indicates firmware halted\n");
|
||||
+
|
||||
/* Dongle recomposed rx frames, accept them again */
|
||||
if (hmb_data & HMB_DATA_NAKHANDLED) {
|
||||
brcmf_dbg(SDIO, "Dongle reports NAK handled, expect rtx of %d\n",
|
||||
@@ -1150,6 +1155,7 @@ static u32 brcmf_sdio_hostmail(struct br
|
||||
HMB_DATA_NAKHANDLED |
|
||||
HMB_DATA_FC |
|
||||
HMB_DATA_FWREADY |
|
||||
+ HMB_DATA_FWHALT |
|
||||
HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
|
||||
brcmf_err("Unknown mailbox data content: 0x%02x\n",
|
||||
hmb_data);
|
||||
@@ -0,0 +1,44 @@
|
||||
From 7762bb134e3b40e8ee2611365775b7432190a9c7 Mon Sep 17 00:00:00 2001
|
||||
From: Wright Feng <wright.feng@cypress.com>
|
||||
Date: Mon, 11 Dec 2017 15:38:21 +0800
|
||||
Subject: [PATCH] brcmfmac: enlarge buffer size of caps to 512 bytes
|
||||
|
||||
The buffer size of return of cap iovar is greater than 256 bytes in some
|
||||
firmwares. For instance, the return size of cap iovar is 271 bytes in 4373
|
||||
13.10.246.79 firmare. It makes feature capability parsing failed because
|
||||
caps buffer is default value.
|
||||
So we enlarge caps buffer size to 512 bytes and add the error print for
|
||||
cap iovar error.
|
||||
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 12 +++++++++---
|
||||
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -113,13 +113,19 @@ static void brcmf_feat_iovar_int_get(str
|
||||
}
|
||||
}
|
||||
|
||||
+#define MAX_CAPS_BUFFER_SIZE 512
|
||||
static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp)
|
||||
{
|
||||
- char caps[256];
|
||||
+ char caps[MAX_CAPS_BUFFER_SIZE];
|
||||
enum brcmf_feat_id id;
|
||||
- int i;
|
||||
+ int i, err;
|
||||
+
|
||||
+ err = brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
|
||||
+ if (err) {
|
||||
+ brcmf_err("could not get firmware cap (%d)\n", err);
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
- brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
|
||||
brcmf_dbg(INFO, "[ %s]\n", caps);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(brcmf_fwcap_map); i++) {
|
||||
@@ -136,10 +136,10 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
/* Make sure there's enough room for any header */
|
||||
if (skb_headroom(skb) < drvr->hdrlen) {
|
||||
struct sk_buff *skb2;
|
||||
@@ -295,6 +343,15 @@ void brcmf_txflowblock(struct device *de
|
||||
/* Make sure there's enough writable headroom*/
|
||||
ret = skb_cow_head(skb, drvr->hdrlen);
|
||||
if (ret < 0) {
|
||||
@@ -288,6 +336,15 @@ void brcmf_txflowblock(struct device *de
|
||||
|
||||
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
{
|
||||
@@ -0,0 +1,29 @@
|
||||
From 9b9322db5c5a1917a66c71fe47c3848a9a31227e Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Wed, 14 Mar 2018 20:02:59 +0100
|
||||
Subject: [PATCH] brcmfmac: Fix check for ISO3166 code
|
||||
|
||||
The commit "regulatory: add NUL to request alpha2" increases the length of
|
||||
alpha2 to 3. This causes a regression on brcmfmac, because
|
||||
brcmf_cfg80211_reg_notifier() expect valid ISO3166 codes in the complete
|
||||
array. So fix this accordingly.
|
||||
|
||||
Fixes: 657308f73e67 ("regulatory: add NUL to request alpha2")
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Acked-by: Franky Lin <franky.lin@broadcom.com>
|
||||
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
|
||||
@@ -6775,7 +6775,7 @@ static void brcmf_cfg80211_reg_notifier(
|
||||
return;
|
||||
|
||||
/* ignore non-ISO3166 country codes */
|
||||
- for (i = 0; i < sizeof(req->alpha2); i++)
|
||||
+ for (i = 0; i < 2; i++)
|
||||
if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
|
||||
brcmf_err("not a ISO3166 code (0x%02x 0x%02x)\n",
|
||||
req->alpha2[0], req->alpha2[1]);
|
||||
@@ -0,0 +1,45 @@
|
||||
From da472385a29f1fddcac7cfa0499482704310bd16 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:18 +0100
|
||||
Subject: [PATCH] brcmfmac: move brcmf_bus_preinit() call just after changing
|
||||
bus state
|
||||
|
||||
Moving the brcmf_bus_preinit() call allows the bus code to do some
|
||||
required initialization before handling firmware control messages.
|
||||
|
||||
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/common.c | 3 ---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 5 +++++
|
||||
2 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -215,9 +215,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
|
||||
/* Enable tx beamforming, errors can be ignored (not supported) */
|
||||
(void)brcmf_fil_iovar_int_set(ifp, "txbf", 1);
|
||||
-
|
||||
- /* do bus specific preinit here */
|
||||
- err = brcmf_bus_preinit(ifp->drvr->bus_if);
|
||||
done:
|
||||
return err;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1058,6 +1058,11 @@ int brcmf_bus_started(struct device *dev
|
||||
/* signal bus ready */
|
||||
brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
|
||||
|
||||
+ /* do bus specific preinit here */
|
||||
+ ret = brcmf_bus_preinit(ifp->drvr->bus_if);
|
||||
+ if (ret < 0)
|
||||
+ goto fail;
|
||||
+
|
||||
/* Bus is ready, do any initialization */
|
||||
ret = brcmf_c_preinit_dcmds(ifp);
|
||||
if (ret < 0)
|
||||
@@ -0,0 +1,130 @@
|
||||
From 0542503c4c164c65cd1567b0f2b3f887af6c81eb Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:22 +0100
|
||||
Subject: [PATCH] brcmfmac: move brcmf_attach() function in core.c
|
||||
|
||||
Moving the function in preparation of subsequent patch.
|
||||
|
||||
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/core.c | 98 +++++++++++-----------
|
||||
1 file changed, 49 insertions(+), 49 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -961,55 +961,6 @@ static int brcmf_inet6addr_changed(struc
|
||||
}
|
||||
#endif
|
||||
|
||||
-int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
|
||||
-{
|
||||
- struct brcmf_pub *drvr = NULL;
|
||||
- int ret = 0;
|
||||
- int i;
|
||||
-
|
||||
- brcmf_dbg(TRACE, "Enter\n");
|
||||
-
|
||||
- /* Allocate primary brcmf_info */
|
||||
- drvr = kzalloc(sizeof(struct brcmf_pub), GFP_ATOMIC);
|
||||
- if (!drvr)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
|
||||
- drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
|
||||
-
|
||||
- mutex_init(&drvr->proto_block);
|
||||
-
|
||||
- /* Link to bus module */
|
||||
- drvr->hdrlen = 0;
|
||||
- drvr->bus_if = dev_get_drvdata(dev);
|
||||
- drvr->bus_if->drvr = drvr;
|
||||
- drvr->settings = settings;
|
||||
-
|
||||
- /* attach debug facilities */
|
||||
- brcmf_debug_attach(drvr);
|
||||
-
|
||||
- /* Attach and link in the protocol */
|
||||
- ret = brcmf_proto_attach(drvr);
|
||||
- if (ret != 0) {
|
||||
- brcmf_err("brcmf_prot_attach failed\n");
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
- /* Attach to events important for core code */
|
||||
- brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
|
||||
- brcmf_psm_watchdog_notify);
|
||||
-
|
||||
- /* attach firmware event handler */
|
||||
- brcmf_fweh_attach(drvr);
|
||||
-
|
||||
- return ret;
|
||||
-
|
||||
-fail:
|
||||
- brcmf_detach(dev);
|
||||
-
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static int brcmf_revinfo_read(struct seq_file *s, void *data)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(s->private);
|
||||
@@ -1141,6 +1092,55 @@ fail:
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
|
||||
+{
|
||||
+ struct brcmf_pub *drvr = NULL;
|
||||
+ int ret = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "Enter\n");
|
||||
+
|
||||
+ /* Allocate primary brcmf_info */
|
||||
+ drvr = kzalloc(sizeof(*drvr), GFP_ATOMIC);
|
||||
+ if (!drvr)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
|
||||
+ drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
|
||||
+
|
||||
+ mutex_init(&drvr->proto_block);
|
||||
+
|
||||
+ /* Link to bus module */
|
||||
+ drvr->hdrlen = 0;
|
||||
+ drvr->bus_if = dev_get_drvdata(dev);
|
||||
+ drvr->bus_if->drvr = drvr;
|
||||
+ drvr->settings = settings;
|
||||
+
|
||||
+ /* attach debug facilities */
|
||||
+ brcmf_debug_attach(drvr);
|
||||
+
|
||||
+ /* Attach and link in the protocol */
|
||||
+ ret = brcmf_proto_attach(drvr);
|
||||
+ if (ret != 0) {
|
||||
+ brcmf_err("brcmf_prot_attach failed\n");
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ /* Attach to events important for core code */
|
||||
+ brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
|
||||
+ brcmf_psm_watchdog_notify);
|
||||
+
|
||||
+ /* attach firmware event handler */
|
||||
+ brcmf_fweh_attach(drvr);
|
||||
+
|
||||
+ return ret;
|
||||
+
|
||||
+fail:
|
||||
+ brcmf_detach(dev);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
|
||||
void brcmf_bus_add_txhdrlen(struct device *dev, uint len)
|
||||
{
|
||||
@@ -0,0 +1,451 @@
|
||||
From 856d5a011c86b59f6564be4508912fb1d866adfc Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:23 +0100
|
||||
Subject: [PATCH] brcmfmac: allocate struct brcmf_pub instance using
|
||||
wiphy_new()
|
||||
|
||||
Rework the driver so the wiphy instance holds the main driver information
|
||||
in its private buffer. Previously it held struct brcmf_cfg80211_info
|
||||
instance so a bit of reorg was needed. This was done so that the wiphy
|
||||
name or its parent device can be shown in debug output.
|
||||
|
||||
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/btcoex.c | 2 +-
|
||||
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 86 ++++++++++------------
|
||||
.../broadcom/brcm80211/brcmfmac/cfg80211.h | 17 +++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 27 +++++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.h | 1 +
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 2 +-
|
||||
7 files changed, 76 insertions(+), 61 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c
|
||||
@@ -464,7 +464,7 @@ static void brcmf_btcoex_dhcp_end(struct
|
||||
int brcmf_btcoex_set_mode(struct brcmf_cfg80211_vif *vif,
|
||||
enum brcmf_btcoex_mode mode, u16 duration)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(vif->wdev.wiphy);
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
|
||||
struct brcmf_btcoex_info *btci = cfg->btcoex;
|
||||
struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -783,7 +783,7 @@ s32 brcmf_notify_escan_complete(struct b
|
||||
static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct net_device *ndev = wdev->netdev;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
int ret;
|
||||
@@ -816,7 +816,7 @@ err_unarm:
|
||||
static
|
||||
int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct net_device *ndev = wdev->netdev;
|
||||
|
||||
if (ndev && ndev == cfg_to_ndev(cfg))
|
||||
@@ -861,7 +861,7 @@ brcmf_cfg80211_change_iface(struct wiphy
|
||||
enum nl80211_iftype type, u32 *flags,
|
||||
struct vif_params *params)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_cfg80211_vif *vif = ifp->vif;
|
||||
s32 infra = 0;
|
||||
@@ -2175,17 +2175,15 @@ static s32
|
||||
brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
s32 *dbm)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
- struct net_device *ndev = cfg_to_ndev(cfg);
|
||||
- struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
+ struct brcmf_cfg80211_vif *vif = wdev_to_vif(wdev);
|
||||
s32 qdbm = 0;
|
||||
s32 err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
- if (!check_vif_up(ifp->vif))
|
||||
+ if (!check_vif_up(vif))
|
||||
return -EIO;
|
||||
|
||||
- err = brcmf_fil_iovar_int_get(ifp, "qtxpower", &qdbm);
|
||||
+ err = brcmf_fil_iovar_int_get(vif->ifp, "qtxpower", &qdbm);
|
||||
if (err) {
|
||||
brcmf_err("error (%d)\n", err);
|
||||
goto done;
|
||||
@@ -3398,7 +3396,7 @@ brcmf_cfg80211_sched_scan_start(struct w
|
||||
struct cfg80211_sched_scan_request *req)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
|
||||
brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n",
|
||||
req->n_match_sets, req->n_ssids);
|
||||
@@ -5192,6 +5190,12 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.update_connect_params = brcmf_cfg80211_update_conn_params,
|
||||
};
|
||||
|
||||
+struct cfg80211_ops *brcmf_cfg80211_get_ops(void)
|
||||
+{
|
||||
+ return kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
|
||||
+ GFP_KERNEL);
|
||||
+}
|
||||
+
|
||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||
enum nl80211_iftype type)
|
||||
{
|
||||
@@ -5866,7 +5870,7 @@ static void brcmf_update_bw40_channel_fl
|
||||
static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg,
|
||||
u32 bw_cap[])
|
||||
{
|
||||
- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
||||
+ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
|
||||
struct ieee80211_supported_band *band;
|
||||
struct ieee80211_channel *channel;
|
||||
struct wiphy *wiphy;
|
||||
@@ -5981,7 +5985,7 @@ fail_pbuf:
|
||||
|
||||
static int brcmf_enable_bw40_2g(struct brcmf_cfg80211_info *cfg)
|
||||
{
|
||||
- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
||||
+ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
|
||||
struct ieee80211_supported_band *band;
|
||||
struct brcmf_fil_bwcap_le band_bwcap;
|
||||
struct brcmf_chanspec_list *list;
|
||||
@@ -6166,10 +6170,10 @@ static void brcmf_update_vht_cap(struct
|
||||
}
|
||||
}
|
||||
|
||||
-static int brcmf_setup_wiphybands(struct wiphy *wiphy)
|
||||
+static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
||||
+ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
|
||||
+ struct wiphy *wiphy;
|
||||
u32 nmode = 0;
|
||||
u32 vhtmode = 0;
|
||||
u32 bw_cap[2] = { WLC_BW_20MHZ_BIT, WLC_BW_20MHZ_BIT };
|
||||
@@ -6764,8 +6768,8 @@ static s32 brcmf_translate_country_code(
|
||||
static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
|
||||
struct regulatory_request *req)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
+ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
|
||||
struct brcmf_fil_country_le ccreq;
|
||||
s32 err;
|
||||
int i;
|
||||
@@ -6800,7 +6804,7 @@ static void brcmf_cfg80211_reg_notifier(
|
||||
brcmf_err("Firmware rejected country setting\n");
|
||||
return;
|
||||
}
|
||||
- brcmf_setup_wiphybands(wiphy);
|
||||
+ brcmf_setup_wiphybands(cfg);
|
||||
}
|
||||
|
||||
static void brcmf_free_wiphy(struct wiphy *wiphy)
|
||||
@@ -6827,17 +6831,15 @@ static void brcmf_free_wiphy(struct wiph
|
||||
if (wiphy->wowlan != &brcmf_wowlan_support)
|
||||
kfree(wiphy->wowlan);
|
||||
#endif
|
||||
- wiphy_free(wiphy);
|
||||
}
|
||||
|
||||
struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
|
||||
- struct device *busdev,
|
||||
+ struct cfg80211_ops *ops,
|
||||
bool p2pdev_forced)
|
||||
{
|
||||
+ struct wiphy *wiphy = drvr->wiphy;
|
||||
struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev;
|
||||
struct brcmf_cfg80211_info *cfg;
|
||||
- struct wiphy *wiphy;
|
||||
- struct cfg80211_ops *ops;
|
||||
struct brcmf_cfg80211_vif *vif;
|
||||
struct brcmf_if *ifp;
|
||||
s32 err = 0;
|
||||
@@ -6849,26 +6851,13 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- ops = kmemdup(&brcmf_cfg80211_ops, sizeof(*ops), GFP_KERNEL);
|
||||
- if (!ops)
|
||||
- return NULL;
|
||||
-
|
||||
- ifp = netdev_priv(ndev);
|
||||
-#ifdef CONFIG_PM
|
||||
- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
|
||||
- ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
|
||||
-#endif
|
||||
- wiphy = wiphy_new(ops, sizeof(struct brcmf_cfg80211_info));
|
||||
- if (!wiphy) {
|
||||
+ cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
|
||||
+ if (!cfg) {
|
||||
brcmf_err("Could not allocate wiphy device\n");
|
||||
- goto ops_out;
|
||||
+ return NULL;
|
||||
}
|
||||
- memcpy(wiphy->perm_addr, drvr->mac, ETH_ALEN);
|
||||
- set_wiphy_dev(wiphy, busdev);
|
||||
|
||||
- cfg = wiphy_priv(wiphy);
|
||||
cfg->wiphy = wiphy;
|
||||
- cfg->ops = ops;
|
||||
cfg->pub = drvr;
|
||||
init_vif_event(&cfg->vif_event);
|
||||
INIT_LIST_HEAD(&cfg->vif_list);
|
||||
@@ -6877,6 +6866,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
if (IS_ERR(vif))
|
||||
goto wiphy_out;
|
||||
|
||||
+ ifp = netdev_priv(ndev);
|
||||
vif->ifp = ifp;
|
||||
vif->wdev.netdev = ndev;
|
||||
ndev->ieee80211_ptr = &vif->wdev;
|
||||
@@ -6903,6 +6893,11 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
if (err < 0)
|
||||
goto priv_out;
|
||||
|
||||
+ /* regulatory notifer below needs access to cfg so
|
||||
+ * assign it now.
|
||||
+ */
|
||||
+ drvr->config = cfg;
|
||||
+
|
||||
brcmf_dbg(INFO, "Registering custom regulatory\n");
|
||||
wiphy->reg_notifier = brcmf_cfg80211_reg_notifier;
|
||||
wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
|
||||
@@ -6916,13 +6911,17 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
cap = &wiphy->bands[NL80211_BAND_2GHZ]->ht_cap.cap;
|
||||
*cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
+#ifdef CONFIG_PM
|
||||
+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
|
||||
+ ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
|
||||
+#endif
|
||||
err = wiphy_register(wiphy);
|
||||
if (err < 0) {
|
||||
brcmf_err("Could not register wiphy device (%d)\n", err);
|
||||
goto priv_out;
|
||||
}
|
||||
|
||||
- err = brcmf_setup_wiphybands(wiphy);
|
||||
+ err = brcmf_setup_wiphybands(cfg);
|
||||
if (err) {
|
||||
brcmf_err("Setting wiphy bands failed (%d)\n", err);
|
||||
goto wiphy_unreg_out;
|
||||
@@ -6939,12 +6938,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
else
|
||||
*cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
- /* p2p might require that "if-events" get processed by fweh. So
|
||||
- * activate the already registered event handlers now and activate
|
||||
- * the rest when initialization has completed. drvr->config needs to
|
||||
- * be assigned before activating events.
|
||||
- */
|
||||
- drvr->config = cfg;
|
||||
+
|
||||
err = brcmf_fweh_activate_events(ifp);
|
||||
if (err) {
|
||||
brcmf_err("FWEH activation failed (%d)\n", err);
|
||||
@@ -7004,8 +6998,7 @@ priv_out:
|
||||
ifp->vif = NULL;
|
||||
wiphy_out:
|
||||
brcmf_free_wiphy(wiphy);
|
||||
-ops_out:
|
||||
- kfree(ops);
|
||||
+ kfree(cfg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -7016,7 +7009,8 @@ void brcmf_cfg80211_detach(struct brcmf_
|
||||
|
||||
brcmf_btcoex_detach(cfg);
|
||||
wiphy_unregister(cfg->wiphy);
|
||||
- kfree(cfg->ops);
|
||||
+ kfree(cfg->pub->cfg80211_ops);
|
||||
wl_deinit_priv(cfg);
|
||||
brcmf_free_wiphy(cfg->wiphy);
|
||||
+ kfree(cfg);
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
|
||||
@@ -290,7 +290,7 @@ struct brcmf_cfg80211_wowl {
|
||||
*/
|
||||
struct brcmf_cfg80211_info {
|
||||
struct wiphy *wiphy;
|
||||
- struct cfg80211_ops *ops;
|
||||
+// struct cfg80211_ops *ops; /* OpenWrt keeps it in the struct brcmf_pub */
|
||||
struct brcmf_cfg80211_conf *conf;
|
||||
struct brcmf_p2p_info p2p;
|
||||
struct brcmf_btcoex_info *btcoex;
|
||||
@@ -342,20 +342,24 @@ static inline struct wiphy *cfg_to_wiphy
|
||||
|
||||
static inline struct brcmf_cfg80211_info *wiphy_to_cfg(struct wiphy *w)
|
||||
{
|
||||
- return (struct brcmf_cfg80211_info *)(wiphy_priv(w));
|
||||
+ struct brcmf_pub *drvr = wiphy_priv(w);
|
||||
+ return drvr->config;
|
||||
}
|
||||
|
||||
static inline struct brcmf_cfg80211_info *wdev_to_cfg(struct wireless_dev *wd)
|
||||
{
|
||||
- return (struct brcmf_cfg80211_info *)(wdev_priv(wd));
|
||||
+ return wiphy_to_cfg(wd->wiphy);
|
||||
+}
|
||||
+
|
||||
+static inline struct brcmf_cfg80211_vif *wdev_to_vif(struct wireless_dev *wdev)
|
||||
+{
|
||||
+ return container_of(wdev, struct brcmf_cfg80211_vif, wdev);
|
||||
}
|
||||
|
||||
static inline
|
||||
struct net_device *cfg_to_ndev(struct brcmf_cfg80211_info *cfg)
|
||||
{
|
||||
- struct brcmf_cfg80211_vif *vif;
|
||||
- vif = list_first_entry(&cfg->vif_list, struct brcmf_cfg80211_vif, list);
|
||||
- return vif->wdev.netdev;
|
||||
+ return brcmf_get_ifp(cfg->pub, 0)->ndev;
|
||||
}
|
||||
|
||||
static inline struct brcmf_cfg80211_info *ndev_to_cfg(struct net_device *ndev)
|
||||
@@ -382,11 +386,12 @@ brcmf_cfg80211_connect_info *cfg_to_conn
|
||||
}
|
||||
|
||||
struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
|
||||
- struct device *busdev,
|
||||
+ struct cfg80211_ops *ops,
|
||||
bool p2pdev_forced);
|
||||
void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
|
||||
s32 brcmf_cfg80211_up(struct net_device *ndev);
|
||||
s32 brcmf_cfg80211_down(struct net_device *ndev);
|
||||
+struct cfg80211_ops *brcmf_cfg80211_get_ops(void);
|
||||
enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);
|
||||
|
||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -124,6 +124,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
brcmf_err("Retreiving cur_etheraddr failed, %d\n", err);
|
||||
goto done;
|
||||
}
|
||||
+ memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
|
||||
memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
|
||||
|
||||
err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_REVINFO,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1036,7 +1036,7 @@ int brcmf_bus_started(struct device *dev
|
||||
|
||||
brcmf_fws_add_interface(ifp);
|
||||
|
||||
- drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
|
||||
+ drvr->config = brcmf_cfg80211_attach(drvr, drvr->cfg80211_ops,
|
||||
drvr->settings->p2p_enable);
|
||||
if (drvr->config == NULL) {
|
||||
ret = -ENOMEM;
|
||||
@@ -1095,17 +1095,26 @@ fail:
|
||||
|
||||
int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
|
||||
{
|
||||
+ struct wiphy *wiphy;
|
||||
+ struct cfg80211_ops *ops;
|
||||
struct brcmf_pub *drvr = NULL;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
- /* Allocate primary brcmf_info */
|
||||
- drvr = kzalloc(sizeof(*drvr), GFP_ATOMIC);
|
||||
- if (!drvr)
|
||||
+ ops = brcmf_cfg80211_get_ops();
|
||||
+ if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
+ wiphy = wiphy_new(ops, sizeof(*drvr));
|
||||
+ if (!wiphy)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ set_wiphy_dev(wiphy, dev);
|
||||
+ drvr = wiphy_priv(wiphy);
|
||||
+ drvr->wiphy = wiphy;
|
||||
+
|
||||
for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
|
||||
drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
|
||||
|
||||
@@ -1134,10 +1143,12 @@ int brcmf_attach(struct device *dev, str
|
||||
/* attach firmware event handler */
|
||||
brcmf_fweh_attach(drvr);
|
||||
|
||||
+ drvr->cfg80211_ops = ops;
|
||||
return ret;
|
||||
|
||||
fail:
|
||||
brcmf_detach(dev);
|
||||
+ kfree(ops);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1195,6 +1206,7 @@ void brcmf_detach(struct device *dev)
|
||||
brcmf_remove_interface(drvr->iflist[i], false);
|
||||
|
||||
brcmf_cfg80211_detach(drvr->config);
|
||||
+ drvr->config = NULL;
|
||||
|
||||
brcmf_fws_deinit(drvr);
|
||||
|
||||
@@ -1204,7 +1216,7 @@ void brcmf_detach(struct device *dev)
|
||||
|
||||
brcmf_debug_detach(drvr);
|
||||
bus_if->drvr = NULL;
|
||||
- kfree(drvr);
|
||||
+ wiphy_free(drvr->wiphy);
|
||||
}
|
||||
|
||||
s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -108,6 +108,7 @@ struct brcmf_pub {
|
||||
/* Linkage ponters */
|
||||
struct brcmf_bus *bus_if;
|
||||
struct brcmf_proto *proto;
|
||||
+ struct wiphy *wiphy;
|
||||
struct brcmf_cfg80211_info *config;
|
||||
|
||||
/* Internal brcmf items */
|
||||
@@ -143,6 +144,9 @@ struct brcmf_pub {
|
||||
struct notifier_block inetaddr_notifier;
|
||||
struct notifier_block inet6addr_notifier;
|
||||
struct brcmf_mp_device *settings;
|
||||
+
|
||||
+ /* Pointer needed by OpenWrt due to backporting some fixes */
|
||||
+ void *cfg80211_ops;
|
||||
};
|
||||
|
||||
/* forward declarations */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -2236,7 +2236,7 @@ fail:
|
||||
*/
|
||||
int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
{
|
||||
- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_p2p_info *p2p = &cfg->p2p;
|
||||
struct brcmf_cfg80211_vif *vif;
|
||||
enum nl80211_iftype iftype;
|
||||
@@ -22,8 +22,8 @@ Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
case BRCM_CC_4366_CHIP_ID:
|
||||
+ case BRCM_CC_43664_CHIP_ID:
|
||||
return 0x200000;
|
||||
default:
|
||||
brcmf_err("unknown chip: %s\n", ci->pub.name);
|
||||
case CY_CC_4373_CHIP_ID:
|
||||
return 0x160000;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -75,6 +75,7 @@ static struct brcmf_firmware_mapping brc
|
||||
@@ -36,11 +36,11 @@ Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -56,6 +56,7 @@
|
||||
@@ -57,6 +57,7 @@
|
||||
#define BRCM_CC_43602_CHIP_ID 43602
|
||||
#define BRCM_CC_4365_CHIP_ID 0x4365
|
||||
#define BRCM_CC_4366_CHIP_ID 0x4366
|
||||
+#define BRCM_CC_43664_CHIP_ID 43664
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
#define CY_CC_4373_CHIP_ID 0x4373
|
||||
|
||||
/* USB Device IDs */
|
||||
@@ -0,0 +1,97 @@
|
||||
From f56324baf329bc9362a52ad77a4a1a0f3356d1bc Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Thu, 26 Apr 2018 12:16:51 +0200
|
||||
Subject: [PATCH] brcmfmac: coarse support for PCIe shared structure rev7
|
||||
|
||||
Revision 7 of PCIe dongle interface increases the item size of tx and rx
|
||||
complete rings to accommodate extra payload for new feature. This patch
|
||||
simply bump up the size of these two rings without adding the support
|
||||
for utilizing the new space. This makes brcmfmac compatible with rev7
|
||||
firmware.
|
||||
|
||||
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>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | 6 ++++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 23 ++++++++++++++++++----
|
||||
2 files changed, 23 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
|
||||
@@ -27,8 +27,10 @@
|
||||
#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40
|
||||
#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE 32
|
||||
#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_ITEMSIZE 24
|
||||
-#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE 16
|
||||
-#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE 32
|
||||
+#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE_PRE_V7 16
|
||||
+#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE 24
|
||||
+#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE_PRE_V7 32
|
||||
+#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE 40
|
||||
#define BRCMF_H2D_TXFLOWRING_ITEMSIZE 48
|
||||
|
||||
struct msgbuf_buf_addr {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -135,8 +135,9 @@ static struct brcmf_firmware_mapping brc
|
||||
BRCMF_PCIE_MB_INT_D2H3_DB0 | \
|
||||
BRCMF_PCIE_MB_INT_D2H3_DB1)
|
||||
|
||||
+#define BRCMF_PCIE_SHARED_VERSION_7 7
|
||||
#define BRCMF_PCIE_MIN_SHARED_VERSION 5
|
||||
-#define BRCMF_PCIE_MAX_SHARED_VERSION 6
|
||||
+#define BRCMF_PCIE_MAX_SHARED_VERSION BRCMF_PCIE_SHARED_VERSION_7
|
||||
#define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF
|
||||
#define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000
|
||||
#define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000
|
||||
@@ -316,6 +317,14 @@ static const u32 brcmf_ring_max_item[BRC
|
||||
BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM
|
||||
};
|
||||
|
||||
+static const u32 brcmf_ring_itemsize_pre_v7[BRCMF_NROF_COMMON_MSGRINGS] = {
|
||||
+ BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE,
|
||||
+ BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE,
|
||||
+ BRCMF_D2H_MSGRING_CONTROL_COMPLETE_ITEMSIZE,
|
||||
+ BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE_PRE_V7,
|
||||
+ BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE_PRE_V7
|
||||
+};
|
||||
+
|
||||
static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = {
|
||||
BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE,
|
||||
BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE,
|
||||
@@ -999,8 +1008,14 @@ brcmf_pcie_alloc_dma_and_ring(struct brc
|
||||
struct brcmf_pcie_ringbuf *ring;
|
||||
u32 size;
|
||||
u32 addr;
|
||||
+ const u32 *ring_itemsize_array;
|
||||
+
|
||||
+ if (devinfo->shared.version < BRCMF_PCIE_SHARED_VERSION_7)
|
||||
+ ring_itemsize_array = brcmf_ring_itemsize_pre_v7;
|
||||
+ else
|
||||
+ ring_itemsize_array = brcmf_ring_itemsize;
|
||||
|
||||
- size = brcmf_ring_max_item[ring_id] * brcmf_ring_itemsize[ring_id];
|
||||
+ size = brcmf_ring_max_item[ring_id] * ring_itemsize_array[ring_id];
|
||||
dma_buf = brcmf_pcie_init_dmabuffer_for_device(devinfo, size,
|
||||
tcm_ring_phys_addr + BRCMF_RING_MEM_BASE_ADDR_OFFSET,
|
||||
&dma_handle);
|
||||
@@ -1010,7 +1025,7 @@ brcmf_pcie_alloc_dma_and_ring(struct brc
|
||||
addr = tcm_ring_phys_addr + BRCMF_RING_MAX_ITEM_OFFSET;
|
||||
brcmf_pcie_write_tcm16(devinfo, addr, brcmf_ring_max_item[ring_id]);
|
||||
addr = tcm_ring_phys_addr + BRCMF_RING_LEN_ITEMS_OFFSET;
|
||||
- brcmf_pcie_write_tcm16(devinfo, addr, brcmf_ring_itemsize[ring_id]);
|
||||
+ brcmf_pcie_write_tcm16(devinfo, addr, ring_itemsize_array[ring_id]);
|
||||
|
||||
ring = kzalloc(sizeof(*ring), GFP_KERNEL);
|
||||
if (!ring) {
|
||||
@@ -1019,7 +1034,7 @@ brcmf_pcie_alloc_dma_and_ring(struct brc
|
||||
return NULL;
|
||||
}
|
||||
brcmf_commonring_config(&ring->commonring, brcmf_ring_max_item[ring_id],
|
||||
- brcmf_ring_itemsize[ring_id], dma_buf);
|
||||
+ ring_itemsize_array[ring_id], dma_buf);
|
||||
ring->dma_handle = dma_handle;
|
||||
ring->devinfo = devinfo;
|
||||
brcmf_commonring_register_cb(&ring->commonring,
|
||||
@@ -0,0 +1,45 @@
|
||||
From 9c4a121e82634aa000a702c98cd6f05b27d6e186 Mon Sep 17 00:00:00 2001
|
||||
From: Sean Lanigan <sean@lano.id.au>
|
||||
Date: Fri, 4 May 2018 16:48:23 +1000
|
||||
Subject: [PATCH] brcmfmac: Add support for bcm43364 wireless chipset
|
||||
|
||||
Add support for the BCM43364 chipset via an SDIO interface, as used in
|
||||
e.g. the Murata 1FX module.
|
||||
|
||||
The BCM43364 uses the same firmware as the BCM43430 (which is already
|
||||
included), the only difference is the omission of Bluetooth.
|
||||
|
||||
However, the SDIO_ID for the BCM43364 is 02D0:A9A4, giving it a MODALIAS
|
||||
of sdio:c00v02D0dA9A4, which doesn't get recognised and hence doesn't
|
||||
load the brcmfmac module. Adding the 'A9A4' ID in the appropriate place
|
||||
triggers the brcmfmac driver to load, and then correctly use the
|
||||
firmware file 'brcmfmac43430-sdio.bin'.
|
||||
|
||||
Signed-off-by: Sean Lanigan <sean@lano.id.au>
|
||||
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
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
|
||||
@@ -1097,6 +1097,7 @@ static const struct sdio_device_id brcmf
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
|
||||
+ BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
|
||||
--- a/include/linux/mmc/sdio_ids.h
|
||||
+++ b/include/linux/mmc/sdio_ids.h
|
||||
@@ -34,6 +34,7 @@
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4339 0x4339
|
||||
#define SDIO_DEVICE_ID_BROADCOM_43362 0xa962
|
||||
+#define SDIO_DEVICE_ID_BROADCOM_43364 0xa9a4
|
||||
#define SDIO_DEVICE_ID_BROADCOM_43430 0xa9a6
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4345 0x4345
|
||||
#define SDIO_DEVICE_ID_BROADCOM_43455 0xa9bf
|
||||
@@ -0,0 +1,34 @@
|
||||
From 1204aa17f3b4f63e67ac9b7c9afa9496485969c5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 10 May 2018 15:21:39 +0200
|
||||
Subject: [PATCH] brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
brcmfmac is a FullMAC driver and it implements/uses cfg80211 interface
|
||||
for stations management. At the same time it doesn't receive or pass up
|
||||
management frames.
|
||||
|
||||
This flag indicates that authenticator doesn't have to subscribe to or
|
||||
handle management frames. Some authenticators (e.g. hostapd) were
|
||||
working with brcmfmac thanks to some extra assumptions. This commit
|
||||
clears up the situation.
|
||||
|
||||
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/cfg80211.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6489,6 +6489,7 @@ static int brcmf_setup_wiphy(struct wiph
|
||||
BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
|
||||
|
||||
wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT |
|
||||
+ WIPHY_FLAG_HAVE_AP_SME |
|
||||
WIPHY_FLAG_OFFCHAN_TX |
|
||||
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
|
||||
@@ -0,0 +1,75 @@
|
||||
From 88001968245c42c26416476bf0ef960442371605 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 14 May 2018 08:48:20 +0200
|
||||
Subject: [PATCH] brcmfmac: add debugfs entry for reading firmware capabilities
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows reading all capabilities as reported by a firmware. They are
|
||||
printed using native (raw) names, just like developers like it the most.
|
||||
It's how firmware reports support for various features, e.g. supported
|
||||
modes, supported standards, power saving details, max BSS-es.
|
||||
|
||||
Access to all that info is useful for trying new firmwares, comparing
|
||||
them and debugging features AKA bugs.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/feature.c | 36 ++++++++++++++++++++++
|
||||
1 file changed, 36 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -138,6 +138,41 @@ static void brcmf_feat_firmware_capabili
|
||||
}
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * brcmf_feat_fwcap_debugfs_read() - expose firmware capabilities to debugfs.
|
||||
+ *
|
||||
+ * @seq: sequence for debugfs entry.
|
||||
+ * @data: raw data pointer.
|
||||
+ */
|
||||
+static int brcmf_feat_fwcap_debugfs_read(struct seq_file *seq, void *data)
|
||||
+{
|
||||
+ struct brcmf_bus *bus_if = dev_get_drvdata(seq->private);
|
||||
+ struct brcmf_if *ifp = brcmf_get_ifp(bus_if->drvr, 0);
|
||||
+ char caps[MAX_CAPS_BUFFER_SIZE + 1] = { };
|
||||
+ char *tmp;
|
||||
+ int err;
|
||||
+
|
||||
+ err = brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
|
||||
+ if (err) {
|
||||
+ brcmf_err("could not get firmware cap (%d)\n", err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ /* Put every capability in a new line */
|
||||
+ for (tmp = caps; *tmp; tmp++) {
|
||||
+ if (*tmp == ' ')
|
||||
+ *tmp = '\n';
|
||||
+ }
|
||||
+
|
||||
+ /* Usually there is a space at the end of capabilities string */
|
||||
+ seq_printf(seq, "%s", caps);
|
||||
+ /* So make sure we don't print two line breaks */
|
||||
+ if (tmp > caps && *(tmp - 1) != '\n')
|
||||
+ seq_printf(seq, "\n");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
void brcmf_feat_attach(struct brcmf_pub *drvr)
|
||||
{
|
||||
struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
|
||||
@@ -196,6 +231,7 @@ void brcmf_feat_attach(struct brcmf_pub
|
||||
}
|
||||
|
||||
brcmf_debugfs_add_entry(drvr, "features", brcmf_feat_debugfs_read);
|
||||
+ brcmf_debugfs_add_entry(drvr, "fwcap", brcmf_feat_fwcap_debugfs_read);
|
||||
}
|
||||
|
||||
bool brcmf_feat_is_enabled(struct brcmf_if *ifp, enum brcmf_feat_id id)
|
||||
@@ -0,0 +1,74 @@
|
||||
From 8e072168f75ebce85b96cbcefea2b10ddbd5913f Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 16 May 2018 14:11:59 +0200
|
||||
Subject: [PATCH] brcmfmac: add support for sysfs initiated coredump
|
||||
|
||||
The driver already supports device coredump initiated by firmware
|
||||
event. Since commit 3c47d19ff4dc ("drivers: base: add coredump driver
|
||||
ops") it is also possible to initiate it from user-space through
|
||||
sysfs. This patch adds support for SDIO and PCIe devices.
|
||||
|
||||
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/bcmsdh.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 2 ++
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 8 ++++++++
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 +
|
||||
4 files changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
@@ -1299,6 +1299,9 @@ static struct sdio_driver brcmf_sdmmc_dr
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.pm = &brcmf_sdio_pm_ops,
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)
|
||||
+ .coredump = brcmf_dev_coredump,
|
||||
+#endif
|
||||
},
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -231,6 +231,8 @@ void brcmf_detach(struct device *dev);
|
||||
void brcmf_dev_reset(struct device *dev);
|
||||
/* Indication from bus module to change flow-control state */
|
||||
void brcmf_txflowblock(struct device *dev, bool state);
|
||||
+/* Request from bus module to initiate a coredump */
|
||||
+void brcmf_dev_coredump(struct device *dev);
|
||||
|
||||
/* Notify the bus has transferred the tx packet to firmware */
|
||||
void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1175,6 +1175,14 @@ void brcmf_dev_reset(struct device *dev)
|
||||
brcmf_fil_cmd_int_set(drvr->iflist[0], BRCMF_C_TERMINATED, 1);
|
||||
}
|
||||
|
||||
+void brcmf_dev_coredump(struct device *dev)
|
||||
+{
|
||||
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
+
|
||||
+ if (brcmf_debug_create_memdump(bus_if, NULL, 0) < 0)
|
||||
+ brcmf_dbg(TRACE, "failed to create coredump\n");
|
||||
+}
|
||||
+
|
||||
void brcmf_detach(struct device *dev)
|
||||
{
|
||||
s32 i;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1995,6 +1995,9 @@ static struct pci_driver brcmf_pciedrvr
|
||||
#ifdef CONFIG_PM
|
||||
.driver.pm = &brcmf_pciedrvr_pm,
|
||||
#endif
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)
|
||||
+ .driver.coredump = brcmf_dev_coredump,
|
||||
+#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
From d2af9b566554e01f9ad67b330ce569dbc130e5d3 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Wed, 16 May 2018 14:12:01 +0200
|
||||
Subject: [PATCH] brcmfmac: validate user provided data for memdump before
|
||||
copying
|
||||
|
||||
In patch "brcmfmac: add support for sysfs initiated coredump", a new
|
||||
scenario of brcmf_debug_create_memdump was added in which the user of
|
||||
the function might not necessarily provide prefix data. Hence the
|
||||
function should not assume the data is always valid and should perform a
|
||||
check before copying.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
|
||||
@@ -42,7 +42,8 @@ int brcmf_debug_create_memdump(struct br
|
||||
if (!dump)
|
||||
return -ENOMEM;
|
||||
|
||||
- memcpy(dump, data, len);
|
||||
+ if (data && len > 0)
|
||||
+ memcpy(dump, data, len);
|
||||
err = brcmf_bus_get_memdump(bus, dump + len, ramsize);
|
||||
if (err) {
|
||||
vfree(dump);
|
||||
@@ -0,0 +1,38 @@
|
||||
From 8a3ab2f38f1669e3be6433a1f6b82a077b38c4c7 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Wed, 16 May 2018 14:12:02 +0200
|
||||
Subject: [PATCH] brcmfmac: trigger memory dump upon firmware halt signal
|
||||
|
||||
PCIe dongle firmware signals a halt/trap through mailbox interrupt.
|
||||
Trigger a memory dump upon receiving such signal could help to provide
|
||||
useful information for issue debug.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -180,6 +180,7 @@ static struct brcmf_firmware_mapping brc
|
||||
#define BRCMF_D2H_DEV_D3_ACK 0x00000001
|
||||
#define BRCMF_D2H_DEV_DS_ENTER_REQ 0x00000002
|
||||
#define BRCMF_D2H_DEV_DS_EXIT_NOTE 0x00000004
|
||||
+#define BRCMF_D2H_DEV_FWHALT 0x10000000
|
||||
|
||||
#define BRCMF_H2D_HOST_D3_INFORM 0x00000001
|
||||
#define BRCMF_H2D_HOST_DS_ACK 0x00000002
|
||||
@@ -715,6 +716,10 @@ static void brcmf_pcie_handle_mb_data(st
|
||||
devinfo->mbdata_completed = true;
|
||||
wake_up(&devinfo->mbdata_resp_wait);
|
||||
}
|
||||
+ if (dtoh_mb_data & BRCMF_D2H_DEV_FWHALT) {
|
||||
+ brcmf_dbg(PCIE, "D2H_MB_DATA: FW HALT\n");
|
||||
+ brcmf_dev_coredump(&devinfo->pdev->dev);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
From b8248236e92790ac635caeb4156e46ea2417e037 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Wed, 16 May 2018 14:12:03 +0200
|
||||
Subject: [PATCH] brcmfmac: trigger memory dump on SDIO firmware halt message
|
||||
|
||||
Attempt to dump dongle memory for debug upon receiving firmware halt
|
||||
message through dongle to host mail box interrupt.
|
||||
|
||||
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>
|
||||
[rmilecki: add sdiod variable and use func[1]]
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -1078,6 +1078,7 @@ static void brcmf_sdio_get_console_addr(
|
||||
|
||||
static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
|
||||
{
|
||||
+ struct brcmf_sdio_dev *sdiod = bus->sdiodev;
|
||||
u32 intstatus = 0;
|
||||
u32 hmb_data;
|
||||
u8 fcbits;
|
||||
@@ -1095,8 +1096,10 @@ static u32 brcmf_sdio_hostmail(struct br
|
||||
bus->sdcnt.f1regdata += 2;
|
||||
|
||||
/* dongle indicates the firmware has halted/crashed */
|
||||
- if (hmb_data & HMB_DATA_FWHALT)
|
||||
+ if (hmb_data & HMB_DATA_FWHALT) {
|
||||
brcmf_err("mailbox indicates firmware halted\n");
|
||||
+ brcmf_dev_coredump(&sdiod->func[1]->dev);
|
||||
+ }
|
||||
|
||||
/* Dongle recomposed rx frames, accept them again */
|
||||
if (hmb_data & HMB_DATA_NAKHANDLED) {
|
||||
@@ -0,0 +1,59 @@
|
||||
From 01f69dfafdbe7deff58b58053bc3a4a75c6a570c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 24 Jun 2018 21:44:35 +0200
|
||||
Subject: [PATCH] brcmfmac: detect firmware support for monitor interface
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Many/most of firmwares support creating monitor interface but only the
|
||||
most recent ones explicitly /announce/ it using a "monitor" entry in the
|
||||
list of capabilities.
|
||||
|
||||
Check for that entry and store internally info about monitor mode
|
||||
support using a new feature flag. Once we sort out all details of
|
||||
handling monitor interface it will be used when reporting available
|
||||
interfaces to the cfg80211.
|
||||
|
||||
Later some fallback detecion method may be added for older firmwares.
|
||||
For now just stick to the "monitor" capability which should be 100%
|
||||
reliable.
|
||||
|
||||
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/feature.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h | 4 +++-
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -47,6 +47,7 @@ static const struct brcmf_feat_fwcap brc
|
||||
{ BRCMF_FEAT_MBSS, "mbss" },
|
||||
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||
{ BRCMF_FEAT_P2P, "p2p" },
|
||||
+ { BRCMF_FEAT_MONITOR, "monitor" },
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -31,6 +31,7 @@
|
||||
* WOWL_GTK: (WOWL) GTK rekeying offload
|
||||
* WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL.
|
||||
* MFP: 802.11w Management Frame Protection.
|
||||
+ * MONITOR: firmware can pass monitor packets to host.
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -44,7 +45,8 @@
|
||||
BRCMF_FEAT_DEF(WOWL_ND) \
|
||||
BRCMF_FEAT_DEF(WOWL_GTK) \
|
||||
BRCMF_FEAT_DEF(WOWL_ARP_ND) \
|
||||
- BRCMF_FEAT_DEF(MFP)
|
||||
+ BRCMF_FEAT_DEF(MFP) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR)
|
||||
|
||||
/*
|
||||
* Quirks:
|
||||
@@ -0,0 +1,51 @@
|
||||
From e63410ac65e0ead2040bbd3927c116889edf87e4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 24 Jun 2018 21:44:36 +0200
|
||||
Subject: [PATCH] brcmfmac: detect firmware support for radiotap monitor frames
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Depending on used build-time options some firmwares may already include
|
||||
radiotap header in passed monitor frames. Add a new feature flag to
|
||||
store info about it. It's needed for proper handling of received frames
|
||||
before passing them up.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h | 4 +++-
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -48,6 +48,7 @@ static const struct brcmf_feat_fwcap brc
|
||||
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||
{ BRCMF_FEAT_P2P, "p2p" },
|
||||
{ BRCMF_FEAT_MONITOR, "monitor" },
|
||||
+ { BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -32,6 +32,7 @@
|
||||
* WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL.
|
||||
* MFP: 802.11w Management Frame Protection.
|
||||
* MONITOR: firmware can pass monitor packets to host.
|
||||
+ * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -46,7 +47,8 @@
|
||||
BRCMF_FEAT_DEF(WOWL_GTK) \
|
||||
BRCMF_FEAT_DEF(WOWL_ARP_ND) \
|
||||
BRCMF_FEAT_DEF(MFP) \
|
||||
- BRCMF_FEAT_DEF(MONITOR)
|
||||
+ BRCMF_FEAT_DEF(MONITOR) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP)
|
||||
|
||||
/*
|
||||
* Quirks:
|
||||
@@ -0,0 +1,141 @@
|
||||
From a8d7631858aff156b72f807ee7cc062048e63836 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 24 Jun 2018 21:44:37 +0200
|
||||
Subject: [PATCH] brcmfmac: handle msgbuf packets marked with monitor mode flag
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
New Broadcom firmwares mark monitor mode packets using a newly defined
|
||||
bit in the flags field. Use it to filter them out and pass to the
|
||||
monitor interface. These defines were found in bcmmsgbuf.h from SDK.
|
||||
|
||||
As not every firmware generates radiotap header this commit introduces
|
||||
BRCMF_FEAT_MONITOR_FMT_RADIOTAP flag. It has to be has based on firmware
|
||||
capabilities. If not present brcmf_netif_mon_rx() will assume packet is
|
||||
a raw 802.11 frame and will prepend it with an empty radiotap header.
|
||||
|
||||
This new code is limited to the msgbuf protocol at this point. Adding
|
||||
support for SDIO/USB devices will require some extra work (possibly a
|
||||
new firmware release).
|
||||
|
||||
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/core.c | 25 ++++++++++++++++++++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 ++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 18 ++++++++++++++++
|
||||
3 files changed, 45 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <net/cfg80211.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/addrconf.h>
|
||||
+#include <net/ieee80211_radiotap.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <brcmu_utils.h>
|
||||
#include <brcmu_wifi.h>
|
||||
@@ -367,6 +368,34 @@ void brcmf_netif_rx(struct brcmf_if *ifp
|
||||
netif_rx_ni(skb);
|
||||
}
|
||||
|
||||
+void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
+{
|
||||
+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_RADIOTAP)) {
|
||||
+ /* Do nothing */
|
||||
+ } else {
|
||||
+ struct ieee80211_radiotap_header *radiotap;
|
||||
+
|
||||
+ /* TODO: use RX status to fill some radiotap data */
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0)
|
||||
+ radiotap = skb_push(skb, sizeof(*radiotap));
|
||||
+#else
|
||||
+ radiotap = (struct ieee80211_radiotap_header *)skb_push(skb, sizeof(*radiotap));
|
||||
+#endif
|
||||
+ memset(radiotap, 0, sizeof(*radiotap));
|
||||
+ radiotap->it_len = cpu_to_le16(sizeof(*radiotap));
|
||||
+
|
||||
+ /* TODO: 4 bytes with receive status? */
|
||||
+ skb->len -= 4;
|
||||
+ }
|
||||
+
|
||||
+ skb->dev = ifp->ndev;
|
||||
+ skb_reset_mac_header(skb);
|
||||
+ skb->pkt_type = PACKET_OTHERHOST;
|
||||
+ skb->protocol = htons(ETH_P_802_2);
|
||||
+
|
||||
+ brcmf_netif_rx(ifp, skb);
|
||||
+}
|
||||
+
|
||||
static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb,
|
||||
struct brcmf_if **ifp)
|
||||
{
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -122,6 +122,7 @@ struct brcmf_pub {
|
||||
|
||||
struct brcmf_if *iflist[BRCMF_MAX_IFS];
|
||||
s32 if2bss[BRCMF_MAX_IFS];
|
||||
+ struct brcmf_if *mon_if;
|
||||
|
||||
struct mutex proto_block;
|
||||
unsigned char proto_buf[BRCMF_DCMD_MAXLEN];
|
||||
@@ -219,6 +220,7 @@ void brcmf_txflowblock_if(struct brcmf_i
|
||||
enum brcmf_netif_stop_reason reason, bool state);
|
||||
void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
|
||||
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
+void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
|
||||
int __init brcmf_core_init(void);
|
||||
void __exit brcmf_core_exit(void);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -69,6 +69,8 @@
|
||||
#define BRCMF_MSGBUF_MAX_EVENTBUF_POST 8
|
||||
|
||||
#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_3 0x01
|
||||
+#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_11 0x02
|
||||
+#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_MASK 0x07
|
||||
#define BRCMF_MSGBUF_PKT_FLAGS_PRIO_SHIFT 5
|
||||
|
||||
#define BRCMF_MSGBUF_TX_FLUSH_CNT1 32
|
||||
@@ -1126,6 +1128,7 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
struct sk_buff *skb;
|
||||
u16 data_offset;
|
||||
u16 buflen;
|
||||
+ u16 flags;
|
||||
u32 idx;
|
||||
struct brcmf_if *ifp;
|
||||
|
||||
@@ -1135,6 +1138,7 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
data_offset = le16_to_cpu(rx_complete->data_offset);
|
||||
buflen = le16_to_cpu(rx_complete->data_len);
|
||||
idx = le32_to_cpu(rx_complete->msg.request_id);
|
||||
+ flags = le16_to_cpu(rx_complete->flags);
|
||||
|
||||
skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
|
||||
msgbuf->rx_pktids, idx);
|
||||
@@ -1148,6 +1152,20 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
|
||||
skb_trim(skb, buflen);
|
||||
|
||||
+ if ((flags & BRCMF_MSGBUF_PKT_FLAGS_FRAME_MASK) ==
|
||||
+ BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_11) {
|
||||
+ ifp = msgbuf->drvr->mon_if;
|
||||
+
|
||||
+ if (!ifp) {
|
||||
+ brcmf_err("Received unexpected monitor pkt\n");
|
||||
+ brcmu_pkt_buf_free_skb(skb);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ brcmf_netif_mon_rx(ifp, skb);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
ifp = brcmf_get_ifp(msgbuf->drvr, rx_complete->msg.ifidx);
|
||||
if (!ifp || !ifp->ndev) {
|
||||
brcmf_err("Received pkt for invalid ifidx %d\n",
|
||||
@@ -0,0 +1,60 @@
|
||||
From 4b4a8d808c58fc0defc32a26b2fea35d66692c45 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 28 Jun 2018 08:16:13 +0200
|
||||
Subject: [PATCH] brcmfmac: define more bits for the flags of struct
|
||||
brcmf_sta_info_le
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
That struct is passed by a firmware when querying for STA info. Flags
|
||||
are used to indicate what info could be obtained.
|
||||
|
||||
These new defines may allow passing more info to the cfg80211 in the
|
||||
future. They had been obtained from Broadcom's SDK file wlioctl_defs.h
|
||||
used by DD-WRT.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/fwil_types.h | 29 ++++++++++++++++++----
|
||||
1 file changed, 24 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
@@ -32,11 +32,30 @@
|
||||
#define BRCMF_BSS_INFO_VERSION 109 /* curr ver of brcmf_bss_info_le struct */
|
||||
#define BRCMF_BSS_RSSI_ON_CHANNEL 0x0002
|
||||
|
||||
-#define BRCMF_STA_WME 0x00000002 /* WMM association */
|
||||
-#define BRCMF_STA_AUTHE 0x00000008 /* Authenticated */
|
||||
-#define BRCMF_STA_ASSOC 0x00000010 /* Associated */
|
||||
-#define BRCMF_STA_AUTHO 0x00000020 /* Authorized */
|
||||
-#define BRCMF_STA_SCBSTATS 0x00004000 /* Per STA debug stats */
|
||||
+#define BRCMF_STA_BRCM 0x00000001 /* Running a Broadcom driver */
|
||||
+#define BRCMF_STA_WME 0x00000002 /* WMM association */
|
||||
+#define BRCMF_STA_NONERP 0x00000004 /* No ERP */
|
||||
+#define BRCMF_STA_AUTHE 0x00000008 /* Authenticated */
|
||||
+#define BRCMF_STA_ASSOC 0x00000010 /* Associated */
|
||||
+#define BRCMF_STA_AUTHO 0x00000020 /* Authorized */
|
||||
+#define BRCMF_STA_WDS 0x00000040 /* Wireless Distribution System */
|
||||
+#define BRCMF_STA_WDS_LINKUP 0x00000080 /* WDS traffic/probes flowing properly */
|
||||
+#define BRCMF_STA_PS 0x00000100 /* STA is in power save mode from AP's viewpoint */
|
||||
+#define BRCMF_STA_APSD_BE 0x00000200 /* APSD delv/trigger for AC_BE is default enabled */
|
||||
+#define BRCMF_STA_APSD_BK 0x00000400 /* APSD delv/trigger for AC_BK is default enabled */
|
||||
+#define BRCMF_STA_APSD_VI 0x00000800 /* APSD delv/trigger for AC_VI is default enabled */
|
||||
+#define BRCMF_STA_APSD_VO 0x00001000 /* APSD delv/trigger for AC_VO is default enabled */
|
||||
+#define BRCMF_STA_N_CAP 0x00002000 /* STA 802.11n capable */
|
||||
+#define BRCMF_STA_SCBSTATS 0x00004000 /* Per STA debug stats */
|
||||
+#define BRCMF_STA_AMPDU_CAP 0x00008000 /* STA AMPDU capable */
|
||||
+#define BRCMF_STA_AMSDU_CAP 0x00010000 /* STA AMSDU capable */
|
||||
+#define BRCMF_STA_MIMO_PS 0x00020000 /* mimo ps mode is enabled */
|
||||
+#define BRCMF_STA_MIMO_RTS 0x00040000 /* send rts in mimo ps mode */
|
||||
+#define BRCMF_STA_RIFS_CAP 0x00080000 /* rifs enabled */
|
||||
+#define BRCMF_STA_VHT_CAP 0x00100000 /* STA VHT(11ac) capable */
|
||||
+#define BRCMF_STA_WPS 0x00200000 /* WPS state */
|
||||
+#define BRCMF_STA_DWDS_CAP 0x01000000 /* DWDS CAP */
|
||||
+#define BRCMF_STA_DWDS 0x02000000 /* DWDS active */
|
||||
|
||||
/* size of brcmf_scan_params not including variable length array */
|
||||
#define BRCMF_SCAN_PARAMS_FIXED_SIZE 64
|
||||
@@ -0,0 +1,75 @@
|
||||
From 07b1ae46874949252625c96f309f96ca0f337020 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 28 Jun 2018 12:36:23 +0200
|
||||
Subject: [PATCH] brcmfmac: update STA info struct to the v5
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
That struct is used when querying firmware for the STA. It seem is has
|
||||
been changing during the time. Luckily its format seems to be backward
|
||||
compatible starting with v2 (the only breakage was v1 -> v2).
|
||||
|
||||
The version that was supported by brcmfmac so far was v4. It was what
|
||||
43602a1 and 4366b1 firmwares (7.35.177.56 and 10.10.69.3309 accordingly)
|
||||
were using. It also seems to be used by early 4366c0 firmwares
|
||||
(10.10.69.6908 and 10.10.69.69017).
|
||||
|
||||
The problem appears when switching to the 10.10.122.20 firmware. It uses
|
||||
v5 and instead of falling back to v4 when submitted buffer isn't big
|
||||
enough it fallbacks to the v3.
|
||||
|
||||
To receive all v4 specific info with the newest firmware we have to
|
||||
submit a struct (buffer) that matches v5.
|
||||
|
||||
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>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
@@ -165,6 +165,8 @@
|
||||
#define BRCMF_MFP_NONE 0
|
||||
#define BRCMF_MFP_CAPABLE 1
|
||||
#define BRCMF_MFP_REQUIRED 2
|
||||
+
|
||||
+#define BRCMF_VHT_CAP_MCS_MAP_NSS_MAX 8
|
||||
|
||||
/* join preference types for join_pref iovar */
|
||||
enum brcmf_join_pref_types {
|
||||
@@ -514,6 +516,8 @@ struct brcmf_sta_info_le {
|
||||
/* w/hi bit set if basic */
|
||||
__le32 in; /* seconds elapsed since associated */
|
||||
__le32 listen_interval_inms; /* Min Listen interval in ms for STA */
|
||||
+
|
||||
+ /* Fields valid for ver >= 3 */
|
||||
__le32 tx_pkts; /* # of packets transmitted */
|
||||
__le32 tx_failures; /* # of packets failed */
|
||||
__le32 rx_ucast_pkts; /* # of unicast packets received */
|
||||
@@ -522,6 +526,8 @@ struct brcmf_sta_info_le {
|
||||
__le32 rx_rate; /* Rate of last successful rx frame */
|
||||
__le32 rx_decrypt_succeeds; /* # of packet decrypted successfully */
|
||||
__le32 rx_decrypt_failures; /* # of packet decrypted failed */
|
||||
+
|
||||
+ /* Fields valid for ver >= 4 */
|
||||
__le32 tx_tot_pkts; /* # of tx pkts (ucast + mcast) */
|
||||
__le32 rx_tot_pkts; /* # of data packets recvd (uni + mcast) */
|
||||
__le32 tx_mcast_pkts; /* # of mcast pkts txed */
|
||||
@@ -558,6 +564,14 @@ struct brcmf_sta_info_le {
|
||||
*/
|
||||
__le32 rx_pkts_retried; /* # rx with retry bit set */
|
||||
__le32 tx_rate_fallback; /* lowest fallback TX rate */
|
||||
+
|
||||
+ /* Fields valid for ver >= 5 */
|
||||
+ struct {
|
||||
+ __le32 count; /* # rates in this set */
|
||||
+ u8 rates[BRCMF_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */
|
||||
+ u8 mcs[BRCMF_MCSSET_LEN]; /* supported mcs index bit map */
|
||||
+ __le16 vht_mcs[BRCMF_VHT_CAP_MCS_MAP_NSS_MAX]; /* supported mcs index bit map per nss */
|
||||
+ } rateset_adv;
|
||||
};
|
||||
|
||||
struct brcmf_chanspec_list {
|
||||
@@ -0,0 +1,84 @@
|
||||
From 1e591c56a65fbbcd5754a4210a0ef0402d5e5f33 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 9 Jul 2018 06:55:43 +0200
|
||||
Subject: [PATCH] brcmfmac: specify some features per firmware version
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Some features supported by firmware aren't advertised and there is no
|
||||
way for a driver to query them. This includes e.g. monitor mode details.
|
||||
|
||||
Most firmwares support monitor interface but only the latest ones
|
||||
/announce/ it with a "monitor" flag in the "cap" iovar. There isn't any
|
||||
reliable detection method for older firmwares (BRCMF_C_MONITOR was tried
|
||||
but "it only indicates the core part of the stack supports").
|
||||
|
||||
Similarly support for tagging monitor frames and building radiotap
|
||||
headers can't be reliably detected for all firmwares.
|
||||
|
||||
This commit adds table that allows mapping features to firmware version.
|
||||
It adds mappings for 43602a1 and 4366b1 firmwares from
|
||||
linux-firmware.git. Both were confirmed to be passing monitor frames.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/feature.c | 38 ++++++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -92,6 +92,42 @@ static int brcmf_feat_debugfs_read(struc
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
+struct brcmf_feat_fwfeat {
|
||||
+ const char * const fwid;
|
||||
+ u32 feat_flags;
|
||||
+};
|
||||
+
|
||||
+static const struct brcmf_feat_fwfeat brcmf_feat_fwfeat_map[] = {
|
||||
+ /* brcmfmac43602-pcie.ap.bin from linux-firmware.git commit ea1178515b88 */
|
||||
+ { "01-6cb8e269", BIT(BRCMF_FEAT_MONITOR) },
|
||||
+ /* brcmfmac4366b-pcie.bin from linux-firmware.git commit 52442afee990 */
|
||||
+ { "01-c47a91a4", BIT(BRCMF_FEAT_MONITOR) },
|
||||
+};
|
||||
+
|
||||
+static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv)
|
||||
+{
|
||||
+ const struct brcmf_feat_fwfeat *e;
|
||||
+ u32 feat_flags = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(brcmf_feat_fwfeat_map); i++) {
|
||||
+ e = &brcmf_feat_fwfeat_map[i];
|
||||
+ if (!strcmp(e->fwid, drv->fwver)) {
|
||||
+ feat_flags = e->feat_flags;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!feat_flags)
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < BRCMF_FEAT_LAST; i++)
|
||||
+ if (feat_flags & BIT(i))
|
||||
+ brcmf_dbg(INFO, "enabling firmware feature: %s\n",
|
||||
+ brcmf_feat_names[i]);
|
||||
+ drv->feat_flags |= feat_flags;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* brcmf_feat_iovar_int_get() - determine feature through iovar query.
|
||||
*
|
||||
@@ -219,6 +255,8 @@ void brcmf_feat_attach(struct brcmf_pub
|
||||
ifp->drvr->feat_flags &= ~drvr->settings->feature_disable;
|
||||
}
|
||||
|
||||
+ brcmf_feat_firmware_overrides(drvr);
|
||||
+
|
||||
/* set chip related quirks */
|
||||
switch (drvr->bus_if->chip) {
|
||||
case BRCM_CC_43236_CHIP_ID:
|
||||
@@ -0,0 +1,25 @@
|
||||
From 2fef681a4cf7994c882190fd2417b95f30510afb Mon Sep 17 00:00:00 2001
|
||||
From: Jia-Shyr Chuang <saint.chuang@cypress.com>
|
||||
Date: Wed, 15 Aug 2018 04:23:09 -0500
|
||||
Subject: [PATCH] brcmfmac: add CYW89342 mini-PCIe device
|
||||
|
||||
CYW89342 is a 2x2 MIMO, 802.11a/b/g/n/ac for WLAN. It is a member of
|
||||
4355/4359 family.
|
||||
|
||||
Signed-off-by: Jia-Shyr Chuang <saint.chuang@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1967,6 +1967,7 @@ static const struct dev_pm_ops brcmf_pci
|
||||
|
||||
static struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
|
||||
+ BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
|
||||
@@ -0,0 +1,117 @@
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 5 Sep 2018 09:48:58 +0200
|
||||
Subject: [PATCH] brcmfmac: fix for proper support of 160MHz bandwidth
|
||||
|
||||
Decoding of firmware channel information was not complete for 160MHz
|
||||
support. This resulted in the following warning:
|
||||
|
||||
WARNING: CPU: 2 PID: 2222 at .../broadcom/brcm80211/brcmutil/d11.c:196
|
||||
brcmu_d11ac_decchspec+0x2e/0x100 [brcmutil]
|
||||
Modules linked in: brcmfmac(O) brcmutil(O) sha256_generic cfg80211 ...
|
||||
CPU: 2 PID: 2222 Comm: kworker/2:0 Tainted: G O
|
||||
4.17.0-wt-testing-x64-00002-gf1bed50 #1
|
||||
Hardware name: Dell Inc. Latitude E6410/07XJP9, BIOS A07 02/15/2011
|
||||
Workqueue: events request_firmware_work_func
|
||||
RIP: 0010:brcmu_d11ac_decchspec+0x2e/0x100 [brcmutil]
|
||||
RSP: 0018:ffffc90000047bd0 EFLAGS: 00010206
|
||||
RAX: 000000000000e832 RBX: ffff8801146fe910 RCX: ffff8801146fd3c0
|
||||
RDX: 0000000000002800 RSI: 0000000000000070 RDI: ffffc90000047c30
|
||||
RBP: ffffc90000047bd0 R08: 0000000000000000 R09: ffffffffa0798c80
|
||||
R10: ffff88012bca55e0 R11: ffff880110a4ea00 R12: ffff8801146f8000
|
||||
R13: ffffc90000047c30 R14: ffff8801146fe930 R15: ffff8801138e02e0
|
||||
FS: 0000000000000000(0000) GS:ffff88012bc80000(0000) knlGS:0000000000000000
|
||||
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
|
||||
CR2: 00007f18ce8b8070 CR3: 000000000200a003 CR4: 00000000000206e0
|
||||
Call Trace:
|
||||
brcmf_setup_wiphybands+0x212/0x780 [brcmfmac]
|
||||
brcmf_cfg80211_attach+0xae2/0x11a0 [brcmfmac]
|
||||
brcmf_attach+0x1fc/0x4b0 [brcmfmac]
|
||||
? __kmalloc+0x13c/0x1c0
|
||||
brcmf_pcie_setup+0x99b/0xe00 [brcmfmac]
|
||||
brcmf_fw_request_done+0x16a/0x1f0 [brcmfmac]
|
||||
request_firmware_work_func+0x36/0x60
|
||||
process_one_work+0x146/0x350
|
||||
worker_thread+0x4a/0x3b0
|
||||
kthread+0x102/0x140
|
||||
? process_one_work+0x350/0x350
|
||||
? kthread_bind+0x20/0x20
|
||||
ret_from_fork+0x35/0x40
|
||||
Code: 66 90 0f b7 07 55 48 89 e5 89 c2 88 47 02 88 47 03 66 81 e2 00 38
|
||||
66 81 fa 00 18 74 6e 66 81 fa 00 20 74 39 66 81 fa 00 10 74 14 <0f>
|
||||
0b 66 25 00 c0 74 20 66 3d 00 c0 75 20 c6 47 04 01 5d c3 66
|
||||
---[ end trace 550c46682415b26d ]---
|
||||
brcmfmac: brcmf_construct_chaninfo: Ignoring unexpected firmware channel 50
|
||||
|
||||
This patch adds the missing stuff to properly handle this.
|
||||
|
||||
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>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmutil/d11.c | 34 +++++++++++++++++++++-
|
||||
.../broadcom/brcm80211/include/brcmu_wifi.h | 2 ++
|
||||
2 files changed, 35 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
@@ -77,6 +77,8 @@ static u16 d11ac_bw(enum brcmu_chan_bw b
|
||||
return BRCMU_CHSPEC_D11AC_BW_40;
|
||||
case BRCMU_CHAN_BW_80:
|
||||
return BRCMU_CHSPEC_D11AC_BW_80;
|
||||
+ case BRCMU_CHAN_BW_160:
|
||||
+ return BRCMU_CHSPEC_D11AC_BW_160;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
}
|
||||
@@ -190,8 +192,38 @@ static void brcmu_d11ac_decchspec(struct
|
||||
break;
|
||||
}
|
||||
break;
|
||||
- case BRCMU_CHSPEC_D11AC_BW_8080:
|
||||
case BRCMU_CHSPEC_D11AC_BW_160:
|
||||
+ switch (ch->sb) {
|
||||
+ case BRCMU_CHAN_SB_LLL:
|
||||
+ ch->control_ch_num -= CH_70MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_LLU:
|
||||
+ ch->control_ch_num -= CH_50MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_LUL:
|
||||
+ ch->control_ch_num -= CH_30MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_LUU:
|
||||
+ ch->control_ch_num -= CH_10MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_ULL:
|
||||
+ ch->control_ch_num += CH_10MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_ULU:
|
||||
+ ch->control_ch_num += CH_30MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_UUL:
|
||||
+ ch->control_ch_num += CH_50MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_UUU:
|
||||
+ ch->control_ch_num += CH_70MHZ_APART;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ON_ONCE(1);
|
||||
+ break;
|
||||
+ }
|
||||
+ break;
|
||||
+ case BRCMU_CHSPEC_D11AC_BW_8080:
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
break;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
|
||||
@@ -29,6 +29,8 @@
|
||||
#define CH_UPPER_SB 0x01
|
||||
#define CH_LOWER_SB 0x02
|
||||
#define CH_EWA_VALID 0x04
|
||||
+#define CH_70MHZ_APART 14
|
||||
+#define CH_50MHZ_APART 10
|
||||
#define CH_30MHZ_APART 6
|
||||
#define CH_20MHZ_APART 4
|
||||
#define CH_10MHZ_APART 2
|
||||
@@ -0,0 +1,28 @@
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 5 Sep 2018 09:48:59 +0200
|
||||
Subject: [PATCH] brcmfmac: increase buffer for obtaining firmware capabilities
|
||||
|
||||
When obtaining the firmware capability a buffer is provided of 512
|
||||
bytes. However, if all features in firmware are supported the buffer
|
||||
needs to be 565 bytes as otherwise truncated information is retrieved
|
||||
from firmware. Increasing the buffer to 768 bytes on stack.
|
||||
|
||||
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>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -151,7 +151,7 @@ static void brcmf_feat_iovar_int_get(str
|
||||
}
|
||||
}
|
||||
|
||||
-#define MAX_CAPS_BUFFER_SIZE 512
|
||||
+#define MAX_CAPS_BUFFER_SIZE 768
|
||||
static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp)
|
||||
{
|
||||
char caps[MAX_CAPS_BUFFER_SIZE];
|
||||
@@ -0,0 +1,67 @@
|
||||
From edb6d6885bef82d1eac432dbeca9fbf4ec349d7e Mon Sep 17 00:00:00 2001
|
||||
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
||||
Date: Thu, 27 Sep 2018 14:59:44 +0000
|
||||
Subject: [PATCH] brcmfmac: reduce timeout for action frame scan
|
||||
|
||||
Finding a common channel to send an action frame out is required for
|
||||
some action types. Since a loop with several scan retry is used to find
|
||||
the channel, a short wait time could be considered for each attempt.
|
||||
This patch reduces the wait time from 1500 to 450 msec for each action
|
||||
frame scan.
|
||||
|
||||
This patch fixes the WFA p2p certification 5.1.20 failure caused by the
|
||||
long action frame send time.
|
||||
|
||||
Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -74,7 +74,7 @@
|
||||
#define P2P_AF_MAX_WAIT_TIME msecs_to_jiffies(2000)
|
||||
#define P2P_INVALID_CHANNEL -1
|
||||
#define P2P_CHANNEL_SYNC_RETRY 5
|
||||
-#define P2P_AF_FRM_SCAN_MAX_WAIT msecs_to_jiffies(1500)
|
||||
+#define P2P_AF_FRM_SCAN_MAX_WAIT msecs_to_jiffies(450)
|
||||
#define P2P_DEFAULT_SLEEP_TIME_VSDB 200
|
||||
|
||||
/* WiFi P2P Public Action Frame OUI Subtypes */
|
||||
@@ -1141,7 +1141,6 @@ static s32 brcmf_p2p_af_searching_channe
|
||||
{
|
||||
struct afx_hdl *afx_hdl = &p2p->afx_hdl;
|
||||
struct brcmf_cfg80211_vif *pri_vif;
|
||||
- unsigned long duration;
|
||||
s32 retry;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
@@ -1157,7 +1156,6 @@ static s32 brcmf_p2p_af_searching_channe
|
||||
* pending action frame tx is cancelled.
|
||||
*/
|
||||
retry = 0;
|
||||
- duration = msecs_to_jiffies(P2P_AF_FRM_SCAN_MAX_WAIT);
|
||||
while ((retry < P2P_CHANNEL_SYNC_RETRY) &&
|
||||
(afx_hdl->peer_chan == P2P_INVALID_CHANNEL)) {
|
||||
afx_hdl->is_listen = false;
|
||||
@@ -1165,7 +1163,8 @@ static s32 brcmf_p2p_af_searching_channe
|
||||
retry);
|
||||
/* search peer on peer's listen channel */
|
||||
schedule_work(&afx_hdl->afx_work);
|
||||
- wait_for_completion_timeout(&afx_hdl->act_frm_scan, duration);
|
||||
+ wait_for_completion_timeout(&afx_hdl->act_frm_scan,
|
||||
+ P2P_AF_FRM_SCAN_MAX_WAIT);
|
||||
if ((afx_hdl->peer_chan != P2P_INVALID_CHANNEL) ||
|
||||
(!test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL,
|
||||
&p2p->status)))
|
||||
@@ -1178,7 +1177,7 @@ static s32 brcmf_p2p_af_searching_channe
|
||||
afx_hdl->is_listen = true;
|
||||
schedule_work(&afx_hdl->afx_work);
|
||||
wait_for_completion_timeout(&afx_hdl->act_frm_scan,
|
||||
- duration);
|
||||
+ P2P_AF_FRM_SCAN_MAX_WAIT);
|
||||
}
|
||||
if ((afx_hdl->peer_chan != P2P_INVALID_CHANNEL) ||
|
||||
(!test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL,
|
||||
@@ -0,0 +1,79 @@
|
||||
From fbf07000960d9c8a13fdc17c6de0230d681c7543 Mon Sep 17 00:00:00 2001
|
||||
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
||||
Date: Thu, 27 Sep 2018 14:59:49 +0000
|
||||
Subject: [PATCH] brcmfmac: fix full timeout waiting for action frame
|
||||
on-channel tx
|
||||
|
||||
The driver sends an action frame down and waits for a completion signal
|
||||
triggered by the received BRCMF_E_ACTION_FRAME_OFF_CHAN_COMPLETE event
|
||||
to continue the process. However, the action frame could be transmitted
|
||||
either on the current channel or on an off channel. For the on-channel
|
||||
case, only BRCMF_E_ACTION_FRAME_COMPLETE event will be received when
|
||||
the frame is transmitted, which make the driver always wait a full
|
||||
timeout duration. This patch has the completion signal be triggered by
|
||||
receiving the BRCMF_E_ACTION_FRAME_COMPLETE event for the on-channel
|
||||
case.
|
||||
|
||||
This change fixes WFA p2p certification 5.1.19 failure.
|
||||
|
||||
Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 17 +++++++++++++++--
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h | 2 ++
|
||||
2 files changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -1464,10 +1464,12 @@ int brcmf_p2p_notify_action_tx_complete(
|
||||
return 0;
|
||||
|
||||
if (e->event_code == BRCMF_E_ACTION_FRAME_COMPLETE) {
|
||||
- if (e->status == BRCMF_E_STATUS_SUCCESS)
|
||||
+ if (e->status == BRCMF_E_STATUS_SUCCESS) {
|
||||
set_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED,
|
||||
&p2p->status);
|
||||
- else {
|
||||
+ if (!p2p->wait_for_offchan_complete)
|
||||
+ complete(&p2p->send_af_done);
|
||||
+ } else {
|
||||
set_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
|
||||
/* If there is no ack, we don't need to wait for
|
||||
* WLC_E_ACTION_FRAME_OFFCHAN_COMPLETE event
|
||||
@@ -1518,6 +1520,17 @@ static s32 brcmf_p2p_tx_action_frame(str
|
||||
p2p->af_sent_channel = le32_to_cpu(af_params->channel);
|
||||
p2p->af_tx_sent_jiffies = jiffies;
|
||||
|
||||
+ if (test_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN, &p2p->status) &&
|
||||
+ p2p->af_sent_channel ==
|
||||
+ ieee80211_frequency_to_channel(p2p->remain_on_channel.center_freq))
|
||||
+ p2p->wait_for_offchan_complete = false;
|
||||
+ else
|
||||
+ p2p->wait_for_offchan_complete = true;
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "Waiting for %s tx completion event\n",
|
||||
+ (p2p->wait_for_offchan_complete) ?
|
||||
+ "off-channel" : "on-channel");
|
||||
+
|
||||
timeout = wait_for_completion_timeout(&p2p->send_af_done,
|
||||
P2P_AF_MAX_WAIT_TIME);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
|
||||
@@ -124,6 +124,7 @@ struct afx_hdl {
|
||||
* @gon_req_action: about to send go negotiation requets frame.
|
||||
* @block_gon_req_tx: drop tx go negotiation requets frame.
|
||||
* @p2pdev_dynamically: is p2p device if created by module param or supplicant.
|
||||
+ * @wait_for_offchan_complete: wait for off-channel tx completion event.
|
||||
*/
|
||||
struct brcmf_p2p_info {
|
||||
struct brcmf_cfg80211_info *cfg;
|
||||
@@ -144,6 +145,7 @@ struct brcmf_p2p_info {
|
||||
bool gon_req_action;
|
||||
bool block_gon_req_tx;
|
||||
bool p2pdev_dynamically;
|
||||
+ bool wait_for_offchan_complete;
|
||||
};
|
||||
|
||||
s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced);
|
||||
@@ -0,0 +1,41 @@
|
||||
From 3401d42c7ea2d064d15c66698ff8eb96553179ce Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 26 Oct 2018 12:50:39 +0200
|
||||
Subject: [PATCH] brcmutil: really fix decoding channel info for 160 MHz
|
||||
bandwidth
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Previous commit /adding/ support for 160 MHz chanspecs was incomplete.
|
||||
It didn't set bandwidth info and didn't extract control channel info. As
|
||||
the result it was also using uninitialized "sb" var.
|
||||
|
||||
This change has been tested for two chanspecs found to be reported by
|
||||
some devices/firmwares:
|
||||
1) 60/160 (0xee32)
|
||||
Before: chnum:50 control_ch_num:36
|
||||
After: chnum:50 control_ch_num:60
|
||||
2) 120/160 (0xed72)
|
||||
Before: chnum:114 control_ch_num:100
|
||||
After: chnum:114 control_ch_num:120
|
||||
|
||||
Fixes: 330994e8e8ec ("brcmfmac: fix for proper support of 160MHz bandwidth")
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
@@ -193,6 +193,9 @@ static void brcmu_d11ac_decchspec(struct
|
||||
}
|
||||
break;
|
||||
case BRCMU_CHSPEC_D11AC_BW_160:
|
||||
+ ch->bw = BRCMU_CHAN_BW_160;
|
||||
+ ch->sb = brcmu_maskget16(ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,
|
||||
+ BRCMU_CHSPEC_D11AC_SB_SHIFT);
|
||||
switch (ch->sb) {
|
||||
case BRCMU_CHAN_SB_LLL:
|
||||
ch->control_ch_num -= CH_70MHZ_APART;
|
||||
@@ -0,0 +1,34 @@
|
||||
From 8eefb59de817125eeedde2a2cc1e4ac3660062f9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 8 Nov 2018 16:08:29 +0100
|
||||
Subject: [PATCH] brcmfmac: fix reporting support for 160 MHz channels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Driver can report IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ so it's
|
||||
important to provide valid & complete info about supported bands for
|
||||
each channel. By default no support for 160 MHz should be assumed unless
|
||||
firmware reports it for a given channel later.
|
||||
|
||||
This fixes info passed to the userspace. Without that change userspace
|
||||
could try to use invalid channel and fail to start an interface.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -5960,7 +5960,8 @@ static int brcmf_construct_chaninfo(stru
|
||||
* for subsequent chanspecs.
|
||||
*/
|
||||
channel->flags = IEEE80211_CHAN_NO_HT40 |
|
||||
- IEEE80211_CHAN_NO_80MHZ;
|
||||
+ IEEE80211_CHAN_NO_80MHZ |
|
||||
+ IEEE80211_CHAN_NO_160MHZ;
|
||||
ch.bw = BRCMU_CHAN_BW_20;
|
||||
cfg->d11inf.encchspec(&ch);
|
||||
chaninfo = ch.chspec;
|
||||
@@ -0,0 +1,34 @@
|
||||
From e966a79c2f761a696dec9cfb0e2d4aa977bf78cb Mon Sep 17 00:00:00 2001
|
||||
From: Colin Ian King <colin.king@canonical.com>
|
||||
Date: Tue, 16 Oct 2018 18:43:42 +0100
|
||||
Subject: [PATCH] brcmfmac: fix spelling mistake "Retreiving" -> "Retrieving"
|
||||
|
||||
Trivial fix to spelling mistake in brcmf_err error message.
|
||||
|
||||
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/common.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -121,7 +121,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||
sizeof(ifp->mac_addr));
|
||||
if (err < 0) {
|
||||
- brcmf_err("Retreiving cur_etheraddr failed, %d\n", err);
|
||||
+ brcmf_err("Retrieving cur_etheraddr failed, %d\n", err);
|
||||
goto done;
|
||||
}
|
||||
memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
|
||||
@@ -158,7 +158,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
strcpy(buf, "ver");
|
||||
err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
|
||||
if (err < 0) {
|
||||
- brcmf_err("Retreiving version information failed, %d\n",
|
||||
+ brcmf_err("Retrieving version information failed, %d\n",
|
||||
err);
|
||||
goto done;
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
From ae5848cb4511bbbfe0306fcdbe5d9a95cd9546a9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 26 Oct 2018 13:22:32 +0200
|
||||
Subject: [PATCH] brcmutil: print invalid chanspec when WARN-ing
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On one of my devices I got WARNINGs when brcmfmac tried to decode
|
||||
chanspec. I couldn't tell if it was some unsupported format or just a
|
||||
malformed value passed by a firmware.
|
||||
|
||||
Print chanspec value so it's possible to debug a possible problem.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
@@ -128,7 +128,7 @@ static void brcmu_d11n_decchspec(struct
|
||||
}
|
||||
break;
|
||||
default:
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ static void brcmu_d11n_decchspec(struct
|
||||
ch->band = BRCMU_CHAN_BAND_2G;
|
||||
break;
|
||||
default:
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -167,7 +167,7 @@ static void brcmu_d11ac_decchspec(struct
|
||||
ch->sb = BRCMU_CHAN_SB_U;
|
||||
ch->control_ch_num += CH_10MHZ_APART;
|
||||
} else {
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
}
|
||||
break;
|
||||
case BRCMU_CHSPEC_D11AC_BW_80:
|
||||
@@ -188,7 +188,7 @@ static void brcmu_d11ac_decchspec(struct
|
||||
ch->control_ch_num += CH_30MHZ_APART;
|
||||
break;
|
||||
default:
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -222,13 +222,13 @@ static void brcmu_d11ac_decchspec(struct
|
||||
ch->control_ch_num += CH_70MHZ_APART;
|
||||
break;
|
||||
default:
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case BRCMU_CHSPEC_D11AC_BW_8080:
|
||||
default:
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ static void brcmu_d11ac_decchspec(struct
|
||||
ch->band = BRCMU_CHAN_BAND_2G;
|
||||
break;
|
||||
default:
|
||||
- WARN_ON_ONCE(1);
|
||||
+ WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
From a4dad0334732f62c67058037d9edb17945bec598 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <riproute@gmail.com>
|
||||
Date: Fri, 9 Nov 2018 09:38:55 -0700
|
||||
Subject: [PATCH] brcmfmac: support STA info struct v7
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The newest firmwares provide STA info using v7 of the struct. As v7
|
||||
isn't backward compatible, a union is needed.
|
||||
|
||||
Even though brcmfmac does not use any of the new info it's important to
|
||||
provide the proper struct buffer. Without this change new firmwares will
|
||||
fallback to the very limited v3 instead of something in between such as
|
||||
v4.
|
||||
|
||||
Signed-off-by: Dan Haab <dan.haab@luxul.com>
|
||||
Reviewed-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/fwil_types.h | 40 ++++++++++++++++++----
|
||||
1 file changed, 33 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
@@ -167,6 +167,8 @@
|
||||
#define BRCMF_MFP_REQUIRED 2
|
||||
|
||||
#define BRCMF_VHT_CAP_MCS_MAP_NSS_MAX 8
|
||||
+
|
||||
+#define BRCMF_HE_CAP_MCS_MAP_NSS_MAX 8
|
||||
|
||||
/* join preference types for join_pref iovar */
|
||||
enum brcmf_join_pref_types {
|
||||
@@ -565,13 +567,37 @@ struct brcmf_sta_info_le {
|
||||
__le32 rx_pkts_retried; /* # rx with retry bit set */
|
||||
__le32 tx_rate_fallback; /* lowest fallback TX rate */
|
||||
|
||||
- /* Fields valid for ver >= 5 */
|
||||
- struct {
|
||||
- __le32 count; /* # rates in this set */
|
||||
- u8 rates[BRCMF_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */
|
||||
- u8 mcs[BRCMF_MCSSET_LEN]; /* supported mcs index bit map */
|
||||
- __le16 vht_mcs[BRCMF_VHT_CAP_MCS_MAP_NSS_MAX]; /* supported mcs index bit map per nss */
|
||||
- } rateset_adv;
|
||||
+ union {
|
||||
+ struct {
|
||||
+ struct {
|
||||
+ __le32 count; /* # rates in this set */
|
||||
+ u8 rates[BRCMF_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */
|
||||
+ u8 mcs[BRCMF_MCSSET_LEN]; /* supported mcs index bit map */
|
||||
+ __le16 vht_mcs[BRCMF_VHT_CAP_MCS_MAP_NSS_MAX]; /* supported mcs index bit map per nss */
|
||||
+ } rateset_adv;
|
||||
+ } v5;
|
||||
+
|
||||
+ struct {
|
||||
+ __le32 rx_dur_total; /* total user RX duration (estimated) */
|
||||
+ __le16 chanspec; /** chanspec this sta is on */
|
||||
+ __le16 pad_1;
|
||||
+ struct {
|
||||
+ __le16 version; /* version */
|
||||
+ __le16 len; /* length */
|
||||
+ __le32 count; /* # rates in this set */
|
||||
+ u8 rates[BRCMF_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */
|
||||
+ u8 mcs[BRCMF_MCSSET_LEN]; /* supported mcs index bit map */
|
||||
+ __le16 vht_mcs[BRCMF_VHT_CAP_MCS_MAP_NSS_MAX]; /* supported mcs index bit map per nss */
|
||||
+ __le16 he_mcs[BRCMF_HE_CAP_MCS_MAP_NSS_MAX]; /* supported he mcs index bit map per nss */
|
||||
+ } rateset_adv; /* rateset along with mcs index bitmap */
|
||||
+ __le16 wpauth; /* authentication type */
|
||||
+ u8 algo; /* crypto algorithm */
|
||||
+ u8 pad_2;
|
||||
+ __le32 tx_rspec; /* Rate of last successful tx frame */
|
||||
+ __le32 rx_rspec; /* Rate of last successful rx frame */
|
||||
+ __le32 wnm_cap; /* wnm capabilities */
|
||||
+ } v7;
|
||||
+ };
|
||||
};
|
||||
|
||||
struct brcmf_chanspec_list {
|
||||
@@ -0,0 +1,68 @@
|
||||
From 8c892df41500469729e0d662816300196e4f463d Mon Sep 17 00:00:00 2001
|
||||
From: Stijn Tintel <stijn@linux-ipv6.be>
|
||||
Date: Tue, 4 Dec 2018 20:29:05 +0200
|
||||
Subject: [PATCH] brcmfmac: fix roamoff=1 modparam
|
||||
|
||||
When the update_connect_param callback is set, nl80211 expects the flag
|
||||
WIPHY_FLAG_SUPPORTS_FW_ROAM to be set as well. However, this flag is
|
||||
only set when modparam roamoff=0, while the callback is set
|
||||
unconditionally. Since commit 7f9a3e150ec7 this causes a warning in
|
||||
wiphy_register, which breaks brcmfmac.
|
||||
|
||||
Disable the update_connect_param callback when roamoff=0 to fix this.
|
||||
|
||||
Fixes: 7f9a3e150ec7 ("nl80211: Update ERP info using NL80211_CMD_UPDATE_CONNECT_PARAMS")
|
||||
Cc: Stable <stable@vger.kernel.org> # 4.19+
|
||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 11 +++++++++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +-
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +-
|
||||
3 files changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -5190,10 +5190,17 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.update_connect_params = brcmf_cfg80211_update_conn_params,
|
||||
};
|
||||
|
||||
-struct cfg80211_ops *brcmf_cfg80211_get_ops(void)
|
||||
+struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings)
|
||||
{
|
||||
- return kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
|
||||
+ struct cfg80211_ops *ops;
|
||||
+
|
||||
+ ops = kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
|
||||
GFP_KERNEL);
|
||||
+
|
||||
+ if (ops && settings->roamoff)
|
||||
+ ops->update_connect_params = NULL;
|
||||
+
|
||||
+ return ops;
|
||||
}
|
||||
|
||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
|
||||
@@ -391,7 +391,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
|
||||
s32 brcmf_cfg80211_up(struct net_device *ndev);
|
||||
s32 brcmf_cfg80211_down(struct net_device *ndev);
|
||||
-struct cfg80211_ops *brcmf_cfg80211_get_ops(void);
|
||||
+struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings);
|
||||
enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);
|
||||
|
||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1132,7 +1132,7 @@ int brcmf_attach(struct device *dev, str
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
- ops = brcmf_cfg80211_get_ops();
|
||||
+ ops = brcmf_cfg80211_get_ops(settings);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From 861cb5eb467f5e38dce1aabe4e8db379255bd89b Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Wed, 12 Dec 2018 20:20:06 +0100
|
||||
Subject: [PATCH] brcmfmac: Fix access point mode
|
||||
|
||||
Since commit 1204aa17f3b4 ("brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag")
|
||||
the Raspberry Pi 3 A+ (BCM43455) isn't able to operate in AP mode with
|
||||
hostapd (device_ap_sme=1 use_monitor=0):
|
||||
|
||||
brcmfmac: brcmf_cfg80211_stop_ap: setting AP mode failed -52
|
||||
|
||||
So add the missing mgmt_stypes for AP mode to fix this.
|
||||
|
||||
Fixes: 1204aa17f3b4 ("brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag")
|
||||
Suggested-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6271,6 +6271,16 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] =
|
||||
.tx = 0xffff,
|
||||
.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
|
||||
BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
|
||||
+ },
|
||||
+ [NL80211_IFTYPE_AP] = {
|
||||
+ .tx = 0xffff,
|
||||
+ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_DISASSOC >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_AUTH >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_DEAUTH >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_ACTION >> 4)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
From 5cc898fbcb352b764f8d51c16e10e2eb0056173d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 6 Feb 2019 12:28:15 +0100
|
||||
Subject: [PATCH] brcmfmac: modify __brcmf_err() to take bus as a parameter
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far __brcmf_err() was using pr_err() which didn't allow identifying
|
||||
device that was affected by an error. It's crucial for systems with more
|
||||
than 1 device supported by brcmfmac (a common case for home routers).
|
||||
|
||||
This change allows passing struct brcmf_bus to the __brcmf_err(). That
|
||||
struct has been agreed to be the most common one. It allows accessing
|
||||
struct device easily & using dev_err() printing helper.
|
||||
|
||||
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>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/common.c | 7 +++++--
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 8 +++++---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/tracepoint.c | 9 +++++++--
|
||||
3 files changed, 17 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -221,7 +221,7 @@ done:
|
||||
}
|
||||
|
||||
#ifndef CPTCFG_BRCM_TRACING
|
||||
-void __brcmf_err(const char *func, const char *fmt, ...)
|
||||
+void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
@@ -230,7 +230,10 @@ void __brcmf_err(const char *func, const
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
- pr_err("%s: %pV", func, &vaf);
|
||||
+ if (bus)
|
||||
+ dev_err(bus->dev, "%s: %pV", func, &vaf);
|
||||
+ else
|
||||
+ pr_err("%s: %pV", func, &vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -45,8 +45,10 @@
|
||||
#undef pr_fmt
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
-__printf(2, 3)
|
||||
-void __brcmf_err(const char *func, const char *fmt, ...);
|
||||
+struct brcmf_bus;
|
||||
+
|
||||
+__printf(3, 4)
|
||||
+void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...);
|
||||
/* Macro for error messages. When debugging / tracing the driver all error
|
||||
* messages are important to us.
|
||||
*/
|
||||
@@ -55,7 +57,7 @@ void __brcmf_err(const char *func, const
|
||||
if (IS_ENABLED(CPTCFG_BRCMDBG) || \
|
||||
IS_ENABLED(CPTCFG_BRCM_TRACING) || \
|
||||
net_ratelimit()) \
|
||||
- __brcmf_err(__func__, fmt, ##__VA_ARGS__); \
|
||||
+ __brcmf_err(NULL, __func__, fmt, ##__VA_ARGS__);\
|
||||
} while (0)
|
||||
|
||||
#if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c
|
||||
@@ -14,14 +14,16 @@
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
+#include <linux/device.h>
|
||||
#include <linux/module.h> /* bug in tracepoint.h, it should include this */
|
||||
|
||||
#ifndef __CHECKER__
|
||||
#define CREATE_TRACE_POINTS
|
||||
+#include "bus.h"
|
||||
#include "tracepoint.h"
|
||||
#include "debug.h"
|
||||
|
||||
-void __brcmf_err(const char *func, const char *fmt, ...)
|
||||
+void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf = {
|
||||
.fmt = fmt,
|
||||
@@ -30,7 +32,10 @@ void __brcmf_err(const char *func, const
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.va = &args;
|
||||
- pr_err("%s: %pV", func, &vaf);
|
||||
+ if (bus)
|
||||
+ dev_err(bus->dev, "%s: %pV", func, &vaf);
|
||||
+ else
|
||||
+ pr_err("%s: %pV", func, &vaf);
|
||||
trace_brcmf_err(func, &vaf);
|
||||
va_end(args);
|
||||
}
|
||||
@@ -0,0 +1,286 @@
|
||||
From 8602e62441aba276cafd68034b72162fbc5ca0a6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 6 Feb 2019 12:28:16 +0100
|
||||
Subject: [PATCH] brcmfmac: pass bus to the __brcmf_err() in pcie.c
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This enables dev_err() usage (instead of pr_err()) in the __brcmf_err().
|
||||
It makes error messages more meaningful and is important for debugging
|
||||
errors/bugs on systems with multiple brcmfmac supported devices.
|
||||
|
||||
All bus files should follow & get updated similarly (soon).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/debug.h | 2 +
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 59 +++++++++++--------
|
||||
2 files changed, 38 insertions(+), 23 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -52,6 +52,7 @@ void __brcmf_err(struct brcmf_bus *bus,
|
||||
/* Macro for error messages. When debugging / tracing the driver all error
|
||||
* messages are important to us.
|
||||
*/
|
||||
+#ifndef brcmf_err
|
||||
#define brcmf_err(fmt, ...) \
|
||||
do { \
|
||||
if (IS_ENABLED(CPTCFG_BRCMDBG) || \
|
||||
@@ -59,6 +60,7 @@ void __brcmf_err(struct brcmf_bus *bus,
|
||||
net_ratelimit()) \
|
||||
__brcmf_err(NULL, __func__, fmt, ##__VA_ARGS__);\
|
||||
} while (0)
|
||||
+#endif
|
||||
|
||||
#if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -30,6 +30,15 @@
|
||||
#include <brcmu_wifi.h>
|
||||
#include <brcm_hw_ids.h>
|
||||
|
||||
+/* Custom brcmf_err() that takes bus arg and passes it further */
|
||||
+#define brcmf_err(bus, fmt, ...) \
|
||||
+ do { \
|
||||
+ if (IS_ENABLED(CPTCFG_BRCMDBG) || \
|
||||
+ IS_ENABLED(CPTCFG_BRCM_TRACING) || \
|
||||
+ net_ratelimit()) \
|
||||
+ __brcmf_err(bus, __func__, fmt, ##__VA_ARGS__); \
|
||||
+ } while (0)
|
||||
+
|
||||
#include "debug.h"
|
||||
#include "bus.h"
|
||||
#include "commonring.h"
|
||||
@@ -529,6 +538,7 @@ static void
|
||||
brcmf_pcie_select_core(struct brcmf_pciedev_info *devinfo, u16 coreid)
|
||||
{
|
||||
const struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
struct brcmf_core *core;
|
||||
u32 bar0_win;
|
||||
|
||||
@@ -546,7 +556,7 @@ brcmf_pcie_select_core(struct brcmf_pcie
|
||||
}
|
||||
}
|
||||
} else {
|
||||
- brcmf_err("Unsupported core selected %x\n", coreid);
|
||||
+ brcmf_err(bus, "Unsupported core selected %x\n", coreid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -840,9 +850,8 @@ static irqreturn_t brcmf_pcie_isr_thread
|
||||
|
||||
static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
- struct pci_dev *pdev;
|
||||
-
|
||||
- pdev = devinfo->pdev;
|
||||
+ struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
brcmf_pcie_intr_disable(devinfo);
|
||||
|
||||
@@ -853,7 +862,7 @@ static int brcmf_pcie_request_irq(struct
|
||||
brcmf_pcie_isr_thread, IRQF_SHARED,
|
||||
"brcmf_pcie_intr", devinfo)) {
|
||||
pci_disable_msi(pdev);
|
||||
- brcmf_err("Failed to request IRQ %d\n", pdev->irq);
|
||||
+ brcmf_err(bus, "Failed to request IRQ %d\n", pdev->irq);
|
||||
return -EIO;
|
||||
}
|
||||
devinfo->irq_allocated = true;
|
||||
@@ -863,15 +872,14 @@ static int brcmf_pcie_request_irq(struct
|
||||
|
||||
static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
- struct pci_dev *pdev;
|
||||
+ struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
u32 status;
|
||||
u32 count;
|
||||
|
||||
if (!devinfo->irq_allocated)
|
||||
return;
|
||||
|
||||
- pdev = devinfo->pdev;
|
||||
-
|
||||
brcmf_pcie_intr_disable(devinfo);
|
||||
free_irq(pdev->irq, devinfo);
|
||||
pci_disable_msi(pdev);
|
||||
@@ -883,7 +891,7 @@ static void brcmf_pcie_release_irq(struc
|
||||
count++;
|
||||
}
|
||||
if (devinfo->in_irq)
|
||||
- brcmf_err("Still in IRQ (processing) !!!\n");
|
||||
+ brcmf_err(bus, "Still in IRQ (processing) !!!\n");
|
||||
|
||||
status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT);
|
||||
brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, status);
|
||||
@@ -1094,6 +1102,7 @@ static void brcmf_pcie_release_ringbuffe
|
||||
|
||||
static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
struct brcmf_pcie_ringbuf *ring;
|
||||
struct brcmf_pcie_ringbuf *rings;
|
||||
u32 d2h_w_idx_ptr;
|
||||
@@ -1246,7 +1255,7 @@ static int brcmf_pcie_init_ringbuffers(s
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
- brcmf_err("Allocating ring buffers failed\n");
|
||||
+ brcmf_err(bus, "Allocating ring buffers failed\n");
|
||||
brcmf_pcie_release_ringbuffers(devinfo);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -1269,6 +1278,7 @@ brcmf_pcie_release_scratchbuffers(struct
|
||||
|
||||
static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
u64 address;
|
||||
u32 addr;
|
||||
|
||||
@@ -1308,7 +1318,7 @@ static int brcmf_pcie_init_scratchbuffer
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
- brcmf_err("Allocating scratch buffers failed\n");
|
||||
+ brcmf_err(bus, "Allocating scratch buffers failed\n");
|
||||
brcmf_pcie_release_scratchbuffers(devinfo);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -1409,6 +1419,7 @@ static int
|
||||
brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
|
||||
u32 sharedram_addr)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
struct brcmf_pcie_shared_info *shared;
|
||||
u32 addr;
|
||||
|
||||
@@ -1420,7 +1431,8 @@ brcmf_pcie_init_share_ram_info(struct br
|
||||
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);
|
||||
+ brcmf_err(bus, "Unsupported PCIE version %d\n",
|
||||
+ shared->version);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1462,6 +1474,7 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
const struct firmware *fw, void *nvram,
|
||||
u32 nvram_len)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
u32 sharedram_addr;
|
||||
u32 sharedram_addr_written;
|
||||
u32 loop_counter;
|
||||
@@ -1516,7 +1529,7 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
loop_counter--;
|
||||
}
|
||||
if (sharedram_addr == sharedram_addr_written) {
|
||||
- brcmf_err("FW failed to initialize\n");
|
||||
+ brcmf_err(bus, "FW failed to initialize\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
|
||||
@@ -1527,16 +1540,15 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
|
||||
static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
- struct pci_dev *pdev;
|
||||
+ struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
int err;
|
||||
phys_addr_t bar0_addr, bar1_addr;
|
||||
ulong bar1_size;
|
||||
|
||||
- pdev = devinfo->pdev;
|
||||
-
|
||||
err = pci_enable_device(pdev);
|
||||
if (err) {
|
||||
- brcmf_err("pci_enable_device failed err=%d\n", err);
|
||||
+ brcmf_err(bus, "pci_enable_device failed err=%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1549,7 +1561,7 @@ static int brcmf_pcie_get_resource(struc
|
||||
/* read Bar-1 mapped memory range */
|
||||
bar1_size = pci_resource_len(pdev, 2);
|
||||
if ((bar1_size == 0) || (bar1_addr == 0)) {
|
||||
- brcmf_err("BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
|
||||
+ brcmf_err(bus, "BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
|
||||
bar1_size, (unsigned long long)bar1_addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1558,7 +1570,7 @@ static int brcmf_pcie_get_resource(struc
|
||||
devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
|
||||
|
||||
if (!devinfo->regs || !devinfo->tcm) {
|
||||
- brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs,
|
||||
+ brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
|
||||
devinfo->tcm);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1585,16 +1597,17 @@ static void brcmf_pcie_release_resource(
|
||||
|
||||
static int brcmf_pcie_attach_bus(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
int ret;
|
||||
|
||||
/* Attach to the common driver interface */
|
||||
ret = brcmf_attach(&devinfo->pdev->dev, devinfo->settings);
|
||||
if (ret) {
|
||||
- brcmf_err("brcmf_attach failed\n");
|
||||
+ brcmf_err(bus, "brcmf_attach failed\n");
|
||||
} else {
|
||||
ret = brcmf_bus_started(&devinfo->pdev->dev);
|
||||
if (ret)
|
||||
- brcmf_err("dongle is not responding\n");
|
||||
+ brcmf_err(bus, "dongle is not responding\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -1823,7 +1836,7 @@ fail_bus:
|
||||
kfree(bus->msgbuf);
|
||||
kfree(bus);
|
||||
fail:
|
||||
- brcmf_err("failed %x:%x\n", pdev->vendor, pdev->device);
|
||||
+ brcmf_err(NULL, "failed %x:%x\n", pdev->vendor, pdev->device);
|
||||
brcmf_pcie_release_resource(devinfo);
|
||||
if (devinfo->ci)
|
||||
brcmf_chip_detach(devinfo->ci);
|
||||
@@ -1897,7 +1910,7 @@ static int brcmf_pcie_pm_enter_D3(struct
|
||||
wait_event_timeout(devinfo->mbdata_resp_wait, devinfo->mbdata_completed,
|
||||
BRCMF_PCIE_MBDATA_TIMEOUT);
|
||||
if (!devinfo->mbdata_completed) {
|
||||
- brcmf_err("Timeout on response for entering D3 substate\n");
|
||||
+ brcmf_err(bus, "Timeout on response for entering D3 substate\n");
|
||||
brcmf_bus_change_state(bus, BRCMF_BUS_UP);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -1942,7 +1955,7 @@ cleanup:
|
||||
|
||||
err = brcmf_pcie_probe(pdev, NULL);
|
||||
if (err)
|
||||
- brcmf_err("probe after resume failed, err=%d\n", err);
|
||||
+ brcmf_err(bus, "probe after resume failed, err=%d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -2014,7 +2027,8 @@ void brcmf_pcie_register(void)
|
||||
brcmf_dbg(PCIE, "Enter\n");
|
||||
err = pci_register_driver(&brcmf_pciedrvr);
|
||||
if (err)
|
||||
- brcmf_err("PCIE driver registration failed, err=%d\n", err);
|
||||
+ brcmf_err(NULL, "PCIE driver registration failed, err=%d\n",
|
||||
+ err);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,147 @@
|
||||
From e665988be29ccea3584528967b432a5cfd801ca4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 8 Feb 2019 07:42:30 +0100
|
||||
Subject: [PATCH] brcmfmac: support monitor frames with the hardware/ucode
|
||||
header
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far there were two monitor frame formats:
|
||||
1) 802.11 frames (with frame (sub)type & all addresses)
|
||||
2) 802.11 frames with the radiotap header
|
||||
|
||||
Testing the latest FullMAC firmwares for 4366b1/4366c0 resulted in
|
||||
discovering a new format being used. It seems (almost?) identical to the
|
||||
one known from ucode used in SoftMAC devices which is most likely the
|
||||
same codebase anyway.
|
||||
|
||||
While new firmwares will /announce/ radiotap header support using the
|
||||
"rtap" fw capability string it seems no string was added for the new
|
||||
ucode header format.
|
||||
|
||||
All above means that:
|
||||
1) We need new format support when dealing with a received frame
|
||||
2) A new feature bit & mapping quirks have to be added manually
|
||||
|
||||
As for now only an empty radiotap is being created. Adding support for
|
||||
extracting some info (band, channel, signal, etc.) is planned for the
|
||||
future.
|
||||
|
||||
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>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/core.c | 55 +++++++++++++++++++
|
||||
.../broadcom/brcm80211/brcmfmac/feature.c | 4 ++
|
||||
.../broadcom/brcm80211/brcmfmac/feature.h | 4 +-
|
||||
3 files changed, 62 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -43,6 +43,36 @@
|
||||
|
||||
#define BRCMF_BSSIDX_INVALID -1
|
||||
|
||||
+#define RXS_PBPRES BIT(2)
|
||||
+
|
||||
+#define D11_PHY_HDR_LEN 6
|
||||
+
|
||||
+struct d11rxhdr_le {
|
||||
+ __le16 RxFrameSize;
|
||||
+ u16 PAD;
|
||||
+ __le16 PhyRxStatus_0;
|
||||
+ __le16 PhyRxStatus_1;
|
||||
+ __le16 PhyRxStatus_2;
|
||||
+ __le16 PhyRxStatus_3;
|
||||
+ __le16 PhyRxStatus_4;
|
||||
+ __le16 PhyRxStatus_5;
|
||||
+ __le16 RxStatus1;
|
||||
+ __le16 RxStatus2;
|
||||
+ __le16 RxTSFTime;
|
||||
+ __le16 RxChan;
|
||||
+ u8 unknown[12];
|
||||
+} __packed;
|
||||
+
|
||||
+struct wlc_d11rxhdr {
|
||||
+ struct d11rxhdr_le rxhdr;
|
||||
+ __le32 tsf_l;
|
||||
+ s8 rssi;
|
||||
+ s8 rxpwr0;
|
||||
+ s8 rxpwr1;
|
||||
+ s8 do_rssi_ma;
|
||||
+ s8 rxpwr[4];
|
||||
+} __packed;
|
||||
+
|
||||
char *brcmf_ifname(struct brcmf_if *ifp)
|
||||
{
|
||||
if (!ifp)
|
||||
@@ -372,6 +402,35 @@ void brcmf_netif_mon_rx(struct brcmf_if
|
||||
{
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_RADIOTAP)) {
|
||||
/* Do nothing */
|
||||
+ } else if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR)) {
|
||||
+ struct wlc_d11rxhdr *wlc_rxhdr = (struct wlc_d11rxhdr *)skb->data;
|
||||
+ struct ieee80211_radiotap_header *radiotap;
|
||||
+ unsigned int offset;
|
||||
+ u16 RxStatus1;
|
||||
+
|
||||
+ RxStatus1 = le16_to_cpu(wlc_rxhdr->rxhdr.RxStatus1);
|
||||
+
|
||||
+ offset = sizeof(struct wlc_d11rxhdr);
|
||||
+ /* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU
|
||||
+ * subframes
|
||||
+ */
|
||||
+ if (RxStatus1 & RXS_PBPRES)
|
||||
+ offset += 2;
|
||||
+ offset += D11_PHY_HDR_LEN;
|
||||
+
|
||||
+ skb_pull(skb, offset);
|
||||
+
|
||||
+ /* TODO: use RX header to fill some radiotap data */
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0)
|
||||
+ radiotap = skb_push(skb, sizeof(*radiotap));
|
||||
+#else
|
||||
+ radiotap = (struct ieee80211_radiotap_header *)skb_push(skb, sizeof(*radiotap));
|
||||
+#endif
|
||||
+ memset(radiotap, 0, sizeof(*radiotap));
|
||||
+ radiotap->it_len = cpu_to_le16(sizeof(*radiotap));
|
||||
+
|
||||
+ /* TODO: 4 bytes with receive status? */
|
||||
+ skb->len -= 4;
|
||||
} else {
|
||||
struct ieee80211_radiotap_header *radiotap;
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -102,6 +102,10 @@ static const struct brcmf_feat_fwfeat br
|
||||
{ "01-6cb8e269", BIT(BRCMF_FEAT_MONITOR) },
|
||||
/* brcmfmac4366b-pcie.bin from linux-firmware.git commit 52442afee990 */
|
||||
{ "01-c47a91a4", BIT(BRCMF_FEAT_MONITOR) },
|
||||
+ /* brcmfmac4366b-pcie.bin from linux-firmware.git commit 211de1679a68 */
|
||||
+ { "01-801fb449", BIT(BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR) },
|
||||
+ /* brcmfmac4366c-pcie.bin from linux-firmware.git commit 211de1679a68 */
|
||||
+ { "01-d2cbb8fd", BIT(BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR) },
|
||||
};
|
||||
|
||||
static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -33,6 +33,7 @@
|
||||
* MFP: 802.11w Management Frame Protection.
|
||||
* MONITOR: firmware can pass monitor packets to host.
|
||||
* MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
|
||||
+ * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -48,7 +49,8 @@
|
||||
BRCMF_FEAT_DEF(WOWL_ARP_ND) \
|
||||
BRCMF_FEAT_DEF(MFP) \
|
||||
BRCMF_FEAT_DEF(MONITOR) \
|
||||
- BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP)
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR)
|
||||
|
||||
/*
|
||||
* Quirks:
|
||||
@@ -0,0 +1,67 @@
|
||||
From c988b78244df8216902e20de536434e2f474a37e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 8 Feb 2019 15:24:39 +0100
|
||||
Subject: [PATCH] brcmfmac: print firmware reported ring status errors
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Firmware is capable of reporting ring status. It's used e.g. to signal
|
||||
some problem with a specific ring setup. This patch adds support for
|
||||
printing ring & error number which may be useful for debugging setup
|
||||
issues.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/msgbuf.c | 25 +++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -134,6 +134,14 @@ struct msgbuf_completion_hdr {
|
||||
__le16 flow_ring_id;
|
||||
};
|
||||
|
||||
+/* Data struct for the MSGBUF_TYPE_RING_STATUS */
|
||||
+struct msgbuf_ring_status {
|
||||
+ struct msgbuf_common_hdr msg;
|
||||
+ struct msgbuf_completion_hdr compl_hdr;
|
||||
+ __le16 write_idx;
|
||||
+ __le32 rsvd0[5];
|
||||
+};
|
||||
+
|
||||
struct msgbuf_rx_event {
|
||||
struct msgbuf_common_hdr msg;
|
||||
struct msgbuf_completion_hdr compl_hdr;
|
||||
@@ -1178,6 +1186,19 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
brcmf_netif_rx(ifp, skb);
|
||||
}
|
||||
|
||||
+static void brcmf_msgbuf_process_ring_status(struct brcmf_msgbuf *msgbuf,
|
||||
+ void *buf)
|
||||
+{
|
||||
+ struct msgbuf_ring_status *ring_status = buf;
|
||||
+ int err;
|
||||
+
|
||||
+ err = le16_to_cpu(ring_status->compl_hdr.status);
|
||||
+ if (err) {
|
||||
+ int ring = le16_to_cpu(ring_status->compl_hdr.flow_ring_id);
|
||||
+
|
||||
+ brcmf_err("Firmware reported ring %d error: %d\n", ring, err);
|
||||
+ }
|
||||
+}
|
||||
|
||||
static void
|
||||
brcmf_msgbuf_process_flow_ring_create_response(struct brcmf_msgbuf *msgbuf,
|
||||
@@ -1239,6 +1260,10 @@ static void brcmf_msgbuf_process_msgtype
|
||||
|
||||
msg = (struct msgbuf_common_hdr *)buf;
|
||||
switch (msg->msgtype) {
|
||||
+ case MSGBUF_TYPE_RING_STATUS:
|
||||
+ brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RING_STATUS\n");
|
||||
+ brcmf_msgbuf_process_ring_status(msgbuf, buf);
|
||||
+ break;
|
||||
case MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT:
|
||||
brcmf_dbg(MSGBUF, "MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT\n");
|
||||
brcmf_msgbuf_process_flow_ring_create_response(msgbuf, buf);
|
||||
@@ -0,0 +1,42 @@
|
||||
From f4e183293b871c96c0220dcc549d5ca4c72628ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 11 Feb 2019 23:04:53 +0100
|
||||
Subject: [PATCH] brcmfmac: improve code handling bandwidth of firmware
|
||||
reported channels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1) Use switch to simplify/improve the code & avoid some duplication
|
||||
2) Add warning for unsupported values
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6003,11 +6003,18 @@ static int brcmf_construct_chaninfo(stru
|
||||
/* assuming the chanspecs order is HT20,
|
||||
* HT40 upper, HT40 lower, and VHT80.
|
||||
*/
|
||||
- if (ch.bw == BRCMU_CHAN_BW_80) {
|
||||
+ switch (ch.bw) {
|
||||
+ case BRCMU_CHAN_BW_80:
|
||||
channel->flags &= ~IEEE80211_CHAN_NO_80MHZ;
|
||||
- } else if (ch.bw == BRCMU_CHAN_BW_40) {
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_BW_40:
|
||||
brcmf_update_bw40_channel_flag(channel, &ch);
|
||||
- } else {
|
||||
+ break;
|
||||
+ default:
|
||||
+ wiphy_warn(wiphy, "Firmware reported unsupported bandwidth %d\n",
|
||||
+ ch.bw);
|
||||
+ /* fall through */
|
||||
+ case BRCMU_CHAN_BW_20:
|
||||
/* enable the channel and disable other bandwidths
|
||||
* for now as mentioned order assure they are enabled
|
||||
* for subsequent chanspecs.
|
||||
@@ -0,0 +1,30 @@
|
||||
From 30519cbe339a45bd11a57ca8ece07f4f6a1cda2e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 11 Feb 2019 23:04:54 +0100
|
||||
Subject: [PATCH] brcmfmac: support firmware reporting 160 MHz channels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far 160 MHz channels were treated as 20 MHz ones which was breaking
|
||||
support for 40/80 MHz due to the brcmf_construct_chaninfo() logic and
|
||||
its assumptions.
|
||||
|
||||
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 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6004,6 +6004,9 @@ static int brcmf_construct_chaninfo(stru
|
||||
* HT40 upper, HT40 lower, and VHT80.
|
||||
*/
|
||||
switch (ch.bw) {
|
||||
+ case BRCMU_CHAN_BW_160:
|
||||
+ channel->flags &= ~IEEE80211_CHAN_NO_160MHZ;
|
||||
+ break;
|
||||
case BRCMU_CHAN_BW_80:
|
||||
channel->flags &= ~IEEE80211_CHAN_NO_80MHZ;
|
||||
break;
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,38 @@
|
||||
From e0a8ef4d7b4315bc4c1641fb3f3a7dfdfa6627b8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 20 Feb 2019 11:30:47 +0100
|
||||
Subject: [PATCH] brcmfmac: add basic validation of shared RAM address
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
While experimenting with firmware loading I ended up in a state of
|
||||
firmware reporting shared RAM address 0x04000001. It was causing:
|
||||
[ 94.448015] Unable to handle kernel paging request at virtual address cd680001
|
||||
due to reading out of the mapped memory.
|
||||
|
||||
This patch adds some basic validation to avoid kernel crashes due to the
|
||||
unexpected firmware behavior.
|
||||
|
||||
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 | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1532,6 +1532,12 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
brcmf_err(bus, "FW failed to initialize\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
+ if (sharedram_addr < devinfo->ci->rambase ||
|
||||
+ sharedram_addr >= devinfo->ci->rambase + devinfo->ci->ramsize) {
|
||||
+ brcmf_err(bus, "Invalid shared RAM address 0x%08x\n",
|
||||
+ sharedram_addr);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
|
||||
|
||||
return (brcmf_pcie_init_share_ram_info(devinfo, sharedram_addr));
|
||||
@@ -0,0 +1,29 @@
|
||||
From 0c7051610c577b60b01b3b5aec14d6765e177b0d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 21 Feb 2019 11:33:24 +0100
|
||||
Subject: [PATCH] brcmfmac: fix size of the struct msgbuf_ring_status
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This updates host struct to match the in-firmawre definition. It's a
|
||||
cosmetic change as it only applies to the reserved struct space.
|
||||
|
||||
Fixes: c988b78244df ("brcmfmac: print firmware reported ring status errors")
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -139,7 +139,7 @@ struct msgbuf_ring_status {
|
||||
struct msgbuf_common_hdr msg;
|
||||
struct msgbuf_completion_hdr compl_hdr;
|
||||
__le16 write_idx;
|
||||
- __le32 rsvd0[5];
|
||||
+ __le16 rsvd0[5];
|
||||
};
|
||||
|
||||
struct msgbuf_rx_event {
|
||||
@@ -0,0 +1,69 @@
|
||||
From c91377495192cda096e52dc09c266b0d05f16d86 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 21 Feb 2019 11:33:25 +0100
|
||||
Subject: [PATCH] brcmfmac: print firmware reported general status errors
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Firmware may report general errors using a special message type. Add
|
||||
basic support for it by simply decoding & printing an error number.
|
||||
|
||||
A sample situation in which firmware reports a buf error:
|
||||
CONSOLE: 027084.733 no host response IOCTL buffer available..so fail the request
|
||||
will now produce a "Firmware reported general error: 9" on the host.
|
||||
|
||||
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>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/msgbuf.c | 24 +++++++++++++++++++
|
||||
1 file changed, 24 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -134,6 +134,14 @@ struct msgbuf_completion_hdr {
|
||||
__le16 flow_ring_id;
|
||||
};
|
||||
|
||||
+/* Data struct for the MSGBUF_TYPE_GEN_STATUS */
|
||||
+struct msgbuf_gen_status {
|
||||
+ struct msgbuf_common_hdr msg;
|
||||
+ struct msgbuf_completion_hdr compl_hdr;
|
||||
+ __le16 write_idx;
|
||||
+ __le32 rsvd0[3];
|
||||
+};
|
||||
+
|
||||
/* Data struct for the MSGBUF_TYPE_RING_STATUS */
|
||||
struct msgbuf_ring_status {
|
||||
struct msgbuf_common_hdr msg;
|
||||
@@ -1194,6 +1202,18 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
brcmf_netif_rx(ifp, skb);
|
||||
}
|
||||
|
||||
+static void brcmf_msgbuf_process_gen_status(struct brcmf_msgbuf *msgbuf,
|
||||
+ void *buf)
|
||||
+{
|
||||
+ struct msgbuf_gen_status *gen_status = buf;
|
||||
+ struct brcmf_pub *drvr = msgbuf->drvr;
|
||||
+ int err;
|
||||
+
|
||||
+ err = le16_to_cpu(gen_status->compl_hdr.status);
|
||||
+ if (err)
|
||||
+ bphy_err(drvr, "Firmware reported general error: %d\n", err);
|
||||
+}
|
||||
+
|
||||
static void brcmf_msgbuf_process_ring_status(struct brcmf_msgbuf *msgbuf,
|
||||
void *buf)
|
||||
{
|
||||
@@ -1273,6 +1293,10 @@ static void brcmf_msgbuf_process_msgtype
|
||||
|
||||
msg = (struct msgbuf_common_hdr *)buf;
|
||||
switch (msg->msgtype) {
|
||||
+ case MSGBUF_TYPE_GEN_STATUS:
|
||||
+ brcmf_dbg(MSGBUF, "MSGBUF_TYPE_GEN_STATUS\n");
|
||||
+ brcmf_msgbuf_process_gen_status(msgbuf, buf);
|
||||
+ break;
|
||||
case MSGBUF_TYPE_RING_STATUS:
|
||||
brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RING_STATUS\n");
|
||||
brcmf_msgbuf_process_ring_status(msgbuf, buf);
|
||||
@@ -0,0 +1,32 @@
|
||||
From c9692820710f57c826b2e43a6fb1e4cd307508b0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 26 Feb 2019 14:11:16 +0100
|
||||
Subject: [PATCH] brcmfmac: support repeated brcmf_fw_alloc_request() calls
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
During a normal brcmfmac lifetime brcmf_fw_alloc_request() is called
|
||||
once only during the probe. It's safe to assume provided array is clear.
|
||||
|
||||
Further brcmfmac improvements may require calling it multiple times
|
||||
though. This patch allows it by fixing invalid firmware paths like:
|
||||
brcm/brcmfmac4366c-pcie.binbrcm/brcmfmac4366c-pcie.bin
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -582,6 +582,7 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
+ fw_name[0] = '\0';
|
||||
/* check if firmware path is provided by module parameter */
|
||||
if (brcmf_mp_global.firmware_path[0] != '\0') {
|
||||
strlcpy(fw_name, brcmf_mp_global.firmware_path,
|
||||
@@ -0,0 +1,79 @@
|
||||
From a2ec87ddbf1637f854ffcfff9d12d392fa30758b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 26 Feb 2019 14:11:18 +0100
|
||||
Subject: [PATCH] brcmfmac: add a function designated for handling firmware
|
||||
fails
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This improves handling PCIe firmware halts by printing a clear error
|
||||
message and replaces a similar code in the SDIO bus support.
|
||||
|
||||
It will also allow further improvements like trying to recover from a
|
||||
firmware crash.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-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 ++
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 10 ++++++++++
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 2 +-
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 ++--
|
||||
4 files changed, 15 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -233,6 +233,8 @@ void brcmf_dev_reset(struct device *dev)
|
||||
void brcmf_txflowblock(struct device *dev, bool state);
|
||||
/* Request from bus module to initiate a coredump */
|
||||
void brcmf_dev_coredump(struct device *dev);
|
||||
+/* Indication that firmware has halted or crashed */
|
||||
+void brcmf_fw_crashed(struct device *dev);
|
||||
|
||||
/* Notify the bus has transferred the tx packet to firmware */
|
||||
void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1274,6 +1274,16 @@ void brcmf_dev_coredump(struct device *d
|
||||
brcmf_dbg(TRACE, "failed to create coredump\n");
|
||||
}
|
||||
|
||||
+void brcmf_fw_crashed(struct device *dev)
|
||||
+{
|
||||
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
+ struct brcmf_pub *drvr = bus_if->drvr;
|
||||
+
|
||||
+ bphy_err(drvr, "Firmware has halted or crashed\n");
|
||||
+
|
||||
+ brcmf_dev_coredump(dev);
|
||||
+}
|
||||
+
|
||||
void brcmf_detach(struct device *dev)
|
||||
{
|
||||
s32 i;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -728,7 +728,7 @@ static void brcmf_pcie_handle_mb_data(st
|
||||
}
|
||||
if (dtoh_mb_data & BRCMF_D2H_DEV_FWHALT) {
|
||||
brcmf_dbg(PCIE, "D2H_MB_DATA: FW HALT\n");
|
||||
- brcmf_dev_coredump(&devinfo->pdev->dev);
|
||||
+ brcmf_fw_crashed(&devinfo->pdev->dev);
|
||||
}
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -1097,8 +1097,8 @@ static u32 brcmf_sdio_hostmail(struct br
|
||||
|
||||
/* dongle indicates the firmware has halted/crashed */
|
||||
if (hmb_data & HMB_DATA_FWHALT) {
|
||||
- brcmf_err("mailbox indicates firmware halted\n");
|
||||
- brcmf_dev_coredump(&sdiod->func[1]->dev);
|
||||
+ brcmf_dbg(SDIO, "mailbox indicates firmware halted\n");
|
||||
+ brcmf_fw_crashed(&sdiod->func[1]->dev);
|
||||
}
|
||||
|
||||
/* Dongle recomposed rx frames, accept them again */
|
||||
@@ -0,0 +1,160 @@
|
||||
From 4684997d9eea29380000e062755aa6d368d789a3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 26 Feb 2019 14:11:19 +0100
|
||||
Subject: [PATCH] brcmfmac: reset PCIe bus on a firmware crash
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This includes bus reset & reloading a firmware. It should be sufficient
|
||||
for a user space to (setup and) use a wireless device again.
|
||||
|
||||
Support for reset on USB & SDIO can be added later.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/bus.h | 10 ++++++
|
||||
.../broadcom/brcm80211/brcmfmac/core.c | 12 +++++++
|
||||
.../broadcom/brcm80211/brcmfmac/core.h | 2 ++
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 35 +++++++++++++++++++
|
||||
4 files changed, 59 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -87,6 +87,7 @@ struct brcmf_bus_ops {
|
||||
void (*wowl_config)(struct device *dev, bool enabled);
|
||||
size_t (*get_ramsize)(struct device *dev);
|
||||
int (*get_memdump)(struct device *dev, void *data, size_t len);
|
||||
+ int (*reset)(struct device *dev);
|
||||
};
|
||||
|
||||
|
||||
@@ -214,6 +215,15 @@ int brcmf_bus_get_memdump(struct brcmf_b
|
||||
return bus->ops->get_memdump(bus->dev, data, len);
|
||||
}
|
||||
|
||||
+static inline
|
||||
+int brcmf_bus_reset(struct brcmf_bus *bus)
|
||||
+{
|
||||
+ if (!bus->ops->reset)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ return bus->ops->reset(bus->dev);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* interface functions from common layer
|
||||
*/
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1080,6 +1080,14 @@ static int brcmf_revinfo_read(struct seq
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void brcmf_core_bus_reset(struct work_struct *work)
|
||||
+{
|
||||
+ struct brcmf_pub *drvr = container_of(work, struct brcmf_pub,
|
||||
+ bus_reset);
|
||||
+
|
||||
+ brcmf_bus_reset(drvr->bus_if);
|
||||
+}
|
||||
+
|
||||
int brcmf_bus_started(struct device *dev)
|
||||
{
|
||||
int ret = -1;
|
||||
@@ -1161,6 +1169,8 @@ int brcmf_bus_started(struct device *dev
|
||||
#endif
|
||||
#endif /* CONFIG_INET */
|
||||
|
||||
+ INIT_WORK(&drvr->bus_reset, brcmf_core_bus_reset);
|
||||
+
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@@ -1282,6 +1292,8 @@ void brcmf_fw_crashed(struct device *dev
|
||||
bphy_err(drvr, "Firmware has halted or crashed\n");
|
||||
|
||||
brcmf_dev_coredump(dev);
|
||||
+
|
||||
+ schedule_work(&drvr->bus_reset);
|
||||
}
|
||||
|
||||
void brcmf_detach(struct device *dev)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -146,6 +146,8 @@ struct brcmf_pub {
|
||||
struct notifier_block inet6addr_notifier;
|
||||
struct brcmf_mp_device *settings;
|
||||
|
||||
+ struct work_struct bus_reset;
|
||||
+
|
||||
/* Pointer needed by OpenWrt due to backporting some fixes */
|
||||
void *cfg80211_ops;
|
||||
};
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -343,6 +343,8 @@ static const u32 brcmf_ring_itemsize[BRC
|
||||
BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE
|
||||
};
|
||||
|
||||
+static void brcmf_pcie_setup(struct device *dev, const struct firmware *fw,
|
||||
+ void *nvram, u32 nvram_len);
|
||||
|
||||
static u32
|
||||
brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
|
||||
@@ -1382,6 +1384,45 @@ static int brcmf_pcie_get_memdump(struct
|
||||
}
|
||||
|
||||
|
||||
+static int brcmf_pcie_reset(struct device *dev)
|
||||
+{
|
||||
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
|
||||
+ struct brcmf_pciedev_info *devinfo = buspub->devinfo;
|
||||
+ u16 domain_nr;
|
||||
+ u16 bus_nr;
|
||||
+ int err;
|
||||
+
|
||||
+ brcmf_detach(dev);
|
||||
+
|
||||
+ brcmf_pcie_release_irq(devinfo);
|
||||
+ brcmf_pcie_release_scratchbuffers(devinfo);
|
||||
+ brcmf_pcie_release_ringbuffers(devinfo);
|
||||
+ brcmf_pcie_reset_device(devinfo);
|
||||
+
|
||||
+ err = brcmf_fw_map_chip_to_name(devinfo->ci->chip, devinfo->ci->chiprev,
|
||||
+ brcmf_pcie_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_pcie_fwnames),
|
||||
+ devinfo->fw_name, devinfo->nvram_name);
|
||||
+ if (err) {
|
||||
+ dev_err(dev, "Failed to prepare FW request\n");
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||
+ bus_nr = devinfo->pdev->bus->number;
|
||||
+ err = brcmf_fw_get_firmwares_pcie(bus_if->dev, BRCMF_FW_REQUEST_NVRAM |
|
||||
+ BRCMF_FW_REQ_NV_OPTIONAL,
|
||||
+ devinfo->fw_name, devinfo->nvram_name,
|
||||
+ brcmf_pcie_setup, domain_nr, bus_nr);
|
||||
+ if (err) {
|
||||
+ dev_err(dev, "Failed to prepare FW request\n");
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
.txdata = brcmf_pcie_tx,
|
||||
.stop = brcmf_pcie_down,
|
||||
@@ -1390,6 +1431,7 @@ static const struct brcmf_bus_ops brcmf_
|
||||
.wowl_config = brcmf_pcie_wowl_config,
|
||||
.get_ramsize = brcmf_pcie_get_ramsize,
|
||||
.get_memdump = brcmf_pcie_get_memdump,
|
||||
+ .reset = brcmf_pcie_reset,
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
From db3b9e2e1d58080d0754bdf9293dabf8c6491b67 Mon Sep 17 00:00:00 2001
|
||||
From: Piotr Figiel <p.figiel@camlintechnologies.com>
|
||||
Date: Fri, 8 Mar 2019 15:25:04 +0000
|
||||
Subject: [PATCH] brcmfmac: fix race during disconnect when USB completion is
|
||||
in progress
|
||||
|
||||
It was observed that rarely during USB disconnect happening shortly after
|
||||
connect (before full initialization completes) usb_hub_wq would wait
|
||||
forever for the dev_init_lock to be unlocked. dev_init_lock would remain
|
||||
locked though because of infinite wait during usb_kill_urb:
|
||||
|
||||
[ 2730.656472] kworker/0:2 D 0 260 2 0x00000000
|
||||
[ 2730.660700] Workqueue: events request_firmware_work_func
|
||||
[ 2730.664807] [<809dca20>] (__schedule) from [<809dd164>] (schedule+0x4c/0xac)
|
||||
[ 2730.670587] [<809dd164>] (schedule) from [<8069af44>] (usb_kill_urb+0xdc/0x114)
|
||||
[ 2730.676815] [<8069af44>] (usb_kill_urb) from [<7f258b50>] (brcmf_usb_free_q+0x34/0xa8 [brcmfmac])
|
||||
[ 2730.684833] [<7f258b50>] (brcmf_usb_free_q [brcmfmac]) from [<7f2517d4>] (brcmf_detach+0xa0/0xb8 [brcmfmac])
|
||||
[ 2730.693557] [<7f2517d4>] (brcmf_detach [brcmfmac]) from [<7f251a34>] (brcmf_attach+0xac/0x3d8 [brcmfmac])
|
||||
[ 2730.702094] [<7f251a34>] (brcmf_attach [brcmfmac]) from [<7f2587ac>] (brcmf_usb_probe_phase2+0x468/0x4a0 [brcmfmac])
|
||||
[ 2730.711601] [<7f2587ac>] (brcmf_usb_probe_phase2 [brcmfmac]) from [<7f252888>] (brcmf_fw_request_done+0x194/0x220 [brcmfmac])
|
||||
[ 2730.721795] [<7f252888>] (brcmf_fw_request_done [brcmfmac]) from [<805748e4>] (request_firmware_work_func+0x4c/0x88)
|
||||
[ 2730.731125] [<805748e4>] (request_firmware_work_func) from [<80141474>] (process_one_work+0x228/0x808)
|
||||
[ 2730.739223] [<80141474>] (process_one_work) from [<80141a80>] (worker_thread+0x2c/0x564)
|
||||
[ 2730.746105] [<80141a80>] (worker_thread) from [<80147bcc>] (kthread+0x13c/0x16c)
|
||||
[ 2730.752227] [<80147bcc>] (kthread) from [<801010b4>] (ret_from_fork+0x14/0x20)
|
||||
|
||||
[ 2733.099695] kworker/0:3 D 0 1065 2 0x00000000
|
||||
[ 2733.103926] Workqueue: usb_hub_wq hub_event
|
||||
[ 2733.106914] [<809dca20>] (__schedule) from [<809dd164>] (schedule+0x4c/0xac)
|
||||
[ 2733.112693] [<809dd164>] (schedule) from [<809e2a8c>] (schedule_timeout+0x214/0x3e4)
|
||||
[ 2733.119621] [<809e2a8c>] (schedule_timeout) from [<809dde2c>] (wait_for_common+0xc4/0x1c0)
|
||||
[ 2733.126810] [<809dde2c>] (wait_for_common) from [<7f258d00>] (brcmf_usb_disconnect+0x1c/0x4c [brcmfmac])
|
||||
[ 2733.135206] [<7f258d00>] (brcmf_usb_disconnect [brcmfmac]) from [<8069e0c8>] (usb_unbind_interface+0x5c/0x1e4)
|
||||
[ 2733.143943] [<8069e0c8>] (usb_unbind_interface) from [<8056d3e8>] (device_release_driver_internal+0x164/0x1fc)
|
||||
[ 2733.152769] [<8056d3e8>] (device_release_driver_internal) from [<8056c078>] (bus_remove_device+0xd0/0xfc)
|
||||
[ 2733.161138] [<8056c078>] (bus_remove_device) from [<8056977c>] (device_del+0x11c/0x310)
|
||||
[ 2733.167939] [<8056977c>] (device_del) from [<8069cba8>] (usb_disable_device+0xa0/0x1cc)
|
||||
[ 2733.174743] [<8069cba8>] (usb_disable_device) from [<8069507c>] (usb_disconnect+0x74/0x1dc)
|
||||
[ 2733.181823] [<8069507c>] (usb_disconnect) from [<80695e88>] (hub_event+0x478/0xf88)
|
||||
[ 2733.188278] [<80695e88>] (hub_event) from [<80141474>] (process_one_work+0x228/0x808)
|
||||
[ 2733.194905] [<80141474>] (process_one_work) from [<80141a80>] (worker_thread+0x2c/0x564)
|
||||
[ 2733.201724] [<80141a80>] (worker_thread) from [<80147bcc>] (kthread+0x13c/0x16c)
|
||||
[ 2733.207913] [<80147bcc>] (kthread) from [<801010b4>] (ret_from_fork+0x14/0x20)
|
||||
|
||||
It was traced down to a case where usb_kill_urb would be called on an URB
|
||||
structure containing more or less random data, including large number in
|
||||
its use_count. During the debugging it appeared that in brcmf_usb_free_q()
|
||||
the traversal over URBs' lists is not synchronized with operations on those
|
||||
lists in brcmf_usb_rx_complete() leading to handling
|
||||
brcmf_usbdev_info structure (holding lists' head) as lists' element and in
|
||||
result causing above problem.
|
||||
|
||||
Fix it by walking through all URBs during brcmf_cancel_all_urbs using the
|
||||
arrays of requests instead of linked lists.
|
||||
|
||||
Signed-off-by: Piotr Figiel <p.figiel@camlintechnologies.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -684,12 +684,18 @@ static int brcmf_usb_up(struct device *d
|
||||
|
||||
static void brcmf_cancel_all_urbs(struct brcmf_usbdev_info *devinfo)
|
||||
{
|
||||
+ int i;
|
||||
+
|
||||
if (devinfo->ctl_urb)
|
||||
usb_kill_urb(devinfo->ctl_urb);
|
||||
if (devinfo->bulk_urb)
|
||||
usb_kill_urb(devinfo->bulk_urb);
|
||||
- brcmf_usb_free_q(&devinfo->tx_postq, true);
|
||||
- brcmf_usb_free_q(&devinfo->rx_postq, true);
|
||||
+ if (devinfo->tx_reqs)
|
||||
+ for (i = 0; i < devinfo->bus_pub.ntxq; i++)
|
||||
+ usb_kill_urb(devinfo->tx_reqs[i].urb);
|
||||
+ if (devinfo->rx_reqs)
|
||||
+ for (i = 0; i < devinfo->bus_pub.nrxq; i++)
|
||||
+ usb_kill_urb(devinfo->rx_reqs[i].urb);
|
||||
}
|
||||
|
||||
static void brcmf_usb_down(struct device *dev)
|
||||
@@ -0,0 +1,54 @@
|
||||
From 2b78e5f5223666d403d4fdb30af4ad65c8da3cdb Mon Sep 17 00:00:00 2001
|
||||
From: Piotr Figiel <p.figiel@camlintechnologies.com>
|
||||
Date: Fri, 8 Mar 2019 15:25:06 +0000
|
||||
Subject: [PATCH] brcmfmac: remove pending parameter from brcmf_usb_free_q
|
||||
|
||||
brcmf_usb_free_q is no longer called with pending=true thus this boolean
|
||||
parameter is no longer needed.
|
||||
|
||||
Signed-off-by: Piotr Figiel <p.figiel@camlintechnologies.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/usb.c | 15 ++++++---------
|
||||
1 file changed, 6 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -445,9 +445,10 @@ fail:
|
||||
|
||||
}
|
||||
|
||||
-static void brcmf_usb_free_q(struct list_head *q, bool pending)
|
||||
+static void brcmf_usb_free_q(struct list_head *q)
|
||||
{
|
||||
struct brcmf_usbreq *req, *next;
|
||||
+
|
||||
int i = 0;
|
||||
list_for_each_entry_safe(req, next, q, list) {
|
||||
if (!req->urb) {
|
||||
@@ -455,12 +456,8 @@ static void brcmf_usb_free_q(struct list
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
- if (pending) {
|
||||
- usb_kill_urb(req->urb);
|
||||
- } else {
|
||||
- usb_free_urb(req->urb);
|
||||
- list_del_init(&req->list);
|
||||
- }
|
||||
+ usb_free_urb(req->urb);
|
||||
+ list_del_init(&req->list);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1031,8 +1028,8 @@ static void brcmf_usb_detach(struct brcm
|
||||
brcmf_dbg(USB, "Enter, devinfo %p\n", devinfo);
|
||||
|
||||
/* free the URBS */
|
||||
- brcmf_usb_free_q(&devinfo->rx_freeq, false);
|
||||
- brcmf_usb_free_q(&devinfo->tx_freeq, false);
|
||||
+ brcmf_usb_free_q(&devinfo->rx_freeq);
|
||||
+ brcmf_usb_free_q(&devinfo->tx_freeq);
|
||||
|
||||
usb_free_urb(devinfo->ctl_urb);
|
||||
usb_free_urb(devinfo->bulk_urb);
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user