2 * Copyright (c) 2010 Atheros Communications Inc.
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.
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.
19 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
20 static struct dentry *ath9k_debugfs_root;
27 static void ath_update_txpow(struct ath9k_htc_priv *priv)
29 struct ath_hw *ah = priv->ah;
31 if (priv->curtxpow != priv->txpowlimit) {
32 ath9k_hw_set_txpowerlimit(ah, priv->txpowlimit);
33 /* read back in case value is clamped */
34 priv->curtxpow = ath9k_hw_regulatory(ah)->power_limit;
38 /* HACK Alert: Use 11NG for 2.4, use 11NA for 5 */
39 static enum htc_phymode ath9k_htc_get_curmode(struct ath9k_htc_priv *priv,
40 struct ath9k_channel *ichan)
42 enum htc_phymode mode;
46 switch (ichan->chanmode) {
49 case CHANNEL_G_HT40PLUS:
50 case CHANNEL_G_HT40MINUS:
55 case CHANNEL_A_HT40PLUS:
56 case CHANNEL_A_HT40MINUS:
66 static bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
67 enum ath9k_power_mode mode)
71 mutex_lock(&priv->htc_pm_lock);
72 ret = ath9k_hw_setpower(priv->ah, mode);
73 mutex_unlock(&priv->htc_pm_lock);
78 void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv)
80 mutex_lock(&priv->htc_pm_lock);
81 if (++priv->ps_usecount != 1)
83 ath9k_hw_setpower(priv->ah, ATH9K_PM_AWAKE);
86 mutex_unlock(&priv->htc_pm_lock);
89 void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv)
91 mutex_lock(&priv->htc_pm_lock);
92 if (--priv->ps_usecount != 0)
96 ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP);
97 else if (priv->ps_enabled)
98 ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP);
101 mutex_unlock(&priv->htc_pm_lock);
104 void ath9k_ps_work(struct work_struct *work)
106 struct ath9k_htc_priv *priv =
107 container_of(work, struct ath9k_htc_priv,
109 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
111 /* The chip wakes up after receiving the first beacon
112 while network sleep is enabled. For the driver to
113 be in sync with the hw, set the chip to awake and
114 only then set it to sleep.
116 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
119 static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
120 struct ieee80211_hw *hw,
121 struct ath9k_channel *hchan)
123 struct ath_hw *ah = priv->ah;
124 struct ath_common *common = ath9k_hw_common(ah);
125 struct ieee80211_conf *conf = &common->hw->conf;
127 struct ieee80211_channel *channel = hw->conf.channel;
128 struct ath9k_hw_cal_data *caldata;
129 enum htc_phymode mode;
134 if (priv->op_flags & OP_INVALID)
137 if (priv->op_flags & OP_FULL_RESET)
140 ath9k_htc_ps_wakeup(priv);
142 WMI_CMD(WMI_DISABLE_INTR_CMDID);
143 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
144 WMI_CMD(WMI_STOP_RECV_CMDID);
146 ath_print(common, ATH_DBG_CONFIG,
147 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n",
148 priv->ah->curchan->channel,
149 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf),
152 caldata = &priv->caldata[channel->hw_value];
153 ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
155 ath_print(common, ATH_DBG_FATAL,
156 "Unable to reset channel (%u Mhz) "
157 "reset status %d\n", channel->center_freq, ret);
161 ath_update_txpow(priv);
163 WMI_CMD(WMI_START_RECV_CMDID);
167 ath9k_host_rx_init(priv);
169 mode = ath9k_htc_get_curmode(priv, hchan);
170 htc_mode = cpu_to_be16(mode);
171 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
175 WMI_CMD(WMI_ENABLE_INTR_CMDID);
179 htc_start(priv->htc);
181 priv->op_flags &= ~OP_FULL_RESET;
183 ath9k_htc_ps_restore(priv);
187 static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv)
189 struct ath_common *common = ath9k_hw_common(priv->ah);
190 struct ath9k_htc_target_vif hvif;
197 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
198 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
200 hvif.opmode = cpu_to_be32(HTC_M_MONITOR);
201 priv->ah->opmode = NL80211_IFTYPE_MONITOR;
202 hvif.index = priv->nvifs;
204 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
212 static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
214 struct ath_common *common = ath9k_hw_common(priv->ah);
215 struct ath9k_htc_target_vif hvif;
219 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
220 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
221 hvif.index = 0; /* Should do for now */
222 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
228 static int ath9k_htc_add_station(struct ath9k_htc_priv *priv,
229 struct ieee80211_vif *vif,
230 struct ieee80211_sta *sta)
232 struct ath_common *common = ath9k_hw_common(priv->ah);
233 struct ath9k_htc_target_sta tsta;
234 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
235 struct ath9k_htc_sta *ista;
239 if (priv->nstations >= ATH9K_HTC_MAX_STA)
242 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
245 ista = (struct ath9k_htc_sta *) sta->drv_priv;
246 memcpy(&tsta.macaddr, sta->addr, ETH_ALEN);
247 memcpy(&tsta.bssid, common->curbssid, ETH_ALEN);
248 tsta.associd = common->curaid;
251 ista->index = priv->nstations;
253 memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
257 tsta.sta_index = priv->nstations;
258 tsta.vif_index = avp->index;
259 tsta.maxampdu = 0xffff;
260 if (sta && sta->ht_cap.ht_supported)
261 tsta.flags = cpu_to_be16(ATH_HTC_STA_HT);
263 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
266 ath_print(common, ATH_DBG_FATAL,
267 "Unable to add station entry for: %pM\n", sta->addr);
272 ath_print(common, ATH_DBG_CONFIG,
273 "Added a station entry for: %pM (idx: %d)\n",
274 sta->addr, tsta.sta_index);
280 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv,
281 struct ieee80211_vif *vif,
282 struct ieee80211_sta *sta)
284 struct ath_common *common = ath9k_hw_common(priv->ah);
285 struct ath9k_htc_sta *ista;
290 ista = (struct ath9k_htc_sta *) sta->drv_priv;
291 sta_idx = ista->index;
296 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
299 ath_print(common, ATH_DBG_FATAL,
300 "Unable to remove station entry for: %pM\n",
306 ath_print(common, ATH_DBG_CONFIG,
307 "Removed a station entry for: %pM (idx: %d)\n",
314 static int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv)
316 struct ath9k_htc_cap_target tcap;
320 memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target));
322 /* FIXME: Values are hardcoded */
323 tcap.flags = 0x240c40;
324 tcap.flags_ext = 0x80601000;
325 tcap.ampdu_limit = 0xffff0000;
326 tcap.ampdu_subframes = 20;
327 tcap.tx_chainmask_legacy = priv->ah->caps.tx_chainmask;
329 tcap.tx_chainmask = priv->ah->caps.tx_chainmask;
331 WMI_CMD_BUF(WMI_TARGET_IC_UPDATE_CMDID, &tcap);
336 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
337 struct ieee80211_sta *sta,
338 struct ath9k_htc_target_rate *trate)
340 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv;
341 struct ieee80211_supported_band *sband;
345 sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
347 for (i = 0, j = 0; i < sband->n_bitrates; i++) {
348 if (sta->supp_rates[sband->band] & BIT(i)) {
349 trate->rates.legacy_rates.rs_rates[j]
350 = (sband->bitrates[i].bitrate * 2) / 10;
354 trate->rates.legacy_rates.rs_nrates = j;
356 if (sta->ht_cap.ht_supported) {
357 for (i = 0, j = 0; i < 77; i++) {
358 if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
359 trate->rates.ht_rates.rs_rates[j++] = i;
360 if (j == ATH_HTC_RATE_MAX)
363 trate->rates.ht_rates.rs_nrates = j;
365 caps = WLAN_RC_HT_FLAG;
366 if (sta->ht_cap.mcs.rx_mask[1])
367 caps |= WLAN_RC_DS_FLAG;
368 if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
369 (conf_is_ht40(&priv->hw->conf)))
370 caps |= WLAN_RC_40_FLAG;
371 if (conf_is_ht40(&priv->hw->conf) &&
372 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
373 caps |= WLAN_RC_SGI_FLAG;
374 else if (conf_is_ht20(&priv->hw->conf) &&
375 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
376 caps |= WLAN_RC_SGI_FLAG;
379 trate->sta_index = ista->index;
381 trate->capflags = cpu_to_be32(caps);
384 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv,
385 struct ath9k_htc_target_rate *trate)
387 struct ath_common *common = ath9k_hw_common(priv->ah);
391 WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, trate);
393 ath_print(common, ATH_DBG_FATAL,
394 "Unable to initialize Rate information on target\n");
400 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv,
401 struct ieee80211_sta *sta)
403 struct ath_common *common = ath9k_hw_common(priv->ah);
404 struct ath9k_htc_target_rate trate;
407 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
408 ath9k_htc_setup_rate(priv, sta, &trate);
409 ret = ath9k_htc_send_rate_cmd(priv, &trate);
411 ath_print(common, ATH_DBG_CONFIG,
412 "Updated target sta: %pM, rate caps: 0x%X\n",
413 sta->addr, be32_to_cpu(trate.capflags));
416 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv,
417 struct ieee80211_vif *vif,
418 struct ieee80211_bss_conf *bss_conf)
420 struct ath_common *common = ath9k_hw_common(priv->ah);
421 struct ath9k_htc_target_rate trate;
422 struct ieee80211_sta *sta;
425 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
428 sta = ieee80211_find_sta(vif, bss_conf->bssid);
433 ath9k_htc_setup_rate(priv, sta, &trate);
436 ret = ath9k_htc_send_rate_cmd(priv, &trate);
438 ath_print(common, ATH_DBG_CONFIG,
439 "Updated target sta: %pM, rate caps: 0x%X\n",
440 bss_conf->bssid, be32_to_cpu(trate.capflags));
443 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
444 struct ieee80211_vif *vif,
445 struct ieee80211_sta *sta,
446 enum ieee80211_ampdu_mlme_action action,
449 struct ath_common *common = ath9k_hw_common(priv->ah);
450 struct ath9k_htc_target_aggr aggr;
451 struct ath9k_htc_sta *ista;
455 if (tid >= ATH9K_HTC_MAX_TID)
458 memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr));
459 ista = (struct ath9k_htc_sta *) sta->drv_priv;
461 aggr.sta_index = ista->index;
462 aggr.tidno = tid & 0xf;
463 aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false;
465 WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr);
467 ath_print(common, ATH_DBG_CONFIG,
468 "Unable to %s TX aggregation for (%pM, %d)\n",
469 (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid);
471 ath_print(common, ATH_DBG_CONFIG,
472 "%s TX aggregation for (%pM, %d)\n",
473 (aggr.aggr_enable) ? "Starting" : "Stopping",
476 spin_lock_bh(&priv->tx_lock);
477 ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP;
478 spin_unlock_bh(&priv->tx_lock);
487 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
489 static int ath9k_debugfs_open(struct inode *inode, struct file *file)
491 file->private_data = inode->i_private;
495 static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf,
496 size_t count, loff_t *ppos)
498 struct ath9k_htc_priv *priv = file->private_data;
499 struct ath9k_htc_target_stats cmd_rsp;
501 unsigned int len = 0;
504 memset(&cmd_rsp, 0, sizeof(cmd_rsp));
506 WMI_CMD(WMI_TGT_STATS_CMDID);
511 len += snprintf(buf + len, sizeof(buf) - len,
512 "%19s : %10u\n", "TX Short Retries",
513 be32_to_cpu(cmd_rsp.tx_shortretry));
514 len += snprintf(buf + len, sizeof(buf) - len,
515 "%19s : %10u\n", "TX Long Retries",
516 be32_to_cpu(cmd_rsp.tx_longretry));
517 len += snprintf(buf + len, sizeof(buf) - len,
518 "%19s : %10u\n", "TX Xretries",
519 be32_to_cpu(cmd_rsp.tx_xretries));
520 len += snprintf(buf + len, sizeof(buf) - len,
521 "%19s : %10u\n", "TX Unaggr. Xretries",
522 be32_to_cpu(cmd_rsp.ht_txunaggr_xretry));
523 len += snprintf(buf + len, sizeof(buf) - len,
524 "%19s : %10u\n", "TX Xretries (HT)",
525 be32_to_cpu(cmd_rsp.ht_tx_xretries));
526 len += snprintf(buf + len, sizeof(buf) - len,
527 "%19s : %10u\n", "TX Rate", priv->debug.txrate);
529 if (len > sizeof(buf))
532 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
535 static const struct file_operations fops_tgt_stats = {
536 .read = read_file_tgt_stats,
537 .open = ath9k_debugfs_open,
541 static ssize_t read_file_xmit(struct file *file, char __user *user_buf,
542 size_t count, loff_t *ppos)
544 struct ath9k_htc_priv *priv = file->private_data;
546 unsigned int len = 0;
548 len += snprintf(buf + len, sizeof(buf) - len,
549 "%20s : %10u\n", "Buffers queued",
550 priv->debug.tx_stats.buf_queued);
551 len += snprintf(buf + len, sizeof(buf) - len,
552 "%20s : %10u\n", "Buffers completed",
553 priv->debug.tx_stats.buf_completed);
554 len += snprintf(buf + len, sizeof(buf) - len,
555 "%20s : %10u\n", "SKBs queued",
556 priv->debug.tx_stats.skb_queued);
557 len += snprintf(buf + len, sizeof(buf) - len,
558 "%20s : %10u\n", "SKBs completed",
559 priv->debug.tx_stats.skb_completed);
560 len += snprintf(buf + len, sizeof(buf) - len,
561 "%20s : %10u\n", "SKBs dropped",
562 priv->debug.tx_stats.skb_dropped);
564 len += snprintf(buf + len, sizeof(buf) - len,
565 "%20s : %10u\n", "BE queued",
566 priv->debug.tx_stats.queue_stats[WME_AC_BE]);
567 len += snprintf(buf + len, sizeof(buf) - len,
568 "%20s : %10u\n", "BK queued",
569 priv->debug.tx_stats.queue_stats[WME_AC_BK]);
570 len += snprintf(buf + len, sizeof(buf) - len,
571 "%20s : %10u\n", "VI queued",
572 priv->debug.tx_stats.queue_stats[WME_AC_VI]);
573 len += snprintf(buf + len, sizeof(buf) - len,
574 "%20s : %10u\n", "VO queued",
575 priv->debug.tx_stats.queue_stats[WME_AC_VO]);
577 if (len > sizeof(buf))
580 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
583 static const struct file_operations fops_xmit = {
584 .read = read_file_xmit,
585 .open = ath9k_debugfs_open,
589 static ssize_t read_file_recv(struct file *file, char __user *user_buf,
590 size_t count, loff_t *ppos)
592 struct ath9k_htc_priv *priv = file->private_data;
594 unsigned int len = 0;
596 len += snprintf(buf + len, sizeof(buf) - len,
597 "%20s : %10u\n", "SKBs allocated",
598 priv->debug.rx_stats.skb_allocated);
599 len += snprintf(buf + len, sizeof(buf) - len,
600 "%20s : %10u\n", "SKBs completed",
601 priv->debug.rx_stats.skb_completed);
602 len += snprintf(buf + len, sizeof(buf) - len,
603 "%20s : %10u\n", "SKBs Dropped",
604 priv->debug.rx_stats.skb_dropped);
606 if (len > sizeof(buf))
609 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
612 static const struct file_operations fops_recv = {
613 .read = read_file_recv,
614 .open = ath9k_debugfs_open,
618 int ath9k_htc_init_debug(struct ath_hw *ah)
620 struct ath_common *common = ath9k_hw_common(ah);
621 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
623 if (!ath9k_debugfs_root)
626 priv->debug.debugfs_phy = debugfs_create_dir(wiphy_name(priv->hw->wiphy),
628 if (!priv->debug.debugfs_phy)
631 priv->debug.debugfs_tgt_stats = debugfs_create_file("tgt_stats", S_IRUSR,
632 priv->debug.debugfs_phy,
633 priv, &fops_tgt_stats);
634 if (!priv->debug.debugfs_tgt_stats)
638 priv->debug.debugfs_xmit = debugfs_create_file("xmit", S_IRUSR,
639 priv->debug.debugfs_phy,
641 if (!priv->debug.debugfs_xmit)
644 priv->debug.debugfs_recv = debugfs_create_file("recv", S_IRUSR,
645 priv->debug.debugfs_phy,
647 if (!priv->debug.debugfs_recv)
653 ath9k_htc_exit_debug(ah);
657 void ath9k_htc_exit_debug(struct ath_hw *ah)
659 struct ath_common *common = ath9k_hw_common(ah);
660 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
662 debugfs_remove(priv->debug.debugfs_recv);
663 debugfs_remove(priv->debug.debugfs_xmit);
664 debugfs_remove(priv->debug.debugfs_tgt_stats);
665 debugfs_remove(priv->debug.debugfs_phy);
668 int ath9k_htc_debug_create_root(void)
670 ath9k_debugfs_root = debugfs_create_dir(KBUILD_MODNAME, NULL);
671 if (!ath9k_debugfs_root)
677 void ath9k_htc_debug_remove_root(void)
679 debugfs_remove(ath9k_debugfs_root);
680 ath9k_debugfs_root = NULL;
683 #endif /* CONFIG_ATH9K_HTC_DEBUGFS */
689 static void ath_start_ani(struct ath9k_htc_priv *priv)
691 struct ath_common *common = ath9k_hw_common(priv->ah);
692 unsigned long timestamp = jiffies_to_msecs(jiffies);
694 common->ani.longcal_timer = timestamp;
695 common->ani.shortcal_timer = timestamp;
696 common->ani.checkani_timer = timestamp;
698 ieee80211_queue_delayed_work(common->hw, &priv->ath9k_ani_work,
699 msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
702 void ath9k_ani_work(struct work_struct *work)
704 struct ath9k_htc_priv *priv =
705 container_of(work, struct ath9k_htc_priv,
706 ath9k_ani_work.work);
707 struct ath_hw *ah = priv->ah;
708 struct ath_common *common = ath9k_hw_common(ah);
709 bool longcal = false;
710 bool shortcal = false;
711 bool aniflag = false;
712 unsigned int timestamp = jiffies_to_msecs(jiffies);
713 u32 cal_interval, short_cal_interval;
715 short_cal_interval = ATH_STA_SHORT_CALINTERVAL;
717 /* Only calibrate if awake */
718 if (ah->power_mode != ATH9K_PM_AWAKE)
721 /* Long calibration runs independently of short calibration. */
722 if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
724 ath_print(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
725 common->ani.longcal_timer = timestamp;
728 /* Short calibration applies only while caldone is false */
729 if (!common->ani.caldone) {
730 if ((timestamp - common->ani.shortcal_timer) >=
731 short_cal_interval) {
733 ath_print(common, ATH_DBG_ANI,
734 "shortcal @%lu\n", jiffies);
735 common->ani.shortcal_timer = timestamp;
736 common->ani.resetcal_timer = timestamp;
739 if ((timestamp - common->ani.resetcal_timer) >=
740 ATH_RESTART_CALINTERVAL) {
741 common->ani.caldone = ath9k_hw_reset_calvalid(ah);
742 if (common->ani.caldone)
743 common->ani.resetcal_timer = timestamp;
747 /* Verify whether we must check ANI */
748 if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
750 common->ani.checkani_timer = timestamp;
753 /* Skip all processing if there's nothing to do. */
754 if (longcal || shortcal || aniflag) {
756 ath9k_htc_ps_wakeup(priv);
758 /* Call ANI routine if necessary */
760 ath9k_hw_ani_monitor(ah, ah->curchan);
762 /* Perform calibration if necessary */
763 if (longcal || shortcal)
764 common->ani.caldone =
765 ath9k_hw_calibrate(ah, ah->curchan,
766 common->rx_chainmask,
769 ath9k_htc_ps_restore(priv);
774 * Set timer interval based on previous results.
775 * The interval must be the shortest necessary to satisfy ANI,
776 * short calibration and long calibration.
778 cal_interval = ATH_LONG_CALINTERVAL;
779 if (priv->ah->config.enable_ani)
780 cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
781 if (!common->ani.caldone)
782 cal_interval = min(cal_interval, (u32)short_cal_interval);
784 ieee80211_queue_delayed_work(common->hw, &priv->ath9k_ani_work,
785 msecs_to_jiffies(cal_interval));
792 static void ath9k_led_blink_work(struct work_struct *work)
794 struct ath9k_htc_priv *priv = container_of(work, struct ath9k_htc_priv,
795 ath9k_led_blink_work.work);
797 if (!(priv->op_flags & OP_LED_ASSOCIATED))
800 if ((priv->led_on_duration == ATH_LED_ON_DURATION_IDLE) ||
801 (priv->led_off_duration == ATH_LED_OFF_DURATION_IDLE))
802 ath9k_hw_set_gpio(priv->ah, priv->ah->led_pin, 0);
804 ath9k_hw_set_gpio(priv->ah, priv->ah->led_pin,
805 (priv->op_flags & OP_LED_ON) ? 1 : 0);
807 ieee80211_queue_delayed_work(priv->hw,
808 &priv->ath9k_led_blink_work,
809 (priv->op_flags & OP_LED_ON) ?
810 msecs_to_jiffies(priv->led_off_duration) :
811 msecs_to_jiffies(priv->led_on_duration));
813 priv->led_on_duration = priv->led_on_cnt ?
814 max((ATH_LED_ON_DURATION_IDLE - priv->led_on_cnt), 25) :
815 ATH_LED_ON_DURATION_IDLE;
816 priv->led_off_duration = priv->led_off_cnt ?
817 max((ATH_LED_OFF_DURATION_IDLE - priv->led_off_cnt), 10) :
818 ATH_LED_OFF_DURATION_IDLE;
819 priv->led_on_cnt = priv->led_off_cnt = 0;
821 if (priv->op_flags & OP_LED_ON)
822 priv->op_flags &= ~OP_LED_ON;
824 priv->op_flags |= OP_LED_ON;
827 static void ath9k_led_brightness_work(struct work_struct *work)
829 struct ath_led *led = container_of(work, struct ath_led,
830 brightness_work.work);
831 struct ath9k_htc_priv *priv = led->priv;
833 switch (led->brightness) {
835 if (led->led_type == ATH_LED_ASSOC ||
836 led->led_type == ATH_LED_RADIO) {
837 ath9k_hw_set_gpio(priv->ah, priv->ah->led_pin,
838 (led->led_type == ATH_LED_RADIO));
839 priv->op_flags &= ~OP_LED_ASSOCIATED;
840 if (led->led_type == ATH_LED_RADIO)
841 priv->op_flags &= ~OP_LED_ON;
847 if (led->led_type == ATH_LED_ASSOC) {
848 priv->op_flags |= OP_LED_ASSOCIATED;
849 ieee80211_queue_delayed_work(priv->hw,
850 &priv->ath9k_led_blink_work, 0);
851 } else if (led->led_type == ATH_LED_RADIO) {
852 ath9k_hw_set_gpio(priv->ah, priv->ah->led_pin, 0);
853 priv->op_flags |= OP_LED_ON;
863 static void ath9k_led_brightness(struct led_classdev *led_cdev,
864 enum led_brightness brightness)
866 struct ath_led *led = container_of(led_cdev, struct ath_led, led_cdev);
867 struct ath9k_htc_priv *priv = led->priv;
869 led->brightness = brightness;
870 if (!(priv->op_flags & OP_LED_DEINIT))
871 ieee80211_queue_delayed_work(priv->hw,
872 &led->brightness_work, 0);
875 static void ath9k_led_stop_brightness(struct ath9k_htc_priv *priv)
877 cancel_delayed_work_sync(&priv->radio_led.brightness_work);
878 cancel_delayed_work_sync(&priv->assoc_led.brightness_work);
879 cancel_delayed_work_sync(&priv->tx_led.brightness_work);
880 cancel_delayed_work_sync(&priv->rx_led.brightness_work);
883 static int ath9k_register_led(struct ath9k_htc_priv *priv, struct ath_led *led,
889 led->led_cdev.name = led->name;
890 led->led_cdev.default_trigger = trigger;
891 led->led_cdev.brightness_set = ath9k_led_brightness;
893 ret = led_classdev_register(wiphy_dev(priv->hw->wiphy), &led->led_cdev);
895 ath_print(ath9k_hw_common(priv->ah), ATH_DBG_FATAL,
896 "Failed to register led:%s", led->name);
900 INIT_DELAYED_WORK(&led->brightness_work, ath9k_led_brightness_work);
905 static void ath9k_unregister_led(struct ath_led *led)
907 if (led->registered) {
908 led_classdev_unregister(&led->led_cdev);
913 void ath9k_deinit_leds(struct ath9k_htc_priv *priv)
915 priv->op_flags |= OP_LED_DEINIT;
916 ath9k_unregister_led(&priv->assoc_led);
917 priv->op_flags &= ~OP_LED_ASSOCIATED;
918 ath9k_unregister_led(&priv->tx_led);
919 ath9k_unregister_led(&priv->rx_led);
920 ath9k_unregister_led(&priv->radio_led);
923 void ath9k_init_leds(struct ath9k_htc_priv *priv)
928 if (AR_SREV_9287(priv->ah))
929 priv->ah->led_pin = ATH_LED_PIN_9287;
930 else if (AR_SREV_9271(priv->ah))
931 priv->ah->led_pin = ATH_LED_PIN_9271;
932 else if (AR_DEVID_7010(priv->ah))
933 priv->ah->led_pin = ATH_LED_PIN_7010;
935 priv->ah->led_pin = ATH_LED_PIN_DEF;
937 /* Configure gpio 1 for output */
938 ath9k_hw_cfg_output(priv->ah, priv->ah->led_pin,
939 AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
940 /* LED off, active low */
941 ath9k_hw_set_gpio(priv->ah, priv->ah->led_pin, 1);
943 INIT_DELAYED_WORK(&priv->ath9k_led_blink_work, ath9k_led_blink_work);
945 trigger = ieee80211_get_radio_led_name(priv->hw);
946 snprintf(priv->radio_led.name, sizeof(priv->radio_led.name),
947 "ath9k-%s::radio", wiphy_name(priv->hw->wiphy));
948 ret = ath9k_register_led(priv, &priv->radio_led, trigger);
949 priv->radio_led.led_type = ATH_LED_RADIO;
953 trigger = ieee80211_get_assoc_led_name(priv->hw);
954 snprintf(priv->assoc_led.name, sizeof(priv->assoc_led.name),
955 "ath9k-%s::assoc", wiphy_name(priv->hw->wiphy));
956 ret = ath9k_register_led(priv, &priv->assoc_led, trigger);
957 priv->assoc_led.led_type = ATH_LED_ASSOC;
961 trigger = ieee80211_get_tx_led_name(priv->hw);
962 snprintf(priv->tx_led.name, sizeof(priv->tx_led.name),
963 "ath9k-%s::tx", wiphy_name(priv->hw->wiphy));
964 ret = ath9k_register_led(priv, &priv->tx_led, trigger);
965 priv->tx_led.led_type = ATH_LED_TX;
969 trigger = ieee80211_get_rx_led_name(priv->hw);
970 snprintf(priv->rx_led.name, sizeof(priv->rx_led.name),
971 "ath9k-%s::rx", wiphy_name(priv->hw->wiphy));
972 ret = ath9k_register_led(priv, &priv->rx_led, trigger);
973 priv->rx_led.led_type = ATH_LED_RX;
977 priv->op_flags &= ~OP_LED_DEINIT;
982 cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
983 ath9k_deinit_leds(priv);
986 /*******************/
988 /*******************/
990 static bool ath_is_rfkill_set(struct ath9k_htc_priv *priv)
992 return ath9k_hw_gpio_get(priv->ah, priv->ah->rfkill_gpio) ==
993 priv->ah->rfkill_polarity;
996 static void ath9k_htc_rfkill_poll_state(struct ieee80211_hw *hw)
998 struct ath9k_htc_priv *priv = hw->priv;
999 bool blocked = !!ath_is_rfkill_set(priv);
1001 wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
1004 void ath9k_start_rfkill_poll(struct ath9k_htc_priv *priv)
1006 if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1007 wiphy_rfkill_start_polling(priv->hw->wiphy);
1010 static void ath9k_htc_radio_enable(struct ieee80211_hw *hw)
1012 struct ath9k_htc_priv *priv = hw->priv;
1013 struct ath_hw *ah = priv->ah;
1014 struct ath_common *common = ath9k_hw_common(ah);
1019 ah->curchan = ath9k_cmn_get_curchannel(hw, ah);
1022 ret = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
1024 ath_print(common, ATH_DBG_FATAL,
1025 "Unable to reset hardware; reset status %d "
1026 "(freq %u MHz)\n", ret, ah->curchan->channel);
1029 ath_update_txpow(priv);
1032 WMI_CMD(WMI_START_RECV_CMDID);
1033 ath9k_host_rx_init(priv);
1036 htc_start(priv->htc);
1037 spin_lock_bh(&priv->tx_lock);
1038 priv->tx_queues_stop = false;
1039 spin_unlock_bh(&priv->tx_lock);
1040 ieee80211_wake_queues(hw);
1042 WMI_CMD(WMI_ENABLE_INTR_CMDID);
1045 ath9k_hw_cfg_output(ah, ah->led_pin,
1046 AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1047 ath9k_hw_set_gpio(ah, ah->led_pin, 0);
1050 static void ath9k_htc_radio_disable(struct ieee80211_hw *hw)
1052 struct ath9k_htc_priv *priv = hw->priv;
1053 struct ath_hw *ah = priv->ah;
1054 struct ath_common *common = ath9k_hw_common(ah);
1058 ath9k_htc_ps_wakeup(priv);
1061 ath9k_hw_set_gpio(ah, ah->led_pin, 1);
1062 ath9k_hw_cfg_gpio_input(ah, ah->led_pin);
1064 WMI_CMD(WMI_DISABLE_INTR_CMDID);
1067 ieee80211_stop_queues(hw);
1068 htc_stop(priv->htc);
1069 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
1070 skb_queue_purge(&priv->tx_queue);
1073 WMI_CMD(WMI_STOP_RECV_CMDID);
1076 * The MIB counters have to be disabled here,
1077 * since the target doesn't do it.
1079 ath9k_hw_disable_mib_counters(ah);
1082 ah->curchan = ath9k_cmn_get_curchannel(hw, ah);
1085 ret = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false);
1087 ath_print(common, ATH_DBG_FATAL,
1088 "Unable to reset hardware; reset status %d "
1089 "(freq %u MHz)\n", ret, ah->curchan->channel);
1092 /* Disable the PHY */
1093 ath9k_hw_phy_disable(ah);
1095 ath9k_htc_ps_restore(priv);
1096 ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);
1099 /**********************/
1100 /* mac80211 Callbacks */
1101 /**********************/
1103 static int ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
1105 struct ieee80211_hdr *hdr;
1106 struct ath9k_htc_priv *priv = hw->priv;
1107 int padpos, padsize, ret;
1109 hdr = (struct ieee80211_hdr *) skb->data;
1111 /* Add the padding after the header if this is not already done */
1112 padpos = ath9k_cmn_padpos(hdr->frame_control);
1113 padsize = padpos & 3;
1114 if (padsize && skb->len > padpos) {
1115 if (skb_headroom(skb) < padsize)
1117 skb_push(skb, padsize);
1118 memmove(skb->data, skb->data + padsize, padpos);
1121 ret = ath9k_htc_tx_start(priv, skb);
1123 if (ret == -ENOMEM) {
1124 ath_print(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
1125 "Stopping TX queues\n");
1126 ieee80211_stop_queues(hw);
1127 spin_lock_bh(&priv->tx_lock);
1128 priv->tx_queues_stop = true;
1129 spin_unlock_bh(&priv->tx_lock);
1131 ath_print(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
1140 dev_kfree_skb_any(skb);
1144 static int ath9k_htc_start(struct ieee80211_hw *hw)
1146 struct ath9k_htc_priv *priv = hw->priv;
1147 struct ath_hw *ah = priv->ah;
1148 struct ath_common *common = ath9k_hw_common(ah);
1149 struct ieee80211_channel *curchan = hw->conf.channel;
1150 struct ath9k_channel *init_channel;
1152 enum htc_phymode mode;
1156 mutex_lock(&priv->mutex);
1158 ath_print(common, ATH_DBG_CONFIG,
1159 "Starting driver with initial channel: %d MHz\n",
1160 curchan->center_freq);
1162 /* Ensure that HW is awake before flushing RX */
1163 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1164 WMI_CMD(WMI_FLUSH_RECV_CMDID);
1166 /* setup initial channel */
1167 init_channel = ath9k_cmn_get_curchannel(hw, ah);
1169 /* Reset SERDES registers */
1170 ath9k_hw_configpcipowersave(ah, 0, 0);
1172 ath9k_hw_htc_resetinit(ah);
1173 ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
1175 ath_print(common, ATH_DBG_FATAL,
1176 "Unable to reset hardware; reset status %d "
1177 "(freq %u MHz)\n", ret, curchan->center_freq);
1178 mutex_unlock(&priv->mutex);
1182 ath_update_txpow(priv);
1184 mode = ath9k_htc_get_curmode(priv, init_channel);
1185 htc_mode = cpu_to_be16(mode);
1186 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
1187 WMI_CMD(WMI_ATH_INIT_CMDID);
1188 WMI_CMD(WMI_START_RECV_CMDID);
1190 ath9k_host_rx_init(priv);
1192 priv->op_flags &= ~OP_INVALID;
1193 htc_start(priv->htc);
1195 spin_lock_bh(&priv->tx_lock);
1196 priv->tx_queues_stop = false;
1197 spin_unlock_bh(&priv->tx_lock);
1199 ieee80211_wake_queues(hw);
1201 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) {
1202 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
1203 AR_STOMP_LOW_WLAN_WGHT);
1204 ath9k_hw_btcoex_enable(ah);
1205 ath_htc_resume_btcoex_work(priv);
1207 mutex_unlock(&priv->mutex);
1212 static void ath9k_htc_stop(struct ieee80211_hw *hw)
1214 struct ath9k_htc_priv *priv = hw->priv;
1215 struct ath_hw *ah = priv->ah;
1216 struct ath_common *common = ath9k_hw_common(ah);
1220 mutex_lock(&priv->mutex);
1222 if (priv->op_flags & OP_INVALID) {
1223 ath_print(common, ATH_DBG_ANY, "Device not present\n");
1224 mutex_unlock(&priv->mutex);
1228 /* Cancel all the running timers/work .. */
1229 cancel_work_sync(&priv->ps_work);
1230 cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
1231 ath9k_led_stop_brightness(priv);
1233 ath9k_htc_ps_wakeup(priv);
1234 htc_stop(priv->htc);
1235 WMI_CMD(WMI_DISABLE_INTR_CMDID);
1236 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
1237 WMI_CMD(WMI_STOP_RECV_CMDID);
1238 skb_queue_purge(&priv->tx_queue);
1240 /* Remove monitor interface here */
1241 if (ah->opmode == NL80211_IFTYPE_MONITOR) {
1242 if (ath9k_htc_remove_monitor_interface(priv))
1243 ath_print(common, ATH_DBG_FATAL,
1244 "Unable to remove monitor interface\n");
1246 ath_print(common, ATH_DBG_CONFIG,
1247 "Monitor interface removed\n");
1250 if (ah->btcoex_hw.enabled) {
1251 ath9k_hw_btcoex_disable(ah);
1252 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1253 ath_htc_cancel_btcoex_work(priv);
1256 ath9k_hw_phy_disable(ah);
1257 ath9k_hw_disable(ah);
1258 ath9k_hw_configpcipowersave(ah, 1, 1);
1259 ath9k_htc_ps_restore(priv);
1260 ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);
1262 priv->op_flags |= OP_INVALID;
1264 ath_print(common, ATH_DBG_CONFIG, "Driver halt\n");
1265 mutex_unlock(&priv->mutex);
1268 static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
1269 struct ieee80211_vif *vif)
1271 struct ath9k_htc_priv *priv = hw->priv;
1272 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1273 struct ath_common *common = ath9k_hw_common(priv->ah);
1274 struct ath9k_htc_target_vif hvif;
1278 mutex_lock(&priv->mutex);
1280 /* Only one interface for now */
1281 if (priv->nvifs > 0) {
1286 ath9k_htc_ps_wakeup(priv);
1287 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1288 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1290 switch (vif->type) {
1291 case NL80211_IFTYPE_STATION:
1292 hvif.opmode = cpu_to_be32(HTC_M_STA);
1294 case NL80211_IFTYPE_ADHOC:
1295 hvif.opmode = cpu_to_be32(HTC_M_IBSS);
1298 ath_print(common, ATH_DBG_FATAL,
1299 "Interface type %d not yet supported\n", vif->type);
1304 ath_print(common, ATH_DBG_CONFIG,
1305 "Attach a VIF of type: %d\n", vif->type);
1307 priv->ah->opmode = vif->type;
1309 /* Index starts from zero on the target */
1310 avp->index = hvif.index = priv->nvifs;
1311 hvif.rtsthreshold = cpu_to_be16(2304);
1312 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
1319 * We need a node in target to tx mgmt frames
1320 * before association.
1322 ret = ath9k_htc_add_station(priv, vif, NULL);
1326 ret = ath9k_htc_update_cap_target(priv);
1328 ath_print(common, ATH_DBG_CONFIG, "Failed to update"
1329 " capability in target \n");
1333 ath9k_htc_ps_restore(priv);
1334 mutex_unlock(&priv->mutex);
1339 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,
1340 struct ieee80211_vif *vif)
1342 struct ath9k_htc_priv *priv = hw->priv;
1343 struct ath_common *common = ath9k_hw_common(priv->ah);
1344 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1345 struct ath9k_htc_target_vif hvif;
1349 ath_print(common, ATH_DBG_CONFIG, "Detach Interface\n");
1351 mutex_lock(&priv->mutex);
1352 ath9k_htc_ps_wakeup(priv);
1354 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1355 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1356 hvif.index = avp->index;
1357 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1360 ath9k_htc_remove_station(priv, vif, NULL);
1363 ath9k_htc_ps_restore(priv);
1364 mutex_unlock(&priv->mutex);
1367 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
1369 struct ath9k_htc_priv *priv = hw->priv;
1370 struct ath_common *common = ath9k_hw_common(priv->ah);
1371 struct ieee80211_conf *conf = &hw->conf;
1373 mutex_lock(&priv->mutex);
1375 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1376 bool enable_radio = false;
1377 bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1379 mutex_lock(&priv->htc_pm_lock);
1380 if (!idle && priv->ps_idle)
1381 enable_radio = true;
1382 priv->ps_idle = idle;
1383 mutex_unlock(&priv->htc_pm_lock);
1386 ath_print(common, ATH_DBG_CONFIG,
1387 "not-idle: enabling radio\n");
1388 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1389 ath9k_htc_radio_enable(hw);
1393 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1394 struct ieee80211_channel *curchan = hw->conf.channel;
1395 int pos = curchan->hw_value;
1397 ath_print(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
1398 curchan->center_freq);
1400 ath9k_cmn_update_ichannel(hw, &priv->ah->channels[pos]);
1402 if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
1403 ath_print(common, ATH_DBG_FATAL,
1404 "Unable to set channel\n");
1405 mutex_unlock(&priv->mutex);
1410 if (changed & IEEE80211_CONF_CHANGE_PS) {
1411 if (conf->flags & IEEE80211_CONF_PS) {
1412 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
1413 priv->ps_enabled = true;
1415 priv->ps_enabled = false;
1416 cancel_work_sync(&priv->ps_work);
1417 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1421 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1422 if (conf->flags & IEEE80211_CONF_MONITOR) {
1423 if (ath9k_htc_add_monitor_interface(priv))
1424 ath_print(common, ATH_DBG_FATAL,
1425 "Failed to set monitor mode\n");
1427 ath_print(common, ATH_DBG_CONFIG,
1428 "HW opmode set to Monitor mode\n");
1432 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1433 mutex_lock(&priv->htc_pm_lock);
1434 if (!priv->ps_idle) {
1435 mutex_unlock(&priv->htc_pm_lock);
1438 mutex_unlock(&priv->htc_pm_lock);
1440 ath_print(common, ATH_DBG_CONFIG,
1441 "idle: disabling radio\n");
1442 ath9k_htc_radio_disable(hw);
1446 mutex_unlock(&priv->mutex);
1450 #define SUPPORTED_FILTERS \
1451 (FIF_PROMISC_IN_BSS | \
1456 FIF_BCN_PRBRESP_PROMISC | \
1459 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
1460 unsigned int changed_flags,
1461 unsigned int *total_flags,
1464 struct ath9k_htc_priv *priv = hw->priv;
1467 mutex_lock(&priv->mutex);
1468 ath9k_htc_ps_wakeup(priv);
1470 changed_flags &= SUPPORTED_FILTERS;
1471 *total_flags &= SUPPORTED_FILTERS;
1473 priv->rxfilter = *total_flags;
1474 rfilt = ath9k_htc_calcrxfilter(priv);
1475 ath9k_hw_setrxfilter(priv->ah, rfilt);
1477 ath_print(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG,
1478 "Set HW RX filter: 0x%x\n", rfilt);
1480 ath9k_htc_ps_restore(priv);
1481 mutex_unlock(&priv->mutex);
1484 static int ath9k_htc_sta_add(struct ieee80211_hw *hw,
1485 struct ieee80211_vif *vif,
1486 struct ieee80211_sta *sta)
1488 struct ath9k_htc_priv *priv = hw->priv;
1491 mutex_lock(&priv->mutex);
1492 ath9k_htc_ps_wakeup(priv);
1493 ret = ath9k_htc_add_station(priv, vif, sta);
1495 ath9k_htc_init_rate(priv, sta);
1496 ath9k_htc_ps_restore(priv);
1497 mutex_unlock(&priv->mutex);
1502 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
1503 struct ieee80211_vif *vif,
1504 struct ieee80211_sta *sta)
1506 struct ath9k_htc_priv *priv = hw->priv;
1509 mutex_lock(&priv->mutex);
1510 ath9k_htc_ps_wakeup(priv);
1511 ret = ath9k_htc_remove_station(priv, vif, sta);
1512 ath9k_htc_ps_restore(priv);
1513 mutex_unlock(&priv->mutex);
1518 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw, u16 queue,
1519 const struct ieee80211_tx_queue_params *params)
1521 struct ath9k_htc_priv *priv = hw->priv;
1522 struct ath_common *common = ath9k_hw_common(priv->ah);
1523 struct ath9k_tx_queue_info qi;
1526 if (queue >= WME_NUM_AC)
1529 mutex_lock(&priv->mutex);
1530 ath9k_htc_ps_wakeup(priv);
1532 memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
1534 qi.tqi_aifs = params->aifs;
1535 qi.tqi_cwmin = params->cw_min;
1536 qi.tqi_cwmax = params->cw_max;
1537 qi.tqi_burstTime = params->txop;
1539 qnum = get_hw_qnum(queue, priv->hwq_map);
1541 ath_print(common, ATH_DBG_CONFIG,
1542 "Configure tx [queue/hwq] [%d/%d], "
1543 "aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
1544 queue, qnum, params->aifs, params->cw_min,
1545 params->cw_max, params->txop);
1547 ret = ath_htc_txq_update(priv, qnum, &qi);
1549 ath_print(common, ATH_DBG_FATAL, "TXQ Update failed\n");
1553 if ((priv->ah->opmode == NL80211_IFTYPE_ADHOC) &&
1554 (qnum == priv->hwq_map[WME_AC_BE]))
1555 ath9k_htc_beaconq_config(priv);
1557 ath9k_htc_ps_restore(priv);
1558 mutex_unlock(&priv->mutex);
1563 static int ath9k_htc_set_key(struct ieee80211_hw *hw,
1564 enum set_key_cmd cmd,
1565 struct ieee80211_vif *vif,
1566 struct ieee80211_sta *sta,
1567 struct ieee80211_key_conf *key)
1569 struct ath9k_htc_priv *priv = hw->priv;
1570 struct ath_common *common = ath9k_hw_common(priv->ah);
1573 if (htc_modparam_nohwcrypt)
1576 mutex_lock(&priv->mutex);
1577 ath_print(common, ATH_DBG_CONFIG, "Set HW Key\n");
1578 ath9k_htc_ps_wakeup(priv);
1582 ret = ath_key_config(common, vif, sta, key);
1584 key->hw_key_idx = ret;
1585 /* push IV and Michael MIC generation to stack */
1586 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1587 if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1588 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1589 if (priv->ah->sw_mgmt_crypto &&
1590 key->cipher == WLAN_CIPHER_SUITE_CCMP)
1591 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1596 ath_key_delete(common, key);
1602 ath9k_htc_ps_restore(priv);
1603 mutex_unlock(&priv->mutex);
1608 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
1609 struct ieee80211_vif *vif,
1610 struct ieee80211_bss_conf *bss_conf,
1613 struct ath9k_htc_priv *priv = hw->priv;
1614 struct ath_hw *ah = priv->ah;
1615 struct ath_common *common = ath9k_hw_common(ah);
1617 mutex_lock(&priv->mutex);
1618 ath9k_htc_ps_wakeup(priv);
1620 if (changed & BSS_CHANGED_ASSOC) {
1621 common->curaid = bss_conf->assoc ?
1623 ath_print(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
1626 if (bss_conf->assoc) {
1627 priv->op_flags |= OP_ASSOCIATED;
1628 ath_start_ani(priv);
1630 priv->op_flags &= ~OP_ASSOCIATED;
1631 cancel_delayed_work_sync(&priv->ath9k_ani_work);
1635 if (changed & BSS_CHANGED_BSSID) {
1637 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1638 ath9k_hw_write_associd(ah);
1640 ath_print(common, ATH_DBG_CONFIG,
1641 "BSSID: %pM aid: 0x%x\n",
1642 common->curbssid, common->curaid);
1645 if ((changed & BSS_CHANGED_BEACON_INT) ||
1646 (changed & BSS_CHANGED_BEACON) ||
1647 ((changed & BSS_CHANGED_BEACON_ENABLED) &&
1648 bss_conf->enable_beacon)) {
1649 priv->op_flags |= OP_ENABLE_BEACON;
1650 ath9k_htc_beacon_config(priv, vif);
1653 if ((changed & BSS_CHANGED_BEACON_ENABLED) &&
1654 !bss_conf->enable_beacon) {
1655 priv->op_flags &= ~OP_ENABLE_BEACON;
1656 ath9k_htc_beacon_config(priv, vif);
1659 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1660 ath_print(common, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n",
1661 bss_conf->use_short_preamble);
1662 if (bss_conf->use_short_preamble)
1663 priv->op_flags |= OP_PREAMBLE_SHORT;
1665 priv->op_flags &= ~OP_PREAMBLE_SHORT;
1668 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1669 ath_print(common, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n",
1670 bss_conf->use_cts_prot);
1671 if (bss_conf->use_cts_prot &&
1672 hw->conf.channel->band != IEEE80211_BAND_5GHZ)
1673 priv->op_flags |= OP_PROTECT_ENABLE;
1675 priv->op_flags &= ~OP_PROTECT_ENABLE;
1678 if (changed & BSS_CHANGED_ERP_SLOT) {
1679 if (bss_conf->use_short_slot)
1684 ath9k_hw_init_global_settings(ah);
1687 if (changed & BSS_CHANGED_HT)
1688 ath9k_htc_update_rate(priv, vif, bss_conf);
1690 ath9k_htc_ps_restore(priv);
1691 mutex_unlock(&priv->mutex);
1694 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw)
1696 struct ath9k_htc_priv *priv = hw->priv;
1699 mutex_lock(&priv->mutex);
1700 ath9k_htc_ps_wakeup(priv);
1701 tsf = ath9k_hw_gettsf64(priv->ah);
1702 ath9k_htc_ps_restore(priv);
1703 mutex_unlock(&priv->mutex);
1708 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, u64 tsf)
1710 struct ath9k_htc_priv *priv = hw->priv;
1712 mutex_lock(&priv->mutex);
1713 ath9k_htc_ps_wakeup(priv);
1714 ath9k_hw_settsf64(priv->ah, tsf);
1715 ath9k_htc_ps_restore(priv);
1716 mutex_unlock(&priv->mutex);
1719 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw)
1721 struct ath9k_htc_priv *priv = hw->priv;
1723 mutex_lock(&priv->mutex);
1724 ath9k_htc_ps_wakeup(priv);
1725 ath9k_hw_reset_tsf(priv->ah);
1726 ath9k_htc_ps_restore(priv);
1727 mutex_unlock(&priv->mutex);
1730 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
1731 struct ieee80211_vif *vif,
1732 enum ieee80211_ampdu_mlme_action action,
1733 struct ieee80211_sta *sta,
1736 struct ath9k_htc_priv *priv = hw->priv;
1737 struct ath9k_htc_sta *ista;
1741 case IEEE80211_AMPDU_RX_START:
1743 case IEEE80211_AMPDU_RX_STOP:
1745 case IEEE80211_AMPDU_TX_START:
1746 ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1748 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1750 case IEEE80211_AMPDU_TX_STOP:
1751 ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1752 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1754 case IEEE80211_AMPDU_TX_OPERATIONAL:
1755 ista = (struct ath9k_htc_sta *) sta->drv_priv;
1756 spin_lock_bh(&priv->tx_lock);
1757 ista->tid_state[tid] = AGGR_OPERATIONAL;
1758 spin_unlock_bh(&priv->tx_lock);
1761 ath_print(ath9k_hw_common(priv->ah), ATH_DBG_FATAL,
1762 "Unknown AMPDU action\n");
1768 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)
1770 struct ath9k_htc_priv *priv = hw->priv;
1772 mutex_lock(&priv->mutex);
1773 spin_lock_bh(&priv->beacon_lock);
1774 priv->op_flags |= OP_SCANNING;
1775 spin_unlock_bh(&priv->beacon_lock);
1776 cancel_work_sync(&priv->ps_work);
1777 if (priv->op_flags & OP_ASSOCIATED)
1778 cancel_delayed_work_sync(&priv->ath9k_ani_work);
1779 mutex_unlock(&priv->mutex);
1782 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
1784 struct ath9k_htc_priv *priv = hw->priv;
1786 mutex_lock(&priv->mutex);
1787 ath9k_htc_ps_wakeup(priv);
1788 spin_lock_bh(&priv->beacon_lock);
1789 priv->op_flags &= ~OP_SCANNING;
1790 spin_unlock_bh(&priv->beacon_lock);
1791 priv->op_flags |= OP_FULL_RESET;
1792 if (priv->op_flags & OP_ASSOCIATED) {
1793 ath9k_htc_beacon_config(priv, priv->vif);
1794 ath_start_ani(priv);
1796 ath9k_htc_ps_restore(priv);
1797 mutex_unlock(&priv->mutex);
1800 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1805 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw,
1808 struct ath9k_htc_priv *priv = hw->priv;
1810 mutex_lock(&priv->mutex);
1811 ath9k_htc_ps_wakeup(priv);
1812 priv->ah->coverage_class = coverage_class;
1813 ath9k_hw_init_global_settings(priv->ah);
1814 ath9k_htc_ps_restore(priv);
1815 mutex_unlock(&priv->mutex);
1818 struct ieee80211_ops ath9k_htc_ops = {
1820 .start = ath9k_htc_start,
1821 .stop = ath9k_htc_stop,
1822 .add_interface = ath9k_htc_add_interface,
1823 .remove_interface = ath9k_htc_remove_interface,
1824 .config = ath9k_htc_config,
1825 .configure_filter = ath9k_htc_configure_filter,
1826 .sta_add = ath9k_htc_sta_add,
1827 .sta_remove = ath9k_htc_sta_remove,
1828 .conf_tx = ath9k_htc_conf_tx,
1829 .bss_info_changed = ath9k_htc_bss_info_changed,
1830 .set_key = ath9k_htc_set_key,
1831 .get_tsf = ath9k_htc_get_tsf,
1832 .set_tsf = ath9k_htc_set_tsf,
1833 .reset_tsf = ath9k_htc_reset_tsf,
1834 .ampdu_action = ath9k_htc_ampdu_action,
1835 .sw_scan_start = ath9k_htc_sw_scan_start,
1836 .sw_scan_complete = ath9k_htc_sw_scan_complete,
1837 .set_rts_threshold = ath9k_htc_set_rts_threshold,
1838 .rfkill_poll = ath9k_htc_rfkill_poll_state,
1839 .set_coverage_class = ath9k_htc_set_coverage_class,