2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include <net/mac80211.h>
21 #include <linux/etherdevice.h>
37 static int ath10k_send_key(struct ath10k_vif
*arvif
,
38 struct ieee80211_key_conf
*key
,
40 const u8
*macaddr
, bool def_idx
)
42 struct ath10k
*ar
= arvif
->ar
;
43 struct wmi_vdev_install_key_arg arg
= {
44 .vdev_id
= arvif
->vdev_id
,
45 .key_idx
= key
->keyidx
,
46 .key_len
= key
->keylen
,
51 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
53 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
54 arg
.key_flags
= WMI_KEY_PAIRWISE
;
56 arg
.key_flags
= WMI_KEY_GROUP
;
58 switch (key
->cipher
) {
59 case WLAN_CIPHER_SUITE_CCMP
:
60 arg
.key_cipher
= WMI_CIPHER_AES_CCM
;
61 key
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT
;
63 case WLAN_CIPHER_SUITE_TKIP
:
64 arg
.key_cipher
= WMI_CIPHER_TKIP
;
65 arg
.key_txmic_len
= 8;
66 arg
.key_rxmic_len
= 8;
68 case WLAN_CIPHER_SUITE_WEP40
:
69 case WLAN_CIPHER_SUITE_WEP104
:
70 arg
.key_cipher
= WMI_CIPHER_WEP
;
71 /* AP/IBSS mode requires self-key to be groupwise
72 * Otherwise pairwise key must be set */
73 if (memcmp(macaddr
, arvif
->vif
->addr
, ETH_ALEN
))
74 arg
.key_flags
= WMI_KEY_PAIRWISE
;
77 arg
.key_flags
|= WMI_KEY_TX_USAGE
;
80 ath10k_warn(ar
, "cipher %d is not supported\n", key
->cipher
);
84 if (cmd
== DISABLE_KEY
) {
85 arg
.key_cipher
= WMI_CIPHER_NONE
;
89 return ath10k_wmi_vdev_install_key(arvif
->ar
, &arg
);
92 static int ath10k_install_key(struct ath10k_vif
*arvif
,
93 struct ieee80211_key_conf
*key
,
95 const u8
*macaddr
, bool def_idx
)
97 struct ath10k
*ar
= arvif
->ar
;
100 lockdep_assert_held(&ar
->conf_mutex
);
102 reinit_completion(&ar
->install_key_done
);
104 ret
= ath10k_send_key(arvif
, key
, cmd
, macaddr
, def_idx
);
108 ret
= wait_for_completion_timeout(&ar
->install_key_done
, 3*HZ
);
115 static int ath10k_install_peer_wep_keys(struct ath10k_vif
*arvif
,
118 struct ath10k
*ar
= arvif
->ar
;
119 struct ath10k_peer
*peer
;
124 lockdep_assert_held(&ar
->conf_mutex
);
126 spin_lock_bh(&ar
->data_lock
);
127 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
128 spin_unlock_bh(&ar
->data_lock
);
133 for (i
= 0; i
< ARRAY_SIZE(arvif
->wep_keys
); i
++) {
134 if (arvif
->wep_keys
[i
] == NULL
)
136 /* set TX_USAGE flag for default key id */
137 if (arvif
->def_wep_key_idx
== i
)
142 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
], SET_KEY
,
147 spin_lock_bh(&ar
->data_lock
);
148 peer
->keys
[i
] = arvif
->wep_keys
[i
];
149 spin_unlock_bh(&ar
->data_lock
);
155 static int ath10k_clear_peer_keys(struct ath10k_vif
*arvif
,
158 struct ath10k
*ar
= arvif
->ar
;
159 struct ath10k_peer
*peer
;
164 lockdep_assert_held(&ar
->conf_mutex
);
166 spin_lock_bh(&ar
->data_lock
);
167 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
168 spin_unlock_bh(&ar
->data_lock
);
173 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
174 if (peer
->keys
[i
] == NULL
)
177 /* key flags are not required to delete the key */
178 ret
= ath10k_install_key(arvif
, peer
->keys
[i
],
179 DISABLE_KEY
, addr
, false);
180 if (ret
&& first_errno
== 0)
184 ath10k_warn(ar
, "failed to remove peer wep key %d: %d\n",
187 spin_lock_bh(&ar
->data_lock
);
188 peer
->keys
[i
] = NULL
;
189 spin_unlock_bh(&ar
->data_lock
);
195 bool ath10k_mac_is_peer_wep_key_set(struct ath10k
*ar
, const u8
*addr
,
198 struct ath10k_peer
*peer
;
201 lockdep_assert_held(&ar
->data_lock
);
203 /* We don't know which vdev this peer belongs to,
204 * since WMI doesn't give us that information.
206 * FIXME: multi-bss needs to be handled.
208 peer
= ath10k_peer_find(ar
, 0, addr
);
212 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
213 if (peer
->keys
[i
] && peer
->keys
[i
]->keyidx
== keyidx
)
220 static int ath10k_clear_vdev_key(struct ath10k_vif
*arvif
,
221 struct ieee80211_key_conf
*key
)
223 struct ath10k
*ar
= arvif
->ar
;
224 struct ath10k_peer
*peer
;
230 lockdep_assert_held(&ar
->conf_mutex
);
233 /* since ath10k_install_key we can't hold data_lock all the
234 * time, so we try to remove the keys incrementally */
235 spin_lock_bh(&ar
->data_lock
);
237 list_for_each_entry(peer
, &ar
->peers
, list
) {
238 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
239 if (peer
->keys
[i
] == key
) {
240 ether_addr_copy(addr
, peer
->addr
);
241 peer
->keys
[i
] = NULL
;
246 if (i
< ARRAY_SIZE(peer
->keys
))
249 spin_unlock_bh(&ar
->data_lock
);
251 if (i
== ARRAY_SIZE(peer
->keys
))
253 /* key flags are not required to delete the key */
254 ret
= ath10k_install_key(arvif
, key
, DISABLE_KEY
, addr
, false);
255 if (ret
&& first_errno
== 0)
259 ath10k_warn(ar
, "failed to remove key for %pM: %d\n",
266 /*********************/
267 /* General utilities */
268 /*********************/
270 static inline enum wmi_phy_mode
271 chan_to_phymode(const struct cfg80211_chan_def
*chandef
)
273 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
275 switch (chandef
->chan
->band
) {
276 case IEEE80211_BAND_2GHZ
:
277 switch (chandef
->width
) {
278 case NL80211_CHAN_WIDTH_20_NOHT
:
279 if (chandef
->chan
->flags
& IEEE80211_CHAN_NO_OFDM
)
284 case NL80211_CHAN_WIDTH_20
:
285 phymode
= MODE_11NG_HT20
;
287 case NL80211_CHAN_WIDTH_40
:
288 phymode
= MODE_11NG_HT40
;
290 case NL80211_CHAN_WIDTH_5
:
291 case NL80211_CHAN_WIDTH_10
:
292 case NL80211_CHAN_WIDTH_80
:
293 case NL80211_CHAN_WIDTH_80P80
:
294 case NL80211_CHAN_WIDTH_160
:
295 phymode
= MODE_UNKNOWN
;
299 case IEEE80211_BAND_5GHZ
:
300 switch (chandef
->width
) {
301 case NL80211_CHAN_WIDTH_20_NOHT
:
304 case NL80211_CHAN_WIDTH_20
:
305 phymode
= MODE_11NA_HT20
;
307 case NL80211_CHAN_WIDTH_40
:
308 phymode
= MODE_11NA_HT40
;
310 case NL80211_CHAN_WIDTH_80
:
311 phymode
= MODE_11AC_VHT80
;
313 case NL80211_CHAN_WIDTH_5
:
314 case NL80211_CHAN_WIDTH_10
:
315 case NL80211_CHAN_WIDTH_80P80
:
316 case NL80211_CHAN_WIDTH_160
:
317 phymode
= MODE_UNKNOWN
;
325 WARN_ON(phymode
== MODE_UNKNOWN
);
329 static u8
ath10k_parse_mpdudensity(u8 mpdudensity
)
332 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
333 * 0 for no restriction
342 switch (mpdudensity
) {
348 /* Our lower layer calculations limit our precision to
364 static int ath10k_peer_create(struct ath10k
*ar
, u32 vdev_id
, const u8
*addr
)
368 lockdep_assert_held(&ar
->conf_mutex
);
370 if (ar
->num_peers
>= ar
->max_num_peers
)
373 ret
= ath10k_wmi_peer_create(ar
, vdev_id
, addr
);
375 ath10k_warn(ar
, "failed to create wmi peer %pM on vdev %i: %i\n",
380 ret
= ath10k_wait_for_peer_created(ar
, vdev_id
, addr
);
382 ath10k_warn(ar
, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
392 static int ath10k_mac_set_kickout(struct ath10k_vif
*arvif
)
394 struct ath10k
*ar
= arvif
->ar
;
398 param
= ar
->wmi
.pdev_param
->sta_kickout_th
;
399 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
400 ATH10K_KICKOUT_THRESHOLD
);
402 ath10k_warn(ar
, "failed to set kickout threshold on vdev %i: %d\n",
403 arvif
->vdev_id
, ret
);
407 param
= ar
->wmi
.vdev_param
->ap_keepalive_min_idle_inactive_time_secs
;
408 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
409 ATH10K_KEEPALIVE_MIN_IDLE
);
411 ath10k_warn(ar
, "failed to set keepalive minimum idle time on vdev %i: %d\n",
412 arvif
->vdev_id
, ret
);
416 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_idle_inactive_time_secs
;
417 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
418 ATH10K_KEEPALIVE_MAX_IDLE
);
420 ath10k_warn(ar
, "failed to set keepalive maximum idle time on vdev %i: %d\n",
421 arvif
->vdev_id
, ret
);
425 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_unresponsive_time_secs
;
426 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
427 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE
);
429 ath10k_warn(ar
, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
430 arvif
->vdev_id
, ret
);
437 static int ath10k_mac_set_rts(struct ath10k_vif
*arvif
, u32 value
)
439 struct ath10k
*ar
= arvif
->ar
;
442 vdev_param
= ar
->wmi
.vdev_param
->rts_threshold
;
443 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, value
);
446 static int ath10k_mac_set_frag(struct ath10k_vif
*arvif
, u32 value
)
448 struct ath10k
*ar
= arvif
->ar
;
451 if (value
!= 0xFFFFFFFF)
452 value
= clamp_t(u32
, arvif
->ar
->hw
->wiphy
->frag_threshold
,
453 ATH10K_FRAGMT_THRESHOLD_MIN
,
454 ATH10K_FRAGMT_THRESHOLD_MAX
);
456 vdev_param
= ar
->wmi
.vdev_param
->fragmentation_threshold
;
457 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, value
);
460 static int ath10k_peer_delete(struct ath10k
*ar
, u32 vdev_id
, const u8
*addr
)
464 lockdep_assert_held(&ar
->conf_mutex
);
466 ret
= ath10k_wmi_peer_delete(ar
, vdev_id
, addr
);
470 ret
= ath10k_wait_for_peer_deleted(ar
, vdev_id
, addr
);
479 static void ath10k_peer_cleanup(struct ath10k
*ar
, u32 vdev_id
)
481 struct ath10k_peer
*peer
, *tmp
;
483 lockdep_assert_held(&ar
->conf_mutex
);
485 spin_lock_bh(&ar
->data_lock
);
486 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
487 if (peer
->vdev_id
!= vdev_id
)
490 ath10k_warn(ar
, "removing stale peer %pM from vdev_id %d\n",
491 peer
->addr
, vdev_id
);
493 list_del(&peer
->list
);
497 spin_unlock_bh(&ar
->data_lock
);
500 static void ath10k_peer_cleanup_all(struct ath10k
*ar
)
502 struct ath10k_peer
*peer
, *tmp
;
504 lockdep_assert_held(&ar
->conf_mutex
);
506 spin_lock_bh(&ar
->data_lock
);
507 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
508 list_del(&peer
->list
);
511 spin_unlock_bh(&ar
->data_lock
);
514 ar
->num_stations
= 0;
517 /************************/
518 /* Interface management */
519 /************************/
521 void ath10k_mac_vif_beacon_free(struct ath10k_vif
*arvif
)
523 struct ath10k
*ar
= arvif
->ar
;
525 lockdep_assert_held(&ar
->data_lock
);
530 if (!arvif
->beacon_buf
)
531 dma_unmap_single(ar
->dev
, ATH10K_SKB_CB(arvif
->beacon
)->paddr
,
532 arvif
->beacon
->len
, DMA_TO_DEVICE
);
534 if (WARN_ON(arvif
->beacon_state
!= ATH10K_BEACON_SCHEDULED
&&
535 arvif
->beacon_state
!= ATH10K_BEACON_SENT
))
538 dev_kfree_skb_any(arvif
->beacon
);
540 arvif
->beacon
= NULL
;
541 arvif
->beacon_state
= ATH10K_BEACON_SCHEDULED
;
544 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif
*arvif
)
546 struct ath10k
*ar
= arvif
->ar
;
548 lockdep_assert_held(&ar
->data_lock
);
550 ath10k_mac_vif_beacon_free(arvif
);
552 if (arvif
->beacon_buf
) {
553 dma_free_coherent(ar
->dev
, IEEE80211_MAX_FRAME_LEN
,
554 arvif
->beacon_buf
, arvif
->beacon_paddr
);
555 arvif
->beacon_buf
= NULL
;
559 static inline int ath10k_vdev_setup_sync(struct ath10k
*ar
)
563 lockdep_assert_held(&ar
->conf_mutex
);
565 if (test_bit(ATH10K_FLAG_CRASH_FLUSH
, &ar
->dev_flags
))
568 ret
= wait_for_completion_timeout(&ar
->vdev_setup_done
,
569 ATH10K_VDEV_SETUP_TIMEOUT_HZ
);
576 static int ath10k_monitor_vdev_start(struct ath10k
*ar
, int vdev_id
)
578 struct cfg80211_chan_def
*chandef
= &ar
->chandef
;
579 struct ieee80211_channel
*channel
= chandef
->chan
;
580 struct wmi_vdev_start_request_arg arg
= {};
583 lockdep_assert_held(&ar
->conf_mutex
);
585 arg
.vdev_id
= vdev_id
;
586 arg
.channel
.freq
= channel
->center_freq
;
587 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
589 /* TODO setup this dynamically, what in case we
590 don't have any vifs? */
591 arg
.channel
.mode
= chan_to_phymode(chandef
);
592 arg
.channel
.chan_radar
=
593 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
595 arg
.channel
.min_power
= 0;
596 arg
.channel
.max_power
= channel
->max_power
* 2;
597 arg
.channel
.max_reg_power
= channel
->max_reg_power
* 2;
598 arg
.channel
.max_antenna_gain
= channel
->max_antenna_gain
* 2;
600 reinit_completion(&ar
->vdev_setup_done
);
602 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
604 ath10k_warn(ar
, "failed to request monitor vdev %i start: %d\n",
609 ret
= ath10k_vdev_setup_sync(ar
);
611 ath10k_warn(ar
, "failed to synchronize setup for monitor vdev %i start: %d\n",
616 ret
= ath10k_wmi_vdev_up(ar
, vdev_id
, 0, ar
->mac_addr
);
618 ath10k_warn(ar
, "failed to put up monitor vdev %i: %d\n",
623 ar
->monitor_vdev_id
= vdev_id
;
625 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %i started\n",
626 ar
->monitor_vdev_id
);
630 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
632 ath10k_warn(ar
, "failed to stop monitor vdev %i after start failure: %d\n",
633 ar
->monitor_vdev_id
, ret
);
638 static int ath10k_monitor_vdev_stop(struct ath10k
*ar
)
642 lockdep_assert_held(&ar
->conf_mutex
);
644 ret
= ath10k_wmi_vdev_down(ar
, ar
->monitor_vdev_id
);
646 ath10k_warn(ar
, "failed to put down monitor vdev %i: %d\n",
647 ar
->monitor_vdev_id
, ret
);
649 reinit_completion(&ar
->vdev_setup_done
);
651 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
653 ath10k_warn(ar
, "failed to to request monitor vdev %i stop: %d\n",
654 ar
->monitor_vdev_id
, ret
);
656 ret
= ath10k_vdev_setup_sync(ar
);
658 ath10k_warn(ar
, "failed to synchronize monitor vdev %i stop: %d\n",
659 ar
->monitor_vdev_id
, ret
);
661 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %i stopped\n",
662 ar
->monitor_vdev_id
);
666 static int ath10k_monitor_vdev_create(struct ath10k
*ar
)
670 lockdep_assert_held(&ar
->conf_mutex
);
672 if (ar
->free_vdev_map
== 0) {
673 ath10k_warn(ar
, "failed to find free vdev id for monitor vdev\n");
677 bit
= __ffs64(ar
->free_vdev_map
);
679 ar
->monitor_vdev_id
= bit
;
681 ret
= ath10k_wmi_vdev_create(ar
, ar
->monitor_vdev_id
,
682 WMI_VDEV_TYPE_MONITOR
,
685 ath10k_warn(ar
, "failed to request monitor vdev %i creation: %d\n",
686 ar
->monitor_vdev_id
, ret
);
690 ar
->free_vdev_map
&= ~(1LL << ar
->monitor_vdev_id
);
691 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %d created\n",
692 ar
->monitor_vdev_id
);
697 static int ath10k_monitor_vdev_delete(struct ath10k
*ar
)
701 lockdep_assert_held(&ar
->conf_mutex
);
703 ret
= ath10k_wmi_vdev_delete(ar
, ar
->monitor_vdev_id
);
705 ath10k_warn(ar
, "failed to request wmi monitor vdev %i removal: %d\n",
706 ar
->monitor_vdev_id
, ret
);
710 ar
->free_vdev_map
|= 1LL << ar
->monitor_vdev_id
;
712 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %d deleted\n",
713 ar
->monitor_vdev_id
);
717 static int ath10k_monitor_start(struct ath10k
*ar
)
721 lockdep_assert_held(&ar
->conf_mutex
);
723 ret
= ath10k_monitor_vdev_create(ar
);
725 ath10k_warn(ar
, "failed to create monitor vdev: %d\n", ret
);
729 ret
= ath10k_monitor_vdev_start(ar
, ar
->monitor_vdev_id
);
731 ath10k_warn(ar
, "failed to start monitor vdev: %d\n", ret
);
732 ath10k_monitor_vdev_delete(ar
);
736 ar
->monitor_started
= true;
737 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor started\n");
742 static int ath10k_monitor_stop(struct ath10k
*ar
)
746 lockdep_assert_held(&ar
->conf_mutex
);
748 ret
= ath10k_monitor_vdev_stop(ar
);
750 ath10k_warn(ar
, "failed to stop monitor vdev: %d\n", ret
);
754 ret
= ath10k_monitor_vdev_delete(ar
);
756 ath10k_warn(ar
, "failed to delete monitor vdev: %d\n", ret
);
760 ar
->monitor_started
= false;
761 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor stopped\n");
766 static int ath10k_monitor_recalc(struct ath10k
*ar
)
770 lockdep_assert_held(&ar
->conf_mutex
);
772 should_start
= ar
->monitor
||
773 ar
->filter_flags
& FIF_PROMISC_IN_BSS
||
774 test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
776 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
777 "mac monitor recalc started? %d should? %d\n",
778 ar
->monitor_started
, should_start
);
780 if (should_start
== ar
->monitor_started
)
784 return ath10k_monitor_start(ar
);
786 return ath10k_monitor_stop(ar
);
789 static int ath10k_recalc_rtscts_prot(struct ath10k_vif
*arvif
)
791 struct ath10k
*ar
= arvif
->ar
;
792 u32 vdev_param
, rts_cts
= 0;
794 lockdep_assert_held(&ar
->conf_mutex
);
796 vdev_param
= ar
->wmi
.vdev_param
->enable_rtscts
;
798 if (arvif
->use_cts_prot
|| arvif
->num_legacy_stations
> 0)
799 rts_cts
|= SM(WMI_RTSCTS_ENABLED
, WMI_RTSCTS_SET
);
801 if (arvif
->num_legacy_stations
> 0)
802 rts_cts
|= SM(WMI_RTSCTS_ACROSS_SW_RETRIES
,
805 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
809 static int ath10k_start_cac(struct ath10k
*ar
)
813 lockdep_assert_held(&ar
->conf_mutex
);
815 set_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
817 ret
= ath10k_monitor_recalc(ar
);
819 ath10k_warn(ar
, "failed to start monitor (cac): %d\n", ret
);
820 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
824 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac cac start monitor vdev %d\n",
825 ar
->monitor_vdev_id
);
830 static int ath10k_stop_cac(struct ath10k
*ar
)
832 lockdep_assert_held(&ar
->conf_mutex
);
834 /* CAC is not running - do nothing */
835 if (!test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
))
838 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
839 ath10k_monitor_stop(ar
);
841 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac cac finished\n");
846 static void ath10k_recalc_radar_detection(struct ath10k
*ar
)
850 lockdep_assert_held(&ar
->conf_mutex
);
854 if (!ar
->radar_enabled
)
857 if (ar
->num_started_vdevs
> 0)
860 ret
= ath10k_start_cac(ar
);
863 * Not possible to start CAC on current channel so starting
864 * radiation is not allowed, make this channel DFS_UNAVAILABLE
865 * by indicating that radar was detected.
867 ath10k_warn(ar
, "failed to start CAC: %d\n", ret
);
868 ieee80211_radar_detected(ar
->hw
);
872 static int ath10k_vdev_start_restart(struct ath10k_vif
*arvif
, bool restart
)
874 struct ath10k
*ar
= arvif
->ar
;
875 struct cfg80211_chan_def
*chandef
= &ar
->chandef
;
876 struct wmi_vdev_start_request_arg arg
= {};
879 lockdep_assert_held(&ar
->conf_mutex
);
881 reinit_completion(&ar
->vdev_setup_done
);
883 arg
.vdev_id
= arvif
->vdev_id
;
884 arg
.dtim_period
= arvif
->dtim_period
;
885 arg
.bcn_intval
= arvif
->beacon_interval
;
887 arg
.channel
.freq
= chandef
->chan
->center_freq
;
888 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
889 arg
.channel
.mode
= chan_to_phymode(chandef
);
891 arg
.channel
.min_power
= 0;
892 arg
.channel
.max_power
= chandef
->chan
->max_power
* 2;
893 arg
.channel
.max_reg_power
= chandef
->chan
->max_reg_power
* 2;
894 arg
.channel
.max_antenna_gain
= chandef
->chan
->max_antenna_gain
* 2;
896 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
897 arg
.ssid
= arvif
->u
.ap
.ssid
;
898 arg
.ssid_len
= arvif
->u
.ap
.ssid_len
;
899 arg
.hidden_ssid
= arvif
->u
.ap
.hidden_ssid
;
901 /* For now allow DFS for AP mode */
902 arg
.channel
.chan_radar
=
903 !!(chandef
->chan
->flags
& IEEE80211_CHAN_RADAR
);
904 } else if (arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
905 arg
.ssid
= arvif
->vif
->bss_conf
.ssid
;
906 arg
.ssid_len
= arvif
->vif
->bss_conf
.ssid_len
;
909 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
910 "mac vdev %d start center_freq %d phymode %s\n",
911 arg
.vdev_id
, arg
.channel
.freq
,
912 ath10k_wmi_phymode_str(arg
.channel
.mode
));
915 ret
= ath10k_wmi_vdev_restart(ar
, &arg
);
917 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
920 ath10k_warn(ar
, "failed to start WMI vdev %i: %d\n",
925 ret
= ath10k_vdev_setup_sync(ar
);
928 "failed to synchronize setup for vdev %i restart %d: %d\n",
929 arg
.vdev_id
, restart
, ret
);
933 ar
->num_started_vdevs
++;
934 ath10k_recalc_radar_detection(ar
);
939 static int ath10k_vdev_start(struct ath10k_vif
*arvif
)
941 return ath10k_vdev_start_restart(arvif
, false);
944 static int ath10k_vdev_restart(struct ath10k_vif
*arvif
)
946 return ath10k_vdev_start_restart(arvif
, true);
949 static int ath10k_vdev_stop(struct ath10k_vif
*arvif
)
951 struct ath10k
*ar
= arvif
->ar
;
954 lockdep_assert_held(&ar
->conf_mutex
);
956 reinit_completion(&ar
->vdev_setup_done
);
958 ret
= ath10k_wmi_vdev_stop(ar
, arvif
->vdev_id
);
960 ath10k_warn(ar
, "failed to stop WMI vdev %i: %d\n",
961 arvif
->vdev_id
, ret
);
965 ret
= ath10k_vdev_setup_sync(ar
);
967 ath10k_warn(ar
, "failed to synchronize setup for vdev %i stop: %d\n",
968 arvif
->vdev_id
, ret
);
972 WARN_ON(ar
->num_started_vdevs
== 0);
974 if (ar
->num_started_vdevs
!= 0) {
975 ar
->num_started_vdevs
--;
976 ath10k_recalc_radar_detection(ar
);
982 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif
*arvif
,
985 struct ath10k
*ar
= arvif
->ar
;
986 struct ieee80211_mgmt
*mgmt
;
990 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
993 if (arvif
->vdev_subtype
!= WMI_VDEV_SUBTYPE_P2P_GO
)
996 mgmt
= (void *)bcn
->data
;
997 p2p_ie
= cfg80211_find_vendor_ie(WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
998 mgmt
->u
.beacon
.variable
,
999 bcn
->len
- (mgmt
->u
.beacon
.variable
-
1004 ret
= ath10k_wmi_p2p_go_bcn_ie(ar
, arvif
->vdev_id
, p2p_ie
);
1006 ath10k_warn(ar
, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1007 arvif
->vdev_id
, ret
);
1014 static int ath10k_mac_remove_vendor_ie(struct sk_buff
*skb
, unsigned int oui
,
1015 u8 oui_type
, size_t ie_offset
)
1022 if (WARN_ON(skb
->len
< ie_offset
))
1025 ie
= (u8
*)cfg80211_find_vendor_ie(oui
, oui_type
,
1026 skb
->data
+ ie_offset
,
1027 skb
->len
- ie_offset
);
1032 end
= skb
->data
+ skb
->len
;
1035 if (WARN_ON(next
> end
))
1038 memmove(ie
, next
, end
- next
);
1039 skb_trim(skb
, skb
->len
- len
);
1044 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif
*arvif
)
1046 struct ath10k
*ar
= arvif
->ar
;
1047 struct ieee80211_hw
*hw
= ar
->hw
;
1048 struct ieee80211_vif
*vif
= arvif
->vif
;
1049 struct ieee80211_mutable_offsets offs
= {};
1050 struct sk_buff
*bcn
;
1053 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1056 bcn
= ieee80211_beacon_get_template(hw
, vif
, &offs
);
1058 ath10k_warn(ar
, "failed to get beacon template from mac80211\n");
1062 ret
= ath10k_mac_setup_bcn_p2p_ie(arvif
, bcn
);
1064 ath10k_warn(ar
, "failed to setup p2p go bcn ie: %d\n", ret
);
1069 /* P2P IE is inserted by firmware automatically (as configured above)
1070 * so remove it from the base beacon template to avoid duplicate P2P
1071 * IEs in beacon frames.
1073 ath10k_mac_remove_vendor_ie(bcn
, WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1074 offsetof(struct ieee80211_mgmt
,
1075 u
.beacon
.variable
));
1077 ret
= ath10k_wmi_bcn_tmpl(ar
, arvif
->vdev_id
, offs
.tim_offset
, bcn
, 0,
1082 ath10k_warn(ar
, "failed to submit beacon template command: %d\n",
1090 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif
*arvif
)
1092 struct ath10k
*ar
= arvif
->ar
;
1093 struct ieee80211_hw
*hw
= ar
->hw
;
1094 struct ieee80211_vif
*vif
= arvif
->vif
;
1095 struct sk_buff
*prb
;
1098 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1101 prb
= ieee80211_proberesp_get(hw
, vif
);
1103 ath10k_warn(ar
, "failed to get probe resp template from mac80211\n");
1107 ret
= ath10k_wmi_prb_tmpl(ar
, arvif
->vdev_id
, prb
);
1111 ath10k_warn(ar
, "failed to submit probe resp template command: %d\n",
1119 static void ath10k_control_beaconing(struct ath10k_vif
*arvif
,
1120 struct ieee80211_bss_conf
*info
)
1122 struct ath10k
*ar
= arvif
->ar
;
1125 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1127 if (!info
->enable_beacon
) {
1128 ath10k_vdev_stop(arvif
);
1130 arvif
->is_started
= false;
1131 arvif
->is_up
= false;
1133 spin_lock_bh(&arvif
->ar
->data_lock
);
1134 ath10k_mac_vif_beacon_free(arvif
);
1135 spin_unlock_bh(&arvif
->ar
->data_lock
);
1140 arvif
->tx_seq_no
= 0x1000;
1142 ret
= ath10k_vdev_start(arvif
);
1147 ether_addr_copy(arvif
->bssid
, info
->bssid
);
1149 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
1152 ath10k_warn(ar
, "failed to bring up vdev %d: %i\n",
1153 arvif
->vdev_id
, ret
);
1154 ath10k_vdev_stop(arvif
);
1158 arvif
->is_started
= true;
1159 arvif
->is_up
= true;
1161 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d up\n", arvif
->vdev_id
);
1164 static void ath10k_control_ibss(struct ath10k_vif
*arvif
,
1165 struct ieee80211_bss_conf
*info
,
1166 const u8 self_peer
[ETH_ALEN
])
1168 struct ath10k
*ar
= arvif
->ar
;
1172 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1174 if (!info
->ibss_joined
) {
1175 ret
= ath10k_peer_delete(arvif
->ar
, arvif
->vdev_id
, self_peer
);
1177 ath10k_warn(ar
, "failed to delete IBSS self peer %pM for vdev %d: %d\n",
1178 self_peer
, arvif
->vdev_id
, ret
);
1180 if (is_zero_ether_addr(arvif
->bssid
))
1183 memset(arvif
->bssid
, 0, ETH_ALEN
);
1188 ret
= ath10k_peer_create(arvif
->ar
, arvif
->vdev_id
, self_peer
);
1190 ath10k_warn(ar
, "failed to create IBSS self peer %pM for vdev %d: %d\n",
1191 self_peer
, arvif
->vdev_id
, ret
);
1195 vdev_param
= arvif
->ar
->wmi
.vdev_param
->atim_window
;
1196 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
, arvif
->vdev_id
, vdev_param
,
1197 ATH10K_DEFAULT_ATIM
);
1199 ath10k_warn(ar
, "failed to set IBSS ATIM for vdev %d: %d\n",
1200 arvif
->vdev_id
, ret
);
1203 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif
*arvif
)
1205 struct ath10k
*ar
= arvif
->ar
;
1210 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1212 if (arvif
->u
.sta
.uapsd
)
1213 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER
;
1215 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS
;
1217 param
= WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD
;
1218 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
, value
);
1220 ath10k_warn(ar
, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1221 value
, arvif
->vdev_id
, ret
);
1228 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif
*arvif
)
1230 struct ath10k
*ar
= arvif
->ar
;
1235 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1237 if (arvif
->u
.sta
.uapsd
)
1238 value
= WMI_STA_PS_PSPOLL_COUNT_UAPSD
;
1240 value
= WMI_STA_PS_PSPOLL_COUNT_NO_MAX
;
1242 param
= WMI_STA_PS_PARAM_PSPOLL_COUNT
;
1243 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
1246 ath10k_warn(ar
, "failed to submit ps poll count %u on vdev %i: %d\n",
1247 value
, arvif
->vdev_id
, ret
);
1254 static int ath10k_mac_vif_setup_ps(struct ath10k_vif
*arvif
)
1256 struct ath10k
*ar
= arvif
->ar
;
1257 struct ieee80211_vif
*vif
= arvif
->vif
;
1258 struct ieee80211_conf
*conf
= &ar
->hw
->conf
;
1259 enum wmi_sta_powersave_param param
;
1260 enum wmi_sta_ps_mode psmode
;
1264 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1266 if (arvif
->vif
->type
!= NL80211_IFTYPE_STATION
)
1269 if (vif
->bss_conf
.ps
) {
1270 psmode
= WMI_STA_PS_MODE_ENABLED
;
1271 param
= WMI_STA_PS_PARAM_INACTIVITY_TIME
;
1273 ps_timeout
= conf
->dynamic_ps_timeout
;
1274 if (ps_timeout
== 0) {
1275 /* Firmware doesn't like 0 */
1276 ps_timeout
= ieee80211_tu_to_usec(
1277 vif
->bss_conf
.beacon_int
) / 1000;
1280 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
,
1283 ath10k_warn(ar
, "failed to set inactivity time for vdev %d: %i\n",
1284 arvif
->vdev_id
, ret
);
1288 psmode
= WMI_STA_PS_MODE_DISABLED
;
1291 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d psmode %s\n",
1292 arvif
->vdev_id
, psmode
? "enable" : "disable");
1294 ret
= ath10k_wmi_set_psmode(ar
, arvif
->vdev_id
, psmode
);
1296 ath10k_warn(ar
, "failed to set PS Mode %d for vdev %d: %d\n",
1297 psmode
, arvif
->vdev_id
, ret
);
1304 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif
*arvif
)
1306 struct ath10k
*ar
= arvif
->ar
;
1307 struct wmi_sta_keepalive_arg arg
= {};
1310 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1312 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
1315 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE
, ar
->wmi
.svc_map
))
1318 /* Some firmware revisions have a bug and ignore the `enabled` field.
1319 * Instead use the interval to disable the keepalive.
1321 arg
.vdev_id
= arvif
->vdev_id
;
1323 arg
.method
= WMI_STA_KEEPALIVE_METHOD_NULL_FRAME
;
1324 arg
.interval
= WMI_STA_KEEPALIVE_INTERVAL_DISABLE
;
1326 ret
= ath10k_wmi_sta_keepalive(ar
, &arg
);
1328 ath10k_warn(ar
, "failed to submit keepalive on vdev %i: %d\n",
1329 arvif
->vdev_id
, ret
);
1336 /**********************/
1337 /* Station management */
1338 /**********************/
1340 static u32
ath10k_peer_assoc_h_listen_intval(struct ath10k
*ar
,
1341 struct ieee80211_vif
*vif
)
1343 /* Some firmware revisions have unstable STA powersave when listen
1344 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
1345 * generate NullFunc frames properly even if buffered frames have been
1346 * indicated in Beacon TIM. Firmware would seldom wake up to pull
1347 * buffered frames. Often pinging the device from AP would simply fail.
1349 * As a workaround set it to 1.
1351 if (vif
->type
== NL80211_IFTYPE_STATION
)
1354 return ar
->hw
->conf
.listen_interval
;
1357 static void ath10k_peer_assoc_h_basic(struct ath10k
*ar
,
1358 struct ieee80211_vif
*vif
,
1359 struct ieee80211_sta
*sta
,
1360 struct wmi_peer_assoc_complete_arg
*arg
)
1362 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1364 lockdep_assert_held(&ar
->conf_mutex
);
1366 ether_addr_copy(arg
->addr
, sta
->addr
);
1367 arg
->vdev_id
= arvif
->vdev_id
;
1368 arg
->peer_aid
= sta
->aid
;
1369 arg
->peer_flags
|= WMI_PEER_AUTH
;
1370 arg
->peer_listen_intval
= ath10k_peer_assoc_h_listen_intval(ar
, vif
);
1371 arg
->peer_num_spatial_streams
= 1;
1372 arg
->peer_caps
= vif
->bss_conf
.assoc_capability
;
1375 static void ath10k_peer_assoc_h_crypto(struct ath10k
*ar
,
1376 struct ieee80211_vif
*vif
,
1377 struct wmi_peer_assoc_complete_arg
*arg
)
1379 struct ieee80211_bss_conf
*info
= &vif
->bss_conf
;
1380 struct cfg80211_bss
*bss
;
1381 const u8
*rsnie
= NULL
;
1382 const u8
*wpaie
= NULL
;
1384 lockdep_assert_held(&ar
->conf_mutex
);
1386 bss
= cfg80211_get_bss(ar
->hw
->wiphy
, ar
->hw
->conf
.chandef
.chan
,
1387 info
->bssid
, NULL
, 0, 0, 0);
1389 const struct cfg80211_bss_ies
*ies
;
1392 rsnie
= ieee80211_bss_get_ie(bss
, WLAN_EID_RSN
);
1394 ies
= rcu_dereference(bss
->ies
);
1396 wpaie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
1397 WLAN_OUI_TYPE_MICROSOFT_WPA
,
1401 cfg80211_put_bss(ar
->hw
->wiphy
, bss
);
1404 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1405 if (rsnie
|| wpaie
) {
1406 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "%s: rsn ie found\n", __func__
);
1407 arg
->peer_flags
|= WMI_PEER_NEED_PTK_4_WAY
;
1411 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "%s: wpa ie found\n", __func__
);
1412 arg
->peer_flags
|= WMI_PEER_NEED_GTK_2_WAY
;
1416 static void ath10k_peer_assoc_h_rates(struct ath10k
*ar
,
1417 struct ieee80211_sta
*sta
,
1418 struct wmi_peer_assoc_complete_arg
*arg
)
1420 struct wmi_rate_set_arg
*rateset
= &arg
->peer_legacy_rates
;
1421 const struct ieee80211_supported_band
*sband
;
1422 const struct ieee80211_rate
*rates
;
1426 lockdep_assert_held(&ar
->conf_mutex
);
1428 sband
= ar
->hw
->wiphy
->bands
[ar
->hw
->conf
.chandef
.chan
->band
];
1429 ratemask
= sta
->supp_rates
[ar
->hw
->conf
.chandef
.chan
->band
];
1430 rates
= sband
->bitrates
;
1432 rateset
->num_rates
= 0;
1434 for (i
= 0; i
< 32; i
++, ratemask
>>= 1, rates
++) {
1435 if (!(ratemask
& 1))
1438 rateset
->rates
[rateset
->num_rates
] = rates
->hw_value
;
1439 rateset
->num_rates
++;
1443 static void ath10k_peer_assoc_h_ht(struct ath10k
*ar
,
1444 struct ieee80211_sta
*sta
,
1445 struct wmi_peer_assoc_complete_arg
*arg
)
1447 const struct ieee80211_sta_ht_cap
*ht_cap
= &sta
->ht_cap
;
1451 lockdep_assert_held(&ar
->conf_mutex
);
1453 if (!ht_cap
->ht_supported
)
1456 arg
->peer_flags
|= WMI_PEER_HT
;
1457 arg
->peer_max_mpdu
= (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
1458 ht_cap
->ampdu_factor
)) - 1;
1460 arg
->peer_mpdu_density
=
1461 ath10k_parse_mpdudensity(ht_cap
->ampdu_density
);
1463 arg
->peer_ht_caps
= ht_cap
->cap
;
1464 arg
->peer_rate_caps
|= WMI_RC_HT_FLAG
;
1466 if (ht_cap
->cap
& IEEE80211_HT_CAP_LDPC_CODING
)
1467 arg
->peer_flags
|= WMI_PEER_LDPC
;
1469 if (sta
->bandwidth
>= IEEE80211_STA_RX_BW_40
) {
1470 arg
->peer_flags
|= WMI_PEER_40MHZ
;
1471 arg
->peer_rate_caps
|= WMI_RC_CW40_FLAG
;
1474 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_20
)
1475 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
1477 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_40
)
1478 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
1480 if (ht_cap
->cap
& IEEE80211_HT_CAP_TX_STBC
) {
1481 arg
->peer_rate_caps
|= WMI_RC_TX_STBC_FLAG
;
1482 arg
->peer_flags
|= WMI_PEER_STBC
;
1485 if (ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
) {
1486 stbc
= ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
;
1487 stbc
= stbc
>> IEEE80211_HT_CAP_RX_STBC_SHIFT
;
1488 stbc
= stbc
<< WMI_RC_RX_STBC_FLAG_S
;
1489 arg
->peer_rate_caps
|= stbc
;
1490 arg
->peer_flags
|= WMI_PEER_STBC
;
1493 if (ht_cap
->mcs
.rx_mask
[1] && ht_cap
->mcs
.rx_mask
[2])
1494 arg
->peer_rate_caps
|= WMI_RC_TS_FLAG
;
1495 else if (ht_cap
->mcs
.rx_mask
[1])
1496 arg
->peer_rate_caps
|= WMI_RC_DS_FLAG
;
1498 for (i
= 0, n
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
*8; i
++)
1499 if (ht_cap
->mcs
.rx_mask
[i
/8] & (1 << i
%8))
1500 arg
->peer_ht_rates
.rates
[n
++] = i
;
1503 * This is a workaround for HT-enabled STAs which break the spec
1504 * and have no HT capabilities RX mask (no HT RX MCS map).
1506 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1507 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1509 * Firmware asserts if such situation occurs.
1512 arg
->peer_ht_rates
.num_rates
= 8;
1513 for (i
= 0; i
< arg
->peer_ht_rates
.num_rates
; i
++)
1514 arg
->peer_ht_rates
.rates
[i
] = i
;
1516 arg
->peer_ht_rates
.num_rates
= n
;
1517 arg
->peer_num_spatial_streams
= sta
->rx_nss
;
1520 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac ht peer %pM mcs cnt %d nss %d\n",
1522 arg
->peer_ht_rates
.num_rates
,
1523 arg
->peer_num_spatial_streams
);
1526 static int ath10k_peer_assoc_qos_ap(struct ath10k
*ar
,
1527 struct ath10k_vif
*arvif
,
1528 struct ieee80211_sta
*sta
)
1534 lockdep_assert_held(&ar
->conf_mutex
);
1536 if (sta
->wme
&& sta
->uapsd_queues
) {
1537 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac uapsd_queues 0x%x max_sp %d\n",
1538 sta
->uapsd_queues
, sta
->max_sp
);
1540 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
)
1541 uapsd
|= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN
|
1542 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN
;
1543 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VI
)
1544 uapsd
|= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN
|
1545 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN
;
1546 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
)
1547 uapsd
|= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN
|
1548 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN
;
1549 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BE
)
1550 uapsd
|= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN
|
1551 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN
;
1553 if (sta
->max_sp
< MAX_WMI_AP_PS_PEER_PARAM_MAX_SP
)
1554 max_sp
= sta
->max_sp
;
1556 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
1558 WMI_AP_PS_PEER_PARAM_UAPSD
,
1561 ath10k_warn(ar
, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
1562 arvif
->vdev_id
, ret
);
1566 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
1568 WMI_AP_PS_PEER_PARAM_MAX_SP
,
1571 ath10k_warn(ar
, "failed to set ap ps peer param max sp for vdev %i: %d\n",
1572 arvif
->vdev_id
, ret
);
1576 /* TODO setup this based on STA listen interval and
1577 beacon interval. Currently we don't know
1578 sta->listen_interval - mac80211 patch required.
1579 Currently use 10 seconds */
1580 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
, sta
->addr
,
1581 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME
,
1584 ath10k_warn(ar
, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
1585 arvif
->vdev_id
, ret
);
1593 static void ath10k_peer_assoc_h_vht(struct ath10k
*ar
,
1594 struct ieee80211_sta
*sta
,
1595 struct wmi_peer_assoc_complete_arg
*arg
)
1597 const struct ieee80211_sta_vht_cap
*vht_cap
= &sta
->vht_cap
;
1600 if (!vht_cap
->vht_supported
)
1603 arg
->peer_flags
|= WMI_PEER_VHT
;
1605 if (ar
->hw
->conf
.chandef
.chan
->band
== IEEE80211_BAND_2GHZ
)
1606 arg
->peer_flags
|= WMI_PEER_VHT_2G
;
1608 arg
->peer_vht_caps
= vht_cap
->cap
;
1610 ampdu_factor
= (vht_cap
->cap
&
1611 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
) >>
1612 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT
;
1614 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1615 * zero in VHT IE. Using it would result in degraded throughput.
1616 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1617 * it if VHT max_mpdu is smaller. */
1618 arg
->peer_max_mpdu
= max(arg
->peer_max_mpdu
,
1619 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
1620 ampdu_factor
)) - 1);
1622 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
1623 arg
->peer_flags
|= WMI_PEER_80MHZ
;
1625 arg
->peer_vht_rates
.rx_max_rate
=
1626 __le16_to_cpu(vht_cap
->vht_mcs
.rx_highest
);
1627 arg
->peer_vht_rates
.rx_mcs_set
=
1628 __le16_to_cpu(vht_cap
->vht_mcs
.rx_mcs_map
);
1629 arg
->peer_vht_rates
.tx_max_rate
=
1630 __le16_to_cpu(vht_cap
->vht_mcs
.tx_highest
);
1631 arg
->peer_vht_rates
.tx_mcs_set
=
1632 __le16_to_cpu(vht_cap
->vht_mcs
.tx_mcs_map
);
1634 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1635 sta
->addr
, arg
->peer_max_mpdu
, arg
->peer_flags
);
1638 static void ath10k_peer_assoc_h_qos(struct ath10k
*ar
,
1639 struct ieee80211_vif
*vif
,
1640 struct ieee80211_sta
*sta
,
1641 struct wmi_peer_assoc_complete_arg
*arg
)
1643 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1645 switch (arvif
->vdev_type
) {
1646 case WMI_VDEV_TYPE_AP
:
1648 arg
->peer_flags
|= WMI_PEER_QOS
;
1650 if (sta
->wme
&& sta
->uapsd_queues
) {
1651 arg
->peer_flags
|= WMI_PEER_APSD
;
1652 arg
->peer_rate_caps
|= WMI_RC_UAPSD_FLAG
;
1655 case WMI_VDEV_TYPE_STA
:
1656 if (vif
->bss_conf
.qos
)
1657 arg
->peer_flags
|= WMI_PEER_QOS
;
1659 case WMI_VDEV_TYPE_IBSS
:
1661 arg
->peer_flags
|= WMI_PEER_QOS
;
1667 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac peer %pM qos %d\n",
1668 sta
->addr
, !!(arg
->peer_flags
& WMI_PEER_QOS
));
1671 static bool ath10k_mac_sta_has_11g_rates(struct ieee80211_sta
*sta
)
1673 /* First 4 rates in ath10k_rates are CCK (11b) rates. */
1674 return sta
->supp_rates
[IEEE80211_BAND_2GHZ
] >> 4;
1677 static void ath10k_peer_assoc_h_phymode(struct ath10k
*ar
,
1678 struct ieee80211_vif
*vif
,
1679 struct ieee80211_sta
*sta
,
1680 struct wmi_peer_assoc_complete_arg
*arg
)
1682 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
1684 switch (ar
->hw
->conf
.chandef
.chan
->band
) {
1685 case IEEE80211_BAND_2GHZ
:
1686 if (sta
->vht_cap
.vht_supported
) {
1687 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1688 phymode
= MODE_11AC_VHT40
;
1690 phymode
= MODE_11AC_VHT20
;
1691 } else if (sta
->ht_cap
.ht_supported
) {
1692 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1693 phymode
= MODE_11NG_HT40
;
1695 phymode
= MODE_11NG_HT20
;
1696 } else if (ath10k_mac_sta_has_11g_rates(sta
)) {
1703 case IEEE80211_BAND_5GHZ
:
1707 if (sta
->vht_cap
.vht_supported
) {
1708 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
1709 phymode
= MODE_11AC_VHT80
;
1710 else if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1711 phymode
= MODE_11AC_VHT40
;
1712 else if (sta
->bandwidth
== IEEE80211_STA_RX_BW_20
)
1713 phymode
= MODE_11AC_VHT20
;
1714 } else if (sta
->ht_cap
.ht_supported
) {
1715 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1716 phymode
= MODE_11NA_HT40
;
1718 phymode
= MODE_11NA_HT20
;
1728 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac peer %pM phymode %s\n",
1729 sta
->addr
, ath10k_wmi_phymode_str(phymode
));
1731 arg
->peer_phymode
= phymode
;
1732 WARN_ON(phymode
== MODE_UNKNOWN
);
1735 static int ath10k_peer_assoc_prepare(struct ath10k
*ar
,
1736 struct ieee80211_vif
*vif
,
1737 struct ieee80211_sta
*sta
,
1738 struct wmi_peer_assoc_complete_arg
*arg
)
1740 lockdep_assert_held(&ar
->conf_mutex
);
1742 memset(arg
, 0, sizeof(*arg
));
1744 ath10k_peer_assoc_h_basic(ar
, vif
, sta
, arg
);
1745 ath10k_peer_assoc_h_crypto(ar
, vif
, arg
);
1746 ath10k_peer_assoc_h_rates(ar
, sta
, arg
);
1747 ath10k_peer_assoc_h_ht(ar
, sta
, arg
);
1748 ath10k_peer_assoc_h_vht(ar
, sta
, arg
);
1749 ath10k_peer_assoc_h_qos(ar
, vif
, sta
, arg
);
1750 ath10k_peer_assoc_h_phymode(ar
, vif
, sta
, arg
);
1755 static const u32 ath10k_smps_map
[] = {
1756 [WLAN_HT_CAP_SM_PS_STATIC
] = WMI_PEER_SMPS_STATIC
,
1757 [WLAN_HT_CAP_SM_PS_DYNAMIC
] = WMI_PEER_SMPS_DYNAMIC
,
1758 [WLAN_HT_CAP_SM_PS_INVALID
] = WMI_PEER_SMPS_PS_NONE
,
1759 [WLAN_HT_CAP_SM_PS_DISABLED
] = WMI_PEER_SMPS_PS_NONE
,
1762 static int ath10k_setup_peer_smps(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
1764 const struct ieee80211_sta_ht_cap
*ht_cap
)
1768 if (!ht_cap
->ht_supported
)
1771 smps
= ht_cap
->cap
& IEEE80211_HT_CAP_SM_PS
;
1772 smps
>>= IEEE80211_HT_CAP_SM_PS_SHIFT
;
1774 if (smps
>= ARRAY_SIZE(ath10k_smps_map
))
1777 return ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, addr
,
1778 WMI_PEER_SMPS_STATE
,
1779 ath10k_smps_map
[smps
]);
1782 static int ath10k_mac_vif_recalc_txbf(struct ath10k
*ar
,
1783 struct ieee80211_vif
*vif
,
1784 struct ieee80211_sta_vht_cap vht_cap
)
1786 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1791 if (!(ar
->vht_cap_info
&
1792 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
1793 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
|
1794 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
1795 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)))
1798 param
= ar
->wmi
.vdev_param
->txbf
;
1801 if (WARN_ON(param
== WMI_VDEV_PARAM_UNSUPPORTED
))
1804 /* The following logic is correct. If a remote STA advertises support
1805 * for being a beamformer then we should enable us being a beamformee.
1808 if (ar
->vht_cap_info
&
1809 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
1810 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)) {
1811 if (vht_cap
.cap
& IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
)
1812 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
1814 if (vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)
1815 value
|= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
;
1818 if (ar
->vht_cap_info
&
1819 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
1820 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)) {
1821 if (vht_cap
.cap
& IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
)
1822 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
1824 if (vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)
1825 value
|= WMI_VDEV_PARAM_TXBF_MU_TX_BFER
;
1828 if (value
& WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
)
1829 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
1831 if (value
& WMI_VDEV_PARAM_TXBF_MU_TX_BFER
)
1832 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
1834 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
, value
);
1836 ath10k_warn(ar
, "failed to submit vdev param txbf 0x%x: %d\n",
1844 /* can be called only in mac80211 callbacks due to `key_count` usage */
1845 static void ath10k_bss_assoc(struct ieee80211_hw
*hw
,
1846 struct ieee80211_vif
*vif
,
1847 struct ieee80211_bss_conf
*bss_conf
)
1849 struct ath10k
*ar
= hw
->priv
;
1850 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1851 struct ieee80211_sta_ht_cap ht_cap
;
1852 struct ieee80211_sta_vht_cap vht_cap
;
1853 struct wmi_peer_assoc_complete_arg peer_arg
;
1854 struct ieee80211_sta
*ap_sta
;
1857 lockdep_assert_held(&ar
->conf_mutex
);
1859 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i assoc bssid %pM aid %d\n",
1860 arvif
->vdev_id
, arvif
->bssid
, arvif
->aid
);
1864 ap_sta
= ieee80211_find_sta(vif
, bss_conf
->bssid
);
1866 ath10k_warn(ar
, "failed to find station entry for bss %pM vdev %i\n",
1867 bss_conf
->bssid
, arvif
->vdev_id
);
1872 /* ap_sta must be accessed only within rcu section which must be left
1873 * before calling ath10k_setup_peer_smps() which might sleep. */
1874 ht_cap
= ap_sta
->ht_cap
;
1875 vht_cap
= ap_sta
->vht_cap
;
1877 ret
= ath10k_peer_assoc_prepare(ar
, vif
, ap_sta
, &peer_arg
);
1879 ath10k_warn(ar
, "failed to prepare peer assoc for %pM vdev %i: %d\n",
1880 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
1887 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
1889 ath10k_warn(ar
, "failed to run peer assoc for %pM vdev %i: %d\n",
1890 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
1894 ret
= ath10k_setup_peer_smps(ar
, arvif
, bss_conf
->bssid
, &ht_cap
);
1896 ath10k_warn(ar
, "failed to setup peer SMPS for vdev %i: %d\n",
1897 arvif
->vdev_id
, ret
);
1901 ret
= ath10k_mac_vif_recalc_txbf(ar
, vif
, vht_cap
);
1903 ath10k_warn(ar
, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
1904 arvif
->vdev_id
, bss_conf
->bssid
, ret
);
1908 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
1909 "mac vdev %d up (associated) bssid %pM aid %d\n",
1910 arvif
->vdev_id
, bss_conf
->bssid
, bss_conf
->aid
);
1912 WARN_ON(arvif
->is_up
);
1914 arvif
->aid
= bss_conf
->aid
;
1915 ether_addr_copy(arvif
->bssid
, bss_conf
->bssid
);
1917 ret
= ath10k_wmi_vdev_up(ar
, arvif
->vdev_id
, arvif
->aid
, arvif
->bssid
);
1919 ath10k_warn(ar
, "failed to set vdev %d up: %d\n",
1920 arvif
->vdev_id
, ret
);
1924 arvif
->is_up
= true;
1927 static void ath10k_bss_disassoc(struct ieee80211_hw
*hw
,
1928 struct ieee80211_vif
*vif
)
1930 struct ath10k
*ar
= hw
->priv
;
1931 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1932 struct ieee80211_sta_vht_cap vht_cap
= {};
1935 lockdep_assert_held(&ar
->conf_mutex
);
1937 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i disassoc bssid %pM\n",
1938 arvif
->vdev_id
, arvif
->bssid
);
1940 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
1942 ath10k_warn(ar
, "faield to down vdev %i: %d\n",
1943 arvif
->vdev_id
, ret
);
1945 arvif
->def_wep_key_idx
= -1;
1947 ret
= ath10k_mac_vif_recalc_txbf(ar
, vif
, vht_cap
);
1949 ath10k_warn(ar
, "failed to recalc txbf for vdev %i: %d\n",
1950 arvif
->vdev_id
, ret
);
1954 arvif
->is_up
= false;
1957 static int ath10k_station_assoc(struct ath10k
*ar
,
1958 struct ieee80211_vif
*vif
,
1959 struct ieee80211_sta
*sta
,
1962 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1963 struct wmi_peer_assoc_complete_arg peer_arg
;
1966 lockdep_assert_held(&ar
->conf_mutex
);
1968 ret
= ath10k_peer_assoc_prepare(ar
, vif
, sta
, &peer_arg
);
1970 ath10k_warn(ar
, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1971 sta
->addr
, arvif
->vdev_id
, ret
);
1975 peer_arg
.peer_reassoc
= reassoc
;
1976 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
1978 ath10k_warn(ar
, "failed to run peer assoc for STA %pM vdev %i: %d\n",
1979 sta
->addr
, arvif
->vdev_id
, ret
);
1983 /* Re-assoc is run only to update supported rates for given station. It
1984 * doesn't make much sense to reconfigure the peer completely.
1987 ret
= ath10k_setup_peer_smps(ar
, arvif
, sta
->addr
,
1990 ath10k_warn(ar
, "failed to setup peer SMPS for vdev %d: %d\n",
1991 arvif
->vdev_id
, ret
);
1995 ret
= ath10k_peer_assoc_qos_ap(ar
, arvif
, sta
);
1997 ath10k_warn(ar
, "failed to set qos params for STA %pM for vdev %i: %d\n",
1998 sta
->addr
, arvif
->vdev_id
, ret
);
2003 arvif
->num_legacy_stations
++;
2004 ret
= ath10k_recalc_rtscts_prot(arvif
);
2006 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2007 arvif
->vdev_id
, ret
);
2012 /* Plumb cached keys only for static WEP */
2013 if (arvif
->def_wep_key_idx
!= -1) {
2014 ret
= ath10k_install_peer_wep_keys(arvif
, sta
->addr
);
2016 ath10k_warn(ar
, "failed to install peer wep keys for vdev %i: %d\n",
2017 arvif
->vdev_id
, ret
);
2026 static int ath10k_station_disassoc(struct ath10k
*ar
,
2027 struct ieee80211_vif
*vif
,
2028 struct ieee80211_sta
*sta
)
2030 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2033 lockdep_assert_held(&ar
->conf_mutex
);
2036 arvif
->num_legacy_stations
--;
2037 ret
= ath10k_recalc_rtscts_prot(arvif
);
2039 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2040 arvif
->vdev_id
, ret
);
2045 ret
= ath10k_clear_peer_keys(arvif
, sta
->addr
);
2047 ath10k_warn(ar
, "failed to clear all peer wep keys for vdev %i: %d\n",
2048 arvif
->vdev_id
, ret
);
2059 static int ath10k_update_channel_list(struct ath10k
*ar
)
2061 struct ieee80211_hw
*hw
= ar
->hw
;
2062 struct ieee80211_supported_band
**bands
;
2063 enum ieee80211_band band
;
2064 struct ieee80211_channel
*channel
;
2065 struct wmi_scan_chan_list_arg arg
= {0};
2066 struct wmi_channel_arg
*ch
;
2072 lockdep_assert_held(&ar
->conf_mutex
);
2074 bands
= hw
->wiphy
->bands
;
2075 for (band
= 0; band
< IEEE80211_NUM_BANDS
; band
++) {
2079 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
2080 if (bands
[band
]->channels
[i
].flags
&
2081 IEEE80211_CHAN_DISABLED
)
2088 len
= sizeof(struct wmi_channel_arg
) * arg
.n_channels
;
2089 arg
.channels
= kzalloc(len
, GFP_KERNEL
);
2094 for (band
= 0; band
< IEEE80211_NUM_BANDS
; band
++) {
2098 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
2099 channel
= &bands
[band
]->channels
[i
];
2101 if (channel
->flags
& IEEE80211_CHAN_DISABLED
)
2104 ch
->allow_ht
= true;
2106 /* FIXME: when should we really allow VHT? */
2107 ch
->allow_vht
= true;
2110 !(channel
->flags
& IEEE80211_CHAN_NO_IR
);
2113 !(channel
->flags
& IEEE80211_CHAN_NO_HT40PLUS
);
2116 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
2118 passive
= channel
->flags
& IEEE80211_CHAN_NO_IR
;
2119 ch
->passive
= passive
;
2121 ch
->freq
= channel
->center_freq
;
2122 ch
->band_center_freq1
= channel
->center_freq
;
2124 ch
->max_power
= channel
->max_power
* 2;
2125 ch
->max_reg_power
= channel
->max_reg_power
* 2;
2126 ch
->max_antenna_gain
= channel
->max_antenna_gain
* 2;
2127 ch
->reg_class_id
= 0; /* FIXME */
2129 /* FIXME: why use only legacy modes, why not any
2130 * HT/VHT modes? Would that even make any
2132 if (channel
->band
== IEEE80211_BAND_2GHZ
)
2133 ch
->mode
= MODE_11G
;
2135 ch
->mode
= MODE_11A
;
2137 if (WARN_ON_ONCE(ch
->mode
== MODE_UNKNOWN
))
2140 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
2141 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2142 ch
- arg
.channels
, arg
.n_channels
,
2143 ch
->freq
, ch
->max_power
, ch
->max_reg_power
,
2144 ch
->max_antenna_gain
, ch
->mode
);
2150 ret
= ath10k_wmi_scan_chan_list(ar
, &arg
);
2151 kfree(arg
.channels
);
2156 static enum wmi_dfs_region
2157 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region
)
2159 switch (dfs_region
) {
2160 case NL80211_DFS_UNSET
:
2161 return WMI_UNINIT_DFS_DOMAIN
;
2162 case NL80211_DFS_FCC
:
2163 return WMI_FCC_DFS_DOMAIN
;
2164 case NL80211_DFS_ETSI
:
2165 return WMI_ETSI_DFS_DOMAIN
;
2166 case NL80211_DFS_JP
:
2167 return WMI_MKK4_DFS_DOMAIN
;
2169 return WMI_UNINIT_DFS_DOMAIN
;
2172 static void ath10k_regd_update(struct ath10k
*ar
)
2174 struct reg_dmn_pair_mapping
*regpair
;
2176 enum wmi_dfs_region wmi_dfs_reg
;
2177 enum nl80211_dfs_regions nl_dfs_reg
;
2179 lockdep_assert_held(&ar
->conf_mutex
);
2181 ret
= ath10k_update_channel_list(ar
);
2183 ath10k_warn(ar
, "failed to update channel list: %d\n", ret
);
2185 regpair
= ar
->ath_common
.regulatory
.regpair
;
2187 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
2188 nl_dfs_reg
= ar
->dfs_detector
->region
;
2189 wmi_dfs_reg
= ath10k_mac_get_dfs_region(nl_dfs_reg
);
2191 wmi_dfs_reg
= WMI_UNINIT_DFS_DOMAIN
;
2194 /* Target allows setting up per-band regdomain but ath_common provides
2195 * a combined one only */
2196 ret
= ath10k_wmi_pdev_set_regdomain(ar
,
2197 regpair
->reg_domain
,
2198 regpair
->reg_domain
, /* 2ghz */
2199 regpair
->reg_domain
, /* 5ghz */
2200 regpair
->reg_2ghz_ctl
,
2201 regpair
->reg_5ghz_ctl
,
2204 ath10k_warn(ar
, "failed to set pdev regdomain: %d\n", ret
);
2207 static void ath10k_reg_notifier(struct wiphy
*wiphy
,
2208 struct regulatory_request
*request
)
2210 struct ieee80211_hw
*hw
= wiphy_to_ieee80211_hw(wiphy
);
2211 struct ath10k
*ar
= hw
->priv
;
2214 ath_reg_notifier_apply(wiphy
, request
, &ar
->ath_common
.regulatory
);
2216 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
2217 ath10k_dbg(ar
, ATH10K_DBG_REGULATORY
, "dfs region 0x%x\n",
2218 request
->dfs_region
);
2219 result
= ar
->dfs_detector
->set_dfs_domain(ar
->dfs_detector
,
2220 request
->dfs_region
);
2222 ath10k_warn(ar
, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
2223 request
->dfs_region
);
2226 mutex_lock(&ar
->conf_mutex
);
2227 if (ar
->state
== ATH10K_STATE_ON
)
2228 ath10k_regd_update(ar
);
2229 mutex_unlock(&ar
->conf_mutex
);
2236 static u8
ath10k_tx_h_get_tid(struct ieee80211_hdr
*hdr
)
2238 if (ieee80211_is_mgmt(hdr
->frame_control
))
2239 return HTT_DATA_TX_EXT_TID_MGMT
;
2241 if (!ieee80211_is_data_qos(hdr
->frame_control
))
2242 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST
;
2244 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr
)))
2245 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST
;
2247 return ieee80211_get_qos_ctl(hdr
)[0] & IEEE80211_QOS_CTL_TID_MASK
;
2250 static u8
ath10k_tx_h_get_vdev_id(struct ath10k
*ar
, struct ieee80211_vif
*vif
)
2253 return ath10k_vif_to_arvif(vif
)->vdev_id
;
2255 if (ar
->monitor_started
)
2256 return ar
->monitor_vdev_id
;
2258 ath10k_warn(ar
, "failed to resolve vdev id\n");
2262 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
2263 * Control in the header.
2265 static void ath10k_tx_h_nwifi(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
2267 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
2268 struct ath10k_skb_cb
*cb
= ATH10K_SKB_CB(skb
);
2271 if (!ieee80211_is_data_qos(hdr
->frame_control
))
2274 qos_ctl
= ieee80211_get_qos_ctl(hdr
);
2275 memmove(skb
->data
+ IEEE80211_QOS_CTL_LEN
,
2276 skb
->data
, (void *)qos_ctl
- (void *)skb
->data
);
2277 skb_pull(skb
, IEEE80211_QOS_CTL_LEN
);
2279 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
2280 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
2281 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
2282 * it is safe to downgrade to NullFunc.
2284 hdr
= (void *)skb
->data
;
2285 if (ieee80211_is_qos_nullfunc(hdr
->frame_control
)) {
2286 hdr
->frame_control
&= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA
);
2287 cb
->htt
.tid
= HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST
;
2291 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k
*ar
,
2292 struct ieee80211_vif
*vif
,
2293 struct sk_buff
*skb
)
2295 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
2296 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2298 /* This is case only for P2P_GO */
2299 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
||
2300 arvif
->vdev_subtype
!= WMI_VDEV_SUBTYPE_P2P_GO
)
2303 if (unlikely(ieee80211_is_probe_resp(hdr
->frame_control
))) {
2304 spin_lock_bh(&ar
->data_lock
);
2305 if (arvif
->u
.ap
.noa_data
)
2306 if (!pskb_expand_head(skb
, 0, arvif
->u
.ap
.noa_len
,
2308 memcpy(skb_put(skb
, arvif
->u
.ap
.noa_len
),
2309 arvif
->u
.ap
.noa_data
,
2310 arvif
->u
.ap
.noa_len
);
2311 spin_unlock_bh(&ar
->data_lock
);
2315 static bool ath10k_mac_need_offchan_tx_work(struct ath10k
*ar
)
2317 /* FIXME: Not really sure since when the behaviour changed. At some
2318 * point new firmware stopped requiring creation of peer entries for
2319 * offchannel tx (and actually creating them causes issues with wmi-htc
2320 * tx credit replenishment and reliability). Assuming it's at least 3.4
2321 * because that's when the `freq` was introduced to TX_FRM HTT command.
2323 return !(ar
->htt
.target_version_major
>= 3 &&
2324 ar
->htt
.target_version_minor
>= 4);
2327 static void ath10k_tx_htt(struct ath10k
*ar
, struct sk_buff
*skb
)
2329 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
2332 if (ar
->htt
.target_version_major
>= 3) {
2333 /* Since HTT 3.0 there is no separate mgmt tx command */
2334 ret
= ath10k_htt_tx(&ar
->htt
, skb
);
2338 if (ieee80211_is_mgmt(hdr
->frame_control
)) {
2339 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
2341 if (skb_queue_len(&ar
->wmi_mgmt_tx_queue
) >=
2342 ATH10K_MAX_NUM_MGMT_PENDING
) {
2343 ath10k_warn(ar
, "reached WMI management transmit queue limit\n");
2348 skb_queue_tail(&ar
->wmi_mgmt_tx_queue
, skb
);
2349 ieee80211_queue_work(ar
->hw
, &ar
->wmi_mgmt_tx_work
);
2351 ret
= ath10k_htt_mgmt_tx(&ar
->htt
, skb
);
2353 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
2355 ieee80211_is_nullfunc(hdr
->frame_control
)) {
2356 /* FW does not report tx status properly for NullFunc frames
2357 * unless they are sent through mgmt tx path. mac80211 sends
2358 * those frames when it detects link/beacon loss and depends
2359 * on the tx status to be correct. */
2360 ret
= ath10k_htt_mgmt_tx(&ar
->htt
, skb
);
2362 ret
= ath10k_htt_tx(&ar
->htt
, skb
);
2367 ath10k_warn(ar
, "failed to transmit packet, dropping: %d\n",
2369 ieee80211_free_txskb(ar
->hw
, skb
);
2373 void ath10k_offchan_tx_purge(struct ath10k
*ar
)
2375 struct sk_buff
*skb
;
2378 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
2382 ieee80211_free_txskb(ar
->hw
, skb
);
2386 void ath10k_offchan_tx_work(struct work_struct
*work
)
2388 struct ath10k
*ar
= container_of(work
, struct ath10k
, offchan_tx_work
);
2389 struct ath10k_peer
*peer
;
2390 struct ieee80211_hdr
*hdr
;
2391 struct sk_buff
*skb
;
2392 const u8
*peer_addr
;
2396 /* FW requirement: We must create a peer before FW will send out
2397 * an offchannel frame. Otherwise the frame will be stuck and
2398 * never transmitted. We delete the peer upon tx completion.
2399 * It is unlikely that a peer for offchannel tx will already be
2400 * present. However it may be in some rare cases so account for that.
2401 * Otherwise we might remove a legitimate peer and break stuff. */
2404 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
2408 mutex_lock(&ar
->conf_mutex
);
2410 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac offchannel skb %p\n",
2413 hdr
= (struct ieee80211_hdr
*)skb
->data
;
2414 peer_addr
= ieee80211_get_DA(hdr
);
2415 vdev_id
= ATH10K_SKB_CB(skb
)->vdev_id
;
2417 spin_lock_bh(&ar
->data_lock
);
2418 peer
= ath10k_peer_find(ar
, vdev_id
, peer_addr
);
2419 spin_unlock_bh(&ar
->data_lock
);
2422 /* FIXME: should this use ath10k_warn()? */
2423 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "peer %pM on vdev %d already present\n",
2424 peer_addr
, vdev_id
);
2427 ret
= ath10k_peer_create(ar
, vdev_id
, peer_addr
);
2429 ath10k_warn(ar
, "failed to create peer %pM on vdev %d: %d\n",
2430 peer_addr
, vdev_id
, ret
);
2433 spin_lock_bh(&ar
->data_lock
);
2434 reinit_completion(&ar
->offchan_tx_completed
);
2435 ar
->offchan_tx_skb
= skb
;
2436 spin_unlock_bh(&ar
->data_lock
);
2438 ath10k_tx_htt(ar
, skb
);
2440 ret
= wait_for_completion_timeout(&ar
->offchan_tx_completed
,
2443 ath10k_warn(ar
, "timed out waiting for offchannel skb %p\n",
2447 ret
= ath10k_peer_delete(ar
, vdev_id
, peer_addr
);
2449 ath10k_warn(ar
, "failed to delete peer %pM on vdev %d: %d\n",
2450 peer_addr
, vdev_id
, ret
);
2453 mutex_unlock(&ar
->conf_mutex
);
2457 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k
*ar
)
2459 struct sk_buff
*skb
;
2462 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
2466 ieee80211_free_txskb(ar
->hw
, skb
);
2470 void ath10k_mgmt_over_wmi_tx_work(struct work_struct
*work
)
2472 struct ath10k
*ar
= container_of(work
, struct ath10k
, wmi_mgmt_tx_work
);
2473 struct sk_buff
*skb
;
2477 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
2481 ret
= ath10k_wmi_mgmt_tx(ar
, skb
);
2483 ath10k_warn(ar
, "failed to transmit management frame via WMI: %d\n",
2485 ieee80211_free_txskb(ar
->hw
, skb
);
2494 void __ath10k_scan_finish(struct ath10k
*ar
)
2496 lockdep_assert_held(&ar
->data_lock
);
2498 switch (ar
->scan
.state
) {
2499 case ATH10K_SCAN_IDLE
:
2501 case ATH10K_SCAN_RUNNING
:
2502 if (ar
->scan
.is_roc
)
2503 ieee80211_remain_on_channel_expired(ar
->hw
);
2505 case ATH10K_SCAN_ABORTING
:
2506 if (!ar
->scan
.is_roc
)
2507 ieee80211_scan_completed(ar
->hw
,
2509 ATH10K_SCAN_ABORTING
));
2511 case ATH10K_SCAN_STARTING
:
2512 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
2513 ar
->scan_channel
= NULL
;
2514 ath10k_offchan_tx_purge(ar
);
2515 cancel_delayed_work(&ar
->scan
.timeout
);
2516 complete_all(&ar
->scan
.completed
);
2521 void ath10k_scan_finish(struct ath10k
*ar
)
2523 spin_lock_bh(&ar
->data_lock
);
2524 __ath10k_scan_finish(ar
);
2525 spin_unlock_bh(&ar
->data_lock
);
2528 static int ath10k_scan_stop(struct ath10k
*ar
)
2530 struct wmi_stop_scan_arg arg
= {
2531 .req_id
= 1, /* FIXME */
2532 .req_type
= WMI_SCAN_STOP_ONE
,
2533 .u
.scan_id
= ATH10K_SCAN_ID
,
2537 lockdep_assert_held(&ar
->conf_mutex
);
2539 ret
= ath10k_wmi_stop_scan(ar
, &arg
);
2541 ath10k_warn(ar
, "failed to stop wmi scan: %d\n", ret
);
2545 ret
= wait_for_completion_timeout(&ar
->scan
.completed
, 3*HZ
);
2547 ath10k_warn(ar
, "failed to receive scan abortion completion: timed out\n");
2549 } else if (ret
> 0) {
2554 /* Scan state should be updated upon scan completion but in case
2555 * firmware fails to deliver the event (for whatever reason) it is
2556 * desired to clean up scan state anyway. Firmware may have just
2557 * dropped the scan completion event delivery due to transport pipe
2558 * being overflown with data and/or it can recover on its own before
2559 * next scan request is submitted.
2561 spin_lock_bh(&ar
->data_lock
);
2562 if (ar
->scan
.state
!= ATH10K_SCAN_IDLE
)
2563 __ath10k_scan_finish(ar
);
2564 spin_unlock_bh(&ar
->data_lock
);
2569 static void ath10k_scan_abort(struct ath10k
*ar
)
2573 lockdep_assert_held(&ar
->conf_mutex
);
2575 spin_lock_bh(&ar
->data_lock
);
2577 switch (ar
->scan
.state
) {
2578 case ATH10K_SCAN_IDLE
:
2579 /* This can happen if timeout worker kicked in and called
2580 * abortion while scan completion was being processed.
2583 case ATH10K_SCAN_STARTING
:
2584 case ATH10K_SCAN_ABORTING
:
2585 ath10k_warn(ar
, "refusing scan abortion due to invalid scan state: %s (%d)\n",
2586 ath10k_scan_state_str(ar
->scan
.state
),
2589 case ATH10K_SCAN_RUNNING
:
2590 ar
->scan
.state
= ATH10K_SCAN_ABORTING
;
2591 spin_unlock_bh(&ar
->data_lock
);
2593 ret
= ath10k_scan_stop(ar
);
2595 ath10k_warn(ar
, "failed to abort scan: %d\n", ret
);
2597 spin_lock_bh(&ar
->data_lock
);
2601 spin_unlock_bh(&ar
->data_lock
);
2604 void ath10k_scan_timeout_work(struct work_struct
*work
)
2606 struct ath10k
*ar
= container_of(work
, struct ath10k
,
2609 mutex_lock(&ar
->conf_mutex
);
2610 ath10k_scan_abort(ar
);
2611 mutex_unlock(&ar
->conf_mutex
);
2614 static int ath10k_start_scan(struct ath10k
*ar
,
2615 const struct wmi_start_scan_arg
*arg
)
2619 lockdep_assert_held(&ar
->conf_mutex
);
2621 ret
= ath10k_wmi_start_scan(ar
, arg
);
2625 ret
= wait_for_completion_timeout(&ar
->scan
.started
, 1*HZ
);
2627 ret
= ath10k_scan_stop(ar
);
2629 ath10k_warn(ar
, "failed to stop scan: %d\n", ret
);
2634 /* If we failed to start the scan, return error code at
2635 * this point. This is probably due to some issue in the
2636 * firmware, but no need to wedge the driver due to that...
2638 spin_lock_bh(&ar
->data_lock
);
2639 if (ar
->scan
.state
== ATH10K_SCAN_IDLE
) {
2640 spin_unlock_bh(&ar
->data_lock
);
2643 spin_unlock_bh(&ar
->data_lock
);
2645 /* Add a 200ms margin to account for event/command processing */
2646 ieee80211_queue_delayed_work(ar
->hw
, &ar
->scan
.timeout
,
2647 msecs_to_jiffies(arg
->max_scan_time
+200));
2651 /**********************/
2652 /* mac80211 callbacks */
2653 /**********************/
2655 static void ath10k_tx(struct ieee80211_hw
*hw
,
2656 struct ieee80211_tx_control
*control
,
2657 struct sk_buff
*skb
)
2659 struct ath10k
*ar
= hw
->priv
;
2660 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
2661 struct ieee80211_vif
*vif
= info
->control
.vif
;
2662 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
2664 /* We should disable CCK RATE due to P2P */
2665 if (info
->flags
& IEEE80211_TX_CTL_NO_CCK_RATE
)
2666 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2668 ATH10K_SKB_CB(skb
)->htt
.is_offchan
= false;
2669 ATH10K_SKB_CB(skb
)->htt
.tid
= ath10k_tx_h_get_tid(hdr
);
2670 ATH10K_SKB_CB(skb
)->vdev_id
= ath10k_tx_h_get_vdev_id(ar
, vif
);
2672 /* it makes no sense to process injected frames like that */
2673 if (vif
&& vif
->type
!= NL80211_IFTYPE_MONITOR
) {
2674 ath10k_tx_h_nwifi(hw
, skb
);
2675 ath10k_tx_h_add_p2p_noa_ie(ar
, vif
, skb
);
2676 ath10k_tx_h_seq_no(vif
, skb
);
2679 if (info
->flags
& IEEE80211_TX_CTL_TX_OFFCHAN
) {
2680 spin_lock_bh(&ar
->data_lock
);
2681 ATH10K_SKB_CB(skb
)->htt
.freq
= ar
->scan
.roc_freq
;
2682 ATH10K_SKB_CB(skb
)->vdev_id
= ar
->scan
.vdev_id
;
2683 spin_unlock_bh(&ar
->data_lock
);
2685 if (ath10k_mac_need_offchan_tx_work(ar
)) {
2686 ATH10K_SKB_CB(skb
)->htt
.freq
= 0;
2687 ATH10K_SKB_CB(skb
)->htt
.is_offchan
= true;
2689 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "queued offchannel skb %p\n",
2692 skb_queue_tail(&ar
->offchan_tx_queue
, skb
);
2693 ieee80211_queue_work(hw
, &ar
->offchan_tx_work
);
2698 ath10k_tx_htt(ar
, skb
);
2701 /* Must not be called with conf_mutex held as workers can use that also. */
2702 void ath10k_drain_tx(struct ath10k
*ar
)
2704 /* make sure rcu-protected mac80211 tx path itself is drained */
2707 ath10k_offchan_tx_purge(ar
);
2708 ath10k_mgmt_over_wmi_tx_purge(ar
);
2710 cancel_work_sync(&ar
->offchan_tx_work
);
2711 cancel_work_sync(&ar
->wmi_mgmt_tx_work
);
2714 void ath10k_halt(struct ath10k
*ar
)
2716 struct ath10k_vif
*arvif
;
2718 lockdep_assert_held(&ar
->conf_mutex
);
2720 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
2721 ar
->filter_flags
= 0;
2722 ar
->monitor
= false;
2724 if (ar
->monitor_started
)
2725 ath10k_monitor_stop(ar
);
2727 ar
->monitor_started
= false;
2729 ath10k_scan_finish(ar
);
2730 ath10k_peer_cleanup_all(ar
);
2731 ath10k_core_stop(ar
);
2732 ath10k_hif_power_down(ar
);
2734 spin_lock_bh(&ar
->data_lock
);
2735 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
2736 ath10k_mac_vif_beacon_cleanup(arvif
);
2737 spin_unlock_bh(&ar
->data_lock
);
2740 static int ath10k_get_antenna(struct ieee80211_hw
*hw
, u32
*tx_ant
, u32
*rx_ant
)
2742 struct ath10k
*ar
= hw
->priv
;
2744 mutex_lock(&ar
->conf_mutex
);
2746 if (ar
->cfg_tx_chainmask
) {
2747 *tx_ant
= ar
->cfg_tx_chainmask
;
2748 *rx_ant
= ar
->cfg_rx_chainmask
;
2750 *tx_ant
= ar
->supp_tx_chainmask
;
2751 *rx_ant
= ar
->supp_rx_chainmask
;
2754 mutex_unlock(&ar
->conf_mutex
);
2759 static void ath10k_check_chain_mask(struct ath10k
*ar
, u32 cm
, const char *dbg
)
2761 /* It is not clear that allowing gaps in chainmask
2762 * is helpful. Probably it will not do what user
2763 * is hoping for, so warn in that case.
2765 if (cm
== 15 || cm
== 7 || cm
== 3 || cm
== 1 || cm
== 0)
2768 ath10k_warn(ar
, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
2772 static int __ath10k_set_antenna(struct ath10k
*ar
, u32 tx_ant
, u32 rx_ant
)
2776 lockdep_assert_held(&ar
->conf_mutex
);
2778 ath10k_check_chain_mask(ar
, tx_ant
, "tx");
2779 ath10k_check_chain_mask(ar
, rx_ant
, "rx");
2781 ar
->cfg_tx_chainmask
= tx_ant
;
2782 ar
->cfg_rx_chainmask
= rx_ant
;
2784 if ((ar
->state
!= ATH10K_STATE_ON
) &&
2785 (ar
->state
!= ATH10K_STATE_RESTARTED
))
2788 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->tx_chain_mask
,
2791 ath10k_warn(ar
, "failed to set tx-chainmask: %d, req 0x%x\n",
2796 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->rx_chain_mask
,
2799 ath10k_warn(ar
, "failed to set rx-chainmask: %d, req 0x%x\n",
2807 static int ath10k_set_antenna(struct ieee80211_hw
*hw
, u32 tx_ant
, u32 rx_ant
)
2809 struct ath10k
*ar
= hw
->priv
;
2812 mutex_lock(&ar
->conf_mutex
);
2813 ret
= __ath10k_set_antenna(ar
, tx_ant
, rx_ant
);
2814 mutex_unlock(&ar
->conf_mutex
);
2818 static int ath10k_start(struct ieee80211_hw
*hw
)
2820 struct ath10k
*ar
= hw
->priv
;
2824 * This makes sense only when restarting hw. It is harmless to call
2825 * uncoditionally. This is necessary to make sure no HTT/WMI tx
2826 * commands will be submitted while restarting.
2828 ath10k_drain_tx(ar
);
2830 mutex_lock(&ar
->conf_mutex
);
2832 switch (ar
->state
) {
2833 case ATH10K_STATE_OFF
:
2834 ar
->state
= ATH10K_STATE_ON
;
2836 case ATH10K_STATE_RESTARTING
:
2838 ar
->state
= ATH10K_STATE_RESTARTED
;
2840 case ATH10K_STATE_ON
:
2841 case ATH10K_STATE_RESTARTED
:
2842 case ATH10K_STATE_WEDGED
:
2846 case ATH10K_STATE_UTF
:
2851 ret
= ath10k_hif_power_up(ar
);
2853 ath10k_err(ar
, "Could not init hif: %d\n", ret
);
2857 ret
= ath10k_core_start(ar
, ATH10K_FIRMWARE_MODE_NORMAL
);
2859 ath10k_err(ar
, "Could not init core: %d\n", ret
);
2860 goto err_power_down
;
2863 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->pmf_qos
, 1);
2865 ath10k_warn(ar
, "failed to enable PMF QOS: %d\n", ret
);
2869 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->dynamic_bw
, 1);
2871 ath10k_warn(ar
, "failed to enable dynamic BW: %d\n", ret
);
2875 if (ar
->cfg_tx_chainmask
)
2876 __ath10k_set_antenna(ar
, ar
->cfg_tx_chainmask
,
2877 ar
->cfg_rx_chainmask
);
2880 * By default FW set ARP frames ac to voice (6). In that case ARP
2881 * exchange is not working properly for UAPSD enabled AP. ARP requests
2882 * which arrives with access category 0 are processed by network stack
2883 * and send back with access category 0, but FW changes access category
2884 * to 6. Set ARP frames access category to best effort (0) solves
2888 ret
= ath10k_wmi_pdev_set_param(ar
,
2889 ar
->wmi
.pdev_param
->arp_ac_override
, 0);
2891 ath10k_warn(ar
, "failed to set arp ac override parameter: %d\n",
2896 ar
->num_started_vdevs
= 0;
2897 ath10k_regd_update(ar
);
2899 ath10k_spectral_start(ar
);
2901 mutex_unlock(&ar
->conf_mutex
);
2905 ath10k_core_stop(ar
);
2908 ath10k_hif_power_down(ar
);
2911 ar
->state
= ATH10K_STATE_OFF
;
2914 mutex_unlock(&ar
->conf_mutex
);
2918 static void ath10k_stop(struct ieee80211_hw
*hw
)
2920 struct ath10k
*ar
= hw
->priv
;
2922 ath10k_drain_tx(ar
);
2924 mutex_lock(&ar
->conf_mutex
);
2925 if (ar
->state
!= ATH10K_STATE_OFF
) {
2927 ar
->state
= ATH10K_STATE_OFF
;
2929 mutex_unlock(&ar
->conf_mutex
);
2931 cancel_delayed_work_sync(&ar
->scan
.timeout
);
2932 cancel_work_sync(&ar
->restart_work
);
2935 static int ath10k_config_ps(struct ath10k
*ar
)
2937 struct ath10k_vif
*arvif
;
2940 lockdep_assert_held(&ar
->conf_mutex
);
2942 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
2943 ret
= ath10k_mac_vif_setup_ps(arvif
);
2945 ath10k_warn(ar
, "failed to setup powersave: %d\n", ret
);
2953 static const char *chandef_get_width(enum nl80211_chan_width width
)
2956 case NL80211_CHAN_WIDTH_20_NOHT
:
2958 case NL80211_CHAN_WIDTH_20
:
2960 case NL80211_CHAN_WIDTH_40
:
2962 case NL80211_CHAN_WIDTH_80
:
2964 case NL80211_CHAN_WIDTH_80P80
:
2966 case NL80211_CHAN_WIDTH_160
:
2968 case NL80211_CHAN_WIDTH_5
:
2970 case NL80211_CHAN_WIDTH_10
:
2976 static void ath10k_config_chan(struct ath10k
*ar
)
2978 struct ath10k_vif
*arvif
;
2981 lockdep_assert_held(&ar
->conf_mutex
);
2983 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
2984 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2985 ar
->chandef
.chan
->center_freq
,
2986 ar
->chandef
.center_freq1
,
2987 ar
->chandef
.center_freq2
,
2988 chandef_get_width(ar
->chandef
.width
));
2990 /* First stop monitor interface. Some FW versions crash if there's a
2991 * lone monitor interface. */
2992 if (ar
->monitor_started
)
2993 ath10k_monitor_stop(ar
);
2995 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
2996 if (!arvif
->is_started
)
3002 if (arvif
->vdev_type
== WMI_VDEV_TYPE_MONITOR
)
3005 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
3007 ath10k_warn(ar
, "failed to down vdev %d: %d\n",
3008 arvif
->vdev_id
, ret
);
3013 /* all vdevs are downed now - attempt to restart and re-up them */
3015 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
3016 if (!arvif
->is_started
)
3019 if (arvif
->vdev_type
== WMI_VDEV_TYPE_MONITOR
)
3022 ret
= ath10k_vdev_restart(arvif
);
3024 ath10k_warn(ar
, "failed to restart vdev %d: %d\n",
3025 arvif
->vdev_id
, ret
);
3032 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
3035 ath10k_warn(ar
, "failed to bring vdev up %d: %d\n",
3036 arvif
->vdev_id
, ret
);
3041 ath10k_monitor_recalc(ar
);
3044 static int ath10k_mac_txpower_setup(struct ath10k
*ar
, int txpower
)
3049 lockdep_assert_held(&ar
->conf_mutex
);
3051 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac txpower %d\n", txpower
);
3053 param
= ar
->wmi
.pdev_param
->txpower_limit2g
;
3054 ret
= ath10k_wmi_pdev_set_param(ar
, param
, txpower
* 2);
3056 ath10k_warn(ar
, "failed to set 2g txpower %d: %d\n",
3061 param
= ar
->wmi
.pdev_param
->txpower_limit5g
;
3062 ret
= ath10k_wmi_pdev_set_param(ar
, param
, txpower
* 2);
3064 ath10k_warn(ar
, "failed to set 5g txpower %d: %d\n",
3072 static int ath10k_mac_txpower_recalc(struct ath10k
*ar
)
3074 struct ath10k_vif
*arvif
;
3075 int ret
, txpower
= -1;
3077 lockdep_assert_held(&ar
->conf_mutex
);
3079 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
3080 WARN_ON(arvif
->txpower
< 0);
3083 txpower
= arvif
->txpower
;
3085 txpower
= min(txpower
, arvif
->txpower
);
3088 if (WARN_ON(txpower
== -1))
3091 ret
= ath10k_mac_txpower_setup(ar
, txpower
);
3093 ath10k_warn(ar
, "failed to setup tx power %d: %d\n",
3101 static int ath10k_config(struct ieee80211_hw
*hw
, u32 changed
)
3103 struct ath10k
*ar
= hw
->priv
;
3104 struct ieee80211_conf
*conf
= &hw
->conf
;
3107 mutex_lock(&ar
->conf_mutex
);
3109 if (changed
& IEEE80211_CONF_CHANGE_CHANNEL
) {
3110 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
3111 "mac config channel %dMHz flags 0x%x radar %d\n",
3112 conf
->chandef
.chan
->center_freq
,
3113 conf
->chandef
.chan
->flags
,
3114 conf
->radar_enabled
);
3116 spin_lock_bh(&ar
->data_lock
);
3117 ar
->rx_channel
= conf
->chandef
.chan
;
3118 spin_unlock_bh(&ar
->data_lock
);
3120 ar
->radar_enabled
= conf
->radar_enabled
;
3121 ath10k_recalc_radar_detection(ar
);
3123 if (!cfg80211_chandef_identical(&ar
->chandef
, &conf
->chandef
)) {
3124 ar
->chandef
= conf
->chandef
;
3125 ath10k_config_chan(ar
);
3129 if (changed
& IEEE80211_CONF_CHANGE_PS
)
3130 ath10k_config_ps(ar
);
3132 if (changed
& IEEE80211_CONF_CHANGE_MONITOR
) {
3133 ar
->monitor
= conf
->flags
& IEEE80211_CONF_MONITOR
;
3134 ret
= ath10k_monitor_recalc(ar
);
3136 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
3139 mutex_unlock(&ar
->conf_mutex
);
3143 static u32
get_nss_from_chainmask(u16 chain_mask
)
3145 if ((chain_mask
& 0x15) == 0x15)
3147 else if ((chain_mask
& 0x7) == 0x7)
3149 else if ((chain_mask
& 0x3) == 0x3)
3156 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
3157 * because we will send mgmt frames without CCK. This requirement
3158 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
3161 static int ath10k_add_interface(struct ieee80211_hw
*hw
,
3162 struct ieee80211_vif
*vif
)
3164 struct ath10k
*ar
= hw
->priv
;
3165 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3166 enum wmi_sta_powersave_param param
;
3172 vif
->driver_flags
|= IEEE80211_VIF_SUPPORTS_UAPSD
;
3174 mutex_lock(&ar
->conf_mutex
);
3176 memset(arvif
, 0, sizeof(*arvif
));
3181 INIT_LIST_HEAD(&arvif
->list
);
3183 if (ar
->free_vdev_map
== 0) {
3184 ath10k_warn(ar
, "Free vdev map is empty, no more interfaces allowed.\n");
3188 bit
= __ffs64(ar
->free_vdev_map
);
3190 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac create vdev %i map %llx\n",
3191 bit
, ar
->free_vdev_map
);
3193 arvif
->vdev_id
= bit
;
3194 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_NONE
;
3196 switch (vif
->type
) {
3197 case NL80211_IFTYPE_P2P_DEVICE
:
3198 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
3199 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_P2P_DEVICE
;
3201 case NL80211_IFTYPE_UNSPECIFIED
:
3202 case NL80211_IFTYPE_STATION
:
3203 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
3205 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_P2P_CLIENT
;
3207 case NL80211_IFTYPE_ADHOC
:
3208 arvif
->vdev_type
= WMI_VDEV_TYPE_IBSS
;
3210 case NL80211_IFTYPE_AP
:
3211 arvif
->vdev_type
= WMI_VDEV_TYPE_AP
;
3214 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_P2P_GO
;
3216 case NL80211_IFTYPE_MONITOR
:
3217 arvif
->vdev_type
= WMI_VDEV_TYPE_MONITOR
;
3224 /* Some firmware revisions don't wait for beacon tx completion before
3225 * sending another SWBA event. This could lead to hardware using old
3226 * (freed) beacon data in some cases, e.g. tx credit starvation
3227 * combined with missed TBTT. This is very very rare.
3229 * On non-IOMMU-enabled hosts this could be a possible security issue
3230 * because hw could beacon some random data on the air. On
3231 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
3232 * device would crash.
3234 * Since there are no beacon tx completions (implicit nor explicit)
3235 * propagated to host the only workaround for this is to allocate a
3236 * DMA-coherent buffer for a lifetime of a vif and use it for all
3237 * beacon tx commands. Worst case for this approach is some beacons may
3238 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
3240 if (vif
->type
== NL80211_IFTYPE_ADHOC
||
3241 vif
->type
== NL80211_IFTYPE_AP
) {
3242 arvif
->beacon_buf
= dma_zalloc_coherent(ar
->dev
,
3243 IEEE80211_MAX_FRAME_LEN
,
3244 &arvif
->beacon_paddr
,
3246 if (!arvif
->beacon_buf
) {
3248 ath10k_warn(ar
, "failed to allocate beacon buffer: %d\n",
3254 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
3255 arvif
->vdev_id
, arvif
->vdev_type
, arvif
->vdev_subtype
,
3256 arvif
->beacon_buf
? "single-buf" : "per-skb");
3258 ret
= ath10k_wmi_vdev_create(ar
, arvif
->vdev_id
, arvif
->vdev_type
,
3259 arvif
->vdev_subtype
, vif
->addr
);
3261 ath10k_warn(ar
, "failed to create WMI vdev %i: %d\n",
3262 arvif
->vdev_id
, ret
);
3266 ar
->free_vdev_map
&= ~(1LL << arvif
->vdev_id
);
3267 list_add(&arvif
->list
, &ar
->arvifs
);
3269 /* It makes no sense to have firmware do keepalives. mac80211 already
3270 * takes care of this with idle connection polling.
3272 ret
= ath10k_mac_vif_disable_keepalive(arvif
);
3274 ath10k_warn(ar
, "failed to disable keepalive on vdev %i: %d\n",
3275 arvif
->vdev_id
, ret
);
3276 goto err_vdev_delete
;
3279 arvif
->def_wep_key_idx
= -1;
3281 vdev_param
= ar
->wmi
.vdev_param
->tx_encap_type
;
3282 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3283 ATH10K_HW_TXRX_NATIVE_WIFI
);
3284 /* 10.X firmware does not support this VDEV parameter. Do not warn */
3285 if (ret
&& ret
!= -EOPNOTSUPP
) {
3286 ath10k_warn(ar
, "failed to set vdev %i TX encapsulation: %d\n",
3287 arvif
->vdev_id
, ret
);
3288 goto err_vdev_delete
;
3291 if (ar
->cfg_tx_chainmask
) {
3292 u16 nss
= get_nss_from_chainmask(ar
->cfg_tx_chainmask
);
3294 vdev_param
= ar
->wmi
.vdev_param
->nss
;
3295 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3298 ath10k_warn(ar
, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
3299 arvif
->vdev_id
, ar
->cfg_tx_chainmask
, nss
,
3301 goto err_vdev_delete
;
3305 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
3306 ret
= ath10k_peer_create(ar
, arvif
->vdev_id
, vif
->addr
);
3308 ath10k_warn(ar
, "failed to create vdev %i peer for AP: %d\n",
3309 arvif
->vdev_id
, ret
);
3310 goto err_vdev_delete
;
3313 ret
= ath10k_mac_set_kickout(arvif
);
3315 ath10k_warn(ar
, "failed to set vdev %i kickout parameters: %d\n",
3316 arvif
->vdev_id
, ret
);
3317 goto err_peer_delete
;
3321 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
) {
3322 param
= WMI_STA_PS_PARAM_RX_WAKE_POLICY
;
3323 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
3324 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
3327 ath10k_warn(ar
, "failed to set vdev %i RX wake policy: %d\n",
3328 arvif
->vdev_id
, ret
);
3329 goto err_peer_delete
;
3332 ret
= ath10k_mac_vif_recalc_ps_wake_threshold(arvif
);
3334 ath10k_warn(ar
, "failed to recalc ps wake threshold on vdev %i: %d\n",
3335 arvif
->vdev_id
, ret
);
3336 goto err_peer_delete
;
3339 ret
= ath10k_mac_vif_recalc_ps_poll_count(arvif
);
3341 ath10k_warn(ar
, "failed to recalc ps poll count on vdev %i: %d\n",
3342 arvif
->vdev_id
, ret
);
3343 goto err_peer_delete
;
3347 ret
= ath10k_mac_set_rts(arvif
, ar
->hw
->wiphy
->rts_threshold
);
3349 ath10k_warn(ar
, "failed to set rts threshold for vdev %d: %d\n",
3350 arvif
->vdev_id
, ret
);
3351 goto err_peer_delete
;
3354 ret
= ath10k_mac_set_frag(arvif
, ar
->hw
->wiphy
->frag_threshold
);
3356 ath10k_warn(ar
, "failed to set frag threshold for vdev %d: %d\n",
3357 arvif
->vdev_id
, ret
);
3358 goto err_peer_delete
;
3361 arvif
->txpower
= vif
->bss_conf
.txpower
;
3362 ret
= ath10k_mac_txpower_recalc(ar
);
3364 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
3365 goto err_peer_delete
;
3368 mutex_unlock(&ar
->conf_mutex
);
3372 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
)
3373 ath10k_wmi_peer_delete(ar
, arvif
->vdev_id
, vif
->addr
);
3376 ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
3377 ar
->free_vdev_map
|= 1LL << arvif
->vdev_id
;
3378 list_del(&arvif
->list
);
3381 if (arvif
->beacon_buf
) {
3382 dma_free_coherent(ar
->dev
, IEEE80211_MAX_FRAME_LEN
,
3383 arvif
->beacon_buf
, arvif
->beacon_paddr
);
3384 arvif
->beacon_buf
= NULL
;
3387 mutex_unlock(&ar
->conf_mutex
);
3392 static void ath10k_remove_interface(struct ieee80211_hw
*hw
,
3393 struct ieee80211_vif
*vif
)
3395 struct ath10k
*ar
= hw
->priv
;
3396 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3399 mutex_lock(&ar
->conf_mutex
);
3401 spin_lock_bh(&ar
->data_lock
);
3402 ath10k_mac_vif_beacon_cleanup(arvif
);
3403 spin_unlock_bh(&ar
->data_lock
);
3405 ret
= ath10k_spectral_vif_stop(arvif
);
3407 ath10k_warn(ar
, "failed to stop spectral for vdev %i: %d\n",
3408 arvif
->vdev_id
, ret
);
3410 ar
->free_vdev_map
|= 1LL << arvif
->vdev_id
;
3411 list_del(&arvif
->list
);
3413 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
3414 ret
= ath10k_wmi_peer_delete(arvif
->ar
, arvif
->vdev_id
,
3417 ath10k_warn(ar
, "failed to submit AP self-peer removal on vdev %i: %d\n",
3418 arvif
->vdev_id
, ret
);
3420 kfree(arvif
->u
.ap
.noa_data
);
3423 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i delete (remove interface)\n",
3426 ret
= ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
3428 ath10k_warn(ar
, "failed to delete WMI vdev %i: %d\n",
3429 arvif
->vdev_id
, ret
);
3431 /* Some firmware revisions don't notify host about self-peer removal
3432 * until after associated vdev is deleted.
3434 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
3435 ret
= ath10k_wait_for_peer_deleted(ar
, arvif
->vdev_id
,
3438 ath10k_warn(ar
, "failed to remove AP self-peer on vdev %i: %d\n",
3439 arvif
->vdev_id
, ret
);
3441 spin_lock_bh(&ar
->data_lock
);
3443 spin_unlock_bh(&ar
->data_lock
);
3446 ath10k_peer_cleanup(ar
, arvif
->vdev_id
);
3448 mutex_unlock(&ar
->conf_mutex
);
3452 * FIXME: Has to be verified.
3454 #define SUPPORTED_FILTERS \
3455 (FIF_PROMISC_IN_BSS | \
3460 FIF_BCN_PRBRESP_PROMISC | \
3464 static void ath10k_configure_filter(struct ieee80211_hw
*hw
,
3465 unsigned int changed_flags
,
3466 unsigned int *total_flags
,
3469 struct ath10k
*ar
= hw
->priv
;
3472 mutex_lock(&ar
->conf_mutex
);
3474 changed_flags
&= SUPPORTED_FILTERS
;
3475 *total_flags
&= SUPPORTED_FILTERS
;
3476 ar
->filter_flags
= *total_flags
;
3478 ret
= ath10k_monitor_recalc(ar
);
3480 ath10k_warn(ar
, "failed to recalc montior: %d\n", ret
);
3482 mutex_unlock(&ar
->conf_mutex
);
3485 static void ath10k_bss_info_changed(struct ieee80211_hw
*hw
,
3486 struct ieee80211_vif
*vif
,
3487 struct ieee80211_bss_conf
*info
,
3490 struct ath10k
*ar
= hw
->priv
;
3491 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3493 u32 vdev_param
, pdev_param
, slottime
, preamble
;
3495 mutex_lock(&ar
->conf_mutex
);
3497 if (changed
& BSS_CHANGED_IBSS
)
3498 ath10k_control_ibss(arvif
, info
, vif
->addr
);
3500 if (changed
& BSS_CHANGED_BEACON_INT
) {
3501 arvif
->beacon_interval
= info
->beacon_int
;
3502 vdev_param
= ar
->wmi
.vdev_param
->beacon_interval
;
3503 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3504 arvif
->beacon_interval
);
3505 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
3506 "mac vdev %d beacon_interval %d\n",
3507 arvif
->vdev_id
, arvif
->beacon_interval
);
3510 ath10k_warn(ar
, "failed to set beacon interval for vdev %d: %i\n",
3511 arvif
->vdev_id
, ret
);
3514 if (changed
& BSS_CHANGED_BEACON
) {
3515 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
3516 "vdev %d set beacon tx mode to staggered\n",
3519 pdev_param
= ar
->wmi
.pdev_param
->beacon_tx_mode
;
3520 ret
= ath10k_wmi_pdev_set_param(ar
, pdev_param
,
3521 WMI_BEACON_STAGGERED_MODE
);
3523 ath10k_warn(ar
, "failed to set beacon mode for vdev %d: %i\n",
3524 arvif
->vdev_id
, ret
);
3526 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
3528 ath10k_warn(ar
, "failed to update beacon template: %d\n",
3532 if (changed
& BSS_CHANGED_AP_PROBE_RESP
) {
3533 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
3535 ath10k_warn(ar
, "failed to setup probe resp template on vdev %i: %d\n",
3536 arvif
->vdev_id
, ret
);
3539 if (changed
& (BSS_CHANGED_BEACON_INFO
| BSS_CHANGED_BEACON
)) {
3540 arvif
->dtim_period
= info
->dtim_period
;
3542 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
3543 "mac vdev %d dtim_period %d\n",
3544 arvif
->vdev_id
, arvif
->dtim_period
);
3546 vdev_param
= ar
->wmi
.vdev_param
->dtim_period
;
3547 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3548 arvif
->dtim_period
);
3550 ath10k_warn(ar
, "failed to set dtim period for vdev %d: %i\n",
3551 arvif
->vdev_id
, ret
);
3554 if (changed
& BSS_CHANGED_SSID
&&
3555 vif
->type
== NL80211_IFTYPE_AP
) {
3556 arvif
->u
.ap
.ssid_len
= info
->ssid_len
;
3558 memcpy(arvif
->u
.ap
.ssid
, info
->ssid
, info
->ssid_len
);
3559 arvif
->u
.ap
.hidden_ssid
= info
->hidden_ssid
;
3562 if (changed
& BSS_CHANGED_BSSID
&& !is_zero_ether_addr(info
->bssid
))
3563 ether_addr_copy(arvif
->bssid
, info
->bssid
);
3565 if (changed
& BSS_CHANGED_BEACON_ENABLED
)
3566 ath10k_control_beaconing(arvif
, info
);
3568 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
3569 arvif
->use_cts_prot
= info
->use_cts_prot
;
3570 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d cts_prot %d\n",
3571 arvif
->vdev_id
, info
->use_cts_prot
);
3573 ret
= ath10k_recalc_rtscts_prot(arvif
);
3575 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3576 arvif
->vdev_id
, ret
);
3579 if (changed
& BSS_CHANGED_ERP_SLOT
) {
3580 if (info
->use_short_slot
)
3581 slottime
= WMI_VDEV_SLOT_TIME_SHORT
; /* 9us */
3584 slottime
= WMI_VDEV_SLOT_TIME_LONG
; /* 20us */
3586 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d slot_time %d\n",
3587 arvif
->vdev_id
, slottime
);
3589 vdev_param
= ar
->wmi
.vdev_param
->slot_time
;
3590 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3593 ath10k_warn(ar
, "failed to set erp slot for vdev %d: %i\n",
3594 arvif
->vdev_id
, ret
);
3597 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
3598 if (info
->use_short_preamble
)
3599 preamble
= WMI_VDEV_PREAMBLE_SHORT
;
3601 preamble
= WMI_VDEV_PREAMBLE_LONG
;
3603 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
3604 "mac vdev %d preamble %dn",
3605 arvif
->vdev_id
, preamble
);
3607 vdev_param
= ar
->wmi
.vdev_param
->preamble
;
3608 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3611 ath10k_warn(ar
, "failed to set preamble for vdev %d: %i\n",
3612 arvif
->vdev_id
, ret
);
3615 if (changed
& BSS_CHANGED_ASSOC
) {
3617 /* Workaround: Make sure monitor vdev is not running
3618 * when associating to prevent some firmware revisions
3619 * (e.g. 10.1 and 10.2) from crashing.
3621 if (ar
->monitor_started
)
3622 ath10k_monitor_stop(ar
);
3623 ath10k_bss_assoc(hw
, vif
, info
);
3624 ath10k_monitor_recalc(ar
);
3626 ath10k_bss_disassoc(hw
, vif
);
3630 if (changed
& BSS_CHANGED_TXPOWER
) {
3631 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev_id %i txpower %d\n",
3632 arvif
->vdev_id
, info
->txpower
);
3634 arvif
->txpower
= info
->txpower
;
3635 ret
= ath10k_mac_txpower_recalc(ar
);
3637 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
3640 if (changed
& BSS_CHANGED_PS
) {
3641 ret
= ath10k_mac_vif_setup_ps(arvif
);
3643 ath10k_warn(ar
, "failed to setup ps on vdev %i: %d\n",
3644 arvif
->vdev_id
, ret
);
3647 mutex_unlock(&ar
->conf_mutex
);
3650 static int ath10k_hw_scan(struct ieee80211_hw
*hw
,
3651 struct ieee80211_vif
*vif
,
3652 struct ieee80211_scan_request
*hw_req
)
3654 struct ath10k
*ar
= hw
->priv
;
3655 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3656 struct cfg80211_scan_request
*req
= &hw_req
->req
;
3657 struct wmi_start_scan_arg arg
;
3661 mutex_lock(&ar
->conf_mutex
);
3663 spin_lock_bh(&ar
->data_lock
);
3664 switch (ar
->scan
.state
) {
3665 case ATH10K_SCAN_IDLE
:
3666 reinit_completion(&ar
->scan
.started
);
3667 reinit_completion(&ar
->scan
.completed
);
3668 ar
->scan
.state
= ATH10K_SCAN_STARTING
;
3669 ar
->scan
.is_roc
= false;
3670 ar
->scan
.vdev_id
= arvif
->vdev_id
;
3673 case ATH10K_SCAN_STARTING
:
3674 case ATH10K_SCAN_RUNNING
:
3675 case ATH10K_SCAN_ABORTING
:
3679 spin_unlock_bh(&ar
->data_lock
);
3684 memset(&arg
, 0, sizeof(arg
));
3685 ath10k_wmi_start_scan_init(ar
, &arg
);
3686 arg
.vdev_id
= arvif
->vdev_id
;
3687 arg
.scan_id
= ATH10K_SCAN_ID
;
3690 arg
.scan_ctrl_flags
|= WMI_SCAN_ADD_CCK_RATES
;
3693 arg
.ie_len
= req
->ie_len
;
3694 memcpy(arg
.ie
, req
->ie
, arg
.ie_len
);
3698 arg
.n_ssids
= req
->n_ssids
;
3699 for (i
= 0; i
< arg
.n_ssids
; i
++) {
3700 arg
.ssids
[i
].len
= req
->ssids
[i
].ssid_len
;
3701 arg
.ssids
[i
].ssid
= req
->ssids
[i
].ssid
;
3704 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
3707 if (req
->n_channels
) {
3708 arg
.n_channels
= req
->n_channels
;
3709 for (i
= 0; i
< arg
.n_channels
; i
++)
3710 arg
.channels
[i
] = req
->channels
[i
]->center_freq
;
3713 ret
= ath10k_start_scan(ar
, &arg
);
3715 ath10k_warn(ar
, "failed to start hw scan: %d\n", ret
);
3716 spin_lock_bh(&ar
->data_lock
);
3717 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
3718 spin_unlock_bh(&ar
->data_lock
);
3722 mutex_unlock(&ar
->conf_mutex
);
3726 static void ath10k_cancel_hw_scan(struct ieee80211_hw
*hw
,
3727 struct ieee80211_vif
*vif
)
3729 struct ath10k
*ar
= hw
->priv
;
3731 mutex_lock(&ar
->conf_mutex
);
3732 ath10k_scan_abort(ar
);
3733 mutex_unlock(&ar
->conf_mutex
);
3735 cancel_delayed_work_sync(&ar
->scan
.timeout
);
3738 static void ath10k_set_key_h_def_keyidx(struct ath10k
*ar
,
3739 struct ath10k_vif
*arvif
,
3740 enum set_key_cmd cmd
,
3741 struct ieee80211_key_conf
*key
)
3743 u32 vdev_param
= arvif
->ar
->wmi
.vdev_param
->def_keyid
;
3746 /* 10.1 firmware branch requires default key index to be set to group
3747 * key index after installing it. Otherwise FW/HW Txes corrupted
3748 * frames with multi-vif APs. This is not required for main firmware
3749 * branch (e.g. 636).
3751 * FIXME: This has been tested only in AP. It remains unknown if this
3752 * is required for multi-vif STA interfaces on 10.1 */
3754 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
3757 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP40
)
3760 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP104
)
3763 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
3769 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3772 ath10k_warn(ar
, "failed to set vdev %i group key as default key: %d\n",
3773 arvif
->vdev_id
, ret
);
3776 static int ath10k_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
3777 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
,
3778 struct ieee80211_key_conf
*key
)
3780 struct ath10k
*ar
= hw
->priv
;
3781 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3782 struct ath10k_peer
*peer
;
3783 const u8
*peer_addr
;
3784 bool is_wep
= key
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
3785 key
->cipher
== WLAN_CIPHER_SUITE_WEP104
;
3786 bool def_idx
= false;
3789 if (key
->keyidx
> WMI_MAX_KEY_INDEX
)
3792 mutex_lock(&ar
->conf_mutex
);
3795 peer_addr
= sta
->addr
;
3796 else if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
)
3797 peer_addr
= vif
->bss_conf
.bssid
;
3799 peer_addr
= vif
->addr
;
3801 key
->hw_key_idx
= key
->keyidx
;
3803 /* the peer should not disappear in mid-way (unless FW goes awry) since
3804 * we already hold conf_mutex. we just make sure its there now. */
3805 spin_lock_bh(&ar
->data_lock
);
3806 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
3807 spin_unlock_bh(&ar
->data_lock
);
3810 if (cmd
== SET_KEY
) {
3811 ath10k_warn(ar
, "failed to install key for non-existent peer %pM\n",
3816 /* if the peer doesn't exist there is no key to disable
3824 arvif
->wep_keys
[key
->keyidx
] = key
;
3826 arvif
->wep_keys
[key
->keyidx
] = NULL
;
3828 if (cmd
== DISABLE_KEY
)
3829 ath10k_clear_vdev_key(arvif
, key
);
3832 /* set TX_USAGE flag for all the keys incase of dot1x-WEP. For
3833 * static WEP, do not set this flag for the keys whose key id
3834 * is greater than default key id.
3836 if (arvif
->def_wep_key_idx
== -1)
3839 ret
= ath10k_install_key(arvif
, key
, cmd
, peer_addr
, def_idx
);
3841 ath10k_warn(ar
, "failed to install key for vdev %i peer %pM: %d\n",
3842 arvif
->vdev_id
, peer_addr
, ret
);
3846 ath10k_set_key_h_def_keyidx(ar
, arvif
, cmd
, key
);
3848 spin_lock_bh(&ar
->data_lock
);
3849 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
3850 if (peer
&& cmd
== SET_KEY
)
3851 peer
->keys
[key
->keyidx
] = key
;
3852 else if (peer
&& cmd
== DISABLE_KEY
)
3853 peer
->keys
[key
->keyidx
] = NULL
;
3854 else if (peer
== NULL
)
3855 /* impossible unless FW goes crazy */
3856 ath10k_warn(ar
, "Peer %pM disappeared!\n", peer_addr
);
3857 spin_unlock_bh(&ar
->data_lock
);
3860 mutex_unlock(&ar
->conf_mutex
);
3864 static void ath10k_set_default_unicast_key(struct ieee80211_hw
*hw
,
3865 struct ieee80211_vif
*vif
,
3868 struct ath10k
*ar
= hw
->priv
;
3869 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3872 mutex_lock(&arvif
->ar
->conf_mutex
);
3874 if (arvif
->ar
->state
!= ATH10K_STATE_ON
)
3877 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d set keyidx %d\n",
3878 arvif
->vdev_id
, keyidx
);
3880 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
,
3882 arvif
->ar
->wmi
.vdev_param
->def_keyid
,
3886 ath10k_warn(ar
, "failed to update wep key index for vdev %d: %d\n",
3892 arvif
->def_wep_key_idx
= keyidx
;
3894 mutex_unlock(&arvif
->ar
->conf_mutex
);
3897 static void ath10k_sta_rc_update_wk(struct work_struct
*wk
)
3900 struct ath10k_vif
*arvif
;
3901 struct ath10k_sta
*arsta
;
3902 struct ieee80211_sta
*sta
;
3903 u32 changed
, bw
, nss
, smps
;
3906 arsta
= container_of(wk
, struct ath10k_sta
, update_wk
);
3907 sta
= container_of((void *)arsta
, struct ieee80211_sta
, drv_priv
);
3908 arvif
= arsta
->arvif
;
3911 spin_lock_bh(&ar
->data_lock
);
3913 changed
= arsta
->changed
;
3920 spin_unlock_bh(&ar
->data_lock
);
3922 mutex_lock(&ar
->conf_mutex
);
3924 if (changed
& IEEE80211_RC_BW_CHANGED
) {
3925 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM peer bw %d\n",
3928 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
3929 WMI_PEER_CHAN_WIDTH
, bw
);
3931 ath10k_warn(ar
, "failed to update STA %pM peer bw %d: %d\n",
3932 sta
->addr
, bw
, err
);
3935 if (changed
& IEEE80211_RC_NSS_CHANGED
) {
3936 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM nss %d\n",
3939 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
3942 ath10k_warn(ar
, "failed to update STA %pM nss %d: %d\n",
3943 sta
->addr
, nss
, err
);
3946 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
3947 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM smps %d\n",
3950 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
3951 WMI_PEER_SMPS_STATE
, smps
);
3953 ath10k_warn(ar
, "failed to update STA %pM smps %d: %d\n",
3954 sta
->addr
, smps
, err
);
3957 if (changed
& IEEE80211_RC_SUPP_RATES_CHANGED
||
3958 changed
& IEEE80211_RC_NSS_CHANGED
) {
3959 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM supp rates/nss\n",
3962 err
= ath10k_station_assoc(ar
, arvif
->vif
, sta
, true);
3964 ath10k_warn(ar
, "failed to reassociate station: %pM\n",
3968 mutex_unlock(&ar
->conf_mutex
);
3971 static int ath10k_mac_inc_num_stations(struct ath10k_vif
*arvif
)
3973 struct ath10k
*ar
= arvif
->ar
;
3975 lockdep_assert_held(&ar
->conf_mutex
);
3977 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
&&
3978 arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
3981 if (ar
->num_stations
>= ar
->max_num_stations
)
3989 static void ath10k_mac_dec_num_stations(struct ath10k_vif
*arvif
)
3991 struct ath10k
*ar
= arvif
->ar
;
3993 lockdep_assert_held(&ar
->conf_mutex
);
3995 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
&&
3996 arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
4002 static int ath10k_sta_state(struct ieee80211_hw
*hw
,
4003 struct ieee80211_vif
*vif
,
4004 struct ieee80211_sta
*sta
,
4005 enum ieee80211_sta_state old_state
,
4006 enum ieee80211_sta_state new_state
)
4008 struct ath10k
*ar
= hw
->priv
;
4009 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4010 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
4013 if (old_state
== IEEE80211_STA_NOTEXIST
&&
4014 new_state
== IEEE80211_STA_NONE
) {
4015 memset(arsta
, 0, sizeof(*arsta
));
4016 arsta
->arvif
= arvif
;
4017 INIT_WORK(&arsta
->update_wk
, ath10k_sta_rc_update_wk
);
4020 /* cancel must be done outside the mutex to avoid deadlock */
4021 if ((old_state
== IEEE80211_STA_NONE
&&
4022 new_state
== IEEE80211_STA_NOTEXIST
))
4023 cancel_work_sync(&arsta
->update_wk
);
4025 mutex_lock(&ar
->conf_mutex
);
4027 if (old_state
== IEEE80211_STA_NOTEXIST
&&
4028 new_state
== IEEE80211_STA_NONE
) {
4030 * New station addition.
4032 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
4033 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
4034 arvif
->vdev_id
, sta
->addr
,
4035 ar
->num_stations
+ 1, ar
->max_num_stations
,
4036 ar
->num_peers
+ 1, ar
->max_num_peers
);
4038 ret
= ath10k_mac_inc_num_stations(arvif
);
4040 ath10k_warn(ar
, "refusing to associate station: too many connected already (%d)\n",
4041 ar
->max_num_stations
);
4045 ret
= ath10k_peer_create(ar
, arvif
->vdev_id
, sta
->addr
);
4047 ath10k_warn(ar
, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
4048 sta
->addr
, arvif
->vdev_id
, ret
);
4049 ath10k_mac_dec_num_stations(arvif
);
4053 if (vif
->type
== NL80211_IFTYPE_STATION
) {
4054 WARN_ON(arvif
->is_started
);
4056 ret
= ath10k_vdev_start(arvif
);
4058 ath10k_warn(ar
, "failed to start vdev %i: %d\n",
4059 arvif
->vdev_id
, ret
);
4060 WARN_ON(ath10k_peer_delete(ar
, arvif
->vdev_id
,
4062 ath10k_mac_dec_num_stations(arvif
);
4066 arvif
->is_started
= true;
4068 } else if ((old_state
== IEEE80211_STA_NONE
&&
4069 new_state
== IEEE80211_STA_NOTEXIST
)) {
4071 * Existing station deletion.
4073 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
4074 "mac vdev %d peer delete %pM (sta gone)\n",
4075 arvif
->vdev_id
, sta
->addr
);
4077 if (vif
->type
== NL80211_IFTYPE_STATION
) {
4078 WARN_ON(!arvif
->is_started
);
4080 ret
= ath10k_vdev_stop(arvif
);
4082 ath10k_warn(ar
, "failed to stop vdev %i: %d\n",
4083 arvif
->vdev_id
, ret
);
4085 arvif
->is_started
= false;
4088 ret
= ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
4090 ath10k_warn(ar
, "failed to delete peer %pM for vdev %d: %i\n",
4091 sta
->addr
, arvif
->vdev_id
, ret
);
4093 ath10k_mac_dec_num_stations(arvif
);
4094 } else if (old_state
== IEEE80211_STA_AUTH
&&
4095 new_state
== IEEE80211_STA_ASSOC
&&
4096 (vif
->type
== NL80211_IFTYPE_AP
||
4097 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
4101 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac sta %pM associated\n",
4104 ret
= ath10k_station_assoc(ar
, vif
, sta
, false);
4106 ath10k_warn(ar
, "failed to associate station %pM for vdev %i: %i\n",
4107 sta
->addr
, arvif
->vdev_id
, ret
);
4108 } else if (old_state
== IEEE80211_STA_ASSOC
&&
4109 new_state
== IEEE80211_STA_AUTH
&&
4110 (vif
->type
== NL80211_IFTYPE_AP
||
4111 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
4115 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac sta %pM disassociated\n",
4118 ret
= ath10k_station_disassoc(ar
, vif
, sta
);
4120 ath10k_warn(ar
, "failed to disassociate station: %pM vdev %i: %i\n",
4121 sta
->addr
, arvif
->vdev_id
, ret
);
4124 mutex_unlock(&ar
->conf_mutex
);
4128 static int ath10k_conf_tx_uapsd(struct ath10k
*ar
, struct ieee80211_vif
*vif
,
4129 u16 ac
, bool enable
)
4131 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4132 struct wmi_sta_uapsd_auto_trig_arg arg
= {};
4133 u32 prio
= 0, acc
= 0;
4137 lockdep_assert_held(&ar
->conf_mutex
);
4139 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
4143 case IEEE80211_AC_VO
:
4144 value
= WMI_STA_PS_UAPSD_AC3_DELIVERY_EN
|
4145 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN
;
4149 case IEEE80211_AC_VI
:
4150 value
= WMI_STA_PS_UAPSD_AC2_DELIVERY_EN
|
4151 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN
;
4155 case IEEE80211_AC_BE
:
4156 value
= WMI_STA_PS_UAPSD_AC1_DELIVERY_EN
|
4157 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN
;
4161 case IEEE80211_AC_BK
:
4162 value
= WMI_STA_PS_UAPSD_AC0_DELIVERY_EN
|
4163 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN
;
4170 arvif
->u
.sta
.uapsd
|= value
;
4172 arvif
->u
.sta
.uapsd
&= ~value
;
4174 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
4175 WMI_STA_PS_PARAM_UAPSD
,
4176 arvif
->u
.sta
.uapsd
);
4178 ath10k_warn(ar
, "failed to set uapsd params: %d\n", ret
);
4182 if (arvif
->u
.sta
.uapsd
)
4183 value
= WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD
;
4185 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
4187 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
4188 WMI_STA_PS_PARAM_RX_WAKE_POLICY
,
4191 ath10k_warn(ar
, "failed to set rx wake param: %d\n", ret
);
4193 ret
= ath10k_mac_vif_recalc_ps_wake_threshold(arvif
);
4195 ath10k_warn(ar
, "failed to recalc ps wake threshold on vdev %i: %d\n",
4196 arvif
->vdev_id
, ret
);
4200 ret
= ath10k_mac_vif_recalc_ps_poll_count(arvif
);
4202 ath10k_warn(ar
, "failed to recalc ps poll count on vdev %i: %d\n",
4203 arvif
->vdev_id
, ret
);
4207 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG
, ar
->wmi
.svc_map
) ||
4208 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG
, ar
->wmi
.svc_map
)) {
4209 /* Only userspace can make an educated decision when to send
4210 * trigger frame. The following effectively disables u-UAPSD
4211 * autotrigger in firmware (which is enabled by default
4212 * provided the autotrigger service is available).
4216 arg
.user_priority
= prio
;
4217 arg
.service_interval
= 0;
4218 arg
.suspend_interval
= WMI_STA_UAPSD_MAX_INTERVAL_MSEC
;
4219 arg
.delay_interval
= WMI_STA_UAPSD_MAX_INTERVAL_MSEC
;
4221 ret
= ath10k_wmi_vdev_sta_uapsd(ar
, arvif
->vdev_id
,
4222 arvif
->bssid
, &arg
, 1);
4224 ath10k_warn(ar
, "failed to set uapsd auto trigger %d\n",
4234 static int ath10k_conf_tx(struct ieee80211_hw
*hw
,
4235 struct ieee80211_vif
*vif
, u16 ac
,
4236 const struct ieee80211_tx_queue_params
*params
)
4238 struct ath10k
*ar
= hw
->priv
;
4239 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4240 struct wmi_wmm_params_arg
*p
= NULL
;
4243 mutex_lock(&ar
->conf_mutex
);
4246 case IEEE80211_AC_VO
:
4247 p
= &arvif
->wmm_params
.ac_vo
;
4249 case IEEE80211_AC_VI
:
4250 p
= &arvif
->wmm_params
.ac_vi
;
4252 case IEEE80211_AC_BE
:
4253 p
= &arvif
->wmm_params
.ac_be
;
4255 case IEEE80211_AC_BK
:
4256 p
= &arvif
->wmm_params
.ac_bk
;
4265 p
->cwmin
= params
->cw_min
;
4266 p
->cwmax
= params
->cw_max
;
4267 p
->aifs
= params
->aifs
;
4270 * The channel time duration programmed in the HW is in absolute
4271 * microseconds, while mac80211 gives the txop in units of
4274 p
->txop
= params
->txop
* 32;
4276 if (ar
->wmi
.ops
->gen_vdev_wmm_conf
) {
4277 ret
= ath10k_wmi_vdev_wmm_conf(ar
, arvif
->vdev_id
,
4278 &arvif
->wmm_params
);
4280 ath10k_warn(ar
, "failed to set vdev wmm params on vdev %i: %d\n",
4281 arvif
->vdev_id
, ret
);
4285 /* This won't work well with multi-interface cases but it's
4286 * better than nothing.
4288 ret
= ath10k_wmi_pdev_set_wmm_params(ar
, &arvif
->wmm_params
);
4290 ath10k_warn(ar
, "failed to set wmm params: %d\n", ret
);
4295 ret
= ath10k_conf_tx_uapsd(ar
, vif
, ac
, params
->uapsd
);
4297 ath10k_warn(ar
, "failed to set sta uapsd: %d\n", ret
);
4300 mutex_unlock(&ar
->conf_mutex
);
4304 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
4306 static int ath10k_remain_on_channel(struct ieee80211_hw
*hw
,
4307 struct ieee80211_vif
*vif
,
4308 struct ieee80211_channel
*chan
,
4310 enum ieee80211_roc_type type
)
4312 struct ath10k
*ar
= hw
->priv
;
4313 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4314 struct wmi_start_scan_arg arg
;
4317 mutex_lock(&ar
->conf_mutex
);
4319 spin_lock_bh(&ar
->data_lock
);
4320 switch (ar
->scan
.state
) {
4321 case ATH10K_SCAN_IDLE
:
4322 reinit_completion(&ar
->scan
.started
);
4323 reinit_completion(&ar
->scan
.completed
);
4324 reinit_completion(&ar
->scan
.on_channel
);
4325 ar
->scan
.state
= ATH10K_SCAN_STARTING
;
4326 ar
->scan
.is_roc
= true;
4327 ar
->scan
.vdev_id
= arvif
->vdev_id
;
4328 ar
->scan
.roc_freq
= chan
->center_freq
;
4331 case ATH10K_SCAN_STARTING
:
4332 case ATH10K_SCAN_RUNNING
:
4333 case ATH10K_SCAN_ABORTING
:
4337 spin_unlock_bh(&ar
->data_lock
);
4342 duration
= max(duration
, WMI_SCAN_CHAN_MIN_TIME_MSEC
);
4344 memset(&arg
, 0, sizeof(arg
));
4345 ath10k_wmi_start_scan_init(ar
, &arg
);
4346 arg
.vdev_id
= arvif
->vdev_id
;
4347 arg
.scan_id
= ATH10K_SCAN_ID
;
4349 arg
.channels
[0] = chan
->center_freq
;
4350 arg
.dwell_time_active
= duration
;
4351 arg
.dwell_time_passive
= duration
;
4352 arg
.max_scan_time
= 2 * duration
;
4353 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
4354 arg
.scan_ctrl_flags
|= WMI_SCAN_FILTER_PROBE_REQ
;
4356 ret
= ath10k_start_scan(ar
, &arg
);
4358 ath10k_warn(ar
, "failed to start roc scan: %d\n", ret
);
4359 spin_lock_bh(&ar
->data_lock
);
4360 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
4361 spin_unlock_bh(&ar
->data_lock
);
4365 ret
= wait_for_completion_timeout(&ar
->scan
.on_channel
, 3*HZ
);
4367 ath10k_warn(ar
, "failed to switch to channel for roc scan\n");
4369 ret
= ath10k_scan_stop(ar
);
4371 ath10k_warn(ar
, "failed to stop scan: %d\n", ret
);
4379 mutex_unlock(&ar
->conf_mutex
);
4383 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw
*hw
)
4385 struct ath10k
*ar
= hw
->priv
;
4387 mutex_lock(&ar
->conf_mutex
);
4388 ath10k_scan_abort(ar
);
4389 mutex_unlock(&ar
->conf_mutex
);
4391 cancel_delayed_work_sync(&ar
->scan
.timeout
);
4397 * Both RTS and Fragmentation threshold are interface-specific
4398 * in ath10k, but device-specific in mac80211.
4401 static int ath10k_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
4403 struct ath10k
*ar
= hw
->priv
;
4404 struct ath10k_vif
*arvif
;
4407 mutex_lock(&ar
->conf_mutex
);
4408 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
4409 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d rts threshold %d\n",
4410 arvif
->vdev_id
, value
);
4412 ret
= ath10k_mac_set_rts(arvif
, value
);
4414 ath10k_warn(ar
, "failed to set rts threshold for vdev %d: %d\n",
4415 arvif
->vdev_id
, ret
);
4419 mutex_unlock(&ar
->conf_mutex
);
4424 static void ath10k_flush(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
4425 u32 queues
, bool drop
)
4427 struct ath10k
*ar
= hw
->priv
;
4431 /* mac80211 doesn't care if we really xmit queued frames or not
4432 * we'll collect those frames either way if we stop/delete vdevs */
4436 mutex_lock(&ar
->conf_mutex
);
4438 if (ar
->state
== ATH10K_STATE_WEDGED
)
4441 ret
= wait_event_timeout(ar
->htt
.empty_tx_wq
, ({
4444 spin_lock_bh(&ar
->htt
.tx_lock
);
4445 empty
= (ar
->htt
.num_pending_tx
== 0);
4446 spin_unlock_bh(&ar
->htt
.tx_lock
);
4448 skip
= (ar
->state
== ATH10K_STATE_WEDGED
) ||
4449 test_bit(ATH10K_FLAG_CRASH_FLUSH
,
4453 }), ATH10K_FLUSH_TIMEOUT_HZ
);
4455 if (ret
<= 0 || skip
)
4456 ath10k_warn(ar
, "failed to flush transmit queue (skip %i ar-state %i): %i\n",
4457 skip
, ar
->state
, ret
);
4460 mutex_unlock(&ar
->conf_mutex
);
4463 /* TODO: Implement this function properly
4464 * For now it is needed to reply to Probe Requests in IBSS mode.
4465 * Propably we need this information from FW.
4467 static int ath10k_tx_last_beacon(struct ieee80211_hw
*hw
)
4473 static int ath10k_suspend(struct ieee80211_hw
*hw
,
4474 struct cfg80211_wowlan
*wowlan
)
4476 struct ath10k
*ar
= hw
->priv
;
4479 mutex_lock(&ar
->conf_mutex
);
4481 ret
= ath10k_wait_for_suspend(ar
, WMI_PDEV_SUSPEND
);
4483 if (ret
== -ETIMEDOUT
)
4489 ret
= ath10k_hif_suspend(ar
);
4491 ath10k_warn(ar
, "failed to suspend hif: %d\n", ret
);
4498 ret
= ath10k_wmi_pdev_resume_target(ar
);
4500 ath10k_warn(ar
, "failed to resume target: %d\n", ret
);
4504 mutex_unlock(&ar
->conf_mutex
);
4508 static int ath10k_resume(struct ieee80211_hw
*hw
)
4510 struct ath10k
*ar
= hw
->priv
;
4513 mutex_lock(&ar
->conf_mutex
);
4515 ret
= ath10k_hif_resume(ar
);
4517 ath10k_warn(ar
, "failed to resume hif: %d\n", ret
);
4522 ret
= ath10k_wmi_pdev_resume_target(ar
);
4524 ath10k_warn(ar
, "failed to resume target: %d\n", ret
);
4531 mutex_unlock(&ar
->conf_mutex
);
4536 static void ath10k_reconfig_complete(struct ieee80211_hw
*hw
,
4537 enum ieee80211_reconfig_type reconfig_type
)
4539 struct ath10k
*ar
= hw
->priv
;
4541 if (reconfig_type
!= IEEE80211_RECONFIG_TYPE_RESTART
)
4544 mutex_lock(&ar
->conf_mutex
);
4546 /* If device failed to restart it will be in a different state, e.g.
4547 * ATH10K_STATE_WEDGED */
4548 if (ar
->state
== ATH10K_STATE_RESTARTED
) {
4549 ath10k_info(ar
, "device successfully recovered\n");
4550 ar
->state
= ATH10K_STATE_ON
;
4551 ieee80211_wake_queues(ar
->hw
);
4554 mutex_unlock(&ar
->conf_mutex
);
4557 static int ath10k_get_survey(struct ieee80211_hw
*hw
, int idx
,
4558 struct survey_info
*survey
)
4560 struct ath10k
*ar
= hw
->priv
;
4561 struct ieee80211_supported_band
*sband
;
4562 struct survey_info
*ar_survey
= &ar
->survey
[idx
];
4565 mutex_lock(&ar
->conf_mutex
);
4567 sband
= hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
];
4568 if (sband
&& idx
>= sband
->n_channels
) {
4569 idx
-= sband
->n_channels
;
4574 sband
= hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
];
4576 if (!sband
|| idx
>= sband
->n_channels
) {
4581 spin_lock_bh(&ar
->data_lock
);
4582 memcpy(survey
, ar_survey
, sizeof(*survey
));
4583 spin_unlock_bh(&ar
->data_lock
);
4585 survey
->channel
= &sband
->channels
[idx
];
4587 if (ar
->rx_channel
== survey
->channel
)
4588 survey
->filled
|= SURVEY_INFO_IN_USE
;
4591 mutex_unlock(&ar
->conf_mutex
);
4595 /* Helper table for legacy fixed_rate/bitrate_mask */
4596 static const u8 cck_ofdm_rate
[] = {
4613 /* Check if only one bit set */
4614 static int ath10k_check_single_mask(u32 mask
)
4622 mask
&= ~BIT(bit
- 1);
4630 ath10k_default_bitrate_mask(struct ath10k
*ar
,
4631 enum ieee80211_band band
,
4632 const struct cfg80211_bitrate_mask
*mask
)
4634 u32 legacy
= 0x00ff;
4637 u16 nrf
= ar
->num_rf_chains
;
4639 if (ar
->cfg_tx_chainmask
)
4640 nrf
= get_nss_from_chainmask(ar
->cfg_tx_chainmask
);
4643 case IEEE80211_BAND_2GHZ
:
4647 case IEEE80211_BAND_5GHZ
:
4653 if (mask
->control
[band
].legacy
!= legacy
)
4656 for (i
= 0; i
< nrf
; i
++)
4657 if (mask
->control
[band
].ht_mcs
[i
] != ht
)
4660 for (i
= 0; i
< nrf
; i
++)
4661 if (mask
->control
[band
].vht_mcs
[i
] != vht
)
4668 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask
*mask
,
4669 enum ieee80211_band band
,
4672 int ht_nss
= 0, vht_nss
= 0, i
;
4675 if (ath10k_check_single_mask(mask
->control
[band
].legacy
))
4679 for (i
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
; i
++) {
4680 if (mask
->control
[band
].ht_mcs
[i
] == 0xff)
4682 else if (mask
->control
[band
].ht_mcs
[i
] == 0x00)
4691 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++) {
4692 if (mask
->control
[band
].vht_mcs
[i
] == 0x03ff)
4694 else if (mask
->control
[band
].vht_mcs
[i
] == 0x0000)
4702 if (ht_nss
> 0 && vht_nss
> 0)
4706 *fixed_nss
= ht_nss
;
4708 *fixed_nss
= vht_nss
;
4716 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask
*mask
,
4717 enum ieee80211_band band
,
4718 enum wmi_rate_preamble
*preamble
)
4720 int legacy
= 0, ht
= 0, vht
= 0, i
;
4722 *preamble
= WMI_RATE_PREAMBLE_OFDM
;
4725 legacy
= ath10k_check_single_mask(mask
->control
[band
].legacy
);
4730 for (i
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
; i
++)
4731 ht
+= ath10k_check_single_mask(mask
->control
[band
].ht_mcs
[i
]);
4736 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++)
4737 vht
+= ath10k_check_single_mask(mask
->control
[band
].vht_mcs
[i
]);
4741 /* Currently we support only one fixed_rate */
4742 if ((legacy
+ ht
+ vht
) != 1)
4746 *preamble
= WMI_RATE_PREAMBLE_HT
;
4748 *preamble
= WMI_RATE_PREAMBLE_VHT
;
4754 ath10k_bitrate_mask_rate(struct ath10k
*ar
,
4755 const struct cfg80211_bitrate_mask
*mask
,
4756 enum ieee80211_band band
,
4760 u8 rate
= 0, pream
= 0, nss
= 0, i
;
4761 enum wmi_rate_preamble preamble
;
4763 /* Check if single rate correct */
4764 if (!ath10k_bitrate_mask_correct(mask
, band
, &preamble
))
4770 case WMI_RATE_PREAMBLE_CCK
:
4771 case WMI_RATE_PREAMBLE_OFDM
:
4772 i
= ffs(mask
->control
[band
].legacy
) - 1;
4774 if (band
== IEEE80211_BAND_2GHZ
&& i
< 4)
4775 pream
= WMI_RATE_PREAMBLE_CCK
;
4777 if (band
== IEEE80211_BAND_5GHZ
)
4780 if (i
>= ARRAY_SIZE(cck_ofdm_rate
))
4783 rate
= cck_ofdm_rate
[i
];
4785 case WMI_RATE_PREAMBLE_HT
:
4786 for (i
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
; i
++)
4787 if (mask
->control
[band
].ht_mcs
[i
])
4790 if (i
== IEEE80211_HT_MCS_MASK_LEN
)
4793 rate
= ffs(mask
->control
[band
].ht_mcs
[i
]) - 1;
4796 case WMI_RATE_PREAMBLE_VHT
:
4797 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++)
4798 if (mask
->control
[band
].vht_mcs
[i
])
4801 if (i
== NL80211_VHT_NSS_MAX
)
4804 rate
= ffs(mask
->control
[band
].vht_mcs
[i
]) - 1;
4809 *fixed_nss
= nss
+ 1;
4813 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4816 *fixed_rate
= pream
| nss
| rate
;
4821 static bool ath10k_get_fixed_rate_nss(struct ath10k
*ar
,
4822 const struct cfg80211_bitrate_mask
*mask
,
4823 enum ieee80211_band band
,
4827 /* First check full NSS mask, if we can simply limit NSS */
4828 if (ath10k_bitrate_mask_nss(mask
, band
, fixed_nss
))
4831 /* Next Check single rate is set */
4832 return ath10k_bitrate_mask_rate(ar
, mask
, band
, fixed_rate
, fixed_nss
);
4835 static int ath10k_set_fixed_rate_param(struct ath10k_vif
*arvif
,
4840 struct ath10k
*ar
= arvif
->ar
;
4844 mutex_lock(&ar
->conf_mutex
);
4846 if (arvif
->fixed_rate
== fixed_rate
&&
4847 arvif
->fixed_nss
== fixed_nss
&&
4848 arvif
->force_sgi
== force_sgi
)
4851 if (fixed_rate
== WMI_FIXED_RATE_NONE
)
4852 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac disable fixed bitrate mask\n");
4855 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac force sgi\n");
4857 vdev_param
= ar
->wmi
.vdev_param
->fixed_rate
;
4858 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
4859 vdev_param
, fixed_rate
);
4861 ath10k_warn(ar
, "failed to set fixed rate param 0x%02x: %d\n",
4867 arvif
->fixed_rate
= fixed_rate
;
4869 vdev_param
= ar
->wmi
.vdev_param
->nss
;
4870 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
4871 vdev_param
, fixed_nss
);
4874 ath10k_warn(ar
, "failed to set fixed nss param %d: %d\n",
4880 arvif
->fixed_nss
= fixed_nss
;
4882 vdev_param
= ar
->wmi
.vdev_param
->sgi
;
4883 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
4887 ath10k_warn(ar
, "failed to set sgi param %d: %d\n",
4893 arvif
->force_sgi
= force_sgi
;
4896 mutex_unlock(&ar
->conf_mutex
);
4900 static int ath10k_set_bitrate_mask(struct ieee80211_hw
*hw
,
4901 struct ieee80211_vif
*vif
,
4902 const struct cfg80211_bitrate_mask
*mask
)
4904 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4905 struct ath10k
*ar
= arvif
->ar
;
4906 enum ieee80211_band band
= ar
->hw
->conf
.chandef
.chan
->band
;
4907 u8 fixed_rate
= WMI_FIXED_RATE_NONE
;
4908 u8 fixed_nss
= ar
->num_rf_chains
;
4911 if (ar
->cfg_tx_chainmask
)
4912 fixed_nss
= get_nss_from_chainmask(ar
->cfg_tx_chainmask
);
4914 force_sgi
= mask
->control
[band
].gi
;
4915 if (force_sgi
== NL80211_TXRATE_FORCE_LGI
)
4918 if (!ath10k_default_bitrate_mask(ar
, band
, mask
)) {
4919 if (!ath10k_get_fixed_rate_nss(ar
, mask
, band
,
4925 if (fixed_rate
== WMI_FIXED_RATE_NONE
&& force_sgi
) {
4926 ath10k_warn(ar
, "failed to force SGI usage for default rate settings\n");
4930 return ath10k_set_fixed_rate_param(arvif
, fixed_rate
,
4931 fixed_nss
, force_sgi
);
4934 static void ath10k_sta_rc_update(struct ieee80211_hw
*hw
,
4935 struct ieee80211_vif
*vif
,
4936 struct ieee80211_sta
*sta
,
4939 struct ath10k
*ar
= hw
->priv
;
4940 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
4943 spin_lock_bh(&ar
->data_lock
);
4945 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
4946 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4947 sta
->addr
, changed
, sta
->bandwidth
, sta
->rx_nss
,
4950 if (changed
& IEEE80211_RC_BW_CHANGED
) {
4951 bw
= WMI_PEER_CHWIDTH_20MHZ
;
4953 switch (sta
->bandwidth
) {
4954 case IEEE80211_STA_RX_BW_20
:
4955 bw
= WMI_PEER_CHWIDTH_20MHZ
;
4957 case IEEE80211_STA_RX_BW_40
:
4958 bw
= WMI_PEER_CHWIDTH_40MHZ
;
4960 case IEEE80211_STA_RX_BW_80
:
4961 bw
= WMI_PEER_CHWIDTH_80MHZ
;
4963 case IEEE80211_STA_RX_BW_160
:
4964 ath10k_warn(ar
, "Invalid bandwith %d in rc update for %pM\n",
4965 sta
->bandwidth
, sta
->addr
);
4966 bw
= WMI_PEER_CHWIDTH_20MHZ
;
4973 if (changed
& IEEE80211_RC_NSS_CHANGED
)
4974 arsta
->nss
= sta
->rx_nss
;
4976 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
4977 smps
= WMI_PEER_SMPS_PS_NONE
;
4979 switch (sta
->smps_mode
) {
4980 case IEEE80211_SMPS_AUTOMATIC
:
4981 case IEEE80211_SMPS_OFF
:
4982 smps
= WMI_PEER_SMPS_PS_NONE
;
4984 case IEEE80211_SMPS_STATIC
:
4985 smps
= WMI_PEER_SMPS_STATIC
;
4987 case IEEE80211_SMPS_DYNAMIC
:
4988 smps
= WMI_PEER_SMPS_DYNAMIC
;
4990 case IEEE80211_SMPS_NUM_MODES
:
4991 ath10k_warn(ar
, "Invalid smps %d in sta rc update for %pM\n",
4992 sta
->smps_mode
, sta
->addr
);
4993 smps
= WMI_PEER_SMPS_PS_NONE
;
5000 arsta
->changed
|= changed
;
5002 spin_unlock_bh(&ar
->data_lock
);
5004 ieee80211_queue_work(hw
, &arsta
->update_wk
);
5007 static u64
ath10k_get_tsf(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
)
5010 * FIXME: Return 0 for time being. Need to figure out whether FW
5011 * has the API to fetch 64-bit local TSF
5017 static int ath10k_ampdu_action(struct ieee80211_hw
*hw
,
5018 struct ieee80211_vif
*vif
,
5019 enum ieee80211_ampdu_mlme_action action
,
5020 struct ieee80211_sta
*sta
, u16 tid
, u16
*ssn
,
5023 struct ath10k
*ar
= hw
->priv
;
5024 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5026 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
5027 arvif
->vdev_id
, sta
->addr
, tid
, action
);
5030 case IEEE80211_AMPDU_RX_START
:
5031 case IEEE80211_AMPDU_RX_STOP
:
5032 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
5033 * creation/removal. Do we need to verify this?
5036 case IEEE80211_AMPDU_TX_START
:
5037 case IEEE80211_AMPDU_TX_STOP_CONT
:
5038 case IEEE80211_AMPDU_TX_STOP_FLUSH
:
5039 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT
:
5040 case IEEE80211_AMPDU_TX_OPERATIONAL
:
5041 /* Firmware offloads Tx aggregation entirely so deny mac80211
5042 * Tx aggregation requests.
5050 static const struct ieee80211_ops ath10k_ops
= {
5052 .start
= ath10k_start
,
5053 .stop
= ath10k_stop
,
5054 .config
= ath10k_config
,
5055 .add_interface
= ath10k_add_interface
,
5056 .remove_interface
= ath10k_remove_interface
,
5057 .configure_filter
= ath10k_configure_filter
,
5058 .bss_info_changed
= ath10k_bss_info_changed
,
5059 .hw_scan
= ath10k_hw_scan
,
5060 .cancel_hw_scan
= ath10k_cancel_hw_scan
,
5061 .set_key
= ath10k_set_key
,
5062 .set_default_unicast_key
= ath10k_set_default_unicast_key
,
5063 .sta_state
= ath10k_sta_state
,
5064 .conf_tx
= ath10k_conf_tx
,
5065 .remain_on_channel
= ath10k_remain_on_channel
,
5066 .cancel_remain_on_channel
= ath10k_cancel_remain_on_channel
,
5067 .set_rts_threshold
= ath10k_set_rts_threshold
,
5068 .flush
= ath10k_flush
,
5069 .tx_last_beacon
= ath10k_tx_last_beacon
,
5070 .set_antenna
= ath10k_set_antenna
,
5071 .get_antenna
= ath10k_get_antenna
,
5072 .reconfig_complete
= ath10k_reconfig_complete
,
5073 .get_survey
= ath10k_get_survey
,
5074 .set_bitrate_mask
= ath10k_set_bitrate_mask
,
5075 .sta_rc_update
= ath10k_sta_rc_update
,
5076 .get_tsf
= ath10k_get_tsf
,
5077 .ampdu_action
= ath10k_ampdu_action
,
5078 .get_et_sset_count
= ath10k_debug_get_et_sset_count
,
5079 .get_et_stats
= ath10k_debug_get_et_stats
,
5080 .get_et_strings
= ath10k_debug_get_et_strings
,
5082 CFG80211_TESTMODE_CMD(ath10k_tm_cmd
)
5085 .suspend
= ath10k_suspend
,
5086 .resume
= ath10k_resume
,
5088 #ifdef CONFIG_MAC80211_DEBUGFS
5089 .sta_add_debugfs
= ath10k_sta_add_debugfs
,
5093 #define RATETAB_ENT(_rate, _rateid, _flags) { \
5094 .bitrate = (_rate), \
5095 .flags = (_flags), \
5096 .hw_value = (_rateid), \
5099 #define CHAN2G(_channel, _freq, _flags) { \
5100 .band = IEEE80211_BAND_2GHZ, \
5101 .hw_value = (_channel), \
5102 .center_freq = (_freq), \
5103 .flags = (_flags), \
5104 .max_antenna_gain = 0, \
5108 #define CHAN5G(_channel, _freq, _flags) { \
5109 .band = IEEE80211_BAND_5GHZ, \
5110 .hw_value = (_channel), \
5111 .center_freq = (_freq), \
5112 .flags = (_flags), \
5113 .max_antenna_gain = 0, \
5117 static const struct ieee80211_channel ath10k_2ghz_channels
[] = {
5127 CHAN2G(10, 2457, 0),
5128 CHAN2G(11, 2462, 0),
5129 CHAN2G(12, 2467, 0),
5130 CHAN2G(13, 2472, 0),
5131 CHAN2G(14, 2484, 0),
5134 static const struct ieee80211_channel ath10k_5ghz_channels
[] = {
5135 CHAN5G(36, 5180, 0),
5136 CHAN5G(40, 5200, 0),
5137 CHAN5G(44, 5220, 0),
5138 CHAN5G(48, 5240, 0),
5139 CHAN5G(52, 5260, 0),
5140 CHAN5G(56, 5280, 0),
5141 CHAN5G(60, 5300, 0),
5142 CHAN5G(64, 5320, 0),
5143 CHAN5G(100, 5500, 0),
5144 CHAN5G(104, 5520, 0),
5145 CHAN5G(108, 5540, 0),
5146 CHAN5G(112, 5560, 0),
5147 CHAN5G(116, 5580, 0),
5148 CHAN5G(120, 5600, 0),
5149 CHAN5G(124, 5620, 0),
5150 CHAN5G(128, 5640, 0),
5151 CHAN5G(132, 5660, 0),
5152 CHAN5G(136, 5680, 0),
5153 CHAN5G(140, 5700, 0),
5154 CHAN5G(149, 5745, 0),
5155 CHAN5G(153, 5765, 0),
5156 CHAN5G(157, 5785, 0),
5157 CHAN5G(161, 5805, 0),
5158 CHAN5G(165, 5825, 0),
5161 /* Note: Be careful if you re-order these. There is code which depends on this
5164 static struct ieee80211_rate ath10k_rates
[] = {
5166 RATETAB_ENT(10, 0x82, 0),
5167 RATETAB_ENT(20, 0x84, 0),
5168 RATETAB_ENT(55, 0x8b, 0),
5169 RATETAB_ENT(110, 0x96, 0),
5171 RATETAB_ENT(60, 0x0c, 0),
5172 RATETAB_ENT(90, 0x12, 0),
5173 RATETAB_ENT(120, 0x18, 0),
5174 RATETAB_ENT(180, 0x24, 0),
5175 RATETAB_ENT(240, 0x30, 0),
5176 RATETAB_ENT(360, 0x48, 0),
5177 RATETAB_ENT(480, 0x60, 0),
5178 RATETAB_ENT(540, 0x6c, 0),
5181 #define ath10k_a_rates (ath10k_rates + 4)
5182 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
5183 #define ath10k_g_rates (ath10k_rates + 0)
5184 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
5186 struct ath10k
*ath10k_mac_create(size_t priv_size
)
5188 struct ieee80211_hw
*hw
;
5191 hw
= ieee80211_alloc_hw(sizeof(struct ath10k
) + priv_size
, &ath10k_ops
);
5201 void ath10k_mac_destroy(struct ath10k
*ar
)
5203 ieee80211_free_hw(ar
->hw
);
5206 static const struct ieee80211_iface_limit ath10k_if_limits
[] = {
5209 .types
= BIT(NL80211_IFTYPE_STATION
)
5210 | BIT(NL80211_IFTYPE_P2P_CLIENT
)
5214 .types
= BIT(NL80211_IFTYPE_P2P_GO
)
5218 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
)
5222 .types
= BIT(NL80211_IFTYPE_AP
)
5226 static const struct ieee80211_iface_limit ath10k_10x_if_limits
[] = {
5229 .types
= BIT(NL80211_IFTYPE_AP
)
5233 static const struct ieee80211_iface_combination ath10k_if_comb
[] = {
5235 .limits
= ath10k_if_limits
,
5236 .n_limits
= ARRAY_SIZE(ath10k_if_limits
),
5237 .max_interfaces
= 8,
5238 .num_different_channels
= 1,
5239 .beacon_int_infra_match
= true,
5243 static const struct ieee80211_iface_combination ath10k_10x_if_comb
[] = {
5245 .limits
= ath10k_10x_if_limits
,
5246 .n_limits
= ARRAY_SIZE(ath10k_10x_if_limits
),
5247 .max_interfaces
= 8,
5248 .num_different_channels
= 1,
5249 .beacon_int_infra_match
= true,
5250 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
5251 .radar_detect_widths
= BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
5252 BIT(NL80211_CHAN_WIDTH_20
) |
5253 BIT(NL80211_CHAN_WIDTH_40
) |
5254 BIT(NL80211_CHAN_WIDTH_80
),
5259 static struct ieee80211_sta_vht_cap
ath10k_create_vht_cap(struct ath10k
*ar
)
5261 struct ieee80211_sta_vht_cap vht_cap
= {0};
5265 vht_cap
.vht_supported
= 1;
5266 vht_cap
.cap
= ar
->vht_cap_info
;
5269 for (i
= 0; i
< 8; i
++) {
5270 if (i
< ar
->num_rf_chains
)
5271 mcs_map
|= IEEE80211_VHT_MCS_SUPPORT_0_9
<< (i
*2);
5273 mcs_map
|= IEEE80211_VHT_MCS_NOT_SUPPORTED
<< (i
*2);
5276 vht_cap
.vht_mcs
.rx_mcs_map
= cpu_to_le16(mcs_map
);
5277 vht_cap
.vht_mcs
.tx_mcs_map
= cpu_to_le16(mcs_map
);
5282 static struct ieee80211_sta_ht_cap
ath10k_get_ht_cap(struct ath10k
*ar
)
5285 struct ieee80211_sta_ht_cap ht_cap
= {0};
5287 if (!(ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
))
5290 ht_cap
.ht_supported
= 1;
5291 ht_cap
.ampdu_factor
= IEEE80211_HT_MAX_AMPDU_64K
;
5292 ht_cap
.ampdu_density
= IEEE80211_HT_MPDU_DENSITY_8
;
5293 ht_cap
.cap
|= IEEE80211_HT_CAP_SUP_WIDTH_20_40
;
5294 ht_cap
.cap
|= IEEE80211_HT_CAP_DSSSCCK40
;
5295 ht_cap
.cap
|= WLAN_HT_CAP_SM_PS_STATIC
<< IEEE80211_HT_CAP_SM_PS_SHIFT
;
5297 if (ar
->ht_cap_info
& WMI_HT_CAP_HT20_SGI
)
5298 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_20
;
5300 if (ar
->ht_cap_info
& WMI_HT_CAP_HT40_SGI
)
5301 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_40
;
5303 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
) {
5306 smps
= WLAN_HT_CAP_SM_PS_DYNAMIC
;
5307 smps
<<= IEEE80211_HT_CAP_SM_PS_SHIFT
;
5312 if (ar
->ht_cap_info
& WMI_HT_CAP_TX_STBC
)
5313 ht_cap
.cap
|= IEEE80211_HT_CAP_TX_STBC
;
5315 if (ar
->ht_cap_info
& WMI_HT_CAP_RX_STBC
) {
5318 stbc
= ar
->ht_cap_info
;
5319 stbc
&= WMI_HT_CAP_RX_STBC
;
5320 stbc
>>= WMI_HT_CAP_RX_STBC_MASK_SHIFT
;
5321 stbc
<<= IEEE80211_HT_CAP_RX_STBC_SHIFT
;
5322 stbc
&= IEEE80211_HT_CAP_RX_STBC
;
5327 if (ar
->ht_cap_info
& WMI_HT_CAP_LDPC
)
5328 ht_cap
.cap
|= IEEE80211_HT_CAP_LDPC_CODING
;
5330 if (ar
->ht_cap_info
& WMI_HT_CAP_L_SIG_TXOP_PROT
)
5331 ht_cap
.cap
|= IEEE80211_HT_CAP_LSIG_TXOP_PROT
;
5333 /* max AMSDU is implicitly taken from vht_cap_info */
5334 if (ar
->vht_cap_info
& WMI_VHT_CAP_MAX_MPDU_LEN_MASK
)
5335 ht_cap
.cap
|= IEEE80211_HT_CAP_MAX_AMSDU
;
5337 for (i
= 0; i
< ar
->num_rf_chains
; i
++)
5338 ht_cap
.mcs
.rx_mask
[i
] = 0xFF;
5340 ht_cap
.mcs
.tx_params
|= IEEE80211_HT_MCS_TX_DEFINED
;
5345 static void ath10k_get_arvif_iter(void *data
, u8
*mac
,
5346 struct ieee80211_vif
*vif
)
5348 struct ath10k_vif_iter
*arvif_iter
= data
;
5349 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5351 if (arvif
->vdev_id
== arvif_iter
->vdev_id
)
5352 arvif_iter
->arvif
= arvif
;
5355 struct ath10k_vif
*ath10k_get_arvif(struct ath10k
*ar
, u32 vdev_id
)
5357 struct ath10k_vif_iter arvif_iter
;
5360 memset(&arvif_iter
, 0, sizeof(struct ath10k_vif_iter
));
5361 arvif_iter
.vdev_id
= vdev_id
;
5363 flags
= IEEE80211_IFACE_ITER_RESUME_ALL
;
5364 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
5366 ath10k_get_arvif_iter
,
5368 if (!arvif_iter
.arvif
) {
5369 ath10k_warn(ar
, "No VIF found for vdev %d\n", vdev_id
);
5373 return arvif_iter
.arvif
;
5376 int ath10k_mac_register(struct ath10k
*ar
)
5378 struct ieee80211_supported_band
*band
;
5379 struct ieee80211_sta_vht_cap vht_cap
;
5380 struct ieee80211_sta_ht_cap ht_cap
;
5384 SET_IEEE80211_PERM_ADDR(ar
->hw
, ar
->mac_addr
);
5386 SET_IEEE80211_DEV(ar
->hw
, ar
->dev
);
5388 ht_cap
= ath10k_get_ht_cap(ar
);
5389 vht_cap
= ath10k_create_vht_cap(ar
);
5391 if (ar
->phy_capability
& WHAL_WLAN_11G_CAPABILITY
) {
5392 channels
= kmemdup(ath10k_2ghz_channels
,
5393 sizeof(ath10k_2ghz_channels
),
5400 band
= &ar
->mac
.sbands
[IEEE80211_BAND_2GHZ
];
5401 band
->n_channels
= ARRAY_SIZE(ath10k_2ghz_channels
);
5402 band
->channels
= channels
;
5403 band
->n_bitrates
= ath10k_g_rates_size
;
5404 band
->bitrates
= ath10k_g_rates
;
5405 band
->ht_cap
= ht_cap
;
5407 /* Enable the VHT support at 2.4 GHz */
5408 band
->vht_cap
= vht_cap
;
5410 ar
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = band
;
5413 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
) {
5414 channels
= kmemdup(ath10k_5ghz_channels
,
5415 sizeof(ath10k_5ghz_channels
),
5422 band
= &ar
->mac
.sbands
[IEEE80211_BAND_5GHZ
];
5423 band
->n_channels
= ARRAY_SIZE(ath10k_5ghz_channels
);
5424 band
->channels
= channels
;
5425 band
->n_bitrates
= ath10k_a_rates_size
;
5426 band
->bitrates
= ath10k_a_rates
;
5427 band
->ht_cap
= ht_cap
;
5428 band
->vht_cap
= vht_cap
;
5429 ar
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = band
;
5432 ar
->hw
->wiphy
->interface_modes
=
5433 BIT(NL80211_IFTYPE_STATION
) |
5434 BIT(NL80211_IFTYPE_AP
);
5436 ar
->hw
->wiphy
->available_antennas_rx
= ar
->supp_rx_chainmask
;
5437 ar
->hw
->wiphy
->available_antennas_tx
= ar
->supp_tx_chainmask
;
5439 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P
, ar
->fw_features
))
5440 ar
->hw
->wiphy
->interface_modes
|=
5441 BIT(NL80211_IFTYPE_P2P_DEVICE
) |
5442 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
5443 BIT(NL80211_IFTYPE_P2P_GO
);
5445 ar
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
5446 IEEE80211_HW_SUPPORTS_PS
|
5447 IEEE80211_HW_SUPPORTS_DYNAMIC_PS
|
5448 IEEE80211_HW_MFP_CAPABLE
|
5449 IEEE80211_HW_REPORTS_TX_ACK_STATUS
|
5450 IEEE80211_HW_HAS_RATE_CONTROL
|
5451 IEEE80211_HW_AP_LINK_PS
|
5452 IEEE80211_HW_SPECTRUM_MGMT
;
5454 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_STATIC_SMPS
;
5456 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
)
5457 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_DYNAMIC_SMPS
;
5459 if (ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
) {
5460 ar
->hw
->flags
|= IEEE80211_HW_AMPDU_AGGREGATION
;
5461 ar
->hw
->flags
|= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW
;
5464 ar
->hw
->wiphy
->max_scan_ssids
= WLAN_SCAN_PARAMS_MAX_SSID
;
5465 ar
->hw
->wiphy
->max_scan_ie_len
= WLAN_SCAN_PARAMS_MAX_IE_LEN
;
5467 ar
->hw
->vif_data_size
= sizeof(struct ath10k_vif
);
5468 ar
->hw
->sta_data_size
= sizeof(struct ath10k_sta
);
5470 ar
->hw
->max_listen_interval
= ATH10K_MAX_HW_LISTEN_INTERVAL
;
5472 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
)) {
5473 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
;
5475 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
5476 * that userspace (e.g. wpa_supplicant/hostapd) can generate
5477 * correct Probe Responses. This is more of a hack advert..
5479 ar
->hw
->wiphy
->probe_resp_offload
|=
5480 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
5481 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
|
5482 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P
;
5485 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
;
5486 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_CHANNEL_SWITCH
;
5487 ar
->hw
->wiphy
->max_remain_on_channel_duration
= 5000;
5489 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_UAPSD
;
5490 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE
;
5493 * on LL hardware queues are managed entirely by the FW
5494 * so we only advertise to mac we can do the queues thing
5498 switch (ar
->wmi
.op_version
) {
5499 case ATH10K_FW_WMI_OP_VERSION_MAIN
:
5500 case ATH10K_FW_WMI_OP_VERSION_TLV
:
5501 ar
->hw
->wiphy
->iface_combinations
= ath10k_if_comb
;
5502 ar
->hw
->wiphy
->n_iface_combinations
=
5503 ARRAY_SIZE(ath10k_if_comb
);
5504 ar
->hw
->wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
5506 case ATH10K_FW_WMI_OP_VERSION_10_1
:
5507 case ATH10K_FW_WMI_OP_VERSION_10_2
:
5508 case ATH10K_FW_WMI_OP_VERSION_10_2_4
:
5509 ar
->hw
->wiphy
->iface_combinations
= ath10k_10x_if_comb
;
5510 ar
->hw
->wiphy
->n_iface_combinations
=
5511 ARRAY_SIZE(ath10k_10x_if_comb
);
5513 case ATH10K_FW_WMI_OP_VERSION_UNSET
:
5514 case ATH10K_FW_WMI_OP_VERSION_MAX
:
5520 ar
->hw
->netdev_features
= NETIF_F_HW_CSUM
;
5522 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
)) {
5523 /* Init ath dfs pattern detector */
5524 ar
->ath_common
.debug_mask
= ATH_DBG_DFS
;
5525 ar
->dfs_detector
= dfs_pattern_detector_init(&ar
->ath_common
,
5528 if (!ar
->dfs_detector
)
5529 ath10k_warn(ar
, "failed to initialise DFS pattern detector\n");
5532 ret
= ath_regd_init(&ar
->ath_common
.regulatory
, ar
->hw
->wiphy
,
5533 ath10k_reg_notifier
);
5535 ath10k_err(ar
, "failed to initialise regulatory: %i\n", ret
);
5539 ret
= ieee80211_register_hw(ar
->hw
);
5541 ath10k_err(ar
, "failed to register ieee80211: %d\n", ret
);
5545 if (!ath_is_world_regd(&ar
->ath_common
.regulatory
)) {
5546 ret
= regulatory_hint(ar
->hw
->wiphy
,
5547 ar
->ath_common
.regulatory
.alpha2
);
5549 goto err_unregister
;
5555 ieee80211_unregister_hw(ar
->hw
);
5557 kfree(ar
->mac
.sbands
[IEEE80211_BAND_2GHZ
].channels
);
5558 kfree(ar
->mac
.sbands
[IEEE80211_BAND_5GHZ
].channels
);
5563 void ath10k_mac_unregister(struct ath10k
*ar
)
5565 ieee80211_unregister_hw(ar
->hw
);
5567 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
)
5568 ar
->dfs_detector
->exit(ar
->dfs_detector
);
5570 kfree(ar
->mac
.sbands
[IEEE80211_BAND_2GHZ
].channels
);
5571 kfree(ar
->mac
.sbands
[IEEE80211_BAND_5GHZ
].channels
);
5573 SET_IEEE80211_DEV(ar
->hw
, NULL
);