Merge branch 'core' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile...
[pandora-kernel.git] / drivers / net / wireless / ath / ath9k / htc_drv_main.c
1 /*
2  * Copyright (c) 2010 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include "htc.h"
18
19 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
20 static struct dentry *ath9k_debugfs_root;
21 #endif
22
23 /*************/
24 /* Utilities */
25 /*************/
26
27 /* HACK Alert: Use 11NG for 2.4, use 11NA for 5 */
28 static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv,
29                                               struct ath9k_channel *ichan)
30 {
31         enum htc_phymode mode;
32
33         mode = HTC_MODE_AUTO;
34
35         switch (ichan->chanmode) {
36         case CHANNEL_G:
37         case CHANNEL_G_HT20:
38         case CHANNEL_G_HT40PLUS:
39         case CHANNEL_G_HT40MINUS:
40                 mode = HTC_MODE_11NG;
41                 break;
42         case CHANNEL_A:
43         case CHANNEL_A_HT20:
44         case CHANNEL_A_HT40PLUS:
45         case CHANNEL_A_HT40MINUS:
46                 mode = HTC_MODE_11NA;
47                 break;
48         default:
49                 break;
50         }
51
52         return mode;
53 }
54
55 bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
56                         enum ath9k_power_mode mode)
57 {
58         bool ret;
59
60         mutex_lock(&priv->htc_pm_lock);
61         ret = ath9k_hw_setpower(priv->ah, mode);
62         mutex_unlock(&priv->htc_pm_lock);
63
64         return ret;
65 }
66
67 void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv)
68 {
69         mutex_lock(&priv->htc_pm_lock);
70         if (++priv->ps_usecount != 1)
71                 goto unlock;
72         ath9k_hw_setpower(priv->ah, ATH9K_PM_AWAKE);
73
74 unlock:
75         mutex_unlock(&priv->htc_pm_lock);
76 }
77
78 void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv)
79 {
80         mutex_lock(&priv->htc_pm_lock);
81         if (--priv->ps_usecount != 0)
82                 goto unlock;
83
84         if (priv->ps_idle)
85                 ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP);
86         else if (priv->ps_enabled)
87                 ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP);
88
89 unlock:
90         mutex_unlock(&priv->htc_pm_lock);
91 }
92
93 void ath9k_ps_work(struct work_struct *work)
94 {
95         struct ath9k_htc_priv *priv =
96                 container_of(work, struct ath9k_htc_priv,
97                              ps_work);
98         ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
99
100         /* The chip wakes up after receiving the first beacon
101            while network sleep is enabled. For the driver to
102            be in sync with the hw, set the chip to awake and
103            only then set it to sleep.
104          */
105         ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
106 }
107
108 static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
109 {
110         struct ath9k_htc_priv *priv = data;
111         struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
112
113         if ((vif->type == NL80211_IFTYPE_AP) && bss_conf->enable_beacon)
114                 priv->reconfig_beacon = true;
115
116         if (bss_conf->assoc) {
117                 priv->rearm_ani = true;
118                 priv->reconfig_beacon = true;
119         }
120 }
121
122 static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv)
123 {
124         priv->rearm_ani = false;
125         priv->reconfig_beacon = false;
126
127         ieee80211_iterate_active_interfaces_atomic(priv->hw,
128                                                    ath9k_htc_vif_iter, priv);
129         if (priv->rearm_ani)
130                 ath9k_htc_start_ani(priv);
131
132         if (priv->reconfig_beacon) {
133                 ath9k_htc_ps_wakeup(priv);
134                 ath9k_htc_beacon_reconfig(priv);
135                 ath9k_htc_ps_restore(priv);
136         }
137 }
138
139 static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
140 {
141         struct ath9k_vif_iter_data *iter_data = data;
142         int i;
143
144         for (i = 0; i < ETH_ALEN; i++)
145                 iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]);
146 }
147
148 static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv,
149                                      struct ieee80211_vif *vif)
150 {
151         struct ath_common *common = ath9k_hw_common(priv->ah);
152         struct ath9k_vif_iter_data iter_data;
153
154         /*
155          * Use the hardware MAC address as reference, the hardware uses it
156          * together with the BSSID mask when matching addresses.
157          */
158         iter_data.hw_macaddr = common->macaddr;
159         memset(&iter_data.mask, 0xff, ETH_ALEN);
160
161         if (vif)
162                 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif);
163
164         /* Get list of all active MAC addresses */
165         ieee80211_iterate_active_interfaces_atomic(priv->hw, ath9k_htc_bssid_iter,
166                                                    &iter_data);
167
168         memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
169         ath_hw_setbssidmask(common);
170 }
171
172 static void ath9k_htc_set_opmode(struct ath9k_htc_priv *priv)
173 {
174         if (priv->num_ibss_vif)
175                 priv->ah->opmode = NL80211_IFTYPE_ADHOC;
176         else if (priv->num_ap_vif)
177                 priv->ah->opmode = NL80211_IFTYPE_AP;
178         else
179                 priv->ah->opmode = NL80211_IFTYPE_STATION;
180
181         ath9k_hw_setopmode(priv->ah);
182 }
183
184 void ath9k_htc_reset(struct ath9k_htc_priv *priv)
185 {
186         struct ath_hw *ah = priv->ah;
187         struct ath_common *common = ath9k_hw_common(ah);
188         struct ieee80211_channel *channel = priv->hw->conf.channel;
189         struct ath9k_hw_cal_data *caldata = NULL;
190         enum htc_phymode mode;
191         __be16 htc_mode;
192         u8 cmd_rsp;
193         int ret;
194
195         mutex_lock(&priv->mutex);
196         ath9k_htc_ps_wakeup(priv);
197
198         ath9k_htc_stop_ani(priv);
199         ieee80211_stop_queues(priv->hw);
200         htc_stop(priv->htc);
201         WMI_CMD(WMI_DISABLE_INTR_CMDID);
202         WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
203         WMI_CMD(WMI_STOP_RECV_CMDID);
204
205         caldata = &priv->caldata;
206         ret = ath9k_hw_reset(ah, ah->curchan, caldata, false);
207         if (ret) {
208                 ath_err(common,
209                         "Unable to reset device (%u Mhz) reset status %d\n",
210                         channel->center_freq, ret);
211         }
212
213         ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
214                                &priv->curtxpow);
215
216         WMI_CMD(WMI_START_RECV_CMDID);
217         ath9k_host_rx_init(priv);
218
219         mode = ath9k_htc_get_curmode(priv, ah->curchan);
220         htc_mode = cpu_to_be16(mode);
221         WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
222
223         WMI_CMD(WMI_ENABLE_INTR_CMDID);
224         htc_start(priv->htc);
225         ath9k_htc_vif_reconfig(priv);
226         ieee80211_wake_queues(priv->hw);
227
228         ath9k_htc_ps_restore(priv);
229         mutex_unlock(&priv->mutex);
230 }
231
232 static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
233                                  struct ieee80211_hw *hw,
234                                  struct ath9k_channel *hchan)
235 {
236         struct ath_hw *ah = priv->ah;
237         struct ath_common *common = ath9k_hw_common(ah);
238         struct ieee80211_conf *conf = &common->hw->conf;
239         bool fastcc;
240         struct ieee80211_channel *channel = hw->conf.channel;
241         struct ath9k_hw_cal_data *caldata = NULL;
242         enum htc_phymode mode;
243         __be16 htc_mode;
244         u8 cmd_rsp;
245         int ret;
246
247         if (priv->op_flags & OP_INVALID)
248                 return -EIO;
249
250         fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
251
252         ath9k_htc_ps_wakeup(priv);
253         htc_stop(priv->htc);
254         WMI_CMD(WMI_DISABLE_INTR_CMDID);
255         WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
256         WMI_CMD(WMI_STOP_RECV_CMDID);
257
258         ath_dbg(common, ATH_DBG_CONFIG,
259                 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n",
260                 priv->ah->curchan->channel,
261                 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf),
262                 fastcc);
263
264         if (!fastcc)
265                 caldata = &priv->caldata;
266         ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
267         if (ret) {
268                 ath_err(common,
269                         "Unable to reset channel (%u Mhz) reset status %d\n",
270                         channel->center_freq, ret);
271                 goto err;
272         }
273
274         ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
275                                &priv->curtxpow);
276
277         WMI_CMD(WMI_START_RECV_CMDID);
278         if (ret)
279                 goto err;
280
281         ath9k_host_rx_init(priv);
282
283         mode = ath9k_htc_get_curmode(priv, hchan);
284         htc_mode = cpu_to_be16(mode);
285         WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
286         if (ret)
287                 goto err;
288
289         WMI_CMD(WMI_ENABLE_INTR_CMDID);
290         if (ret)
291                 goto err;
292
293         htc_start(priv->htc);
294
295         if (!(priv->op_flags & OP_SCANNING) &&
296             !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
297                 ath9k_htc_vif_reconfig(priv);
298
299 err:
300         ath9k_htc_ps_restore(priv);
301         return ret;
302 }
303
304 /*
305  * Monitor mode handling is a tad complicated because the firmware requires
306  * an interface to be created exclusively, while mac80211 doesn't associate
307  * an interface with the mode.
308  *
309  * So, for now, only one monitor interface can be configured.
310  */
311 static void __ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
312 {
313         struct ath_common *common = ath9k_hw_common(priv->ah);
314         struct ath9k_htc_target_vif hvif;
315         int ret = 0;
316         u8 cmd_rsp;
317
318         memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
319         memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
320         hvif.index = priv->mon_vif_idx;
321         WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
322         priv->nvifs--;
323         priv->vif_slot &= ~(1 << priv->mon_vif_idx);
324 }
325
326 static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv)
327 {
328         struct ath_common *common = ath9k_hw_common(priv->ah);
329         struct ath9k_htc_target_vif hvif;
330         struct ath9k_htc_target_sta tsta;
331         int ret = 0, sta_idx;
332         u8 cmd_rsp;
333
334         if ((priv->nvifs >= ATH9K_HTC_MAX_VIF) ||
335             (priv->nstations >= ATH9K_HTC_MAX_STA)) {
336                 ret = -ENOBUFS;
337                 goto err_vif;
338         }
339
340         sta_idx = ffz(priv->sta_slot);
341         if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA)) {
342                 ret = -ENOBUFS;
343                 goto err_vif;
344         }
345
346         /*
347          * Add an interface.
348          */
349         memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
350         memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
351
352         hvif.opmode = cpu_to_be32(HTC_M_MONITOR);
353         hvif.index = ffz(priv->vif_slot);
354
355         WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
356         if (ret)
357                 goto err_vif;
358
359         /*
360          * Assign the monitor interface index as a special case here.
361          * This is needed when the interface is brought down.
362          */
363         priv->mon_vif_idx = hvif.index;
364         priv->vif_slot |= (1 << hvif.index);
365
366         /*
367          * Set the hardware mode to monitor only if there are no
368          * other interfaces.
369          */
370         if (!priv->nvifs)
371                 priv->ah->opmode = NL80211_IFTYPE_MONITOR;
372
373         priv->nvifs++;
374
375         /*
376          * Associate a station with the interface for packet injection.
377          */
378         memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
379
380         memcpy(&tsta.macaddr, common->macaddr, ETH_ALEN);
381
382         tsta.is_vif_sta = 1;
383         tsta.sta_index = sta_idx;
384         tsta.vif_index = hvif.index;
385         tsta.maxampdu = 0xffff;
386
387         WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
388         if (ret) {
389                 ath_err(common, "Unable to add station entry for monitor mode\n");
390                 goto err_sta;
391         }
392
393         priv->sta_slot |= (1 << sta_idx);
394         priv->nstations++;
395         priv->vif_sta_pos[priv->mon_vif_idx] = sta_idx;
396         priv->ah->is_monitoring = true;
397
398         ath_dbg(common, ATH_DBG_CONFIG,
399                 "Attached a monitor interface at idx: %d, sta idx: %d\n",
400                 priv->mon_vif_idx, sta_idx);
401
402         return 0;
403
404 err_sta:
405         /*
406          * Remove the interface from the target.
407          */
408         __ath9k_htc_remove_monitor_interface(priv);
409 err_vif:
410         ath_dbg(common, ATH_DBG_FATAL, "Unable to attach a monitor interface\n");
411
412         return ret;
413 }
414
415 static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
416 {
417         struct ath_common *common = ath9k_hw_common(priv->ah);
418         int ret = 0;
419         u8 cmd_rsp, sta_idx;
420
421         __ath9k_htc_remove_monitor_interface(priv);
422
423         sta_idx = priv->vif_sta_pos[priv->mon_vif_idx];
424
425         WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
426         if (ret) {
427                 ath_err(common, "Unable to remove station entry for monitor mode\n");
428                 return ret;
429         }
430
431         priv->sta_slot &= ~(1 << sta_idx);
432         priv->nstations--;
433         priv->ah->is_monitoring = false;
434
435         ath_dbg(common, ATH_DBG_CONFIG,
436                 "Removed a monitor interface at idx: %d, sta idx: %d\n",
437                 priv->mon_vif_idx, sta_idx);
438
439         return 0;
440 }
441
442 static int ath9k_htc_add_station(struct ath9k_htc_priv *priv,
443                                  struct ieee80211_vif *vif,
444                                  struct ieee80211_sta *sta)
445 {
446         struct ath_common *common = ath9k_hw_common(priv->ah);
447         struct ath9k_htc_target_sta tsta;
448         struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
449         struct ath9k_htc_sta *ista;
450         int ret, sta_idx;
451         u8 cmd_rsp;
452
453         if (priv->nstations >= ATH9K_HTC_MAX_STA)
454                 return -ENOBUFS;
455
456         sta_idx = ffz(priv->sta_slot);
457         if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA))
458                 return -ENOBUFS;
459
460         memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
461
462         if (sta) {
463                 ista = (struct ath9k_htc_sta *) sta->drv_priv;
464                 memcpy(&tsta.macaddr, sta->addr, ETH_ALEN);
465                 memcpy(&tsta.bssid, common->curbssid, ETH_ALEN);
466                 tsta.associd = common->curaid;
467                 tsta.is_vif_sta = 0;
468                 tsta.valid = true;
469                 ista->index = sta_idx;
470         } else {
471                 memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
472                 tsta.is_vif_sta = 1;
473         }
474
475         tsta.sta_index = sta_idx;
476         tsta.vif_index = avp->index;
477         tsta.maxampdu = 0xffff;
478         if (sta && sta->ht_cap.ht_supported)
479                 tsta.flags = cpu_to_be16(ATH_HTC_STA_HT);
480
481         WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
482         if (ret) {
483                 if (sta)
484                         ath_err(common,
485                                 "Unable to add station entry for: %pM\n",
486                                 sta->addr);
487                 return ret;
488         }
489
490         if (sta) {
491                 ath_dbg(common, ATH_DBG_CONFIG,
492                         "Added a station entry for: %pM (idx: %d)\n",
493                         sta->addr, tsta.sta_index);
494         } else {
495                 ath_dbg(common, ATH_DBG_CONFIG,
496                         "Added a station entry for VIF %d (idx: %d)\n",
497                         avp->index, tsta.sta_index);
498         }
499
500         priv->sta_slot |= (1 << sta_idx);
501         priv->nstations++;
502         if (!sta)
503                 priv->vif_sta_pos[avp->index] = sta_idx;
504
505         return 0;
506 }
507
508 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv,
509                                     struct ieee80211_vif *vif,
510                                     struct ieee80211_sta *sta)
511 {
512         struct ath_common *common = ath9k_hw_common(priv->ah);
513         struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
514         struct ath9k_htc_sta *ista;
515         int ret;
516         u8 cmd_rsp, sta_idx;
517
518         if (sta) {
519                 ista = (struct ath9k_htc_sta *) sta->drv_priv;
520                 sta_idx = ista->index;
521         } else {
522                 sta_idx = priv->vif_sta_pos[avp->index];
523         }
524
525         WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
526         if (ret) {
527                 if (sta)
528                         ath_err(common,
529                                 "Unable to remove station entry for: %pM\n",
530                                 sta->addr);
531                 return ret;
532         }
533
534         if (sta) {
535                 ath_dbg(common, ATH_DBG_CONFIG,
536                         "Removed a station entry for: %pM (idx: %d)\n",
537                         sta->addr, sta_idx);
538         } else {
539                 ath_dbg(common, ATH_DBG_CONFIG,
540                         "Removed a station entry for VIF %d (idx: %d)\n",
541                         avp->index, sta_idx);
542         }
543
544         priv->sta_slot &= ~(1 << sta_idx);
545         priv->nstations--;
546
547         return 0;
548 }
549
550 int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv)
551 {
552         struct ath9k_htc_cap_target tcap;
553         int ret;
554         u8 cmd_rsp;
555
556         memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target));
557
558         /* FIXME: Values are hardcoded */
559         tcap.flags = 0x240c40;
560         tcap.flags_ext = 0x80601000;
561         tcap.ampdu_limit = 0xffff0000;
562         tcap.ampdu_subframes = 20;
563         tcap.tx_chainmask_legacy = priv->ah->caps.tx_chainmask;
564         tcap.protmode = 1;
565         tcap.tx_chainmask = priv->ah->caps.tx_chainmask;
566
567         WMI_CMD_BUF(WMI_TARGET_IC_UPDATE_CMDID, &tcap);
568
569         return ret;
570 }
571
572 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
573                                  struct ieee80211_sta *sta,
574                                  struct ath9k_htc_target_rate *trate)
575 {
576         struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv;
577         struct ieee80211_supported_band *sband;
578         u32 caps = 0;
579         int i, j;
580
581         sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
582
583         for (i = 0, j = 0; i < sband->n_bitrates; i++) {
584                 if (sta->supp_rates[sband->band] & BIT(i)) {
585                         trate->rates.legacy_rates.rs_rates[j]
586                                 = (sband->bitrates[i].bitrate * 2) / 10;
587                         j++;
588                 }
589         }
590         trate->rates.legacy_rates.rs_nrates = j;
591
592         if (sta->ht_cap.ht_supported) {
593                 for (i = 0, j = 0; i < 77; i++) {
594                         if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
595                                 trate->rates.ht_rates.rs_rates[j++] = i;
596                         if (j == ATH_HTC_RATE_MAX)
597                                 break;
598                 }
599                 trate->rates.ht_rates.rs_nrates = j;
600
601                 caps = WLAN_RC_HT_FLAG;
602                 if (sta->ht_cap.mcs.rx_mask[1])
603                         caps |= WLAN_RC_DS_FLAG;
604                 if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
605                      (conf_is_ht40(&priv->hw->conf)))
606                         caps |= WLAN_RC_40_FLAG;
607                 if (conf_is_ht40(&priv->hw->conf) &&
608                     (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
609                         caps |= WLAN_RC_SGI_FLAG;
610                 else if (conf_is_ht20(&priv->hw->conf) &&
611                          (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
612                         caps |= WLAN_RC_SGI_FLAG;
613         }
614
615         trate->sta_index = ista->index;
616         trate->isnew = 1;
617         trate->capflags = cpu_to_be32(caps);
618 }
619
620 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv,
621                                     struct ath9k_htc_target_rate *trate)
622 {
623         struct ath_common *common = ath9k_hw_common(priv->ah);
624         int ret;
625         u8 cmd_rsp;
626
627         WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, trate);
628         if (ret) {
629                 ath_err(common,
630                         "Unable to initialize Rate information on target\n");
631         }
632
633         return ret;
634 }
635
636 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv,
637                                 struct ieee80211_sta *sta)
638 {
639         struct ath_common *common = ath9k_hw_common(priv->ah);
640         struct ath9k_htc_target_rate trate;
641         int ret;
642
643         memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
644         ath9k_htc_setup_rate(priv, sta, &trate);
645         ret = ath9k_htc_send_rate_cmd(priv, &trate);
646         if (!ret)
647                 ath_dbg(common, ATH_DBG_CONFIG,
648                         "Updated target sta: %pM, rate caps: 0x%X\n",
649                         sta->addr, be32_to_cpu(trate.capflags));
650 }
651
652 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv,
653                                   struct ieee80211_vif *vif,
654                                   struct ieee80211_bss_conf *bss_conf)
655 {
656         struct ath_common *common = ath9k_hw_common(priv->ah);
657         struct ath9k_htc_target_rate trate;
658         struct ieee80211_sta *sta;
659         int ret;
660
661         memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
662
663         rcu_read_lock();
664         sta = ieee80211_find_sta(vif, bss_conf->bssid);
665         if (!sta) {
666                 rcu_read_unlock();
667                 return;
668         }
669         ath9k_htc_setup_rate(priv, sta, &trate);
670         rcu_read_unlock();
671
672         ret = ath9k_htc_send_rate_cmd(priv, &trate);
673         if (!ret)
674                 ath_dbg(common, ATH_DBG_CONFIG,
675                         "Updated target sta: %pM, rate caps: 0x%X\n",
676                         bss_conf->bssid, be32_to_cpu(trate.capflags));
677 }
678
679 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
680                                   struct ieee80211_vif *vif,
681                                   struct ieee80211_sta *sta,
682                                   enum ieee80211_ampdu_mlme_action action,
683                                   u16 tid)
684 {
685         struct ath_common *common = ath9k_hw_common(priv->ah);
686         struct ath9k_htc_target_aggr aggr;
687         struct ath9k_htc_sta *ista;
688         int ret = 0;
689         u8 cmd_rsp;
690
691         if (tid >= ATH9K_HTC_MAX_TID)
692                 return -EINVAL;
693
694         memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr));
695         ista = (struct ath9k_htc_sta *) sta->drv_priv;
696
697         aggr.sta_index = ista->index;
698         aggr.tidno = tid & 0xf;
699         aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false;
700
701         WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr);
702         if (ret)
703                 ath_dbg(common, ATH_DBG_CONFIG,
704                         "Unable to %s TX aggregation for (%pM, %d)\n",
705                         (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid);
706         else
707                 ath_dbg(common, ATH_DBG_CONFIG,
708                         "%s TX aggregation for (%pM, %d)\n",
709                         (aggr.aggr_enable) ? "Starting" : "Stopping",
710                         sta->addr, tid);
711
712         spin_lock_bh(&priv->tx_lock);
713         ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP;
714         spin_unlock_bh(&priv->tx_lock);
715
716         return ret;
717 }
718
719 /*********/
720 /* DEBUG */
721 /*********/
722
723 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
724
725 static int ath9k_debugfs_open(struct inode *inode, struct file *file)
726 {
727         file->private_data = inode->i_private;
728         return 0;
729 }
730
731 static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf,
732                                    size_t count, loff_t *ppos)
733 {
734         struct ath9k_htc_priv *priv = file->private_data;
735         struct ath9k_htc_target_stats cmd_rsp;
736         char buf[512];
737         unsigned int len = 0;
738         int ret = 0;
739
740         memset(&cmd_rsp, 0, sizeof(cmd_rsp));
741
742         WMI_CMD(WMI_TGT_STATS_CMDID);
743         if (ret)
744                 return -EINVAL;
745
746
747         len += snprintf(buf + len, sizeof(buf) - len,
748                         "%19s : %10u\n", "TX Short Retries",
749                         be32_to_cpu(cmd_rsp.tx_shortretry));
750         len += snprintf(buf + len, sizeof(buf) - len,
751                         "%19s : %10u\n", "TX Long Retries",
752                         be32_to_cpu(cmd_rsp.tx_longretry));
753         len += snprintf(buf + len, sizeof(buf) - len,
754                         "%19s : %10u\n", "TX Xretries",
755                         be32_to_cpu(cmd_rsp.tx_xretries));
756         len += snprintf(buf + len, sizeof(buf) - len,
757                         "%19s : %10u\n", "TX Unaggr. Xretries",
758                         be32_to_cpu(cmd_rsp.ht_txunaggr_xretry));
759         len += snprintf(buf + len, sizeof(buf) - len,
760                         "%19s : %10u\n", "TX Xretries (HT)",
761                         be32_to_cpu(cmd_rsp.ht_tx_xretries));
762         len += snprintf(buf + len, sizeof(buf) - len,
763                         "%19s : %10u\n", "TX Rate", priv->debug.txrate);
764
765         if (len > sizeof(buf))
766                 len = sizeof(buf);
767
768         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
769 }
770
771 static const struct file_operations fops_tgt_stats = {
772         .read = read_file_tgt_stats,
773         .open = ath9k_debugfs_open,
774         .owner = THIS_MODULE,
775         .llseek = default_llseek,
776 };
777
778 static ssize_t read_file_xmit(struct file *file, char __user *user_buf,
779                               size_t count, loff_t *ppos)
780 {
781         struct ath9k_htc_priv *priv = file->private_data;
782         char buf[512];
783         unsigned int len = 0;
784
785         len += snprintf(buf + len, sizeof(buf) - len,
786                         "%20s : %10u\n", "Buffers queued",
787                         priv->debug.tx_stats.buf_queued);
788         len += snprintf(buf + len, sizeof(buf) - len,
789                         "%20s : %10u\n", "Buffers completed",
790                         priv->debug.tx_stats.buf_completed);
791         len += snprintf(buf + len, sizeof(buf) - len,
792                         "%20s : %10u\n", "SKBs queued",
793                         priv->debug.tx_stats.skb_queued);
794         len += snprintf(buf + len, sizeof(buf) - len,
795                         "%20s : %10u\n", "SKBs completed",
796                         priv->debug.tx_stats.skb_completed);
797         len += snprintf(buf + len, sizeof(buf) - len,
798                         "%20s : %10u\n", "SKBs dropped",
799                         priv->debug.tx_stats.skb_dropped);
800
801         len += snprintf(buf + len, sizeof(buf) - len,
802                         "%20s : %10u\n", "BE queued",
803                         priv->debug.tx_stats.queue_stats[WME_AC_BE]);
804         len += snprintf(buf + len, sizeof(buf) - len,
805                         "%20s : %10u\n", "BK queued",
806                         priv->debug.tx_stats.queue_stats[WME_AC_BK]);
807         len += snprintf(buf + len, sizeof(buf) - len,
808                         "%20s : %10u\n", "VI queued",
809                         priv->debug.tx_stats.queue_stats[WME_AC_VI]);
810         len += snprintf(buf + len, sizeof(buf) - len,
811                         "%20s : %10u\n", "VO queued",
812                         priv->debug.tx_stats.queue_stats[WME_AC_VO]);
813
814         if (len > sizeof(buf))
815                 len = sizeof(buf);
816
817         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
818 }
819
820 static const struct file_operations fops_xmit = {
821         .read = read_file_xmit,
822         .open = ath9k_debugfs_open,
823         .owner = THIS_MODULE,
824         .llseek = default_llseek,
825 };
826
827 static ssize_t read_file_recv(struct file *file, char __user *user_buf,
828                               size_t count, loff_t *ppos)
829 {
830         struct ath9k_htc_priv *priv = file->private_data;
831         char buf[512];
832         unsigned int len = 0;
833
834         len += snprintf(buf + len, sizeof(buf) - len,
835                         "%20s : %10u\n", "SKBs allocated",
836                         priv->debug.rx_stats.skb_allocated);
837         len += snprintf(buf + len, sizeof(buf) - len,
838                         "%20s : %10u\n", "SKBs completed",
839                         priv->debug.rx_stats.skb_completed);
840         len += snprintf(buf + len, sizeof(buf) - len,
841                         "%20s : %10u\n", "SKBs Dropped",
842                         priv->debug.rx_stats.skb_dropped);
843
844         if (len > sizeof(buf))
845                 len = sizeof(buf);
846
847         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
848 }
849
850 static const struct file_operations fops_recv = {
851         .read = read_file_recv,
852         .open = ath9k_debugfs_open,
853         .owner = THIS_MODULE,
854         .llseek = default_llseek,
855 };
856
857 int ath9k_htc_init_debug(struct ath_hw *ah)
858 {
859         struct ath_common *common = ath9k_hw_common(ah);
860         struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
861
862         if (!ath9k_debugfs_root)
863                 return -ENOENT;
864
865         priv->debug.debugfs_phy = debugfs_create_dir(wiphy_name(priv->hw->wiphy),
866                                                      ath9k_debugfs_root);
867         if (!priv->debug.debugfs_phy)
868                 goto err;
869
870         priv->debug.debugfs_tgt_stats = debugfs_create_file("tgt_stats", S_IRUSR,
871                                                     priv->debug.debugfs_phy,
872                                                     priv, &fops_tgt_stats);
873         if (!priv->debug.debugfs_tgt_stats)
874                 goto err;
875
876
877         priv->debug.debugfs_xmit = debugfs_create_file("xmit", S_IRUSR,
878                                                        priv->debug.debugfs_phy,
879                                                        priv, &fops_xmit);
880         if (!priv->debug.debugfs_xmit)
881                 goto err;
882
883         priv->debug.debugfs_recv = debugfs_create_file("recv", S_IRUSR,
884                                                        priv->debug.debugfs_phy,
885                                                        priv, &fops_recv);
886         if (!priv->debug.debugfs_recv)
887                 goto err;
888
889         return 0;
890
891 err:
892         ath9k_htc_exit_debug(ah);
893         return -ENOMEM;
894 }
895
896 void ath9k_htc_exit_debug(struct ath_hw *ah)
897 {
898         struct ath_common *common = ath9k_hw_common(ah);
899         struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
900
901         debugfs_remove(priv->debug.debugfs_recv);
902         debugfs_remove(priv->debug.debugfs_xmit);
903         debugfs_remove(priv->debug.debugfs_tgt_stats);
904         debugfs_remove(priv->debug.debugfs_phy);
905 }
906
907 int ath9k_htc_debug_create_root(void)
908 {
909         ath9k_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
910         if (!ath9k_debugfs_root)
911                 return -ENOENT;
912
913         return 0;
914 }
915
916 void ath9k_htc_debug_remove_root(void)
917 {
918         debugfs_remove(ath9k_debugfs_root);
919         ath9k_debugfs_root = NULL;
920 }
921
922 #endif /* CONFIG_ATH9K_HTC_DEBUGFS */
923
924 /*******/
925 /* ANI */
926 /*******/
927
928 void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)
929 {
930         struct ath_common *common = ath9k_hw_common(priv->ah);
931         unsigned long timestamp = jiffies_to_msecs(jiffies);
932
933         common->ani.longcal_timer = timestamp;
934         common->ani.shortcal_timer = timestamp;
935         common->ani.checkani_timer = timestamp;
936
937         priv->op_flags |= OP_ANI_RUNNING;
938
939         ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
940                                      msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
941 }
942
943 void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv)
944 {
945         cancel_delayed_work_sync(&priv->ani_work);
946         priv->op_flags &= ~OP_ANI_RUNNING;
947 }
948
949 void ath9k_htc_ani_work(struct work_struct *work)
950 {
951         struct ath9k_htc_priv *priv =
952                 container_of(work, struct ath9k_htc_priv, ani_work.work);
953         struct ath_hw *ah = priv->ah;
954         struct ath_common *common = ath9k_hw_common(ah);
955         bool longcal = false;
956         bool shortcal = false;
957         bool aniflag = false;
958         unsigned int timestamp = jiffies_to_msecs(jiffies);
959         u32 cal_interval, short_cal_interval;
960
961         short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
962                 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
963
964         /* Only calibrate if awake */
965         if (ah->power_mode != ATH9K_PM_AWAKE)
966                 goto set_timer;
967
968         /* Long calibration runs independently of short calibration. */
969         if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
970                 longcal = true;
971                 ath_dbg(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
972                 common->ani.longcal_timer = timestamp;
973         }
974
975         /* Short calibration applies only while caldone is false */
976         if (!common->ani.caldone) {
977                 if ((timestamp - common->ani.shortcal_timer) >=
978                     short_cal_interval) {
979                         shortcal = true;
980                         ath_dbg(common, ATH_DBG_ANI,
981                                 "shortcal @%lu\n", jiffies);
982                         common->ani.shortcal_timer = timestamp;
983                         common->ani.resetcal_timer = timestamp;
984                 }
985         } else {
986                 if ((timestamp - common->ani.resetcal_timer) >=
987                     ATH_RESTART_CALINTERVAL) {
988                         common->ani.caldone = ath9k_hw_reset_calvalid(ah);
989                         if (common->ani.caldone)
990                                 common->ani.resetcal_timer = timestamp;
991                 }
992         }
993
994         /* Verify whether we must check ANI */
995         if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
996                 aniflag = true;
997                 common->ani.checkani_timer = timestamp;
998         }
999
1000         /* Skip all processing if there's nothing to do. */
1001         if (longcal || shortcal || aniflag) {
1002
1003                 ath9k_htc_ps_wakeup(priv);
1004
1005                 /* Call ANI routine if necessary */
1006                 if (aniflag)
1007                         ath9k_hw_ani_monitor(ah, ah->curchan);
1008
1009                 /* Perform calibration if necessary */
1010                 if (longcal || shortcal)
1011                         common->ani.caldone =
1012                                 ath9k_hw_calibrate(ah, ah->curchan,
1013                                                    common->rx_chainmask,
1014                                                    longcal);
1015
1016                 ath9k_htc_ps_restore(priv);
1017         }
1018
1019 set_timer:
1020         /*
1021         * Set timer interval based on previous results.
1022         * The interval must be the shortest necessary to satisfy ANI,
1023         * short calibration and long calibration.
1024         */
1025         cal_interval = ATH_LONG_CALINTERVAL;
1026         if (priv->ah->config.enable_ani)
1027                 cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
1028         if (!common->ani.caldone)
1029                 cal_interval = min(cal_interval, (u32)short_cal_interval);
1030
1031         ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
1032                                      msecs_to_jiffies(cal_interval));
1033 }
1034
1035 /**********************/
1036 /* mac80211 Callbacks */
1037 /**********************/
1038
1039 static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
1040 {
1041         struct ieee80211_hdr *hdr;
1042         struct ath9k_htc_priv *priv = hw->priv;
1043         int padpos, padsize, ret;
1044
1045         hdr = (struct ieee80211_hdr *) skb->data;
1046
1047         /* Add the padding after the header if this is not already done */
1048         padpos = ath9k_cmn_padpos(hdr->frame_control);
1049         padsize = padpos & 3;
1050         if (padsize && skb->len > padpos) {
1051                 if (skb_headroom(skb) < padsize)
1052                         goto fail_tx;
1053                 skb_push(skb, padsize);
1054                 memmove(skb->data, skb->data + padsize, padpos);
1055         }
1056
1057         ret = ath9k_htc_tx_start(priv, skb);
1058         if (ret != 0) {
1059                 if (ret == -ENOMEM) {
1060                         ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
1061                                 "Stopping TX queues\n");
1062                         ieee80211_stop_queues(hw);
1063                         spin_lock_bh(&priv->tx_lock);
1064                         priv->tx_queues_stop = true;
1065                         spin_unlock_bh(&priv->tx_lock);
1066                 } else {
1067                         ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
1068                                 "Tx failed\n");
1069                 }
1070                 goto fail_tx;
1071         }
1072
1073         return;
1074
1075 fail_tx:
1076         dev_kfree_skb_any(skb);
1077 }
1078
1079 static int ath9k_htc_start(struct ieee80211_hw *hw)
1080 {
1081         struct ath9k_htc_priv *priv = hw->priv;
1082         struct ath_hw *ah = priv->ah;
1083         struct ath_common *common = ath9k_hw_common(ah);
1084         struct ieee80211_channel *curchan = hw->conf.channel;
1085         struct ath9k_channel *init_channel;
1086         int ret = 0;
1087         enum htc_phymode mode;
1088         __be16 htc_mode;
1089         u8 cmd_rsp;
1090
1091         mutex_lock(&priv->mutex);
1092
1093         ath_dbg(common, ATH_DBG_CONFIG,
1094                 "Starting driver with initial channel: %d MHz\n",
1095                 curchan->center_freq);
1096
1097         /* Ensure that HW is awake before flushing RX */
1098         ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1099         WMI_CMD(WMI_FLUSH_RECV_CMDID);
1100
1101         /* setup initial channel */
1102         init_channel = ath9k_cmn_get_curchannel(hw, ah);
1103
1104         ath9k_hw_htc_resetinit(ah);
1105         ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
1106         if (ret) {
1107                 ath_err(common,
1108                         "Unable to reset hardware; reset status %d (freq %u MHz)\n",
1109                         ret, curchan->center_freq);
1110                 mutex_unlock(&priv->mutex);
1111                 return ret;
1112         }
1113
1114         ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
1115                                &priv->curtxpow);
1116
1117         mode = ath9k_htc_get_curmode(priv, init_channel);
1118         htc_mode = cpu_to_be16(mode);
1119         WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
1120         WMI_CMD(WMI_ATH_INIT_CMDID);
1121         WMI_CMD(WMI_START_RECV_CMDID);
1122
1123         ath9k_host_rx_init(priv);
1124
1125         ret = ath9k_htc_update_cap_target(priv);
1126         if (ret)
1127                 ath_dbg(common, ATH_DBG_CONFIG,
1128                         "Failed to update capability in target\n");
1129
1130         priv->op_flags &= ~OP_INVALID;
1131         htc_start(priv->htc);
1132
1133         spin_lock_bh(&priv->tx_lock);
1134         priv->tx_queues_stop = false;
1135         spin_unlock_bh(&priv->tx_lock);
1136
1137         ieee80211_wake_queues(hw);
1138
1139         if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) {
1140                 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
1141                                            AR_STOMP_LOW_WLAN_WGHT);
1142                 ath9k_hw_btcoex_enable(ah);
1143                 ath_htc_resume_btcoex_work(priv);
1144         }
1145         mutex_unlock(&priv->mutex);
1146
1147         return ret;
1148 }
1149
1150 static void ath9k_htc_stop(struct ieee80211_hw *hw)
1151 {
1152         struct ath9k_htc_priv *priv = hw->priv;
1153         struct ath_hw *ah = priv->ah;
1154         struct ath_common *common = ath9k_hw_common(ah);
1155         int ret = 0;
1156         u8 cmd_rsp;
1157
1158         mutex_lock(&priv->mutex);
1159
1160         if (priv->op_flags & OP_INVALID) {
1161                 ath_dbg(common, ATH_DBG_ANY, "Device not present\n");
1162                 mutex_unlock(&priv->mutex);
1163                 return;
1164         }
1165
1166         ath9k_htc_ps_wakeup(priv);
1167         htc_stop(priv->htc);
1168         WMI_CMD(WMI_DISABLE_INTR_CMDID);
1169         WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
1170         WMI_CMD(WMI_STOP_RECV_CMDID);
1171
1172         tasklet_kill(&priv->swba_tasklet);
1173         tasklet_kill(&priv->rx_tasklet);
1174         tasklet_kill(&priv->tx_tasklet);
1175
1176         skb_queue_purge(&priv->tx_queue);
1177
1178         mutex_unlock(&priv->mutex);
1179
1180         /* Cancel all the running timers/work .. */
1181         cancel_work_sync(&priv->fatal_work);
1182         cancel_work_sync(&priv->ps_work);
1183         cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
1184         ath9k_htc_stop_ani(priv);
1185         ath9k_led_stop_brightness(priv);
1186
1187         mutex_lock(&priv->mutex);
1188
1189         if (ah->btcoex_hw.enabled) {
1190                 ath9k_hw_btcoex_disable(ah);
1191                 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1192                         ath_htc_cancel_btcoex_work(priv);
1193         }
1194
1195         /* Remove a monitor interface if it's present. */
1196         if (priv->ah->is_monitoring)
1197                 ath9k_htc_remove_monitor_interface(priv);
1198
1199         ath9k_hw_phy_disable(ah);
1200         ath9k_hw_disable(ah);
1201         ath9k_htc_ps_restore(priv);
1202         ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);
1203
1204         priv->op_flags |= OP_INVALID;
1205
1206         ath_dbg(common, ATH_DBG_CONFIG, "Driver halt\n");
1207         mutex_unlock(&priv->mutex);
1208 }
1209
1210 static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
1211                                    struct ieee80211_vif *vif)
1212 {
1213         struct ath9k_htc_priv *priv = hw->priv;
1214         struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1215         struct ath_common *common = ath9k_hw_common(priv->ah);
1216         struct ath9k_htc_target_vif hvif;
1217         int ret = 0;
1218         u8 cmd_rsp;
1219
1220         mutex_lock(&priv->mutex);
1221
1222         if (priv->nvifs >= ATH9K_HTC_MAX_VIF) {
1223                 mutex_unlock(&priv->mutex);
1224                 return -ENOBUFS;
1225         }
1226
1227         if (priv->num_ibss_vif ||
1228             (priv->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
1229                 ath_err(common, "IBSS coexistence with other modes is not allowed\n");
1230                 mutex_unlock(&priv->mutex);
1231                 return -ENOBUFS;
1232         }
1233
1234         if (((vif->type == NL80211_IFTYPE_AP) ||
1235              (vif->type == NL80211_IFTYPE_ADHOC)) &&
1236             ((priv->num_ap_vif + priv->num_ibss_vif) >= ATH9K_HTC_MAX_BCN_VIF)) {
1237                 ath_err(common, "Max. number of beaconing interfaces reached\n");
1238                 mutex_unlock(&priv->mutex);
1239                 return -ENOBUFS;
1240         }
1241
1242         ath9k_htc_ps_wakeup(priv);
1243         memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1244         memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1245
1246         switch (vif->type) {
1247         case NL80211_IFTYPE_STATION:
1248                 hvif.opmode = cpu_to_be32(HTC_M_STA);
1249                 break;
1250         case NL80211_IFTYPE_ADHOC:
1251                 hvif.opmode = cpu_to_be32(HTC_M_IBSS);
1252                 break;
1253         case NL80211_IFTYPE_AP:
1254                 hvif.opmode = cpu_to_be32(HTC_M_HOSTAP);
1255                 break;
1256         default:
1257                 ath_err(common,
1258                         "Interface type %d not yet supported\n", vif->type);
1259                 ret = -EOPNOTSUPP;
1260                 goto out;
1261         }
1262
1263         /* Index starts from zero on the target */
1264         avp->index = hvif.index = ffz(priv->vif_slot);
1265         hvif.rtsthreshold = cpu_to_be16(2304);
1266         WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
1267         if (ret)
1268                 goto out;
1269
1270         /*
1271          * We need a node in target to tx mgmt frames
1272          * before association.
1273          */
1274         ret = ath9k_htc_add_station(priv, vif, NULL);
1275         if (ret) {
1276                 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1277                 goto out;
1278         }
1279
1280         ath9k_htc_set_bssid_mask(priv, vif);
1281
1282         priv->vif_slot |= (1 << avp->index);
1283         priv->nvifs++;
1284         priv->vif = vif;
1285
1286         INC_VIF(priv, vif->type);
1287         ath9k_htc_set_opmode(priv);
1288
1289         if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1290             !(priv->op_flags & OP_ANI_RUNNING))
1291                 ath9k_htc_start_ani(priv);
1292
1293         ath_dbg(common, ATH_DBG_CONFIG,
1294                 "Attach a VIF of type: %d at idx: %d\n", vif->type, avp->index);
1295
1296 out:
1297         ath9k_htc_ps_restore(priv);
1298         mutex_unlock(&priv->mutex);
1299
1300         return ret;
1301 }
1302
1303 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,
1304                                        struct ieee80211_vif *vif)
1305 {
1306         struct ath9k_htc_priv *priv = hw->priv;
1307         struct ath_common *common = ath9k_hw_common(priv->ah);
1308         struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1309         struct ath9k_htc_target_vif hvif;
1310         int ret = 0;
1311         u8 cmd_rsp;
1312
1313         mutex_lock(&priv->mutex);
1314         ath9k_htc_ps_wakeup(priv);
1315
1316         memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1317         memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1318         hvif.index = avp->index;
1319         WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1320         priv->nvifs--;
1321         priv->vif_slot &= ~(1 << avp->index);
1322
1323         ath9k_htc_remove_station(priv, vif, NULL);
1324         priv->vif = NULL;
1325
1326         DEC_VIF(priv, vif->type);
1327         ath9k_htc_set_opmode(priv);
1328
1329         /*
1330          * Stop ANI only if there are no associated station interfaces.
1331          */
1332         if ((vif->type == NL80211_IFTYPE_AP) && (priv->num_ap_vif == 0)) {
1333                 priv->rearm_ani = false;
1334                 ieee80211_iterate_active_interfaces_atomic(priv->hw,
1335                                                    ath9k_htc_vif_iter, priv);
1336                 if (!priv->rearm_ani)
1337                         ath9k_htc_stop_ani(priv);
1338         }
1339
1340         ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface at idx: %d\n", avp->index);
1341
1342         ath9k_htc_ps_restore(priv);
1343         mutex_unlock(&priv->mutex);
1344 }
1345
1346 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
1347 {
1348         struct ath9k_htc_priv *priv = hw->priv;
1349         struct ath_common *common = ath9k_hw_common(priv->ah);
1350         struct ieee80211_conf *conf = &hw->conf;
1351
1352         mutex_lock(&priv->mutex);
1353
1354         if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1355                 bool enable_radio = false;
1356                 bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1357
1358                 mutex_lock(&priv->htc_pm_lock);
1359                 if (!idle && priv->ps_idle)
1360                         enable_radio = true;
1361                 priv->ps_idle = idle;
1362                 mutex_unlock(&priv->htc_pm_lock);
1363
1364                 if (enable_radio) {
1365                         ath_dbg(common, ATH_DBG_CONFIG,
1366                                 "not-idle: enabling radio\n");
1367                         ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1368                         ath9k_htc_radio_enable(hw);
1369                 }
1370         }
1371
1372         /*
1373          * Monitor interface should be added before
1374          * IEEE80211_CONF_CHANGE_CHANNEL is handled.
1375          */
1376         if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1377                 if ((conf->flags & IEEE80211_CONF_MONITOR) &&
1378                     !priv->ah->is_monitoring)
1379                         ath9k_htc_add_monitor_interface(priv);
1380                 else if (priv->ah->is_monitoring)
1381                         ath9k_htc_remove_monitor_interface(priv);
1382         }
1383
1384         if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1385                 struct ieee80211_channel *curchan = hw->conf.channel;
1386                 int pos = curchan->hw_value;
1387
1388                 ath_dbg(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
1389                         curchan->center_freq);
1390
1391                 ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
1392                                           hw->conf.channel,
1393                                           hw->conf.channel_type);
1394
1395                 if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
1396                         ath_err(common, "Unable to set channel\n");
1397                         mutex_unlock(&priv->mutex);
1398                         return -EINVAL;
1399                 }
1400
1401         }
1402
1403         if (changed & IEEE80211_CONF_CHANGE_PS) {
1404                 if (conf->flags & IEEE80211_CONF_PS) {
1405                         ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
1406                         priv->ps_enabled = true;
1407                 } else {
1408                         priv->ps_enabled = false;
1409                         cancel_work_sync(&priv->ps_work);
1410                         ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1411                 }
1412         }
1413
1414         if (changed & IEEE80211_CONF_CHANGE_POWER) {
1415                 priv->txpowlimit = 2 * conf->power_level;
1416                 ath9k_cmn_update_txpow(priv->ah, priv->curtxpow,
1417                                        priv->txpowlimit, &priv->curtxpow);
1418         }
1419
1420         if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1421                 mutex_lock(&priv->htc_pm_lock);
1422                 if (!priv->ps_idle) {
1423                         mutex_unlock(&priv->htc_pm_lock);
1424                         goto out;
1425                 }
1426                 mutex_unlock(&priv->htc_pm_lock);
1427
1428                 ath_dbg(common, ATH_DBG_CONFIG,
1429                         "idle: disabling radio\n");
1430                 ath9k_htc_radio_disable(hw);
1431         }
1432
1433 out:
1434         mutex_unlock(&priv->mutex);
1435         return 0;
1436 }
1437
1438 #define SUPPORTED_FILTERS                       \
1439         (FIF_PROMISC_IN_BSS |                   \
1440         FIF_ALLMULTI |                          \
1441         FIF_CONTROL |                           \
1442         FIF_PSPOLL |                            \
1443         FIF_OTHER_BSS |                         \
1444         FIF_BCN_PRBRESP_PROMISC |               \
1445         FIF_PROBE_REQ |                         \
1446         FIF_FCSFAIL)
1447
1448 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
1449                                        unsigned int changed_flags,
1450                                        unsigned int *total_flags,
1451                                        u64 multicast)
1452 {
1453         struct ath9k_htc_priv *priv = hw->priv;
1454         u32 rfilt;
1455
1456         mutex_lock(&priv->mutex);
1457         ath9k_htc_ps_wakeup(priv);
1458
1459         changed_flags &= SUPPORTED_FILTERS;
1460         *total_flags &= SUPPORTED_FILTERS;
1461
1462         priv->rxfilter = *total_flags;
1463         rfilt = ath9k_htc_calcrxfilter(priv);
1464         ath9k_hw_setrxfilter(priv->ah, rfilt);
1465
1466         ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG,
1467                 "Set HW RX filter: 0x%x\n", rfilt);
1468
1469         ath9k_htc_ps_restore(priv);
1470         mutex_unlock(&priv->mutex);
1471 }
1472
1473 static int ath9k_htc_sta_add(struct ieee80211_hw *hw,
1474                              struct ieee80211_vif *vif,
1475                              struct ieee80211_sta *sta)
1476 {
1477         struct ath9k_htc_priv *priv = hw->priv;
1478         int ret;
1479
1480         mutex_lock(&priv->mutex);
1481         ath9k_htc_ps_wakeup(priv);
1482         ret = ath9k_htc_add_station(priv, vif, sta);
1483         if (!ret)
1484                 ath9k_htc_init_rate(priv, sta);
1485         ath9k_htc_ps_restore(priv);
1486         mutex_unlock(&priv->mutex);
1487
1488         return ret;
1489 }
1490
1491 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
1492                                 struct ieee80211_vif *vif,
1493                                 struct ieee80211_sta *sta)
1494 {
1495         struct ath9k_htc_priv *priv = hw->priv;
1496         int ret;
1497
1498         mutex_lock(&priv->mutex);
1499         ath9k_htc_ps_wakeup(priv);
1500         ret = ath9k_htc_remove_station(priv, vif, sta);
1501         ath9k_htc_ps_restore(priv);
1502         mutex_unlock(&priv->mutex);
1503
1504         return ret;
1505 }
1506
1507 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw, u16 queue,
1508                              const struct ieee80211_tx_queue_params *params)
1509 {
1510         struct ath9k_htc_priv *priv = hw->priv;
1511         struct ath_common *common = ath9k_hw_common(priv->ah);
1512         struct ath9k_tx_queue_info qi;
1513         int ret = 0, qnum;
1514
1515         if (queue >= WME_NUM_AC)
1516                 return 0;
1517
1518         mutex_lock(&priv->mutex);
1519         ath9k_htc_ps_wakeup(priv);
1520
1521         memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
1522
1523         qi.tqi_aifs = params->aifs;
1524         qi.tqi_cwmin = params->cw_min;
1525         qi.tqi_cwmax = params->cw_max;
1526         qi.tqi_burstTime = params->txop;
1527
1528         qnum = get_hw_qnum(queue, priv->hwq_map);
1529
1530         ath_dbg(common, ATH_DBG_CONFIG,
1531                 "Configure tx [queue/hwq] [%d/%d],  aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
1532                 queue, qnum, params->aifs, params->cw_min,
1533                 params->cw_max, params->txop);
1534
1535         ret = ath_htc_txq_update(priv, qnum, &qi);
1536         if (ret) {
1537                 ath_err(common, "TXQ Update failed\n");
1538                 goto out;
1539         }
1540
1541         if ((priv->ah->opmode == NL80211_IFTYPE_ADHOC) &&
1542             (qnum == priv->hwq_map[WME_AC_BE]))
1543                     ath9k_htc_beaconq_config(priv);
1544 out:
1545         ath9k_htc_ps_restore(priv);
1546         mutex_unlock(&priv->mutex);
1547
1548         return ret;
1549 }
1550
1551 static int ath9k_htc_set_key(struct ieee80211_hw *hw,
1552                              enum set_key_cmd cmd,
1553                              struct ieee80211_vif *vif,
1554                              struct ieee80211_sta *sta,
1555                              struct ieee80211_key_conf *key)
1556 {
1557         struct ath9k_htc_priv *priv = hw->priv;
1558         struct ath_common *common = ath9k_hw_common(priv->ah);
1559         int ret = 0;
1560
1561         if (htc_modparam_nohwcrypt)
1562                 return -ENOSPC;
1563
1564         mutex_lock(&priv->mutex);
1565         ath_dbg(common, ATH_DBG_CONFIG, "Set HW Key\n");
1566         ath9k_htc_ps_wakeup(priv);
1567
1568         switch (cmd) {
1569         case SET_KEY:
1570                 ret = ath_key_config(common, vif, sta, key);
1571                 if (ret >= 0) {
1572                         key->hw_key_idx = ret;
1573                         /* push IV and Michael MIC generation to stack */
1574                         key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1575                         if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1576                                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1577                         if (priv->ah->sw_mgmt_crypto &&
1578                             key->cipher == WLAN_CIPHER_SUITE_CCMP)
1579                                 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1580                         ret = 0;
1581                 }
1582                 break;
1583         case DISABLE_KEY:
1584                 ath_key_delete(common, key);
1585                 break;
1586         default:
1587                 ret = -EINVAL;
1588         }
1589
1590         ath9k_htc_ps_restore(priv);
1591         mutex_unlock(&priv->mutex);
1592
1593         return ret;
1594 }
1595
1596 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
1597                                        struct ieee80211_vif *vif,
1598                                        struct ieee80211_bss_conf *bss_conf,
1599                                        u32 changed)
1600 {
1601         struct ath9k_htc_priv *priv = hw->priv;
1602         struct ath_hw *ah = priv->ah;
1603         struct ath_common *common = ath9k_hw_common(ah);
1604         bool set_assoc;
1605
1606         mutex_lock(&priv->mutex);
1607         ath9k_htc_ps_wakeup(priv);
1608
1609         /*
1610          * Set the HW AID/BSSID only for the first station interface
1611          * or in IBSS mode.
1612          */
1613         set_assoc = !!((priv->ah->opmode == NL80211_IFTYPE_ADHOC) ||
1614                        ((priv->ah->opmode == NL80211_IFTYPE_STATION) &&
1615                         (priv->num_sta_vif == 1)));
1616
1617
1618         if (changed & BSS_CHANGED_ASSOC) {
1619                 if (set_assoc) {
1620                         ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
1621                                 bss_conf->assoc);
1622
1623                         common->curaid = bss_conf->assoc ?
1624                                 bss_conf->aid : 0;
1625
1626                         if (bss_conf->assoc)
1627                                 ath9k_htc_start_ani(priv);
1628                         else
1629                                 ath9k_htc_stop_ani(priv);
1630                 }
1631         }
1632
1633         if (changed & BSS_CHANGED_BSSID) {
1634                 if (set_assoc) {
1635                         memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1636                         ath9k_hw_write_associd(ah);
1637
1638                         ath_dbg(common, ATH_DBG_CONFIG,
1639                                 "BSSID: %pM aid: 0x%x\n",
1640                                 common->curbssid, common->curaid);
1641                 }
1642         }
1643
1644         if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) {
1645                 ath_dbg(common, ATH_DBG_CONFIG,
1646                         "Beacon enabled for BSS: %pM\n", bss_conf->bssid);
1647                 priv->op_flags |= OP_ENABLE_BEACON;
1648                 ath9k_htc_beacon_config(priv, vif);
1649         }
1650
1651         if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) {
1652                 /*
1653                  * Disable SWBA interrupt only if there are no
1654                  * AP/IBSS interfaces.
1655                  */
1656                 if ((priv->num_ap_vif <= 1) || priv->num_ibss_vif) {
1657                         ath_dbg(common, ATH_DBG_CONFIG,
1658                                 "Beacon disabled for BSS: %pM\n",
1659                                 bss_conf->bssid);
1660                         priv->op_flags &= ~OP_ENABLE_BEACON;
1661                         ath9k_htc_beacon_config(priv, vif);
1662                 }
1663         }
1664
1665         if (changed & BSS_CHANGED_BEACON_INT) {
1666                 /*
1667                  * Reset the HW TSF for the first AP interface.
1668                  */
1669                 if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1670                     (priv->nvifs == 1) &&
1671                     (priv->num_ap_vif == 1) &&
1672                     (vif->type == NL80211_IFTYPE_AP)) {
1673                         priv->op_flags |= OP_TSF_RESET;
1674                 }
1675                 ath_dbg(common, ATH_DBG_CONFIG,
1676                         "Beacon interval changed for BSS: %pM\n",
1677                         bss_conf->bssid);
1678                 ath9k_htc_beacon_config(priv, vif);
1679         }
1680
1681         if (changed & BSS_CHANGED_ERP_SLOT) {
1682                 if (bss_conf->use_short_slot)
1683                         ah->slottime = 9;
1684                 else
1685                         ah->slottime = 20;
1686
1687                 ath9k_hw_init_global_settings(ah);
1688         }
1689
1690         if (changed & BSS_CHANGED_HT)
1691                 ath9k_htc_update_rate(priv, vif, bss_conf);
1692
1693         ath9k_htc_ps_restore(priv);
1694         mutex_unlock(&priv->mutex);
1695 }
1696
1697 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw)
1698 {
1699         struct ath9k_htc_priv *priv = hw->priv;
1700         u64 tsf;
1701
1702         mutex_lock(&priv->mutex);
1703         ath9k_htc_ps_wakeup(priv);
1704         tsf = ath9k_hw_gettsf64(priv->ah);
1705         ath9k_htc_ps_restore(priv);
1706         mutex_unlock(&priv->mutex);
1707
1708         return tsf;
1709 }
1710
1711 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, u64 tsf)
1712 {
1713         struct ath9k_htc_priv *priv = hw->priv;
1714
1715         mutex_lock(&priv->mutex);
1716         ath9k_htc_ps_wakeup(priv);
1717         ath9k_hw_settsf64(priv->ah, tsf);
1718         ath9k_htc_ps_restore(priv);
1719         mutex_unlock(&priv->mutex);
1720 }
1721
1722 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw)
1723 {
1724         struct ath9k_htc_priv *priv = hw->priv;
1725
1726         mutex_lock(&priv->mutex);
1727         ath9k_htc_ps_wakeup(priv);
1728         ath9k_hw_reset_tsf(priv->ah);
1729         ath9k_htc_ps_restore(priv);
1730         mutex_unlock(&priv->mutex);
1731 }
1732
1733 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
1734                                   struct ieee80211_vif *vif,
1735                                   enum ieee80211_ampdu_mlme_action action,
1736                                   struct ieee80211_sta *sta,
1737                                   u16 tid, u16 *ssn, u8 buf_size)
1738 {
1739         struct ath9k_htc_priv *priv = hw->priv;
1740         struct ath9k_htc_sta *ista;
1741         int ret = 0;
1742
1743         mutex_lock(&priv->mutex);
1744
1745         switch (action) {
1746         case IEEE80211_AMPDU_RX_START:
1747                 break;
1748         case IEEE80211_AMPDU_RX_STOP:
1749                 break;
1750         case IEEE80211_AMPDU_TX_START:
1751                 ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1752                 if (!ret)
1753                         ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1754                 break;
1755         case IEEE80211_AMPDU_TX_STOP:
1756                 ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1757                 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1758                 break;
1759         case IEEE80211_AMPDU_TX_OPERATIONAL:
1760                 ista = (struct ath9k_htc_sta *) sta->drv_priv;
1761                 spin_lock_bh(&priv->tx_lock);
1762                 ista->tid_state[tid] = AGGR_OPERATIONAL;
1763                 spin_unlock_bh(&priv->tx_lock);
1764                 break;
1765         default:
1766                 ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n");
1767         }
1768
1769         mutex_unlock(&priv->mutex);
1770
1771         return ret;
1772 }
1773
1774 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)
1775 {
1776         struct ath9k_htc_priv *priv = hw->priv;
1777
1778         mutex_lock(&priv->mutex);
1779         spin_lock_bh(&priv->beacon_lock);
1780         priv->op_flags |= OP_SCANNING;
1781         spin_unlock_bh(&priv->beacon_lock);
1782         cancel_work_sync(&priv->ps_work);
1783         ath9k_htc_stop_ani(priv);
1784         mutex_unlock(&priv->mutex);
1785 }
1786
1787 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
1788 {
1789         struct ath9k_htc_priv *priv = hw->priv;
1790
1791         mutex_lock(&priv->mutex);
1792         spin_lock_bh(&priv->beacon_lock);
1793         priv->op_flags &= ~OP_SCANNING;
1794         spin_unlock_bh(&priv->beacon_lock);
1795         ath9k_htc_ps_wakeup(priv);
1796         ath9k_htc_vif_reconfig(priv);
1797         ath9k_htc_ps_restore(priv);
1798         mutex_unlock(&priv->mutex);
1799 }
1800
1801 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1802 {
1803         return 0;
1804 }
1805
1806 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw,
1807                                          u8 coverage_class)
1808 {
1809         struct ath9k_htc_priv *priv = hw->priv;
1810
1811         mutex_lock(&priv->mutex);
1812         ath9k_htc_ps_wakeup(priv);
1813         priv->ah->coverage_class = coverage_class;
1814         ath9k_hw_init_global_settings(priv->ah);
1815         ath9k_htc_ps_restore(priv);
1816         mutex_unlock(&priv->mutex);
1817 }
1818
1819 struct ieee80211_ops ath9k_htc_ops = {
1820         .tx                 = ath9k_htc_tx,
1821         .start              = ath9k_htc_start,
1822         .stop               = ath9k_htc_stop,
1823         .add_interface      = ath9k_htc_add_interface,
1824         .remove_interface   = ath9k_htc_remove_interface,
1825         .config             = ath9k_htc_config,
1826         .configure_filter   = ath9k_htc_configure_filter,
1827         .sta_add            = ath9k_htc_sta_add,
1828         .sta_remove         = ath9k_htc_sta_remove,
1829         .conf_tx            = ath9k_htc_conf_tx,
1830         .bss_info_changed   = ath9k_htc_bss_info_changed,
1831         .set_key            = ath9k_htc_set_key,
1832         .get_tsf            = ath9k_htc_get_tsf,
1833         .set_tsf            = ath9k_htc_set_tsf,
1834         .reset_tsf          = ath9k_htc_reset_tsf,
1835         .ampdu_action       = ath9k_htc_ampdu_action,
1836         .sw_scan_start      = ath9k_htc_sw_scan_start,
1837         .sw_scan_complete   = ath9k_htc_sw_scan_complete,
1838         .set_rts_threshold  = ath9k_htc_set_rts_threshold,
1839         .rfkill_poll        = ath9k_htc_rfkill_poll_state,
1840         .set_coverage_class = ath9k_htc_set_coverage_class,
1841 };