mac80211: backport QCA2066 support

This commit is contained in:
aiamadeus 2024-12-18 23:08:21 +08:00
parent b2cdb3a102
commit 6488a08057
28 changed files with 667 additions and 114 deletions

View File

@ -1,3 +1,11 @@
Package/ath11k-firmware-qca2066 = $(call Package/firmware-default,QCA2066 ath11k firmware)
define Package/ath11k-firmware-qca2066/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCA2066/hw2.1
$(INSTALL_DATA) \
$(PKG_BUILD_DIR)/ath11k/QCA2066/hw2.1/* $(1)/lib/firmware/ath11k/QCA2066/hw2.1/
endef
$(eval $(call BuildPackage,ath11k-firmware-qca2066))
Package/ath11k-firmware-qca6390 = $(call Package/firmware-default,QCA6390 ath11k firmware) Package/ath11k-firmware-qca6390 = $(call Package/firmware-default,QCA6390 ath11k firmware)
define Package/ath11k-firmware-qca6390/install define Package/ath11k-firmware-qca6390/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCA6390/hw2.0 $(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCA6390/hw2.0

View File

@ -0,0 +1,53 @@
From 400ece6c7f346b0a30867bd00b03b5b2563d4357 Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <sven@narfation.org>
Date: Tue, 22 Aug 2023 16:42:24 +0300
Subject: [PATCH] wifi: ath11k: Don't drop tx_status when peer cannot be found
When a station idles for a long time, hostapd will try to send a QoS Null
frame to the station as "poll". NL80211_CMD_PROBE_CLIENT is used for this
purpose. And the skb will be added to ack_status_frame - waiting for a
completion via ieee80211_report_ack_skb().
But when the peer was already removed before the tx_complete arrives, the
peer will be missing. And when using dev_kfree_skb_any (instead of going
through mac80211), the entry will stay inside ack_status_frames. This IDR
will therefore run full after 8K request were generated for such clients.
At this point, the access point will then just stall and not allow any new
clients because idr_alloc() for ack_status_frame will fail.
ieee80211_free_txskb() on the other hand will (when required) call
ieee80211_report_ack_skb() and make sure that (when required) remove the
entry from the ack_status_frame.
Tested-on: IPQ6018 hw1.0 WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
Fixes: 6257c702264c ("wifi: ath11k: fix tx status reporting in encap offload mode")
Fixes: 94739d45c388 ("ath11k: switch to using ieee80211_tx_status_ext()")
Cc: stable@vger.kernel.org
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230802-ath11k-ack_status_leak-v2-1-c0af729d6229@narfation.org
---
drivers/net/wireless/ath/ath11k/dp_tx.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
@@ -369,7 +369,7 @@ ath11k_dp_tx_htt_tx_complete_buf(struct
"dp_tx: failed to find the peer with peer_id %d\n",
ts->peer_id);
spin_unlock_bh(&ab->base_lock);
- dev_kfree_skb_any(msdu);
+ ieee80211_free_txskb(ar->hw, msdu);
return;
}
spin_unlock_bh(&ab->base_lock);
@@ -624,7 +624,7 @@ static void ath11k_dp_tx_complete_msdu(s
"dp_tx: failed to find the peer with peer_id %d\n",
ts->peer_id);
spin_unlock_bh(&ab->base_lock);
- dev_kfree_skb_any(msdu);
+ ieee80211_free_txskb(ar->hw, msdu);
return;
}
arsta = (struct ath11k_sta *)peer->sta->drv_priv;

View File

@ -0,0 +1,96 @@
From 515bcdf587f9911f2d5de51524cb7e048d295052 Mon Sep 17 00:00:00 2001
From: Baochen Qiang <quic_bqiang@quicinc.com>
Date: Tue, 9 Jan 2024 10:13:35 +0800
Subject: [PATCH] wifi: ath11k: move pci.ops registration ahead
In ath11k_pci_probe() there is a switch statement that, based
upon the PCI device ID, assigns pci_ops. After the switch,
ath11k_pcic_register_pci_ops() is called to register the pci_ops.
Unfortunately, this registration is too late if any of the cases
in the switch need to perform operations that require the pci_ops
to already be registered. In particular, an upcoming patch for
QCA2066 needs to call ath11k_pcic_read32().
To address this issue, call ath11k_pcic_register_pci_ops() from
each case instead of doing so after the switch. That way the ops
will be registered if any subsequent operations within the case
processing require the ops to be present.
Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240109021336.4143-2-quic_bqiang@quicinc.com
---
drivers/net/wireless/ath/ath11k/pci.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
--- a/drivers/net/wireless/ath/ath11k/pci.c
+++ b/drivers/net/wireless/ath/ath11k/pci.c
@@ -729,7 +729,6 @@ static int ath11k_pci_probe(struct pci_d
struct ath11k_base *ab;
struct ath11k_pci *ab_pci;
u32 soc_hw_version_major, soc_hw_version_minor, addr;
- const struct ath11k_pci_ops *pci_ops;
int ret;
ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI);
@@ -775,6 +774,12 @@ static int ath11k_pci_probe(struct pci_d
switch (pci_dev->device) {
case QCA6390_DEVICE_ID:
+ ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qca6390);
+ if (ret) {
+ ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
+ goto err_pci_free_region;
+ }
+
ath11k_pci_read_hw_version(ab, &soc_hw_version_major,
&soc_hw_version_minor);
switch (soc_hw_version_major) {
@@ -788,13 +793,21 @@ static int ath11k_pci_probe(struct pci_d
goto err_pci_free_region;
}
- pci_ops = &ath11k_pci_ops_qca6390;
break;
case QCN9074_DEVICE_ID:
- pci_ops = &ath11k_pci_ops_qcn9074;
+ ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qcn9074);
+ if (ret) {
+ ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
+ goto err_pci_free_region;
+ }
ab->hw_rev = ATH11K_HW_QCN9074_HW10;
break;
case WCN6855_DEVICE_ID:
+ ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qca6390);
+ if (ret) {
+ ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
+ goto err_pci_free_region;
+ }
ab->id.bdf_search = ATH11K_BDF_SEARCH_BUS_AND_BOARD;
ath11k_pci_read_hw_version(ab, &soc_hw_version_major,
&soc_hw_version_minor);
@@ -821,7 +834,6 @@ unsupported_wcn6855_soc:
goto err_pci_free_region;
}
- pci_ops = &ath11k_pci_ops_qca6390;
break;
default:
dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n",
@@ -830,12 +842,6 @@ unsupported_wcn6855_soc:
goto err_pci_free_region;
}
- ret = ath11k_pcic_register_pci_ops(ab, pci_ops);
- if (ret) {
- ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
- goto err_pci_free_region;
- }
-
ret = ath11k_pcic_init_msi_config(ab);
if (ret) {
ath11k_err(ab, "failed to init msi config: %d\n", ret);

View File

@ -0,0 +1,219 @@
From f019f4dff2e4cb8704dc608496e3f2829de3e919 Mon Sep 17 00:00:00 2001
From: Carl Huang <quic_cjhuang@quicinc.com>
Date: Wed, 14 Feb 2024 10:38:10 +0200
Subject: [PATCH] wifi: ath11k: support 2 station interfaces
Add hardware parameter support_dual_stations to indicate whether 2 station
interfaces are supported. For chips which support this feature, limit total
number of AP interface and mesh point to 1. The max interfaces are 3 for such
chips.
The chips affected are:
QCA6390 hw2.0
WCN6855 hw2.0
WCN6855 hw2.1
Other chips are not affected.
For affected chips, remove radar_detect_widths because now
num_different_channels is set to 2. radar_detect_widths can be set only when
num_different_channels is 1, see mac80211 function wiphy_verify_combinations
for details. This means that in affectected chips DFS cannot be enabled in AP
mode.
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
Signed-off-by: Carl Huang <quic_cjhuang@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20230714023801.2621802-2-quic_cjhuang@quicinc.com
---
drivers/net/wireless/ath/ath11k/core.c | 14 ++++--
drivers/net/wireless/ath/ath11k/hw.c | 2 +-
drivers/net/wireless/ath/ath11k/hw.h | 1 +
drivers/net/wireless/ath/ath11k/mac.c | 62 +++++++++++++++++---------
4 files changed, 53 insertions(+), 26 deletions(-)
--- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c
@@ -121,6 +121,7 @@ static const struct ath11k_hw_params ath
.tcl_ring_retry = true,
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
+ .support_dual_stations = false,
},
{
.hw_rev = ATH11K_HW_IPQ6018_HW10,
@@ -204,6 +205,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
.support_fw_mac_sequence = false,
+ .support_dual_stations = false,
},
{
.name = "qca6390 hw2.0",
@@ -254,7 +256,7 @@ static const struct ath11k_hw_params ath
.coldboot_cal_ftm = false,
.cbcal_restart_fw = false,
.fw_mem_mode = 0,
- .num_vdevs = 16 + 1,
+ .num_vdevs = 2 + 1,
.num_peers = 512,
.supports_suspend = true,
.hal_desc_sz = sizeof(struct hal_rx_desc_ipq8074),
@@ -289,6 +291,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
.support_fw_mac_sequence = true,
+ .support_dual_stations = true,
},
{
.name = "qcn9074 hw1.0",
@@ -371,6 +374,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
.support_fw_mac_sequence = false,
+ .support_dual_stations = false,
},
{
.name = "wcn6855 hw2.0",
@@ -421,7 +425,7 @@ static const struct ath11k_hw_params ath
.coldboot_cal_ftm = false,
.cbcal_restart_fw = false,
.fw_mem_mode = 0,
- .num_vdevs = 16 + 1,
+ .num_vdevs = 2 + 1,
.num_peers = 512,
.supports_suspend = true,
.hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
@@ -456,6 +460,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
.support_fw_mac_sequence = true,
+ .support_dual_stations = true,
},
{
.name = "wcn6855 hw2.1",
@@ -504,7 +509,7 @@ static const struct ath11k_hw_params ath
.coldboot_cal_ftm = false,
.cbcal_restart_fw = false,
.fw_mem_mode = 0,
- .num_vdevs = 16 + 1,
+ .num_vdevs = 2 + 1,
.num_peers = 512,
.supports_suspend = true,
.hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
@@ -539,6 +544,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
.support_fw_mac_sequence = true,
+ .support_dual_stations = true,
},
{
.name = "wcn6750 hw1.0",
@@ -620,6 +626,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750,
.smp2p_wow_exit = true,
.support_fw_mac_sequence = true,
+ .support_dual_stations = false,
},
{
.hw_rev = ATH11K_HW_IPQ5018_HW10,
@@ -701,6 +708,7 @@ static const struct ath11k_hw_params ath
.tx_ring_size = DP_TCL_DATA_RING_SIZE,
.smp2p_wow_exit = false,
.support_fw_mac_sequence = false,
+ .support_dual_stations = false,
},
};
--- a/drivers/net/wireless/ath/ath11k/hw.c
+++ b/drivers/net/wireless/ath/ath11k/hw.c
@@ -58,7 +58,7 @@ static void ath11k_hw_wcn6855_tx_mesh_en
static void ath11k_init_wmi_config_qca6390(struct ath11k_base *ab,
struct target_resource_config *config)
{
- config->num_vdevs = 4;
+ config->num_vdevs = ab->hw_params.num_vdevs;
config->num_peers = 16;
config->num_tids = 32;
--- a/drivers/net/wireless/ath/ath11k/hw.h
+++ b/drivers/net/wireless/ath/ath11k/hw.h
@@ -226,6 +226,7 @@ struct ath11k_hw_params {
u32 tx_ring_size;
bool smp2p_wow_exit;
bool support_fw_mac_sequence;
+ bool support_dual_stations;
};
struct ath11k_hw_ops {
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -9287,28 +9287,46 @@ static int ath11k_mac_setup_iface_combin
return -ENOMEM;
}
- limits[0].max = 1;
- limits[0].types |= BIT(NL80211_IFTYPE_STATION);
+ if (ab->hw_params.support_dual_stations) {
+ limits[0].max = 2;
+ limits[0].types |= BIT(NL80211_IFTYPE_STATION);
- limits[1].max = 16;
- limits[1].types |= BIT(NL80211_IFTYPE_AP);
+ limits[1].max = 1;
+ limits[1].types |= BIT(NL80211_IFTYPE_AP);
+ if (IS_ENABLED(CPTCFG_MAC80211_MESH) &&
+ ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
+ limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
- if (IS_ENABLED(CPTCFG_MAC80211_MESH) &&
- ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
- limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
-
- combinations[0].limits = limits;
- combinations[0].n_limits = n_limits;
- combinations[0].max_interfaces = 16;
- combinations[0].num_different_channels = 1;
- combinations[0].beacon_int_infra_match = true;
- combinations[0].beacon_int_min_gcd = 100;
- combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
- BIT(NL80211_CHAN_WIDTH_20) |
- BIT(NL80211_CHAN_WIDTH_40) |
- BIT(NL80211_CHAN_WIDTH_80) |
- BIT(NL80211_CHAN_WIDTH_80P80) |
- BIT(NL80211_CHAN_WIDTH_160);
+ combinations[0].limits = limits;
+ combinations[0].n_limits = 2;
+ combinations[0].max_interfaces = ab->hw_params.num_vdevs;
+ combinations[0].num_different_channels = 2;
+ combinations[0].beacon_int_infra_match = true;
+ combinations[0].beacon_int_min_gcd = 100;
+ } else {
+ limits[0].max = 1;
+ limits[0].types |= BIT(NL80211_IFTYPE_STATION);
+
+ limits[1].max = 16;
+ limits[1].types |= BIT(NL80211_IFTYPE_AP);
+
+ if (IS_ENABLED(CPTCFG_MAC80211_MESH) &&
+ ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
+ limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
+
+ combinations[0].limits = limits;
+ combinations[0].n_limits = 2;
+ combinations[0].max_interfaces = 16;
+ combinations[0].num_different_channels = 1;
+ combinations[0].beacon_int_infra_match = true;
+ combinations[0].beacon_int_min_gcd = 100;
+ combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
+ BIT(NL80211_CHAN_WIDTH_20) |
+ BIT(NL80211_CHAN_WIDTH_40) |
+ BIT(NL80211_CHAN_WIDTH_80) |
+ BIT(NL80211_CHAN_WIDTH_80P80) |
+ BIT(NL80211_CHAN_WIDTH_160);
+ }
ar->hw->wiphy->iface_combinations = combinations;
ar->hw->wiphy->n_iface_combinations = 1;

View File

@ -0,0 +1,202 @@
From 5dc9d1a55e953d9059ecbdd8fe6ec81e9edd349e Mon Sep 17 00:00:00 2001
From: Baochen Qiang <quic_bqiang@quicinc.com>
Date: Tue, 9 Jan 2024 10:13:36 +0800
Subject: [PATCH] wifi: ath11k: add support for QCA2066
QCA2066 is a PCI based DBS device. It is very similar to WCN6855
overall: they share the same PCI device ID, the same major and
minor version numbers, the same register address, and same HAL
descriptors etc. The most significant difference is that QCA2066
supports 3-antenna configuration while WCN6855 does not. To differentiate
them, subversion numbers are used. Currently four numbers are used
by QCA2066: 0x1019A0E1, 0x1019B0E1, 0x1019C0E1 and 0x1019D0E1.
Tested-on: QCA2066 hw2.1 PCI WLAN.HSP.1.1-03737-QCAHSPSWPL_V2_SILICONZ_CE-1
Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240109021336.4143-3-quic_bqiang@quicinc.com
---
drivers/net/wireless/ath/ath11k/core.c | 86 ++++++++++++++++++++++++++
drivers/net/wireless/ath/ath11k/core.h | 1 +
drivers/net/wireless/ath/ath11k/mhi.c | 1 +
drivers/net/wireless/ath/ath11k/pci.c | 17 ++++-
drivers/net/wireless/ath/ath11k/pcic.c | 11 ++++
5 files changed, 115 insertions(+), 1 deletion(-)
--- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c
@@ -710,6 +710,92 @@ static const struct ath11k_hw_params ath
.support_fw_mac_sequence = false,
.support_dual_stations = false,
},
+ {
+ .name = "qca2066 hw2.1",
+ .hw_rev = ATH11K_HW_QCA2066_HW21,
+ .fw = {
+ .dir = "QCA2066/hw2.1",
+ .board_size = 256 * 1024,
+ .cal_offset = 128 * 1024,
+ },
+ .max_radios = 3,
+ .bdf_addr = 0x4B0C0000,
+ .hw_ops = &wcn6855_ops,
+ .ring_mask = &ath11k_hw_ring_mask_qca6390,
+ .internal_sleep_clock = true,
+ .regs = &wcn6855_regs,
+ .qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390,
+ .host_ce_config = ath11k_host_ce_config_qca6390,
+ .ce_count = 9,
+ .target_ce_config = ath11k_target_ce_config_wlan_qca6390,
+ .target_ce_count = 9,
+ .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
+ .svc_to_ce_map_len = 14,
+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
+ .single_pdev_only = true,
+ .rxdma1_enable = false,
+ .num_rxmda_per_pdev = 2,
+ .rx_mac_buf_ring = true,
+ .vdev_start_delay = true,
+ .htt_peer_map_v2 = false,
+
+ .spectral = {
+ .fft_sz = 0,
+ .fft_pad_sz = 0,
+ .summary_pad_sz = 0,
+ .fft_hdr_len = 0,
+ .max_fft_bins = 0,
+ .fragment_160mhz = false,
+ },
+
+ .interface_modes = BIT(NL80211_IFTYPE_STATION) |
+ BIT(NL80211_IFTYPE_AP),
+ .supports_monitor = false,
+ .full_monitor_mode = false,
+ .supports_shadow_regs = true,
+ .idle_ps = true,
+ .supports_sta_ps = true,
+ .coldboot_cal_mm = false,
+ .coldboot_cal_ftm = false,
+ .cbcal_restart_fw = false,
+ .fw_mem_mode = 0,
+ .num_vdevs = 2 + 1,
+ .num_peers = 512,
+ .supports_suspend = true,
+ .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
+ .supports_regdb = true,
+ .fix_l1ss = false,
+ .credit_flow = true,
+ .max_tx_ring = DP_TCL_NUM_RING_MAX_QCA6390,
+ .hal_params = &ath11k_hw_hal_params_qca6390,
+ .supports_dynamic_smps_6ghz = false,
+ .alloc_cacheable_memory = false,
+ .supports_rssi_stats = true,
+ .fw_wmi_diag_event = true,
+ .current_cc_support = true,
+ .dbr_debug_support = false,
+ .global_reset = true,
+ .bios_sar_capa = &ath11k_hw_sar_capa_wcn6855,
+ .m3_fw_support = true,
+ .fixed_bdf_addr = false,
+ .fixed_mem_region = false,
+ .static_window_map = false,
+ .hybrid_bus_type = false,
+ .fixed_fw_mem = false,
+ .support_off_channel_tx = true,
+ .supports_multi_bssid = true,
+
+ .sram_dump = {
+ .start = 0x01400000,
+ .end = 0x0177ffff,
+ },
+
+ .tcl_ring_retry = true,
+ .tx_ring_size = DP_TCL_DATA_RING_SIZE,
+ .smp2p_wow_exit = false,
+ .support_fw_mac_sequence = true,
+ .support_dual_stations = true,
+ },
};
static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab)
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
@@ -144,6 +144,7 @@ enum ath11k_hw_rev {
ATH11K_HW_WCN6855_HW21,
ATH11K_HW_WCN6750_HW10,
ATH11K_HW_IPQ5018_HW10,
+ ATH11K_HW_QCA2066_HW21,
};
enum ath11k_firmware_mode {
--- a/drivers/net/wireless/ath/ath11k/mhi.c
+++ b/drivers/net/wireless/ath/ath11k/mhi.c
@@ -437,6 +437,7 @@ int ath11k_mhi_register(struct ath11k_pc
case ATH11K_HW_QCA6390_HW20:
case ATH11K_HW_WCN6855_HW20:
case ATH11K_HW_WCN6855_HW21:
+ case ATH11K_HW_QCA2066_HW21:
ath11k_mhi_config = &ath11k_mhi_config_qca6390;
break;
default:
--- a/drivers/net/wireless/ath/ath11k/pci.c
+++ b/drivers/net/wireless/ath/ath11k/pci.c
@@ -28,6 +28,8 @@
#define QCN9074_DEVICE_ID 0x1104
#define WCN6855_DEVICE_ID 0x1103
+#define TCSR_SOC_HW_SUB_VER 0x1910010
+
static const struct pci_device_id ath11k_pci_id_table[] = {
{ PCI_VDEVICE(QCOM, QCA6390_DEVICE_ID) },
{ PCI_VDEVICE(QCOM, WCN6855_DEVICE_ID) },
@@ -730,6 +732,7 @@ static int ath11k_pci_probe(struct pci_d
struct ath11k_pci *ab_pci;
u32 soc_hw_version_major, soc_hw_version_minor, addr;
int ret;
+ u32 sub_version;
ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI);
@@ -820,7 +823,19 @@ static int ath11k_pci_probe(struct pci_d
break;
case 0x10:
case 0x11:
- ab->hw_rev = ATH11K_HW_WCN6855_HW21;
+ sub_version = ath11k_pcic_read32(ab, TCSR_SOC_HW_SUB_VER);
+ ath11k_dbg(ab, ATH11K_DBG_PCI, "sub_version 0x%x\n",
+ sub_version);
+ switch (sub_version) {
+ case 0x1019A0E1:
+ case 0x1019B0E1:
+ case 0x1019C0E1:
+ case 0x1019D0E1:
+ ab->hw_rev = ATH11K_HW_QCA2066_HW21;
+ break;
+ default:
+ ab->hw_rev = ATH11K_HW_WCN6855_HW21;
+ }
break;
default:
goto unsupported_wcn6855_soc;
--- a/drivers/net/wireless/ath/ath11k/pcic.c
+++ b/drivers/net/wireless/ath/ath11k/pcic.c
@@ -115,6 +115,17 @@ static const struct ath11k_msi_config at
},
.hw_rev = ATH11K_HW_WCN6750_HW10,
},
+ {
+ .total_vectors = 32,
+ .total_users = 4,
+ .users = (struct ath11k_msi_user[]) {
+ { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
+ { .name = "CE", .num_vectors = 10, .base_vector = 3 },
+ { .name = "WAKE", .num_vectors = 1, .base_vector = 13 },
+ { .name = "DP", .num_vectors = 18, .base_vector = 14 },
+ },
+ .hw_rev = ATH11K_HW_QCA2066_HW21,
+ },
};
int ath11k_pcic_init_msi_config(struct ath11k_base *ab)

View File

@ -138,7 +138,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
int ath11k_mhi_register(struct ath11k_pci *ar_pci); int ath11k_mhi_register(struct ath11k_pci *ar_pci);
--- a/drivers/net/wireless/ath/ath11k/pci.c --- a/drivers/net/wireless/ath/ath11k/pci.c
+++ b/drivers/net/wireless/ath/ath11k/pci.c +++ b/drivers/net/wireless/ath/ath11k/pci.c
@@ -371,13 +371,20 @@ static void ath11k_pci_sw_reset(struct a @@ -373,13 +373,20 @@ static void ath11k_pci_sw_reset(struct a
static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab) static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab)
{ {
struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg;

View File

@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/drivers/net/wireless/ath/ath11k/pci.c --- a/drivers/net/wireless/ath/ath11k/pci.c
+++ b/drivers/net/wireless/ath/ath11k/pci.c +++ b/drivers/net/wireless/ath/ath11k/pci.c
@@ -459,7 +459,11 @@ static int ath11k_pci_alloc_msi(struct a @@ -461,7 +461,11 @@ static int ath11k_pci_alloc_msi(struct a
pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO, pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO,
&ab->pci.msi.addr_lo); &ab->pci.msi.addr_lo);

View File

@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
{ {
.hw_rev = ATH11K_HW_IPQ8074, .hw_rev = ATH11K_HW_IPQ8074,
.name = "ipq8074 hw2.0", .name = "ipq8074 hw2.0",
@@ -2040,7 +2040,8 @@ static void ath11k_core_reset(struct wor @@ -2134,7 +2134,8 @@ static void ath11k_core_reset(struct wor
static int ath11k_init_hw_params(struct ath11k_base *ab) static int ath11k_init_hw_params(struct ath11k_base *ab)
{ {
const struct ath11k_hw_params *hw_params = NULL; const struct ath11k_hw_params *hw_params = NULL;
@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) { for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
hw_params = &ath11k_hw_params[i]; hw_params = &ath11k_hw_params[i];
@@ -2056,7 +2057,31 @@ static int ath11k_init_hw_params(struct @@ -2150,7 +2151,31 @@ static int ath11k_init_hw_params(struct
ab->hw_params = *hw_params; ab->hw_params = *hw_params;

View File

@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath11k/core.c --- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c
@@ -168,8 +168,8 @@ static struct ath11k_hw_params ath11k_hw @@ -169,8 +169,8 @@ static struct ath11k_hw_params ath11k_hw
.supports_shadow_regs = false, .supports_shadow_regs = false,
.idle_ps = false, .idle_ps = false,
.supports_sta_ps = false, .supports_sta_ps = false,

View File

@ -1,25 +0,0 @@
--- a/drivers/net/wireless/ath/ath11k/mhi.c
+++ b/drivers/net/wireless/ath/ath11k/mhi.c
@@ -343,8 +343,10 @@
return "MHI_CB_FATAL_ERROR";
case MHI_CB_BW_REQ:
return "MHI_CB_BW_REQ";
+#if LINUX_VERSION_IS_LESS(6,11,0)
case MHI_CB_EE_SBL_MODE:
return "MHI_CB_EE_SBL_MODE";
+#endif
default:
return "UNKNOWN";
}
@@ -367,9 +369,11 @@
if (!(test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)))
queue_work(ab->workqueue_aux, &ab->reset_work);
break;
+#if LINUX_VERSION_IS_LESS(6,11,0)
case MHI_CB_EE_SBL_MODE:
ath11k_mhi_qrtr_instance_set(mhi_cntrl);
break;
+#endif
default:
break;
}

View File

@ -69,7 +69,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
--- a/backport-include/net/genetlink.h --- a/backport-include/net/genetlink.h
+++ b/backport-include/net/genetlink.h +++ b/backport-include/net/genetlink.h
@@ -150,7 +150,7 @@ int genlmsg_multicast(const struct genl_ @@ -199,7 +199,7 @@ int genlmsg_multicast(const struct genl_
#define genlmsg_multicast_allns LINUX_BACKPORT(genlmsg_multicast_allns) #define genlmsg_multicast_allns LINUX_BACKPORT(genlmsg_multicast_allns)
int backport_genlmsg_multicast_allns(const struct genl_family *family, int backport_genlmsg_multicast_allns(const struct genl_family *family,
struct sk_buff *skb, u32 portid, struct sk_buff *skb, u32 portid,
@ -80,7 +80,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
static inline struct nlattr **genl_family_attrbuf(struct genl_family *family) static inline struct nlattr **genl_family_attrbuf(struct genl_family *family)
--- a/compat/backport-genetlink.c --- a/compat/backport-genetlink.c
+++ b/compat/backport-genetlink.c +++ b/compat/backport-genetlink.c
@@ -198,23 +198,23 @@ int genlmsg_multicast(const struct genl_ @@ -364,23 +364,23 @@ int genlmsg_multicast(const struct genl_
} }
EXPORT_SYMBOL_GPL(genlmsg_multicast); EXPORT_SYMBOL_GPL(genlmsg_multicast);
@ -108,7 +108,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
if (!err) if (!err)
delivered = true; delivered = true;
else if (err != -ESRCH) else if (err != -ESRCH)
@@ -223,25 +223,29 @@ static int genlmsg_mcast(struct sk_buff @@ -389,25 +389,29 @@ static int genlmsg_mcast(struct sk_buff
prev = net; prev = net;
} }
@ -143,7 +143,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
EXPORT_SYMBOL_GPL(backport_genlmsg_multicast_allns); EXPORT_SYMBOL_GPL(backport_genlmsg_multicast_allns);
--- a/net/wireless/nl80211.c --- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c
@@ -17596,10 +17596,15 @@ @@ -17567,10 +17567,15 @@ void nl80211_common_reg_change_event(enu
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
@ -159,7 +159,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
return; return;
@@ -18217,10 +18222,15 @@ @@ -18188,10 +18193,15 @@ void nl80211_send_beacon_hint_event(stru
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);

View File

@ -113,7 +113,7 @@
u8 rx_flags; u8 rx_flags;
--- a/drivers/net/wireless/mac80211_hwsim.c --- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -5750,7 +5750,11 @@ @@ -5749,7 +5749,11 @@ static int __init init_mac80211_hwsim(vo
if (err) if (err)
goto out_exit_netlink; goto out_exit_netlink;

View File

@ -14,7 +14,7 @@
static inline u32 __get_unaligned_be24(const u8 *p) static inline u32 __get_unaligned_be24(const u8 *p)
--- a/net/wireless/core.c --- a/net/wireless/core.c
+++ b/net/wireless/core.c +++ b/net/wireless/core.c
@@ -164,11 +164,19 @@ @@ -164,11 +164,19 @@ int cfg80211_switch_netns(struct cfg8021
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
if (!wdev->netdev) if (!wdev->netdev)
continue; continue;
@ -34,7 +34,7 @@
} }
if (err) { if (err) {
@@ -180,11 +188,19 @@ @@ -180,11 +188,19 @@ int cfg80211_switch_netns(struct cfg8021
list) { list) {
if (!wdev->netdev) if (!wdev->netdev)
continue; continue;
@ -54,7 +54,7 @@
} }
return err; return err;
@@ -1413,7 +1429,11 @@ @@ -1428,7 +1444,11 @@ static int cfg80211_netdev_notifier_call
SET_NETDEV_DEVTYPE(dev, &wiphy_type); SET_NETDEV_DEVTYPE(dev, &wiphy_type);
wdev->netdev = dev; wdev->netdev = dev;
/* can only change netns with wiphy */ /* can only change netns with wiphy */
@ -67,8 +67,8 @@
cfg80211_init_wdev(wdev); cfg80211_init_wdev(wdev);
break; break;
--- a/net/mac80211/rc80211_minstrel_ht_debugfs.c --- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
+++ a/net/mac80211/rc80211_minstrel_ht_debugfs.c +++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
@@ -187,7 +187,9 @@ @@ -187,7 +187,9 @@ static const struct file_operations mins
.open = minstrel_ht_stats_open, .open = minstrel_ht_stats_open,
.read = minstrel_stats_read, .read = minstrel_stats_read,
.release = minstrel_stats_release, .release = minstrel_stats_release,
@ -78,7 +78,7 @@
}; };
static char * static char *
@@ -323,7 +325,9 @@ @@ -323,7 +325,9 @@ static const struct file_operations mins
.open = minstrel_ht_stats_csv_open, .open = minstrel_ht_stats_csv_open,
.read = minstrel_stats_read, .read = minstrel_stats_read,
.release = minstrel_stats_release, .release = minstrel_stats_release,

