PKG_NAME:=mac80211
-PKG_VERSION:=2017-11-01
-PKG_RELEASE:=9
+PKG_VERSION:=v4.18.5
+PKG_RELEASE:=1
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_HASH:=8437ab7886b988c8152e7a4db30b7f41009e49a3b2cb863edd05da1ecd7eb05a
+PKG_HASH:=9c13660e98b9397260266f98c9db76bdad2b48462cb376b5862dfbd18369edf2
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
define KernelPackage/mt7601u
$(call KernelPackage/mac80211/Default)
TITLE:=MT7601U-based USB dongles Wireless Driver
- DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT @USB_SUPPORT +kmod-usb-core +mt7601u-firmware
+ DEPENDS+= @BROKEN +kmod-mac80211 +@DRIVER_11N_SUPPORT @USB_SUPPORT +kmod-usb-core +mt7601u-firmware
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
AUTOLOAD:=$(call AutoProbe,mt7601u)
endef
endif
endif
+define Build/Patch
+ $(if $(QUILT),rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
+ $(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used)
+endef
+
+define Quilt/Refresh/Package
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/)
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/)
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/)
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
+endef
+
define Build/Compile
$(SH_FUNC) var2file "$(call shvar,mac80211_config)" $(PKG_BUILD_DIR)/.config
$(MAKE) $(MAKE_OPTS) allnoconfig
+++ /dev/null
---- a/kconf/Makefile
-+++ b/kconf/Makefile
-@@ -1,9 +1,9 @@
--CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
-+CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -DKBUILD_NO_NLS
-
- LXDIALOG := lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o
-
- conf: conf.o zconf.tab.o
--mconf_CFLAGS := $(shell ./lxdialog/check-lxdialog.sh -ccflags) -DLOCALE
-+mconf_CFLAGS := $(shell ./lxdialog/check-lxdialog.sh -ccflags)
- mconf_LDFLAGS := $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
- mconf: CFLAGS += $(mconf_CFLAGS)
-
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -5,7 +5,7 @@
- ifeq ($(KERNELRELEASE),)
-
- MAKEFLAGS += --no-print-directory
--SHELL := /bin/bash
-+SHELL := /usr/bin/env bash
- BACKPORT_DIR := $(shell pwd)
-
- KMODDIR ?= updates
-@@ -19,6 +19,7 @@ KLIB_BUILD ?= $(KLIB)/build/
- KERNEL_CONFIG := $(KLIB_BUILD)/.config
- KERNEL_MAKEFILE := $(KLIB_BUILD)/Makefile
- CONFIG_MD5 := $(shell md5sum $(KERNEL_CONFIG) 2>/dev/null | sed 's/\s.*//')
-+STAMP_KERNEL_CONFIG := .kernel_config_md5_$(CONFIG_MD5)
-
- export KLIB KLIB_BUILD BACKPORT_DIR KMODDIR KMODPATH_ARG
-
-@@ -36,7 +37,8 @@ mrproper:
- @rm -f .kernel_config_md5 Kconfig.versions Kconfig.kernel
- @rm -f backport-include/backport/autoconf.h
-
--.DEFAULT:
-+.SILENT: $(STAMP_KERNEL_CONFIG)
-+$(STAMP_KERNEL_CONFIG):
- @set -e ; test -f local-symbols || ( \
- echo "/--------------" ;\
- echo "| You shouldn't run make in the backports tree, but only in" ;\
-@@ -60,57 +62,61 @@ mrproper:
- echo "| (that isn't currently running.)" ;\
- echo "\\--" ;\
- false)
-- @set -e ; if [ "$$(cat .kernel_config_md5 2>/dev/null)" != "$(CONFIG_MD5)" ] ;\
-- then \
-- echo -n "Generating local configuration database from kernel ..." ;\
-- grep -v -f local-symbols $(KERNEL_CONFIG) | grep = | ( \
-- while read l ; do \
-- if [ "$${l:0:7}" != "CONFIG_" ] ; then \
-- continue ;\
-- fi ;\
-- l=$${l:7} ;\
-- n=$${l%%=*} ;\
-- v=$${l#*=} ;\
-- if [ "$$v" = "m" ] ; then \
-- echo config $$n ;\
-- echo ' tristate' ;\
-- elif [ "$$v" = "y" ] ; then \
-- echo config $$n ;\
-- echo ' bool' ;\
-- else \
-- continue ;\
-- fi ;\
-- echo " default $$v" ;\
-- echo "" ;\
-- done \
-- ) > Kconfig.kernel ;\
-- kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion | \
-- sed 's/^\(\([3-4]\|2\.6\)\.[0-9]\+\).*/\1/;t;d') ;\
-- test "$$kver" != "" || echo "Kernel version parse failed!" ;\
-- test "$$kver" != "" ;\
-- kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\
-- kvers="$$kvers $$(seq 0 19 | sed 's/^/3./')" ;\
-- kvers="$$kvers $$(seq 0 99 | sed 's/^/4./')" ;\
-- print=0 ;\
-- for v in $$kvers ; do \
-- if [ "$$print" = "1" ] ; then \
-- echo config KERNEL_$$(echo $$v | tr . _) ;\
-- echo " def_bool y" ;\
-- fi ;\
-- if [ "$$v" = "$$kver" ] ; then print=1 ; fi ;\
-- done > Kconfig.versions ;\
-- # RHEL as well, sadly we need to grep for it ;\
-- RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | \
-- sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
-- RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | \
-- sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
-- for v in $$(seq 0 $$RHEL_MINOR) ; do \
-- echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v ;\
-- echo " def_bool y" ;\
-- done >> Kconfig.versions ;\
-- echo " done." ;\
-- fi ;\
-- echo "$(CONFIG_MD5)" > .kernel_config_md5
-+ @rm -f .kernel_config_md5_*
-+ @touch $@
-+
-+Kconfig.kernel: $(STAMP_KERNEL_CONFIG) local-symbols
-+ @printf "Generating local configuration database from kernel ..."
-+ @grep -v -f local-symbols $(KERNEL_CONFIG) | grep = | ( \
-+ while read l ; do \
-+ if [ "$${l:0:7}" != "CONFIG_" ] ; then \
-+ continue ;\
-+ fi ;\
-+ l=$${l:7} ;\
-+ n=$${l%%=*} ;\
-+ v=$${l#*=} ;\
-+ if [ "$$v" = "m" ] ; then \
-+ echo config $$n ;\
-+ echo ' tristate' ;\
-+ elif [ "$$v" = "y" ] ; then \
-+ echo config $$n ;\
-+ echo ' bool' ;\
-+ else \
-+ continue ;\
-+ fi ;\
-+ echo " default $$v" ;\
-+ echo "" ;\
-+ done \
-+ ) > $@
-+ @echo " done."
-+
-+Kconfig.versions: Kconfig.kernel
-+ @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion | \
-+ sed 's/^\(\([3-4]\|2\.6\)\.[0-9]\+\).*/\1/;t;d') ;\
-+ test "$$kver" != "" || echo "Kernel version parse failed!" ;\
-+ test "$$kver" != "" ;\
-+ kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\
-+ kvers="$$kvers $$(seq 0 19 | sed 's/^/3./')" ;\
-+ kvers="$$kvers $$(seq 0 99 | sed 's/^/4./')" ;\
-+ print=0 ;\
-+ for v in $$kvers ; do \
-+ if [ "$$print" = "1" ] ; then \
-+ echo config KERNEL_$$(echo $$v | tr . _) ;\
-+ echo " def_bool y" ;\
-+ fi ;\
-+ if [ "$$v" = "$$kver" ] ; then print=1 ; fi ;\
-+ done > $@
-+ @RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | \
-+ sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
-+ RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | \
-+ sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
-+ for v in $$(seq 0 $$RHEL_MINOR) ; do \
-+ echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v ;\
-+ echo " def_bool y" ;\
-+ done >> $@
-+
-+.DEFAULT:
-+ @$(MAKE) Kconfig.versions
- @$(MAKE) -f Makefile.real "$@"
-
- .PHONY: defconfig-help
---- a/Makefile.real
-+++ b/Makefile.real
-@@ -59,7 +59,7 @@ defconfig-%::
-
- backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel
- @$(MAKE) oldconfig
-- @echo -n "Building backport-include/backport/autoconf.h ..."
-+ @printf "Building backport-include/backport/autoconf.h ..."
- @grep -f local-symbols .config | ( \
- echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\
- echo "#define COMPAT_AUTOCONF_INCLUDED" ;\
-@@ -80,7 +80,12 @@ backport-include/backport/autoconf.h: .c
- esac ;\
- done ;\
- echo "#endif /* COMPAT_AUTOCONF_INCLUDED */" ;\
-- ) > backport-include/backport/autoconf.h
-+ ) > $@.new
-+ @if cmp -s $@ $@.new; then \
-+ rm -f $@.new; \
-+ else \
-+ mv $@.new $@; \
-+ fi
- @echo " done."
-
- .PHONY: modules
+++ /dev/null
---- a/kconf/conf.c
-+++ b/kconf/conf.c
-@@ -594,40 +594,12 @@ int main(int ac, char **av)
- case oldconfig:
- case listnewconfig:
- case olddefconfig:
-- conf_read(NULL);
-- break;
- case allnoconfig:
- case allyesconfig:
- case allmodconfig:
- case alldefconfig:
- case randconfig:
-- name = getenv("KCONFIG_ALLCONFIG");
-- if (!name)
-- break;
-- if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
-- if (conf_read_simple(name, S_DEF_USER)) {
-- fprintf(stderr,
-- _("*** Can't read seed configuration \"%s\"!\n"),
-- name);
-- exit(1);
-- }
-- break;
-- }
-- switch (input_mode) {
-- case allnoconfig: name = "allno.config"; break;
-- case allyesconfig: name = "allyes.config"; break;
-- case allmodconfig: name = "allmod.config"; break;
-- case alldefconfig: name = "alldef.config"; break;
-- case randconfig: name = "allrandom.config"; break;
-- default: break;
-- }
-- if (conf_read_simple(name, S_DEF_USER) &&
-- conf_read_simple("all.config", S_DEF_USER)) {
-- fprintf(stderr,
-- _("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"),
-- name);
-- exit(1);
-- }
-+ conf_read(NULL);
- break;
- default:
- break;
---- a/kconf/confdata.c
-+++ b/kconf/confdata.c
-@@ -1170,6 +1170,8 @@ bool conf_set_all_new_symbols(enum conf_
- }
- bool has_changed = false;
-
-+ sym_clear_all_valid();
-+
- for_all_symbols(i, sym) {
- if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
- continue;
-@@ -1213,8 +1215,6 @@ bool conf_set_all_new_symbols(enum conf_
-
- }
-
-- sym_clear_all_valid();
--
- /*
- * We have different type of choice blocks.
- * If curr.tri equals to mod then we can select several
+++ /dev/null
---- a/compat/main.c
-+++ b/compat/main.c
-@@ -20,31 +20,6 @@ MODULE_LICENSE("GPL");
- #error "You need a CPTCFG_VERSION"
- #endif
-
--static char *backported_kernel_name = CPTCFG_KERNEL_NAME;
--
--module_param(backported_kernel_name, charp, 0400);
--MODULE_PARM_DESC(backported_kernel_name,
-- "The kernel tree name that was used for this backport (" CPTCFG_KERNEL_NAME ")");
--
--#ifdef BACKPORTS_GIT_TRACKED
--static char *backports_tracker_id = BACKPORTS_GIT_TRACKED;
--module_param(backports_tracker_id, charp, 0400);
--MODULE_PARM_DESC(backports_tracker_id,
-- "The version of the tree containing this backport (" BACKPORTS_GIT_TRACKED ")");
--#else
--static char *backported_kernel_version = CPTCFG_KERNEL_VERSION;
--static char *backports_version = CPTCFG_VERSION;
--
--module_param(backported_kernel_version, charp, 0400);
--MODULE_PARM_DESC(backported_kernel_version,
-- "The kernel version that was used for this backport (" CPTCFG_KERNEL_VERSION ")");
--
--module_param(backports_version, charp, 0400);
--MODULE_PARM_DESC(backports_version,
-- "The git version of the backports tree used to generate this backport (" CPTCFG_VERSION ")");
--
--#endif
--
- void backport_dependency_symbol(void)
- {
- }
+++ /dev/null
---- a/backport-include/linux/kconfig.h
-+++ b/backport-include/linux/kconfig.h
-@@ -5,6 +5,8 @@
- #include_next <linux/kconfig.h>
- #endif
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
-+
- #ifndef __ARG_PLACEHOLDER_1
- #define __ARG_PLACEHOLDER_1 0,
- #define config_enabled(cfg) _config_enabled(cfg)
-@@ -16,6 +18,7 @@
- * 3.1 - 3.3 had a broken version of this, so undef
- * (they didn't have __ARG_PLACEHOLDER_1)
- */
-+
- #undef IS_ENABLED
- #define IS_ENABLED(option) \
- (config_enabled(option) || config_enabled(option##_MODULE))
-@@ -31,6 +34,8 @@
- #undef IS_BUILTIN
- #define IS_BUILTIN(option) config_enabled(option)
-
-+#endif
-+
- #ifndef IS_REACHABLE
- /*
- * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
+++ /dev/null
---- a/compat/Makefile
-+++ b/compat/Makefile
-@@ -70,8 +70,6 @@ quiet_cmd_build_OID_registry = GEN $
- cmd_build_OID_registry = perl $(src)/build_OID_registry $< $@
- compat-$(CPTCFG_BPAUTO_ASN1_DECODER) += lib-asn1_decoder.o
- compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += lib-oid_registry.o
--skcipher-objs += crypto-skcipher.o
--obj-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += skcipher.o
- compat-$(CPTCFG_BPAUTO_RHASHTABLE) += lib-rhashtable.o
- cordic-objs += lib-cordic.o
- obj-$(CPTCFG_BPAUTO_BUILD_CORDIC) += cordic.o
+++ /dev/null
---- a/compat/backport-4.12.c
-+++ b/compat/backport-4.12.c
-@@ -225,6 +225,7 @@ int bp_extack_genl_register_family(struc
-
- /* copy this since the family might access it directly */
- family->attrbuf = copy->family.attrbuf;
-+ family->mcgrp_offset = copy->family.mcgrp_offset;
-
- mutex_lock(&copies_mutex);
- list_add_tail(©->list, &copies_list);
+++ /dev/null
---- a/backport-include/linux/verification.h
-+++ b/backport-include/linux/verification.h
-@@ -1,7 +1,7 @@
- #ifndef __BP_VERIFICATION_H
- #define __BP_VERIFICATION_H
- #include <linux/version.h>
--#ifndef CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION
-+#if LINUX_VERSION_IS_GEQ(4,7,0) && !defined(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION)
- #include_next <linux/verification.h>
- #else
- #include <linux/key.h>
+++ /dev/null
---- a/compat/backport-4.12.c
-+++ b/compat/backport-4.12.c
-@@ -224,6 +224,7 @@ int bp_extack_genl_register_family(struc
- }
-
- /* copy this since the family might access it directly */
-+ family->id = copy->family.id;
- family->attrbuf = copy->family.attrbuf;
- family->mcgrp_offset = copy->family.mcgrp_offset;
-
+++ /dev/null
---- a/backport-include/linux/rfkill.h
-+++ b/backport-include/linux/rfkill.h
-@@ -2,6 +2,12 @@
- #define __COMPAT_RFKILL_H
- #include <linux/version.h>
-
-+#undef CONFIG_RFKILL
-+#undef CONFIG_RFKILL_FULL
-+#undef CONFIG_RFKILL_LEDS
-+#undef CONFIG_RFKILL_MODULE
-+#undef CONFIG_RFKILL_FULL_MODULE
-+
- #if LINUX_VERSION_IS_GEQ(3,10,0)
- #include_next <linux/rfkill.h>
- #else
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -2,7 +2,7 @@
- # Makefile for the output source package
- #
-
--ifeq ($(KERNELRELEASE),)
-+ifeq ($(KERNELVERSION),)
-
- MAKEFLAGS += --no-print-directory
- SHELL := /usr/bin/env bash
+++ /dev/null
---- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
-+++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
-@@ -11506,6 +11506,15 @@ static const struct attribute_group ipw_
- .attrs = ipw_sysfs_entries,
- };
-
-+#if LINUX_VERSION_IS_LESS(4,10,0)
-+static int __change_mtu(struct net_device *ndev, int new_mtu){
-+ if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN)
-+ return -EINVAL;
-+ ndev->mtu = new_mtu;
-+ return 0;
-+}
-+#endif
-+
- #ifdef CPTCFG_IPW2200_PROMISCUOUS
- static int ipw_prom_open(struct net_device *dev)
- {
-@@ -11554,15 +11563,6 @@ static netdev_tx_t ipw_prom_hard_start_x
- return NETDEV_TX_OK;
- }
-
--#if LINUX_VERSION_IS_LESS(4,10,0)
--static int __change_mtu(struct net_device *ndev, int new_mtu){
-- if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN)
-- return -EINVAL;
-- ndev->mtu = new_mtu;
-- return 0;
--}
--#endif
--
- static const struct net_device_ops ipw_prom_netdev_ops = {
- #if LINUX_VERSION_IS_LESS(4,10,0)
- .ndo_change_mtu = __change_mtu,
+++ /dev/null
---- a/drivers/net/wireless/ralink/rt2x00/Kconfig
-+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
-@@ -225,36 +225,37 @@ config RT2800SOC
-
-
- config RT2800_LIB
-- tristate
-+ tristate "RT2800 USB/PCI support"
- depends on m
-
- config RT2800_LIB_MMIO
-- tristate
-+ tristate "RT2800 MMIO support"
- depends on m
- select RT2X00_LIB_MMIO
- select RT2800_LIB
-
- config RT2X00_LIB_MMIO
-- tristate
-+ tristate "RT2x00 MMIO support"
- depends on m
-
- config RT2X00_LIB_PCI
-- tristate
-+ tristate "RT2x00 PCI support"
- depends on m
- select RT2X00_LIB
-
- config RT2X00_LIB_SOC
-- tristate
-+ tristate "RT2x00 SoC support"
-+ depends on SOC_RT288X || SOC_RT305X || SOC_MT7620
- depends on m
- select RT2X00_LIB
-
- config RT2X00_LIB_USB
-- tristate
-+ tristate "RT2x00 USB support"
- depends on m
- select RT2X00_LIB
-
- config RT2X00_LIB
-- tristate
-+ tristate "RT2x00 support"
- depends on m
-
- config RT2X00_LIB_FIRMWARE
+++ /dev/null
---- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
-+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-@@ -1,5 +1,5 @@
- config BRCMUTIL
-- tristate
-+ tristate "Broadcom 802.11 driver utility functions"
- depends on m
-
- config BRCMSMAC
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -181,7 +181,7 @@ config CFG80211_WEXT_EXPORT
- wext compatibility symbols to be exported.
-
- config LIB80211
-- tristate
-+ tristate "lib80211"
- depends on m
- default n
- help
-@@ -191,15 +191,15 @@ config LIB80211
- Drivers should select this themselves if needed.
-
- config LIB80211_CRYPT_WEP
-- tristate
-+ tristate "lib80211 WEP support"
- depends on m
-
- config LIB80211_CRYPT_CCMP
-- tristate
-+ tristate "lib80211 CCMP support"
- depends on m
-
- config LIB80211_CRYPT_TKIP
-- tristate
-+ tristate "lib80211 TKIP support"
- depends on m
-
- config LIB80211_DEBUG
+++ /dev/null
---- a/local-symbols
-+++ b/local-symbols
-@@ -388,45 +388,6 @@ USB_IPHETH=
- USB_SIERRA_NET=
- USB_VL600=
- USB_NET_CH9200=
--SSB_POSSIBLE=
--SSB=
--SSB_SPROM=
--SSB_BLOCKIO=
--SSB_PCIHOST_POSSIBLE=
--SSB_PCIHOST=
--SSB_B43_PCI_BRIDGE=
--SSB_PCMCIAHOST_POSSIBLE=
--SSB_PCMCIAHOST=
--SSB_SDIOHOST_POSSIBLE=
--SSB_SDIOHOST=
--SSB_HOST_SOC=
--SSB_SILENT=
--SSB_DEBUG=
--SSB_SERIAL=
--SSB_DRIVER_PCICORE_POSSIBLE=
--SSB_DRIVER_PCICORE=
--SSB_PCICORE_HOSTMODE=
--SSB_DRIVER_MIPS=
--SSB_SFLASH=
--SSB_EMBEDDED=
--SSB_DRIVER_EXTIF=
--SSB_DRIVER_GIGE=
--SSB_DRIVER_GPIO=
--BCMA_POSSIBLE=
--BCMA=
--BCMA_BLOCKIO=
--BCMA_HOST_PCI_POSSIBLE=
--BCMA_HOST_PCI=
--BCMA_HOST_SOC=
--BCMA_DRIVER_PCI=
--BCMA_DRIVER_PCI_HOSTMODE=
--BCMA_DRIVER_MIPS=
--BCMA_PFLASH=
--BCMA_SFLASH=
--BCMA_NFLASH=
--BCMA_DRIVER_GMAC_CMN=
--BCMA_DRIVER_GPIO=
--BCMA_DEBUG=
- NFC=
- NFC_DIGITAL=
- NFC_NCI=
---- a/drivers/net/wireless/broadcom/b43/main.c
-+++ b/drivers/net/wireless/broadcom/b43/main.c
-@@ -2876,7 +2876,7 @@ static struct ssb_device *b43_ssb_gpio_d
- {
- struct ssb_bus *bus = dev->dev->sdev->bus;
-
--#ifdef CPTCFG_SSB_DRIVER_PCICORE
-+#ifdef CONFIG_SSB_DRIVER_PCICORE
- return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
- #else
- return bus->chipco.dev;
-@@ -4893,7 +4893,7 @@ static int b43_wireless_core_init(struct
- }
- if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
- hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
--#if defined(CPTCFG_B43_SSB) && defined(CPTCFG_SSB_DRIVER_PCICORE)
-+#if defined(CPTCFG_B43_SSB) && defined(CONFIG_SSB_DRIVER_PCICORE)
- if (dev->dev->bus_type == B43_BUS_SSB &&
- dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
- dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
---- a/drivers/net/wireless/broadcom/b43legacy/main.c
-+++ b/drivers/net/wireless/broadcom/b43legacy/main.c
-@@ -1937,7 +1937,7 @@ static int b43legacy_gpio_init(struct b4
- if (dev->dev->id.revision >= 2)
- mask |= 0x0010; /* FIXME: This is redundant. */
-
--#ifdef CPTCFG_SSB_DRIVER_PCICORE
-+#ifdef CONFIG_SSB_DRIVER_PCICORE
- pcidev = bus->pcicore.dev;
- #endif
- gpiodev = bus->chipco.dev ? : pcidev;
-@@ -1956,7 +1956,7 @@ static void b43legacy_gpio_cleanup(struc
- struct ssb_bus *bus = dev->dev->bus;
- struct ssb_device *gpiodev, *pcidev = NULL;
-
--#ifdef CPTCFG_SSB_DRIVER_PCICORE
-+#ifdef CONFIG_SSB_DRIVER_PCICORE
- pcidev = bus->pcicore.dev;
- #endif
- gpiodev = bus->chipco.dev ? : pcidev;
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/Makefile
-@@ -42,6 +42,6 @@ brcmsmac-y := \
- brcms_trace_events.o \
- debug.o
-
--brcmsmac-$(CPTCFG_BCMA_DRIVER_GPIO) += led.o
-+brcmsmac-$(CONFIG_BCMA_DRIVER_GPIO) += led.o
-
- obj-$(CPTCFG_BRCMSMAC) += brcmsmac.o
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h
-@@ -22,7 +22,7 @@ struct brcms_led {
- bool active_low;
- };
-
--#ifdef CPTCFG_BCMA_DRIVER_GPIO
-+#ifdef CONFIG_BCMA_DRIVER_GPIO
- void brcms_led_unregister(struct brcms_info *wl);
- int brcms_led_register(struct brcms_info *wl);
- #else
---- a/Kconfig.sources
-+++ b/Kconfig.sources
-@@ -9,9 +9,6 @@ source "$BACKPORT_DIR/drivers/net/wirele
- #source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig"
- source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
-
--source "$BACKPORT_DIR/drivers/ssb/Kconfig"
--source "$BACKPORT_DIR/drivers/bcma/Kconfig"
--
- source "$BACKPORT_DIR/net/nfc/Kconfig"
-
- #source "$BACKPORT_DIR/drivers/media/Kconfig"
---- a/Makefile.kernel
-+++ b/Makefile.kernel
-@@ -42,8 +42,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
- obj-$(CPTCFG_WLAN) += drivers/net/wireless/
- #obj-$(CPTCFG_BT) += net/bluetooth/
- #obj-$(CPTCFG_BT) += drivers/bluetooth/
--obj-$(CPTCFG_SSB) += drivers/ssb/
--obj-$(CPTCFG_BCMA) += drivers/bcma/
- #obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/
- obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
- obj-$(CPTCFG_NFC) += net/nfc/
+++ /dev/null
---- a/drivers/net/wireless/ath/Kconfig
-+++ b/drivers/net/wireless/ath/Kconfig
-@@ -1,5 +1,5 @@
- config ATH_COMMON
-- tristate
-+ tristate "ath.ko"
- depends on m
-
- config WLAN_VENDOR_ATH
+++ /dev/null
---- a/drivers/net/wireless/ath/ath10k/Kconfig
-+++ b/drivers/net/wireless/ath/ath10k/Kconfig
-@@ -65,6 +65,12 @@ config ATH10K_TRACING
- ---help---
- Select this to ath10k use tracing infrastructure.
-
-+config ATH10K_THERMAL
-+ bool "Atheros ath10k thermal monitoring support"
-+ depends on THERMAL
-+ ---help---
-+ Select this to ath10k use hwmon for thermal measurement.
-+
- config ATH10K_DFS_CERTIFIED
- bool "Atheros DFS support for certified platforms"
- depends on ATH10K && CFG80211_CERTIFICATION_ONUS
---- a/drivers/net/wireless/ath/ath10k/Makefile
-+++ b/drivers/net/wireless/ath/ath10k/Makefile
-@@ -17,7 +17,7 @@ ath10k_core-y += mac.o \
- ath10k_core-$(CPTCFG_ATH10K_DEBUGFS) += spectral.o
- ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o
- ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o
--ath10k_core-$(CONFIG_THERMAL) += thermal.o
-+ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
- ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o
- ath10k_core-$(CONFIG_PM) += wow.o
-
---- a/drivers/net/wireless/ath/ath10k/thermal.h
-+++ b/drivers/net/wireless/ath/ath10k/thermal.h
-@@ -36,7 +36,7 @@ struct ath10k_thermal {
- int temperature;
- };
-
--#if IS_REACHABLE(CONFIG_THERMAL)
-+#if IS_REACHABLE(CPTCFG_ATH10K_THERMAL)
- int ath10k_thermal_register(struct ath10k *ar);
- void ath10k_thermal_unregister(struct ath10k *ar);
- void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
---- a/local-symbols
-+++ b/local-symbols
-@@ -139,6 +139,7 @@ ATH10K_SDIO=
- ATH10K_USB=
- ATH10K_DEBUG=
- ATH10K_DEBUGFS=
-+ATH10K_THERMAL=
- ATH10K_TRACING=
- ATH10K_DFS_CERTIFIED=
- WCN36XX=
+++ /dev/null
-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>
----
- drivers/net/wireless/ath/ath10k/core.c | 40 ++++++++++++++++++++++++++++------
- 1 file changed, 33 insertions(+), 7 deletions(-)
-
---- a/drivers/net/wireless/ath/ath10k/core.c
-+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -860,6 +860,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;
-@@ -1231,19 +1253,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),
-@@ -2343,7 +2365,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) {
+++ /dev/null
-From 606204bb863fa3b0bb54929d79b4dc46338f9180 Mon Sep 17 00:00:00 2001
-From: Sathishkumar Muruganandam <murugana@codeaurora.org>
-Date: Tue, 27 Mar 2018 11:26:46 +0300
-Subject: [PATCH] ath10k: suppress "Unknown eventid: 36925" warnings
-
-FW has Smart Logging feature enabled by default for detecting failures
-and processing FATAL_CONDITION_EVENTID (36925 - 0x903D) back to host.
-
-Since ath10k doesn't implement the Smart Logging and FATAL CONDITION
-EVENT processing yet, suppressing the unknown event ID warning by moving
-this under ATH10K_DBG_WMI.
-
-Simulated the same issue by having associated STA powered off when
-ping flood was running from AP backbone. This triggerd STA KICKOUT
-in AP followed by FATAL CONDITION event 36925.
-
-Issue was reproduced and verified in below DUT
-------------------------------------------------
-AP mode of OpenWRT QCA9984 running 6.0.8 with FW ver 10.4-3.5.3-00053
-
-Signed-off-by: Sathishkumar Muruganandam <murugana@codeaurora.org>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/ath/ath10k/wmi.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/wireless/ath/ath10k/wmi.c
-+++ b/drivers/net/wireless/ath/ath10k/wmi.c
-@@ -5462,6 +5462,7 @@ static void ath10k_wmi_10_4_op_rx(struct
- case WMI_10_4_WOW_WAKEUP_HOST_EVENTID:
- case WMI_10_4_PEER_RATECODE_LIST_EVENTID:
- case WMI_10_4_WDS_PEER_EVENTID:
-+ case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID:
- ath10k_dbg(ar, ATH10K_DBG_WMI,
- "received event id %d not implemented\n", id);
- break;
+++ /dev/null
-From patchwork Mon May 28 11:25:06 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: Revert "rt2800: use TXOP_BACKOFF for probe frames"
-From: Stanislaw Gruszka <sgruszka@redhat.com>
-X-Patchwork-Id: 10431861
-Message-Id: <1527506706-6488-1-git-send-email-sgruszka@redhat.com>
-To: linux-wireless@vger.kernel.org
-Date: Mon, 28 May 2018 13:25:06 +0200
-
-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>
----
- 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;
+++ /dev/null
---- a/net/mac80211/Makefile
-+++ b/net/mac80211/Makefile
-@@ -6,7 +6,6 @@ mac80211-y := \
- driver-ops.o \
- sta_info.o \
- wep.o \
-- aead_api.o \
- wpa.o \
- scan.o offchannel.o \
- ht.o agg-tx.o agg-rx.o \
-@@ -16,8 +15,8 @@ mac80211-y := \
- rate.o \
- michael.o \
- tkip.o \
-+ aes_ccm.o \
- aes_cmac.o \
-- aes_gmac.o \
- fils_aead.o \
- cfg.o \
- ethtool.o \
---- a/net/mac80211/aead_api.c
-+++ /dev/null
-@@ -1,115 +0,0 @@
--/*
-- * Copyright 2003-2004, Instant802 Networks, Inc.
-- * Copyright 2005-2006, Devicescape Software, Inc.
-- * Copyright 2014-2015, Qualcomm Atheros, Inc.
-- *
-- * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- */
--
--#include <linux/kernel.h>
--#include <linux/types.h>
--#include <linux/err.h>
--#include <linux/scatterlist.h>
--#include <crypto/aead.h>
--
--#include "aead_api.h"
--
--int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
-- u8 *data, size_t data_len, u8 *mic)
--{
-- size_t mic_len = crypto_aead_authsize(tfm);
-- struct scatterlist sg[3];
-- struct aead_request *aead_req;
-- int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
-- u8 *__aad;
--
-- aead_req = kzalloc(reqsize + aad_len, GFP_ATOMIC);
-- if (!aead_req)
-- return -ENOMEM;
--
-- __aad = (u8 *)aead_req + reqsize;
-- memcpy(__aad, aad, aad_len);
--
-- sg_init_table(sg, 3);
-- sg_set_buf(&sg[0], __aad, aad_len);
-- sg_set_buf(&sg[1], data, data_len);
-- sg_set_buf(&sg[2], mic, mic_len);
--
-- aead_request_set_tfm(aead_req, tfm);
-- aead_request_set_crypt(aead_req, sg, sg, data_len, b_0);
-- aead_request_set_ad(aead_req, sg[0].length);
--
-- crypto_aead_encrypt(aead_req);
-- kzfree(aead_req);
--
-- return 0;
--}
--
--int aead_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
-- u8 *data, size_t data_len, u8 *mic)
--{
-- size_t mic_len = crypto_aead_authsize(tfm);
-- struct scatterlist sg[3];
-- struct aead_request *aead_req;
-- int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
-- u8 *__aad;
-- int err;
--
-- if (data_len == 0)
-- return -EINVAL;
--
-- aead_req = kzalloc(reqsize + aad_len, GFP_ATOMIC);
-- if (!aead_req)
-- return -ENOMEM;
--
-- __aad = (u8 *)aead_req + reqsize;
-- memcpy(__aad, aad, aad_len);
--
-- sg_init_table(sg, 3);
-- sg_set_buf(&sg[0], __aad, aad_len);
-- sg_set_buf(&sg[1], data, data_len);
-- sg_set_buf(&sg[2], mic, mic_len);
--
-- aead_request_set_tfm(aead_req, tfm);
-- aead_request_set_crypt(aead_req, sg, sg, data_len + mic_len, b_0);
-- aead_request_set_ad(aead_req, sg[0].length);
--
-- err = crypto_aead_decrypt(aead_req);
-- kzfree(aead_req);
--
-- return err;
--}
--
--struct crypto_aead *
--aead_key_setup_encrypt(const char *alg, const u8 key[],
-- size_t key_len, size_t mic_len)
--{
-- struct crypto_aead *tfm;
-- int err;
--
-- tfm = crypto_alloc_aead(alg, 0, CRYPTO_ALG_ASYNC);
-- if (IS_ERR(tfm))
-- return tfm;
--
-- err = crypto_aead_setkey(tfm, key, key_len);
-- if (err)
-- goto free_aead;
-- err = crypto_aead_setauthsize(tfm, mic_len);
-- if (err)
-- goto free_aead;
--
-- return tfm;
--
--free_aead:
-- crypto_free_aead(tfm);
-- return ERR_PTR(err);
--}
--
--void aead_key_free(struct crypto_aead *tfm)
--{
-- crypto_free_aead(tfm);
--}
---- a/net/mac80211/aead_api.h
-+++ /dev/null
-@@ -1,27 +0,0 @@
--/*
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- */
--
--#ifndef _AEAD_API_H
--#define _AEAD_API_H
--
--#include <crypto/aead.h>
--#include <linux/crypto.h>
--
--struct crypto_aead *
--aead_key_setup_encrypt(const char *alg, const u8 key[],
-- size_t key_len, size_t mic_len);
--
--int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
-- size_t aad_len, u8 *data,
-- size_t data_len, u8 *mic);
--
--int aead_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
-- size_t aad_len, u8 *data,
-- size_t data_len, u8 *mic);
--
--void aead_key_free(struct crypto_aead *tfm);
--
--#endif /* _AEAD_API_H */
---- a/net/mac80211/aes_ccm.h
-+++ b/net/mac80211/aes_ccm.h
-@@ -10,39 +10,17 @@
- #ifndef AES_CCM_H
- #define AES_CCM_H
-
--#include "aead_api.h"
-+#include <linux/crypto.h>
-
--#define CCM_AAD_LEN 32
--
--static inline struct crypto_aead *
--ieee80211_aes_key_setup_encrypt(const u8 key[], size_t key_len, size_t mic_len)
--{
-- return aead_key_setup_encrypt("ccm(aes)", key, key_len, mic_len);
--}
--
--static inline int
--ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm,
-- u8 *b_0, u8 *aad, u8 *data,
-- size_t data_len, u8 *mic)
--{
-- return aead_encrypt(tfm, b_0, aad + 2,
-- be16_to_cpup((__be16 *)aad),
-- data, data_len, mic);
--}
--
--static inline int
--ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm,
-- u8 *b_0, u8 *aad, u8 *data,
-- size_t data_len, u8 *mic)
--{
-- return aead_decrypt(tfm, b_0, aad + 2,
-- be16_to_cpup((__be16 *)aad),
-- data, data_len, mic);
--}
--
--static inline void ieee80211_aes_key_free(struct crypto_aead *tfm)
--{
-- return aead_key_free(tfm);
--}
-+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[],
-+ size_t key_len,
-+ size_t mic_len);
-+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic,
-+ size_t mic_len);
-+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic,
-+ size_t mic_len);
-+void ieee80211_aes_key_free(struct crypto_cipher *tfm);
-
- #endif /* AES_CCM_H */
---- /dev/null
-+++ b/net/mac80211/aes_gcm.c
-@@ -0,0 +1,109 @@
-+/*
-+ * Copyright 2014-2015, Qualcomm Atheros, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/err.h>
-+#include <crypto/aead.h>
-+
-+#include <net/mac80211.h>
-+#include "key.h"
-+#include "aes_gcm.h"
-+
-+int ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic)
-+{
-+ struct scatterlist sg[3];
-+ struct aead_request *aead_req;
-+ int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
-+ u8 *__aad;
-+
-+ aead_req = kzalloc(reqsize + GCM_AAD_LEN, GFP_ATOMIC);
-+ if (!aead_req)
-+ return -ENOMEM;
-+
-+ __aad = (u8 *)aead_req + reqsize;
-+ memcpy(__aad, aad, GCM_AAD_LEN);
-+
-+ sg_init_table(sg, 3);
-+ sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad));
-+ sg_set_buf(&sg[1], data, data_len);
-+ sg_set_buf(&sg[2], mic, IEEE80211_GCMP_MIC_LEN);
-+
-+ aead_request_set_tfm(aead_req, tfm);
-+ aead_request_set_crypt(aead_req, sg, sg, data_len, j_0);
-+ aead_request_set_ad(aead_req, sg[0].length);
-+
-+ crypto_aead_encrypt(aead_req);
-+ kzfree(aead_req);
-+ return 0;
-+}
-+
-+int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic)
-+{
-+ struct scatterlist sg[3];
-+ struct aead_request *aead_req;
-+ int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
-+ u8 *__aad;
-+ int err;
-+
-+ if (data_len == 0)
-+ return -EINVAL;
-+
-+ aead_req = kzalloc(reqsize + GCM_AAD_LEN, GFP_ATOMIC);
-+ if (!aead_req)
-+ return -ENOMEM;
-+
-+ __aad = (u8 *)aead_req + reqsize;
-+ memcpy(__aad, aad, GCM_AAD_LEN);
-+
-+ sg_init_table(sg, 3);
-+ sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad));
-+ sg_set_buf(&sg[1], data, data_len);
-+ sg_set_buf(&sg[2], mic, IEEE80211_GCMP_MIC_LEN);
-+
-+ aead_request_set_tfm(aead_req, tfm);
-+ aead_request_set_crypt(aead_req, sg, sg,
-+ data_len + IEEE80211_GCMP_MIC_LEN, j_0);
-+ aead_request_set_ad(aead_req, sg[0].length);
-+
-+ err = crypto_aead_decrypt(aead_req);
-+ kzfree(aead_req);
-+
-+ return err;
-+}
-+
-+struct crypto_aead *ieee80211_aes_gcm_key_setup_encrypt(const u8 key[],
-+ size_t key_len)
-+{
-+ struct crypto_aead *tfm;
-+ int err;
-+
-+ tfm = crypto_alloc_aead("gcm(aes)", 0, CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(tfm))
-+ return tfm;
-+
-+ err = crypto_aead_setkey(tfm, key, key_len);
-+ if (err)
-+ goto free_aead;
-+ err = crypto_aead_setauthsize(tfm, IEEE80211_GCMP_MIC_LEN);
-+ if (err)
-+ goto free_aead;
-+
-+ return tfm;
-+
-+free_aead:
-+ crypto_free_aead(tfm);
-+ return ERR_PTR(err);
-+}
-+
-+void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm)
-+{
-+ crypto_free_aead(tfm);
-+}
---- a/net/mac80211/aes_gcm.h
-+++ b/net/mac80211/aes_gcm.h
-@@ -9,38 +9,30 @@
- #ifndef AES_GCM_H
- #define AES_GCM_H
-
--#include "aead_api.h"
-+#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)
-+static inline void
-+ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic)
- {
-- return aead_encrypt(tfm, j_0, aad + 2,
-- be16_to_cpup((__be16 *)aad),
-- data, data_len, mic);
- }
-
--static inline int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm,
-- u8 *j_0, u8 *aad, u8 *data,
-- size_t data_len, u8 *mic)
-+static inline int
-+ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic)
- {
-- return aead_decrypt(tfm, j_0, aad + 2,
-- be16_to_cpup((__be16 *)aad),
-- data, data_len, mic);
-+ return -EOPNOTSUPP;
- }
-
- static inline struct crypto_aead *
- ieee80211_aes_gcm_key_setup_encrypt(const u8 key[], size_t key_len)
- {
-- return aead_key_setup_encrypt("gcm(aes)", key,
-- key_len, IEEE80211_GCMP_MIC_LEN);
-+ return NULL;
- }
-
--static inline void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm)
-+static inline void
-+ieee80211_aes_gcm_key_free(struct crypto_aead *tfm)
- {
-- return aead_key_free(tfm);
- }
-
- #endif /* AES_GCM_H */
---- a/net/mac80211/wpa.c
-+++ b/net/mac80211/wpa.c
-@@ -306,7 +306,8 @@ ieee80211_crypto_tkip_decrypt(struct iee
- }
-
-
--static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad)
-+static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
-+ u16 data_len)
- {
- __le16 mask_fc;
- int a4_included, mgmt;
-@@ -336,14 +337,8 @@ static void ccmp_special_blocks(struct s
- else
- qos_tid = 0;
-
-- /* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
-- * mode authentication are not allowed to collide, yet both are derived
-- * from this vector b_0. We only set L := 1 here to indicate that the
-- * data size can be represented in (L+1) bytes. The CCM layer will take
-- * care of storing the data length in the top (L+1) bytes and setting
-- * and clearing the other bits as is required to derive the two IVs.
-- */
-- b_0[0] = 0x1;
-+ /* First block, b_0 */
-+ b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
-
- /* Nonce: Nonce Flags | A2 | PN
- * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
-@@ -351,6 +346,8 @@ static void ccmp_special_blocks(struct s
- b_0[1] = qos_tid | (mgmt << 4);
- memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
- memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
-+ /* l(m) */
-+ put_unaligned_be16(data_len, &b_0[14]);
-
- /* AAD (extra authenticate-only data) / masked 802.11 header
- * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
-@@ -407,7 +404,7 @@ static int ccmp_encrypt_skb(struct ieee8
- u8 *pos;
- u8 pn[6];
- u64 pn64;
-- u8 aad[CCM_AAD_LEN];
-+ u8 aad[2 * AES_BLOCK_SIZE];
- u8 b_0[AES_BLOCK_SIZE];
-
- if (info->control.hw_key &&
-@@ -462,9 +459,11 @@ static int ccmp_encrypt_skb(struct ieee8
- return 0;
-
- pos += IEEE80211_CCMP_HDR_LEN;
-- ccmp_special_blocks(skb, pn, b_0, aad);
-- return ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
-- skb_put(skb, mic_len));
-+ ccmp_special_blocks(skb, pn, b_0, aad, len);
-+ ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
-+ skb_put(skb, mic_len), mic_len);
-+
-+ return 0;
- }
-
-
-@@ -537,13 +536,13 @@ ieee80211_crypto_ccmp_decrypt(struct iee
- u8 aad[2 * AES_BLOCK_SIZE];
- u8 b_0[AES_BLOCK_SIZE];
- /* hardware didn't decrypt/verify MIC */
-- ccmp_special_blocks(skb, pn, b_0, aad);
-+ ccmp_special_blocks(skb, pn, b_0, aad, data_len);
-
- if (ieee80211_aes_ccm_decrypt(
- key->u.ccmp.tfm, b_0, aad,
- skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
- data_len,
-- skb->data + skb->len - mic_len))
-+ skb->data + skb->len - mic_len, mic_len))
- return RX_DROP_UNUSABLE;
- }
-
-@@ -639,7 +638,7 @@ static int gcmp_encrypt_skb(struct ieee8
- u8 *pos;
- u8 pn[6];
- u64 pn64;
-- u8 aad[GCM_AAD_LEN];
-+ u8 aad[2 * AES_BLOCK_SIZE];
- u8 j_0[AES_BLOCK_SIZE];
-
- if (info->control.hw_key &&
-@@ -696,8 +695,10 @@ static int gcmp_encrypt_skb(struct ieee8
-
- pos += IEEE80211_GCMP_HDR_LEN;
- gcmp_special_blocks(skb, pn, j_0, aad);
-- return ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len,
-- skb_put(skb, IEEE80211_GCMP_MIC_LEN));
-+ ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len,
-+ skb_put(skb, IEEE80211_GCMP_MIC_LEN));
-+
-+ return 0;
- }
-
- ieee80211_tx_result
-@@ -1121,9 +1122,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct
- struct ieee80211_key *key = tx->key;
- struct ieee80211_mmie_16 *mmie;
- struct ieee80211_hdr *hdr;
-- u8 aad[GMAC_AAD_LEN];
-+ u8 aad[20];
- u64 pn64;
-- u8 nonce[GMAC_NONCE_LEN];
-+ u8 nonce[12];
-
- if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
- return TX_DROP;
-@@ -1169,7 +1170,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct
- struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
- struct ieee80211_key *key = rx->key;
- struct ieee80211_mmie_16 *mmie;
-- u8 aad[GMAC_AAD_LEN], mic[GMAC_MIC_LEN], ipn[6], nonce[GMAC_NONCE_LEN];
-+ u8 aad[20], mic[16], ipn[6], nonce[12];
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-
- if (!ieee80211_is_mgmt(hdr->frame_control))
---- /dev/null
-+++ b/net/mac80211/aes_ccm.c
-@@ -0,0 +1,144 @@
-+/*
-+ * Copyright 2003-2004, Instant802 Networks, Inc.
-+ * Copyright 2005-2006, Devicescape Software, Inc.
-+ *
-+ * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/err.h>
-+#include <crypto/aead.h>
-+#include <crypto/aes.h>
-+
-+#include <net/mac80211.h>
-+#include "key.h"
-+#include "aes_ccm.h"
-+
-+static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, u8 *s_0,
-+ u8 *a, u8 *b)
-+{
-+ int i;
-+
-+ crypto_cipher_encrypt_one(tfm, b, b_0);
-+
-+ /* Extra Authenticate-only data (always two AES blocks) */
-+ for (i = 0; i < AES_BLOCK_SIZE; i++)
-+ aad[i] ^= b[i];
-+ crypto_cipher_encrypt_one(tfm, b, aad);
-+
-+ aad += AES_BLOCK_SIZE;
-+
-+ for (i = 0; i < AES_BLOCK_SIZE; i++)
-+ aad[i] ^= b[i];
-+ crypto_cipher_encrypt_one(tfm, a, aad);
-+
-+ /* Mask out bits from auth-only-b_0 */
-+ b_0[0] &= 0x07;
-+
-+ /* S_0 is used to encrypt T (= MIC) */
-+ b_0[14] = 0;
-+ b_0[15] = 0;
-+ crypto_cipher_encrypt_one(tfm, s_0, b_0);
-+}
-+
-+
-+void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic,
-+ size_t mic_len)
-+{
-+ int i, j, last_len, num_blocks;
-+ u8 b[AES_BLOCK_SIZE];
-+ u8 s_0[AES_BLOCK_SIZE];
-+ u8 e[AES_BLOCK_SIZE];
-+ u8 *pos, *cpos;
-+
-+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
-+ last_len = data_len % AES_BLOCK_SIZE;
-+ aes_ccm_prepare(tfm, b_0, aad, s_0, b, b);
-+
-+ /* Process payload blocks */
-+ pos = data;
-+ cpos = data;
-+ for (j = 1; j <= num_blocks; j++) {
-+ int blen = (j == num_blocks && last_len) ?
-+ last_len : AES_BLOCK_SIZE;
-+
-+ /* Authentication followed by encryption */
-+ for (i = 0; i < blen; i++)
-+ b[i] ^= pos[i];
-+ crypto_cipher_encrypt_one(tfm, b, b);
-+
-+ b_0[14] = (j >> 8) & 0xff;
-+ b_0[15] = j & 0xff;
-+ crypto_cipher_encrypt_one(tfm, e, b_0);
-+ for (i = 0; i < blen; i++)
-+ *cpos++ = *pos++ ^ e[i];
-+ }
-+
-+ for (i = 0; i < mic_len; i++)
-+ mic[i] = b[i] ^ s_0[i];
-+}
-+
-+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad,
-+ u8 *data, size_t data_len, u8 *mic,
-+ size_t mic_len)
-+{
-+ int i, j, last_len, num_blocks;
-+ u8 *pos, *cpos;
-+ u8 a[AES_BLOCK_SIZE];
-+ u8 b[AES_BLOCK_SIZE];
-+ u8 s_0[AES_BLOCK_SIZE];
-+
-+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
-+ last_len = data_len % AES_BLOCK_SIZE;
-+ aes_ccm_prepare(tfm, b_0, aad, s_0, a, b);
-+
-+ /* Process payload blocks */
-+ cpos = data;
-+ pos = data;
-+ for (j = 1; j <= num_blocks; j++) {
-+ int blen = (j == num_blocks && last_len) ?
-+ last_len : AES_BLOCK_SIZE;
-+
-+ /* Decryption followed by authentication */
-+ b_0[14] = (j >> 8) & 0xff;
-+ b_0[15] = j & 0xff;
-+ crypto_cipher_encrypt_one(tfm, b, b_0);
-+ for (i = 0; i < blen; i++) {
-+ *pos = *cpos++ ^ b[i];
-+ a[i] ^= *pos++;
-+ }
-+ crypto_cipher_encrypt_one(tfm, a, a);
-+ }
-+
-+ for (i = 0; i < mic_len; i++) {
-+ if ((mic[i] ^ s_0[i]) != a[i])
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[],
-+ size_t key_len,
-+ size_t mic_len)
-+{
-+ struct crypto_cipher *tfm;
-+
-+ tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
-+ if (!IS_ERR(tfm))
-+ crypto_cipher_setkey(tfm, key, key_len);
-+
-+ return tfm;
-+}
-+
-+
-+void ieee80211_aes_key_free(struct crypto_cipher *tfm)
-+{
-+ crypto_free_cipher(tfm);
-+}
---- a/net/mac80211/Kconfig
-+++ b/net/mac80211/Kconfig
-@@ -5,8 +5,6 @@ config MAC80211
- depends on CRYPTO
- depends on CRYPTO_ARC4
- depends on CRYPTO_AES
-- depends on CRYPTO_CCM
-- depends on CRYPTO_GCM
- depends on CRYPTO_CMAC
- depends on CRC32
- ---help---
---- a/net/mac80211/aes_gmac.h
-+++ b/net/mac80211/aes_gmac.h
-@@ -15,10 +15,22 @@
- #define GMAC_MIC_LEN 16
- #define GMAC_NONCE_LEN 12
-
--struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
-- size_t key_len);
--int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
-- const u8 *data, size_t data_len, u8 *mic);
--void ieee80211_aes_gmac_key_free(struct crypto_aead *tfm);
-+static inline struct crypto_aead *
-+ieee80211_aes_gmac_key_setup(const u8 key[], size_t key_len)
-+{
-+ return NULL;
-+}
-+
-+static inline int
-+ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
-+ const u8 *data, size_t data_len, u8 *mic)
-+{
-+ return -EOPNOTSUPP;
-+}
-+
-+static inline void
-+ieee80211_aes_gmac_key_free(struct crypto_aead *tfm)
-+{
-+}
-
- #endif /* AES_GMAC_H */
---- a/net/mac80211/key.h
-+++ b/net/mac80211/key.h
-@@ -88,7 +88,7 @@ struct ieee80211_key {
- * Management frames.
- */
- u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
-- struct crypto_aead *tfm;
-+ struct crypto_cipher *tfm;
- u32 replays; /* dot11RSNAStatsCCMPReplays */
- } ccmp;
- struct {
+++ /dev/null
-Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects
-
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1058,7 +1058,6 @@ static int ieee80211_stop_ap(struct wiph
- sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
-
- __sta_info_flush(sdata, true);
-- ieee80211_free_keys(sdata, true);
-
- sdata->vif.bss_conf.enable_beacon = false;
- sdata->vif.bss_conf.ssid_len = 0;
+++ /dev/null
---- a/net/wireless/sysfs.c
-+++ b/net/wireless/sysfs.c
-@@ -24,18 +24,35 @@ static inline struct cfg80211_registered
- return container_of(dev, struct cfg80211_registered_device, wiphy.dev);
- }
-
--#define SHOW_FMT(name, fmt, member) \
-+#define SHOW_FMT(name, fmt, member, mode) \
- static ssize_t name ## _show(struct device *dev, \
- struct device_attribute *attr, \
- char *buf) \
- { \
- return sprintf(buf, fmt "\n", dev_to_rdev(dev)->member); \
- } \
--static DEVICE_ATTR_RO(name)
-+static DEVICE_ATTR_##mode(name)
-
--SHOW_FMT(index, "%d", wiphy_idx);
--SHOW_FMT(macaddress, "%pM", wiphy.perm_addr);
--SHOW_FMT(address_mask, "%pM", wiphy.addr_mask);
-+static ssize_t macaddress_store(struct device *dev,
-+ struct device_attribute *attr,
-+ const char *buf, size_t len)
-+{
-+ u8 mac[ETH_ALEN];
-+
-+ if (!mac_pton(buf, mac))
-+ return -EINVAL;
-+
-+ if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n')
-+ return -EINVAL;
-+
-+ memcpy(dev_to_rdev(dev)->wiphy.perm_addr, mac, ETH_ALEN);
-+
-+ return strnlen(buf, len);
-+}
-+
-+SHOW_FMT(index, "%d", wiphy_idx, RO);
-+SHOW_FMT(macaddress, "%pM", wiphy.perm_addr, RW);
-+SHOW_FMT(address_mask, "%pM", wiphy.addr_mask, RO);
-
- static ssize_t name_show(struct device *dev,
- struct device_attribute *attr,
+++ /dev/null
-Disable FILS support, since it pulls in crypto hash support
-
---- a/net/mac80211/fils_aead.h
-+++ b/net/mac80211/fils_aead.h
-@@ -10,7 +10,7 @@
- #ifndef FILS_AEAD_H
- #define FILS_AEAD_H
-
--#if LINUX_VERSION_IS_GEQ(4,3,0)
-+#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */
- int fils_encrypt_assoc_req(struct sk_buff *skb,
- struct ieee80211_mgd_assoc_data *assoc_data);
- int fils_decrypt_assoc_resp(struct ieee80211_sub_if_data *sdata,
---- a/net/mac80211/fils_aead.c
-+++ b/net/mac80211/fils_aead.c
-@@ -1,4 +1,4 @@
--#if LINUX_VERSION_IS_GEQ(4,3,0)
-+#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */
- /*
- * FILS AEAD for (Re)Association Request/Response frames
- * Copyright 2016, Qualcomm Atheros, Inc.
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -550,7 +550,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
- NL80211_FEATURE_MAC_ON_CREATE |
- NL80211_FEATURE_USERSPACE_MPM |
- NL80211_FEATURE_FULL_AP_CLIENT_STATE;
--#if LINUX_VERSION_IS_GEQ(4,3,0)
-+#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_FILS_STA);
- #endif
-
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 7 Oct 2017 09:37:28 +0200
-Subject: [PATCH] Revert "mac80211: aes-cmac: switch to shash CMAC
- driver"
-
-This reverts commit 26717828b75dd5c46e97f7f4a9b937d038bb2852.
-Reduces mac80211 dependencies for LEDE
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/aes_cmac.c
-+++ b/net/mac80211/aes_cmac.c
-@@ -22,50 +22,126 @@
- #define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */
- #define AAD_LEN 20
-
--static const u8 zero[CMAC_TLEN_256];
-
--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)
-+{
-+ int i, carry;
-+
-+ carry = pad[0] & 0x80;
-+ for (i = 0; i < AES_BLOCK_SIZE - 1; i++)
-+ pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);
-+ pad[AES_BLOCK_SIZE - 1] <<= 1;
-+ if (carry)
-+ pad[AES_BLOCK_SIZE - 1] ^= 0x87;
-+}
-+
-+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;
-+
-+ memset(cbc, 0, AES_BLOCK_SIZE);
-+
-+ total_len = 0;
-+ for (e = 0; e < num_elem; e++)
-+ total_len += len[e];
-+ left = total_len;
-+
-+ e = 0;
-+ pos = addr[0];
-+ end = pos + len[0];
-+
-+ while (left >= AES_BLOCK_SIZE) {
-+ for (i = 0; i < AES_BLOCK_SIZE; i++) {
-+ cbc[i] ^= *pos++;
-+ if (pos >= end) {
-+ e++;
-+ pos = addr[e];
-+ end = pos + len[e];
-+ }
-+ }
-+ if (left > AES_BLOCK_SIZE)
-+ crypto_cipher_encrypt_one(tfm, cbc, cbc);
-+ left -= AES_BLOCK_SIZE;
-+ }
-+
-+ memset(pad, 0, AES_BLOCK_SIZE);
-+ crypto_cipher_encrypt_one(tfm, pad, pad);
-+ gf_mulx(pad);
-+
-+ if (left || total_len == 0) {
-+ for (i = 0; i < left; i++) {
-+ cbc[i] ^= *pos++;
-+ if (pos >= end) {
-+ e++;
-+ pos = addr[e];
-+ end = pos + len[e];
-+ }
-+ }
-+ cbc[left] ^= 0x80;
-+ gf_mulx(pad);
-+ }
-+
-+ for (i = 0; i < AES_BLOCK_SIZE; i++)
-+ pad[i] ^= cbc[i];
-+ crypto_cipher_encrypt_one(tfm, pad, pad);
-+ memcpy(mac, pad, mac_len);
-+}
-
-- 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)
-+{
-+ const u8 *addr[3];
-+ size_t len[3];
-+ u8 zero[CMAC_TLEN];
-+
-+ memset(zero, 0, CMAC_TLEN);
-+ addr[0] = aad;
-+ len[0] = AAD_LEN;
-+ addr[1] = data;
-+ 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)
- {
-- SHASH_DESC_ON_STACK(desc, tfm);
-+ const u8 *addr[3];
-+ size_t len[3];
-+ u8 zero[CMAC_TLEN_256];
-+
-+ memset(zero, 0, CMAC_TLEN_256);
-+ addr[0] = aad;
-+ len[0] = AAD_LEN;
-+ addr[1] = data;
-+ len[1] = data_len - CMAC_TLEN_256;
-+ 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);
-- crypto_shash_finup(desc, zero, CMAC_TLEN_256, mic);
-+ aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256);
- }
-
--struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
-- size_t key_len)
-+struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
-+ size_t key_len)
- {
-- struct crypto_shash *tfm;
-+ struct crypto_cipher *tfm;
-
-- tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
-+ tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
- if (!IS_ERR(tfm))
-- crypto_shash_setkey(tfm, key, key_len);
-+ crypto_cipher_setkey(tfm, key, key_len);
-
- return tfm;
- }
-
--void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm)
-+
-+void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm)
- {
-- crypto_free_shash(tfm);
-+ crypto_free_cipher(tfm);
- }
---- a/net/mac80211/aes_cmac.h
-+++ b/net/mac80211/aes_cmac.h
-@@ -10,14 +10,13 @@
- #define AES_CMAC_H
-
- #include <linux/crypto.h>
--#include <crypto/hash.h>
-
--struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
-- size_t key_len);
--void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad,
-+struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
-+ size_t key_len);
-+void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
- const u8 *data, size_t data_len, u8 *mic);
--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);
--void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm);
-+void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm);
-
- #endif /* AES_CMAC_H */
---- a/net/mac80211/key.h
-+++ b/net/mac80211/key.h
-@@ -93,7 +93,7 @@ struct ieee80211_key {
- } ccmp;
- struct {
- u8 rx_pn[IEEE80211_CMAC_PN_LEN];
-- struct crypto_shash *tfm;
-+ struct crypto_cipher *tfm;
- u32 replays; /* dot11RSNAStatsCMACReplays */
- u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
- } aes_cmac;
+++ /dev/null
---- a/net/mac80211/Kconfig
-+++ b/net/mac80211/Kconfig
-@@ -5,7 +5,6 @@ config MAC80211
- depends on CRYPTO
- depends on CRYPTO_ARC4
- depends on CRYPTO_AES
-- depends on CRYPTO_CMAC
- depends on CRC32
- ---help---
- This option enables the hardware independent IEEE 802.11
+++ /dev/null
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -3750,6 +3750,12 @@ out:
- netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
- struct net_device *dev)
- {
-+#if defined(sk_pacing_shift) || LINUX_VERSION_IS_GEQ(4,15,0)
-+ if (skb->sk && sk_fullsock(skb->sk) &&
-+ skb->sk->sk_pacing_shift != 6)
-+ skb->sk->sk_pacing_shift = 6;
-+#endif
-+
- if (unlikely(ieee80211_multicast_to_unicast(skb, dev))) {
- struct sk_buff_head queue;
-
+++ /dev/null
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -292,7 +292,7 @@ void ieee80211_restart_hw(struct ieee802
- }
- EXPORT_SYMBOL(ieee80211_restart_hw);
-
--#ifdef CONFIG_INET
-+#ifdef __disabled__CONFIG_INET
- static int ieee80211_ifa_changed(struct notifier_block *nb,
- unsigned long data, void *arg)
- {
-@@ -351,7 +351,7 @@ static int ieee80211_ifa_changed(struct
- }
- #endif
-
--#if IS_ENABLED(CONFIG_IPV6)
-+#if IS_ENABLED(__disabled__CONFIG_IPV6)
- static int ieee80211_ifa6_changed(struct notifier_block *nb,
- unsigned long data, void *arg)
- {
-@@ -1114,14 +1114,14 @@ int ieee80211_register_hw(struct ieee802
- if (result)
- goto fail_flows;
-
--#ifdef CONFIG_INET
-+#ifdef __disabled__CONFIG_INET
- local->ifa_notifier.notifier_call = ieee80211_ifa_changed;
- result = register_inetaddr_notifier(&local->ifa_notifier);
- if (result)
- goto fail_ifa;
- #endif
-
--#if IS_ENABLED(CONFIG_IPV6)
-+#if IS_ENABLED(__disabled__CONFIG_IPV6)
- local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
- result = register_inet6addr_notifier(&local->ifa6_notifier);
- if (result)
-@@ -1130,13 +1130,13 @@ int ieee80211_register_hw(struct ieee802
-
- return 0;
-
--#if IS_ENABLED(CONFIG_IPV6)
-+#if IS_ENABLED(__disabled__CONFIG_IPV6)
- fail_ifa6:
--#ifdef CONFIG_INET
-+#ifdef __disabled__CONFIG_INET
- unregister_inetaddr_notifier(&local->ifa_notifier);
- #endif
- #endif
--#if defined(CONFIG_INET) || defined(CONFIG_IPV6)
-+#if defined(__disabled__CONFIG_INET) || defined(__disabled__CONFIG_IPV6)
- fail_ifa:
- #endif
- ieee80211_txq_teardown_flows(local);
-@@ -1166,10 +1166,10 @@ void ieee80211_unregister_hw(struct ieee
- tasklet_kill(&local->tx_pending_tasklet);
- tasklet_kill(&local->tasklet);
-
--#ifdef CONFIG_INET
-+#ifdef __disabled__CONFIG_INET
- unregister_inetaddr_notifier(&local->ifa_notifier);
- #endif
--#if IS_ENABLED(CONFIG_IPV6)
-+#if IS_ENABLED(__disabled__CONFIG_IPV6)
- unregister_inet6addr_notifier(&local->ifa6_notifier);
- #endif
-
+++ /dev/null
-From: Thomas Hebb <tommyhebb@gmail.com>
-Subject: [PATCH] ath10k: search all IEs for variant before falling back
-Date: Wed, 21 Feb 2018 11:43:39 -0500
-
-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>
----
- drivers/net/wireless/ath/ath10k/core.c | 134 ++++++++++++++++++---------------
- 1 file changed, 72 insertions(+), 62 deletions(-)
-
---- a/drivers/net/wireless/ath/ath10k/core.c
-+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -1132,14 +1132,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,
-@@ -1177,69 +1224,23 @@ 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;
-- }
-+ /* attempt to find boardname in the IE list */
-+ ret = ath10k_core_search_bd(ar, boardname, data, len);
-
-- 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 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);
-
-- if (ret == -ENOENT)
-- /* no match found, continue */
-- break;
-- else if (ret)
-- /* there was an error, bail out */
-- goto err;
--
-- /* board data found */
-- goto out;
-- }
--
-- /* jump over the padding */
-- ie_len = ALIGN(ie_len, 4);
--
-- len -= ie_len;
-- data += ie_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;
- }
-
-+ if (ret)
-+ goto err;
-+
- return 0;
-
- err:
-@@ -1248,12 +1249,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);
-
-@@ -1279,17 +1280,26 @@ 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;
- ret = ath10k_core_fetch_board_data_api_n(ar, boardname,
-+ fallback_boardname,
- ATH10K_BOARD_API2_FILE);
- if (!ret)
- goto success;
+++ /dev/null
---- a/drivers/net/wireless/ath/ath5k/initvals.c
-+++ b/drivers/net/wireless/ath/ath5k/initvals.c
-@@ -62,8 +62,14 @@ static const struct ath5k_ini ar5210_ini
- { AR5K_IMR, 0 },
- { AR5K_IER, AR5K_IER_DISABLE },
- { AR5K_BSR, 0, AR5K_INI_READ },
-+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
- { AR5K_TXCFG, AR5K_DMASIZE_128B },
- { AR5K_RXCFG, AR5K_DMASIZE_128B },
-+#else
-+ /* WAR for AR71xx PCI bug */
-+ { AR5K_TXCFG, AR5K_DMASIZE_128B },
-+ { AR5K_RXCFG, AR5K_DMASIZE_4B },
-+#endif
- { AR5K_CFG, AR5K_INIT_CFG },
- { AR5K_TOPS, 8 },
- { AR5K_RXNOFRM, 8 },
---- a/drivers/net/wireless/ath/ath5k/dma.c
-+++ b/drivers/net/wireless/ath/ath5k/dma.c
-@@ -869,10 +869,18 @@ ath5k_hw_dma_init(struct ath5k_hw *ah)
- * guess we can tweak it and see how it goes ;-)
- */
- if (ah->ah_version != AR5K_AR5210) {
-+#if !defined(CONFIG_ATHEROS_AR71XX) && !defined(CONFIG_ATH79)
- AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
- AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
- AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
- AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_128B);
-+#else
-+ /* WAR for AR71xx PCI bug */
-+ AR5K_REG_WRITE_BITS(ah, AR5K_TXCFG,
-+ AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B);
-+ AR5K_REG_WRITE_BITS(ah, AR5K_RXCFG,
-+ AR5K_RXCFG_SDMAMW, AR5K_DMASIZE_4B);
-+#endif
- }
-
- /* Pre-enable interrupts on 5211/5212*/
+++ /dev/null
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -2215,7 +2215,7 @@ static int ieee80211_scan(struct wiphy *
- * the frames sent while scanning on other channel will be
- * lost)
- */
-- if (sdata->u.ap.beacon &&
-+ if (0 && sdata->u.ap.beacon &&
- (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
- !(req->flags & NL80211_SCAN_FLAG_AP)))
- return -EOPNOTSUPP;
+++ /dev/null
-From: Brian Norris <briannorris@chromium.org>
-Date: Thu, 19 Oct 2017 11:45:19 -0700
-Subject: [PATCH] ath10k: fix build errors with !CONFIG_PM
-
-Build errors have been reported with CONFIG_PM=n:
-
-drivers/net/wireless/ath/ath10k/pci.c:3416:8: error: implicit
-declaration of function 'ath10k_pci_suspend'
-[-Werror=implicit-function-declaration]
-
-drivers/net/wireless/ath/ath10k/pci.c:3428:8: error: implicit
-declaration of function 'ath10k_pci_resume'
-[-Werror=implicit-function-declaration]
-
-These are caused by the combination of the following two commits:
-
-6af1de2e4ec4 ("ath10k: mark PM functions as __maybe_unused")
-96378bd2c6cd ("ath10k: fix core PCI suspend when WoWLAN is supported but
-disabled")
-
-Both build fine on their own.
-
-But now that ath10k_pci_pm_{suspend,resume}() is compiled
-unconditionally, we should also compile ath10k_pci_{suspend,resume}()
-unconditionally.
-
-And drop the #ifdef around ath10k_pci_hif_{suspend,resume}() too; they
-are trivial (empty), so we're not saving much space by compiling them
-out. And the alternatives would be to sprinkle more __maybe_unused, or
-spread the #ifdef's further.
-
-Build tested with the following combinations:
-CONFIG_PM=y && CONFIG_PM_SLEEP=y
-CONFIG_PM=y && CONFIG_PM_SLEEP=n
-CONFIG_PM=n
-
-Fixes: 96378bd2c6cd ("ath10k: fix core PCI suspend when WoWLAN is supported but disabled")
-Fixes: 096ad2a15fd8 ("Merge branch 'ath-next'")
-Signed-off-by: Brian Norris <briannorris@chromium.org>
-Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
----
-
---- a/drivers/net/wireless/ath/ath10k/pci.c
-+++ b/drivers/net/wireless/ath/ath10k/pci.c
-@@ -2577,8 +2577,6 @@ void ath10k_pci_hif_power_down(struct at
- */
- }
-
--#ifdef CONFIG_PM
--
- static int ath10k_pci_hif_suspend(struct ath10k *ar)
- {
- /* Nothing to do; the important stuff is in the driver suspend. */
-@@ -2627,7 +2625,6 @@ static int ath10k_pci_resume(struct ath1
-
- return ret;
- }
--#endif
-
- static bool ath10k_pci_validate_cal(void *data, size_t size)
- {
-@@ -2782,10 +2779,8 @@ static const struct ath10k_hif_ops ath10
- .power_down = ath10k_pci_hif_power_down,
- .read32 = ath10k_pci_read32,
- .write32 = ath10k_pci_write32,
--#ifdef CONFIG_PM
- .suspend = ath10k_pci_hif_suspend,
- .resume = ath10k_pci_hif_resume,
--#endif
- .fetch_cal_eeprom = ath10k_pci_hif_fetch_cal_eeprom,
- };
-
+++ /dev/null
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 20 Nov 2017 17:01:44 +0100
-Subject: [PATCH] mac80211: properly free requested-but-not-started TX agg
- sessions
-
-When deleting a station or otherwise tearing down all aggregation
-sessions, make sure to delete requested but not yet started ones,
-to avoid the following scenario:
-
- * session is requested, added to tid_start_tx[]
- * ieee80211_ba_session_work() runs, gets past BLOCK_BA check
- * ieee80211_sta_tear_down_BA_sessions() runs, locks &sta->ampdu_mlme.mtx,
- e.g. while deleting the station - deleting all active sessions
- * ieee80211_ba_session_work() continues since tear down flushes it, and
- calls ieee80211_tx_ba_session_handle_start() for the new session, arms
- the timer for it
- * station deletion continues to __cleanup_single_sta() and frees the
- session struct, while the timer is armed
-
-Reported-by: Fengguang Wu <fengguang.wu@intel.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -330,6 +330,11 @@ int ___ieee80211_stop_tx_ba_session(stru
-
- spin_lock_bh(&sta->lock);
-
-+ /* free struct pending for start, if present */
-+ tid_tx = sta->ampdu_mlme.tid_start_tx[tid];
-+ kfree(tid_tx);
-+ sta->ampdu_mlme.tid_start_tx[tid] = NULL;
-+
- tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
- if (!tid_tx) {
- spin_unlock_bh(&sta->lock);
+++ /dev/null
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Thu, 4 Jan 2018 15:51:53 +0100
-Subject: [PATCH] mac80211: mesh: drop frames appearing to be from us
-
-If there are multiple mesh stations with the same MAC address,
-they will both get confused and start throwing warnings.
-
-Obviously in this case nothing can actually work anyway, so just
-drop frames that look like they're from ourselves early on.
-
-Reported-by: Gui Iribarren <gui@altermundi.net>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -3632,6 +3632,8 @@ static bool ieee80211_accept_frame(struc
- }
- return true;
- case NL80211_IFTYPE_MESH_POINT:
-+ if (ether_addr_equal(sdata->vif.addr, hdr->addr2))
-+ return false;
- if (multicast)
- return true;
- return ether_addr_equal(sdata->vif.addr, hdr->addr1);
+++ /dev/null
-From 2fd3877b5bb7d39782c3205a1dcda02023b8514a Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:31 +0100
-Subject: [PATCH] brcmfmac: handle FWHALT mailbox indication
-
-The firmware uses a mailbox to communicate to the host what is going
-on. In the driver we validate the bit received. Various people seen
-the following message:
-
- brcmfmac: brcmf_sdio_hostmail: Unknown mailbox data content: 0x40012
-
-Bit 4 is cause of this message, but this actually indicates the firmware
-has halted. Handle this bit by giving a more meaningful error message.
-
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 14 ++++++++++----
- 1 file changed, 10 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -260,10 +260,11 @@ struct rte_console {
- #define I_HMB_HOST_INT I_HMB_SW3 /* Miscellaneous Interrupt */
-
- /* tohostmailboxdata */
--#define HMB_DATA_NAKHANDLED 1 /* retransmit NAK'd frame */
--#define HMB_DATA_DEVREADY 2 /* talk to host after enable */
--#define HMB_DATA_FC 4 /* per prio flowcontrol update flag */
--#define HMB_DATA_FWREADY 8 /* fw ready for protocol activity */
-+#define HMB_DATA_NAKHANDLED 0x0001 /* retransmit NAK'd frame */
-+#define HMB_DATA_DEVREADY 0x0002 /* talk to host after enable */
-+#define HMB_DATA_FC 0x0004 /* per prio flowcontrol update flag */
-+#define HMB_DATA_FWREADY 0x0008 /* fw ready for protocol activity */
-+#define HMB_DATA_FWHALT 0x0010 /* firmware halted */
-
- #define HMB_DATA_FCDATA_MASK 0xff000000
- #define HMB_DATA_FCDATA_SHIFT 24
-@@ -1094,6 +1095,10 @@ static u32 brcmf_sdio_hostmail(struct br
- offsetof(struct sdpcmd_regs, tosbmailbox));
- bus->sdcnt.f1regdata += 2;
-
-+ /* dongle indicates the firmware has halted/crashed */
-+ if (hmb_data & HMB_DATA_FWHALT)
-+ brcmf_err("mailbox indicates firmware halted\n");
-+
- /* Dongle recomposed rx frames, accept them again */
- if (hmb_data & HMB_DATA_NAKHANDLED) {
- brcmf_dbg(SDIO, "Dongle reports NAK handled, expect rtx of %d\n",
-@@ -1151,6 +1156,7 @@ static u32 brcmf_sdio_hostmail(struct br
- HMB_DATA_NAKHANDLED |
- HMB_DATA_FC |
- HMB_DATA_FWREADY |
-+ HMB_DATA_FWHALT |
- HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
- brcmf_err("Unknown mailbox data content: 0x%02x\n",
- hmb_data);
+++ /dev/null
-From 6c219b0088158da839a5be63c5b3d96c145501d2 Mon Sep 17 00:00:00 2001
-From: Franky Lin <franky.lin@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:32 +0100
-Subject: [PATCH] brcmfmac: disable packet filtering in promiscuous mode
-
-Disable arp and nd offload to allow all packets sending to host.
-
-Reported-by: Phil Elwell <phil@raspberrypi.org>
-Tested-by: Phil Elwell <phil@raspberrypi.org>
-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 | 41 ----------------------
- .../wireless/broadcom/brcm80211/brcmfmac/core.c | 38 ++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/core.h | 1 +
- 3 files changed, 39 insertions(+), 41 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -472,47 +472,6 @@ send_key_to_dongle(struct brcmf_if *ifp,
- return err;
- }
-
--static s32
--brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
--{
-- s32 err;
-- u32 mode;
--
-- if (enable)
-- mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
-- else
-- mode = 0;
--
-- /* Try to set and enable ARP offload feature, this may fail, then it */
-- /* is simply not supported and err 0 will be returned */
-- err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
-- if (err) {
-- brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n",
-- mode, err);
-- err = 0;
-- } else {
-- err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable);
-- if (err) {
-- brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n",
-- enable, err);
-- err = 0;
-- } else
-- brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n",
-- enable, mode);
-- }
--
-- err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable);
-- if (err) {
-- brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n",
-- enable, err);
-- err = 0;
-- } else
-- brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n",
-- enable, mode);
--
-- return err;
--}
--
- static void
- brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
- {
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -71,6 +71,43 @@ struct brcmf_if *brcmf_get_ifp(struct br
- return ifp;
- }
-
-+void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
-+{
-+ s32 err;
-+ u32 mode;
-+
-+ if (enable)
-+ mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
-+ else
-+ mode = 0;
-+
-+ /* Try to set and enable ARP offload feature, this may fail, then it */
-+ /* is simply not supported and err 0 will be returned */
-+ err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
-+ if (err) {
-+ brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n",
-+ mode, err);
-+ } else {
-+ err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable);
-+ if (err) {
-+ brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n",
-+ enable, err);
-+ } else {
-+ brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n",
-+ enable, mode);
-+ }
-+ }
-+
-+ err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable);
-+ if (err) {
-+ brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n",
-+ enable, err);
-+ } else {
-+ brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n",
-+ enable, mode);
-+ }
-+}
-+
- static void _brcmf_set_multicast_list(struct work_struct *work)
- {
- struct brcmf_if *ifp;
-@@ -134,6 +171,7 @@ static void _brcmf_set_multicast_list(st
- if (err < 0)
- brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n",
- err);
-+ brcmf_configure_arp_nd_offload(ifp, !cmd_value);
- }
-
- #if IS_ENABLED(CONFIG_IPV6)
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -203,6 +203,7 @@ int brcmf_netdev_wait_pend8021x(struct b
- /* Return pointer to interface name */
- char *brcmf_ifname(struct brcmf_if *ifp);
- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
-+void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable);
- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
- bool is_p2pdev, const char *name, u8 *mac_addr);
+++ /dev/null
-From 8c6efda22f5f9f73fc948f517424466be01ae84d Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:33 +0100
-Subject: [PATCH] brcmfmac: cleanup brcmf_cfg80211_escan() function
-
-The function brcmf_cfg80211_escan() was always called with a non-null
-request parameter and null pointer for this_ssid parameter. Clean up
-the function removing the dead code path.
-
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 76 ++++------------------
- 1 file changed, 11 insertions(+), 65 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1072,18 +1072,10 @@ brcmf_do_escan(struct brcmf_if *ifp, str
-
- static s32
- brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
-- struct cfg80211_scan_request *request,
-- struct cfg80211_ssid *this_ssid)
-+ struct cfg80211_scan_request *request)
- {
-- struct brcmf_if *ifp = vif->ifp;
- struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-- struct cfg80211_ssid *ssids;
-- u32 passive_scan;
-- bool escan_req;
-- bool spec_scan;
- s32 err;
-- struct brcmf_ssid_le ssid_le;
-- u32 SSID_len;
-
- brcmf_dbg(SCAN, "START ESCAN\n");
-
-@@ -1101,8 +1093,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
- cfg->scan_status);
- return -EAGAIN;
- }
-- if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) {
-- brcmf_err("Connecting: status (%lu)\n", ifp->vif->sme_state);
-+ if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state)) {
-+ brcmf_err("Connecting: status (%lu)\n", vif->sme_state);
- return -EAGAIN;
- }
-
-@@ -1110,63 +1102,17 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
- if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
- vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
-
-- escan_req = false;
-- if (request) {
-- /* scan bss */
-- ssids = request->ssids;
-- escan_req = true;
-- } else {
-- /* scan in ibss */
-- /* we don't do escan in ibss */
-- ssids = this_ssid;
-- }
--
- cfg->scan_request = request;
- set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
-- if (escan_req) {
-- 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;
-- } else {
-- brcmf_dbg(SCAN, "ssid \"%s\", ssid_len (%d)\n",
-- ssids->ssid, ssids->ssid_len);
-- memset(&ssid_le, 0, sizeof(ssid_le));
-- SSID_len = min_t(u8, sizeof(ssid_le.SSID), ssids->ssid_len);
-- ssid_le.SSID_len = cpu_to_le32(0);
-- spec_scan = false;
-- if (SSID_len) {
-- memcpy(ssid_le.SSID, ssids->ssid, SSID_len);
-- ssid_le.SSID_len = cpu_to_le32(SSID_len);
-- 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);
-- if (err) {
-- brcmf_err("WLC_SET_PASSIVE_SCAN error (%d)\n", err);
-- goto scan_out;
-- }
-- brcmf_scan_config_mpc(ifp, 0);
-- err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN, &ssid_le,
-- sizeof(ssid_le));
-- if (err) {
-- if (err == -EBUSY)
-- brcmf_dbg(INFO, "BUSY: scan for \"%s\" canceled\n",
-- ssid_le.SSID);
-- else
-- brcmf_err("WLC_SCAN error (%d)\n", err);
--
-- 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;
-
- /* Arm scan timeout timer */
- mod_timer(&cfg->escan_timeout, jiffies +
-@@ -1191,7 +1137,7 @@ brcmf_cfg80211_scan(struct wiphy *wiphy,
- if (!check_vif_up(vif))
- return -EIO;
-
-- err = brcmf_cfg80211_escan(wiphy, vif, request, NULL);
-+ err = brcmf_cfg80211_escan(wiphy, vif, request);
-
- if (err)
- brcmf_err("scan error (%d)\n", err);
+++ /dev/null
-From df2d8388bc96c0f29d27d121f2a4cd054f8b3900 Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:34 +0100
-Subject: [PATCH] brcmfmac: use msecs_to_jiffies() instead of calculation using
- HZ
-
-Minor cleanup using provided macro to convert milliseconds interval
-to jiffies in brcmf_cfg80211_escan().
-
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1115,8 +1115,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
- goto scan_out;
-
- /* Arm scan timeout timer */
-- mod_timer(&cfg->escan_timeout, jiffies +
-- BRCMF_ESCAN_TIMER_INTERVAL_MS * HZ / 1000);
-+ mod_timer(&cfg->escan_timeout,
-+ jiffies + msecs_to_jiffies(BRCMF_ESCAN_TIMER_INTERVAL_MS));
-
- return 0;
-
+++ /dev/null
-From 588378f15cff285ac81c929239ccba01d7f71d50 Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:35 +0100
-Subject: [PATCH] brcmfmac: get rid of brcmf_cfg80211_escan() function
-
-The function brcmf_cfg80211_escan() is only called by brcmf_cfg80211_scan()
-so there is no reason to split in two function especially since the latter
-does not do an awful lot.
-
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 34 +++++++---------------
- 1 file changed, 10 insertions(+), 24 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1071,13 +1071,16 @@ brcmf_do_escan(struct brcmf_if *ifp, str
- }
-
- static s32
--brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
-- struct cfg80211_scan_request *request)
-+brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
- {
- struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-- s32 err;
-+ struct brcmf_cfg80211_vif *vif;
-+ s32 err = 0;
-
-- brcmf_dbg(SCAN, "START ESCAN\n");
-+ brcmf_dbg(TRACE, "Enter\n");
-+ vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev);
-+ if (!check_vif_up(vif))
-+ return -EIO;
-
- if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
- brcmf_err("Scanning already: status (%lu)\n", cfg->scan_status);
-@@ -1102,6 +1105,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
- if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
- vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
-
-+ brcmf_dbg(SCAN, "START ESCAN\n");
-+
- cfg->scan_request = request;
- set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
-
-@@ -1121,31 +1126,12 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
- return 0;
-
- scan_out:
-+ brcmf_err("scan error (%d)\n", err);
- clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
- cfg->scan_request = NULL;
- return err;
- }
-
--static s32
--brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
--{
-- struct brcmf_cfg80211_vif *vif;
-- s32 err = 0;
--
-- brcmf_dbg(TRACE, "Enter\n");
-- vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev);
-- if (!check_vif_up(vif))
-- return -EIO;
--
-- err = brcmf_cfg80211_escan(wiphy, vif, request);
--
-- if (err)
-- brcmf_err("scan error (%d)\n", err);
--
-- brcmf_dbg(TRACE, "Exit\n");
-- return err;
--}
--
- static s32 brcmf_set_rts(struct net_device *ndev, u32 rts_threshold)
- {
- s32 err = 0;
+++ /dev/null
-From bbf35414cd23a9d7230bfd7046e1e2c26020e7eb Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:36 +0100
-Subject: [PATCH] brcmfmac: get rid of struct brcmf_cfg80211_info::active_scan
- field
-
-The field struct brcmf_cfg80211_info::active_scan is set to true upon
-initializing the driver instance, but it is never changed so simply
-get rid of it.
-
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 10 +---------
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 --
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 5 +----
- 3 files changed, 2 insertions(+), 15 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1043,7 +1043,6 @@ brcmf_do_escan(struct brcmf_if *ifp, str
- {
- struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
- s32 err;
-- u32 passive_scan;
- struct brcmf_scan_results *results;
- struct escan_info *escan = &cfg->escan_info;
-
-@@ -1051,13 +1050,7 @@ brcmf_do_escan(struct brcmf_if *ifp, str
- escan->ifp = ifp;
- escan->wiphy = cfg->wiphy;
- escan->escan_state = WL_ESCAN_STATE_SCANNING;
-- passive_scan = cfg->active_scan ? 0 : 1;
-- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN,
-- passive_scan);
-- if (err) {
-- brcmf_err("error (%d)\n", err);
-- return err;
-- }
-+
- brcmf_scan_config_mpc(ifp, 0);
- results = (struct brcmf_scan_results *)cfg->escan_info.escan_buf;
- results->version = 0;
-@@ -5767,7 +5760,6 @@ static s32 wl_init_priv(struct brcmf_cfg
-
- cfg->scan_request = NULL;
- cfg->pwr_save = true;
-- cfg->active_scan = true; /* we do active scan per default */
- cfg->dongle_up = false; /* dongle is not up yet */
- err = brcmf_init_priv_mem(cfg);
- if (err)
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -283,7 +283,6 @@ struct brcmf_cfg80211_wowl {
- * @scan_status: scan activity on the dongle.
- * @pub: common driver information.
- * @channel: current channel.
-- * @active_scan: current scan mode.
- * @int_escan_map: bucket map for which internal e-scan is done.
- * @ibss_starter: indicates this sta is ibss starter.
- * @pwr_save: indicate whether dongle to support power save mode.
-@@ -316,7 +315,6 @@ struct brcmf_cfg80211_info {
- unsigned long scan_status;
- struct brcmf_pub *pub;
- u32 channel;
-- bool active_scan;
- u32 int_escan_map;
- bool ibss_starter;
- bool pwr_save;
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -692,10 +692,7 @@ static s32 brcmf_p2p_escan(struct brcmf_
-
- /* determine the scan engine parameters */
- sparams->bss_type = DOT11_BSSTYPE_ANY;
-- if (p2p->cfg->active_scan)
-- sparams->scan_type = 0;
-- else
-- sparams->scan_type = 1;
-+ sparams->scan_type = BRCMF_SCANTYPE_ACTIVE;
-
- eth_broadcast_addr(sparams->bssid);
- sparams->home_time = cpu_to_le32(P2PAPI_SCAN_HOME_TIME_MS);
+++ /dev/null
-From bd99a3013bdc00f8fc7534c657b39616792b4467 Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Wed, 8 Nov 2017 14:36:37 +0100
-Subject: [PATCH] brcmfmac: move configuration of probe request IEs
-
-The configuration of the IEs for probe requests was done in a P2P
-related function, which is not very obvious. Moving it to
-.scan callback function, ie. brcmf_cfg80211_scan().
-
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +++++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 6 ++----
- 2 files changed, 7 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1108,6 +1108,11 @@ brcmf_cfg80211_scan(struct wiphy *wiphy,
- if (err)
- goto scan_out;
-
-+ err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
-+ request->ie, request->ie_len);
-+ if (err)
-+ goto scan_out;
-+
- err = brcmf_do_escan(vif->ifp, request);
- if (err)
- goto scan_out;
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -881,7 +881,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wi
- {
- struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- struct brcmf_p2p_info *p2p = &cfg->p2p;
-- int err = 0;
-+ int err;
-
- if (brcmf_p2p_scan_is_p2p_request(request)) {
- /* find my listen channel */
-@@ -904,9 +904,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wi
- /* override .run_escan() callback. */
- cfg->escan_info.run = brcmf_p2p_run_escan;
- }
-- err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
-- request->ie, request->ie_len);
-- return err;
-+ return 0;
- }
-
-
+++ /dev/null
-From fdd0bd88ceaecf729db103ac8836af5805dd2dc1 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Fri, 10 Nov 2017 17:27:15 +0800
-Subject: [PATCH] brcmfmac: add CLM download support
-
-The firmware for brcmfmac devices includes information regarding
-regulatory constraints. For certain devices this information is kept
-separately in a binary form that needs to be downloaded to the device.
-This patch adds support to download this so-called CLM blob file. It
-uses the same naming scheme as the other firmware files with extension
-of .clm_blob.
-
-The CLM blob file is optional. If the file does not exist, the download
-process will be bypassed. It will not affect the driver loading.
-
-Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 10 ++
- .../wireless/broadcom/brcm80211/brcmfmac/common.c | 157 +++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +
- .../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 +
- .../broadcom/brcm80211/brcmfmac/fwil_types.h | 31 ++++
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 19 +++
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 19 +++
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 18 +++
- 8 files changed, 258 insertions(+)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -71,6 +71,7 @@ struct brcmf_bus_dcmd {
- * @wowl_config: specify if dongle is configured for wowl when going to suspend
- * @get_ramsize: obtain size of device memory.
- * @get_memdump: obtain device memory dump in provided buffer.
-+ * @get_fwname: obtain firmware name.
- *
- * This structure provides an abstract interface towards the
- * bus specific driver. For control messages to common driver
-@@ -87,6 +88,8 @@ 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,
-+ unsigned char *fw_name);
- };
-
-
-@@ -224,6 +227,13 @@ int brcmf_bus_get_memdump(struct brcmf_b
- return bus->ops->get_memdump(bus->dev, data, len);
- }
-
-+static inline
-+int brcmf_bus_get_fwname(struct brcmf_bus *bus, uint chip, uint chiprev,
-+ unsigned char *fw_name)
-+{
-+ return bus->ops->get_fwname(bus->dev, chip, chiprev, fw_name);
-+}
-+
- /*
- * interface functions from common layer
- */
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -18,6 +18,7 @@
- #include <linux/string.h>
- #include <linux/netdevice.h>
- #include <linux/module.h>
-+#include <linux/firmware.h>
- #include <brcmu_wifi.h>
- #include <brcmu_utils.h>
- #include "core.h"
-@@ -28,6 +29,7 @@
- #include "tracepoint.h"
- #include "common.h"
- #include "of.h"
-+#include "firmware.h"
-
- MODULE_AUTHOR("Broadcom Corporation");
- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
-@@ -104,12 +106,140 @@ void brcmf_c_set_joinpref_default(struct
- brcmf_err("Set join_pref error (%d)\n", err);
- }
-
-+static int brcmf_c_download(struct brcmf_if *ifp, u16 flag,
-+ struct brcmf_dload_data_le *dload_buf,
-+ u32 len)
-+{
-+ s32 err;
-+
-+ flag |= (DLOAD_HANDLER_VER << DLOAD_FLAG_VER_SHIFT);
-+ dload_buf->flag = cpu_to_le16(flag);
-+ dload_buf->dload_type = cpu_to_le16(DL_TYPE_CLM);
-+ dload_buf->len = cpu_to_le32(len);
-+ dload_buf->crc = cpu_to_le32(0);
-+ len = sizeof(*dload_buf) + len - 1;
-+
-+ err = brcmf_fil_iovar_data_set(ifp, "clmload", dload_buf, len);
-+
-+ return err;
-+}
-+
-+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);
-+ 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_dload_data_le *chunk_buf;
-+ const struct firmware *clm = NULL;
-+ u8 clm_name[BRCMF_FW_NAME_LEN];
-+ u32 chunk_len;
-+ u32 datalen;
-+ u32 cumulative_len;
-+ u16 dl_flag = DL_BEGIN;
-+ u32 status;
-+ s32 err;
-+
-+ brcmf_dbg(TRACE, "Enter\n");
-+
-+ memset(clm_name, 0, BRCMF_FW_NAME_LEN);
-+ err = brcmf_c_get_clm_name(ifp, clm_name);
-+ if (err) {
-+ brcmf_err("get CLM blob file name failed (%d)\n", err);
-+ return err;
-+ }
-+
-+ err = request_firmware(&clm, clm_name, dev);
-+ if (err) {
-+ if (err == -ENOENT) {
-+ brcmf_dbg(INFO, "continue with CLM data currently present in firmware\n");
-+ return 0;
-+ }
-+ brcmf_err("request CLM blob file failed (%d)\n", err);
-+ return err;
-+ }
-+
-+ chunk_buf = kzalloc(sizeof(*chunk_buf) + MAX_CHUNK_LEN - 1, GFP_KERNEL);
-+ if (!chunk_buf) {
-+ err = -ENOMEM;
-+ goto done;
-+ }
-+
-+ datalen = clm->size;
-+ cumulative_len = 0;
-+ do {
-+ if (datalen > MAX_CHUNK_LEN) {
-+ chunk_len = MAX_CHUNK_LEN;
-+ } else {
-+ chunk_len = datalen;
-+ dl_flag |= DL_END;
-+ }
-+ memcpy(chunk_buf->data, clm->data + cumulative_len, chunk_len);
-+
-+ err = brcmf_c_download(ifp, dl_flag, chunk_buf, chunk_len);
-+
-+ dl_flag &= ~DL_BEGIN;
-+
-+ cumulative_len += chunk_len;
-+ datalen -= chunk_len;
-+ } while ((datalen > 0) && (err == 0));
-+
-+ if (err) {
-+ brcmf_err("clmload (%zu byte file) failed (%d); ",
-+ clm->size, err);
-+ /* Retrieve clmload_status and print */
-+ err = brcmf_fil_iovar_int_get(ifp, "clmload_status", &status);
-+ if (err)
-+ brcmf_err("get clmload_status failed (%d)\n", err);
-+ else
-+ brcmf_dbg(INFO, "clmload_status=%d\n", status);
-+ err = -EIO;
-+ }
-+
-+ kfree(chunk_buf);
-+done:
-+ release_firmware(clm);
-+ return err;
-+}
-+
- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- {
- s8 eventmask[BRCMF_EVENTING_MASK_LEN];
- u8 buf[BRCMF_DCMD_SMLEN];
- struct brcmf_rev_info_le revinfo;
- struct brcmf_rev_info *ri;
-+ char *clmver;
- char *ptr;
- s32 err;
-
-@@ -148,6 +278,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
- }
- ri->result = err;
-
-+ /* Do any CLM downloading */
-+ err = brcmf_c_process_clm_blob(ifp);
-+ if (err < 0) {
-+ brcmf_err("download CLM blob file failed, %d\n", err);
-+ goto done;
-+ }
-+
- /* query for 'ver' to get version info from firmware */
- memset(buf, 0, sizeof(buf));
- strcpy(buf, "ver");
-@@ -167,6 +304,26 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
- ptr = strrchr(buf, ' ') + 1;
- strlcpy(ifp->drvr->fwver, ptr, sizeof(ifp->drvr->fwver));
-
-+ /* Query for 'clmver' to get CLM version info from firmware */
-+ memset(buf, 0, sizeof(buf));
-+ err = brcmf_fil_iovar_data_get(ifp, "clmver", buf, sizeof(buf));
-+ if (err) {
-+ brcmf_dbg(TRACE, "retrieving clmver failed, %d\n", err);
-+ } else {
-+ clmver = (char *)buf;
-+ /* store CLM version for adding it to revinfo debugfs file */
-+ memcpy(ifp->drvr->clmver, clmver, sizeof(ifp->drvr->clmver));
-+
-+ /* Replace all newline/linefeed characters with space
-+ * character
-+ */
-+ ptr = clmver;
-+ while ((ptr = strnchr(ptr, '\n', sizeof(buf))) != NULL)
-+ *ptr = ' ';
-+
-+ brcmf_dbg(INFO, "CLM version = %s\n", clmver);
-+ }
-+
- /* set mpc */
- err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
- if (err) {
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1009,6 +1009,8 @@ static int brcmf_revinfo_read(struct seq
- seq_printf(s, "anarev: %u\n", ri->anarev);
- seq_printf(s, "nvramrev: %08x\n", ri->nvramrev);
-
-+ seq_printf(s, "clmver: %s\n", bus_if->drvr->clmver);
-+
- return 0;
- }
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -141,6 +141,8 @@ struct brcmf_pub {
- struct notifier_block inetaddr_notifier;
- struct notifier_block inet6addr_notifier;
- struct brcmf_mp_device *settings;
-+
-+ u8 clmver[BRCMF_DCMD_SMLEN];
- };
-
- /* forward declarations */
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -155,6 +155,21 @@
- #define BRCMF_MFP_CAPABLE 1
- #define BRCMF_MFP_REQUIRED 2
-
-+/* MAX_CHUNK_LEN is the maximum length for data passing to firmware in each
-+ * ioctl. It is relatively small because firmware has small maximum size input
-+ * playload restriction for ioctls.
-+ */
-+#define MAX_CHUNK_LEN 1400
-+
-+#define DLOAD_HANDLER_VER 1 /* Downloader version */
-+#define DLOAD_FLAG_VER_MASK 0xf000 /* Downloader version mask */
-+#define DLOAD_FLAG_VER_SHIFT 12 /* Downloader version shift */
-+
-+#define DL_BEGIN 0x0002
-+#define DL_END 0x0004
-+
-+#define DL_TYPE_CLM 2
-+
- /* join preference types for join_pref iovar */
- enum brcmf_join_pref_types {
- BRCMF_JOIN_PREF_RSSI = 1,
-@@ -827,6 +842,22 @@ struct brcmf_pno_macaddr_le {
- };
-
- /**
-+ * struct brcmf_dload_data_le - data passing to firmware for downloading
-+ * @flag: flags related to download data.
-+ * @dload_type: type of download data.
-+ * @len: length in bytes of download data.
-+ * @crc: crc of download data.
-+ * @data: download data.
-+ */
-+struct brcmf_dload_data_le {
-+ __le16 flag;
-+ __le16 dload_type;
-+ __le32 len;
-+ __le32 crc;
-+ u8 data[1];
-+};
-+
-+/**
- * struct brcmf_pno_bssid_le - bssid configuration for PNO scan.
- *
- * @bssid: BSS network identifier.
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -1350,6 +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)
-+{
-+ 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;
-+
-+ 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);
-+
-+ return ret;
-+}
-
- static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
- .txdata = brcmf_pcie_tx,
-@@ -1359,6 +1377,7 @@ static const struct brcmf_bus_ops brcmf_
- .wowl_config = brcmf_pcie_wowl_config,
- .get_ramsize = brcmf_pcie_get_ramsize,
- .get_memdump = brcmf_pcie_get_memdump,
-+ .get_fwname = brcmf_pcie_get_fwname,
- };
-
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -3985,6 +3985,24 @@ brcmf_sdio_watchdog(unsigned long data)
- }
- }
-
-+static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev,
-+ 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;
-+
-+ 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);
-+
-+ return ret;
-+}
-+
- static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
- .stop = brcmf_sdio_bus_stop,
- .preinit = brcmf_sdio_bus_preinit,
-@@ -3995,6 +4013,7 @@ static const struct brcmf_bus_ops brcmf_
- .wowl_config = brcmf_sdio_wowl_config,
- .get_ramsize = brcmf_sdio_bus_get_ramsize,
- .get_memdump = brcmf_sdio_bus_get_memdump,
-+ .get_fwname = brcmf_sdio_get_fwname,
- };
-
- static void brcmf_sdio_firmware_callback(struct device *dev, int err,
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -1128,12 +1128,30 @@ 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)
-+{
-+ struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
-+ int ret = 0;
-+
-+ 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);
-+
-+ return ret;
-+}
-+
- static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
- .txdata = brcmf_usb_tx,
- .stop = brcmf_usb_down,
- .txctl = brcmf_usb_tx_ctlpkt,
- .rxctl = brcmf_usb_rx_ctlpkt,
- .wowl_config = brcmf_usb_wowl_config,
-+ .get_fwname = brcmf_usb_get_fwname,
- };
-
- static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo)
+++ /dev/null
-From 5c3de777bdaf48bd0cfb43097c0d0fb85056cab7 Mon Sep 17 00:00:00 2001
-From: Arend Van Spriel <arend.vanspriel@broadcom.com>
-Date: Sat, 25 Nov 2017 21:39:25 +0100
-Subject: [PATCH] brcmfmac: change driver unbind order of the sdio function
- devices
-
-In the function brcmf_sdio_firmware_callback() the driver is
-unbound from the sdio function devices in the error path.
-However, the order in which it is done resulted in a use-after-free
-issue (see brcmf_ops_sdio_remove() in bcmsdh.c). Hence change
-the order and first unbind sdio function #2 device and then
-unbind sdio function #1 device.
-
-Cc: stable@vger.kernel.org # v4.12.x
-Fixes: 7a51461fc2da ("brcmfmac: unbind all devices upon failure in firmware callback")
-Reported-by: Stefan Wahren <stefan.wahren@i2se.com>
-Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
-Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
-Reviewed-by: Franky Lin <franky.lin@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4121,8 +4121,8 @@ release:
- sdio_release_host(sdiodev->func[1]);
- fail:
- brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err);
-- device_release_driver(dev);
- device_release_driver(&sdiodev->func[2]->dev);
-+ device_release_driver(dev);
- }
-
- struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
+++ /dev/null
-From 51ef7925e10688c57186d438e784532e063492e4 Mon Sep 17 00:00:00 2001
-From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-Date: Thu, 23 Nov 2017 17:57:04 +0200
-Subject: [PATCH] brcmfmac: Avoid build error with make W=1
-
-When I run make W=1 on gcc (Debian 7.2.0-16) 7.2.0 I got an error for
-the first run, all next ones are okay.
-
- CC [M] drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.o
-drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c:2078: error: Cannot parse struct or union!
-scripts/Makefile.build:310: recipe for target 'drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.o' failed
-
-Seems like something happened with W=1 and wrong kernel doc format.
-As a quick fix remove dubious /** in the code.
-
-Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.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/sdio.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -2070,7 +2070,7 @@ static int brcmf_sdio_txpkt_hdalign(stru
- return head_pad;
- }
-
--/**
-+/*
- * struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for
- * bus layer usage.
- */
+++ /dev/null
-From cc124d5cc8d81985c3511892d7a6d546552ff754 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 16 Jan 2018 17:26:50 +0800
-Subject: [PATCH] brcmfmac: fix CLM load error for legacy chips when user
- helper is enabled
-
-For legacy chips without CLM blob files, kernel with user helper function
-returns -EAGAIN when we request_firmware(), and then driver got failed
-when bringing up legacy chips. We expect the CLM blob file for legacy chip
-is not existence in firmware path, but the -ENOENT error is transferred to
--EAGAIN in firmware_class.c with user helper.
-Because of that, we continue with CLM data currently present in firmware
-if getting error from doing request_firmware().
-
-Cc: stable@vger.kernel.org # v4.15.y
-Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 9 +++------
- 1 file changed, 3 insertions(+), 6 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -182,12 +182,9 @@ static int brcmf_c_process_clm_blob(stru
-
- err = request_firmware(&clm, clm_name, dev);
- if (err) {
-- if (err == -ENOENT) {
-- brcmf_dbg(INFO, "continue with CLM data currently present in firmware\n");
-- return 0;
-- }
-- brcmf_err("request CLM blob file failed (%d)\n", err);
-- return err;
-+ brcmf_info("no clm_blob available(err=%d), device may have limited channels available\n",
-+ err);
-+ return 0;
- }
-
- chunk_buf = kzalloc(sizeof(*chunk_buf) + MAX_CHUNK_LEN - 1, GFP_KERNEL);
+++ /dev/null
-From 9df7ddc3ed25b7d3473f117a0680b9418adb5753 Mon Sep 17 00:00:00 2001
-Message-Id: <9df7ddc3ed25b7d3473f117a0680b9418adb5753.1515610034.git.mschiffer@universe-factory.net>
-From: Matthias Schiffer <mschiffer@universe-factory.net>
-Date: Mon, 27 Nov 2017 18:56:22 +0100
-Subject: [PATCH 1/2] ath9k: move spectral scan support under a separate config
- symbol
-
-At the moment, spectral scan support, and with it RELAY, is always enabled
-with ATH9K[_HTC]_DEBUGFS. Spectral scan support is currently the only user
-of RELAY in ath9k, and it unconditionally reserves a relay channel.
-
-Having debugfs support in ath9k is often useful even on very small embedded
-routers, where we'd rather like to avoid the code size and RAM usage of the
-relay support.
-
-Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
-Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
----
- drivers/net/wireless/ath/ath9k/Kconfig | 14 ++++++++++----
- drivers/net/wireless/ath/ath9k/Makefile | 4 ++--
- drivers/net/wireless/ath/ath9k/common-spectral.h | 4 ++--
- 3 files changed, 14 insertions(+), 8 deletions(-)
-
---- a/drivers/net/wireless/ath/ath9k/Kconfig
-+++ b/drivers/net/wireless/ath/ath9k/Kconfig
-@@ -64,13 +64,12 @@ config ATH9K_DEBUGFS
- depends on ATH9K && DEBUG_FS
- select MAC80211_DEBUGFS
- select ATH9K_COMMON_DEBUG
-- depends on RELAY
- ---help---
- Say Y, if you need access to ath9k's statistics for
- interrupts, rate control, etc.
-
-- Also required for changing debug message flags at run time.
-- As well as access to the FFT/spectral data and TX99.
-+ Also required for changing debug message flags at run time and for
-+ TX99.
-
- config ATH9K_STATION_STATISTICS
- bool "Detailed station statistics"
-@@ -181,7 +180,6 @@ config ATH9K_HTC_DEBUGFS
- bool "Atheros ath9k_htc debugging"
- depends on ATH9K_HTC && DEBUG_FS
- select ATH9K_COMMON_DEBUG
-- depends on RELAY
- ---help---
- Say Y, if you need access to ath9k_htc's statistics.
- As well as access to the FFT/spectral data.
-@@ -197,3 +195,11 @@ config ATH9K_HWRNG
-
- Say Y, feeds the entropy directly from the WiFi driver to the input
- pool.
-+
-+config ATH9K_COMMON_SPECTRAL
-+ bool "Atheros ath9k/ath9k_htc spectral scan support"
-+ depends on ATH9K_DEBUGFS || ATH9K_HTC_DEBUGFS
-+ depends on RELAY
-+ default n
-+ ---help---
-+ Say Y to enable access to the FFT/spectral data via debugfs.
---- a/drivers/net/wireless/ath/ath9k/Makefile
-+++ b/drivers/net/wireless/ath/ath9k/Makefile
-@@ -61,8 +61,8 @@ ath9k_common-y:= common.o \
- common-init.o \
- common-beacon.o \
-
--ath9k_common-$(CPTCFG_ATH9K_COMMON_DEBUG) += common-debug.o \
-- common-spectral.o
-+ath9k_common-$(CPTCFG_ATH9K_COMMON_DEBUG) += common-debug.o
-+ath9k_common-$(CPTCFG_ATH9K_COMMON_SPECTRAL) += common-spectral.o
-
- ath9k_htc-y += htc_hst.o \
- hif_usb.o \
---- a/drivers/net/wireless/ath/ath9k/common-spectral.h
-+++ b/drivers/net/wireless/ath/ath9k/common-spectral.h
-@@ -151,7 +151,7 @@ static inline u8 spectral_bitmap_weight(
- return bins[0] & 0x3f;
- }
-
--#ifdef CPTCFG_ATH9K_COMMON_DEBUG
-+#ifdef CPTCFG_ATH9K_COMMON_SPECTRAL
- void ath9k_cmn_spectral_init_debug(struct ath_spec_scan_priv *spec_priv, struct dentry *debugfs_phy);
- void ath9k_cmn_spectral_deinit_debug(struct ath_spec_scan_priv *spec_priv);
-
-@@ -183,6 +183,6 @@ static inline int ath_cmn_process_fft(st
- {
- return 0;
- }
--#endif /* CPTCFG_ATH9K_COMMON_DEBUG */
-+#endif /* CPTCFG_ATH9K_COMMON_SPECTRAL */
-
- #endif /* SPECTRAL_H */
---- a/local-symbols
-+++ b/local-symbols
-@@ -116,6 +116,7 @@ ATH9K_PCOEM=
- ATH9K_HTC=
- ATH9K_HTC_DEBUGFS=
- ATH9K_HWRNG=
-+ATH9K_COMMON_SPECTRAL=
- CARL9170=
- CARL9170_LEDS=
- CARL9170_DEBUGFS=
+++ /dev/null
-From 42e01cb9cb109fb0bb4743f6c54d6aa67ac39b61 Mon Sep 17 00:00:00 2001
-Message-Id: <42e01cb9cb109fb0bb4743f6c54d6aa67ac39b61.1515610034.git.mschiffer@universe-factory.net>
-In-Reply-To: <9df7ddc3ed25b7d3473f117a0680b9418adb5753.1515610034.git.mschiffer@universe-factory.net>
-References: <9df7ddc3ed25b7d3473f117a0680b9418adb5753.1515610034.git.mschiffer@universe-factory.net>
-From: Matthias Schiffer <mschiffer@universe-factory.net>
-Date: Mon, 27 Nov 2017 18:56:23 +0100
-Subject: [PATCH 2/2] ath10k: move spectral scan support under a separate
- config symbol
-
-At the moment, spectral scan support, and with it RELAY, is always enabled
-with ATH10K_DEBUGFS. Spectral scan support is currently the only user of
-RELAY in ath10k, and it unconditionally reserves a relay channel.
-
-Having debugfs support in ath10k is often useful even on very small
-embedded routers, where we'd rather like to avoid the code size and RAM
-usage of the relay support. While ath10k-based devices usually have more
-resources than ath9k-based ones, it makes sense to keep the configuration
-symmetric to ath9k, so the same base kernel without RELAY can be used for
-both ath9k and ath10k hardware.
-
-Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
-Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
----
- drivers/net/wireless/ath/ath10k/Kconfig | 9 ++++++++-
- drivers/net/wireless/ath/ath10k/Makefile | 2 +-
- drivers/net/wireless/ath/ath10k/spectral.h | 4 ++--
- 3 files changed, 11 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/ath/ath10k/Kconfig
-+++ b/drivers/net/wireless/ath/ath10k/Kconfig
-@@ -51,12 +51,19 @@ config ATH10K_DEBUG
- config ATH10K_DEBUGFS
- bool "Atheros ath10k debugfs support"
- depends on ATH10K && DEBUG_FS
-- depends on RELAY
- ---help---
- Enabled debugfs support
-
- If unsure, say Y to make it easier to debug problems.
-
-+config ATH10K_SPECTRAL
-+ bool "Atheros ath10k spectral scan support"
-+ depends on ATH10K_DEBUGFS
-+ depends on RELAY
-+ default n
-+ ---help---
-+ Say Y to enable access to the FFT/spectral data via debugfs.
-+
- config ATH10K_TRACING
- depends on !KERNEL_3_4
- bool "Atheros ath10k tracing support"
---- a/drivers/net/wireless/ath/ath10k/Makefile
-+++ b/drivers/net/wireless/ath/ath10k/Makefile
-@@ -14,7 +14,7 @@ ath10k_core-y += mac.o \
- p2p.o \
- swap.o
-
--ath10k_core-$(CPTCFG_ATH10K_DEBUGFS) += spectral.o
-+ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += spectral.o
- ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o
- ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o
- ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
---- a/drivers/net/wireless/ath/ath10k/spectral.h
-+++ b/drivers/net/wireless/ath/ath10k/spectral.h
-@@ -44,7 +44,7 @@ enum ath10k_spectral_mode {
- SPECTRAL_MANUAL,
- };
-
--#ifdef CPTCFG_ATH10K_DEBUGFS
-+#ifdef CPTCFG_ATH10K_SPECTRAL
-
- int ath10k_spectral_process_fft(struct ath10k *ar,
- struct wmi_phyerr_ev_arg *phyerr,
-@@ -85,6 +85,6 @@ static inline void ath10k_spectral_destr
- {
- }
-
--#endif /* CPTCFG_ATH10K_DEBUGFS */
-+#endif /* CPTCFG_ATH10K_SPECTRAL */
-
- #endif /* SPECTRAL_H */
---- a/local-symbols
-+++ b/local-symbols
-@@ -140,6 +140,7 @@ ATH10K_SDIO=
- ATH10K_USB=
- ATH10K_DEBUG=
- ATH10K_DEBUGFS=
-+ATH10K_SPECTRAL=
- ATH10K_THERMAL=
- ATH10K_TRACING=
- ATH10K_DFS_CERTIFIED=
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 17 Jan 2018 11:11:17 +0100
-Subject: [PATCH] ath9k: discard undersized packets
-
-Sometimes the hardware will push small packets that trigger a WARN_ON
-in mac80211. Discard them early to avoid this issue.
-
-Reported-by: Stijn Tintel <stijn@linux-ipv6.be>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -826,9 +826,9 @@ static int ath9k_rx_skb_preprocess(struc
- sc->rx.discard_next = false;
-
- /*
-- * Discard zero-length packets.
-+ * Discard zero-length packets and packets smaller than an ACK
- */
-- if (!rx_stats->rs_datalen) {
-+ if (rx_stats->rs_datalen < 10) {
- RX_STAT_INC(rx_len_err);
- goto corrupt;
- }
+++ /dev/null
-From 1fd3ae124d5e675f57cf7e3c601fb8f7712e0329 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:38 +0100
-Subject: [PATCH] brcmfmac: Fix parameter order in brcmf_sdiod_f0_writeb()
-
-All the other IO functions are the other way round in this
-driver. Make this one match.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -230,8 +230,8 @@ void brcmf_sdiod_change_state(struct brc
- sdiodev->state = state;
- }
-
--static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func,
-- uint regaddr, u8 byte)
-+static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, u8 byte,
-+ uint regaddr)
- {
- int err_ret;
-
-@@ -269,8 +269,8 @@ static int brcmf_sdiod_request_data(stru
- if (fn)
- sdio_writeb(func, *(u8 *)data, addr, &ret);
- else
-- ret = brcmf_sdiod_f0_writeb(func, addr,
-- *(u8 *)data);
-+ ret = brcmf_sdiod_f0_writeb(func, *(u8 *)data,
-+ addr);
- } else {
- if (fn)
- *(u8 *)data = sdio_readb(func, addr, &ret);
+++ /dev/null
-From 1e6f676f43aa4270ebc5cff8e32a55f72362e042 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:39 +0100
-Subject: [PATCH] brcmfmac: Register sizes on hardware are not dependent on
- compiler types
-
-The 4 IO functions in this patch are incorrect as they use compiler types
-to determine how many bytes to send to the hardware.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 22 +++++++++++-----------
- 1 file changed, 11 insertions(+), 11 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -264,7 +264,7 @@ static int brcmf_sdiod_request_data(stru
- func = sdiodev->func[fn];
-
- switch (regsz) {
-- case sizeof(u8):
-+ case 1:
- if (write) {
- if (fn)
- sdio_writeb(func, *(u8 *)data, addr, &ret);
-@@ -278,13 +278,13 @@ static int brcmf_sdiod_request_data(stru
- *(u8 *)data = sdio_f0_readb(func, addr, &ret);
- }
- break;
-- case sizeof(u16):
-+ case 2:
- if (write)
- sdio_writew(func, *(u16 *)data, addr, &ret);
- else
- *(u16 *)data = sdio_readw(func, addr, &ret);
- break;
-- case sizeof(u32):
-+ case 4:
- if (write)
- sdio_writel(func, *(u32 *)data, addr, &ret);
- else
-@@ -368,7 +368,7 @@ brcmf_sdiod_set_sbaddr_window(struct brc
- for (i = 0; i < 3; i++) {
- err = brcmf_sdiod_regrw_helper(sdiodev,
- SBSDIO_FUNC1_SBADDRLOW + i,
-- sizeof(u8), &addr[i], true);
-+ 1, &addr[i], true);
- if (err) {
- brcmf_err("failed at addr: 0x%0x\n",
- SBSDIO_FUNC1_SBADDRLOW + i);
-@@ -407,7 +407,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
-+ retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
- false);
- brcmf_dbg(SDIO, "data:0x%02x\n", data);
-
-@@ -423,10 +423,10 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
-- retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr);
-+ retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
- if (retval)
- goto done;
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
-+ retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
- false);
- brcmf_dbg(SDIO, "data:0x%08x\n", data);
-
-@@ -443,7 +443,7 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
-+ retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
- true);
- if (ret)
- *ret = retval;
-@@ -455,10 +455,10 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
-- retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr);
-+ retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
- if (retval)
- goto done;
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
-+ retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
- true);
-
- done:
-@@ -876,7 +876,7 @@ int brcmf_sdiod_abort(struct brcmf_sdio_
-
- /* issue abort cmd52 command through F0 */
- brcmf_sdiod_request_data(sdiodev, SDIO_FUNC_0, SDIO_CCCR_ABORT,
-- sizeof(t_func), &t_func, true);
-+ 1, &t_func, true);
-
- brcmf_dbg(SDIO, "Exit\n");
- return 0;
+++ /dev/null
-From 0fcc9fe0048422d66bb906eaa73cc75e11ff7345 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:40 +0100
-Subject: [PATCH] brcmfmac: Split brcmf_sdiod_regrw_helper() up.
-
-This large function is concealing a LOT of obscure logic about
-how the hardware functions. Time to split it up.
-
-This first patch splits the function into two pieces - read and write,
-doing away with the rw flag in the process.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 94 +++++++++++++++++-----
- 1 file changed, 73 insertions(+), 21 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -302,8 +302,8 @@ static int brcmf_sdiod_request_data(stru
- return ret;
- }
-
--static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
-- u8 regsz, void *data, bool write)
-+static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr,
-+ u8 regsz, void *data)
- {
- u8 func;
- s32 retry = 0;
-@@ -324,13 +324,66 @@ static int brcmf_sdiod_regrw_helper(stru
- func = SDIO_FUNC_1;
-
- do {
-- if (!write)
-- memset(data, 0, regsz);
- /* 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);
-+
-+ } while (ret != 0 && ret != -ENOMEDIUM &&
-+ retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
-+
-+ if (ret == -ENOMEDIUM) {
-+ brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
-+ } else if (ret != 0) {
-+ /*
-+ * SleepCSR register access can fail when
-+ * waking up the device so reduce this noise
-+ * in the logs.
-+ */
-+ if (addr != SBSDIO_FUNC1_SLEEPCSR)
-+ brcmf_err("failed to write data F%d@0x%05x, err: %d\n",
-+ func, addr, ret);
-+ else
-+ brcmf_dbg(SDIO, "failed to write data F%d@0x%05x, err: %d\n",
-+ func, addr, ret);
-+ }
-+
-+ return ret;
-+}
-+
-+static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr,
-+ u8 regsz, void *data)
-+{
-+ u8 func;
-+ s32 retry = 0;
-+ int ret;
-+
-+ if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
-+ return -ENOMEDIUM;
-+
-+ /*
-+ * figure out how to read the register based on address range
-+ * 0x00 ~ 0x7FF: function 0 CCCR and FBR
-+ * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
-+ * The rest: function 1 silicon backplane core registers
-+ */
-+ if ((addr & ~REG_F0_REG_MASK) == 0)
-+ func = SDIO_FUNC_0;
-+ else
-+ func = SDIO_FUNC_1;
-+
-+ do {
-+ memset(data, 0, regsz);
-+
-+ /* 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, write);
-+ data, false);
-+
- } while (ret != 0 && ret != -ENOMEDIUM &&
- retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
-
-@@ -343,12 +396,13 @@ static int brcmf_sdiod_regrw_helper(stru
- * in the logs.
- */
- if (addr != SBSDIO_FUNC1_SLEEPCSR)
-- brcmf_err("failed to %s data F%d@0x%05x, err: %d\n",
-- write ? "write" : "read", func, addr, ret);
-+ brcmf_err("failed to read data F%d@0x%05x, err: %d\n",
-+ func, addr, ret);
- else
-- brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
-- write ? "write" : "read", func, addr, ret);
-+ brcmf_dbg(SDIO, "failed to read data F%d@0x%05x, err: %d\n",
-+ func, addr, ret);
- }
-+
- return ret;
- }
-
-@@ -366,13 +420,11 @@ brcmf_sdiod_set_sbaddr_window(struct brc
- addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
-
- for (i = 0; i < 3; i++) {
-- err = brcmf_sdiod_regrw_helper(sdiodev,
-- SBSDIO_FUNC1_SBADDRLOW + i,
-- 1, &addr[i], true);
-+ brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, addr[i],
-+ &err);
- if (err) {
- brcmf_err("failed at addr: 0x%0x\n",
- SBSDIO_FUNC1_SBADDRLOW + i);
-- break;
- }
- }
-
-@@ -407,8 +459,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
-- false);
-+ retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data);
- brcmf_dbg(SDIO, "data:0x%02x\n", data);
-
- if (ret)
-@@ -426,8 +477,9 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
- retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
- if (retval)
- goto done;
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
-- false);
-+
-+ retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
-+
- brcmf_dbg(SDIO, "data:0x%08x\n", data);
-
- done:
-@@ -443,8 +495,8 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
-- true);
-+ retval = brcmf_sdiod_reg_write(sdiodev, addr, 1, &data);
-+
- if (ret)
- *ret = retval;
- }
-@@ -458,8 +510,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
- retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
- if (retval)
- goto done;
-- retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
-- true);
-+
-+ retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data);
-
- done:
- if (ret)
+++ /dev/null
-From b9b0d290bc0c90a5a262bc89c9d995988ea98669 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:41 +0100
-Subject: [PATCH] brcmfmac: Clean up brcmf_sdiod_set_sbaddr_window()
-
-This function sets the address of the IO window used for
-SDIO accesses onto the backplane of the chip.
-
-It currently uses 3 separate masks despite the full mask being
-defined in the code already. Remove the separate masks and clean up.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 17 +++++------------
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h | 3 ---
- 2 files changed, 5 insertions(+), 15 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -410,23 +410,16 @@ static int
- brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
- {
- int err = 0, i;
-- u8 addr[3];
-+ u32 addr;
-
- if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
- return -ENOMEDIUM;
-
-- addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
-- addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK;
-- addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
-+ addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
-
-- for (i = 0; i < 3; i++) {
-- brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, addr[i],
-- &err);
-- if (err) {
-- brcmf_err("failed at addr: 0x%0x\n",
-- SBSDIO_FUNC1_SBADDRLOW + i);
-- }
-- }
-+ for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
-+ brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
-+ addr & 0xff, &err);
-
- return err;
- }
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-@@ -133,9 +133,6 @@
-
- /* valid bits in SBSDIO_FUNC1_SBADDRxxx regs */
-
--#define SBSDIO_SBADDRLOW_MASK 0x80 /* Valid bits in SBADDRLOW */
--#define SBSDIO_SBADDRMID_MASK 0xff /* Valid bits in SBADDRMID */
--#define SBSDIO_SBADDRHIGH_MASK 0xffU /* Valid bits in SBADDRHIGH */
- /* Address bits from SBADDR regs */
- #define SBSDIO_SBWINDOW_MASK 0xffff8000
-
+++ /dev/null
-From ea243e9077b3545f20d93884e91c50ac0719685a Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:42 +0100
-Subject: [PATCH] brcmfmac: Remove dead IO code
-
-The value passed to brcmf_sdiod_addrprep() is *always* 4
-remove this parameter and the unused code to handle it.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 18 ++++++++----------
- 1 file changed, 8 insertions(+), 10 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -425,7 +425,7 @@ brcmf_sdiod_set_sbaddr_window(struct brc
- }
-
- static int
--brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr)
-+brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
- {
- uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
- int err = 0;
-@@ -439,9 +439,7 @@ brcmf_sdiod_addrprep(struct brcmf_sdio_d
- }
-
- *addr &= SBSDIO_SB_OFT_ADDR_MASK;
--
-- if (width == 4)
-- *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
-+ *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
-
- return 0;
- }
-@@ -467,7 +465,7 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
-- retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
-+ retval = brcmf_sdiod_addrprep(sdiodev, &addr);
- if (retval)
- goto done;
-
-@@ -500,7 +498,7 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
-- retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
-+ retval = brcmf_sdiod_addrprep(sdiodev, &addr);
- if (retval)
- goto done;
-
-@@ -736,7 +734,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
-
- brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len);
-
-- err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
-+ err = brcmf_sdiod_addrprep(sdiodev, &addr);
- if (err)
- goto done;
-
-@@ -757,7 +755,7 @@ int brcmf_sdiod_recv_chain(struct brcmf_
- brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n",
- addr, pktq->qlen);
-
-- err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
-+ err = brcmf_sdiod_addrprep(sdiodev, &addr);
- if (err)
- goto done;
-
-@@ -801,7 +799,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
-
- memcpy(mypkt->data, buf, nbytes);
-
-- err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
-+ err = brcmf_sdiod_addrprep(sdiodev, &addr);
-
- if (!err)
- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr,
-@@ -821,7 +819,7 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
-
- brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen);
-
-- err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
-+ err = brcmf_sdiod_addrprep(sdiodev, &addr);
- if (err)
- return err;
-
+++ /dev/null
-From 4a3338ba2a7421db2260159cca5a27bd2ee36d00 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:43 +0100
-Subject: [PATCH] brcmfmac: Remove bandaid for SleepCSR
-
-Register access code is not the place for band-aid fixes like this.
-If this is a genuine problem, it should be fixed further up in the driver
-stack.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 28 +---------------------
- 1 file changed, 1 insertion(+), 27 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -334,21 +334,8 @@ static int brcmf_sdiod_reg_write(struct
- } while (ret != 0 && ret != -ENOMEDIUM &&
- retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
-
-- if (ret == -ENOMEDIUM) {
-+ if (ret == -ENOMEDIUM)
- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
-- } else if (ret != 0) {
-- /*
-- * SleepCSR register access can fail when
-- * waking up the device so reduce this noise
-- * in the logs.
-- */
-- if (addr != SBSDIO_FUNC1_SLEEPCSR)
-- brcmf_err("failed to write data F%d@0x%05x, err: %d\n",
-- func, addr, ret);
-- else
-- brcmf_dbg(SDIO, "failed to write data F%d@0x%05x, err: %d\n",
-- func, addr, ret);
-- }
-
- return ret;
- }
-@@ -389,19 +376,6 @@ static int brcmf_sdiod_reg_read(struct b
-
- if (ret == -ENOMEDIUM)
- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
-- else if (ret != 0) {
-- /*
-- * SleepCSR register access can fail when
-- * waking up the device so reduce this noise
-- * in the logs.
-- */
-- if (addr != SBSDIO_FUNC1_SLEEPCSR)
-- brcmf_err("failed to read data F%d@0x%05x, err: %d\n",
-- func, addr, ret);
-- else
-- brcmf_dbg(SDIO, "failed to read data F%d@0x%05x, err: %d\n",
-- func, addr, ret);
-- }
-
- return ret;
- }
+++ /dev/null
-From 993a98a42e6e790fd0d2bf7d55a031513c7ba7dc Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:44 +0100
-Subject: [PATCH] brcmfmac: Remove brcmf_sdiod_request_data()
-
-This function is obfuscating how IO works on this chip. Remove it
-and push its logic into brcmf_sdiod_reg_{read,write}().
-
-Handling of -ENOMEDIUM is altered, but as that's pretty much broken anyway
-we can ignore that.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 237 ++++++++-------------
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.h | 2 +-
- 2 files changed, 87 insertions(+), 152 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -230,6 +230,43 @@ void brcmf_sdiod_change_state(struct brc
- sdiodev->state = state;
- }
-
-+static int brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev,
-+ u32 address)
-+{
-+ int err = 0, i;
-+ u32 addr;
-+
-+ if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
-+ return -ENOMEDIUM;
-+
-+ addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
-+
-+ for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
-+ brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
-+ addr & 0xff, &err);
-+
-+ return err;
-+}
-+
-+static int brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
-+{
-+ uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
-+ int err = 0;
-+
-+ if (bar0 != sdiodev->sbwad) {
-+ err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
-+ if (err)
-+ return err;
-+
-+ sdiodev->sbwad = bar0;
-+ }
-+
-+ *addr &= SBSDIO_SB_OFT_ADDR_MASK;
-+ *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
-+
-+ return 0;
-+}
-+
- static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, u8 byte,
- uint regaddr)
- {
-@@ -249,173 +286,84 @@ static inline int brcmf_sdiod_f0_writeb(
- return err_ret;
- }
-
--static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn,
-- u32 addr, u8 regsz, void *data, bool write)
--{
-- struct sdio_func *func;
-- int ret = -EINVAL;
--
-- brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n",
-- write, fn, addr, regsz);
--
-- /* only allow byte access on F0 */
-- if (WARN_ON(regsz > 1 && !fn))
-- return -EINVAL;
-- func = sdiodev->func[fn];
--
-- switch (regsz) {
-- case 1:
-- if (write) {
-- if (fn)
-- sdio_writeb(func, *(u8 *)data, addr, &ret);
-- else
-- ret = brcmf_sdiod_f0_writeb(func, *(u8 *)data,
-- addr);
-- } else {
-- if (fn)
-- *(u8 *)data = sdio_readb(func, addr, &ret);
-- else
-- *(u8 *)data = sdio_f0_readb(func, addr, &ret);
-- }
-- break;
-- case 2:
-- if (write)
-- sdio_writew(func, *(u16 *)data, addr, &ret);
-- else
-- *(u16 *)data = sdio_readw(func, addr, &ret);
-- break;
-- case 4:
-- if (write)
-- sdio_writel(func, *(u32 *)data, addr, &ret);
-- else
-- *(u32 *)data = sdio_readl(func, addr, &ret);
-- break;
-- default:
-- brcmf_err("invalid size: %d\n", regsz);
-- break;
-- }
--
-- if (ret)
-- brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
-- write ? "write" : "read", fn, addr, ret);
--
-- return ret;
--}
--
- static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr,
- u8 regsz, void *data)
- {
-- u8 func;
-- s32 retry = 0;
- int ret;
-
-- if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
-- return -ENOMEDIUM;
--
- /*
- * figure out how to read the register based on address range
- * 0x00 ~ 0x7FF: function 0 CCCR and FBR
- * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
- * The rest: function 1 silicon backplane core registers
-+ * f0 writes must be bytewise
- */
-- if ((addr & ~REG_F0_REG_MASK) == 0)
-- 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);
--
-- } while (ret != 0 && ret != -ENOMEDIUM &&
-- retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
-+ if ((addr & ~REG_F0_REG_MASK) == 0) {
-+ if (WARN_ON(regsz > 1))
-+ return -EINVAL;
-+ ret = brcmf_sdiod_f0_writeb(sdiodev->func[0],
-+ *(u8 *)data, addr);
-+ } else {
-+ switch (regsz) {
-+ case 1:
-+ sdio_writeb(sdiodev->func[1], *(u8 *)data, addr, &ret);
-+ break;
-+ case 4:
-+ ret = brcmf_sdiod_addrprep(sdiodev, &addr);
-+ if (ret)
-+ goto done;
-
-- if (ret == -ENOMEDIUM)
-- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
-+ sdio_writel(sdiodev->func[1], *(u32 *)data, addr, &ret);
-+ break;
-+ default:
-+ WARN(1, "Invalid reg size\n");
-+ ret = -EINVAL;
-+ break;
-+ }
-+ }
-
-+done:
- return ret;
- }
-
- static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr,
- u8 regsz, void *data)
- {
-- u8 func;
-- s32 retry = 0;
- int ret;
-
-- if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
-- return -ENOMEDIUM;
--
- /*
- * figure out how to read the register based on address range
- * 0x00 ~ 0x7FF: function 0 CCCR and FBR
- * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
- * The rest: function 1 silicon backplane core registers
-+ * f0 reads must be bytewise
- */
-- if ((addr & ~REG_F0_REG_MASK) == 0)
-- func = SDIO_FUNC_0;
-- else
-- func = SDIO_FUNC_1;
--
-- do {
-- memset(data, 0, regsz);
--
-- /* 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, false);
--
-- } while (ret != 0 && ret != -ENOMEDIUM &&
-- retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
--
-- if (ret == -ENOMEDIUM)
-- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
--
-- return ret;
--}
--
--static int
--brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
--{
-- int err = 0, i;
-- u32 addr;
--
-- if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
-- return -ENOMEDIUM;
--
-- addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
--
-- for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
-- brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
-- addr & 0xff, &err);
--
-- return err;
--}
--
--static int
--brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
--{
-- uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
-- int err = 0;
--
-- if (bar0 != sdiodev->sbwad) {
-- err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
-- if (err)
-- return err;
-+ if ((addr & ~REG_F0_REG_MASK) == 0) {
-+ if (WARN_ON(regsz > 1))
-+ return -EINVAL;
-+ *(u8 *)data = sdio_f0_readb(sdiodev->func[0], addr, &ret);
-+ } else {
-+ switch (regsz) {
-+ case 1:
-+ *(u8 *)data = sdio_readb(sdiodev->func[1], addr, &ret);
-+ break;
-+ case 4:
-+ ret = brcmf_sdiod_addrprep(sdiodev, &addr);
-+ if (ret)
-+ goto done;
-
-- sdiodev->sbwad = bar0;
-+ *(u32 *)data = sdio_readl(sdiodev->func[1], addr, &ret);
-+ break;
-+ default:
-+ WARN(1, "Invalid reg size\n");
-+ ret = -EINVAL;
-+ break;
-+ }
- }
-
-- *addr &= SBSDIO_SB_OFT_ADDR_MASK;
-- *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
--
-- return 0;
-+done:
-+ return ret;
- }
-
- u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
-@@ -439,15 +387,9 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
-- retval = brcmf_sdiod_addrprep(sdiodev, &addr);
-- if (retval)
-- goto done;
--
- retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
--
- brcmf_dbg(SDIO, "data:0x%08x\n", data);
-
--done:
- if (ret)
- *ret = retval;
-
-@@ -472,13 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
-- retval = brcmf_sdiod_addrprep(sdiodev, &addr);
-- if (retval)
-- goto done;
--
- retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data);
-
--done:
- if (ret)
- *ret = retval;
- }
-@@ -886,14 +823,12 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
- return bcmerror;
- }
-
--int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn)
-+int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn)
- {
-- char t_func = (char)fn;
- brcmf_dbg(SDIO, "Enter\n");
-
- /* issue abort cmd52 command through F0 */
-- brcmf_sdiod_request_data(sdiodev, SDIO_FUNC_0, SDIO_CCCR_ABORT,
-- 1, &t_func, true);
-+ brcmf_sdiod_reg_write(sdiodev, SDIO_CCCR_ABORT, 1, &fn);
-
- brcmf_dbg(SDIO, "Exit\n");
- return 0;
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-@@ -339,7 +339,7 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_
- u8 *data, uint size);
-
- /* Issue an abort to the specified function */
--int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn);
-+int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn);
- void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
- void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
- enum brcmf_sdiod_state state);
+++ /dev/null
-From 3508a056a1f45d95c874fc9af8748bf4229432b6 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:45 +0100
-Subject: [PATCH] brcmfmac: Fix asymmetric IO functions.
-
-Unlikely to be a problem, but brcmf_sdiod_regrl() is
-not symmetric with brcmf_sdiod_regrb() in initializing
-the data value on stack. Fix that.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-[arend: reword the commit message a bit]
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -383,7 +383,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
-
- u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
- {
-- u32 data = 0;
-+ u32 data;
- int retval;
-
- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
+++ /dev/null
-From 12e3e74e2820e11d91ee44fd3a190cd80d109faa Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:46 +0100
-Subject: [PATCH] brcmfmac: Remove noisy debugging.
-
-If you need debugging this low level, you're doing something wrong.
-Remove these noisy debug statements so the code is more readable.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 6 ------
- 1 file changed, 6 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -371,9 +371,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
- u8 data;
- int retval;
-
-- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
- retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data);
-- brcmf_dbg(SDIO, "data:0x%02x\n", data);
-
- if (ret)
- *ret = retval;
-@@ -386,9 +384,7 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
- u32 data;
- int retval;
-
-- brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
- retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
-- brcmf_dbg(SDIO, "data:0x%08x\n", data);
-
- if (ret)
- *ret = retval;
-@@ -401,7 +397,6 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
- {
- int retval;
-
-- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
- retval = brcmf_sdiod_reg_write(sdiodev, addr, 1, &data);
-
- if (ret)
-@@ -413,7 +408,6 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
- {
- int retval;
-
-- brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
- retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data);
-
- if (ret)
+++ /dev/null
-From dd8a2d49e4ed321ab8e7b679499c3a98ccc5ca24 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Mon, 13 Nov 2017 21:35:47 +0100
-Subject: [PATCH] brcmfmac: Rename bcmerror to err
-
-Trivial cleanup of nasty variable name
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -746,7 +746,7 @@ int
- brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
- u8 *data, uint size)
- {
-- int bcmerror = 0;
-+ int err = 0;
- struct sk_buff *pkt;
- u32 sdaddr;
- uint dsize;
-@@ -771,8 +771,8 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
- /* Do the transfer(s) */
- while (size) {
- /* Set the backplane window to include the start address */
-- bcmerror = brcmf_sdiod_set_sbaddr_window(sdiodev, address);
-- if (bcmerror)
-+ err = brcmf_sdiod_set_sbaddr_window(sdiodev, address);
-+ if (err)
- break;
-
- brcmf_dbg(SDIO, "%s %d bytes at offset 0x%08x in window 0x%08x\n",
-@@ -785,9 +785,9 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
- skb_put(pkt, dsize);
- if (write)
- memcpy(pkt->data, data, dsize);
-- bcmerror = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write,
-- sdaddr, pkt);
-- if (bcmerror) {
-+ err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
-+ pkt);
-+ if (err) {
- brcmf_err("membytes transfer failed\n");
- break;
- }
-@@ -814,7 +814,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
-
- sdio_release_host(sdiodev->func[1]);
-
-- return bcmerror;
-+ return err;
- }
-
- int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn)
+++ /dev/null
-From 8f13c87ccc495e30de5f58bbda967f6edd5bec53 Mon Sep 17 00:00:00 2001
-From: Ian Molton <ian@mnementh.co.uk>
-Date: Fri, 8 Dec 2017 13:10:26 +0100
-Subject: [PATCH] brcmfmac: Split brcmf_sdiod_buffrw function up.
-
-This function needs to be split up into separate read / write variants
-for clarity.
-
-Signed-off-by: Ian Molton <ian@mnementh.co.uk>
-Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 67 +++++++++++++++-------
- 1 file changed, 45 insertions(+), 22 deletions(-)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -414,8 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
- *ret = retval;
- }
-
--static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
-- bool write, u32 addr, struct sk_buff *pkt)
-+static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
-+ u32 addr, struct sk_buff *pkt)
- {
- unsigned int req_sz;
- int err;
-@@ -424,18 +424,36 @@ static int brcmf_sdiod_buffrw(struct brc
- req_sz = pkt->len + 3;
- req_sz &= (uint)~3;
-
-- if (write)
-- err = sdio_memcpy_toio(sdiodev->func[fn], addr,
-- ((u8 *)(pkt->data)), req_sz);
-- else if (fn == 1)
-- err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
-- addr, req_sz);
-+ if (fn == 1)
-+ err = sdio_memcpy_fromio(sdiodev->func[fn],
-+ ((u8 *)(pkt->data)), addr, req_sz);
- else
- /* function 2 read is FIFO operation */
-- err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
-- req_sz);
-+ err = sdio_readsb(sdiodev->func[fn],
-+ ((u8 *)(pkt->data)), addr, req_sz);
-+
-+ if (err == -ENOMEDIUM)
-+ brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
-+
-+ return err;
-+}
-+
-+static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
-+ u32 addr, struct sk_buff *pkt)
-+{
-+ unsigned int req_sz;
-+ int err;
-+
-+ /* Single skb use the standard mmc interface */
-+ req_sz = pkt->len + 3;
-+ req_sz &= (uint)~3;
-+
-+ err = sdio_memcpy_toio(sdiodev->func[fn], addr,
-+ ((u8 *)(pkt->data)), req_sz);
-+
- if (err == -ENOMEDIUM)
- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
-+
- return err;
- }
-
-@@ -643,7 +661,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
- if (err)
- goto done;
-
-- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt);
-+ err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
-
- done:
- return err;
-@@ -665,14 +683,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_
- goto done;
-
- if (pktq->qlen == 1)
-- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
-- pktq->next);
-+ err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
-+ pktq->next);
- else if (!sdiodev->sg_support) {
- glom_skb = brcmu_pkt_buf_get_skb(totlen);
- if (!glom_skb)
- return -ENOMEM;
-- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
-- glom_skb);
-+ err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
-+ glom_skb);
- if (err)
- goto done;
-
-@@ -707,8 +725,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
- err = brcmf_sdiod_addrprep(sdiodev, &addr);
-
- if (!err)
-- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr,
-- mypkt);
-+ err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
-
- brcmu_pkt_buf_free_skb(mypkt);
- return err;
-@@ -730,8 +747,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
-
- if (pktq->qlen == 1 || !sdiodev->sg_support)
- skb_queue_walk(pktq, skb) {
-- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true,
-- addr, skb);
-+ err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
-+ addr, skb);
- if (err)
- break;
- }
-@@ -783,10 +800,16 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
- sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
-
- skb_put(pkt, dsize);
-- if (write)
-+
-+ if (write) {
- memcpy(pkt->data, data, dsize);
-- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
-- pkt);
-+ err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
-+ sdaddr, pkt);
-+ } else {
-+ err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
-+ sdaddr, pkt);
-+ }
-+
- if (err) {
- brcmf_err("membytes transfer failed\n");
- break;