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