mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
e722b667c5
Drop patches accepted upstream Signed-off-by: Felix Fietkau <nbd@nbd.name>
684 lines
20 KiB
Diff
684 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
|
|
@@ -4346,9 +4346,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
|
|
@@ -2294,7 +2294,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,13 +807,6 @@ static void ieee80211_uninit(struct net_
|
|
ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
|
|
}
|
|
|
|
-static u16 ieee80211_netdev_select_queue(struct net_device *dev,
|
|
- struct sk_buff *skb,
|
|
- struct net_device *sb_dev)
|
|
-{
|
|
- 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)
|
|
{
|
|
@@ -833,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,
|
|
};
|
|
|
|
@@ -941,7 +927,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,
|
|
.ndo_fill_forward_path = ieee80211_netdev_fill_forward_path,
|
|
};
|
|
@@ -1443,35 +1428,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;
|
|
@@ -1501,17 +1457,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)
|
|
@@ -2096,9 +2047,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();
|
|
|
|
@@ -2121,30 +2070,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
|
|
@@ -630,7 +630,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)))
|
|
@@ -719,9 +719,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);
|
|
@@ -834,10 +832,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
|
|
@@ -1571,9 +1571,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++) {
|
|
@@ -425,8 +423,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);
|
|
@@ -527,6 +524,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);
|
|
@@ -597,21 +596,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))
|
|
@@ -685,8 +681,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
|
|
@@ -1960,9 +1955,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)) ||
|
|
@@ -2447,7 +2439,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();
|
|
|
|
@@ -2775,9 +2767,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
|
|
@@ -1600,9 +1600,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;
|
|
@@ -1650,9 +1647,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;
|
|
|
|
@@ -1669,8 +1663,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)
|
|
@@ -4193,12 +4186,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);
|
|
@@ -4509,11 +4497,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))
|
|
@@ -4767,9 +4751,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);
|
|
|
|
@@ -5962,10 +5943,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);
|
|
|