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