mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-04 04:54:18 +00:00
323e249ce8
This updates mac80211 to version 6.1.97-1. This code is based on Linux 6.1.97 and contains all fixes included in the upstream wireless subsystem from that kernel version. This includes many bugfixes and also some security fixes. The removed patches are already integrated in upstream Linux 6.1.97 or in backports. The following patches were integrated in upstream Linux: ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch ath11k/0085-wifi-ath11k-fix-memory-leak-in-WMI-firmware-stats.patch ath11k/0086-wifi-ath11k-Add-missing-check-for-ioremap.patch ath11k/0096-wifi-ath11k-fix-boot-failure-with-one-MSI-vector.patch subsys/337-wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch The following patches were integrated in upstream backports: ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch build/080-resv_start_op.patch build/110-backport_napi_build_skb.patch The following files are missing in backports, we do not have to remove them any more. Some were already missing before some were removed in this update: include/linux/cordic.h include/linux/crc8.h include/linux/eeprom_93cx6.h include/linux/wl12xx.h include/net/ieee80211.h backport-include/linux/bcm47xx_nvram.h include/linux/ath9k_platform.h include/net/bluetooth/ backports ships a dummy Mediatek wed header for older kernel versions. We backported the feature in our kernel, remove the dummy header: backport-include/linux/soc/mediatek/mtk_wed.h Remove header files for subsystems used form the mainline kernel: include/trace/events/qrtr.h include/net/rsi_91x.h backport-include/linux/platform_data/brcmnand.h Link: https://github.com/openwrt/openwrt/pull/15827 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
191 lines
5.4 KiB
Diff
191 lines
5.4 KiB
Diff
From 335a92765d308dfe22826f5562cd4b4389b45e71 Mon Sep 17 00:00:00 2001
|
|
From: Aloka Dixit <quic_alokad@quicinc.com>
|
|
Date: Fri, 5 May 2023 16:11:28 +0300
|
|
Subject: [PATCH 76/77] wifi: ath11k: MBSSID beacon support
|
|
|
|
- Split ath11k_mac_setup_bcn_tmpl() to move the beacon retrieval and
|
|
WMI command to a new function, ath11k_mac_setup_bcn_tmpl_legacy().
|
|
In the original function add checks to use the transmitting interface
|
|
when MBSSID is enabled.
|
|
- Set rsnie_present and wpaie_present fields for the non-transmitting
|
|
interfaces when MBSSID is enabled.
|
|
|
|
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
|
|
|
|
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
|
|
Co-developed-by: John Crispin <john@phrozen.org>
|
|
Signed-off-by: John Crispin <john@phrozen.org>
|
|
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
|
Link: https://lore.kernel.org/r/20230405221648.17950-7-quic_alokad@quicinc.com
|
|
---
|
|
drivers/net/wireless/ath/ath11k/mac.c | 116 ++++++++++++++++++++++++--
|
|
drivers/net/wireless/ath/ath11k/wmi.c | 1 +
|
|
2 files changed, 112 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
|
@@ -1344,6 +1344,84 @@ err_mon_del:
|
|
return ret;
|
|
}
|
|
|
|
+static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif,
|
|
+ bool tx_arvif_rsnie_present,
|
|
+ const u8 *profile, u8 profile_len)
|
|
+{
|
|
+ if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) {
|
|
+ arvif->rsnie_present = true;
|
|
+ } else if (tx_arvif_rsnie_present) {
|
|
+ int i;
|
|
+ u8 nie_len;
|
|
+ const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE,
|
|
+ profile, profile_len);
|
|
+ if (!nie)
|
|
+ return;
|
|
+
|
|
+ nie_len = nie[1];
|
|
+ nie += 2;
|
|
+ for (i = 0; i < nie_len; i++) {
|
|
+ if (nie[i] == WLAN_EID_RSN) {
|
|
+ arvif->rsnie_present = false;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif,
|
|
+ struct ath11k_vif *arvif,
|
|
+ struct sk_buff *bcn)
|
|
+{
|
|
+ struct ieee80211_mgmt *mgmt;
|
|
+ const u8 *ies, *profile, *next_profile;
|
|
+ int ies_len;
|
|
+
|
|
+ ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
|
|
+ mgmt = (struct ieee80211_mgmt *)bcn->data;
|
|
+ ies += sizeof(mgmt->u.beacon);
|
|
+ ies_len = skb_tail_pointer(bcn) - ies;
|
|
+
|
|
+ ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len);
|
|
+ arvif->rsnie_present = tx_arvif->rsnie_present;
|
|
+
|
|
+ while (ies) {
|
|
+ u8 mbssid_len;
|
|
+
|
|
+ ies_len -= (2 + ies[1]);
|
|
+ mbssid_len = ies[1] - 1;
|
|
+ profile = &ies[3];
|
|
+
|
|
+ while (mbssid_len) {
|
|
+ u8 profile_len;
|
|
+
|
|
+ profile_len = profile[1];
|
|
+ next_profile = profile + (2 + profile_len);
|
|
+ mbssid_len -= (2 + profile_len);
|
|
+
|
|
+ profile += 2;
|
|
+ profile_len -= (2 + profile[1]);
|
|
+ profile += (2 + profile[1]); /* nontx capabilities */
|
|
+ profile_len -= (2 + profile[1]);
|
|
+ profile += (2 + profile[1]); /* SSID */
|
|
+ if (profile[2] == arvif->vif->bss_conf.bssid_index) {
|
|
+ profile_len -= 5;
|
|
+ profile = profile + 5;
|
|
+ ath11k_mac_setup_nontx_vif_rsnie(arvif,
|
|
+ tx_arvif->rsnie_present,
|
|
+ profile,
|
|
+ profile_len);
|
|
+ return true;
|
|
+ }
|
|
+ profile = next_profile;
|
|
+ }
|
|
+ ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile,
|
|
+ ies_len);
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
|
|
struct sk_buff *bcn)
|
|
{
|
|
@@ -1367,18 +1445,26 @@ static void ath11k_mac_set_vif_params(st
|
|
arvif->wpaie_present = false;
|
|
}
|
|
|
|
-static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
|
|
+static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
|
|
{
|
|
struct ath11k *ar = arvif->ar;
|
|
struct ath11k_base *ab = ar->ab;
|
|
+ struct ath11k_vif *tx_arvif = arvif;
|
|
struct ieee80211_hw *hw = ar->hw;
|
|
struct ieee80211_vif *vif = arvif->vif;
|
|
struct ieee80211_mutable_offsets offs = {};
|
|
struct sk_buff *bcn;
|
|
int ret;
|
|
|
|
- if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
|
|
- return 0;
|
|
+ if (arvif->vif->mbssid_tx_vif) {
|
|
+ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
|
|
+ if (tx_arvif != arvif) {
|
|
+ ar = tx_arvif->ar;
|
|
+ ab = ar->ab;
|
|
+ hw = ar->hw;
|
|
+ vif = tx_arvif->vif;
|
|
+ }
|
|
+ }
|
|
|
|
bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
|
|
if (!bcn) {
|
|
@@ -1386,9 +1472,12 @@ static int ath11k_mac_setup_bcn_tmpl(str
|
|
return -EPERM;
|
|
}
|
|
|
|
- ath11k_mac_set_vif_params(arvif, bcn);
|
|
- ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
|
|
+ if (tx_arvif == arvif)
|
|
+ ath11k_mac_set_vif_params(tx_arvif, bcn);
|
|
+ else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn))
|
|
+ return -EINVAL;
|
|
|
|
+ ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
|
|
kfree_skb(bcn);
|
|
|
|
if (ret)
|
|
@@ -1398,6 +1487,23 @@ static int ath11k_mac_setup_bcn_tmpl(str
|
|
return ret;
|
|
}
|
|
|
|
+static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
|
|
+{
|
|
+ struct ieee80211_vif *vif = arvif->vif;
|
|
+
|
|
+ if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
|
|
+ return 0;
|
|
+
|
|
+ /* Target does not expect beacon templates for the already up
|
|
+ * non-transmitting interfaces, and results in a crash if sent.
|
|
+ */
|
|
+ if (vif->mbssid_tx_vif &&
|
|
+ arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up)
|
|
+ return 0;
|
|
+
|
|
+ return ath11k_mac_setup_bcn_tmpl_mbssid(arvif);
|
|
+}
|
|
+
|
|
void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
|
|
{
|
|
struct ieee80211_vif *vif = arvif->vif;
|
|
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
|
@@ -1737,6 +1737,7 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a
|
|
}
|
|
|
|
cmd->buf_len = bcn->len;
|
|
+ cmd->mbssid_ie_offset = offs->mbssid_off;
|
|
|
|
ptr = skb->data + sizeof(*cmd);
|
|
|