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