2 * Copyright (c) 2010-2011 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.
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)
27 enum htc_phymode mode;
31 switch (ichan->chanmode) {
34 case CHANNEL_G_HT40PLUS:
35 case CHANNEL_G_HT40MINUS:
40 case CHANNEL_A_HT40PLUS:
41 case CHANNEL_A_HT40MINUS:
53 bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
54 enum ath9k_power_mode mode)
58 mutex_lock(&priv->htc_pm_lock);
59 ret = ath9k_hw_setpower(priv->ah, mode);
60 mutex_unlock(&priv->htc_pm_lock);
65 void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv)
67 mutex_lock(&priv->htc_pm_lock);
68 if (++priv->ps_usecount != 1)
70 ath9k_hw_setpower(priv->ah, ATH9K_PM_AWAKE);
73 mutex_unlock(&priv->htc_pm_lock);
76 void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv)
78 mutex_lock(&priv->htc_pm_lock);
79 if (--priv->ps_usecount != 0)
83 ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP);
84 else if (priv->ps_enabled)
85 ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP);
88 mutex_unlock(&priv->htc_pm_lock);
91 void ath9k_ps_work(struct work_struct *work)
93 struct ath9k_htc_priv *priv =
94 container_of(work, struct ath9k_htc_priv,
96 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
98 /* The chip wakes up after receiving the first beacon
99 while network sleep is enabled. For the driver to
100 be in sync with the hw, set the chip to awake and
101 only then set it to sleep.
103 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
106 static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
108 struct ath9k_htc_priv *priv = data;
109 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
111 if ((vif->type == NL80211_IFTYPE_AP) && bss_conf->enable_beacon)
112 priv->reconfig_beacon = true;
114 if (bss_conf->assoc) {
115 priv->rearm_ani = true;
116 priv->reconfig_beacon = true;
120 static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv)
122 priv->rearm_ani = false;
123 priv->reconfig_beacon = false;
125 ieee80211_iterate_active_interfaces_atomic(priv->hw,
126 ath9k_htc_vif_iter, priv);
128 ath9k_htc_start_ani(priv);
130 if (priv->reconfig_beacon) {
131 ath9k_htc_ps_wakeup(priv);
132 ath9k_htc_beacon_reconfig(priv);
133 ath9k_htc_ps_restore(priv);
137 static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
139 struct ath9k_vif_iter_data *iter_data = data;
142 for (i = 0; i < ETH_ALEN; i++)
143 iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]);
146 static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv,
147 struct ieee80211_vif *vif)
149 struct ath_common *common = ath9k_hw_common(priv->ah);
150 struct ath9k_vif_iter_data iter_data;
153 * Use the hardware MAC address as reference, the hardware uses it
154 * together with the BSSID mask when matching addresses.
156 iter_data.hw_macaddr = common->macaddr;
157 memset(&iter_data.mask, 0xff, ETH_ALEN);
160 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif);
162 /* Get list of all active MAC addresses */
163 ieee80211_iterate_active_interfaces_atomic(priv->hw, ath9k_htc_bssid_iter,
166 memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
167 ath_hw_setbssidmask(common);
170 static void ath9k_htc_set_opmode(struct ath9k_htc_priv *priv)
172 if (priv->num_ibss_vif)
173 priv->ah->opmode = NL80211_IFTYPE_ADHOC;
174 else if (priv->num_ap_vif)
175 priv->ah->opmode = NL80211_IFTYPE_AP;
177 priv->ah->opmode = NL80211_IFTYPE_STATION;
179 ath9k_hw_setopmode(priv->ah);
182 void ath9k_htc_reset(struct ath9k_htc_priv *priv)
184 struct ath_hw *ah = priv->ah;
185 struct ath_common *common = ath9k_hw_common(ah);
186 struct ieee80211_channel *channel = priv->hw->conf.channel;
187 struct ath9k_hw_cal_data *caldata = NULL;
188 enum htc_phymode mode;
193 mutex_lock(&priv->mutex);
194 ath9k_htc_ps_wakeup(priv);
196 ath9k_htc_stop_ani(priv);
197 ieee80211_stop_queues(priv->hw);
199 del_timer_sync(&priv->tx.cleanup_timer);
200 ath9k_htc_tx_drain(priv);
202 WMI_CMD(WMI_DISABLE_INTR_CMDID);
203 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
204 WMI_CMD(WMI_STOP_RECV_CMDID);
206 ath9k_wmi_event_drain(priv);
208 caldata = &priv->caldata;
209 ret = ath9k_hw_reset(ah, ah->curchan, caldata, false);
212 "Unable to reset device (%u Mhz) reset status %d\n",
213 channel->center_freq, ret);
216 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
219 WMI_CMD(WMI_START_RECV_CMDID);
220 ath9k_host_rx_init(priv);
222 mode = ath9k_htc_get_curmode(priv, ah->curchan);
223 htc_mode = cpu_to_be16(mode);
224 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
226 WMI_CMD(WMI_ENABLE_INTR_CMDID);
227 htc_start(priv->htc);
228 ath9k_htc_vif_reconfig(priv);
229 ieee80211_wake_queues(priv->hw);
231 mod_timer(&priv->tx.cleanup_timer,
232 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
234 ath9k_htc_ps_restore(priv);
235 mutex_unlock(&priv->mutex);
238 static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
239 struct ieee80211_hw *hw,
240 struct ath9k_channel *hchan)
242 struct ath_hw *ah = priv->ah;
243 struct ath_common *common = ath9k_hw_common(ah);
244 struct ieee80211_conf *conf = &common->hw->conf;
246 struct ieee80211_channel *channel = hw->conf.channel;
247 struct ath9k_hw_cal_data *caldata = NULL;
248 enum htc_phymode mode;
253 if (priv->op_flags & OP_INVALID)
256 fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
258 ath9k_htc_ps_wakeup(priv);
260 del_timer_sync(&priv->tx.cleanup_timer);
261 ath9k_htc_tx_drain(priv);
263 WMI_CMD(WMI_DISABLE_INTR_CMDID);
264 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
265 WMI_CMD(WMI_STOP_RECV_CMDID);
267 ath9k_wmi_event_drain(priv);
269 ath_dbg(common, ATH_DBG_CONFIG,
270 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n",
271 priv->ah->curchan->channel,
272 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf),
276 caldata = &priv->caldata;
278 ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
281 "Unable to reset channel (%u Mhz) reset status %d\n",
282 channel->center_freq, ret);
286 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
289 WMI_CMD(WMI_START_RECV_CMDID);
293 ath9k_host_rx_init(priv);
295 mode = ath9k_htc_get_curmode(priv, hchan);
296 htc_mode = cpu_to_be16(mode);
297 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
301 WMI_CMD(WMI_ENABLE_INTR_CMDID);
305 htc_start(priv->htc);
307 if (!(priv->op_flags & OP_SCANNING) &&
308 !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
309 ath9k_htc_vif_reconfig(priv);
311 mod_timer(&priv->tx.cleanup_timer,
312 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
315 ath9k_htc_ps_restore(priv);
320 * Monitor mode handling is a tad complicated because the firmware requires
321 * an interface to be created exclusively, while mac80211 doesn't associate
322 * an interface with the mode.
324 * So, for now, only one monitor interface can be configured.
326 static void __ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
328 struct ath_common *common = ath9k_hw_common(priv->ah);
329 struct ath9k_htc_target_vif hvif;
333 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
334 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
335 hvif.index = priv->mon_vif_idx;
336 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
338 ath_err(common, "Unable to remove monitor interface at idx: %d\n",
343 priv->vif_slot &= ~(1 << priv->mon_vif_idx);
346 static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv)
348 struct ath_common *common = ath9k_hw_common(priv->ah);
349 struct ath9k_htc_target_vif hvif;
350 struct ath9k_htc_target_sta tsta;
351 int ret = 0, sta_idx;
354 if ((priv->nvifs >= ATH9K_HTC_MAX_VIF) ||
355 (priv->nstations >= ATH9K_HTC_MAX_STA)) {
360 sta_idx = ffz(priv->sta_slot);
361 if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA)) {
369 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
370 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
372 hvif.opmode = HTC_M_MONITOR;
373 hvif.index = ffz(priv->vif_slot);
375 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
380 * Assign the monitor interface index as a special case here.
381 * This is needed when the interface is brought down.
383 priv->mon_vif_idx = hvif.index;
384 priv->vif_slot |= (1 << hvif.index);
387 * Set the hardware mode to monitor only if there are no
391 priv->ah->opmode = NL80211_IFTYPE_MONITOR;
396 * Associate a station with the interface for packet injection.
398 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
400 memcpy(&tsta.macaddr, common->macaddr, ETH_ALEN);
403 tsta.sta_index = sta_idx;
404 tsta.vif_index = hvif.index;
405 tsta.maxampdu = cpu_to_be16(0xffff);
407 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
409 ath_err(common, "Unable to add station entry for monitor mode\n");
413 priv->sta_slot |= (1 << sta_idx);
415 priv->vif_sta_pos[priv->mon_vif_idx] = sta_idx;
416 priv->ah->is_monitoring = true;
418 ath_dbg(common, ATH_DBG_CONFIG,
419 "Attached a monitor interface at idx: %d, sta idx: %d\n",
420 priv->mon_vif_idx, sta_idx);
426 * Remove the interface from the target.
428 __ath9k_htc_remove_monitor_interface(priv);
430 ath_dbg(common, ATH_DBG_FATAL, "Unable to attach a monitor interface\n");
435 static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
437 struct ath_common *common = ath9k_hw_common(priv->ah);
441 __ath9k_htc_remove_monitor_interface(priv);
443 sta_idx = priv->vif_sta_pos[priv->mon_vif_idx];
445 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
447 ath_err(common, "Unable to remove station entry for monitor mode\n");
451 priv->sta_slot &= ~(1 << sta_idx);
453 priv->ah->is_monitoring = false;
455 ath_dbg(common, ATH_DBG_CONFIG,
456 "Removed a monitor interface at idx: %d, sta idx: %d\n",
457 priv->mon_vif_idx, sta_idx);
462 static int ath9k_htc_add_station(struct ath9k_htc_priv *priv,
463 struct ieee80211_vif *vif,
464 struct ieee80211_sta *sta)
466 struct ath_common *common = ath9k_hw_common(priv->ah);
467 struct ath9k_htc_target_sta tsta;
468 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
469 struct ath9k_htc_sta *ista;
474 if (priv->nstations >= ATH9K_HTC_MAX_STA)
477 sta_idx = ffz(priv->sta_slot);
478 if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA))
481 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
484 ista = (struct ath9k_htc_sta *) sta->drv_priv;
485 memcpy(&tsta.macaddr, sta->addr, ETH_ALEN);
486 memcpy(&tsta.bssid, common->curbssid, ETH_ALEN);
488 ista->index = sta_idx;
490 memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
494 tsta.sta_index = sta_idx;
495 tsta.vif_index = avp->index;
498 tsta.maxampdu = cpu_to_be16(0xffff);
500 maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
501 sta->ht_cap.ampdu_factor);
502 tsta.maxampdu = cpu_to_be16(maxampdu);
505 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
509 "Unable to add station entry for: %pM\n",
515 ath_dbg(common, ATH_DBG_CONFIG,
516 "Added a station entry for: %pM (idx: %d)\n",
517 sta->addr, tsta.sta_index);
519 ath_dbg(common, ATH_DBG_CONFIG,
520 "Added a station entry for VIF %d (idx: %d)\n",
521 avp->index, tsta.sta_index);
524 priv->sta_slot |= (1 << sta_idx);
527 priv->vif_sta_pos[avp->index] = sta_idx;
532 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv,
533 struct ieee80211_vif *vif,
534 struct ieee80211_sta *sta)
536 struct ath_common *common = ath9k_hw_common(priv->ah);
537 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
538 struct ath9k_htc_sta *ista;
543 ista = (struct ath9k_htc_sta *) sta->drv_priv;
544 sta_idx = ista->index;
546 sta_idx = priv->vif_sta_pos[avp->index];
549 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
553 "Unable to remove station entry for: %pM\n",
559 ath_dbg(common, ATH_DBG_CONFIG,
560 "Removed a station entry for: %pM (idx: %d)\n",
563 ath_dbg(common, ATH_DBG_CONFIG,
564 "Removed a station entry for VIF %d (idx: %d)\n",
565 avp->index, sta_idx);
568 priv->sta_slot &= ~(1 << sta_idx);
574 int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv,
577 struct ath9k_htc_cap_target tcap;
581 memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target));
583 tcap.ampdu_limit = cpu_to_be32(0xffff);
584 tcap.ampdu_subframes = 0xff;
585 tcap.enable_coex = enable_coex;
586 tcap.tx_chainmask = priv->ah->caps.tx_chainmask;
588 WMI_CMD_BUF(WMI_TARGET_IC_UPDATE_CMDID, &tcap);
593 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
594 struct ieee80211_sta *sta,
595 struct ath9k_htc_target_rate *trate)
597 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv;
598 struct ieee80211_supported_band *sband;
602 sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
604 for (i = 0, j = 0; i < sband->n_bitrates; i++) {
605 if (sta->supp_rates[sband->band] & BIT(i)) {
606 trate->rates.legacy_rates.rs_rates[j]
607 = (sband->bitrates[i].bitrate * 2) / 10;
611 trate->rates.legacy_rates.rs_nrates = j;
613 if (sta->ht_cap.ht_supported) {
614 for (i = 0, j = 0; i < 77; i++) {
615 if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
616 trate->rates.ht_rates.rs_rates[j++] = i;
617 if (j == ATH_HTC_RATE_MAX)
620 trate->rates.ht_rates.rs_nrates = j;
622 caps = WLAN_RC_HT_FLAG;
623 if (sta->ht_cap.mcs.rx_mask[1])
624 caps |= WLAN_RC_DS_FLAG;
625 if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
626 (conf_is_ht40(&priv->hw->conf)))
627 caps |= WLAN_RC_40_FLAG;
628 if (conf_is_ht40(&priv->hw->conf) &&
629 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
630 caps |= WLAN_RC_SGI_FLAG;
631 else if (conf_is_ht20(&priv->hw->conf) &&
632 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
633 caps |= WLAN_RC_SGI_FLAG;
636 trate->sta_index = ista->index;
638 trate->capflags = cpu_to_be32(caps);
641 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv,
642 struct ath9k_htc_target_rate *trate)
644 struct ath_common *common = ath9k_hw_common(priv->ah);
648 WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, trate);
651 "Unable to initialize Rate information on target\n");
657 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv,
658 struct ieee80211_sta *sta)
660 struct ath_common *common = ath9k_hw_common(priv->ah);
661 struct ath9k_htc_target_rate trate;
664 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
665 ath9k_htc_setup_rate(priv, sta, &trate);
666 ret = ath9k_htc_send_rate_cmd(priv, &trate);
668 ath_dbg(common, ATH_DBG_CONFIG,
669 "Updated target sta: %pM, rate caps: 0x%X\n",
670 sta->addr, be32_to_cpu(trate.capflags));
673 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv,
674 struct ieee80211_vif *vif,
675 struct ieee80211_bss_conf *bss_conf)
677 struct ath_common *common = ath9k_hw_common(priv->ah);
678 struct ath9k_htc_target_rate trate;
679 struct ieee80211_sta *sta;
682 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
685 sta = ieee80211_find_sta(vif, bss_conf->bssid);
690 ath9k_htc_setup_rate(priv, sta, &trate);
693 ret = ath9k_htc_send_rate_cmd(priv, &trate);
695 ath_dbg(common, ATH_DBG_CONFIG,
696 "Updated target sta: %pM, rate caps: 0x%X\n",
697 bss_conf->bssid, be32_to_cpu(trate.capflags));
700 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
701 struct ieee80211_vif *vif,
702 struct ieee80211_sta *sta,
703 enum ieee80211_ampdu_mlme_action action,
706 struct ath_common *common = ath9k_hw_common(priv->ah);
707 struct ath9k_htc_target_aggr aggr;
708 struct ath9k_htc_sta *ista;
712 if (tid >= ATH9K_HTC_MAX_TID)
715 memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr));
716 ista = (struct ath9k_htc_sta *) sta->drv_priv;
718 aggr.sta_index = ista->index;
719 aggr.tidno = tid & 0xf;
720 aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false;
722 WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr);
724 ath_dbg(common, ATH_DBG_CONFIG,
725 "Unable to %s TX aggregation for (%pM, %d)\n",
726 (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid);
728 ath_dbg(common, ATH_DBG_CONFIG,
729 "%s TX aggregation for (%pM, %d)\n",
730 (aggr.aggr_enable) ? "Starting" : "Stopping",
733 spin_lock_bh(&priv->tx.tx_lock);
734 ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP;
735 spin_unlock_bh(&priv->tx.tx_lock);
744 void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)
746 struct ath_common *common = ath9k_hw_common(priv->ah);
747 unsigned long timestamp = jiffies_to_msecs(jiffies);
749 common->ani.longcal_timer = timestamp;
750 common->ani.shortcal_timer = timestamp;
751 common->ani.checkani_timer = timestamp;
753 priv->op_flags |= OP_ANI_RUNNING;
755 ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
756 msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
759 void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv)
761 cancel_delayed_work_sync(&priv->ani_work);
762 priv->op_flags &= ~OP_ANI_RUNNING;
765 void ath9k_htc_ani_work(struct work_struct *work)
767 struct ath9k_htc_priv *priv =
768 container_of(work, struct ath9k_htc_priv, ani_work.work);
769 struct ath_hw *ah = priv->ah;
770 struct ath_common *common = ath9k_hw_common(ah);
771 bool longcal = false;
772 bool shortcal = false;
773 bool aniflag = false;
774 unsigned int timestamp = jiffies_to_msecs(jiffies);
775 u32 cal_interval, short_cal_interval;
777 short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
778 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
780 /* Only calibrate if awake */
781 if (ah->power_mode != ATH9K_PM_AWAKE)
784 /* Long calibration runs independently of short calibration. */
785 if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
787 ath_dbg(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
788 common->ani.longcal_timer = timestamp;
791 /* Short calibration applies only while caldone is false */
792 if (!common->ani.caldone) {
793 if ((timestamp - common->ani.shortcal_timer) >=
794 short_cal_interval) {
796 ath_dbg(common, ATH_DBG_ANI,
797 "shortcal @%lu\n", jiffies);
798 common->ani.shortcal_timer = timestamp;
799 common->ani.resetcal_timer = timestamp;
802 if ((timestamp - common->ani.resetcal_timer) >=
803 ATH_RESTART_CALINTERVAL) {
804 common->ani.caldone = ath9k_hw_reset_calvalid(ah);
805 if (common->ani.caldone)
806 common->ani.resetcal_timer = timestamp;
810 /* Verify whether we must check ANI */
811 if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
813 common->ani.checkani_timer = timestamp;
816 /* Skip all processing if there's nothing to do. */
817 if (longcal || shortcal || aniflag) {
819 ath9k_htc_ps_wakeup(priv);
821 /* Call ANI routine if necessary */
823 ath9k_hw_ani_monitor(ah, ah->curchan);
825 /* Perform calibration if necessary */
826 if (longcal || shortcal)
827 common->ani.caldone =
828 ath9k_hw_calibrate(ah, ah->curchan,
829 common->rx_chainmask,
832 ath9k_htc_ps_restore(priv);
837 * Set timer interval based on previous results.
838 * The interval must be the shortest necessary to satisfy ANI,
839 * short calibration and long calibration.
841 cal_interval = ATH_LONG_CALINTERVAL;
842 if (priv->ah->config.enable_ani)
843 cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
844 if (!common->ani.caldone)
845 cal_interval = min(cal_interval, (u32)short_cal_interval);
847 ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
848 msecs_to_jiffies(cal_interval));
851 /**********************/
852 /* mac80211 Callbacks */
853 /**********************/
855 static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
857 struct ieee80211_hdr *hdr;
858 struct ath9k_htc_priv *priv = hw->priv;
859 struct ath_common *common = ath9k_hw_common(priv->ah);
860 int padpos, padsize, ret, slot;
862 hdr = (struct ieee80211_hdr *) skb->data;
864 /* Add the padding after the header if this is not already done */
865 padpos = ath9k_cmn_padpos(hdr->frame_control);
866 padsize = padpos & 3;
867 if (padsize && skb->len > padpos) {
868 if (skb_headroom(skb) < padsize) {
869 ath_dbg(common, ATH_DBG_XMIT, "No room for padding\n");
872 skb_push(skb, padsize);
873 memmove(skb->data, skb->data + padsize, padpos);
876 slot = ath9k_htc_tx_get_slot(priv);
878 ath_dbg(common, ATH_DBG_XMIT, "No free TX slot\n");
882 ret = ath9k_htc_tx_start(priv, skb, slot, false);
884 ath_dbg(common, ATH_DBG_XMIT, "Tx failed\n");
888 ath9k_htc_check_stop_queues(priv);
893 ath9k_htc_tx_clear_slot(priv, slot);
895 dev_kfree_skb_any(skb);
898 static int ath9k_htc_start(struct ieee80211_hw *hw)
900 struct ath9k_htc_priv *priv = hw->priv;
901 struct ath_hw *ah = priv->ah;
902 struct ath_common *common = ath9k_hw_common(ah);
903 struct ieee80211_channel *curchan = hw->conf.channel;
904 struct ath9k_channel *init_channel;
906 enum htc_phymode mode;
910 mutex_lock(&priv->mutex);
912 ath_dbg(common, ATH_DBG_CONFIG,
913 "Starting driver with initial channel: %d MHz\n",
914 curchan->center_freq);
916 /* Ensure that HW is awake before flushing RX */
917 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
918 WMI_CMD(WMI_FLUSH_RECV_CMDID);
920 /* setup initial channel */
921 init_channel = ath9k_cmn_get_curchannel(hw, ah);
923 ath9k_hw_htc_resetinit(ah);
924 ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
927 "Unable to reset hardware; reset status %d (freq %u MHz)\n",
928 ret, curchan->center_freq);
929 mutex_unlock(&priv->mutex);
933 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
936 mode = ath9k_htc_get_curmode(priv, init_channel);
937 htc_mode = cpu_to_be16(mode);
938 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
939 WMI_CMD(WMI_ATH_INIT_CMDID);
940 WMI_CMD(WMI_START_RECV_CMDID);
942 ath9k_host_rx_init(priv);
944 ret = ath9k_htc_update_cap_target(priv, 0);
946 ath_dbg(common, ATH_DBG_CONFIG,
947 "Failed to update capability in target\n");
949 priv->op_flags &= ~OP_INVALID;
950 htc_start(priv->htc);
952 spin_lock_bh(&priv->tx.tx_lock);
953 priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP;
954 spin_unlock_bh(&priv->tx.tx_lock);
956 ieee80211_wake_queues(hw);
958 mod_timer(&priv->tx.cleanup_timer,
959 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
961 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) {
962 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
963 AR_STOMP_LOW_WLAN_WGHT);
964 ath9k_hw_btcoex_enable(ah);
965 ath_htc_resume_btcoex_work(priv);
967 mutex_unlock(&priv->mutex);
972 static void ath9k_htc_stop(struct ieee80211_hw *hw)
974 struct ath9k_htc_priv *priv = hw->priv;
975 struct ath_hw *ah = priv->ah;
976 struct ath_common *common = ath9k_hw_common(ah);
977 int ret __attribute__ ((unused));
980 mutex_lock(&priv->mutex);
982 if (priv->op_flags & OP_INVALID) {
983 ath_dbg(common, ATH_DBG_ANY, "Device not present\n");
984 mutex_unlock(&priv->mutex);
988 ath9k_htc_ps_wakeup(priv);
990 WMI_CMD(WMI_DISABLE_INTR_CMDID);
991 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
992 WMI_CMD(WMI_STOP_RECV_CMDID);
994 tasklet_kill(&priv->rx_tasklet);
996 del_timer_sync(&priv->tx.cleanup_timer);
997 ath9k_htc_tx_drain(priv);
998 ath9k_wmi_event_drain(priv);
1000 mutex_unlock(&priv->mutex);
1002 /* Cancel all the running timers/work .. */
1003 cancel_work_sync(&priv->fatal_work);
1004 cancel_work_sync(&priv->ps_work);
1006 #ifdef CONFIG_MAC80211_LEDS
1007 cancel_work_sync(&priv->led_work);
1009 ath9k_htc_stop_ani(priv);
1011 mutex_lock(&priv->mutex);
1013 if (ah->btcoex_hw.enabled) {
1014 ath9k_hw_btcoex_disable(ah);
1015 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1016 ath_htc_cancel_btcoex_work(priv);
1019 /* Remove a monitor interface if it's present. */
1020 if (priv->ah->is_monitoring)
1021 ath9k_htc_remove_monitor_interface(priv);
1023 ath9k_hw_phy_disable(ah);
1024 ath9k_hw_disable(ah);
1025 ath9k_htc_ps_restore(priv);
1026 ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);
1028 priv->op_flags |= OP_INVALID;
1030 ath_dbg(common, ATH_DBG_CONFIG, "Driver halt\n");
1031 mutex_unlock(&priv->mutex);
1034 static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
1035 struct ieee80211_vif *vif)
1037 struct ath9k_htc_priv *priv = hw->priv;
1038 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1039 struct ath_common *common = ath9k_hw_common(priv->ah);
1040 struct ath9k_htc_target_vif hvif;
1044 mutex_lock(&priv->mutex);
1046 if (priv->nvifs >= ATH9K_HTC_MAX_VIF) {
1047 mutex_unlock(&priv->mutex);
1051 if (priv->num_ibss_vif ||
1052 (priv->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
1053 ath_err(common, "IBSS coexistence with other modes is not allowed\n");
1054 mutex_unlock(&priv->mutex);
1058 if (((vif->type == NL80211_IFTYPE_AP) ||
1059 (vif->type == NL80211_IFTYPE_ADHOC)) &&
1060 ((priv->num_ap_vif + priv->num_ibss_vif) >= ATH9K_HTC_MAX_BCN_VIF)) {
1061 ath_err(common, "Max. number of beaconing interfaces reached\n");
1062 mutex_unlock(&priv->mutex);
1066 ath9k_htc_ps_wakeup(priv);
1067 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1068 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1070 switch (vif->type) {
1071 case NL80211_IFTYPE_STATION:
1072 hvif.opmode = HTC_M_STA;
1074 case NL80211_IFTYPE_ADHOC:
1075 hvif.opmode = HTC_M_IBSS;
1077 case NL80211_IFTYPE_AP:
1078 hvif.opmode = HTC_M_HOSTAP;
1082 "Interface type %d not yet supported\n", vif->type);
1087 /* Index starts from zero on the target */
1088 avp->index = hvif.index = ffz(priv->vif_slot);
1089 hvif.rtsthreshold = cpu_to_be16(2304);
1090 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
1095 * We need a node in target to tx mgmt frames
1096 * before association.
1098 ret = ath9k_htc_add_station(priv, vif, NULL);
1100 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1104 ath9k_htc_set_bssid_mask(priv, vif);
1106 priv->vif_slot |= (1 << avp->index);
1109 INC_VIF(priv, vif->type);
1111 if ((vif->type == NL80211_IFTYPE_AP) ||
1112 (vif->type == NL80211_IFTYPE_ADHOC))
1113 ath9k_htc_assign_bslot(priv, vif);
1115 ath9k_htc_set_opmode(priv);
1117 if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1118 !(priv->op_flags & OP_ANI_RUNNING)) {
1119 ath9k_hw_set_tsfadjust(priv->ah, 1);
1120 ath9k_htc_start_ani(priv);
1123 ath_dbg(common, ATH_DBG_CONFIG,
1124 "Attach a VIF of type: %d at idx: %d\n", vif->type, avp->index);
1127 ath9k_htc_ps_restore(priv);
1128 mutex_unlock(&priv->mutex);
1133 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,
1134 struct ieee80211_vif *vif)
1136 struct ath9k_htc_priv *priv = hw->priv;
1137 struct ath_common *common = ath9k_hw_common(priv->ah);
1138 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1139 struct ath9k_htc_target_vif hvif;
1143 mutex_lock(&priv->mutex);
1144 ath9k_htc_ps_wakeup(priv);
1146 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1147 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1148 hvif.index = avp->index;
1149 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1151 ath_err(common, "Unable to remove interface at idx: %d\n",
1155 priv->vif_slot &= ~(1 << avp->index);
1157 ath9k_htc_remove_station(priv, vif, NULL);
1159 DEC_VIF(priv, vif->type);
1161 if ((vif->type == NL80211_IFTYPE_AP) ||
1162 (vif->type == NL80211_IFTYPE_ADHOC))
1163 ath9k_htc_remove_bslot(priv, vif);
1165 ath9k_htc_set_opmode(priv);
1167 ath9k_htc_set_bssid_mask(priv, vif);
1170 * Stop ANI only if there are no associated station interfaces.
1172 if ((vif->type == NL80211_IFTYPE_AP) && (priv->num_ap_vif == 0)) {
1173 priv->rearm_ani = false;
1174 ieee80211_iterate_active_interfaces_atomic(priv->hw,
1175 ath9k_htc_vif_iter, priv);
1176 if (!priv->rearm_ani)
1177 ath9k_htc_stop_ani(priv);
1180 ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface at idx: %d\n", avp->index);
1182 ath9k_htc_ps_restore(priv);
1183 mutex_unlock(&priv->mutex);
1186 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
1188 struct ath9k_htc_priv *priv = hw->priv;
1189 struct ath_common *common = ath9k_hw_common(priv->ah);
1190 struct ieee80211_conf *conf = &hw->conf;
1192 mutex_lock(&priv->mutex);
1194 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1195 bool enable_radio = false;
1196 bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1198 mutex_lock(&priv->htc_pm_lock);
1199 if (!idle && priv->ps_idle)
1200 enable_radio = true;
1201 priv->ps_idle = idle;
1202 mutex_unlock(&priv->htc_pm_lock);
1205 ath_dbg(common, ATH_DBG_CONFIG,
1206 "not-idle: enabling radio\n");
1207 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1208 ath9k_htc_radio_enable(hw);
1213 * Monitor interface should be added before
1214 * IEEE80211_CONF_CHANGE_CHANNEL is handled.
1216 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1217 if ((conf->flags & IEEE80211_CONF_MONITOR) &&
1218 !priv->ah->is_monitoring)
1219 ath9k_htc_add_monitor_interface(priv);
1220 else if (priv->ah->is_monitoring)
1221 ath9k_htc_remove_monitor_interface(priv);
1224 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1225 struct ieee80211_channel *curchan = hw->conf.channel;
1226 int pos = curchan->hw_value;
1228 ath_dbg(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
1229 curchan->center_freq);
1231 ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
1233 hw->conf.channel_type);
1235 if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
1236 ath_err(common, "Unable to set channel\n");
1237 mutex_unlock(&priv->mutex);
1243 if (changed & IEEE80211_CONF_CHANGE_PS) {
1244 if (conf->flags & IEEE80211_CONF_PS) {
1245 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
1246 priv->ps_enabled = true;
1248 priv->ps_enabled = false;
1249 cancel_work_sync(&priv->ps_work);
1250 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1254 if (changed & IEEE80211_CONF_CHANGE_POWER) {
1255 priv->txpowlimit = 2 * conf->power_level;
1256 ath9k_cmn_update_txpow(priv->ah, priv->curtxpow,
1257 priv->txpowlimit, &priv->curtxpow);
1260 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1261 mutex_lock(&priv->htc_pm_lock);
1262 if (!priv->ps_idle) {
1263 mutex_unlock(&priv->htc_pm_lock);
1266 mutex_unlock(&priv->htc_pm_lock);
1268 ath_dbg(common, ATH_DBG_CONFIG,
1269 "idle: disabling radio\n");
1270 ath9k_htc_radio_disable(hw);
1274 mutex_unlock(&priv->mutex);
1278 #define SUPPORTED_FILTERS \
1279 (FIF_PROMISC_IN_BSS | \
1284 FIF_BCN_PRBRESP_PROMISC | \
1288 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
1289 unsigned int changed_flags,
1290 unsigned int *total_flags,
1293 struct ath9k_htc_priv *priv = hw->priv;
1296 mutex_lock(&priv->mutex);
1297 ath9k_htc_ps_wakeup(priv);
1299 changed_flags &= SUPPORTED_FILTERS;
1300 *total_flags &= SUPPORTED_FILTERS;
1302 priv->rxfilter = *total_flags;
1303 rfilt = ath9k_htc_calcrxfilter(priv);
1304 ath9k_hw_setrxfilter(priv->ah, rfilt);
1306 ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG,
1307 "Set HW RX filter: 0x%x\n", rfilt);
1309 ath9k_htc_ps_restore(priv);
1310 mutex_unlock(&priv->mutex);
1313 static int ath9k_htc_sta_add(struct ieee80211_hw *hw,
1314 struct ieee80211_vif *vif,
1315 struct ieee80211_sta *sta)
1317 struct ath9k_htc_priv *priv = hw->priv;
1320 mutex_lock(&priv->mutex);
1321 ath9k_htc_ps_wakeup(priv);
1322 ret = ath9k_htc_add_station(priv, vif, sta);
1324 ath9k_htc_init_rate(priv, sta);
1325 ath9k_htc_ps_restore(priv);
1326 mutex_unlock(&priv->mutex);
1331 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
1332 struct ieee80211_vif *vif,
1333 struct ieee80211_sta *sta)
1335 struct ath9k_htc_priv *priv = hw->priv;
1336 struct ath9k_htc_sta *ista;
1339 mutex_lock(&priv->mutex);
1340 ath9k_htc_ps_wakeup(priv);
1341 ista = (struct ath9k_htc_sta *) sta->drv_priv;
1342 htc_sta_drain(priv->htc, ista->index);
1343 ret = ath9k_htc_remove_station(priv, vif, sta);
1344 ath9k_htc_ps_restore(priv);
1345 mutex_unlock(&priv->mutex);
1350 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw, u16 queue,
1351 const struct ieee80211_tx_queue_params *params)
1353 struct ath9k_htc_priv *priv = hw->priv;
1354 struct ath_common *common = ath9k_hw_common(priv->ah);
1355 struct ath9k_tx_queue_info qi;
1358 if (queue >= WME_NUM_AC)
1361 mutex_lock(&priv->mutex);
1362 ath9k_htc_ps_wakeup(priv);
1364 memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
1366 qi.tqi_aifs = params->aifs;
1367 qi.tqi_cwmin = params->cw_min;
1368 qi.tqi_cwmax = params->cw_max;
1369 qi.tqi_burstTime = params->txop;
1371 qnum = get_hw_qnum(queue, priv->hwq_map);
1373 ath_dbg(common, ATH_DBG_CONFIG,
1374 "Configure tx [queue/hwq] [%d/%d], aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
1375 queue, qnum, params->aifs, params->cw_min,
1376 params->cw_max, params->txop);
1378 ret = ath_htc_txq_update(priv, qnum, &qi);
1380 ath_err(common, "TXQ Update failed\n");
1384 if ((priv->ah->opmode == NL80211_IFTYPE_ADHOC) &&
1385 (qnum == priv->hwq_map[WME_AC_BE]))
1386 ath9k_htc_beaconq_config(priv);
1388 ath9k_htc_ps_restore(priv);
1389 mutex_unlock(&priv->mutex);
1394 static int ath9k_htc_set_key(struct ieee80211_hw *hw,
1395 enum set_key_cmd cmd,
1396 struct ieee80211_vif *vif,
1397 struct ieee80211_sta *sta,
1398 struct ieee80211_key_conf *key)
1400 struct ath9k_htc_priv *priv = hw->priv;
1401 struct ath_common *common = ath9k_hw_common(priv->ah);
1404 if (htc_modparam_nohwcrypt)
1407 mutex_lock(&priv->mutex);
1408 ath_dbg(common, ATH_DBG_CONFIG, "Set HW Key\n");
1409 ath9k_htc_ps_wakeup(priv);
1413 ret = ath_key_config(common, vif, sta, key);
1415 key->hw_key_idx = ret;
1416 /* push IV and Michael MIC generation to stack */
1417 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1418 if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1419 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1420 if (priv->ah->sw_mgmt_crypto &&
1421 key->cipher == WLAN_CIPHER_SUITE_CCMP)
1422 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1427 ath_key_delete(common, key);
1433 ath9k_htc_ps_restore(priv);
1434 mutex_unlock(&priv->mutex);
1439 static void ath9k_htc_set_bssid(struct ath9k_htc_priv *priv)
1441 struct ath_common *common = ath9k_hw_common(priv->ah);
1443 ath9k_hw_write_associd(priv->ah);
1444 ath_dbg(common, ATH_DBG_CONFIG,
1445 "BSSID: %pM aid: 0x%x\n",
1446 common->curbssid, common->curaid);
1449 static void ath9k_htc_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
1451 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
1452 struct ath_common *common = ath9k_hw_common(priv->ah);
1453 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
1455 if ((vif->type == NL80211_IFTYPE_STATION) && bss_conf->assoc) {
1456 common->curaid = bss_conf->aid;
1457 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1461 static void ath9k_htc_choose_set_bssid(struct ath9k_htc_priv *priv)
1463 if (priv->num_sta_assoc_vif == 1) {
1464 ieee80211_iterate_active_interfaces_atomic(priv->hw,
1465 ath9k_htc_bss_iter, priv);
1466 ath9k_htc_set_bssid(priv);
1470 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
1471 struct ieee80211_vif *vif,
1472 struct ieee80211_bss_conf *bss_conf,
1475 struct ath9k_htc_priv *priv = hw->priv;
1476 struct ath_hw *ah = priv->ah;
1477 struct ath_common *common = ath9k_hw_common(ah);
1479 mutex_lock(&priv->mutex);
1480 ath9k_htc_ps_wakeup(priv);
1482 if (changed & BSS_CHANGED_ASSOC) {
1483 ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
1487 priv->num_sta_assoc_vif++ : priv->num_sta_assoc_vif--;
1489 if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
1490 if (bss_conf->assoc && (priv->num_sta_assoc_vif == 1))
1491 ath9k_htc_start_ani(priv);
1492 else if (priv->num_sta_assoc_vif == 0)
1493 ath9k_htc_stop_ani(priv);
1497 if (changed & BSS_CHANGED_BSSID) {
1498 if (priv->ah->opmode == NL80211_IFTYPE_ADHOC) {
1499 common->curaid = bss_conf->aid;
1500 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1501 ath9k_htc_set_bssid(priv);
1502 } else if (priv->ah->opmode == NL80211_IFTYPE_STATION) {
1503 ath9k_htc_choose_set_bssid(priv);
1507 if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) {
1508 ath_dbg(common, ATH_DBG_CONFIG,
1509 "Beacon enabled for BSS: %pM\n", bss_conf->bssid);
1510 ath9k_htc_set_tsfadjust(priv, vif);
1511 priv->op_flags |= OP_ENABLE_BEACON;
1512 ath9k_htc_beacon_config(priv, vif);
1515 if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) {
1517 * Disable SWBA interrupt only if there are no
1518 * AP/IBSS interfaces.
1520 if ((priv->num_ap_vif <= 1) || priv->num_ibss_vif) {
1521 ath_dbg(common, ATH_DBG_CONFIG,
1522 "Beacon disabled for BSS: %pM\n",
1524 priv->op_flags &= ~OP_ENABLE_BEACON;
1525 ath9k_htc_beacon_config(priv, vif);
1529 if (changed & BSS_CHANGED_BEACON_INT) {
1531 * Reset the HW TSF for the first AP interface.
1533 if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1534 (priv->nvifs == 1) &&
1535 (priv->num_ap_vif == 1) &&
1536 (vif->type == NL80211_IFTYPE_AP)) {
1537 priv->op_flags |= OP_TSF_RESET;
1539 ath_dbg(common, ATH_DBG_CONFIG,
1540 "Beacon interval changed for BSS: %pM\n",
1542 ath9k_htc_beacon_config(priv, vif);
1545 if (changed & BSS_CHANGED_ERP_SLOT) {
1546 if (bss_conf->use_short_slot)
1551 ath9k_hw_init_global_settings(ah);
1554 if (changed & BSS_CHANGED_HT)
1555 ath9k_htc_update_rate(priv, vif, bss_conf);
1557 ath9k_htc_ps_restore(priv);
1558 mutex_unlock(&priv->mutex);
1561 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw)
1563 struct ath9k_htc_priv *priv = hw->priv;
1566 mutex_lock(&priv->mutex);
1567 ath9k_htc_ps_wakeup(priv);
1568 tsf = ath9k_hw_gettsf64(priv->ah);
1569 ath9k_htc_ps_restore(priv);
1570 mutex_unlock(&priv->mutex);
1575 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, u64 tsf)
1577 struct ath9k_htc_priv *priv = hw->priv;
1579 mutex_lock(&priv->mutex);
1580 ath9k_htc_ps_wakeup(priv);
1581 ath9k_hw_settsf64(priv->ah, tsf);
1582 ath9k_htc_ps_restore(priv);
1583 mutex_unlock(&priv->mutex);
1586 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw)
1588 struct ath9k_htc_priv *priv = hw->priv;
1590 mutex_lock(&priv->mutex);
1591 ath9k_htc_ps_wakeup(priv);
1592 ath9k_hw_reset_tsf(priv->ah);
1593 ath9k_htc_ps_restore(priv);
1594 mutex_unlock(&priv->mutex);
1597 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
1598 struct ieee80211_vif *vif,
1599 enum ieee80211_ampdu_mlme_action action,
1600 struct ieee80211_sta *sta,
1601 u16 tid, u16 *ssn, u8 buf_size)
1603 struct ath9k_htc_priv *priv = hw->priv;
1604 struct ath9k_htc_sta *ista;
1607 mutex_lock(&priv->mutex);
1608 ath9k_htc_ps_wakeup(priv);
1611 case IEEE80211_AMPDU_RX_START:
1613 case IEEE80211_AMPDU_RX_STOP:
1615 case IEEE80211_AMPDU_TX_START:
1616 ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1618 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1620 case IEEE80211_AMPDU_TX_STOP:
1621 ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1622 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1624 case IEEE80211_AMPDU_TX_OPERATIONAL:
1625 ista = (struct ath9k_htc_sta *) sta->drv_priv;
1626 spin_lock_bh(&priv->tx.tx_lock);
1627 ista->tid_state[tid] = AGGR_OPERATIONAL;
1628 spin_unlock_bh(&priv->tx.tx_lock);
1631 ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n");
1634 ath9k_htc_ps_restore(priv);
1635 mutex_unlock(&priv->mutex);
1640 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)
1642 struct ath9k_htc_priv *priv = hw->priv;
1644 mutex_lock(&priv->mutex);
1645 spin_lock_bh(&priv->beacon_lock);
1646 priv->op_flags |= OP_SCANNING;
1647 spin_unlock_bh(&priv->beacon_lock);
1648 cancel_work_sync(&priv->ps_work);
1649 ath9k_htc_stop_ani(priv);
1650 mutex_unlock(&priv->mutex);
1653 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
1655 struct ath9k_htc_priv *priv = hw->priv;
1657 mutex_lock(&priv->mutex);
1658 spin_lock_bh(&priv->beacon_lock);
1659 priv->op_flags &= ~OP_SCANNING;
1660 spin_unlock_bh(&priv->beacon_lock);
1661 ath9k_htc_ps_wakeup(priv);
1662 ath9k_htc_vif_reconfig(priv);
1663 ath9k_htc_ps_restore(priv);
1664 mutex_unlock(&priv->mutex);
1667 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1672 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw,
1675 struct ath9k_htc_priv *priv = hw->priv;
1677 mutex_lock(&priv->mutex);
1678 ath9k_htc_ps_wakeup(priv);
1679 priv->ah->coverage_class = coverage_class;
1680 ath9k_hw_init_global_settings(priv->ah);
1681 ath9k_htc_ps_restore(priv);
1682 mutex_unlock(&priv->mutex);
1686 * Currently, this is used only for selecting the minimum rate
1687 * for management frames, rate selection for data frames remain
1690 static int ath9k_htc_set_bitrate_mask(struct ieee80211_hw *hw,
1691 struct ieee80211_vif *vif,
1692 const struct cfg80211_bitrate_mask *mask)
1694 struct ath9k_htc_priv *priv = hw->priv;
1695 struct ath_common *common = ath9k_hw_common(priv->ah);
1696 struct ath9k_htc_target_rate_mask tmask;
1697 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1701 memset(&tmask, 0, sizeof(struct ath9k_htc_target_rate_mask));
1703 tmask.vif_index = avp->index;
1704 tmask.band = IEEE80211_BAND_2GHZ;
1705 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_2GHZ].legacy);
1707 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask);
1710 "Unable to set 2G rate mask for "
1711 "interface at idx: %d\n", avp->index);
1715 tmask.band = IEEE80211_BAND_5GHZ;
1716 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_5GHZ].legacy);
1718 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask);
1721 "Unable to set 5G rate mask for "
1722 "interface at idx: %d\n", avp->index);
1726 ath_dbg(common, ATH_DBG_CONFIG,
1727 "Set bitrate masks: 0x%x, 0x%x\n",
1728 mask->control[IEEE80211_BAND_2GHZ].legacy,
1729 mask->control[IEEE80211_BAND_5GHZ].legacy);
1734 struct ieee80211_ops ath9k_htc_ops = {
1736 .start = ath9k_htc_start,
1737 .stop = ath9k_htc_stop,
1738 .add_interface = ath9k_htc_add_interface,
1739 .remove_interface = ath9k_htc_remove_interface,
1740 .config = ath9k_htc_config,
1741 .configure_filter = ath9k_htc_configure_filter,
1742 .sta_add = ath9k_htc_sta_add,
1743 .sta_remove = ath9k_htc_sta_remove,
1744 .conf_tx = ath9k_htc_conf_tx,
1745 .bss_info_changed = ath9k_htc_bss_info_changed,
1746 .set_key = ath9k_htc_set_key,
1747 .get_tsf = ath9k_htc_get_tsf,
1748 .set_tsf = ath9k_htc_set_tsf,
1749 .reset_tsf = ath9k_htc_reset_tsf,
1750 .ampdu_action = ath9k_htc_ampdu_action,
1751 .sw_scan_start = ath9k_htc_sw_scan_start,
1752 .sw_scan_complete = ath9k_htc_sw_scan_complete,
1753 .set_rts_threshold = ath9k_htc_set_rts_threshold,
1754 .rfkill_poll = ath9k_htc_rfkill_poll_state,
1755 .set_coverage_class = ath9k_htc_set_coverage_class,
1756 .set_bitrate_mask = ath9k_htc_set_bitrate_mask,