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