mirror of
https://github.com/hanwckf/immortalwrt-mt798x.git
synced 2025-01-09 02:43:53 +08:00
Merge branch '2102-mac80211-515' into openwrt-21.02
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
7b5d8daf13
@ -8,14 +8,14 @@ PKG_LICENSE_FILES:=
|
||||
|
||||
PKG_SOURCE_URL:=https://github.com/greearb/ath10k-ct.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2021-09-22
|
||||
PKG_SOURCE_VERSION:=e6a7d5b5b834737cd12e357b5efdc2e42d923bf6
|
||||
PKG_MIRROR_HASH:=62a1b97089d3561730656ef73beb3cd77231ec636645115cc1bbb3c6c84a6fe3
|
||||
PKG_SOURCE_DATE:=2022-05-13
|
||||
PKG_SOURCE_VERSION:=f808496fcc6b1f68942914117aebf8b3f8d52bb3
|
||||
PKG_MIRROR_HASH:=39527b3408696594eda5579521a9fb798417be4dda73fa08e8b3a8c7b0d3f3d9
|
||||
|
||||
# Build the 5.10 ath10k-ct driver version.
|
||||
# Build the 5.15 ath10k-ct driver version.
|
||||
# Probably this should match as closely as
|
||||
# possible to whatever mac80211 backports version is being used.
|
||||
CT_KVER="-5.10"
|
||||
CT_KVER="-5.15"
|
||||
|
||||
PKG_MAINTAINER:=Ben Greear <greearb@candelatech.com>
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
@ -66,25 +66,25 @@ v13:
|
||||
|
||||
* cleanup includes
|
||||
|
||||
ath10k-5.10/Kconfig | 10 +++
|
||||
ath10k-5.10/Makefile | 1 +
|
||||
ath10k-5.10/core.c | 22 +++++++
|
||||
ath10k-5.10/core.h | 9 ++-
|
||||
ath10k-5.10/hw.h | 1 +
|
||||
ath10k-5.10/leds.c | 103 ++++++++++++++++++++++++++++++
|
||||
ath10k-5.10/leds.h | 45 +++++++++++++
|
||||
ath10k-5.10/mac.c | 1 +
|
||||
ath10k-5.10/wmi-ops.h | 32 ++++++++++
|
||||
ath10k-5.10/wmi-tlv.c | 2 +
|
||||
ath10k-5.10/wmi.c | 54 ++++++++++++++++
|
||||
ath10k-5.10/wmi.h | 35 ++++++++++
|
||||
ath10k-5.15/Kconfig | 10 +++
|
||||
ath10k-5.15/Makefile | 1 +
|
||||
ath10k-5.15/core.c | 22 +++++++
|
||||
ath10k-5.15/core.h | 9 ++-
|
||||
ath10k-5.15/hw.h | 1 +
|
||||
ath10k-5.15/leds.c | 103 ++++++++++++++++++++++++++++++
|
||||
ath10k-5.15/leds.h | 45 +++++++++++++
|
||||
ath10k-5.15/mac.c | 1 +
|
||||
ath10k-5.15/wmi-ops.h | 32 ++++++++++
|
||||
ath10k-5.15/wmi-tlv.c | 2 +
|
||||
ath10k-5.15/wmi.c | 54 ++++++++++++++++
|
||||
ath10k-5.15/wmi.h | 35 ++++++++++
|
||||
12 files changed, 314 insertions(+), 1 deletion(-)
|
||||
create mode 100644 ath10k-5.10/leds.c
|
||||
create mode 100644 ath10k-5.10/leds.h
|
||||
create mode 100644 ath10k-5.15/leds.c
|
||||
create mode 100644 ath10k-5.15/leds.h
|
||||
|
||||
--- a/ath10k-5.10/Kconfig
|
||||
+++ b/ath10k-5.10/Kconfig
|
||||
@@ -65,6 +65,16 @@ config ATH10K_DEBUGFS
|
||||
--- a/ath10k-5.15/Kconfig
|
||||
+++ b/ath10k-5.15/Kconfig
|
||||
@@ -66,6 +66,16 @@ config ATH10K_DEBUGFS
|
||||
|
||||
If unsure, say Y to make it easier to debug problems.
|
||||
|
||||
@ -101,8 +101,8 @@ v13:
|
||||
config ATH10K_SPECTRAL
|
||||
bool "Atheros ath10k spectral scan support"
|
||||
depends on ATH10K_DEBUGFS
|
||||
--- a/ath10k-5.10/Makefile
|
||||
+++ b/ath10k-5.10/Makefile
|
||||
--- a/ath10k-5.15/Makefile
|
||||
+++ b/ath10k-5.15/Makefile
|
||||
@@ -20,6 +20,7 @@ ath10k_core-$(CONFIG_ATH10K_SPECTRAL) +=
|
||||
ath10k_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||
ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o
|
||||
@ -111,9 +111,9 @@ v13:
|
||||
ath10k_core-$(CONFIG_MAC80211_DEBUGFS) += debugfs_sta.o
|
||||
ath10k_core-$(CONFIG_PM) += wow.o
|
||||
ath10k_core-$(CONFIG_ATH10K_CE) += ce.o
|
||||
--- a/ath10k-5.10/core.c
|
||||
+++ b/ath10k-5.10/core.c
|
||||
@@ -26,6 +26,7 @@
|
||||
--- a/ath10k-5.15/core.c
|
||||
+++ b/ath10k-5.15/core.c
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "testmode.h"
|
||||
#include "wmi-ops.h"
|
||||
#include "coredump.h"
|
||||
@ -121,7 +121,7 @@ v13:
|
||||
|
||||
/* Disable ath10k-ct DBGLOG output by default */
|
||||
unsigned int ath10k_debug_mask = ATH10K_DBG_NO_DBGLOG;
|
||||
@@ -68,6 +69,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -70,6 +71,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA988X_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca988x hw2.0",
|
||||
@ -129,7 +129,7 @@ v13:
|
||||
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -137,6 +139,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -143,6 +145,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9887_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9887 hw1.0",
|
||||
@ -137,7 +137,7 @@ v13:
|
||||
.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -342,6 +345,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -360,6 +363,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA99X0_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca99x0 hw2.0",
|
||||
@ -145,7 +145,7 @@ v13:
|
||||
.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.otp_exe_param = 0x00000700,
|
||||
@@ -382,6 +386,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -402,6 +406,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9984_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9984/qca9994 hw1.0",
|
||||
@ -153,7 +153,7 @@ v13:
|
||||
.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -429,6 +434,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -451,6 +456,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9888_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9888 hw2.0",
|
||||
@ -161,7 +161,7 @@ v13:
|
||||
.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -3705,6 +3711,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
@@ -3977,6 +3983,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
ath10k_wmi_check_apply_board_power_ctl_table(ar);
|
||||
}
|
||||
|
||||
@ -172,7 +172,7 @@ v13:
|
||||
return 0;
|
||||
|
||||
err_hif_stop:
|
||||
@@ -3963,9 +3973,18 @@ static void ath10k_core_register_work(st
|
||||
@@ -4238,9 +4248,18 @@ static void ath10k_core_register_work(st
|
||||
goto err_spectral_destroy;
|
||||
}
|
||||
|
||||
@ -191,7 +191,7 @@ v13:
|
||||
err_spectral_destroy:
|
||||
ath10k_spectral_destroy(ar);
|
||||
err_debug_destroy:
|
||||
@@ -4025,6 +4044,8 @@ void ath10k_core_unregister(struct ath10
|
||||
@@ -4300,6 +4319,8 @@ void ath10k_core_unregister(struct ath10
|
||||
if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
|
||||
return;
|
||||
|
||||
@ -200,8 +200,8 @@ v13:
|
||||
ath10k_thermal_unregister(ar);
|
||||
/* Stop spectral before unregistering from mac80211 to remove the
|
||||
* relayfs debugfs file cleanly. Otherwise the parent debugfs tree
|
||||
--- a/ath10k-5.10/core.h
|
||||
+++ b/ath10k-5.10/core.h
|
||||
--- a/ath10k-5.15/core.h
|
||||
+++ b/ath10k-5.15/core.h
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/uuid.h>
|
||||
@ -210,7 +210,7 @@ v13:
|
||||
|
||||
#include "htt.h"
|
||||
#include "htc.h"
|
||||
@@ -1557,6 +1558,13 @@ struct ath10k {
|
||||
@@ -1577,6 +1578,13 @@ struct ath10k {
|
||||
} testmode;
|
||||
|
||||
struct {
|
||||
@ -224,8 +224,8 @@ v13:
|
||||
/* protected by data_lock */
|
||||
u32 rx_crc_err_drop;
|
||||
u32 fw_crash_counter;
|
||||
--- a/ath10k-5.10/hw.h
|
||||
+++ b/ath10k-5.10/hw.h
|
||||
--- a/ath10k-5.15/hw.h
|
||||
+++ b/ath10k-5.15/hw.h
|
||||
@@ -521,6 +521,7 @@ struct ath10k_hw_params {
|
||||
const char *name;
|
||||
u32 patch_load_addr;
|
||||
@ -235,7 +235,7 @@ v13:
|
||||
|
||||
/* Type of hw cycle counter wraparound logic, for more info
|
||||
--- /dev/null
|
||||
+++ b/ath10k-5.10/leds.c
|
||||
+++ b/ath10k-5.15/leds.c
|
||||
@@ -0,0 +1,103 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
@ -341,7 +341,7 @@ v13:
|
||||
+}
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/ath10k-5.10/leds.h
|
||||
+++ b/ath10k-5.15/leds.h
|
||||
@@ -0,0 +1,41 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
@ -384,8 +384,8 @@ v13:
|
||||
+
|
||||
+#endif
|
||||
+#endif /* _LEDS_H_ */
|
||||
--- a/ath10k-5.10/mac.c
|
||||
+++ b/ath10k-5.10/mac.c
|
||||
--- a/ath10k-5.15/mac.c
|
||||
+++ b/ath10k-5.15/mac.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "wmi-tlv.h"
|
||||
#include "wmi-ops.h"
|
||||
@ -394,8 +394,8 @@ v13:
|
||||
|
||||
/*********/
|
||||
/* Rates */
|
||||
--- a/ath10k-5.10/wmi-ops.h
|
||||
+++ b/ath10k-5.10/wmi-ops.h
|
||||
--- a/ath10k-5.15/wmi-ops.h
|
||||
+++ b/ath10k-5.15/wmi-ops.h
|
||||
@@ -228,7 +228,10 @@ struct wmi_ops {
|
||||
const struct wmi_bb_timing_cfg_arg *arg);
|
||||
struct sk_buff *(*gen_per_peer_per_tid_cfg)(struct ath10k *ar,
|
||||
@ -443,8 +443,8 @@ v13:
|
||||
static inline int
|
||||
ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level)
|
||||
{
|
||||
--- a/ath10k-5.10/wmi-tlv.c
|
||||
+++ b/ath10k-5.10/wmi-tlv.c
|
||||
--- a/ath10k-5.15/wmi-tlv.c
|
||||
+++ b/ath10k-5.15/wmi-tlv.c
|
||||
@@ -4594,6 +4594,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,
|
||||
@ -454,9 +454,9 @@ v13:
|
||||
};
|
||||
|
||||
static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
|
||||
--- a/ath10k-5.10/wmi.c
|
||||
+++ b/ath10k-5.10/wmi.c
|
||||
@@ -8409,6 +8409,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
|
||||
--- a/ath10k-5.15/wmi.c
|
||||
+++ b/ath10k-5.15/wmi.c
|
||||
@@ -8413,6 +8413,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
|
||||
return skb;
|
||||
}
|
||||
|
||||
@ -506,7 +506,7 @@ v13:
|
||||
static struct sk_buff *
|
||||
ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
|
||||
enum wmi_sta_ps_mode psmode)
|
||||
@@ -10238,6 +10281,9 @@ static const struct wmi_ops wmi_ops = {
|
||||
@@ -10244,6 +10287,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,
|
||||
@ -516,7 +516,7 @@ v13:
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -10308,6 +10354,8 @@ static const struct wmi_ops wmi_10_1_ops
|
||||
@@ -10314,6 +10360,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,
|
||||
@ -525,7 +525,7 @@ v13:
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -10387,6 +10435,8 @@ static const struct wmi_ops wmi_10_2_ops
|
||||
@@ -10393,6 +10441,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,
|
||||
@ -534,7 +534,7 @@ v13:
|
||||
/* .gen_pdev_enable_adaptive_cca not implemented */
|
||||
};
|
||||
|
||||
@@ -10458,6 +10508,8 @@ static const struct wmi_ops wmi_10_2_4_o
|
||||
@@ -10464,6 +10514,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,
|
||||
@ -543,7 +543,7 @@ v13:
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -10540,6 +10592,8 @@ static const struct wmi_ops wmi_10_4_ops
|
||||
@@ -10546,6 +10598,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,
|
||||
@ -552,8 +552,8 @@ v13:
|
||||
};
|
||||
|
||||
int ath10k_wmi_attach(struct ath10k *ar)
|
||||
--- a/ath10k-5.10/wmi.h
|
||||
+++ b/ath10k-5.10/wmi.h
|
||||
--- a/ath10k-5.15/wmi.h
|
||||
+++ b/ath10k-5.15/wmi.h
|
||||
@@ -3133,6 +3133,41 @@ enum wmi_10_4_feature_mask {
|
||||
|
||||
};
|
||||
|
@ -9,14 +9,14 @@ traffic.
|
||||
|
||||
Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
---
|
||||
ath10k-5.10/core.h | 4 ++++
|
||||
ath10k-5.10/leds.c | 4 +---
|
||||
ath10k-5.10/mac.c | 2 +-
|
||||
ath10k-5.15/core.h | 4 ++++
|
||||
ath10k-5.15/leds.c | 4 +---
|
||||
ath10k-5.15/mac.c | 2 +-
|
||||
3 files changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/ath10k-5.10/core.h
|
||||
+++ b/ath10k-5.10/core.h
|
||||
@@ -1665,6 +1665,10 @@ struct ath10k {
|
||||
--- a/ath10k-5.15/core.h
|
||||
+++ b/ath10k-5.15/core.h
|
||||
@@ -1692,6 +1692,10 @@ struct ath10k {
|
||||
u8 csi_data[4096];
|
||||
u16 csi_data_len;
|
||||
|
||||
@ -27,8 +27,8 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
/* must be last */
|
||||
u8 drv_priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
--- a/ath10k-5.10/leds.c
|
||||
+++ b/ath10k-5.10/leds.c
|
||||
--- a/ath10k-5.15/leds.c
|
||||
+++ b/ath10k-5.15/leds.c
|
||||
@@ -81,9 +81,7 @@ int ath10k_leds_register(struct ath10k *
|
||||
|
||||
ar->leds.cdev.name = ar->leds.label;
|
||||
@ -40,9 +40,9 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
|
||||
ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev);
|
||||
if (ret)
|
||||
--- a/ath10k-5.10/mac.c
|
||||
+++ b/ath10k-5.10/mac.c
|
||||
@@ -11405,7 +11405,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
--- a/ath10k-5.15/mac.c
|
||||
+++ b/ath10k-5.15/mac.c
|
||||
@@ -11544,7 +11544,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
|
@ -0,0 +1,32 @@
|
||||
From 0d2e335d780bda1432a9ba719c8200f796d27854 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Marko <robimarko@gmail.com>
|
||||
Date: Mon, 29 Nov 2021 12:27:12 +0100
|
||||
Subject: [PATCH] ath10k-ct: Fix spectral scan NULL pointer
|
||||
|
||||
If spectral scan support is enabled then ath10k-ct will cause a NULL
|
||||
pointer due to relay_open() being called with a const callback struct
|
||||
which is only supported in kernel 5.11 and later.
|
||||
|
||||
So, simply check the kernel version and if 5.11 and newer use the const
|
||||
callback struct, otherwise use the regular struct.
|
||||
|
||||
Fixes: 553a3ac ("ath10k-ct: use 5.15 version")
|
||||
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
---
|
||||
ath10k-5.15/spectral.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/ath10k-5.15/spectral.c
|
||||
+++ b/ath10k-5.15/spectral.c
|
||||
@@ -497,7 +497,11 @@ static int remove_buf_file_handler(struc
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_GEQ(5,11,0)
|
||||
static const struct rchan_callbacks rfs_spec_scan_cb = {
|
||||
+#else
|
||||
+static struct rchan_callbacks rfs_spec_scan_cb = {
|
||||
+#endif
|
||||
.create_buf_file = create_buf_file_handler,
|
||||
.remove_buf_file = remove_buf_file_handler,
|
||||
};
|
@ -1,5 +1,5 @@
|
||||
--- a/ath10k-5.10/htt.h
|
||||
+++ b/ath10k-5.10/htt.h
|
||||
--- a/ath10k-5.15/htt.h
|
||||
+++ b/ath10k-5.15/htt.h
|
||||
@@ -237,7 +237,11 @@ enum htt_rx_ring_flags {
|
||||
};
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
--- a/ath10k-5.10/pci.c
|
||||
+++ b/ath10k-5.10/pci.c
|
||||
--- a/ath10k-5.15/pci.c
|
||||
+++ b/ath10k-5.15/pci.c
|
||||
@@ -131,7 +131,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
|
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=5.10.110-1
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.110/
|
||||
PKG_HASH:=3d958154080c059adaf26512430fd1a8888d65a2228e5e70e48d028201e148b1
|
||||
PKG_VERSION:=5.15.58-1
|
||||
PKG_RELEASE:=2
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.58/
|
||||
PKG_HASH:=a3c2a2b7bbaf8943c65fd72f4e7d7ad5e205aeae28b26c835f9d8afa0f9810bf
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
||||
@ -23,7 +23,6 @@ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
PKG_DRIVERS = \
|
||||
adm8211 \
|
||||
airo \
|
||||
hermes hermes-pci hermes-pcmcia hermes-plx\
|
||||
lib80211 \
|
||||
mac80211-hwsim \
|
||||
@ -98,7 +97,7 @@ PKG_CONFIG_DEPENDS += \
|
||||
define KernelPackage/cfg80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=cfg80211 - wireless configuration API
|
||||
DEPENDS+= +iw +wireless-regdb
|
||||
DEPENDS+= +iw +iwinfo +wireless-regdb +USE_RFKILL:kmod-rfkill
|
||||
ABI_VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/compat/compat.ko \
|
||||
@ -127,7 +126,7 @@ define KernelPackage/mac80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Linux 802.11 Wireless Networking Stack
|
||||
# +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c
|
||||
DEPENDS+= +kmod-cfg80211 +hostapd-common
|
||||
DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common
|
||||
KCONFIG:=\
|
||||
CONFIG_AVERAGE=y
|
||||
FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko
|
||||
@ -174,18 +173,6 @@ define KernelPackage/adm8211
|
||||
AUTOLOAD:=$(call AutoProbe,adm8211)
|
||||
endef
|
||||
|
||||
define KernelPackage/airo
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Cisco Aironet driver
|
||||
DEPENDS+=@PCI_SUPPORT +@DRIVER_WEXT_SUPPORT +kmod-cfg80211 @TARGET_x86 @BROKEN
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/cisco/airo.ko
|
||||
AUTOLOAD:=$(call AutoProbe,airo)
|
||||
endef
|
||||
|
||||
define KernelPackage/airo/description
|
||||
Kernel support for Cisco Aironet cards
|
||||
endef
|
||||
|
||||
define KernelPackage/hermes
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Hermes 802.11b chipset support
|
||||
@ -265,7 +252,7 @@ endef
|
||||
define KernelPackage/mac80211-hwsim
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=mac80211 HW simulation device
|
||||
DEPENDS+= +kmod-mac80211 +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT
|
||||
DEPENDS+= +kmod-mac80211 +@DRIVER_11AX_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mac80211_hwsim)
|
||||
endef
|
||||
@ -406,8 +393,6 @@ endif
|
||||
|
||||
config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
|
||||
|
||||
config-$(call config_package,airo) += AIRO
|
||||
|
||||
config-$(call config_package,mac80211-hwsim) += MAC80211_HWSIM
|
||||
config-$(call config_package,mt7601u) += MT7601U
|
||||
config-y += WL_MEDIATEK
|
||||
@ -507,9 +492,14 @@ define Build/Patch
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath5k,ath5k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath9k,ath9k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath10k,ath10k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath11k,ath11k/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
|
||||
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rtl,rtl/)
|
||||
$(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used)
|
||||
endef
|
||||
|
||||
@ -517,9 +507,14 @@ define Quilt/Refresh/Package
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath5k,ath5k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath9k,ath9k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath10k,ath10k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath11k,ath11k/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/)
|
||||
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rtl,rtl/)
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
@ -545,7 +540,6 @@ endef
|
||||
define KernelPackage/cfg80211/install
|
||||
$(INSTALL_DIR) $(1)/lib/wifi $(1)/lib/netifd/wireless
|
||||
$(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
|
||||
$(INSTALL_DATA) ./files/lib/netifd/mac80211.sh $(1)/lib/netifd
|
||||
$(INSTALL_BIN) ./files/lib/netifd/wireless/mac80211.sh $(1)/lib/netifd/wireless
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211
|
||||
$(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/10-wifi-detect
|
||||
|
@ -34,7 +34,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING
|
||||
WIL6210_TRACING
|
||||
endif
|
||||
|
||||
config-$(call config_package,ath) += ATH_CARDS ATH_COMMON ATH_REG_DYNAMIC_USER_REG_HINTS
|
||||
config-$(call config_package,ath) += ATH_CARDS ATH_COMMON
|
||||
config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS
|
||||
config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED
|
||||
config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL
|
||||
@ -45,7 +45,7 @@ config-$(call config_package,owl-loader) += ATH9K_PCI_NO_EEPROM
|
||||
config-$(CONFIG_TARGET_ath79) += ATH9K_AHB
|
||||
config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB
|
||||
config-$(CONFIG_PCI) += ATH9K_PCI
|
||||
config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
|
||||
config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD ATH_REG_DYNAMIC_USER_REG_HINTS
|
||||
config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG
|
||||
config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM
|
||||
config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99
|
||||
@ -260,7 +260,8 @@ define KernelPackage/ath10k
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath10k_pci)
|
||||
AUTOLOAD:=$(call AutoProbe,ath10k_core ath10k_pci)
|
||||
MODPARAMS.ath10k_core:=frame_mode=2
|
||||
VARIANT:=regular
|
||||
endef
|
||||
|
||||
|
@ -209,7 +209,7 @@ config PACKAGE_B43_USE_BCMA
|
||||
default "16,28,29,30" if TARGET_bcm47xx_mips74k
|
||||
default "5,6,7,8,9,10,11,13,15,16,28,29,30"
|
||||
help
|
||||
This is a comma seperated list of core revision numbers.
|
||||
This is a comma separated list of core revision numbers.
|
||||
|
||||
Example (keep files for rev5 only):
|
||||
5
|
||||
@ -224,7 +224,7 @@ config PACKAGE_B43_USE_BCMA
|
||||
default "N,HT" if TARGET_bcm47xx_mips74k
|
||||
default "G,N,LP,HT"
|
||||
help
|
||||
This is a comma seperated list of PHY types:
|
||||
This is a comma separated list of PHY types:
|
||||
A => A-PHY
|
||||
AG => Dual A-PHY G-PHY
|
||||
G => G-PHY
|
||||
@ -451,6 +451,7 @@ define KernelPackage/brcmfmac/config
|
||||
bool "Enable SDIO bus interface support"
|
||||
default y if TARGET_bcm27xx
|
||||
default y if TARGET_rockchip
|
||||
default y if TARGET_imx_cortexa7
|
||||
default y if TARGET_sunxi
|
||||
default n
|
||||
help
|
||||
|
@ -1,36 +0,0 @@
|
||||
mac80211_phy_to_path() {
|
||||
local phy="$1"
|
||||
|
||||
[ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${phy} ] || return
|
||||
|
||||
local path="$(readlink -f /sys/class/ieee80211/${phy}/device)"
|
||||
[ -n "$path" ] || return
|
||||
|
||||
path="${path##/sys/devices/}"
|
||||
case "$path" in
|
||||
platform*/pci*) path="${path##platform/}";;
|
||||
esac
|
||||
|
||||
local p
|
||||
local seq=""
|
||||
for p in $(ls /sys/class/ieee80211/$phy/device/ieee80211); do
|
||||
[ "$p" = "$phy" ] && {
|
||||
echo "$path${seq:++$seq}"
|
||||
break
|
||||
}
|
||||
|
||||
seq=$((${seq:-0} + 1))
|
||||
done
|
||||
}
|
||||
|
||||
mac80211_path_to_phy() {
|
||||
local path="$1"
|
||||
|
||||
local p
|
||||
for p in $(ls /sys/class/ieee80211); do
|
||||
local cur="$(mac80211_phy_to_path "$p")"
|
||||
case "$cur" in
|
||||
*$path) echo "$p"; return;;
|
||||
esac
|
||||
done
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
. /lib/netifd/netifd-wireless.sh
|
||||
. /lib/netifd/hostapd.sh
|
||||
. /lib/netifd/mac80211.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
init_wireless_driver "$@"
|
||||
|
||||
@ -29,8 +29,8 @@ drv_mac80211_init_device_config() {
|
||||
config_add_string tx_burst
|
||||
config_add_string distance
|
||||
config_add_int beacon_int chanbw frag rts
|
||||
config_add_int rxantenna txantenna antenna_gain txpower
|
||||
config_add_boolean noscan ht_coex acs_exclude_dfs
|
||||
config_add_int rxantenna txantenna antenna_gain txpower min_tx_power
|
||||
config_add_boolean noscan ht_coex acs_exclude_dfs background_radar
|
||||
config_add_array ht_capab
|
||||
config_add_array channels
|
||||
config_add_array scan_list
|
||||
@ -138,13 +138,15 @@ mac80211_hostapd_setup_base() {
|
||||
[ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
|
||||
append base_cfg "acs_exclude_dfs=1" "$N"
|
||||
|
||||
json_get_vars noscan ht_coex vendor_vht
|
||||
json_get_vars noscan ht_coex min_tx_power:0 vendor_vht
|
||||
json_get_values ht_capab_list ht_capab tx_burst
|
||||
json_get_values channel_list channels
|
||||
|
||||
[ "$auto_channel" = 0 ] && [ -z "$channel_list" ] && \
|
||||
channel_list="$channel"
|
||||
|
||||
[ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power"
|
||||
|
||||
set_default noscan 0
|
||||
|
||||
[ "$noscan" -gt 0 ] && hostapd_noscan=1
|
||||
@ -274,6 +276,11 @@ mac80211_hostapd_setup_base() {
|
||||
vht_center_seg0=$idx
|
||||
;;
|
||||
esac
|
||||
[ "$band" = "5g" ] && {
|
||||
json_get_vars background_radar:0
|
||||
|
||||
[ "$background_radar" -eq 1 ] && append base_cfg "enable_background_radar=1" "$N"
|
||||
}
|
||||
[ "$band" = "6g" ] && {
|
||||
op_class=
|
||||
case "$htmode" in
|
||||
@ -414,18 +421,20 @@ mac80211_hostapd_setup_base() {
|
||||
he_spr_non_srg_obss_pd_max_offset:1 \
|
||||
he_bss_color
|
||||
|
||||
he_phy_cap=$(iw phy "$phy" info | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
|
||||
he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
|
||||
he_phy_cap=${he_phy_cap:2}
|
||||
he_mac_cap=$(iw phy "$phy" info | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
|
||||
he_mac_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
|
||||
he_mac_cap=${he_mac_cap:2}
|
||||
|
||||
append base_cfg "ieee80211ax=1" "$N"
|
||||
[ -n "$he_bss_color" ] && append base_cfg "he_bss_color=$he_bss_color" "$N"
|
||||
[ "$hwmode" = "a" ] && {
|
||||
append base_cfg "he_oper_chwidth=$vht_oper_chwidth" "$N"
|
||||
append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
|
||||
}
|
||||
|
||||
set_default he_bss_color 128
|
||||
append base_cfg "he_bss_color=$he_bss_color" "$N"
|
||||
|
||||
mac80211_add_he_capabilities \
|
||||
he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
|
||||
he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
|
||||
@ -563,7 +572,7 @@ mac80211_generate_mac() {
|
||||
find_phy() {
|
||||
[ -n "$phy" -a -d /sys/class/ieee80211/$phy ] && return 0
|
||||
[ -n "$path" ] && {
|
||||
phy="$(mac80211_path_to_phy "$path")"
|
||||
phy="$(iwinfo nl80211 phyname "path=$path")"
|
||||
[ -n "$phy" ] && return 0
|
||||
}
|
||||
[ -n "$macaddr" ] && {
|
||||
@ -659,10 +668,12 @@ mac80211_prepare_vif() {
|
||||
|
||||
json_select ..
|
||||
|
||||
[ -n "$macaddr" ] || {
|
||||
if [ -z "$macaddr" ]; then
|
||||
macaddr="$(mac80211_generate_mac $phy)"
|
||||
macidx="$(($macidx + 1))"
|
||||
}
|
||||
elif [ "$macaddr" = 'random' ]; then
|
||||
macaddr="$(macaddr_random)"
|
||||
fi
|
||||
|
||||
json_add_object data
|
||||
json_add_string ifname "$ifname"
|
||||
|
@ -1,5 +1,4 @@
|
||||
#!/bin/sh
|
||||
. /lib/netifd/mac80211.sh
|
||||
|
||||
append DRIVERS "mac80211"
|
||||
|
||||
@ -11,7 +10,7 @@ lookup_phy() {
|
||||
local devpath
|
||||
config_get devpath "$device" path
|
||||
[ -n "$devpath" ] && {
|
||||
phy="$(mac80211_path_to_phy "$devpath")"
|
||||
phy="$(iwinfo nl80211 phyname "path=$devpath")"
|
||||
[ -n "$phy" ] && return
|
||||
}
|
||||
|
||||
@ -161,7 +160,7 @@ detect_mac80211() {
|
||||
|
||||
get_band_defaults "$dev"
|
||||
|
||||
path="$(mac80211_phy_to_path "$dev")"
|
||||
path="$(iwinfo nl80211 path "$dev")"
|
||||
if [ -n "$path" ]; then
|
||||
dev_id="set wireless.radio${devidx}.path='$path'"
|
||||
else
|
||||
@ -175,6 +174,7 @@ detect_mac80211() {
|
||||
set wireless.radio${devidx}.channel=${channel}
|
||||
set wireless.radio${devidx}.band=${mode_band}
|
||||
set wireless.radio${devidx}.htmode=$htmode
|
||||
set wireless.radio${devidx}.country=US
|
||||
set wireless.radio${devidx}.disabled=0
|
||||
|
||||
set wireless.default_radio${devidx}=wifi-iface
|
||||
@ -183,6 +183,7 @@ detect_mac80211() {
|
||||
set wireless.default_radio${devidx}.mode=ap
|
||||
set wireless.default_radio${devidx}.ssid=OpenWrt
|
||||
set wireless.default_radio${devidx}.encryption=none
|
||||
set wireless.default_radio${devidx}.iw_qos_map_set=none
|
||||
EOF
|
||||
uci -q commit wireless
|
||||
|
||||
|
@ -15,7 +15,7 @@ config-$(call config_package,ipw2200) += IPW2200
|
||||
|
||||
define KernelPackage/iwlwifi
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT
|
||||
DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT
|
||||
TITLE:=Intel AGN Wireless support
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \
|
||||
|
@ -1,53 +0,0 @@
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Sat, 16 Nov 2019 19:25:24 +0100
|
||||
Subject: [PATCH] owl_loader: compatibility patch
|
||||
|
||||
This patch includes OpenWrt specific changes that are
|
||||
not included in the upstream owl-loader.
|
||||
|
||||
This includes a platform data handling changes for ar71xx.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
||||
@@ -103,6 +103,7 @@ static void owl_fw_cb(const struct firmw
|
||||
{
|
||||
struct pci_dev *pdev = (struct pci_dev *)context;
|
||||
struct owl_ctx *ctx = (struct owl_ctx *)pci_get_drvdata(pdev);
|
||||
+ struct ath9k_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct pci_bus *bus;
|
||||
|
||||
complete(&ctx->eeprom_load);
|
||||
@@ -118,6 +119,16 @@ static void owl_fw_cb(const struct firmw
|
||||
goto release;
|
||||
}
|
||||
|
||||
+ if (pdata) {
|
||||
+ memcpy(pdata->eeprom_data, fw->data, fw->size);
|
||||
+
|
||||
+ /*
|
||||
+ * eeprom has been successfully loaded - pass the data to ath9k
|
||||
+ * but remove the eeprom_name, so it doesn't try to load it too.
|
||||
+ */
|
||||
+ pdata->eeprom_name = NULL;
|
||||
+ }
|
||||
+
|
||||
if (ath9k_pci_fixup(pdev, (const u16 *)fw->data, fw->size))
|
||||
goto release;
|
||||
|
||||
@@ -137,8 +148,14 @@ release:
|
||||
static const char *owl_get_eeprom_name(struct pci_dev *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
+ struct ath9k_platform_data *pdata;
|
||||
char *eeprom_name;
|
||||
|
||||
+ /* try the existing platform data first */
|
||||
+ pdata = dev_get_platdata(dev);
|
||||
+ if (pdata && pdata->eeprom_name)
|
||||
+ return pdata->eeprom_name;
|
||||
+
|
||||
dev_dbg(dev, "using auto-generated eeprom filename\n");
|
||||
|
||||
eeprom_name = devm_kzalloc(dev, EEPROM_FILENAME_LEN, GFP_KERNEL);
|
@ -37,7 +37,7 @@
|
||||
for (band = 0; band < NUM_NL80211_BANDS; band++) {
|
||||
if (!wiphy->bands[band])
|
||||
continue;
|
||||
@@ -378,6 +387,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip
|
||||
@@ -379,6 +388,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
@ -47,7 +47,7 @@
|
||||
sband = wiphy->bands[NL80211_BAND_2GHZ];
|
||||
if (!sband)
|
||||
return;
|
||||
@@ -407,6 +419,9 @@ static void ath_reg_apply_radar_flags(st
|
||||
@@ -408,6 +420,9 @@ static void ath_reg_apply_radar_flags(st
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
@ -57,7 +57,7 @@
|
||||
if (!wiphy->bands[NL80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
@@ -639,6 +654,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
@@ -640,6 +655,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
wiphy->reg_notifier = reg_notifier;
|
||||
@ -82,7 +82,7 @@
|
||||
help
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -85,6 +85,7 @@ ADM8211=
|
||||
@@ -106,6 +106,7 @@ ADM8211=
|
||||
ATH_COMMON=
|
||||
WLAN_VENDOR_ATH=
|
||||
ATH_DEBUG=
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -3252,6 +3252,8 @@ void regulatory_hint_country_ie(struct w
|
||||
@@ -3309,6 +3309,8 @@ void regulatory_hint_country_ie(struct w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -3503,6 +3505,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
@@ -3560,6 +3562,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
|
@ -39,7 +39,7 @@
|
||||
bool ath_is_world_regd(struct ath_regulatory *reg)
|
||||
{
|
||||
return is_wwr_sku(ath_regd_get_eepromRD(reg));
|
||||
@@ -658,6 +666,9 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
@@ -659,6 +667,9 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
if (IS_ENABLED(CPTCFG_ATH_USER_REGD))
|
||||
return 0;
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -627,6 +627,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
|
||||
ath_dbg(common, CONFIG, "parsing configuration from OF node\n");
|
||||
|
||||
+ if (of_property_read_bool(np, "qca,disable-2ghz"))
|
||||
+ ah->disable_2ghz = true;
|
||||
+
|
||||
+ if (of_property_read_bool(np, "qca,disable-5ghz"))
|
||||
+ ah->disable_5ghz = true;
|
||||
+
|
||||
if (of_property_read_bool(np, "qca,no-eeprom")) {
|
||||
/* ath9k-eeprom-<bus>-<id>.bin */
|
||||
scnprintf(eeprom_name, sizeof(eeprom_name),
|
@ -1,47 +0,0 @@
|
||||
From 4509e523dba46f789377cfec6f20579adf743416 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks+kernel@slashdirt.org>
|
||||
Date: Sun, 17 Apr 2022 11:31:35 +0200
|
||||
Subject: [PATCH v2] ath9k: fix QCA9561 PA bias level
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This patch fixes an invalid TX PA DC bias level on QCA9561, which
|
||||
results in a very low output power and very low throughput as devices
|
||||
are further away from the AP (compared to other 2.4GHz APs).
|
||||
|
||||
This patch was suggested by Felix Fietkau, who noted[1]:
|
||||
"The value written to that register is wrong, because while the mask
|
||||
definition AR_CH0_TOP2_XPABIASLVL uses a different value for 9561, the
|
||||
shift definition AR_CH0_TOP2_XPABIASLVL_S is hardcoded to 12, which is
|
||||
wrong for 9561."
|
||||
|
||||
In real life testing, without this patch the 2.4GHz throughput on
|
||||
Yuncore XD3200 is around 10Mbps sitting next to the AP, and closer to
|
||||
practical maximum with the patch applied.
|
||||
|
||||
[1] https://lore.kernel.org/all/91c58969-c60e-2f41-00ac-737786d435ae@nbd.name
|
||||
|
||||
Signed-off-by: Thibaut VARÈNE <hacks+kernel@slashdirt.org>
|
||||
---
|
||||
v2: Adjust #define per Felix's suggestion
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/ar9003_phy.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
index a171dbb29..ad949eb02 100644
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
|
||||
@@ -720,7 +720,7 @@
|
||||
#define AR_CH0_TOP2 (AR_SREV_9300(ah) ? 0x1628c : \
|
||||
(AR_SREV_9462(ah) ? 0x16290 : 0x16284))
|
||||
#define AR_CH0_TOP2_XPABIASLVL (AR_SREV_9561(ah) ? 0x1e00 : 0xf000)
|
||||
-#define AR_CH0_TOP2_XPABIASLVL_S 12
|
||||
+#define AR_CH0_TOP2_XPABIASLVL_S (AR_SREV_9561(ah) ? 9 : 12)
|
||||
|
||||
#define AR_CH0_XTAL (AR_SREV_9300(ah) ? 0x16294 : \
|
||||
((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x16298 : \
|
||||
--
|
||||
2.30.2
|
||||
|
@ -1,37 +0,0 @@
|
||||
From: Linus Lüssing <ll@simonwunderlich.de>
|
||||
Date: Wed, 5 Feb 2020 20:10:43 +0100
|
||||
Subject: ath10k: increase rx buffer size to 2048
|
||||
|
||||
Before, only frames with a maximum size of 1528 bytes could be
|
||||
transmitted between two 802.11s nodes.
|
||||
|
||||
For batman-adv for instance, which adds its own header to each frame,
|
||||
we typically need an MTU of at least 1532 bytes to be able to transmit
|
||||
without fragmentation.
|
||||
|
||||
This patch now increases the maxmimum frame size from 1528 to 1656
|
||||
bytes.
|
||||
|
||||
Tested with two ath10k devices in 802.11s mode, as well as with
|
||||
batman-adv on top of 802.11s with forwarding disabled.
|
||||
|
||||
Fix originally found and developed by Ben Greear.
|
||||
|
||||
Link: https://github.com/greearb/ath10k-ct/issues/89
|
||||
Link: https://github.com/greearb/ath10k-ct/commit/9e5ab25027e0971fa24ccf93373324c08c4e992d
|
||||
Cc: Ben Greear <greearb@candelatech.com>
|
||||
Signed-off-by: Linus Lüssing <ll@simonwunderlich.de>
|
||||
|
||||
Forwarded: https://patchwork.kernel.org/patch/11367055/
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/htt.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/htt.h
|
||||
@@ -2243,7 +2243,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.
|
||||
*/
|
||||
-#define HTT_RX_BUF_SIZE 1920
|
||||
+#define HTT_RX_BUF_SIZE 2048
|
||||
#define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(struct htt_rx_desc))
|
||||
|
||||
/* Refill a bunch of RX buffers for each refill round so that FW/HW can handle
|
@ -37,7 +37,7 @@
|
||||
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -142,6 +142,7 @@ ATH10K_SNOC=
|
||||
@@ -165,6 +165,7 @@ ATH10K_SNOC=
|
||||
ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
@ -0,0 +1,69 @@
|
||||
From 2587d5198aa5adcbd8896aae4a2404dc13d48637 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Date: Wed, 18 May 2022 10:27:26 +0300
|
||||
Subject: ath10k: improve tx status reporting
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
We use ieee80211_tx_status() to report each completed tx frame.
|
||||
Internally, this function calls sta_info_get_by_addrs(), what has a
|
||||
couple of drawbacks:
|
||||
1. additional station lookup causes a performance degradation;
|
||||
2. mac80211 can not properly account Ethernet encapsulated frames due
|
||||
to the inability to properly determine the destination (station) MAC
|
||||
address since ieee80211_tx_status() assumes the frame has a 802.11
|
||||
header.
|
||||
|
||||
The latter is especially destructive if we want to use hardware frames
|
||||
encapsulation.
|
||||
|
||||
To fix both of these issues, replace ieee80211_tx_status() with
|
||||
ieee80211_tx_status_ext() call and feed it station pointer from the tx
|
||||
queue associated with the transmitted frame.
|
||||
|
||||
Tested-on: QCA9888 hw2.0 PCI 10.4-3.9.0.2-00131
|
||||
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00157-QCARMSWPZ-1
|
||||
|
||||
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Tested-by: Oldřich Jedlička <oldium.pro@gmail.com> # TP-Link Archer C7 v4 & v5 (QCA9563 + QCA9880)
|
||||
Tested-by: Edward Matijevic <motolav@gmail.com> # TP-Link Archer C2600 (IPQ8064 + QCA9980 10.4.1.00030-1)
|
||||
Tested-by: Edward Matijevic <motolav@gmail.com> # QCA9377 PCI in Sta mode
|
||||
Tested-by: Zhijun You <hujy652@gmail.com> # NETGEAR R7800 (QCA9984 10.4-3.9.0.2-00159)
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20220516032519.29831-2-ryazanov.s.a@gmail.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/txrx.c | 15 ++++++++++++++-
|
||||
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/txrx.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
|
||||
@@ -43,6 +43,7 @@ out:
|
||||
int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
|
||||
const struct htt_tx_done *tx_done)
|
||||
{
|
||||
+ struct ieee80211_tx_status status;
|
||||
struct ath10k *ar = htt->ar;
|
||||
struct device *dev = ar->dev;
|
||||
struct ieee80211_tx_info *info;
|
||||
@@ -128,7 +129,19 @@ int ath10k_txrx_tx_unref(struct ath10k_h
|
||||
info->status.is_valid_ack_signal = true;
|
||||
}
|
||||
|
||||
- ieee80211_tx_status(htt->ar->hw, msdu);
|
||||
+ memset(&status, 0, sizeof(status));
|
||||
+ status.skb = msdu;
|
||||
+ status.info = info;
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
+
|
||||
+ if (txq)
|
||||
+ status.sta = txq->sta;
|
||||
+
|
||||
+ ieee80211_tx_status_ext(htt->ar->hw, &status);
|
||||
+
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
/* we do not own the msdu anymore */
|
||||
|
||||
return 0;
|
@ -0,0 +1,74 @@
|
||||
From a09740548275a74b897654b3aca5af589289b57a Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Date: Mon, 16 May 2022 13:26:00 +0300
|
||||
Subject: ath10k: turn rawmode into frame_mode
|
||||
|
||||
Turn boolean rawmode module param into integer frame_mode param that
|
||||
contains value from ath10k_hw_txrx_mode enum. As earlier the default
|
||||
param value is non-RAW (native Wi-Fi) encapsulation. The param name
|
||||
is selected to be consistent with the similar ath11k param.
|
||||
|
||||
This is a preparation step for upcoming encapsulation offloading
|
||||
support.
|
||||
|
||||
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20220516032519.29831-4-ryazanov.s.a@gmail.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/core.c | 11 +++++++----
|
||||
drivers/net/wireless/ath/ath10k/core.h | 1 +
|
||||
2 files changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -32,9 +32,11 @@ EXPORT_SYMBOL(ath10k_debug_mask);
|
||||
static unsigned int ath10k_cryptmode_param;
|
||||
static bool uart_print;
|
||||
static bool skip_otp;
|
||||
-static bool rawmode;
|
||||
static bool fw_diag_log;
|
||||
|
||||
+/* frame mode values are mapped as per enum ath10k_hw_txrx_mode */
|
||||
+unsigned int ath10k_frame_mode = ATH10K_HW_TXRX_NATIVE_WIFI;
|
||||
+
|
||||
unsigned long ath10k_coredump_mask = BIT(ATH10K_FW_CRASH_DUMP_REGISTERS) |
|
||||
BIT(ATH10K_FW_CRASH_DUMP_CE_DATA);
|
||||
|
||||
@@ -43,15 +45,16 @@ module_param_named(debug_mask, ath10k_de
|
||||
module_param_named(cryptmode, ath10k_cryptmode_param, uint, 0644);
|
||||
module_param(uart_print, bool, 0644);
|
||||
module_param(skip_otp, bool, 0644);
|
||||
-module_param(rawmode, bool, 0644);
|
||||
module_param(fw_diag_log, bool, 0644);
|
||||
+module_param_named(frame_mode, ath10k_frame_mode, uint, 0644);
|
||||
module_param_named(coredump_mask, ath10k_coredump_mask, ulong, 0444);
|
||||
|
||||
MODULE_PARM_DESC(debug_mask, "Debugging mask");
|
||||
MODULE_PARM_DESC(uart_print, "Uart target debugging");
|
||||
MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
|
||||
MODULE_PARM_DESC(cryptmode, "Crypto mode: 0-hardware, 1-software");
|
||||
-MODULE_PARM_DESC(rawmode, "Use raw 802.11 frame datapath");
|
||||
+MODULE_PARM_DESC(frame_mode,
|
||||
+ "Datapath frame mode (0: raw, 1: native wifi (default))");
|
||||
MODULE_PARM_DESC(coredump_mask, "Bitfield of what to include in firmware crash file");
|
||||
MODULE_PARM_DESC(fw_diag_log, "Diag based fw log debugging");
|
||||
|
||||
@@ -2487,7 +2490,7 @@ static int ath10k_core_init_firmware_fea
|
||||
ar->htt.max_num_amsdu = ATH10K_HTT_MAX_NUM_AMSDU_DEFAULT;
|
||||
ar->htt.max_num_ampdu = ATH10K_HTT_MAX_NUM_AMPDU_DEFAULT;
|
||||
|
||||
- if (rawmode) {
|
||||
+ if (ath10k_frame_mode == ATH10K_HW_TXRX_RAW) {
|
||||
if (!test_bit(ATH10K_FW_FEATURE_RAW_MODE_SUPPORT,
|
||||
fw_file->fw_features)) {
|
||||
ath10k_err(ar, "rawmode = 1 requires support from firmware");
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
|
||||
@@ -1311,6 +1311,7 @@ static inline bool ath10k_peer_stats_ena
|
||||
return false;
|
||||
}
|
||||
|
||||
+extern unsigned int ath10k_frame_mode;
|
||||
extern unsigned long ath10k_coredump_mask;
|
||||
|
||||
void ath10k_core_napi_sync_disable(struct ath10k *ar);
|
@ -0,0 +1,163 @@
|
||||
From 70f119fb82af7f7417dc659faf02c91e1f853739 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Date: Mon, 16 May 2022 13:26:00 +0300
|
||||
Subject: ath10k: htt_tx: do not interpret Eth frames as WiFi
|
||||
|
||||
The xmit path for the Ethernet encapsulated frames become more or less
|
||||
usable since d740d8fd2439 ("ath10k: unify tx mode and dispatch"). This
|
||||
change reorganize the xmit path in a manageable way to properly support
|
||||
various tx modes, but misses that the Ethernet encapsulated frame is a
|
||||
special case. We do not have an IEEE 802.11 header at the begining of
|
||||
them. But the HTT Tx handler still interprets first bytes of each frame
|
||||
as an IEEE 802.11 Frame Control field.
|
||||
|
||||
Than this code was copied by e62ee5c381c5 ("ath10k: Add support for
|
||||
htt_data_tx_desc_64 descriptor") and a2097d6444c3 ("ath10k: htt: High
|
||||
latency TX support") to another handlers. In fact the issue in the high
|
||||
latency (HL) handler was introduced by 83ac260151e7 ("ath10k: add mic
|
||||
bytes for pmf management packet").
|
||||
|
||||
Ethernet encapsulated frame tx mode stay unused until 75d85fd9993c
|
||||
("ath10k: introduce basic tdls functionality") started using it for TDLS
|
||||
frames to avoid key selection issue in some firmwares.
|
||||
|
||||
Trying to interpret the begining of an Ethernet encapsulated frame as an
|
||||
IEEE 802.11 header was not hurt us noticeably since we need to meet two
|
||||
conditions: (1) xmit should be performed towards a TDLS peer, and (2)
|
||||
the TDLS peer should have a specific OUI part of its MAC address. Looks
|
||||
like that the rareness in TDLS communications of OUIs that can be
|
||||
interpreted as an 802.11 management frame saves users from facing this
|
||||
issue earlier.
|
||||
|
||||
Improve Ethernet tx mode support in the HTT Tx handler by avoiding
|
||||
interpreting its first bytes as an IEEE 802.11 header. While at it, make
|
||||
the ieee80211_hdr variable local to the code block that is guarded by
|
||||
!is_eth check. In this way, we clarify in which cases a frame can be
|
||||
interpreted as IEEE 802.11, and saves us from similar issues in the
|
||||
future.
|
||||
|
||||
Credits: this change as part of xmit encapsulation offloading support
|
||||
was originally made by QCA and then submitted for inclusion by John
|
||||
Crispin [1]. But the whole work was not accepted due to the lack of a
|
||||
part for 64-bits descriptors [2]. Zhijun You then pointed this out to me
|
||||
in a reply to my initial RFC patch series. And I made this slightly
|
||||
reworked version that covered all the HTT Tx handler variants.
|
||||
|
||||
1. https://lore.kernel.org/all/20191216092207.31032-1-john@phrozen.org/
|
||||
2. https://patchwork.kernel.org/project/linux-wireless/patch/20191216092207.31032-1-john@phrozen.org/
|
||||
|
||||
Reported-by: Zhijun You <hujy652@gmail.com>
|
||||
Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20220516032519.29831-3-ryazanov.s.a@gmail.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/htt_tx.c | 61 ++++++++++++++++++--------------
|
||||
1 file changed, 35 insertions(+), 26 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
|
||||
@@ -1295,7 +1295,6 @@ static int ath10k_htt_tx_hl(struct ath10
|
||||
struct ath10k *ar = htt->ar;
|
||||
int res, data_len;
|
||||
struct htt_cmd_hdr *cmd_hdr;
|
||||
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
struct htt_data_tx_desc *tx_desc;
|
||||
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
||||
struct sk_buff *tmp_skb;
|
||||
@@ -1306,11 +1305,15 @@ static int ath10k_htt_tx_hl(struct ath10
|
||||
u16 flags1 = 0;
|
||||
u16 msdu_id = 0;
|
||||
|
||||
- if ((ieee80211_is_action(hdr->frame_control) ||
|
||||
- ieee80211_is_deauth(hdr->frame_control) ||
|
||||
- ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
- ieee80211_has_protected(hdr->frame_control)) {
|
||||
- skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ if (!is_eth) {
|
||||
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
+
|
||||
+ if ((ieee80211_is_action(hdr->frame_control) ||
|
||||
+ ieee80211_is_deauth(hdr->frame_control) ||
|
||||
+ ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
+ ieee80211_has_protected(hdr->frame_control)) {
|
||||
+ skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ }
|
||||
}
|
||||
|
||||
data_len = msdu->len;
|
||||
@@ -1407,7 +1410,6 @@ static int ath10k_htt_tx_32(struct ath10
|
||||
{
|
||||
struct ath10k *ar = htt->ar;
|
||||
struct device *dev = ar->dev;
|
||||
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
|
||||
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
||||
struct ath10k_hif_sg_item sg_items[2];
|
||||
@@ -1439,15 +1441,19 @@ static int ath10k_htt_tx_32(struct ath10
|
||||
txbuf_paddr = htt->txbuf.paddr +
|
||||
(sizeof(struct ath10k_htt_txbuf_32) * msdu_id);
|
||||
|
||||
- if ((ieee80211_is_action(hdr->frame_control) ||
|
||||
- ieee80211_is_deauth(hdr->frame_control) ||
|
||||
- ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
- ieee80211_has_protected(hdr->frame_control)) {
|
||||
- skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
- } else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
|
||||
- txmode == ATH10K_HW_TXRX_RAW &&
|
||||
- ieee80211_has_protected(hdr->frame_control)) {
|
||||
- skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ if (!is_eth) {
|
||||
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
+
|
||||
+ if ((ieee80211_is_action(hdr->frame_control) ||
|
||||
+ ieee80211_is_deauth(hdr->frame_control) ||
|
||||
+ ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
+ ieee80211_has_protected(hdr->frame_control)) {
|
||||
+ skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ } else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
|
||||
+ txmode == ATH10K_HW_TXRX_RAW &&
|
||||
+ ieee80211_has_protected(hdr->frame_control)) {
|
||||
+ skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ }
|
||||
}
|
||||
|
||||
skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
|
||||
@@ -1609,7 +1615,6 @@ static int ath10k_htt_tx_64(struct ath10
|
||||
{
|
||||
struct ath10k *ar = htt->ar;
|
||||
struct device *dev = ar->dev;
|
||||
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
|
||||
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
||||
struct ath10k_hif_sg_item sg_items[2];
|
||||
@@ -1641,15 +1646,19 @@ static int ath10k_htt_tx_64(struct ath10
|
||||
txbuf_paddr = htt->txbuf.paddr +
|
||||
(sizeof(struct ath10k_htt_txbuf_64) * msdu_id);
|
||||
|
||||
- if ((ieee80211_is_action(hdr->frame_control) ||
|
||||
- ieee80211_is_deauth(hdr->frame_control) ||
|
||||
- ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
- ieee80211_has_protected(hdr->frame_control)) {
|
||||
- skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
- } else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
|
||||
- txmode == ATH10K_HW_TXRX_RAW &&
|
||||
- ieee80211_has_protected(hdr->frame_control)) {
|
||||
- skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ if (!is_eth) {
|
||||
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
|
||||
+
|
||||
+ if ((ieee80211_is_action(hdr->frame_control) ||
|
||||
+ ieee80211_is_deauth(hdr->frame_control) ||
|
||||
+ ieee80211_is_disassoc(hdr->frame_control)) &&
|
||||
+ ieee80211_has_protected(hdr->frame_control)) {
|
||||
+ skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ } else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
|
||||
+ txmode == ATH10K_HW_TXRX_RAW &&
|
||||
+ ieee80211_has_protected(hdr->frame_control)) {
|
||||
+ skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
|
||||
+ }
|
||||
}
|
||||
|
||||
skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
|
@ -0,0 +1,194 @@
|
||||
From af6d8265c47e46881b80c6b073f53c8c4af52d28 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Date: Mon, 16 May 2022 13:26:00 +0300
|
||||
Subject: ath10k: add encapsulation offloading support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Frame encapsulation from Ethernet into the IEEE 802.11 frame format
|
||||
takes a considerable host CPU time on the xmit path. The firmware is
|
||||
able to do this operation for us, so enable encapsulation offloading for
|
||||
AP and Sta interface types to improve overall system performance.
|
||||
|
||||
The driver is almost ready for encapsulation offloading support. There
|
||||
are only a few places where the driver assumes the frame format is IEEE
|
||||
802.11 that need to be fixed.
|
||||
|
||||
Encapsulation offloading is currently disabled by default and the driver
|
||||
utilizes mac80211 encapsulation support. To activate offloading, the
|
||||
frame_mode=2 parameter should be passed during module loading.
|
||||
|
||||
On a QCA9563+QCA9888-based access point in bridged mode, encapsulation
|
||||
offloading increases TCP 16-streams DL throughput from 365 to 396 mbps
|
||||
(+8%) and UDP DL throughput from 436 to 483 mbps (+11%).
|
||||
|
||||
Tested-on: QCA9888 hw2.0 PCI 10.4-3.9.0.2-00131
|
||||
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00157-QCARMSWPZ-1
|
||||
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
|
||||
Tested-by: Oldřich Jedlička <oldium.pro@gmail.com> # TP-Link Archer C7 v4 & v5 (QCA9563 + QCA9880)
|
||||
Tested-by: Edward Matijevic <motolav@gmail.com> # TP-Link Archer C2600 (IPQ8064 + QCA9980 10.4.1.00030-1)
|
||||
Tested-by: Edward Matijevic <motolav@gmail.com> # QCA9377 PCI in Sta mode
|
||||
Tested-by: Zhijun You <hujy652@gmail.com> # NETGEAR R7800 (QCA9984 10.4-3.9.0.2-00159)
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20220516032519.29831-5-ryazanov.s.a@gmail.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/core.c | 2 +-
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 67 +++++++++++++++++++++++++++-------
|
||||
2 files changed, 55 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -54,7 +54,7 @@ MODULE_PARM_DESC(uart_print, "Uart targe
|
||||
MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
|
||||
MODULE_PARM_DESC(cryptmode, "Crypto mode: 0-hardware, 1-software");
|
||||
MODULE_PARM_DESC(frame_mode,
|
||||
- "Datapath frame mode (0: raw, 1: native wifi (default))");
|
||||
+ "Datapath frame mode (0: raw, 1: native wifi (default), 2: ethernet)");
|
||||
MODULE_PARM_DESC(coredump_mask, "Bitfield of what to include in firmware crash file");
|
||||
MODULE_PARM_DESC(fw_diag_log, "Diag based fw log debugging");
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -3710,6 +3710,9 @@ ath10k_mac_tx_h_get_txmode(struct ath10k
|
||||
const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
|
||||
__le16 fc = hdr->frame_control;
|
||||
|
||||
+ if (IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
|
||||
+ return ATH10K_HW_TXRX_ETHERNET;
|
||||
+
|
||||
if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
|
||||
return ATH10K_HW_TXRX_RAW;
|
||||
|
||||
@@ -3870,6 +3873,12 @@ static void ath10k_mac_tx_h_fill_cb(stru
|
||||
bool noack = false;
|
||||
|
||||
cb->flags = 0;
|
||||
+
|
||||
+ if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
|
||||
+ cb->flags |= ATH10K_SKB_F_QOS; /* Assume data frames are QoS */
|
||||
+ goto finish_cb_fill;
|
||||
+ }
|
||||
+
|
||||
if (!ath10k_tx_h_use_hwcrypto(vif, skb))
|
||||
cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
|
||||
|
||||
@@ -3908,6 +3917,7 @@ static void ath10k_mac_tx_h_fill_cb(stru
|
||||
cb->flags |= ATH10K_SKB_F_RAW_TX;
|
||||
}
|
||||
|
||||
+finish_cb_fill:
|
||||
cb->vif = vif;
|
||||
cb->txq = txq;
|
||||
cb->airtime_est = airtime;
|
||||
@@ -4031,7 +4041,11 @@ static int ath10k_mac_tx(struct ath10k *
|
||||
ath10k_tx_h_seq_no(vif, skb);
|
||||
break;
|
||||
case ATH10K_HW_TXRX_ETHERNET:
|
||||
- ath10k_tx_h_8023(skb);
|
||||
+ /* Convert 802.11->802.3 header only if the frame was erlier
|
||||
+ * encapsulated to 802.11 by mac80211. Otherwise pass it as is.
|
||||
+ */
|
||||
+ if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
|
||||
+ ath10k_tx_h_8023(skb);
|
||||
break;
|
||||
case ATH10K_HW_TXRX_RAW:
|
||||
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) &&
|
||||
@@ -4643,12 +4657,10 @@ static void ath10k_mac_op_tx(struct ieee
|
||||
struct ieee80211_vif *vif = info->control.vif;
|
||||
struct ieee80211_sta *sta = control->sta;
|
||||
struct ieee80211_txq *txq = NULL;
|
||||
- struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
enum ath10k_hw_txrx_mode txmode;
|
||||
enum ath10k_mac_tx_path txpath;
|
||||
bool is_htt;
|
||||
bool is_mgmt;
|
||||
- bool is_presp;
|
||||
int ret;
|
||||
u16 airtime;
|
||||
|
||||
@@ -4662,8 +4674,14 @@ static void ath10k_mac_op_tx(struct ieee
|
||||
is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
|
||||
|
||||
if (is_htt) {
|
||||
+ bool is_presp = false;
|
||||
+
|
||||
spin_lock_bh(&ar->htt.tx_lock);
|
||||
- is_presp = ieee80211_is_probe_resp(hdr->frame_control);
|
||||
+ if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
|
||||
+ struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
+
|
||||
+ is_presp = ieee80211_is_probe_resp(hdr->frame_control);
|
||||
+ }
|
||||
|
||||
ret = ath10k_htt_tx_inc_pending(htt);
|
||||
if (ret) {
|
||||
@@ -5463,6 +5481,30 @@ static int ath10k_mac_set_txbf_conf(stru
|
||||
ar->wmi.vdev_param->txbf, value);
|
||||
}
|
||||
|
||||
+static void ath10k_update_vif_offload(struct ieee80211_hw *hw,
|
||||
+ struct ieee80211_vif *vif)
|
||||
+{
|
||||
+ struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
+ struct ath10k *ar = hw->priv;
|
||||
+ u32 vdev_param;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (ath10k_frame_mode != ATH10K_HW_TXRX_ETHERNET ||
|
||||
+ ar->wmi.vdev_param->tx_encap_type == WMI_VDEV_PARAM_UNSUPPORTED ||
|
||||
+ (vif->type != NL80211_IFTYPE_STATION &&
|
||||
+ vif->type != NL80211_IFTYPE_AP))
|
||||
+ vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
|
||||
+
|
||||
+ vdev_param = ar->wmi.vdev_param->tx_encap_type;
|
||||
+ ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
+ ATH10K_HW_TXRX_NATIVE_WIFI);
|
||||
+ /* 10.X firmware does not support this VDEV parameter. Do not warn */
|
||||
+ if (ret && ret != -EOPNOTSUPP) {
|
||||
+ ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
|
||||
+ arvif->vdev_id, ret);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* TODO:
|
||||
* Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
|
||||
@@ -5672,15 +5714,7 @@ static int ath10k_add_interface(struct i
|
||||
|
||||
arvif->def_wep_key_idx = -1;
|
||||
|
||||
- vdev_param = ar->wmi.vdev_param->tx_encap_type;
|
||||
- ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
- ATH10K_HW_TXRX_NATIVE_WIFI);
|
||||
- /* 10.X firmware does not support this VDEV parameter. Do not warn */
|
||||
- if (ret && ret != -EOPNOTSUPP) {
|
||||
- ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
|
||||
- arvif->vdev_id, ret);
|
||||
- goto err_vdev_delete;
|
||||
- }
|
||||
+ ath10k_update_vif_offload(hw, vif);
|
||||
|
||||
/* Configuring number of spatial stream for monitor interface is causing
|
||||
* target assert in qca9888 and qca6174.
|
||||
@@ -9368,6 +9402,7 @@ static const struct ieee80211_ops ath10k
|
||||
.stop = ath10k_stop,
|
||||
.config = ath10k_config,
|
||||
.add_interface = ath10k_add_interface,
|
||||
+ .update_vif_offload = ath10k_update_vif_offload,
|
||||
.remove_interface = ath10k_remove_interface,
|
||||
.configure_filter = ath10k_configure_filter,
|
||||
.bss_info_changed = ath10k_bss_info_changed,
|
||||
@@ -10037,6 +10072,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
|
||||
|
||||
+ if (ath10k_frame_mode == ATH10K_HW_TXRX_ETHERNET) {
|
||||
+ if (ar->wmi.vdev_param->tx_encap_type !=
|
||||
+ WMI_VDEV_PARAM_UNSUPPORTED)
|
||||
+ ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
|
||||
+ }
|
||||
+
|
||||
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
|
||||
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
|
||||
ar->hw->wiphy->max_remain_on_channel_duration = 5000;
|
@ -0,0 +1,65 @@
|
||||
From f2a7064a78b22f2b68b9fcbc8a6f4c5e61c5ba64 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Marko <robimarko@gmail.com>
|
||||
Date: Sun, 10 Oct 2021 00:17:11 +0200
|
||||
Subject: [PATCH] ath10k: support bus and device specific API 1 BDF selection
|
||||
|
||||
Some ath10k IPQ40xx devices like the MikroTik hAP ac2 and ac3 require the
|
||||
BDF-s to be extracted from the device storage instead of shipping packaged
|
||||
API 2 BDF-s.
|
||||
|
||||
This is required as MikroTik has started shipping boards that require BDF-s
|
||||
to be updated, as otherwise their WLAN performance really suffers.
|
||||
This is however impossible as the devices that require this are release
|
||||
under the same revision and its not possible to differentiate them from
|
||||
devices using the older BDF-s.
|
||||
|
||||
In OpenWrt we are extracting the calibration data during runtime and we are
|
||||
able to extract the BDF-s in the same manner, however we cannot package the
|
||||
BDF-s to API 2 format on the fly and can only use API 1 to provide BDF-s on
|
||||
the fly.
|
||||
This is an issue as the ath10k driver explicitly looks only for the
|
||||
board.bin file and not for something like board-bus-device.bin like it does
|
||||
for pre-cal data.
|
||||
Due to this we have no way of providing correct BDF-s on the fly, so lets
|
||||
extend the ath10k driver to first look for BDF-s in the
|
||||
board-bus-device.bin format, for example: board-ahb-a800000.wifi.bin
|
||||
If that fails, look for the default board file name as defined previously.
|
||||
|
||||
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20211009221711.2315352-1-robimarko@gmail.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/core.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -1202,6 +1202,7 @@ success:
|
||||
static int ath10k_core_fetch_board_data_api_1(struct ath10k *ar, int bd_ie_type)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
+ char boardname[100];
|
||||
|
||||
if (bd_ie_type == ATH10K_BD_IE_BOARD) {
|
||||
if (!ar->hw_params.fw.board) {
|
||||
@@ -1209,9 +1210,19 @@ static int ath10k_core_fetch_board_data_
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ scnprintf(boardname, sizeof(boardname), "board-%s-%s.bin",
|
||||
+ ath10k_bus_str(ar->hif.bus), dev_name(ar->dev));
|
||||
+
|
||||
ar->normal_mode_fw.board = ath10k_fetch_fw_file(ar,
|
||||
ar->hw_params.fw.dir,
|
||||
- ar->hw_params.fw.board);
|
||||
+ boardname);
|
||||
+ if (IS_ERR(ar->normal_mode_fw.board)) {
|
||||
+ fw = ath10k_fetch_fw_file(ar,
|
||||
+ ar->hw_params.fw.dir,
|
||||
+ ar->hw_params.fw.board);
|
||||
+ ar->normal_mode_fw.board = fw;
|
||||
+ }
|
||||
+
|
||||
if (IS_ERR(ar->normal_mode_fw.board))
|
||||
return PTR_ERR(ar->normal_mode_fw.board);
|
||||
|
@ -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
|
||||
@@ -3206,6 +3206,16 @@ int ath10k_core_register(struct ath10k *
|
||||
@@ -3443,6 +3443,16 @@ int ath10k_core_register(struct ath10k *
|
||||
|
||||
queue_work(ar->workqueue, &ar->register_work);
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -9732,6 +9732,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
@@ -9894,6 +9894,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[] = {
|
||||
@@ -10081,6 +10096,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10252,6 +10267,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
@ -85,7 +85,7 @@ v13:
|
||||
create mode 100644 drivers/net/wireless/ath/ath10k/leds.h
|
||||
--- a/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
@@ -70,6 +70,16 @@ config ATH10K_DEBUGFS
|
||||
@@ -71,6 +71,16 @@ config ATH10K_DEBUGFS
|
||||
|
||||
If unsure, say Y to make it easier to debug problems.
|
||||
|
||||
@ -114,7 +114,7 @@ v13:
|
||||
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -145,6 +145,7 @@ ATH10K_DEBUG=
|
||||
@@ -166,6 +166,7 @@ ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
ATH10K_THERMAL=
|
||||
@ -124,7 +124,7 @@ v13:
|
||||
WCN36XX=
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -25,6 +25,7 @@
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "testmode.h"
|
||||
#include "wmi-ops.h"
|
||||
#include "coredump.h"
|
||||
@ -132,7 +132,7 @@ v13:
|
||||
|
||||
unsigned int ath10k_debug_mask;
|
||||
EXPORT_SYMBOL(ath10k_debug_mask);
|
||||
@@ -61,6 +62,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -65,6 +66,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA988X_2_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca988x hw2.0",
|
||||
@ -140,7 +140,7 @@ v13:
|
||||
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
@@ -132,6 +134,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -138,6 +140,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = QCA9887_1_0_DEVICE_ID,
|
||||
.bus = ATH10K_BUS_PCI,
|
||||
.name = "qca9887 hw1.0",
|
||||
@ -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,
|
||||
@@ -343,6 +346,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -355,6 +358,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,
|
||||
@@ -384,6 +388,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -397,6 +401,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,
|
||||
@@ -432,6 +437,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -446,6 +451,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,
|
||||
@@ -2921,6 +2927,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
@@ -3158,6 +3164,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
@ -183,7 +183,7 @@ v13:
|
||||
return 0;
|
||||
|
||||
err_hif_stop:
|
||||
@@ -3179,9 +3189,18 @@ static void ath10k_core_register_work(st
|
||||
@@ -3416,9 +3426,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:
|
||||
@@ -3227,6 +3246,8 @@ void ath10k_core_unregister(struct ath10
|
||||
@@ -3464,6 +3483,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"
|
||||
@@ -1237,6 +1238,13 @@ struct ath10k {
|
||||
@@ -1256,6 +1257,13 @@ struct ath10k {
|
||||
} testmode;
|
||||
|
||||
struct {
|
@ -16,9 +16,9 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
|
||||
@@ -1290,6 +1290,10 @@ struct ath10k {
|
||||
bool coex_support;
|
||||
int coex_gpio_pin;
|
||||
@@ -1312,6 +1312,10 @@ struct ath10k {
|
||||
s32 tx_power_2g_limit;
|
||||
s32 tx_power_5g_limit;
|
||||
|
||||
+#ifdef CPTCFG_MAC80211_LEDS
|
||||
+ const char *led_default_trigger;
|
||||
@ -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
|
||||
@@ -10098,7 +10098,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10269,7 +10269,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
@ -28,7 +28,7 @@ Forwarded: no
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -1010,6 +1010,40 @@ static inline int ath10k_vdev_setup_sync
|
||||
@@ -1021,6 +1021,40 @@ static inline int ath10k_vdev_setup_sync
|
||||
return ar->last_wmi_vdev_start_status;
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ Forwarded: no
|
||||
static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
|
||||
{
|
||||
struct cfg80211_chan_def *chandef = NULL;
|
||||
@@ -1042,7 +1076,8 @@ static int ath10k_monitor_vdev_start(str
|
||||
@@ -1053,7 +1087,8 @@ static int ath10k_monitor_vdev_start(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = channel->max_power * 2;
|
||||
arg.channel.max_reg_power = channel->max_reg_power * 2;
|
||||
@ -79,7 +79,7 @@ Forwarded: no
|
||||
|
||||
reinit_completion(&ar->vdev_setup_done);
|
||||
reinit_completion(&ar->vdev_delete_done);
|
||||
@@ -1488,7 +1523,8 @@ static int ath10k_vdev_start_restart(str
|
||||
@@ -1499,7 +1534,8 @@ static int ath10k_vdev_start_restart(str
|
||||
arg.channel.min_power = 0;
|
||||
arg.channel.max_power = chandef->chan->max_power * 2;
|
||||
arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
|
||||
@ -89,7 +89,7 @@ Forwarded: no
|
||||
|
||||
if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
|
||||
arg.ssid = arvif->u.ap.ssid;
|
||||
@@ -3259,7 +3295,8 @@ static int ath10k_update_channel_list(st
|
||||
@@ -3427,7 +3463,8 @@ static int ath10k_update_channel_list(st
|
||||
ch->min_power = 0;
|
||||
ch->max_power = channel->max_power * 2;
|
||||
ch->max_reg_power = channel->max_reg_power * 2;
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/htt.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/htt.h
|
||||
@@ -236,7 +236,11 @@ enum htt_rx_ring_flags {
|
||||
@@ -235,7 +235,11 @@ enum htt_rx_ring_flags {
|
||||
};
|
||||
|
||||
#define HTT_RX_RING_SIZE_MIN 128
|
@ -18,7 +18,7 @@
|
||||
goto end;
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -1964,7 +1964,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
@@ -1963,7 +1963,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
|
||||
@ -27,7 +27,7 @@
|
||||
ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||
u32 tsftu = TSF_TO_TU(tsf);
|
||||
@@ -2050,7 +2050,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
@@ -2049,7 +2049,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
|
||||
intval = ah->bintval & AR5K_BEACON_PERIOD;
|
||||
if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
|
||||
@ -36,7 +36,7 @@
|
||||
intval /= ATH_BCBUF; /* staggered multi-bss beacons */
|
||||
if (intval < 15)
|
||||
ATH5K_WARN(ah, "intval %u is too low, min 15\n",
|
||||
@@ -2516,6 +2516,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -2515,6 +2515,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) },
|
@ -130,7 +130,7 @@ drivers/net/wireless/ath/ath5k/debug.c | 86 ++++++++++++++++++++++++++++++++
|
||||
/* Antenna Control */
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -466,6 +466,9 @@ ath5k_chan_set(struct ath5k_hw *ah, stru
|
||||
@@ -465,6 +465,9 @@ ath5k_chan_set(struct ath5k_hw *ah, stru
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 03469e79fee9e8e908dae3bd1a80bcd9a66f2a88 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Date: Mon, 11 Oct 2021 18:18:00 +0300
|
||||
Subject: ath9k: support DT ieee80211-freq-limit property to limit channels
|
||||
|
||||
The common DT property can be used to limit the available channels
|
||||
but ath9k has to manually call wiphy_read_of_freq_limits().
|
||||
|
||||
I would have put this into ath9k_of_init(). But it didn't work there.
|
||||
The reason is that in ath9k_of_init() the channels and bands are not yet
|
||||
registered in the wiphy struct. So there isn't any channel to flag as
|
||||
disabled.
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
Link: https://lore.kernel.org/r/20211009212847.1781986-1-chunkeey@gmail.com
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1038,6 +1038,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
|
||||
+ wiphy_read_of_freq_limits(hw->wiphy);
|
||||
+
|
||||
/* Register with mac80211 */
|
||||
error = ieee80211_register_hw(hw);
|
||||
if (error)
|
@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1435,8 +1435,12 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1434,8 +1434,12 @@ static bool ath9k_hw_set_reset(struct at
|
||||
if (!AR_SREV_9100(ah))
|
||||
REG_WRITE(ah, AR_RC, 0);
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1312,39 +1312,56 @@ void ath9k_hw_get_delta_slope_vals(struc
|
||||
@@ -1311,39 +1311,56 @@ void ath9k_hw_get_delta_slope_vals(struc
|
||||
*coef_exponent = coef_exp - 16;
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1397,24 +1414,24 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1396,24 +1413,24 @@ static bool ath9k_hw_set_reset(struct at
|
||||
rst_flags |= AR_RTC_RC_MAC_COLD;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411.
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2979,7 +2979,8 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2977,7 +2977,8 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
{
|
||||
struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
|
||||
struct ieee80211_channel *channel;
|
||||
@ -18,7 +18,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411.
|
||||
u16 ctl = NO_CTL;
|
||||
|
||||
if (!chan)
|
||||
@@ -2991,9 +2992,14 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2989,9 +2990,14 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
channel = chan->chan;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_COMBINED_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2998,6 +2998,10 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2996,6 +2996,10 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
if (ant_gain > max_gain)
|
||||
ant_reduction = ant_gain - max_gain;
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -48,7 +48,7 @@ int ath9k_modparam_nohwcrypt;
|
||||
@@ -47,7 +47,7 @@ int ath9k_modparam_nohwcrypt;
|
||||
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
|
||||
|
@ -1,10 +1,10 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -830,6 +830,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -826,6 +826,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
|
||||
};
|
||||
|
||||
#ifdef CPTCFG_WIRELESS_WDS
|
||||
#ifdef CPTCFG_ATH9K_CHANNEL_CONTEXT
|
@ -14,7 +14,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -927,6 +927,7 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -907,6 +907,7 @@ static void ath9k_set_hw_capab(struct at
|
||||
ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
|
||||
ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
|
||||
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
|
||||
@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
if (ath9k_ps_enable)
|
||||
ieee80211_hw_set(hw, SUPPORTS_PS);
|
||||
@@ -939,9 +940,6 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -919,9 +920,6 @@ static void ath9k_set_hw_capab(struct at
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_STBC;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1143,25 +1143,25 @@ static int __init ath9k_init(void)
|
||||
@@ -1122,25 +1122,25 @@ static int __init ath9k_init(void)
|
||||
{
|
||||
int error;
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -403,13 +403,8 @@ static void ath9k_hw_init_config(struct
|
||||
@@ -402,13 +402,8 @@ static void ath9k_hw_init_config(struct
|
||||
|
||||
ah->config.rx_intr_mitigation = true;
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -663,6 +663,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
@@ -662,6 +662,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||
|
||||
/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
|
||||
switch (ah->hw_version.devid) {
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -844,6 +844,9 @@ static inline int ath9k_dump_btcoex(stru
|
||||
@@ -843,6 +843,9 @@ static inline int ath9k_dump_btcoex(stru
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
void ath_init_leds(struct ath_softc *sc);
|
||||
void ath_deinit_leds(struct ath_softc *sc);
|
||||
@ -10,7 +10,7 @@
|
||||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -980,6 +983,13 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
@@ -979,6 +982,13 @@ void ath_ant_comb_scan(struct ath_softc
|
||||
|
||||
#define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -1033,9 +1043,8 @@ struct ath_softc {
|
||||
@@ -1032,9 +1042,8 @@ struct ath_softc {
|
||||
spinlock_t chan_lock;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
@ -181,7 +181,7 @@
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -1055,7 +1055,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -1032,7 +1032,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
/* must be initialized before ieee80211_register_hw */
|
@ -94,7 +94,7 @@
|
||||
struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1882,6 +1882,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
|
||||
@@ -1881,6 +1881,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);
|
||||
|
||||
@ -115,7 +115,7 @@
|
||||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -2090,6 +2104,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2089,6 +2103,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ar9003_hw_disable_phy_restart(ah);
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
@ -55,7 +55,7 @@
|
||||
ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -818,7 +818,8 @@ static void ath9k_init_txpower_limits(st
|
||||
@@ -814,7 +814,8 @@ static void ath9k_init_txpower_limits(st
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
|
||||
ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);
|
||||
|
||||
@ -65,7 +65,7 @@
|
||||
}
|
||||
|
||||
static const struct ieee80211_iface_limit if_limits[] = {
|
||||
@@ -1015,6 +1016,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
@@ -992,6 +993,18 @@ static void ath9k_set_hw_capab(struct at
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
|
||||
}
|
||||
|
||||
@ -84,9 +84,9 @@
|
||||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -1060,6 +1073,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
ARRAY_SIZE(ath9k_tpt_blink));
|
||||
#endif
|
||||
@@ -1039,6 +1052,8 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
wiphy_read_of_freq_limits(hw->wiphy);
|
||||
|
||||
+ ath_get_initial_entropy(sc);
|
||||
+
|
||||
@ -110,7 +110,7 @@
|
||||
static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
@@ -1349,9 +1349,30 @@ void ar5008_hw_init_rate_txpower(struct
|
||||
@@ -1340,9 +1340,30 @@ void ar5008_hw_init_rate_txpower(struct
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@
|
||||
static const u32 ar5416_cca_regs[6] = {
|
||||
AR_PHY_CCA,
|
||||
AR_PHY_CH1_CCA,
|
||||
@@ -1366,6 +1387,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
|
||||
@@ -1357,6 +1378,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -248,6 +248,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
@@ -247,6 +247,19 @@ void ath9k_hw_get_channel_centers(struct
|
||||
centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
/******************/
|
||||
/* Chip Revisions */
|
||||
/******************/
|
||||
@@ -1455,6 +1468,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
@@ -1454,6 +1467,9 @@ static bool ath9k_hw_set_reset(struct at
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1554,6 +1570,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
@@ -1553,6 +1569,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||
ar9003_hw_internal_regulator_apply(ah);
|
||||
ath9k_hw_init_pll(ah, chan);
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1860,8 +1879,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
@@ -1859,8 +1878,14 @@ static int ath9k_hw_do_fastcc(struct ath
|
||||
if (AR_SREV_9271(ah))
|
||||
ar9002_hw_load_ani_reg(ah, chan);
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -2115,6 +2140,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2114,6 +2139,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
ath9k_hw_set_radar_params(ah);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
||||
@@ -978,55 +978,6 @@ static bool ar5008_hw_ani_control_new(st
|
||||
@@ -969,55 +969,6 @@ static bool ar5008_hw_ani_control_new(st
|
||||
* on == 0 means more noise imm
|
||||
*/
|
||||
u32 on = param ? 1 : 0;
|
@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -990,6 +991,14 @@ struct ath_led {
|
||||
@@ -989,6 +990,14 @@ struct ath_led {
|
||||
struct led_classdev cdev;
|
||||
};
|
||||
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -1045,6 +1054,9 @@ struct ath_softc {
|
||||
@@ -1044,6 +1053,9 @@ struct ath_softc {
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
const char *led_default_trigger;
|
||||
struct list_head leds;
|
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -1056,6 +1056,7 @@ struct ath_softc {
|
||||
@@ -1055,6 +1055,7 @@ struct ath_softc {
|
||||
struct list_head leds;
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
struct ath9k_gpio_chip *gpiochip;
|
@ -371,7 +371,7 @@
|
||||
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -112,6 +112,7 @@ ATH9K_WOW=
|
||||
@@ -133,6 +133,7 @@ ATH9K_WOW=
|
||||
ATH9K_RFKILL=
|
||||
ATH9K_CHANNEL_CONTEXT=
|
||||
ATH9K_PCOEM=
|
@ -16,7 +16,7 @@
|
||||
|
||||
static const struct platform_device_id ath9k_platform_id_table[] = {
|
||||
{
|
||||
@@ -69,6 +77,242 @@ static const struct ath_bus_ops ath_ahb_
|
||||
@@ -69,6 +77,236 @@ static const struct ath_bus_ops ath_ahb_
|
||||
.eeprom_read = ath_ahb_eeprom_read,
|
||||
};
|
||||
|
||||
@ -218,12 +218,6 @@
|
||||
+ else
|
||||
+ pdata->led_pin = -1;
|
||||
+
|
||||
+ if (of_property_read_bool(pdev->dev.of_node, "qca,disable-2ghz"))
|
||||
+ pdata->disable_2ghz = true;
|
||||
+
|
||||
+ if (of_property_read_bool(pdev->dev.of_node, "qca,disable-5ghz"))
|
||||
+ pdata->disable_5ghz = true;
|
||||
+
|
||||
+ if (of_property_read_bool(pdev->dev.of_node, "qca,tx-gain-buffalo"))
|
||||
+ pdata->tx_gain_buffalo = true;
|
||||
+
|
||||
@ -259,7 +253,7 @@
|
||||
static int ath_ahb_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *mem;
|
||||
@@ -80,6 +324,17 @@ static int ath_ahb_probe(struct platform
|
||||
@@ -80,6 +318,17 @@ static int ath_ahb_probe(struct platform
|
||||
int ret = 0;
|
||||
struct ath_hw *ah;
|
||||
char hw_name[64];
|
||||
@ -277,7 +271,7 @@
|
||||
|
||||
if (!dev_get_platdata(&pdev->dev)) {
|
||||
dev_err(&pdev->dev, "no platform data specified\n");
|
||||
@@ -122,13 +377,16 @@ static int ath_ahb_probe(struct platform
|
||||
@@ -122,13 +371,16 @@ static int ath_ahb_probe(struct platform
|
||||
sc->mem = mem;
|
||||
sc->irq = irq;
|
||||
|
||||
@ -295,7 +289,7 @@
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to initialize device\n");
|
||||
goto err_irq;
|
||||
@@ -159,6 +417,9 @@ static int ath_ahb_remove(struct platfor
|
||||
@@ -159,6 +411,9 @@ static int ath_ahb_remove(struct platfor
|
||||
free_irq(sc->irq, sc);
|
||||
ieee80211_free_hw(sc->hw);
|
||||
}
|
||||
@ -305,7 +299,7 @@
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -168,6 +429,9 @@ static struct platform_driver ath_ahb_dr
|
||||
@@ -168,6 +423,9 @@ static struct platform_driver ath_ahb_dr
|
||||
.remove = ath_ahb_remove,
|
||||
.driver = {
|
||||
.name = "ath9k",
|
||||
@ -325,7 +319,7 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
@@ -1012,6 +1013,9 @@ struct ath_softc {
|
||||
@@ -1011,6 +1012,9 @@ struct ath_softc {
|
||||
struct ath_hw *sc_ah;
|
||||
void __iomem *mem;
|
||||
int irq;
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -654,6 +654,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
@@ -644,6 +644,12 @@ static int ath9k_of_init(struct ath_soft
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -757,6 +763,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -747,6 +753,9 @@ static int ath9k_init_softc(u16 devid, s
|
||||
if (ret)
|
||||
goto err_hw;
|
||||
|
@ -0,0 +1,103 @@
|
||||
From 716c220b4d990a4fe7800d0685ca69dee99e4e8f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Pavel=20L=C3=B6bl?= <pavel@loebl.cz>
|
||||
Date: Fri, 6 May 2022 06:42:46 +0200
|
||||
Subject: [PATCH] brcmfmac: allow setting wlan MAC address using device tree
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows firmware to provide MAC address using device tree. Like in
|
||||
case there is no MAC burned in wlan NVRAM.
|
||||
|
||||
Signed-off-by: Pavel Löbl <pavel@loebl.cz>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220506044246.67146-1-pavel@loebl.cz
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/common.c | 23 ++++++++++++++-----
|
||||
.../broadcom/brcm80211/brcmfmac/common.h | 1 +
|
||||
.../broadcom/brcm80211/brcmfmac/core.c | 4 +++-
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 3 +++
|
||||
4 files changed, 24 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -202,13 +202,24 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
char *ptr;
|
||||
s32 err;
|
||||
|
||||
- /* retreive mac address */
|
||||
- err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||
- sizeof(ifp->mac_addr));
|
||||
- if (err < 0) {
|
||||
- bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
|
||||
- goto done;
|
||||
+ if (is_valid_ether_addr(ifp->mac_addr)) {
|
||||
+ /* set mac address */
|
||||
+ err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||
+ ETH_ALEN);
|
||||
+ if (err < 0) {
|
||||
+ bphy_err(ifp->drvr, "Setting cur_etheraddr failed, %d\n", err);
|
||||
+ goto done;
|
||||
+ }
|
||||
+ } else {
|
||||
+ /* retrieve mac address */
|
||||
+ err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
||||
+ sizeof(ifp->mac_addr));
|
||||
+ if (err < 0) {
|
||||
+ bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
|
||||
+ goto done;
|
||||
+ }
|
||||
}
|
||||
+
|
||||
memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
|
||||
memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
@@ -50,6 +50,7 @@ struct brcmf_mp_device {
|
||||
bool ignore_probe_fail;
|
||||
struct brcmfmac_pd_cc *country_codes;
|
||||
const char *board_type;
|
||||
+ unsigned char mac[ETH_ALEN];
|
||||
union {
|
||||
struct brcmfmac_sdio_pd sdio;
|
||||
} bus;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/inetdevice.h>
|
||||
+#include <linux/property.h>
|
||||
#include <net/cfg80211.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/addrconf.h>
|
||||
@@ -1226,7 +1227,8 @@ static int brcmf_bus_started(struct brcm
|
||||
brcmf_dbg(TRACE, "\n");
|
||||
|
||||
/* add primary networking interface */
|
||||
- ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d", NULL);
|
||||
+ ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d",
|
||||
+ is_valid_ether_addr(drvr->settings->mac) ? drvr->settings->mac : NULL);
|
||||
if (IS_ERR(ifp))
|
||||
return PTR_ERR(ifp);
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
+#include <linux/of_net.h>
|
||||
|
||||
#include <defs.h>
|
||||
#include "debug.h"
|
||||
@@ -97,6 +98,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
if (err)
|
||||
brcmf_err("failed to get OF country code map (err=%d)\n", err);
|
||||
|
||||
+ of_get_mac_address(np, settings->mac);
|
||||
+
|
||||
if (bus_type != BRCMF_BUSTYPE_SDIO)
|
||||
return;
|
||||
|
@ -42,7 +42,7 @@
|
||||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
if (wl->radio_enabled) {
|
||||
@@ -5176,6 +5173,47 @@ static int b43_op_get_survey(struct ieee
|
||||
@@ -5175,6 +5172,47 @@ static int b43_op_get_survey(struct ieee
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@
|
||||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.conf_tx = b43_op_conf_tx,
|
||||
@@ -5197,6 +5235,8 @@ static const struct ieee80211_ops b43_hw
|
||||
@@ -5196,6 +5234,8 @@ static const struct ieee80211_ops b43_hw
|
||||
.sw_scan_complete = b43_op_sw_scan_complete_notifier,
|
||||
.get_survey = b43_op_get_survey,
|
||||
.rfkill_poll = b43_rfkill_poll,
|
||||
@ -99,7 +99,7 @@
|
||||
};
|
||||
|
||||
/* Hard-reset the chip. Do not call this directly.
|
||||
@@ -5498,6 +5538,8 @@ static int b43_one_core_attach(struct b4
|
||||
@@ -5497,6 +5537,8 @@ static int b43_one_core_attach(struct b4
|
||||
if (!wldev)
|
||||
goto out;
|
||||
|
||||
@ -108,7 +108,7 @@
|
||||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
wldev->wl = wl;
|
||||
@@ -5592,6 +5634,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
@@ -5588,6 +5630,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
|
@ -13,15 +13,15 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -433,6 +433,7 @@ struct brcmf_fw {
|
||||
@@ -431,6 +431,7 @@ struct brcmf_fw {
|
||||
struct brcmf_fw_request *req;
|
||||
u32 curpos;
|
||||
void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
|
||||
+ struct completion *completion;
|
||||
};
|
||||
|
||||
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx);
|
||||
@@ -640,6 +641,8 @@ static void brcmf_fw_request_done(const
|
||||
#ifdef CONFIG_EFI
|
||||
@@ -655,6 +656,8 @@ static void brcmf_fw_request_done(const
|
||||
fwctx->req = NULL;
|
||||
}
|
||||
fwctx->done(fwctx->dev, ret, fwctx->req);
|
||||
@ -30,16 +30,16 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
kfree(fwctx);
|
||||
}
|
||||
|
||||
@@ -664,6 +667,8 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -695,6 +698,8 @@ int brcmf_fw_get_firmwares(struct device
|
||||
{
|
||||
struct brcmf_fw_item *first = &req->items[0];
|
||||
struct brcmf_fw *fwctx;
|
||||
+ struct completion completion;
|
||||
+ unsigned long time_left;
|
||||
char *alt_path = NULL;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
@@ -680,6 +685,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -712,6 +717,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
fwctx->dev = dev;
|
||||
fwctx->req = req;
|
||||
fwctx->done = fw_cb;
|
||||
@ -47,9 +47,9 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
+ init_completion(&completion);
|
||||
+ fwctx->completion = &completion;
|
||||
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
@@ -687,6 +695,12 @@ int brcmf_fw_get_firmwares(struct device
|
||||
/* First try alternative board-specific path if any */
|
||||
if (fwctx->req->board_type)
|
||||
@@ -730,6 +738,12 @@ int brcmf_fw_get_firmwares(struct device
|
||||
if (ret < 0)
|
||||
brcmf_fw_request_done(NULL, fwctx);
|
||||
|
||||
|
@ -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
|
||||
@@ -2961,6 +2961,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
@@ -2974,6 +2974,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
|
@ -12,9 +12,9 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -12,6 +12,36 @@
|
||||
#include "common.h"
|
||||
#include "of.h"
|
||||
@@ -59,6 +59,36 @@ static int brcmf_of_get_country_codes(st
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* TODO: FIXME: Use DT */
|
||||
+static void brcmf_of_probe_cc(struct device *dev,
|
||||
@ -49,12 +49,12 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings)
|
||||
{
|
||||
@@ -43,6 +73,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
@@ -91,6 +121,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
of_node_put(root);
|
||||
}
|
||||
|
||||
+ brcmf_of_probe_cc(dev, settings);
|
||||
+
|
||||
if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
|
||||
!of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
return;
|
||||
|
||||
|
@ -0,0 +1,196 @@
|
||||
From 4e32024cbb14230af3048e249e84f8c2b25ce45a Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Thu, 28 Oct 2021 15:03:16 +0100
|
||||
Subject: [PATCH] brcmfmac: Read alternative firmware names from DT
|
||||
|
||||
Add the ability to load the names of alternative firmwares from the
|
||||
Device Tree node. This permits separate firmwares for 43436s and 43438
|
||||
and allows downstream firmwares to coexist with upstream.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 36 ++++++++++++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/of.h | 7 +++
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 47 +++++++++++++++++--
|
||||
3 files changed, 87 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "debug.h"
|
||||
#include "core.h"
|
||||
#include "common.h"
|
||||
+#include "firmware.h"
|
||||
#include "of.h"
|
||||
|
||||
static int brcmf_of_get_country_codes(struct device *dev,
|
||||
@@ -153,3 +154,38 @@ void brcmf_of_probe(struct device *dev,
|
||||
sdio->oob_irq_nr = irq;
|
||||
sdio->oob_irq_flags = irqf;
|
||||
}
|
||||
+
|
||||
+struct brcmf_firmware_mapping *
|
||||
+brcmf_of_fwnames(struct device *dev, u32 *fwname_count)
|
||||
+{
|
||||
+ struct device_node *np = dev->of_node;
|
||||
+ struct brcmf_firmware_mapping *fwnames;
|
||||
+ struct device_node *map_np, *fw_np;
|
||||
+ int of_count;
|
||||
+ int count = 0;
|
||||
+
|
||||
+ map_np = of_get_child_by_name(np, "firmwares");
|
||||
+ of_count = of_get_child_count(map_np);
|
||||
+ if (!of_count)
|
||||
+ return NULL;
|
||||
+
|
||||
+ fwnames = devm_kcalloc(dev, of_count,
|
||||
+ sizeof(struct brcmf_firmware_mapping),
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ for_each_child_of_node(map_np, fw_np)
|
||||
+ {
|
||||
+ struct brcmf_firmware_mapping *cur = &fwnames[count];
|
||||
+
|
||||
+ if (of_property_read_u32(fw_np, "chipid", &cur->chipid) ||
|
||||
+ of_property_read_u32(fw_np, "revmask", &cur->revmask))
|
||||
+ continue;
|
||||
+ cur->fw_base = of_get_property(fw_np, "fw_base", NULL);
|
||||
+ if (cur->fw_base)
|
||||
+ count++;
|
||||
+ }
|
||||
+
|
||||
+ *fwname_count = count;
|
||||
+
|
||||
+ return count ? fwnames : NULL;
|
||||
+}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
|
||||
@@ -5,9 +5,16 @@
|
||||
#ifdef CONFIG_OF
|
||||
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings);
|
||||
+struct brcmf_firmware_mapping *
|
||||
+brcmf_of_fwnames(struct device *dev, u32 *map_count);
|
||||
#else
|
||||
static void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings)
|
||||
{
|
||||
}
|
||||
+static struct brcmf_firmware_mapping *
|
||||
+brcmf_of_fwnames(struct device *dev, u32 *map_count)
|
||||
+{
|
||||
+ return NULL;
|
||||
+}
|
||||
#endif /* CONFIG_OF */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "core.h"
|
||||
#include "common.h"
|
||||
#include "bcdc.h"
|
||||
+#include "of.h"
|
||||
|
||||
#define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500)
|
||||
#define CTL_DONE_TIMEOUT msecs_to_jiffies(2500)
|
||||
@@ -633,7 +634,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "b
|
||||
/* per-board firmware binaries */
|
||||
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-sdio.*.bin");
|
||||
|
||||
-static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
+static const struct brcmf_firmware_mapping sdio_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
|
||||
@@ -659,6 +660,9 @@ static const struct brcmf_firmware_mappi
|
||||
BRCMF_FW_ENTRY(CY_CC_43752_CHIP_ID, 0xFFFFFFFF, 43752)
|
||||
};
|
||||
|
||||
+static const struct brcmf_firmware_mapping *brcmf_sdio_fwnames = sdio_fwnames;
|
||||
+static u32 brcmf_sdio_fwnames_count = ARRAY_SIZE(sdio_fwnames);
|
||||
+
|
||||
#define TXCTL_CREDITS 2
|
||||
|
||||
static void pkt_align(struct sk_buff *p, int len, int align)
|
||||
@@ -4140,7 +4144,7 @@ int brcmf_sdio_get_fwname(struct device
|
||||
|
||||
fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
|
||||
brcmf_sdio_fwnames,
|
||||
- ARRAY_SIZE(brcmf_sdio_fwnames),
|
||||
+ brcmf_sdio_fwnames_count,
|
||||
fwnames, ARRAY_SIZE(fwnames));
|
||||
if (!fwreq)
|
||||
return -ENOMEM;
|
||||
@@ -4196,6 +4200,9 @@ static const struct brcmf_bus_ops brcmf_
|
||||
#define BRCMF_SDIO_FW_CODE 0
|
||||
#define BRCMF_SDIO_FW_NVRAM 1
|
||||
|
||||
+static struct brcmf_fw_request *
|
||||
+brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus);
|
||||
+
|
||||
static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
struct brcmf_fw_request *fwreq)
|
||||
{
|
||||
@@ -4211,6 +4218,22 @@ static void brcmf_sdio_firmware_callback
|
||||
|
||||
brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
|
||||
|
||||
+ if (err && brcmf_sdio_fwnames != sdio_fwnames) {
|
||||
+ /* Try again with the standard firmware names */
|
||||
+ brcmf_sdio_fwnames = sdio_fwnames;
|
||||
+ brcmf_sdio_fwnames_count = ARRAY_SIZE(sdio_fwnames);
|
||||
+ kfree(fwreq);
|
||||
+ fwreq = brcmf_sdio_prepare_fw_request(bus);
|
||||
+ if (!fwreq) {
|
||||
+ err = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+ err = brcmf_fw_get_firmwares(dev, fwreq,
|
||||
+ brcmf_sdio_firmware_callback);
|
||||
+ if (!err)
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
@@ -4419,7 +4442,7 @@ brcmf_sdio_prepare_fw_request(struct brc
|
||||
|
||||
fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev,
|
||||
brcmf_sdio_fwnames,
|
||||
- ARRAY_SIZE(brcmf_sdio_fwnames),
|
||||
+ brcmf_sdio_fwnames_count,
|
||||
fwnames, ARRAY_SIZE(fwnames));
|
||||
if (!fwreq)
|
||||
return NULL;
|
||||
@@ -4437,6 +4460,9 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
struct brcmf_sdio *bus;
|
||||
struct workqueue_struct *wq;
|
||||
struct brcmf_fw_request *fwreq;
|
||||
+ struct brcmf_firmware_mapping *of_fwnames, *fwnames = NULL;
|
||||
+ const int fwname_size = sizeof(struct brcmf_firmware_mapping);
|
||||
+ u32 of_fw_count;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
@@ -4519,6 +4545,21 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
|
||||
brcmf_dbg(INFO, "completed!!\n");
|
||||
|
||||
+ of_fwnames = brcmf_of_fwnames(sdiodev->dev, &of_fw_count);
|
||||
+ if (of_fwnames)
|
||||
+ fwnames = devm_kcalloc(sdiodev->dev,
|
||||
+ of_fw_count + brcmf_sdio_fwnames_count,
|
||||
+ fwname_size, GFP_KERNEL);
|
||||
+
|
||||
+ if (fwnames) {
|
||||
+ /* The array is scanned in order, so overrides come first */
|
||||
+ memcpy(fwnames, of_fwnames, of_fw_count * fwname_size);
|
||||
+ memcpy(fwnames + of_fw_count, sdio_fwnames,
|
||||
+ brcmf_sdio_fwnames_count * fwname_size);
|
||||
+ brcmf_sdio_fwnames = fwnames;
|
||||
+ brcmf_sdio_fwnames_count += of_fw_count;
|
||||
+ }
|
||||
+
|
||||
fwreq = brcmf_sdio_prepare_fw_request(bus);
|
||||
if (!fwreq) {
|
||||
ret = -ENOMEM;
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2913,6 +2913,63 @@ done:
|
||||
@@ -2921,6 +2921,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)
|
||||
{
|
||||
@@ -3008,6 +3065,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
@@ -3021,6 +3078,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;
|
||||
@@ -3032,6 +3090,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||
@@ -3045,6 +3103,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());
|
||||
@@ -5518,6 +5587,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
@@ -5573,6 +5642,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,
|
||||
@ -100,7 +100,7 @@
|
||||
.add_key = brcmf_cfg80211_add_key,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1356,6 +1356,8 @@ int brcmf_attach(struct device *dev)
|
||||
@@ -1363,6 +1363,8 @@ int brcmf_attach(struct device *dev)
|
||||
|
||||
/* Link to bus module */
|
||||
drvr->hdrlen = 0;
|
||||
@ -109,7 +109,7 @@
|
||||
|
||||
/* Attach and link in the protocol */
|
||||
ret = brcmf_proto_attach(drvr);
|
||||
@@ -1438,6 +1440,12 @@ void brcmf_detach(struct device *dev)
|
||||
@@ -1445,6 +1447,12 @@ void brcmf_detach(struct device *dev)
|
||||
if (drvr == NULL)
|
||||
return;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/compat/main.c
|
||||
+++ b/compat/main.c
|
||||
@@ -20,31 +20,6 @@ MODULE_LICENSE("GPL");
|
||||
@@ -19,31 +19,6 @@ MODULE_LICENSE("GPL");
|
||||
#error "You need a CPTCFG_VERSION"
|
||||
#endif
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
--- a/backport-include/linux/kconfig.h
|
||||
+++ b/backport-include/linux/kconfig.h
|
||||
@@ -5,6 +5,8 @@
|
||||
#include_next <linux/kconfig.h>
|
||||
#endif
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
|
||||
+
|
||||
#ifndef __ARG_PLACEHOLDER_1
|
||||
#define __ARG_PLACEHOLDER_1 0,
|
||||
#define config_enabled(cfg) _config_enabled(cfg)
|
||||
@@ -16,6 +18,7 @@
|
||||
* 3.1 - 3.3 had a broken version of this, so undef
|
||||
* (they didn't have __ARG_PLACEHOLDER_1)
|
||||
*/
|
||||
+
|
||||
#undef IS_ENABLED
|
||||
#define IS_ENABLED(option) \
|
||||
(config_enabled(option) || config_enabled(option##_MODULE))
|
||||
@@ -31,6 +34,8 @@
|
||||
#undef IS_BUILTIN
|
||||
#define IS_BUILTIN(option) config_enabled(option)
|
||||
|
||||
+#endif
|
||||
+
|
||||
#ifndef IS_REACHABLE
|
||||
/*
|
||||
* IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
|
@ -1,15 +0,0 @@
|
||||
--- a/backport-include/linux/rfkill.h
|
||||
+++ b/backport-include/linux/rfkill.h
|
||||
@@ -2,6 +2,12 @@
|
||||
#define __COMPAT_RFKILL_H
|
||||
#include <linux/version.h>
|
||||
|
||||
+#undef CONFIG_RFKILL
|
||||
+#undef CONFIG_RFKILL_FULL
|
||||
+#undef CONFIG_RFKILL_LEDS
|
||||
+#undef CONFIG_RFKILL_MODULE
|
||||
+#undef CONFIG_RFKILL_FULL_MODULE
|
||||
+
|
||||
#if LINUX_VERSION_IS_GEQ(3,10,0)
|
||||
#include_next <linux/rfkill.h>
|
||||
#else
|
@ -1,9 +1,9 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -437,43 +437,6 @@ USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
@@ -451,43 +451,6 @@ USB_VL600=
|
||||
USB_NET_CH9200=
|
||||
USB_NET_AQC111=
|
||||
USB_RTL8153_ECM=
|
||||
-SSB_POSSIBLE=
|
||||
-SSB=
|
||||
-SSB_SPROM=
|
||||
@ -192,10 +192,10 @@
|
||||
select BRCMUTIL
|
||||
--- a/Kconfig.local
|
||||
+++ b/Kconfig.local
|
||||
@@ -1315,117 +1315,6 @@ config BACKPORTED_USB_NET_CH9200
|
||||
config BACKPORTED_USB_NET_AQC111
|
||||
@@ -1357,117 +1357,6 @@ config BACKPORTED_USB_NET_AQC111
|
||||
config BACKPORTED_USB_RTL8153_ECM
|
||||
tristate
|
||||
default USB_NET_AQC111
|
||||
default USB_RTL8153_ECM
|
||||
-config BACKPORTED_SSB_POSSIBLE
|
||||
- tristate
|
||||
- default SSB_POSSIBLE
|
||||
@ -312,7 +312,7 @@
|
||||
default USB_ACM
|
||||
--- a/Kconfig.sources
|
||||
+++ b/Kconfig.sources
|
||||
@@ -7,9 +7,6 @@ source "$BACKPORT_DIR/net/mac80211/Kconf
|
||||
@@ -10,9 +10,6 @@ source "$BACKPORT_DIR/drivers/soc/qcom/K
|
||||
source "$BACKPORT_DIR/drivers/net/wireless/Kconfig"
|
||||
source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
|
||||
|
||||
@ -324,9 +324,9 @@
|
||||
source "$BACKPORT_DIR/drivers/staging/Kconfig"
|
||||
--- a/Makefile.kernel
|
||||
+++ b/Makefile.kernel
|
||||
@@ -40,8 +40,6 @@ obj-y += compat/
|
||||
obj-$(CPTCFG_CFG80211) += net/wireless/
|
||||
obj-$(CPTCFG_MAC80211) += net/mac80211/
|
||||
@@ -43,8 +43,6 @@ obj-$(CPTCFG_QRTR) += net/qrtr/
|
||||
obj-$(CPTCFG_QCOM_QMI_HELPERS) += drivers/soc/qcom/
|
||||
obj-$(CPTCFG_MHI_BUS) += drivers/bus/mhi/
|
||||
obj-$(CPTCFG_WLAN) += drivers/net/wireless/
|
||||
-obj-$(CPTCFG_SSB) += drivers/ssb/
|
||||
-obj-$(CPTCFG_BCMA) += drivers/bcma/
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -5695,6 +5695,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
@@ -5699,6 +5699,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static const struct pci_device_id mwl8k_pci_id_table[] = {
|
||||
|
@ -0,0 +1,41 @@
|
||||
From ef8098cd6cb8b5989afef2e8461fe6ba9570a854 Mon Sep 17 00:00:00 2001
|
||||
From: Josef Schlehofer <pepe.schlehofer@gmail.com>
|
||||
Date: Wed, 24 Nov 2021 12:47:40 +0100
|
||||
Subject: [PATCH] mwifiex: increase the global limit up to 4 SSID
|
||||
|
||||
Firmware for SDIO (88W8997), which is used in Turris MOX SDIO addon [1],
|
||||
allows up to 4 SSID. Unfortunately, driver (even in mainline kernel)
|
||||
has a global limit for all Marvell cards up to 3 SSID.
|
||||
|
||||
Pali Rohár tested this patch and verified that the SDIO Wi-Fi addon works
|
||||
with the 4 SSID. So, let's increase the global limit from 3 to 4.
|
||||
|
||||
Ideally, this patch should be done differently before sending
|
||||
it to Linux kernel. It means that limit definition should be moved to
|
||||
the card-specific structure.
|
||||
|
||||
[1] https://docs.turris.cz/hw/mox/addons/#wi-fi-sdio
|
||||
---
|
||||
drivers/net/wireless/marvell/mwifiex/decl.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/decl.h
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/decl.h
|
||||
@@ -30,7 +30,7 @@
|
||||
#include <net/cfg80211.h>
|
||||
|
||||
#define MWIFIEX_BSS_COEX_COUNT 2
|
||||
-#define MWIFIEX_MAX_BSS_NUM (3)
|
||||
+#define MWIFIEX_MAX_BSS_NUM (4)
|
||||
|
||||
#define MWIFIEX_DMA_ALIGN_SZ 64
|
||||
#define MWIFIEX_RX_HEADROOM 64
|
||||
@@ -112,7 +112,7 @@
|
||||
#define MWIFIEX_RATE_INDEX_OFDM0 4
|
||||
|
||||
#define MWIFIEX_MAX_STA_NUM 3
|
||||
-#define MWIFIEX_MAX_UAP_NUM 3
|
||||
+#define MWIFIEX_MAX_UAP_NUM 4
|
||||
#define MWIFIEX_MAX_P2P_NUM 3
|
||||
|
||||
#define MWIFIEX_A_BAND_START_FREQ 5000
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -6280,6 +6280,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
@@ -6285,6 +6285,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
|
||||
priv->running_bsses = 0;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
return rc;
|
||||
|
||||
err_stop_firmware:
|
||||
@@ -6313,8 +6315,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
@@ -6318,8 +6320,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
return;
|
||||
priv = hw->priv;
|
||||
|
||||
|
@ -0,0 +1,189 @@
|
||||
From f7252b1b5755150535af226e806594bbefd45e0f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
|
||||
Date: Sun, 26 Sep 2021 14:39:44 +0200
|
||||
Subject: [PATCH] mwifiex: Print stringified name of command in error log
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Failed hex command number in error log is hard to understand.
|
||||
So add also more human readable stringified command name into error log.
|
||||
|
||||
Signed-off-by: Pali Rohár <pali@kernel.org>
|
||||
---
|
||||
drivers/net/wireless/marvell/mwifiex/cmdevt.c | 96 +++++++++++++++++--
|
||||
drivers/net/wireless/marvell/mwifiex/main.h | 2 +
|
||||
.../wireless/marvell/mwifiex/sta_cmdresp.c | 5 +-
|
||||
.../net/wireless/marvell/mwifiex/uap_cmd.c | 3 +-
|
||||
4 files changed, 95 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||
@@ -28,6 +28,85 @@
|
||||
|
||||
static void mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter);
|
||||
|
||||
+const char *
|
||||
+mwifiex_cmd_to_str(u16 command)
|
||||
+{
|
||||
+ switch (command) {
|
||||
+ case HostCmd_CMD_GET_HW_SPEC: return "GET_HW_SPEC";
|
||||
+ case HostCmd_CMD_802_11_SCAN: return "SCAN";
|
||||
+ case HostCmd_CMD_802_11_GET_LOG: return "GET_LOG";
|
||||
+ case HostCmd_CMD_MAC_MULTICAST_ADR: return "MAC_MULTICAST_ADR";
|
||||
+ case HostCmd_CMD_802_11_EEPROM_ACCESS: return "EEPROM_ACCESS";
|
||||
+ case HostCmd_CMD_802_11_ASSOCIATE: return "ASSOCIATE";
|
||||
+ case HostCmd_CMD_802_11_SNMP_MIB: return "SNMP_MIB";
|
||||
+ case HostCmd_CMD_MAC_REG_ACCESS: return "MAC_REG_ACCESS";
|
||||
+ case HostCmd_CMD_BBP_REG_ACCESS: return "BBP_REG_ACCESS";
|
||||
+ case HostCmd_CMD_RF_REG_ACCESS: return "RF_REG_ACCESS";
|
||||
+ case HostCmd_CMD_PMIC_REG_ACCESS: return "PMIC_REG_ACCESS";
|
||||
+ case HostCmd_CMD_RF_TX_PWR: return "RF_TX_PWR";
|
||||
+ case HostCmd_CMD_RF_ANTENNA: return "RF_ANTENNA";
|
||||
+ case HostCmd_CMD_802_11_DEAUTHENTICATE: return "DEAUTHENTICATE";
|
||||
+ case HostCmd_CMD_MAC_CONTROL: return "MAC_CONTROL";
|
||||
+ case HostCmd_CMD_802_11_AD_HOC_START: return "AD_HOC_START";
|
||||
+ case HostCmd_CMD_802_11_AD_HOC_JOIN: return "AD_HOC_JOIN";
|
||||
+ case HostCmd_CMD_802_11_AD_HOC_STOP: return "AD_HOC_STOP";
|
||||
+ case HostCmd_CMD_802_11_MAC_ADDRESS: return "MAC_ADDRESS";
|
||||
+ case HostCmd_CMD_802_11D_DOMAIN_INFO: return "DOMAIN_INFO";
|
||||
+ case HostCmd_CMD_802_11_KEY_MATERIAL: return "KEY_MATERIAL";
|
||||
+ case HostCmd_CMD_802_11_BG_SCAN_CONFIG: return "BG_SCAN_CONFIG";
|
||||
+ case HostCmd_CMD_802_11_BG_SCAN_QUERY: return "BG_SCAN_QUERY";
|
||||
+ case HostCmd_CMD_WMM_GET_STATUS: return "WMM_GET_STATUS";
|
||||
+ case HostCmd_CMD_802_11_SUBSCRIBE_EVENT: return "SUBSCRIBE_EVENT";
|
||||
+ case HostCmd_CMD_802_11_TX_RATE_QUERY: return "TX_RATE_QUERY";
|
||||
+ case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS: return "IBSS_COALESCING_STATUS";
|
||||
+ case HostCmd_CMD_MEM_ACCESS: return "MEM_ACCESS";
|
||||
+ case HostCmd_CMD_CFG_DATA: return "CFG_DATA";
|
||||
+ case HostCmd_CMD_VERSION_EXT: return "VERSION_EXT";
|
||||
+ case HostCmd_CMD_MEF_CFG: return "MEF_CFG";
|
||||
+ case HostCmd_CMD_RSSI_INFO: return "RSSI_INFO";
|
||||
+ case HostCmd_CMD_FUNC_INIT: return "FUNC_INIT";
|
||||
+ case HostCmd_CMD_FUNC_SHUTDOWN: return "FUNC_SHUTDOWN";
|
||||
+ case HOST_CMD_APCMD_SYS_RESET: return "SYS_RESET";
|
||||
+ case HostCmd_CMD_UAP_SYS_CONFIG: return "UAP_SYS_CONFIG";
|
||||
+ case HostCmd_CMD_UAP_BSS_START: return "UAP_BSS_START";
|
||||
+ case HostCmd_CMD_UAP_BSS_STOP: return "UAP_BSS_STOP";
|
||||
+ case HOST_CMD_APCMD_STA_LIST: return "STA_LIST";
|
||||
+ case HostCmd_CMD_UAP_STA_DEAUTH: return "UAP_STA_DEAUTH";
|
||||
+ case HostCmd_CMD_11N_CFG: return "11N_CFG";
|
||||
+ case HostCmd_CMD_11N_ADDBA_REQ: return "ADDBA_REQ";
|
||||
+ case HostCmd_CMD_11N_ADDBA_RSP: return "ADDBA_RSP";
|
||||
+ case HostCmd_CMD_11N_DELBA: return "DELBA";
|
||||
+ case HostCmd_CMD_RECONFIGURE_TX_BUFF: return "RECONFIGURE_TX_BUFF";
|
||||
+ case HostCmd_CMD_CHAN_REPORT_REQUEST: return "CHAN_REPORT_REQUEST";
|
||||
+ case HostCmd_CMD_AMSDU_AGGR_CTRL: return "AMSDU_AGGR_CTRL";
|
||||
+ case HostCmd_CMD_TXPWR_CFG: return "TXPWR_CFG";
|
||||
+ case HostCmd_CMD_TX_RATE_CFG: return "TX_RATE_CFG";
|
||||
+ case HostCmd_CMD_ROBUST_COEX: return "ROBUST_COEX";
|
||||
+ case HostCmd_CMD_802_11_PS_MODE_ENH: return "PS_MODE_ENH";
|
||||
+ case HostCmd_CMD_802_11_HS_CFG_ENH: return "HS_CFG_ENH";
|
||||
+ case HostCmd_CMD_P2P_MODE_CFG: return "P2P_MODE_CFG";
|
||||
+ case HostCmd_CMD_CAU_REG_ACCESS: return "CAU_REG_ACCESS";
|
||||
+ case HostCmd_CMD_SET_BSS_MODE: return "SET_BSS_MODE";
|
||||
+ case HostCmd_CMD_PCIE_DESC_DETAILS: return "PCIE_DESC_DETAILS";
|
||||
+ case HostCmd_CMD_802_11_SCAN_EXT: return "SCAN_EXT";
|
||||
+ case HostCmd_CMD_COALESCE_CFG: return "COALESCE_CFG";
|
||||
+ case HostCmd_CMD_MGMT_FRAME_REG: return "MGMT_FRAME_REG";
|
||||
+ case HostCmd_CMD_REMAIN_ON_CHAN: return "REMAIN_ON_CHAN";
|
||||
+ case HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG: return "GTK_REKEY_OFFLOAD_CFG";
|
||||
+ case HostCmd_CMD_11AC_CFG: return "11AC_CFG";
|
||||
+ case HostCmd_CMD_HS_WAKEUP_REASON: return "HS_WAKEUP_REASON";
|
||||
+ case HostCmd_CMD_TDLS_CONFIG: return "TDLS_CONFIG";
|
||||
+ case HostCmd_CMD_MC_POLICY: return "MC_POLICY";
|
||||
+ case HostCmd_CMD_TDLS_OPER: return "TDLS_OPER";
|
||||
+ case HostCmd_CMD_FW_DUMP_EVENT: return "FW_DUMP_EVENT";
|
||||
+ case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: return "SDIO_SP_RX_AGGR_CFG";
|
||||
+ case HostCmd_CMD_STA_CONFIGURE: return "STA_CONFIGURE";
|
||||
+ case HostCmd_CMD_CHAN_REGION_CFG: return "CHAN_REGION_CFG";
|
||||
+ case HostCmd_CMD_PACKET_AGGR_CTRL: return "PACKET_AGGR_CTRL";
|
||||
+ default: return "UNKNOWN";
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* This function initializes a command node.
|
||||
*
|
||||
@@ -205,8 +284,8 @@ static int mwifiex_dnld_cmd_to_fw(struct
|
||||
cmd_code != HostCmd_CMD_FUNC_SHUTDOWN &&
|
||||
cmd_code != HostCmd_CMD_FUNC_INIT) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
- "DNLD_CMD: FW in reset state, ignore cmd %#x\n",
|
||||
- cmd_code);
|
||||
+ "DNLD_CMD: FW in reset state, ignore cmd %s (%#x)\n",
|
||||
+ mwifiex_cmd_to_str(cmd_code), cmd_code);
|
||||
mwifiex_recycle_cmd_node(adapter, cmd_node);
|
||||
queue_work(adapter->workqueue, &adapter->main_work);
|
||||
return -1;
|
||||
@@ -660,8 +739,8 @@ int mwifiex_send_cmd(struct mwifiex_priv
|
||||
/* Return error, since the command preparation failed */
|
||||
if (ret) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
- "PREP_CMD: cmd %#x preparation failed\n",
|
||||
- cmd_no);
|
||||
+ "PREP_CMD: cmd %s (%#x) preparation failed\n",
|
||||
+ mwifiex_cmd_to_str(cmd_no), cmd_no);
|
||||
mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
|
||||
return -1;
|
||||
}
|
||||
@@ -900,8 +979,9 @@ int mwifiex_process_cmdresp(struct mwifi
|
||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
|
||||
if (ret) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
- "%s: cmd %#x failed during\t"
|
||||
- "initialization\n", __func__, cmdresp_no);
|
||||
+ "%s: cmd %s (%#x) failed during\t"
|
||||
+ "initialization\n", __func__,
|
||||
+ mwifiex_cmd_to_str(cmdresp_no), cmdresp_no);
|
||||
mwifiex_init_fw_complete(adapter);
|
||||
return -1;
|
||||
} else if (adapter->last_init_cmd == cmdresp_no)
|
||||
@@ -1264,8 +1344,8 @@ mwifiex_process_sleep_confirm_resp(struc
|
||||
|
||||
if (command != HostCmd_CMD_802_11_PS_MODE_ENH) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
- "%s: rcvd unexpected resp for cmd %#x, result = %x\n",
|
||||
- __func__, command, result);
|
||||
+ "%s: rcvd unexpected resp for cmd %s (%#x), result = %x\n",
|
||||
+ __func__, mwifiex_cmd_to_str(command), command, result);
|
||||
return;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
@@ -1106,6 +1106,8 @@ void mwifiex_cancel_all_pending_cmd(stru
|
||||
void mwifiex_cancel_pending_scan_cmd(struct mwifiex_adapter *adapter);
|
||||
void mwifiex_cancel_scan(struct mwifiex_adapter *adapter);
|
||||
|
||||
+const char *mwifiex_cmd_to_str(u16 command);
|
||||
+
|
||||
void mwifiex_recycle_cmd_node(struct mwifiex_adapter *adapter,
|
||||
struct cmd_ctrl_node *cmd_node);
|
||||
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
||||
@@ -48,8 +48,9 @@ mwifiex_process_cmdresp_error(struct mwi
|
||||
struct host_cmd_ds_802_11_ps_mode_enh *pm;
|
||||
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
- "CMD_RESP: cmd %#x error, result=%#x\n",
|
||||
- resp->command, resp->result);
|
||||
+ "CMD_RESP: cmd %s (%#x) error, result=%#x\n",
|
||||
+ mwifiex_cmd_to_str(le16_to_cpu(resp->command)),
|
||||
+ le16_to_cpu(resp->command), le16_to_cpu(resp->result));
|
||||
|
||||
if (adapter->curr_cmd->wait_q_enabled)
|
||||
adapter->cmd_wait_q.status = -1;
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
|
||||
@@ -806,7 +806,8 @@ int mwifiex_uap_prepare_cmd(struct mwifi
|
||||
break;
|
||||
default:
|
||||
mwifiex_dbg(priv->adapter, ERROR,
|
||||
- "PREP_CMD: unknown cmd %#x\n", cmd_no);
|
||||
+ "PREP_CMD: unknown cmd (%s) %#x\n",
|
||||
+ mwifiex_cmd_to_str(cmd_no), cmd_no);
|
||||
return -1;
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -9416,6 +9416,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9435,6 +9435,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
rf = RF3853;
|
||||
else if (rt2x00_rt(rt2x00dev, RT5350))
|
||||
rf = RF5350;
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -332,6 +332,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
@@ -345,6 +345,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
@ -105,7 +105,7 @@
|
||||
.drv_init_registers = rt2800mmio_init_registers,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -694,6 +694,7 @@ enum rt2x00_capability_flags {
|
||||
@@ -703,6 +703,7 @@ enum rt2x00_capability_flags {
|
||||
REQUIRE_HT_TX_DESC,
|
||||
REQUIRE_PS_AUTOWAKE,
|
||||
REQUIRE_DELAYED_RFKILL,
|
||||
@ -113,7 +113,7 @@
|
||||
|
||||
/*
|
||||
* Capabilities
|
||||
@@ -970,6 +971,11 @@ struct rt2x00_dev {
|
||||
@@ -980,6 +981,11 @@ struct rt2x00_dev {
|
||||
const struct firmware *fw;
|
||||
|
||||
/*
|
||||
@ -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
|
||||
@@ -1406,6 +1406,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
|
||||
@@ -1401,6 +1401,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.
|
||||
*/
|
||||
@@ -1549,6 +1553,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
@@ -1541,6 +1545,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
* Free the driver data.
|
||||
*/
|
||||
kfree(rt2x00dev->drv_data);
|
||||
|
@ -12,7 +12,7 @@
|
||||
#endif /* _RT2X00_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1012,6 +1012,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1007,6 +1007,22 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
num_rates += 4;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -399,6 +399,7 @@ struct hw_mode_spec {
|
||||
@@ -408,6 +408,7 @@ struct hw_mode_spec {
|
||||
unsigned int supported_bands;
|
||||
#define SUPPORT_BAND_2GHZ 0x00000001
|
||||
#define SUPPORT_BAND_5GHZ 0x00000002
|
||||
|
@ -1,19 +1,18 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -990,8 +990,13 @@ static void rt2x00lib_rate(struct ieee80
|
||||
@@ -989,6 +989,12 @@ static void rt2x00lib_rate(struct ieee80
|
||||
|
||||
void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
|
||||
{
|
||||
+ struct rt2x00_platform_data *pdata;
|
||||
const char *mac_addr;
|
||||
|
||||
+
|
||||
+ pdata = rt2x00dev->dev->platform_data;
|
||||
+ if (pdata && pdata->mac_address)
|
||||
+ ether_addr_copy(eeprom_mac_addr, pdata->mac_address);
|
||||
+
|
||||
mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(eeprom_mac_addr, mac_addr);
|
||||
of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
|
||||
|
||||
if (!is_valid_ether_addr(eeprom_mac_addr)) {
|
||||
--- a/include/linux/rt2x00_platform.h
|
||||
+++ b/include/linux/rt2x00_platform.h
|
||||
@@ -14,6 +14,7 @@
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1016,6 +1016,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
@@ -1012,6 +1012,16 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
struct ieee80211_rate *rates;
|
||||
unsigned int num_rates;
|
||||
unsigned int i;
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -9530,6 +9531,17 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9549,6 +9550,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
|
||||
@@ -1344,7 +1344,7 @@ static inline void rt2x00lib_set_if_comb
|
||||
@@ -1340,7 +1340,7 @@ static inline void rt2x00lib_set_if_comb
|
||||
*/
|
||||
if_limit = &rt2x00dev->if_limits_ap;
|
||||
if_limit->max = rt2x00dev->ops->max_ap_intf;
|
||||
|
@ -11,7 +11,7 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1129,6 +1129,19 @@ static void rt2x00lib_remove_hw(struct r
|
||||
@@ -1125,6 +1125,19 @@ static void rt2x00lib_remove_hw(struct r
|
||||
kfree(rt2x00dev->spec.channels_info);
|
||||
}
|
||||
|
||||
@ -31,7 +31,7 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
|
||||
static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
@@ -1210,6 +1223,10 @@ static int rt2x00lib_probe_hw(struct rt2
|
||||
@@ -1206,6 +1219,10 @@ static int rt2x00lib_probe_hw(struct rt2
|
||||
|
||||
#undef RT2X00_TASKLET_INIT
|
||||
|
||||
|
@ -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
|
||||
@@ -4356,6 +4356,45 @@ static void rt2800_config_channel(struct
|
||||
@@ -4369,6 +4369,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);
|
||||
@@ -9559,7 +9598,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9578,7 +9617,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,
|
||||
@@ -9570,6 +9610,18 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -9589,6 +9629,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
|
||||
@@ -8419,6 +8419,56 @@ static void rt2800_init_rfcsr_5592(struc
|
||||
@@ -8438,6 +8438,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)
|
||||
{
|
||||
@@ -9026,6 +9076,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9045,6 +9095,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
|
||||
@@ -8469,6 +8469,155 @@ static void rt2800_rf_self_txdc_cal(stru
|
||||
@@ -8488,6 +8488,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)
|
||||
{
|
||||
@@ -9076,6 +9225,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9095,6 +9244,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
|
||||
@@ -8618,6 +8618,70 @@ static void rt2800_r_calibration(struct
|
||||
@@ -8637,6 +8637,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)
|
||||
{
|
||||
@@ -9227,6 +9291,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9246,6 +9310,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
|
||||
@@ -8682,6 +8682,384 @@ static void rt2800_rxdcoc_calibration(st
|
||||
@@ -8701,6 +8701,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)
|
||||
{
|
||||
@@ -9294,6 +9672,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9313,6 +9691,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
|
||||
@@ -9060,6 +9060,943 @@ restore_value:
|
||||
@@ -9079,6 +9079,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)
|
||||
{
|
||||
@@ -9672,6 +10609,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -9691,6 +10628,7 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rxdcoc_calibration(rt2x00dev);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, true);
|
||||
rt2800_bw_filter_calibration(rt2x00dev, false);
|
||||
|
@ -14,7 +14,7 @@
|
||||
*/
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3685,14 +3685,16 @@ static void rt2800_config_channel_rf7620
|
||||
@@ -3698,14 +3698,16 @@ static void rt2800_config_channel_rf7620
|
||||
rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
|
||||
rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
|
||||
@@ -3726,18 +3728,23 @@ static void rt2800_config_channel_rf7620
|
||||
@@ -3739,18 +3741,23 @@ static void rt2800_config_channel_rf7620
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
|
||||
}
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
|
||||
if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
|
||||
if (conf_is_ht40(conf)) {
|
||||
@@ -3837,25 +3844,29 @@ static void rt2800_config_alc(struct rt2
|
||||
@@ -3850,25 +3857,29 @@ static void rt2800_config_alc(struct rt2
|
||||
if (i == 10000)
|
||||
rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
|
||||
|
||||
@ -121,7 +121,7 @@
|
||||
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
|
||||
|
||||
rt2800_vco_calibration(rt2x00dev);
|
||||
@@ -5887,18 +5898,33 @@ static int rt2800_init_registers(struct
|
||||
@@ -5906,18 +5917,33 @@ static int rt2800_init_registers(struct
|
||||
} else if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
|
||||
} else if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
@ -167,7 +167,7 @@
|
||||
reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
|
||||
rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
|
||||
@@ -7042,14 +7068,16 @@ static void rt2800_init_bbp_6352(struct
|
||||
@@ -7061,14 +7087,16 @@ static void rt2800_init_bbp_6352(struct
|
||||
rt2800_bbp_write(rt2x00dev, 188, 0x00);
|
||||
rt2800_bbp_write(rt2x00dev, 189, 0x00);
|
||||
|
||||
@ -192,7 +192,7 @@
|
||||
|
||||
/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
|
||||
rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
|
||||
@@ -10388,31 +10416,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10407,31 +10435,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
|
||||
|
||||
@ -254,7 +254,7 @@
|
||||
|
||||
/* Initialize RF channel register to default value */
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
|
||||
@@ -10478,63 +10511,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10497,63 +10530,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
|
||||
|
||||
@ -383,7 +383,7 @@
|
||||
|
||||
/* Initialize RF DC calibration register to default value */
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
|
||||
@@ -10597,12 +10638,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10616,12 +10657,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
|
||||
|
||||
|
@ -1,183 +0,0 @@
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1238,6 +1238,8 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
if (test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||
return;
|
||||
|
||||
+ rt2800_update_survey(rt2x00dev);
|
||||
+
|
||||
queue_for_each(rt2x00dev, queue) {
|
||||
switch (queue->qid) {
|
||||
case QID_AC_VO:
|
||||
@@ -1274,6 +1276,18 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_watchdog);
|
||||
|
||||
+void rt2800_update_survey(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct ieee80211_channel *chan = rt2x00dev->hw->conf.chandef.chan;
|
||||
+ struct rt2x00_chan_survey *chan_survey =
|
||||
+ &rt2x00dev->chan_survey[chan->hw_value];
|
||||
+
|
||||
+ chan_survey->time_idle += rt2800_register_read(rt2x00dev, CH_IDLE_STA);
|
||||
+ chan_survey->time_busy += rt2800_register_read(rt2x00dev, CH_BUSY_STA);
|
||||
+ chan_survey->time_ext_busy += rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rt2800_update_survey);
|
||||
+
|
||||
static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
|
||||
unsigned int index)
|
||||
{
|
||||
@@ -12199,26 +12213,30 @@ int rt2800_get_survey(struct ieee80211_h
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = hw->priv;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
- u32 idle, busy, busy_ext;
|
||||
+ struct rt2x00_chan_survey *chan_survey =
|
||||
+ &rt2x00dev->chan_survey[idx];
|
||||
+ enum nl80211_band band = NL80211_BAND_2GHZ;
|
||||
|
||||
- if (idx != 0)
|
||||
+ if (idx >= rt2x00dev->bands[band].n_channels) {
|
||||
+ idx -= rt2x00dev->bands[band].n_channels;
|
||||
+ band = NL80211_BAND_5GHZ;
|
||||
+ }
|
||||
+
|
||||
+ if (idx >= rt2x00dev->bands[band].n_channels)
|
||||
return -ENOENT;
|
||||
|
||||
- survey->channel = conf->chandef.chan;
|
||||
+ if (idx == 0)
|
||||
+ rt2800_update_survey(rt2x00dev);
|
||||
|
||||
- idle = rt2800_register_read(rt2x00dev, CH_IDLE_STA);
|
||||
- busy = rt2800_register_read(rt2x00dev, CH_BUSY_STA);
|
||||
- busy_ext = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
|
||||
-
|
||||
- if (idle || busy) {
|
||||
- survey->filled = SURVEY_INFO_TIME |
|
||||
- SURVEY_INFO_TIME_BUSY |
|
||||
- SURVEY_INFO_TIME_EXT_BUSY;
|
||||
-
|
||||
- survey->time = (idle + busy) / 1000;
|
||||
- survey->time_busy = busy / 1000;
|
||||
- survey->time_ext_busy = busy_ext / 1000;
|
||||
- }
|
||||
+ survey->channel = &rt2x00dev->bands[band].channels[idx];
|
||||
+
|
||||
+ survey->filled = SURVEY_INFO_TIME |
|
||||
+ SURVEY_INFO_TIME_BUSY |
|
||||
+ SURVEY_INFO_TIME_EXT_BUSY;
|
||||
+
|
||||
+ survey->time = div_u64(chan_survey->time_idle + chan_survey->time_busy, 1000);
|
||||
+ survey->time_busy = div_u64(chan_survey->time_busy, 1000);
|
||||
+ survey->time_ext_busy = div_u64(chan_survey->time_ext_busy, 1000);
|
||||
|
||||
if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
|
||||
survey->filled |= SURVEY_INFO_IN_USE;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
@@ -243,6 +243,7 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
void rt2800_watchdog(struct rt2x00_dev *rt2x00dev);
|
||||
+void rt2800_update_survey(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
|
||||
void rt2800_clear_beacon(struct queue_entry *entry);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
||||
@@ -360,6 +360,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.gain_calibration = rt2800_gain_calibration,
|
||||
.vco_calibration = rt2800_vco_calibration,
|
||||
.watchdog = rt2800_watchdog,
|
||||
+ .update_survey = rt2800_update_survey,
|
||||
.start_queue = rt2800mmio_start_queue,
|
||||
.kick_queue = rt2800mmio_kick_queue,
|
||||
.stop_queue = rt2800mmio_stop_queue,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -214,6 +214,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.gain_calibration = rt2800_gain_calibration,
|
||||
.vco_calibration = rt2800_vco_calibration,
|
||||
.watchdog = rt2800_watchdog,
|
||||
+ .update_survey = rt2800_update_survey,
|
||||
.start_queue = rt2800mmio_start_queue,
|
||||
.kick_queue = rt2800mmio_kick_queue,
|
||||
.stop_queue = rt2800mmio_stop_queue,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -183,6 +183,15 @@ struct rf_channel {
|
||||
};
|
||||
|
||||
/*
|
||||
+ * Information structure for channel survey.
|
||||
+ */
|
||||
+struct rt2x00_chan_survey {
|
||||
+ u64 time_idle;
|
||||
+ u64 time_busy;
|
||||
+ u64 time_ext_busy;
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
* Channel information structure
|
||||
*/
|
||||
struct channel_info {
|
||||
@@ -567,6 +576,7 @@ struct rt2x00lib_ops {
|
||||
* Data queue handlers.
|
||||
*/
|
||||
void (*watchdog) (struct rt2x00_dev *rt2x00dev);
|
||||
+ void (*update_survey) (struct rt2x00_dev *rt2x00dev);
|
||||
void (*start_queue) (struct data_queue *queue);
|
||||
void (*kick_queue) (struct data_queue *queue);
|
||||
void (*stop_queue) (struct data_queue *queue);
|
||||
@@ -755,6 +765,7 @@ struct rt2x00_dev {
|
||||
*/
|
||||
struct ieee80211_hw *hw;
|
||||
struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
|
||||
+ struct rt2x00_chan_survey *chan_survey;
|
||||
enum nl80211_band curr_band;
|
||||
int curr_freq;
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1057,6 +1057,12 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
if (!rates)
|
||||
goto exit_free_channels;
|
||||
|
||||
+ rt2x00dev->chan_survey =
|
||||
+ kcalloc(spec->num_channels, sizeof(struct rt2x00_chan_survey),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!rt2x00dev->chan_survey)
|
||||
+ goto exit_free_rates;
|
||||
+
|
||||
/*
|
||||
* Initialize Rate list.
|
||||
*/
|
||||
@@ -1108,6 +1114,8 @@ static int rt2x00lib_probe_hw_modes(stru
|
||||
|
||||
return 0;
|
||||
|
||||
+ exit_free_rates:
|
||||
+ kfree(rates);
|
||||
exit_free_channels:
|
||||
kfree(channels);
|
||||
rt2x00_err(rt2x00dev, "Allocation ieee80211 modes failed\n");
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
||||
@@ -317,6 +317,15 @@ int rt2x00mac_config(struct ieee80211_hw
|
||||
return 0;
|
||||
|
||||
/*
|
||||
+ * To provide correct survey data for survey-based ACS algorithm
|
||||
+ * we have to save survey data for current channel before switching.
|
||||
+ */
|
||||
+ if (rt2x00dev->ops->lib->update_survey &&
|
||||
+ (changed & IEEE80211_CONF_CHANGE_CHANNEL)) {
|
||||
+ rt2x00dev->ops->lib->update_survey(rt2x00dev);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
* Some configuration parameters (e.g. channel and antenna values) can
|
||||
* only be set when the radio is enabled, but do require the RX to
|
||||
* be off. During this period we should keep link tuning enabled,
|
@ -1,118 +0,0 @@
|
||||
Date: Mon, 19 Apr 2021 14:59:56 +0800
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
To: <kvalo@codeaurora.org>
|
||||
CC: <linux-wireless@vger.kernel.org>, <mail@maciej.szmigiero.name>,
|
||||
<Larry.Finger@lwfinger.net>
|
||||
Subject: [PATCH] rtlwifi: implement set_tim by update beacon content
|
||||
|
||||
Once beacon content is changed, we update the content to wifi card by
|
||||
send_beacon_frame(). Then, STA with PS can wake up properly to receive its
|
||||
packets.
|
||||
|
||||
Since we update beacon content to PCI wifi devices every beacon interval,
|
||||
the only one usb device, 8192CU, needs to update beacon content when
|
||||
mac80211 calling set_tim.
|
||||
|
||||
Reported-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtlwifi/core.c | 32 +++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtlwifi/core.h | 1 +
|
||||
drivers/net/wireless/realtek/rtlwifi/usb.c | 3 ++
|
||||
drivers/net/wireless/realtek/rtlwifi/wifi.h | 1 +
|
||||
4 files changed, 37 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/core.c
|
||||
@@ -1018,6 +1018,25 @@ static void send_beacon_frame(struct iee
|
||||
}
|
||||
}
|
||||
|
||||
+void rtl_update_beacon_work_callback(struct work_struct *work)
|
||||
+{
|
||||
+ struct rtl_works *rtlworks =
|
||||
+ container_of(work, struct rtl_works, update_beacon_work);
|
||||
+ struct ieee80211_hw *hw = rtlworks->hw;
|
||||
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
+ struct ieee80211_vif *vif = rtlpriv->mac80211.vif;
|
||||
+
|
||||
+ if (!vif) {
|
||||
+ WARN_ONCE(true, "no vif to update beacon\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ mutex_lock(&rtlpriv->locks.conf_mutex);
|
||||
+ send_beacon_frame(hw, vif);
|
||||
+ mutex_unlock(&rtlpriv->locks.conf_mutex);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rtl_update_beacon_work_callback);
|
||||
+
|
||||
static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
@@ -1747,6 +1766,18 @@ static void rtl_op_flush(struct ieee8021
|
||||
rtlpriv->intf_ops->flush(hw, queues, drop);
|
||||
}
|
||||
|
||||
+static int rtl_op_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
||||
+ bool set)
|
||||
+{
|
||||
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
+ struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
+
|
||||
+ if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CU)
|
||||
+ schedule_work(&rtlpriv->works.update_beacon_work);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* Description:
|
||||
* This routine deals with the Power Configuration CMD
|
||||
* parsing for RTL8723/RTL8188E Series IC.
|
||||
@@ -1903,6 +1934,7 @@ const struct ieee80211_ops rtl_ops = {
|
||||
.sta_add = rtl_op_sta_add,
|
||||
.sta_remove = rtl_op_sta_remove,
|
||||
.flush = rtl_op_flush,
|
||||
+ .set_tim = rtl_op_set_tim,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(rtl_ops);
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/core.h
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/core.h
|
||||
@@ -60,5 +60,6 @@ void rtl_bb_delay(struct ieee80211_hw *h
|
||||
bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
bool rtl_btc_status_false(void);
|
||||
void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igval);
|
||||
+void rtl_update_beacon_work_callback(struct work_struct *work);
|
||||
|
||||
#endif
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/usb.c
|
||||
@@ -807,6 +807,7 @@ static void rtl_usb_stop(struct ieee8021
|
||||
|
||||
tasklet_kill(&rtlusb->rx_work_tasklet);
|
||||
cancel_work_sync(&rtlpriv->works.lps_change_work);
|
||||
+ cancel_work_sync(&rtlpriv->works.update_beacon_work);
|
||||
|
||||
flush_workqueue(rtlpriv->works.rtl_wq);
|
||||
|
||||
@@ -1033,6 +1034,8 @@ int rtl_usb_probe(struct usb_interface *
|
||||
rtl_fill_h2c_cmd_work_callback);
|
||||
INIT_WORK(&rtlpriv->works.lps_change_work,
|
||||
rtl_lps_change_work_callback);
|
||||
+ INIT_WORK(&rtlpriv->works.update_beacon_work,
|
||||
+ rtl_update_beacon_work_callback);
|
||||
|
||||
rtlpriv->usb_data_index = 0;
|
||||
init_completion(&rtlpriv->firmware_loading_complete);
|
||||
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||||
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||||
@@ -2487,6 +2487,7 @@ struct rtl_works {
|
||||
|
||||
struct work_struct lps_change_work;
|
||||
struct work_struct fill_h2c_cmd;
|
||||
+ struct work_struct update_beacon_work;
|
||||
};
|
||||
|
||||
struct rtl_debug {
|
@ -1,297 +0,0 @@
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -655,6 +655,9 @@
|
||||
* When a security association was established on an 802.1X network using
|
||||
* fast transition, this event should be followed by an
|
||||
* %NL80211_CMD_PORT_AUTHORIZED event.
|
||||
+ * Following a %NL80211_CMD_ROAM event userspace can issue
|
||||
+ * %NL80211_CMD_GET_SCAN in order to obtain the scan information for the
|
||||
+ * new BSS the card/driver roamed to.
|
||||
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
||||
* userspace that a connection was dropped by the AP or due to other
|
||||
* reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and
|
||||
@@ -757,7 +760,8 @@
|
||||
* of any other interfaces, and other interfaces will again take
|
||||
* precedence when they are used.
|
||||
*
|
||||
- * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface.
|
||||
+ * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface
|
||||
+ * (no longer supported).
|
||||
*
|
||||
* @NL80211_CMD_SET_MULTICAST_TO_UNICAST: Configure if this AP should perform
|
||||
* multicast to unicast conversion. When enabled, all multicast packets
|
||||
@@ -1177,6 +1181,10 @@
|
||||
* includes the contents of the frame. %NL80211_ATTR_ACK flag is included
|
||||
* if the recipient acknowledged the frame.
|
||||
*
|
||||
+ * @NL80211_CMD_SET_SAR_SPECS: SAR power limitation configuration is
|
||||
+ * passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to
|
||||
+ * specify the wiphy index to be applied to.
|
||||
+ *
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1407,6 +1415,8 @@ enum nl80211_commands {
|
||||
|
||||
NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS,
|
||||
|
||||
+ NL80211_CMD_SET_SAR_SPECS,
|
||||
+
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
@@ -1750,8 +1760,9 @@ enum nl80211_commands {
|
||||
* specify just a single bitrate, which is to be used for the beacon.
|
||||
* The driver must also specify support for this with the extended
|
||||
* features NL80211_EXT_FEATURE_BEACON_RATE_LEGACY,
|
||||
- * NL80211_EXT_FEATURE_BEACON_RATE_HT and
|
||||
- * NL80211_EXT_FEATURE_BEACON_RATE_VHT.
|
||||
+ * NL80211_EXT_FEATURE_BEACON_RATE_HT,
|
||||
+ * NL80211_EXT_FEATURE_BEACON_RATE_VHT and
|
||||
+ * NL80211_EXT_FEATURE_BEACON_RATE_HE.
|
||||
*
|
||||
* @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain
|
||||
* at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME.
|
||||
@@ -1955,8 +1966,15 @@ enum nl80211_commands {
|
||||
* @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire
|
||||
* probe-response frame. The DA field in the 802.11 header is zero-ed out,
|
||||
* to be filled by the FW.
|
||||
- * @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable
|
||||
- * this feature. Currently, only supported in mac80211 drivers.
|
||||
+ * @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable
|
||||
+ * this feature during association. This is a flag attribute.
|
||||
+ * Currently only supported in mac80211 drivers.
|
||||
+ * @NL80211_ATTR_DISABLE_VHT: Force VHT capable interfaces to disable
|
||||
+ * this feature during association. This is a flag attribute.
|
||||
+ * Currently only supported in mac80211 drivers.
|
||||
+ * @NL80211_ATTR_DISABLE_HE: Force HE capable interfaces to disable
|
||||
+ * this feature during association. This is a flag attribute.
|
||||
+ * Currently only supported in mac80211 drivers.
|
||||
* @NL80211_ATTR_HT_CAPABILITY_MASK: Specify which bits of the
|
||||
* ATTR_HT_CAPABILITY to which attention should be paid.
|
||||
* Currently, only mac80211 NICs support this feature.
|
||||
@@ -2077,7 +2095,8 @@ enum nl80211_commands {
|
||||
* until the channel switch event.
|
||||
* @NL80211_ATTR_CH_SWITCH_BLOCK_TX: flag attribute specifying that transmission
|
||||
* must be blocked on the current channel (before the channel switch
|
||||
- * operation).
|
||||
+ * operation). Also included in the channel switch started event if quiet
|
||||
+ * was requested by the AP.
|
||||
* @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information
|
||||
* for the time while performing a channel switch.
|
||||
* @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel
|
||||
@@ -2527,6 +2546,20 @@ enum nl80211_commands {
|
||||
* override mask. Used with NL80211_ATTR_S1G_CAPABILITY in
|
||||
* NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT.
|
||||
*
|
||||
+ * @NL80211_ATTR_SAE_PWE: Indicates the mechanism(s) allowed for SAE PWE
|
||||
+ * derivation in WPA3-Personal networks which are using SAE authentication.
|
||||
+ * This is a u8 attribute that encapsulates one of the values from
|
||||
+ * &enum nl80211_sae_pwe_mechanism.
|
||||
+ *
|
||||
+ * @NL80211_ATTR_SAR_SPEC: SAR power limitation specification when
|
||||
+ * used with %NL80211_CMD_SET_SAR_SPECS. The message contains fields
|
||||
+ * of %nl80211_sar_attrs which specifies the sar type and related
|
||||
+ * sar specs. Sar specs contains array of %nl80211_sar_specs_attrs.
|
||||
+ *
|
||||
+ * @NL80211_ATTR_RECONNECT_REQUESTED: flag attribute, used with deauth and
|
||||
+ * disassoc events to indicate that an immediate reconnect to the AP
|
||||
+ * is desired.
|
||||
+ *
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -3016,6 +3049,14 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_S1G_CAPABILITY,
|
||||
NL80211_ATTR_S1G_CAPABILITY_MASK,
|
||||
|
||||
+ NL80211_ATTR_SAE_PWE,
|
||||
+
|
||||
+ NL80211_ATTR_RECONNECT_REQUESTED,
|
||||
+
|
||||
+ NL80211_ATTR_SAR_SPEC,
|
||||
+
|
||||
+ NL80211_ATTR_DISABLE_HE,
|
||||
+
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -5896,6 +5937,19 @@ enum nl80211_feature_flags {
|
||||
* @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
|
||||
* unsolicited broadcast probe response transmission
|
||||
*
|
||||
+ * @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
|
||||
+ * configuration (AP/mesh) with HE rates.
|
||||
+ *
|
||||
+ * @NL80211_EXT_FEATURE_SECURE_LTF: Device supports secure LTF measurement
|
||||
+ * exchange protocol.
|
||||
+ *
|
||||
+ * @NL80211_EXT_FEATURE_SECURE_RTT: Device supports secure RTT measurement
|
||||
+ * exchange protocol.
|
||||
+ *
|
||||
+ * @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management
|
||||
+ * frame protection for all management frames exchanged during the
|
||||
+ * negotiation and range measurement procedure.
|
||||
+ *
|
||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||
*/
|
||||
@@ -5956,6 +6010,10 @@ enum nl80211_ext_feature_index {
|
||||
NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
|
||||
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
||||
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
||||
+ NL80211_EXT_FEATURE_BEACON_RATE_HE,
|
||||
+ NL80211_EXT_FEATURE_SECURE_LTF,
|
||||
+ NL80211_EXT_FEATURE_SECURE_RTT,
|
||||
+ NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
||||
|
||||
/* add new features before the definition below */
|
||||
NUM_NL80211_EXT_FEATURES,
|
||||
@@ -6253,11 +6311,13 @@ struct nl80211_vendor_cmd_info {
|
||||
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
||||
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
||||
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
||||
+ * @NL80211_TDLS_PEER_HE: TDLS peer is HE capable.
|
||||
*/
|
||||
enum nl80211_tdls_peer_capability {
|
||||
NL80211_TDLS_PEER_HT = 1<<0,
|
||||
NL80211_TDLS_PEER_VHT = 1<<1,
|
||||
NL80211_TDLS_PEER_WMM = 1<<2,
|
||||
+ NL80211_TDLS_PEER_HE = 1<<3,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -6849,6 +6909,9 @@ enum nl80211_peer_measurement_ftm_capa {
|
||||
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
||||
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
||||
* ranging will be used.
|
||||
+ * @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
|
||||
+ * valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
|
||||
+ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
|
||||
*
|
||||
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
||||
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
||||
@@ -6867,6 +6930,7 @@ enum nl80211_peer_measurement_ftm_req {
|
||||
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
||||
+ NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
|
||||
|
||||
/* keep last */
|
||||
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
||||
@@ -7124,4 +7188,115 @@ enum nl80211_unsol_bcast_probe_resp_attr
|
||||
NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
|
||||
__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
|
||||
};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sae_pwe_mechanism - The mechanism(s) allowed for SAE PWE
|
||||
+ * derivation. Applicable only when WPA3-Personal SAE authentication is
|
||||
+ * used.
|
||||
+ *
|
||||
+ * @NL80211_SAE_PWE_UNSPECIFIED: not specified, used internally to indicate that
|
||||
+ * attribute is not present from userspace.
|
||||
+ * @NL80211_SAE_PWE_HUNT_AND_PECK: hunting-and-pecking loop only
|
||||
+ * @NL80211_SAE_PWE_HASH_TO_ELEMENT: hash-to-element only
|
||||
+ * @NL80211_SAE_PWE_BOTH: both hunting-and-pecking loop and hash-to-element
|
||||
+ * can be used.
|
||||
+ */
|
||||
+enum nl80211_sae_pwe_mechanism {
|
||||
+ NL80211_SAE_PWE_UNSPECIFIED,
|
||||
+ NL80211_SAE_PWE_HUNT_AND_PECK,
|
||||
+ NL80211_SAE_PWE_HASH_TO_ELEMENT,
|
||||
+ NL80211_SAE_PWE_BOTH,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sar_type - type of SAR specs
|
||||
+ *
|
||||
+ * @NL80211_SAR_TYPE_POWER: power limitation specified in 0.25dBm unit
|
||||
+ *
|
||||
+ */
|
||||
+enum nl80211_sar_type {
|
||||
+ NL80211_SAR_TYPE_POWER,
|
||||
+
|
||||
+ /* add new type here */
|
||||
+
|
||||
+ /* Keep last */
|
||||
+ NUM_NL80211_SAR_TYPE,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sar_attrs - Attributes for SAR spec
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_TYPE: the SAR type as defined in &enum nl80211_sar_type.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS: Nested array of SAR power
|
||||
+ * limit specifications. Each specification contains a set
|
||||
+ * of %nl80211_sar_specs_attrs.
|
||||
+ *
|
||||
+ * For SET operation, it contains array of %NL80211_SAR_ATTR_SPECS_POWER
|
||||
+ * and %NL80211_SAR_ATTR_SPECS_RANGE_INDEX.
|
||||
+ *
|
||||
+ * For sar_capa dump, it contains array of
|
||||
+ * %NL80211_SAR_ATTR_SPECS_START_FREQ
|
||||
+ * and %NL80211_SAR_ATTR_SPECS_END_FREQ.
|
||||
+ *
|
||||
+ * @__NL80211_SAR_ATTR_LAST: Internal
|
||||
+ * @NL80211_SAR_ATTR_MAX: highest sar attribute
|
||||
+ *
|
||||
+ * These attributes are used with %NL80211_CMD_SET_SAR_SPEC
|
||||
+ */
|
||||
+enum nl80211_sar_attrs {
|
||||
+ __NL80211_SAR_ATTR_INVALID,
|
||||
+
|
||||
+ NL80211_SAR_ATTR_TYPE,
|
||||
+ NL80211_SAR_ATTR_SPECS,
|
||||
+
|
||||
+ __NL80211_SAR_ATTR_LAST,
|
||||
+ NL80211_SAR_ATTR_MAX = __NL80211_SAR_ATTR_LAST - 1,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * enum nl80211_sar_specs_attrs - Attributes for SAR power limit specs
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_POWER: Required (s32)value to specify the actual
|
||||
+ * power limit value in units of 0.25 dBm if type is
|
||||
+ * NL80211_SAR_TYPE_POWER. (i.e., a value of 44 represents 11 dBm).
|
||||
+ * 0 means userspace doesn't have SAR limitation on this associated range.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_RANGE_INDEX: Required (u32) value to specify the
|
||||
+ * index of exported freq range table and the associated power limitation
|
||||
+ * is applied to this range.
|
||||
+ *
|
||||
+ * Userspace isn't required to set all the ranges advertised by WLAN driver,
|
||||
+ * and userspace can skip some certain ranges. These skipped ranges don't
|
||||
+ * have SAR limitations, and they are same as setting the
|
||||
+ * %NL80211_SAR_ATTR_SPECS_POWER to any unreasonable high value because any
|
||||
+ * value higher than regulatory allowed value just means SAR power
|
||||
+ * limitation is removed, but it's required to set at least one range.
|
||||
+ * It's not allowed to set duplicated range in one SET operation.
|
||||
+ *
|
||||
+ * Every SET operation overwrites previous SET operation.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_START_FREQ: Required (u32) value to specify the start
|
||||
+ * frequency of this range edge when registering SAR capability to wiphy.
|
||||
+ * It's not a channel center frequency. The unit is kHz.
|
||||
+ *
|
||||
+ * @NL80211_SAR_ATTR_SPECS_END_FREQ: Required (u32) value to specify the end
|
||||
+ * frequency of this range edge when registering SAR capability to wiphy.
|
||||
+ * It's not a channel center frequency. The unit is kHz.
|
||||
+ *
|
||||
+ * @__NL80211_SAR_ATTR_SPECS_LAST: Internal
|
||||
+ * @NL80211_SAR_ATTR_SPECS_MAX: highest sar specs attribute
|
||||
+ */
|
||||
+enum nl80211_sar_specs_attrs {
|
||||
+ __NL80211_SAR_ATTR_SPECS_INVALID,
|
||||
+
|
||||
+ NL80211_SAR_ATTR_SPECS_POWER,
|
||||
+ NL80211_SAR_ATTR_SPECS_RANGE_INDEX,
|
||||
+ NL80211_SAR_ATTR_SPECS_START_FREQ,
|
||||
+ NL80211_SAR_ATTR_SPECS_END_FREQ,
|
||||
+
|
||||
+ __NL80211_SAR_ATTR_SPECS_LAST,
|
||||
+ NL80211_SAR_ATTR_SPECS_MAX = __NL80211_SAR_ATTR_SPECS_LAST - 1,
|
||||
+};
|
||||
+
|
||||
#endif /* __LINUX_NL80211_H */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user