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