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