mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
mac80211: backport QCA2066 support
This commit is contained in:
parent
b2cdb3a102
commit
6488a08057
@ -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)
|
||||
define Package/ath11k-firmware-qca6390/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCA6390/hw2.0
|
||||
|
@ -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;
|
@ -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);
|
@ -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;
|
@ -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)
|
@ -138,7 +138,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
int ath11k_mhi_register(struct ath11k_pci *ar_pci);
|
||||
--- a/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)
|
||||
{
|
||||
struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg;
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- a/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,
|
||||
&ab->pci.msi.addr_lo);
|
||||
|
||||
|
@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
{
|
||||
.hw_rev = ATH11K_HW_IPQ8074,
|
||||
.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)
|
||||
{
|
||||
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++) {
|
||||
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;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/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,
|
||||
.idle_ps = false,
|
||||
.supports_sta_ps = false,
|
||||
|
@ -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;
|
||||
}
|
@ -69,7 +69,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
|
||||
--- a/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)
|
||||
int backport_genlmsg_multicast_allns(const struct genl_family *family,
|
||||
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)
|
||||
--- a/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);
|
||||
|
||||
@ -108,7 +108,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
if (!err)
|
||||
delivered = true;
|
||||
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;
|
||||
}
|
||||
@ -143,7 +143,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
EXPORT_SYMBOL_GPL(backport_genlmsg_multicast_allns);
|
||||
--- a/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);
|
||||
|
||||
@ -159,7 +159,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||||
|
||||
return;
|
||||
|
||||
@@ -18217,10 +18222,15 @@
|
||||
@@ -18188,10 +18193,15 @@ void nl80211_send_beacon_hint_event(stru
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
|
||||
|
@ -113,7 +113,7 @@
|
||||
u8 rx_flags;
|
||||
--- a/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)
|
||||
goto out_exit_netlink;
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
static inline u32 __get_unaligned_be24(const u8 *p)
|
||||
--- a/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) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
@ -34,7 +34,7 @@
|
||||
}
|
||||
|
||||
if (err) {
|
||||
@@ -180,11 +188,19 @@
|
||||
@@ -180,11 +188,19 @@ int cfg80211_switch_netns(struct cfg8021
|
||||
list) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
@ -54,7 +54,7 @@
|
||||
}
|
||||
|
||||
return err;
|
||||
@@ -1413,7 +1429,11 @@
|
||||
@@ -1428,7 +1444,11 @@ static int cfg80211_netdev_notifier_call
|
||||
SET_NETDEV_DEVTYPE(dev, &wiphy_type);
|
||||
wdev->netdev = dev;
|
||||
/* can only change netns with wiphy */
|
||||
@ -67,8 +67,8 @@
|
||||
cfg80211_init_wdev(wdev);
|
||||
break;
|
||||
--- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
|
||||
+++ a/net/mac80211/rc80211_minstrel_ht_debugfs.c
|
||||
@@ -187,7 +187,9 @@
|
||||
+++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
|
||||
@@ -187,7 +187,9 @@ static const struct file_operations mins
|
||||
.open = minstrel_ht_stats_open,
|
||||
.read = minstrel_stats_read,
|
||||
.release = minstrel_stats_release,
|
||||
@ -78,7 +78,7 @@
|
||||
};
|
||||
|
||||
static char *
|
||||
@@ -323,7 +325,9 @@
|
||||
@@ -323,7 +325,9 @@ static const struct file_operations mins
|
||||
.open = minstrel_ht_stats_csv_open,
|
||||
.read = minstrel_stats_read,
|
||||
.release = minstrel_stats_release,
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/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)
|
||||
sta->airtime[txqi->txq.ac].deficit +=
|
||||
@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (deficit < 0 || !aql_check) {
|
||||
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);
|
||||
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]);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
goto out;
|
||||
|
||||
|
@ -51,7 +51,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
*
|
||||
* Drivers can optionally delegate responsibility for scheduling queues 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
|
||||
* ieee80211_sta_recalc_aggregates() must be called to update it.
|
||||
* @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
|
||||
* specific STA information is accessed through @deflink or through
|
||||
* 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().
|
||||
* @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);
|
||||
|
||||
@@ -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().
|
||||
* @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);
|
||||
|
||||
@@ -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().
|
||||
* @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.
|
||||
*/
|
||||
@@ -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
|
||||
* @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);
|
||||
|
||||
@@ -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
|
||||
* @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);
|
||||
|
||||
@@ -6946,6 +6947,18 @@ static inline struct sk_buff *ieee80211_
|
||||
@@ -6957,6 +6958,18 @@ static inline struct sk_buff *ieee80211_
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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.
|
||||
--- a/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;
|
||||
enum nl80211_band band;
|
||||
|
||||
@ -397,7 +397,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
ret = fq_init(fq, 4096);
|
||||
if (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;
|
||||
|
||||
@ -407,7 +407,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
kfree(local->cvars);
|
||||
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 txq_info *txqi;
|
||||
|
||||
@ -417,7 +417,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
return false;
|
||||
|
||||
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))
|
||||
sta = NULL;
|
||||
|
||||
@ -431,7 +431,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
ieee80211_aggr_check(sdata, sta, skb);
|
||||
|
||||
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;
|
||||
u8 tid;
|
||||
|
||||
@ -444,7 +444,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
|
||||
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)
|
||||
break;
|
||||
}
|
||||
@ -454,7 +454,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
}
|
||||
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)) {
|
||||
|
@ -59,7 +59,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
flow = fq_find_fattest_flow(fq);
|
||||
--- a/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
|
||||
* @p2p: indicates whether this AP or STA interface is a p2p
|
||||
* 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,
|
||||
* these need to be set (or cleared) when the interface is added
|
||||
* 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;
|
||||
|
||||
@ -90,7 +90,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/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)
|
||||
{
|
||||
@ -103,7 +103,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
* 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,
|
||||
max_t(int, extra_head + hw_headroom -
|
||||
skb_headroom(skb), 0),
|
||||
@ -232,7 +232,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
memcpy(ð, skb->data, ETH_HLEN - 2);
|
||||
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->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT |
|
||||
IEEE80211_TX_CTL_DONTFRAG |
|
||||
@ -241,7 +241,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT |
|
||||
u32_encode_bits(IEEE80211_LINK_UNSPECIFIED,
|
||||
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;
|
||||
|
||||
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)
|
||||
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);
|
||||
ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false);
|
||||
@ -318,7 +318,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -4201,31 +4275,14 @@ void __ieee80211_subif_start_xmit(struct
|
||||
@@ -4205,31 +4279,14 @@ void __ieee80211_subif_start_xmit(struct
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -358,7 +358,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
}
|
||||
|
||||
skb_list_walk_safe(skb, skb, next) {
|
||||
@@ -4443,9 +4500,11 @@ normal:
|
||||
@@ -4447,9 +4504,11 @@ normal:
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@ -373,7 +373,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
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;
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -415,7 +415,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
|
||||
struct net_device *dev, struct sta_info *sta,
|
||||
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_local *local = sdata->local;
|
||||
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)) &&
|
||||
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))
|
||||
return;
|
||||
|
||||
@ -440,7 +440,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
ieee80211_aggr_check(sdata, sta, skb);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -471,7 +471,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
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)
|
||||
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);
|
||||
|
||||
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))
|
||||
goto skip_offload;
|
||||
|
||||
|
@ -728,7 +728,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/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))
|
||||
return;
|
||||
|
||||
@ -738,7 +738,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
/* Locking here protects both the pointer itself, and against concurrent
|
||||
* invocations winning data access races to, e.g., the key pointer that
|
||||
* 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)
|
||||
return false;
|
||||
|
||||
@ -748,7 +748,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (skb_is_gso(skb))
|
||||
return false;
|
||||
|
||||
@@ -3635,10 +3641,11 @@ free:
|
||||
@@ -3639,10 +3645,11 @@ free:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -764,7 +764,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
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;
|
||||
int hw_headroom = sdata->local->hw.extra_tx_headroom;
|
||||
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);
|
||||
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)))
|
||||
goto free;
|
||||
|
||||
@ -786,7 +786,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
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
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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 tid_ampdu_tx *tid_tx = NULL;
|
||||
struct sk_buff *next;
|
||||
@ -804,7 +804,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
u8 tid = IEEE80211_NUM_TIDS;
|
||||
|
||||
/* 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 */
|
||||
skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
|
||||
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_mark_not_on_list(skb);
|
||||
@ -823,7 +823,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -4252,8 +4262,15 @@ void __ieee80211_subif_start_xmit(struct
|
||||
@@ -4256,8 +4266,15 @@ void __ieee80211_subif_start_xmit(struct
|
||||
return;
|
||||
}
|
||||
|
||||
@ -839,7 +839,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
|
||||
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));
|
||||
ieee80211_aggr_check(sdata, sta, skb);
|
||||
|
||||
|
@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
|
||||
--- a/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;
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||
|
||||
--- a/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);
|
||||
|
||||
/**
|
||||
|
@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/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,
|
||||
* 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.
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
*/
|
||||
struct ieee80211_ops {
|
||||
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_sta *sta,
|
||||
u16 old_links, u16 new_links);
|
||||
|
@ -15,7 +15,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
|
||||
|
||||
--- a/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,
|
||||
struct ieee80211_tx_info *info,
|
||||
@ -26,7 +26,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
|
||||
struct iwl_mvm_vif *mvmvif =
|
||||
iwl_mvm_vif_from_mac80211(info->control.vif);
|
||||
__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").
|
||||
*/
|
||||
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)))
|
||||
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
|
||||
sta_id = mvmvif->mcast_sta.sta_id;
|
||||
|
||||
@ -114,7 +114,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
|
||||
*/
|
||||
--- a/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);
|
||||
|
||||
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;
|
||||
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) &&
|
||||
unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
|
||||
if ((!ieee80211_is_mgmt(hdr->frame_control) ||
|
||||
|
@ -12,7 +12,7 @@ Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
|
||||
|
||||
--- a/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.
|
||||
* 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
|
||||
* switch operation for CSAs received from the AP may implement this
|
||||
* 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
|
||||
void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
u32 queues, bool drop);
|
||||
|
@ -38,7 +38,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
--- a/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);
|
||||
|
||||
/**
|
||||
@ -168,7 +168,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
--- a/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
|
||||
@ -192,7 +192,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
for (i = 0; i < beacon->mbssid_ies->cnt; i++)
|
||||
skb_put_data(skb, beacon->mbssid_ies->elem[i].data,
|
||||
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,
|
||||
bool is_template,
|
||||
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_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,
|
||||
* 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 +
|
||||
beacon->tail_len + 256 +
|
||||
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];
|
||||
|
||||
if (mbssid_len) {
|
||||
@ -222,7 +222,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
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;
|
||||
}
|
||||
|
||||
@ -275,7 +275,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
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)
|
||||
goto out;
|
||||
|
||||
@ -307,7 +307,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
} else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
|
||||
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
|
||||
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,
|
||||
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 ieee80211_vif *vif,
|
||||
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 sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false,
|
||||
|
@ -16,7 +16,7 @@ and we should ignore this.
|
||||
|
||||
--- a/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))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
|
||||
--- a/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
|
||||
* value only that is set to the minimum of all interfaces
|
||||
@ -26,7 +26,7 @@
|
||||
*
|
||||
* @chandef: the channel definition to tune to
|
||||
* @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 {
|
||||
u32 flags;
|
||||
int power_level, dynamic_ps_timeout;
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/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];
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/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
|
||||
* (non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU
|
||||
* bandwidth
|
||||
@ -13,7 +13,7 @@
|
||||
*/
|
||||
struct ieee80211_bss_conf {
|
||||
const u8 *bssid;
|
||||
@@ -758,6 +764,9 @@
|
||||
@@ -758,6 +764,9 @@ struct ieee80211_bss_conf {
|
||||
bool he_su_beamformee;
|
||||
bool he_mu_beamformer;
|
||||
bool he_full_ul_mumimo;
|
||||
@ -25,7 +25,7 @@
|
||||
/**
|
||||
--- a/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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user