mirror of
https://github.com/openwrt/openwrt.git
synced 2025-02-21 17:47:00 +00:00
mac80211: Update to version 5.14.13-1
The removed patches were applied upstream. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
parent
1c0d5ee8e6
commit
cfe0eb7485
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||||||
|
|
||||||
PKG_NAME:=mac80211
|
PKG_NAME:=mac80211
|
||||||
|
|
||||||
PKG_VERSION:=5.13.19-1
|
PKG_VERSION:=5.14.13-1
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.13.19/
|
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.14.13/
|
||||||
PKG_HASH:=1eb761c1664d59a0a2d52847f240c9d02fc2e56fb27d862d2949bfb275187eef
|
PKG_HASH:=042aef20caf17ef649502d5f2e744a7676abe7faed18de83c96f37bc029635fe
|
||||||
|
|
||||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
||||||
|
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||||
@@ -2961,6 +2961,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
@@ -2966,6 +2966,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||||
* preference in cfg struct to apply this to
|
* preference in cfg struct to apply this to
|
||||||
* FW later while initializing the dongle
|
* FW later while initializing the dongle
|
||||||
*/
|
*/
|
||||||
|
@ -12,9 +12,9 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||||
@@ -12,6 +12,36 @@
|
@@ -58,6 +58,36 @@ static int brcmf_of_get_country_codes(st
|
||||||
#include "common.h"
|
return 0;
|
||||||
#include "of.h"
|
}
|
||||||
|
|
||||||
+/* TODO: FIXME: Use DT */
|
+/* TODO: FIXME: Use DT */
|
||||||
+static void brcmf_of_probe_cc(struct device *dev,
|
+static void brcmf_of_probe_cc(struct device *dev,
|
||||||
@ -49,12 +49,12 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
|||||||
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||||
struct brcmf_mp_device *settings)
|
struct brcmf_mp_device *settings)
|
||||||
{
|
{
|
||||||
@@ -43,6 +73,8 @@ void brcmf_of_probe(struct device *dev,
|
@@ -90,6 +120,8 @@ void brcmf_of_probe(struct device *dev,
|
||||||
of_node_put(root);
|
of_node_put(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ brcmf_of_probe_cc(dev, settings);
|
+ brcmf_of_probe_cc(dev, settings);
|
||||||
+
|
+
|
||||||
if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
|
if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||||
!of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||||
int idx, u8 *mac, struct station_info *sinfo)
|
int idx, u8 *mac, struct station_info *sinfo)
|
||||||
{
|
{
|
||||||
@@ -3008,6 +3065,7 @@ static s32 brcmf_inform_single_bss(struc
|
@@ -3013,6 +3070,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||||
struct brcmu_chan ch;
|
struct brcmu_chan ch;
|
||||||
u16 channel;
|
u16 channel;
|
||||||
u32 freq;
|
u32 freq;
|
||||||
@ -72,7 +72,7 @@
|
|||||||
u16 notify_capability;
|
u16 notify_capability;
|
||||||
u16 notify_interval;
|
u16 notify_interval;
|
||||||
u8 *notify_ie;
|
u8 *notify_ie;
|
||||||
@@ -3032,6 +3090,17 @@ static s32 brcmf_inform_single_bss(struc
|
@@ -3037,6 +3095,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||||
band = NL80211_BAND_5GHZ;
|
band = NL80211_BAND_5GHZ;
|
||||||
|
|
||||||
freq = ieee80211_channel_to_frequency(channel, band);
|
freq = ieee80211_channel_to_frequency(channel, band);
|
||||||
@ -90,7 +90,7 @@
|
|||||||
bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
||||||
bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||||
bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
||||||
@@ -5560,6 +5629,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
@@ -5565,6 +5634,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||||
.leave_ibss = brcmf_cfg80211_leave_ibss,
|
.leave_ibss = brcmf_cfg80211_leave_ibss,
|
||||||
.get_station = brcmf_cfg80211_get_station,
|
.get_station = brcmf_cfg80211_get_station,
|
||||||
.dump_station = brcmf_cfg80211_dump_station,
|
.dump_station = brcmf_cfg80211_dump_station,
|
||||||
@ -100,7 +100,7 @@
|
|||||||
.add_key = brcmf_cfg80211_add_key,
|
.add_key = brcmf_cfg80211_add_key,
|
||||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||||
@@ -1356,6 +1356,8 @@ int brcmf_attach(struct device *dev)
|
@@ -1361,6 +1361,8 @@ int brcmf_attach(struct device *dev)
|
||||||
|
|
||||||
/* Link to bus module */
|
/* Link to bus module */
|
||||||
drvr->hdrlen = 0;
|
drvr->hdrlen = 0;
|
||||||
@ -109,7 +109,7 @@
|
|||||||
|
|
||||||
/* Attach and link in the protocol */
|
/* Attach and link in the protocol */
|
||||||
ret = brcmf_proto_attach(drvr);
|
ret = brcmf_proto_attach(drvr);
|
||||||
@@ -1438,6 +1440,12 @@ void brcmf_detach(struct device *dev)
|
@@ -1443,6 +1445,12 @@ void brcmf_detach(struct device *dev)
|
||||||
if (drvr == NULL)
|
if (drvr == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
static int ieee80211_ifa6_changed(struct notifier_block *nb,
|
static int ieee80211_ifa6_changed(struct notifier_block *nb,
|
||||||
unsigned long data, void *arg)
|
unsigned long data, void *arg)
|
||||||
{
|
{
|
||||||
@@ -1319,14 +1319,14 @@ int ieee80211_register_hw(struct ieee802
|
@@ -1324,14 +1324,14 @@ int ieee80211_register_hw(struct ieee802
|
||||||
wiphy_unlock(hw->wiphy);
|
wiphy_unlock(hw->wiphy);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
|
||||||
@ -35,7 +35,7 @@
|
|||||||
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
|
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
|
||||||
result = register_inet6addr_notifier(&local->ifa6_notifier);
|
result = register_inet6addr_notifier(&local->ifa6_notifier);
|
||||||
if (result)
|
if (result)
|
||||||
@@ -1335,13 +1335,13 @@ int ieee80211_register_hw(struct ieee802
|
@@ -1340,13 +1340,13 @@ int ieee80211_register_hw(struct ieee802
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -52,7 +52,7 @@
|
|||||||
fail_ifa:
|
fail_ifa:
|
||||||
#endif
|
#endif
|
||||||
wiphy_unregister(local->hw.wiphy);
|
wiphy_unregister(local->hw.wiphy);
|
||||||
@@ -1369,10 +1369,10 @@ void ieee80211_unregister_hw(struct ieee
|
@@ -1374,10 +1374,10 @@ void ieee80211_unregister_hw(struct ieee
|
||||||
tasklet_kill(&local->tx_pending_tasklet);
|
tasklet_kill(&local->tx_pending_tasklet);
|
||||||
tasklet_kill(&local->tasklet);
|
tasklet_kill(&local->tasklet);
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/net/mac80211/cfg.c
|
--- a/net/mac80211/cfg.c
|
||||||
+++ b/net/mac80211/cfg.c
|
+++ b/net/mac80211/cfg.c
|
||||||
@@ -2462,7 +2462,7 @@ static int ieee80211_scan(struct wiphy *
|
@@ -2487,7 +2487,7 @@ static int ieee80211_scan(struct wiphy *
|
||||||
* the frames sent while scanning on other channel will be
|
* the frames sent while scanning on other channel will be
|
||||||
* lost)
|
* lost)
|
||||||
*/
|
*/
|
||||||
|
@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
--- 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
|
||||||
@@ -2990,15 +2990,19 @@ static void mac80211_hwsim_he_capab(stru
|
@@ -2992,15 +2992,19 @@ static void mac80211_hwsim_he_capab(stru
|
||||||
{
|
{
|
||||||
u16 n_iftype_data;
|
u16 n_iftype_data;
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3288,6 +3292,12 @@ static int mac80211_hwsim_new_radio(stru
|
@@ -3290,6 +3294,12 @@ static int mac80211_hwsim_new_radio(stru
|
||||||
sband->vht_cap.vht_mcs.tx_mcs_map =
|
sband->vht_cap.vht_mcs.tx_mcs_map =
|
||||||
sband->vht_cap.vht_mcs.rx_mcs_map;
|
sband->vht_cap.vht_mcs.rx_mcs_map;
|
||||||
break;
|
break;
|
||||||
@ -47,7 +47,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
case NL80211_BAND_S1GHZ:
|
case NL80211_BAND_S1GHZ:
|
||||||
memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
|
memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
|
||||||
sizeof(sband->s1g_cap));
|
sizeof(sband->s1g_cap));
|
||||||
@@ -3298,6 +3308,13 @@ static int mac80211_hwsim_new_radio(stru
|
@@ -3300,6 +3310,13 @@ static int mac80211_hwsim_new_radio(stru
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
sband->ht_cap.ht_supported = true;
|
sband->ht_cap.ht_supported = true;
|
||||||
sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
||||||
IEEE80211_HT_CAP_GRN_FLD |
|
IEEE80211_HT_CAP_GRN_FLD |
|
||||||
@@ -3311,10 +3328,6 @@ static int mac80211_hwsim_new_radio(stru
|
@@ -3313,10 +3330,6 @@ static int mac80211_hwsim_new_radio(stru
|
||||||
sband->ht_cap.mcs.rx_mask[0] = 0xff;
|
sband->ht_cap.mcs.rx_mask[0] = 0xff;
|
||||||
sband->ht_cap.mcs.rx_mask[1] = 0xff;
|
sband->ht_cap.mcs.rx_mask[1] = 0xff;
|
||||||
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||||
|
@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1206,7 +1169,7 @@ minstrel_ht_tx_status(void *priv, struct
|
@@ -1183,7 +1146,7 @@ minstrel_ht_tx_status(void *priv, struct
|
||||||
struct ieee80211_tx_info *info = st->info;
|
struct ieee80211_tx_info *info = st->info;
|
||||||
struct minstrel_ht_sta *mi = priv_sta;
|
struct minstrel_ht_sta *mi = priv_sta;
|
||||||
struct ieee80211_tx_rate *ar = info->status.rates;
|
struct ieee80211_tx_rate *ar = info->status.rates;
|
||||||
@ -126,7 +126,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
struct minstrel_priv *mp = priv;
|
struct minstrel_priv *mp = priv;
|
||||||
u32 update_interval = mp->update_interval;
|
u32 update_interval = mp->update_interval;
|
||||||
bool last, update = false;
|
bool last, update = false;
|
||||||
@@ -1252,18 +1215,13 @@ minstrel_ht_tx_status(void *priv, struct
|
@@ -1233,18 +1196,13 @@ minstrel_ht_tx_status(void *priv, struct
|
||||||
/*
|
/*
|
||||||
* check for sudden death of spatial multiplexing,
|
* check for sudden death of spatial multiplexing,
|
||||||
* downgrade to a lower number of streams if necessary.
|
* downgrade to a lower number of streams if necessary.
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
From: Felix Fietkau <nbd@nbd.name>
|
|
||||||
Date: Thu, 17 Jun 2021 17:56:54 +0200
|
|
||||||
Subject: [PATCH] mac80211: move A-MPDU session check from minstrel_ht to
|
|
||||||
mac80211
|
|
||||||
|
|
||||||
This avoids calling back into tx handlers from within the rate control module.
|
|
||||||
Preparation for deferring rate control until tx dequeue
|
|
||||||
|
|
||||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/include/net/mac80211.h
|
|
||||||
+++ b/include/net/mac80211.h
|
|
||||||
@@ -6192,6 +6192,11 @@ enum rate_control_capabilities {
|
|
||||||
* otherwise the NSS difference doesn't bother us.
|
|
||||||
*/
|
|
||||||
RATE_CTRL_CAPA_VHT_EXT_NSS_BW = BIT(0),
|
|
||||||
+ /**
|
|
||||||
+ * @RATE_CTRL_CAPA_AMPDU_TRIGGER:
|
|
||||||
+ * mac80211 should start A-MPDU sessions on tx
|
|
||||||
+ */
|
|
||||||
+ RATE_CTRL_CAPA_AMPDU_TRIGGER = BIT(1),
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rate_control_ops {
|
|
||||||
--- a/net/mac80211/rc80211_minstrel_ht.c
|
|
||||||
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
|
||||||
@@ -1140,29 +1140,6 @@ minstrel_downgrade_prob_rate(struct mins
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
-minstrel_aggr_check(struct ieee80211_sta *pubsta, struct sk_buff *skb)
|
|
||||||
-{
|
|
||||||
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
|
||||||
- struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
|
||||||
- u16 tid;
|
|
||||||
-
|
|
||||||
- if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- if (unlikely(!ieee80211_is_data_qos(hdr->frame_control)))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE)))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- tid = ieee80211_get_tid(hdr);
|
|
||||||
- if (likely(sta->ampdu_mlme.tid_tx[tid]))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- ieee80211_start_tx_ba_session(pubsta, tid, 0);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
minstrel_ht_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
|
||||||
void *priv_sta, struct ieee80211_tx_status *st)
|
|
||||||
{
|
|
||||||
@@ -1457,10 +1434,6 @@ minstrel_ht_get_rate(void *priv, struct
|
|
||||||
struct minstrel_priv *mp = priv;
|
|
||||||
u16 sample_idx;
|
|
||||||
|
|
||||||
- if (!(info->flags & IEEE80211_TX_CTL_AMPDU) &&
|
|
||||||
- !minstrel_ht_is_legacy_group(MI_RATE_GROUP(mi->max_prob_rate)))
|
|
||||||
- minstrel_aggr_check(sta, txrc->skb);
|
|
||||||
-
|
|
||||||
info->flags |= mi->tx_flags;
|
|
||||||
|
|
||||||
#ifdef CPTCFG_MAC80211_DEBUGFS
|
|
||||||
@@ -1866,6 +1839,7 @@ static u32 minstrel_ht_get_expected_thro
|
|
||||||
|
|
||||||
static const struct rate_control_ops mac80211_minstrel_ht = {
|
|
||||||
.name = "minstrel_ht",
|
|
||||||
+ .capa = RATE_CTRL_CAPA_AMPDU_TRIGGER,
|
|
||||||
.tx_status_ext = minstrel_ht_tx_status,
|
|
||||||
.get_rate = minstrel_ht_get_rate,
|
|
||||||
.rate_init = minstrel_ht_rate_init,
|
|
||||||
--- a/net/mac80211/tx.c
|
|
||||||
+++ b/net/mac80211/tx.c
|
|
||||||
@@ -3951,6 +3951,29 @@ void ieee80211_txq_schedule_start(struct
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ieee80211_txq_schedule_start);
|
|
||||||
|
|
||||||
+static void
|
|
||||||
+ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
|
|
||||||
+ struct sta_info *sta,
|
|
||||||
+ struct sk_buff *skb)
|
|
||||||
+{
|
|
||||||
+ struct rate_control_ref *ref = sdata->local->rate_ctrl;
|
|
||||||
+ u16 tid;
|
|
||||||
+
|
|
||||||
+ if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ if (!sta || !sta->sta.ht_cap.ht_supported ||
|
|
||||||
+ !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO ||
|
|
||||||
+ skb->protocol == sdata->control_port_protocol)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
|
||||||
+ if (likely(sta->ampdu_mlme.tid_tx[tid]))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ ieee80211_start_tx_ba_session(&sta->sta, tid, 0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void __ieee80211_subif_start_xmit(struct sk_buff *skb,
|
|
||||||
struct net_device *dev,
|
|
||||||
u32 info_flags,
|
|
||||||
@@ -3981,6 +4004,8 @@ void __ieee80211_subif_start_xmit(struct
|
|
||||||
skb_get_hash(skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ ieee80211_aggr_check(sdata, sta, skb);
|
|
||||||
+
|
|
||||||
if (sta) {
|
|
||||||
struct ieee80211_fast_tx *fast_tx;
|
|
||||||
|
|
||||||
@@ -4244,6 +4269,8 @@ static void ieee80211_8023_xmit(struct i
|
|
||||||
|
|
||||||
memset(info, 0, sizeof(*info));
|
|
||||||
|
|
||||||
+ ieee80211_aggr_check(sdata, sta, skb);
|
|
||||||
+
|
|
||||||
tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
|
|
||||||
tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
|
|
||||||
if (tid_tx) {
|
|
@ -1,114 +0,0 @@
|
|||||||
From: Ryder Lee <ryder.lee@mediatek.com>
|
|
||||||
Date: Fri, 28 May 2021 14:05:41 +0800
|
|
||||||
Subject: [PATCH] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue
|
|
||||||
|
|
||||||
Make ieee80211_tx_h_rate_ctrl() get called on dequeue to improve
|
|
||||||
performance since it reduces the turnaround time for rate control.
|
|
||||||
|
|
||||||
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/net/mac80211/tx.c
|
|
||||||
+++ b/net/mac80211/tx.c
|
|
||||||
@@ -1768,8 +1768,6 @@ static int invoke_tx_handlers_early(stru
|
|
||||||
CALL_TXH(ieee80211_tx_h_ps_buf);
|
|
||||||
CALL_TXH(ieee80211_tx_h_check_control_port_protocol);
|
|
||||||
CALL_TXH(ieee80211_tx_h_select_key);
|
|
||||||
- if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL))
|
|
||||||
- CALL_TXH(ieee80211_tx_h_rate_ctrl);
|
|
||||||
|
|
||||||
txh_done:
|
|
||||||
if (unlikely(res == TX_DROP)) {
|
|
||||||
@@ -1802,6 +1800,9 @@ static int invoke_tx_handlers_late(struc
|
|
||||||
goto txh_done;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL))
|
|
||||||
+ CALL_TXH(ieee80211_tx_h_rate_ctrl);
|
|
||||||
+
|
|
||||||
CALL_TXH(ieee80211_tx_h_michael_mic_add);
|
|
||||||
CALL_TXH(ieee80211_tx_h_sequence);
|
|
||||||
CALL_TXH(ieee80211_tx_h_fragment);
|
|
||||||
@@ -3391,15 +3392,21 @@ out:
|
|
||||||
* Can be called while the sta lock is held. Anything that can cause packets to
|
|
||||||
* be generated will cause deadlock!
|
|
||||||
*/
|
|
||||||
-static void ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,
|
|
||||||
- struct sta_info *sta, u8 pn_offs,
|
|
||||||
- struct ieee80211_key *key,
|
|
||||||
- struct sk_buff *skb)
|
|
||||||
+static ieee80211_tx_result
|
|
||||||
+ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,
|
|
||||||
+ struct sta_info *sta, u8 pn_offs,
|
|
||||||
+ struct ieee80211_key *key,
|
|
||||||
+ struct ieee80211_tx_data *tx)
|
|
||||||
{
|
|
||||||
+ struct sk_buff *skb = tx->skb;
|
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
|
||||||
u8 tid = IEEE80211_NUM_TIDS;
|
|
||||||
|
|
||||||
+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL) &&
|
|
||||||
+ ieee80211_tx_h_rate_ctrl(tx) != TX_CONTINUE)
|
|
||||||
+ return TX_DROP;
|
|
||||||
+
|
|
||||||
if (key)
|
|
||||||
info->control.hw_key = &key->conf;
|
|
||||||
|
|
||||||
@@ -3448,6 +3455,8 @@ static void ieee80211_xmit_fast_finish(s
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ return TX_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
|
|
||||||
@@ -3551,24 +3560,17 @@ static bool ieee80211_xmit_fast(struct i
|
|
||||||
tx.sta = sta;
|
|
||||||
tx.key = fast_tx->key;
|
|
||||||
|
|
||||||
- if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
|
|
||||||
- tx.skb = skb;
|
|
||||||
- r = ieee80211_tx_h_rate_ctrl(&tx);
|
|
||||||
- skb = tx.skb;
|
|
||||||
- tx.skb = NULL;
|
|
||||||
-
|
|
||||||
- if (r != TX_CONTINUE) {
|
|
||||||
- if (r != TX_QUEUED)
|
|
||||||
- kfree_skb(skb);
|
|
||||||
- return true;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
if (ieee80211_queue_skb(local, sdata, sta, skb))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
- ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs,
|
|
||||||
- fast_tx->key, skb);
|
|
||||||
+ tx.skb = skb;
|
|
||||||
+ r = ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs,
|
|
||||||
+ fast_tx->key, &tx);
|
|
||||||
+ tx.skb = NULL;
|
|
||||||
+ if (r == TX_DROP) {
|
|
||||||
+ kfree_skb(skb);
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
|
||||||
sdata = container_of(sdata->bss,
|
|
||||||
@@ -3685,8 +3687,12 @@ begin:
|
|
||||||
(tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
|
|
||||||
pn_offs = ieee80211_hdrlen(hdr->frame_control);
|
|
||||||
|
|
||||||
- ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs,
|
|
||||||
- tx.key, skb);
|
|
||||||
+ r = ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs,
|
|
||||||
+ tx.key, &tx);
|
|
||||||
+ if (r != TX_CONTINUE) {
|
|
||||||
+ ieee80211_free_txskb(&local->hw, skb);
|
|
||||||
+ goto begin;
|
|
||||||
+ }
|
|
||||||
} else {
|
|
||||||
if (invoke_tx_handlers_late(&tx))
|
|
||||||
goto begin;
|
|
@ -1,126 +0,0 @@
|
|||||||
From: Ryder Lee <ryder.lee@mediatek.com>
|
|
||||||
Date: Fri, 28 May 2021 14:05:43 +0800
|
|
||||||
Subject: [PATCH] mac80211: add rate control support for encap offload
|
|
||||||
|
|
||||||
The software rate control cannot deal with encap offload, so fix it.
|
|
||||||
|
|
||||||
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/net/mac80211/rate.c
|
|
||||||
+++ b/net/mac80211/rate.c
|
|
||||||
@@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie
|
|
||||||
static bool rc_no_data_or_no_ack_use_min(struct ieee80211_tx_rate_control *txrc)
|
|
||||||
{
|
|
||||||
struct sk_buff *skb = txrc->skb;
|
|
||||||
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
- __le16 fc;
|
|
||||||
-
|
|
||||||
- fc = hdr->frame_control;
|
|
||||||
|
|
||||||
return (info->flags & (IEEE80211_TX_CTL_NO_ACK |
|
|
||||||
IEEE80211_TX_CTL_USE_MINRATE)) ||
|
|
||||||
- !ieee80211_is_data(fc);
|
|
||||||
+ !ieee80211_is_tx_data(skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate,
|
|
||||||
@@ -870,7 +866,6 @@ void ieee80211_get_tx_rates(struct ieee8
|
|
||||||
int max_rates)
|
|
||||||
{
|
|
||||||
struct ieee80211_sub_if_data *sdata;
|
|
||||||
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
struct ieee80211_supported_band *sband;
|
|
||||||
|
|
||||||
@@ -882,7 +877,7 @@ void ieee80211_get_tx_rates(struct ieee8
|
|
||||||
sdata = vif_to_sdata(vif);
|
|
||||||
sband = sdata->local->hw.wiphy->bands[info->band];
|
|
||||||
|
|
||||||
- if (ieee80211_is_data(hdr->frame_control))
|
|
||||||
+ if (ieee80211_is_tx_data(skb))
|
|
||||||
rate_control_apply_mask(sdata, sta, sband, dest, max_rates);
|
|
||||||
|
|
||||||
if (dest[0].idx < 0)
|
|
||||||
--- a/net/mac80211/tx.c
|
|
||||||
+++ b/net/mac80211/tx.c
|
|
||||||
@@ -666,6 +666,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
|
|
||||||
u32 len;
|
|
||||||
struct ieee80211_tx_rate_control txrc;
|
|
||||||
struct ieee80211_sta_rates *ratetbl = NULL;
|
|
||||||
+ bool encap = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
|
|
||||||
bool assoc = false;
|
|
||||||
|
|
||||||
memset(&txrc, 0, sizeof(txrc));
|
|
||||||
@@ -707,7 +708,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
|
|
||||||
* just wants a probe response.
|
|
||||||
*/
|
|
||||||
if (tx->sdata->vif.bss_conf.use_short_preamble &&
|
|
||||||
- (ieee80211_is_data(hdr->frame_control) ||
|
|
||||||
+ (ieee80211_is_tx_data(tx->skb) ||
|
|
||||||
(tx->sta && test_sta_flag(tx->sta, WLAN_STA_SHORT_PREAMBLE))))
|
|
||||||
txrc.short_preamble = true;
|
|
||||||
|
|
||||||
@@ -729,7 +730,8 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
|
|
||||||
"%s: Dropped data frame as no usable bitrate found while "
|
|
||||||
"scanning and associated. Target station: "
|
|
||||||
"%pM on %d GHz band\n",
|
|
||||||
- tx->sdata->name, hdr->addr1,
|
|
||||||
+ tx->sdata->name,
|
|
||||||
+ encap ? ((struct ethhdr *)hdr)->h_dest : hdr->addr1,
|
|
||||||
info->band ? 5 : 2))
|
|
||||||
return TX_DROP;
|
|
||||||
|
|
||||||
@@ -763,7 +765,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
|
|
||||||
|
|
||||||
if (txrc.reported_rate.idx < 0) {
|
|
||||||
txrc.reported_rate = tx->rate;
|
|
||||||
- if (tx->sta && ieee80211_is_data(hdr->frame_control))
|
|
||||||
+ if (tx->sta && ieee80211_is_tx_data(tx->skb))
|
|
||||||
tx->sta->tx_stats.last_rate = txrc.reported_rate;
|
|
||||||
} else if (tx->sta)
|
|
||||||
tx->sta->tx_stats.last_rate = txrc.reported_rate;
|
|
||||||
@@ -3675,8 +3677,16 @@ begin:
|
|
||||||
else
|
|
||||||
info->flags &= ~IEEE80211_TX_CTL_AMPDU;
|
|
||||||
|
|
||||||
- if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
|
|
||||||
+ if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
|
|
||||||
+ if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
|
|
||||||
+ r = ieee80211_tx_h_rate_ctrl(&tx);
|
|
||||||
+ if (r != TX_CONTINUE) {
|
|
||||||
+ ieee80211_free_txskb(&local->hw, skb);
|
|
||||||
+ goto begin;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
goto encap_out;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
|
|
||||||
struct sta_info *sta = container_of(txq->sta, struct sta_info,
|
|
||||||
--- a/include/net/mac80211.h
|
|
||||||
+++ b/include/net/mac80211.h
|
|
||||||
@@ -6765,4 +6765,22 @@ struct sk_buff *ieee80211_get_fils_disco
|
|
||||||
struct sk_buff *
|
|
||||||
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
|
|
||||||
struct ieee80211_vif *vif);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * ieee80211_is_tx_data - check if frame is a data frame
|
|
||||||
+ *
|
|
||||||
+ * The function is used to check if a frame is a data frame. Frames with
|
|
||||||
+ * hardware encapsulation enabled are data frames.
|
|
||||||
+ *
|
|
||||||
+ * @skb: the frame to be transmitted.
|
|
||||||
+ */
|
|
||||||
+static inline bool ieee80211_is_tx_data(struct sk_buff *skb)
|
|
||||||
+{
|
|
||||||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
+ struct ieee80211_hdr *hdr = (void *) skb->data;
|
|
||||||
+
|
|
||||||
+ return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
|
|
||||||
+ ieee80211_is_data(hdr->frame_control);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#endif /* MAC80211_H */
|
|
@ -1,112 +0,0 @@
|
|||||||
From: Felix Fietkau <nbd@nbd.name>
|
|
||||||
Date: Tue, 29 Jun 2021 13:25:09 +0200
|
|
||||||
Subject: [PATCH] mac80211: fix starting aggregation sessions on mesh
|
|
||||||
interfaces
|
|
||||||
|
|
||||||
The logic for starting aggregation sessions was recently moved from minstrel_ht
|
|
||||||
to mac80211, into the subif tx handler just after the sta lookup.
|
|
||||||
Unfortunately this didn't work for mesh interfaces, since the sta lookup is
|
|
||||||
deferred until a much later point in time on those.
|
|
||||||
Fix this by also calling the aggregation check right after the deferred sta
|
|
||||||
lookup.
|
|
||||||
|
|
||||||
Fixes: 08a46c642001 ("mac80211: move A-MPDU session check from minstrel_ht to mac80211")
|
|
||||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/net/mac80211/tx.c
|
|
||||||
+++ b/net/mac80211/tx.c
|
|
||||||
@@ -1146,6 +1146,29 @@ static bool ieee80211_tx_prep_agg(struct
|
|
||||||
return queued;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void
|
|
||||||
+ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
|
|
||||||
+ struct sta_info *sta,
|
|
||||||
+ struct sk_buff *skb)
|
|
||||||
+{
|
|
||||||
+ struct rate_control_ref *ref = sdata->local->rate_ctrl;
|
|
||||||
+ u16 tid;
|
|
||||||
+
|
|
||||||
+ if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ if (!sta || !sta->sta.ht_cap.ht_supported ||
|
|
||||||
+ !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO ||
|
|
||||||
+ skb->protocol == sdata->control_port_protocol)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
|
||||||
+ if (likely(sta->ampdu_mlme.tid_tx[tid]))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ ieee80211_start_tx_ba_session(&sta->sta, tid, 0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* initialises @tx
|
|
||||||
* pass %NULL for the station if unknown, a valid pointer if known
|
|
||||||
@@ -1159,6 +1182,7 @@ ieee80211_tx_prepare(struct ieee80211_su
|
|
||||||
struct ieee80211_local *local = sdata->local;
|
|
||||||
struct ieee80211_hdr *hdr;
|
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
+ bool aggr_check = false;
|
|
||||||
int tid;
|
|
||||||
|
|
||||||
memset(tx, 0, sizeof(*tx));
|
|
||||||
@@ -1187,8 +1211,10 @@ ieee80211_tx_prepare(struct ieee80211_su
|
|
||||||
} else if (tx->sdata->control_port_protocol == tx->skb->protocol) {
|
|
||||||
tx->sta = sta_info_get_bss(sdata, hdr->addr1);
|
|
||||||
}
|
|
||||||
- if (!tx->sta && !is_multicast_ether_addr(hdr->addr1))
|
|
||||||
+ if (!tx->sta && !is_multicast_ether_addr(hdr->addr1)) {
|
|
||||||
tx->sta = sta_info_get(sdata, hdr->addr1);
|
|
||||||
+ aggr_check = true;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx->sta && ieee80211_is_data_qos(hdr->frame_control) &&
|
|
||||||
@@ -1198,8 +1224,12 @@ ieee80211_tx_prepare(struct ieee80211_su
|
|
||||||
struct tid_ampdu_tx *tid_tx;
|
|
||||||
|
|
||||||
tid = ieee80211_get_tid(hdr);
|
|
||||||
-
|
|
||||||
tid_tx = rcu_dereference(tx->sta->ampdu_mlme.tid_tx[tid]);
|
|
||||||
+ if (!tid_tx && aggr_check) {
|
|
||||||
+ ieee80211_aggr_check(sdata, tx->sta, skb);
|
|
||||||
+ tid_tx = rcu_dereference(tx->sta->ampdu_mlme.tid_tx[tid]);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (tid_tx) {
|
|
||||||
bool queued;
|
|
||||||
|
|
||||||
@@ -3967,29 +3997,6 @@ void ieee80211_txq_schedule_start(struct
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ieee80211_txq_schedule_start);
|
|
||||||
|
|
||||||
-static void
|
|
||||||
-ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
|
|
||||||
- struct sta_info *sta,
|
|
||||||
- struct sk_buff *skb)
|
|
||||||
-{
|
|
||||||
- struct rate_control_ref *ref = sdata->local->rate_ctrl;
|
|
||||||
- u16 tid;
|
|
||||||
-
|
|
||||||
- if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- if (!sta || !sta->sta.ht_cap.ht_supported ||
|
|
||||||
- !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO ||
|
|
||||||
- skb->protocol == sdata->control_port_protocol)
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
|
||||||
- if (likely(sta->ampdu_mlme.tid_tx[tid]))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- ieee80211_start_tx_ba_session(&sta->sta, tid, 0);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
void __ieee80211_subif_start_xmit(struct sk_buff *skb,
|
|
||||||
struct net_device *dev,
|
|
||||||
u32 info_flags,
|
|
@ -1,39 +0,0 @@
|
|||||||
From: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
Date: Fri, 18 Jun 2021 13:41:44 +0300
|
|
||||||
Subject: [PATCH] mac80211: rearrange struct txq_info for fewer holes
|
|
||||||
|
|
||||||
We can slightly decrease the size of struct txq_info by
|
|
||||||
rearranging some fields for fewer holes, so do that.
|
|
||||||
|
|
||||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
|
||||||
Link: https://lore.kernel.org/r/iwlwifi.20210618133832.1bf019a1fe2e.Ib54622b8d6dc1a9a7dc484e573c073119450538b@changeid
|
|
||||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/net/mac80211/ieee80211_i.h
|
|
||||||
+++ b/net/mac80211/ieee80211_i.h
|
|
||||||
@@ -5,7 +5,7 @@
|
|
||||||
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
|
||||||
* Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
|
|
||||||
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
|
||||||
- * Copyright (C) 2018-2020 Intel Corporation
|
|
||||||
+ * Copyright (C) 2018-2021 Intel Corporation
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef IEEE80211_I_H
|
|
||||||
@@ -843,9 +843,12 @@ struct txq_info {
|
|
||||||
struct fq_tin tin;
|
|
||||||
struct codel_vars def_cvars;
|
|
||||||
struct codel_stats cstats;
|
|
||||||
- struct sk_buff_head frags;
|
|
||||||
- struct list_head schedule_order;
|
|
||||||
+
|
|
||||||
u16 schedule_round;
|
|
||||||
+ struct list_head schedule_order;
|
|
||||||
+
|
|
||||||
+ struct sk_buff_head frags;
|
|
||||||
+
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* keep last! */
|
|
File diff suppressed because it is too large
Load Diff
@ -1,26 +0,0 @@
|
|||||||
From: Ryder Lee <ryder.lee@mediatek.com>
|
|
||||||
Date: Fri, 18 Jun 2021 04:38:59 +0800
|
|
||||||
Subject: [PATCH] mac80211: check per vif offload_flags in Tx path
|
|
||||||
|
|
||||||
offload_flags has been introduced to indicate encap status of each interface.
|
|
||||||
An interface can encap offload at runtime, or if it has some extra limitations
|
|
||||||
it can simply override the flags, so it's more flexible to check offload_flags
|
|
||||||
in Tx path.
|
|
||||||
|
|
||||||
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|
||||||
Link: https://lore.kernel.org/r/177785418cf407808bf3a44760302d0647076990.1623961575.git.ryder.lee@mediatek.com
|
|
||||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/net/mac80211/tx.c
|
|
||||||
+++ b/net/mac80211/tx.c
|
|
||||||
@@ -3318,6 +3318,9 @@ static bool ieee80211_amsdu_aggregate(st
|
|
||||||
if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
+ if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
if (skb_is_gso(skb))
|
|
||||||
return false;
|
|
||||||
|
|
@ -23,8 +23,8 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
|
|
||||||
--- a/include/net/cfg80211.h
|
--- a/include/net/cfg80211.h
|
||||||
+++ b/include/net/cfg80211.h
|
+++ b/include/net/cfg80211.h
|
||||||
@@ -1253,6 +1253,27 @@ struct cfg80211_csa_settings {
|
@@ -1258,6 +1258,27 @@ struct cfg80211_csa_settings {
|
||||||
#define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
+ * struct cfg80211_color_change_settings - color change settings
|
+ * struct cfg80211_color_change_settings - color change settings
|
||||||
@ -51,7 +51,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
* struct iface_combination_params - input parameters for interface combinations
|
* struct iface_combination_params - input parameters for interface combinations
|
||||||
*
|
*
|
||||||
* Used to pass interface combination parameters
|
* Used to pass interface combination parameters
|
||||||
@@ -3991,6 +4012,8 @@ struct mgmt_frame_regs {
|
@@ -4000,6 +4021,8 @@ struct mgmt_frame_regs {
|
||||||
* given TIDs. This callback may sleep.
|
* given TIDs. This callback may sleep.
|
||||||
*
|
*
|
||||||
* @set_sar_specs: Update the SAR (TX power) settings.
|
* @set_sar_specs: Update the SAR (TX power) settings.
|
||||||
@ -60,7 +60,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
*/
|
*/
|
||||||
struct cfg80211_ops {
|
struct cfg80211_ops {
|
||||||
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
|
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
|
||||||
@@ -4318,6 +4341,9 @@ struct cfg80211_ops {
|
@@ -4327,6 +4350,9 @@ struct cfg80211_ops {
|
||||||
const u8 *peer, u8 tids);
|
const u8 *peer, u8 tids);
|
||||||
int (*set_sar_specs)(struct wiphy *wiphy,
|
int (*set_sar_specs)(struct wiphy *wiphy,
|
||||||
struct cfg80211_sar_specs *sar);
|
struct cfg80211_sar_specs *sar);
|
||||||
@ -70,7 +70,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -8209,4 +8235,70 @@ void cfg80211_update_owe_info_event(stru
|
@@ -8226,4 +8252,70 @@ void cfg80211_update_owe_info_event(stru
|
||||||
*/
|
*/
|
||||||
void cfg80211_bss_flush(struct wiphy *wiphy);
|
void cfg80211_bss_flush(struct wiphy *wiphy);
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
/* add attributes here, update the policy in nl80211.c */
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
@@ -5950,6 +5989,9 @@ enum nl80211_feature_flags {
|
@@ -5953,6 +5992,9 @@ enum nl80211_feature_flags {
|
||||||
* frame protection for all management frames exchanged during the
|
* frame protection for all management frames exchanged during the
|
||||||
* negotiation and range measurement procedure.
|
* negotiation and range measurement procedure.
|
||||||
*
|
*
|
||||||
@ -220,7 +220,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||||
*/
|
*/
|
||||||
@@ -6014,6 +6056,7 @@ enum nl80211_ext_feature_index {
|
@@ -6017,6 +6059,7 @@ enum nl80211_ext_feature_index {
|
||||||
NL80211_EXT_FEATURE_SECURE_LTF,
|
NL80211_EXT_FEATURE_SECURE_LTF,
|
||||||
NL80211_EXT_FEATURE_SECURE_RTT,
|
NL80211_EXT_FEATURE_SECURE_RTT,
|
||||||
NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
||||||
@ -241,7 +241,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* policy for the key attributes */
|
/* policy for the key attributes */
|
||||||
@@ -14815,6 +14819,106 @@ bad_tid_conf:
|
@@ -14823,6 +14827,106 @@ bad_tid_conf:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,7 +348,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
#define NL80211_FLAG_NEED_WIPHY 0x01
|
#define NL80211_FLAG_NEED_WIPHY 0x01
|
||||||
#define NL80211_FLAG_NEED_NETDEV 0x02
|
#define NL80211_FLAG_NEED_NETDEV 0x02
|
||||||
#define NL80211_FLAG_NEED_RTNL 0x04
|
#define NL80211_FLAG_NEED_RTNL 0x04
|
||||||
@@ -15815,6 +15919,14 @@ static const struct genl_small_ops nl802
|
@@ -15823,6 +15927,14 @@ static const struct genl_small_ops nl802
|
||||||
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
||||||
NL80211_FLAG_NEED_RTNL,
|
NL80211_FLAG_NEED_RTNL,
|
||||||
},
|
},
|
||||||
@ -363,7 +363,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct genl_family nl80211_fam __genl_ro_after_init = {
|
static struct genl_family nl80211_fam __genl_ro_after_init = {
|
||||||
@@ -17446,6 +17558,51 @@ void cfg80211_ch_switch_started_notify(s
|
@@ -17454,6 +17566,51 @@ void cfg80211_ch_switch_started_notify(s
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
|
EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
|
||||||
|
|
||||||
@ -417,7 +417,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
const struct cfg80211_chan_def *chandef,
|
const struct cfg80211_chan_def *chandef,
|
||||||
--- a/net/wireless/rdev-ops.h
|
--- a/net/wireless/rdev-ops.h
|
||||||
+++ b/net/wireless/rdev-ops.h
|
+++ b/net/wireless/rdev-ops.h
|
||||||
@@ -1358,4 +1358,17 @@ static inline int rdev_set_sar_specs(str
|
@@ -1368,4 +1368,17 @@ static inline int rdev_set_sar_specs(str
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,7 +437,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
#endif /* __CFG80211_RDEV_OPS */
|
#endif /* __CFG80211_RDEV_OPS */
|
||||||
--- a/net/wireless/trace.h
|
--- a/net/wireless/trace.h
|
||||||
+++ b/net/wireless/trace.h
|
+++ b/net/wireless/trace.h
|
||||||
@@ -3565,6 +3565,52 @@ TRACE_EVENT(rdev_set_sar_specs,
|
@@ -3597,6 +3597,52 @@ TRACE_EVENT(rdev_set_sar_specs,
|
||||||
WIPHY_PR_ARG, __entry->type, __entry->num)
|
WIPHY_PR_ARG, __entry->type, __entry->num)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -19,7 +19,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
|
||||||
@@ -1713,6 +1713,10 @@ enum ieee80211_offload_flags {
|
@@ -1715,6 +1715,10 @@ enum ieee80211_offload_flags {
|
||||||
* protected by fq->lock.
|
* protected by fq->lock.
|
||||||
* @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see
|
* @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see
|
||||||
* &enum ieee80211_offload_flags.
|
* &enum ieee80211_offload_flags.
|
||||||
@ -30,7 +30,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
*/
|
*/
|
||||||
struct ieee80211_vif {
|
struct ieee80211_vif {
|
||||||
enum nl80211_iftype type;
|
enum nl80211_iftype type;
|
||||||
@@ -1741,6 +1745,9 @@ struct ieee80211_vif {
|
@@ -1743,6 +1747,9 @@ struct ieee80211_vif {
|
||||||
|
|
||||||
bool txqs_stopped[IEEE80211_NUM_ACS];
|
bool txqs_stopped[IEEE80211_NUM_ACS];
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
/* must be last */
|
/* must be last */
|
||||||
u8 drv_priv[] __aligned(sizeof(void *));
|
u8 drv_priv[] __aligned(sizeof(void *));
|
||||||
};
|
};
|
||||||
@@ -4992,6 +4999,16 @@ void ieee80211_csa_finish(struct ieee802
|
@@ -5016,6 +5023,16 @@ void ieee80211_csa_finish(struct ieee802
|
||||||
bool ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif);
|
bool ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,7 +57,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
* ieee80211_proberesp_get - retrieve a Probe Response template
|
* ieee80211_proberesp_get - retrieve a Probe Response template
|
||||||
* @hw: pointer obtained from ieee80211_alloc_hw().
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
||||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||||
@@ -6756,6 +6773,18 @@ ieee80211_get_unsol_bcast_probe_resp_tmp
|
@@ -6780,6 +6797,18 @@ ieee80211_get_unsol_bcast_probe_resp_tmp
|
||||||
struct ieee80211_vif *vif);
|
struct ieee80211_vif *vif);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -161,7 +161,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
ieee80211_bss_info_change_notify(sdata, err);
|
ieee80211_bss_info_change_notify(sdata, err);
|
||||||
@@ -3163,7 +3171,7 @@ static int ieee80211_set_after_csa_beaco
|
@@ -3155,7 +3163,7 @@ static int ieee80211_set_after_csa_beaco
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
|
err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
|
||||||
@ -170,7 +170,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
kfree(sdata->u.ap.next_beacon);
|
kfree(sdata->u.ap.next_beacon);
|
||||||
sdata->u.ap.next_beacon = NULL;
|
sdata->u.ap.next_beacon = NULL;
|
||||||
|
|
||||||
@@ -3329,7 +3337,7 @@ static int ieee80211_set_csa_beacon(stru
|
@@ -3321,7 +3329,7 @@ static int ieee80211_set_csa_beacon(stru
|
||||||
csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
|
csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
|
||||||
csa.count = params->count;
|
csa.count = params->count;
|
||||||
|
|
||||||
@ -179,7 +179,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
kfree(sdata->u.ap.next_beacon);
|
kfree(sdata->u.ap.next_beacon);
|
||||||
return err;
|
return err;
|
||||||
@@ -3418,6 +3426,15 @@ static int ieee80211_set_csa_beacon(stru
|
@@ -3410,6 +3418,15 @@ static int ieee80211_set_csa_beacon(stru
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
static int
|
static int
|
||||||
__ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
__ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||||
struct cfg80211_csa_settings *params)
|
struct cfg80211_csa_settings *params)
|
||||||
@@ -3486,6 +3503,10 @@ __ieee80211_channel_switch(struct wiphy
|
@@ -3478,6 +3495,10 @@ __ieee80211_channel_switch(struct wiphy
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
err = ieee80211_set_csa_beacon(sdata, params, &changed);
|
err = ieee80211_set_csa_beacon(sdata, params, &changed);
|
||||||
if (err) {
|
if (err) {
|
||||||
ieee80211_vif_unreserve_chanctx(sdata);
|
ieee80211_vif_unreserve_chanctx(sdata);
|
||||||
@@ -4137,6 +4158,196 @@ static int ieee80211_set_sar_specs(struc
|
@@ -4129,6 +4150,196 @@ static int ieee80211_set_sar_specs(struc
|
||||||
return local->ops->set_sar_specs(&local->hw, sar);
|
return local->ops->set_sar_specs(&local->hw, sar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +403,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
const struct cfg80211_ops mac80211_config_ops = {
|
const struct cfg80211_ops mac80211_config_ops = {
|
||||||
.add_virtual_intf = ieee80211_add_iface,
|
.add_virtual_intf = ieee80211_add_iface,
|
||||||
.del_virtual_intf = ieee80211_del_iface,
|
.del_virtual_intf = ieee80211_del_iface,
|
||||||
@@ -4240,4 +4451,5 @@ const struct cfg80211_ops mac80211_confi
|
@@ -4232,4 +4443,5 @@ const struct cfg80211_ops mac80211_confi
|
||||||
.set_tid_config = ieee80211_set_tid_config,
|
.set_tid_config = ieee80211_set_tid_config,
|
||||||
.reset_tid_config = ieee80211_reset_tid_config,
|
.reset_tid_config = ieee80211_reset_tid_config,
|
||||||
.set_sar_specs = ieee80211_set_sar_specs,
|
.set_sar_specs = ieee80211_set_sar_specs,
|
||||||
@ -433,7 +433,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
|
struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
|
||||||
struct list_head reserved_chanctx_list; /* protected by chanctx_mtx */
|
struct list_head reserved_chanctx_list; /* protected by chanctx_mtx */
|
||||||
|
|
||||||
@@ -1895,6 +1903,9 @@ void ieee80211_csa_finalize_work(struct
|
@@ -1891,6 +1899,9 @@ void ieee80211_csa_finalize_work(struct
|
||||||
int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||||
struct cfg80211_csa_settings *params);
|
struct cfg80211_csa_settings *params);
|
||||||
|
|
||||||
@ -453,7 +453,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
|
|
||||||
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
|
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
|
||||||
|
|
||||||
@@ -1595,6 +1596,7 @@ static void ieee80211_setup_sdata(struct
|
@@ -1608,6 +1609,7 @@ static void ieee80211_setup_sdata(struct
|
||||||
INIT_WORK(&sdata->work, ieee80211_iface_work);
|
INIT_WORK(&sdata->work, ieee80211_iface_work);
|
||||||
INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work);
|
INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work);
|
||||||
INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
|
INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
|
||||||
@ -463,7 +463,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
|
||||||
@@ -4784,11 +4784,11 @@ static int ieee80211_beacon_add_tim(stru
|
@@ -4796,11 +4796,11 @@ static int ieee80211_beacon_add_tim(stru
|
||||||
static void ieee80211_set_beacon_cntdwn(struct ieee80211_sub_if_data *sdata,
|
static void ieee80211_set_beacon_cntdwn(struct ieee80211_sub_if_data *sdata,
|
||||||
struct beacon_data *beacon)
|
struct beacon_data *beacon)
|
||||||
{
|
{
|
||||||
@ -477,7 +477,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
|
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
@@ -4808,21 +4808,27 @@ static void ieee80211_set_beacon_cntdwn(
|
@@ -4820,21 +4820,27 @@ static void ieee80211_set_beacon_cntdwn(
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
@ -514,7 +514,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
@@ -5032,6 +5038,7 @@ __ieee80211_beacon_get(struct ieee80211_
|
@@ -5044,6 +5050,7 @@ __ieee80211_beacon_get(struct ieee80211_
|
||||||
if (offs) {
|
if (offs) {
|
||||||
offs->tim_offset = beacon->head_len;
|
offs->tim_offset = beacon->head_len;
|
||||||
offs->tim_length = skb->len - beacon->head_len;
|
offs->tim_length = skb->len - beacon->head_len;
|
||||||
|
@ -73,7 +73,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
} u;
|
} u;
|
||||||
} __packed action;
|
} __packed action;
|
||||||
} u;
|
} u;
|
||||||
@@ -2879,6 +2925,7 @@ enum ieee80211_eid {
|
@@ -2881,6 +2927,7 @@ enum ieee80211_eid {
|
||||||
WLAN_EID_AID_RESPONSE = 211,
|
WLAN_EID_AID_RESPONSE = 211,
|
||||||
WLAN_EID_S1G_BCN_COMPAT = 213,
|
WLAN_EID_S1G_BCN_COMPAT = 213,
|
||||||
WLAN_EID_S1G_SHORT_BCN_INTERVAL = 214,
|
WLAN_EID_S1G_SHORT_BCN_INTERVAL = 214,
|
||||||
@ -81,7 +81,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
WLAN_EID_S1G_CAPABILITIES = 217,
|
WLAN_EID_S1G_CAPABILITIES = 217,
|
||||||
WLAN_EID_VENDOR_SPECIFIC = 221,
|
WLAN_EID_VENDOR_SPECIFIC = 221,
|
||||||
WLAN_EID_QOS_PARAMETER = 222,
|
WLAN_EID_QOS_PARAMETER = 222,
|
||||||
@@ -2947,6 +2994,7 @@ enum ieee80211_category {
|
@@ -2950,6 +2997,7 @@ enum ieee80211_category {
|
||||||
WLAN_CATEGORY_FST = 18,
|
WLAN_CATEGORY_FST = 18,
|
||||||
WLAN_CATEGORY_UNPROT_DMG = 20,
|
WLAN_CATEGORY_UNPROT_DMG = 20,
|
||||||
WLAN_CATEGORY_VHT = 21,
|
WLAN_CATEGORY_VHT = 21,
|
||||||
@ -89,7 +89,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
|
WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
|
||||||
WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
|
WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
|
||||||
};
|
};
|
||||||
@@ -3020,6 +3068,20 @@ enum ieee80211_key_len {
|
@@ -3023,6 +3071,20 @@ enum ieee80211_key_len {
|
||||||
WLAN_KEY_LEN_BIP_GMAC_256 = 32,
|
WLAN_KEY_LEN_BIP_GMAC_256 = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
From f5a4c24e689f54e66201f04d343bdd2e8a1d7923 Mon Sep 17 00:00:00 2001
|
||||||
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
Date: Mon, 23 Aug 2021 20:02:39 +0200
|
Date: Mon, 23 Aug 2021 20:02:39 +0200
|
||||||
Subject: [PATCH] mac80211: introduce individual TWT support in AP mode
|
Subject: [PATCH] mac80211: introduce individual TWT support in AP mode
|
||||||
@ -24,10 +25,33 @@ Link: https://lore.kernel.org/r/257512f2e22ba42b9f2624942a128dd8f141de4b.1629741
|
|||||||
fix to use ieee80211_get_he_iftype_cap() correctly]
|
fix to use ieee80211_get_he_iftype_cap() correctly]
|
||||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||||
---
|
---
|
||||||
|
include/net/mac80211.h | 12 +++
|
||||||
|
net/mac80211/driver-ops.h | 36 ++++++++
|
||||||
|
net/mac80211/ieee80211_i.h | 6 ++
|
||||||
|
net/mac80211/iface.c | 41 +++++++++
|
||||||
|
net/mac80211/rx.c | 73 +++++++++++++++
|
||||||
|
net/mac80211/s1g.c | 180 +++++++++++++++++++++++++++++++++++++
|
||||||
|
net/mac80211/status.c | 17 +++-
|
||||||
|
net/mac80211/trace.h | 67 ++++++++++++++
|
||||||
|
8 files changed, 430 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
--- a/include/net/mac80211.h
|
--- a/include/net/mac80211.h
|
||||||
+++ b/include/net/mac80211.h
|
+++ b/include/net/mac80211.h
|
||||||
@@ -4229,6 +4229,11 @@ struct ieee80211_ops {
|
@@ -3930,6 +3930,13 @@ struct ieee80211_prep_tx_info {
|
||||||
|
* @set_sar_specs: Update the SAR (TX power) settings.
|
||||||
|
* @sta_set_decap_offload: Called to notify the driver when a station is allowed
|
||||||
|
* to use rx decapsulation offload
|
||||||
|
+ * @add_twt_setup: Update hw with TWT agreement parameters received from the peer.
|
||||||
|
+ * This callback allows the hw to check if requested parameters
|
||||||
|
+ * are supported and if there is enough room for a new agreement.
|
||||||
|
+ * The hw is expected to set agreement result in the req_type field of
|
||||||
|
+ * twt structure.
|
||||||
|
+ * @twt_teardown_request: Update the hw with TWT teardown request received
|
||||||
|
+ * from the peer.
|
||||||
|
*/
|
||||||
|
struct ieee80211_ops {
|
||||||
|
void (*tx)(struct ieee80211_hw *hw,
|
||||||
|
@@ -4253,6 +4260,11 @@ struct ieee80211_ops {
|
||||||
void (*sta_set_decap_offload)(struct ieee80211_hw *hw,
|
void (*sta_set_decap_offload)(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_sta *sta, bool enabled);
|
struct ieee80211_sta *sta, bool enabled);
|
||||||
@ -41,7 +65,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
/**
|
/**
|
||||||
--- a/net/mac80211/driver-ops.h
|
--- a/net/mac80211/driver-ops.h
|
||||||
+++ b/net/mac80211/driver-ops.h
|
+++ b/net/mac80211/driver-ops.h
|
||||||
@@ -1429,4 +1429,40 @@ static inline void drv_sta_set_decap_off
|
@@ -1447,4 +1447,40 @@ static inline void drv_sta_set_decap_off
|
||||||
trace_drv_return_void(local);
|
trace_drv_return_void(local);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +116,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
|
|
||||||
u8 needed_rx_chains;
|
u8 needed_rx_chains;
|
||||||
enum ieee80211_smps_mode smps_mode;
|
enum ieee80211_smps_mode smps_mode;
|
||||||
@@ -2088,6 +2089,11 @@ ieee80211_he_op_ie_to_bss_conf(struct ie
|
@@ -2083,6 +2084,11 @@ ieee80211_he_op_ie_to_bss_conf(struct ie
|
||||||
|
|
||||||
/* S1G */
|
/* S1G */
|
||||||
void ieee80211_s1g_sta_rate_init(struct sta_info *sta);
|
void ieee80211_s1g_sta_rate_init(struct sta_info *sta);
|
||||||
@ -122,8 +146,25 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
INIT_WORK(&sdata->work, ieee80211_iface_work);
|
INIT_WORK(&sdata->work, ieee80211_iface_work);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1396,6 +1398,24 @@ static void ieee80211_if_setup_no_queue(
|
@@ -1459,6 +1461,16 @@ static void ieee80211_iface_process_skb(
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
WARN_ON(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+ } else if (ieee80211_is_action(mgmt->frame_control) &&
|
||||||
|
+ mgmt->u.action.category == WLAN_CATEGORY_S1G) {
|
||||||
|
+ switch (mgmt->u.action.u.s1g.action_code) {
|
||||||
|
+ case WLAN_S1G_TWT_TEARDOWN:
|
||||||
|
+ case WLAN_S1G_TWT_SETUP:
|
||||||
|
+ ieee80211_s1g_rx_twt_action(sdata, skb);
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
} else if (ieee80211_is_ext(mgmt->frame_control)) {
|
||||||
|
if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||||
|
ieee80211_sta_rx_queued_ext(sdata, skb);
|
||||||
|
@@ -1514,6 +1526,24 @@ static void ieee80211_iface_process_skb(
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+static void ieee80211_iface_process_status(struct ieee80211_sub_if_data *sdata,
|
+static void ieee80211_iface_process_status(struct ieee80211_sub_if_data *sdata,
|
||||||
@ -147,37 +188,24 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
static void ieee80211_iface_work(struct work_struct *work)
|
static void ieee80211_iface_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata =
|
struct ieee80211_sub_if_data *sdata =
|
||||||
@@ -1474,6 +1494,16 @@ static void ieee80211_iface_work(struct
|
@@ -1543,6 +1573,16 @@ static void ieee80211_iface_work(struct
|
||||||
WARN_ON(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
+ } else if (ieee80211_is_action(mgmt->frame_control) &&
|
|
||||||
+ mgmt->u.action.category == WLAN_CATEGORY_S1G) {
|
|
||||||
+ switch (mgmt->u.action.u.s1g.action_code) {
|
|
||||||
+ case WLAN_S1G_TWT_TEARDOWN:
|
|
||||||
+ case WLAN_S1G_TWT_SETUP:
|
|
||||||
+ ieee80211_s1g_rx_twt_action(sdata, skb);
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
} else if (ieee80211_is_ext(mgmt->frame_control)) {
|
|
||||||
if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
|
||||||
ieee80211_sta_rx_queued_ext(sdata, skb);
|
|
||||||
@@ -1530,6 +1560,12 @@ static void ieee80211_iface_work(struct
|
|
||||||
kcov_remote_stop();
|
kcov_remote_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
+ /* process status queue */
|
+ /* process status queue */
|
||||||
+ while ((skb = skb_dequeue(&sdata->status_queue))) {
|
+ while ((skb = skb_dequeue(&sdata->status_queue))) {
|
||||||
|
+ kcov_remote_start_common(skb_get_kcov_handle(skb));
|
||||||
|
+
|
||||||
+ ieee80211_iface_process_status(sdata, skb);
|
+ ieee80211_iface_process_status(sdata, skb);
|
||||||
+ kfree_skb(skb);
|
+ kfree_skb(skb);
|
||||||
|
+
|
||||||
|
+ kcov_remote_stop();
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
/* then other type-dependent work */
|
/* then other type-dependent work */
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case NL80211_IFTYPE_STATION:
|
case NL80211_IFTYPE_STATION:
|
||||||
@@ -1593,6 +1629,7 @@ static void ieee80211_setup_sdata(struct
|
@@ -1606,6 +1646,7 @@ static void ieee80211_setup_sdata(struct
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_queue_head_init(&sdata->skb_queue);
|
skb_queue_head_init(&sdata->skb_queue);
|
||||||
@ -187,7 +215,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
|
INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
|
||||||
--- a/net/mac80211/rx.c
|
--- a/net/mac80211/rx.c
|
||||||
+++ b/net/mac80211/rx.c
|
+++ b/net/mac80211/rx.c
|
||||||
@@ -3198,6 +3198,68 @@ ieee80211_rx_h_mgmt_check(struct ieee802
|
@@ -3211,6 +3211,68 @@ ieee80211_rx_h_mgmt_check(struct ieee802
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,7 +284,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
static ieee80211_rx_result debug_noinline
|
static ieee80211_rx_result debug_noinline
|
||||||
ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||||
{
|
{
|
||||||
@@ -3477,6 +3539,17 @@ ieee80211_rx_h_action(struct ieee80211_r
|
@@ -3490,6 +3552,17 @@ ieee80211_rx_h_action(struct ieee80211_r
|
||||||
!mesh_path_sel_is_hwmp(sdata))
|
!mesh_path_sel_is_hwmp(sdata))
|
||||||
break;
|
break;
|
||||||
goto queue;
|
goto queue;
|
||||||
@ -500,7 +528,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
--- a/net/mac80211/trace.h
|
--- a/net/mac80211/trace.h
|
||||||
+++ b/net/mac80211/trace.h
|
+++ b/net/mac80211/trace.h
|
||||||
@@ -2804,6 +2804,73 @@ DEFINE_EVENT(sta_flag_evt, drv_sta_set_d
|
@@ -2825,6 +2825,73 @@ DEFINE_EVENT(sta_flag_evt, drv_sta_set_d
|
||||||
TP_ARGS(local, sdata, sta, enabled)
|
TP_ARGS(local, sdata, sta, enabled)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -5,7 +5,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
|
||||||
@@ -637,21 +637,6 @@ static int wiphy_verify_combinations(str
|
@@ -629,21 +629,6 @@ static int wiphy_verify_combinations(str
|
||||||
c->limits[j].max > 1))
|
c->limits[j].max > 1))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/include/net/cfg80211.h
|
--- a/include/net/cfg80211.h
|
||||||
+++ b/include/net/cfg80211.h
|
+++ b/include/net/cfg80211.h
|
||||||
@@ -3826,6 +3826,7 @@ struct mgmt_frame_regs {
|
@@ -3835,6 +3835,7 @@ struct mgmt_frame_regs {
|
||||||
* (as advertised by the nl80211 feature flag.)
|
* (as advertised by the nl80211 feature flag.)
|
||||||
* @get_tx_power: store the current TX power into the dbm variable;
|
* @get_tx_power: store the current TX power into the dbm variable;
|
||||||
* return 0 if successful
|
* return 0 if successful
|
||||||
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
|
* @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
|
||||||
* functions to adjust rfkill hw state
|
* functions to adjust rfkill hw state
|
||||||
@@ -4150,6 +4151,7 @@ struct cfg80211_ops {
|
@@ -4159,6 +4160,7 @@ struct cfg80211_ops {
|
||||||
enum nl80211_tx_power_setting type, int mbm);
|
enum nl80211_tx_power_setting type, int mbm);
|
||||||
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||||
int *dbm);
|
int *dbm);
|
||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
--- a/include/net/mac80211.h
|
--- a/include/net/mac80211.h
|
||||||
+++ b/include/net/mac80211.h
|
+++ b/include/net/mac80211.h
|
||||||
@@ -1564,6 +1564,7 @@ enum ieee80211_smps_mode {
|
@@ -1566,6 +1566,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
|
||||||
@@ -1584,6 +1585,7 @@ enum ieee80211_smps_mode {
|
@@ -1586,6 +1587,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;
|
||||||
@ -57,7 +57,7 @@
|
|||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
--- a/net/mac80211/cfg.c
|
--- a/net/mac80211/cfg.c
|
||||||
+++ b/net/mac80211/cfg.c
|
+++ b/net/mac80211/cfg.c
|
||||||
@@ -2768,6 +2768,19 @@ static int ieee80211_get_tx_power(struct
|
@@ -2760,6 +2760,19 @@ static int ieee80211_get_tx_power(struct
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +77,7 @@
|
|||||||
static void ieee80211_rfkill_poll(struct wiphy *wiphy)
|
static void ieee80211_rfkill_poll(struct wiphy *wiphy)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||||
@@ -4403,6 +4416,7 @@ const struct cfg80211_ops mac80211_confi
|
@@ -4395,6 +4408,7 @@ const struct cfg80211_ops mac80211_confi
|
||||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||||
.set_tx_power = ieee80211_set_tx_power,
|
.set_tx_power = ieee80211_set_tx_power,
|
||||||
.get_tx_power = ieee80211_get_tx_power,
|
.get_tx_power = ieee80211_get_tx_power,
|
||||||
@ -137,7 +137,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* policy for the key attributes */
|
/* policy for the key attributes */
|
||||||
@@ -3317,6 +3318,20 @@ static int nl80211_set_wiphy(struct sk_b
|
@@ -3325,6 +3326,20 @@ static int nl80211_set_wiphy(struct sk_b
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
--- a/nl80211.h
|
--- a/nl80211.h
|
||||||
+++ b/nl80211.h
|
+++ b/nl80211.h
|
||||||
|
@@ -11,7 +11,7 @@
|
||||||
|
* Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
|
||||||
|
* Copyright 2008 Colin McCabe <colin@cozybit.com>
|
||||||
|
* Copyright 2015-2017 Intel Deutschland GmbH
|
||||||
|
- * Copyright (C) 2018-2020 Intel Corporation
|
||||||
|
+ * Copyright (C) 2018-2021 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -655,6 +655,9 @@
|
@@ -655,6 +655,9 @@
|
||||||
* When a security association was established on an 802.1X network using
|
* When a security association was established on an 802.1X network using
|
||||||
* fast transition, this event should be followed by an
|
* fast transition, this event should be followed by an
|
||||||
@ -160,7 +169,24 @@
|
|||||||
/* add attributes here, update the policy in nl80211.c */
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
@@ -5896,6 +5981,22 @@ enum nl80211_feature_flags {
|
@@ -3613,6 +3698,8 @@ enum nl80211_mpath_info {
|
||||||
|
* defined
|
||||||
|
* @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
|
||||||
|
* given for all 6 GHz band channels
|
||||||
|
+ * @NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS: vendor element capabilities that are
|
||||||
|
+ * advertised on this band/for this iftype (binary)
|
||||||
|
* @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
|
||||||
|
*/
|
||||||
|
enum nl80211_band_iftype_attr {
|
||||||
|
@@ -3624,6 +3711,7 @@ enum nl80211_band_iftype_attr {
|
||||||
|
NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
|
||||||
|
NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
|
||||||
|
NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
|
||||||
|
+ NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS,
|
||||||
|
|
||||||
|
/* keep last */
|
||||||
|
__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
|
||||||
|
@@ -5896,6 +5984,22 @@ enum nl80211_feature_flags {
|
||||||
* @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
|
* @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
|
||||||
* unsolicited broadcast probe response transmission
|
* unsolicited broadcast probe response transmission
|
||||||
*
|
*
|
||||||
@ -183,7 +209,7 @@
|
|||||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||||
*/
|
*/
|
||||||
@@ -5956,6 +6057,11 @@ enum nl80211_ext_feature_index {
|
@@ -5956,6 +6060,11 @@ enum nl80211_ext_feature_index {
|
||||||
NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
|
NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
|
||||||
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
||||||
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
||||||
@ -195,7 +221,7 @@
|
|||||||
|
|
||||||
/* add new features before the definition below */
|
/* add new features before the definition below */
|
||||||
NUM_NL80211_EXT_FEATURES,
|
NUM_NL80211_EXT_FEATURES,
|
||||||
@@ -6253,11 +6359,13 @@ struct nl80211_vendor_cmd_info {
|
@@ -6253,11 +6362,13 @@ struct nl80211_vendor_cmd_info {
|
||||||
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
||||||
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
||||||
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
||||||
@ -209,25 +235,29 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -6849,6 +6957,9 @@ enum nl80211_peer_measurement_ftm_capa {
|
@@ -6849,6 +6960,12 @@ enum nl80211_peer_measurement_ftm_capa {
|
||||||
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
||||||
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
||||||
* ranging will be used.
|
* ranging will be used.
|
||||||
+ * @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
|
+ * @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
|
||||||
+ * valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
|
+ * valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
|
||||||
+ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
|
+ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
|
||||||
|
+ * @NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR: optional. The BSS color of the
|
||||||
|
+ * responder. Only valid if %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED
|
||||||
|
+ * or %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED is set.
|
||||||
*
|
*
|
||||||
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
||||||
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
||||||
@@ -6867,6 +6978,7 @@ enum nl80211_peer_measurement_ftm_req {
|
@@ -6867,6 +6984,8 @@ enum nl80211_peer_measurement_ftm_req {
|
||||||
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
||||||
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
||||||
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
||||||
+ NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
|
+ NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
|
||||||
|
+ NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR,
|
||||||
|
|
||||||
/* keep last */
|
/* keep last */
|
||||||
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
||||||
@@ -7124,4 +7236,115 @@ enum nl80211_unsol_bcast_probe_resp_attr
|
@@ -7124,4 +7243,115 @@ enum nl80211_unsol_bcast_probe_resp_attr
|
||||||
NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
|
NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
|
||||||
__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
|
__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user