mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-16 01:40:26 +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>
696 lines
20 KiB
Diff
696 lines
20 KiB
Diff
From: Alexander Wetzel <alexander@wetzel-home.de>
|
|
Date: Sun, 9 Oct 2022 18:30:40 +0200
|
|
Subject: [PATCH] wifi: mac80211: Drop support for TX push path
|
|
|
|
All drivers are now using mac80211 internal queues (iTXQs).
|
|
Drop mac80211 internal support for the old push path.
|
|
|
|
Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
---
|
|
|
|
--- a/net/mac80211/cfg.c
|
|
+++ b/net/mac80211/cfg.c
|
|
@@ -4357,9 +4357,6 @@ static int ieee80211_get_txq_stats(struc
|
|
struct ieee80211_sub_if_data *sdata;
|
|
int ret = 0;
|
|
|
|
- if (!local->ops->wake_tx_queue)
|
|
- return 1;
|
|
-
|
|
spin_lock_bh(&local->fq.lock);
|
|
rcu_read_lock();
|
|
|
|
--- a/net/mac80211/debugfs.c
|
|
+++ b/net/mac80211/debugfs.c
|
|
@@ -663,9 +663,7 @@ void debugfs_hw_add(struct ieee80211_loc
|
|
DEBUGFS_ADD_MODE(force_tx_status, 0600);
|
|
DEBUGFS_ADD_MODE(aql_enable, 0600);
|
|
DEBUGFS_ADD(aql_pending);
|
|
-
|
|
- if (local->ops->wake_tx_queue)
|
|
- DEBUGFS_ADD_MODE(aqm, 0600);
|
|
+ DEBUGFS_ADD_MODE(aqm, 0600);
|
|
|
|
DEBUGFS_ADD_MODE(airtime_flags, 0600);
|
|
|
|
--- a/net/mac80211/debugfs_netdev.c
|
|
+++ b/net/mac80211/debugfs_netdev.c
|
|
@@ -677,8 +677,7 @@ static void add_common_files(struct ieee
|
|
DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz);
|
|
DEBUGFS_ADD(hw_queues);
|
|
|
|
- if (sdata->local->ops->wake_tx_queue &&
|
|
- sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
|
|
+ if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
|
|
sdata->vif.type != NL80211_IFTYPE_NAN)
|
|
DEBUGFS_ADD(aqm);
|
|
}
|
|
--- a/net/mac80211/debugfs_sta.c
|
|
+++ b/net/mac80211/debugfs_sta.c
|
|
@@ -1057,10 +1057,8 @@ void ieee80211_sta_debugfs_add(struct st
|
|
DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments);
|
|
DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered);
|
|
|
|
- if (local->ops->wake_tx_queue) {
|
|
- DEBUGFS_ADD(aqm);
|
|
- DEBUGFS_ADD(airtime);
|
|
- }
|
|
+ DEBUGFS_ADD(aqm);
|
|
+ DEBUGFS_ADD(airtime);
|
|
|
|
if (wiphy_ext_feature_isset(local->hw.wiphy,
|
|
NL80211_EXT_FEATURE_AQL))
|
|
--- a/net/mac80211/ieee80211_i.h
|
|
+++ b/net/mac80211/ieee80211_i.h
|
|
@@ -2300,7 +2300,6 @@ void ieee80211_wake_queue_by_reason(stru
|
|
void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
|
|
enum queue_stop_reason reason,
|
|
bool refcounted);
|
|
-void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
|
|
void ieee80211_add_pending_skb(struct ieee80211_local *local,
|
|
struct sk_buff *skb);
|
|
void ieee80211_add_pending_skbs(struct ieee80211_local *local,
|
|
--- a/net/mac80211/iface.c
|
|
+++ b/net/mac80211/iface.c
|
|
@@ -460,12 +460,6 @@ static void ieee80211_do_stop(struct iee
|
|
if (cancel_scan)
|
|
ieee80211_scan_cancel(local);
|
|
|
|
- /*
|
|
- * Stop TX on this interface first.
|
|
- */
|
|
- if (!local->ops->wake_tx_queue && sdata->dev)
|
|
- netif_tx_stop_all_queues(sdata->dev);
|
|
-
|
|
ieee80211_roc_purge(local, sdata);
|
|
|
|
switch (sdata->vif.type) {
|
|
@@ -813,25 +807,6 @@ static void ieee80211_uninit(struct net_
|
|
ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
|
|
}
|
|
|
|
-#if LINUX_VERSION_IS_GEQ(5,2,0)
|
|
-static u16 ieee80211_netdev_select_queue(struct net_device *dev,
|
|
- struct sk_buff *skb,
|
|
- struct net_device *sb_dev)
|
|
-#elif LINUX_VERSION_IS_GEQ(4,19,0)
|
|
-static u16 ieee80211_netdev_select_queue(struct net_device *dev,
|
|
- struct sk_buff *skb,
|
|
- struct net_device *sb_dev,
|
|
- select_queue_fallback_t fallback)
|
|
-#else
|
|
-static u16 ieee80211_netdev_select_queue(struct net_device *dev,
|
|
- struct sk_buff *skb,
|
|
- void *accel_priv,
|
|
- select_queue_fallback_t fallback)
|
|
-#endif
|
|
-{
|
|
- return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb);
|
|
-}
|
|
-
|
|
static void
|
|
ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
|
{
|
|
@@ -845,7 +820,6 @@ static const struct net_device_ops ieee8
|
|
.ndo_start_xmit = ieee80211_subif_start_xmit,
|
|
.ndo_set_rx_mode = ieee80211_set_multicast_list,
|
|
.ndo_set_mac_address = ieee80211_change_mac,
|
|
- .ndo_select_queue = ieee80211_netdev_select_queue,
|
|
.ndo_get_stats64 = ieee80211_get_stats64,
|
|
};
|
|
|
|
@@ -967,7 +941,6 @@ static const struct net_device_ops ieee8
|
|
.ndo_start_xmit = ieee80211_subif_start_xmit_8023,
|
|
.ndo_set_rx_mode = ieee80211_set_multicast_list,
|
|
.ndo_set_mac_address = ieee80211_change_mac,
|
|
- .ndo_select_queue = ieee80211_netdev_select_queue,
|
|
.ndo_get_stats64 = ieee80211_get_stats64,
|
|
#if LINUX_VERSION_IS_GEQ(5,13,0)
|
|
.ndo_fill_forward_path = ieee80211_netdev_fill_forward_path,
|
|
@@ -1471,35 +1444,6 @@ int ieee80211_do_open(struct wireless_de
|
|
|
|
ieee80211_recalc_ps(local);
|
|
|
|
- if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
|
|
- sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
|
- local->ops->wake_tx_queue) {
|
|
- /* XXX: for AP_VLAN, actually track AP queues */
|
|
- if (dev)
|
|
- netif_tx_start_all_queues(dev);
|
|
- } else if (dev) {
|
|
- unsigned long flags;
|
|
- int n_acs = IEEE80211_NUM_ACS;
|
|
- int ac;
|
|
-
|
|
- if (local->hw.queues < IEEE80211_NUM_ACS)
|
|
- n_acs = 1;
|
|
-
|
|
- spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
- if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE ||
|
|
- (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 &&
|
|
- skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) {
|
|
- for (ac = 0; ac < n_acs; ac++) {
|
|
- int ac_queue = sdata->vif.hw_queue[ac];
|
|
-
|
|
- if (local->queue_stop_reasons[ac_queue] == 0 &&
|
|
- skb_queue_empty(&local->pending[ac_queue]))
|
|
- netif_start_subqueue(dev, ac);
|
|
- }
|
|
- }
|
|
- spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
- }
|
|
-
|
|
set_bit(SDATA_STATE_RUNNING, &sdata->state);
|
|
|
|
return 0;
|
|
@@ -1529,17 +1473,12 @@ static void ieee80211_if_setup(struct ne
|
|
{
|
|
ether_setup(dev);
|
|
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
|
+ dev->priv_flags |= IFF_NO_QUEUE;
|
|
dev->netdev_ops = &ieee80211_dataif_ops;
|
|
dev->needs_free_netdev = true;
|
|
dev->priv_destructor = ieee80211_if_free;
|
|
}
|
|
|
|
-static void ieee80211_if_setup_no_queue(struct net_device *dev)
|
|
-{
|
|
- ieee80211_if_setup(dev);
|
|
- dev->priv_flags |= IFF_NO_QUEUE;
|
|
-}
|
|
-
|
|
static void ieee80211_iface_process_skb(struct ieee80211_local *local,
|
|
struct ieee80211_sub_if_data *sdata,
|
|
struct sk_buff *skb)
|
|
@@ -2124,9 +2063,7 @@ int ieee80211_if_add(struct ieee80211_lo
|
|
struct net_device *ndev = NULL;
|
|
struct ieee80211_sub_if_data *sdata = NULL;
|
|
struct txq_info *txqi;
|
|
- void (*if_setup)(struct net_device *dev);
|
|
int ret, i;
|
|
- int txqs = 1;
|
|
|
|
ASSERT_RTNL();
|
|
|
|
@@ -2149,30 +2086,18 @@ int ieee80211_if_add(struct ieee80211_lo
|
|
sizeof(void *));
|
|
int txq_size = 0;
|
|
|
|
- if (local->ops->wake_tx_queue &&
|
|
- type != NL80211_IFTYPE_AP_VLAN &&
|
|
+ if (type != NL80211_IFTYPE_AP_VLAN &&
|
|
(type != NL80211_IFTYPE_MONITOR ||
|
|
(params->flags & MONITOR_FLAG_ACTIVE)))
|
|
txq_size += sizeof(struct txq_info) +
|
|
local->hw.txq_data_size;
|
|
|
|
- if (local->ops->wake_tx_queue) {
|
|
- if_setup = ieee80211_if_setup_no_queue;
|
|
- } else {
|
|
- if_setup = ieee80211_if_setup;
|
|
- if (local->hw.queues >= IEEE80211_NUM_ACS)
|
|
- txqs = IEEE80211_NUM_ACS;
|
|
- }
|
|
-
|
|
ndev = alloc_netdev_mqs(size + txq_size,
|
|
name, name_assign_type,
|
|
- if_setup, txqs, 1);
|
|
+ ieee80211_if_setup, 1, 1);
|
|
if (!ndev)
|
|
return -ENOMEM;
|
|
|
|
- if (!local->ops->wake_tx_queue && local->hw.wiphy->tx_queue_len)
|
|
- ndev->tx_queue_len = local->hw.wiphy->tx_queue_len;
|
|
-
|
|
dev_net_set(ndev, wiphy_net(local->hw.wiphy));
|
|
|
|
ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
|
|
--- a/net/mac80211/main.c
|
|
+++ b/net/mac80211/main.c
|
|
@@ -627,7 +627,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
|
|
|
if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config ||
|
|
!ops->add_interface || !ops->remove_interface ||
|
|
- !ops->configure_filter))
|
|
+ !ops->configure_filter || !ops->wake_tx_queue))
|
|
return NULL;
|
|
|
|
if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove)))
|
|
@@ -716,9 +716,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
|
if (!ops->set_key)
|
|
wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
|
|
|
- if (ops->wake_tx_queue)
|
|
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
|
|
-
|
|
+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
|
|
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
|
|
|
|
wiphy->bss_priv_size = sizeof(struct ieee80211_bss);
|
|
@@ -831,10 +829,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
|
atomic_set(&local->agg_queue_stop[i], 0);
|
|
}
|
|
tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending);
|
|
-
|
|
- if (ops->wake_tx_queue)
|
|
- tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
|
|
-
|
|
+ tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
|
|
tasklet_setup(&local->tasklet, ieee80211_tasklet_handler);
|
|
|
|
skb_queue_head_init(&local->skb_queue);
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -1573,9 +1573,6 @@ static void sta_ps_start(struct sta_info
|
|
|
|
ieee80211_clear_fast_xmit(sta);
|
|
|
|
- if (!sta->sta.txq[0])
|
|
- return;
|
|
-
|
|
for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) {
|
|
struct ieee80211_txq *txq = sta->sta.txq[tid];
|
|
struct txq_info *txqi = to_txq_info(txq);
|
|
--- a/net/mac80211/sta_info.c
|
|
+++ b/net/mac80211/sta_info.c
|
|
@@ -140,17 +140,15 @@ static void __cleanup_single_sta(struct
|
|
atomic_dec(&ps->num_sta_ps);
|
|
}
|
|
|
|
- if (sta->sta.txq[0]) {
|
|
- for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
|
|
- struct txq_info *txqi;
|
|
+ for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
|
|
+ struct txq_info *txqi;
|
|
|
|
- if (!sta->sta.txq[i])
|
|
- continue;
|
|
+ if (!sta->sta.txq[i])
|
|
+ continue;
|
|
|
|
- txqi = to_txq_info(sta->sta.txq[i]);
|
|
+ txqi = to_txq_info(sta->sta.txq[i]);
|
|
|
|
- ieee80211_txq_purge(local, txqi);
|
|
- }
|
|
+ ieee80211_txq_purge(local, txqi);
|
|
}
|
|
|
|
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
|
|
@@ -428,8 +426,7 @@ void sta_info_free(struct ieee80211_loca
|
|
|
|
sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
|
|
|
|
- if (sta->sta.txq[0])
|
|
- kfree(to_txq_info(sta->sta.txq[0]));
|
|
+ kfree(to_txq_info(sta->sta.txq[0]));
|
|
kfree(rcu_dereference_raw(sta->sta.rates));
|
|
#ifdef CPTCFG_MAC80211_MESH
|
|
kfree(sta->mesh);
|
|
@@ -530,6 +527,8 @@ __sta_info_alloc(struct ieee80211_sub_if
|
|
struct ieee80211_local *local = sdata->local;
|
|
struct ieee80211_hw *hw = &local->hw;
|
|
struct sta_info *sta;
|
|
+ void *txq_data;
|
|
+ int size;
|
|
int i;
|
|
|
|
sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);
|
|
@@ -600,21 +599,18 @@ __sta_info_alloc(struct ieee80211_sub_if
|
|
|
|
sta->last_connected = ktime_get_seconds();
|
|
|
|
- if (local->ops->wake_tx_queue) {
|
|
- void *txq_data;
|
|
- int size = sizeof(struct txq_info) +
|
|
- ALIGN(hw->txq_data_size, sizeof(void *));
|
|
+ size = sizeof(struct txq_info) +
|
|
+ ALIGN(hw->txq_data_size, sizeof(void *));
|
|
|
|
- txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
|
|
- if (!txq_data)
|
|
- goto free;
|
|
+ txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
|
|
+ if (!txq_data)
|
|
+ goto free;
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
|
|
- struct txq_info *txq = txq_data + i * size;
|
|
+ for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
|
|
+ struct txq_info *txq = txq_data + i * size;
|
|
|
|
- /* might not do anything for the bufferable MMPDU TXQ */
|
|
- ieee80211_txq_init(sdata, sta, txq, i);
|
|
- }
|
|
+ /* might not do anything for the (bufferable) MMPDU TXQ */
|
|
+ ieee80211_txq_init(sdata, sta, txq, i);
|
|
}
|
|
|
|
if (sta_prepare_rate_control(local, sta, gfp))
|
|
@@ -688,8 +684,7 @@ __sta_info_alloc(struct ieee80211_sub_if
|
|
return sta;
|
|
|
|
free_txq:
|
|
- if (sta->sta.txq[0])
|
|
- kfree(to_txq_info(sta->sta.txq[0]));
|
|
+ kfree(to_txq_info(sta->sta.txq[0]));
|
|
free:
|
|
sta_info_free_link(&sta->deflink);
|
|
#ifdef CPTCFG_MAC80211_MESH
|
|
@@ -1965,9 +1960,6 @@ ieee80211_sta_ps_deliver_response(struct
|
|
* TIM recalculation.
|
|
*/
|
|
|
|
- if (!sta->sta.txq[0])
|
|
- return;
|
|
-
|
|
for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
|
|
if (!sta->sta.txq[tid] ||
|
|
!(driver_release_tids & BIT(tid)) ||
|
|
@@ -2452,7 +2444,7 @@ static void sta_set_tidstats(struct sta_
|
|
tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid];
|
|
}
|
|
|
|
- if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
|
|
+ if (tid < IEEE80211_NUM_TIDS) {
|
|
spin_lock_bh(&local->fq.lock);
|
|
rcu_read_lock();
|
|
|
|
@@ -2780,9 +2772,6 @@ unsigned long ieee80211_sta_last_active(
|
|
|
|
static void sta_update_codel_params(struct sta_info *sta, u32 thr)
|
|
{
|
|
- if (!sta->sdata->local->ops->wake_tx_queue)
|
|
- return;
|
|
-
|
|
if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
|
|
sta->cparams.target = MS2TIME(50);
|
|
sta->cparams.interval = MS2TIME(300);
|
|
--- a/net/mac80211/tdls.c
|
|
+++ b/net/mac80211/tdls.c
|
|
@@ -1016,7 +1016,6 @@ ieee80211_tdls_prep_mgmt_packet(struct w
|
|
skb->priority = 256 + 5;
|
|
break;
|
|
}
|
|
- skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
|
|
|
|
/*
|
|
* Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress.
|
|
--- a/net/mac80211/tx.c
|
|
+++ b/net/mac80211/tx.c
|
|
@@ -1606,9 +1606,6 @@ int ieee80211_txq_setup_flows(struct iee
|
|
bool supp_vht = false;
|
|
enum nl80211_band band;
|
|
|
|
- if (!local->ops->wake_tx_queue)
|
|
- return 0;
|
|
-
|
|
ret = fq_init(fq, 4096);
|
|
if (ret)
|
|
return ret;
|
|
@@ -1656,9 +1653,6 @@ void ieee80211_txq_teardown_flows(struct
|
|
{
|
|
struct fq *fq = &local->fq;
|
|
|
|
- if (!local->ops->wake_tx_queue)
|
|
- return;
|
|
-
|
|
kfree(local->cvars);
|
|
local->cvars = NULL;
|
|
|
|
@@ -1675,8 +1669,7 @@ static bool ieee80211_queue_skb(struct i
|
|
struct ieee80211_vif *vif;
|
|
struct txq_info *txqi;
|
|
|
|
- if (!local->ops->wake_tx_queue ||
|
|
- sdata->vif.type == NL80211_IFTYPE_MONITOR)
|
|
+ if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
|
|
return false;
|
|
|
|
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
|
@@ -4201,12 +4194,7 @@ void __ieee80211_subif_start_xmit(struct
|
|
if (IS_ERR(sta))
|
|
sta = NULL;
|
|
|
|
- if (local->ops->wake_tx_queue) {
|
|
- u16 queue = __ieee80211_select_queue(sdata, sta, skb);
|
|
- skb_set_queue_mapping(skb, queue);
|
|
- skb_get_hash(skb);
|
|
- }
|
|
-
|
|
+ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
|
|
ieee80211_aggr_check(sdata, sta, skb);
|
|
|
|
sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
|
|
@@ -4517,11 +4505,7 @@ static void ieee80211_8023_xmit(struct i
|
|
struct tid_ampdu_tx *tid_tx;
|
|
u8 tid;
|
|
|
|
- if (local->ops->wake_tx_queue) {
|
|
- u16 queue = __ieee80211_select_queue(sdata, sta, skb);
|
|
- skb_set_queue_mapping(skb, queue);
|
|
- skb_get_hash(skb);
|
|
- }
|
|
+ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
|
|
|
|
if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
|
|
test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
|
|
@@ -4775,9 +4759,6 @@ void ieee80211_tx_pending(struct tasklet
|
|
if (!txok)
|
|
break;
|
|
}
|
|
-
|
|
- if (skb_queue_empty(&local->pending[i]))
|
|
- ieee80211_propagate_queue_wake(local, i);
|
|
}
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
|
|
@@ -5970,10 +5951,9 @@ int ieee80211_tx_control_port(struct wip
|
|
}
|
|
|
|
if (!IS_ERR(sta)) {
|
|
- u16 queue = __ieee80211_select_queue(sdata, sta, skb);
|
|
+ u16 queue = ieee80211_select_queue(sdata, sta, skb);
|
|
|
|
skb_set_queue_mapping(skb, queue);
|
|
- skb_get_hash(skb);
|
|
|
|
/*
|
|
* for MLO STA, the SA should be the AP MLD address, but
|
|
--- a/net/mac80211/util.c
|
|
+++ b/net/mac80211/util.c
|
|
@@ -444,39 +444,6 @@ void ieee80211_wake_txqs(struct tasklet_
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
}
|
|
|
|
-void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
|
|
-{
|
|
- struct ieee80211_sub_if_data *sdata;
|
|
- int n_acs = IEEE80211_NUM_ACS;
|
|
-
|
|
- if (local->ops->wake_tx_queue)
|
|
- return;
|
|
-
|
|
- if (local->hw.queues < IEEE80211_NUM_ACS)
|
|
- n_acs = 1;
|
|
-
|
|
- list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
|
- int ac;
|
|
-
|
|
- if (!sdata->dev)
|
|
- continue;
|
|
-
|
|
- if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
|
|
- local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
|
|
- continue;
|
|
-
|
|
- for (ac = 0; ac < n_acs; ac++) {
|
|
- int ac_queue = sdata->vif.hw_queue[ac];
|
|
-
|
|
- if (ac_queue == queue ||
|
|
- (sdata->vif.cab_queue == queue &&
|
|
- local->queue_stop_reasons[ac_queue] == 0 &&
|
|
- skb_queue_empty(&local->pending[ac_queue])))
|
|
- netif_wake_subqueue(sdata->dev, ac);
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
|
|
enum queue_stop_reason reason,
|
|
bool refcounted,
|
|
@@ -507,11 +474,7 @@ static void __ieee80211_wake_queue(struc
|
|
/* someone still has this queue stopped */
|
|
return;
|
|
|
|
- if (skb_queue_empty(&local->pending[queue])) {
|
|
- rcu_read_lock();
|
|
- ieee80211_propagate_queue_wake(local, queue);
|
|
- rcu_read_unlock();
|
|
- } else
|
|
+ if (!skb_queue_empty(&local->pending[queue]))
|
|
tasklet_schedule(&local->tx_pending_tasklet);
|
|
|
|
/*
|
|
@@ -521,12 +484,10 @@ static void __ieee80211_wake_queue(struc
|
|
* release someone's lock, but it is fine because all the callers of
|
|
* __ieee80211_wake_queue call it right before releasing the lock.
|
|
*/
|
|
- if (local->ops->wake_tx_queue) {
|
|
- if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
|
|
- tasklet_schedule(&local->wake_txqs_tasklet);
|
|
- else
|
|
- _ieee80211_wake_txqs(local, flags);
|
|
- }
|
|
+ if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
|
|
+ tasklet_schedule(&local->wake_txqs_tasklet);
|
|
+ else
|
|
+ _ieee80211_wake_txqs(local, flags);
|
|
}
|
|
|
|
void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
|
|
@@ -554,8 +515,6 @@ static void __ieee80211_stop_queue(struc
|
|
bool refcounted)
|
|
{
|
|
struct ieee80211_local *local = hw_to_local(hw);
|
|
- struct ieee80211_sub_if_data *sdata;
|
|
- int n_acs = IEEE80211_NUM_ACS;
|
|
|
|
trace_stop_queue(local, queue, reason);
|
|
|
|
@@ -567,27 +526,7 @@ static void __ieee80211_stop_queue(struc
|
|
else
|
|
local->q_stop_reasons[queue][reason]++;
|
|
|
|
- if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue]))
|
|
- return;
|
|
-
|
|
- if (local->hw.queues < IEEE80211_NUM_ACS)
|
|
- n_acs = 1;
|
|
-
|
|
- rcu_read_lock();
|
|
- list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
|
- int ac;
|
|
-
|
|
- if (!sdata->dev)
|
|
- continue;
|
|
-
|
|
- for (ac = 0; ac < n_acs; ac++) {
|
|
- if (!local->ops->wake_tx_queue &&
|
|
- (sdata->vif.hw_queue[ac] == queue ||
|
|
- sdata->vif.cab_queue == queue))
|
|
- netif_stop_subqueue(sdata->dev, ac);
|
|
- }
|
|
- }
|
|
- rcu_read_unlock();
|
|
+ set_bit(reason, &local->queue_stop_reasons[queue]);
|
|
}
|
|
|
|
void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
|
|
--- a/net/mac80211/wme.c
|
|
+++ b/net/mac80211/wme.c
|
|
@@ -122,6 +122,9 @@ u16 ieee80211_select_queue_80211(struct
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
u8 *p;
|
|
|
|
+ /* Ensure hash is set prior to potential SW encryption */
|
|
+ skb_get_hash(skb);
|
|
+
|
|
if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) ||
|
|
local->hw.queues < IEEE80211_NUM_ACS)
|
|
return 0;
|
|
@@ -141,13 +144,16 @@ u16 ieee80211_select_queue_80211(struct
|
|
return ieee80211_downgrade_queue(sdata, NULL, skb);
|
|
}
|
|
|
|
-u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
|
- struct sta_info *sta, struct sk_buff *skb)
|
|
+u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
|
+ struct sta_info *sta, struct sk_buff *skb)
|
|
{
|
|
const struct ethhdr *eth = (void *)skb->data;
|
|
struct mac80211_qos_map *qos_map;
|
|
bool qos;
|
|
|
|
+ /* Ensure hash is set prior to potential SW encryption */
|
|
+ skb_get_hash(skb);
|
|
+
|
|
/* all mesh/ocb stations are required to support WME */
|
|
if ((sdata->vif.type == NL80211_IFTYPE_MESH_POINT &&
|
|
!is_multicast_ether_addr(eth->h_dest)) ||
|
|
@@ -178,59 +184,6 @@ u16 __ieee80211_select_queue(struct ieee
|
|
return ieee80211_downgrade_queue(sdata, sta, skb);
|
|
}
|
|
|
|
-
|
|
-/* Indicate which queue to use. */
|
|
-u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
|
- struct sk_buff *skb)
|
|
-{
|
|
- struct ieee80211_local *local = sdata->local;
|
|
- struct sta_info *sta = NULL;
|
|
- const u8 *ra = NULL;
|
|
- u16 ret;
|
|
-
|
|
- /* when using iTXQ, we can do this later */
|
|
- if (local->ops->wake_tx_queue)
|
|
- return 0;
|
|
-
|
|
- if (local->hw.queues < IEEE80211_NUM_ACS || skb->len < 6) {
|
|
- skb->priority = 0; /* required for correct WPA/11i MIC */
|
|
- return 0;
|
|
- }
|
|
-
|
|
- rcu_read_lock();
|
|
- switch (sdata->vif.type) {
|
|
- case NL80211_IFTYPE_AP_VLAN:
|
|
- sta = rcu_dereference(sdata->u.vlan.sta);
|
|
- if (sta)
|
|
- break;
|
|
- fallthrough;
|
|
- case NL80211_IFTYPE_AP:
|
|
- ra = skb->data;
|
|
- break;
|
|
- case NL80211_IFTYPE_STATION:
|
|
- /* might be a TDLS station */
|
|
- sta = sta_info_get(sdata, skb->data);
|
|
- if (sta)
|
|
- break;
|
|
-
|
|
- ra = sdata->deflink.u.mgd.bssid;
|
|
- break;
|
|
- case NL80211_IFTYPE_ADHOC:
|
|
- ra = skb->data;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- if (!sta && ra && !is_multicast_ether_addr(ra))
|
|
- sta = sta_info_get(sdata, ra);
|
|
-
|
|
- ret = __ieee80211_select_queue(sdata, sta, skb);
|
|
-
|
|
- rcu_read_unlock();
|
|
- return ret;
|
|
-}
|
|
-
|
|
/**
|
|
* ieee80211_set_qos_hdr - Fill in the QoS header if there is one.
|
|
*
|
|
--- a/net/mac80211/wme.h
|
|
+++ b/net/mac80211/wme.h
|
|
@@ -13,10 +13,8 @@
|
|
u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
|
|
struct sk_buff *skb,
|
|
struct ieee80211_hdr *hdr);
|
|
-u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
|
- struct sta_info *sta, struct sk_buff *skb);
|
|
u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
|
- struct sk_buff *skb);
|
|
+ struct sta_info *sta, struct sk_buff *skb);
|
|
void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
|
|
struct sk_buff *skb);
|
|
|