b93bd5e52a0a22ac1b7bf6ba23e3a47e6d21d1ff
[openwrt/staging/yousong.git] / package / mac80211 / patches / 541-ath9k_remove_virtual_support.patch
1 --- a/drivers/net/wireless/ath/ath9k/recv.c
2 +++ b/drivers/net/wireless/ath/ath9k/recv.c
3 @@ -34,27 +34,6 @@ static inline bool ath9k_check_auto_slee
4 (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP);
5 }
6
7 -static struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc,
8 - struct ieee80211_hdr *hdr)
9 -{
10 - struct ieee80211_hw *hw = sc->pri_wiphy->hw;
11 - int i;
12 -
13 - spin_lock_bh(&sc->wiphy_lock);
14 - for (i = 0; i < sc->num_sec_wiphy; i++) {
15 - struct ath_wiphy *aphy = sc->sec_wiphy[i];
16 - if (aphy == NULL)
17 - continue;
18 - if (compare_ether_addr(hdr->addr1, aphy->hw->wiphy->perm_addr)
19 - == 0) {
20 - hw = aphy->hw;
21 - break;
22 - }
23 - }
24 - spin_unlock_bh(&sc->wiphy_lock);
25 - return hw;
26 -}
27 -
28 /*
29 * Setup and link descriptors.
30 *
31 @@ -463,8 +442,7 @@ u32 ath_calcrxfilter(struct ath_softc *s
32 if (conf_is_ht(&sc->hw->conf))
33 rfilt |= ATH9K_RX_FILTER_COMP_BAR;
34
35 - if (sc->sec_wiphy || (sc->nvifs > 1) ||
36 - (sc->rx.rxfilter & FIF_OTHER_BSS)) {
37 + if (sc->nvifs > 1 || (sc->rx.rxfilter & FIF_OTHER_BSS)) {
38 /* The following may also be needed for other older chips */
39 if (sc->sc_ah->hw_version.macVersion == AR_SREV_VERSION_9160)
40 rfilt |= ATH9K_RX_FILTER_PROM;
41 @@ -668,37 +646,6 @@ static void ath_rx_ps(struct ath_softc *
42 }
43 }
44
45 -static void ath_rx_send_to_mac80211(struct ieee80211_hw *hw,
46 - struct ath_softc *sc, struct sk_buff *skb)
47 -{
48 - struct ieee80211_hdr *hdr;
49 -
50 - hdr = (struct ieee80211_hdr *)skb->data;
51 -
52 - /* Send the frame to mac80211 */
53 - if (is_multicast_ether_addr(hdr->addr1)) {
54 - int i;
55 - /*
56 - * Deliver broadcast/multicast frames to all suitable
57 - * virtual wiphys.
58 - */
59 - /* TODO: filter based on channel configuration */
60 - for (i = 0; i < sc->num_sec_wiphy; i++) {
61 - struct ath_wiphy *aphy = sc->sec_wiphy[i];
62 - struct sk_buff *nskb;
63 - if (aphy == NULL)
64 - continue;
65 - nskb = skb_copy(skb, GFP_ATOMIC);
66 - if (!nskb)
67 - continue;
68 - ieee80211_rx(aphy->hw, nskb);
69 - }
70 - ieee80211_rx(sc->hw, skb);
71 - } else
72 - /* Deliver unicast frames based on receiver address */
73 - ieee80211_rx(hw, skb);
74 -}
75 -
76 static bool ath_edma_get_buffers(struct ath_softc *sc,
77 enum ath9k_rx_qtype qtype)
78 {
79 @@ -1644,7 +1591,7 @@ int ath_rx_tasklet(struct ath_softc *sc,
80 * virtual wiphy so to account for that we iterate over the active
81 * wiphys and find the appropriate wiphy and therefore hw.
82 */
83 - struct ieee80211_hw *hw = NULL;
84 + struct ieee80211_hw *hw = sc->hw;
85 struct ieee80211_hdr *hdr;
86 int retval;
87 bool decrypt_error = false;
88 @@ -1689,8 +1636,6 @@ int ath_rx_tasklet(struct ath_softc *sc,
89 hdr = (struct ieee80211_hdr *) (skb->data + rx_status_len);
90 rxs = IEEE80211_SKB_RXCB(skb);
91
92 - hw = ath_get_virt_hw(sc, hdr);
93 -
94 ath_debug_stat_rx(sc, &rs);
95
96 /*
97 @@ -1748,7 +1693,7 @@ int ath_rx_tasklet(struct ath_softc *sc,
98 bf->bf_mpdu = NULL;
99 bf->bf_buf_addr = 0;
100 ath_err(common, "dma_mapping_error() on RX\n");
101 - ath_rx_send_to_mac80211(hw, sc, skb);
102 + ieee80211_rx(hw, skb);
103 break;
104 }
105
106 @@ -1775,7 +1720,7 @@ int ath_rx_tasklet(struct ath_softc *sc,
107 if (ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
108 ath_ant_comb_scan(sc, &rs);
109
110 - ath_rx_send_to_mac80211(hw, sc, skb);
111 + ieee80211_rx(hw, skb);
112
113 requeue:
114 if (edma) {
115 --- a/drivers/net/wireless/ath/ath9k/main.c
116 +++ b/drivers/net/wireless/ath/ath9k/main.c
117 @@ -1076,29 +1076,7 @@ static int ath9k_start(struct ieee80211_
118
119 mutex_lock(&sc->mutex);
120
121 - if (ath9k_wiphy_started(sc)) {
122 - if (sc->chan_idx == curchan->hw_value) {
123 - /*
124 - * Already on the operational channel, the new wiphy
125 - * can be marked active.
126 - */
127 - aphy->state = ATH_WIPHY_ACTIVE;
128 - ieee80211_wake_queues(hw);
129 - } else {
130 - /*
131 - * Another wiphy is on another channel, start the new
132 - * wiphy in paused state.
133 - */
134 - aphy->state = ATH_WIPHY_PAUSED;
135 - ieee80211_stop_queues(hw);
136 - }
137 - mutex_unlock(&sc->mutex);
138 - return 0;
139 - }
140 - aphy->state = ATH_WIPHY_ACTIVE;
141 -
142 /* setup initial channel */
143 -
144 sc->chan_idx = curchan->hw_value;
145
146 init_channel = ath_get_curchannel(sc, hw);
147 @@ -1208,13 +1186,6 @@ static int ath9k_tx(struct ieee80211_hw
148 struct ath_tx_control txctl;
149 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
150
151 - if (aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN) {
152 - ath_dbg(common, ATH_DBG_XMIT,
153 - "ath9k: %s: TX in unexpected wiphy state %d\n",
154 - wiphy_name(hw->wiphy), aphy->state);
155 - goto exit;
156 - }
157 -
158 if (sc->ps_enabled) {
159 /*
160 * mac80211 does not set PM field for normal data frames, so we
161 @@ -1277,37 +1248,19 @@ static void ath9k_stop(struct ieee80211_
162 struct ath_softc *sc = aphy->sc;
163 struct ath_hw *ah = sc->sc_ah;
164 struct ath_common *common = ath9k_hw_common(ah);
165 - int i;
166
167 mutex_lock(&sc->mutex);
168
169 - aphy->state = ATH_WIPHY_INACTIVE;
170 -
171 cancel_delayed_work_sync(&sc->tx_complete_work);
172 cancel_work_sync(&sc->paprd_work);
173 cancel_work_sync(&sc->hw_check_work);
174
175 - for (i = 0; i < sc->num_sec_wiphy; i++) {
176 - if (sc->sec_wiphy[i])
177 - break;
178 - }
179 -
180 - if (i == sc->num_sec_wiphy) {
181 - cancel_delayed_work_sync(&sc->wiphy_work);
182 - cancel_work_sync(&sc->chan_work);
183 - }
184 -
185 if (sc->sc_flags & SC_OP_INVALID) {
186 ath_dbg(common, ATH_DBG_ANY, "Device not present\n");
187 mutex_unlock(&sc->mutex);
188 return;
189 }
190
191 - if (ath9k_wiphy_started(sc)) {
192 - mutex_unlock(&sc->mutex);
193 - return; /* another wiphy still in use */
194 - }
195 -
196 /* Ensure HW is awake when we try to shut it down. */
197 ath9k_ps_wakeup(sc);
198
199 @@ -1339,7 +1292,6 @@ static void ath9k_stop(struct ieee80211_
200 ath9k_ps_restore(sc);
201
202 sc->ps_idle = true;
203 - ath9k_set_wiphy_idle(aphy, true);
204 ath_radio_disable(sc, hw);
205
206 sc->sc_flags |= SC_OP_INVALID;
207 @@ -1429,7 +1381,6 @@ void ath9k_calculate_iter_data(struct ie
208 struct ath_softc *sc = aphy->sc;
209 struct ath_hw *ah = sc->sc_ah;
210 struct ath_common *common = ath9k_hw_common(ah);
211 - int i;
212
213 /*
214 * Use the hardware MAC address as reference, the hardware uses it
215 @@ -1443,16 +1394,8 @@ void ath9k_calculate_iter_data(struct ie
216 ath9k_vif_iter(iter_data, vif->addr, vif);
217
218 /* Get list of all active MAC addresses */
219 - spin_lock_bh(&sc->wiphy_lock);
220 ieee80211_iterate_active_interfaces_atomic(sc->hw, ath9k_vif_iter,
221 iter_data);
222 - for (i = 0; i < sc->num_sec_wiphy; i++) {
223 - if (sc->sec_wiphy[i] == NULL)
224 - continue;
225 - ieee80211_iterate_active_interfaces_atomic(
226 - sc->sec_wiphy[i]->hw, ath9k_vif_iter, iter_data);
227 - }
228 - spin_unlock_bh(&sc->wiphy_lock);
229 }
230
231 /* Called with sc->mutex held. */
232 @@ -1706,7 +1649,7 @@ static int ath9k_config(struct ieee80211
233 struct ath_hw *ah = sc->sc_ah;
234 struct ath_common *common = ath9k_hw_common(ah);
235 struct ieee80211_conf *conf = &hw->conf;
236 - bool disable_radio;
237 + bool disable_radio = false;
238
239 mutex_lock(&sc->mutex);
240
241 @@ -1717,29 +1660,13 @@ static int ath9k_config(struct ieee80211
242 * the end.
243 */
244 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
245 - bool enable_radio;
246 - bool all_wiphys_idle;
247 - bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
248 -
249 - spin_lock_bh(&sc->wiphy_lock);
250 - all_wiphys_idle = ath9k_all_wiphys_idle(sc);
251 - ath9k_set_wiphy_idle(aphy, idle);
252 -
253 - enable_radio = (!idle && all_wiphys_idle);
254 -
255 - /*
256 - * After we unlock here its possible another wiphy
257 - * can be re-renabled so to account for that we will
258 - * only disable the radio toward the end of this routine
259 - * if by then all wiphys are still idle.
260 - */
261 - spin_unlock_bh(&sc->wiphy_lock);
262 -
263 - if (enable_radio) {
264 - sc->ps_idle = false;
265 + sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
266 + if (!sc->ps_idle) {
267 ath_radio_enable(sc, hw);
268 ath_dbg(common, ATH_DBG_CONFIG,
269 "not-idle: enabling radio\n");
270 + } else {
271 + disable_radio = true;
272 }
273 }
274
275 @@ -1780,24 +1707,11 @@ static int ath9k_config(struct ieee80211
276 if (ah->curchan)
277 old_pos = ah->curchan - &ah->channels[0];
278
279 - aphy->chan_idx = pos;
280 - aphy->chan_is_ht = conf_is_ht(conf);
281 if (hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
282 sc->sc_flags |= SC_OP_OFFCHANNEL;
283 else
284 sc->sc_flags &= ~SC_OP_OFFCHANNEL;
285
286 - if (aphy->state == ATH_WIPHY_SCAN ||
287 - aphy->state == ATH_WIPHY_ACTIVE)
288 - ath9k_wiphy_pause_all_forced(sc, aphy);
289 - else {
290 - /*
291 - * Do not change operational channel based on a paused
292 - * wiphy changes.
293 - */
294 - goto skip_chan_change;
295 - }
296 -
297 ath_dbg(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
298 curchan->center_freq);
299
300 @@ -1844,19 +1758,13 @@ static int ath9k_config(struct ieee80211
301 ath_update_survey_nf(sc, old_pos);
302 }
303
304 -skip_chan_change:
305 if (changed & IEEE80211_CONF_CHANGE_POWER) {
306 sc->config.txpowlimit = 2 * conf->power_level;
307 ath_update_txpow(sc);
308 }
309
310 - spin_lock_bh(&sc->wiphy_lock);
311 - disable_radio = ath9k_all_wiphys_idle(sc);
312 - spin_unlock_bh(&sc->wiphy_lock);
313 -
314 if (disable_radio) {
315 ath_dbg(common, ATH_DBG_CONFIG, "idle: disabling radio\n");
316 - sc->ps_idle = true;
317 ath_radio_disable(sc, hw);
318 }
319
320 @@ -2247,43 +2155,6 @@ static int ath9k_get_survey(struct ieee8
321 return 0;
322 }
323
324 -static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
325 -{
326 - struct ath_wiphy *aphy = hw->priv;
327 - struct ath_softc *sc = aphy->sc;
328 -
329 - mutex_lock(&sc->mutex);
330 - if (ath9k_wiphy_scanning(sc)) {
331 - /*
332 - * There is a race here in mac80211 but fixing it requires
333 - * we revisit how we handle the scan complete callback.
334 - * After mac80211 fixes we will not have configured hardware
335 - * to the home channel nor would we have configured the RX
336 - * filter yet.
337 - */
338 - mutex_unlock(&sc->mutex);
339 - return;
340 - }
341 -
342 - aphy->state = ATH_WIPHY_SCAN;
343 - ath9k_wiphy_pause_all_forced(sc, aphy);
344 - mutex_unlock(&sc->mutex);
345 -}
346 -
347 -/*
348 - * XXX: this requires a revisit after the driver
349 - * scan_complete gets moved to another place/removed in mac80211.
350 - */
351 -static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
352 -{
353 - struct ath_wiphy *aphy = hw->priv;
354 - struct ath_softc *sc = aphy->sc;
355 -
356 - mutex_lock(&sc->mutex);
357 - aphy->state = ATH_WIPHY_ACTIVE;
358 - mutex_unlock(&sc->mutex);
359 -}
360 -
361 static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)
362 {
363 struct ath_wiphy *aphy = hw->priv;
364 @@ -2315,8 +2186,6 @@ struct ieee80211_ops ath9k_ops = {
365 .reset_tsf = ath9k_reset_tsf,
366 .ampdu_action = ath9k_ampdu_action,
367 .get_survey = ath9k_get_survey,
368 - .sw_scan_start = ath9k_sw_scan_start,
369 - .sw_scan_complete = ath9k_sw_scan_complete,
370 .rfkill_poll = ath9k_rfkill_poll_state,
371 .set_coverage_class = ath9k_set_coverage_class,
372 };
373 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
374 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
375 @@ -381,7 +381,6 @@ struct ath_beacon {
376 u32 ast_be_xmit;
377 u64 bc_tstamp;
378 struct ieee80211_vif *bslot[ATH_BCBUF];
379 - struct ath_wiphy *bslot_aphy[ATH_BCBUF];
380 int slottime;
381 int slotupdate;
382 struct ath9k_tx_queue_info beacon_qi;
383 @@ -572,20 +571,8 @@ struct ath_softc {
384 struct ieee80211_hw *hw;
385 struct device *dev;
386
387 - spinlock_t wiphy_lock; /* spinlock to protect ath_wiphy data */
388 - struct ath_wiphy *pri_wiphy;
389 - struct ath_wiphy **sec_wiphy; /* secondary wiphys (virtual radios); may
390 - * have NULL entries */
391 - int num_sec_wiphy; /* number of sec_wiphy pointers in the array */
392 int chan_idx;
393 int chan_is_ht;
394 - struct ath_wiphy *next_wiphy;
395 - struct work_struct chan_work;
396 - int wiphy_select_failures;
397 - unsigned long wiphy_select_first_fail;
398 - struct delayed_work wiphy_work;
399 - unsigned long wiphy_scheduler_int;
400 - int wiphy_scheduler_index;
401 struct survey_info *cur_survey;
402 struct survey_info survey[ATH9K_NUM_CHANNELS];
403
404 @@ -645,16 +632,6 @@ struct ath_wiphy {
405 struct ath_softc *sc; /* shared for all virtual wiphys */
406 struct ieee80211_hw *hw;
407 struct ath9k_hw_cal_data caldata;
408 - enum ath_wiphy_state {
409 - ATH_WIPHY_INACTIVE,
410 - ATH_WIPHY_ACTIVE,
411 - ATH_WIPHY_PAUSING,
412 - ATH_WIPHY_PAUSED,
413 - ATH_WIPHY_SCAN,
414 - } state;
415 - bool idle;
416 - int chan_idx;
417 - int chan_is_ht;
418 int last_rssi;
419 };
420
421 @@ -711,24 +688,6 @@ void ath9k_ps_restore(struct ath_softc *
422 u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate);
423
424 void ath9k_set_bssid_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
425 -int ath9k_wiphy_add(struct ath_softc *sc);
426 -int ath9k_wiphy_del(struct ath_wiphy *aphy);
427 -void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, int ftype);
428 -int ath9k_wiphy_pause(struct ath_wiphy *aphy);
429 -int ath9k_wiphy_unpause(struct ath_wiphy *aphy);
430 -int ath9k_wiphy_select(struct ath_wiphy *aphy);
431 -void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int);
432 -void ath9k_wiphy_chan_work(struct work_struct *work);
433 -bool ath9k_wiphy_started(struct ath_softc *sc);
434 -void ath9k_wiphy_pause_all_forced(struct ath_softc *sc,
435 - struct ath_wiphy *selected);
436 -bool ath9k_wiphy_scanning(struct ath_softc *sc);
437 -void ath9k_wiphy_work(struct work_struct *work);
438 -bool ath9k_all_wiphys_idle(struct ath_softc *sc);
439 -void ath9k_set_wiphy_idle(struct ath_wiphy *aphy, bool idle);
440 -
441 -void ath_mac80211_stop_queue(struct ath_softc *sc, u16 skb_queue);
442 -bool ath_mac80211_start_queue(struct ath_softc *sc, u16 skb_queue);
443
444 void ath_start_rfkill_poll(struct ath_softc *sc);
445 extern void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
446 --- a/drivers/net/wireless/ath/ath9k/virtual.c
447 +++ /dev/null
448 @@ -1,669 +0,0 @@
449 -/*
450 - * Copyright (c) 2008-2009 Atheros Communications Inc.
451 - *
452 - * Permission to use, copy, modify, and/or distribute this software for any
453 - * purpose with or without fee is hereby granted, provided that the above
454 - * copyright notice and this permission notice appear in all copies.
455 - *
456 - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
457 - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
458 - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
459 - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
460 - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
461 - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
462 - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
463 - */
464 -
465 -#include <linux/slab.h>
466 -
467 -#include "ath9k.h"
468 -
469 -int ath9k_wiphy_add(struct ath_softc *sc)
470 -{
471 - int i, error;
472 - struct ath_wiphy *aphy;
473 - struct ath_common *common = ath9k_hw_common(sc->sc_ah);
474 - struct ieee80211_hw *hw;
475 - u8 addr[ETH_ALEN];
476 -
477 - hw = ieee80211_alloc_hw(sizeof(struct ath_wiphy), &ath9k_ops);
478 - if (hw == NULL)
479 - return -ENOMEM;
480 -
481 - spin_lock_bh(&sc->wiphy_lock);
482 - for (i = 0; i < sc->num_sec_wiphy; i++) {
483 - if (sc->sec_wiphy[i] == NULL)
484 - break;
485 - }
486 -
487 - if (i == sc->num_sec_wiphy) {
488 - /* No empty slot available; increase array length */
489 - struct ath_wiphy **n;
490 - n = krealloc(sc->sec_wiphy,
491 - (sc->num_sec_wiphy + 1) *
492 - sizeof(struct ath_wiphy *),
493 - GFP_ATOMIC);
494 - if (n == NULL) {
495 - spin_unlock_bh(&sc->wiphy_lock);
496 - ieee80211_free_hw(hw);
497 - return -ENOMEM;
498 - }
499 - n[i] = NULL;
500 - sc->sec_wiphy = n;
501 - sc->num_sec_wiphy++;
502 - }
503 -
504 - SET_IEEE80211_DEV(hw, sc->dev);
505 -
506 - aphy = hw->priv;
507 - aphy->sc = sc;
508 - aphy->hw = hw;
509 - sc->sec_wiphy[i] = aphy;
510 - aphy->last_rssi = ATH_RSSI_DUMMY_MARKER;
511 - spin_unlock_bh(&sc->wiphy_lock);
512 -
513 - memcpy(addr, common->macaddr, ETH_ALEN);
514 - addr[0] |= 0x02; /* Locally managed address */
515 - /*
516 - * XOR virtual wiphy index into the least significant bits to generate
517 - * a different MAC address for each virtual wiphy.
518 - */
519 - addr[5] ^= i & 0xff;
520 - addr[4] ^= (i & 0xff00) >> 8;
521 - addr[3] ^= (i & 0xff0000) >> 16;
522 -
523 - SET_IEEE80211_PERM_ADDR(hw, addr);
524 -
525 - ath9k_set_hw_capab(sc, hw);
526 -
527 - error = ieee80211_register_hw(hw);
528 -
529 - if (error == 0) {
530 - /* Make sure wiphy scheduler is started (if enabled) */
531 - ath9k_wiphy_set_scheduler(sc, sc->wiphy_scheduler_int);
532 - }
533 -
534 - return error;
535 -}
536 -
537 -int ath9k_wiphy_del(struct ath_wiphy *aphy)
538 -{
539 - struct ath_softc *sc = aphy->sc;
540 - int i;
541 -
542 - spin_lock_bh(&sc->wiphy_lock);
543 - for (i = 0; i < sc->num_sec_wiphy; i++) {
544 - if (aphy == sc->sec_wiphy[i]) {
545 - sc->sec_wiphy[i] = NULL;
546 - spin_unlock_bh(&sc->wiphy_lock);
547 - ieee80211_unregister_hw(aphy->hw);
548 - ieee80211_free_hw(aphy->hw);
549 - return 0;
550 - }
551 - }
552 - spin_unlock_bh(&sc->wiphy_lock);
553 - return -ENOENT;
554 -}
555 -
556 -static int ath9k_send_nullfunc(struct ath_wiphy *aphy,
557 - struct ieee80211_vif *vif, const u8 *bssid,
558 - int ps)
559 -{
560 - struct ath_softc *sc = aphy->sc;
561 - struct ath_tx_control txctl;
562 - struct sk_buff *skb;
563 - struct ieee80211_hdr *hdr;
564 - __le16 fc;
565 - struct ieee80211_tx_info *info;
566 -
567 - skb = dev_alloc_skb(24);
568 - if (skb == NULL)
569 - return -ENOMEM;
570 - hdr = (struct ieee80211_hdr *) skb_put(skb, 24);
571 - memset(hdr, 0, 24);
572 - fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC |
573 - IEEE80211_FCTL_TODS);
574 - if (ps)
575 - fc |= cpu_to_le16(IEEE80211_FCTL_PM);
576 - hdr->frame_control = fc;
577 - memcpy(hdr->addr1, bssid, ETH_ALEN);
578 - memcpy(hdr->addr2, aphy->hw->wiphy->perm_addr, ETH_ALEN);
579 - memcpy(hdr->addr3, bssid, ETH_ALEN);
580 -
581 - info = IEEE80211_SKB_CB(skb);
582 - memset(info, 0, sizeof(*info));
583 - info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS;
584 - info->control.vif = vif;
585 - info->control.rates[0].idx = 0;
586 - info->control.rates[0].count = 4;
587 - info->control.rates[1].idx = -1;
588 -
589 - memset(&txctl, 0, sizeof(struct ath_tx_control));
590 - txctl.txq = sc->tx.txq_map[WME_AC_VO];
591 - txctl.frame_type = ps ? ATH9K_IFT_PAUSE : ATH9K_IFT_UNPAUSE;
592 -
593 - if (ath_tx_start(aphy->hw, skb, &txctl) != 0)
594 - goto exit;
595 -
596 - return 0;
597 -exit:
598 - dev_kfree_skb_any(skb);
599 - return -1;
600 -}
601 -
602 -static bool __ath9k_wiphy_pausing(struct ath_softc *sc)
603 -{
604 - int i;
605 - if (sc->pri_wiphy->state == ATH_WIPHY_PAUSING)
606 - return true;
607 - for (i = 0; i < sc->num_sec_wiphy; i++) {
608 - if (sc->sec_wiphy[i] &&
609 - sc->sec_wiphy[i]->state == ATH_WIPHY_PAUSING)
610 - return true;
611 - }
612 - return false;
613 -}
614 -
615 -static bool ath9k_wiphy_pausing(struct ath_softc *sc)
616 -{
617 - bool ret;
618 - spin_lock_bh(&sc->wiphy_lock);
619 - ret = __ath9k_wiphy_pausing(sc);
620 - spin_unlock_bh(&sc->wiphy_lock);
621 - return ret;
622 -}
623 -
624 -static bool __ath9k_wiphy_scanning(struct ath_softc *sc)
625 -{
626 - int i;
627 - if (sc->pri_wiphy->state == ATH_WIPHY_SCAN)
628 - return true;
629 - for (i = 0; i < sc->num_sec_wiphy; i++) {
630 - if (sc->sec_wiphy[i] &&
631 - sc->sec_wiphy[i]->state == ATH_WIPHY_SCAN)
632 - return true;
633 - }
634 - return false;
635 -}
636 -
637 -bool ath9k_wiphy_scanning(struct ath_softc *sc)
638 -{
639 - bool ret;
640 - spin_lock_bh(&sc->wiphy_lock);
641 - ret = __ath9k_wiphy_scanning(sc);
642 - spin_unlock_bh(&sc->wiphy_lock);
643 - return ret;
644 -}
645 -
646 -static int __ath9k_wiphy_unpause(struct ath_wiphy *aphy);
647 -
648 -/* caller must hold wiphy_lock */
649 -static void __ath9k_wiphy_unpause_ch(struct ath_wiphy *aphy)
650 -{
651 - if (aphy == NULL)
652 - return;
653 - if (aphy->chan_idx != aphy->sc->chan_idx)
654 - return; /* wiphy not on the selected channel */
655 - __ath9k_wiphy_unpause(aphy);
656 -}
657 -
658 -static void ath9k_wiphy_unpause_channel(struct ath_softc *sc)
659 -{
660 - int i;
661 - spin_lock_bh(&sc->wiphy_lock);
662 - __ath9k_wiphy_unpause_ch(sc->pri_wiphy);
663 - for (i = 0; i < sc->num_sec_wiphy; i++)
664 - __ath9k_wiphy_unpause_ch(sc->sec_wiphy[i]);
665 - spin_unlock_bh(&sc->wiphy_lock);
666 -}
667 -
668 -void ath9k_wiphy_chan_work(struct work_struct *work)
669 -{
670 - struct ath_softc *sc = container_of(work, struct ath_softc, chan_work);
671 - struct ath_common *common = ath9k_hw_common(sc->sc_ah);
672 - struct ath_wiphy *aphy = sc->next_wiphy;
673 -
674 - if (aphy == NULL)
675 - return;
676 -
677 - /*
678 - * All pending interfaces paused; ready to change
679 - * channels.
680 - */
681 -
682 - /* Change channels */
683 - mutex_lock(&sc->mutex);
684 - /* XXX: remove me eventually */
685 - ath9k_update_ichannel(sc, aphy->hw,
686 - &sc->sc_ah->channels[sc->chan_idx]);
687 -
688 - /* sync hw configuration for hw code */
689 - common->hw = aphy->hw;
690 -
691 - if (ath_set_channel(sc, aphy->hw,
692 - &sc->sc_ah->channels[sc->chan_idx]) < 0) {
693 - printk(KERN_DEBUG "ath9k: Failed to set channel for new "
694 - "virtual wiphy\n");
695 - mutex_unlock(&sc->mutex);
696 - return;
697 - }
698 - mutex_unlock(&sc->mutex);
699 -
700 - ath9k_wiphy_unpause_channel(sc);
701 -}
702 -
703 -/*
704 - * ath9k version of ieee80211_tx_status() for TX frames that are generated
705 - * internally in the driver.
706 - */
707 -void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, int ftype)
708 -{
709 - struct ath_wiphy *aphy = hw->priv;
710 - struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
711 -
712 - if (ftype == ATH9K_IFT_PAUSE && aphy->state == ATH_WIPHY_PAUSING) {
713 - if (!(tx_info->flags & IEEE80211_TX_STAT_ACK)) {
714 - printk(KERN_DEBUG "ath9k: %s: no ACK for pause "
715 - "frame\n", wiphy_name(hw->wiphy));
716 - /*
717 - * The AP did not reply; ignore this to allow us to
718 - * continue.
719 - */
720 - }
721 - aphy->state = ATH_WIPHY_PAUSED;
722 - if (!ath9k_wiphy_pausing(aphy->sc)) {
723 - /*
724 - * Drop from tasklet to work to allow mutex for channel
725 - * change.
726 - */
727 - ieee80211_queue_work(aphy->sc->hw,
728 - &aphy->sc->chan_work);
729 - }
730 - }
731 -
732 - dev_kfree_skb(skb);
733 -}
734 -
735 -static void ath9k_mark_paused(struct ath_wiphy *aphy)
736 -{
737 - struct ath_softc *sc = aphy->sc;
738 - aphy->state = ATH_WIPHY_PAUSED;
739 - if (!__ath9k_wiphy_pausing(sc))
740 - ieee80211_queue_work(sc->hw, &sc->chan_work);
741 -}
742 -
743 -static void ath9k_pause_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
744 -{
745 - struct ath_wiphy *aphy = data;
746 - struct ath_vif *avp = (void *) vif->drv_priv;
747 -
748 - switch (vif->type) {
749 - case NL80211_IFTYPE_STATION:
750 - if (!vif->bss_conf.assoc) {
751 - ath9k_mark_paused(aphy);
752 - break;
753 - }
754 - /* TODO: could avoid this if already in PS mode */
755 - if (ath9k_send_nullfunc(aphy, vif, avp->bssid, 1)) {
756 - printk(KERN_DEBUG "%s: failed to send PS nullfunc\n",
757 - __func__);
758 - ath9k_mark_paused(aphy);
759 - }
760 - break;
761 - case NL80211_IFTYPE_AP:
762 - /* Beacon transmission is paused by aphy->state change */
763 - ath9k_mark_paused(aphy);
764 - break;
765 - default:
766 - break;
767 - }
768 -}
769 -
770 -/* caller must hold wiphy_lock */
771 -static int __ath9k_wiphy_pause(struct ath_wiphy *aphy)
772 -{
773 - ieee80211_stop_queues(aphy->hw);
774 - aphy->state = ATH_WIPHY_PAUSING;
775 - /*
776 - * TODO: handle PAUSING->PAUSED for the case where there are multiple
777 - * active vifs (now we do it on the first vif getting ready; should be
778 - * on the last)
779 - */
780 - ieee80211_iterate_active_interfaces_atomic(aphy->hw, ath9k_pause_iter,
781 - aphy);
782 - return 0;
783 -}
784 -
785 -int ath9k_wiphy_pause(struct ath_wiphy *aphy)
786 -{
787 - int ret;
788 - spin_lock_bh(&aphy->sc->wiphy_lock);
789 - ret = __ath9k_wiphy_pause(aphy);
790 - spin_unlock_bh(&aphy->sc->wiphy_lock);
791 - return ret;
792 -}
793 -
794 -static void ath9k_unpause_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
795 -{
796 - struct ath_wiphy *aphy = data;
797 - struct ath_vif *avp = (void *) vif->drv_priv;
798 -
799 - switch (vif->type) {
800 - case NL80211_IFTYPE_STATION:
801 - if (!vif->bss_conf.assoc)
802 - break;
803 - ath9k_send_nullfunc(aphy, vif, avp->bssid, 0);
804 - break;
805 - case NL80211_IFTYPE_AP:
806 - /* Beacon transmission is re-enabled by aphy->state change */
807 - break;
808 - default:
809 - break;
810 - }
811 -}
812 -
813 -/* caller must hold wiphy_lock */
814 -static int __ath9k_wiphy_unpause(struct ath_wiphy *aphy)
815 -{
816 - ieee80211_iterate_active_interfaces_atomic(aphy->hw,
817 - ath9k_unpause_iter, aphy);
818 - aphy->state = ATH_WIPHY_ACTIVE;
819 - ieee80211_wake_queues(aphy->hw);
820 - return 0;
821 -}
822 -
823 -int ath9k_wiphy_unpause(struct ath_wiphy *aphy)
824 -{
825 - int ret;
826 - spin_lock_bh(&aphy->sc->wiphy_lock);
827 - ret = __ath9k_wiphy_unpause(aphy);
828 - spin_unlock_bh(&aphy->sc->wiphy_lock);
829 - return ret;
830 -}
831 -
832 -static void __ath9k_wiphy_mark_all_paused(struct ath_softc *sc)
833 -{
834 - int i;
835 - if (sc->pri_wiphy->state != ATH_WIPHY_INACTIVE)
836 - sc->pri_wiphy->state = ATH_WIPHY_PAUSED;
837 - for (i = 0; i < sc->num_sec_wiphy; i++) {
838 - if (sc->sec_wiphy[i] &&
839 - sc->sec_wiphy[i]->state != ATH_WIPHY_INACTIVE)
840 - sc->sec_wiphy[i]->state = ATH_WIPHY_PAUSED;
841 - }
842 -}
843 -
844 -/* caller must hold wiphy_lock */
845 -static void __ath9k_wiphy_pause_all(struct ath_softc *sc)
846 -{
847 - int i;
848 - if (sc->pri_wiphy->state == ATH_WIPHY_ACTIVE)
849 - __ath9k_wiphy_pause(sc->pri_wiphy);
850 - for (i = 0; i < sc->num_sec_wiphy; i++) {
851 - if (sc->sec_wiphy[i] &&
852 - sc->sec_wiphy[i]->state == ATH_WIPHY_ACTIVE)
853 - __ath9k_wiphy_pause(sc->sec_wiphy[i]);
854 - }
855 -}
856 -
857 -int ath9k_wiphy_select(struct ath_wiphy *aphy)
858 -{
859 - struct ath_softc *sc = aphy->sc;
860 - bool now;
861 -
862 - spin_lock_bh(&sc->wiphy_lock);
863 - if (__ath9k_wiphy_scanning(sc)) {
864 - /*
865 - * For now, we are using mac80211 sw scan and it expects to
866 - * have full control over channel changes, so avoid wiphy
867 - * scheduling during a scan. This could be optimized if the
868 - * scanning control were moved into the driver.
869 - */
870 - spin_unlock_bh(&sc->wiphy_lock);
871 - return -EBUSY;
872 - }
873 - if (__ath9k_wiphy_pausing(sc)) {
874 - if (sc->wiphy_select_failures == 0)
875 - sc->wiphy_select_first_fail = jiffies;
876 - sc->wiphy_select_failures++;
877 - if (time_after(jiffies, sc->wiphy_select_first_fail + HZ / 2))
878 - {
879 - printk(KERN_DEBUG "ath9k: Previous wiphy select timed "
880 - "out; disable/enable hw to recover\n");
881 - __ath9k_wiphy_mark_all_paused(sc);
882 - /*
883 - * TODO: this workaround to fix hardware is unlikely to
884 - * be specific to virtual wiphy changes. It can happen
885 - * on normal channel change, too, and as such, this
886 - * should really be made more generic. For example,
887 - * tricker radio disable/enable on GTT interrupt burst
888 - * (say, 10 GTT interrupts received without any TX
889 - * frame being completed)
890 - */
891 - spin_unlock_bh(&sc->wiphy_lock);
892 - ath_radio_disable(sc, aphy->hw);
893 - ath_radio_enable(sc, aphy->hw);
894 - /* Only the primary wiphy hw is used for queuing work */
895 - ieee80211_queue_work(aphy->sc->hw,
896 - &aphy->sc->chan_work);
897 - return -EBUSY; /* previous select still in progress */
898 - }
899 - spin_unlock_bh(&sc->wiphy_lock);
900 - return -EBUSY; /* previous select still in progress */
901 - }
902 - sc->wiphy_select_failures = 0;
903 -
904 - /* Store the new channel */
905 - sc->chan_idx = aphy->chan_idx;
906 - sc->chan_is_ht = aphy->chan_is_ht;
907 - sc->next_wiphy = aphy;
908 -
909 - __ath9k_wiphy_pause_all(sc);
910 - now = !__ath9k_wiphy_pausing(aphy->sc);
911 - spin_unlock_bh(&sc->wiphy_lock);
912 -
913 - if (now) {
914 - /* Ready to request channel change immediately */
915 - ieee80211_queue_work(aphy->sc->hw, &aphy->sc->chan_work);
916 - }
917 -
918 - /*
919 - * wiphys will be unpaused in ath9k_tx_status() once channel has been
920 - * changed if any wiphy needs time to become paused.
921 - */
922 -
923 - return 0;
924 -}
925 -
926 -bool ath9k_wiphy_started(struct ath_softc *sc)
927 -{
928 - int i;
929 - spin_lock_bh(&sc->wiphy_lock);
930 - if (sc->pri_wiphy->state != ATH_WIPHY_INACTIVE) {
931 - spin_unlock_bh(&sc->wiphy_lock);
932 - return true;
933 - }
934 - for (i = 0; i < sc->num_sec_wiphy; i++) {
935 - if (sc->sec_wiphy[i] &&
936 - sc->sec_wiphy[i]->state != ATH_WIPHY_INACTIVE) {
937 - spin_unlock_bh(&sc->wiphy_lock);
938 - return true;
939 - }
940 - }
941 - spin_unlock_bh(&sc->wiphy_lock);
942 - return false;
943 -}
944 -
945 -static void ath9k_wiphy_pause_chan(struct ath_wiphy *aphy,
946 - struct ath_wiphy *selected)
947 -{
948 - if (selected->state == ATH_WIPHY_SCAN) {
949 - if (aphy == selected)
950 - return;
951 - /*
952 - * Pause all other wiphys for the duration of the scan even if
953 - * they are on the current channel now.
954 - */
955 - } else if (aphy->chan_idx == selected->chan_idx)
956 - return;
957 - aphy->state = ATH_WIPHY_PAUSED;
958 - ieee80211_stop_queues(aphy->hw);
959 -}
960 -
961 -void ath9k_wiphy_pause_all_forced(struct ath_softc *sc,
962 - struct ath_wiphy *selected)
963 -{
964 - int i;
965 - spin_lock_bh(&sc->wiphy_lock);
966 - if (sc->pri_wiphy->state == ATH_WIPHY_ACTIVE)
967 - ath9k_wiphy_pause_chan(sc->pri_wiphy, selected);
968 - for (i = 0; i < sc->num_sec_wiphy; i++) {
969 - if (sc->sec_wiphy[i] &&
970 - sc->sec_wiphy[i]->state == ATH_WIPHY_ACTIVE)
971 - ath9k_wiphy_pause_chan(sc->sec_wiphy[i], selected);
972 - }
973 - spin_unlock_bh(&sc->wiphy_lock);
974 -}
975 -
976 -void ath9k_wiphy_work(struct work_struct *work)
977 -{
978 - struct ath_softc *sc = container_of(work, struct ath_softc,
979 - wiphy_work.work);
980 - struct ath_wiphy *aphy = NULL;
981 - bool first = true;
982 -
983 - spin_lock_bh(&sc->wiphy_lock);
984 -
985 - if (sc->wiphy_scheduler_int == 0) {
986 - /* wiphy scheduler is disabled */
987 - spin_unlock_bh(&sc->wiphy_lock);
988 - return;
989 - }
990 -
991 -try_again:
992 - sc->wiphy_scheduler_index++;
993 - while (sc->wiphy_scheduler_index <= sc->num_sec_wiphy) {
994 - aphy = sc->sec_wiphy[sc->wiphy_scheduler_index - 1];
995 - if (aphy && aphy->state != ATH_WIPHY_INACTIVE)
996 - break;
997 -
998 - sc->wiphy_scheduler_index++;
999 - aphy = NULL;
1000 - }
1001 - if (aphy == NULL) {
1002 - sc->wiphy_scheduler_index = 0;
1003 - if (sc->pri_wiphy->state == ATH_WIPHY_INACTIVE) {
1004 - if (first) {
1005 - first = false;
1006 - goto try_again;
1007 - }
1008 - /* No wiphy is ready to be scheduled */
1009 - } else
1010 - aphy = sc->pri_wiphy;
1011 - }
1012 -
1013 - spin_unlock_bh(&sc->wiphy_lock);
1014 -
1015 - if (aphy &&
1016 - aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN &&
1017 - ath9k_wiphy_select(aphy)) {
1018 - printk(KERN_DEBUG "ath9k: Failed to schedule virtual wiphy "
1019 - "change\n");
1020 - }
1021 -
1022 - ieee80211_queue_delayed_work(sc->hw,
1023 - &sc->wiphy_work,
1024 - sc->wiphy_scheduler_int);
1025 -}
1026 -
1027 -void ath9k_wiphy_set_scheduler(struct ath_softc *sc, unsigned int msec_int)
1028 -{
1029 - cancel_delayed_work_sync(&sc->wiphy_work);
1030 - sc->wiphy_scheduler_int = msecs_to_jiffies(msec_int);
1031 - if (sc->wiphy_scheduler_int)
1032 - ieee80211_queue_delayed_work(sc->hw, &sc->wiphy_work,
1033 - sc->wiphy_scheduler_int);
1034 -}
1035 -
1036 -/* caller must hold wiphy_lock */
1037 -bool ath9k_all_wiphys_idle(struct ath_softc *sc)
1038 -{
1039 - unsigned int i;
1040 - if (!sc->pri_wiphy->idle)
1041 - return false;
1042 - for (i = 0; i < sc->num_sec_wiphy; i++) {
1043 - struct ath_wiphy *aphy = sc->sec_wiphy[i];
1044 - if (!aphy)
1045 - continue;
1046 - if (!aphy->idle)
1047 - return false;
1048 - }
1049 - return true;
1050 -}
1051 -
1052 -/* caller must hold wiphy_lock */
1053 -void ath9k_set_wiphy_idle(struct ath_wiphy *aphy, bool idle)
1054 -{
1055 - struct ath_softc *sc = aphy->sc;
1056 -
1057 - aphy->idle = idle;
1058 - ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
1059 - "Marking %s as %sidle\n",
1060 - wiphy_name(aphy->hw->wiphy), idle ? "" : "not-");
1061 -}
1062 -/* Only bother starting a queue on an active virtual wiphy */
1063 -bool ath_mac80211_start_queue(struct ath_softc *sc, u16 skb_queue)
1064 -{
1065 - struct ieee80211_hw *hw = sc->pri_wiphy->hw;
1066 - unsigned int i;
1067 - bool txq_started = false;
1068 -
1069 - spin_lock_bh(&sc->wiphy_lock);
1070 -
1071 - /* Start the primary wiphy */
1072 - if (sc->pri_wiphy->state == ATH_WIPHY_ACTIVE) {
1073 - ieee80211_wake_queue(hw, skb_queue);
1074 - txq_started = true;
1075 - goto unlock;
1076 - }
1077 -
1078 - /* Now start the secondary wiphy queues */
1079 - for (i = 0; i < sc->num_sec_wiphy; i++) {
1080 - struct ath_wiphy *aphy = sc->sec_wiphy[i];
1081 - if (!aphy)
1082 - continue;
1083 - if (aphy->state != ATH_WIPHY_ACTIVE)
1084 - continue;
1085 -
1086 - hw = aphy->hw;
1087 - ieee80211_wake_queue(hw, skb_queue);
1088 - txq_started = true;
1089 - break;
1090 - }
1091 -
1092 -unlock:
1093 - spin_unlock_bh(&sc->wiphy_lock);
1094 - return txq_started;
1095 -}
1096 -
1097 -/* Go ahead and propagate information to all virtual wiphys, it won't hurt */
1098 -void ath_mac80211_stop_queue(struct ath_softc *sc, u16 skb_queue)
1099 -{
1100 - struct ieee80211_hw *hw = sc->pri_wiphy->hw;
1101 - unsigned int i;
1102 -
1103 - spin_lock_bh(&sc->wiphy_lock);
1104 -
1105 - /* Stop the primary wiphy */
1106 - ieee80211_stop_queue(hw, skb_queue);
1107 -
1108 - /* Now stop the secondary wiphy queues */
1109 - for (i = 0; i < sc->num_sec_wiphy; i++) {
1110 - struct ath_wiphy *aphy = sc->sec_wiphy[i];
1111 - if (!aphy)
1112 - continue;
1113 - hw = aphy->hw;
1114 - ieee80211_stop_queue(hw, skb_queue);
1115 - }
1116 - spin_unlock_bh(&sc->wiphy_lock);
1117 -}
1118 --- a/drivers/net/wireless/ath/ath9k/xmit.c
1119 +++ b/drivers/net/wireless/ath/ath9k/xmit.c
1120 @@ -1816,7 +1816,7 @@ int ath_tx_start(struct ieee80211_hw *hw
1121 spin_lock_bh(&txq->axq_lock);
1122 if (txq == sc->tx.txq_map[q] &&
1123 ++txq->pending_frames > ATH_MAX_QDEPTH && !txq->stopped) {
1124 - ath_mac80211_stop_queue(sc, q);
1125 + ieee80211_stop_queue(sc->hw, q);
1126 txq->stopped = 1;
1127 }
1128 spin_unlock_bh(&txq->axq_lock);
1129 @@ -1874,24 +1874,20 @@ static void ath_tx_complete(struct ath_s
1130 PS_WAIT_FOR_TX_ACK));
1131 }
1132
1133 - if (unlikely(ftype))
1134 - ath9k_tx_status(hw, skb, ftype);
1135 - else {
1136 - q = skb_get_queue_mapping(skb);
1137 - if (txq == sc->tx.txq_map[q]) {
1138 - spin_lock_bh(&txq->axq_lock);
1139 - if (WARN_ON(--txq->pending_frames < 0))
1140 - txq->pending_frames = 0;
1141 + q = skb_get_queue_mapping(skb);
1142 + if (txq == sc->tx.txq_map[q]) {
1143 + spin_lock_bh(&txq->axq_lock);
1144 + if (WARN_ON(--txq->pending_frames < 0))
1145 + txq->pending_frames = 0;
1146
1147 - if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) {
1148 - if (ath_mac80211_start_queue(sc, q))
1149 - txq->stopped = 0;
1150 - }
1151 - spin_unlock_bh(&txq->axq_lock);
1152 + if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) {
1153 + ieee80211_wake_queue(sc->hw, q);
1154 + txq->stopped = 0;
1155 }
1156 -
1157 - ieee80211_tx_status(hw, skb);
1158 + spin_unlock_bh(&txq->axq_lock);
1159 }
1160 +
1161 + ieee80211_tx_status(hw, skb);
1162 }
1163
1164 static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
1165 --- a/drivers/net/wireless/ath/ath9k/Makefile
1166 +++ b/drivers/net/wireless/ath/ath9k/Makefile
1167 @@ -4,7 +4,6 @@ ath9k-y += beacon.o \
1168 main.o \
1169 recv.o \
1170 xmit.o \
1171 - virtual.o \
1172
1173 ath9k-$(CONFIG_ATH9K_RATE_CONTROL) += rc.o
1174 ath9k-$(CONFIG_PCI) += pci.o
1175 --- a/drivers/net/wireless/ath/ath9k/init.c
1176 +++ b/drivers/net/wireless/ath/ath9k/init.c
1177 @@ -532,10 +532,8 @@ static void ath9k_init_misc(struct ath_s
1178
1179 sc->beacon.slottime = ATH9K_SLOT_TIME_9;
1180
1181 - for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
1182 + for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++)
1183 sc->beacon.bslot[i] = NULL;
1184 - sc->beacon.bslot_aphy[i] = NULL;
1185 - }
1186
1187 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
1188 sc->ant_comb.count = ATH_ANT_DIV_COMB_INIT_COUNT;
1189 @@ -577,7 +575,6 @@ static int ath9k_init_softc(u16 devid, s
1190 common->btcoex_enabled = ath9k_btcoex_enable == 1;
1191 spin_lock_init(&common->cc_lock);
1192
1193 - spin_lock_init(&sc->wiphy_lock);
1194 spin_lock_init(&sc->sc_serial_rw);
1195 spin_lock_init(&sc->sc_pm_lock);
1196 mutex_init(&sc->mutex);
1197 @@ -789,9 +786,6 @@ int ath9k_init_device(u16 devid, struct
1198
1199 INIT_WORK(&sc->hw_check_work, ath_hw_check);
1200 INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
1201 - INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
1202 - INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
1203 - sc->wiphy_scheduler_int = msecs_to_jiffies(500);
1204 aphy->last_rssi = ATH_RSSI_DUMMY_MARKER;
1205
1206 ath_init_leds(sc);
1207 @@ -850,28 +844,17 @@ static void ath9k_deinit_softc(struct at
1208 void ath9k_deinit_device(struct ath_softc *sc)
1209 {
1210 struct ieee80211_hw *hw = sc->hw;
1211 - int i = 0;
1212
1213 ath9k_ps_wakeup(sc);
1214
1215 wiphy_rfkill_stop_polling(sc->hw->wiphy);
1216 ath_deinit_leds(sc);
1217
1218 - for (i = 0; i < sc->num_sec_wiphy; i++) {
1219 - struct ath_wiphy *aphy = sc->sec_wiphy[i];
1220 - if (aphy == NULL)
1221 - continue;
1222 - sc->sec_wiphy[i] = NULL;
1223 - ieee80211_unregister_hw(aphy->hw);
1224 - ieee80211_free_hw(aphy->hw);
1225 - }
1226 -
1227 ieee80211_unregister_hw(hw);
1228 pm_qos_remove_request(&sc->pm_qos_req);
1229 ath_rx_cleanup(sc);
1230 ath_tx_cleanup(sc);
1231 ath9k_deinit_softc(sc);
1232 - kfree(sc->sec_wiphy);
1233 }
1234
1235 void ath_descdma_cleanup(struct ath_softc *sc,
1236 --- a/drivers/net/wireless/ath/ath9k/pci.c
1237 +++ b/drivers/net/wireless/ath/ath9k/pci.c
1238 @@ -213,7 +213,6 @@ static int ath_pci_probe(struct pci_dev
1239 sc = (struct ath_softc *) (aphy + 1);
1240 aphy->sc = sc;
1241 aphy->hw = hw;
1242 - sc->pri_wiphy = aphy;
1243 sc->hw = hw;
1244 sc->dev = &pdev->dev;
1245 sc->mem = mem;
1246 @@ -320,7 +319,6 @@ static int ath_pci_resume(struct device
1247 ath9k_ps_restore(sc);
1248
1249 sc->ps_idle = true;
1250 - ath9k_set_wiphy_idle(aphy, true);
1251 ath_radio_disable(sc, hw);
1252
1253 return 0;
1254 --- a/drivers/net/wireless/ath/ath9k/ahb.c
1255 +++ b/drivers/net/wireless/ath/ath9k/ahb.c
1256 @@ -107,7 +107,6 @@ static int ath_ahb_probe(struct platform
1257 sc = (struct ath_softc *) (aphy + 1);
1258 aphy->sc = sc;
1259 aphy->hw = hw;
1260 - sc->pri_wiphy = aphy;
1261 sc->hw = hw;
1262 sc->dev = &pdev->dev;
1263 sc->mem = mem;
1264 --- a/drivers/net/wireless/ath/ath9k/beacon.c
1265 +++ b/drivers/net/wireless/ath/ath9k/beacon.c
1266 @@ -142,9 +142,6 @@ static struct ath_buf *ath_beacon_genera
1267 struct ieee80211_tx_info *info;
1268 int cabq_depth;
1269
1270 - if (aphy->state != ATH_WIPHY_ACTIVE)
1271 - return NULL;
1272 -
1273 avp = (void *)vif->drv_priv;
1274 cabq = sc->beacon.cabq;
1275
1276 @@ -261,7 +258,6 @@ int ath_beacon_alloc(struct ath_wiphy *a
1277 }
1278 BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL);
1279 sc->beacon.bslot[avp->av_bslot] = vif;
1280 - sc->beacon.bslot_aphy[avp->av_bslot] = aphy;
1281 sc->nbcnvifs++;
1282 }
1283 }
1284 @@ -332,7 +328,6 @@ void ath_beacon_return(struct ath_softc
1285
1286 if (avp->av_bslot != -1) {
1287 sc->beacon.bslot[avp->av_bslot] = NULL;
1288 - sc->beacon.bslot_aphy[avp->av_bslot] = NULL;
1289 sc->nbcnvifs--;
1290 }
1291
1292 @@ -358,7 +353,6 @@ void ath_beacon_tasklet(unsigned long da
1293 struct ath_common *common = ath9k_hw_common(ah);
1294 struct ath_buf *bf = NULL;
1295 struct ieee80211_vif *vif;
1296 - struct ath_wiphy *aphy;
1297 int slot;
1298 u32 bfaddr, bc = 0, tsftu;
1299 u64 tsf;
1300 @@ -416,7 +410,6 @@ void ath_beacon_tasklet(unsigned long da
1301 */
1302 slot = ATH_BCBUF - slot - 1;
1303 vif = sc->beacon.bslot[slot];
1304 - aphy = sc->beacon.bslot_aphy[slot];
1305
1306 ath_dbg(common, ATH_DBG_BEACON,
1307 "slot %d [tsf %llu tsftu %u intval %u] vif %p\n",
1308 @@ -424,7 +417,7 @@ void ath_beacon_tasklet(unsigned long da
1309
1310 bfaddr = 0;
1311 if (vif) {
1312 - bf = ath_beacon_generate(aphy->hw, vif);
1313 + bf = ath_beacon_generate(sc->hw, vif);
1314 if (bf != NULL) {
1315 bfaddr = bf->bf_daddr;
1316 bc = 1;