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