mac80211: Update to version 5.6.8-1
This updates the mac80211 backport. The removed patches are already integrated in the upstream version. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
		@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
 | 
			
		||||
 | 
			
		||||
PKG_NAME:=mac80211
 | 
			
		||||
 | 
			
		||||
PKG_VERSION:=5.5.19-1
 | 
			
		||||
PKG_VERSION:=5.6.8-1
 | 
			
		||||
PKG_RELEASE:=1
 | 
			
		||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.5.19/
 | 
			
		||||
PKG_HASH:=9dd9153df6082eaa079144193a3fab79d200942e1a2a1a80e032c9667b7b92a6
 | 
			
		||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.6.8/
 | 
			
		||||
PKG_HASH:=547c5e17b9e23dd23cdf4d617a7550b80869e02114a7d404911c5ae928ae1da5
 | 
			
		||||
 | 
			
		||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
 | 
			
		||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ath/Makefile
 | 
			
		||||
+++ b/drivers/net/wireless/ath/Makefile
 | 
			
		||||
@@ -14,10 +14,10 @@ ath-objs :=	main.o \
 | 
			
		||||
@@ -15,10 +15,10 @@ ath-objs :=	main.o \
 | 
			
		||||
 		regd.o \
 | 
			
		||||
 		hw.o \
 | 
			
		||||
 		key.o \
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/core.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
 | 
			
		||||
