Compare commits
235 Commits
kernel5.4-
...
v18.06.0-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
13f64a1e59 | ||
|
|
d2aa3a1b62 | ||
|
|
78abc65347 | ||
|
|
55df39e684 | ||
|
|
97b1765a45 | ||
|
|
f27e0b6bc4 | ||
|
|
71825c0bd8 | ||
|
|
04353c3af8 | ||
|
|
6e4fb77f9e | ||
|
|
642acc0fb0 | ||
|
|
843e421a05 | ||
|
|
c4a0c0718a | ||
|
|
2ac5800fd9 | ||
|
|
7f3121cf8a | ||
|
|
c276abf061 | ||
|
|
7950e1b9f4 | ||
|
|
c2da3505e2 | ||
|
|
b72bced2d7 | ||
|
|
4e9fa569b0 | ||
|
|
29934e5f03 | ||
|
|
36234df96c | ||
|
|
0c4f658d58 | ||
|
|
9178dc282d | ||
|
|
1863c38643 | ||
|
|
7381ed3d01 | ||
|
|
5529e71357 | ||
|
|
615186d415 | ||
|
|
0daff7fe23 | ||
|
|
eb568e0aba | ||
|
|
da318f3522 | ||
|
|
afe0320ffc | ||
|
|
a1373bc6fc | ||
|
|
3a99b278cd | ||
|
|
2af5cfe9b7 | ||
|
|
3c4cf92f13 | ||
|
|
192866d2b8 | ||
|
|
2369c89b75 | ||
|
|
a21210fbb7 | ||
|
|
637d10d91e | ||
|
|
747600e93c | ||
|
|
25eb240f63 | ||
|
|
97cb9d04ee | ||
|
|
8af649756f | ||
|
|
b6c134f254 | ||
|
|
b85e150182 | ||
|
|
b3b81d9d2a | ||
|
|
520c656d7b | ||
|
|
370078466c | ||
|
|
ae0712ae8f | ||
|
|
38eee4da94 | ||
|
|
56f66be113 | ||
|
|
db969b2f30 | ||
|
|
1bb1239c28 | ||
|
|
4a571ae62b | ||
|
|
503f7f0614 | ||
|
|
697d7fd000 | ||
|
|
9fd0a2f273 | ||
|
|
29ba45bb35 | ||
|
|
0506039845 | ||
|
|
8e662b9654 | ||
|
|
da8fc1511f | ||
|
|
763c0473c8 | ||
|
|
b32c304be8 | ||
|
|
6f398aa762 | ||
|
|
d6ee5e462c | ||
|
|
4f765922f0 | ||
|
|
6cf00dcf7d | ||
|
|
4121018b3f | ||
|
|
5881e2434f | ||
|
|
be799e8c2a | ||
|
|
3b8e53f6af | ||
|
|
68598374d1 | ||
|
|
e0363a7d74 | ||
|
|
18f18a2054 | ||
|
|
244fd1aac6 | ||
|
|
8e1269c29d | ||
|
|
c0763f08a5 | ||
|
|
e6c17aa219 | ||
|
|
f18f08d9c8 | ||
|
|
21a12f4269 | ||
|
|
46e232d8a1 | ||
|
|
433fb7d2c7 | ||
|
|
48c5d6ab77 | ||
|
|
b8a5fc207a | ||
|
|
9811057ed1 | ||
|
|
c24c8bfd0a | ||
|
|
0c59c9c9db | ||
|
|
1199a91095 | ||
|
|
6f8eb1b50f | ||
|
|
805e59cdcc | ||
|
|
aa87a5cffb | ||
|
|
9310304d1a | ||
|
|
7128fe094f | ||
|
|
e5301885bc | ||
|
|
0239448532 | ||
|
|
b295e3a18d | ||
|
|
ba204d941c | ||
|
|
324ea1f414 | ||
|
|
82cfec057f | ||
|
|
b9555a9831 | ||
|
|
a973a0a38b | ||
|
|
0bfb41a55a | ||
|
|
bf5829ddf9 | ||
|
|
0037b13480 | ||
|
|
dd49c62611 | ||
|
|
17eb0c4872 | ||
|
|
8ccdf809c0 | ||
|
|
fa0275bd90 | ||
|
|
76ba98d9b0 | ||
|
|
45456fe0c8 | ||
|
|
ac24a026d2 | ||
|
|
f39a7179bc | ||
|
|
63c1719988 | ||
|
|
2301bbdf88 | ||
|
|
1df8281737 | ||
|
|
eac20ce427 | ||
|
|
c52cd4d8c3 | ||
|
|
bdddbe9718 | ||
|
|
8458febc01 | ||
|
|
a64a36308c | ||
|
|
715ff75b1b | ||
|
|
a6d825d735 | ||
|
|
d629e013ef | ||
|
|
65de91a884 | ||
|
|
e567d313b6 | ||
|
|
1b39b665c3 | ||
|
|
3ec4921c16 | ||
|
|
0882a4cf25 | ||
|
|
ec7d974055 | ||
|
|
742ac017ba | ||
|
|
66871d9c62 | ||
|
|
27223c0761 | ||
|
|
d805812e75 | ||
|
|
9361c359e4 | ||
|
|
0411d3f654 | ||
|
|
701a7b1c86 | ||
|
|
53507cef82 | ||
|
|
991ec8e5b2 | ||
|
|
23cdf9f246 | ||
|
|
16e0866a74 | ||
|
|
1f26cfc92b | ||
|
|
294a45adbe | ||
|
|
1deadfe3de | ||
|
|
95922e16d7 | ||
|
|
2c9e3736f4 | ||
|
|
a6a5de4ef3 | ||
|
|
9e4f4e1a1f | ||
|
|
8f2ac5c085 | ||
|
|
5d3b216d21 | ||
|
|
586872da59 | ||
|
|
acdac1aa55 | ||
|
|
0d6d8d71fc | ||
|
|
d4cad59927 | ||
|
|
09cb0a5626 | ||
|
|
0f35193aec | ||
|
|
1780f09ee3 | ||
|
|
fff02093e6 | ||
|
|
efdfb253d8 | ||
|
|
644f65afe1 | ||
|
|
f47b5802b5 | ||
|
|
f882f4474f | ||
|
|
9373836f94 | ||
|
|
d4df69697d | ||
|
|
dcd68100c2 | ||
|
|
e39414ed07 | ||
|
|
2b7289cd3b | ||
|
|
fdeba0e0ef | ||
|
|
c97189e26d | ||
|
|
8aae794e99 | ||
|
|
60522320f6 | ||
|
|
68586cf233 | ||
|
|
938908f400 | ||
|
|
a88ff7bf5b | ||
|
|
ff8bde5296 | ||
|
|
8948a78862 | ||
|
|
7d368e41ce | ||
|
|
fc6f1fd8fe | ||
|
|
54a864d914 | ||
|
|
4dab912edb | ||
|
|
72ebcef5be | ||
|
|
617b7e9bf4 | ||
|
|
323285ac00 | ||
|
|
dc7487885e | ||
|
|
f93c029395 |
@@ -1,9 +1,4 @@
|
||||
src-git packages https://git.openwrt.org/feed/packages.git
|
||||
src-git luci https://git.openwrt.org/project/luci.git
|
||||
src-git routing https://git.openwrt.org/feed/routing.git
|
||||
src-git telephony https://git.openwrt.org/feed/telephony.git
|
||||
#src-git video https://github.com/openwrt/video.git
|
||||
#src-git targets https://github.com/openwrt/targets.git
|
||||
#src-git management https://github.com/openwrt-management/packages.git
|
||||
#src-git oldpackages http://git.openwrt.org/packages.git
|
||||
#src-link custom /usr/src/openwrt/custom-feed
|
||||
src-git packages https://git.openwrt.org/feed/packages.git^05b9aceb00725b69220defaaad11f24b63731ac3
|
||||
src-git luci https://git.openwrt.org/project/luci.git^911219898f5e65e8bb867a8195812550cff583d5
|
||||
src-git routing https://git.openwrt.org/feed/routing.git^1b9d1c419f0ecefda51922a7845ab2183d6acd76
|
||||
src-git telephony https://git.openwrt.org/feed/telephony.git^278ca6938638aa2d5569b29166d157e0458f656e
|
||||
|
||||
@@ -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'; \
|
||||
echo 'src/gz %d_base %U/packages/%A/base'; \
|
||||
$(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)";)))) \
|
||||
$(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
|
||||
|
||||
@@ -60,7 +60,7 @@ endef
|
||||
|
||||
define Build/netgear-dni
|
||||
$(STAGING_DIR_HOST)/bin/mkdniimg \
|
||||
-B $(NETGEAR_BOARD_ID) -v $(VERSION_DIST).$(REVISION) \
|
||||
-B $(NETGEAR_BOARD_ID) -v $(VERSION_DIST).$(firstword $(subst -, ,$(REVISION))) \
|
||||
$(if $(NETGEAR_HW_ID),-H $(NETGEAR_HW_ID)) \
|
||||
-r "$(1)" \
|
||||
-i $@ -o $@.new
|
||||
@@ -135,7 +135,7 @@ define Build/lzma-no-dict
|
||||
endef
|
||||
|
||||
define Build/gzip
|
||||
gzip --force -9n -c $@ $(1) > $@.new
|
||||
gzip -f -9n -c $@ $(1) > $@.new
|
||||
@mv $@.new $@
|
||||
endef
|
||||
|
||||
@@ -186,6 +186,10 @@ define Build/append-ubi
|
||||
rm $@.tmp
|
||||
endef
|
||||
|
||||
define Build/append-uboot
|
||||
dd if=$(UBOOT_PATH) >> $@
|
||||
endef
|
||||
|
||||
define Build/pad-to
|
||||
dd if=$@ of=$@.new bs=$(1) conv=sync
|
||||
mv $@.new $@
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,13 +4,13 @@ LINUX_RELEASE?=1
|
||||
|
||||
LINUX_VERSION-3.18 = .71
|
||||
LINUX_VERSION-4.4 = .121
|
||||
LINUX_VERSION-4.9 = .96
|
||||
LINUX_VERSION-4.14 = .37
|
||||
LINUX_VERSION-4.9 = .111
|
||||
LINUX_VERSION-4.14 = .54
|
||||
|
||||
LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240
|
||||
LINUX_KERNEL_HASH-4.4.121 = 44a88268b5088dc326b30c9b9133ac35a9a200b636b7268d08f32abeae6ca729
|
||||
LINUX_KERNEL_HASH-4.9.96 = 826f596eb5197f8b17304649c2990dd7b766f5c79076cae79f4261c40cea877f
|
||||
LINUX_KERNEL_HASH-4.14.37 = 8197e7ed3620713e412905430a7bf93e2048384042ffba189a66f0eeb6908e92
|
||||
LINUX_KERNEL_HASH-4.9.111 = 5966558959dc580f163766f3fdefd7e57c01b2b45d51202d00b3807c253759dd
|
||||
LINUX_KERNEL_HASH-4.14.54 = 451642ac28c539a91072f1fb83b1c061d6d44df870ddf5562400ade5e1c4b6c6
|
||||
|
||||
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
|
||||
sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))
|
||||
|
||||
@@ -228,7 +228,7 @@ define Build/CoreTargets
|
||||
|
||||
ifneq ($(CONFIG_AUTOREMOVE),)
|
||||
compile:
|
||||
-touch $(PKG_BUILD_DIR)/.autoremove 2>/dev/null >/dev/null
|
||||
-touch -r $(PKG_BUILD_DIR)/.built $(PKG_BUILD_DIR)/.autoremove 2>/dev/null >/dev/null
|
||||
$(FIND) $(PKG_BUILD_DIR) -mindepth 1 -maxdepth 1 -not '(' -type f -and -name '.*' -and -size 0 ')' -and -not -name '.pkgdir' | \
|
||||
$(XARGS) rm -rf
|
||||
endif
|
||||
|
||||
@@ -138,9 +138,10 @@ $(eval $(call SetupHostCommand,bzip2,Please install 'bzip2', \
|
||||
$(eval $(call SetupHostCommand,wget,Please install GNU 'wget', \
|
||||
wget --version | grep GNU))
|
||||
|
||||
$(eval $(call SetupHostCommand,gtime,Please install GNU '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))
|
||||
time --version 2>&1 | grep GNU, \
|
||||
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;
|
||||
|
||||
@@ -43,7 +43,7 @@ log_make = \
|
||||
$(if $(BUILD_LOG), \
|
||||
set -o pipefail; \
|
||||
mkdir -p $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4));) \
|
||||
gtime -f "time: $(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2)\#%U\#%S\#%e" -- \
|
||||
env time -f "time: $(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2)\#%U\#%S\#%e" -- \
|
||||
$$(SUBMAKE) $(subdir_make_opts) $(if $(3),$(3)-)$(2) \
|
||||
$(if $(BUILD_LOG),SILENT= 2>&1 | tee $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2).txt)
|
||||
|
||||
|
||||
@@ -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),SNAPSHOT)
|
||||
VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),18.06.0-rc2)
|
||||
|
||||
VERSION_CODE:=$(call qstrip,$(CONFIG_VERSION_CODE))
|
||||
VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),$(REVISION))
|
||||
VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),r7141-e4d0ee5af5)
|
||||
|
||||
VERSION_REPO:=$(call qstrip,$(CONFIG_VERSION_REPO))
|
||||
VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.lede-project.org/snapshots)
|
||||
VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),http://downloads.openwrt.org/releases/18.06.0-rc2)
|
||||
|
||||
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/)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -39,7 +37,7 @@ endif
|
||||
define Package/base-files
|
||||
SECTION:=base
|
||||
CATEGORY:=Base system
|
||||
DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:lede-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool
|
||||
DEPENDS:=+netifd +libc +procd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:openwrt-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool
|
||||
TITLE:=Base filesystem for OpenWrt
|
||||
URL:=http://openwrt.org/
|
||||
VERSION:=$(PKG_RELEASE)-$(REVISION)
|
||||
|
||||
@@ -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
|
||||
=======================================================
|
||||
|
||||
|
||||
@@ -78,18 +78,18 @@ rootfs_type() {
|
||||
|
||||
get_image() { # <source> [ <command> ]
|
||||
local from="$1"
|
||||
local cat="$2"
|
||||
local cmd="$2"
|
||||
|
||||
if [ -z "$cat" ]; then
|
||||
if [ -z "$cmd" ]; then
|
||||
local magic="$(dd if="$from" bs=2 count=1 2>/dev/null | hexdump -n 2 -e '1/1 "%02x"')"
|
||||
case "$magic" in
|
||||
1f8b) cat="zcat";;
|
||||
425a) cat="bzcat";;
|
||||
*) cat="cat";;
|
||||
1f8b) cmd="zcat";;
|
||||
425a) cmd="bzcat";;
|
||||
*) cmd="cat";;
|
||||
esac
|
||||
fi
|
||||
|
||||
$cat "$from" 2>/dev/null
|
||||
cat "$from" 2>/dev/null | $cmd
|
||||
}
|
||||
|
||||
get_magic_word() {
|
||||
|
||||
@@ -183,7 +183,7 @@ if VERSIONOPT
|
||||
config VERSION_REPO
|
||||
string
|
||||
prompt "Release repository"
|
||||
default "http://downloads.lede-project.org/snapshots"
|
||||
default "http://downloads.openwrt.org/releases/18.06.0-rc2"
|
||||
help
|
||||
This is the repository address embedded in the image, it defaults
|
||||
to the trunk snapshot repo; the url may contain the following placeholders:
|
||||
@@ -253,7 +253,7 @@ if VERSIONOPT
|
||||
config VERSION_CODE_FILENAMES
|
||||
bool
|
||||
prompt "Revision code in filenames"
|
||||
default y
|
||||
default n
|
||||
help
|
||||
Enable this to include the revision identifier or the configured
|
||||
version code into the firmware image, SDK- and Image Builder archive
|
||||
@@ -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"
|
||||
|
||||
@@ -38,6 +38,7 @@ gl-ar750|\
|
||||
hornet-ub|\
|
||||
hornet-ub-x2|\
|
||||
jwap230|\
|
||||
koala|\
|
||||
mr1750|\
|
||||
mr1750v2|\
|
||||
mr600|\
|
||||
|
||||
@@ -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"
|
||||
|
||||
/*
|
||||
|
||||
@@ -15,6 +15,7 @@ PKG_HASH:=7e7477534409d5368eb1371ffde6820f0f79780a1a1f676161c48442cb303dfd
|
||||
|
||||
include $(INCLUDE_DIR)/u-boot.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
|
||||
define U-Boot/Default
|
||||
BUILD_TARGET:=mvebu
|
||||
@@ -31,6 +32,8 @@ endef
|
||||
UBOOT_TARGETS:= \
|
||||
clearfog
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
define Build/Configure
|
||||
# enable additional options beyond clearfog_defconfig
|
||||
echo CONFIG_NET_RANDOM_ETHADDR=y >> $(PKG_BUILD_DIR)/configs/$(BUILD_VARIANT)_defconfig
|
||||
|
||||
@@ -15,6 +15,7 @@ PKG_HASH:=6a018fd3caf58f3dcfa23ee989a82bd35df03af71872b9dca8c6d758a0d26c05
|
||||
|
||||
include $(INCLUDE_DIR)/u-boot.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
|
||||
define U-Boot/Default
|
||||
BUILD_TARGET:=mxs
|
||||
@@ -37,6 +38,8 @@ UBOOT_TARGETS := \
|
||||
|
||||
UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE)
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
define Build/InstallDev
|
||||
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-$(UBOOT_IMAGE)
|
||||
|
||||
306
package/boot/uboot-oxnas/patches/410-gcc-6-compiler.patch
Normal file
306
package/boot/uboot-oxnas/patches/410-gcc-6-compiler.patch
Normal file
@@ -0,0 +1,306 @@
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Sat, 7 Feb 2015 21:52:40 +0000 (+0100)
|
||||
Subject: Add linux/compiler-gcc6.h to fix builds with gcc6
|
||||
X-Git-Tag: v2015.04-rc2~31
|
||||
X-Git-Url: http://git.denx.de/?p=u-boot.git;a=commitdiff_plain;h=478b02f1a7043b673565075ea5016376f3293b23
|
||||
|
||||
Add linux/compiler-gcc6.h to fix builds with gcc6
|
||||
|
||||
Add linux/compiler-gcc6/h from the kernel sources at:
|
||||
|
||||
commit 5631b8fba640a4ab2f8a954f63a603fa34eda96b
|
||||
Author: Steven Noonan <steven@uplinklabs.net>
|
||||
Date: Sat Oct 25 15:09:42 2014 -0700
|
||||
|
||||
compiler/gcc4+: Remove inaccurate comment about 'asm goto' miscompiles
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
|
||||
--- /dev/null
|
||||
+++ b/include/linux/compiler-gcc6.h
|
||||
@@ -0,0 +1,284 @@
|
||||
+#ifndef __LINUX_COMPILER_H
|
||||
+#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Common definitions for all gcc versions go here.
|
||||
+ */
|
||||
+#define GCC_VERSION (__GNUC__ * 10000 \
|
||||
+ + __GNUC_MINOR__ * 100 \
|
||||
+ + __GNUC_PATCHLEVEL__)
|
||||
+
|
||||
+/* Optimization barrier */
|
||||
+
|
||||
+/* The "volatile" is due to gcc bugs */
|
||||
+#define barrier() __asm__ __volatile__("": : :"memory")
|
||||
+/*
|
||||
+ * This version is i.e. to prevent dead stores elimination on @ptr
|
||||
+ * where gcc and llvm may behave differently when otherwise using
|
||||
+ * normal barrier(): while gcc behavior gets along with a normal
|
||||
+ * barrier(), llvm needs an explicit input variable to be assumed
|
||||
+ * clobbered. The issue is as follows: while the inline asm might
|
||||
+ * access any memory it wants, the compiler could have fit all of
|
||||
+ * @ptr into memory registers instead, and since @ptr never escaped
|
||||
+ * from that, it proofed that the inline asm wasn't touching any of
|
||||
+ * it. This version works well with both compilers, i.e. we're telling
|
||||
+ * the compiler that the inline asm absolutely may see the contents
|
||||
+ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
|
||||
+ */
|
||||
+#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
|
||||
+
|
||||
+/*
|
||||
+ * This macro obfuscates arithmetic on a variable address so that gcc
|
||||
+ * shouldn't recognize the original var, and make assumptions about it.
|
||||
+ *
|
||||
+ * This is needed because the C standard makes it undefined to do
|
||||
+ * pointer arithmetic on "objects" outside their boundaries and the
|
||||
+ * gcc optimizers assume this is the case. In particular they
|
||||
+ * assume such arithmetic does not wrap.
|
||||
+ *
|
||||
+ * A miscompilation has been observed because of this on PPC.
|
||||
+ * To work around it we hide the relationship of the pointer and the object
|
||||
+ * using this macro.
|
||||
+ *
|
||||
+ * Versions of the ppc64 compiler before 4.1 had a bug where use of
|
||||
+ * RELOC_HIDE could trash r30. The bug can be worked around by changing
|
||||
+ * the inline assembly constraint from =g to =r, in this particular
|
||||
+ * case either is valid.
|
||||
+ */
|
||||
+#define RELOC_HIDE(ptr, off) \
|
||||
+({ \
|
||||
+ unsigned long __ptr; \
|
||||
+ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
|
||||
+ (typeof(ptr)) (__ptr + (off)); \
|
||||
+})
|
||||
+
|
||||
+/* Make the optimizer believe the variable can be manipulated arbitrarily. */
|
||||
+#define OPTIMIZER_HIDE_VAR(var) \
|
||||
+ __asm__ ("" : "=r" (var) : "0" (var))
|
||||
+
|
||||
+#ifdef __CHECKER__
|
||||
+#define __must_be_array(a) 0
|
||||
+#else
|
||||
+/* &a[0] degrades to a pointer: a different type from an array */
|
||||
+#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Force always-inline if the user requests it so via the .config,
|
||||
+ * or if gcc is too old:
|
||||
+ */
|
||||
+#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
||||
+ !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
|
||||
+#define inline inline __attribute__((always_inline)) notrace
|
||||
+#define __inline__ __inline__ __attribute__((always_inline)) notrace
|
||||
+#define __inline __inline __attribute__((always_inline)) notrace
|
||||
+#else
|
||||
+/* A lot of inline functions can cause havoc with function tracing */
|
||||
+#define inline inline notrace
|
||||
+#define __inline__ __inline__ notrace
|
||||
+#define __inline __inline notrace
|
||||
+#endif
|
||||
+
|
||||
+#define __always_inline inline __attribute__((always_inline))
|
||||
+#define noinline __attribute__((noinline))
|
||||
+
|
||||
+#define __deprecated __attribute__((deprecated))
|
||||
+#define __packed __attribute__((packed))
|
||||
+#define __weak __attribute__((weak))
|
||||
+#define __alias(symbol) __attribute__((alias(#symbol)))
|
||||
+
|
||||
+/*
|
||||
+ * it doesn't make sense on ARM (currently the only user of __naked)
|
||||
+ * to trace naked functions because then mcount is called without
|
||||
+ * stack and frame pointer being set up and there is no chance to
|
||||
+ * restore the lr register to the value before mcount was called.
|
||||
+ *
|
||||
+ * The asm() bodies of naked functions often depend on standard calling
|
||||
+ * conventions, therefore they must be noinline and noclone.
|
||||
+ *
|
||||
+ * GCC 4.[56] currently fail to enforce this, so we must do so ourselves.
|
||||
+ * See GCC PR44290.
|
||||
+ */
|
||||
+#define __naked __attribute__((naked)) noinline __noclone notrace
|
||||
+
|
||||
+#define __noreturn __attribute__((noreturn))
|
||||
+
|
||||
+/*
|
||||
+ * From the GCC manual:
|
||||
+ *
|
||||
+ * Many functions have no effects except the return value and their
|
||||
+ * return value depends only on the parameters and/or global
|
||||
+ * variables. Such a function can be subject to common subexpression
|
||||
+ * elimination and loop optimization just as an arithmetic operator
|
||||
+ * would be.
|
||||
+ * [...]
|
||||
+ */
|
||||
+#define __pure __attribute__((pure))
|
||||
+#define __aligned(x) __attribute__((aligned(x)))
|
||||
+#define __printf(a, b) __attribute__((format(printf, a, b)))
|
||||
+#define __scanf(a, b) __attribute__((format(scanf, a, b)))
|
||||
+#define __attribute_const__ __attribute__((__const__))
|
||||
+#define __maybe_unused __attribute__((unused))
|
||||
+#define __always_unused __attribute__((unused))
|
||||
+
|
||||
+/* gcc version specific checks */
|
||||
+
|
||||
+#if GCC_VERSION < 30200
|
||||
+# error Sorry, your compiler is too old - please upgrade it.
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION < 30300
|
||||
+# define __used __attribute__((__unused__))
|
||||
+#else
|
||||
+# define __used __attribute__((__used__))
|
||||
+#endif
|
||||
+
|
||||
+#ifdef CONFIG_GCOV_KERNEL
|
||||
+# if GCC_VERSION < 30400
|
||||
+# error "GCOV profiling support for gcc versions below 3.4 not included"
|
||||
+# endif /* __GNUC_MINOR__ */
|
||||
+#endif /* CONFIG_GCOV_KERNEL */
|
||||
+
|
||||
+#if GCC_VERSION >= 30400
|
||||
+#define __must_check __attribute__((warn_unused_result))
|
||||
+#define __malloc __attribute__((__malloc__))
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 40000
|
||||
+
|
||||
+/* GCC 4.1.[01] miscompiles __weak */
|
||||
+#ifdef __KERNEL__
|
||||
+# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
|
||||
+# error Your version of gcc miscompiles the __weak directive
|
||||
+# endif
|
||||
+#endif
|
||||
+
|
||||
+#define __used __attribute__((__used__))
|
||||
+#define __compiler_offsetof(a, b) \
|
||||
+ __builtin_offsetof(a, b)
|
||||
+
|
||||
+#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
|
||||
+# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 40300
|
||||
+/* Mark functions as cold. gcc will assume any path leading to a call
|
||||
+ * to them will be unlikely. This means a lot of manual unlikely()s
|
||||
+ * are unnecessary now for any paths leading to the usual suspects
|
||||
+ * like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||
+ * older compilers]
|
||||
+ *
|
||||
+ * Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||
+ * in the preprocessor, but we can live with this because they're unreleased.
|
||||
+ * Maketime probing would be overkill here.
|
||||
+ *
|
||||
+ * gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||
+ * a special section, but I don't see any sense in this right now in
|
||||
+ * the kernel context
|
||||
+ */
|
||||
+#define __cold __attribute__((__cold__))
|
||||
+
|
||||
+#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
+
|
||||
+#ifndef __CHECKER__
|
||||
+# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
+# define __compiletime_error(message) __attribute__((error(message)))
|
||||
+#endif /* __CHECKER__ */
|
||||
+#endif /* GCC_VERSION >= 40300 */
|
||||
+
|
||||
+#if GCC_VERSION >= 40500
|
||||
+/*
|
||||
+ * Mark a position in code as unreachable. This can be used to
|
||||
+ * suppress control flow warnings after asm blocks that transfer
|
||||
+ * control elsewhere.
|
||||
+ *
|
||||
+ * Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||
+ * this in the preprocessor, but we can live with this because they're
|
||||
+ * unreleased. Really, we need to have autoconf for the kernel.
|
||||
+ */
|
||||
+#define unreachable() __builtin_unreachable()
|
||||
+
|
||||
+/* Mark a function definition as prohibited from being cloned. */
|
||||
+#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
|
||||
+
|
||||
+#endif /* GCC_VERSION >= 40500 */
|
||||
+
|
||||
+#if GCC_VERSION >= 40600
|
||||
+/*
|
||||
+ * When used with Link Time Optimization, gcc can optimize away C functions or
|
||||
+ * variables which are referenced only from assembly code. __visible tells the
|
||||
+ * optimizer that something else uses this function or variable, thus preventing
|
||||
+ * this.
|
||||
+ */
|
||||
+#define __visible __attribute__((externally_visible))
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
+#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
|
||||
+/*
|
||||
+ * __assume_aligned(n, k): Tell the optimizer that the returned
|
||||
+ * pointer can be assumed to be k modulo n. The second argument is
|
||||
+ * optional (default 0), so we use a variadic macro to make the
|
||||
+ * shorthand.
|
||||
+ *
|
||||
+ * Beware: Do not apply this to functions which may return
|
||||
+ * ERR_PTRs. Also, it is probably unwise to apply it to functions
|
||||
+ * returning extra information in the low bits (but in that case the
|
||||
+ * compiler should see some alignment anyway, when the return value is
|
||||
+ * massaged by 'flags = ptr & 3; ptr &= ~3;').
|
||||
+ */
|
||||
+#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * GCC 'asm goto' miscompiles certain code sequences:
|
||||
+ *
|
||||
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
+ *
|
||||
+ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
+ *
|
||||
+ * (asm goto is automatically volatile - the naming reflects this.)
|
||||
+ */
|
||||
+#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
+
|
||||
+#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||
+#if GCC_VERSION >= 40400
|
||||
+#define __HAVE_BUILTIN_BSWAP32__
|
||||
+#define __HAVE_BUILTIN_BSWAP64__
|
||||
+#endif
|
||||
+#if GCC_VERSION >= 40800
|
||||
+#define __HAVE_BUILTIN_BSWAP16__
|
||||
+#endif
|
||||
+#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
+
|
||||
+#if GCC_VERSION >= 50000
|
||||
+#define KASAN_ABI_VERSION 4
|
||||
+#elif GCC_VERSION >= 40902
|
||||
+#define KASAN_ABI_VERSION 3
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 40902
|
||||
+/*
|
||||
+ * Tell the compiler that address safety instrumentation (KASAN)
|
||||
+ * should not be applied to that function.
|
||||
+ * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
|
||||
+ */
|
||||
+#define __no_sanitize_address __attribute__((no_sanitize_address))
|
||||
+#endif
|
||||
+
|
||||
+#endif /* gcc version >= 40000 specific checks */
|
||||
+
|
||||
+#if !defined(__noclone)
|
||||
+#define __noclone /* not needed */
|
||||
+#endif
|
||||
+
|
||||
+#if !defined(__no_sanitize_address)
|
||||
+#define __no_sanitize_address
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * A trick to suppress uninitialized variable warning without generating any
|
||||
+ * code
|
||||
+ */
|
||||
+#define uninitialized_var(x) x = x
|
||||
287
package/boot/uboot-oxnas/patches/420-gcc-7-compiler.patch
Normal file
287
package/boot/uboot-oxnas/patches/420-gcc-7-compiler.patch
Normal file
@@ -0,0 +1,287 @@
|
||||
--- /dev/null
|
||||
+++ b/include/linux/compiler-gcc7.h
|
||||
@@ -0,0 +1,284 @@
|
||||
+#ifndef __LINUX_COMPILER_H
|
||||
+#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Common definitions for all gcc versions go here.
|
||||
+ */
|
||||
+#define GCC_VERSION (__GNUC__ * 10000 \
|
||||
+ + __GNUC_MINOR__ * 100 \
|
||||
+ + __GNUC_PATCHLEVEL__)
|
||||
+
|
||||
+/* Optimization barrier */
|
||||
+
|
||||
+/* The "volatile" is due to gcc bugs */
|
||||
+#define barrier() __asm__ __volatile__("": : :"memory")
|
||||
+/*
|
||||
+ * This version is i.e. to prevent dead stores elimination on @ptr
|
||||
+ * where gcc and llvm may behave differently when otherwise using
|
||||
+ * normal barrier(): while gcc behavior gets along with a normal
|
||||
+ * barrier(), llvm needs an explicit input variable to be assumed
|
||||
+ * clobbered. The issue is as follows: while the inline asm might
|
||||
+ * access any memory it wants, the compiler could have fit all of
|
||||
+ * @ptr into memory registers instead, and since @ptr never escaped
|
||||
+ * from that, it proofed that the inline asm wasn't touching any of
|
||||
+ * it. This version works well with both compilers, i.e. we're telling
|
||||
+ * the compiler that the inline asm absolutely may see the contents
|
||||
+ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
|
||||
+ */
|
||||
+#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
|
||||
+
|
||||
+/*
|
||||
+ * This macro obfuscates arithmetic on a variable address so that gcc
|
||||
+ * shouldn't recognize the original var, and make assumptions about it.
|
||||
+ *
|
||||
+ * This is needed because the C standard makes it undefined to do
|
||||
+ * pointer arithmetic on "objects" outside their boundaries and the
|
||||
+ * gcc optimizers assume this is the case. In particular they
|
||||
+ * assume such arithmetic does not wrap.
|
||||
+ *
|
||||
+ * A miscompilation has been observed because of this on PPC.
|
||||
+ * To work around it we hide the relationship of the pointer and the object
|
||||
+ * using this macro.
|
||||
+ *
|
||||
+ * Versions of the ppc64 compiler before 4.1 had a bug where use of
|
||||
+ * RELOC_HIDE could trash r30. The bug can be worked around by changing
|
||||
+ * the inline assembly constraint from =g to =r, in this particular
|
||||
+ * case either is valid.
|
||||
+ */
|
||||
+#define RELOC_HIDE(ptr, off) \
|
||||
+({ \
|
||||
+ unsigned long __ptr; \
|
||||
+ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
|
||||
+ (typeof(ptr)) (__ptr + (off)); \
|
||||
+})
|
||||
+
|
||||
+/* Make the optimizer believe the variable can be manipulated arbitrarily. */
|
||||
+#define OPTIMIZER_HIDE_VAR(var) \
|
||||
+ __asm__ ("" : "=r" (var) : "0" (var))
|
||||
+
|
||||
+#ifdef __CHECKER__
|
||||
+#define __must_be_array(a) 0
|
||||
+#else
|
||||
+/* &a[0] degrades to a pointer: a different type from an array */
|
||||
+#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Force always-inline if the user requests it so via the .config,
|
||||
+ * or if gcc is too old:
|
||||
+ */
|
||||
+#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
|
||||
+ !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
|
||||
+#define inline inline __attribute__((always_inline)) notrace
|
||||
+#define __inline__ __inline__ __attribute__((always_inline)) notrace
|
||||
+#define __inline __inline __attribute__((always_inline)) notrace
|
||||
+#else
|
||||
+/* A lot of inline functions can cause havoc with function tracing */
|
||||
+#define inline inline notrace
|
||||
+#define __inline__ __inline__ notrace
|
||||
+#define __inline __inline notrace
|
||||
+#endif
|
||||
+
|
||||
+#define __always_inline inline __attribute__((always_inline))
|
||||
+#define noinline __attribute__((noinline))
|
||||
+
|
||||
+#define __deprecated __attribute__((deprecated))
|
||||
+#define __packed __attribute__((packed))
|
||||
+#define __weak __attribute__((weak))
|
||||
+#define __alias(symbol) __attribute__((alias(#symbol)))
|
||||
+
|
||||
+/*
|
||||
+ * it doesn't make sense on ARM (currently the only user of __naked)
|
||||
+ * to trace naked functions because then mcount is called without
|
||||
+ * stack and frame pointer being set up and there is no chance to
|
||||
+ * restore the lr register to the value before mcount was called.
|
||||
+ *
|
||||
+ * The asm() bodies of naked functions often depend on standard calling
|
||||
+ * conventions, therefore they must be noinline and noclone.
|
||||
+ *
|
||||
+ * GCC 4.[56] currently fail to enforce this, so we must do so ourselves.
|
||||
+ * See GCC PR44290.
|
||||
+ */
|
||||
+#define __naked __attribute__((naked)) noinline __noclone notrace
|
||||
+
|
||||
+#define __noreturn __attribute__((noreturn))
|
||||
+
|
||||
+/*
|
||||
+ * From the GCC manual:
|
||||
+ *
|
||||
+ * Many functions have no effects except the return value and their
|
||||
+ * return value depends only on the parameters and/or global
|
||||
+ * variables. Such a function can be subject to common subexpression
|
||||
+ * elimination and loop optimization just as an arithmetic operator
|
||||
+ * would be.
|
||||
+ * [...]
|
||||
+ */
|
||||
+#define __pure __attribute__((pure))
|
||||
+#define __aligned(x) __attribute__((aligned(x)))
|
||||
+#define __printf(a, b) __attribute__((format(printf, a, b)))
|
||||
+#define __scanf(a, b) __attribute__((format(scanf, a, b)))
|
||||
+#define __attribute_const__ __attribute__((__const__))
|
||||
+#define __maybe_unused __attribute__((unused))
|
||||
+#define __always_unused __attribute__((unused))
|
||||
+
|
||||
+/* gcc version specific checks */
|
||||
+
|
||||
+#if GCC_VERSION < 30200
|
||||
+# error Sorry, your compiler is too old - please upgrade it.
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION < 30300
|
||||
+# define __used __attribute__((__unused__))
|
||||
+#else
|
||||
+# define __used __attribute__((__used__))
|
||||
+#endif
|
||||
+
|
||||
+#ifdef CONFIG_GCOV_KERNEL
|
||||
+# if GCC_VERSION < 30400
|
||||
+# error "GCOV profiling support for gcc versions below 3.4 not included"
|
||||
+# endif /* __GNUC_MINOR__ */
|
||||
+#endif /* CONFIG_GCOV_KERNEL */
|
||||
+
|
||||
+#if GCC_VERSION >= 30400
|
||||
+#define __must_check __attribute__((warn_unused_result))
|
||||
+#define __malloc __attribute__((__malloc__))
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 40000
|
||||
+
|
||||
+/* GCC 4.1.[01] miscompiles __weak */
|
||||
+#ifdef __KERNEL__
|
||||
+# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
|
||||
+# error Your version of gcc miscompiles the __weak directive
|
||||
+# endif
|
||||
+#endif
|
||||
+
|
||||
+#define __used __attribute__((__used__))
|
||||
+#define __compiler_offsetof(a, b) \
|
||||
+ __builtin_offsetof(a, b)
|
||||
+
|
||||
+#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
|
||||
+# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 40300
|
||||
+/* Mark functions as cold. gcc will assume any path leading to a call
|
||||
+ * to them will be unlikely. This means a lot of manual unlikely()s
|
||||
+ * are unnecessary now for any paths leading to the usual suspects
|
||||
+ * like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||
+ * older compilers]
|
||||
+ *
|
||||
+ * Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||
+ * in the preprocessor, but we can live with this because they're unreleased.
|
||||
+ * Maketime probing would be overkill here.
|
||||
+ *
|
||||
+ * gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||
+ * a special section, but I don't see any sense in this right now in
|
||||
+ * the kernel context
|
||||
+ */
|
||||
+#define __cold __attribute__((__cold__))
|
||||
+
|
||||
+#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
+
|
||||
+#ifndef __CHECKER__
|
||||
+# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
+# define __compiletime_error(message) __attribute__((error(message)))
|
||||
+#endif /* __CHECKER__ */
|
||||
+#endif /* GCC_VERSION >= 40300 */
|
||||
+
|
||||
+#if GCC_VERSION >= 40500
|
||||
+/*
|
||||
+ * Mark a position in code as unreachable. This can be used to
|
||||
+ * suppress control flow warnings after asm blocks that transfer
|
||||
+ * control elsewhere.
|
||||
+ *
|
||||
+ * Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||
+ * this in the preprocessor, but we can live with this because they're
|
||||
+ * unreleased. Really, we need to have autoconf for the kernel.
|
||||
+ */
|
||||
+#define unreachable() __builtin_unreachable()
|
||||
+
|
||||
+/* Mark a function definition as prohibited from being cloned. */
|
||||
+#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
|
||||
+
|
||||
+#endif /* GCC_VERSION >= 40500 */
|
||||
+
|
||||
+#if GCC_VERSION >= 40600
|
||||
+/*
|
||||
+ * When used with Link Time Optimization, gcc can optimize away C functions or
|
||||
+ * variables which are referenced only from assembly code. __visible tells the
|
||||
+ * optimizer that something else uses this function or variable, thus preventing
|
||||
+ * this.
|
||||
+ */
|
||||
+#define __visible __attribute__((externally_visible))
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
+#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
|
||||
+/*
|
||||
+ * __assume_aligned(n, k): Tell the optimizer that the returned
|
||||
+ * pointer can be assumed to be k modulo n. The second argument is
|
||||
+ * optional (default 0), so we use a variadic macro to make the
|
||||
+ * shorthand.
|
||||
+ *
|
||||
+ * Beware: Do not apply this to functions which may return
|
||||
+ * ERR_PTRs. Also, it is probably unwise to apply it to functions
|
||||
+ * returning extra information in the low bits (but in that case the
|
||||
+ * compiler should see some alignment anyway, when the return value is
|
||||
+ * massaged by 'flags = ptr & 3; ptr &= ~3;').
|
||||
+ */
|
||||
+#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * GCC 'asm goto' miscompiles certain code sequences:
|
||||
+ *
|
||||
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
+ *
|
||||
+ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
+ *
|
||||
+ * (asm goto is automatically volatile - the naming reflects this.)
|
||||
+ */
|
||||
+#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
+
|
||||
+#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||
+#if GCC_VERSION >= 40400
|
||||
+#define __HAVE_BUILTIN_BSWAP32__
|
||||
+#define __HAVE_BUILTIN_BSWAP64__
|
||||
+#endif
|
||||
+#if GCC_VERSION >= 40800
|
||||
+#define __HAVE_BUILTIN_BSWAP16__
|
||||
+#endif
|
||||
+#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
+
|
||||
+#if GCC_VERSION >= 50000
|
||||
+#define KASAN_ABI_VERSION 4
|
||||
+#elif GCC_VERSION >= 40902
|
||||
+#define KASAN_ABI_VERSION 3
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 40902
|
||||
+/*
|
||||
+ * Tell the compiler that address safety instrumentation (KASAN)
|
||||
+ * should not be applied to that function.
|
||||
+ * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
|
||||
+ */
|
||||
+#define __no_sanitize_address __attribute__((no_sanitize_address))
|
||||
+#endif
|
||||
+
|
||||
+#endif /* gcc version >= 40000 specific checks */
|
||||
+
|
||||
+#if !defined(__noclone)
|
||||
+#define __noclone /* not needed */
|
||||
+#endif
|
||||
+
|
||||
+#if !defined(__no_sanitize_address)
|
||||
+#define __no_sanitize_address
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * A trick to suppress uninitialized variable warning without generating any
|
||||
+ * code
|
||||
+ */
|
||||
+#define uninitialized_var(x) x = x
|
||||
@@ -350,6 +350,7 @@
|
||||
#define CONFIG_CMD_GETTIME
|
||||
#define CONFIG_CMD_BOOTMENU
|
||||
#define CONFIG_CMD_ELF
|
||||
#define CONFIG_CMD_BOOTZ
|
||||
|
||||
#define CONFIG_DOS_PARTITION
|
||||
#define CONFIG_EFI_PARTITION
|
||||
|
||||
@@ -14,6 +14,7 @@ PKG_HASH:=e49337262ecac44dbdeac140f2c6ebd1eba345e0162b0464172e7f05583ed7bb
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
include $(INCLUDE_DIR)/u-boot.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
|
||||
define U-Boot/Default
|
||||
BUILD_TARGET:=zynq
|
||||
@@ -42,4 +43,6 @@ UBOOT_TARGETS := \
|
||||
zed \
|
||||
zybo
|
||||
|
||||
Build/Exports:=$(Host/Exports)
|
||||
|
||||
$(eval $(call BuildPackage/U-Boot))
|
||||
|
||||
@@ -14,7 +14,7 @@ define Build/Compile
|
||||
endef
|
||||
|
||||
#ALLWIFIBOARDS:=<devicename>
|
||||
ALLWIFIBOARDS:=
|
||||
ALLWIFIBOARDS:=zyxel_wre6606
|
||||
ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD))
|
||||
|
||||
define Package/ipq-wifi-default
|
||||
@@ -48,6 +48,7 @@ Don't install it for any other device!
|
||||
PREV_BOARD+=ipq-wifi-$(1)
|
||||
endef
|
||||
|
||||
$(eval $(call generate-ipq-wifi-package,zyxel_wre6606,board-zyxel_wre6606.bin,ZyXEL WRE6606))
|
||||
#$(eval $(call generate-ipq-wifi-package,<devicename>,<filename>,<displayname>))
|
||||
|
||||
$(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE))))
|
||||
|
||||
BIN
package/firmware/ipq-wifi/board-zyxel_wre6606.bin
Normal file
BIN
package/firmware/ipq-wifi/board-zyxel_wre6606.bin
Normal file
Binary file not shown.
@@ -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;
|
||||
@@ -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-07
|
||||
PKG_SOURCE_VERSION:=735eaf21e980117e171de9fe7ce046ab8e9f16db
|
||||
PKG_MIRROR_HASH:=4dd90cf152e876371d363f2442154464cffcee5d64b916a7f4a9fb897ff0d1d9
|
||||
PKG_SOURCE_DATE:=2018-07-06
|
||||
PKG_SOURCE_VERSION:=c91b94f0b4456c43def2e77248a455a9a2449ed1
|
||||
PKG_MIRROR_HASH:=e1b7081e1b559a9c01721ffc856debdb91e36488b51b9facb7db73f40ab85914
|
||||
PKG_MAINTAINER:=Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
--- a/src/drv_mei_cpe_api_atm_ptm_intern.c
|
||||
+++ b/src/drv_mei_cpe_api_atm_ptm_intern.c
|
||||
@@ -124,6 +124,9 @@ IFX_int32_t MEI_InternalXtmSwhowtimeExit
|
||||
/* Get line number*/
|
||||
dslLineNum = pMeiDynCntrl->pMeiDev->meiDrvCntrl.dslLineNum;
|
||||
|
||||
+ g_tx_link_rate[dslLineNum][0] = 0;
|
||||
+ g_tx_link_rate[dslLineNum][1] = 0;
|
||||
+
|
||||
/* get NULL or function pointer */
|
||||
mei_showtime_exit =
|
||||
(ltq_mei_atm_showtime_exit_t)ppa_callback_get(LTQ_MEI_SHOWTIME_EXIT);
|
||||
@@ -568,5 +568,3 @@ define KernelPackage/fuse/description
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,fuse))
|
||||
|
||||
|
||||
|
||||
@@ -411,7 +411,8 @@ $(eval $(call KernelPackage,rfkill))
|
||||
define KernelPackage/softdog
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Software watchdog driver
|
||||
KCONFIG:=CONFIG_SOFT_WATCHDOG
|
||||
KCONFIG:=CONFIG_SOFT_WATCHDOG \
|
||||
CONFIG_SOFT_WATCHDOG_PRETIMEOUT=n
|
||||
FILES:=$(LINUX_DIR)/drivers/$(WATCHDOG_DIR)/softdog.ko
|
||||
AUTOLOAD:=$(call AutoLoad,50,softdog,1)
|
||||
endef
|
||||
|
||||
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2017-11-01
|
||||
PKG_RELEASE:=8
|
||||
PKG_RELEASE:=9
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_HASH:=8437ab7886b988c8152e7a4db30b7f41009e49a3b2cb863edd05da1ecd7eb05a
|
||||
|
||||
@@ -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,43 @@
|
||||
From 52a192362932f333a7ebafd581c4d9b81da2fec8 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Mon, 28 May 2018 13:25:06 +0200
|
||||
Subject: [PATCH] Revert "rt2800: use TXOP_BACKOFF for probe frames"
|
||||
|
||||
This reverts commit fb47ada8dc3c30c8e7b415da155742b49536c61e.
|
||||
|
||||
In some situations when we set TXOP_BACKOFF, the probe frame is
|
||||
not sent at all. What it worse then sending probe frame as part
|
||||
of AMPDU and can degrade 11n performance to 11g rates.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
|
||||
@@ -372,16 +372,15 @@ static void rt2x00queue_create_tx_descri
|
||||
|
||||
/*
|
||||
* Determine IFS values
|
||||
- * - Use TXOP_BACKOFF for probe and management frames except beacons
|
||||
+ * - Use TXOP_BACKOFF for management frames except beacons
|
||||
* - Use TXOP_SIFS for fragment bursts
|
||||
* - Use TXOP_HTTXOP for everything else
|
||||
*
|
||||
* Note: rt2800 devices won't use CTS protection (if used)
|
||||
* for frames not transmitted with TXOP_HTTXOP
|
||||
*/
|
||||
- if ((ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
- !ieee80211_is_beacon(hdr->frame_control)) ||
|
||||
- (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE))
|
||||
+ if (ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
+ !ieee80211_is_beacon(hdr->frame_control))
|
||||
txdesc->u.ht.txop = TXOP_BACKOFF;
|
||||
else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
|
||||
txdesc->u.ht.txop = TXOP_SIFS;
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -173,7 +173,8 @@
|
||||
#define AES_CCM_H
|
||||
|
||||
-#include "aead_api.h"
|
||||
-
|
||||
+#include <linux/crypto.h>
|
||||
|
||||
-#define CCM_AAD_LEN 32
|
||||
-
|
||||
-static inline struct crypto_aead *
|
||||
@@ -201,8 +202,7 @@
|
||||
- be16_to_cpup((__be16 *)aad),
|
||||
- data, data_len, mic);
|
||||
-}
|
||||
+#include <linux/crypto.h>
|
||||
|
||||
-
|
||||
-static inline void ieee80211_aes_key_free(struct crypto_aead *tfm)
|
||||
-{
|
||||
- return aead_key_free(tfm);
|
||||
@@ -338,10 +338,10 @@
|
||||
#define AES_GCM_H
|
||||
|
||||
-#include "aead_api.h"
|
||||
-
|
||||
-#define GCM_AAD_LEN 32
|
||||
+#include <linux/crypto.h>
|
||||
|
||||
-#define GCM_AAD_LEN 32
|
||||
-
|
||||
-static inline int ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm,
|
||||
- u8 *j_0, u8 *aad, u8 *data,
|
||||
- size_t data_len, u8 *mic)
|
||||
|
||||
@@ -20,12 +20,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
-void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
|
||||
- const u8 *data, size_t data_len, u8 *mic)
|
||||
+void gf_mulx(u8 *pad)
|
||||
{
|
||||
- SHASH_DESC_ON_STACK(desc, tfm);
|
||||
- u8 out[AES_BLOCK_SIZE];
|
||||
+{
|
||||
+ int i, carry;
|
||||
|
||||
- desc->tfm = tfm;
|
||||
+
|
||||
+ carry = pad[0] & 0x80;
|
||||
+ for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
|
||||
+ pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
|
||||
@@ -33,20 +30,17 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
+ if (carry)
|
||||
+ pad[AES_BLOCK_SIZE - 1] ^= 0x87;
|
||||
+}
|
||||
|
||||
- crypto_shash_init(desc);
|
||||
- crypto_shash_update(desc, aad, AAD_LEN);
|
||||
- crypto_shash_update(desc, data, data_len - CMAC_TLEN);
|
||||
- crypto_shash_finup(desc, zero, CMAC_TLEN, out);
|
||||
+
|
||||
+void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
||||
+ const u8 *addr[], const size_t *len, u8 *mac,
|
||||
+ size_t mac_len)
|
||||
+{
|
||||
{
|
||||
- SHASH_DESC_ON_STACK(desc, tfm);
|
||||
- u8 out[AES_BLOCK_SIZE];
|
||||
+ u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
|
||||
+ const u8 *pos, *end;
|
||||
+ size_t i, e, left, total_len;
|
||||
|
||||
- memcpy(mic, out, CMAC_TLEN);
|
||||
+
|
||||
+ memset(cbc, 0, AES_BLOCK_SIZE);
|
||||
+
|
||||
+ total_len = 0;
|
||||
@@ -93,10 +87,14 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
+ pad[i] ^= cbc[i];
|
||||
+ crypto_cipher_encrypt_one(tfm, pad, pad);
|
||||
+ memcpy(mac, pad, mac_len);
|
||||
}
|
||||
+}
|
||||
|
||||
-void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad,
|
||||
+
|
||||
- desc->tfm = tfm;
|
||||
|
||||
- crypto_shash_init(desc);
|
||||
- crypto_shash_update(desc, aad, AAD_LEN);
|
||||
- crypto_shash_update(desc, data, data_len - CMAC_TLEN);
|
||||
- crypto_shash_finup(desc, zero, CMAC_TLEN, out);
|
||||
+void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
|
||||
+ const u8 *data, size_t data_len, u8 *mic)
|
||||
+{
|
||||
@@ -111,10 +109,12 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
+ len[1] = data_len - CMAC_TLEN;
|
||||
+ addr[2] = zero;
|
||||
+ len[2] = CMAC_TLEN;
|
||||
+
|
||||
|
||||
- memcpy(mic, out, CMAC_TLEN);
|
||||
+ aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN);
|
||||
+}
|
||||
+
|
||||
}
|
||||
|
||||
-void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad,
|
||||
+void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
@@ -122,8 +122,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
+ const u8 *addr[3];
|
||||
+ size_t len[3];
|
||||
+ u8 zero[CMAC_TLEN_256];
|
||||
|
||||
- desc->tfm = tfm;
|
||||
+
|
||||
+ memset(zero, 0, CMAC_TLEN_256);
|
||||
+ addr[0] = aad;
|
||||
+ len[0] = AAD_LEN;
|
||||
@@ -132,6 +131,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
+ addr[2] = zero;
|
||||
+ len[2] = CMAC_TLEN_256;
|
||||
|
||||
- desc->tfm = tfm;
|
||||
-
|
||||
- crypto_shash_init(desc);
|
||||
- crypto_shash_update(desc, aad, AAD_LEN);
|
||||
- crypto_shash_update(desc, data, data_len - CMAC_TLEN_256);
|
||||
|
||||
@@ -88,7 +88,7 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
- spec_scan = true;
|
||||
- } else
|
||||
- brcmf_dbg(SCAN, "Broadcast scan\n");
|
||||
|
||||
-
|
||||
- passive_scan = cfg->active_scan ? 0 : 1;
|
||||
- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN,
|
||||
- passive_scan);
|
||||
@@ -105,15 +105,17 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
- ssid_le.SSID);
|
||||
- else
|
||||
- brcmf_err("WLC_SCAN error (%d)\n", err);
|
||||
+ cfg->escan_info.run = brcmf_run_escan;
|
||||
+ err = brcmf_p2p_scan_prep(wiphy, request, vif);
|
||||
+ if (err)
|
||||
+ goto scan_out;
|
||||
|
||||
-
|
||||
- brcmf_scan_config_mpc(ifp, 1);
|
||||
- goto scan_out;
|
||||
- }
|
||||
- }
|
||||
+
|
||||
+ cfg->escan_info.run = brcmf_run_escan;
|
||||
+ err = brcmf_p2p_scan_prep(wiphy, request, vif);
|
||||
+ if (err)
|
||||
+ goto scan_out;
|
||||
+
|
||||
+ err = brcmf_do_escan(vif->ifp, request);
|
||||
+ if (err)
|
||||
+ goto scan_out;
|
||||
|
||||
@@ -141,12 +141,12 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
- func = SDIO_FUNC_0;
|
||||
- else
|
||||
- func = SDIO_FUNC_1;
|
||||
|
||||
-
|
||||
- do {
|
||||
- /* for retry wait for 1 ms till bus get settled down */
|
||||
- if (retry)
|
||||
- usleep_range(1000, 2000);
|
||||
-
|
||||
|
||||
- ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
|
||||
- data, true);
|
||||
-
|
||||
|
||||
@@ -198,14 +198,14 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
int retval;
|
||||
|
||||
- retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data);
|
||||
+ retval = brcmf_sdiod_addrprep(sdiodev, &addr);
|
||||
|
||||
-
|
||||
- if (ret)
|
||||
- *ret = retval;
|
||||
-
|
||||
- return data;
|
||||
-}
|
||||
-
|
||||
+ retval = brcmf_sdiod_addrprep(sdiodev, &addr);
|
||||
|
||||
-u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
|
||||
-{
|
||||
- u32 data;
|
||||
|
||||
@@ -62,10 +62,10 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
+ if (!err)
|
||||
sdiodev->sbwad = bar0;
|
||||
- }
|
||||
-
|
||||
|
||||
- *addr &= SBSDIO_SB_OFT_ADDR_MASK;
|
||||
- *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
|
||||
|
||||
-
|
||||
- return 0;
|
||||
+ return err;
|
||||
}
|
||||
@@ -99,14 +99,14 @@ Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
+ retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
|
||||
+ if (retval)
|
||||
+ goto out;
|
||||
+
|
||||
+ addr &= SBSDIO_SB_OFT_ADDR_MASK;
|
||||
+ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
|
||||
|
||||
- if (!retval)
|
||||
- sdio_writel(sdiodev->func[1], data, addr, &retval);
|
||||
+ sdio_writel(sdiodev->func[1], data, addr, &retval);
|
||||
+ addr &= SBSDIO_SB_OFT_ADDR_MASK;
|
||||
+ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
|
||||
|
||||
+ sdio_writel(sdiodev->func[1], data, addr, &retval);
|
||||
+
|
||||
+out:
|
||||
if (ret)
|
||||
*ret = retval;
|
||||
|
||||
@@ -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)
|
||||
@@ -29,6 +29,21 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
- npend = ath9k_hw_numtxpending(ah, i);
|
||||
- if (npend)
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- if (ah->external_reset &&
|
||||
- (npend || type == ATH9K_RESET_COLD)) {
|
||||
- int reset_err = 0;
|
||||
-
|
||||
- ath_dbg(ath9k_hw_common(ah), RESET,
|
||||
- "reset MAC via external reset\n");
|
||||
-
|
||||
- reset_err = ah->external_reset();
|
||||
- if (reset_err) {
|
||||
- ath_err(ath9k_hw_common(ah),
|
||||
- "External reset failed, err=%d\n",
|
||||
- reset_err);
|
||||
- return false;
|
||||
+ if (type == ATH9K_RESET_COLD)
|
||||
+ return true;
|
||||
+
|
||||
@@ -44,47 +59,35 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
+ for (i = 0; i < AR_NUM_QCU; i++) {
|
||||
+ if (ath9k_hw_numtxpending(ah, i))
|
||||
+ return true;
|
||||
+ }
|
||||
}
|
||||
|
||||
- if (ah->external_reset &&
|
||||
- (npend || type == ATH9K_RESET_COLD)) {
|
||||
- int reset_err = 0;
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
|
||||
- ath_dbg(ath9k_hw_common(ah), RESET,
|
||||
- "reset MAC via external reset\n");
|
||||
+
|
||||
+static bool ath9k_hw_external_reset(struct ath_hw *ah, int type)
|
||||
+{
|
||||
+ int err;
|
||||
|
||||
- reset_err = ah->external_reset();
|
||||
- if (reset_err) {
|
||||
- ath_err(ath9k_hw_common(ah),
|
||||
- "External reset failed, err=%d\n",
|
||||
- reset_err);
|
||||
- return false;
|
||||
- }
|
||||
+
|
||||
+ if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type))
|
||||
+ return true;
|
||||
|
||||
- REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
+
|
||||
+ ath_dbg(ath9k_hw_common(ah), RESET,
|
||||
+ "reset MAC via external reset\n");
|
||||
+
|
||||
|
||||
- REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
+ err = ah->external_reset();
|
||||
+ if (err) {
|
||||
+ ath_err(ath9k_hw_common(ah),
|
||||
+ "External reset failed, err=%d\n", err);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
}
|
||||
|
||||
+ if (AR_SREV_9550(ah)) {
|
||||
+ REG_WRITE(ah, AR_RTC_RESET, 0);
|
||||
+ udelay(10);
|
||||
}
|
||||
|
||||
+ }
|
||||
+
|
||||
+ REG_WRITE(ah, AR_RTC_RESET, 1);
|
||||
+ udelay(10);
|
||||
+
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
From: Felix Fietkau <nbd@openwrt.org>
|
||||
Date: Thu, 2 Jul 2015 15:20:56 +0200
|
||||
Subject: [PATCH] ath9k: limit retries for powersave response frames
|
||||
|
||||
In some cases, the channel might be busy enough that an ath9k AP's
|
||||
response to PS-Poll frames might be too slow and the station has already
|
||||
gone to sleep. To avoid wasting too much airtime on this, limit the
|
||||
number of retries on such frames and ensure that no sample rate gets
|
||||
used.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -188,10 +188,25 @@ static void ath_send_bar(struct ath_atx_
|
||||
}
|
||||
|
||||
static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
- struct ath_buf *bf)
|
||||
+ struct ath_buf *bf, bool ps)
|
||||
{
|
||||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
||||
+
|
||||
+ if (ps) {
|
||||
+ /* Clear the first rate to avoid using a sample rate for PS frames */
|
||||
+ info->control.rates[0].idx = -1;
|
||||
+ info->control.rates[0].count = 0;
|
||||
+ }
|
||||
+
|
||||
ieee80211_get_tx_rates(vif, sta, bf->bf_mpdu, bf->rates,
|
||||
ARRAY_SIZE(bf->rates));
|
||||
+ if (!ps)
|
||||
+ return;
|
||||
+
|
||||
+ if (bf->rates[0].count > 2)
|
||||
+ bf->rates[0].count = 2;
|
||||
+
|
||||
+ bf->rates[1].idx = -1;
|
||||
}
|
||||
|
||||
static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
|
||||
@@ -1502,7 +1517,7 @@ ath_tx_form_burst(struct ath_softc *sc,
|
||||
break;
|
||||
}
|
||||
|
||||
- ath_set_rates(tid->an->vif, tid->an->sta, bf);
|
||||
+ ath_set_rates(tid->an->vif, tid->an->sta, bf, false);
|
||||
} while (1);
|
||||
}
|
||||
|
||||
@@ -1532,7 +1547,7 @@ static bool ath_tx_sched_aggr(struct ath
|
||||
return false;
|
||||
}
|
||||
|
||||
- ath_set_rates(tid->an->vif, tid->an->sta, bf);
|
||||
+ ath_set_rates(tid->an->vif, tid->an->sta, bf, false);
|
||||
if (aggr)
|
||||
aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf);
|
||||
else
|
||||
@@ -1690,7 +1705,7 @@ void ath9k_release_buffered_frames(struc
|
||||
break;
|
||||
|
||||
list_add_tail(&bf->list, &bf_q);
|
||||
- ath_set_rates(tid->an->vif, tid->an->sta, bf);
|
||||
+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true);
|
||||
if (bf_isampdu(bf)) {
|
||||
ath_tx_addto_baw(sc, tid, bf);
|
||||
bf->bf_state.bf_type &= ~BUF_AGGR;
|
||||
@@ -2390,7 +2405,7 @@ int ath_tx_start(struct ieee80211_hw *hw
|
||||
if (txctl->paprd)
|
||||
bf->bf_state.bfs_paprd_timestamp = jiffies;
|
||||
|
||||
- ath_set_rates(vif, sta, bf);
|
||||
+ ath_set_rates(vif, sta, bf, ps_resp);
|
||||
ath_tx_send_normal(sc, txq, tid, skb);
|
||||
|
||||
out:
|
||||
@@ -2429,7 +2444,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw
|
||||
break;
|
||||
|
||||
bf->bf_lastbf = bf;
|
||||
- ath_set_rates(vif, NULL, bf);
|
||||
+ ath_set_rates(vif, NULL, bf, false);
|
||||
ath_buf_set_rate(sc, bf, &info, fi->framelen, false);
|
||||
duration += info.rates[0].PktDuration;
|
||||
if (bf_tail)
|
||||
@@ -2946,7 +2961,7 @@ int ath9k_tx99_send(struct ath_softc *sc
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- ath_set_rates(sc->tx99_vif, NULL, bf);
|
||||
+ ath_set_rates(sc->tx99_vif, NULL, bf, false);
|
||||
|
||||
ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, bf->bf_daddr);
|
||||
ath9k_hw_tx99_start(sc->sc_ah, txctl->txq->axq_qnum);
|
||||
@@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -1674,6 +1674,22 @@ void ath_tx_aggr_wakeup(struct ath_softc
|
||||
@@ -1659,6 +1659,22 @@ void ath_tx_aggr_wakeup(struct ath_softc
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,15 +30,15 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sta *sta,
|
||||
u16 tids, int nframes,
|
||||
@@ -1704,6 +1720,7 @@ void ath9k_release_buffered_frames(struc
|
||||
@@ -1689,6 +1705,7 @@ void ath9k_release_buffered_frames(struc
|
||||
if (!bf)
|
||||
break;
|
||||
|
||||
+ ath9k_set_moredata(sc, bf, true);
|
||||
list_add_tail(&bf->list, &bf_q);
|
||||
ath_set_rates(tid->an->vif, tid->an->sta, bf, true);
|
||||
ath_set_rates(tid->an->vif, tid->an->sta, bf);
|
||||
if (bf_isampdu(bf)) {
|
||||
@@ -1727,6 +1744,9 @@ void ath9k_release_buffered_frames(struc
|
||||
@@ -1712,6 +1729,9 @@ void ath9k_release_buffered_frames(struc
|
||||
if (list_empty(&bf_q))
|
||||
return;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -984,7 +984,8 @@ ath_tx_get_tid_subframe(struct ath_softc
|
||||
@@ -969,7 +969,8 @@ ath_tx_get_tid_subframe(struct ath_softc
|
||||
bf->bf_lastbf = bf;
|
||||
|
||||
tx_info = IEEE80211_SKB_CB(skb);
|
||||
|
||||
@@ -21,7 +21,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
|
||||
struct ath_txq *txq,
|
||||
struct ath_atx_tid *tid,
|
||||
@@ -311,7 +311,7 @@ static void ath_tx_flush_tid(struct ath_
|
||||
@@ -296,7 +296,7 @@ static void ath_tx_flush_tid(struct ath_
|
||||
}
|
||||
|
||||
if (fi->baw_tracked) {
|
||||
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
sendbar = true;
|
||||
}
|
||||
|
||||
@@ -327,10 +327,15 @@ static void ath_tx_flush_tid(struct ath_
|
||||
@@ -312,10 +312,15 @@ static void ath_tx_flush_tid(struct ath_
|
||||
}
|
||||
|
||||
static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
|
||||
@@ -47,7 +47,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
index = ATH_BA_INDEX(tid->seq_start, seqno);
|
||||
cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
|
||||
|
||||
@@ -351,6 +356,9 @@ static void ath_tx_addto_baw(struct ath_
|
||||
@@ -336,6 +341,9 @@ static void ath_tx_addto_baw(struct ath_
|
||||
u16 seqno = bf->bf_state.seqno;
|
||||
int index, cindex;
|
||||
|
||||
@@ -57,7 +57,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
index = ATH_BA_INDEX(tid->seq_start, seqno);
|
||||
cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
|
||||
__set_bit(cindex, tid->tx_buf);
|
||||
@@ -627,7 +635,7 @@ static void ath_tx_complete_aggr(struct
|
||||
@@ -612,7 +620,7 @@ static void ath_tx_complete_aggr(struct
|
||||
* complete the acked-ones/xretried ones; update
|
||||
* block-ack window
|
||||
*/
|
||||
@@ -66,7 +66,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
|
||||
memcpy(tx_info->control.rates, rates, sizeof(rates));
|
||||
@@ -657,7 +665,7 @@ static void ath_tx_complete_aggr(struct
|
||||
@@ -642,7 +650,7 @@ static void ath_tx_complete_aggr(struct
|
||||
* run out of tx buf.
|
||||
*/
|
||||
if (!tbf) {
|
||||
@@ -75,7 +75,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq,
|
||||
&bf_head, NULL, ts,
|
||||
@@ -1026,11 +1034,14 @@ ath_tx_get_tid_subframe(struct ath_softc
|
||||
@@ -1011,11 +1019,14 @@ ath_tx_get_tid_subframe(struct ath_softc
|
||||
|
||||
INIT_LIST_HEAD(&bf_head);
|
||||
list_add(&bf->list, &bf_head);
|
||||
@@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return bf;
|
||||
}
|
||||
|
||||
@@ -1088,8 +1099,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s
|
||||
@@ -1073,8 +1084,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s
|
||||
bf->bf_next = NULL;
|
||||
|
||||
/* link buffers of this frame to the aggregate */
|
||||
@@ -100,10 +100,10 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
bf->bf_state.ndelim = ndelim;
|
||||
|
||||
list_add_tail(&bf->list, bf_q);
|
||||
@@ -1725,10 +1734,8 @@ void ath9k_release_buffered_frames(struc
|
||||
@@ -1710,10 +1719,8 @@ void ath9k_release_buffered_frames(struc
|
||||
ath9k_set_moredata(sc, bf, true);
|
||||
list_add_tail(&bf->list, &bf_q);
|
||||
ath_set_rates(tid->an->vif, tid->an->sta, bf, true);
|
||||
ath_set_rates(tid->an->vif, tid->an->sta, bf);
|
||||
- if (bf_isampdu(bf)) {
|
||||
- ath_tx_addto_baw(sc, tid, bf);
|
||||
+ if (bf_isampdu(bf))
|
||||
|
||||
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -2451,7 +2451,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw
|
||||
@@ -2436,7 +2436,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw
|
||||
.txq = sc->beacon.cabq
|
||||
};
|
||||
struct ath_tx_info info = {};
|
||||
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
struct ath_buf *bf_tail = NULL;
|
||||
struct ath_buf *bf;
|
||||
LIST_HEAD(bf_q);
|
||||
@@ -2495,15 +2494,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw
|
||||
@@ -2480,15 +2479,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw
|
||||
if (list_empty(&bf_q))
|
||||
return;
|
||||
|
||||
|
||||
@@ -136,72 +136,82 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
- MCS_GROUP(1, 0, BW_20),
|
||||
- MCS_GROUP(2, 0, BW_20),
|
||||
- MCS_GROUP(3, 0, BW_20),
|
||||
+ MCS_GROUP(1, 0, BW_20, 5),
|
||||
+ MCS_GROUP(2, 0, BW_20, 4),
|
||||
+ MCS_GROUP(3, 0, BW_20, 4),
|
||||
|
||||
-
|
||||
- MCS_GROUP(1, 1, BW_20),
|
||||
- MCS_GROUP(2, 1, BW_20),
|
||||
- MCS_GROUP(3, 1, BW_20),
|
||||
+ MCS_GROUP(1, 1, BW_20, 5),
|
||||
+ MCS_GROUP(2, 1, BW_20, 4),
|
||||
+ MCS_GROUP(3, 1, BW_20, 4),
|
||||
|
||||
-
|
||||
- MCS_GROUP(1, 0, BW_40),
|
||||
- MCS_GROUP(2, 0, BW_40),
|
||||
- MCS_GROUP(3, 0, BW_40),
|
||||
+ MCS_GROUP(1, 0, BW_40, 4),
|
||||
+ MCS_GROUP(2, 0, BW_40, 4),
|
||||
+ MCS_GROUP(3, 0, BW_40, 4),
|
||||
|
||||
-
|
||||
- MCS_GROUP(1, 1, BW_40),
|
||||
- MCS_GROUP(2, 1, BW_40),
|
||||
- MCS_GROUP(3, 1, BW_40),
|
||||
+ MCS_GROUP(1, 1, BW_40, 4),
|
||||
+ MCS_GROUP(2, 1, BW_40, 4),
|
||||
+ MCS_GROUP(3, 1, BW_40, 4),
|
||||
|
||||
-
|
||||
- CCK_GROUP,
|
||||
+ CCK_GROUP(8),
|
||||
|
||||
-
|
||||
- VHT_GROUP(1, 0, BW_20),
|
||||
- VHT_GROUP(2, 0, BW_20),
|
||||
- VHT_GROUP(3, 0, BW_20),
|
||||
+ VHT_GROUP(1, 0, BW_20, 5),
|
||||
+ VHT_GROUP(2, 0, BW_20, 4),
|
||||
+ VHT_GROUP(3, 0, BW_20, 4),
|
||||
|
||||
-
|
||||
- VHT_GROUP(1, 1, BW_20),
|
||||
- VHT_GROUP(2, 1, BW_20),
|
||||
- VHT_GROUP(3, 1, BW_20),
|
||||
+ VHT_GROUP(1, 1, BW_20, 5),
|
||||
+ VHT_GROUP(2, 1, BW_20, 4),
|
||||
+ VHT_GROUP(3, 1, BW_20, 4),
|
||||
|
||||
-
|
||||
- VHT_GROUP(1, 0, BW_40),
|
||||
- VHT_GROUP(2, 0, BW_40),
|
||||
- VHT_GROUP(3, 0, BW_40),
|
||||
+ VHT_GROUP(1, 0, BW_40, 4),
|
||||
+ VHT_GROUP(2, 0, BW_40, 4),
|
||||
+ VHT_GROUP(3, 0, BW_40, 4),
|
||||
|
||||
-
|
||||
- VHT_GROUP(1, 1, BW_40),
|
||||
- VHT_GROUP(2, 1, BW_40),
|
||||
- VHT_GROUP(3, 1, BW_40),
|
||||
+ VHT_GROUP(1, 1, BW_40, 4),
|
||||
+ VHT_GROUP(2, 1, BW_40, 4),
|
||||
+ VHT_GROUP(3, 1, BW_40, 4),
|
||||
|
||||
-
|
||||
- VHT_GROUP(1, 0, BW_80),
|
||||
- VHT_GROUP(2, 0, BW_80),
|
||||
- VHT_GROUP(3, 0, BW_80),
|
||||
+ VHT_GROUP(1, 0, BW_80, 4),
|
||||
+ VHT_GROUP(2, 0, BW_80, 4),
|
||||
+ VHT_GROUP(3, 0, BW_80, 4),
|
||||
|
||||
-
|
||||
- VHT_GROUP(1, 1, BW_80),
|
||||
- VHT_GROUP(2, 1, BW_80),
|
||||
- VHT_GROUP(3, 1, BW_80),
|
||||
+ MCS_GROUP(1, 0, BW_20, 5),
|
||||
+ MCS_GROUP(2, 0, BW_20, 4),
|
||||
+ MCS_GROUP(3, 0, BW_20, 4),
|
||||
+
|
||||
+ MCS_GROUP(1, 1, BW_20, 5),
|
||||
+ MCS_GROUP(2, 1, BW_20, 4),
|
||||
+ MCS_GROUP(3, 1, BW_20, 4),
|
||||
+
|
||||
+ MCS_GROUP(1, 0, BW_40, 4),
|
||||
+ MCS_GROUP(2, 0, BW_40, 4),
|
||||
+ MCS_GROUP(3, 0, BW_40, 4),
|
||||
+
|
||||
+ MCS_GROUP(1, 1, BW_40, 4),
|
||||
+ MCS_GROUP(2, 1, BW_40, 4),
|
||||
+ MCS_GROUP(3, 1, BW_40, 4),
|
||||
+
|
||||
+ CCK_GROUP(8),
|
||||
+
|
||||
+ VHT_GROUP(1, 0, BW_20, 5),
|
||||
+ VHT_GROUP(2, 0, BW_20, 4),
|
||||
+ VHT_GROUP(3, 0, BW_20, 4),
|
||||
+
|
||||
+ VHT_GROUP(1, 1, BW_20, 5),
|
||||
+ VHT_GROUP(2, 1, BW_20, 4),
|
||||
+ VHT_GROUP(3, 1, BW_20, 4),
|
||||
+
|
||||
+ VHT_GROUP(1, 0, BW_40, 4),
|
||||
+ VHT_GROUP(2, 0, BW_40, 4),
|
||||
+ VHT_GROUP(3, 0, BW_40, 4),
|
||||
+
|
||||
+ VHT_GROUP(1, 1, BW_40, 4),
|
||||
+ VHT_GROUP(2, 1, BW_40, 4),
|
||||
+ VHT_GROUP(3, 1, BW_40, 4),
|
||||
+
|
||||
+ VHT_GROUP(1, 0, BW_80, 4),
|
||||
+ VHT_GROUP(2, 0, BW_80, 4),
|
||||
+ VHT_GROUP(3, 0, BW_80, 4),
|
||||
+
|
||||
+ VHT_GROUP(1, 1, BW_80, 4),
|
||||
+ VHT_GROUP(2, 1, BW_80, 4),
|
||||
+ VHT_GROUP(3, 1, BW_80, 4),
|
||||
|
||||
@@ -23,7 +23,7 @@ Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -2930,6 +2930,8 @@ void ath_tx_node_cleanup(struct ath_soft
|
||||
@@ -2915,6 +2915,8 @@ void ath_tx_node_cleanup(struct ath_soft
|
||||
struct ath_txq *txq;
|
||||
int tidno;
|
||||
|
||||
@@ -32,7 +32,7 @@ Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) {
|
||||
tid = ath_node_to_tid(an, tidno);
|
||||
txq = tid->txq;
|
||||
@@ -2947,6 +2949,8 @@ void ath_tx_node_cleanup(struct ath_soft
|
||||
@@ -2932,6 +2934,8 @@ void ath_tx_node_cleanup(struct ath_soft
|
||||
if (!an->sta)
|
||||
break; /* just one multicast ath_atx_tid */
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -103,8 +103,7 @@
|
||||
+ GFP_KERNEL);
|
||||
+ if (!led)
|
||||
+ return -ENOMEM;
|
||||
|
||||
- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
|
||||
+
|
||||
+ led->gpio = gpio = (struct gpio_led *) (led + 1);
|
||||
+ _name = (char *) (led->gpio + 1);
|
||||
+
|
||||
@@ -117,7 +116,8 @@
|
||||
+ ret = ath_add_led(sc, led);
|
||||
+ if (unlikely(ret < 0))
|
||||
+ kfree(led);
|
||||
+
|
||||
|
||||
- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
@@ -125,11 +125,11 @@
|
||||
{
|
||||
- if (!sc->led_registered)
|
||||
- return;
|
||||
-
|
||||
- ath_led_brightness(&sc->led_cdev, LED_OFF);
|
||||
- led_classdev_unregister(&sc->led_cdev);
|
||||
+ struct ath_led *led;
|
||||
|
||||
- ath_led_brightness(&sc->led_cdev, LED_OFF);
|
||||
- led_classdev_unregister(&sc->led_cdev);
|
||||
-
|
||||
- ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin);
|
||||
+ while (!list_empty(&sc->leds)) {
|
||||
+ led = list_first_entry(&sc->leds, struct ath_led, list);
|
||||
|
||||
@@ -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 = {
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user