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.
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:
51 bool ath9k_htc_setpower(struct ath9k_htc_priv *priv,
52 enum ath9k_power_mode mode)
56 mutex_lock(&priv->htc_pm_lock);
57 ret = ath9k_hw_setpower(priv->ah, mode);
58 mutex_unlock(&priv->htc_pm_lock);
63 void ath9k_htc_ps_wakeup(struct ath9k_htc_priv *priv)
65 mutex_lock(&priv->htc_pm_lock);
66 if (++priv->ps_usecount != 1)
68 ath9k_hw_setpower(priv->ah, ATH9K_PM_AWAKE);
71 mutex_unlock(&priv->htc_pm_lock);
74 void ath9k_htc_ps_restore(struct ath9k_htc_priv *priv)
76 mutex_lock(&priv->htc_pm_lock);
77 if (--priv->ps_usecount != 0)
81 ath9k_hw_setpower(priv->ah, ATH9K_PM_FULL_SLEEP);
82 else if (priv->ps_enabled)
83 ath9k_hw_setpower(priv->ah, ATH9K_PM_NETWORK_SLEEP);
86 mutex_unlock(&priv->htc_pm_lock);
89 void ath9k_ps_work(struct work_struct *work)
91 struct ath9k_htc_priv *priv =
92 container_of(work, struct ath9k_htc_priv,
94 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
96 /* The chip wakes up after receiving the first beacon
97 while network sleep is enabled. For the driver to
98 be in sync with the hw, set the chip to awake and
99 only then set it to sleep.
101 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
104 static void ath9k_htc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
106 struct ath9k_htc_priv *priv = data;
107 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
109 if ((vif->type == NL80211_IFTYPE_AP) && bss_conf->enable_beacon)
110 priv->reconfig_beacon = true;
112 if (bss_conf->assoc) {
113 priv->rearm_ani = true;
114 priv->reconfig_beacon = true;
118 static void ath9k_htc_vif_reconfig(struct ath9k_htc_priv *priv)
120 priv->rearm_ani = false;
121 priv->reconfig_beacon = false;
123 ieee80211_iterate_active_interfaces_atomic(priv->hw,
124 ath9k_htc_vif_iter, priv);
126 ath9k_htc_start_ani(priv);
128 if (priv->reconfig_beacon) {
129 ath9k_htc_ps_wakeup(priv);
130 ath9k_htc_beacon_reconfig(priv);
131 ath9k_htc_ps_restore(priv);
135 static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
137 struct ath9k_vif_iter_data *iter_data = data;
140 for (i = 0; i < ETH_ALEN; i++)
141 iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]);
144 static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv,
145 struct ieee80211_vif *vif)
147 struct ath_common *common = ath9k_hw_common(priv->ah);
148 struct ath9k_vif_iter_data iter_data;
151 * Use the hardware MAC address as reference, the hardware uses it
152 * together with the BSSID mask when matching addresses.
154 iter_data.hw_macaddr = common->macaddr;
155 memset(&iter_data.mask, 0xff, ETH_ALEN);
158 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif);
160 /* Get list of all active MAC addresses */
161 ieee80211_iterate_active_interfaces_atomic(priv->hw, ath9k_htc_bssid_iter,
164 memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
165 ath_hw_setbssidmask(common);
168 static void ath9k_htc_set_opmode(struct ath9k_htc_priv *priv)
170 if (priv->num_ibss_vif)
171 priv->ah->opmode = NL80211_IFTYPE_ADHOC;
172 else if (priv->num_ap_vif)
173 priv->ah->opmode = NL80211_IFTYPE_AP;
175 priv->ah->opmode = NL80211_IFTYPE_STATION;
177 ath9k_hw_setopmode(priv->ah);
180 void ath9k_htc_reset(struct ath9k_htc_priv *priv)
182 struct ath_hw *ah = priv->ah;
183 struct ath_common *common = ath9k_hw_common(ah);
184 struct ieee80211_channel *channel = priv->hw->conf.channel;
185 struct ath9k_hw_cal_data *caldata = NULL;
186 enum htc_phymode mode;
191 mutex_lock(&priv->mutex);
192 ath9k_htc_ps_wakeup(priv);
194 ath9k_htc_stop_ani(priv);
195 ieee80211_stop_queues(priv->hw);
197 del_timer_sync(&priv->tx.cleanup_timer);
198 ath9k_htc_tx_drain(priv);
200 WMI_CMD(WMI_DISABLE_INTR_CMDID);
201 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
202 WMI_CMD(WMI_STOP_RECV_CMDID);
204 ath9k_wmi_event_drain(priv);
206 caldata = &priv->caldata;
207 ret = ath9k_hw_reset(ah, ah->curchan, caldata, false);
210 "Unable to reset device (%u Mhz) reset status %d\n",
211 channel->center_freq, ret);
214 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
217 WMI_CMD(WMI_START_RECV_CMDID);
218 ath9k_host_rx_init(priv);
220 mode = ath9k_htc_get_curmode(priv, ah->curchan);
221 htc_mode = cpu_to_be16(mode);
222 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
224 WMI_CMD(WMI_ENABLE_INTR_CMDID);
225 htc_start(priv->htc);
226 ath9k_htc_vif_reconfig(priv);
227 ieee80211_wake_queues(priv->hw);
229 mod_timer(&priv->tx.cleanup_timer,
230 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
232 ath9k_htc_ps_restore(priv);
233 mutex_unlock(&priv->mutex);
236 static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
237 struct ieee80211_hw *hw,
238 struct ath9k_channel *hchan)
240 struct ath_hw *ah = priv->ah;
241 struct ath_common *common = ath9k_hw_common(ah);
242 struct ieee80211_conf *conf = &common->hw->conf;
244 struct ieee80211_channel *channel = hw->conf.channel;
245 struct ath9k_hw_cal_data *caldata = NULL;
246 enum htc_phymode mode;
251 if (priv->op_flags & OP_INVALID)
254 fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
256 ath9k_htc_ps_wakeup(priv);
258 del_timer_sync(&priv->tx.cleanup_timer);
259 ath9k_htc_tx_drain(priv);
261 WMI_CMD(WMI_DISABLE_INTR_CMDID);
262 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
263 WMI_CMD(WMI_STOP_RECV_CMDID);
265 ath9k_wmi_event_drain(priv);
267 ath_dbg(common, ATH_DBG_CONFIG,
268 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n",
269 priv->ah->curchan->channel,
270 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf),
274 caldata = &priv->caldata;
276 ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
279 "Unable to reset channel (%u Mhz) reset status %d\n",
280 channel->center_freq, ret);
284 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
287 WMI_CMD(WMI_START_RECV_CMDID);
291 ath9k_host_rx_init(priv);
293 mode = ath9k_htc_get_curmode(priv, hchan);
294 htc_mode = cpu_to_be16(mode);
295 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
299 WMI_CMD(WMI_ENABLE_INTR_CMDID);
303 htc_start(priv->htc);
305 if (!(priv->op_flags & OP_SCANNING) &&
306 !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
307 ath9k_htc_vif_reconfig(priv);
309 mod_timer(&priv->tx.cleanup_timer,
310 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
313 ath9k_htc_ps_restore(priv);
318 * Monitor mode handling is a tad complicated because the firmware requires
319 * an interface to be created exclusively, while mac80211 doesn't associate
320 * an interface with the mode.
322 * So, for now, only one monitor interface can be configured.
324 static void __ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
326 struct ath_common *common = ath9k_hw_common(priv->ah);
327 struct ath9k_htc_target_vif hvif;
331 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
332 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
333 hvif.index = priv->mon_vif_idx;
334 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
336 ath_err(common, "Unable to remove monitor interface at idx: %d\n",
341 priv->vif_slot &= ~(1 << priv->mon_vif_idx);
344 static int ath9k_htc_add_monitor_interface(struct ath9k_htc_priv *priv)
346 struct ath_common *common = ath9k_hw_common(priv->ah);
347 struct ath9k_htc_target_vif hvif;
348 struct ath9k_htc_target_sta tsta;
349 int ret = 0, sta_idx;
352 if ((priv->nvifs >= ATH9K_HTC_MAX_VIF) ||
353 (priv->nstations >= ATH9K_HTC_MAX_STA)) {
358 sta_idx = ffz(priv->sta_slot);
359 if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA)) {
367 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
368 memcpy(&hvif.myaddr, common->macaddr, ETH_ALEN);
370 hvif.opmode = HTC_M_MONITOR;
371 hvif.index = ffz(priv->vif_slot);
373 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
378 * Assign the monitor interface index as a special case here.
379 * This is needed when the interface is brought down.
381 priv->mon_vif_idx = hvif.index;
382 priv->vif_slot |= (1 << hvif.index);
385 * Set the hardware mode to monitor only if there are no
389 priv->ah->opmode = NL80211_IFTYPE_MONITOR;
394 * Associate a station with the interface for packet injection.
396 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
398 memcpy(&tsta.macaddr, common->macaddr, ETH_ALEN);
401 tsta.sta_index = sta_idx;
402 tsta.vif_index = hvif.index;
403 tsta.maxampdu = cpu_to_be16(0xffff);
405 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
407 ath_err(common, "Unable to add station entry for monitor mode\n");
411 priv->sta_slot |= (1 << sta_idx);
413 priv->vif_sta_pos[priv->mon_vif_idx] = sta_idx;
414 priv->ah->is_monitoring = true;
416 ath_dbg(common, ATH_DBG_CONFIG,
417 "Attached a monitor interface at idx: %d, sta idx: %d\n",
418 priv->mon_vif_idx, sta_idx);
424 * Remove the interface from the target.
426 __ath9k_htc_remove_monitor_interface(priv);
428 ath_dbg(common, ATH_DBG_FATAL, "Unable to attach a monitor interface\n");
433 static int ath9k_htc_remove_monitor_interface(struct ath9k_htc_priv *priv)
435 struct ath_common *common = ath9k_hw_common(priv->ah);
439 __ath9k_htc_remove_monitor_interface(priv);
441 sta_idx = priv->vif_sta_pos[priv->mon_vif_idx];
443 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
445 ath_err(common, "Unable to remove station entry for monitor mode\n");
449 priv->sta_slot &= ~(1 << sta_idx);
451 priv->ah->is_monitoring = false;
453 ath_dbg(common, ATH_DBG_CONFIG,
454 "Removed a monitor interface at idx: %d, sta idx: %d\n",
455 priv->mon_vif_idx, sta_idx);
460 static int ath9k_htc_add_station(struct ath9k_htc_priv *priv,
461 struct ieee80211_vif *vif,
462 struct ieee80211_sta *sta)
464 struct ath_common *common = ath9k_hw_common(priv->ah);
465 struct ath9k_htc_target_sta tsta;
466 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
467 struct ath9k_htc_sta *ista;
472 if (priv->nstations >= ATH9K_HTC_MAX_STA)
475 sta_idx = ffz(priv->sta_slot);
476 if ((sta_idx < 0) || (sta_idx > ATH9K_HTC_MAX_STA))
479 memset(&tsta, 0, sizeof(struct ath9k_htc_target_sta));
482 ista = (struct ath9k_htc_sta *) sta->drv_priv;
483 memcpy(&tsta.macaddr, sta->addr, ETH_ALEN);
484 memcpy(&tsta.bssid, common->curbssid, ETH_ALEN);
486 ista->index = sta_idx;
488 memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
492 tsta.sta_index = sta_idx;
493 tsta.vif_index = avp->index;
496 tsta.maxampdu = cpu_to_be16(0xffff);
498 maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
499 sta->ht_cap.ampdu_factor);
500 tsta.maxampdu = cpu_to_be16(maxampdu);
503 if (sta && sta->ht_cap.ht_supported)
504 tsta.flags = cpu_to_be16(ATH_HTC_STA_HT);
506 WMI_CMD_BUF(WMI_NODE_CREATE_CMDID, &tsta);
510 "Unable to add station entry for: %pM\n",
516 ath_dbg(common, ATH_DBG_CONFIG,
517 "Added a station entry for: %pM (idx: %d)\n",
518 sta->addr, tsta.sta_index);
520 ath_dbg(common, ATH_DBG_CONFIG,
521 "Added a station entry for VIF %d (idx: %d)\n",
522 avp->index, tsta.sta_index);
525 priv->sta_slot |= (1 << sta_idx);
528 priv->vif_sta_pos[avp->index] = sta_idx;
533 static int ath9k_htc_remove_station(struct ath9k_htc_priv *priv,
534 struct ieee80211_vif *vif,
535 struct ieee80211_sta *sta)
537 struct ath_common *common = ath9k_hw_common(priv->ah);
538 struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
539 struct ath9k_htc_sta *ista;
544 ista = (struct ath9k_htc_sta *) sta->drv_priv;
545 sta_idx = ista->index;
547 sta_idx = priv->vif_sta_pos[avp->index];
550 WMI_CMD_BUF(WMI_NODE_REMOVE_CMDID, &sta_idx);
554 "Unable to remove station entry for: %pM\n",
560 ath_dbg(common, ATH_DBG_CONFIG,
561 "Removed a station entry for: %pM (idx: %d)\n",
564 ath_dbg(common, ATH_DBG_CONFIG,
565 "Removed a station entry for VIF %d (idx: %d)\n",
566 avp->index, sta_idx);
569 priv->sta_slot &= ~(1 << sta_idx);
575 int ath9k_htc_update_cap_target(struct ath9k_htc_priv *priv,
578 struct ath9k_htc_cap_target tcap;
582 memset(&tcap, 0, sizeof(struct ath9k_htc_cap_target));
584 tcap.ampdu_limit = cpu_to_be32(0xffff);
585 tcap.ampdu_subframes = priv->hw->max_tx_aggregation_subframes;
586 tcap.enable_coex = enable_coex;
587 tcap.tx_chainmask = priv->ah->caps.tx_chainmask;
589 WMI_CMD_BUF(WMI_TARGET_IC_UPDATE_CMDID, &tcap);
594 static void ath9k_htc_setup_rate(struct ath9k_htc_priv *priv,
595 struct ieee80211_sta *sta,
596 struct ath9k_htc_target_rate *trate)
598 struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv;
599 struct ieee80211_supported_band *sband;
603 sband = priv->hw->wiphy->bands[priv->hw->conf.channel->band];
605 for (i = 0, j = 0; i < sband->n_bitrates; i++) {
606 if (sta->supp_rates[sband->band] & BIT(i)) {
607 trate->rates.legacy_rates.rs_rates[j]
608 = (sband->bitrates[i].bitrate * 2) / 10;
612 trate->rates.legacy_rates.rs_nrates = j;
614 if (sta->ht_cap.ht_supported) {
615 for (i = 0, j = 0; i < 77; i++) {
616 if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
617 trate->rates.ht_rates.rs_rates[j++] = i;
618 if (j == ATH_HTC_RATE_MAX)
621 trate->rates.ht_rates.rs_nrates = j;
623 caps = WLAN_RC_HT_FLAG;
624 if (sta->ht_cap.mcs.rx_mask[1])
625 caps |= WLAN_RC_DS_FLAG;
626 if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
627 (conf_is_ht40(&priv->hw->conf)))
628 caps |= WLAN_RC_40_FLAG;
629 if (conf_is_ht40(&priv->hw->conf) &&
630 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
631 caps |= WLAN_RC_SGI_FLAG;
632 else if (conf_is_ht20(&priv->hw->conf) &&
633 (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
634 caps |= WLAN_RC_SGI_FLAG;
637 trate->sta_index = ista->index;
639 trate->capflags = cpu_to_be32(caps);
642 static int ath9k_htc_send_rate_cmd(struct ath9k_htc_priv *priv,
643 struct ath9k_htc_target_rate *trate)
645 struct ath_common *common = ath9k_hw_common(priv->ah);
649 WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, trate);
652 "Unable to initialize Rate information on target\n");
658 static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv,
659 struct ieee80211_sta *sta)
661 struct ath_common *common = ath9k_hw_common(priv->ah);
662 struct ath9k_htc_target_rate trate;
665 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
666 ath9k_htc_setup_rate(priv, sta, &trate);
667 ret = ath9k_htc_send_rate_cmd(priv, &trate);
669 ath_dbg(common, ATH_DBG_CONFIG,
670 "Updated target sta: %pM, rate caps: 0x%X\n",
671 sta->addr, be32_to_cpu(trate.capflags));
674 static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv,
675 struct ieee80211_vif *vif,
676 struct ieee80211_bss_conf *bss_conf)
678 struct ath_common *common = ath9k_hw_common(priv->ah);
679 struct ath9k_htc_target_rate trate;
680 struct ieee80211_sta *sta;
683 memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
686 sta = ieee80211_find_sta(vif, bss_conf->bssid);
691 ath9k_htc_setup_rate(priv, sta, &trate);
694 ret = ath9k_htc_send_rate_cmd(priv, &trate);
696 ath_dbg(common, ATH_DBG_CONFIG,
697 "Updated target sta: %pM, rate caps: 0x%X\n",
698 bss_conf->bssid, be32_to_cpu(trate.capflags));
701 static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
702 struct ieee80211_vif *vif,
703 struct ieee80211_sta *sta,
704 enum ieee80211_ampdu_mlme_action action,
707 struct ath_common *common = ath9k_hw_common(priv->ah);
708 struct ath9k_htc_target_aggr aggr;
709 struct ath9k_htc_sta *ista;
713 if (tid >= ATH9K_HTC_MAX_TID)
716 memset(&aggr, 0, sizeof(struct ath9k_htc_target_aggr));
717 ista = (struct ath9k_htc_sta *) sta->drv_priv;
719 aggr.sta_index = ista->index;
720 aggr.tidno = tid & 0xf;
721 aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false;
723 WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr);
725 ath_dbg(common, ATH_DBG_CONFIG,
726 "Unable to %s TX aggregation for (%pM, %d)\n",
727 (aggr.aggr_enable) ? "start" : "stop", sta->addr, tid);
729 ath_dbg(common, ATH_DBG_CONFIG,
730 "%s TX aggregation for (%pM, %d)\n",
731 (aggr.aggr_enable) ? "Starting" : "Stopping",
734 spin_lock_bh(&priv->tx.tx_lock);
735 ista->tid_state[tid] = (aggr.aggr_enable && !ret) ? AGGR_START : AGGR_STOP;
736 spin_unlock_bh(&priv->tx.tx_lock);
745 void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)
747 struct ath_common *common = ath9k_hw_common(priv->ah);
748 unsigned long timestamp = jiffies_to_msecs(jiffies);
750 common->ani.longcal_timer = timestamp;
751 common->ani.shortcal_timer = timestamp;
752 common->ani.checkani_timer = timestamp;
754 priv->op_flags |= OP_ANI_RUNNING;
756 ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
757 msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
760 void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv)
762 cancel_delayed_work_sync(&priv->ani_work);
763 priv->op_flags &= ~OP_ANI_RUNNING;
766 void ath9k_htc_ani_work(struct work_struct *work)
768 struct ath9k_htc_priv *priv =
769 container_of(work, struct ath9k_htc_priv, ani_work.work);
770 struct ath_hw *ah = priv->ah;
771 struct ath_common *common = ath9k_hw_common(ah);
772 bool longcal = false;
773 bool shortcal = false;
774 bool aniflag = false;
775 unsigned int timestamp = jiffies_to_msecs(jiffies);
776 u32 cal_interval, short_cal_interval;
778 short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
779 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
781 /* Only calibrate if awake */
782 if (ah->power_mode != ATH9K_PM_AWAKE)
785 /* Long calibration runs independently of short calibration. */
786 if ((timestamp - common->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
788 ath_dbg(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
789 common->ani.longcal_timer = timestamp;
792 /* Short calibration applies only while caldone is false */
793 if (!common->ani.caldone) {
794 if ((timestamp - common->ani.shortcal_timer) >=
795 short_cal_interval) {
797 ath_dbg(common, ATH_DBG_ANI,
798 "shortcal @%lu\n", jiffies);
799 common->ani.shortcal_timer = timestamp;
800 common->ani.resetcal_timer = timestamp;
803 if ((timestamp - common->ani.resetcal_timer) >=
804 ATH_RESTART_CALINTERVAL) {
805 common->ani.caldone = ath9k_hw_reset_calvalid(ah);
806 if (common->ani.caldone)
807 common->ani.resetcal_timer = timestamp;
811 /* Verify whether we must check ANI */
812 if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
814 common->ani.checkani_timer = timestamp;
817 /* Skip all processing if there's nothing to do. */
818 if (longcal || shortcal || aniflag) {
820 ath9k_htc_ps_wakeup(priv);
822 /* Call ANI routine if necessary */
824 ath9k_hw_ani_monitor(ah, ah->curchan);
826 /* Perform calibration if necessary */
827 if (longcal || shortcal)
828 common->ani.caldone =
829 ath9k_hw_calibrate(ah, ah->curchan,
830 common->rx_chainmask,
833 ath9k_htc_ps_restore(priv);
838 * Set timer interval based on previous results.
839 * The interval must be the shortest necessary to satisfy ANI,
840 * short calibration and long calibration.
842 cal_interval = ATH_LONG_CALINTERVAL;
843 if (priv->ah->config.enable_ani)
844 cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
845 if (!common->ani.caldone)
846 cal_interval = min(cal_interval, (u32)short_cal_interval);
848 ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
849 msecs_to_jiffies(cal_interval));
852 /**********************/
853 /* mac80211 Callbacks */
854 /**********************/
856 static void ath9k_htc_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
858 struct ieee80211_hdr *hdr;
859 struct ath9k_htc_priv *priv = hw->priv;
860 struct ath_common *common = ath9k_hw_common(priv->ah);
861 int padpos, padsize, ret, slot;
863 hdr = (struct ieee80211_hdr *) skb->data;
865 /* Add the padding after the header if this is not already done */
866 padpos = ath9k_cmn_padpos(hdr->frame_control);
867 padsize = padpos & 3;
868 if (padsize && skb->len > padpos) {
869 if (skb_headroom(skb) < padsize) {
870 ath_dbg(common, ATH_DBG_XMIT, "No room for padding\n");
873 skb_push(skb, padsize);
874 memmove(skb->data, skb->data + padsize, padpos);
877 slot = ath9k_htc_tx_get_slot(priv);
879 ath_dbg(common, ATH_DBG_XMIT, "No free TX slot\n");
883 ret = ath9k_htc_tx_start(priv, skb, slot, false);
885 ath_dbg(common, ATH_DBG_XMIT, "Tx failed\n");
889 ath9k_htc_check_stop_queues(priv);
894 ath9k_htc_tx_clear_slot(priv, slot);
896 dev_kfree_skb_any(skb);
899 static int ath9k_htc_start(struct ieee80211_hw *hw)
901 struct ath9k_htc_priv *priv = hw->priv;
902 struct ath_hw *ah = priv->ah;
903 struct ath_common *common = ath9k_hw_common(ah);
904 struct ieee80211_channel *curchan = hw->conf.channel;
905 struct ath9k_channel *init_channel;
907 enum htc_phymode mode;
911 mutex_lock(&priv->mutex);
913 ath_dbg(common, ATH_DBG_CONFIG,
914 "Starting driver with initial channel: %d MHz\n",
915 curchan->center_freq);
917 /* Ensure that HW is awake before flushing RX */
918 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
919 WMI_CMD(WMI_FLUSH_RECV_CMDID);
921 /* setup initial channel */
922 init_channel = ath9k_cmn_get_curchannel(hw, ah);
924 ath9k_hw_htc_resetinit(ah);
925 ret = ath9k_hw_reset(ah, init_channel, ah->caldata, false);
928 "Unable to reset hardware; reset status %d (freq %u MHz)\n",
929 ret, curchan->center_freq);
930 mutex_unlock(&priv->mutex);
934 ath9k_cmn_update_txpow(ah, priv->curtxpow, priv->txpowlimit,
937 mode = ath9k_htc_get_curmode(priv, init_channel);
938 htc_mode = cpu_to_be16(mode);
939 WMI_CMD_BUF(WMI_SET_MODE_CMDID, &htc_mode);
940 WMI_CMD(WMI_ATH_INIT_CMDID);
941 WMI_CMD(WMI_START_RECV_CMDID);
943 ath9k_host_rx_init(priv);
945 ret = ath9k_htc_update_cap_target(priv, 0);
947 ath_dbg(common, ATH_DBG_CONFIG,
948 "Failed to update capability in target\n");
950 priv->op_flags &= ~OP_INVALID;
951 htc_start(priv->htc);
953 spin_lock_bh(&priv->tx.tx_lock);
954 priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP;
955 spin_unlock_bh(&priv->tx.tx_lock);
957 ieee80211_wake_queues(hw);
959 mod_timer(&priv->tx.cleanup_timer,
960 jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
962 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) {
963 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
964 AR_STOMP_LOW_WLAN_WGHT);
965 ath9k_hw_btcoex_enable(ah);
966 ath_htc_resume_btcoex_work(priv);
968 mutex_unlock(&priv->mutex);
973 static void ath9k_htc_stop(struct ieee80211_hw *hw)
975 struct ath9k_htc_priv *priv = hw->priv;
976 struct ath_hw *ah = priv->ah;
977 struct ath_common *common = ath9k_hw_common(ah);
978 int ret __attribute__ ((unused));
981 mutex_lock(&priv->mutex);
983 if (priv->op_flags & OP_INVALID) {
984 ath_dbg(common, ATH_DBG_ANY, "Device not present\n");
985 mutex_unlock(&priv->mutex);
989 ath9k_htc_ps_wakeup(priv);
991 WMI_CMD(WMI_DISABLE_INTR_CMDID);
992 WMI_CMD(WMI_DRAIN_TXQ_ALL_CMDID);
993 WMI_CMD(WMI_STOP_RECV_CMDID);
995 tasklet_kill(&priv->rx_tasklet);
997 del_timer_sync(&priv->tx.cleanup_timer);
998 ath9k_htc_tx_drain(priv);
999 ath9k_wmi_event_drain(priv);
1001 mutex_unlock(&priv->mutex);
1003 /* Cancel all the running timers/work .. */
1004 cancel_work_sync(&priv->fatal_work);
1005 cancel_work_sync(&priv->ps_work);
1007 #ifdef CONFIG_MAC80211_LEDS
1008 cancel_work_sync(&priv->led_work);
1010 ath9k_htc_stop_ani(priv);
1012 mutex_lock(&priv->mutex);
1014 if (ah->btcoex_hw.enabled) {
1015 ath9k_hw_btcoex_disable(ah);
1016 if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
1017 ath_htc_cancel_btcoex_work(priv);
1020 /* Remove a monitor interface if it's present. */
1021 if (priv->ah->is_monitoring)
1022 ath9k_htc_remove_monitor_interface(priv);
1024 ath9k_hw_phy_disable(ah);
1025 ath9k_hw_disable(ah);
1026 ath9k_htc_ps_restore(priv);
1027 ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);
1029 priv->op_flags |= OP_INVALID;
1031 ath_dbg(common, ATH_DBG_CONFIG, "Driver halt\n");
1032 mutex_unlock(&priv->mutex);
1035 static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
1036 struct ieee80211_vif *vif)
1038 struct ath9k_htc_priv *priv = hw->priv;
1039 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1040 struct ath_common *common = ath9k_hw_common(priv->ah);
1041 struct ath9k_htc_target_vif hvif;
1045 mutex_lock(&priv->mutex);
1047 if (priv->nvifs >= ATH9K_HTC_MAX_VIF) {
1048 mutex_unlock(&priv->mutex);
1052 if (priv->num_ibss_vif ||
1053 (priv->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) {
1054 ath_err(common, "IBSS coexistence with other modes is not allowed\n");
1055 mutex_unlock(&priv->mutex);
1059 if (((vif->type == NL80211_IFTYPE_AP) ||
1060 (vif->type == NL80211_IFTYPE_ADHOC)) &&
1061 ((priv->num_ap_vif + priv->num_ibss_vif) >= ATH9K_HTC_MAX_BCN_VIF)) {
1062 ath_err(common, "Max. number of beaconing interfaces reached\n");
1063 mutex_unlock(&priv->mutex);
1067 ath9k_htc_ps_wakeup(priv);
1068 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1069 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1071 switch (vif->type) {
1072 case NL80211_IFTYPE_STATION:
1073 hvif.opmode = HTC_M_STA;
1075 case NL80211_IFTYPE_ADHOC:
1076 hvif.opmode = HTC_M_IBSS;
1078 case NL80211_IFTYPE_AP:
1079 hvif.opmode = HTC_M_HOSTAP;
1083 "Interface type %d not yet supported\n", vif->type);
1088 /* Index starts from zero on the target */
1089 avp->index = hvif.index = ffz(priv->vif_slot);
1090 hvif.rtsthreshold = cpu_to_be16(2304);
1091 WMI_CMD_BUF(WMI_VAP_CREATE_CMDID, &hvif);
1096 * We need a node in target to tx mgmt frames
1097 * before association.
1099 ret = ath9k_htc_add_station(priv, vif, NULL);
1101 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1105 ath9k_htc_set_bssid_mask(priv, vif);
1107 priv->vif_slot |= (1 << avp->index);
1110 INC_VIF(priv, vif->type);
1112 if ((vif->type == NL80211_IFTYPE_AP) ||
1113 (vif->type == NL80211_IFTYPE_ADHOC))
1114 ath9k_htc_assign_bslot(priv, vif);
1116 ath9k_htc_set_opmode(priv);
1118 if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1119 !(priv->op_flags & OP_ANI_RUNNING)) {
1120 ath9k_hw_set_tsfadjust(priv->ah, 1);
1121 ath9k_htc_start_ani(priv);
1124 ath_dbg(common, ATH_DBG_CONFIG,
1125 "Attach a VIF of type: %d at idx: %d\n", vif->type, avp->index);
1128 ath9k_htc_ps_restore(priv);
1129 mutex_unlock(&priv->mutex);
1134 static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,
1135 struct ieee80211_vif *vif)
1137 struct ath9k_htc_priv *priv = hw->priv;
1138 struct ath_common *common = ath9k_hw_common(priv->ah);
1139 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1140 struct ath9k_htc_target_vif hvif;
1144 mutex_lock(&priv->mutex);
1145 ath9k_htc_ps_wakeup(priv);
1147 memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
1148 memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
1149 hvif.index = avp->index;
1150 WMI_CMD_BUF(WMI_VAP_REMOVE_CMDID, &hvif);
1152 ath_err(common, "Unable to remove interface at idx: %d\n",
1156 priv->vif_slot &= ~(1 << avp->index);
1158 ath9k_htc_remove_station(priv, vif, NULL);
1160 DEC_VIF(priv, vif->type);
1162 if ((vif->type == NL80211_IFTYPE_AP) ||
1163 (vif->type == NL80211_IFTYPE_ADHOC))
1164 ath9k_htc_remove_bslot(priv, vif);
1166 ath9k_htc_set_opmode(priv);
1169 * Stop ANI only if there are no associated station interfaces.
1171 if ((vif->type == NL80211_IFTYPE_AP) && (priv->num_ap_vif == 0)) {
1172 priv->rearm_ani = false;
1173 ieee80211_iterate_active_interfaces_atomic(priv->hw,
1174 ath9k_htc_vif_iter, priv);
1175 if (!priv->rearm_ani)
1176 ath9k_htc_stop_ani(priv);
1179 ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface at idx: %d\n", avp->index);
1181 ath9k_htc_ps_restore(priv);
1182 mutex_unlock(&priv->mutex);
1185 static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
1187 struct ath9k_htc_priv *priv = hw->priv;
1188 struct ath_common *common = ath9k_hw_common(priv->ah);
1189 struct ieee80211_conf *conf = &hw->conf;
1191 mutex_lock(&priv->mutex);
1193 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1194 bool enable_radio = false;
1195 bool idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1197 mutex_lock(&priv->htc_pm_lock);
1198 if (!idle && priv->ps_idle)
1199 enable_radio = true;
1200 priv->ps_idle = idle;
1201 mutex_unlock(&priv->htc_pm_lock);
1204 ath_dbg(common, ATH_DBG_CONFIG,
1205 "not-idle: enabling radio\n");
1206 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1207 ath9k_htc_radio_enable(hw);
1212 * Monitor interface should be added before
1213 * IEEE80211_CONF_CHANGE_CHANNEL is handled.
1215 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1216 if ((conf->flags & IEEE80211_CONF_MONITOR) &&
1217 !priv->ah->is_monitoring)
1218 ath9k_htc_add_monitor_interface(priv);
1219 else if (priv->ah->is_monitoring)
1220 ath9k_htc_remove_monitor_interface(priv);
1223 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
1224 struct ieee80211_channel *curchan = hw->conf.channel;
1225 int pos = curchan->hw_value;
1227 ath_dbg(common, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
1228 curchan->center_freq);
1230 ath9k_cmn_update_ichannel(&priv->ah->channels[pos],
1232 hw->conf.channel_type);
1234 if (ath9k_htc_set_channel(priv, hw, &priv->ah->channels[pos]) < 0) {
1235 ath_err(common, "Unable to set channel\n");
1236 mutex_unlock(&priv->mutex);
1242 if (changed & IEEE80211_CONF_CHANGE_PS) {
1243 if (conf->flags & IEEE80211_CONF_PS) {
1244 ath9k_htc_setpower(priv, ATH9K_PM_NETWORK_SLEEP);
1245 priv->ps_enabled = true;
1247 priv->ps_enabled = false;
1248 cancel_work_sync(&priv->ps_work);
1249 ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
1253 if (changed & IEEE80211_CONF_CHANGE_POWER) {
1254 priv->txpowlimit = 2 * conf->power_level;
1255 ath9k_cmn_update_txpow(priv->ah, priv->curtxpow,
1256 priv->txpowlimit, &priv->curtxpow);
1259 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1260 mutex_lock(&priv->htc_pm_lock);
1261 if (!priv->ps_idle) {
1262 mutex_unlock(&priv->htc_pm_lock);
1265 mutex_unlock(&priv->htc_pm_lock);
1267 ath_dbg(common, ATH_DBG_CONFIG,
1268 "idle: disabling radio\n");
1269 ath9k_htc_radio_disable(hw);
1273 mutex_unlock(&priv->mutex);
1277 #define SUPPORTED_FILTERS \
1278 (FIF_PROMISC_IN_BSS | \
1283 FIF_BCN_PRBRESP_PROMISC | \
1287 static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
1288 unsigned int changed_flags,
1289 unsigned int *total_flags,
1292 struct ath9k_htc_priv *priv = hw->priv;
1295 mutex_lock(&priv->mutex);
1296 ath9k_htc_ps_wakeup(priv);
1298 changed_flags &= SUPPORTED_FILTERS;
1299 *total_flags &= SUPPORTED_FILTERS;
1301 priv->rxfilter = *total_flags;
1302 rfilt = ath9k_htc_calcrxfilter(priv);
1303 ath9k_hw_setrxfilter(priv->ah, rfilt);
1305 ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_CONFIG,
1306 "Set HW RX filter: 0x%x\n", rfilt);
1308 ath9k_htc_ps_restore(priv);
1309 mutex_unlock(&priv->mutex);
1312 static int ath9k_htc_sta_add(struct ieee80211_hw *hw,
1313 struct ieee80211_vif *vif,
1314 struct ieee80211_sta *sta)
1316 struct ath9k_htc_priv *priv = hw->priv;
1319 mutex_lock(&priv->mutex);
1320 ath9k_htc_ps_wakeup(priv);
1321 ret = ath9k_htc_add_station(priv, vif, sta);
1323 ath9k_htc_init_rate(priv, sta);
1324 ath9k_htc_ps_restore(priv);
1325 mutex_unlock(&priv->mutex);
1330 static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
1331 struct ieee80211_vif *vif,
1332 struct ieee80211_sta *sta)
1334 struct ath9k_htc_priv *priv = hw->priv;
1335 struct ath9k_htc_sta *ista;
1338 mutex_lock(&priv->mutex);
1339 ath9k_htc_ps_wakeup(priv);
1340 ista = (struct ath9k_htc_sta *) sta->drv_priv;
1341 htc_sta_drain(priv->htc, ista->index);
1342 ret = ath9k_htc_remove_station(priv, vif, sta);
1343 ath9k_htc_ps_restore(priv);
1344 mutex_unlock(&priv->mutex);
1349 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw, u16 queue,
1350 const struct ieee80211_tx_queue_params *params)
1352 struct ath9k_htc_priv *priv = hw->priv;
1353 struct ath_common *common = ath9k_hw_common(priv->ah);
1354 struct ath9k_tx_queue_info qi;
1357 if (queue >= WME_NUM_AC)
1360 mutex_lock(&priv->mutex);
1361 ath9k_htc_ps_wakeup(priv);
1363 memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
1365 qi.tqi_aifs = params->aifs;
1366 qi.tqi_cwmin = params->cw_min;
1367 qi.tqi_cwmax = params->cw_max;
1368 qi.tqi_burstTime = params->txop;
1370 qnum = get_hw_qnum(queue, priv->hwq_map);
1372 ath_dbg(common, ATH_DBG_CONFIG,
1373 "Configure tx [queue/hwq] [%d/%d], aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
1374 queue, qnum, params->aifs, params->cw_min,
1375 params->cw_max, params->txop);
1377 ret = ath_htc_txq_update(priv, qnum, &qi);
1379 ath_err(common, "TXQ Update failed\n");
1383 if ((priv->ah->opmode == NL80211_IFTYPE_ADHOC) &&
1384 (qnum == priv->hwq_map[WME_AC_BE]))
1385 ath9k_htc_beaconq_config(priv);
1387 ath9k_htc_ps_restore(priv);
1388 mutex_unlock(&priv->mutex);
1393 static int ath9k_htc_set_key(struct ieee80211_hw *hw,
1394 enum set_key_cmd cmd,
1395 struct ieee80211_vif *vif,
1396 struct ieee80211_sta *sta,
1397 struct ieee80211_key_conf *key)
1399 struct ath9k_htc_priv *priv = hw->priv;
1400 struct ath_common *common = ath9k_hw_common(priv->ah);
1403 if (htc_modparam_nohwcrypt)
1406 mutex_lock(&priv->mutex);
1407 ath_dbg(common, ATH_DBG_CONFIG, "Set HW Key\n");
1408 ath9k_htc_ps_wakeup(priv);
1412 ret = ath_key_config(common, vif, sta, key);
1414 key->hw_key_idx = ret;
1415 /* push IV and Michael MIC generation to stack */
1416 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1417 if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
1418 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1419 if (priv->ah->sw_mgmt_crypto &&
1420 key->cipher == WLAN_CIPHER_SUITE_CCMP)
1421 key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
1426 ath_key_delete(common, key);
1432 ath9k_htc_ps_restore(priv);
1433 mutex_unlock(&priv->mutex);
1438 static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
1439 struct ieee80211_vif *vif,
1440 struct ieee80211_bss_conf *bss_conf,
1443 struct ath9k_htc_priv *priv = hw->priv;
1444 struct ath_hw *ah = priv->ah;
1445 struct ath_common *common = ath9k_hw_common(ah);
1448 mutex_lock(&priv->mutex);
1449 ath9k_htc_ps_wakeup(priv);
1452 * Set the HW AID/BSSID only for the first station interface
1455 set_assoc = !!((priv->ah->opmode == NL80211_IFTYPE_ADHOC) ||
1456 ((priv->ah->opmode == NL80211_IFTYPE_STATION) &&
1457 (priv->num_sta_vif == 1)));
1460 if (changed & BSS_CHANGED_ASSOC) {
1462 ath_dbg(common, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
1465 common->curaid = bss_conf->assoc ?
1468 if (bss_conf->assoc)
1469 ath9k_htc_start_ani(priv);
1471 ath9k_htc_stop_ani(priv);
1475 if (changed & BSS_CHANGED_BSSID) {
1477 memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
1478 ath9k_hw_write_associd(ah);
1480 ath_dbg(common, ATH_DBG_CONFIG,
1481 "BSSID: %pM aid: 0x%x\n",
1482 common->curbssid, common->curaid);
1486 if ((changed & BSS_CHANGED_BEACON_ENABLED) && bss_conf->enable_beacon) {
1487 ath_dbg(common, ATH_DBG_CONFIG,
1488 "Beacon enabled for BSS: %pM\n", bss_conf->bssid);
1489 ath9k_htc_set_tsfadjust(priv, vif);
1490 priv->op_flags |= OP_ENABLE_BEACON;
1491 ath9k_htc_beacon_config(priv, vif);
1494 if ((changed & BSS_CHANGED_BEACON_ENABLED) && !bss_conf->enable_beacon) {
1496 * Disable SWBA interrupt only if there are no
1497 * AP/IBSS interfaces.
1499 if ((priv->num_ap_vif <= 1) || priv->num_ibss_vif) {
1500 ath_dbg(common, ATH_DBG_CONFIG,
1501 "Beacon disabled for BSS: %pM\n",
1503 priv->op_flags &= ~OP_ENABLE_BEACON;
1504 ath9k_htc_beacon_config(priv, vif);
1508 if (changed & BSS_CHANGED_BEACON_INT) {
1510 * Reset the HW TSF for the first AP interface.
1512 if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
1513 (priv->nvifs == 1) &&
1514 (priv->num_ap_vif == 1) &&
1515 (vif->type == NL80211_IFTYPE_AP)) {
1516 priv->op_flags |= OP_TSF_RESET;
1518 ath_dbg(common, ATH_DBG_CONFIG,
1519 "Beacon interval changed for BSS: %pM\n",
1521 ath9k_htc_beacon_config(priv, vif);
1524 if (changed & BSS_CHANGED_ERP_SLOT) {
1525 if (bss_conf->use_short_slot)
1530 ath9k_hw_init_global_settings(ah);
1533 if (changed & BSS_CHANGED_HT)
1534 ath9k_htc_update_rate(priv, vif, bss_conf);
1536 ath9k_htc_ps_restore(priv);
1537 mutex_unlock(&priv->mutex);
1540 static u64 ath9k_htc_get_tsf(struct ieee80211_hw *hw)
1542 struct ath9k_htc_priv *priv = hw->priv;
1545 mutex_lock(&priv->mutex);
1546 ath9k_htc_ps_wakeup(priv);
1547 tsf = ath9k_hw_gettsf64(priv->ah);
1548 ath9k_htc_ps_restore(priv);
1549 mutex_unlock(&priv->mutex);
1554 static void ath9k_htc_set_tsf(struct ieee80211_hw *hw, u64 tsf)
1556 struct ath9k_htc_priv *priv = hw->priv;
1558 mutex_lock(&priv->mutex);
1559 ath9k_htc_ps_wakeup(priv);
1560 ath9k_hw_settsf64(priv->ah, tsf);
1561 ath9k_htc_ps_restore(priv);
1562 mutex_unlock(&priv->mutex);
1565 static void ath9k_htc_reset_tsf(struct ieee80211_hw *hw)
1567 struct ath9k_htc_priv *priv = hw->priv;
1569 mutex_lock(&priv->mutex);
1570 ath9k_htc_ps_wakeup(priv);
1571 ath9k_hw_reset_tsf(priv->ah);
1572 ath9k_htc_ps_restore(priv);
1573 mutex_unlock(&priv->mutex);
1576 static int ath9k_htc_ampdu_action(struct ieee80211_hw *hw,
1577 struct ieee80211_vif *vif,
1578 enum ieee80211_ampdu_mlme_action action,
1579 struct ieee80211_sta *sta,
1580 u16 tid, u16 *ssn, u8 buf_size)
1582 struct ath9k_htc_priv *priv = hw->priv;
1583 struct ath9k_htc_sta *ista;
1586 mutex_lock(&priv->mutex);
1587 ath9k_htc_ps_wakeup(priv);
1590 case IEEE80211_AMPDU_RX_START:
1592 case IEEE80211_AMPDU_RX_STOP:
1594 case IEEE80211_AMPDU_TX_START:
1595 ret = ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1597 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1599 case IEEE80211_AMPDU_TX_STOP:
1600 ath9k_htc_tx_aggr_oper(priv, vif, sta, action, tid);
1601 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1603 case IEEE80211_AMPDU_TX_OPERATIONAL:
1604 ista = (struct ath9k_htc_sta *) sta->drv_priv;
1605 spin_lock_bh(&priv->tx.tx_lock);
1606 ista->tid_state[tid] = AGGR_OPERATIONAL;
1607 spin_unlock_bh(&priv->tx.tx_lock);
1610 ath_err(ath9k_hw_common(priv->ah), "Unknown AMPDU action\n");
1613 ath9k_htc_ps_restore(priv);
1614 mutex_unlock(&priv->mutex);
1619 static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)
1621 struct ath9k_htc_priv *priv = hw->priv;
1623 mutex_lock(&priv->mutex);
1624 spin_lock_bh(&priv->beacon_lock);
1625 priv->op_flags |= OP_SCANNING;
1626 spin_unlock_bh(&priv->beacon_lock);
1627 cancel_work_sync(&priv->ps_work);
1628 ath9k_htc_stop_ani(priv);
1629 mutex_unlock(&priv->mutex);
1632 static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
1634 struct ath9k_htc_priv *priv = hw->priv;
1636 mutex_lock(&priv->mutex);
1637 spin_lock_bh(&priv->beacon_lock);
1638 priv->op_flags &= ~OP_SCANNING;
1639 spin_unlock_bh(&priv->beacon_lock);
1640 ath9k_htc_ps_wakeup(priv);
1641 ath9k_htc_vif_reconfig(priv);
1642 ath9k_htc_ps_restore(priv);
1643 mutex_unlock(&priv->mutex);
1646 static int ath9k_htc_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1651 static void ath9k_htc_set_coverage_class(struct ieee80211_hw *hw,
1654 struct ath9k_htc_priv *priv = hw->priv;
1656 mutex_lock(&priv->mutex);
1657 ath9k_htc_ps_wakeup(priv);
1658 priv->ah->coverage_class = coverage_class;
1659 ath9k_hw_init_global_settings(priv->ah);
1660 ath9k_htc_ps_restore(priv);
1661 mutex_unlock(&priv->mutex);
1665 * Currently, this is used only for selecting the minimum rate
1666 * for management frames, rate selection for data frames remain
1669 static int ath9k_htc_set_bitrate_mask(struct ieee80211_hw *hw,
1670 struct ieee80211_vif *vif,
1671 const struct cfg80211_bitrate_mask *mask)
1673 struct ath9k_htc_priv *priv = hw->priv;
1674 struct ath_common *common = ath9k_hw_common(priv->ah);
1675 struct ath9k_htc_target_rate_mask tmask;
1676 struct ath9k_htc_vif *avp = (void *)vif->drv_priv;
1680 memset(&tmask, 0, sizeof(struct ath9k_htc_target_rate_mask));
1682 tmask.vif_index = avp->index;
1683 tmask.band = IEEE80211_BAND_2GHZ;
1684 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_2GHZ].legacy);
1686 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask);
1689 "Unable to set 2G rate mask for "
1690 "interface at idx: %d\n", avp->index);
1694 tmask.band = IEEE80211_BAND_5GHZ;
1695 tmask.mask = cpu_to_be32(mask->control[IEEE80211_BAND_5GHZ].legacy);
1697 WMI_CMD_BUF(WMI_BITRATE_MASK_CMDID, &tmask);
1700 "Unable to set 5G rate mask for "
1701 "interface at idx: %d\n", avp->index);
1705 ath_dbg(common, ATH_DBG_CONFIG,
1706 "Set bitrate masks: 0x%x, 0x%x\n",
1707 mask->control[IEEE80211_BAND_2GHZ].legacy,
1708 mask->control[IEEE80211_BAND_5GHZ].legacy);
1713 struct ieee80211_ops ath9k_htc_ops = {
1715 .start = ath9k_htc_start,
1716 .stop = ath9k_htc_stop,
1717 .add_interface = ath9k_htc_add_interface,
1718 .remove_interface = ath9k_htc_remove_interface,
1719 .config = ath9k_htc_config,
1720 .configure_filter = ath9k_htc_configure_filter,
1721 .sta_add = ath9k_htc_sta_add,
1722 .sta_remove = ath9k_htc_sta_remove,
1723 .conf_tx = ath9k_htc_conf_tx,
1724 .bss_info_changed = ath9k_htc_bss_info_changed,
1725 .set_key = ath9k_htc_set_key,
1726 .get_tsf = ath9k_htc_get_tsf,
1727 .set_tsf = ath9k_htc_set_tsf,
1728 .reset_tsf = ath9k_htc_reset_tsf,
1729 .ampdu_action = ath9k_htc_ampdu_action,
1730 .sw_scan_start = ath9k_htc_sw_scan_start,
1731 .sw_scan_complete = ath9k_htc_sw_scan_complete,
1732 .set_rts_threshold = ath9k_htc_set_rts_threshold,
1733 .rfkill_poll = ath9k_htc_rfkill_poll_state,
1734 .set_coverage_class = ath9k_htc_set_coverage_class,
1735 .set_bitrate_mask = ath9k_htc_set_bitrate_mask,