f9f9977cee5ef08e8775f01132eb0e136b0c7b12
[openwrt/staging/blogic.git] /
1 From: Alexander Wetzel <alexander@wetzel-home.de>
2 Date: Sun, 9 Oct 2022 18:30:40 +0200
3 Subject: [PATCH] wifi: mac80211: Drop support for TX push path
4
5 All drivers are now using mac80211 internal queues (iTXQs).
6 Drop mac80211 internal support for the old push path.
7
8 Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
9 Signed-off-by: Johannes Berg <johannes.berg@intel.com>
10 ---
11
12 --- a/net/mac80211/cfg.c
13 +++ b/net/mac80211/cfg.c
14 @@ -4346,9 +4346,6 @@ static int ieee80211_get_txq_stats(struc
15 struct ieee80211_sub_if_data *sdata;
16 int ret = 0;
17
18 - if (!local->ops->wake_tx_queue)
19 - return 1;
20 -
21 spin_lock_bh(&local->fq.lock);
22 rcu_read_lock();
23
24 --- a/net/mac80211/debugfs.c
25 +++ b/net/mac80211/debugfs.c
26 @@ -663,9 +663,7 @@ void debugfs_hw_add(struct ieee80211_loc
27 DEBUGFS_ADD_MODE(force_tx_status, 0600);
28 DEBUGFS_ADD_MODE(aql_enable, 0600);
29 DEBUGFS_ADD(aql_pending);
30 -
31 - if (local->ops->wake_tx_queue)
32 - DEBUGFS_ADD_MODE(aqm, 0600);
33 + DEBUGFS_ADD_MODE(aqm, 0600);
34
35 DEBUGFS_ADD_MODE(airtime_flags, 0600);
36
37 --- a/net/mac80211/debugfs_netdev.c
38 +++ b/net/mac80211/debugfs_netdev.c
39 @@ -677,8 +677,7 @@ static void add_common_files(struct ieee
40 DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz);
41 DEBUGFS_ADD(hw_queues);
42
43 - if (sdata->local->ops->wake_tx_queue &&
44 - sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
45 + if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
46 sdata->vif.type != NL80211_IFTYPE_NAN)
47 DEBUGFS_ADD(aqm);
48 }
49 --- a/net/mac80211/debugfs_sta.c
50 +++ b/net/mac80211/debugfs_sta.c
51 @@ -1057,10 +1057,8 @@ void ieee80211_sta_debugfs_add(struct st
52 DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments);
53 DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered);
54
55 - if (local->ops->wake_tx_queue) {
56 - DEBUGFS_ADD(aqm);
57 - DEBUGFS_ADD(airtime);
58 - }
59 + DEBUGFS_ADD(aqm);
60 + DEBUGFS_ADD(airtime);
61
62 if (wiphy_ext_feature_isset(local->hw.wiphy,
63 NL80211_EXT_FEATURE_AQL))
64 --- a/net/mac80211/ieee80211_i.h
65 +++ b/net/mac80211/ieee80211_i.h
66 @@ -2294,7 +2294,6 @@ void ieee80211_wake_queue_by_reason(stru
67 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
68 enum queue_stop_reason reason,
69 bool refcounted);
70 -void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
71 void ieee80211_add_pending_skb(struct ieee80211_local *local,
72 struct sk_buff *skb);
73 void ieee80211_add_pending_skbs(struct ieee80211_local *local,
74 --- a/net/mac80211/iface.c
75 +++ b/net/mac80211/iface.c
76 @@ -460,12 +460,6 @@ static void ieee80211_do_stop(struct iee
77 if (cancel_scan)
78 ieee80211_scan_cancel(local);
79
80 - /*
81 - * Stop TX on this interface first.
82 - */
83 - if (!local->ops->wake_tx_queue && sdata->dev)
84 - netif_tx_stop_all_queues(sdata->dev);
85 -
86 ieee80211_roc_purge(local, sdata);
87
88 switch (sdata->vif.type) {
89 @@ -813,13 +807,6 @@ static void ieee80211_uninit(struct net_
90 ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
91 }
92
93 -static u16 ieee80211_netdev_select_queue(struct net_device *dev,
94 - struct sk_buff *skb,
95 - struct net_device *sb_dev)
96 -{
97 - return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb);
98 -}
99 -
100 static void
101 ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
102 {
103 @@ -833,7 +820,6 @@ static const struct net_device_ops ieee8
104 .ndo_start_xmit = ieee80211_subif_start_xmit,
105 .ndo_set_rx_mode = ieee80211_set_multicast_list,
106 .ndo_set_mac_address = ieee80211_change_mac,
107 - .ndo_select_queue = ieee80211_netdev_select_queue,
108 .ndo_get_stats64 = ieee80211_get_stats64,
109 };
110
111 @@ -941,7 +927,6 @@ static const struct net_device_ops ieee8
112 .ndo_start_xmit = ieee80211_subif_start_xmit_8023,
113 .ndo_set_rx_mode = ieee80211_set_multicast_list,
114 .ndo_set_mac_address = ieee80211_change_mac,
115 - .ndo_select_queue = ieee80211_netdev_select_queue,
116 .ndo_get_stats64 = ieee80211_get_stats64,
117 .ndo_fill_forward_path = ieee80211_netdev_fill_forward_path,
118 };
119 @@ -1443,35 +1428,6 @@ int ieee80211_do_open(struct wireless_de
120
121 ieee80211_recalc_ps(local);
122
123 - if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
124 - sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
125 - local->ops->wake_tx_queue) {
126 - /* XXX: for AP_VLAN, actually track AP queues */
127 - if (dev)
128 - netif_tx_start_all_queues(dev);
129 - } else if (dev) {
130 - unsigned long flags;
131 - int n_acs = IEEE80211_NUM_ACS;
132 - int ac;
133 -
134 - if (local->hw.queues < IEEE80211_NUM_ACS)
135 - n_acs = 1;
136 -
137 - spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
138 - if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE ||
139 - (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 &&
140 - skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) {
141 - for (ac = 0; ac < n_acs; ac++) {
142 - int ac_queue = sdata->vif.hw_queue[ac];
143 -
144 - if (local->queue_stop_reasons[ac_queue] == 0 &&
145 - skb_queue_empty(&local->pending[ac_queue]))
146 - netif_start_subqueue(dev, ac);
147 - }
148 - }
149 - spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
150 - }
151 -
152 set_bit(SDATA_STATE_RUNNING, &sdata->state);
153
154 return 0;
155 @@ -1501,17 +1457,12 @@ static void ieee80211_if_setup(struct ne
156 {
157 ether_setup(dev);
158 dev->priv_flags &= ~IFF_TX_SKB_SHARING;
159 + dev->priv_flags |= IFF_NO_QUEUE;
160 dev->netdev_ops = &ieee80211_dataif_ops;
161 dev->needs_free_netdev = true;
162 dev->priv_destructor = ieee80211_if_free;
163 }
164
165 -static void ieee80211_if_setup_no_queue(struct net_device *dev)
166 -{
167 - ieee80211_if_setup(dev);
168 - dev->priv_flags |= IFF_NO_QUEUE;
169 -}
170 -
171 static void ieee80211_iface_process_skb(struct ieee80211_local *local,
172 struct ieee80211_sub_if_data *sdata,
173 struct sk_buff *skb)
174 @@ -2096,9 +2047,7 @@ int ieee80211_if_add(struct ieee80211_lo
175 struct net_device *ndev = NULL;
176 struct ieee80211_sub_if_data *sdata = NULL;
177 struct txq_info *txqi;
178 - void (*if_setup)(struct net_device *dev);
179 int ret, i;
180 - int txqs = 1;
181
182 ASSERT_RTNL();
183
184 @@ -2121,30 +2070,18 @@ int ieee80211_if_add(struct ieee80211_lo
185 sizeof(void *));
186 int txq_size = 0;
187
188 - if (local->ops->wake_tx_queue &&
189 - type != NL80211_IFTYPE_AP_VLAN &&
190 + if (type != NL80211_IFTYPE_AP_VLAN &&
191 (type != NL80211_IFTYPE_MONITOR ||
192 (params->flags & MONITOR_FLAG_ACTIVE)))
193 txq_size += sizeof(struct txq_info) +
194 local->hw.txq_data_size;
195
196 - if (local->ops->wake_tx_queue) {
197 - if_setup = ieee80211_if_setup_no_queue;
198 - } else {
199 - if_setup = ieee80211_if_setup;
200 - if (local->hw.queues >= IEEE80211_NUM_ACS)
201 - txqs = IEEE80211_NUM_ACS;
202 - }
203 -
204 ndev = alloc_netdev_mqs(size + txq_size,
205 name, name_assign_type,
206 - if_setup, txqs, 1);
207 + ieee80211_if_setup, 1, 1);
208 if (!ndev)
209 return -ENOMEM;
210
211 - if (!local->ops->wake_tx_queue && local->hw.wiphy->tx_queue_len)
212 - ndev->tx_queue_len = local->hw.wiphy->tx_queue_len;
213 -
214 dev_net_set(ndev, wiphy_net(local->hw.wiphy));
215
216 ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
217 --- a/net/mac80211/main.c
218 +++ b/net/mac80211/main.c
219 @@ -630,7 +630,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
220
221 if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config ||
222 !ops->add_interface || !ops->remove_interface ||
223 - !ops->configure_filter))
224 + !ops->configure_filter || !ops->wake_tx_queue))
225 return NULL;
226
227 if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove)))
228 @@ -719,9 +719,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
229 if (!ops->set_key)
230 wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
231
232 - if (ops->wake_tx_queue)
233 - wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
234 -
235 + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
236 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
237
238 wiphy->bss_priv_size = sizeof(struct ieee80211_bss);
239 @@ -834,10 +832,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
240 atomic_set(&local->agg_queue_stop[i], 0);
241 }
242 tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending);
243 -
244 - if (ops->wake_tx_queue)
245 - tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
246 -
247 + tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
248 tasklet_setup(&local->tasklet, ieee80211_tasklet_handler);
249
250 skb_queue_head_init(&local->skb_queue);
251 --- a/net/mac80211/rx.c
252 +++ b/net/mac80211/rx.c
253 @@ -1571,9 +1571,6 @@ static void sta_ps_start(struct sta_info
254
255 ieee80211_clear_fast_xmit(sta);
256
257 - if (!sta->sta.txq[0])
258 - return;
259 -
260 for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) {
261 struct ieee80211_txq *txq = sta->sta.txq[tid];
262 struct txq_info *txqi = to_txq_info(txq);
263 --- a/net/mac80211/sta_info.c
264 +++ b/net/mac80211/sta_info.c
265 @@ -140,17 +140,15 @@ static void __cleanup_single_sta(struct
266 atomic_dec(&ps->num_sta_ps);
267 }
268
269 - if (sta->sta.txq[0]) {
270 - for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
271 - struct txq_info *txqi;
272 + for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
273 + struct txq_info *txqi;
274
275 - if (!sta->sta.txq[i])
276 - continue;
277 + if (!sta->sta.txq[i])
278 + continue;
279
280 - txqi = to_txq_info(sta->sta.txq[i]);
281 + txqi = to_txq_info(sta->sta.txq[i]);
282
283 - ieee80211_txq_purge(local, txqi);
284 - }
285 + ieee80211_txq_purge(local, txqi);
286 }
287
288 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
289 @@ -425,8 +423,7 @@ void sta_info_free(struct ieee80211_loca
290
291 sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
292
293 - if (sta->sta.txq[0])
294 - kfree(to_txq_info(sta->sta.txq[0]));
295 + kfree(to_txq_info(sta->sta.txq[0]));
296 kfree(rcu_dereference_raw(sta->sta.rates));
297 #ifdef CPTCFG_MAC80211_MESH
298 kfree(sta->mesh);
299 @@ -527,6 +524,8 @@ __sta_info_alloc(struct ieee80211_sub_if
300 struct ieee80211_local *local = sdata->local;
301 struct ieee80211_hw *hw = &local->hw;
302 struct sta_info *sta;
303 + void *txq_data;
304 + int size;
305 int i;
306
307 sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);
308 @@ -597,21 +596,18 @@ __sta_info_alloc(struct ieee80211_sub_if
309
310 sta->last_connected = ktime_get_seconds();
311
312 - if (local->ops->wake_tx_queue) {
313 - void *txq_data;
314 - int size = sizeof(struct txq_info) +
315 - ALIGN(hw->txq_data_size, sizeof(void *));
316 + size = sizeof(struct txq_info) +
317 + ALIGN(hw->txq_data_size, sizeof(void *));
318
319 - txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
320 - if (!txq_data)
321 - goto free;
322 + txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
323 + if (!txq_data)
324 + goto free;
325
326 - for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
327 - struct txq_info *txq = txq_data + i * size;
328 + for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
329 + struct txq_info *txq = txq_data + i * size;
330
331 - /* might not do anything for the bufferable MMPDU TXQ */
332 - ieee80211_txq_init(sdata, sta, txq, i);
333 - }
334 + /* might not do anything for the (bufferable) MMPDU TXQ */
335 + ieee80211_txq_init(sdata, sta, txq, i);
336 }
337
338 if (sta_prepare_rate_control(local, sta, gfp))
339 @@ -685,8 +681,7 @@ __sta_info_alloc(struct ieee80211_sub_if
340 return sta;
341
342 free_txq:
343 - if (sta->sta.txq[0])
344 - kfree(to_txq_info(sta->sta.txq[0]));
345 + kfree(to_txq_info(sta->sta.txq[0]));
346 free:
347 sta_info_free_link(&sta->deflink);
348 #ifdef CPTCFG_MAC80211_MESH
349 @@ -1960,9 +1955,6 @@ ieee80211_sta_ps_deliver_response(struct
350 * TIM recalculation.
351 */
352
353 - if (!sta->sta.txq[0])
354 - return;
355 -
356 for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
357 if (!sta->sta.txq[tid] ||
358 !(driver_release_tids & BIT(tid)) ||
359 @@ -2447,7 +2439,7 @@ static void sta_set_tidstats(struct sta_
360 tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid];
361 }
362
363 - if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
364 + if (tid < IEEE80211_NUM_TIDS) {
365 spin_lock_bh(&local->fq.lock);
366 rcu_read_lock();
367
368 @@ -2775,9 +2767,6 @@ unsigned long ieee80211_sta_last_active(
369
370 static void sta_update_codel_params(struct sta_info *sta, u32 thr)
371 {
372 - if (!sta->sdata->local->ops->wake_tx_queue)
373 - return;
374 -
375 if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
376 sta->cparams.target = MS2TIME(50);
377 sta->cparams.interval = MS2TIME(300);
378 --- a/net/mac80211/tdls.c
379 +++ b/net/mac80211/tdls.c
380 @@ -1016,7 +1016,6 @@ ieee80211_tdls_prep_mgmt_packet(struct w
381 skb->priority = 256 + 5;
382 break;
383 }
384 - skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
385
386 /*
387 * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress.
388 --- a/net/mac80211/tx.c
389 +++ b/net/mac80211/tx.c
390 @@ -1600,9 +1600,6 @@ int ieee80211_txq_setup_flows(struct iee
391 bool supp_vht = false;
392 enum nl80211_band band;
393
394 - if (!local->ops->wake_tx_queue)
395 - return 0;
396 -
397 ret = fq_init(fq, 4096);
398 if (ret)
399 return ret;
400 @@ -1650,9 +1647,6 @@ void ieee80211_txq_teardown_flows(struct
401 {
402 struct fq *fq = &local->fq;
403
404 - if (!local->ops->wake_tx_queue)
405 - return;
406 -
407 kfree(local->cvars);
408 local->cvars = NULL;
409
410 @@ -1669,8 +1663,7 @@ static bool ieee80211_queue_skb(struct i
411 struct ieee80211_vif *vif;
412 struct txq_info *txqi;
413
414 - if (!local->ops->wake_tx_queue ||
415 - sdata->vif.type == NL80211_IFTYPE_MONITOR)
416 + if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
417 return false;
418
419 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
420 @@ -4193,12 +4186,7 @@ void __ieee80211_subif_start_xmit(struct
421 if (IS_ERR(sta))
422 sta = NULL;
423
424 - if (local->ops->wake_tx_queue) {
425 - u16 queue = __ieee80211_select_queue(sdata, sta, skb);
426 - skb_set_queue_mapping(skb, queue);
427 - skb_get_hash(skb);
428 - }
429 -
430 + skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
431 ieee80211_aggr_check(sdata, sta, skb);
432
433 sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
434 @@ -4509,11 +4497,7 @@ static void ieee80211_8023_xmit(struct i
435 struct tid_ampdu_tx *tid_tx;
436 u8 tid;
437
438 - if (local->ops->wake_tx_queue) {
439 - u16 queue = __ieee80211_select_queue(sdata, sta, skb);
440 - skb_set_queue_mapping(skb, queue);
441 - skb_get_hash(skb);
442 - }
443 + skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
444
445 if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
446 test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
447 @@ -4767,9 +4751,6 @@ void ieee80211_tx_pending(struct tasklet
448 if (!txok)
449 break;
450 }
451 -
452 - if (skb_queue_empty(&local->pending[i]))
453 - ieee80211_propagate_queue_wake(local, i);
454 }
455 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
456
457 @@ -5962,10 +5943,9 @@ int ieee80211_tx_control_port(struct wip
458 }
459
460 if (!IS_ERR(sta)) {
461 - u16 queue = __ieee80211_select_queue(sdata, sta, skb);
462 + u16 queue = ieee80211_select_queue(sdata, sta, skb);
463
464 skb_set_queue_mapping(skb, queue);
465 - skb_get_hash(skb);
466
467 /*
468 * for MLO STA, the SA should be the AP MLD address, but
469 --- a/net/mac80211/util.c
470 +++ b/net/mac80211/util.c
471 @@ -444,39 +444,6 @@ void ieee80211_wake_txqs(struct tasklet_
472 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
473 }
474
475 -void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
476 -{
477 - struct ieee80211_sub_if_data *sdata;
478 - int n_acs = IEEE80211_NUM_ACS;
479 -
480 - if (local->ops->wake_tx_queue)
481 - return;
482 -
483 - if (local->hw.queues < IEEE80211_NUM_ACS)
484 - n_acs = 1;
485 -
486 - list_for_each_entry_rcu(sdata, &local->interfaces, list) {
487 - int ac;
488 -
489 - if (!sdata->dev)
490 - continue;
491 -
492 - if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
493 - local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
494 - continue;
495 -
496 - for (ac = 0; ac < n_acs; ac++) {
497 - int ac_queue = sdata->vif.hw_queue[ac];
498 -
499 - if (ac_queue == queue ||
500 - (sdata->vif.cab_queue == queue &&
501 - local->queue_stop_reasons[ac_queue] == 0 &&
502 - skb_queue_empty(&local->pending[ac_queue])))
503 - netif_wake_subqueue(sdata->dev, ac);
504 - }
505 - }
506 -}
507 -
508 static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
509 enum queue_stop_reason reason,
510 bool refcounted,
511 @@ -507,11 +474,7 @@ static void __ieee80211_wake_queue(struc
512 /* someone still has this queue stopped */
513 return;
514
515 - if (skb_queue_empty(&local->pending[queue])) {
516 - rcu_read_lock();
517 - ieee80211_propagate_queue_wake(local, queue);
518 - rcu_read_unlock();
519 - } else
520 + if (!skb_queue_empty(&local->pending[queue]))
521 tasklet_schedule(&local->tx_pending_tasklet);
522
523 /*
524 @@ -521,12 +484,10 @@ static void __ieee80211_wake_queue(struc
525 * release someone's lock, but it is fine because all the callers of
526 * __ieee80211_wake_queue call it right before releasing the lock.
527 */
528 - if (local->ops->wake_tx_queue) {
529 - if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
530 - tasklet_schedule(&local->wake_txqs_tasklet);
531 - else
532 - _ieee80211_wake_txqs(local, flags);
533 - }
534 + if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
535 + tasklet_schedule(&local->wake_txqs_tasklet);
536 + else
537 + _ieee80211_wake_txqs(local, flags);
538 }
539
540 void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
541 @@ -554,8 +515,6 @@ static void __ieee80211_stop_queue(struc
542 bool refcounted)
543 {
544 struct ieee80211_local *local = hw_to_local(hw);
545 - struct ieee80211_sub_if_data *sdata;
546 - int n_acs = IEEE80211_NUM_ACS;
547
548 trace_stop_queue(local, queue, reason);
549
550 @@ -567,27 +526,7 @@ static void __ieee80211_stop_queue(struc
551 else
552 local->q_stop_reasons[queue][reason]++;
553
554 - if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue]))
555 - return;
556 -
557 - if (local->hw.queues < IEEE80211_NUM_ACS)
558 - n_acs = 1;
559 -
560 - rcu_read_lock();
561 - list_for_each_entry_rcu(sdata, &local->interfaces, list) {
562 - int ac;
563 -
564 - if (!sdata->dev)
565 - continue;
566 -
567 - for (ac = 0; ac < n_acs; ac++) {
568 - if (!local->ops->wake_tx_queue &&
569 - (sdata->vif.hw_queue[ac] == queue ||
570 - sdata->vif.cab_queue == queue))
571 - netif_stop_subqueue(sdata->dev, ac);
572 - }
573 - }
574 - rcu_read_unlock();
575 + set_bit(reason, &local->queue_stop_reasons[queue]);
576 }
577
578 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
579 --- a/net/mac80211/wme.c
580 +++ b/net/mac80211/wme.c
581 @@ -122,6 +122,9 @@ u16 ieee80211_select_queue_80211(struct
582 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
583 u8 *p;
584
585 + /* Ensure hash is set prior to potential SW encryption */
586 + skb_get_hash(skb);
587 +
588 if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) ||
589 local->hw.queues < IEEE80211_NUM_ACS)
590 return 0;
591 @@ -141,13 +144,16 @@ u16 ieee80211_select_queue_80211(struct
592 return ieee80211_downgrade_queue(sdata, NULL, skb);
593 }
594
595 -u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
596 - struct sta_info *sta, struct sk_buff *skb)
597 +u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
598 + struct sta_info *sta, struct sk_buff *skb)
599 {
600 const struct ethhdr *eth = (void *)skb->data;
601 struct mac80211_qos_map *qos_map;
602 bool qos;
603
604 + /* Ensure hash is set prior to potential SW encryption */
605 + skb_get_hash(skb);
606 +
607 /* all mesh/ocb stations are required to support WME */
608 if ((sdata->vif.type == NL80211_IFTYPE_MESH_POINT &&
609 !is_multicast_ether_addr(eth->h_dest)) ||
610 @@ -178,59 +184,6 @@ u16 __ieee80211_select_queue(struct ieee
611 return ieee80211_downgrade_queue(sdata, sta, skb);
612 }
613
614 -
615 -/* Indicate which queue to use. */
616 -u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
617 - struct sk_buff *skb)
618 -{
619 - struct ieee80211_local *local = sdata->local;
620 - struct sta_info *sta = NULL;
621 - const u8 *ra = NULL;
622 - u16 ret;
623 -
624 - /* when using iTXQ, we can do this later */
625 - if (local->ops->wake_tx_queue)
626 - return 0;
627 -
628 - if (local->hw.queues < IEEE80211_NUM_ACS || skb->len < 6) {
629 - skb->priority = 0; /* required for correct WPA/11i MIC */
630 - return 0;
631 - }
632 -
633 - rcu_read_lock();
634 - switch (sdata->vif.type) {
635 - case NL80211_IFTYPE_AP_VLAN:
636 - sta = rcu_dereference(sdata->u.vlan.sta);
637 - if (sta)
638 - break;
639 - fallthrough;
640 - case NL80211_IFTYPE_AP:
641 - ra = skb->data;
642 - break;
643 - case NL80211_IFTYPE_STATION:
644 - /* might be a TDLS station */
645 - sta = sta_info_get(sdata, skb->data);
646 - if (sta)
647 - break;
648 -
649 - ra = sdata->deflink.u.mgd.bssid;
650 - break;
651 - case NL80211_IFTYPE_ADHOC:
652 - ra = skb->data;
653 - break;
654 - default:
655 - break;
656 - }
657 -
658 - if (!sta && ra && !is_multicast_ether_addr(ra))
659 - sta = sta_info_get(sdata, ra);
660 -
661 - ret = __ieee80211_select_queue(sdata, sta, skb);
662 -
663 - rcu_read_unlock();
664 - return ret;
665 -}
666 -
667 /**
668 * ieee80211_set_qos_hdr - Fill in the QoS header if there is one.
669 *
670 --- a/net/mac80211/wme.h
671 +++ b/net/mac80211/wme.h
672 @@ -13,10 +13,8 @@
673 u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
674 struct sk_buff *skb,
675 struct ieee80211_hdr *hdr);
676 -u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
677 - struct sta_info *sta, struct sk_buff *skb);
678 u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
679 - struct sk_buff *skb);
680 + struct sta_info *sta, struct sk_buff *skb);
681 void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
682 struct sk_buff *skb);
683