Compare commits
168 Commits
v18.06.0-r
...
v18.06.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70255e3d62 | ||
|
|
5eb055306f | ||
|
|
e11df1eac6 | ||
|
|
033472e1bd | ||
|
|
bfc9a4401b | ||
|
|
75e4d2d18c | ||
|
|
5b1c6570ca | ||
|
|
1fe7a17aed | ||
|
|
9cc774f91a | ||
|
|
508adbd871 | ||
|
|
ec1c66f53f | ||
|
|
9866622d81 | ||
|
|
c448f79840 | ||
|
|
67f91dfa51 | ||
|
|
e4a5750931 | ||
|
|
433c94f296 | ||
|
|
2a8d8adfb0 | ||
|
|
9fe68b4369 | ||
|
|
bd451d46a6 | ||
|
|
aeec1dd7ba | ||
|
|
8d903be35a | ||
|
|
1e4b5c8b1f | ||
|
|
ea22e3df3e | ||
|
|
0d5a041095 | ||
|
|
69c75f076a | ||
|
|
6603a0c232 | ||
|
|
ae1ae07513 | ||
|
|
fb5f026160 | ||
|
|
16d89ef291 | ||
|
|
ca3174e4e9 | ||
|
|
0990dfc9ce | ||
|
|
be4ab7e178 | ||
|
|
6a27c2f4b1 | ||
|
|
fe90d14880 | ||
|
|
eb06fa6cf7 | ||
|
|
25cb85abe7 | ||
|
|
7e03be7e2e | ||
|
|
8139438fc0 | ||
|
|
c3df07ab3b | ||
|
|
5a430bd13f | ||
|
|
888cc05cf5 | ||
|
|
da9a7a9a51 | ||
|
|
d101899395 | ||
|
|
1e5bd42d63 | ||
|
|
c61f543532 | ||
|
|
4017c528ca | ||
|
|
e3ab280e47 | ||
|
|
5742a2ba35 | ||
|
|
23d4f663e3 | ||
|
|
cb043ad8da | ||
|
|
6c075777d5 | ||
|
|
b40316c21a | ||
|
|
f63463591b | ||
|
|
9ce7aa325e | ||
|
|
9e1530b2a3 | ||
|
|
8be3af93b4 | ||
|
|
2589f8589c | ||
|
|
7d15f96eaf | ||
|
|
4f3082583a | ||
|
|
5f23d0f3db | ||
|
|
5828113986 | ||
|
|
f7e647ca7b | ||
|
|
9c110b97c6 | ||
|
|
b5b5f5dfa6 | ||
|
|
f8e57f450d | ||
|
|
f7668334a8 | ||
|
|
d700eb187b | ||
|
|
20c64dabb6 | ||
|
|
93782d5e8e | ||
|
|
ce234299bc | ||
|
|
03b693064b | ||
|
|
b0b5c64c22 | ||
|
|
3442ec5d57 | ||
|
|
f4798d37f1 | ||
|
|
a3dd6c939d | ||
|
|
11a5128b98 | ||
|
|
21ad5fb1ea | ||
|
|
4dc0ff8183 | ||
|
|
f24e012997 | ||
|
|
d4a4f06589 | ||
|
|
4a39d8cfd0 | ||
|
|
cb73dd21a3 | ||
|
|
bb06f6d3ba | ||
|
|
c8e8ff1c9f | ||
|
|
ca0c649a38 | ||
|
|
cf5a892430 | ||
|
|
bf1b0fad2b | ||
|
|
cb9d5f0a7c | ||
|
|
962e86d9af | ||
|
|
29aab93ea2 | ||
|
|
4e7f4777b0 | ||
|
|
da0dd6adc2 | ||
|
|
3f0d44b8de | ||
|
|
69021e9b89 | ||
|
|
6302f0161b | ||
|
|
f91a0f3b1a | ||
|
|
f1dbfa1937 | ||
|
|
ff91b32d26 | ||
|
|
b84a1c56f3 | ||
|
|
90b15b00a2 | ||
|
|
a80276235a | ||
|
|
5b12057d7c | ||
|
|
8a0ad2660a | ||
|
|
a297324a13 | ||
|
|
1e48546a6a | ||
|
|
f8cc68670f | ||
|
|
1086408b17 | ||
|
|
5dca299fab | ||
|
|
5889cf70e9 | ||
|
|
393ee8d0b2 | ||
|
|
c9c0fc28a9 | ||
|
|
aee917a5a2 | ||
|
|
3539430b3d | ||
|
|
6363377c47 | ||
|
|
ce8cab388a | ||
|
|
dc52b7b104 | ||
|
|
7fc7128b08 | ||
|
|
4de335bdbe | ||
|
|
e4d0ee5af5 | ||
|
|
a7b2764879 | ||
|
|
bc7abe8729 | ||
|
|
c99c70e053 | ||
|
|
3e81365141 | ||
|
|
dd1f97b37d | ||
|
|
68f40d7ecc | ||
|
|
16a9ddfe64 | ||
|
|
0e6cfb6919 | ||
|
|
514a4b3e1b | ||
|
|
3e89f58a5e | ||
|
|
7fa7c854fe | ||
|
|
a5b9553cf5 | ||
|
|
2f306873ef | ||
|
|
36a4681b2b | ||
|
|
ca903c73c7 | ||
|
|
3a5498c5e5 | ||
|
|
27014da237 | ||
|
|
5a40fad22a | ||
|
|
b84a07b380 | ||
|
|
6258c965a0 | ||
|
|
585208a356 | ||
|
|
c9a51c471d | ||
|
|
9ada61881c | ||
|
|
b05619fe09 | ||
|
|
5745bbe7d5 | ||
|
|
603870e871 | ||
|
|
2a7d8cd165 | ||
|
|
208a3a1410 | ||
|
|
5505ab5c94 | ||
|
|
ab7cabd09d | ||
|
|
c96b344466 | ||
|
|
1961cdfb57 | ||
|
|
dba362772e | ||
|
|
618d59aec2 | ||
|
|
7775802eb9 | ||
|
|
ce73f89469 | ||
|
|
ecee5bf1a1 | ||
|
|
cff16587bd | ||
|
|
3f3a2c966a | ||
|
|
a63e38ba46 | ||
|
|
286a456319 | ||
|
|
5dd3400746 | ||
|
|
c437adb024 | ||
|
|
2811c97803 | ||
|
|
72f6025d69 | ||
|
|
8cfd43d1d6 | ||
|
|
6eaffbd6ee | ||
|
|
93860bb06e | ||
|
|
c51d292c47 |
2
.github/pull_request_template
vendored
2
.github/pull_request_template
vendored
@@ -3,6 +3,6 @@ Thanks for your contribution to OpenWrt!
|
||||
To help keep the codebase consistent and readable,
|
||||
and to help people review your contribution,
|
||||
we ask you to follow the rules you find in the wiki at this link
|
||||
https://lede-project.org/submitting-patches
|
||||
https://openwrt.org/submitting-patches
|
||||
|
||||
Please remove this message before posting the pull request.
|
||||
|
||||
37
README
37
README
@@ -1,26 +1,31 @@
|
||||
_______ ________ __
|
||||
| |.-----.-----.-----.| | | |.----.| |_
|
||||
| - || _ | -__| || | | || _|| _|
|
||||
|_______|| __|_____|__|__||________||__| |____|
|
||||
|__| W I R E L E S S F R E E D O M
|
||||
-----------------------------------------------------
|
||||
|
||||
This is the buildsystem for the OpenWrt Linux distribution.
|
||||
|
||||
Please use "make menuconfig" to choose your preferred
|
||||
configuration for the toolchain and firmware.
|
||||
To build your own firmware you need a Linux, BSD or MacOSX system (case
|
||||
sensitive filesystem required). Cygwin is unsupported because of the lack
|
||||
of a case sensitive file system.
|
||||
|
||||
You need to have installed gcc, binutils, bzip2, flex, python, perl, make,
|
||||
find, grep, diff, unzip, gawk, getopt, subversion, libz-dev and libc headers.
|
||||
You need gcc, binutils, bzip2, flex, python, perl, make, find, grep, diff,
|
||||
unzip, gawk, getopt, subversion, libz-dev and libc headers installed.
|
||||
|
||||
Run "./scripts/feeds update -a" to get all the latest package definitions
|
||||
defined in feeds.conf / feeds.conf.default respectively
|
||||
and "./scripts/feeds install -a" to install symlinks of all of them into
|
||||
package/feeds/.
|
||||
1. Run "./scripts/feeds update -a" to obtain all the latest package definitions
|
||||
defined in feeds.conf / feeds.conf.default
|
||||
|
||||
Use "make menuconfig" to configure your image.
|
||||
2. Run "./scripts/feeds install -a" to install symlinks for all obtained
|
||||
packages into package/feeds/
|
||||
|
||||
Simply running "make" will build your firmware.
|
||||
It will download all sources, build the cross-compile toolchain,
|
||||
the kernel and all choosen applications.
|
||||
|
||||
To build your own firmware you need to have access to a Linux, BSD or MacOSX system
|
||||
(case-sensitive filesystem required). Cygwin will not be supported because of
|
||||
the lack of case sensitiveness in the file system.
|
||||
3. Run "make menuconfig" to select your preferred configuration for the
|
||||
toolchain, target system & firmware packages.
|
||||
|
||||
4. Run "make" to build your firmware. This will download all sources, build
|
||||
the cross-compile toolchain and then cross-compile the Linux kernel & all
|
||||
chosen applications for your target system.
|
||||
|
||||
Sunshine!
|
||||
Your OpenWrt Community
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
src-git packages https://git.openwrt.org/feed/packages.git^d83dc7cfb81680eff063acb7343eb9d6b0c9a6ab
|
||||
src-git luci https://git.openwrt.org/project/luci.git^c379f00e86a5fc5d05a8e967c5c5daa035a72359
|
||||
src-git packages https://git.openwrt.org/feed/packages.git^35e0b737ab496f5b51e80079b0d8c9b442e223f5
|
||||
src-git luci https://git.openwrt.org/project/luci.git^f64b1523447547032d5280fb0bcdde570f2ca913
|
||||
src-git routing https://git.openwrt.org/feed/routing.git^1b9d1c419f0ecefda51922a7845ab2183d6acd76
|
||||
src-git telephony https://git.openwrt.org/feed/telephony.git^1195dafe98bca2d3a41383eb2723d0104d7f9046
|
||||
src-git telephony https://git.openwrt.org/feed/telephony.git^b9d7b321d15a44c5abb9e5d43a4ec78abfd9031b
|
||||
|
||||
@@ -10,17 +10,11 @@
|
||||
|
||||
FEEDS_INSTALLED:=$(notdir $(wildcard $(TOPDIR)/package/feeds/*))
|
||||
FEEDS_AVAILABLE:=$(sort $(FEEDS_INSTALLED) $(shell $(SCRIPT_DIR)/feeds list -n))
|
||||
FEEDS_ENABLED:=$(foreach feed,$(FEEDS_AVAILABLE),$(if $(CONFIG_FEED_$(feed)),$(feed)))
|
||||
FEEDS_DISABLED:=$(filter-out $(FEEDS_ENABLED),$(FEEDS_AVAILABLE))
|
||||
|
||||
PACKAGE_SUBDIRS=$(PACKAGE_DIR)
|
||||
ifneq ($(CONFIG_PER_FEED_REPO),)
|
||||
PACKAGE_SUBDIRS += $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/base
|
||||
ifneq ($(CONFIG_PER_FEED_REPO_ADD_DISABLED),)
|
||||
PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_AVAILABLE),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
|
||||
else
|
||||
PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_ENABLED),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
|
||||
endif
|
||||
PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_AVAILABLE),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
|
||||
endif
|
||||
|
||||
opkg_package_files = $(wildcard \
|
||||
@@ -39,10 +33,11 @@ endef
|
||||
# 1: destination file
|
||||
define FeedSourcesAppend
|
||||
( \
|
||||
echo "src/gz %d_core %U/targets/%S/packages"; \
|
||||
echo 'src/gz %d_core %U/targets/%S/packages'; \
|
||||
$(strip $(if $(CONFIG_PER_FEED_REPO), \
|
||||
$(foreach feed,base $(FEEDS_ENABLED),echo "src/gz %d_$(feed) %U/packages/%A/$(feed)";) \
|
||||
$(if $(CONFIG_PER_FEED_REPO_ADD_DISABLED), \
|
||||
$(foreach feed,$(FEEDS_DISABLED),echo "$(if $(CONFIG_PER_FEED_REPO_ADD_COMMENTED),# )src/gz %d_$(feed) %U/packages/%A/$(feed)";)))) \
|
||||
echo 'src/gz %d_base %U/packages/%A/base'; \
|
||||
$(foreach feed,$(FEEDS_AVAILABLE), \
|
||||
$(if $(CONFIG_FEED_$(feed)), \
|
||||
echo '$(if $(filter m,$(CONFIG_FEED_$(feed))),# )src/gz %d_$(feed) %U/packages/%A/$(feed)';)))) \
|
||||
) >> $(1)
|
||||
endef
|
||||
|
||||
@@ -393,6 +393,7 @@ endef
|
||||
|
||||
define Device/Check/Common
|
||||
_PROFILE_SET = $$(strip $$(foreach profile,$$(PROFILES) DEVICE_$(1),$$(call DEVICE_CHECK_PROFILE,$$(profile))))
|
||||
DEVICE_PACKAGES += $$(call extra_packages,$$(DEVICE_PACKAGES))
|
||||
ifdef TARGET_PER_DEVICE_ROOTFS
|
||||
$$(eval $$(call merge_packages,_PACKAGES,$$(DEVICE_PACKAGES) $$(call DEVICE_EXTRA_PACKAGES,$(1))))
|
||||
ROOTFS_ID/$(1) := $$(if $$(_PROFILE_SET),$$(call mkfs_packages_id,$$(_PACKAGES)))
|
||||
|
||||
@@ -11,7 +11,7 @@ ifneq ($(DUMP),1)
|
||||
all: compile
|
||||
endif
|
||||
|
||||
KERNEL_FILE_DEPENDS=$(BACKPORT_PATCH_DIR) $(GENERIC_PATCH_DIR) $(GENERIC_HACK_DIR) $(PATCH_DIR) $(GENERIC_FILES_DIR) $(FILES_DIR)
|
||||
KERNEL_FILE_DEPENDS=$(GENERIC_BACKPORT_DIR) $(GENERIC_PATCH_DIR) $(GENERIC_HACK_DIR) $(PATCH_DIR) $(GENERIC_FILES_DIR) $(FILES_DIR)
|
||||
STAMP_PREPARED=$(LINUX_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call find_md5,$(KERNEL_FILE_DEPENDS),)))
|
||||
STAMP_CONFIGURED:=$(LINUX_DIR)/.configured
|
||||
include $(INCLUDE_DIR)/download.mk
|
||||
|
||||
@@ -2,15 +2,11 @@
|
||||
|
||||
LINUX_RELEASE?=1
|
||||
|
||||
LINUX_VERSION-3.18 = .71
|
||||
LINUX_VERSION-4.4 = .121
|
||||
LINUX_VERSION-4.9 = .109
|
||||
LINUX_VERSION-4.14 = .50
|
||||
LINUX_VERSION-4.9 = .120
|
||||
LINUX_VERSION-4.14 = .63
|
||||
|
||||
LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240
|
||||
LINUX_KERNEL_HASH-4.4.121 = 44a88268b5088dc326b30c9b9133ac35a9a200b636b7268d08f32abeae6ca729
|
||||
LINUX_KERNEL_HASH-4.9.109 = 3dcd5654a553432119492b69e649c4ed117781bfd571edcb02346c945be359b0
|
||||
LINUX_KERNEL_HASH-4.14.50 = 703a8d013b25dc428d936f72858fa0c702c22cb3114a040fb9bb47562e4ea2ac
|
||||
LINUX_KERNEL_HASH-4.9.120 = d75af506865edc8145a344c4e73c3bb1000e6c9f1c3489b8dae47ca8f033fd91
|
||||
LINUX_KERNEL_HASH-4.14.63 = cd2e52f0e7ba861afa91cf487b2f45e5174115870f256a1d65996647b7bcc6d3
|
||||
|
||||
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
|
||||
sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))
|
||||
|
||||
@@ -190,7 +190,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))
|
||||
|
||||
@@ -138,10 +138,10 @@ $(eval $(call SetupHostCommand,bzip2,Please install 'bzip2', \
|
||||
$(eval $(call SetupHostCommand,wget,Please install GNU 'wget', \
|
||||
wget --version | grep GNU))
|
||||
|
||||
$(eval $(call SetupHostCommand,time,Please install GNU 'time' or BusyBox 'time', \
|
||||
$(eval $(call SetupHostCommand,time,Please install GNU 'time' or BusyBox 'time' that supports -f, \
|
||||
gtime --version 2>&1 | grep GNU, \
|
||||
time --version 2>&1 | grep GNU, \
|
||||
busybox time 2>&1 | grep BusyBox))
|
||||
busybox time 2>&1 | grep -- '-f FMT'))
|
||||
|
||||
$(eval $(call SetupHostCommand,perl,Please install Perl 5.x, \
|
||||
perl --version | grep "perl.*v5"))
|
||||
|
||||
@@ -12,6 +12,12 @@ OVERRIDELIST:=$(TMP_DIR)/info/.overrides-$(SCAN_TARGET)-$(SCAN_COOKIE)
|
||||
|
||||
export PATH:=$(TOPDIR)/staging_dir/host/bin:$(PATH)
|
||||
|
||||
ifeq ($(SCAN_NAME),target)
|
||||
SCAN_DEPS=image/Makefile profiles/*.mk $(TOPDIR)/include/kernel*.mk $(TOPDIR)/include/target.mk image/*.mk
|
||||
else
|
||||
SCAN_DEPS=$(TOPDIR)/include/package*.mk
|
||||
endif
|
||||
|
||||
ifeq ($(IS_TTY),1)
|
||||
define progress
|
||||
printf "\033[M\r$(1)" >&2;
|
||||
|
||||
@@ -51,7 +51,7 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(filter 3.18 4.4 4.9,$(KERNEL_PATCHVER)),)
|
||||
ifneq ($(filter 4.9,$(KERNEL_PATCHVER)),)
|
||||
DEFAULT_PACKAGES.router:=$(filter-out kmod-ipt-offload,$(DEFAULT_PACKAGES.router))
|
||||
endif
|
||||
|
||||
@@ -72,7 +72,6 @@ define Profile
|
||||
$(eval $(call ProfileDefault))
|
||||
$(eval $(call Profile/$(1)))
|
||||
dumpinfo : $(call shexport,Profile/$(1)/Description)
|
||||
DEFAULT_PACKAGES := $(filter-out $(patsubst -%,%,$(filter -%,$(PACKAGES))),$(DEFAULT_PACKAGES))
|
||||
PACKAGES := $(filter-out -%,$(PACKAGES))
|
||||
DUMPINFO += \
|
||||
echo "Target-Profile: $(1)"; \
|
||||
|
||||
@@ -82,8 +82,8 @@ _ignore = $(foreach p,$(IGNORE_PACKAGES),--ignore $(p))
|
||||
prepare-tmpinfo: FORCE
|
||||
@+$(MAKE) -r -s staging_dir/host/.prereq-build $(PREP_MK)
|
||||
mkdir -p tmp/info
|
||||
$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPS="$(TOPDIR)/include/package*.mk" SCAN_DEPTH=5 SCAN_EXTRA=""
|
||||
$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPS="image/Makefile profiles/*.mk $(TOPDIR)/include/kernel*.mk $(TOPDIR)/include/target.mk" SCAN_DEPTH=2 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1"
|
||||
$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPTH=5 SCAN_EXTRA=""
|
||||
$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPTH=2 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1"
|
||||
for type in package target; do \
|
||||
f=tmp/.$${type}info; t=tmp/.config-$${type}.in; \
|
||||
[ "$$t" -nt "$$f" ] || ./scripts/$${type}-metadata.pl $(_ignore) config "$$f" > "$$t" || { rm -f "$$t"; echo "Failed to build $$t"; false; break; }; \
|
||||
|
||||
@@ -25,13 +25,13 @@ PKG_CONFIG_DEPENDS += \
|
||||
sanitize = $(call tolower,$(subst _,-,$(subst $(space),-,$(1))))
|
||||
|
||||
VERSION_NUMBER:=$(call qstrip,$(CONFIG_VERSION_NUMBER))
|
||||
VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),18.06.0-rc1)
|
||||
VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),18.06.1)
|
||||
|
||||
VERSION_CODE:=$(call qstrip,$(CONFIG_VERSION_CODE))
|
||||
VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),r7090-d2aa3a1b62)
|
||||
VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),r7258-5eb055306f)
|
||||
|
||||
VERSION_REPO:=$(call qstrip,$(CONFIG_VERSION_REPO))
|
||||
VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.openwrt.org/releases/18.06.0-rc1)
|
||||
VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.openwrt.org/releases/18.06.1)
|
||||
|
||||
VERSION_DIST:=$(call qstrip,$(CONFIG_VERSION_DIST))
|
||||
VERSION_DIST:=$(if $(VERSION_DIST),$(VERSION_DIST),OpenWrt)
|
||||
@@ -41,10 +41,10 @@ VERSION_MANUFACTURER:=$(call qstrip,$(CONFIG_VERSION_MANUFACTURER))
|
||||
VERSION_MANUFACTURER:=$(if $(VERSION_MANUFACTURER),$(VERSION_MANUFACTURER),OpenWrt)
|
||||
|
||||
VERSION_MANUFACTURER_URL:=$(call qstrip,$(CONFIG_VERSION_MANUFACTURER_URL))
|
||||
VERSION_MANUFACTURER_URL:=$(if $(VERSION_MANUFACTURER_URL),$(VERSION_MANUFACTURER_URL),http://lede-project.org/)
|
||||
VERSION_MANUFACTURER_URL:=$(if $(VERSION_MANUFACTURER_URL),$(VERSION_MANUFACTURER_URL),http://openwrt.org/)
|
||||
|
||||
VERSION_BUG_URL:=$(call qstrip,$(CONFIG_VERSION_BUG_URL))
|
||||
VERSION_BUG_URL:=$(if $(VERSION_BUG_URL),$(VERSION_BUG_URL),http://bugs.lede-project.org/)
|
||||
VERSION_BUG_URL:=$(if $(VERSION_BUG_URL),$(VERSION_BUG_URL),http://bugs.openwrt.org/)
|
||||
|
||||
VERSION_SUPPORT_URL:=$(call qstrip,$(CONFIG_VERSION_SUPPORT_URL))
|
||||
VERSION_SUPPORT_URL:=$(if $(VERSION_SUPPORT_URL),$(VERSION_SUPPORT_URL),http://forum.lede-project.org/)
|
||||
|
||||
@@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk
|
||||
include $(INCLUDE_DIR)/feeds.mk
|
||||
|
||||
PKG_NAME:=base-files
|
||||
PKG_RELEASE:=190
|
||||
PKG_RELEASE:=192
|
||||
PKG_FLAGS:=nonshared
|
||||
|
||||
PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
|
||||
@@ -25,9 +25,7 @@ PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_NAND_SUPPORT \
|
||||
CONFIG_CLEAN_IPKG \
|
||||
CONFIG_PER_FEED_REPO \
|
||||
CONFIG_PER_FEED_REPO_ADD_DISABLED \
|
||||
CONFIG_PER_FEED_REPO_ADD_COMMENTED \
|
||||
$(foreach feed,$(FEEDS_INSTALLED),CONFIG_FEED_$(feed))
|
||||
$(foreach feed,$(FEEDS_AVAILABLE),CONFIG_FEED_$(feed))
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ after mount_root:
|
||||
* /etc/config directory with config files
|
||||
|
||||
for more help see:
|
||||
http://wiki.openwrt.org/doc/howto/generic.failsafe
|
||||
https://openwrt.org/docs/guide-user/troubleshooting/
|
||||
- failsafe_and_factory_reset
|
||||
- root_password_reset
|
||||
=======================================================
|
||||
|
||||
|
||||
@@ -39,6 +39,6 @@ apply_defaults() {
|
||||
start() {
|
||||
apply_defaults
|
||||
for CONF in /etc/sysctl.d/*.conf /etc/sysctl.conf; do
|
||||
[ -f "$CONF" ] && sysctl -p "$CONF" -e >&-
|
||||
[ -f "$CONF" ] && sysctl -e -p "$CONF" >&-
|
||||
done
|
||||
}
|
||||
|
||||
@@ -57,16 +57,16 @@ config () {
|
||||
export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))
|
||||
name="${name:-cfg$CONFIG_NUM_SECTIONS}"
|
||||
append CONFIG_SECTIONS "$name"
|
||||
[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"
|
||||
export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"
|
||||
export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"
|
||||
config_set "$CONFIG_SECTION" "TYPE" "${cfgtype}"
|
||||
[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"
|
||||
}
|
||||
|
||||
option () {
|
||||
local varname="$1"; shift
|
||||
local value="$*"
|
||||
|
||||
export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"
|
||||
config_set "$CONFIG_SECTION" "${varname}" "${value}"
|
||||
[ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ list() {
|
||||
config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"
|
||||
config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"
|
||||
append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"
|
||||
list_cb "$varname" "$*"
|
||||
[ -n "$NO_CALLBACK" ] || list_cb "$varname" "$*"
|
||||
}
|
||||
|
||||
config_unset() {
|
||||
@@ -113,11 +113,8 @@ config_set() {
|
||||
local section="$1"
|
||||
local option="$2"
|
||||
local value="$3"
|
||||
local old_section="$CONFIG_SECTION"
|
||||
|
||||
CONFIG_SECTION="$section"
|
||||
option "$option" "$value"
|
||||
CONFIG_SECTION="$old_section"
|
||||
export ${NO_EXPORT:+-n} "CONFIG_${section}_${option}=${value}"
|
||||
}
|
||||
|
||||
config_foreach() {
|
||||
|
||||
@@ -6,10 +6,16 @@
|
||||
__network_ifstatus() {
|
||||
local __tmp
|
||||
|
||||
[ -z "$__NETWORK_CACHE" ] && \
|
||||
export __NETWORK_CACHE="$(ubus call network.interface dump)"
|
||||
[ -z "$__NETWORK_CACHE" ] && {
|
||||
__tmp="$(ubus call network.interface dump 2>&1)"
|
||||
case "$?" in
|
||||
4) : ;;
|
||||
0) export __NETWORK_CACHE="$__tmp" ;;
|
||||
*) echo "$__tmp" >&2 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
__tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "$__NETWORK_CACHE" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
|
||||
__tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "${__NETWORK_CACHE:-{}}" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
|
||||
|
||||
[ -z "$__tmp" ] && \
|
||||
unset "$1" && \
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
fwtool_pre_upgrade() {
|
||||
fwtool -q -i /dev/null "$1"
|
||||
}
|
||||
|
||||
fwtool_check_image() {
|
||||
[ $# -gt 1 ] && return 1
|
||||
|
||||
|
||||
@@ -137,7 +137,6 @@ add_overlayfiles() {
|
||||
|
||||
# hooks
|
||||
sysupgrade_image_check="fwtool_check_image platform_check_image"
|
||||
sysupgrade_pre_upgrade="fwtool_pre_upgrade"
|
||||
|
||||
if [ $SAVE_OVERLAY = 1 ]; then
|
||||
[ ! -d /overlay/upper/etc ] && {
|
||||
@@ -264,10 +263,8 @@ else
|
||||
rm -f /tmp/sysupgrade.always.overwrite.bootdisk.partmap
|
||||
fi
|
||||
|
||||
run_hooks "" $sysupgrade_pre_upgrade
|
||||
|
||||
install_bin /sbin/upgraded
|
||||
v "Commencing upgrade. All shell sessions will be closed now."
|
||||
v "Commencing upgrade. Closing all shell sessions."
|
||||
|
||||
COMMAND='. /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2'
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ if VERSIONOPT
|
||||
config VERSION_REPO
|
||||
string
|
||||
prompt "Release repository"
|
||||
default "http://downloads.openwrt.org/releases/18.06.0-rc1"
|
||||
default "http://downloads.openwrt.org/releases/18.06.1"
|
||||
help
|
||||
This is the repository address embedded in the image, it defaults
|
||||
to the trunk snapshot repo; the url may contain the following placeholders:
|
||||
@@ -268,18 +268,4 @@ menuconfig PER_FEED_REPO
|
||||
If set, a separate repository is generated within bin/*/packages/
|
||||
for the core packages and each enabled feed.
|
||||
|
||||
config PER_FEED_REPO_ADD_DISABLED
|
||||
bool "Add available but not enabled feeds to opkg.conf"
|
||||
default y
|
||||
depends on PER_FEED_REPO
|
||||
help
|
||||
Add not installed or disabled feeds from feeds.conf to opkg.conf.
|
||||
|
||||
config PER_FEED_REPO_ADD_COMMENTED
|
||||
bool "Comment out not enabled feeds"
|
||||
default !BUILDBOT
|
||||
depends on PER_FEED_REPO && PER_FEED_REPO_ADD_DISABLED
|
||||
help
|
||||
Add not enabled feeds as commented out source lines to opkg.conf.
|
||||
|
||||
source "tmp/.config-feeds.in"
|
||||
|
||||
@@ -627,7 +627,7 @@ NOTE: this patch is ready for upstream, LEDE-specific parts are in
|
||||
+#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
+ "console=console=ttyS0,115200\0" \
|
||||
+ "mtdids=nand0=orion_nand\0" \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
+
|
||||
+/*
|
||||
|
||||
@@ -613,7 +613,7 @@
|
||||
+#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
+ "console=console=ttyS0,115200\0" \
|
||||
+ "mtdids=nand0=orion_nand\0" \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
+
|
||||
+/*
|
||||
|
||||
@@ -1212,7 +1212,7 @@
|
||||
+#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
+ "console=console=ttyS0,115200\0" \
|
||||
+ "mtdids=nand0=orion_nand\0" \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
+
|
||||
+/*
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
- "bootargs_root=ubi.mtd=1 root=ubi0:root rootfstype=ubifs ro\0"
|
||||
+ "console=console=ttyS0,115200\0" \
|
||||
+ "mtdids=nand0=orion_nand\0" \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
|
||||
/*
|
||||
|
||||
@@ -22,9 +22,10 @@
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"console=console=ttyS0,115200\0" \
|
||||
"mtdids=nand0=orion_nand\0" \
|
||||
"mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
- "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
- "kernel=/boot/uImage\0" \
|
||||
- "bootargs_root=noinitrd ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs\0"
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
|
||||
/*
|
||||
|
||||
@@ -18,10 +18,11 @@
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"console=console=ttyS0,115200\0" \
|
||||
"mtdids=nand0=orion_nand\0" \
|
||||
"mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
- "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
- "kernel=/boot/zImage\0" \
|
||||
- "fdt=/boot/ib62x0.dtb\0" \
|
||||
- "bootargs_root=ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rw\0"
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
|
||||
/*
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
- "ext2load usb 0:1 0x01100000 /uInitrd\0"
|
||||
+ "console=console=ttyS0,115200\0" \
|
||||
+ "mtdids=nand0=orion_nand\0" \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
|
||||
/*
|
||||
|
||||
@@ -14,9 +14,10 @@
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"console=console=ttyS0,115200\0" \
|
||||
"mtdids=nand0=orion_nand\0" \
|
||||
"mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
- "mtdparts="CONFIG_MTDPARTS_DEFAULT \
|
||||
- "kernel=/boot/uImage\0" \
|
||||
- "bootargs_root=ubi.mtd=root root=ubi0:root rootfstype=ubifs ro\0"
|
||||
+ "mtdparts="CONFIG_MTDPARTS_DEFAULT "\0" \
|
||||
+ "bootargs_root=\0"
|
||||
|
||||
/*
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ath10k-ct
|
||||
PKG_RELEASE=2
|
||||
PKG_RELEASE=3
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
From d06f26c5c8a41f246a9c40862a77a55725cedbd3 Mon Sep 17 00:00:00 2001
|
||||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Date: Fri, 8 Dec 2017 11:37:42 +0100
|
||||
Subject: ath10k: search DT for qcom,ath10k-calibration-variant
|
||||
|
||||
Board Data File (BDF) is loaded upon driver boot-up procedure. The right
|
||||
board data file is identified on QCA4019 using bus, bmi-chip-id and
|
||||
bmi-board-id.
|
||||
|
||||
The problem, however, can occur when the (default) board data file cannot
|
||||
fulfill with the vendor requirements and it is necessary to use a different
|
||||
board data file.
|
||||
|
||||
This problem was solved for SMBIOS by adding a special SMBIOS type 0xF8.
|
||||
Something similar has to be provided for systems without SMBIOS but with
|
||||
device trees. No solution was specified by QCA and therefore a new one has
|
||||
to be found for ath10k.
|
||||
|
||||
The device tree requires addition strings to define the variant name
|
||||
|
||||
wifi@a000000 {
|
||||
status = "okay";
|
||||
qcom,ath10k-calibration-variant = "RT-AC58U";
|
||||
};
|
||||
|
||||
wifi@a800000 {
|
||||
status = "okay";
|
||||
qcom,ath10k-calibration-variant = "RT-AC58U";
|
||||
};
|
||||
|
||||
This would create the boarddata identifiers for the board-2.bin search
|
||||
|
||||
* bus=ahb,bmi-chip-id=0,bmi-board-id=16,variant=RT-AC58U
|
||||
* bus=ahb,bmi-chip-id=0,bmi-board-id=17,variant=RT-AC58U
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
|
||||
|
||||
Origin: upstream, https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d06f26c5c8a41f246a9c40862a77a55725cedbd3
|
||||
---
|
||||
ath10k-4.13/core.c | 40 ++++++++++++++++++++++++++++------
|
||||
1 file changed, 33 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/ath10k-4.13/core.c
|
||||
+++ b/ath10k-4.13/core.c
|
||||
@@ -889,6 +889,28 @@ static int ath10k_core_check_smbios(stru
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ath10k_core_check_dt(struct ath10k *ar)
|
||||
+{
|
||||
+ struct device_node *node;
|
||||
+ const char *variant = NULL;
|
||||
+
|
||||
+ node = ar->dev->of_node;
|
||||
+ if (!node)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ of_property_read_string(node, "qcom,ath10k-calibration-variant",
|
||||
+ &variant);
|
||||
+ if (!variant)
|
||||
+ return -ENODATA;
|
||||
+
|
||||
+ if (strscpy(ar->id.bdf_ext, variant, sizeof(ar->id.bdf_ext)) < 0)
|
||||
+ ath10k_dbg(ar, ATH10K_DBG_BOOT,
|
||||
+ "bdf variant string is longer than the buffer can accommodate (variant: %s)\n",
|
||||
+ variant);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ath10k_download_and_run_otp(struct ath10k *ar)
|
||||
{
|
||||
u32 result, address = ar->hw_params.patch_load_addr;
|
||||
@@ -1522,19 +1544,19 @@ static int ath10k_core_create_board_name
|
||||
/* strlen(',variant=') + strlen(ar->id.bdf_ext) */
|
||||
char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH] = { 0 };
|
||||
|
||||
+ if (ar->id.bdf_ext[0] != '\0')
|
||||
+ scnprintf(variant, sizeof(variant), ",variant=%s",
|
||||
+ ar->id.bdf_ext);
|
||||
+
|
||||
if (ar->id.bmi_ids_valid) {
|
||||
scnprintf(name, name_len,
|
||||
- "bus=%s,bmi-chip-id=%d,bmi-board-id=%d",
|
||||
+ "bus=%s,bmi-chip-id=%d,bmi-board-id=%d%s",
|
||||
ath10k_bus_str(ar->hif.bus),
|
||||
ar->id.bmi_chip_id,
|
||||
- ar->id.bmi_board_id);
|
||||
+ ar->id.bmi_board_id, variant);
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (ar->id.bdf_ext[0] != '\0')
|
||||
- scnprintf(variant, sizeof(variant), ",variant=%s",
|
||||
- ar->id.bdf_ext);
|
||||
-
|
||||
scnprintf(name, name_len,
|
||||
"bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x%s",
|
||||
ath10k_bus_str(ar->hif.bus),
|
||||
@@ -2964,7 +2986,11 @@ static int ath10k_core_probe_fw(struct a
|
||||
|
||||
ret = ath10k_core_check_smbios(ar);
|
||||
if (ret)
|
||||
- ath10k_dbg(ar, ATH10K_DBG_BOOT, "bdf variant name not set.\n");
|
||||
+ ath10k_dbg(ar, ATH10K_DBG_BOOT, "SMBIOS bdf variant name not set.\n");
|
||||
+
|
||||
+ ret = ath10k_core_check_dt(ar);
|
||||
+ if (ret)
|
||||
+ ath10k_dbg(ar, ATH10K_DBG_BOOT, "DT bdf variant name not set.\n");
|
||||
|
||||
ret = ath10k_core_fetch_board_file(ar);
|
||||
if (ret) {
|
||||
@@ -0,0 +1,249 @@
|
||||
From: Thomas Hebb <tommyhebb@gmail.com>
|
||||
Date: Fri, 13 Apr 2018 17:40:26 +0300
|
||||
Subject: [PATCH] ath10k: search all IEs for variant before falling back
|
||||
|
||||
commit f2593cb1b291 ("ath10k: Search SMBIOS for OEM board file
|
||||
extension") added a feature to ath10k that allows Board Data File
|
||||
(BDF) conflicts between multiple devices that use the same device IDs
|
||||
but have different calibration requirements to be resolved by allowing
|
||||
a "variant" string to be stored in SMBIOS [and later device tree, added
|
||||
by commit d06f26c5c8a4 ("ath10k: search DT for qcom,ath10k-calibration-
|
||||
variant")] that gets appended to the ID stored in board-2.bin.
|
||||
|
||||
This original patch had a regression, however. Namely that devices with
|
||||
a variant present in SMBIOS that didn't need custom BDFs could no longer
|
||||
find the default BDF, which has no variant appended. The patch was
|
||||
reverted and re-applied with a fix for this issue in commit 1657b8f84ed9
|
||||
("search SMBIOS for OEM board file extension").
|
||||
|
||||
But the fix to fall back to a default BDF introduced another issue: the
|
||||
driver currently parses IEs in board-2.bin one by one, and for each one
|
||||
it first checks to see if it matches the ID with the variant appended.
|
||||
If it doesn't, it checks to see if it matches the "fallback" ID with no
|
||||
variant. If a matching BDF is found at any point during this search, the
|
||||
search is terminated and that BDF is used. The issue is that it's very
|
||||
possible (and is currently the case for board-2.bin files present in the
|
||||
ath10k-firmware repository) for the default BDF to occur in an earlier
|
||||
IE than the variant-specific BDF. In this case, the current code will
|
||||
happily choose the default BDF even though a better-matching BDF is
|
||||
present later in the file.
|
||||
|
||||
This patch fixes the issue by first searching the entire file for the ID
|
||||
with variant, and searching for the fallback ID only if that search
|
||||
fails. It also includes some code cleanup in the area, as
|
||||
ath10k_core_fetch_board_data_api_n() no longer does its own string
|
||||
mangling to remove the variant from an ID, instead leaving that job to a
|
||||
new flag passed to ath10k_core_create_board_name().
|
||||
|
||||
I've tested this patch on a QCA4019 and verified that the driver behaves
|
||||
correctly for 1) both fallback and variant BDFs present, 2) only fallback
|
||||
BDF present, and 3) no matching BDFs present.
|
||||
|
||||
Fixes: 1657b8f84ed9 ("ath10k: search SMBIOS for OEM board file extension")
|
||||
Signed-off-by: Thomas Hebb <tommyhebb@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
|
||||
Origin: backport, https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c8489668065a283d3027e86e877b103a87f99d22
|
||||
---
|
||||
ath10k-4.13/core.c | 134 ++++++++++++++++++---------------
|
||||
1 file changed, 72 insertions(+), 62 deletions(-)
|
||||
|
||||
--- a/ath10k-4.13/core.c
|
||||
+++ b/ath10k-4.13/core.c
|
||||
@@ -1419,14 +1419,61 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int ath10k_core_search_bd(struct ath10k *ar,
|
||||
+ const char *boardname,
|
||||
+ const u8 *data,
|
||||
+ size_t len)
|
||||
+{
|
||||
+ size_t ie_len;
|
||||
+ struct ath10k_fw_ie *hdr;
|
||||
+ int ret = -ENOENT, ie_id;
|
||||
+
|
||||
+ while (len > sizeof(struct ath10k_fw_ie)) {
|
||||
+ hdr = (struct ath10k_fw_ie *)data;
|
||||
+ ie_id = le32_to_cpu(hdr->id);
|
||||
+ ie_len = le32_to_cpu(hdr->len);
|
||||
+
|
||||
+ len -= sizeof(*hdr);
|
||||
+ data = hdr->data;
|
||||
+
|
||||
+ if (len < ALIGN(ie_len, 4)) {
|
||||
+ ath10k_err(ar, "invalid length for board ie_id %d ie_len %zu len %zu\n",
|
||||
+ ie_id, ie_len, len);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ switch (ie_id) {
|
||||
+ case ATH10K_BD_IE_BOARD:
|
||||
+ ret = ath10k_core_parse_bd_ie_board(ar, data, ie_len,
|
||||
+ boardname);
|
||||
+ if (ret == -ENOENT)
|
||||
+ /* no match found, continue */
|
||||
+ break;
|
||||
+
|
||||
+ /* either found or error, so stop searching */
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* jump over the padding */
|
||||
+ ie_len = ALIGN(ie_len, 4);
|
||||
+
|
||||
+ len -= ie_len;
|
||||
+ data += ie_len;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ /* return result of parse_bd_ie_board() or -ENOENT */
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar,
|
||||
const char *boardname,
|
||||
+ const char *fallback_boardname,
|
||||
const char *filename)
|
||||
{
|
||||
- size_t len, magic_len, ie_len;
|
||||
- struct ath10k_fw_ie *hdr;
|
||||
+ size_t len, magic_len;
|
||||
const u8 *data;
|
||||
- int ret, ie_id;
|
||||
+ int ret;
|
||||
|
||||
ar->normal_mode_fw.board = ath10k_fetch_fw_file(ar,
|
||||
ar->hw_params.fw.dir,
|
||||
@@ -1464,73 +1511,28 @@ static int ath10k_core_fetch_board_data_
|
||||
data += magic_len;
|
||||
len -= magic_len;
|
||||
|
||||
- while (len > sizeof(struct ath10k_fw_ie)) {
|
||||
- hdr = (struct ath10k_fw_ie *)data;
|
||||
- ie_id = le32_to_cpu(hdr->id);
|
||||
- ie_len = le32_to_cpu(hdr->len);
|
||||
-
|
||||
- len -= sizeof(*hdr);
|
||||
- data = hdr->data;
|
||||
-
|
||||
- if (len < ALIGN(ie_len, 4)) {
|
||||
- ath10k_err(ar, "invalid length for board ie_id %d ie_len %zu len %zu\n",
|
||||
- ie_id, ie_len, len);
|
||||
- ret = -EINVAL;
|
||||
- goto err;
|
||||
- }
|
||||
-
|
||||
- switch (ie_id) {
|
||||
- case ATH10K_BD_IE_BOARD:
|
||||
- ret = ath10k_core_parse_bd_ie_board(ar, data, ie_len,
|
||||
- boardname);
|
||||
- if (ret == -ENOENT && ar->id.bdf_ext[0] != '\0') {
|
||||
- /* try default bdf if variant was not found */
|
||||
- char *s, *v = ",variant=";
|
||||
- char boardname2[100];
|
||||
-
|
||||
- strlcpy(boardname2, boardname,
|
||||
- sizeof(boardname2));
|
||||
-
|
||||
- s = strstr(boardname2, v);
|
||||
- if (s)
|
||||
- *s = '\0'; /* strip ",variant=%s" */
|
||||
-
|
||||
- ret = ath10k_core_parse_bd_ie_board(ar, data,
|
||||
- ie_len,
|
||||
- boardname2);
|
||||
- }
|
||||
-
|
||||
- if (ret == -ENOENT)
|
||||
- /* no match found, continue */
|
||||
- break;
|
||||
- else if (ret)
|
||||
- /* there was an error, bail out */
|
||||
- goto err;
|
||||
-
|
||||
- /* board data found */
|
||||
- goto out;
|
||||
- }
|
||||
+ /* attempt to find boardname in the IE list */
|
||||
+ ret = ath10k_core_search_bd(ar, boardname, data, len);
|
||||
|
||||
- /* jump over the padding */
|
||||
- ie_len = ALIGN(ie_len, 4);
|
||||
-
|
||||
- len -= ie_len;
|
||||
- data += ie_len;
|
||||
- }
|
||||
+ /* if we didn't find it and have a fallback name, try that */
|
||||
+ if (ret == -ENOENT && fallback_boardname)
|
||||
+ ret = ath10k_core_search_bd(ar, fallback_boardname, data, len);
|
||||
|
||||
out:
|
||||
- if (!ar->normal_mode_fw.board_data || !ar->normal_mode_fw.board_len) {
|
||||
+ if (ret == -ENOENT) {
|
||||
ath10k_err(ar,
|
||||
"failed to fetch board data for %s from %s/%s\n",
|
||||
boardname, ar->hw_params.fw.dir, filename);
|
||||
ret = -ENODATA;
|
||||
- goto err;
|
||||
}
|
||||
|
||||
/* Save firmware board name so we can display it later. */
|
||||
strlcpy(ar->normal_mode_fw.fw_file.fw_board_name, filename,
|
||||
sizeof(ar->normal_mode_fw.fw_file.fw_board_name));
|
||||
|
||||
+ if (ret)
|
||||
+ goto err;
|
||||
+
|
||||
return 0;
|
||||
|
||||
err:
|
||||
@@ -1539,12 +1541,12 @@ err:
|
||||
}
|
||||
|
||||
static int ath10k_core_create_board_name(struct ath10k *ar, char *name,
|
||||
- size_t name_len)
|
||||
+ size_t name_len, bool with_variant)
|
||||
{
|
||||
/* strlen(',variant=') + strlen(ar->id.bdf_ext) */
|
||||
char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH] = { 0 };
|
||||
|
||||
- if (ar->id.bdf_ext[0] != '\0')
|
||||
+ if (with_variant && ar->id.bdf_ext[0] != '\0')
|
||||
scnprintf(variant, sizeof(variant), ",variant=%s",
|
||||
ar->id.bdf_ext);
|
||||
|
||||
@@ -1570,21 +1572,31 @@ out:
|
||||
|
||||
static int ath10k_core_fetch_board_file(struct ath10k *ar)
|
||||
{
|
||||
- char boardname[100];
|
||||
+ char boardname[100], fallback_boardname[100];
|
||||
int ret;
|
||||
|
||||
- ret = ath10k_core_create_board_name(ar, boardname, sizeof(boardname));
|
||||
+ ret = ath10k_core_create_board_name(ar, boardname,
|
||||
+ sizeof(boardname), true);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to create board name: %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ ret = ath10k_core_create_board_name(ar, fallback_boardname,
|
||||
+ sizeof(boardname), false);
|
||||
+ if (ret) {
|
||||
+ ath10k_err(ar, "failed to create fallback board name: %d", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
ar->bd_api = 2;
|
||||
if (ar->fwcfg.bname[0])
|
||||
ret = ath10k_core_fetch_board_data_api_n(ar, boardname,
|
||||
+ fallback_boardname,
|
||||
ar->fwcfg.bname);
|
||||
else
|
||||
ret = ath10k_core_fetch_board_data_api_n(ar, boardname,
|
||||
+ fallback_boardname,
|
||||
ATH10K_BOARD_API2_FILE);
|
||||
if (!ret)
|
||||
goto success;
|
||||
@@ -434,11 +434,6 @@ static int __init nct5104d_gpio_init(void)
|
||||
const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
|
||||
const char *board_name = dmi_get_system_info(DMI_BOARD_NAME);
|
||||
|
||||
/* Make sure we only run on PC Engine APU boards */
|
||||
if (!board_name || !board_vendor || strcasecmp(board_vendor, "PC Engines") || strncasecmp(board_name, "apu", 3)) {
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (nct5104d_find(0x2e, &sio) &&
|
||||
nct5104d_find(0x4e, &sio))
|
||||
return -ENODEV;
|
||||
|
||||
@@ -13,9 +13,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/dtaht/sch_cake.git
|
||||
PKG_SOURCE_DATE:=2018-05-15
|
||||
PKG_SOURCE_VERSION:=779e91a91e803cf2b95a6a46de721d3a4fd4dfe6
|
||||
PKG_MIRROR_HASH:=2bd1e9aee6d53a2a140ad5ece6d8eeccbfb8ae8c788e84f9dd946e29abb64010
|
||||
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
|
||||
|
||||
@@ -331,18 +331,6 @@ static int __init gpio_apu2_init (void)
|
||||
const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
|
||||
const char *board_name = dmi_get_system_info(DMI_BOARD_NAME);
|
||||
|
||||
/* Match the device name/model */
|
||||
if (!board_name \
|
||||
|| !board_vendor \
|
||||
|| strcasecmp(board_vendor, "PC Engines") \
|
||||
|| (strcasecmp(board_name, "apu2") \
|
||||
&& strcasecmp(board_name, "apu3") \
|
||||
&& strcasecmp(board_name, "PC Engines apu2") \
|
||||
&& strcasecmp(board_name, "PC Engines apu3"))) {
|
||||
err = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pr_info ("%s: load APU2/LED GPIO driver module\n", DEVNAME);
|
||||
|
||||
err = platform_driver_register (&gpio_apu2_driver);
|
||||
|
||||
@@ -14,7 +14,7 @@ PKG_FLAGS:=hold
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/packages
|
||||
SCAN_DEPS=modules/*.mk $(TOPDIR)/target/linux/*/modules.mk $(TOPDIR)/include/netfilter.mk
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_LICENSE_FILES:=
|
||||
|
||||
export SHELL:=/bin/sh
|
||||
|
||||
@@ -57,6 +57,7 @@ PKG_CONFIG_DEPENDS:= \
|
||||
CONFIG_PACKAGE_ATH_DEBUG \
|
||||
CONFIG_PACKAGE_ATH_DFS \
|
||||
CONFIG_PACKAGE_ATH_SPECTRAL \
|
||||
CONFIG_PACKAGE_ATH_DYNACK \
|
||||
CONFIG_PACKAGE_B43_DEBUG \
|
||||
CONFIG_PACKAGE_B43_PIO \
|
||||
CONFIG_PACKAGE_B43_PHY_G \
|
||||
@@ -197,6 +198,17 @@ define KernelPackage/ath/config
|
||||
help
|
||||
Say Y to enable access to the FFT/spectral data via debugfs.
|
||||
|
||||
config PACKAGE_ATH_DYNACK
|
||||
bool "Enable Dynack support"
|
||||
depends on PACKAGE_kmod-ath9k-common
|
||||
help
|
||||
Enables support for Dynamic ACK estimation, which allows the fastest possible speed
|
||||
at any distance automatically by increasing/decreasing the max frame ACK time for
|
||||
the most remote station detected. It can be enabled by using iw (iw phy0 set distance auto),
|
||||
or by sending the NL80211_ATTR_WIPHY_DYN_ACK flag to mac80211 driver using netlink.
|
||||
|
||||
Select this option if you want to enable this feature
|
||||
|
||||
endif
|
||||
endef
|
||||
|
||||
@@ -1614,7 +1626,7 @@ config-$(call config_package,ath) += ATH_CARDS ATH_COMMON ATH_REG_DYNAMIC_USER_R
|
||||
config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS
|
||||
config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED
|
||||
config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL
|
||||
|
||||
config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK
|
||||
config-$(call config_package,ath9k) += ATH9K
|
||||
config-$(call config_package,ath9k-common) += ATH9K_COMMON
|
||||
config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB
|
||||
|
||||
@@ -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
|
||||
@@ -369,9 +369,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
|
||||
@@ -1091,6 +1091,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,69 @@
|
||||
From 4b5adc736828dc25ca33e263ad8c0b9dcd3bf325 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:19 +0100
|
||||
Subject: [PATCH] brcmfmac: move allocation of control rx buffer to
|
||||
brcmf_sdio_bus_preinit()
|
||||
|
||||
Allocate the control rx buffer needed for firmware control interface
|
||||
during brcmf_sdio_bus_preinit(). This relies on common layer setting
|
||||
struct brcmf_bus::maxctl during brcmf_attach(). By moving the allocation
|
||||
we can move brcmf_attach() in subsequent change.
|
||||
|
||||
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/sdio.c | 26 ++++++++++------------
|
||||
1 file changed, 12 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -1707,7 +1707,6 @@ brcmf_sdio_read_control(struct brcmf_sdi
|
||||
int sdret;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
-
|
||||
if (bus->rxblen)
|
||||
buf = vzalloc(bus->rxblen);
|
||||
if (!buf)
|
||||
@@ -3411,6 +3410,18 @@ static int brcmf_sdio_bus_preinit(struct
|
||||
u32 value;
|
||||
int err;
|
||||
|
||||
+ /* maxctl provided by common layer */
|
||||
+ if (WARN_ON(!bus_if->maxctl))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* Allocate control receive buffer */
|
||||
+ bus_if->maxctl += bus->roundup;
|
||||
+ value = roundup((bus_if->maxctl + SDPCM_HDRLEN), ALIGNMENT);
|
||||
+ value += bus->head_align;
|
||||
+ bus->rxbuf = kmalloc(value, GFP_ATOMIC);
|
||||
+ if (bus->rxbuf)
|
||||
+ bus->rxblen = value;
|
||||
+
|
||||
/* the commands below use the terms tx and rx from
|
||||
* a device perspective, ie. bus:txglom affects the
|
||||
* bus transfers from device to host.
|
||||
@@ -4209,19 +4220,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
bus->blocksize = bus->sdiodev->func2->cur_blksize;
|
||||
bus->roundup = min(max_roundup, bus->blocksize);
|
||||
|
||||
- /* Allocate buffers */
|
||||
- if (bus->sdiodev->bus_if->maxctl) {
|
||||
- bus->sdiodev->bus_if->maxctl += bus->roundup;
|
||||
- bus->rxblen =
|
||||
- roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN),
|
||||
- ALIGNMENT) + bus->head_align;
|
||||
- bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC);
|
||||
- if (!(bus->rxbuf)) {
|
||||
- brcmf_err("rxbuf allocation failed\n");
|
||||
- goto fail;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
sdio_claim_host(bus->sdiodev->func1);
|
||||
|
||||
/* Disable F2 to clear any intermediate frame state on the dongle */
|
||||
@@ -0,0 +1,106 @@
|
||||
From 262f2b53f67936b59cc8dfc6f3899ab8905bf1ed Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:20 +0100
|
||||
Subject: [PATCH] brcmfmac: call brcmf_attach() just before calling
|
||||
brcmf_bus_started()
|
||||
|
||||
Now we can move brcmf_attach() until after the firmware has been downloaded
|
||||
to the device. Make the call just before brcmf_bus_started().
|
||||
|
||||
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 | 6 ++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 34 +++++++++++-----------
|
||||
2 files changed, 23 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1268,6 +1268,12 @@ void brcmf_bus_change_state(struct brcmf
|
||||
int ifidx;
|
||||
|
||||
brcmf_dbg(TRACE, "%d -> %d\n", bus->state, state);
|
||||
+
|
||||
+ if (!drvr) {
|
||||
+ brcmf_dbg(INFO, "ignoring transition, bus not attached yet\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
bus->state = state;
|
||||
|
||||
if (state == BRCMF_BUS_UP) {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4048,9 +4048,6 @@ static void brcmf_sdio_firmware_callback
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
- if (!bus_if->drvr)
|
||||
- return;
|
||||
-
|
||||
/* try to download image and nvram to the dongle */
|
||||
bus->alp_only = true;
|
||||
err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len);
|
||||
@@ -4126,11 +4123,28 @@ static void brcmf_sdio_firmware_callback
|
||||
|
||||
sdio_release_host(sdiodev->func1);
|
||||
|
||||
+ /* Assign bus interface call back */
|
||||
+ sdiodev->bus_if->dev = sdiodev->dev;
|
||||
+ sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
+ sdiodev->bus_if->chip = bus->ci->chip;
|
||||
+ sdiodev->bus_if->chiprev = bus->ci->chiprev;
|
||||
+
|
||||
+ /* Attach to the common layer, reserve hdr space */
|
||||
+ err = brcmf_attach(sdiodev->dev, sdiodev->settings);
|
||||
+ if (err != 0) {
|
||||
+ brcmf_err("brcmf_attach failed\n");
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ brcmf_sdio_debugfs_create(bus);
|
||||
+
|
||||
err = brcmf_bus_started(dev);
|
||||
if (err != 0) {
|
||||
brcmf_err("dongle is not responding\n");
|
||||
goto fail;
|
||||
}
|
||||
+
|
||||
+ /* ready */
|
||||
return;
|
||||
|
||||
release:
|
||||
@@ -4200,22 +4214,9 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
bus->dpc_triggered = false;
|
||||
bus->dpc_running = false;
|
||||
|
||||
- /* Assign bus interface call back */
|
||||
- bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
|
||||
- bus->sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
- bus->sdiodev->bus_if->chip = bus->ci->chip;
|
||||
- bus->sdiodev->bus_if->chiprev = bus->ci->chiprev;
|
||||
-
|
||||
/* default sdio bus header length for tx packet */
|
||||
bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
|
||||
|
||||
- /* Attach to the common layer, reserve hdr space */
|
||||
- ret = brcmf_attach(bus->sdiodev->dev, bus->sdiodev->settings);
|
||||
- if (ret != 0) {
|
||||
- brcmf_err("brcmf_attach failed\n");
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
/* Query the F2 block size, set roundup accordingly */
|
||||
bus->blocksize = bus->sdiodev->func2->cur_blksize;
|
||||
bus->roundup = min(max_roundup, bus->blocksize);
|
||||
@@ -4240,7 +4241,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
/* SR state */
|
||||
bus->sr_enabled = false;
|
||||
|
||||
- brcmf_sdio_debugfs_create(bus);
|
||||
brcmf_dbg(INFO, "completed!!\n");
|
||||
|
||||
ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev,
|
||||
@@ -0,0 +1,41 @@
|
||||
From a7f4a80c0070b673d4a4ce94b99979ea6d0c6296 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:21 +0100
|
||||
Subject: [PATCH] brcmfmac: usb: call brcmf_usb_up() during brcmf_bus_preinit()
|
||||
|
||||
By calling brcmf_usb_up() during brcmf_bus_preinit() it does not need
|
||||
to be called in brcmf_usb_bus_setup().
|
||||
|
||||
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/usb.c | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1146,8 +1146,9 @@ static int brcmf_usb_get_fwname(struct d
|
||||
}
|
||||
|
||||
static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
|
||||
- .txdata = brcmf_usb_tx,
|
||||
+ .preinit = brcmf_usb_up,
|
||||
.stop = brcmf_usb_down,
|
||||
+ .txdata = brcmf_usb_tx,
|
||||
.txctl = brcmf_usb_tx_ctlpkt,
|
||||
.rxctl = brcmf_usb_rx_ctlpkt,
|
||||
.wowl_config = brcmf_usb_wowl_config,
|
||||
@@ -1165,10 +1166,6 @@ static int brcmf_usb_bus_setup(struct br
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = brcmf_usb_up(devinfo->dev);
|
||||
- if (ret)
|
||||
- goto fail;
|
||||
-
|
||||
ret = brcmf_bus_started(devinfo->dev);
|
||||
if (ret)
|
||||
goto fail;
|
||||
@@ -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
|
||||
@@ -992,55 +992,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);
|
||||
@@ -1170,6 +1121,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,190 @@
|
||||
From de2a3027f6f15e2f6558dc4d178282ccc1f054db Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:23 +0100
|
||||
Subject: [PATCH] brcmfmac: remove brcmf_bus_started() from bus api
|
||||
|
||||
No longer needed to call this in bus layer so make it static and call
|
||||
it in the last phase of brcmf_attach() instead.
|
||||
|
||||
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>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 1 -
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 14 +++++++----
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 20 +---------------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 10 ++------
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 28 ++++------------------
|
||||
5 files changed, 16 insertions(+), 57 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -253,7 +253,6 @@ void brcmf_dev_reset(struct device *dev)
|
||||
/* Configure the "global" bus state used by upper layers */
|
||||
void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
|
||||
|
||||
-int brcmf_bus_started(struct device *dev);
|
||||
s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len);
|
||||
void brcmf_bus_add_txhdrlen(struct device *dev, uint len);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1022,11 +1022,10 @@ static int brcmf_revinfo_read(struct seq
|
||||
return 0;
|
||||
}
|
||||
|
||||
-int brcmf_bus_started(struct device *dev)
|
||||
+static int brcmf_bus_started(struct brcmf_pub *drvr)
|
||||
{
|
||||
int ret = -1;
|
||||
- struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
- struct brcmf_pub *drvr = bus_if->drvr;
|
||||
+ struct brcmf_bus *bus_if = drvr->bus_if;
|
||||
struct brcmf_if *ifp;
|
||||
struct brcmf_if *p2p_ifp;
|
||||
|
||||
@@ -1043,7 +1042,7 @@ int brcmf_bus_started(struct device *dev
|
||||
brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
|
||||
|
||||
/* do bus specific preinit here */
|
||||
- ret = brcmf_bus_preinit(ifp->drvr->bus_if);
|
||||
+ ret = brcmf_bus_preinit(bus_if);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
@@ -1163,7 +1162,12 @@ int brcmf_attach(struct device *dev, str
|
||||
/* attach firmware event handler */
|
||||
brcmf_fweh_attach(drvr);
|
||||
|
||||
- return ret;
|
||||
+ ret = brcmf_bus_started(drvr);
|
||||
+ if (ret != 0) {
|
||||
+ brcmf_err("dongle is not responding: err=%d\n", ret);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ return 0;
|
||||
|
||||
fail:
|
||||
brcmf_detach(dev);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1581,24 +1581,6 @@ static void brcmf_pcie_release_resource(
|
||||
}
|
||||
|
||||
|
||||
-static int brcmf_pcie_attach_bus(struct brcmf_pciedev_info *devinfo)
|
||||
-{
|
||||
- int ret;
|
||||
-
|
||||
- /* Attach to the common driver interface */
|
||||
- ret = brcmf_attach(&devinfo->pdev->dev, devinfo->settings);
|
||||
- if (ret) {
|
||||
- brcmf_err("brcmf_attach failed\n");
|
||||
- } else {
|
||||
- ret = brcmf_bus_started(&devinfo->pdev->dev);
|
||||
- if (ret)
|
||||
- brcmf_err("dongle is not responding\n");
|
||||
- }
|
||||
-
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-
|
||||
static u32 brcmf_pcie_buscore_prep_addr(const struct pci_dev *pdev, u32 addr)
|
||||
{
|
||||
u32 ret_addr;
|
||||
@@ -1735,7 +1717,7 @@ static void brcmf_pcie_setup(struct devi
|
||||
init_waitqueue_head(&devinfo->mbdata_resp_wait);
|
||||
|
||||
brcmf_pcie_intr_enable(devinfo);
|
||||
- if (brcmf_pcie_attach_bus(devinfo) == 0)
|
||||
+ if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
|
||||
return;
|
||||
|
||||
brcmf_pcie_bus_console_read(devinfo);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -3422,6 +3422,8 @@ static int brcmf_sdio_bus_preinit(struct
|
||||
if (bus->rxbuf)
|
||||
bus->rxblen = value;
|
||||
|
||||
+ brcmf_sdio_debugfs_create(bus);
|
||||
+
|
||||
/* the commands below use the terms tx and rx from
|
||||
* a device perspective, ie. bus:txglom affects the
|
||||
* bus transfers from device to host.
|
||||
@@ -4136,14 +4138,6 @@ static void brcmf_sdio_firmware_callback
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- brcmf_sdio_debugfs_create(bus);
|
||||
-
|
||||
- err = brcmf_bus_started(dev);
|
||||
- if (err != 0) {
|
||||
- brcmf_err("dongle is not responding\n");
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
/* ready */
|
||||
return;
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1155,27 +1155,6 @@ static const struct brcmf_bus_ops brcmf_
|
||||
.get_fwname = brcmf_usb_get_fwname,
|
||||
};
|
||||
|
||||
-static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo)
|
||||
-{
|
||||
- int ret;
|
||||
-
|
||||
- /* Attach to the common driver interface */
|
||||
- ret = brcmf_attach(devinfo->dev, devinfo->settings);
|
||||
- if (ret) {
|
||||
- brcmf_err("brcmf_attach failed\n");
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- ret = brcmf_bus_started(devinfo->dev);
|
||||
- if (ret)
|
||||
- goto fail;
|
||||
-
|
||||
- return 0;
|
||||
-fail:
|
||||
- brcmf_detach(devinfo->dev);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
static void brcmf_usb_probe_phase2(struct device *dev, int ret,
|
||||
const struct firmware *fw,
|
||||
void *nvram, u32 nvlen)
|
||||
@@ -1203,7 +1182,8 @@ static void brcmf_usb_probe_phase2(struc
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
- ret = brcmf_usb_bus_setup(devinfo);
|
||||
+ /* Attach to the common driver interface */
|
||||
+ ret = brcmf_attach(devinfo->dev, devinfo->settings);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
@@ -1253,7 +1233,7 @@ static int brcmf_usb_probe_cb(struct brc
|
||||
}
|
||||
|
||||
if (!brcmf_usb_dlneeded(devinfo)) {
|
||||
- ret = brcmf_usb_bus_setup(devinfo);
|
||||
+ ret = brcmf_attach(devinfo->dev, devinfo->settings);
|
||||
if (ret)
|
||||
goto fail;
|
||||
/* we are done */
|
||||
@@ -1456,7 +1436,7 @@ static int brcmf_usb_resume(struct usb_i
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
if (!devinfo->wowl_enabled)
|
||||
- return brcmf_usb_bus_setup(devinfo);
|
||||
+ return brcmf_attach(devinfo->dev, devinfo->settings);
|
||||
|
||||
devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
|
||||
brcmf_usb_rx_fill_all(devinfo);
|
||||
@@ -0,0 +1,64 @@
|
||||
From d678296bfb9a630d0000222fc21f4ed0d0d65332 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:24 +0100
|
||||
Subject: [PATCH] brcmfmac: change log level for some low-level sdio functions
|
||||
|
||||
Reducing the number of trace level messages in sdio code giving
|
||||
them sdio log level instead.
|
||||
|
||||
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 | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -1706,7 +1706,7 @@ brcmf_sdio_read_control(struct brcmf_sdi
|
||||
u8 *buf = NULL, *rbuf;
|
||||
int sdret;
|
||||
|
||||
- brcmf_dbg(TRACE, "Enter\n");
|
||||
+ brcmf_dbg(SDIO, "Enter\n");
|
||||
if (bus->rxblen)
|
||||
buf = vzalloc(bus->rxblen);
|
||||
if (!buf)
|
||||
@@ -1809,7 +1809,7 @@ static uint brcmf_sdio_readframes(struct
|
||||
struct brcmf_sdio_hdrinfo *rd = &bus->cur_read, rd_new;
|
||||
u8 head_read = 0;
|
||||
|
||||
- brcmf_dbg(TRACE, "Enter\n");
|
||||
+ brcmf_dbg(SDIO, "Enter\n");
|
||||
|
||||
/* Not finished unless we encounter no more frames indication */
|
||||
bus->rxpending = true;
|
||||
@@ -2344,7 +2344,7 @@ static int brcmf_sdio_tx_ctrlframe(struc
|
||||
struct brcmf_sdio_hdrinfo hd_info = {0};
|
||||
int ret;
|
||||
|
||||
- brcmf_dbg(TRACE, "Enter\n");
|
||||
+ brcmf_dbg(SDIO, "Enter\n");
|
||||
|
||||
/* Back the pointer to make room for bus header */
|
||||
frame -= bus->tx_hdrlen;
|
||||
@@ -2520,7 +2520,7 @@ static void brcmf_sdio_dpc(struct brcmf_
|
||||
uint framecnt; /* Temporary counter of tx/rx frames */
|
||||
int err = 0;
|
||||
|
||||
- brcmf_dbg(TRACE, "Enter\n");
|
||||
+ brcmf_dbg(SDIO, "Enter\n");
|
||||
|
||||
sdio_claim_host(bus->sdiodev->func1);
|
||||
|
||||
@@ -2605,7 +2605,7 @@ static void brcmf_sdio_dpc(struct brcmf_
|
||||
|
||||
/* Would be active due to wake-wlan in gSPI */
|
||||
if (intstatus & I_CHIPACTIVE) {
|
||||
- brcmf_dbg(INFO, "Dongle reports CHIPACTIVE\n");
|
||||
+ brcmf_dbg(SDIO, "Dongle reports CHIPACTIVE\n");
|
||||
intstatus &= ~I_CHIPACTIVE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
From 2d6edad4b2da1991f74e7b02053eeb4a043b887f Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 20 Feb 2018 00:14:25 +0100
|
||||
Subject: [PATCH] brcmfmac: remove duplicate pointer variable from
|
||||
brcmf_sdio_firmware_callback()
|
||||
|
||||
In brcmf_sdio_firmware_callback() two pointer variables were used
|
||||
pointing to the same construct. Get rid of sdiodev variable.
|
||||
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 37 +++++++++++-----------
|
||||
1 file changed, 18 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4039,9 +4039,8 @@ static void brcmf_sdio_firmware_callback
|
||||
void *nvram, u32 nvram_len)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
- struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
|
||||
- struct brcmf_sdio *bus = sdiodev->bus;
|
||||
- struct brcmf_sdio_dev *sdiod = bus->sdiodev;
|
||||
+ struct brcmf_sdio_dev *sdiod = bus_if->bus_priv.sdio;
|
||||
+ struct brcmf_sdio *bus = sdiod->bus;
|
||||
struct brcmf_core *core = bus->sdio_core;
|
||||
u8 saveclk;
|
||||
|
||||
@@ -4061,7 +4060,7 @@ static void brcmf_sdio_firmware_callback
|
||||
bus->sdcnt.tickcnt = 0;
|
||||
brcmf_sdio_wd_timer(bus, true);
|
||||
|
||||
- sdio_claim_host(sdiodev->func1);
|
||||
+ sdio_claim_host(sdiod->func1);
|
||||
|
||||
/* Make sure backplane clock is on, needed to generate F2 interrupt */
|
||||
brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
|
||||
@@ -4069,9 +4068,9 @@ static void brcmf_sdio_firmware_callback
|
||||
goto release;
|
||||
|
||||
/* Force clocks on backplane to be sure F2 interrupt propagates */
|
||||
- saveclk = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, &err);
|
||||
+ saveclk = brcmf_sdiod_readb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR, &err);
|
||||
if (!err) {
|
||||
- brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
(saveclk | SBSDIO_FORCE_HT), &err);
|
||||
}
|
||||
if (err) {
|
||||
@@ -4083,7 +4082,7 @@ static void brcmf_sdio_firmware_callback
|
||||
brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailboxdata),
|
||||
SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, NULL);
|
||||
|
||||
- err = sdio_enable_func(sdiodev->func2);
|
||||
+ err = sdio_enable_func(sdiod->func2);
|
||||
|
||||
brcmf_dbg(INFO, "enable F2: err=%d\n", err);
|
||||
|
||||
@@ -4095,10 +4094,10 @@ static void brcmf_sdio_firmware_callback
|
||||
bus->hostintmask, NULL);
|
||||
|
||||
|
||||
- brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err);
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK, 8, &err);
|
||||
} else {
|
||||
/* Disable F2 again */
|
||||
- sdio_disable_func(sdiodev->func2);
|
||||
+ sdio_disable_func(sdiod->func2);
|
||||
goto release;
|
||||
}
|
||||
|
||||
@@ -4106,7 +4105,7 @@ static void brcmf_sdio_firmware_callback
|
||||
brcmf_sdio_sr_init(bus);
|
||||
} else {
|
||||
/* Restore previous clock setting */
|
||||
- brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
saveclk, &err);
|
||||
}
|
||||
|
||||
@@ -4114,7 +4113,7 @@ static void brcmf_sdio_firmware_callback
|
||||
/* Allow full data communication using DPC from now on. */
|
||||
brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
|
||||
|
||||
- err = brcmf_sdiod_intr_register(sdiodev);
|
||||
+ err = brcmf_sdiod_intr_register(sdiod);
|
||||
if (err != 0)
|
||||
brcmf_err("intr register failed:%d\n", err);
|
||||
}
|
||||
@@ -4123,16 +4122,16 @@ static void brcmf_sdio_firmware_callback
|
||||
if (err != 0)
|
||||
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
||||
|
||||
- sdio_release_host(sdiodev->func1);
|
||||
+ sdio_release_host(sdiod->func1);
|
||||
|
||||
/* Assign bus interface call back */
|
||||
- sdiodev->bus_if->dev = sdiodev->dev;
|
||||
- sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
- sdiodev->bus_if->chip = bus->ci->chip;
|
||||
- sdiodev->bus_if->chiprev = bus->ci->chiprev;
|
||||
+ sdiod->bus_if->dev = sdiod->dev;
|
||||
+ sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
+ sdiod->bus_if->chip = bus->ci->chip;
|
||||
+ sdiod->bus_if->chiprev = bus->ci->chiprev;
|
||||
|
||||
/* Attach to the common layer, reserve hdr space */
|
||||
- err = brcmf_attach(sdiodev->dev, sdiodev->settings);
|
||||
+ err = brcmf_attach(sdiod->dev, sdiod->settings);
|
||||
if (err != 0) {
|
||||
brcmf_err("brcmf_attach failed\n");
|
||||
goto fail;
|
||||
@@ -4142,10 +4141,10 @@ static void brcmf_sdio_firmware_callback
|
||||
return;
|
||||
|
||||
release:
|
||||
- sdio_release_host(sdiodev->func1);
|
||||
+ sdio_release_host(sdiod->func1);
|
||||
fail:
|
||||
brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err);
|
||||
- device_release_driver(&sdiodev->func2->dev);
|
||||
+ device_release_driver(&sdiod->func2->dev);
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
From 64d1519edc959f5b8f86a66a51c40971c215e4ec Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Berg <johannes.berg@intel.com>
|
||||
Date: Mon, 19 Feb 2018 13:30:45 +0100
|
||||
Subject: [PATCH] brcmfmac: reject too long PSK
|
||||
|
||||
nl80211 already allows specifying 48 bytes, but brcmfmac
|
||||
only supports 32. Reject keys that are too long.
|
||||
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.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
|
||||
@@ -5125,6 +5125,9 @@ static int brcmf_cfg80211_set_pmk(struct
|
||||
if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X))
|
||||
return -EINVAL;
|
||||
|
||||
+ if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN)
|
||||
+ return -ERANGE;
|
||||
+
|
||||
return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
From 1170f6d1be6a39e1a115a2c0f50923eb4ce2a7ec Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:20 +0100
|
||||
Subject: [PATCH] brcmfmac: do not convert linux error to firmware error string
|
||||
|
||||
In case of a linux error brcmf_fil_cmd_data() blurts an error message
|
||||
in which the error code is translated to an error string. However, it
|
||||
maps it to a firmware error string which should not happen. Simply
|
||||
print only the numeric error code and be done with 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/fwil.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
|
||||
@@ -124,8 +124,7 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
|
||||
data, len, &fwerr);
|
||||
|
||||
if (err) {
|
||||
- brcmf_dbg(FIL, "Failed: %s (%d)\n",
|
||||
- brcmf_fil_get_errstr((u32)(-err)), err);
|
||||
+ brcmf_dbg(FIL, "Failed: error=%d\n", err);
|
||||
} else if (fwerr < 0) {
|
||||
brcmf_dbg(FIL, "Firmware error: %s (%d)\n",
|
||||
brcmf_fil_get_errstr((u32)(-fwerr)), fwerr);
|
||||
@@ -0,0 +1,203 @@
|
||||
From 756a2b390874d274f2f615921318ef0856ff9313 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:21 +0100
|
||||
Subject: [PATCH] brcmfmac: use brcmf_chip_name() to store name in revinfo
|
||||
|
||||
The chip id can either be four or five digits. For the chip name either
|
||||
the hexadecimal value needs to be taken (four digits) or the decimal
|
||||
value (five digits). The function brcmf_chip_name() does this conversion
|
||||
so use it to store the name in driver revision info.
|
||||
|
||||
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/chip.c | 9 +++++----
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/chip.h | 3 ++-
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/common.c | 23 ++++++++++++++++------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 10 +---------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.h | 3 +--
|
||||
5 files changed, 26 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -464,12 +464,12 @@ static void brcmf_chip_ai_resetcore(stru
|
||||
ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL);
|
||||
}
|
||||
|
||||
-static char *brcmf_chip_name(uint chipid, char *buf, uint len)
|
||||
+char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
|
||||
{
|
||||
const char *fmt;
|
||||
|
||||
- fmt = ((chipid > 0xa000) || (chipid < 0x4000)) ? "%d" : "%x";
|
||||
- snprintf(buf, len, fmt, chipid);
|
||||
+ fmt = ((id > 0xa000) || (id < 0x4000)) ? "BCM%d/%u" : "BCM%x/%u";
|
||||
+ snprintf(buf, len, fmt, id, rev);
|
||||
return buf;
|
||||
}
|
||||
|
||||
@@ -924,7 +924,8 @@ static int brcmf_chip_recognition(struct
|
||||
ci->pub.chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT;
|
||||
socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT;
|
||||
|
||||
- brcmf_chip_name(ci->pub.chip, ci->pub.name, sizeof(ci->pub.name));
|
||||
+ brcmf_chip_name(ci->pub.chip, ci->pub.chiprev,
|
||||
+ ci->pub.name, sizeof(ci->pub.name));
|
||||
brcmf_dbg(INFO, "found %s chip: BCM%s, rev=%d\n",
|
||||
socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name,
|
||||
ci->pub.chiprev);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
|
||||
@@ -45,7 +45,7 @@ struct brcmf_chip {
|
||||
u32 rambase;
|
||||
u32 ramsize;
|
||||
u32 srsize;
|
||||
- char name[8];
|
||||
+ char name[12];
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -93,5 +93,6 @@ void brcmf_chip_resetcore(struct brcmf_c
|
||||
void brcmf_chip_set_passive(struct brcmf_chip *ci);
|
||||
bool brcmf_chip_set_active(struct brcmf_chip *ci, u32 rstvec);
|
||||
bool brcmf_chip_sr_capable(struct brcmf_chip *pub);
|
||||
+char *brcmf_chip_name(u32 chipid, u32 chiprev, char *buf, uint len);
|
||||
|
||||
#endif /* BRCMF_AXIDMP_H */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "common.h"
|
||||
#include "of.h"
|
||||
#include "firmware.h"
|
||||
+#include "chip.h"
|
||||
|
||||
MODULE_AUTHOR("Broadcom Corporation");
|
||||
MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
|
||||
@@ -131,14 +132,13 @@ static int brcmf_c_download(struct brcmf
|
||||
static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name)
|
||||
{
|
||||
struct brcmf_bus *bus = ifp->drvr->bus_if;
|
||||
- struct brcmf_rev_info *ri = &ifp->drvr->revinfo;
|
||||
u8 fw_name[BRCMF_FW_NAME_LEN];
|
||||
u8 *ptr;
|
||||
size_t len;
|
||||
s32 err;
|
||||
|
||||
memset(fw_name, 0, BRCMF_FW_NAME_LEN);
|
||||
- err = brcmf_bus_get_fwname(bus, ri->chipnum, ri->chiprev, fw_name);
|
||||
+ err = brcmf_bus_get_fwname(bus, bus->chip, bus->chiprev, fw_name);
|
||||
if (err) {
|
||||
brcmf_err("get firmware name failed (%d)\n", err);
|
||||
goto done;
|
||||
@@ -238,6 +238,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
{
|
||||
s8 eventmask[BRCMF_EVENTING_MASK_LEN];
|
||||
u8 buf[BRCMF_DCMD_SMLEN];
|
||||
+ struct brcmf_bus *bus;
|
||||
struct brcmf_rev_info_le revinfo;
|
||||
struct brcmf_rev_info *ri;
|
||||
char *clmver;
|
||||
@@ -253,16 +254,18 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
}
|
||||
memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
|
||||
|
||||
+ bus = ifp->drvr->bus_if;
|
||||
+ ri = &ifp->drvr->revinfo;
|
||||
+
|
||||
err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_REVINFO,
|
||||
&revinfo, sizeof(revinfo));
|
||||
- ri = &ifp->drvr->revinfo;
|
||||
if (err < 0) {
|
||||
brcmf_err("retrieving revision info failed, %d\n", err);
|
||||
+ strlcpy(ri->chipname, "UNKNOWN", sizeof(ri->chipname));
|
||||
} else {
|
||||
ri->vendorid = le32_to_cpu(revinfo.vendorid);
|
||||
ri->deviceid = le32_to_cpu(revinfo.deviceid);
|
||||
ri->radiorev = le32_to_cpu(revinfo.radiorev);
|
||||
- ri->chiprev = le32_to_cpu(revinfo.chiprev);
|
||||
ri->corerev = le32_to_cpu(revinfo.corerev);
|
||||
ri->boardid = le32_to_cpu(revinfo.boardid);
|
||||
ri->boardvendor = le32_to_cpu(revinfo.boardvendor);
|
||||
@@ -270,15 +273,23 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
ri->driverrev = le32_to_cpu(revinfo.driverrev);
|
||||
ri->ucoderev = le32_to_cpu(revinfo.ucoderev);
|
||||
ri->bus = le32_to_cpu(revinfo.bus);
|
||||
- ri->chipnum = le32_to_cpu(revinfo.chipnum);
|
||||
ri->phytype = le32_to_cpu(revinfo.phytype);
|
||||
ri->phyrev = le32_to_cpu(revinfo.phyrev);
|
||||
ri->anarev = le32_to_cpu(revinfo.anarev);
|
||||
ri->chippkg = le32_to_cpu(revinfo.chippkg);
|
||||
ri->nvramrev = le32_to_cpu(revinfo.nvramrev);
|
||||
+
|
||||
+ if (!bus->chip) {
|
||||
+ bus->chip = le32_to_cpu(revinfo.chipnum);
|
||||
+ bus->chiprev = le32_to_cpu(revinfo.chiprev);
|
||||
+ }
|
||||
}
|
||||
ri->result = err;
|
||||
|
||||
+ if (bus->chip)
|
||||
+ brcmf_chip_name(bus->chip, bus->chiprev,
|
||||
+ ri->chipname, sizeof(ri->chipname));
|
||||
+
|
||||
/* Do any CLM downloading */
|
||||
err = brcmf_c_process_clm_blob(ifp);
|
||||
if (err < 0) {
|
||||
@@ -299,7 +310,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
strsep(&ptr, "\n");
|
||||
|
||||
/* Print fw version info */
|
||||
- brcmf_info("Firmware version = %s\n", buf);
|
||||
+ brcmf_info("Firmware: %s %s\n", ri->chipname, buf);
|
||||
|
||||
/* locate firmware version number for ethtool */
|
||||
ptr = strrchr(buf, ' ') + 1;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1002,8 +1002,7 @@ static int brcmf_revinfo_read(struct seq
|
||||
seq_printf(s, "vendorid: 0x%04x\n", ri->vendorid);
|
||||
seq_printf(s, "deviceid: 0x%04x\n", ri->deviceid);
|
||||
seq_printf(s, "radiorev: %s\n", brcmu_dotrev_str(ri->radiorev, drev));
|
||||
- seq_printf(s, "chipnum: %u (%x)\n", ri->chipnum, ri->chipnum);
|
||||
- seq_printf(s, "chiprev: %u\n", ri->chiprev);
|
||||
+ seq_printf(s, "chip: %s\n", ri->chipname);
|
||||
seq_printf(s, "chippkg: %u\n", ri->chippkg);
|
||||
seq_printf(s, "corerev: %u\n", ri->corerev);
|
||||
seq_printf(s, "boardid: 0x%04x\n", ri->boardid);
|
||||
@@ -1053,13 +1052,6 @@ static int brcmf_bus_started(struct brcm
|
||||
|
||||
brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
|
||||
|
||||
- /* assure we have chipid before feature attach */
|
||||
- if (!bus_if->chip) {
|
||||
- bus_if->chip = drvr->revinfo.chipnum;
|
||||
- bus_if->chiprev = drvr->revinfo.chiprev;
|
||||
- brcmf_dbg(INFO, "firmware revinfo: chip %x (%d) rev %d\n",
|
||||
- bus_if->chip, bus_if->chip, bus_if->chiprev);
|
||||
- }
|
||||
brcmf_feat_attach(drvr);
|
||||
|
||||
ret = brcmf_proto_init_done(drvr);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -87,7 +87,6 @@ struct brcmf_rev_info {
|
||||
u32 vendorid;
|
||||
u32 deviceid;
|
||||
u32 radiorev;
|
||||
- u32 chiprev;
|
||||
u32 corerev;
|
||||
u32 boardid;
|
||||
u32 boardvendor;
|
||||
@@ -95,7 +94,7 @@ struct brcmf_rev_info {
|
||||
u32 driverrev;
|
||||
u32 ucoderev;
|
||||
u32 bus;
|
||||
- u32 chipnum;
|
||||
+ char chipname[12];
|
||||
u32 phytype;
|
||||
u32 phyrev;
|
||||
u32 anarev;
|
||||
@@ -0,0 +1,69 @@
|
||||
From c88cfa075de356ddf40c668896b2126340f19ba4 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:22 +0100
|
||||
Subject: [PATCH] brcmfmac: use brcmf_chip_name() for consistency
|
||||
|
||||
When logging the chip id/revision information make use of
|
||||
brcmf_chip_name() so it is always the same.
|
||||
|
||||
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/chip.c | 5 ++---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 7 +++++--
|
||||
2 files changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -926,9 +926,8 @@ static int brcmf_chip_recognition(struct
|
||||
|
||||
brcmf_chip_name(ci->pub.chip, ci->pub.chiprev,
|
||||
ci->pub.name, sizeof(ci->pub.name));
|
||||
- brcmf_dbg(INFO, "found %s chip: BCM%s, rev=%d\n",
|
||||
- socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name,
|
||||
- ci->pub.chiprev);
|
||||
+ brcmf_dbg(INFO, "found %s chip: %s\n",
|
||||
+ socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name);
|
||||
|
||||
if (socitype == SOCI_SB) {
|
||||
if (ci->pub.chip != BRCM_CC_4329_CHIP_ID) {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "firmware.h"
|
||||
#include "core.h"
|
||||
#include "common.h"
|
||||
+#include "chip.h"
|
||||
|
||||
#define BRCMF_FW_MAX_NVRAM_SIZE 64000
|
||||
#define BRCMF_FW_NVRAM_DEVPATH_LEN 19 /* devpath0=pcie/1/4/ */
|
||||
@@ -567,6 +568,7 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
|
||||
char nvram_name[BRCMF_FW_NAME_LEN])
|
||||
{
|
||||
+ char chipname[12];
|
||||
u32 i;
|
||||
char end;
|
||||
|
||||
@@ -581,6 +583,8 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
+ brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
|
||||
+
|
||||
/* 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,
|
||||
@@ -601,8 +605,7 @@ 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);
|
||||
+ brcmf_info("using %s for chip %s\n", fw_name, chipname);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,452 @@
|
||||
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
|
||||
@@ -462,7 +462,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
|
||||
@@ -753,7 +753,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;
|
||||
@@ -786,7 +786,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))
|
||||
@@ -831,7 +831,7 @@ brcmf_cfg80211_change_iface(struct wiphy
|
||||
enum nl80211_iftype type,
|
||||
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;
|
||||
@@ -2127,17 +2127,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;
|
||||
@@ -3359,7 +3357,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);
|
||||
@@ -5191,6 +5189,12 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.del_pmk = brcmf_cfg80211_del_pmk,
|
||||
};
|
||||
|
||||
+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)
|
||||
{
|
||||
@@ -5898,7 +5902,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;
|
||||
@@ -6013,7 +6017,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;
|
||||
@@ -6198,10 +6202,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 };
|
||||
@@ -6795,8 +6799,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;
|
||||
@@ -6831,7 +6835,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)
|
||||
@@ -6858,17 +6862,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;
|
||||
@@ -6880,26 +6882,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);
|
||||
@@ -6908,6 +6897,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;
|
||||
@@ -6934,6 +6924,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;
|
||||
@@ -6947,13 +6942,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;
|
||||
@@ -6970,12 +6969,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);
|
||||
@@ -7043,8 +7037,7 @@ priv_out:
|
||||
ifp->vif = NULL;
|
||||
wiphy_out:
|
||||
brcmf_free_wiphy(wiphy);
|
||||
-ops_out:
|
||||
- kfree(ops);
|
||||
+ kfree(cfg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -7059,4 +7052,5 @@ void brcmf_cfg80211_detach(struct brcmf_
|
||||
kfree(cfg->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
|
||||
@@ -355,20 +355,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)
|
||||
@@ -395,11 +399,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
|
||||
@@ -252,6 +252,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));
|
||||
|
||||
bus = ifp->drvr->bus_if;
|
||||
@@ -279,6 +280,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
ri->chippkg = le32_to_cpu(revinfo.chippkg);
|
||||
ri->nvramrev = le32_to_cpu(revinfo.nvramrev);
|
||||
|
||||
+ /* use revinfo if not known yet */
|
||||
if (!bus->chip) {
|
||||
bus->chip = le32_to_cpu(revinfo.chipnum);
|
||||
bus->chiprev = le32_to_cpu(revinfo.chiprev);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1021,7 +1021,7 @@ static int brcmf_revinfo_read(struct seq
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int brcmf_bus_started(struct brcmf_pub *drvr)
|
||||
+static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
|
||||
{
|
||||
int ret = -1;
|
||||
struct brcmf_bus *bus_if = drvr->bus_if;
|
||||
@@ -1060,7 +1060,7 @@ static int brcmf_bus_started(struct brcm
|
||||
|
||||
brcmf_proto_add_if(drvr, ifp);
|
||||
|
||||
- drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
|
||||
+ drvr->config = brcmf_cfg80211_attach(drvr, ops,
|
||||
drvr->settings->p2p_enable);
|
||||
if (drvr->config == NULL) {
|
||||
ret = -ENOMEM;
|
||||
@@ -1115,17 +1115,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;
|
||||
|
||||
@@ -1154,15 +1163,18 @@ int brcmf_attach(struct device *dev, str
|
||||
/* attach firmware event handler */
|
||||
brcmf_fweh_attach(drvr);
|
||||
|
||||
- ret = brcmf_bus_started(drvr);
|
||||
+ ret = brcmf_bus_started(drvr, ops);
|
||||
if (ret != 0) {
|
||||
brcmf_err("dongle is not responding: err=%d\n", ret);
|
||||
goto fail;
|
||||
}
|
||||
+
|
||||
+ drvr->config->ops = ops;
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
brcmf_detach(dev);
|
||||
+ kfree(ops);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1220,6 +1232,7 @@ void brcmf_detach(struct device *dev)
|
||||
brcmf_remove_interface(drvr->iflist[i], false);
|
||||
|
||||
brcmf_cfg80211_detach(drvr->config);
|
||||
+ drvr->config = NULL;
|
||||
|
||||
brcmf_bus_stop(drvr->bus_if);
|
||||
|
||||
@@ -1227,7 +1240,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
|
||||
@@ -107,6 +107,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 */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -2229,7 +2229,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;
|
||||
@@ -0,0 +1,349 @@
|
||||
From 34789d0cf682c643862792750a06c31ccf016cbc Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:24 +0100
|
||||
Subject: [PATCH] brcmfmac: use wiphy debugfs dir entry
|
||||
|
||||
The driver used to create a brcmfmac dir entry at the top level
|
||||
debugfs mount point. This moves the debugfs entries into the
|
||||
wiphy debugfs dir entry.
|
||||
|
||||
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/bcdc.c | 6 ++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/common.c | 5 ---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 11 +++---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/debug.c | 42 ++--------------------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/debug.h | 17 ---------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/feature.c | 3 ++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/feature.h | 7 ++++
|
||||
.../broadcom/brcm80211/brcmfmac/fwsignal.c | 11 +++---
|
||||
.../broadcom/brcm80211/brcmfmac/fwsignal.h | 1 +
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 8 +++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/proto.c | 3 +-
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/proto.h | 7 ++++
|
||||
12 files changed, 47 insertions(+), 74 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
|
||||
@@ -445,6 +445,11 @@ brcmf_proto_bcdc_init_done(struct brcmf_
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void brcmf_proto_bcdc_debugfs_create(struct brcmf_pub *drvr)
|
||||
+{
|
||||
+ brcmf_fws_debugfs_create(drvr);
|
||||
+}
|
||||
+
|
||||
int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
|
||||
{
|
||||
struct brcmf_bcdc *bcdc;
|
||||
@@ -472,6 +477,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
|
||||
drvr->proto->del_if = brcmf_proto_bcdc_del_if;
|
||||
drvr->proto->reset_if = brcmf_proto_bcdc_reset_if;
|
||||
drvr->proto->init_done = brcmf_proto_bcdc_init_done;
|
||||
+ drvr->proto->debugfs_create = brcmf_proto_bcdc_debugfs_create;
|
||||
drvr->proto->pd = bcdc;
|
||||
|
||||
drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -529,9 +529,6 @@ static int __init brcmfmac_module_init(v
|
||||
{
|
||||
int err;
|
||||
|
||||
- /* Initialize debug system first */
|
||||
- brcmf_debugfs_init();
|
||||
-
|
||||
/* Get the platform data (if available) for our devices */
|
||||
err = platform_driver_probe(&brcmf_pd, brcmf_common_pd_probe);
|
||||
if (err == -ENODEV)
|
||||
@@ -543,7 +540,6 @@ static int __init brcmfmac_module_init(v
|
||||
/* Continue the initialization by registering the different busses */
|
||||
err = brcmf_core_init();
|
||||
if (err) {
|
||||
- brcmf_debugfs_exit();
|
||||
if (brcmfmac_pdata)
|
||||
platform_driver_unregister(&brcmf_pd);
|
||||
}
|
||||
@@ -556,7 +552,6 @@ static void __exit brcmfmac_module_exit(
|
||||
brcmf_core_exit();
|
||||
if (brcmfmac_pdata)
|
||||
platform_driver_unregister(&brcmf_pd);
|
||||
- brcmf_debugfs_exit();
|
||||
}
|
||||
|
||||
module_init(brcmfmac_module_init);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1050,8 +1050,6 @@ static int brcmf_bus_started(struct brcm
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
- brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
|
||||
-
|
||||
brcmf_feat_attach(drvr);
|
||||
|
||||
ret = brcmf_proto_init_done(drvr);
|
||||
@@ -1094,6 +1092,11 @@ static int brcmf_bus_started(struct brcm
|
||||
#endif
|
||||
#endif /* CONFIG_INET */
|
||||
|
||||
+ /* populate debugfs */
|
||||
+ brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
|
||||
+ brcmf_feat_debugfs_create(drvr);
|
||||
+ brcmf_proto_debugfs_create(drvr);
|
||||
+
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@@ -1146,9 +1149,6 @@ int brcmf_attach(struct device *dev, str
|
||||
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) {
|
||||
@@ -1238,7 +1238,6 @@ void brcmf_detach(struct device *dev)
|
||||
|
||||
brcmf_proto_detach(drvr);
|
||||
|
||||
- brcmf_debug_detach(drvr);
|
||||
bus_if->drvr = NULL;
|
||||
wiphy_free(drvr->wiphy);
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
|
||||
@@ -25,8 +25,6 @@
|
||||
#include "fweh.h"
|
||||
#include "debug.h"
|
||||
|
||||
-static struct dentry *root_folder;
|
||||
-
|
||||
int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
size_t len)
|
||||
{
|
||||
@@ -54,44 +52,9 @@ int brcmf_debug_create_memdump(struct br
|
||||
return 0;
|
||||
}
|
||||
|
||||
-void brcmf_debugfs_init(void)
|
||||
-{
|
||||
- root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
|
||||
- if (IS_ERR(root_folder))
|
||||
- root_folder = NULL;
|
||||
-}
|
||||
-
|
||||
-void brcmf_debugfs_exit(void)
|
||||
-{
|
||||
- if (!root_folder)
|
||||
- return;
|
||||
-
|
||||
- debugfs_remove_recursive(root_folder);
|
||||
- root_folder = NULL;
|
||||
-}
|
||||
-
|
||||
-int brcmf_debug_attach(struct brcmf_pub *drvr)
|
||||
-{
|
||||
- struct device *dev = drvr->bus_if->dev;
|
||||
-
|
||||
- if (!root_folder)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
|
||||
- return PTR_ERR_OR_ZERO(drvr->dbgfs_dir);
|
||||
-}
|
||||
-
|
||||
-void brcmf_debug_detach(struct brcmf_pub *drvr)
|
||||
-{
|
||||
- brcmf_fweh_unregister(drvr, BRCMF_E_PSM_WATCHDOG);
|
||||
-
|
||||
- if (!IS_ERR_OR_NULL(drvr->dbgfs_dir))
|
||||
- debugfs_remove_recursive(drvr->dbgfs_dir);
|
||||
-}
|
||||
-
|
||||
struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
|
||||
{
|
||||
- return drvr->dbgfs_dir;
|
||||
+ return drvr->wiphy->debugfsdir;
|
||||
}
|
||||
|
||||
int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
|
||||
@@ -99,7 +62,8 @@ int brcmf_debugfs_add_entry(struct brcmf
|
||||
{
|
||||
struct dentry *e;
|
||||
|
||||
+ WARN(!drvr->wiphy->debugfsdir, "wiphy not (yet) registered\n");
|
||||
e = debugfs_create_devm_seqfile(drvr->bus_if->dev, fn,
|
||||
- drvr->dbgfs_dir, read_fn);
|
||||
+ drvr->wiphy->debugfsdir, read_fn);
|
||||
return PTR_ERR_OR_ZERO(e);
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -113,29 +113,12 @@ extern int brcmf_msg_level;
|
||||
struct brcmf_bus;
|
||||
struct brcmf_pub;
|
||||
#ifdef DEBUG
|
||||
-void brcmf_debugfs_init(void);
|
||||
-void brcmf_debugfs_exit(void);
|
||||
-int brcmf_debug_attach(struct brcmf_pub *drvr);
|
||||
-void brcmf_debug_detach(struct brcmf_pub *drvr);
|
||||
struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
|
||||
int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
|
||||
int (*read_fn)(struct seq_file *seq, void *data));
|
||||
int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
|
||||
size_t len);
|
||||
#else
|
||||
-static inline void brcmf_debugfs_init(void)
|
||||
-{
|
||||
-}
|
||||
-static inline void brcmf_debugfs_exit(void)
|
||||
-{
|
||||
-}
|
||||
-static inline int brcmf_debug_attach(struct brcmf_pub *drvr)
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-static inline void brcmf_debug_detach(struct brcmf_pub *drvr)
|
||||
-{
|
||||
-}
|
||||
static inline
|
||||
int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
|
||||
int (*read_fn)(struct seq_file *seq, void *data))
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -228,7 +228,10 @@ void brcmf_feat_attach(struct brcmf_pub
|
||||
/* no quirks */
|
||||
break;
|
||||
}
|
||||
+}
|
||||
|
||||
+void brcmf_feat_debugfs_create(struct brcmf_pub *drvr)
|
||||
+{
|
||||
brcmf_debugfs_add_entry(drvr, "features", brcmf_feat_debugfs_read);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -90,6 +90,13 @@ enum brcmf_feat_quirk {
|
||||
void brcmf_feat_attach(struct brcmf_pub *drvr);
|
||||
|
||||
/**
|
||||
+ * brcmf_feat_debugfs_create() - create debugfs entries.
|
||||
+ *
|
||||
+ * @drvr: driver instance.
|
||||
+ */
|
||||
+void brcmf_feat_debugfs_create(struct brcmf_pub *drvr);
|
||||
+
|
||||
+/**
|
||||
* brcmf_feat_is_enabled() - query feature.
|
||||
*
|
||||
* @ifp: interface instance.
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
@@ -2399,10 +2399,6 @@ struct brcmf_fws_info *brcmf_fws_attach(
|
||||
brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT,
|
||||
BRCMF_FWS_PSQ_LEN);
|
||||
|
||||
- /* create debugfs file for statistics */
|
||||
- brcmf_debugfs_add_entry(drvr, "fws_stats",
|
||||
- brcmf_debugfs_fws_stats_read);
|
||||
-
|
||||
brcmf_dbg(INFO, "%s bdcv2 tlv signaling [%x]\n",
|
||||
fws->fw_signals ? "enabled" : "disabled", tlv);
|
||||
return fws;
|
||||
@@ -2429,6 +2425,13 @@ void brcmf_fws_detach(struct brcmf_fws_i
|
||||
kfree(fws);
|
||||
}
|
||||
|
||||
+void brcmf_fws_debugfs_create(struct brcmf_pub *drvr)
|
||||
+{
|
||||
+ /* create debugfs file for statistics */
|
||||
+ brcmf_debugfs_add_entry(drvr, "fws_stats",
|
||||
+ brcmf_debugfs_fws_stats_read);
|
||||
+}
|
||||
+
|
||||
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws)
|
||||
{
|
||||
return !fws->avoid_queueing;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
|
||||
void brcmf_fws_detach(struct brcmf_fws_info *fws);
|
||||
+void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
|
||||
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
|
||||
bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
|
||||
void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -1418,6 +1418,11 @@ static int brcmf_msgbuf_stats_read(struc
|
||||
}
|
||||
#endif
|
||||
|
||||
+static void brcmf_msgbuf_debugfs_create(struct brcmf_pub *drvr)
|
||||
+{
|
||||
+ brcmf_debugfs_add_entry(drvr, "msgbuf_stats", brcmf_msgbuf_stats_read);
|
||||
+}
|
||||
+
|
||||
int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
|
||||
{
|
||||
struct brcmf_bus_msgbuf *if_msgbuf;
|
||||
@@ -1472,6 +1477,7 @@ int brcmf_proto_msgbuf_attach(struct brc
|
||||
drvr->proto->delete_peer = brcmf_msgbuf_delete_peer;
|
||||
drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer;
|
||||
drvr->proto->rxreorder = brcmf_msgbuf_rxreorder;
|
||||
+ drvr->proto->debugfs_create = brcmf_msgbuf_debugfs_create;
|
||||
drvr->proto->pd = msgbuf;
|
||||
|
||||
init_waitqueue_head(&msgbuf->ioctl_resp_wait);
|
||||
@@ -1525,8 +1531,6 @@ int brcmf_proto_msgbuf_attach(struct brc
|
||||
spin_lock_init(&msgbuf->flowring_work_lock);
|
||||
INIT_LIST_HEAD(&msgbuf->work_queue);
|
||||
|
||||
- brcmf_debugfs_add_entry(drvr, "msgbuf_stats", brcmf_msgbuf_stats_read);
|
||||
-
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
|
||||
@@ -54,7 +54,8 @@ int brcmf_proto_attach(struct brcmf_pub
|
||||
if (!proto->tx_queue_data || (proto->hdrpull == NULL) ||
|
||||
(proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) ||
|
||||
(proto->configure_addr_mode == NULL) ||
|
||||
- (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) {
|
||||
+ (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL) ||
|
||||
+ (proto->debugfs_create == NULL)) {
|
||||
brcmf_err("Not all proto handlers have been installed\n");
|
||||
goto fail;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
|
||||
@@ -48,6 +48,7 @@ struct brcmf_proto {
|
||||
void (*del_if)(struct brcmf_if *ifp);
|
||||
void (*reset_if)(struct brcmf_if *ifp);
|
||||
int (*init_done)(struct brcmf_pub *drvr);
|
||||
+ void (*debugfs_create)(struct brcmf_pub *drvr);
|
||||
void *pd;
|
||||
};
|
||||
|
||||
@@ -156,4 +157,10 @@ brcmf_proto_init_done(struct brcmf_pub *
|
||||
return drvr->proto->init_done(drvr);
|
||||
}
|
||||
|
||||
+static inline void
|
||||
+brcmf_proto_debugfs_create(struct brcmf_pub *drvr)
|
||||
+{
|
||||
+ drvr->proto->debugfs_create(drvr);
|
||||
+}
|
||||
+
|
||||
#endif /* BRCMFMAC_PROTO_H */
|
||||
@@ -0,0 +1,286 @@
|
||||
From 41f573dbb534f14e62a4a5411f602c970cad1d77 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:25 +0100
|
||||
Subject: [PATCH] brcmfmac: derive firmware filenames from basename mapping
|
||||
|
||||
Instead of defining individual filenames for firmware and nvram
|
||||
use a basename and derive the names from that.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 31 ++++++---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.h | 24 ++-----
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 56 ++++++++---------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 73 +++++++++++-----------
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 10 +--
|
||||
5 files changed, 96 insertions(+), 98 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -563,6 +563,13 @@ int brcmf_fw_get_firmwares(struct device
|
||||
0);
|
||||
}
|
||||
|
||||
+static void brcmf_fw_get_full_name(char fw_name[BRCMF_FW_NAME_LEN],
|
||||
+ const char *fw_base, const char *extension)
|
||||
+{
|
||||
+ strlcat(fw_name, fw_base, BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(fw_name, extension, BRCMF_FW_NAME_LEN);
|
||||
+}
|
||||
+
|
||||
int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
|
||||
struct brcmf_firmware_mapping mapping_table[],
|
||||
u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
|
||||
@@ -587,25 +594,31 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
|
||||
/* 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,
|
||||
- BRCMF_FW_NAME_LEN);
|
||||
- if ((nvram_name) && (mapping_table[i].nvram))
|
||||
+ if (fw_name)
|
||||
+ strlcpy(fw_name, brcmf_mp_global.firmware_path,
|
||||
+ BRCMF_FW_NAME_LEN);
|
||||
+ if (nvram_name)
|
||||
strlcpy(nvram_name, brcmf_mp_global.firmware_path,
|
||||
BRCMF_FW_NAME_LEN);
|
||||
|
||||
end = brcmf_mp_global.firmware_path[
|
||||
strlen(brcmf_mp_global.firmware_path) - 1];
|
||||
if (end != '/') {
|
||||
- strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
|
||||
- if ((nvram_name) && (mapping_table[i].nvram))
|
||||
+ if (fw_name)
|
||||
+ strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
|
||||
+ if (nvram_name)
|
||||
strlcat(nvram_name, "/", BRCMF_FW_NAME_LEN);
|
||||
}
|
||||
}
|
||||
- strlcat(fw_name, mapping_table[i].fw, BRCMF_FW_NAME_LEN);
|
||||
- if ((nvram_name) && (mapping_table[i].nvram))
|
||||
- strlcat(nvram_name, mapping_table[i].nvram, BRCMF_FW_NAME_LEN);
|
||||
|
||||
- brcmf_info("using %s for chip %s\n", fw_name, chipname);
|
||||
+ brcmf_info("using %s for chip %s\n",
|
||||
+ mapping_table[i].fw_base, chipname);
|
||||
+ if (fw_name)
|
||||
+ brcmf_fw_get_full_name(fw_name,
|
||||
+ mapping_table[i].fw_base, ".bin");
|
||||
+ if (nvram_name)
|
||||
+ brcmf_fw_get_full_name(nvram_name,
|
||||
+ mapping_table[i].fw_base, ".txt");
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -38,28 +38,16 @@
|
||||
struct brcmf_firmware_mapping {
|
||||
u32 chipid;
|
||||
u32 revmask;
|
||||
- const char *fw;
|
||||
- const char *nvram;
|
||||
+ const char *fw_base;
|
||||
};
|
||||
|
||||
-#define BRCMF_FW_NVRAM_DEF(fw_nvram_name, fw, nvram) \
|
||||
-static const char BRCM_ ## fw_nvram_name ## _FIRMWARE_NAME[] = \
|
||||
- BRCMF_FW_DEFAULT_PATH fw; \
|
||||
-static const char BRCM_ ## fw_nvram_name ## _NVRAM_NAME[] = \
|
||||
- BRCMF_FW_DEFAULT_PATH nvram; \
|
||||
-MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw);
|
||||
-
|
||||
-#define BRCMF_FW_DEF(fw_name, fw) \
|
||||
-static const char BRCM_ ## fw_name ## _FIRMWARE_NAME[] = \
|
||||
- BRCMF_FW_DEFAULT_PATH fw; \
|
||||
-MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw) \
|
||||
-
|
||||
-#define BRCMF_FW_NVRAM_ENTRY(chipid, mask, name) \
|
||||
- { chipid, mask, \
|
||||
- BRCM_ ## name ## _FIRMWARE_NAME, BRCM_ ## name ## _NVRAM_NAME }
|
||||
+#define BRCMF_FW_DEF(fw_name, fw_base) \
|
||||
+static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
|
||||
+ BRCMF_FW_DEFAULT_PATH fw_base; \
|
||||
+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".bin")
|
||||
|
||||
#define BRCMF_FW_ENTRY(chipid, mask, name) \
|
||||
- { chipid, mask, BRCM_ ## name ## _FIRMWARE_NAME, NULL }
|
||||
+ { chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME }
|
||||
|
||||
int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
|
||||
struct brcmf_firmware_mapping mapping_table[],
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -46,36 +46,36 @@ enum brcmf_pcie_state {
|
||||
BRCMFMAC_PCIE_STATE_UP
|
||||
};
|
||||
|
||||
-BRCMF_FW_NVRAM_DEF(43602, "brcmfmac43602-pcie.bin", "brcmfmac43602-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4350, "brcmfmac4350-pcie.bin", "brcmfmac4350-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4350C, "brcmfmac4350c2-pcie.bin", "brcmfmac4350c2-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-pcie.bin", "brcmfmac4356-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43570, "brcmfmac43570-pcie.bin", "brcmfmac43570-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4358, "brcmfmac4358-pcie.bin", "brcmfmac4358-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4359, "brcmfmac4359-pcie.bin", "brcmfmac4359-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4365B, "brcmfmac4365b-pcie.bin", "brcmfmac4365b-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4365C, "brcmfmac4365c-pcie.bin", "brcmfmac4365c-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4366B, "brcmfmac4366b-pcie.bin", "brcmfmac4366b-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4366C, "brcmfmac4366c-pcie.bin", "brcmfmac4366c-pcie.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4371, "brcmfmac4371-pcie.bin", "brcmfmac4371-pcie.txt");
|
||||
+BRCMF_FW_DEF(43602, "brcmfmac43602-pcie");
|
||||
+BRCMF_FW_DEF(4350, "brcmfmac4350-pcie");
|
||||
+BRCMF_FW_DEF(4350C, "brcmfmac4350c2-pcie");
|
||||
+BRCMF_FW_DEF(4356, "brcmfmac4356-pcie");
|
||||
+BRCMF_FW_DEF(43570, "brcmfmac43570-pcie");
|
||||
+BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
|
||||
+BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
|
||||
+BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
|
||||
+BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
|
||||
+BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
|
||||
+BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
|
||||
+BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
|
||||
|
||||
static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFF00, 4350),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43525_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFF00, 4350),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43525_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
};
|
||||
|
||||
#define BRCMF_PCIE_FW_UP_TIMEOUT 2000 /* msec */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -600,47 +600,44 @@ static const struct sdiod_drive_str sdio
|
||||
{4, 0x1}
|
||||
};
|
||||
|
||||
-BRCMF_FW_NVRAM_DEF(43143, "brcmfmac43143-sdio.bin", "brcmfmac43143-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43241B0, "brcmfmac43241b0-sdio.bin",
|
||||
- "brcmfmac43241b0-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43241B4, "brcmfmac43241b4-sdio.bin",
|
||||
- "brcmfmac43241b4-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43241B5, "brcmfmac43241b5-sdio.bin",
|
||||
- "brcmfmac43241b5-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4329, "brcmfmac4329-sdio.bin", "brcmfmac4329-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4330, "brcmfmac4330-sdio.bin", "brcmfmac4330-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4334, "brcmfmac4334-sdio.bin", "brcmfmac4334-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43340, "brcmfmac43340-sdio.bin", "brcmfmac43340-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4335, "brcmfmac4335-sdio.bin", "brcmfmac4335-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43362, "brcmfmac43362-sdio.bin", "brcmfmac43362-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(4339, "brcmfmac4339-sdio.bin", "brcmfmac4339-sdio.txt");
|
||||
-BRCMF_FW_NVRAM_DEF(43430A0, "brcmfmac43430a0-sdio.bin", "brcmfmac43430a0-sdio.txt");
|
||||
+BRCMF_FW_DEF(43143, "brcmfmac43143-sdio");
|
||||
+BRCMF_FW_DEF(43241B0, "brcmfmac43241b0-sdio");
|
||||
+BRCMF_FW_DEF(43241B4, "brcmfmac43241b4-sdio");
|
||||
+BRCMF_FW_DEF(43241B5, "brcmfmac43241b5-sdio");
|
||||
+BRCMF_FW_DEF(4329, "brcmfmac4329-sdio");
|
||||
+BRCMF_FW_DEF(4330, "brcmfmac4330-sdio");
|
||||
+BRCMF_FW_DEF(4334, "brcmfmac4334-sdio");
|
||||
+BRCMF_FW_DEF(43340, "brcmfmac43340-sdio");
|
||||
+BRCMF_FW_DEF(4335, "brcmfmac4335-sdio");
|
||||
+BRCMF_FW_DEF(43362, "brcmfmac43362-sdio");
|
||||
+BRCMF_FW_DEF(4339, "brcmfmac4339-sdio");
|
||||
+BRCMF_FW_DEF(43430A0, "brcmfmac43430a0-sdio");
|
||||
/* 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");
|
||||
-BRCMF_FW_NVRAM_DEF(4373, "brcmfmac4373-sdio.bin", "brcmfmac4373-sdio.txt");
|
||||
+BRCMF_FW_DEF(43430A1, "brcmfmac43430-sdio");
|
||||
+BRCMF_FW_DEF(43455, "brcmfmac43455-sdio");
|
||||
+BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
|
||||
+BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
|
||||
+BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
|
||||
|
||||
static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, 43241B5),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, 4329),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43341_CHIP_ID, 0xFFFFFFFF, 43340),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
|
||||
- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
|
||||
- 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),
|
||||
- BRCMF_FW_NVRAM_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, 43241B5),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, 4329),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43341_CHIP_ID, 0xFFFFFFFF, 43340),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0x00000001, 43430A0),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
+ BRCMF_FW_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
|
||||
@@ -46,11 +46,11 @@
|
||||
#define BRCMF_USB_CBCTL_READ 1
|
||||
#define BRCMF_USB_MAX_PKT_SIZE 1600
|
||||
|
||||
-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");
|
||||
+BRCMF_FW_DEF(43143, "brcmfmac43143");
|
||||
+BRCMF_FW_DEF(43236B, "brcmfmac43236b");
|
||||
+BRCMF_FW_DEF(43242A, "brcmfmac43242a");
|
||||
+BRCMF_FW_DEF(43569, "brcmfmac43569");
|
||||
+BRCMF_FW_DEF(4373, "brcmfmac4373");
|
||||
|
||||
static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
@@ -0,0 +1,574 @@
|
||||
From d09ae51a4b676151edaf572bcd5f272b5532639f Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:26 +0100
|
||||
Subject: [PATCH] brcmfmac: pass struct in brcmf_fw_get_firmwares()
|
||||
|
||||
Make the function brcmf_fw_get_firmwares() a bit more easy to extend
|
||||
using a structure to pass the request parameters.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 175 ++++++++++++++-------
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.h | 43 +++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 38 ++++-
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 32 +++-
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 43 ++++-
|
||||
5 files changed, 245 insertions(+), 86 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -438,18 +438,31 @@ void brcmf_fw_nvram_free(void *nvram)
|
||||
|
||||
struct brcmf_fw {
|
||||
struct device *dev;
|
||||
- u16 flags;
|
||||
- const struct firmware *code;
|
||||
- const char *nvram_name;
|
||||
- u16 domain_nr;
|
||||
- u16 bus_nr;
|
||||
- void (*done)(struct device *dev, int err, const struct firmware *fw,
|
||||
- void *nvram_image, u32 nvram_len);
|
||||
+ struct brcmf_fw_request *req;
|
||||
+ u32 curpos;
|
||||
+ void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
|
||||
};
|
||||
|
||||
+static void brcmf_fw_request_done(const struct firmware *fw, void *ctx);
|
||||
+
|
||||
+static void brcmf_fw_free_request(struct brcmf_fw_request *req)
|
||||
+{
|
||||
+ struct brcmf_fw_item *item;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0, item = &req->items[0]; i < req->n_items; i++, item++) {
|
||||
+ if (item->type == BRCMF_FW_TYPE_BINARY)
|
||||
+ release_firmware(item->binary);
|
||||
+ else if (item->type == BRCMF_FW_TYPE_NVRAM)
|
||||
+ brcmf_fw_nvram_free(item->nv_data.data);
|
||||
+ }
|
||||
+ kfree(req);
|
||||
+}
|
||||
+
|
||||
static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
|
||||
{
|
||||
struct brcmf_fw *fwctx = ctx;
|
||||
+ struct brcmf_fw_item *cur;
|
||||
u32 nvram_length = 0;
|
||||
void *nvram = NULL;
|
||||
u8 *data = NULL;
|
||||
@@ -457,83 +470,150 @@ static void brcmf_fw_request_nvram_done(
|
||||
bool raw_nvram;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev));
|
||||
+
|
||||
+ cur = &fwctx->req->items[fwctx->curpos];
|
||||
+
|
||||
if (fw && fw->data) {
|
||||
data = (u8 *)fw->data;
|
||||
data_len = fw->size;
|
||||
raw_nvram = false;
|
||||
} else {
|
||||
data = bcm47xx_nvram_get_contents(&data_len);
|
||||
- if (!data && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
|
||||
+ if (!data && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
|
||||
goto fail;
|
||||
raw_nvram = true;
|
||||
}
|
||||
|
||||
if (data)
|
||||
nvram = brcmf_fw_nvram_strip(data, data_len, &nvram_length,
|
||||
- fwctx->domain_nr, fwctx->bus_nr);
|
||||
+ fwctx->req->domain_nr,
|
||||
+ fwctx->req->bus_nr);
|
||||
|
||||
if (raw_nvram)
|
||||
bcm47xx_nvram_release_contents(data);
|
||||
release_firmware(fw);
|
||||
- if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
|
||||
+ if (!nvram && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
|
||||
goto fail;
|
||||
|
||||
- fwctx->done(fwctx->dev, 0, fwctx->code, nvram, nvram_length);
|
||||
- kfree(fwctx);
|
||||
+ brcmf_dbg(TRACE, "nvram %p len %d\n", nvram, nvram_length);
|
||||
+ cur->nv_data.data = nvram;
|
||||
+ cur->nv_data.len = nvram_length;
|
||||
return;
|
||||
|
||||
fail:
|
||||
brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
|
||||
- release_firmware(fwctx->code);
|
||||
- fwctx->done(fwctx->dev, -ENOENT, NULL, NULL, 0);
|
||||
+ fwctx->done(fwctx->dev, -ENOENT, NULL);
|
||||
+ brcmf_fw_free_request(fwctx->req);
|
||||
kfree(fwctx);
|
||||
}
|
||||
|
||||
-static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx)
|
||||
+static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
|
||||
+{
|
||||
+ struct brcmf_fw_item *cur;
|
||||
+ const struct firmware *fw = NULL;
|
||||
+ int ret;
|
||||
+
|
||||
+ cur = &fwctx->req->items[fwctx->curpos];
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "%srequest for %s\n", async ? "async " : "",
|
||||
+ cur->path);
|
||||
+
|
||||
+ if (async)
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true, cur->path,
|
||||
+ fwctx->dev, GFP_KERNEL, fwctx,
|
||||
+ brcmf_fw_request_done);
|
||||
+ else
|
||||
+ ret = request_firmware(&fw, cur->path, fwctx->dev);
|
||||
+
|
||||
+ if (ret < 0) {
|
||||
+ brcmf_fw_request_done(NULL, fwctx);
|
||||
+ } else if (!async && fw) {
|
||||
+ brcmf_dbg(TRACE, "firmware %s %sfound\n", cur->path,
|
||||
+ fw ? "" : "not ");
|
||||
+ if (cur->type == BRCMF_FW_TYPE_BINARY)
|
||||
+ cur->binary = fw;
|
||||
+ else if (cur->type == BRCMF_FW_TYPE_NVRAM)
|
||||
+ brcmf_fw_request_nvram_done(fw, fwctx);
|
||||
+ else
|
||||
+ release_firmware(fw);
|
||||
+
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||
{
|
||||
struct brcmf_fw *fwctx = ctx;
|
||||
+ struct brcmf_fw_item *cur;
|
||||
int ret = 0;
|
||||
|
||||
- brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev));
|
||||
- if (!fw) {
|
||||
+ cur = &fwctx->req->items[fwctx->curpos];
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "enter: firmware %s %sfound\n", cur->path,
|
||||
+ fw ? "" : "not ");
|
||||
+
|
||||
+ if (fw) {
|
||||
+ if (cur->type == BRCMF_FW_TYPE_BINARY)
|
||||
+ cur->binary = fw;
|
||||
+ else if (cur->type == BRCMF_FW_TYPE_NVRAM)
|
||||
+ brcmf_fw_request_nvram_done(fw, fwctx);
|
||||
+ else
|
||||
+ release_firmware(fw);
|
||||
+ } else if (cur->type == BRCMF_FW_TYPE_NVRAM) {
|
||||
+ brcmf_fw_request_nvram_done(NULL, fwctx);
|
||||
+ } else if (!(cur->flags & BRCMF_FW_REQF_OPTIONAL)) {
|
||||
ret = -ENOENT;
|
||||
goto fail;
|
||||
}
|
||||
- /* only requested code so done here */
|
||||
- if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM))
|
||||
- goto done;
|
||||
-
|
||||
- fwctx->code = fw;
|
||||
- ret = request_firmware_nowait(THIS_MODULE, true, fwctx->nvram_name,
|
||||
- fwctx->dev, GFP_KERNEL, fwctx,
|
||||
- brcmf_fw_request_nvram_done);
|
||||
|
||||
- /* pass NULL to nvram callback for bcm47xx fallback */
|
||||
- if (ret)
|
||||
- brcmf_fw_request_nvram_done(NULL, fwctx);
|
||||
+ do {
|
||||
+ if (++fwctx->curpos == fwctx->req->n_items) {
|
||||
+ ret = 0;
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ ret = brcmf_fw_request_next_item(fwctx, false);
|
||||
+ } while (ret == -EAGAIN);
|
||||
+
|
||||
return;
|
||||
|
||||
fail:
|
||||
- brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
|
||||
+ brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
|
||||
+ dev_name(fwctx->dev), cur->path);
|
||||
+ brcmf_fw_free_request(fwctx->req);
|
||||
+ fwctx->req = NULL;
|
||||
done:
|
||||
- fwctx->done(fwctx->dev, ret, fw, NULL, 0);
|
||||
+ fwctx->done(fwctx->dev, ret, fwctx->req);
|
||||
kfree(fwctx);
|
||||
}
|
||||
|
||||
-int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
|
||||
- const char *code, const char *nvram,
|
||||
- void (*fw_cb)(struct device *dev, int err,
|
||||
- const struct firmware *fw,
|
||||
- void *nvram_image, u32 nvram_len),
|
||||
- u16 domain_nr, u16 bus_nr)
|
||||
+static bool brcmf_fw_request_is_valid(struct brcmf_fw_request *req)
|
||||
+{
|
||||
+ struct brcmf_fw_item *item;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!req->n_items)
|
||||
+ return false;
|
||||
+
|
||||
+ for (i = 0, item = &req->items[0]; i < req->n_items; i++, item++) {
|
||||
+ if (!item->path)
|
||||
+ return false;
|
||||
+ }
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
+ void (*fw_cb)(struct device *dev, int err,
|
||||
+ struct brcmf_fw_request *req))
|
||||
{
|
||||
struct brcmf_fw *fwctx;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
- if (!fw_cb || !code)
|
||||
+ if (!fw_cb)
|
||||
return -EINVAL;
|
||||
|
||||
- if ((flags & BRCMF_FW_REQUEST_NVRAM) && !nvram)
|
||||
+ if (!brcmf_fw_request_is_valid(req))
|
||||
return -EINVAL;
|
||||
|
||||
fwctx = kzalloc(sizeof(*fwctx), GFP_KERNEL);
|
||||
@@ -541,26 +621,11 @@ int brcmf_fw_get_firmwares_pcie(struct d
|
||||
return -ENOMEM;
|
||||
|
||||
fwctx->dev = dev;
|
||||
- fwctx->flags = flags;
|
||||
+ fwctx->req = req;
|
||||
fwctx->done = fw_cb;
|
||||
- if (flags & BRCMF_FW_REQUEST_NVRAM)
|
||||
- fwctx->nvram_name = nvram;
|
||||
- fwctx->domain_nr = domain_nr;
|
||||
- fwctx->bus_nr = bus_nr;
|
||||
-
|
||||
- return request_firmware_nowait(THIS_MODULE, true, code, dev,
|
||||
- GFP_KERNEL, fwctx,
|
||||
- brcmf_fw_request_code_done);
|
||||
-}
|
||||
|
||||
-int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
|
||||
- const char *code, const char *nvram,
|
||||
- void (*fw_cb)(struct device *dev, int err,
|
||||
- const struct firmware *fw,
|
||||
- void *nvram_image, u32 nvram_len))
|
||||
-{
|
||||
- return brcmf_fw_get_firmwares_pcie(dev, flags, code, nvram, fw_cb, 0,
|
||||
- 0);
|
||||
+ brcmf_fw_request_next_item(fwctx, true);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void brcmf_fw_get_full_name(char fw_name[BRCMF_FW_NAME_LEN],
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -16,10 +16,7 @@
|
||||
#ifndef BRCMFMAC_FIRMWARE_H
|
||||
#define BRCMFMAC_FIRMWARE_H
|
||||
|
||||
-#define BRCMF_FW_REQUEST 0x000F
|
||||
-#define BRCMF_FW_REQUEST_NVRAM 0x0001
|
||||
-#define BRCMF_FW_REQ_FLAGS 0x00F0
|
||||
-#define BRCMF_FW_REQ_NV_OPTIONAL 0x0010
|
||||
+#define BRCMF_FW_REQF_OPTIONAL 0x0001
|
||||
|
||||
#define BRCMF_FW_NAME_LEN 320
|
||||
|
||||
@@ -54,21 +51,39 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
|
||||
char nvram_name[BRCMF_FW_NAME_LEN]);
|
||||
void brcmf_fw_nvram_free(void *nvram);
|
||||
+
|
||||
+enum brcmf_fw_type {
|
||||
+ BRCMF_FW_TYPE_BINARY,
|
||||
+ BRCMF_FW_TYPE_NVRAM
|
||||
+};
|
||||
+
|
||||
+struct brcmf_fw_item {
|
||||
+ const char *path;
|
||||
+ enum brcmf_fw_type type;
|
||||
+ u16 flags;
|
||||
+ union {
|
||||
+ const struct firmware *binary;
|
||||
+ struct {
|
||||
+ void *data;
|
||||
+ u32 len;
|
||||
+ } nv_data;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+struct brcmf_fw_request {
|
||||
+ u16 domain_nr;
|
||||
+ u16 bus_nr;
|
||||
+ u32 n_items;
|
||||
+ struct brcmf_fw_item items[0];
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* Request firmware(s) asynchronously. When the asynchronous request
|
||||
* fails it will not use the callback, but call device_release_driver()
|
||||
* instead which will call the driver .remove() callback.
|
||||
*/
|
||||
-int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
|
||||
- const char *code, const char *nvram,
|
||||
- void (*fw_cb)(struct device *dev, int err,
|
||||
- const struct firmware *fw,
|
||||
- void *nvram_image, u32 nvram_len),
|
||||
- u16 domain_nr, u16 bus_nr);
|
||||
-int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
|
||||
- const char *code, const char *nvram,
|
||||
+int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
void (*fw_cb)(struct device *dev, int err,
|
||||
- const struct firmware *fw,
|
||||
- void *nvram_image, u32 nvram_len));
|
||||
+ struct brcmf_fw_request *req));
|
||||
|
||||
#endif /* BRCMFMAC_FIRMWARE_H */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1651,15 +1651,19 @@ static const struct brcmf_buscore_ops br
|
||||
.write32 = brcmf_pcie_buscore_write32,
|
||||
};
|
||||
|
||||
+#define BRCMF_PCIE_FW_CODE 0
|
||||
+#define BRCMF_PCIE_FW_NVRAM 1
|
||||
+
|
||||
static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
- const struct firmware *fw,
|
||||
- void *nvram, u32 nvram_len)
|
||||
+ struct brcmf_fw_request *fwreq)
|
||||
{
|
||||
+ const struct firmware *fw;
|
||||
+ void *nvram;
|
||||
struct brcmf_bus *bus;
|
||||
struct brcmf_pciedev *pcie_bus_dev;
|
||||
struct brcmf_pciedev_info *devinfo;
|
||||
struct brcmf_commonring **flowrings;
|
||||
- u32 i;
|
||||
+ u32 i, nvram_len;
|
||||
|
||||
/* check firmware loading result */
|
||||
if (ret)
|
||||
@@ -1670,6 +1674,11 @@ static void brcmf_pcie_setup(struct devi
|
||||
devinfo = pcie_bus_dev->devinfo;
|
||||
brcmf_pcie_attach(devinfo);
|
||||
|
||||
+ fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
|
||||
+ nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data;
|
||||
+ nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len;
|
||||
+ kfree(fwreq);
|
||||
+
|
||||
/* Some of the firmwares have the size of the memory of the device
|
||||
* defined inside the firmware. This is because part of the memory in
|
||||
* the device is shared and the devision is determined by FW. Parse
|
||||
@@ -1730,6 +1739,7 @@ static int
|
||||
brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
struct brcmf_pciedev_info *devinfo;
|
||||
struct brcmf_pciedev *pcie_bus_dev;
|
||||
struct brcmf_bus *bus;
|
||||
@@ -1800,12 +1810,26 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
if (ret)
|
||||
goto fail_bus;
|
||||
|
||||
- ret = brcmf_fw_get_firmwares_pcie(bus->dev, BRCMF_FW_REQUEST_NVRAM |
|
||||
- BRCMF_FW_REQ_NV_OPTIONAL,
|
||||
- devinfo->fw_name, devinfo->nvram_name,
|
||||
- brcmf_pcie_setup, domain_nr, bus_nr);
|
||||
+ fwreq = kzalloc(sizeof(*fwreq) + 2 * sizeof(struct brcmf_fw_item),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!fwreq) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto fail_bus;
|
||||
+ }
|
||||
+
|
||||
+ fwreq->items[BRCMF_PCIE_FW_CODE].path = devinfo->fw_name;
|
||||
+ fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+ fwreq->items[BRCMF_PCIE_FW_NVRAM].path = devinfo->nvram_name;
|
||||
+ fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
+ fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
+ fwreq->n_items = 2;
|
||||
+ fwreq->domain_nr = domain_nr;
|
||||
+ fwreq->bus_nr = bus_nr;
|
||||
+ ret = brcmf_fw_get_firmwares(bus->dev, fwreq, brcmf_pcie_setup);
|
||||
if (ret == 0)
|
||||
return 0;
|
||||
+
|
||||
+ kfree(fwreq);
|
||||
fail_bus:
|
||||
kfree(bus->msgbuf);
|
||||
kfree(bus);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4031,14 +4031,19 @@ static const struct brcmf_bus_ops brcmf_
|
||||
.get_fwname = brcmf_sdio_get_fwname,
|
||||
};
|
||||
|
||||
+#define BRCMF_SDIO_FW_CODE 0
|
||||
+#define BRCMF_SDIO_FW_NVRAM 1
|
||||
+
|
||||
static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
- const struct firmware *code,
|
||||
- void *nvram, u32 nvram_len)
|
||||
+ struct brcmf_fw_request *fwreq)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_sdio_dev *sdiod = bus_if->bus_priv.sdio;
|
||||
struct brcmf_sdio *bus = sdiod->bus;
|
||||
struct brcmf_core *core = bus->sdio_core;
|
||||
+ const struct firmware *code;
|
||||
+ void *nvram;
|
||||
+ u32 nvram_len;
|
||||
u8 saveclk;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
|
||||
@@ -4046,6 +4051,11 @@ static void brcmf_sdio_firmware_callback
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
+ code = fwreq->items[BRCMF_SDIO_FW_CODE].binary;
|
||||
+ nvram = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.data;
|
||||
+ nvram_len = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.len;
|
||||
+ kfree(fwreq);
|
||||
+
|
||||
/* try to download image and nvram to the dongle */
|
||||
bus->alp_only = true;
|
||||
err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len);
|
||||
@@ -4150,6 +4160,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
int ret;
|
||||
struct brcmf_sdio *bus;
|
||||
struct workqueue_struct *wq;
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
@@ -4240,11 +4251,24 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
- ret = brcmf_fw_get_firmwares(sdiodev->dev, BRCMF_FW_REQUEST_NVRAM,
|
||||
- sdiodev->fw_name, sdiodev->nvram_name,
|
||||
+ fwreq = kzalloc(sizeof(fwreq) + 2 * sizeof(struct brcmf_fw_item),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!fwreq) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ fwreq->items[BRCMF_SDIO_FW_CODE].path = sdiodev->fw_name;
|
||||
+ fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+ fwreq->items[BRCMF_SDIO_FW_NVRAM].path = sdiodev->nvram_name;
|
||||
+ fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
+ fwreq->n_items = 2;
|
||||
+
|
||||
+ ret = brcmf_fw_get_firmwares(sdiodev->dev, fwreq,
|
||||
brcmf_sdio_firmware_callback);
|
||||
if (ret != 0) {
|
||||
brcmf_err("async firmware request failed: %d\n", ret);
|
||||
+ kfree(fwreq);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1155,18 +1155,23 @@ static const struct brcmf_bus_ops brcmf_
|
||||
.get_fwname = brcmf_usb_get_fwname,
|
||||
};
|
||||
|
||||
+#define BRCMF_USB_FW_CODE 0
|
||||
+
|
||||
static void brcmf_usb_probe_phase2(struct device *dev, int ret,
|
||||
- const struct firmware *fw,
|
||||
- void *nvram, u32 nvlen)
|
||||
+ struct brcmf_fw_request *fwreq)
|
||||
{
|
||||
struct brcmf_bus *bus = dev_get_drvdata(dev);
|
||||
struct brcmf_usbdev_info *devinfo = bus->bus_priv.usb->devinfo;
|
||||
+ const struct firmware *fw;
|
||||
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
brcmf_dbg(USB, "Start fw downloading\n");
|
||||
|
||||
+ fw = fwreq->items[BRCMF_USB_FW_CODE].binary;
|
||||
+ kfree(fwreq);
|
||||
+
|
||||
ret = check_file(fw->data);
|
||||
if (ret < 0) {
|
||||
brcmf_err("invalid firmware\n");
|
||||
@@ -1200,6 +1205,7 @@ static int brcmf_usb_probe_cb(struct brc
|
||||
struct brcmf_bus *bus = NULL;
|
||||
struct brcmf_usbdev *bus_pub = NULL;
|
||||
struct device *dev = devinfo->dev;
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
@@ -1250,11 +1256,22 @@ static int brcmf_usb_probe_cb(struct brc
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
+ fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!fwreq) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
|
||||
+ fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+ fwreq->n_items = 1;
|
||||
+
|
||||
/* request firmware here */
|
||||
- ret = brcmf_fw_get_firmwares(dev, 0, devinfo->fw_name, NULL,
|
||||
- brcmf_usb_probe_phase2);
|
||||
+ ret = brcmf_fw_get_firmwares(dev, fwreq, brcmf_usb_probe_phase2);
|
||||
if (ret) {
|
||||
brcmf_err("firmware request failed: %d\n", ret);
|
||||
+ kfree(fwreq);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -1447,11 +1464,25 @@ static int brcmf_usb_reset_resume(struct
|
||||
{
|
||||
struct usb_device *usb = interface_to_usbdev(intf);
|
||||
struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ int ret;
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
|
||||
- return brcmf_fw_get_firmwares(&usb->dev, 0, devinfo->fw_name, NULL,
|
||||
- brcmf_usb_probe_phase2);
|
||||
+ fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!fwreq)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
|
||||
+ fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+ fwreq->n_items = 1;
|
||||
+
|
||||
+ ret = brcmf_fw_get_firmwares(&usb->dev, fwreq, brcmf_usb_probe_phase2);
|
||||
+ if (ret < 0)
|
||||
+ kfree(fwreq);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
#define BRCMF_USB_DEVICE(dev_id) \
|
||||
@@ -0,0 +1,328 @@
|
||||
From 2baa3aaee27f137b8db9a9224d0fe9b281d28e34 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:27 +0100
|
||||
Subject: [PATCH] brcmfmac: introduce brcmf_fw_alloc_request() function
|
||||
|
||||
The function brcmf_fw_alloc_request() takes a list of required files
|
||||
and allocated the struct brcmf_fw_request instance accordingly. The
|
||||
request can be modified by the caller before being passed to the
|
||||
brcmf_fw_request_firmwares() function.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 58 ++++++++++++++++++++++
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.h | 11 ++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 58 ++++++++++++----------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 38 ++++++++------
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 42 +++++++++-------
|
||||
5 files changed, 147 insertions(+), 60 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -688,3 +688,61 @@ int brcmf_fw_map_chip_to_name(u32 chip,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+struct brcmf_fw_request *
|
||||
+brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
+ struct brcmf_firmware_mapping mapping_table[],
|
||||
+ u32 table_size, struct brcmf_fw_name *fwnames,
|
||||
+ u32 n_fwnames)
|
||||
+{
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ char chipname[12];
|
||||
+ const char *mp_path;
|
||||
+ u32 i, j;
|
||||
+ char end;
|
||||
+ size_t reqsz;
|
||||
+
|
||||
+ for (i = 0; i < table_size; i++) {
|
||||
+ if (mapping_table[i].chipid == chip &&
|
||||
+ mapping_table[i].revmask & BIT(chiprev))
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (i == table_size) {
|
||||
+ brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ reqsz = sizeof(*fwreq) + n_fwnames * sizeof(struct brcmf_fw_item);
|
||||
+ fwreq = kzalloc(reqsz, GFP_KERNEL);
|
||||
+ if (!fwreq)
|
||||
+ return NULL;
|
||||
+
|
||||
+ brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
|
||||
+
|
||||
+ brcmf_info("using %s for chip %s\n",
|
||||
+ mapping_table[i].fw_base, chipname);
|
||||
+
|
||||
+ mp_path = brcmf_mp_global.firmware_path;
|
||||
+ end = mp_path[strlen(mp_path) - 1];
|
||||
+ fwreq->n_items = n_fwnames;
|
||||
+
|
||||
+ for (j = 0; j < n_fwnames; j++) {
|
||||
+ fwreq->items[j].path = fwnames[j].path;
|
||||
+ /* check if firmware path is provided by module parameter */
|
||||
+ if (brcmf_mp_global.firmware_path[0] != '\0') {
|
||||
+ strlcpy(fwnames[j].path, mp_path,
|
||||
+ BRCMF_FW_NAME_LEN);
|
||||
+
|
||||
+ if (end != '/') {
|
||||
+ strlcat(fwnames[j].path, "/",
|
||||
+ BRCMF_FW_NAME_LEN);
|
||||
+ }
|
||||
+ }
|
||||
+ brcmf_fw_get_full_name(fwnames[j].path,
|
||||
+ mapping_table[i].fw_base,
|
||||
+ fwnames[j].extension);
|
||||
+ fwreq->items[j].path = fwnames[j].path;
|
||||
+ }
|
||||
+
|
||||
+ return fwreq;
|
||||
+}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -77,6 +77,17 @@ struct brcmf_fw_request {
|
||||
struct brcmf_fw_item items[0];
|
||||
};
|
||||
|
||||
+struct brcmf_fw_name {
|
||||
+ const char *extension;
|
||||
+ char *path;
|
||||
+};
|
||||
+
|
||||
+struct brcmf_fw_request *
|
||||
+brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
+ struct brcmf_firmware_mapping mapping_table[],
|
||||
+ u32 table_size, struct brcmf_fw_name *fwnames,
|
||||
+ u32 n_fwnames);
|
||||
+
|
||||
/*
|
||||
* Request firmware(s) asynchronously. When the asynchronous request
|
||||
* fails it will not use the callback, but call device_release_driver()
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1735,6 +1735,31 @@ fail:
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
+static struct brcmf_fw_request *
|
||||
+brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
+{
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_fw_name fwnames[] = {
|
||||
+ { ".bin", devinfo->fw_name },
|
||||
+ { ".txt", devinfo->nvram_name },
|
||||
+ };
|
||||
+
|
||||
+ fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev,
|
||||
+ brcmf_pcie_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_pcie_fwnames),
|
||||
+ fwnames, ARRAY_SIZE(fwnames));
|
||||
+ if (!fwreq)
|
||||
+ return NULL;
|
||||
+
|
||||
+ fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+ fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
+ fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
+ fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus);
|
||||
+ fwreq->bus_nr = devinfo->pdev->bus->number;
|
||||
+
|
||||
+ return fwreq;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
@@ -1743,13 +1768,8 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
struct brcmf_pciedev_info *devinfo;
|
||||
struct brcmf_pciedev *pcie_bus_dev;
|
||||
struct brcmf_bus *bus;
|
||||
- u16 domain_nr;
|
||||
- u16 bus_nr;
|
||||
|
||||
- domain_nr = pci_domain_nr(pdev->bus) + 1;
|
||||
- bus_nr = pdev->bus->number;
|
||||
- brcmf_dbg(PCIE, "Enter %x:%x (%d/%d)\n", pdev->vendor, pdev->device,
|
||||
- domain_nr, bus_nr);
|
||||
+ brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
|
||||
|
||||
ret = -ENOMEM;
|
||||
devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
|
||||
@@ -1803,33 +1823,19 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
|
||||
dev_set_drvdata(&pdev->dev, bus);
|
||||
|
||||
- ret = brcmf_fw_map_chip_to_name(devinfo->ci->chip, devinfo->ci->chiprev,
|
||||
- brcmf_pcie_fwnames,
|
||||
- ARRAY_SIZE(brcmf_pcie_fwnames),
|
||||
- devinfo->fw_name, devinfo->nvram_name);
|
||||
- if (ret)
|
||||
- goto fail_bus;
|
||||
-
|
||||
- fwreq = kzalloc(sizeof(*fwreq) + 2 * sizeof(struct brcmf_fw_item),
|
||||
- GFP_KERNEL);
|
||||
+ fwreq = brcmf_pcie_prepare_fw_request(devinfo);
|
||||
if (!fwreq) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_bus;
|
||||
}
|
||||
|
||||
- fwreq->items[BRCMF_PCIE_FW_CODE].path = devinfo->fw_name;
|
||||
- fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
- fwreq->items[BRCMF_PCIE_FW_NVRAM].path = devinfo->nvram_name;
|
||||
- fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
- fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
- fwreq->n_items = 2;
|
||||
- fwreq->domain_nr = domain_nr;
|
||||
- fwreq->bus_nr = bus_nr;
|
||||
ret = brcmf_fw_get_firmwares(bus->dev, fwreq, brcmf_pcie_setup);
|
||||
- if (ret == 0)
|
||||
- return 0;
|
||||
+ if (ret < 0) {
|
||||
+ kfree(fwreq);
|
||||
+ goto fail_bus;
|
||||
+ }
|
||||
+ return 0;
|
||||
|
||||
- kfree(fwreq);
|
||||
fail_bus:
|
||||
kfree(bus->msgbuf);
|
||||
kfree(bus);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4155,6 +4155,28 @@ fail:
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
+static struct brcmf_fw_request *
|
||||
+brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
+{
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_fw_name fwnames[] = {
|
||||
+ { ".bin", bus->sdiodev->fw_name },
|
||||
+ { ".txt", bus->sdiodev->nvram_name },
|
||||
+ };
|
||||
+
|
||||
+ fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev,
|
||||
+ brcmf_sdio_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_sdio_fwnames),
|
||||
+ fwnames, ARRAY_SIZE(fwnames));
|
||||
+ if (!fwreq)
|
||||
+ return NULL;
|
||||
+
|
||||
+ fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+ fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
+
|
||||
+ return fwreq;
|
||||
+}
|
||||
+
|
||||
struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
|
||||
{
|
||||
int ret;
|
||||
@@ -4244,26 +4266,12 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
|
||||
brcmf_dbg(INFO, "completed!!\n");
|
||||
|
||||
- ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev,
|
||||
- brcmf_sdio_fwnames,
|
||||
- ARRAY_SIZE(brcmf_sdio_fwnames),
|
||||
- sdiodev->fw_name, sdiodev->nvram_name);
|
||||
- if (ret)
|
||||
- goto fail;
|
||||
-
|
||||
- fwreq = kzalloc(sizeof(fwreq) + 2 * sizeof(struct brcmf_fw_item),
|
||||
- GFP_KERNEL);
|
||||
+ fwreq = brcmf_sdio_prepare_fw_request(bus);
|
||||
if (!fwreq) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- fwreq->items[BRCMF_SDIO_FW_CODE].path = sdiodev->fw_name;
|
||||
- fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
- fwreq->items[BRCMF_SDIO_FW_NVRAM].path = sdiodev->nvram_name;
|
||||
- fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
- fwreq->n_items = 2;
|
||||
-
|
||||
ret = brcmf_fw_get_firmwares(sdiodev->dev, fwreq,
|
||||
brcmf_sdio_firmware_callback);
|
||||
if (ret != 0) {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1200,6 +1200,27 @@ error:
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
+static struct brcmf_fw_request *
|
||||
+brcmf_usb_prepare_fw_request(struct brcmf_usbdev_info *devinfo)
|
||||
+{
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_fw_name fwnames[] = {
|
||||
+ { ".bin", devinfo->fw_name },
|
||||
+ };
|
||||
+
|
||||
+ fwreq = brcmf_fw_alloc_request(devinfo->bus_pub.devid,
|
||||
+ devinfo->bus_pub.chiprev,
|
||||
+ brcmf_usb_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_usb_fwnames),
|
||||
+ fwnames, ARRAY_SIZE(fwnames));
|
||||
+ if (!fwreq)
|
||||
+ return NULL;
|
||||
+
|
||||
+ fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
+
|
||||
+ return fwreq;
|
||||
+}
|
||||
+
|
||||
static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
|
||||
{
|
||||
struct brcmf_bus *bus = NULL;
|
||||
@@ -1249,24 +1270,12 @@ static int brcmf_usb_probe_cb(struct brc
|
||||
bus->chip = bus_pub->devid;
|
||||
bus->chiprev = bus_pub->chiprev;
|
||||
|
||||
- ret = brcmf_fw_map_chip_to_name(bus_pub->devid, bus_pub->chiprev,
|
||||
- brcmf_usb_fwnames,
|
||||
- ARRAY_SIZE(brcmf_usb_fwnames),
|
||||
- devinfo->fw_name, NULL);
|
||||
- if (ret)
|
||||
- goto fail;
|
||||
-
|
||||
- fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
|
||||
- GFP_KERNEL);
|
||||
+ fwreq = brcmf_usb_prepare_fw_request(devinfo);
|
||||
if (!fwreq) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
|
||||
- fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
- fwreq->n_items = 1;
|
||||
-
|
||||
/* request firmware here */
|
||||
ret = brcmf_fw_get_firmwares(dev, fwreq, brcmf_usb_probe_phase2);
|
||||
if (ret) {
|
||||
@@ -1469,15 +1478,10 @@ static int brcmf_usb_reset_resume(struct
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
|
||||
- fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
|
||||
- GFP_KERNEL);
|
||||
+ fwreq = brcmf_usb_prepare_fw_request(devinfo);
|
||||
if (!fwreq)
|
||||
return -ENOMEM;
|
||||
|
||||
- fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
|
||||
- fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
- fwreq->n_items = 1;
|
||||
-
|
||||
ret = brcmf_fw_get_firmwares(&usb->dev, fwreq, brcmf_usb_probe_phase2);
|
||||
if (ret < 0)
|
||||
kfree(fwreq);
|
||||
@@ -0,0 +1,231 @@
|
||||
From bf7a7b37f6ef5090a2bae7e7ae23cd26b741cca4 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:28 +0100
|
||||
Subject: [PATCH] brcmfmac: add extension to .get_fwname() callbacks
|
||||
|
||||
This changes the bus layer api by having the caller provide an
|
||||
extension. With this the callback can use brcmf_fw_alloc_request()
|
||||
to get the needed firmware name.
|
||||
|
||||
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>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 6 +--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/common.c | 43 +++-------------------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 27 +++++++-------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 26 +++++++------
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 27 ++++++++------
|
||||
5 files changed, 51 insertions(+), 78 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -88,7 +88,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 (*get_fwname)(struct device *dev, uint chip, uint chiprev,
|
||||
+ int (*get_fwname)(struct device *dev, const char *ext,
|
||||
unsigned char *fw_name);
|
||||
};
|
||||
|
||||
@@ -228,10 +228,10 @@ int brcmf_bus_get_memdump(struct brcmf_b
|
||||
}
|
||||
|
||||
static inline
|
||||
-int brcmf_bus_get_fwname(struct brcmf_bus *bus, uint chip, uint chiprev,
|
||||
+int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext,
|
||||
unsigned char *fw_name)
|
||||
{
|
||||
- return bus->ops->get_fwname(bus->dev, chip, chiprev, fw_name);
|
||||
+ return bus->ops->get_fwname(bus->dev, ext, fw_name);
|
||||
}
|
||||
|
||||
/*
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -129,42 +129,9 @@ static int brcmf_c_download(struct brcmf
|
||||
return err;
|
||||
}
|
||||
|
||||
-static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name)
|
||||
-{
|
||||
- struct brcmf_bus *bus = ifp->drvr->bus_if;
|
||||
- u8 fw_name[BRCMF_FW_NAME_LEN];
|
||||
- u8 *ptr;
|
||||
- size_t len;
|
||||
- s32 err;
|
||||
-
|
||||
- memset(fw_name, 0, BRCMF_FW_NAME_LEN);
|
||||
- err = brcmf_bus_get_fwname(bus, bus->chip, bus->chiprev, fw_name);
|
||||
- if (err) {
|
||||
- brcmf_err("get firmware name failed (%d)\n", err);
|
||||
- goto done;
|
||||
- }
|
||||
-
|
||||
- /* generate CLM blob file name */
|
||||
- ptr = strrchr(fw_name, '.');
|
||||
- if (!ptr) {
|
||||
- err = -ENOENT;
|
||||
- goto done;
|
||||
- }
|
||||
-
|
||||
- len = ptr - fw_name + 1;
|
||||
- if (len + strlen(".clm_blob") > BRCMF_FW_NAME_LEN) {
|
||||
- err = -E2BIG;
|
||||
- } else {
|
||||
- strlcpy(clm_name, fw_name, len);
|
||||
- strlcat(clm_name, ".clm_blob", BRCMF_FW_NAME_LEN);
|
||||
- }
|
||||
-done:
|
||||
- return err;
|
||||
-}
|
||||
-
|
||||
static int brcmf_c_process_clm_blob(struct brcmf_if *ifp)
|
||||
{
|
||||
- struct device *dev = ifp->drvr->bus_if->dev;
|
||||
+ struct brcmf_bus *bus = ifp->drvr->bus_if;
|
||||
struct brcmf_dload_data_le *chunk_buf;
|
||||
const struct firmware *clm = NULL;
|
||||
u8 clm_name[BRCMF_FW_NAME_LEN];
|
||||
@@ -177,16 +144,16 @@ static int brcmf_c_process_clm_blob(stru
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
- memset(clm_name, 0, BRCMF_FW_NAME_LEN);
|
||||
- err = brcmf_c_get_clm_name(ifp, clm_name);
|
||||
+ memset(clm_name, 0, sizeof(clm_name));
|
||||
+ err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name);
|
||||
if (err) {
|
||||
brcmf_err("get CLM blob file name failed (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
- err = request_firmware(&clm, clm_name, dev);
|
||||
+ err = request_firmware(&clm, clm_name, bus->dev);
|
||||
if (err) {
|
||||
- brcmf_info("no clm_blob available(err=%d), device may have limited channels available\n",
|
||||
+ brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n",
|
||||
err);
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1350,23 +1350,24 @@ static int brcmf_pcie_get_memdump(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int brcmf_pcie_get_fwname(struct device *dev, u32 chip, u32 chiprev,
|
||||
- u8 *fw_name)
|
||||
+static
|
||||
+int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
{
|
||||
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;
|
||||
- int ret = 0;
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_fw_name fwnames[] = {
|
||||
+ { ext, fw_name },
|
||||
+ };
|
||||
|
||||
- if (devinfo->fw_name[0] != '\0')
|
||||
- strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
|
||||
- else
|
||||
- ret = brcmf_fw_map_chip_to_name(chip, chiprev,
|
||||
- brcmf_pcie_fwnames,
|
||||
- ARRAY_SIZE(brcmf_pcie_fwnames),
|
||||
- fw_name, NULL);
|
||||
+ fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
|
||||
+ brcmf_pcie_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_pcie_fwnames),
|
||||
+ fwnames, ARRAY_SIZE(fwnames));
|
||||
+ if (!fwreq)
|
||||
+ return -ENOMEM;
|
||||
|
||||
- return ret;
|
||||
+ kfree(fwreq);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4000,22 +4000,24 @@ brcmf_sdio_watchdog(unsigned long data)
|
||||
}
|
||||
}
|
||||
|
||||
-static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev,
|
||||
- u8 *fw_name)
|
||||
+static
|
||||
+int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
- struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
|
||||
- int ret = 0;
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_fw_name fwnames[] = {
|
||||
+ { ext, fw_name },
|
||||
+ };
|
||||
|
||||
- if (sdiodev->fw_name[0] != '\0')
|
||||
- strlcpy(fw_name, sdiodev->fw_name, BRCMF_FW_NAME_LEN);
|
||||
- else
|
||||
- ret = brcmf_fw_map_chip_to_name(chip, chiprev,
|
||||
- brcmf_sdio_fwnames,
|
||||
- ARRAY_SIZE(brcmf_sdio_fwnames),
|
||||
- fw_name, NULL);
|
||||
+ fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
|
||||
+ brcmf_sdio_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_sdio_fwnames),
|
||||
+ fwnames, ARRAY_SIZE(fwnames));
|
||||
+ if (!fwreq)
|
||||
+ return -ENOMEM;
|
||||
|
||||
- return ret;
|
||||
+ kfree(fwreq);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1128,21 +1128,24 @@ static void brcmf_usb_wowl_config(struct
|
||||
device_set_wakeup_enable(devinfo->dev, false);
|
||||
}
|
||||
|
||||
-static int brcmf_usb_get_fwname(struct device *dev, u32 chip, u32 chiprev,
|
||||
- u8 *fw_name)
|
||||
+static
|
||||
+int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
{
|
||||
- struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
|
||||
- int ret = 0;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(dev);
|
||||
+ struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_fw_name fwnames[] = {
|
||||
+ { ext, fw_name },
|
||||
+ };
|
||||
|
||||
- if (devinfo->fw_name[0] != '\0')
|
||||
- strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
|
||||
- else
|
||||
- ret = brcmf_fw_map_chip_to_name(chip, chiprev,
|
||||
- brcmf_usb_fwnames,
|
||||
- ARRAY_SIZE(brcmf_usb_fwnames),
|
||||
- fw_name, NULL);
|
||||
+ fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev,
|
||||
+ brcmf_usb_fwnames,
|
||||
+ ARRAY_SIZE(brcmf_usb_fwnames),
|
||||
+ fwnames, ARRAY_SIZE(fwnames));
|
||||
+ if (!fwreq)
|
||||
+ return -ENOMEM;
|
||||
|
||||
- return ret;
|
||||
+ kfree(fwreq);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
|
||||
@@ -0,0 +1,92 @@
|
||||
From 18c2b20e276e04476a3350b4a92c1dfad725d45d Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:29 +0100
|
||||
Subject: [PATCH] brcmfmac: get rid of brcmf_fw_map_chip_to_name()
|
||||
|
||||
The function is no longer used 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>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 53 ----------------------
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.h | 4 --
|
||||
2 files changed, 57 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -635,59 +635,6 @@ static void brcmf_fw_get_full_name(char
|
||||
strlcat(fw_name, extension, BRCMF_FW_NAME_LEN);
|
||||
}
|
||||
|
||||
-int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
|
||||
- struct brcmf_firmware_mapping mapping_table[],
|
||||
- u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
|
||||
- char nvram_name[BRCMF_FW_NAME_LEN])
|
||||
-{
|
||||
- char chipname[12];
|
||||
- u32 i;
|
||||
- char end;
|
||||
-
|
||||
- for (i = 0; i < table_size; i++) {
|
||||
- if (mapping_table[i].chipid == chip &&
|
||||
- mapping_table[i].revmask & BIT(chiprev))
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- if (i == table_size) {
|
||||
- brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
|
||||
- return -ENODEV;
|
||||
- }
|
||||
-
|
||||
- brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
|
||||
-
|
||||
- /* check if firmware path is provided by module parameter */
|
||||
- if (brcmf_mp_global.firmware_path[0] != '\0') {
|
||||
- if (fw_name)
|
||||
- strlcpy(fw_name, brcmf_mp_global.firmware_path,
|
||||
- BRCMF_FW_NAME_LEN);
|
||||
- if (nvram_name)
|
||||
- strlcpy(nvram_name, brcmf_mp_global.firmware_path,
|
||||
- BRCMF_FW_NAME_LEN);
|
||||
-
|
||||
- end = brcmf_mp_global.firmware_path[
|
||||
- strlen(brcmf_mp_global.firmware_path) - 1];
|
||||
- if (end != '/') {
|
||||
- if (fw_name)
|
||||
- strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
|
||||
- if (nvram_name)
|
||||
- strlcat(nvram_name, "/", BRCMF_FW_NAME_LEN);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- brcmf_info("using %s for chip %s\n",
|
||||
- mapping_table[i].fw_base, chipname);
|
||||
- if (fw_name)
|
||||
- brcmf_fw_get_full_name(fw_name,
|
||||
- mapping_table[i].fw_base, ".bin");
|
||||
- if (nvram_name)
|
||||
- brcmf_fw_get_full_name(nvram_name,
|
||||
- mapping_table[i].fw_base, ".txt");
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
struct brcmf_fw_request *
|
||||
brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
struct brcmf_firmware_mapping mapping_table[],
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -46,10 +46,6 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw
|
||||
#define BRCMF_FW_ENTRY(chipid, mask, name) \
|
||||
{ chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME }
|
||||
|
||||
-int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
|
||||
- struct brcmf_firmware_mapping mapping_table[],
|
||||
- u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
|
||||
- char nvram_name[BRCMF_FW_NAME_LEN]);
|
||||
void brcmf_fw_nvram_free(void *nvram);
|
||||
|
||||
enum brcmf_fw_type {
|
||||
@@ -0,0 +1,44 @@
|
||||
From bf291b7247e53f52a4236c0b55a5df046d6177df Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:30 +0100
|
||||
Subject: [PATCH] brcmfmac: get rid of brcmf_fw_get_full_name()
|
||||
|
||||
The function was pretty minimal and now it is called only from one
|
||||
place so just get rid of it.
|
||||
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 14 ++++----------
|
||||
1 file changed, 4 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -628,13 +628,6 @@ int brcmf_fw_get_firmwares(struct device
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void brcmf_fw_get_full_name(char fw_name[BRCMF_FW_NAME_LEN],
|
||||
- const char *fw_base, const char *extension)
|
||||
-{
|
||||
- strlcat(fw_name, fw_base, BRCMF_FW_NAME_LEN);
|
||||
- strlcat(fw_name, extension, BRCMF_FW_NAME_LEN);
|
||||
-}
|
||||
-
|
||||
struct brcmf_fw_request *
|
||||
brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
struct brcmf_firmware_mapping mapping_table[],
|
||||
@@ -685,9 +678,10 @@ brcmf_fw_alloc_request(u32 chip, u32 chi
|
||||
BRCMF_FW_NAME_LEN);
|
||||
}
|
||||
}
|
||||
- brcmf_fw_get_full_name(fwnames[j].path,
|
||||
- mapping_table[i].fw_base,
|
||||
- fwnames[j].extension);
|
||||
+ strlcat(fwnames[j].path, mapping_table[i].fw_base,
|
||||
+ BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(fwnames[j].path, fwnames[j].extension,
|
||||
+ BRCMF_FW_NAME_LEN);
|
||||
fwreq->items[j].path = fwnames[j].path;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
From 48eaee3f272a5bfe6986d07c51f6975d3c2f74d1 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 22 Mar 2018 21:28:31 +0100
|
||||
Subject: [PATCH] brcmfmac: add kerneldoc for struct brcmf_bus::msgbuf
|
||||
|
||||
This field did not have kerneldoc description so adding it now.
|
||||
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -140,6 +140,7 @@ struct brcmf_bus_stats {
|
||||
* @always_use_fws_queue: bus wants use queue also when fwsignal is inactive.
|
||||
* @wowl_supported: is wowl supported by bus driver.
|
||||
* @chiprev: revision of the dongle chip.
|
||||
+ * @msgbuf: msgbuf protocol parameters provided by bus layer.
|
||||
*/
|
||||
struct brcmf_bus {
|
||||
union {
|
||||
@@ -0,0 +1,81 @@
|
||||
From 0b5c0305e57ca940713bcb2b202fd2b412c62f31 Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Tue, 3 Apr 2018 10:18:15 +0200
|
||||
Subject: [PATCH] brcmfmac: fix firmware request processing if nvram load fails
|
||||
|
||||
When nvram loading fails a double free occurred. Fix this and reorg the
|
||||
code a little.
|
||||
|
||||
Fixes: d09ae51a4b67 ("brcmfmac: pass struct in brcmf_fw_get_firmwares()")
|
||||
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 36 ++++++++++++----------
|
||||
1 file changed, 20 insertions(+), 16 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -459,7 +459,7 @@ static void brcmf_fw_free_request(struct
|
||||
kfree(req);
|
||||
}
|
||||
|
||||
-static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
|
||||
+static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
|
||||
{
|
||||
struct brcmf_fw *fwctx = ctx;
|
||||
struct brcmf_fw_item *cur;
|
||||
@@ -498,13 +498,10 @@ static void brcmf_fw_request_nvram_done(
|
||||
brcmf_dbg(TRACE, "nvram %p len %d\n", nvram, nvram_length);
|
||||
cur->nv_data.data = nvram;
|
||||
cur->nv_data.len = nvram_length;
|
||||
- return;
|
||||
+ return 0;
|
||||
|
||||
fail:
|
||||
- brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
|
||||
- fwctx->done(fwctx->dev, -ENOENT, NULL);
|
||||
- brcmf_fw_free_request(fwctx->req);
|
||||
- kfree(fwctx);
|
||||
+ return -ENOENT;
|
||||
}
|
||||
|
||||
static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
|
||||
@@ -553,20 +550,27 @@ static void brcmf_fw_request_done(const
|
||||
brcmf_dbg(TRACE, "enter: firmware %s %sfound\n", cur->path,
|
||||
fw ? "" : "not ");
|
||||
|
||||
- if (fw) {
|
||||
- if (cur->type == BRCMF_FW_TYPE_BINARY)
|
||||
- cur->binary = fw;
|
||||
- else if (cur->type == BRCMF_FW_TYPE_NVRAM)
|
||||
- brcmf_fw_request_nvram_done(fw, fwctx);
|
||||
- else
|
||||
- release_firmware(fw);
|
||||
- } else if (cur->type == BRCMF_FW_TYPE_NVRAM) {
|
||||
- brcmf_fw_request_nvram_done(NULL, fwctx);
|
||||
- } else if (!(cur->flags & BRCMF_FW_REQF_OPTIONAL)) {
|
||||
+ if (!fw)
|
||||
ret = -ENOENT;
|
||||
+
|
||||
+ switch (cur->type) {
|
||||
+ case BRCMF_FW_TYPE_NVRAM:
|
||||
+ ret = brcmf_fw_request_nvram_done(fw, fwctx);
|
||||
+ break;
|
||||
+ case BRCMF_FW_TYPE_BINARY:
|
||||
+ cur->binary = fw;
|
||||
+ break;
|
||||
+ default:
|
||||
+ /* something fishy here so bail out early */
|
||||
+ brcmf_err("unknown fw type: %d\n", cur->type);
|
||||
+ release_firmware(fw);
|
||||
+ ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ if (ret < 0 && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
|
||||
+ goto fail;
|
||||
+
|
||||
do {
|
||||
if (++fwctx->curpos == fwctx->req->n_items) {
|
||||
ret = 0;
|
||||
@@ -0,0 +1,48 @@
|
||||
From 1f589e2510d5df1192dca7c089103a2cbd028101 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <dhaab@luxul.com>
|
||||
Date: Tue, 3 Apr 2018 10:21:56 +0200
|
||||
Subject: [PATCH] brcmfmac: add support for BCM4366E chipset
|
||||
|
||||
BCM4366E is a wireless chipset with a BCM43664 ChipCommon. It's
|
||||
supported by the same firmware as 4366c0.
|
||||
|
||||
Signed-off-by: Dan Haab <dan.haab@luxul.com>
|
||||
[arend: rebase patch and remove unnecessary definition]
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 +
|
||||
3 files changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -689,6 +689,7 @@ static u32 brcmf_chip_tcm_rambase(struct
|
||||
case BRCM_CC_43525_CHIP_ID:
|
||||
case BRCM_CC_4365_CHIP_ID:
|
||||
case BRCM_CC_4366_CHIP_ID:
|
||||
+ case BRCM_CC_43664_CHIP_ID:
|
||||
return 0x200000;
|
||||
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
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
From cb746e47837ad0f35c8ae28e9aacc8eb07916d2a Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 26 Apr 2018 12:16:47 +0200
|
||||
Subject: [PATCH] brcmfmac: check p2pdev mac address uniqueness
|
||||
|
||||
The mac address for p2pdev must be different from the primary interface
|
||||
due to firmware requirement. Add an explicit check for this requirement
|
||||
if user-space provides a mac address.
|
||||
|
||||
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 | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
||||
@@ -2073,6 +2073,13 @@ static struct wireless_dev *brcmf_p2p_cr
|
||||
}
|
||||
|
||||
pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
|
||||
+
|
||||
+ /* firmware requires unique mac address for p2pdev interface */
|
||||
+ if (addr && ether_addr_equal(addr, pri_ifp->mac_addr)) {
|
||||
+ brcmf_err("discovery vif must be different from primary interface\n");
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+ }
|
||||
+
|
||||
brcmf_p2p_generate_bss_mac(p2p, addr);
|
||||
brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
From 7742fce4c007141617dab9bcb90034b3c0fe2347 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Thu, 26 Apr 2018 12:18:35 +0200
|
||||
Subject: [PATCH] brcmfmac: reports boottime_ns while informing bss
|
||||
|
||||
Provides a timestamp in bss information so user space can see when the
|
||||
bss info was updated. Since tsf is not available from the dongle events
|
||||
boottime is reported instead.
|
||||
|
||||
Reported-by: Dmitry Shmidt <dimitrysh@google.com>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 26 +++++++++++-----------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2728,7 +2728,6 @@ static s32 brcmf_inform_single_bss(struc
|
||||
struct brcmf_bss_info_le *bi)
|
||||
{
|
||||
struct wiphy *wiphy = cfg_to_wiphy(cfg);
|
||||
- struct ieee80211_channel *notify_channel;
|
||||
struct cfg80211_bss *bss;
|
||||
struct ieee80211_supported_band *band;
|
||||
struct brcmu_chan ch;
|
||||
@@ -2738,7 +2737,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
u16 notify_interval;
|
||||
u8 *notify_ie;
|
||||
size_t notify_ielen;
|
||||
- s32 notify_signal;
|
||||
+ struct cfg80211_inform_bss bss_data = { 0 };
|
||||
|
||||
if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
|
||||
brcmf_err("Bss info is larger than buffer. Discarding\n");
|
||||
@@ -2758,27 +2757,28 @@ static s32 brcmf_inform_single_bss(struc
|
||||
band = wiphy->bands[NL80211_BAND_5GHZ];
|
||||
|
||||
freq = ieee80211_channel_to_frequency(channel, band->band);
|
||||
- notify_channel = ieee80211_get_channel(wiphy, freq);
|
||||
+ bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
||||
+ bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
+ bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
||||
|
||||
notify_capability = le16_to_cpu(bi->capability);
|
||||
notify_interval = le16_to_cpu(bi->beacon_period);
|
||||
notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
|
||||
notify_ielen = le32_to_cpu(bi->ie_length);
|
||||
- notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100;
|
||||
+ bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100;
|
||||
|
||||
brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID);
|
||||
brcmf_dbg(CONN, "Channel: %d(%d)\n", channel, freq);
|
||||
brcmf_dbg(CONN, "Capability: %X\n", notify_capability);
|
||||
brcmf_dbg(CONN, "Beacon interval: %d\n", notify_interval);
|
||||
- brcmf_dbg(CONN, "Signal: %d\n", notify_signal);
|
||||
+ brcmf_dbg(CONN, "Signal: %d\n", bss_data.signal);
|
||||
|
||||
- bss = cfg80211_inform_bss(wiphy, notify_channel,
|
||||
- CFG80211_BSS_FTYPE_UNKNOWN,
|
||||
- (const u8 *)bi->BSSID,
|
||||
- 0, notify_capability,
|
||||
- notify_interval, notify_ie,
|
||||
- notify_ielen, notify_signal,
|
||||
- GFP_KERNEL);
|
||||
+ bss = cfg80211_inform_bss_data(wiphy, &bss_data,
|
||||
+ CFG80211_BSS_FTYPE_UNKNOWN,
|
||||
+ (const u8 *)bi->BSSID,
|
||||
+ 0, notify_capability,
|
||||
+ notify_interval, notify_ie,
|
||||
+ notify_ielen, GFP_KERNEL);
|
||||
|
||||
if (!bss)
|
||||
return -ENOMEM;
|
||||
@@ -0,0 +1,43 @@
|
||||
From aed14219067ab96e5eeb7730e9bceed10d9be989 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Thu, 26 Apr 2018 12:16:48 +0200
|
||||
Subject: [PATCH] brcmfmac: use nl80211_band directly to get ieee80211 channel
|
||||
|
||||
The enum nl80211_band used to retrieve wiphy->bands is the same as
|
||||
wiphy->bands->band which is checked by wiphy_register(). So it can be used
|
||||
directly as parameter of ieee80211_channel_to_frequency().
|
||||
|
||||
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/cfg80211.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2729,7 +2729,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
{
|
||||
struct wiphy *wiphy = cfg_to_wiphy(cfg);
|
||||
struct cfg80211_bss *bss;
|
||||
- struct ieee80211_supported_band *band;
|
||||
+ enum nl80211_band band;
|
||||
struct brcmu_chan ch;
|
||||
u16 channel;
|
||||
u32 freq;
|
||||
@@ -2752,11 +2752,11 @@ static s32 brcmf_inform_single_bss(struc
|
||||
channel = bi->ctl_ch;
|
||||
|
||||
if (channel <= CH_MAX_2G_CHANNEL)
|
||||
- band = wiphy->bands[NL80211_BAND_2GHZ];
|
||||
+ band = NL80211_BAND_2GHZ;
|
||||
else
|
||||
- band = wiphy->bands[NL80211_BAND_5GHZ];
|
||||
+ band = NL80211_BAND_5GHZ;
|
||||
|
||||
- freq = ieee80211_channel_to_frequency(channel, band->band);
|
||||
+ freq = ieee80211_channel_to_frequency(channel, band);
|
||||
bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
||||
bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
||||
@@ -0,0 +1,76 @@
|
||||
From ff68c9f9c06d1fd437c8f90fc05ca28c47f7d85e Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 26 Apr 2018 12:16:49 +0200
|
||||
Subject: [PATCH] brcmfmac: constify firmware mapping tables
|
||||
|
||||
The information in the firmware mapping does not need to be modified
|
||||
so it can be static const.
|
||||
|
||||
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/firmware.c | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 2 +-
|
||||
5 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -634,7 +634,7 @@ int brcmf_fw_get_firmwares(struct device
|
||||
|
||||
struct brcmf_fw_request *
|
||||
brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
- struct brcmf_firmware_mapping mapping_table[],
|
||||
+ const struct brcmf_firmware_mapping mapping_table[],
|
||||
u32 table_size, struct brcmf_fw_name *fwnames,
|
||||
u32 n_fwnames)
|
||||
{
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -80,7 +80,7 @@ struct brcmf_fw_name {
|
||||
|
||||
struct brcmf_fw_request *
|
||||
brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
- struct brcmf_firmware_mapping mapping_table[],
|
||||
+ const struct brcmf_firmware_mapping mapping_table[],
|
||||
u32 table_size, struct brcmf_fw_name *fwnames,
|
||||
u32 n_fwnames);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -59,7 +59,7 @@ BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie"
|
||||
BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
|
||||
BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
|
||||
|
||||
-static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
+static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C),
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -619,7 +619,7 @@ BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
|
||||
BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
|
||||
BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
|
||||
|
||||
-static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
+static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -52,7 +52,7 @@ BRCMF_FW_DEF(43242A, "brcmfmac43242a");
|
||||
BRCMF_FW_DEF(43569, "brcmfmac43569");
|
||||
BRCMF_FW_DEF(4373, "brcmfmac4373");
|
||||
|
||||
-static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
|
||||
+static const struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43235_CHIP_ID, 0x00000008, 43236B),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43236_CHIP_ID, 0x00000008, 43236B),
|
||||
@@ -0,0 +1,74 @@
|
||||
From 84ad327d18debe19b8d509059b61db445d048b02 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Thu, 26 Apr 2018 12:16:50 +0200
|
||||
Subject: [PATCH] brcmfmac: add hostready indication
|
||||
|
||||
A hostready signal is introduced to inform firmware through mailbox
|
||||
doorbell1 when common ring initialized or D3 exited.
|
||||
|
||||
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 | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -105,7 +105,8 @@ static const struct brcmf_firmware_mappi
|
||||
#define BRCMF_PCIE_PCIE2REG_MAILBOXMASK 0x4C
|
||||
#define BRCMF_PCIE_PCIE2REG_CONFIGADDR 0x120
|
||||
#define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124
|
||||
-#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX 0x140
|
||||
+#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0 0x140
|
||||
+#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1 0x144
|
||||
|
||||
#define BRCMF_PCIE2_INTA 0x01
|
||||
#define BRCMF_PCIE2_INTB 0x02
|
||||
@@ -140,6 +141,7 @@ static const struct brcmf_firmware_mappi
|
||||
#define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF
|
||||
#define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000
|
||||
#define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000
|
||||
+#define BRCMF_PCIE_SHARED_HOSTRDY_DB1 0x10000000
|
||||
|
||||
#define BRCMF_PCIE_FLAGS_HTOD_SPLIT 0x4000
|
||||
#define BRCMF_PCIE_FLAGS_DTOH_SPLIT 0x8000
|
||||
@@ -782,6 +784,12 @@ static void brcmf_pcie_intr_enable(struc
|
||||
BRCMF_PCIE_MB_INT_FN0_1);
|
||||
}
|
||||
|
||||
+static void brcmf_pcie_hostready(struct brcmf_pciedev_info *devinfo)
|
||||
+{
|
||||
+ if (devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1)
|
||||
+ brcmf_pcie_write_reg32(devinfo,
|
||||
+ BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, 1);
|
||||
+}
|
||||
|
||||
static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg)
|
||||
{
|
||||
@@ -924,7 +932,7 @@ static int brcmf_pcie_ring_mb_ring_bell(
|
||||
|
||||
brcmf_dbg(PCIE, "RING !\n");
|
||||
/* Any arbitrary value will do, lets use 1 */
|
||||
- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1);
|
||||
+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1728,6 +1736,7 @@ static void brcmf_pcie_setup(struct devi
|
||||
init_waitqueue_head(&devinfo->mbdata_resp_wait);
|
||||
|
||||
brcmf_pcie_intr_enable(devinfo);
|
||||
+ brcmf_pcie_hostready(devinfo);
|
||||
if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
|
||||
return;
|
||||
|
||||
@@ -1950,6 +1959,7 @@ static int brcmf_pcie_pm_leave_D3(struct
|
||||
brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
|
||||
brcmf_bus_change_state(bus, BRCMF_BUS_UP);
|
||||
brcmf_pcie_intr_enable(devinfo);
|
||||
+ brcmf_pcie_hostready(devinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -136,8 +136,9 @@ static const struct brcmf_firmware_mappi
|
||||
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
|
||||
@@ -318,6 +319,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,
|
||||
@@ -1007,8 +1016,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);
|
||||
@@ -1018,7 +1033,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) {
|
||||
@@ -1027,7 +1042,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
|
||||
@@ -963,6 +963,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
|
||||
@@ -6513,6 +6513,7 @@ static int brcmf_setup_wiphy(struct wiph
|
||||
|
||||
wiphy->flags |= WIPHY_FLAG_NETNS_OK |
|
||||
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,29 @@
|
||||
From 763ece85f45a6b93268e25a0abf02922f911dab4 Mon Sep 17 00:00:00 2001
|
||||
From: Franky Lin <franky.lin@broadcom.com>
|
||||
Date: Tue, 15 May 2018 11:14:44 +0200
|
||||
Subject: [PATCH] brcmfmac: fix initialization of struct cfg80211_inform_bss
|
||||
variable
|
||||
|
||||
This patch fixes a sparse warning "Using plain integer as NULL pointer"
|
||||
about cfg80211_inform_bss structure initialization.
|
||||
|
||||
Reported-by: kbuild test robot <lkp@intel.com>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
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
|
||||
@@ -2737,7 +2737,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
u16 notify_interval;
|
||||
u8 *notify_ie;
|
||||
size_t notify_ielen;
|
||||
- struct cfg80211_inform_bss bss_data = { 0 };
|
||||
+ struct cfg80211_inform_bss bss_data = {};
|
||||
|
||||
if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
|
||||
brcmf_err("Bss info is larger than buffer. Discarding\n");
|
||||
@@ -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
|
||||
@@ -165,6 +165,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);
|
||||
@@ -233,6 +268,7 @@ void brcmf_feat_attach(struct brcmf_pub
|
||||
void brcmf_feat_debugfs_create(struct brcmf_pub *drvr)
|
||||
{
|
||||
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,52 @@
|
||||
From f8793c26fe586659d6da3fa277e63961a69d314b Mon Sep 17 00:00:00 2001
|
||||
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 16 May 2018 14:11:58 +0200
|
||||
Subject: [PATCH] brcmfmac: move ALLFFMAC variable in flowring module
|
||||
|
||||
The only user of ALLFFMAC is the flowring module so no need to
|
||||
expose it in a header file.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 --
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | 2 --
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 2 ++
|
||||
3 files changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -36,8 +36,6 @@ MODULE_AUTHOR("Broadcom Corporation");
|
||||
MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
-const u8 ALLFFMAC[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
-
|
||||
#define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40
|
||||
#define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
@@ -19,8 +19,6 @@
|
||||
#include <linux/platform_data/brcmfmac.h>
|
||||
#include "fwil_types.h"
|
||||
|
||||
-extern const u8 ALLFFMAC[ETH_ALEN];
|
||||
-
|
||||
#define BRCMF_FW_ALTPATH_LEN 256
|
||||
|
||||
/* Definitions for the module global and device specific settings are defined
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
|
||||
@@ -46,6 +46,8 @@ static const u8 brcmf_flowring_prio2fifo
|
||||
3
|
||||
};
|
||||
|
||||
+static const u8 ALLFFMAC[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
+
|
||||
|
||||
static bool
|
||||
brcmf_flowring_is_tdls_mac(struct brcmf_flowring *flow, u8 mac[ETH_ALEN])
|
||||
@@ -0,0 +1,76 @@
|
||||
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.
|
||||
|
||||
[rafal@milecki.pl: use LINUX_VERSION_CODE]
|
||||
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>
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
---
|
||||
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
|
||||
@@ -1165,6 +1165,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, 17, 0)
|
||||
+ .coredump = brcmf_dev_coredump,
|
||||
+#endif
|
||||
},
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -250,6 +250,8 @@ int brcmf_attach(struct device *dev, str
|
||||
void brcmf_detach(struct device *dev);
|
||||
/* Indication from bus module that dongle should be reset */
|
||||
void brcmf_dev_reset(struct device *dev);
|
||||
+/* Request from bus module to initiate a coredump */
|
||||
+void brcmf_dev_coredump(struct device *dev);
|
||||
|
||||
/* Configure the "global" bus state used by upper layers */
|
||||
void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1201,6 +1201,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
|
||||
@@ -2044,6 +2044,9 @@ static struct pci_driver brcmf_pciedrvr
|
||||
#ifdef CONFIG_PM
|
||||
.driver.pm = &brcmf_pciedrvr_pm,
|
||||
#endif
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 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
|
||||
@@ -40,7 +40,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
|
||||
@@ -182,6 +182,7 @@ static const struct brcmf_firmware_mappi
|
||||
#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
|
||||
@@ -717,6 +718,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,30 @@
|
||||
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>
|
||||
---
|
||||
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
|
||||
@@ -1072,8 +1072,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->func1->dev);
|
||||
+ }
|
||||
|
||||
/* Dongle recomposed rx frames, accept them again */
|
||||
if (hmb_data & HMB_DATA_NAKHANDLED) {
|
||||
@@ -0,0 +1,70 @@
|
||||
From 373c83a801f15b1e3d02d855fad89112bd4ccbe0 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Trimarchi <michael@amarulasolutions.com>
|
||||
Date: Wed, 30 May 2018 11:06:34 +0200
|
||||
Subject: [PATCH] brcmfmac: stop watchdog before detach and free everything
|
||||
|
||||
Using built-in in kernel image without a firmware in filesystem
|
||||
or in the kernel image can lead to a kernel NULL pointer deference.
|
||||
Watchdog need to be stopped in brcmf_sdio_remove
|
||||
|
||||
The system is going down NOW!
|
||||
[ 1348.110759] Unable to handle kernel NULL pointer dereference at virtual address 000002f8
|
||||
Sent SIGTERM to all processes
|
||||
[ 1348.121412] Mem abort info:
|
||||
[ 1348.126962] ESR = 0x96000004
|
||||
[ 1348.130023] Exception class = DABT (current EL), IL = 32 bits
|
||||
[ 1348.135948] SET = 0, FnV = 0
|
||||
[ 1348.138997] EA = 0, S1PTW = 0
|
||||
[ 1348.142154] Data abort info:
|
||||
[ 1348.145045] ISV = 0, ISS = 0x00000004
|
||||
[ 1348.148884] CM = 0, WnR = 0
|
||||
[ 1348.151861] user pgtable: 4k pages, 48-bit VAs, pgdp = (____ptrval____)
|
||||
[ 1348.158475] [00000000000002f8] pgd=0000000000000000
|
||||
[ 1348.163364] Internal error: Oops: 96000004 [#1] PREEMPT SMP
|
||||
[ 1348.168927] Modules linked in: ipv6
|
||||
[ 1348.172421] CPU: 3 PID: 1421 Comm: brcmf_wdog/mmc0 Not tainted 4.17.0-rc5-next-20180517 #18
|
||||
[ 1348.180757] Hardware name: Amarula A64-Relic (DT)
|
||||
[ 1348.185455] pstate: 60000005 (nZCv daif -PAN -UAO)
|
||||
[ 1348.190251] pc : brcmf_sdiod_freezer_count+0x0/0x20
|
||||
[ 1348.195124] lr : brcmf_sdio_watchdog_thread+0x64/0x290
|
||||
[ 1348.200253] sp : ffff00000b85be30
|
||||
[ 1348.203561] x29: ffff00000b85be30 x28: 0000000000000000
|
||||
[ 1348.208868] x27: ffff00000b6cb918 x26: ffff80003b990638
|
||||
[ 1348.214176] x25: ffff0000087b1a20 x24: ffff80003b94f800
|
||||
[ 1348.219483] x23: ffff000008e620c8 x22: ffff000008f0b660
|
||||
[ 1348.224790] x21: ffff000008c6a858 x20: 00000000fffffe00
|
||||
[ 1348.230097] x19: ffff80003b94f800 x18: 0000000000000001
|
||||
[ 1348.235404] x17: 0000ffffab2e8a74 x16: ffff0000080d7de8
|
||||
[ 1348.240711] x15: 0000000000000000 x14: 0000000000000400
|
||||
[ 1348.246018] x13: 0000000000000400 x12: 0000000000000001
|
||||
[ 1348.251324] x11: 00000000000002c4 x10: 0000000000000a10
|
||||
[ 1348.256631] x9 : ffff00000b85bc40 x8 : ffff80003be11870
|
||||
[ 1348.261937] x7 : ffff80003dfc7308 x6 : 000000078ff08b55
|
||||
[ 1348.267243] x5 : 00000139e1058400 x4 : 0000000000000000
|
||||
[ 1348.272550] x3 : dead000000000100 x2 : 958f2788d6618100
|
||||
[ 1348.277856] x1 : 00000000fffffe00 x0 : 0000000000000000
|
||||
|
||||
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Tested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4297,6 +4297,13 @@ void brcmf_sdio_remove(struct brcmf_sdio
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
if (bus) {
|
||||
+ /* Stop watchdog task */
|
||||
+ if (bus->watchdog_tsk) {
|
||||
+ send_sig(SIGTERM, bus->watchdog_tsk, 1);
|
||||
+ kthread_stop(bus->watchdog_tsk);
|
||||
+ bus->watchdog_tsk = NULL;
|
||||
+ }
|
||||
+
|
||||
/* De-register interrupt handler */
|
||||
brcmf_sdiod_intr_unregister(bus->sdiodev);
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From 299b6365a3b7cf7f5ea1c945a420e9ee4841d6f7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 22 Jul 2018 23:46:25 +0200
|
||||
Subject: [PATCH] brcmfmac: fix regression in parsing NVRAM for multiple
|
||||
devices
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
NVRAM is designed to work with Broadcom's SDK Linux kernel which fakes
|
||||
PCI domain 0 for all internal MMIO devices. Since official Linux kernel
|
||||
uses platform devices for that purpose there is a mismatch in numbering
|
||||
PCI domains.
|
||||
|
||||
There used to be a fix for that problem but it was accidentally dropped
|
||||
during the last firmware loading rework. That resulted in brcmfmac not
|
||||
being able to extract device specific NVRAM content and all kind of
|
||||
calibration problems.
|
||||
|
||||
Reported-by: Aditya Xavier <adityaxavier@gmail.com>
|
||||
Fixes: 2baa3aaee27f ("brcmfmac: introduce brcmf_fw_alloc_request() function")
|
||||
Cc: stable@vger.kernel.org # v4.17+
|
||||
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 | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1785,7 +1785,8 @@ brcmf_pcie_prepare_fw_request(struct brc
|
||||
fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
- fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus);
|
||||
+ /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
|
||||
+ fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||
fwreq->bus_nr = devinfo->pdev->bus->number;
|
||||
|
||||
return fwreq;
|
||||
@@ -0,0 +1,42 @@
|
||||
From 4f717a2589be649afddbbd3ac58b67ebfa7426f7 Mon Sep 17 00:00:00 2001
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 6 Jun 2018 10:18:31 +0200
|
||||
Subject: [PATCH v2] cfg80211: initialize sinfo in cfg80211_get_station
|
||||
|
||||
Most of the implementations behind cfg80211_get_station will not initialize
|
||||
sinfo to zero before manipulating it. For example, the member "filled",
|
||||
which indicates the filled in parts of this struct, is often only modified
|
||||
by enabling certain bits in the bitfield while keeping the remaining bits
|
||||
in their original state. A caller without a preinitialized sinfo.filled can
|
||||
then no longer decide which parts of sinfo were filled in by
|
||||
cfg80211_get_station (or actually the underlying implementations).
|
||||
|
||||
cfg80211_get_station must therefore take care that sinfo is initialized to
|
||||
zero. Otherwise, the caller may tries to read information which was not
|
||||
filled in and which must therefore also be considered uninitialized. In
|
||||
batadv_v_elp_get_throughput's case, an invalid "random" expected throughput
|
||||
may be stored for this neighbor and thus the B.A.T.M.A.N V algorithm may
|
||||
switch to non-optimal neighbors for certain destinations.
|
||||
|
||||
Fixes: 7406353d43c8 ("cfg80211: implement cfg80211_get_station cfg80211 API")
|
||||
Reported-by: Thomas Lauer <holminateur@gmail.com>
|
||||
Reported-by: Marcel Schmidt <ff.z-casparistrasse@mailbox.org>
|
||||
Cc: b.a.t.m.a.n@lists.open-mesh.org
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Forwarded: https://patchwork.kernel.org/patch/10449857/
|
||||
---
|
||||
net/wireless/util.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/net/wireless/util.c
|
||||
+++ b/net/wireless/util.c
|
||||
@@ -1749,6 +1749,8 @@ int cfg80211_get_station(struct net_devi
|
||||
if (!rdev->ops->get_station)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
+ memset(sinfo, 0, sizeof(*sinfo));
|
||||
+
|
||||
return rdev_get_station(rdev, dev, mac_addr, sinfo);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_get_station);
|
||||
@@ -1,22 +0,0 @@
|
||||
From f15fbdcb03abdf7403e8ebba52791cc596a8a8a6 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 27 Jun 2016 14:08:47 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Accept firmware signature 0x88e0
|
||||
|
||||
rtl8188eu uses firmware signature 0x88e0
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -2097,6 +2097,7 @@ int rtl8xxxu_load_firmware(struct rtl8xx
|
||||
switch (signature & 0xfff0) {
|
||||
case 0x92e0:
|
||||
case 0x92c0:
|
||||
+ case 0x88e0:
|
||||
case 0x88c0:
|
||||
case 0x5300:
|
||||
case 0x2300:
|
||||
@@ -1,121 +0,0 @@
|
||||
From 6f971392cd52524058f179d7c78464d692fbb018 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 27 Jun 2016 14:23:44 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add initial code to detect 8188eu devices
|
||||
|
||||
So far this just detects the device and tries to load firmware.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/Makefile | 2 +-
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 65 ++++++++++++++++++++++
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 3 +
|
||||
4 files changed, 70 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/Makefile
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/Makefile
|
||||
@@ -1,4 +1,4 @@
|
||||
obj-$(CPTCFG_RTL8XXXU) += rtl8xxxu.o
|
||||
|
||||
rtl8xxxu-y := rtl8xxxu_core.o rtl8xxxu_8192e.o rtl8xxxu_8723b.o \
|
||||
- rtl8xxxu_8723a.o rtl8xxxu_8192c.o
|
||||
+ rtl8xxxu_8723a.o rtl8xxxu_8192c.o rtl8xxxu_8188e.o
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1446,6 +1446,7 @@ void rtl8xxxu_fill_txdesc_v2(struct ieee
|
||||
bool short_preamble, bool ampdu_enable,
|
||||
u32 rts_rate);
|
||||
|
||||
+extern struct rtl8xxxu_fileops rtl8188eu_fops;
|
||||
extern struct rtl8xxxu_fileops rtl8192cu_fops;
|
||||
extern struct rtl8xxxu_fileops rtl8192eu_fops;
|
||||
extern struct rtl8xxxu_fileops rtl8723au_fops;
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -0,0 +1,65 @@
|
||||
+/*
|
||||
+ * RTL8XXXU mac80211 USB driver - 8188e specific subdriver
|
||||
+ *
|
||||
+ * Copyright (c) 2014 - 2016 Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
+ *
|
||||
+ * Portions, notably calibration code:
|
||||
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
|
||||
+ *
|
||||
+ * This driver was written as a replacement for the vendor provided
|
||||
+ * rtl8723au driver. As the Realtek 8xxx chips are very similar in
|
||||
+ * their programming interface, I have started adding support for
|
||||
+ * additional 8xxx chips like the 8192cu, 8188cus, etc.
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of version 2 of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+ * more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+#include <linux/list.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include <linux/netdevice.h>
|
||||
+#include <linux/etherdevice.h>
|
||||
+#include <linux/ethtool.h>
|
||||
+#include <linux/wireless.h>
|
||||
+#include <linux/firmware.h>
|
||||
+#include <linux/moduleparam.h>
|
||||
+#include <net/mac80211.h>
|
||||
+#include "rtl8xxxu.h"
|
||||
+#include "rtl8xxxu_regs.h"
|
||||
+
|
||||
+static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rtl8188eu_load_firmware(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ char *fw_name;
|
||||
+ int ret;
|
||||
+
|
||||
+ fw_name = "rtlwifi/rtl8188eufw.bin";
|
||||
+
|
||||
+ ret = rtl8xxxu_load_firmware(priv, fw_name);
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+struct rtl8xxxu_fileops rtl8188eu_fops = {
|
||||
+ .parse_efuse = rtl8188eu_parse_efuse,
|
||||
+ .load_firmware = rtl8188eu_load_firmware,
|
||||
+ .reset_8051 = rtl8xxxu_reset_8051,
|
||||
+};
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -54,6 +54,7 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8723aufw_A.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8723aufw_B.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8723aufw_B_NoBT.bin");
|
||||
+MODULE_FIRMWARE("rtlwifi/rtl8188eufw.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");
|
||||
@@ -6212,6 +6213,8 @@ static const struct usb_device_id dev_ta
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0xb720, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8723bu_fops},
|
||||
#ifdef CPTCFG_RTL8XXXU_UNTESTED
|
||||
+{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8179, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (unsigned long)&rtl8188eu_fops},
|
||||
/* Still supported by rtlwifi */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8176, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
@@ -1,113 +0,0 @@
|
||||
From 6d5b4ef30046d74efe773613767d13d9ab95ed3d Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 27 Jun 2016 15:19:04 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add initial code to parse 8188eu efuse
|
||||
|
||||
This obtains the MAC address, but work is still needed to handle TX
|
||||
power settings.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 40 ++++++++++++++++++++++
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 34 ++++++++++++++++++
|
||||
2 files changed, 74 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -872,6 +872,45 @@ struct rtl8192eu_efuse {
|
||||
u8 res14[0xc3];
|
||||
};
|
||||
|
||||
+struct rtl8188eu_efuse {
|
||||
+ __le16 rtl_id;
|
||||
+ u8 res0[0x0e];
|
||||
+ u8 cck_tx_power_index_A[3]; /* 0x10 */
|
||||
+ u8 cck_tx_power_index_B[3];
|
||||
+ u8 ht40_1s_tx_power_index_A[3]; /* 0x16 */
|
||||
+ u8 ht40_1s_tx_power_index_B[3];
|
||||
+ u8 res1[0x9c];
|
||||
+ u8 channel_plan; /* 0xb8 */
|
||||
+ u8 xtal_k;
|
||||
+ u8 thermal_meter;
|
||||
+ u8 iqk_lck;
|
||||
+ u8 res2[5];
|
||||
+ u8 rf_board_option;
|
||||
+ u8 rf_feature_option;
|
||||
+ u8 rf_bt_setting;
|
||||
+ u8 eeprom_version;
|
||||
+ u8 eeprom_customer_id;
|
||||
+ u8 res3[3];
|
||||
+ u8 rf_antenna_option; /* 0xc9 */
|
||||
+ u8 res4[6];
|
||||
+ u8 vid; /* 0xd0 */
|
||||
+ u8 res5[1];
|
||||
+ u8 pid; /* 0xd2 */
|
||||
+ u8 res6[1];
|
||||
+ u8 usb_optional_function;
|
||||
+ u8 res7[2];
|
||||
+ u8 mac_addr[ETH_ALEN]; /* 0xd7 */
|
||||
+ u8 res8[2];
|
||||
+ u8 vendor_name[7];
|
||||
+ u8 res9[2];
|
||||
+ u8 device_name[0x0b]; /* 0xe8 */
|
||||
+ u8 res10[2];
|
||||
+ u8 serial[0x0b]; /* 0xf5 */
|
||||
+ u8 res11[0x30];
|
||||
+ u8 unknown[0x0d]; /* 0x130 */
|
||||
+ u8 res12[0xc3];
|
||||
+};
|
||||
+
|
||||
struct rtl8xxxu_reg8val {
|
||||
u16 reg;
|
||||
u8 val;
|
||||
@@ -1290,6 +1329,7 @@ struct rtl8xxxu_priv {
|
||||
struct rtl8723bu_efuse efuse8723bu;
|
||||
struct rtl8192cu_efuse efuse8192;
|
||||
struct rtl8192eu_efuse efuse8192eu;
|
||||
+ struct rtl8188eu_efuse efuse8188eu;
|
||||
} efuse_wifi;
|
||||
u32 adda_backup[RTL8XXXU_ADDA_REGS];
|
||||
u32 mac_backup[RTL8XXXU_MAC_REGS];
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -42,6 +42,40 @@
|
||||
|
||||
static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
+ struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu;
|
||||
+ int i;
|
||||
+
|
||||
+ if (efuse->rtl_id != cpu_to_le16(0x8129))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ether_addr_copy(priv->mac_addr, efuse->mac_addr);
|
||||
+
|
||||
+ memcpy(priv->cck_tx_power_index_A, efuse->cck_tx_power_index_A,
|
||||
+ sizeof(efuse->cck_tx_power_index_A));
|
||||
+ memcpy(priv->cck_tx_power_index_B, efuse->cck_tx_power_index_B,
|
||||
+ sizeof(efuse->cck_tx_power_index_B));
|
||||
+
|
||||
+ memcpy(priv->ht40_1s_tx_power_index_A,
|
||||
+ priv->efuse_wifi.efuse8188eu.ht40_1s_tx_power_index_A,
|
||||
+ sizeof(priv->ht40_1s_tx_power_index_A));
|
||||
+ memcpy(priv->ht40_1s_tx_power_index_B,
|
||||
+ priv->efuse_wifi.efuse8188eu.ht40_1s_tx_power_index_B,
|
||||
+ sizeof(priv->ht40_1s_tx_power_index_B));
|
||||
+
|
||||
+ dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name);
|
||||
+ dev_info(&priv->udev->dev, "Product: %.11s\n", efuse->device_name);
|
||||
+ dev_info(&priv->udev->dev, "Serial: %.11s\n", efuse->serial);
|
||||
+
|
||||
+ if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
|
||||
+ unsigned char *raw = priv->efuse_wifi.raw;
|
||||
+
|
||||
+ dev_info(&priv->udev->dev,
|
||||
+ "%s: dumping efuse (0x%02zx bytes):\n",
|
||||
+ __func__, sizeof(struct rtl8188eu_efuse));
|
||||
+ for (i = 0; i < sizeof(struct rtl8188eu_efuse); i += 8)
|
||||
+ dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
From ac5a363d61caee80e7b4464e55ab012a4450ef5d Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 27 Jun 2016 15:34:00 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Detect 8188eu parts correctly
|
||||
|
||||
8188 parts with chip_cut >= 2 are assumed to be 8188eu.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -1683,13 +1683,21 @@ static int rtl8xxxu_identify_chip(struct
|
||||
}
|
||||
priv->has_wifi = 1;
|
||||
} else {
|
||||
- sprintf(priv->chip_name, "8188CU");
|
||||
- priv->rf_paths = 1;
|
||||
- priv->rx_paths = 1;
|
||||
- priv->tx_paths = 1;
|
||||
- priv->rtl_chip = RTL8188C;
|
||||
- priv->usb_interrupts = 1;
|
||||
- priv->has_wifi = 1;
|
||||
+ if (priv->chip_cut >= 2) {
|
||||
+ sprintf(priv->chip_name, "8188EU");
|
||||
+ priv->rf_paths = 1;
|
||||
+ priv->rx_paths = 1;
|
||||
+ priv->tx_paths = 1;
|
||||
+ priv->rtl_chip = RTL8188E;
|
||||
+ } else {
|
||||
+ sprintf(priv->chip_name, "8188CU");
|
||||
+ priv->rf_paths = 1;
|
||||
+ priv->rx_paths = 1;
|
||||
+ priv->tx_paths = 1;
|
||||
+ priv->rtl_chip = RTL8188C;
|
||||
+ priv->usb_interrupts = 1;
|
||||
+ priv->has_wifi = 1;
|
||||
+ }
|
||||
}
|
||||
|
||||
switch (priv->rtl_chip) {
|
||||
@@ -1,105 +0,0 @@
|
||||
From a7c3d46915bce6d84e61e684e76564b034bdc1a9 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 27 Jun 2016 17:08:30 -0400
|
||||
Subject: [PATCH] rtl8xxxu: First stab at rtl8188e_power_on()
|
||||
|
||||
Code based on code from Andrea Merello.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 82 ++++++++++++++++++++++
|
||||
1 file changed, 82 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -92,8 +92,90 @@ static int rtl8188eu_load_firmware(struc
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int rtl8188e_emu_to_active(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ u8 val8;
|
||||
+ u32 val32;
|
||||
+ u16 val16;
|
||||
+ int count, ret = 0;
|
||||
+
|
||||
+ /* wait till 0x04[17] = 1 power ready*/
|
||||
+ for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
|
||||
+ val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
|
||||
+ if (val32 & BIT(17))
|
||||
+ break;
|
||||
+
|
||||
+ udelay(10);
|
||||
+ }
|
||||
+
|
||||
+ if (!count) {
|
||||
+ ret = -EBUSY;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ /* reset baseband */
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC);
|
||||
+ val8 &= ~(SYS_FUNC_BBRSTB | SYS_FUNC_BB_GLB_RSTN);
|
||||
+ rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
|
||||
+
|
||||
+ /*0x24[23] = 2b'01 schmit trigger */
|
||||
+ val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL);
|
||||
+ val32 |= BIT(23);
|
||||
+ rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32);
|
||||
+
|
||||
+ /* 0x04[15] = 0 disable HWPDN (control by DRV)*/
|
||||
+ val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
|
||||
+ val16 &= ~APS_FSMCO_HW_POWERDOWN;
|
||||
+ rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
|
||||
+
|
||||
+ /*0x04[12:11] = 2b'00 disable WL suspend*/
|
||||
+ val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
|
||||
+ val16 &= ~(APS_FSMCO_HW_SUSPEND | APS_FSMCO_PCIE);
|
||||
+ rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
|
||||
+
|
||||
+ /* set, then poll until 0 */
|
||||
+ val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
|
||||
+ val32 |= APS_FSMCO_MAC_ENABLE;
|
||||
+ rtl8xxxu_write32(priv, REG_APS_FSMCO, val32);
|
||||
+
|
||||
+ for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
|
||||
+ val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
|
||||
+ if ((val32 & APS_FSMCO_MAC_ENABLE) == 0) {
|
||||
+ ret = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ udelay(10);
|
||||
+ }
|
||||
+
|
||||
+ if (!count) {
|
||||
+ ret = -EBUSY;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ /* LDO normal mode*/
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_LPLDO_CTRL);
|
||||
+ val8 &= ~BIT(4);
|
||||
+ rtl8xxxu_write8(priv, REG_LPLDO_CTRL, val8);
|
||||
+
|
||||
+exit:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int rtl8188eu_power_on(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = rtl8188e_emu_to_active(priv);
|
||||
+ if (ret)
|
||||
+ goto exit;
|
||||
+
|
||||
+exit:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
struct rtl8xxxu_fileops rtl8188eu_fops = {
|
||||
.parse_efuse = rtl8188eu_parse_efuse,
|
||||
.load_firmware = rtl8188eu_load_firmware,
|
||||
+ .power_on = rtl8188eu_power_on,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
};
|
||||
@@ -1,40 +0,0 @@
|
||||
From b7335df2dc1b4c6c69ac6b95910d09a7dd5295a7 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 10:38:52 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add rtl8188e_disabled_to_emu()
|
||||
|
||||
This sequence is found in the vendor driver, but never actually
|
||||
called. It's unclear if we need it.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -92,6 +92,15 @@ static int rtl8188eu_load_firmware(struc
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void rtl8188e_disabled_to_emu(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ u16 val16;
|
||||
+
|
||||
+ val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
|
||||
+ val16 &= ~(APS_FSMCO_PFM_WOWL | APS_FSMCO_ENABLE_POWERDOWN);
|
||||
+ rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
|
||||
+}
|
||||
+
|
||||
static int rtl8188e_emu_to_active(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
u8 val8;
|
||||
@@ -165,6 +174,8 @@ static int rtl8188eu_power_on(struct rtl
|
||||
{
|
||||
int ret;
|
||||
|
||||
+ rtl8188e_disabled_to_emu(priv);
|
||||
+
|
||||
ret = rtl8188e_emu_to_active(priv);
|
||||
if (ret)
|
||||
goto exit;
|
||||
@@ -1,45 +0,0 @@
|
||||
From 682ffd261c494581b8fdbc81f42035a53c67f5c4 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 11:07:13 -0400
|
||||
Subject: [PATCH] rtl8xxxu: 8188e: Enable scheduler
|
||||
|
||||
This enables the schduler, DMA, etc, except for MAC RX/TX which has to
|
||||
be set after REG_TRXFF_BNDY due to a hardware bug in the 8188e
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -172,6 +172,7 @@ exit:
|
||||
|
||||
static int rtl8188eu_power_on(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
+ u16 val16;
|
||||
int ret;
|
||||
|
||||
rtl8188e_disabled_to_emu(priv);
|
||||
@@ -180,6 +181,21 @@ static int rtl8188eu_power_on(struct rtl
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
+ /*
|
||||
+ * Enable MAC DMA/WMAC/SCHEDULE/SEC block
|
||||
+ * Set CR bit10 to enable 32k calibration.
|
||||
+ * We do not set CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE here
|
||||
+ * due to a hardware bug in the 88E, requiring those to be
|
||||
+ * set after REG_TRXFF_BNDY is set. If not the RXFF bundary
|
||||
+ * will get set to a larger buffer size than the real buffer
|
||||
+ * size.
|
||||
+ */
|
||||
+ val16 = (CR_HCI_TXDMA_ENABLE | CR_HCI_RXDMA_ENABLE |
|
||||
+ CR_TXDMA_ENABLE | CR_RXDMA_ENABLE |
|
||||
+ CR_PROTOCOL_ENABLE | CR_SCHEDULE_ENABLE |
|
||||
+ CR_SECURITY_ENABLE | CR_CALTIMER_ENABLE);
|
||||
+ rtl8xxxu_write16(priv, REG_CR, val16);
|
||||
+
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
From 58edb5e9811879e0a8e87f90057f12f615eab2d1 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 11:47:10 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add rtl8188e_usb_quirk() for enabling MAC TX/RX
|
||||
|
||||
Due to a bug in the 8188e chips, this has to be done after setting
|
||||
REG_TRXFF_BNDY.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -200,9 +200,24 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void rtl8188e_usb_quirks(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ u16 val16;
|
||||
+
|
||||
+ /*
|
||||
+ * Technically this is not a USB quirk, but a chip quirk.
|
||||
+ * This has to be done after REG_TRXFF_BNDY is set, see
|
||||
+ * rtl8188eu_power_on() for details.
|
||||
+ */
|
||||
+ val16 = rtl8xxxu_read16(priv, REG_CR);
|
||||
+ val16 |= (CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE);
|
||||
+ rtl8xxxu_write16(priv, REG_CR, val16);
|
||||
+}
|
||||
+
|
||||
struct rtl8xxxu_fileops rtl8188eu_fops = {
|
||||
.parse_efuse = rtl8188eu_parse_efuse,
|
||||
.load_firmware = rtl8188eu_load_firmware,
|
||||
.power_on = rtl8188eu_power_on,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
+ .usb_quirks = rtl8188e_usb_quirks,
|
||||
};
|
||||
@@ -1,34 +0,0 @@
|
||||
From 3ab047939db70fcae2a7c5993a8feaf3ac413e35 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 11:53:31 -0400
|
||||
Subject: [PATCH] rtl8xxxu: 8188e add REG_TXDMA_OFFSET_CHK quirk
|
||||
|
||||
Enable quirk allowing TX DMA to drop redundant data of packet. This is
|
||||
the same quirk enabled on gen2 parts.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -203,6 +203,7 @@ exit:
|
||||
static void rtl8188e_usb_quirks(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
u16 val16;
|
||||
+ u32 val32;
|
||||
|
||||
/*
|
||||
* Technically this is not a USB quirk, but a chip quirk.
|
||||
@@ -212,6 +213,10 @@ static void rtl8188e_usb_quirks(struct r
|
||||
val16 = rtl8xxxu_read16(priv, REG_CR);
|
||||
val16 |= (CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE);
|
||||
rtl8xxxu_write16(priv, REG_CR, val16);
|
||||
+
|
||||
+ val32 = rtl8xxxu_read32(priv, REG_TXDMA_OFFSET_CHK);
|
||||
+ val32 |= TXDMA_OFFSET_DROP_DATA_EN;
|
||||
+ rtl8xxxu_write32(priv, REG_TXDMA_OFFSET_CHK, val32);
|
||||
}
|
||||
|
||||
struct rtl8xxxu_fileops rtl8188eu_fops = {
|
||||
@@ -1,45 +0,0 @@
|
||||
From 2bfba2657e3f99c6693ea30b60af4eb1d3e3950c Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 12:02:18 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add reserved page init parameters for 8188e
|
||||
|
||||
Signed-off-by: Andrea Merello <andrea.merello@gmail.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 6 ++++++
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 4 ++++
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -43,6 +43,7 @@
|
||||
#define REALTEK_USB_CMD_IDX 0x00
|
||||
|
||||
#define TX_TOTAL_PAGE_NUM 0xf8
|
||||
+#define TX_TOTAL_PAGE_NUM_8188E 0xa8
|
||||
#define TX_TOTAL_PAGE_NUM_8192E 0xf3
|
||||
#define TX_TOTAL_PAGE_NUM_8723B 0xf7
|
||||
/* (HPQ + LPQ + NPQ + PUBQ) = TX_TOTAL_PAGE_NUM */
|
||||
@@ -51,6 +52,11 @@
|
||||
#define TX_PAGE_NUM_LO_PQ 0x02
|
||||
#define TX_PAGE_NUM_NORM_PQ 0x02
|
||||
|
||||
+#define TX_PAGE_NUM_PUBQ_8188E 0x47
|
||||
+#define TX_PAGE_NUM_HI_PQ_8188E 0x29
|
||||
+#define TX_PAGE_NUM_LO_PQ_8188E 0x1c
|
||||
+#define TX_PAGE_NUM_NORM_PQ_8188E 0x1c
|
||||
+
|
||||
#define TX_PAGE_NUM_PUBQ_8192E 0xe7
|
||||
#define TX_PAGE_NUM_HI_PQ_8192E 0x08
|
||||
#define TX_PAGE_NUM_LO_PQ_8192E 0x0c
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -225,4 +225,8 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.power_on = rtl8188eu_power_on,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
.usb_quirks = rtl8188e_usb_quirks,
|
||||
+ .total_page_num = TX_TOTAL_PAGE_NUM_8188E,
|
||||
+ .page_num_hi = TX_PAGE_NUM_HI_PQ_8188E,
|
||||
+ .page_num_lo = TX_PAGE_NUM_LO_PQ_8188E,
|
||||
+ .page_num_norm = TX_PAGE_NUM_NORM_PQ_8188E,
|
||||
};
|
||||
@@ -1,24 +0,0 @@
|
||||
From ed4c1c87b4c2653f1528c886591bbddbb68216a1 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 8 Aug 2016 15:04:36 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Correct TX_TOTAL_PAGE_NUM for 8188eu
|
||||
|
||||
For some reason I had gotten this off-by-one when pulling them number
|
||||
from the vendor driver.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -43,7 +43,7 @@
|
||||
#define REALTEK_USB_CMD_IDX 0x00
|
||||
|
||||
#define TX_TOTAL_PAGE_NUM 0xf8
|
||||
-#define TX_TOTAL_PAGE_NUM_8188E 0xa8
|
||||
+#define TX_TOTAL_PAGE_NUM_8188E 0xa9
|
||||
#define TX_TOTAL_PAGE_NUM_8192E 0xf3
|
||||
#define TX_TOTAL_PAGE_NUM_8723B 0xf7
|
||||
/* (HPQ + LPQ + NPQ + PUBQ) = TX_TOTAL_PAGE_NUM */
|
||||
@@ -1,28 +0,0 @@
|
||||
From bc55b854b404de79353547013a8f1ae31855f7c5 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 12:08:31 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add trxff_boundary for 8188e
|
||||
|
||||
The 8188e presumably has a 10K buffer, but leave space for TX report
|
||||
or WOL pattern.
|
||||
|
||||
Signed-off-by: Andrea Merello <andrea.merello@gmail.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -225,6 +225,11 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.power_on = rtl8188eu_power_on,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
.usb_quirks = rtl8188e_usb_quirks,
|
||||
+ /*
|
||||
+ * Use 9K for 8188e normal chip
|
||||
+ * Max RX buffer = 10K - max(TxReportSize(64*8), WOLPattern(16*24))
|
||||
+ */
|
||||
+ .trxff_boundary = 0x23ff,
|
||||
.total_page_num = TX_TOTAL_PAGE_NUM_8188E,
|
||||
.page_num_hi = TX_PAGE_NUM_HI_PQ_8188E,
|
||||
.page_num_lo = TX_PAGE_NUM_LO_PQ_8188E,
|
||||
@@ -1,26 +0,0 @@
|
||||
From 29311af488cc1c1790a9b53c8073442548edd4bf Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 29 Jun 2016 15:03:54 -0400
|
||||
Subject: [PATCH] rtl8xxxu: 8188eu specify firmware block size and set
|
||||
power_off function
|
||||
|
||||
This uses a conservative firmware block size for now.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -223,8 +223,10 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.parse_efuse = rtl8188eu_parse_efuse,
|
||||
.load_firmware = rtl8188eu_load_firmware,
|
||||
.power_on = rtl8188eu_power_on,
|
||||
+ .power_off = rtl8xxxu_power_off,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
.usb_quirks = rtl8188e_usb_quirks,
|
||||
+ .writeN_block_size = 128,
|
||||
/*
|
||||
* Use 9K for 8188e normal chip
|
||||
* Max RX buffer = 10K - max(TxReportSize(64*8), WOLPattern(16*24))
|
||||
@@ -1,57 +0,0 @@
|
||||
From 96cb7475c4c5750e8dac3dc85638f8438b9bce4e Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Tue, 19 Jul 2016 15:04:24 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Add 8188e mac init table
|
||||
|
||||
This table was pulled from the vendor driver.
|
||||
|
||||
Signed-off-by: Andrea Merello <andrea.merello@gmail.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 28 ++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -40,6 +40,33 @@
|
||||
#include "rtl8xxxu.h"
|
||||
#include "rtl8xxxu_regs.h"
|
||||
|
||||
+static struct rtl8xxxu_reg8val rtl8188e_mac_init_table[] = {
|
||||
+ {0x026, 0x41}, {0x027, 0x35}, {0x428, 0x0a}, {0x429, 0x10},
|
||||
+ {0x430, 0x00}, {0x431, 0x01}, {0x432, 0x02}, {0x433, 0x04},
|
||||
+ {0x434, 0x05}, {0x435, 0x06}, {0x436, 0x07}, {0x437, 0x08},
|
||||
+ {0x438, 0x00}, {0x439, 0x00}, {0x43a, 0x01}, {0x43b, 0x02},
|
||||
+ {0x43c, 0x04}, {0x43d, 0x05}, {0x43e, 0x06}, {0x43f, 0x07},
|
||||
+ {0x440, 0x5d}, {0x441, 0x01}, {0x442, 0x00}, {0x444, 0x15},
|
||||
+ {0x445, 0xf0}, {0x446, 0x0f}, {0x447, 0x00}, {0x458, 0x41},
|
||||
+ {0x459, 0xa8}, {0x45a, 0x72}, {0x45b, 0xb9}, {0x460, 0x66},
|
||||
+ {0x461, 0x66}, {0x480, 0x08}, {0x4c8, 0xff}, {0x4c9, 0x08},
|
||||
+ {0x4cc, 0xff}, {0x4cd, 0xff}, {0x4ce, 0x01}, {0x4d3, 0x01},
|
||||
+ {0x500, 0x26}, {0x501, 0xa2}, {0x502, 0x2f}, {0x503, 0x00},
|
||||
+ {0x504, 0x28}, {0x505, 0xa3}, {0x506, 0x5e}, {0x507, 0x00},
|
||||
+ {0x508, 0x2b}, {0x509, 0xa4}, {0x50a, 0x5e}, {0x50b, 0x00},
|
||||
+ {0x50c, 0x4f}, {0x50d, 0xa4}, {0x50e, 0x00}, {0x50f, 0x00},
|
||||
+ {0x512, 0x1c}, {0x514, 0x0a}, {0x516, 0x0a}, {0x525, 0x4f},
|
||||
+ {0x550, 0x10}, {0x551, 0x10}, {0x559, 0x02}, {0x55d, 0xff},
|
||||
+ {0x605, 0x30}, {0x608, 0x0e}, {0x609, 0x2a}, {0x620, 0xff},
|
||||
+ {0x621, 0xff}, {0x622, 0xff}, {0x623, 0xff}, {0x624, 0xff},
|
||||
+ {0x625, 0xff}, {0x626, 0xff}, {0x627, 0xff}, {0x652, 0x20},
|
||||
+ {0x63c, 0x0a}, {0x63d, 0x0a}, {0x63e, 0x0e}, {0x63f, 0x0e},
|
||||
+ {0x640, 0x40}, {0x66e, 0x05}, {0x700, 0x21}, {0x701, 0x43},
|
||||
+ {0x702, 0x65}, {0x703, 0x87}, {0x708, 0x21}, {0x709, 0x43},
|
||||
+ {0x70a, 0x65}, {0x70b, 0x87},
|
||||
+ {0xffff, 0xff},
|
||||
+};
|
||||
+
|
||||
static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu;
|
||||
@@ -232,6 +259,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
* Max RX buffer = 10K - max(TxReportSize(64*8), WOLPattern(16*24))
|
||||
*/
|
||||
.trxff_boundary = 0x23ff,
|
||||
+ .mactable = rtl8188e_mac_init_table,
|
||||
.total_page_num = TX_TOTAL_PAGE_NUM_8188E,
|
||||
.page_num_hi = TX_PAGE_NUM_HI_PQ_8188E,
|
||||
.page_num_lo = TX_PAGE_NUM_LO_PQ_8188E,
|
||||
@@ -1,245 +0,0 @@
|
||||
From b6770f88fd208978bd84e7217fee9fedd9b3fa9f Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Tue, 19 Jul 2016 16:19:30 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Implement rtl8188eu_init_phy_bb()
|
||||
|
||||
This includes adding rtl8188eu_phy_init_table rtl8188e_agc_table, both
|
||||
extracted from the vendor driver.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 202 +++++++++++++++++++++
|
||||
1 file changed, 202 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -67,6 +67,174 @@ static struct rtl8xxxu_reg8val rtl8188e_
|
||||
{0xffff, 0xff},
|
||||
};
|
||||
|
||||
+static struct rtl8xxxu_reg32val rtl8188eu_phy_init_table[] = {
|
||||
+ {0x800, 0x80040000}, {0x804, 0x00000003},
|
||||
+ {0x808, 0x0000fc00}, {0x80c, 0x0000000a},
|
||||
+ {0x810, 0x10001331}, {0x814, 0x020c3d10},
|
||||
+ {0x818, 0x02200385}, {0x81c, 0x00000000},
|
||||
+ {0x820, 0x01000100}, {0x824, 0x00390204},
|
||||
+ {0x828, 0x00000000}, {0x82c, 0x00000000},
|
||||
+ {0x830, 0x00000000}, {0x834, 0x00000000},
|
||||
+ {0x838, 0x00000000}, {0x83c, 0x00000000},
|
||||
+ {0x840, 0x00010000}, {0x844, 0x00000000},
|
||||
+ {0x848, 0x00000000}, {0x84c, 0x00000000},
|
||||
+ {0x850, 0x00000000}, {0x854, 0x00000000},
|
||||
+ {0x858, 0x569a11a9}, {0x85c, 0x01000014},
|
||||
+ {0x860, 0x66f60110}, {0x864, 0x061f0649},
|
||||
+ {0x868, 0x00000000}, {0x86c, 0x27272700},
|
||||
+ {0x870, 0x07000760}, {0x874, 0x25004000},
|
||||
+ {0x878, 0x00000808}, {0x87c, 0x00000000},
|
||||
+ {0x880, 0xb0000c1c}, {0x884, 0x00000001},
|
||||
+ {0x888, 0x00000000}, {0x88c, 0xccc000c0},
|
||||
+ {0x890, 0x00000800}, {0x894, 0xfffffffe},
|
||||
+ {0x898, 0x40302010}, {0x89c, 0x00706050},
|
||||
+ {0x900, 0x00000000}, {0x904, 0x00000023},
|
||||
+ {0x908, 0x00000000}, {0x90c, 0x81121111},
|
||||
+ {0x910, 0x00000002}, {0x914, 0x00000201},
|
||||
+ {0xa00, 0x00d047c8}, {0xa04, 0x80ff000c},
|
||||
+ {0xa08, 0x8c838300}, {0xa0c, 0x2e7f120f},
|
||||
+ {0xa10, 0x9500bb78}, {0xa14, 0x1114d028},
|
||||
+ {0xa18, 0x00881117}, {0xa1c, 0x89140f00},
|
||||
+ {0xa20, 0x1a1b0000}, {0xa24, 0x090e1317},
|
||||
+ {0xa28, 0x00000204}, {0xa2c, 0x00d30000},
|
||||
+ {0xa70, 0x101fbf00}, {0xa74, 0x00000007},
|
||||
+ {0xa78, 0x00000900}, {0xa7c, 0x225b0606},
|
||||
+ {0xa80, 0x218075b1}, {0xb2c, 0x80000000},
|
||||
+ {0xc00, 0x48071d40}, {0xc04, 0x03a05611},
|
||||
+ {0xc08, 0x000000e4}, {0xc0c, 0x6c6c6c6c},
|
||||
+ {0xc10, 0x08800000}, {0xc14, 0x40000100},
|
||||
+ {0xc18, 0x08800000}, {0xc1c, 0x40000100},
|
||||
+ {0xc20, 0x00000000}, {0xc24, 0x00000000},
|
||||
+ {0xc28, 0x00000000}, {0xc2c, 0x00000000},
|
||||
+ {0xc30, 0x69e9ac47}, {0xc34, 0x469652af},
|
||||
+ {0xc38, 0x49795994}, {0xc3c, 0x0a97971c},
|
||||
+ {0xc40, 0x1f7c403f}, {0xc44, 0x000100b7},
|
||||
+ {0xc48, 0xec020107}, {0xc4c, 0x007f037f},
|
||||
+ {0xc50, 0x69553420}, {0xc54, 0x43bc0094},
|
||||
+ {0xc58, 0x00013169}, {0xc5c, 0x00250492},
|
||||
+ {0xc60, 0x00000000}, {0xc64, 0x7112848b},
|
||||
+ {0xc68, 0x47c00bff}, {0xc6c, 0x00000036},
|
||||
+ {0xc70, 0x2c7f000d}, {0xc74, 0x020610db},
|
||||
+ {0xc78, 0x0000001f}, {0xc7c, 0x00b91612},
|
||||
+ {0xc80, 0x390000e4}, {0xc84, 0x20f60000},
|
||||
+ {0xc88, 0x40000100}, {0xc8c, 0x20200000},
|
||||
+ {0xc90, 0x00091521}, {0xc94, 0x00000000},
|
||||
+ {0xc98, 0x00121820}, {0xc9c, 0x00007f7f},
|
||||
+ {0xca0, 0x00000000}, {0xca4, 0x000300a0},
|
||||
+ {0xca8, 0x00000000}, {0xcac, 0x00000000},
|
||||
+ {0xcb0, 0x00000000}, {0xcb4, 0x00000000},
|
||||
+ {0xcb8, 0x00000000}, {0xcbc, 0x28000000},
|
||||
+ {0xcc0, 0x00000000}, {0xcc4, 0x00000000},
|
||||
+ {0xcc8, 0x00000000}, {0xccc, 0x00000000},
|
||||
+ {0xcd0, 0x00000000}, {0xcd4, 0x00000000},
|
||||
+ {0xcd8, 0x64b22427}, {0xcdc, 0x00766932},
|
||||
+ {0xce0, 0x00222222}, {0xce4, 0x00000000},
|
||||
+ {0xce8, 0x37644302}, {0xcec, 0x2f97d40c},
|
||||
+ {0xd00, 0x00000740}, {0xd04, 0x00020401},
|
||||
+ {0xd08, 0x0000907f}, {0xd0c, 0x20010201},
|
||||
+ {0xd10, 0xa0633333}, {0xd14, 0x3333bc43},
|
||||
+ {0xd18, 0x7a8f5b6f}, {0xd2c, 0xcc979975},
|
||||
+ {0xd30, 0x00000000}, {0xd34, 0x80608000},
|
||||
+ {0xd38, 0x00000000}, {0xd3c, 0x00127353},
|
||||
+ {0xd40, 0x00000000}, {0xd44, 0x00000000},
|
||||
+ {0xd48, 0x00000000}, {0xd4c, 0x00000000},
|
||||
+ {0xd50, 0x6437140a}, {0xd54, 0x00000000},
|
||||
+ {0xd58, 0x00000282}, {0xd5c, 0x30032064},
|
||||
+ {0xd60, 0x4653de68}, {0xd64, 0x04518a3c},
|
||||
+ {0xd68, 0x00002101}, {0xd6c, 0x2a201c16},
|
||||
+ {0xd70, 0x1812362e}, {0xd74, 0x322c2220},
|
||||
+ {0xd78, 0x000e3c24}, {0xe00, 0x2d2d2d2d},
|
||||
+ {0xe04, 0x2d2d2d2d}, {0xe08, 0x0390272d},
|
||||
+ {0xe10, 0x2d2d2d2d}, {0xe14, 0x2d2d2d2d},
|
||||
+ {0xe18, 0x2d2d2d2d}, {0xe1c, 0x2d2d2d2d},
|
||||
+ {0xe28, 0x00000000}, {0xe30, 0x1000dc1f},
|
||||
+ {0xe34, 0x10008c1f}, {0xe38, 0x02140102},
|
||||
+ {0xe3c, 0x681604c2}, {0xe40, 0x01007c00},
|
||||
+ {0xe44, 0x01004800}, {0xe48, 0xfb000000},
|
||||
+ {0xe4c, 0x000028d1}, {0xe50, 0x1000dc1f},
|
||||
+ {0xe54, 0x10008c1f}, {0xe58, 0x02140102},
|
||||
+ {0xe5c, 0x28160d05}, {0xe60, 0x00000008},
|
||||
+ {0xe68, 0x001b25a4}, {0xe6c, 0x00c00014},
|
||||
+ {0xe70, 0x00c00014}, {0xe74, 0x01000014},
|
||||
+ {0xe78, 0x01000014}, {0xe7c, 0x01000014},
|
||||
+ {0xe80, 0x01000014}, {0xe84, 0x00c00014},
|
||||
+ {0xe88, 0x01000014}, {0xe8c, 0x00c00014},
|
||||
+ {0xed0, 0x00c00014}, {0xed4, 0x00c00014},
|
||||
+ {0xed8, 0x00c00014}, {0xedc, 0x00000014},
|
||||
+ {0xee0, 0x00000014}, {0xeec, 0x01c00014},
|
||||
+ {0xf14, 0x00000003}, {0xf4c, 0x00000000},
|
||||
+ {0xf00, 0x00000300},
|
||||
+ {0xffff, 0xffffffff},
|
||||
+};
|
||||
+
|
||||
+static struct rtl8xxxu_reg32val rtl8188e_agc_table[] = {
|
||||
+ {0xc78, 0xfb000001}, {0xc78, 0xfb010001},
|
||||
+ {0xc78, 0xfb020001}, {0xc78, 0xfb030001},
|
||||
+ {0xc78, 0xfb040001}, {0xc78, 0xfb050001},
|
||||
+ {0xc78, 0xfa060001}, {0xc78, 0xf9070001},
|
||||
+ {0xc78, 0xf8080001}, {0xc78, 0xf7090001},
|
||||
+ {0xc78, 0xf60a0001}, {0xc78, 0xf50b0001},
|
||||
+ {0xc78, 0xf40c0001}, {0xc78, 0xf30d0001},
|
||||
+ {0xc78, 0xf20e0001}, {0xc78, 0xf10f0001},
|
||||
+ {0xc78, 0xf0100001}, {0xc78, 0xef110001},
|
||||
+ {0xc78, 0xee120001}, {0xc78, 0xed130001},
|
||||
+ {0xc78, 0xec140001}, {0xc78, 0xeb150001},
|
||||
+ {0xc78, 0xea160001}, {0xc78, 0xe9170001},
|
||||
+ {0xc78, 0xe8180001}, {0xc78, 0xe7190001},
|
||||
+ {0xc78, 0xe61a0001}, {0xc78, 0xe51b0001},
|
||||
+ {0xc78, 0xe41c0001}, {0xc78, 0xe31d0001},
|
||||
+ {0xc78, 0xe21e0001}, {0xc78, 0xe11f0001},
|
||||
+ {0xc78, 0x8a200001}, {0xc78, 0x89210001},
|
||||
+ {0xc78, 0x88220001}, {0xc78, 0x87230001},
|
||||
+ {0xc78, 0x86240001}, {0xc78, 0x85250001},
|
||||
+ {0xc78, 0x84260001}, {0xc78, 0x83270001},
|
||||
+ {0xc78, 0x82280001}, {0xc78, 0x6b290001},
|
||||
+ {0xc78, 0x6a2a0001}, {0xc78, 0x692b0001},
|
||||
+ {0xc78, 0x682c0001}, {0xc78, 0x672d0001},
|
||||
+ {0xc78, 0x662e0001}, {0xc78, 0x652f0001},
|
||||
+ {0xc78, 0x64300001}, {0xc78, 0x63310001},
|
||||
+ {0xc78, 0x62320001}, {0xc78, 0x61330001},
|
||||
+ {0xc78, 0x46340001}, {0xc78, 0x45350001},
|
||||
+ {0xc78, 0x44360001}, {0xc78, 0x43370001},
|
||||
+ {0xc78, 0x42380001}, {0xc78, 0x41390001},
|
||||
+ {0xc78, 0x403a0001}, {0xc78, 0x403b0001},
|
||||
+ {0xc78, 0x403c0001}, {0xc78, 0x403d0001},
|
||||
+ {0xc78, 0x403e0001}, {0xc78, 0x403f0001},
|
||||
+ {0xc78, 0xfb400001}, {0xc78, 0xfb410001},
|
||||
+ {0xc78, 0xfb420001}, {0xc78, 0xfb430001},
|
||||
+ {0xc78, 0xfb440001}, {0xc78, 0xfb450001},
|
||||
+ {0xc78, 0xfb460001}, {0xc78, 0xfb470001},
|
||||
+ {0xc78, 0xfb480001}, {0xc78, 0xfa490001},
|
||||
+ {0xc78, 0xf94a0001}, {0xc78, 0xf84b0001},
|
||||
+ {0xc78, 0xf74c0001}, {0xc78, 0xf64d0001},
|
||||
+ {0xc78, 0xf54e0001}, {0xc78, 0xf44f0001},
|
||||
+ {0xc78, 0xf3500001}, {0xc78, 0xf2510001},
|
||||
+ {0xc78, 0xf1520001}, {0xc78, 0xf0530001},
|
||||
+ {0xc78, 0xef540001}, {0xc78, 0xee550001},
|
||||
+ {0xc78, 0xed560001}, {0xc78, 0xec570001},
|
||||
+ {0xc78, 0xeb580001}, {0xc78, 0xea590001},
|
||||
+ {0xc78, 0xe95a0001}, {0xc78, 0xe85b0001},
|
||||
+ {0xc78, 0xe75c0001}, {0xc78, 0xe65d0001},
|
||||
+ {0xc78, 0xe55e0001}, {0xc78, 0xe45f0001},
|
||||
+ {0xc78, 0xe3600001}, {0xc78, 0xe2610001},
|
||||
+ {0xc78, 0xc3620001}, {0xc78, 0xc2630001},
|
||||
+ {0xc78, 0xc1640001}, {0xc78, 0x8b650001},
|
||||
+ {0xc78, 0x8a660001}, {0xc78, 0x89670001},
|
||||
+ {0xc78, 0x88680001}, {0xc78, 0x87690001},
|
||||
+ {0xc78, 0x866a0001}, {0xc78, 0x856b0001},
|
||||
+ {0xc78, 0x846c0001}, {0xc78, 0x676d0001},
|
||||
+ {0xc78, 0x666e0001}, {0xc78, 0x656f0001},
|
||||
+ {0xc78, 0x64700001}, {0xc78, 0x63710001},
|
||||
+ {0xc78, 0x62720001}, {0xc78, 0x61730001},
|
||||
+ {0xc78, 0x60740001}, {0xc78, 0x46750001},
|
||||
+ {0xc78, 0x45760001}, {0xc78, 0x44770001},
|
||||
+ {0xc78, 0x43780001}, {0xc78, 0x42790001},
|
||||
+ {0xc78, 0x417a0001}, {0xc78, 0x407b0001},
|
||||
+ {0xc78, 0x407c0001}, {0xc78, 0x407d0001},
|
||||
+ {0xc78, 0x407e0001}, {0xc78, 0x407f0001},
|
||||
+ {0xffff, 0xffffffff}
|
||||
+};
|
||||
+
|
||||
static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu;
|
||||
@@ -89,6 +257,8 @@ static int rtl8188eu_parse_efuse(struct
|
||||
priv->efuse_wifi.efuse8188eu.ht40_1s_tx_power_index_B,
|
||||
sizeof(priv->ht40_1s_tx_power_index_B));
|
||||
|
||||
+ priv->xtalk = priv->efuse_wifi.efuse8188eu.xtal_k & 0x3f;
|
||||
+
|
||||
dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name);
|
||||
dev_info(&priv->udev->dev, "Product: %.11s\n", efuse->device_name);
|
||||
dev_info(&priv->udev->dev, "Serial: %.11s\n", efuse->serial);
|
||||
@@ -119,6 +289,37 @@ static int rtl8188eu_load_firmware(struc
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void rtl8188eu_init_phy_bb(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ u8 val8;
|
||||
+ u16 val16;
|
||||
+ u32 val32;
|
||||
+
|
||||
+ val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC);
|
||||
+ val16 |= SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB | SYS_FUNC_DIO_RF;
|
||||
+ rtl8xxxu_write16(priv, REG_SYS_FUNC, val16);
|
||||
+
|
||||
+ /*
|
||||
+ * Per vendor driver, run power sequence before init of RF
|
||||
+ */
|
||||
+ val8 = RF_ENABLE | RF_RSTB | RF_SDMRSTB;
|
||||
+ rtl8xxxu_write8(priv, REG_RF_CTRL, val8);
|
||||
+
|
||||
+ val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC);
|
||||
+ val16 |= (SYS_FUNC_USBA | SYS_FUNC_USBD |
|
||||
+ SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB);
|
||||
+ rtl8xxxu_write16(priv, REG_SYS_FUNC, val16);
|
||||
+
|
||||
+ rtl8xxxu_init_phy_regs(priv, rtl8188eu_phy_init_table);
|
||||
+ rtl8xxxu_init_phy_regs(priv, rtl8188e_agc_table);
|
||||
+
|
||||
+ val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL);
|
||||
+ val8 = priv->xtalk;
|
||||
+ val32 &= 0xff8007ff;
|
||||
+ val32 |= ((val8 | (val8 << 6)) << 11);
|
||||
+ rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32);
|
||||
+}
|
||||
+
|
||||
static void rtl8188e_disabled_to_emu(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
u16 val16;
|
||||
@@ -252,6 +453,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.power_on = rtl8188eu_power_on,
|
||||
.power_off = rtl8xxxu_power_off,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
+ .init_phy_bb = rtl8188eu_init_phy_bb,
|
||||
.usb_quirks = rtl8188e_usb_quirks,
|
||||
.writeN_block_size = 128,
|
||||
/*
|
||||
@@ -1,103 +0,0 @@
|
||||
From 0c6fa292a9c6d7f1b870c42ed9166674463206f1 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Tue, 19 Jul 2016 17:12:42 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Implement rtl8188eu_init_phy_rf()
|
||||
|
||||
Include the table rtl8188eu_radioa_init_table derived from vendor
|
||||
driver. The vendor table relies on a hack setting RF6052_REG_RCK1 +
|
||||
RF6052_REG_RCK2 with delays. This workaround is open coded here
|
||||
instead of modifying the table parsing code.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 65 ++++++++++++++++++++++
|
||||
1 file changed, 65 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -235,6 +235,54 @@ static struct rtl8xxxu_reg32val rtl8188e
|
||||
{0xffff, 0xffffffff}
|
||||
};
|
||||
|
||||
+static struct rtl8xxxu_rfregval rtl8188eu_radioa_init_table[] = {
|
||||
+ {0x00, 0x00030000}, {0x08, 0x00084000},
|
||||
+ {0x18, 0x00000407}, {0x19, 0x00000012},
|
||||
+ {0x1e, 0x00080009}, {0x1f, 0x00000880},
|
||||
+ {0x2f, 0x0001a060}, {0x3f, 0x00000000},
|
||||
+ {0x42, 0x000060c0}, {0x57, 0x000d0000},
|
||||
+ {0x58, 0x000be180}, {0x67, 0x00001552},
|
||||
+ {0x83, 0x00000000}, {0xb0, 0x000ff8fc},
|
||||
+ {0xb1, 0x00054400}, {0xb2, 0x000ccc19},
|
||||
+ {0xb4, 0x00043003}, {0xb6, 0x0004953e},
|
||||
+ {0xb7, 0x0001c718}, {0xb8, 0x000060ff},
|
||||
+ {0xb9, 0x00080001}, {0xba, 0x00040000},
|
||||
+ {0xbb, 0x00000400}, {0xbf, 0x000c0000},
|
||||
+ {0xc2, 0x00002400}, {0xc3, 0x00000009},
|
||||
+ {0xc4, 0x00040c91}, {0xc5, 0x00099999},
|
||||
+ {0xc6, 0x000000a3}, {0xc7, 0x00088820},
|
||||
+ {0xc8, 0x00076c06}, {0xc9, 0x00000000},
|
||||
+ {0xca, 0x00080000}, {0xdf, 0x00000180},
|
||||
+ {0xef, 0x000001a0}, {0x51, 0x0006b27d},
|
||||
+ {0x52, 0x0007e49d}, /* Set to 0x0007e4dd for SDIO */
|
||||
+ {0x53, 0x00000073}, {0x56, 0x00051ff3},
|
||||
+ {0x35, 0x00000086}, {0x35, 0x00000186},
|
||||
+ {0x35, 0x00000286}, {0x36, 0x00001c25},
|
||||
+ {0x36, 0x00009c25}, {0x36, 0x00011c25},
|
||||
+ {0x36, 0x00019c25}, {0xb6, 0x00048538},
|
||||
+ {0x18, 0x00000c07}, {0x5a, 0x0004bd00},
|
||||
+ {0x19, 0x000739d0}, {0x34, 0x0000adf3},
|
||||
+ {0x34, 0x00009df0}, {0x34, 0x00008ded},
|
||||
+ {0x34, 0x00007dea}, {0x34, 0x00006de7},
|
||||
+ {0x34, 0x000054ee}, {0x34, 0x000044eb},
|
||||
+ {0x34, 0x000034e8}, {0x34, 0x0000246b},
|
||||
+ {0x34, 0x00001468}, {0x34, 0x0000006d},
|
||||
+ {0x00, 0x00030159}, {0x84, 0x00068200},
|
||||
+ {0x86, 0x000000ce}, {0x87, 0x00048a00},
|
||||
+ {0x8e, 0x00065540}, {0x8f, 0x00088000},
|
||||
+ {0xef, 0x000020a0}, {0x3b, 0x000f02b0},
|
||||
+ {0x3b, 0x000ef7b0}, {0x3b, 0x000d4fb0},
|
||||
+ {0x3b, 0x000cf060}, {0x3b, 0x000b0090},
|
||||
+ {0x3b, 0x000a0080}, {0x3b, 0x00090080},
|
||||
+ {0x3b, 0x0008f780}, {0x3b, 0x000722b0},
|
||||
+ {0x3b, 0x0006f7b0}, {0x3b, 0x00054fb0},
|
||||
+ {0x3b, 0x0004f060}, {0x3b, 0x00030090},
|
||||
+ {0x3b, 0x00020080}, {0x3b, 0x00010080},
|
||||
+ {0x3b, 0x0000f780}, {0xef, 0x000000a0},
|
||||
+ {0x00, 0x00010159}, {0x18, 0x0000f407},
|
||||
+ {0xff, 0xffffffff}
|
||||
+};
|
||||
+
|
||||
static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu;
|
||||
@@ -320,6 +368,22 @@ static void rtl8188eu_init_phy_bb(struct
|
||||
rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32);
|
||||
}
|
||||
|
||||
+static int rtl8188eu_init_phy_rf(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = rtl8xxxu_init_phy_rf(priv, rtl8188eu_radioa_init_table, RF_A);
|
||||
+
|
||||
+ msleep(100);
|
||||
+ rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK2, 0x80003);
|
||||
+ msleep(100);
|
||||
+ rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK1, 0x00001);
|
||||
+ rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK2, 0x80000);
|
||||
+ rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_AC, 0x33e60);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static void rtl8188e_disabled_to_emu(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
u16 val16;
|
||||
@@ -454,6 +518,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.power_off = rtl8xxxu_power_off,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
.init_phy_bb = rtl8188eu_init_phy_bb,
|
||||
+ .init_phy_rf = rtl8188eu_init_phy_rf,
|
||||
.usb_quirks = rtl8188e_usb_quirks,
|
||||
.writeN_block_size = 128,
|
||||
/*
|
||||
@@ -1,24 +0,0 @@
|
||||
From 86d5a5f8e59e46c51a76a303f37ad6ce9c97b73e Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Tue, 19 Jul 2016 17:27:48 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Use auto LLT init for 8188e
|
||||
|
||||
The vendor driver uses IOL to init the LLT table for 8188e. Since we
|
||||
are trying to avoid dealing with IOL for now, gamble that auto LLT
|
||||
will work.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -517,6 +517,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.power_on = rtl8188eu_power_on,
|
||||
.power_off = rtl8xxxu_power_off,
|
||||
.reset_8051 = rtl8xxxu_reset_8051,
|
||||
+ .llt_init = rtl8xxxu_auto_llt_table,
|
||||
.init_phy_bb = rtl8188eu_init_phy_bb,
|
||||
.init_phy_rf = rtl8188eu_init_phy_rf,
|
||||
.usb_quirks = rtl8188e_usb_quirks,
|
||||
@@ -1,25 +0,0 @@
|
||||
From 519d0047f84cdd1050418bb86dd34a0c6df1206a Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 20 Jul 2016 14:32:46 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Do not set REG_FPGA0_TX_INFO on 8188eu
|
||||
|
||||
The vendor driver doesn't set this for 8188eu either. It is unclear if
|
||||
this is only relevant for gen1 parts.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3962,7 +3962,8 @@ static int rtl8xxxu_init_device(struct i
|
||||
goto exit;
|
||||
|
||||
/* RFSW Control - clear bit 14 ?? */
|
||||
- if (priv->rtl_chip != RTL8723B && priv->rtl_chip != RTL8192E)
|
||||
+ if (priv->rtl_chip != RTL8723B && priv->rtl_chip != RTL8192E &&
|
||||
+ priv->rtl_chip != RTL8188E)
|
||||
rtl8xxxu_write32(priv, REG_FPGA0_TX_INFO, 0x00000003);
|
||||
|
||||
val32 = FPGA0_RF_TRSW | FPGA0_RF_TRSWB | FPGA0_RF_ANTSW |
|
||||
@@ -1,27 +0,0 @@
|
||||
From a4234121f383eed37e0a5ea8aed56bb75027305c Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 20 Jul 2016 14:38:23 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Do not mess with REG_FPGA0_XA_RF_INT_OE either on
|
||||
8188eu
|
||||
|
||||
On older devices the vendor driver hard codes a value into
|
||||
REG_FPGA0_XA_RF_INT_OE for antenna selection. This probably shouldn't
|
||||
be done in the first place, but more investigation needs to be done to
|
||||
figure out how this really works.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3976,7 +3976,7 @@ static int rtl8xxxu_init_device(struct i
|
||||
rtl8xxxu_write32(priv, REG_FPGA0_XAB_RF_SW_CTRL, val32);
|
||||
|
||||
/* 0x860[6:5]= 00 - why? - this sets antenna B */
|
||||
- if (priv->rtl_chip != RTL8192E)
|
||||
+ if (priv->rtl_chip != RTL8192E && priv->rtl_chip != RTL8188E)
|
||||
rtl8xxxu_write32(priv, REG_FPGA0_XA_RF_INT_OE, 0x66f60210);
|
||||
|
||||
if (!macpower) {
|
||||
@@ -1,21 +0,0 @@
|
||||
From 497b244578992c6353d214140f026154e4f4f710 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 20 Jul 2016 15:59:31 -0400
|
||||
Subject: [PATCH] rtl8xxxu: Set transfer page size for 8188eu
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -527,6 +527,8 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
* Max RX buffer = 10K - max(TxReportSize(64*8), WOLPattern(16*24))
|
||||
*/
|
||||
.trxff_boundary = 0x23ff,
|
||||
+ .pbp_rx = PBP_PAGE_SIZE_128,
|
||||
+ .pbp_tx = PBP_PAGE_SIZE_128,
|
||||
.mactable = rtl8188e_mac_init_table,
|
||||
.total_page_num = TX_TOTAL_PAGE_NUM_8188E,
|
||||
.page_num_hi = TX_PAGE_NUM_HI_PQ_8188E,
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user