@@ -3105,6 +3105,16 @@ int ath10k_core_register(struct ath10k *
 | 
			
		||||
@@ -3094,6 +3094,16 @@ int ath10k_core_register(struct ath10k *
 | 
			
		||||
 
 | 
			
		||||
 	queue_work(ar->workqueue, &ar->register_work);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ Forwarded: https://patchwork.kernel.org/patch/11367055/
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/htt.h
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/htt.h
 | 
			
		||||
@@ -2219,7 +2219,7 @@ struct htt_rx_chan_info {
 | 
			
		||||
@@ -2221,7 +2221,7 @@ struct htt_rx_chan_info {
 | 
			
		||||
  * Should be: sizeof(struct htt_host_rx_desc) + max rx MSDU size,
 | 
			
		||||
  * rounded up to a cache line size.
 | 
			
		||||
  */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
 | 
			
		||||
@@ -8761,6 +8761,21 @@ static int ath10k_mac_init_rd(struct ath
 | 
			
		||||
@@ -8764,6 +8764,21 @@ static int ath10k_mac_init_rd(struct ath
 | 
			
		||||
 	return 0;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
 int ath10k_mac_register(struct ath10k *ar)
 | 
			
		||||
 {
 | 
			
		||||
 	static const u32 cipher_suites[] = {
 | 
			
		||||
@@ -9088,6 +9103,12 @@ int ath10k_mac_register(struct ath10k *a
 | 
			
		||||
@@ -9092,6 +9107,12 @@ int ath10k_mac_register(struct ath10k *a
 | 
			
		||||
 
 | 
			
		||||
 	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@ v9: use SM/MS macros from code.h to simplify shift/mask handling
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/wmi.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
 | 
			
		||||
@@ -7601,12 +7601,7 @@ ath10k_wmi_peer_assoc_fill_10_4(struct a
 | 
			
		||||
@@ -7615,12 +7615,7 @@ ath10k_wmi_peer_assoc_fill_10_4(struct a
 | 
			
		||||
 	struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf;
 | 
			
		||||
 
 | 
			
		||||
 	ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
 | 
			
		||||
 
 | 
			
		||||
@@ -148,7 +148,7 @@ v13:
 | 
			
		||||
 		.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
 | 
			
		||||
 		.uart_pin = 7,
 | 
			
		||||
 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
 | 
			
		||||
@@ -338,6 +341,7 @@ static const struct ath10k_hw_params ath
 | 
			
		||||
@@ -339,6 +342,7 @@ static const struct ath10k_hw_params ath
 | 
			
		||||
 		.dev_id = QCA99X0_2_0_DEVICE_ID,
 | 
			
		||||
 		.bus = ATH10K_BUS_PCI,
 | 
			
		||||
 		.name = "qca99x0 hw2.0",
 | 
			
		||||
@@ -156,7 +156,7 @@ v13:
 | 
			
		||||
 		.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
 | 
			
		||||
 		.uart_pin = 7,
 | 
			
		||||
 		.otp_exe_param = 0x00000700,
 | 
			
		||||
@@ -379,6 +383,7 @@ static const struct ath10k_hw_params ath
 | 
			
		||||
@@ -380,6 +384,7 @@ static const struct ath10k_hw_params ath
 | 
			
		||||
 		.dev_id = QCA9984_1_0_DEVICE_ID,
 | 
			
		||||
 		.bus = ATH10K_BUS_PCI,
 | 
			
		||||
 		.name = "qca9984/qca9994 hw1.0",
 | 
			
		||||
@@ -164,7 +164,7 @@ v13:
 | 
			
		||||
 		.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
 | 
			
		||||
 		.uart_pin = 7,
 | 
			
		||||
 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
 | 
			
		||||
@@ -427,6 +432,7 @@ static const struct ath10k_hw_params ath
 | 
			
		||||
@@ -428,6 +433,7 @@ static const struct ath10k_hw_params ath
 | 
			
		||||
 		.dev_id = QCA9888_2_0_DEVICE_ID,
 | 
			
		||||
 		.bus = ATH10K_BUS_PCI,
 | 
			
		||||
 		.name = "qca9888 hw2.0",
 | 
			
		||||
@@ -172,7 +172,7 @@ v13:
 | 
			
		||||
 		.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
 | 
			
		||||
 		.uart_pin = 7,
 | 
			
		||||
 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
 | 
			
		||||
@@ -2822,6 +2828,10 @@ int ath10k_core_start(struct ath10k *ar,
 | 
			
		||||
@@ -2811,6 +2817,10 @@ int ath10k_core_start(struct ath10k *ar,
 | 
			
		||||
 		goto err_hif_stop;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -183,7 +183,7 @@ v13:
 | 
			
		||||
 	return 0;
 | 
			
		||||
 
 | 
			
		||||
 err_hif_stop:
 | 
			
		||||
@@ -3078,9 +3088,18 @@ static void ath10k_core_register_work(st
 | 
			
		||||
@@ -3067,9 +3077,18 @@ static void ath10k_core_register_work(st
 | 
			
		||||
 		goto err_spectral_destroy;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -202,7 +202,7 @@ v13:
 | 
			
		||||
 err_spectral_destroy:
 | 
			
		||||
 	ath10k_spectral_destroy(ar);
 | 
			
		||||
 err_debug_destroy:
 | 
			
		||||
@@ -3126,6 +3145,8 @@ void ath10k_core_unregister(struct ath10
 | 
			
		||||
@@ -3115,6 +3134,8 @@ void ath10k_core_unregister(struct ath10
 | 
			
		||||
 	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
@@ -221,7 +221,7 @@ v13:
 | 
			
		||||
 
 | 
			
		||||
 #include "htt.h"
 | 
			
		||||
 #include "htc.h"
 | 
			
		||||
@@ -1179,6 +1180,13 @@ struct ath10k {
 | 
			
		||||
@@ -1180,6 +1181,13 @@ struct ath10k {
 | 
			
		||||
 	} testmode;
 | 
			
		||||
 
 | 
			
		||||
 	struct {
 | 
			
		||||
@@ -233,8 +233,8 @@ v13:
 | 
			
		||||
+
 | 
			
		||||
+	struct {
 | 
			
		||||
 		/* protected by data_lock */
 | 
			
		||||
 		u32 rx_crc_err_drop;
 | 
			
		||||
 		u32 fw_crash_counter;
 | 
			
		||||
 		u32 fw_warm_reset_counter;
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/hw.h
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/hw.h
 | 
			
		||||
@@ -517,6 +517,7 @@ struct ath10k_hw_params {
 | 
			
		||||
@@ -456,7 +456,7 @@ v13:
 | 
			
		||||
 {
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
 | 
			
		||||
@@ -4444,6 +4444,8 @@ static const struct wmi_ops wmi_tlv_ops
 | 
			
		||||
@@ -4447,6 +4447,8 @@ static const struct wmi_ops wmi_tlv_ops
 | 
			
		||||
 	.gen_echo = ath10k_wmi_tlv_op_gen_echo,
 | 
			
		||||
 	.gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf,
 | 
			
		||||
 	.gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable,
 | 
			
		||||
@@ -467,7 +467,7 @@ v13:
 | 
			
		||||
 static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/wmi.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
 | 
			
		||||
@@ -7421,6 +7421,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
 | 
			
		||||
@@ -7435,6 +7435,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
 | 
			
		||||
 	return skb;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -517,7 +517,7 @@ v13:
 | 
			
		||||
 static struct sk_buff *
 | 
			
		||||
 ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
 | 
			
		||||
 			     enum wmi_sta_ps_mode psmode)
 | 
			
		||||
@@ -9078,6 +9121,9 @@ static const struct wmi_ops wmi_ops = {
 | 
			
		||||
@@ -9092,6 +9135,9 @@ static const struct wmi_ops wmi_ops = {
 | 
			
		||||
 	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
 | 
			
		||||
 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
 | 
			
		||||
 	.gen_echo = ath10k_wmi_op_gen_echo,
 | 
			
		||||
@@ -527,7 +527,7 @@ v13:
 | 
			
		||||
 	/* .gen_bcn_tmpl not implemented */
 | 
			
		||||
 	/* .gen_prb_tmpl not implemented */
 | 
			
		||||
 	/* .gen_p2p_go_bcn_ie not implemented */
 | 
			
		||||
@@ -9148,6 +9194,8 @@ static const struct wmi_ops wmi_10_1_ops
 | 
			
		||||
@@ -9162,6 +9208,8 @@ static const struct wmi_ops wmi_10_1_ops
 | 
			
		||||
 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
 | 
			
		||||
 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
 | 
			
		||||
 	.gen_echo = ath10k_wmi_op_gen_echo,
 | 
			
		||||
@@ -536,7 +536,7 @@ v13:
 | 
			
		||||
 	/* .gen_bcn_tmpl not implemented */
 | 
			
		||||
 	/* .gen_prb_tmpl not implemented */
 | 
			
		||||
 	/* .gen_p2p_go_bcn_ie not implemented */
 | 
			
		||||
@@ -9220,6 +9268,8 @@ static const struct wmi_ops wmi_10_2_ops
 | 
			
		||||
@@ -9234,6 +9282,8 @@ static const struct wmi_ops wmi_10_2_ops
 | 
			
		||||
 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
 | 
			
		||||
 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
 | 
			
		||||
 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
 | 
			
		||||
@@ -545,7 +545,7 @@ v13:
 | 
			
		||||
 	/* .gen_pdev_enable_adaptive_cca not implemented */
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -9291,6 +9341,8 @@ static const struct wmi_ops wmi_10_2_4_o
 | 
			
		||||
@@ -9305,6 +9355,8 @@ static const struct wmi_ops wmi_10_2_4_o
 | 
			
		||||
 		ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
 | 
			
		||||
 	.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
 | 
			
		||||
 	.gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing,
 | 
			
		||||
@@ -554,7 +554,7 @@ v13:
 | 
			
		||||
 	/* .gen_bcn_tmpl not implemented */
 | 
			
		||||
 	/* .gen_prb_tmpl not implemented */
 | 
			
		||||
 	/* .gen_p2p_go_bcn_ie not implemented */
 | 
			
		||||
@@ -9371,6 +9423,8 @@ static const struct wmi_ops wmi_10_4_ops
 | 
			
		||||
@@ -9385,6 +9437,8 @@ static const struct wmi_ops wmi_10_4_ops
 | 
			
		||||
 	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
 | 
			
		||||
 	.gen_echo = ath10k_wmi_op_gen_echo,
 | 
			
		||||
 	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/core.h
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
 | 
			
		||||
@@ -1228,6 +1228,10 @@ struct ath10k {
 | 
			
		||||
@@ -1230,6 +1230,10 @@ struct ath10k {
 | 
			
		||||
 	struct ath10k_bus_params bus_param;
 | 
			
		||||
 	struct completion peer_delete_done;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
 | 
			
		||||
 	if (ret)
 | 
			
		||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
 | 
			
		||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
 | 
			
		||||
@@ -9120,7 +9120,7 @@ int ath10k_mac_register(struct ath10k *a
 | 
			
		||||
@@ -9124,7 +9124,7 @@ int ath10k_mac_register(struct ath10k *a
 | 
			
		||||
 	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
 | 
			
		||||
 
 | 
			
		||||
 #ifdef CPTCFG_MAC80211_LEDS
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
From 8d9627b05b2c33e4468e65739eb7caf9c3f274d8 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
 | 
			
		||||
Date: Tue, 10 Dec 2019 12:35:55 +0100
 | 
			
		||||
Subject: [PATCH] brcmfmac: set interface carrier to off by default
 | 
			
		||||
MIME-Version: 1.0
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
Content-Transfer-Encoding: 8bit
 | 
			
		||||
 | 
			
		||||
It's important as brcmfmac creates one main interface for each PHY and
 | 
			
		||||
doesn't allow deleting it. Not setting carrier could result in other
 | 
			
		||||
subsystems misbehaving (e.g. LEDs "netdev" trigger turning LED on).
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 ++
 | 
			
		||||
 1 file changed, 2 insertions(+)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | 
			
		||||
@@ -678,6 +678,8 @@ int brcmf_net_attach(struct brcmf_if *if
 | 
			
		||||
 		goto fail;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
+	netif_carrier_off(ndev);
 | 
			
		||||
+
 | 
			
		||||
 	netdev_set_priv_destructor(ndev, brcmf_cfg80211_free_netdev);
 | 
			
		||||
 	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
 | 
			
		||||
 	return 0;
 | 
			
		||||
@@ -1,121 +0,0 @@
 | 
			
		||||
From 1b8d2e0a9e4221b99eea375c079507ce8ef655f5 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:45 +0100
 | 
			
		||||
Subject: [PATCH 1/7] brcmfmac: reset two D11 cores if chip has two D11 cores
 | 
			
		||||
 | 
			
		||||
There are two D11 cores in RSDB chips like 4359. We have to reset two
 | 
			
		||||
D11 cores simutaneously before firmware download, or the firmware may
 | 
			
		||||
not be initialized correctly and cause "fw initialized failed" error.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/chip.c        | 50 +++++++++++++++++++
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/chip.h        |  1 +
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/pcie.c        |  2 +-
 | 
			
		||||
 3 files changed, 52 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | 
			
		||||
@@ -433,11 +433,25 @@ static void brcmf_chip_ai_resetcore(stru
 | 
			
		||||
 {
 | 
			
		||||
 	struct brcmf_chip_priv *ci;
 | 
			
		||||
 	int count;
 | 
			
		||||
+	struct brcmf_core *d11core2 = NULL;
 | 
			
		||||
+	struct brcmf_core_priv *d11priv2 = NULL;
 | 
			
		||||
 
 | 
			
		||||
 	ci = core->chip;
 | 
			
		||||
 
 | 
			
		||||
+	/* special handle two D11 cores reset */
 | 
			
		||||
+	if (core->pub.id == BCMA_CORE_80211) {
 | 
			
		||||
+		d11core2 = brcmf_chip_get_d11core(&ci->pub, 1);
 | 
			
		||||
+		if (d11core2) {
 | 
			
		||||
+			brcmf_dbg(INFO, "found two d11 cores, reset both\n");
 | 
			
		||||
+			d11priv2 = container_of(d11core2,
 | 
			
		||||
+						struct brcmf_core_priv, pub);
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	/* must disable first to work for arbitrary current core state */
 | 
			
		||||
 	brcmf_chip_ai_coredisable(core, prereset, reset);
 | 
			
		||||
+	if (d11priv2)
 | 
			
		||||
+		brcmf_chip_ai_coredisable(d11priv2, prereset, reset);
 | 
			
		||||
 
 | 
			
		||||
 	count = 0;
 | 
			
		||||
 	while (ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL) &
 | 
			
		||||
@@ -449,9 +463,30 @@ static void brcmf_chip_ai_resetcore(stru
 | 
			
		||||
 		usleep_range(40, 60);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
+	if (d11priv2) {
 | 
			
		||||
+		count = 0;
 | 
			
		||||
+		while (ci->ops->read32(ci->ctx,
 | 
			
		||||
+				       d11priv2->wrapbase + BCMA_RESET_CTL) &
 | 
			
		||||
+				       BCMA_RESET_CTL_RESET) {
 | 
			
		||||
+			ci->ops->write32(ci->ctx,
 | 
			
		||||
+					 d11priv2->wrapbase + BCMA_RESET_CTL,
 | 
			
		||||
+					 0);
 | 
			
		||||
+			count++;
 | 
			
		||||
+			if (count > 50)
 | 
			
		||||
+				break;
 | 
			
		||||
+			usleep_range(40, 60);
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 	ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
 | 
			
		||||
 			 postreset | BCMA_IOCTL_CLK);
 | 
			
		||||
 	ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL);
 | 
			
		||||
+
 | 
			
		||||
+	if (d11priv2) {
 | 
			
		||||
+		ci->ops->write32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL,
 | 
			
		||||
+				 postreset | BCMA_IOCTL_CLK);
 | 
			
		||||
+		ci->ops->read32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL);
 | 
			
		||||
+	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
 | 
			
		||||
@@ -1109,6 +1144,21 @@ void brcmf_chip_detach(struct brcmf_chip
 | 
			
		||||
 	kfree(chip);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit)
 | 
			
		||||
+{
 | 
			
		||||
+	struct brcmf_chip_priv *chip;
 | 
			
		||||
+	struct brcmf_core_priv *core;
 | 
			
		||||
+
 | 
			
		||||
+	chip = container_of(pub, struct brcmf_chip_priv, pub);
 | 
			
		||||
+	list_for_each_entry(core, &chip->cores, list) {
 | 
			
		||||
+		if (core->pub.id == BCMA_CORE_80211) {
 | 
			
		||||
+			if (unit-- == 0)
 | 
			
		||||
+				return &core->pub;
 | 
			
		||||
+		}
 | 
			
		||||
+	}
 | 
			
		||||
+	return NULL;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *pub, u16 coreid)
 | 
			
		||||
 {
 | 
			
		||||
 	struct brcmf_chip_priv *chip;
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
 | 
			
		||||
@@ -74,6 +74,7 @@ struct brcmf_chip *brcmf_chip_attach(voi
 | 
			
		||||
 				     const struct brcmf_buscore_ops *ops);
 | 
			
		||||
 void brcmf_chip_detach(struct brcmf_chip *chip);
 | 
			
		||||
 struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid);
 | 
			
		||||
+struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit);
 | 
			
		||||
 struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip);
 | 
			
		||||
 struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub);
 | 
			
		||||
 bool brcmf_chip_iscoreup(struct brcmf_core *core);
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | 
			
		||||
@@ -78,7 +78,7 @@ static const struct brcmf_firmware_mappi
 | 
			
		||||
 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
-#define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
 | 
			
		||||
+#define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
 | 
			
		||||
 
 | 
			
		||||
 #define BRCMF_PCIE_REG_MAP_SIZE			(32 * 1024)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,79 +0,0 @@
 | 
			
		||||
From 172f6854551d48d1c9530f84513b421db944e714 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:46 +0100
 | 
			
		||||
Subject: [PATCH 2/7] brcmfmac: set F2 blocksize and watermark for 4359
 | 
			
		||||
 | 
			
		||||
Set F2 blocksize to 256 bytes and watermark to 0x40 for 4359. Also
 | 
			
		||||
enable and configure F1 MesBusyCtrl. It fixes DMA error while having
 | 
			
		||||
UDP bi-directional traffic.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
 | 
			
		||||
[slightly adapted for rebase on mainline linux]
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |  6 +++++-
 | 
			
		||||
 .../wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 15 +++++++++++++++
 | 
			
		||||
 2 files changed, 20 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | 
			
		||||
@@ -43,6 +43,7 @@
 | 
			
		||||
 
 | 
			
		||||
 #define SDIO_FUNC1_BLOCKSIZE		64
 | 
			
		||||
 #define SDIO_FUNC2_BLOCKSIZE		512
 | 
			
		||||
+#define SDIO_4359_FUNC2_BLOCKSIZE	256
 | 
			
		||||
 /* Maximum milliseconds to wait for F2 to come up */
 | 
			
		||||
 #define SDIO_WAIT_F2RDY	3000
 | 
			
		||||
 
 | 
			
		||||
@@ -903,6 +904,7 @@ static void brcmf_sdiod_host_fixup(struc
 | 
			
		||||
 static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
 | 
			
		||||
 {
 | 
			
		||||
 	int ret = 0;
 | 
			
		||||
+	unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
 | 
			
		||||
 
 | 
			
		||||
 	sdio_claim_host(sdiodev->func1);
 | 
			
		||||
 
 | 
			
		||||
@@ -912,7 +914,9 @@ static int brcmf_sdiod_probe(struct brcm
 | 
			
		||||
 		sdio_release_host(sdiodev->func1);
 | 
			
		||||
 		goto out;
 | 
			
		||||
 	}
 | 
			
		||||
-	ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
 | 
			
		||||
+	if (sdiodev->func2->device == SDIO_DEVICE_ID_BROADCOM_4359)
 | 
			
		||||
+		f2_blksz = SDIO_4359_FUNC2_BLOCKSIZE;
 | 
			
		||||
+	ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
 | 
			
		||||
 	if (ret) {
 | 
			
		||||
 		brcmf_err("Failed to set F2 blocksize\n");
 | 
			
		||||
 		sdio_release_host(sdiodev->func1);
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | 
			
		||||
@@ -42,6 +42,8 @@
 | 
			
		||||
 #define DEFAULT_F2_WATERMARK    0x8
 | 
			
		||||
 #define CY_4373_F2_WATERMARK    0x40
 | 
			
		||||
 #define CY_43012_F2_WATERMARK    0x60
 | 
			
		||||
+#define CY_4359_F2_WATERMARK	0x40
 | 
			
		||||
+#define CY_4359_F1_MESBUSYCTRL	(CY_4359_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
 | 
			
		||||
 
 | 
			
		||||
 #ifdef DEBUG
 | 
			
		||||
 
 | 
			
		||||
@@ -4208,6 +4210,19 @@ static void brcmf_sdio_firmware_callback
 | 
			
		||||
 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
 | 
			
		||||
 					   &err);
 | 
			
		||||
 			break;
 | 
			
		||||
+		case SDIO_DEVICE_ID_BROADCOM_4359:
 | 
			
		||||
+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
 | 
			
		||||
+				  CY_4359_F2_WATERMARK);
 | 
			
		||||
+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
 | 
			
		||||
+					   CY_4359_F2_WATERMARK, &err);
 | 
			
		||||
+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
 | 
			
		||||
+						   &err);
 | 
			
		||||
+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
 | 
			
		||||
+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
 | 
			
		||||
+					   &err);
 | 
			
		||||
+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
 | 
			
		||||
+					   CY_4359_F1_MESBUSYCTRL, &err);
 | 
			
		||||
+			break;
 | 
			
		||||
 		default:
 | 
			
		||||
 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
 | 
			
		||||
 					   DEFAULT_F2_WATERMARK, &err);
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
From 6647274ed995a172369cb04754eb5f8b85f68f6d Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Soeren Moch <smoch@web.de>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:47 +0100
 | 
			
		||||
Subject: [PATCH 3/7] brcmfmac: fix rambase for 4359/9
 | 
			
		||||
 | 
			
		||||
Newer 4359 chip revisions need a different rambase address.
 | 
			
		||||
This fixes firmware download on such devices which fails otherwise.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Acked-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 3 ++-
 | 
			
		||||
 1 file changed, 2 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | 
			
		||||
@@ -712,7 +712,6 @@ static u32 brcmf_chip_tcm_rambase(struct
 | 
			
		||||
 	case BRCM_CC_43569_CHIP_ID:
 | 
			
		||||
 	case BRCM_CC_43570_CHIP_ID:
 | 
			
		||||
 	case BRCM_CC_4358_CHIP_ID:
 | 
			
		||||
-	case BRCM_CC_4359_CHIP_ID:
 | 
			
		||||
 	case BRCM_CC_43602_CHIP_ID:
 | 
			
		||||
 	case BRCM_CC_4371_CHIP_ID:
 | 
			
		||||
 		return 0x180000;
 | 
			
		||||
@@ -722,6 +721,8 @@ static u32 brcmf_chip_tcm_rambase(struct
 | 
			
		||||
 	case BRCM_CC_4366_CHIP_ID:
 | 
			
		||||
 	case BRCM_CC_43664_CHIP_ID:
 | 
			
		||||
 		return 0x200000;
 | 
			
		||||
+	case BRCM_CC_4359_CHIP_ID:
 | 
			
		||||
+		return (ci->pub.chiprev < 9) ? 0x180000 : 0x160000;
 | 
			
		||||
 	case CY_CC_4373_CHIP_ID:
 | 
			
		||||
 		return 0x160000;
 | 
			
		||||
 	default:
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
From c12c8913d79c49ceccb38f42714d25b783833758 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Soeren Moch <smoch@web.de>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:48 +0100
 | 
			
		||||
Subject: [PATCH 4/7] brcmfmac: make errors when setting roaming parameters
 | 
			
		||||
 non-fatal
 | 
			
		||||
 | 
			
		||||
4359 dongles do not support setting roaming parameters (error -52).
 | 
			
		||||
Do not fail the 80211 configuration in this case.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Acked-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c    | 10 ++++------
 | 
			
		||||
 1 file changed, 4 insertions(+), 6 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -6012,19 +6012,17 @@ static s32 brcmf_dongle_roam(struct brcm
 | 
			
		||||
 	roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL);
 | 
			
		||||
 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_TRIGGER,
 | 
			
		||||
 				     (void *)roamtrigger, sizeof(roamtrigger));
 | 
			
		||||
-	if (err) {
 | 
			
		||||
+	if (err)
 | 
			
		||||
 		bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err);
 | 
			
		||||
-		goto roam_setup_done;
 | 
			
		||||
-	}
 | 
			
		||||
 
 | 
			
		||||
 	roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
 | 
			
		||||
 	roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
 | 
			
		||||
 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
 | 
			
		||||
 				     (void *)roam_delta, sizeof(roam_delta));
 | 
			
		||||
-	if (err) {
 | 
			
		||||
+	if (err)
 | 
			
		||||
 		bphy_err(drvr, "WLC_SET_ROAM_DELTA error (%d)\n", err);
 | 
			
		||||
-		goto roam_setup_done;
 | 
			
		||||
-	}
 | 
			
		||||
+
 | 
			
		||||
+	return 0;
 | 
			
		||||
 
 | 
			
		||||
 roam_setup_done:
 | 
			
		||||
 	return err;
 | 
			
		||||
@@ -1,75 +0,0 @@
 | 
			
		||||
From d4aef159394d5940bd7158ab789969dab82f7c76 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Soeren Moch <smoch@web.de>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:49 +0100
 | 
			
		||||
Subject: [PATCH 5/7] brcmfmac: add support for BCM4359 SDIO chipset
 | 
			
		||||
 | 
			
		||||
BCM4359 is a 2x2 802.11 abgn+ac Dual-Band HT80 combo chip and it
 | 
			
		||||
supports Real Simultaneous Dual Band feature.
 | 
			
		||||
 | 
			
		||||
Based on a similar patch by: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Acked-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 ++
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c   | 1 +
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 2 ++
 | 
			
		||||
 include/linux/mmc/sdio_ids.h                              | 2 ++
 | 
			
		||||
 4 files changed, 7 insertions(+)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | 
			
		||||
@@ -973,8 +973,10 @@ static const struct sdio_device_id brcmf
 | 
			
		||||
 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
 | 
			
		||||
 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
 | 
			
		||||
 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
 | 
			
		||||
+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
 | 
			
		||||
 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
 | 
			
		||||
 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43012),
 | 
			
		||||
+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_89359),
 | 
			
		||||
 	{ /* end: all zeroes */ }
 | 
			
		||||
 };
 | 
			
		||||
 MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | 
			
		||||
@@ -1408,6 +1408,7 @@ bool brcmf_chip_sr_capable(struct brcmf_
 | 
			
		||||
 		addr = CORE_CC_REG(base, sr_control0);
 | 
			
		||||
 		reg = chip->ops->read32(chip->ctx, addr);
 | 
			
		||||
 		return (reg & CC_SR_CTL0_ENABLE_MASK) != 0;
 | 
			
		||||
+	case BRCM_CC_4359_CHIP_ID:
 | 
			
		||||
 	case CY_CC_43012_CHIP_ID:
 | 
			
		||||
 		addr = CORE_CC_REG(pmu->base, retention_ctl);
 | 
			
		||||
 		reg = chip->ops->read32(chip->ctx, addr);
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | 
			
		||||
@@ -616,6 +616,7 @@ BRCMF_FW_DEF(43455, "brcmfmac43455-sdio"
 | 
			
		||||
 BRCMF_FW_DEF(43456, "brcmfmac43456-sdio");
 | 
			
		||||
 BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
 | 
			
		||||
 BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
 | 
			
		||||
+BRCMF_FW_DEF(4359, "brcmfmac4359-sdio");
 | 
			
		||||
 BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
 | 
			
		||||
 BRCMF_FW_DEF(43012, "brcmfmac43012-sdio");
 | 
			
		||||
 
 | 
			
		||||
@@ -638,6 +639,7 @@ static const struct brcmf_firmware_mappi
 | 
			
		||||
 	BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFDC0, 43455),
 | 
			
		||||
 	BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
 | 
			
		||||
 	BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
 | 
			
		||||
+	BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
 | 
			
		||||
 	BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
 | 
			
		||||
 	BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012)
 | 
			
		||||
 };
 | 
			
		||||
--- a/include/linux/mmc/sdio_ids.h
 | 
			
		||||
+++ b/include/linux/mmc/sdio_ids.h
 | 
			
		||||
@@ -41,8 +41,10 @@
 | 
			
		||||
 #define SDIO_DEVICE_ID_BROADCOM_43455		0xa9bf
 | 
			
		||||
 #define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
 | 
			
		||||
 #define SDIO_DEVICE_ID_BROADCOM_4356		0x4356
 | 
			
		||||
+#define SDIO_DEVICE_ID_BROADCOM_4359		0x4359
 | 
			
		||||
 #define SDIO_DEVICE_ID_CYPRESS_4373		0x4373
 | 
			
		||||
 #define SDIO_DEVICE_ID_CYPRESS_43012		43012
 | 
			
		||||
+#define SDIO_DEVICE_ID_CYPRESS_89359		0x4355
 | 
			
		||||
 
 | 
			
		||||
 #define SDIO_VENDOR_ID_INTEL			0x0089
 | 
			
		||||
 #define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX	0x1402
 | 
			
		||||
@@ -1,130 +0,0 @@
 | 
			
		||||
From 837482e69a3f0d7cbc73922020012f83635f5ddb Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:50 +0100
 | 
			
		||||
Subject: [PATCH 6/7] brcmfmac: add RSDB condition when setting interface
 | 
			
		||||
 combinations
 | 
			
		||||
 | 
			
		||||
With firmware RSDB feature
 | 
			
		||||
1. The maximum support interface is four.
 | 
			
		||||
2. The maximum difference channel is two.
 | 
			
		||||
3. The maximum interfaces of {station/p2p client/AP} are two.
 | 
			
		||||
4. The maximum interface of p2p device is one.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/cfg80211.c    | 54 ++++++++++++++++---
 | 
			
		||||
 1 file changed, 46 insertions(+), 8 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -6520,6 +6520,9 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] =
 | 
			
		||||
  *	#STA <= 1, #AP <= 1, channels = 1, 2 total
 | 
			
		||||
  *	#AP <= 4, matching BI, channels = 1, 4 total
 | 
			
		||||
  *
 | 
			
		||||
+ * no p2p and rsdb:
 | 
			
		||||
+ *	#STA <= 2, #AP <= 2, channels = 2, 4 total
 | 
			
		||||
+ *
 | 
			
		||||
  * p2p, no mchan, and mbss:
 | 
			
		||||
  *
 | 
			
		||||
  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
 | 
			
		||||
@@ -6531,6 +6534,10 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] =
 | 
			
		||||
  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
 | 
			
		||||
  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
 | 
			
		||||
  *	#AP <= 4, matching BI, channels = 1, 4 total
 | 
			
		||||
+ *
 | 
			
		||||
+ * p2p, rsdb, and no mbss:
 | 
			
		||||
+ *	#STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
 | 
			
		||||
+ *	 channels = 2, 4 total
 | 
			
		||||
  */
 | 
			
		||||
 static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
 | 
			
		||||
 {
 | 
			
		||||
@@ -6538,13 +6545,14 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 	struct ieee80211_iface_limit *c0_limits = NULL;
 | 
			
		||||
 	struct ieee80211_iface_limit *p2p_limits = NULL;
 | 
			
		||||
 	struct ieee80211_iface_limit *mbss_limits = NULL;
 | 
			
		||||
-	bool mbss, p2p;
 | 
			
		||||
+	bool mbss, p2p, rsdb;
 | 
			
		||||
 	int i, c, n_combos;
 | 
			
		||||
 
 | 
			
		||||
 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
 | 
			
		||||
 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
 | 
			
		||||
+	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
 | 
			
		||||
 
 | 
			
		||||
-	n_combos = 1 + !!p2p + !!mbss;
 | 
			
		||||
+	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
 | 
			
		||||
 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
 | 
			
		||||
 	if (!combo)
 | 
			
		||||
 		goto err;
 | 
			
		||||
@@ -6555,16 +6563,36 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 
 | 
			
		||||
 	c = 0;
 | 
			
		||||
 	i = 0;
 | 
			
		||||
-	c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
+	if (p2p && rsdb)
 | 
			
		||||
+		c0_limits = kcalloc(4, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
+	else if (p2p)
 | 
			
		||||
+		c0_limits = kcalloc(3, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
+	else
 | 
			
		||||
+		c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
 	if (!c0_limits)
 | 
			
		||||
 		goto err;
 | 
			
		||||
-	c0_limits[i].max = 1;
 | 
			
		||||
-	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
-	if (p2p) {
 | 
			
		||||
+	if (p2p && rsdb) {
 | 
			
		||||
+		combo[c].num_different_channels = 2;
 | 
			
		||||
+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
+					  BIT(NL80211_IFTYPE_P2P_GO) |
 | 
			
		||||
+					  BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
+		c0_limits[i].max = 2;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
+		c0_limits[i].max = 1;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
+		c0_limits[i].max = 2;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
+				       BIT(NL80211_IFTYPE_P2P_GO);
 | 
			
		||||
+		c0_limits[i].max = 2;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
+		combo[c].max_interfaces = 5;
 | 
			
		||||
+	} else if (p2p) {
 | 
			
		||||
 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
 | 
			
		||||
 			combo[c].num_different_channels = 2;
 | 
			
		||||
 		else
 | 
			
		||||
 			combo[c].num_different_channels = 1;
 | 
			
		||||
+		c0_limits[i].max = 1;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
 					  BIT(NL80211_IFTYPE_P2P_GO) |
 | 
			
		||||
 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
@@ -6573,16 +6601,26 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 		c0_limits[i].max = 1;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
 				       BIT(NL80211_IFTYPE_P2P_GO);
 | 
			
		||||
+		combo[c].max_interfaces = i;
 | 
			
		||||
+	} else if (rsdb) {
 | 
			
		||||
+		combo[c].num_different_channels = 2;
 | 
			
		||||
+		c0_limits[i].max = 2;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
+		c0_limits[i].max = 2;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
+		combo[c].max_interfaces = 3;
 | 
			
		||||
 	} else {
 | 
			
		||||
 		combo[c].num_different_channels = 1;
 | 
			
		||||
 		c0_limits[i].max = 1;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
+		c0_limits[i].max = 1;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
+		combo[c].max_interfaces = i;
 | 
			
		||||
 	}
 | 
			
		||||
-	combo[c].max_interfaces = i;
 | 
			
		||||
 	combo[c].n_limits = i;
 | 
			
		||||
 	combo[c].limits = c0_limits;
 | 
			
		||||
 
 | 
			
		||||
-	if (p2p) {
 | 
			
		||||
+	if (p2p && !rsdb) {
 | 
			
		||||
 		c++;
 | 
			
		||||
 		i = 0;
 | 
			
		||||
 		p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
From 2635853ce4ab7654a77ab7080fb56de83408606b Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
Date: Thu, 12 Dec 2019 00:52:51 +0100
 | 
			
		||||
Subject: [PATCH 7/7] brcmfmac: not set mbss in vif if firmware does not
 | 
			
		||||
 support MBSS
 | 
			
		||||
 | 
			
		||||
With RSDB mode, FMAC and firmware are able to create 2 or more AP,
 | 
			
		||||
so we should not set mbss in vif structure if firmware does not
 | 
			
		||||
support MBSS feature.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
 | 
			
		||||
Signed-off-by: Soeren Moch <smoch@web.de>
 | 
			
		||||
Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 +++-
 | 
			
		||||
 1 file changed, 3 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -5363,6 +5363,7 @@ struct brcmf_cfg80211_vif *brcmf_alloc_v
 | 
			
		||||
 	struct brcmf_cfg80211_vif *vif_walk;
 | 
			
		||||
 	struct brcmf_cfg80211_vif *vif;
 | 
			
		||||
 	bool mbss;
 | 
			
		||||
+	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
 | 
			
		||||
 
 | 
			
		||||
 	brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
 | 
			
		||||
 		  sizeof(*vif));
 | 
			
		||||
@@ -5375,7 +5376,8 @@ struct brcmf_cfg80211_vif *brcmf_alloc_v
 | 
			
		||||
 
 | 
			
		||||
 	brcmf_init_prof(&vif->profile);
 | 
			
		||||
 
 | 
			
		||||
-	if (type == NL80211_IFTYPE_AP) {
 | 
			
		||||
+	if (type == NL80211_IFTYPE_AP &&
 | 
			
		||||
+	    brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
 | 
			
		||||
 		mbss = false;
 | 
			
		||||
 		list_for_each_entry(vif_walk, &cfg->vif_list, list) {
 | 
			
		||||
 			if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
 | 
			
		||||
@@ -1,66 +0,0 @@
 | 
			
		||||
From a32de68edab7b73ded850bcf76cdf6858e92a7e5 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Dmitry Osipenko <digetx@gmail.com>
 | 
			
		||||
Date: Sun, 15 Dec 2019 21:42:24 +0300
 | 
			
		||||
Subject: [PATCH] brcmfmac: Keep OOB wake-interrupt disabled when it shouldn't
 | 
			
		||||
 be enabled
 | 
			
		||||
 | 
			
		||||
NVIDIA Tegra SoCs do not like when OOB wake is enabled and WiFi interface
 | 
			
		||||
is in DOWN state during suspend. This results in a CPU hang on programming
 | 
			
		||||
OOB wake-up state of the GPIO controller during of system's suspend.
 | 
			
		||||
 | 
			
		||||
The solution is trivial: don't enable wake for the OOB interrupt when it
 | 
			
		||||
should be disabled.
 | 
			
		||||
 | 
			
		||||
This fixes hang on Tegra20 (Acer A500) and Tegra30 (Nexus 7) devices which
 | 
			
		||||
are using BCM4329 and BCM4330 WiFi chips respectively.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 10 +++++-----
 | 
			
		||||
 .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.h    |  1 -
 | 
			
		||||
 2 files changed, 5 insertions(+), 6 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | 
			
		||||
@@ -120,7 +120,7 @@ int brcmf_sdiod_intr_register(struct brc
 | 
			
		||||
 			brcmf_err("enable_irq_wake failed %d\n", ret);
 | 
			
		||||
 			return ret;
 | 
			
		||||
 		}
 | 
			
		||||
-		sdiodev->irq_wake = true;
 | 
			
		||||
+		disable_irq_wake(pdata->oob_irq_nr);
 | 
			
		||||
 
 | 
			
		||||
 		sdio_claim_host(sdiodev->func1);
 | 
			
		||||
 
 | 
			
		||||
@@ -179,10 +179,6 @@ void brcmf_sdiod_intr_unregister(struct
 | 
			
		||||
 		sdio_release_host(sdiodev->func1);
 | 
			
		||||
 
 | 
			
		||||
 		sdiodev->oob_irq_requested = false;
 | 
			
		||||
-		if (sdiodev->irq_wake) {
 | 
			
		||||
-			disable_irq_wake(pdata->oob_irq_nr);
 | 
			
		||||
-			sdiodev->irq_wake = false;
 | 
			
		||||
-		}
 | 
			
		||||
 		free_irq(pdata->oob_irq_nr, &sdiodev->func1->dev);
 | 
			
		||||
 		sdiodev->irq_en = false;
 | 
			
		||||
 		sdiodev->oob_irq_requested = false;
 | 
			
		||||
@@ -1173,6 +1169,10 @@ static int brcmf_ops_sdio_resume(struct
 | 
			
		||||
 		if (ret)
 | 
			
		||||
 			brcmf_err("Failed to probe device on resume\n");
 | 
			
		||||
 	} else {
 | 
			
		||||
+		if (sdiodev->wowl_enabled &&
 | 
			
		||||
+		    sdiodev->settings->bus.sdio.oob_irq_supported)
 | 
			
		||||
+			disable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
 | 
			
		||||
+
 | 
			
		||||
 		brcmf_sdiod_freezer_off(sdiodev);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | 
			
		||||
@@ -178,7 +178,6 @@ struct brcmf_sdio_dev {
 | 
			
		||||
 	bool sd_irq_requested;
 | 
			
		||||
 	bool irq_en;			/* irq enable flags */
 | 
			
		||||
 	spinlock_t irq_en_lock;
 | 
			
		||||
-	bool irq_wake;			/* irq wake enable flags */
 | 
			
		||||
 	bool sg_support;
 | 
			
		||||
 	uint max_request_size;
 | 
			
		||||
 	ushort max_segment_count;
 | 
			
		||||
@@ -1,27 +0,0 @@
 | 
			
		||||
From b92c017deda819e45a0f054f6df6b53e645d7fe4 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: zhengbin <zhengbin13@huawei.com>
 | 
			
		||||
Date: Tue, 24 Dec 2019 22:16:06 +0800
 | 
			
		||||
Subject: [PATCH] brcmfmac: use true,false for bool variable
 | 
			
		||||
 | 
			
		||||
Fixes coccicheck warning:
 | 
			
		||||
 | 
			
		||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c:911:2-24: WARNING: Assignment of 0/1 to bool variable
 | 
			
		||||
 | 
			
		||||
Reported-by: Hulk Robot <hulkci@huawei.com>
 | 
			
		||||
Signed-off-by: zhengbin <zhengbin13@huawei.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 2 +-
 | 
			
		||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
 | 
			
		||||
@@ -908,7 +908,7 @@ static u8 brcmf_fws_hdrpush(struct brcmf
 | 
			
		||||
 	wlh += wlh[1] + 2;
 | 
			
		||||
 
 | 
			
		||||
 	if (entry->send_tim_signal) {
 | 
			
		||||
-		entry->send_tim_signal = 0;
 | 
			
		||||
+		entry->send_tim_signal = false;
 | 
			
		||||
 		wlh[0] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP;
 | 
			
		||||
 		wlh[1] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP_LEN;
 | 
			
		||||
 		wlh[2] = entry->mac_handle;
 | 
			
		||||
@@ -1,103 +0,0 @@
 | 
			
		||||
From 24332f8068ff6df7f16aefee45d514de1de4de80 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
 | 
			
		||||
Date: Thu, 26 Dec 2019 14:30:49 +0100
 | 
			
		||||
Subject: [PATCH] brcmfmac: simplify building interface combinations
 | 
			
		||||
MIME-Version: 1.0
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
Content-Transfer-Encoding: 8bit
 | 
			
		||||
 | 
			
		||||
Move similar/duplicated code out of combination specific code blocks.
 | 
			
		||||
This simplifies code a bit and allows adding more combinations later.
 | 
			
		||||
A list of combinations remains unchanged.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/cfg80211.c    | 43 ++++++-------------
 | 
			
		||||
 1 file changed, 14 insertions(+), 29 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -6547,12 +6547,13 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 	struct ieee80211_iface_limit *c0_limits = NULL;
 | 
			
		||||
 	struct ieee80211_iface_limit *p2p_limits = NULL;
 | 
			
		||||
 	struct ieee80211_iface_limit *mbss_limits = NULL;
 | 
			
		||||
-	bool mbss, p2p, rsdb;
 | 
			
		||||
+	bool mbss, p2p, rsdb, mchan;
 | 
			
		||||
 	int i, c, n_combos;
 | 
			
		||||
 
 | 
			
		||||
 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
 | 
			
		||||
 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
 | 
			
		||||
 	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
 | 
			
		||||
+	mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
 | 
			
		||||
 
 | 
			
		||||
 	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
 | 
			
		||||
 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
 | 
			
		||||
@@ -6562,6 +6563,10 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
 | 
			
		||||
 				 BIT(NL80211_IFTYPE_ADHOC) |
 | 
			
		||||
 				 BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
+	if (p2p)
 | 
			
		||||
+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
+					  BIT(NL80211_IFTYPE_P2P_GO) |
 | 
			
		||||
+					  BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
 
 | 
			
		||||
 	c = 0;
 | 
			
		||||
 	i = 0;
 | 
			
		||||
@@ -6573,48 +6578,28 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 		c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
 	if (!c0_limits)
 | 
			
		||||
 		goto err;
 | 
			
		||||
-	if (p2p && rsdb) {
 | 
			
		||||
-		combo[c].num_different_channels = 2;
 | 
			
		||||
-		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
-					  BIT(NL80211_IFTYPE_P2P_GO) |
 | 
			
		||||
-					  BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
-		c0_limits[i].max = 2;
 | 
			
		||||
-		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
+
 | 
			
		||||
+	combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
 | 
			
		||||
+	c0_limits[i].max = 1 + rsdb;
 | 
			
		||||
+	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
+	if (p2p) {
 | 
			
		||||
 		c0_limits[i].max = 1;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
-		c0_limits[i].max = 2;
 | 
			
		||||
+		c0_limits[i].max = 1 + rsdb;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
 				       BIT(NL80211_IFTYPE_P2P_GO);
 | 
			
		||||
+	}
 | 
			
		||||
+	if (p2p && rsdb) {
 | 
			
		||||
 		c0_limits[i].max = 2;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
 		combo[c].max_interfaces = 5;
 | 
			
		||||
 	} else if (p2p) {
 | 
			
		||||
-		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
 | 
			
		||||
-			combo[c].num_different_channels = 2;
 | 
			
		||||
-		else
 | 
			
		||||
-			combo[c].num_different_channels = 1;
 | 
			
		||||
-		c0_limits[i].max = 1;
 | 
			
		||||
-		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
-		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
-					  BIT(NL80211_IFTYPE_P2P_GO) |
 | 
			
		||||
-					  BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
-		c0_limits[i].max = 1;
 | 
			
		||||
-		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
-		c0_limits[i].max = 1;
 | 
			
		||||
-		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
-				       BIT(NL80211_IFTYPE_P2P_GO);
 | 
			
		||||
 		combo[c].max_interfaces = i;
 | 
			
		||||
 	} else if (rsdb) {
 | 
			
		||||
-		combo[c].num_different_channels = 2;
 | 
			
		||||
-		c0_limits[i].max = 2;
 | 
			
		||||
-		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
 		c0_limits[i].max = 2;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
 		combo[c].max_interfaces = 3;
 | 
			
		||||
 	} else {
 | 
			
		||||
-		combo[c].num_different_channels = 1;
 | 
			
		||||
-		c0_limits[i].max = 1;
 | 
			
		||||
-		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
 		c0_limits[i].max = 1;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
 		combo[c].max_interfaces = i;
 | 
			
		||||
@@ -1,345 +0,0 @@
 | 
			
		||||
From 20f2c5fa3af060401c72e444999470a4cab641cf Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
 | 
			
		||||
Date: Thu, 26 Dec 2019 14:30:50 +0100
 | 
			
		||||
Subject: [PATCH] brcmfmac: add initial support for monitor mode
 | 
			
		||||
MIME-Version: 1.0
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
Content-Transfer-Encoding: 8bit
 | 
			
		||||
 | 
			
		||||
Report monitor interface availability using cfg80211 and support it in
 | 
			
		||||
the add_virtual_intf() and del_virtual_intf() callbacks. This new
 | 
			
		||||
feature is conditional and depends on firmware flagging monitor packets.
 | 
			
		||||
Receiving monitor frames is already handled by the brcmf_netif_mon_rx().
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/cfg80211.c    | 112 ++++++++++++++++--
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/core.c        |  68 ++++++++++-
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/core.h        |   2 +
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/feature.c     |   1 +
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/feature.h     |   2 +
 | 
			
		||||
 .../broadcom/brcm80211/brcmfmac/fwil.h        |   2 +
 | 
			
		||||
 6 files changed, 174 insertions(+), 13 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -11,6 +11,7 @@
 | 
			
		||||
 #include <linux/vmalloc.h>
 | 
			
		||||
 #include <net/cfg80211.h>
 | 
			
		||||
 #include <net/netlink.h>
 | 
			
		||||
+#include <uapi/linux/if_arp.h>
 | 
			
		||||
 
 | 
			
		||||
 #include <brcmu_utils.h>
 | 
			
		||||
 #include <defs.h>
 | 
			
		||||
@@ -619,6 +620,82 @@ static bool brcmf_is_ibssmode(struct brc
 | 
			
		||||
 	return vif->wdev.iftype == NL80211_IFTYPE_ADHOC;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+/**
 | 
			
		||||
+ * brcmf_mon_add_vif() - create monitor mode virtual interface
 | 
			
		||||
+ *
 | 
			
		||||
+ * @wiphy: wiphy device of new interface.
 | 
			
		||||
+ * @name: name of the new interface.
 | 
			
		||||
+ */
 | 
			
		||||
+static struct wireless_dev *brcmf_mon_add_vif(struct wiphy *wiphy,
 | 
			
		||||
+					      const char *name)
 | 
			
		||||
+{
 | 
			
		||||
+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | 
			
		||||
+	struct brcmf_cfg80211_vif *vif;
 | 
			
		||||
+	struct net_device *ndev;
 | 
			
		||||
+	struct brcmf_if *ifp;
 | 
			
		||||
+	int err;
 | 
			
		||||
+
 | 
			
		||||
+	if (cfg->pub->mon_if) {
 | 
			
		||||
+		err = -EEXIST;
 | 
			
		||||
+		goto err_out;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_MONITOR);
 | 
			
		||||
+	if (IS_ERR(vif)) {
 | 
			
		||||
+		err = PTR_ERR(vif);
 | 
			
		||||
+		goto err_out;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN, ether_setup);
 | 
			
		||||
+	if (!ndev) {
 | 
			
		||||
+		err = -ENOMEM;
 | 
			
		||||
+		goto err_free_vif;
 | 
			
		||||
+	}
 | 
			
		||||
+	ndev->type = ARPHRD_IEEE80211_RADIOTAP;
 | 
			
		||||
+	ndev->ieee80211_ptr = &vif->wdev;
 | 
			
		||||
+	ndev->needs_free_netdev = true;
 | 
			
		||||
+	ndev->priv_destructor = brcmf_cfg80211_free_netdev;
 | 
			
		||||
+	SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
 | 
			
		||||
+
 | 
			
		||||
+	ifp = netdev_priv(ndev);
 | 
			
		||||
+	ifp->vif = vif;
 | 
			
		||||
+	ifp->ndev = ndev;
 | 
			
		||||
+	ifp->drvr = cfg->pub;
 | 
			
		||||
+
 | 
			
		||||
+	vif->ifp = ifp;
 | 
			
		||||
+	vif->wdev.netdev = ndev;
 | 
			
		||||
+
 | 
			
		||||
+	err = brcmf_net_mon_attach(ifp);
 | 
			
		||||
+	if (err) {
 | 
			
		||||
+		brcmf_err("Failed to attach %s device\n", ndev->name);
 | 
			
		||||
+		free_netdev(ndev);
 | 
			
		||||
+		goto err_free_vif;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	cfg->pub->mon_if = ifp;
 | 
			
		||||
+
 | 
			
		||||
+	return &vif->wdev;
 | 
			
		||||
+
 | 
			
		||||
+err_free_vif:
 | 
			
		||||
+	brcmf_free_vif(vif);
 | 
			
		||||
+err_out:
 | 
			
		||||
+	return ERR_PTR(err);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
 | 
			
		||||
+{
 | 
			
		||||
+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | 
			
		||||
+	struct net_device *ndev = wdev->netdev;
 | 
			
		||||
+
 | 
			
		||||
+	ndev->netdev_ops->ndo_stop(ndev);
 | 
			
		||||
+
 | 
			
		||||
+	brcmf_net_detach(ndev, true);
 | 
			
		||||
+
 | 
			
		||||
+	cfg->pub->mon_if = NULL;
 | 
			
		||||
+
 | 
			
		||||
+	return 0;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
 | 
			
		||||
 						     const char *name,
 | 
			
		||||
 						     unsigned char name_assign_type,
 | 
			
		||||
@@ -641,9 +718,10 @@ static struct wireless_dev *brcmf_cfg802
 | 
			
		||||
 	case NL80211_IFTYPE_STATION:
 | 
			
		||||
 	case NL80211_IFTYPE_AP_VLAN:
 | 
			
		||||
 	case NL80211_IFTYPE_WDS:
 | 
			
		||||
-	case NL80211_IFTYPE_MONITOR:
 | 
			
		||||
 	case NL80211_IFTYPE_MESH_POINT:
 | 
			
		||||
 		return ERR_PTR(-EOPNOTSUPP);
 | 
			
		||||
+	case NL80211_IFTYPE_MONITOR:
 | 
			
		||||
+		return brcmf_mon_add_vif(wiphy, name);
 | 
			
		||||
 	case NL80211_IFTYPE_AP:
 | 
			
		||||
 		wdev = brcmf_ap_add_vif(wiphy, name, params);
 | 
			
		||||
 		break;
 | 
			
		||||
@@ -826,9 +904,10 @@ int brcmf_cfg80211_del_iface(struct wiph
 | 
			
		||||
 	case NL80211_IFTYPE_STATION:
 | 
			
		||||
 	case NL80211_IFTYPE_AP_VLAN:
 | 
			
		||||
 	case NL80211_IFTYPE_WDS:
 | 
			
		||||
-	case NL80211_IFTYPE_MONITOR:
 | 
			
		||||
 	case NL80211_IFTYPE_MESH_POINT:
 | 
			
		||||
 		return -EOPNOTSUPP;
 | 
			
		||||
+	case NL80211_IFTYPE_MONITOR:
 | 
			
		||||
+		return brcmf_mon_del_vif(wiphy, wdev);
 | 
			
		||||
 	case NL80211_IFTYPE_AP:
 | 
			
		||||
 		return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
 | 
			
		||||
 	case NL80211_IFTYPE_P2P_CLIENT:
 | 
			
		||||
@@ -6547,9 +6626,10 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 	struct ieee80211_iface_limit *c0_limits = NULL;
 | 
			
		||||
 	struct ieee80211_iface_limit *p2p_limits = NULL;
 | 
			
		||||
 	struct ieee80211_iface_limit *mbss_limits = NULL;
 | 
			
		||||
-	bool mbss, p2p, rsdb, mchan;
 | 
			
		||||
-	int i, c, n_combos;
 | 
			
		||||
+	bool mon_flag, mbss, p2p, rsdb, mchan;
 | 
			
		||||
+	int i, c, n_combos, n_limits;
 | 
			
		||||
 
 | 
			
		||||
+	mon_flag = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FLAG);
 | 
			
		||||
 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
 | 
			
		||||
 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
 | 
			
		||||
 	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
 | 
			
		||||
@@ -6563,6 +6643,8 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
 | 
			
		||||
 				 BIT(NL80211_IFTYPE_ADHOC) |
 | 
			
		||||
 				 BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
+	if (mon_flag)
 | 
			
		||||
+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
 | 
			
		||||
 	if (p2p)
 | 
			
		||||
 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
 | 
			
		||||
 					  BIT(NL80211_IFTYPE_P2P_GO) |
 | 
			
		||||
@@ -6570,18 +6652,18 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 
 | 
			
		||||
 	c = 0;
 | 
			
		||||
 	i = 0;
 | 
			
		||||
-	if (p2p && rsdb)
 | 
			
		||||
-		c0_limits = kcalloc(4, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
-	else if (p2p)
 | 
			
		||||
-		c0_limits = kcalloc(3, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
-	else
 | 
			
		||||
-		c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
+	n_limits = 1 + mon_flag + (p2p ? 2 : 0) + (rsdb || !p2p);
 | 
			
		||||
+	c0_limits = kcalloc(n_limits, sizeof(*c0_limits), GFP_KERNEL);
 | 
			
		||||
 	if (!c0_limits)
 | 
			
		||||
 		goto err;
 | 
			
		||||
 
 | 
			
		||||
 	combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
 | 
			
		||||
 	c0_limits[i].max = 1 + rsdb;
 | 
			
		||||
 	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
 | 
			
		||||
+	if (mon_flag) {
 | 
			
		||||
+		c0_limits[i].max = 1;
 | 
			
		||||
+		c0_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
 | 
			
		||||
+	}
 | 
			
		||||
 	if (p2p) {
 | 
			
		||||
 		c0_limits[i].max = 1;
 | 
			
		||||
 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
 | 
			
		||||
@@ -6630,14 +6712,20 @@ static int brcmf_setup_ifmodes(struct wi
 | 
			
		||||
 	if (mbss) {
 | 
			
		||||
 		c++;
 | 
			
		||||
 		i = 0;
 | 
			
		||||
-		mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
 | 
			
		||||
+		n_limits = 1 + mon_flag;
 | 
			
		||||
+		mbss_limits = kcalloc(n_limits, sizeof(*mbss_limits),
 | 
			
		||||
+				      GFP_KERNEL);
 | 
			
		||||
 		if (!mbss_limits)
 | 
			
		||||
 			goto err;
 | 
			
		||||
 		mbss_limits[i].max = 4;
 | 
			
		||||
 		mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
 | 
			
		||||
+		if (mon_flag) {
 | 
			
		||||
+			mbss_limits[i].max = 1;
 | 
			
		||||
+			mbss_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
 | 
			
		||||
+		}
 | 
			
		||||
 		combo[c].beacon_int_infra_match = true;
 | 
			
		||||
 		combo[c].num_different_channels = 1;
 | 
			
		||||
-		combo[c].max_interfaces = 4;
 | 
			
		||||
+		combo[c].max_interfaces = 4 + mon_flag;
 | 
			
		||||
 		combo[c].n_limits = i;
 | 
			
		||||
 		combo[c].limits = mbss_limits;
 | 
			
		||||
 	}
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | 
			
		||||
@@ -690,7 +690,7 @@ fail:
 | 
			
		||||
 	return -EBADE;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
 | 
			
		||||
+void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
 | 
			
		||||
 {
 | 
			
		||||
 	if (ndev->reg_state == NETREG_REGISTERED) {
 | 
			
		||||
 		if (rtnl_locked)
 | 
			
		||||
@@ -703,6 +703,72 @@ static void brcmf_net_detach(struct net_
 | 
			
		||||
 	}
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+static int brcmf_net_mon_open(struct net_device *ndev)
 | 
			
		||||
+{
 | 
			
		||||
+	struct brcmf_if *ifp = netdev_priv(ndev);
 | 
			
		||||
+	struct brcmf_pub *drvr = ifp->drvr;
 | 
			
		||||
+	u32 monitor;
 | 
			
		||||
+	int err;
 | 
			
		||||
+
 | 
			
		||||
+	brcmf_dbg(TRACE, "Enter\n");
 | 
			
		||||
+
 | 
			
		||||
+	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_MONITOR, &monitor);
 | 
			
		||||
+	if (err) {
 | 
			
		||||
+		bphy_err(drvr, "BRCMF_C_GET_MONITOR error (%d)\n", err);
 | 
			
		||||
+		return err;
 | 
			
		||||
+	} else if (monitor) {
 | 
			
		||||
+		bphy_err(drvr, "Monitor mode is already enabled\n");
 | 
			
		||||
+		return -EEXIST;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
+	monitor = 3;
 | 
			
		||||
+	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
 | 
			
		||||
+	if (err)
 | 
			
		||||
+		bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
 | 
			
		||||
+
 | 
			
		||||
+	return err;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static int brcmf_net_mon_stop(struct net_device *ndev)
 | 
			
		||||
+{
 | 
			
		||||
+	struct brcmf_if *ifp = netdev_priv(ndev);
 | 
			
		||||
+	struct brcmf_pub *drvr = ifp->drvr;
 | 
			
		||||
+	u32 monitor;
 | 
			
		||||
+	int err;
 | 
			
		||||
+
 | 
			
		||||
+	brcmf_dbg(TRACE, "Enter\n");
 | 
			
		||||
+
 | 
			
		||||
+	monitor = 0;
 | 
			
		||||
+	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
 | 
			
		||||
+	if (err)
 | 
			
		||||
+		bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
 | 
			
		||||
+
 | 
			
		||||
+	return err;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+static const struct net_device_ops brcmf_netdev_ops_mon = {
 | 
			
		||||
+	.ndo_open = brcmf_net_mon_open,
 | 
			
		||||
+	.ndo_stop = brcmf_net_mon_stop,
 | 
			
		||||
+};
 | 
			
		||||
+
 | 
			
		||||
+int brcmf_net_mon_attach(struct brcmf_if *ifp)
 | 
			
		||||
+{
 | 
			
		||||
+	struct brcmf_pub *drvr = ifp->drvr;
 | 
			
		||||
+	struct net_device *ndev;
 | 
			
		||||
+	int err;
 | 
			
		||||
+
 | 
			
		||||
+	brcmf_dbg(TRACE, "Enter\n");
 | 
			
		||||
+
 | 
			
		||||
+	ndev = ifp->ndev;
 | 
			
		||||
+	ndev->netdev_ops = &brcmf_netdev_ops_mon;
 | 
			
		||||
+
 | 
			
		||||
+	err = register_netdevice(ndev);
 | 
			
		||||
+	if (err)
 | 
			
		||||
+		bphy_err(drvr, "Failed to register %s device\n", ndev->name);
 | 
			
		||||
+
 | 
			
		||||
+	return err;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
 | 
			
		||||
 {
 | 
			
		||||
 	struct net_device *ndev;
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | 
			
		||||
@@ -210,6 +210,8 @@ void brcmf_txflowblock_if(struct brcmf_i
 | 
			
		||||
 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
 | 
			
		||||
 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
 | 
			
		||||
 void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
 | 
			
		||||
+void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked);
 | 
			
		||||
+int brcmf_net_mon_attach(struct brcmf_if *ifp);
 | 
			
		||||
 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
 | 
			
		||||
 int __init brcmf_core_init(void);
 | 
			
		||||
 void __exit brcmf_core_exit(void);
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | 
			
		||||
@@ -38,6 +38,7 @@ static const struct brcmf_feat_fwcap brc
 | 
			
		||||
 	{ BRCMF_FEAT_MCHAN, "mchan" },
 | 
			
		||||
 	{ BRCMF_FEAT_P2P, "p2p" },
 | 
			
		||||
 	{ BRCMF_FEAT_MONITOR, "monitor" },
 | 
			
		||||
+	{ BRCMF_FEAT_MONITOR_FLAG, "rtap" },
 | 
			
		||||
 	{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
 | 
			
		||||
 	{ BRCMF_FEAT_DOT11H, "802.11h" },
 | 
			
		||||
 	{ BRCMF_FEAT_SAE, "sae" },
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
 | 
			
		||||
@@ -23,6 +23,7 @@
 | 
			
		||||
  * GSCAN: enhanced scan offload feature.
 | 
			
		||||
  * FWSUP: Firmware supplicant.
 | 
			
		||||
  * MONITOR: firmware can pass monitor packets to host.
 | 
			
		||||
+ * MONITOR_FLAG: firmware flags monitor packets.
 | 
			
		||||
  * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
 | 
			
		||||
  * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
 | 
			
		||||
  * DOT11H: firmware supports 802.11h
 | 
			
		||||
@@ -44,6 +45,7 @@
 | 
			
		||||
 	BRCMF_FEAT_DEF(GSCAN) \
 | 
			
		||||
 	BRCMF_FEAT_DEF(FWSUP) \
 | 
			
		||||
 	BRCMF_FEAT_DEF(MONITOR) \
 | 
			
		||||
+	BRCMF_FEAT_DEF(MONITOR_FLAG) \
 | 
			
		||||
 	BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
 | 
			
		||||
 	BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
 | 
			
		||||
 	BRCMF_FEAT_DEF(DOT11H) \
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
 | 
			
		||||
@@ -49,6 +49,8 @@
 | 
			
		||||
 #define BRCMF_C_GET_PM				85
 | 
			
		||||
 #define BRCMF_C_SET_PM				86
 | 
			
		||||
 #define BRCMF_C_GET_REVINFO			98
 | 
			
		||||
+#define BRCMF_C_GET_MONITOR			107
 | 
			
		||||
+#define BRCMF_C_SET_MONITOR			108
 | 
			
		||||
 #define BRCMF_C_GET_CURR_RATESET		114
 | 
			
		||||
 #define BRCMF_C_GET_AP				117
 | 
			
		||||
 #define BRCMF_C_SET_AP				118
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
From 627b0d094240c38393b2f2d40626c33a8fff6103 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: yuehaibing <yuehaibing@huawei.com>
 | 
			
		||||
Date: Wed, 8 Jan 2020 21:57:48 +0800
 | 
			
		||||
Subject: [PATCH] brcmfmac: Remove always false 'idx < 0' statement
 | 
			
		||||
 | 
			
		||||
idx is declared as u32, it will never less than 0.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: yuehaibing <yuehaibing@huawei.com>
 | 
			
		||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 2 +-
 | 
			
		||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
 | 
			
		||||
@@ -365,7 +365,7 @@ brcmf_msgbuf_get_pktid(struct device *de
 | 
			
		||||
 	struct brcmf_msgbuf_pktid *pktid;
 | 
			
		||||
 	struct sk_buff *skb;
 | 
			
		||||
 
 | 
			
		||||
-	if (idx < 0 || idx >= pktids->array_size) {
 | 
			
		||||
+	if (idx >= pktids->array_size) {
 | 
			
		||||
 		brcmf_err("Invalid packet id %d (max %d)\n", idx,
 | 
			
		||||
 			  pktids->array_size);
 | 
			
		||||
 		return NULL;
 | 
			
		||||
@@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -705,8 +705,36 @@ static struct wireless_dev *brcmf_cfg802
 | 
			
		||||
@@ -711,8 +711,36 @@ static struct wireless_dev *brcmf_cfg802
 | 
			
		||||
 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | 
			
		||||
 	struct brcmf_pub *drvr = cfg->pub;
 | 
			
		||||
 	struct wireless_dev *wdev;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -2936,6 +2936,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
 | 
			
		||||
@@ -2942,6 +2942,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
 | 
			
		||||
 	 * preference in cfg struct to apply this to
 | 
			
		||||
 	 * FW later while initializing the dongle
 | 
			
		||||
 	 */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | 
			
		||||
@@ -2888,6 +2888,63 @@ done:
 | 
			
		||||
@@ -2894,6 +2894,63 @@ done:
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static int
 | 
			
		||||
@@ -64,7 +64,7 @@
 | 
			
		||||
 brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
 | 
			
		||||
 			    int idx, u8 *mac, struct station_info *sinfo)
 | 
			
		||||
 {
 | 
			
		||||
@@ -2977,6 +3034,7 @@ static s32 brcmf_inform_single_bss(struc
 | 
			
		||||
@@ -2983,6 +3040,7 @@ static s32 brcmf_inform_single_bss(struc
 | 
			
		||||
 	struct brcmu_chan ch;
 | 
			
		||||
 	u16 channel;
 | 
			
		||||
 	u32 freq;
 | 
			
		||||
@@ -72,7 +72,7 @@
 | 
			
		||||
 	u16 notify_capability;
 | 
			
		||||
 	u16 notify_interval;
 | 
			
		||||
 	u8 *notify_ie;
 | 
			
		||||
@@ -3001,6 +3059,17 @@ static s32 brcmf_inform_single_bss(struc
 | 
			
		||||
@@ -3007,6 +3065,17 @@ static s32 brcmf_inform_single_bss(struc
 | 
			
		||||
 		band = NL80211_BAND_5GHZ;
 | 
			
		||||
 
 | 
			
		||||
 	freq = ieee80211_channel_to_frequency(channel, band);
 | 
			
		||||
@@ -90,7 +90,7 @@
 | 
			
		||||
 	bss_data.chan = ieee80211_get_channel(wiphy, freq);
 | 
			
		||||
 	bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
 | 
			
		||||
 	bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
 | 
			
		||||
@@ -5418,6 +5487,7 @@ static struct cfg80211_ops brcmf_cfg8021
 | 
			
		||||
@@ -5424,6 +5493,7 @@ static struct cfg80211_ops brcmf_cfg8021
 | 
			
		||||
 	.leave_ibss = brcmf_cfg80211_leave_ibss,
 | 
			
		||||
 	.get_station = brcmf_cfg80211_get_station,
 | 
			
		||||
 	.dump_station = brcmf_cfg80211_dump_station,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/local-symbols
 | 
			
		||||
+++ b/local-symbols
 | 
			
		||||
@@ -412,43 +412,6 @@ USB_SIERRA_NET=
 | 
			
		||||
@@ -416,43 +416,6 @@ USB_SIERRA_NET=
 | 
			
		||||
 USB_VL600=
 | 
			
		||||
 USB_NET_CH9200=
 | 
			
		||||
 USB_NET_AQC111=
 | 
			
		||||
@@ -192,7 +192,7 @@
 | 
			
		||||
 	select BRCMUTIL
 | 
			
		||||
--- a/Kconfig.local
 | 
			
		||||
+++ b/Kconfig.local
 | 
			
		||||
@@ -1240,117 +1240,6 @@ config BACKPORTED_USB_NET_CH9200
 | 
			
		||||
@@ -1252,117 +1252,6 @@ config BACKPORTED_USB_NET_CH9200
 | 
			
		||||
 config BACKPORTED_USB_NET_AQC111
 | 
			
		||||
 	tristate
 | 
			
		||||
 	default USB_NET_AQC111
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/local-symbols
 | 
			
		||||
+++ b/local-symbols
 | 
			
		||||
@@ -313,6 +313,7 @@ RT2X00_LIB_FIRMWARE=
 | 
			
		||||
@@ -317,6 +317,7 @@ RT2X00_LIB_FIRMWARE=
 | 
			
		||||
 RT2X00_LIB_CRYPTO=
 | 
			
		||||
 RT2X00_LIB_LEDS=
 | 
			
		||||
 RT2X00_LIB_DEBUGFS=
 | 
			
		||||
@@ -95,7 +95,7 @@
 | 
			
		||||
 /* Firmware functions */
 | 
			
		||||
 static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
 | 
			
		||||
 {
 | 
			
		||||
@@ -166,7 +153,6 @@ static const struct rt2800_ops rt2800soc
 | 
			
		||||
@@ -167,7 +154,6 @@ static const struct rt2800_ops rt2800soc
 | 
			
		||||
 	.register_multiread	= rt2x00mmio_register_multiread,
 | 
			
		||||
 	.register_multiwrite	= rt2x00mmio_register_multiwrite,
 | 
			
		||||
 	.regbusy_read		= rt2x00mmio_regbusy_read,
 | 
			
		||||
@@ -127,7 +127,7 @@
 | 
			
		||||
 	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
			
		||||
@@ -1418,6 +1418,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
 | 
			
		||||
@@ -1407,6 +1407,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
 | 
			
		||||
 	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
 | 
			
		||||
 	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
 | 
			
		||||
 
 | 
			
		||||
@@ -138,7 +138,7 @@
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * Let the driver probe the device to detect the capabilities.
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -1561,6 +1565,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
 | 
			
		||||
@@ -1550,6 +1554,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
 | 
			
		||||
 	 * Free the driver data.
 | 
			
		||||
 	 */
 | 
			
		||||
 	kfree(rt2x00dev->drv_data);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 | 
			
		||||
@@ -223,10 +223,17 @@ static int rt2800soc_probe(struct platfo
 | 
			
		||||
@@ -224,10 +224,17 @@ static int rt2800soc_probe(struct platfo
 | 
			
		||||
 	return rt2x00soc_probe(pdev, &rt2800soc_ops);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 
 | 
			
		||||
 #include "rt2x00.h"
 | 
			
		||||
 #include "rt2800lib.h"
 | 
			
		||||
@@ -9531,6 +9532,17 @@ static int rt2800_init_eeprom(struct rt2
 | 
			
		||||
@@ -9528,6 +9529,17 @@ static int rt2800_init_eeprom(struct rt2
 | 
			
		||||
 	rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
 | 
			
		||||
 	rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 | 
			
		||||
@@ -1356,7 +1356,7 @@ static inline void rt2x00lib_set_if_comb
 | 
			
		||||
@@ -1345,7 +1345,7 @@ static inline void rt2x00lib_set_if_comb
 | 
			
		||||
 	 */
 | 
			
		||||
 	if_limit = &rt2x00dev->if_limits_ap;
 | 
			
		||||
 	if_limit->max = rt2x00dev->ops->max_ap_intf;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
			
		||||
  * EEPROM LNA
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
@@ -4359,6 +4359,45 @@ static void rt2800_config_channel(struct
 | 
			
		||||
@@ -4356,6 +4356,45 @@ static void rt2800_config_channel(struct
 | 
			
		||||
 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
			
		||||
 	bbp = rt2800_bbp_read(rt2x00dev, 4);
 | 
			
		||||
 	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
 | 
			
		||||
 	rt2800_bbp_write(rt2x00dev, 4, bbp);
 | 
			
		||||
@@ -9560,7 +9599,8 @@ static int rt2800_init_eeprom(struct rt2
 | 
			
		||||
@@ -9557,7 +9596,8 @@ static int rt2800_init_eeprom(struct rt2
 | 
			
		||||
 	 */
 | 
			
		||||
 	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
 | 
			
		||||
 		if (rt2x00_get_field16(eeprom,
 | 
			
		||||
 		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
 | 
			
		||||
 		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
 | 
			
		||||
@@ -9571,6 +9611,18 @@ static int rt2800_init_eeprom(struct rt2
 | 
			
		||||
@@ -9568,6 +9608,18 @@ static int rt2800_init_eeprom(struct rt2
 | 
			
		||||
 			      &rt2x00dev->cap_flags);
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
@@ -8422,6 +8422,56 @@ static void rt2800_init_rfcsr_5592(struc
 | 
			
		||||
@@ -8419,6 +8419,56 @@ static void rt2800_init_rfcsr_5592(struc
 | 
			
		||||
 	rt2800_led_open_drain_enable(rt2x00dev);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@
 | 
			
		||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
			
		||||
 				       bool set_bw, bool is_ht40)
 | 
			
		||||
 {
 | 
			
		||||
@@ -9029,6 +9079,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
@@ -9026,6 +9076,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
			
		||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
@@ -8472,6 +8472,155 @@ static void rt2800_rf_self_txdc_cal(stru
 | 
			
		||||
@@ -8469,6 +8469,155 @@ static void rt2800_rf_self_txdc_cal(stru
 | 
			
		||||
 	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -156,7 +156,7 @@
 | 
			
		||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
			
		||||
 				       bool set_bw, bool is_ht40)
 | 
			
		||||
 {
 | 
			
		||||
@@ -9079,6 +9228,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
@@ -9076,6 +9225,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
 | 
			
		||||
 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
@@ -8621,6 +8621,70 @@ static void rt2800_r_calibration(struct
 | 
			
		||||
@@ -8618,6 +8618,70 @@ static void rt2800_r_calibration(struct
 | 
			
		||||
 	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@
 | 
			
		||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
			
		||||
 				       bool set_bw, bool is_ht40)
 | 
			
		||||
 {
 | 
			
		||||
@@ -9230,6 +9294,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
@@ -9227,6 +9291,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
 
 | 
			
		||||
 	rt2800_r_calibration(rt2x00dev);
 | 
			
		||||
 	rt2800_rf_self_txdc_cal(rt2x00dev);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
@@ -8685,6 +8685,384 @@ static void rt2800_rxdcoc_calibration(st
 | 
			
		||||
@@ -8682,6 +8682,384 @@ static void rt2800_rxdcoc_calibration(st
 | 
			
		||||
 	rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -385,7 +385,7 @@
 | 
			
		||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
			
		||||
 				       bool set_bw, bool is_ht40)
 | 
			
		||||
 {
 | 
			
		||||
@@ -9297,6 +9675,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
@@ -9294,6 +9672,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
			
		||||
 	rt2800_bw_filter_calibration(rt2x00dev, true);
 | 
			
		||||
 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
 | 
			
		||||
@@ -9063,6 +9063,943 @@ restore_value:
 | 
			
		||||
@@ -9060,6 +9060,943 @@ restore_value:
 | 
			
		||||
 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -944,7 +944,7 @@
 | 
			
		||||
 static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
 | 
			
		||||
 				       bool set_bw, bool is_ht40)
 | 
			
		||||
 {
 | 
			
		||||
@@ -9675,6 +10612,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
@@ -9672,6 +10609,7 @@ static void rt2800_init_rfcsr_6352(struc
 | 
			
		||||
 	rt2800_rxdcoc_calibration(rt2x00dev);
 | 
			
		||||
 	rt2800_bw_filter_calibration(rt2x00dev, true);
 | 
			
		||||
 	rt2800_bw_filter_calibration(rt2x00dev, false);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/net/mac80211/tx.c
 | 
			
		||||
+++ b/net/mac80211/tx.c
 | 
			
		||||
@@ -4116,6 +4116,12 @@ out:
 | 
			
		||||
@@ -4113,6 +4113,12 @@ out:
 | 
			
		||||
 netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
 | 
			
		||||
 				       struct net_device *dev)
 | 
			
		||||
 {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
 static int ieee80211_ifa6_changed(struct notifier_block *nb,
 | 
			
		||||
 				  unsigned long data, void *arg)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1272,14 +1272,14 @@ int ieee80211_register_hw(struct ieee802
 | 
			
		||||
@@ -1273,14 +1273,14 @@ int ieee80211_register_hw(struct ieee802
 | 
			
		||||
 
 | 
			
		||||
 	rtnl_unlock();
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@
 | 
			
		||||
 	local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
 | 
			
		||||
 	result = register_inet6addr_notifier(&local->ifa6_notifier);
 | 
			
		||||
 	if (result)
 | 
			
		||||
@@ -1288,13 +1288,13 @@ int ieee80211_register_hw(struct ieee802
 | 
			
		||||
@@ -1289,13 +1289,13 @@ int ieee80211_register_hw(struct ieee802
 | 
			
		||||
 
 | 
			
		||||
 	return 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@
 | 
			
		||||
  fail_ifa:
 | 
			
		||||
 #endif
 | 
			
		||||
 	wiphy_unregister(local->hw.wiphy);
 | 
			
		||||
@@ -1322,10 +1322,10 @@ void ieee80211_unregister_hw(struct ieee
 | 
			
		||||
@@ -1323,10 +1323,10 @@ void ieee80211_unregister_hw(struct ieee
 | 
			
		||||
 	tasklet_kill(&local->tx_pending_tasklet);
 | 
			
		||||
 	tasklet_kill(&local->tasklet);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,248 +0,0 @@
 | 
			
		||||
From 6cb5f3ea4654faf8c28b901266e960b1a4787b26 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Johannes Berg <johannes.berg@intel.com>
 | 
			
		||||
Date: Thu, 23 Apr 2020 11:13:49 +0200
 | 
			
		||||
Subject: [PATCH] mac80211: populate debugfs only after cfg80211 init
 | 
			
		||||
 | 
			
		||||
When fixing the initialization race, we neglected to account for
 | 
			
		||||
the fact that debugfs is initialized in wiphy_register(), and
 | 
			
		||||
some debugfs things went missing (or rather were rerooted to the
 | 
			
		||||
global debugfs root).
 | 
			
		||||
 | 
			
		||||
Fix this by adding debugfs entries only after wiphy_register().
 | 
			
		||||
This requires some changes in the rate control code since it
 | 
			
		||||
currently adds debugfs at alloc time, which can no longer be
 | 
			
		||||
done after the reordering.
 | 
			
		||||
 | 
			
		||||
Reported-by: Jouni Malinen <j@w1.fi>
 | 
			
		||||
Reported-by: kernel test robot <rong.a.chen@intel.com>
 | 
			
		||||
Reported-by: Hauke Mehrtens <hauke@hauke-m.de>
 | 
			
		||||
Reported-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
Cc: stable@vger.kernel.org
 | 
			
		||||
Fixes: 52e04b4ce5d0 ("mac80211: fix race in ieee80211_register_hw()")
 | 
			
		||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
 | 
			
		||||
Acked-by: Sumit Garg <sumit.garg@linaro.org>
 | 
			
		||||
Link: https://lore.kernel.org/r/20200423111344.0e00d3346f12.Iadc76a03a55093d94391fc672e996a458702875d@changeid
 | 
			
		||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
 | 
			
		||||
---
 | 
			
		||||
 drivers/net/wireless/intel/iwlegacy/3945-rs.c |  2 +-
 | 
			
		||||
 drivers/net/wireless/intel/iwlegacy/4965-rs.c |  2 +-
 | 
			
		||||
 drivers/net/wireless/intel/iwlwifi/dvm/rs.c   |  2 +-
 | 
			
		||||
 drivers/net/wireless/intel/iwlwifi/mvm/rs.c   |  2 +-
 | 
			
		||||
 drivers/net/wireless/realtek/rtlwifi/rc.c     |  2 +-
 | 
			
		||||
 include/net/mac80211.h                        |  4 +++-
 | 
			
		||||
 net/mac80211/main.c                           |  5 ++--
 | 
			
		||||
 net/mac80211/rate.c                           | 15 ++++--------
 | 
			
		||||
 net/mac80211/rate.h                           | 23 +++++++++++++++++++
 | 
			
		||||
 net/mac80211/rc80211_minstrel_ht.c            | 19 ++++++++++-----
 | 
			
		||||
 10 files changed, 51 insertions(+), 25 deletions(-)
 | 
			
		||||
 | 
			
		||||
--- a/drivers/net/wireless/intel/iwlegacy/3945-rs.c
 | 
			
		||||
+++ b/drivers/net/wireless/intel/iwlegacy/3945-rs.c
 | 
			
		||||
@@ -374,7 +374,7 @@ out:
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void *
 | 
			
		||||
-il3945_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 | 
			
		||||
+il3945_rs_alloc(struct ieee80211_hw *hw)
 | 
			
		||||
 {
 | 
			
		||||
 	return hw->priv;
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/wireless/intel/iwlegacy/4965-rs.c
 | 
			
		||||
+++ b/drivers/net/wireless/intel/iwlegacy/4965-rs.c
 | 
			
		||||
@@ -2474,7 +2474,7 @@ il4965_rs_fill_link_cmd(struct il_priv *
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void *
 | 
			
		||||
-il4965_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 | 
			
		||||
+il4965_rs_alloc(struct ieee80211_hw *hw)
 | 
			
		||||
 {
 | 
			
		||||
 	return hw->priv;
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
 | 
			
		||||
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
 | 
			
		||||
@@ -3019,7 +3019,7 @@ static void rs_fill_link_cmd(struct iwl_
 | 
			
		||||
 			cpu_to_le16(priv->lib->bt_params->agg_time_limit);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 | 
			
		||||
+static void *rs_alloc(struct ieee80211_hw *hw)
 | 
			
		||||
 {
 | 
			
		||||
 	return hw->priv;
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
 | 
			
		||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
 | 
			
		||||
@@ -3665,7 +3665,7 @@ static void rs_fill_lq_cmd(struct iwl_mv
 | 
			
		||||
 			cpu_to_le16(iwl_mvm_coex_agg_time_limit(mvm, sta));
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 | 
			
		||||
+static void *rs_alloc(struct ieee80211_hw *hw)
 | 
			
		||||
 {
 | 
			
		||||
 	return hw->priv;
 | 
			
		||||
 }
 | 
			
		||||
--- a/drivers/net/wireless/realtek/rtlwifi/rc.c
 | 
			
		||||
+++ b/drivers/net/wireless/realtek/rtlwifi/rc.c
 | 
			
		||||
@@ -261,7 +261,7 @@ static void rtl_rate_update(void *ppriv,
 | 
			
		||||
 {
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static void *rtl_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 | 
			
		||||
+static void *rtl_rate_alloc(struct ieee80211_hw *hw)
 | 
			
		||||
 {
 | 
			
		||||
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 | 
			
		||||
 	return rtlpriv;
 | 
			
		||||
--- a/include/net/mac80211.h
 | 
			
		||||
+++ b/include/net/mac80211.h
 | 
			
		||||
@@ -5969,7 +5969,9 @@ enum rate_control_capabilities {
 | 
			
		||||
 struct rate_control_ops {
 | 
			
		||||
 	unsigned long capa;
 | 
			
		||||
 	const char *name;
 | 
			
		||||
-	void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir);
 | 
			
		||||
+	void *(*alloc)(struct ieee80211_hw *hw);
 | 
			
		||||
+	void (*add_debugfs)(struct ieee80211_hw *hw, void *priv,
 | 
			
		||||
+			    struct dentry *debugfsdir);
 | 
			
		||||
 	void (*free)(void *priv);
 | 
			
		||||
 
 | 
			
		||||
 	void *(*alloc_sta)(void *priv, struct ieee80211_sta *sta, gfp_t gfp);
 | 
			
		||||
--- a/net/mac80211/main.c
 | 
			
		||||
+++ b/net/mac80211/main.c
 | 
			
		||||
@@ -1163,8 +1163,6 @@ int ieee80211_register_hw(struct ieee802
 | 
			
		||||
 	local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom,
 | 
			
		||||
 				   IEEE80211_TX_STATUS_HEADROOM);
 | 
			
		||||
 
 | 
			
		||||
-	debugfs_hw_add(local);
 | 
			
		||||
-
 | 
			
		||||
 	/*
 | 
			
		||||
 	 * if the driver doesn't specify a max listen interval we
 | 
			
		||||
 	 * use 5 which should be a safe default
 | 
			
		||||
@@ -1256,6 +1254,9 @@ int ieee80211_register_hw(struct ieee802
 | 
			
		||||
 	if (result < 0)
 | 
			
		||||
 		goto fail_wiphy_register;
 | 
			
		||||
 
 | 
			
		||||
+	debugfs_hw_add(local);
 | 
			
		||||
+	rate_control_add_debugfs(local);
 | 
			
		||||
+
 | 
			
		||||
 	rtnl_lock();
 | 
			
		||||
 
 | 
			
		||||
 	/* add one default STA interface if supported */
 | 
			
		||||
--- a/net/mac80211/rate.c
 | 
			
		||||
+++ b/net/mac80211/rate.c
 | 
			
		||||
@@ -214,17 +214,16 @@ static ssize_t rcname_read(struct file *
 | 
			
		||||
 				       ref->ops->name, len);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
-static const struct file_operations rcname_ops = {
 | 
			
		||||
+const struct file_operations rcname_ops = {
 | 
			
		||||
 	.read = rcname_read,
 | 
			
		||||
 	.open = simple_open,
 | 
			
		||||
 	.llseek = default_llseek,
 | 
			
		||||
 };
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
-static struct rate_control_ref *rate_control_alloc(const char *name,
 | 
			
		||||
-					    struct ieee80211_local *local)
 | 
			
		||||
+static struct rate_control_ref *
 | 
			
		||||
+rate_control_alloc(const char *name, struct ieee80211_local *local)
 | 
			
		||||
 {
 | 
			
		||||
-	struct dentry *debugfsdir = NULL;
 | 
			
		||||
 	struct rate_control_ref *ref;
 | 
			
		||||
 
 | 
			
		||||
 	ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
 | 
			
		||||
@@ -234,13 +233,7 @@ static struct rate_control_ref *rate_con
 | 
			
		||||
 	if (!ref->ops)
 | 
			
		||||
 		goto free;
 | 
			
		||||
 
 | 
			
		||||
-#ifdef CPTCFG_MAC80211_DEBUGFS
 | 
			
		||||
-	debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir);
 | 
			
		||||
-	local->debugfs.rcdir = debugfsdir;
 | 
			
		||||
-	debugfs_create_file("name", 0400, debugfsdir, ref, &rcname_ops);
 | 
			
		||||
-#endif
 | 
			
		||||
-
 | 
			
		||||
-	ref->priv = ref->ops->alloc(&local->hw, debugfsdir);
 | 
			
		||||
+	ref->priv = ref->ops->alloc(&local->hw);
 | 
			
		||||
 	if (!ref->priv)
 | 
			
		||||
 		goto free;
 | 
			
		||||
 	return ref;
 | 
			
		||||
--- a/net/mac80211/rate.h
 | 
			
		||||
+++ b/net/mac80211/rate.h
 | 
			
		||||
@@ -60,6 +60,29 @@ static inline void rate_control_add_sta_
 | 
			
		||||
 #endif
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+extern const struct file_operations rcname_ops;
 | 
			
		||||
+
 | 
			
		||||
+static inline void rate_control_add_debugfs(struct ieee80211_local *local)
 | 
			
		||||
+{
 | 
			
		||||
+#ifdef CPTCFG_MAC80211_DEBUGFS
 | 
			
		||||
+	struct dentry *debugfsdir;
 | 
			
		||||
+
 | 
			
		||||
+	if (!local->rate_ctrl)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	if (!local->rate_ctrl->ops->add_debugfs)
 | 
			
		||||
+		return;
 | 
			
		||||
+
 | 
			
		||||
+	debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir);
 | 
			
		||||
+	local->debugfs.rcdir = debugfsdir;
 | 
			
		||||
+	debugfs_create_file("name", 0400, debugfsdir,
 | 
			
		||||
+			    local->rate_ctrl, &rcname_ops);
 | 
			
		||||
+
 | 
			
		||||
+	local->rate_ctrl->ops->add_debugfs(&local->hw, local->rate_ctrl->priv,
 | 
			
		||||
+					   debugfsdir);
 | 
			
		||||
+#endif
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata);
 | 
			
		||||
 
 | 
			
		||||
 /* Get a reference to the rate control algorithm. If `name' is NULL, get the
 | 
			
		||||
--- a/net/mac80211/rc80211_minstrel_ht.c
 | 
			
		||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
 | 
			
		||||
@@ -1635,7 +1635,7 @@ minstrel_ht_init_cck_rates(struct minstr
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static void *
 | 
			
		||||
-minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 | 
			
		||||
+minstrel_ht_alloc(struct ieee80211_hw *hw)
 | 
			
		||||
 {
 | 
			
		||||
 	struct minstrel_priv *mp;
 | 
			
		||||
 
 | 
			
		||||
@@ -1673,7 +1673,17 @@ minstrel_ht_alloc(struct ieee80211_hw *h
 | 
			
		||||
 	mp->update_interval = HZ / 10;
 | 
			
		||||
 	mp->new_avg = true;
 | 
			
		||||
 
 | 
			
		||||
+	minstrel_ht_init_cck_rates(mp);
 | 
			
		||||
+
 | 
			
		||||
+	return mp;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 #ifdef CPTCFG_MAC80211_DEBUGFS
 | 
			
		||||
+static void minstrel_ht_add_debugfs(struct ieee80211_hw *hw, void *priv,
 | 
			
		||||
+				    struct dentry *debugfsdir)
 | 
			
		||||
+{
 | 
			
		||||
+	struct minstrel_priv *mp = priv;
 | 
			
		||||
+
 | 
			
		||||
 	mp->fixed_rate_idx = (u32) -1;
 | 
			
		||||
 	debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir,
 | 
			
		||||
 			   &mp->fixed_rate_idx);
 | 
			
		||||
@@ -1681,12 +1691,8 @@ minstrel_ht_alloc(struct ieee80211_hw *h
 | 
			
		||||
 			   &mp->sample_switch);
 | 
			
		||||
 	debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir,
 | 
			
		||||
 			   &mp->new_avg);
 | 
			
		||||
-#endif
 | 
			
		||||
-
 | 
			
		||||
-	minstrel_ht_init_cck_rates(mp);
 | 
			
		||||
-
 | 
			
		||||
-	return mp;
 | 
			
		||||
 }
 | 
			
		||||
+#endif
 | 
			
		||||
 
 | 
			
		||||
 static void
 | 
			
		||||
 minstrel_ht_free(void *priv)
 | 
			
		||||
@@ -1725,6 +1731,7 @@ static const struct rate_control_ops mac
 | 
			
		||||
 	.alloc = minstrel_ht_alloc,
 | 
			
		||||
 	.free = minstrel_ht_free,
 | 
			
		||||
 #ifdef CPTCFG_MAC80211_DEBUGFS
 | 
			
		||||
+	.add_debugfs = minstrel_ht_add_debugfs,
 | 
			
		||||
 	.add_sta_debugfs = minstrel_ht_add_sta_debugfs,
 | 
			
		||||
 #endif
 | 
			
		||||
 	.get_expected_throughput = minstrel_ht_get_expected_throughput,
 | 
			
		||||
		Reference in New Issue
	
	Block a user