View File

@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -3984,7 +3984,7 @@ struct ieee80211_txq *ieee80211_next_txq @@ -3988,7 +3988,7 @@ struct ieee80211_txq *ieee80211_next_txq
if (deficit < 0) if (deficit < 0)
sta->airtime[txqi->txq.ac].deficit += sta->airtime[txqi->txq.ac].deficit +=
@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (deficit < 0 || !aql_check) { if (deficit < 0 || !aql_check) {
list_move_tail(&txqi->schedule_order, list_move_tail(&txqi->schedule_order,
@@ -4127,7 +4127,8 @@ bool ieee80211_txq_may_transmit(struct i @@ -4131,7 +4131,8 @@ bool ieee80211_txq_may_transmit(struct i
} }
sta = container_of(iter->txq.sta, struct sta_info, sta); sta = container_of(iter->txq.sta, struct sta_info, sta);
if (ieee80211_sta_deficit(sta, ac) < 0) if (ieee80211_sta_deficit(sta, ac) < 0)
@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
list_move_tail(&iter->schedule_order, &local->active_txqs[ac]); list_move_tail(&iter->schedule_order, &local->active_txqs[ac]);
} }
@@ -4135,7 +4136,7 @@ bool ieee80211_txq_may_transmit(struct i @@ -4139,7 +4140,7 @@ bool ieee80211_txq_may_transmit(struct i
if (sta->airtime[ac].deficit >= 0) if (sta->airtime[ac].deficit >= 0)
goto out; goto out;

View File

@ -51,7 +51,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
* *
* Drivers can optionally delegate responsibility for scheduling queues to * Drivers can optionally delegate responsibility for scheduling queues to
* mac80211, to take advantage of airtime fairness accounting. In this case, to * mac80211, to take advantage of airtime fairness accounting. In this case, to
@@ -2248,8 +2249,8 @@ struct ieee80211_link_sta { @@ -2259,8 +2260,8 @@ struct ieee80211_link_sta {
* For non MLO STA it will point to the deflink data. For MLO STA * For non MLO STA it will point to the deflink data. For MLO STA
* ieee80211_sta_recalc_aggregates() must be called to update it. * ieee80211_sta_recalc_aggregates() must be called to update it.
* @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not. * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
@ -62,7 +62,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
* @deflink: This holds the default link STA information, for non MLO STA all link * @deflink: This holds the default link STA information, for non MLO STA all link
* specific STA information is accessed through @deflink or through * specific STA information is accessed through @deflink or through
* link[0] which points to address of @deflink. For MLO Link STA * link[0] which points to address of @deflink. For MLO Link STA
@@ -5687,7 +5688,7 @@ void ieee80211_key_replay(struct ieee802 @@ -5698,7 +5699,7 @@ void ieee80211_key_replay(struct ieee802
* @hw: pointer as obtained from ieee80211_alloc_hw(). * @hw: pointer as obtained from ieee80211_alloc_hw().
* @queue: queue number (counted from zero). * @queue: queue number (counted from zero).
* *
@ -71,7 +71,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
*/ */
void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue); void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
@@ -5696,7 +5697,7 @@ void ieee80211_wake_queue(struct ieee802 @@ -5707,7 +5708,7 @@ void ieee80211_wake_queue(struct ieee802
* @hw: pointer as obtained from ieee80211_alloc_hw(). * @hw: pointer as obtained from ieee80211_alloc_hw().
* @queue: queue number (counted from zero). * @queue: queue number (counted from zero).
* *
@ -80,7 +80,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
*/ */
void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue); void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
@@ -5705,7 +5706,7 @@ void ieee80211_stop_queue(struct ieee802 @@ -5716,7 +5717,7 @@ void ieee80211_stop_queue(struct ieee802
* @hw: pointer as obtained from ieee80211_alloc_hw(). * @hw: pointer as obtained from ieee80211_alloc_hw().
* @queue: queue number (counted from zero). * @queue: queue number (counted from zero).
* *
@ -89,7 +89,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
* *
* Return: %true if the queue is stopped. %false otherwise. * Return: %true if the queue is stopped. %false otherwise.
*/ */
@@ -5716,7 +5717,7 @@ int ieee80211_queue_stopped(struct ieee8 @@ -5727,7 +5728,7 @@ int ieee80211_queue_stopped(struct ieee8
* ieee80211_stop_queues - stop all queues * ieee80211_stop_queues - stop all queues
* @hw: pointer as obtained from ieee80211_alloc_hw(). * @hw: pointer as obtained from ieee80211_alloc_hw().
* *
@ -98,7 +98,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
*/ */
void ieee80211_stop_queues(struct ieee80211_hw *hw); void ieee80211_stop_queues(struct ieee80211_hw *hw);
@@ -5724,7 +5725,7 @@ void ieee80211_stop_queues(struct ieee80 @@ -5735,7 +5736,7 @@ void ieee80211_stop_queues(struct ieee80
* ieee80211_wake_queues - wake all queues * ieee80211_wake_queues - wake all queues
* @hw: pointer as obtained from ieee80211_alloc_hw(). * @hw: pointer as obtained from ieee80211_alloc_hw().
* *
@ -107,7 +107,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
*/ */
void ieee80211_wake_queues(struct ieee80211_hw *hw); void ieee80211_wake_queues(struct ieee80211_hw *hw);
@@ -6946,6 +6947,18 @@ static inline struct sk_buff *ieee80211_ @@ -6957,6 +6958,18 @@ static inline struct sk_buff *ieee80211_
} }
/** /**

View File

@ -387,7 +387,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
* Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress. * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress.
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -1600,9 +1600,6 @@ int ieee80211_txq_setup_flows(struct iee @@ -1604,9 +1604,6 @@ int ieee80211_txq_setup_flows(struct iee
bool supp_vht = false; bool supp_vht = false;
enum nl80211_band band; enum nl80211_band band;
@ -397,7 +397,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
ret = fq_init(fq, 4096); ret = fq_init(fq, 4096);
if (ret) if (ret)
return ret; return ret;
@@ -1650,9 +1647,6 @@ void ieee80211_txq_teardown_flows(struct @@ -1654,9 +1651,6 @@ void ieee80211_txq_teardown_flows(struct
{ {
struct fq *fq = &local->fq; struct fq *fq = &local->fq;
@ -407,7 +407,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
kfree(local->cvars); kfree(local->cvars);
local->cvars = NULL; local->cvars = NULL;
@@ -1669,8 +1663,7 @@ static bool ieee80211_queue_skb(struct i @@ -1673,8 +1667,7 @@ static bool ieee80211_queue_skb(struct i
struct ieee80211_vif *vif; struct ieee80211_vif *vif;
struct txq_info *txqi; struct txq_info *txqi;
@ -417,7 +417,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
return false; return false;
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
@@ -4193,12 +4186,7 @@ void __ieee80211_subif_start_xmit(struct @@ -4197,12 +4190,7 @@ void __ieee80211_subif_start_xmit(struct
if (IS_ERR(sta)) if (IS_ERR(sta))
sta = NULL; sta = NULL;
@ -431,7 +431,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
ieee80211_aggr_check(sdata, sta, skb); ieee80211_aggr_check(sdata, sta, skb);
sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift); sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
@@ -4509,11 +4497,7 @@ static void ieee80211_8023_xmit(struct i @@ -4513,11 +4501,7 @@ static void ieee80211_8023_xmit(struct i
struct tid_ampdu_tx *tid_tx; struct tid_ampdu_tx *tid_tx;
u8 tid; u8 tid;
@ -444,7 +444,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) && if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
@@ -4767,9 +4751,6 @@ void ieee80211_tx_pending(struct tasklet @@ -4771,9 +4755,6 @@ void ieee80211_tx_pending(struct tasklet
if (!txok) if (!txok)
break; break;
} }
@ -454,7 +454,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
} }
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
@@ -5962,10 +5943,9 @@ int ieee80211_tx_control_port(struct wip @@ -5966,10 +5947,9 @@ int ieee80211_tx_control_port(struct wip
} }
if (!IS_ERR(sta)) { if (!IS_ERR(sta)) {

View File

@ -59,7 +59,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
flow = fq_find_fattest_flow(fq); flow = fq_find_fattest_flow(fq);
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -1807,6 +1807,10 @@ struct ieee80211_vif_cfg { @@ -1818,6 +1818,10 @@ struct ieee80211_vif_cfg {
* @addr: address of this interface * @addr: address of this interface
* @p2p: indicates whether this AP or STA interface is a p2p * @p2p: indicates whether this AP or STA interface is a p2p
* interface, i.e. a GO or p2p-sta respectively * interface, i.e. a GO or p2p-sta respectively
@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
* @driver_flags: flags/capabilities the driver has for this interface, * @driver_flags: flags/capabilities the driver has for this interface,
* these need to be set (or cleared) when the interface is added * these need to be set (or cleared) when the interface is added
* or, if supported by the driver, the interface type is changed * or, if supported by the driver, the interface type is changed
@@ -1846,6 +1850,7 @@ struct ieee80211_vif { @@ -1857,6 +1861,7 @@ struct ieee80211_vif {
struct ieee80211_txq *txq; struct ieee80211_txq *txq;
@ -90,7 +90,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -1356,7 +1356,11 @@ static struct txq_info *ieee80211_get_tx @@ -1360,7 +1360,11 @@ static struct txq_info *ieee80211_get_tx
static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb)
{ {
@ -103,7 +103,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
static u32 codel_skb_len_func(const struct sk_buff *skb) static u32 codel_skb_len_func(const struct sk_buff *skb)
@@ -3579,55 +3583,79 @@ ieee80211_xmit_fast_finish(struct ieee80 @@ -3583,55 +3587,79 @@ ieee80211_xmit_fast_finish(struct ieee80
return TX_CONTINUE; return TX_CONTINUE;
} }
@ -219,7 +219,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* will not be crypto-handled beyond what we do here, so use false /* will not be crypto-handled beyond what we do here, so use false
* as the may-encrypt argument for the resize to not account for * as the may-encrypt argument for the resize to not account for
@@ -3636,10 +3664,8 @@ static bool ieee80211_xmit_fast(struct i @@ -3640,10 +3668,8 @@ static bool ieee80211_xmit_fast(struct i
if (unlikely(ieee80211_skb_resize(sdata, skb, if (unlikely(ieee80211_skb_resize(sdata, skb,
max_t(int, extra_head + hw_headroom - max_t(int, extra_head + hw_headroom -
skb_headroom(skb), 0), skb_headroom(skb), 0),
@ -232,7 +232,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
memcpy(&eth, skb->data, ETH_HLEN - 2); memcpy(&eth, skb->data, ETH_HLEN - 2);
hdr = skb_push(skb, extra_head); hdr = skb_push(skb, extra_head);
@@ -3653,7 +3679,7 @@ static bool ieee80211_xmit_fast(struct i @@ -3657,7 +3683,7 @@ static bool ieee80211_xmit_fast(struct i
info->control.vif = &sdata->vif; info->control.vif = &sdata->vif;
info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT |
IEEE80211_TX_CTL_DONTFRAG | IEEE80211_TX_CTL_DONTFRAG |
@ -241,7 +241,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT | info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT |
u32_encode_bits(IEEE80211_LINK_UNSPECIFIED, u32_encode_bits(IEEE80211_LINK_UNSPECIFIED,
IEEE80211_TX_CTRL_MLO_LINK); IEEE80211_TX_CTRL_MLO_LINK);
@@ -3677,16 +3703,14 @@ static bool ieee80211_xmit_fast(struct i @@ -3681,16 +3707,14 @@ static bool ieee80211_xmit_fast(struct i
tx.key = fast_tx->key; tx.key = fast_tx->key;
if (ieee80211_queue_skb(local, sdata, sta, skb)) if (ieee80211_queue_skb(local, sdata, sta, skb))
@ -261,7 +261,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
sdata = container_of(sdata->bss, sdata = container_of(sdata->bss,
@@ -3694,6 +3718,56 @@ static bool ieee80211_xmit_fast(struct i @@ -3698,6 +3722,56 @@ static bool ieee80211_xmit_fast(struct i
__skb_queue_tail(&tx.skbs, skb); __skb_queue_tail(&tx.skbs, skb);
ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false); ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false);
@ -318,7 +318,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
return true; return true;
} }
@@ -4201,31 +4275,14 @@ void __ieee80211_subif_start_xmit(struct @@ -4205,31 +4279,14 @@ void __ieee80211_subif_start_xmit(struct
goto out; goto out;
} }
@ -358,7 +358,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
skb_list_walk_safe(skb, skb, next) { skb_list_walk_safe(skb, skb, next) {
@@ -4443,9 +4500,11 @@ normal: @@ -4447,9 +4504,11 @@ normal:
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
@ -373,7 +373,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_tx_control control = {}; struct ieee80211_tx_control control = {};
@@ -4454,14 +4513,6 @@ static bool ieee80211_tx_8023(struct iee @@ -4458,14 +4517,6 @@ static bool ieee80211_tx_8023(struct iee
unsigned long flags; unsigned long flags;
int q = info->hw_queue; int q = info->hw_queue;
@ -388,7 +388,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
spin_lock_irqsave(&local->queue_stop_reason_lock, flags); spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
if (local->queue_stop_reasons[q] || if (local->queue_stop_reasons[q] ||
@@ -4488,6 +4539,26 @@ static bool ieee80211_tx_8023(struct iee @@ -4492,6 +4543,26 @@ static bool ieee80211_tx_8023(struct iee
return true; return true;
} }
@ -415,7 +415,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata, static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
struct net_device *dev, struct sta_info *sta, struct net_device *dev, struct sta_info *sta,
struct ieee80211_key *key, struct sk_buff *skb) struct ieee80211_key *key, struct sk_buff *skb)
@@ -4495,9 +4566,13 @@ static void ieee80211_8023_xmit(struct i @@ -4499,9 +4570,13 @@ static void ieee80211_8023_xmit(struct i
struct ieee80211_tx_info *info; struct ieee80211_tx_info *info;
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct tid_ampdu_tx *tid_tx; struct tid_ampdu_tx *tid_tx;
@ -430,7 +430,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) && if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
@@ -4507,9 +4582,6 @@ static void ieee80211_8023_xmit(struct i @@ -4511,9 +4586,6 @@ static void ieee80211_8023_xmit(struct i
if (unlikely(!skb)) if (unlikely(!skb))
return; return;
@ -440,7 +440,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_aggr_check(sdata, sta, skb); ieee80211_aggr_check(sdata, sta, skb);
tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
@@ -4523,22 +4595,20 @@ static void ieee80211_8023_xmit(struct i @@ -4527,22 +4599,20 @@ static void ieee80211_8023_xmit(struct i
return; return;
} }
@ -471,7 +471,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
sdata = container_of(sdata->bss, sdata = container_of(sdata->bss,
@@ -4550,6 +4620,24 @@ static void ieee80211_8023_xmit(struct i @@ -4554,6 +4624,24 @@ static void ieee80211_8023_xmit(struct i
if (key) if (key)
info->control.hw_key = &key->conf; info->control.hw_key = &key->conf;
@ -496,7 +496,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_tx_8023(sdata, skb, sta, false); ieee80211_tx_8023(sdata, skb, sta, false);
return; return;
@@ -4591,6 +4679,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8 @@ -4595,6 +4683,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8
key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)) key->conf.cipher == WLAN_CIPHER_SUITE_TKIP))
goto skip_offload; goto skip_offload;

View File

@ -728,7 +728,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -3022,6 +3022,9 @@ void ieee80211_check_fast_xmit(struct st @@ -3026,6 +3026,9 @@ void ieee80211_check_fast_xmit(struct st
if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT)) if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT))
return; return;
@ -738,7 +738,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* Locking here protects both the pointer itself, and against concurrent /* Locking here protects both the pointer itself, and against concurrent
* invocations winning data access races to, e.g., the key pointer that * invocations winning data access races to, e.g., the key pointer that
* is used. * is used.
@@ -3403,6 +3406,9 @@ static bool ieee80211_amsdu_aggregate(st @@ -3407,6 +3410,9 @@ static bool ieee80211_amsdu_aggregate(st
if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
return false; return false;
@ -748,7 +748,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (skb_is_gso(skb)) if (skb_is_gso(skb))
return false; return false;
@@ -3635,10 +3641,11 @@ free: @@ -3639,10 +3645,11 @@ free:
return NULL; return NULL;
} }
@ -764,7 +764,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
@@ -3647,7 +3654,6 @@ static void __ieee80211_xmit_fast(struct @@ -3651,7 +3658,6 @@ static void __ieee80211_xmit_fast(struct
ieee80211_tx_result r; ieee80211_tx_result r;
int hw_headroom = sdata->local->hw.extra_tx_headroom; int hw_headroom = sdata->local->hw.extra_tx_headroom;
int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2); int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
@ -772,7 +772,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
skb = skb_share_check(skb, GFP_ATOMIC); skb = skb_share_check(skb, GFP_ATOMIC);
if (unlikely(!skb)) if (unlikely(!skb))
@@ -3667,11 +3673,10 @@ static void __ieee80211_xmit_fast(struct @@ -3671,11 +3677,10 @@ static void __ieee80211_xmit_fast(struct
ENCRYPT_NO))) ENCRYPT_NO)))
goto free; goto free;
@ -786,7 +786,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
info = IEEE80211_SKB_CB(skb); info = IEEE80211_SKB_CB(skb);
memset(info, 0, sizeof(*info)); memset(info, 0, sizeof(*info));
@@ -3690,7 +3695,8 @@ static void __ieee80211_xmit_fast(struct @@ -3694,7 +3699,8 @@ static void __ieee80211_xmit_fast(struct
#endif #endif
if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
@ -796,7 +796,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
*ieee80211_get_qos_ctl(hdr) = tid; *ieee80211_get_qos_ctl(hdr) = tid;
} }
@@ -3733,6 +3739,7 @@ static bool ieee80211_xmit_fast(struct i @@ -3737,6 +3743,7 @@ static bool ieee80211_xmit_fast(struct i
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
struct tid_ampdu_tx *tid_tx = NULL; struct tid_ampdu_tx *tid_tx = NULL;
struct sk_buff *next; struct sk_buff *next;
@ -804,7 +804,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
u8 tid = IEEE80211_NUM_TIDS; u8 tid = IEEE80211_NUM_TIDS;
/* control port protocol needs a lot of special handling */ /* control port protocol needs a lot of special handling */
@@ -3758,6 +3765,8 @@ static bool ieee80211_xmit_fast(struct i @@ -3762,6 +3769,8 @@ static bool ieee80211_xmit_fast(struct i
} }
} }
@ -813,7 +813,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* after this point (skb is modified) we cannot return false */ /* after this point (skb is modified) we cannot return false */
skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata)); skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
if (!skb) if (!skb)
@@ -3765,7 +3774,8 @@ static bool ieee80211_xmit_fast(struct i @@ -3769,7 +3778,8 @@ static bool ieee80211_xmit_fast(struct i
skb_list_walk_safe(skb, skb, next) { skb_list_walk_safe(skb, skb, next) {
skb_mark_not_on_list(skb); skb_mark_not_on_list(skb);
@ -823,7 +823,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
return true; return true;
@@ -4252,8 +4262,15 @@ void __ieee80211_subif_start_xmit(struct @@ -4256,8 +4266,15 @@ void __ieee80211_subif_start_xmit(struct
return; return;
} }
@ -839,7 +839,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
goto out_free; goto out_free;
@@ -4263,8 +4280,6 @@ void __ieee80211_subif_start_xmit(struct @@ -4267,8 +4284,6 @@ void __ieee80211_subif_start_xmit(struct
skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
ieee80211_aggr_check(sdata, sta, skb); ieee80211_aggr_check(sdata, sta, skb);

View File

@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -1191,10 +1191,8 @@ static bool ieee80211_tx_prep_agg(struct @@ -1195,10 +1195,8 @@ static bool ieee80211_tx_prep_agg(struct
return queued; return queued;
} }

View File

@ -13,7 +13,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -5964,6 +5964,18 @@ void ieee80211_queue_delayed_work(struct @@ -5975,6 +5975,18 @@ void ieee80211_queue_delayed_work(struct
unsigned long delay); unsigned long delay);
/** /**

View File

@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -4192,6 +4192,10 @@ struct ieee80211_prep_tx_info { @@ -4203,6 +4203,10 @@ struct ieee80211_prep_tx_info {
* Note that a sta can also be inserted or removed with valid links, * Note that a sta can also be inserted or removed with valid links,
* i.e. passed to @sta_add/@sta_state with sta->valid_links not zero. * i.e. passed to @sta_add/@sta_state with sta->valid_links not zero.
* In fact, cannot change from having valid_links and not having them. * In fact, cannot change from having valid_links and not having them.
@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,
@@ -4547,6 +4551,11 @@ struct ieee80211_ops { @@ -4558,6 +4562,11 @@ struct ieee80211_ops {
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
u16 old_links, u16 new_links); u16 old_links, u16 new_links);

View File

@ -15,7 +15,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -601,8 +601,9 @@ static void iwl_mvm_skb_prepare_status(s @@ -605,8 +605,9 @@ static void iwl_mvm_skb_prepare_status(s
static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm, static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,
struct ieee80211_tx_info *info, struct ieee80211_tx_info *info,
@ -26,7 +26,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
struct iwl_mvm_vif *mvmvif = struct iwl_mvm_vif *mvmvif =
iwl_mvm_vif_from_mac80211(info->control.vif); iwl_mvm_vif_from_mac80211(info->control.vif);
__le16 fc = hdr->frame_control; __le16 fc = hdr->frame_control;
@@ -621,7 +622,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st @@ -625,7 +626,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st
* reason 7 ("Class 3 frame received from nonassociated STA"). * reason 7 ("Class 3 frame received from nonassociated STA").
*/ */
if (ieee80211_is_mgmt(fc) && if (ieee80211_is_mgmt(fc) &&
@ -35,7 +35,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc))) ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc)))
return mvm->probe_queue; return mvm->probe_queue;
@@ -740,7 +741,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv @@ -744,7 +745,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv
else else
sta_id = mvmvif->mcast_sta.sta_id; sta_id = mvmvif->mcast_sta.sta_id;
@ -114,7 +114,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
*/ */
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -488,7 +488,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee @@ -492,7 +492,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
int ac = skb_get_queue_mapping(tx->skb); int ac = skb_get_queue_mapping(tx->skb);
if (ieee80211_is_mgmt(hdr->frame_control) && if (ieee80211_is_mgmt(hdr->frame_control) &&
@ -123,7 +123,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
return TX_CONTINUE; return TX_CONTINUE;
} }
@@ -1326,7 +1326,7 @@ static struct txq_info *ieee80211_get_tx @@ -1330,7 +1330,7 @@ static struct txq_info *ieee80211_get_tx
if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) && if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) &&
unlikely(!ieee80211_is_data_present(hdr->frame_control))) { unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
if ((!ieee80211_is_mgmt(hdr->frame_control) || if ((!ieee80211_is_mgmt(hdr->frame_control) ||

View File

@ -12,7 +12,7 @@ Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -3918,6 +3918,10 @@ struct ieee80211_prep_tx_info { @@ -3929,6 +3929,10 @@ struct ieee80211_prep_tx_info {
* Note that vif can be NULL. * Note that vif can be NULL.
* The callback can sleep. * The callback can sleep.
* *
@ -23,7 +23,7 @@ Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
* @channel_switch: Drivers that need (or want) to offload the channel * @channel_switch: Drivers that need (or want) to offload the channel
* switch operation for CSAs received from the AP may implement this * switch operation for CSAs received from the AP may implement this
* callback. They must then call ieee80211_chswitch_done() to indicate * callback. They must then call ieee80211_chswitch_done() to indicate
@@ -4372,6 +4376,8 @@ struct ieee80211_ops { @@ -4383,6 +4387,8 @@ struct ieee80211_ops {
#endif #endif
void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u32 queues, bool drop); u32 queues, bool drop);

View File

@ -38,7 +38,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -5252,6 +5252,74 @@ ieee80211_beacon_get_template(struct iee @@ -5263,6 +5263,74 @@ ieee80211_beacon_get_template(struct iee
unsigned int link_id); unsigned int link_id);
/** /**
@ -168,7 +168,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
--- a/net/mac80211/tx.c --- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c +++ b/net/mac80211/tx.c
@@ -5205,13 +5205,20 @@ ieee80211_beacon_get_finish(struct ieee8 @@ -5209,13 +5209,20 @@ ieee80211_beacon_get_finish(struct ieee8
} }
static void static void
@ -192,7 +192,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
for (i = 0; i < beacon->mbssid_ies->cnt; i++) for (i = 0; i < beacon->mbssid_ies->cnt; i++)
skb_put_data(skb, beacon->mbssid_ies->elem[i].data, skb_put_data(skb, beacon->mbssid_ies->elem[i].data,
beacon->mbssid_ies->elem[i].len); beacon->mbssid_ies->elem[i].len);
@@ -5224,7 +5231,8 @@ ieee80211_beacon_get_ap(struct ieee80211 @@ -5228,7 +5235,8 @@ ieee80211_beacon_get_ap(struct ieee80211
struct ieee80211_mutable_offsets *offs, struct ieee80211_mutable_offsets *offs,
bool is_template, bool is_template,
struct beacon_data *beacon, struct beacon_data *beacon,
@ -202,7 +202,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
{ {
struct ieee80211_local *local = hw_to_local(hw); struct ieee80211_local *local = hw_to_local(hw);
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
@@ -5243,7 +5251,9 @@ ieee80211_beacon_get_ap(struct ieee80211 @@ -5247,7 +5255,9 @@ ieee80211_beacon_get_ap(struct ieee80211
/* headroom, head length, /* headroom, head length,
* tail length, maximum TIM length and multiple BSSID length * tail length, maximum TIM length and multiple BSSID length
*/ */
@ -213,7 +213,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + skb = dev_alloc_skb(local->tx_headroom + beacon->head_len +
beacon->tail_len + 256 + beacon->tail_len + 256 +
local->hw.extra_beacon_tailroom + mbssid_len); local->hw.extra_beacon_tailroom + mbssid_len);
@@ -5261,7 +5271,7 @@ ieee80211_beacon_get_ap(struct ieee80211 @@ -5265,7 +5275,7 @@ ieee80211_beacon_get_ap(struct ieee80211
offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0];
if (mbssid_len) { if (mbssid_len) {
@ -222,7 +222,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
offs->mbssid_off = skb->len - mbssid_len; offs->mbssid_off = skb->len - mbssid_len;
} }
@@ -5280,12 +5290,51 @@ ieee80211_beacon_get_ap(struct ieee80211 @@ -5284,12 +5294,51 @@ ieee80211_beacon_get_ap(struct ieee80211
return skb; return skb;
} }
@ -275,7 +275,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
{ {
struct ieee80211_local *local = hw_to_local(hw); struct ieee80211_local *local = hw_to_local(hw);
struct beacon_data *beacon = NULL; struct beacon_data *beacon = NULL;
@@ -5314,8 +5363,29 @@ __ieee80211_beacon_get(struct ieee80211_ @@ -5318,8 +5367,29 @@ __ieee80211_beacon_get(struct ieee80211_
if (!beacon) if (!beacon)
goto out; goto out;
@ -307,7 +307,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
} else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
@@ -5403,10 +5473,50 @@ ieee80211_beacon_get_template(struct iee @@ -5407,10 +5477,50 @@ ieee80211_beacon_get_template(struct iee
struct ieee80211_mutable_offsets *offs, struct ieee80211_mutable_offsets *offs,
unsigned int link_id) unsigned int link_id)
{ {
@ -359,7 +359,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
u16 *tim_offset, u16 *tim_length, u16 *tim_offset, u16 *tim_length,
@@ -5414,7 +5524,9 @@ struct sk_buff *ieee80211_beacon_get_tim @@ -5418,7 +5528,9 @@ struct sk_buff *ieee80211_beacon_get_tim
{ {
struct ieee80211_mutable_offsets offs = {}; struct ieee80211_mutable_offsets offs = {};
struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false, struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false,

View File

@ -16,7 +16,7 @@ and we should ignore this.
--- a/net/wireless/core.c --- a/net/wireless/core.c
+++ b/net/wireless/core.c +++ b/net/wireless/core.c
@@ -614,21 +614,6 @@ static int wiphy_verify_combinations(str @@ -630,21 +630,6 @@ static int wiphy_verify_combinations(str
c->limits[j].max > 1)) c->limits[j].max > 1))
return -EINVAL; return -EINVAL;

View File

@ -18,7 +18,7 @@
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -1677,6 +1677,7 @@ enum ieee80211_smps_mode { @@ -1688,6 +1688,7 @@ enum ieee80211_smps_mode {
* *
* @power_level: requested transmit power (in dBm), backward compatibility * @power_level: requested transmit power (in dBm), backward compatibility
* value only that is set to the minimum of all interfaces * value only that is set to the minimum of all interfaces
@ -26,7 +26,7 @@
* *
* @chandef: the channel definition to tune to * @chandef: the channel definition to tune to
* @radar_enabled: whether radar detection is enabled * @radar_enabled: whether radar detection is enabled
@@ -1697,6 +1698,7 @@ enum ieee80211_smps_mode { @@ -1708,6 +1709,7 @@ enum ieee80211_smps_mode {
struct ieee80211_conf { struct ieee80211_conf {
u32 flags; u32 flags;
int power_level, dynamic_ps_timeout; int power_level, dynamic_ps_timeout;

View File

@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/net/mac80211/sta_info.c --- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c
@@ -2422,6 +2422,13 @@ static void sta_stats_decode_rate(struct @@ -2363,6 +2363,13 @@ static void sta_stats_decode_rate(struct
sband = local->hw.wiphy->bands[band]; sband = local->hw.wiphy->bands[band];

View File

@ -1,6 +1,6 @@
--- a/include/net/mac80211.h --- a/include/net/mac80211.h
+++ b/include/net/mac80211.h +++ b/include/net/mac80211.h
@@ -673,6 +673,12 @@ @@ -673,6 +673,12 @@ struct ieee80211_fils_discovery {
* @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission
* (non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU * (non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU
* bandwidth * bandwidth
@ -13,7 +13,7 @@
*/ */
struct ieee80211_bss_conf { struct ieee80211_bss_conf {
const u8 *bssid; const u8 *bssid;
@@ -758,6 +764,9 @@ @@ -758,6 +764,9 @@ struct ieee80211_bss_conf {
bool he_su_beamformee; bool he_su_beamformee;
bool he_mu_beamformer; bool he_mu_beamformer;
bool he_full_ul_mumimo; bool he_full_ul_mumimo;
@ -25,7 +25,7 @@
/** /**
--- a/net/mac80211/cfg.c --- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c
@@ -1307,6 +1307,27 @@ @@ -1307,6 +1307,27 @@ static int ieee80211_start_ap(struct wip
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO; IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO;
} }