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>
34 static int ath10k_send_key(struct ath10k_vif
*arvif
,
35 struct ieee80211_key_conf
*key
,
39 struct wmi_vdev_install_key_arg arg
= {
40 .vdev_id
= arvif
->vdev_id
,
41 .key_idx
= key
->keyidx
,
42 .key_len
= key
->keylen
,
47 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
49 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
50 arg
.key_flags
= WMI_KEY_PAIRWISE
;
52 arg
.key_flags
= WMI_KEY_GROUP
;
54 switch (key
->cipher
) {
55 case WLAN_CIPHER_SUITE_CCMP
:
56 arg
.key_cipher
= WMI_CIPHER_AES_CCM
;
57 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
)
58 key
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT
;
60 key
->flags
|= IEEE80211_KEY_FLAG_SW_MGMT_TX
;
62 case WLAN_CIPHER_SUITE_TKIP
:
63 arg
.key_cipher
= WMI_CIPHER_TKIP
;
64 arg
.key_txmic_len
= 8;
65 arg
.key_rxmic_len
= 8;
67 case WLAN_CIPHER_SUITE_WEP40
:
68 case WLAN_CIPHER_SUITE_WEP104
:
69 arg
.key_cipher
= WMI_CIPHER_WEP
;
70 /* AP/IBSS mode requires self-key to be groupwise
71 * Otherwise pairwise key must be set */
72 if (memcmp(macaddr
, arvif
->vif
->addr
, ETH_ALEN
))
73 arg
.key_flags
= WMI_KEY_PAIRWISE
;
76 ath10k_warn("cipher %d is not supported\n", key
->cipher
);
80 if (cmd
== DISABLE_KEY
) {
81 arg
.key_cipher
= WMI_CIPHER_NONE
;
85 return ath10k_wmi_vdev_install_key(arvif
->ar
, &arg
);
88 static int ath10k_install_key(struct ath10k_vif
*arvif
,
89 struct ieee80211_key_conf
*key
,
93 struct ath10k
*ar
= arvif
->ar
;
96 lockdep_assert_held(&ar
->conf_mutex
);
98 reinit_completion(&ar
->install_key_done
);
100 ret
= ath10k_send_key(arvif
, key
, cmd
, macaddr
);
104 ret
= wait_for_completion_timeout(&ar
->install_key_done
, 3*HZ
);
111 static int ath10k_install_peer_wep_keys(struct ath10k_vif
*arvif
,
114 struct ath10k
*ar
= arvif
->ar
;
115 struct ath10k_peer
*peer
;
119 lockdep_assert_held(&ar
->conf_mutex
);
121 spin_lock_bh(&ar
->data_lock
);
122 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
123 spin_unlock_bh(&ar
->data_lock
);
128 for (i
= 0; i
< ARRAY_SIZE(arvif
->wep_keys
); i
++) {
129 if (arvif
->wep_keys
[i
] == NULL
)
132 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
], SET_KEY
,
137 peer
->keys
[i
] = arvif
->wep_keys
[i
];
143 static int ath10k_clear_peer_keys(struct ath10k_vif
*arvif
,
146 struct ath10k
*ar
= arvif
->ar
;
147 struct ath10k_peer
*peer
;
152 lockdep_assert_held(&ar
->conf_mutex
);
154 spin_lock_bh(&ar
->data_lock
);
155 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
156 spin_unlock_bh(&ar
->data_lock
);
161 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
162 if (peer
->keys
[i
] == NULL
)
165 ret
= ath10k_install_key(arvif
, peer
->keys
[i
],
167 if (ret
&& first_errno
== 0)
171 ath10k_warn("failed to remove peer wep key %d: %d\n",
174 peer
->keys
[i
] = NULL
;
180 static int ath10k_clear_vdev_key(struct ath10k_vif
*arvif
,
181 struct ieee80211_key_conf
*key
)
183 struct ath10k
*ar
= arvif
->ar
;
184 struct ath10k_peer
*peer
;
190 lockdep_assert_held(&ar
->conf_mutex
);
193 /* since ath10k_install_key we can't hold data_lock all the
194 * time, so we try to remove the keys incrementally */
195 spin_lock_bh(&ar
->data_lock
);
197 list_for_each_entry(peer
, &ar
->peers
, list
) {
198 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
199 if (peer
->keys
[i
] == key
) {
200 memcpy(addr
, peer
->addr
, ETH_ALEN
);
201 peer
->keys
[i
] = NULL
;
206 if (i
< ARRAY_SIZE(peer
->keys
))
209 spin_unlock_bh(&ar
->data_lock
);
211 if (i
== ARRAY_SIZE(peer
->keys
))
214 ret
= ath10k_install_key(arvif
, key
, DISABLE_KEY
, addr
);
215 if (ret
&& first_errno
== 0)
219 ath10k_warn("failed to remove key for %pM: %d\n",
227 /*********************/
228 /* General utilities */
229 /*********************/
231 static inline enum wmi_phy_mode
232 chan_to_phymode(const struct cfg80211_chan_def
*chandef
)
234 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
236 switch (chandef
->chan
->band
) {
237 case IEEE80211_BAND_2GHZ
:
238 switch (chandef
->width
) {
239 case NL80211_CHAN_WIDTH_20_NOHT
:
242 case NL80211_CHAN_WIDTH_20
:
243 phymode
= MODE_11NG_HT20
;
245 case NL80211_CHAN_WIDTH_40
:
246 phymode
= MODE_11NG_HT40
;
248 case NL80211_CHAN_WIDTH_5
:
249 case NL80211_CHAN_WIDTH_10
:
250 case NL80211_CHAN_WIDTH_80
:
251 case NL80211_CHAN_WIDTH_80P80
:
252 case NL80211_CHAN_WIDTH_160
:
253 phymode
= MODE_UNKNOWN
;
257 case IEEE80211_BAND_5GHZ
:
258 switch (chandef
->width
) {
259 case NL80211_CHAN_WIDTH_20_NOHT
:
262 case NL80211_CHAN_WIDTH_20
:
263 phymode
= MODE_11NA_HT20
;
265 case NL80211_CHAN_WIDTH_40
:
266 phymode
= MODE_11NA_HT40
;
268 case NL80211_CHAN_WIDTH_80
:
269 phymode
= MODE_11AC_VHT80
;
271 case NL80211_CHAN_WIDTH_5
:
272 case NL80211_CHAN_WIDTH_10
:
273 case NL80211_CHAN_WIDTH_80P80
:
274 case NL80211_CHAN_WIDTH_160
:
275 phymode
= MODE_UNKNOWN
;
283 WARN_ON(phymode
== MODE_UNKNOWN
);
287 static u8
ath10k_parse_mpdudensity(u8 mpdudensity
)
290 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
291 * 0 for no restriction
300 switch (mpdudensity
) {
306 /* Our lower layer calculations limit our precision to
322 static int ath10k_peer_create(struct ath10k
*ar
, u32 vdev_id
, const u8
*addr
)
326 lockdep_assert_held(&ar
->conf_mutex
);
328 ret
= ath10k_wmi_peer_create(ar
, vdev_id
, addr
);
330 ath10k_warn("failed to create wmi peer %pM on vdev %i: %i\n",
335 ret
= ath10k_wait_for_peer_created(ar
, vdev_id
, addr
);
337 ath10k_warn("failed to wait for created wmi peer %pM on vdev %i: %i\n",
341 spin_lock_bh(&ar
->data_lock
);
343 spin_unlock_bh(&ar
->data_lock
);
348 static int ath10k_mac_set_kickout(struct ath10k_vif
*arvif
)
350 struct ath10k
*ar
= arvif
->ar
;
354 param
= ar
->wmi
.pdev_param
->sta_kickout_th
;
355 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
356 ATH10K_KICKOUT_THRESHOLD
);
358 ath10k_warn("failed to set kickout threshold on vdev %i: %d\n",
359 arvif
->vdev_id
, ret
);
363 param
= ar
->wmi
.vdev_param
->ap_keepalive_min_idle_inactive_time_secs
;
364 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
365 ATH10K_KEEPALIVE_MIN_IDLE
);
367 ath10k_warn("failed to set keepalive minimum idle time on vdev %i: %d\n",
368 arvif
->vdev_id
, ret
);
372 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_idle_inactive_time_secs
;
373 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
374 ATH10K_KEEPALIVE_MAX_IDLE
);
376 ath10k_warn("failed to set keepalive maximum idle time on vdev %i: %d\n",
377 arvif
->vdev_id
, ret
);
381 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_unresponsive_time_secs
;
382 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
383 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE
);
385 ath10k_warn("failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
386 arvif
->vdev_id
, ret
);
393 static int ath10k_mac_set_rts(struct ath10k_vif
*arvif
, u32 value
)
395 struct ath10k
*ar
= arvif
->ar
;
398 if (value
!= 0xFFFFFFFF)
399 value
= min_t(u32
, arvif
->ar
->hw
->wiphy
->rts_threshold
,
402 vdev_param
= ar
->wmi
.vdev_param
->rts_threshold
;
403 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, value
);
406 static int ath10k_mac_set_frag(struct ath10k_vif
*arvif
, u32 value
)
408 struct ath10k
*ar
= arvif
->ar
;
411 if (value
!= 0xFFFFFFFF)
412 value
= clamp_t(u32
, arvif
->ar
->hw
->wiphy
->frag_threshold
,
413 ATH10K_FRAGMT_THRESHOLD_MIN
,
414 ATH10K_FRAGMT_THRESHOLD_MAX
);
416 vdev_param
= ar
->wmi
.vdev_param
->fragmentation_threshold
;
417 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, value
);
420 static int ath10k_peer_delete(struct ath10k
*ar
, u32 vdev_id
, const u8
*addr
)
424 lockdep_assert_held(&ar
->conf_mutex
);
426 ret
= ath10k_wmi_peer_delete(ar
, vdev_id
, addr
);
430 ret
= ath10k_wait_for_peer_deleted(ar
, vdev_id
, addr
);
434 spin_lock_bh(&ar
->data_lock
);
436 spin_unlock_bh(&ar
->data_lock
);
441 static void ath10k_peer_cleanup(struct ath10k
*ar
, u32 vdev_id
)
443 struct ath10k_peer
*peer
, *tmp
;
445 lockdep_assert_held(&ar
->conf_mutex
);
447 spin_lock_bh(&ar
->data_lock
);
448 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
449 if (peer
->vdev_id
!= vdev_id
)
452 ath10k_warn("removing stale peer %pM from vdev_id %d\n",
453 peer
->addr
, vdev_id
);
455 list_del(&peer
->list
);
459 spin_unlock_bh(&ar
->data_lock
);
462 static void ath10k_peer_cleanup_all(struct ath10k
*ar
)
464 struct ath10k_peer
*peer
, *tmp
;
466 lockdep_assert_held(&ar
->conf_mutex
);
468 spin_lock_bh(&ar
->data_lock
);
469 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
470 list_del(&peer
->list
);
474 spin_unlock_bh(&ar
->data_lock
);
477 /************************/
478 /* Interface management */
479 /************************/
481 static inline int ath10k_vdev_setup_sync(struct ath10k
*ar
)
485 lockdep_assert_held(&ar
->conf_mutex
);
487 ret
= wait_for_completion_timeout(&ar
->vdev_setup_done
,
488 ATH10K_VDEV_SETUP_TIMEOUT_HZ
);
495 static bool ath10k_monitor_is_enabled(struct ath10k
*ar
)
497 lockdep_assert_held(&ar
->conf_mutex
);
499 ath10k_dbg(ATH10K_DBG_MAC
,
500 "mac monitor refs: promisc %d monitor %d cac %d\n",
501 ar
->promisc
, ar
->monitor
,
502 test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
));
504 return ar
->promisc
|| ar
->monitor
||
505 test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
508 static int ath10k_monitor_vdev_start(struct ath10k
*ar
, int vdev_id
)
510 struct cfg80211_chan_def
*chandef
= &ar
->chandef
;
511 struct ieee80211_channel
*channel
= chandef
->chan
;
512 struct wmi_vdev_start_request_arg arg
= {};
515 lockdep_assert_held(&ar
->conf_mutex
);
517 arg
.vdev_id
= vdev_id
;
518 arg
.channel
.freq
= channel
->center_freq
;
519 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
521 /* TODO setup this dynamically, what in case we
522 don't have any vifs? */
523 arg
.channel
.mode
= chan_to_phymode(chandef
);
524 arg
.channel
.chan_radar
=
525 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
527 arg
.channel
.min_power
= 0;
528 arg
.channel
.max_power
= channel
->max_power
* 2;
529 arg
.channel
.max_reg_power
= channel
->max_reg_power
* 2;
530 arg
.channel
.max_antenna_gain
= channel
->max_antenna_gain
* 2;
532 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
534 ath10k_warn("failed to request monitor vdev %i start: %d\n",
539 ret
= ath10k_vdev_setup_sync(ar
);
541 ath10k_warn("failed to synchronize setup for monitor vdev %i: %d\n",
546 ret
= ath10k_wmi_vdev_up(ar
, vdev_id
, 0, ar
->mac_addr
);
548 ath10k_warn("failed to put up monitor vdev %i: %d\n",
553 ar
->monitor_vdev_id
= vdev_id
;
555 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor vdev %i started\n",
556 ar
->monitor_vdev_id
);
560 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
562 ath10k_warn("failed to stop monitor vdev %i after start failure: %d\n",
563 ar
->monitor_vdev_id
, ret
);
568 static int ath10k_monitor_vdev_stop(struct ath10k
*ar
)
572 lockdep_assert_held(&ar
->conf_mutex
);
574 ret
= ath10k_wmi_vdev_down(ar
, ar
->monitor_vdev_id
);
576 ath10k_warn("failed to put down monitor vdev %i: %d\n",
577 ar
->monitor_vdev_id
, ret
);
579 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
581 ath10k_warn("failed to to request monitor vdev %i stop: %d\n",
582 ar
->monitor_vdev_id
, ret
);
584 ret
= ath10k_vdev_setup_sync(ar
);
586 ath10k_warn("failed to synchronise monitor vdev %i: %d\n",
587 ar
->monitor_vdev_id
, ret
);
589 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor vdev %i stopped\n",
590 ar
->monitor_vdev_id
);
594 static int ath10k_monitor_vdev_create(struct ath10k
*ar
)
598 lockdep_assert_held(&ar
->conf_mutex
);
600 bit
= ffs(ar
->free_vdev_map
);
602 ath10k_warn("failed to find free vdev id for monitor vdev\n");
606 ar
->monitor_vdev_id
= bit
- 1;
607 ar
->free_vdev_map
&= ~(1 << ar
->monitor_vdev_id
);
609 ret
= ath10k_wmi_vdev_create(ar
, ar
->monitor_vdev_id
,
610 WMI_VDEV_TYPE_MONITOR
,
613 ath10k_warn("failed to request monitor vdev %i creation: %d\n",
614 ar
->monitor_vdev_id
, ret
);
618 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor vdev %d created\n",
619 ar
->monitor_vdev_id
);
625 * Restore the ID to the global map.
627 ar
->free_vdev_map
|= 1 << (ar
->monitor_vdev_id
);
631 static int ath10k_monitor_vdev_delete(struct ath10k
*ar
)
635 lockdep_assert_held(&ar
->conf_mutex
);
637 ret
= ath10k_wmi_vdev_delete(ar
, ar
->monitor_vdev_id
);
639 ath10k_warn("failed to request wmi monitor vdev %i removal: %d\n",
640 ar
->monitor_vdev_id
, ret
);
644 ar
->free_vdev_map
|= 1 << (ar
->monitor_vdev_id
);
646 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor vdev %d deleted\n",
647 ar
->monitor_vdev_id
);
651 static int ath10k_monitor_start(struct ath10k
*ar
)
655 lockdep_assert_held(&ar
->conf_mutex
);
657 if (!ath10k_monitor_is_enabled(ar
)) {
658 ath10k_warn("trying to start monitor with no references\n");
662 if (ar
->monitor_started
) {
663 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor already started\n");
667 ret
= ath10k_monitor_vdev_create(ar
);
669 ath10k_warn("failed to create monitor vdev: %d\n", ret
);
673 ret
= ath10k_monitor_vdev_start(ar
, ar
->monitor_vdev_id
);
675 ath10k_warn("failed to start monitor vdev: %d\n", ret
);
676 ath10k_monitor_vdev_delete(ar
);
680 ar
->monitor_started
= true;
681 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor started\n");
686 static void ath10k_monitor_stop(struct ath10k
*ar
)
690 lockdep_assert_held(&ar
->conf_mutex
);
692 if (ath10k_monitor_is_enabled(ar
)) {
693 ath10k_dbg(ATH10K_DBG_MAC
,
694 "mac monitor will be stopped later\n");
698 if (!ar
->monitor_started
) {
699 ath10k_dbg(ATH10K_DBG_MAC
,
700 "mac monitor probably failed to start earlier\n");
704 ret
= ath10k_monitor_vdev_stop(ar
);
706 ath10k_warn("failed to stop monitor vdev: %d\n", ret
);
708 ret
= ath10k_monitor_vdev_delete(ar
);
710 ath10k_warn("failed to delete monitor vdev: %d\n", ret
);
712 ar
->monitor_started
= false;
713 ath10k_dbg(ATH10K_DBG_MAC
, "mac monitor stopped\n");
716 static int ath10k_recalc_rtscts_prot(struct ath10k_vif
*arvif
)
718 struct ath10k
*ar
= arvif
->ar
;
719 u32 vdev_param
, rts_cts
= 0;
721 lockdep_assert_held(&ar
->conf_mutex
);
723 vdev_param
= ar
->wmi
.vdev_param
->enable_rtscts
;
725 if (arvif
->use_cts_prot
|| arvif
->num_legacy_stations
> 0)
726 rts_cts
|= SM(WMI_RTSCTS_ENABLED
, WMI_RTSCTS_SET
);
728 if (arvif
->num_legacy_stations
> 0)
729 rts_cts
|= SM(WMI_RTSCTS_ACROSS_SW_RETRIES
,
732 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
736 static int ath10k_start_cac(struct ath10k
*ar
)
740 lockdep_assert_held(&ar
->conf_mutex
);
742 set_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
744 ret
= ath10k_monitor_start(ar
);
746 ath10k_warn("failed to start monitor (cac): %d\n", ret
);
747 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
751 ath10k_dbg(ATH10K_DBG_MAC
, "mac cac start monitor vdev %d\n",
752 ar
->monitor_vdev_id
);
757 static int ath10k_stop_cac(struct ath10k
*ar
)
759 lockdep_assert_held(&ar
->conf_mutex
);
761 /* CAC is not running - do nothing */
762 if (!test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
))
765 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
766 ath10k_monitor_stop(ar
);
768 ath10k_dbg(ATH10K_DBG_MAC
, "mac cac finished\n");
773 static void ath10k_recalc_radar_detection(struct ath10k
*ar
)
777 lockdep_assert_held(&ar
->conf_mutex
);
781 if (!ar
->radar_enabled
)
784 if (ar
->num_started_vdevs
> 0)
787 ret
= ath10k_start_cac(ar
);
790 * Not possible to start CAC on current channel so starting
791 * radiation is not allowed, make this channel DFS_UNAVAILABLE
792 * by indicating that radar was detected.
794 ath10k_warn("failed to start CAC: %d\n", ret
);
795 ieee80211_radar_detected(ar
->hw
);
799 static int ath10k_vdev_start(struct ath10k_vif
*arvif
)
801 struct ath10k
*ar
= arvif
->ar
;
802 struct cfg80211_chan_def
*chandef
= &ar
->chandef
;
803 struct wmi_vdev_start_request_arg arg
= {};
806 lockdep_assert_held(&ar
->conf_mutex
);
808 reinit_completion(&ar
->vdev_setup_done
);
810 arg
.vdev_id
= arvif
->vdev_id
;
811 arg
.dtim_period
= arvif
->dtim_period
;
812 arg
.bcn_intval
= arvif
->beacon_interval
;
814 arg
.channel
.freq
= chandef
->chan
->center_freq
;
815 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
816 arg
.channel
.mode
= chan_to_phymode(chandef
);
818 arg
.channel
.min_power
= 0;
819 arg
.channel
.max_power
= chandef
->chan
->max_power
* 2;
820 arg
.channel
.max_reg_power
= chandef
->chan
->max_reg_power
* 2;
821 arg
.channel
.max_antenna_gain
= chandef
->chan
->max_antenna_gain
* 2;
823 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
824 arg
.ssid
= arvif
->u
.ap
.ssid
;
825 arg
.ssid_len
= arvif
->u
.ap
.ssid_len
;
826 arg
.hidden_ssid
= arvif
->u
.ap
.hidden_ssid
;
828 /* For now allow DFS for AP mode */
829 arg
.channel
.chan_radar
=
830 !!(chandef
->chan
->flags
& IEEE80211_CHAN_RADAR
);
831 } else if (arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
832 arg
.ssid
= arvif
->vif
->bss_conf
.ssid
;
833 arg
.ssid_len
= arvif
->vif
->bss_conf
.ssid_len
;
836 ath10k_dbg(ATH10K_DBG_MAC
,
837 "mac vdev %d start center_freq %d phymode %s\n",
838 arg
.vdev_id
, arg
.channel
.freq
,
839 ath10k_wmi_phymode_str(arg
.channel
.mode
));
841 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
843 ath10k_warn("failed to start WMI vdev %i: %d\n",
848 ret
= ath10k_vdev_setup_sync(ar
);
850 ath10k_warn("failed to synchronise setup for vdev %i: %d\n",
855 ar
->num_started_vdevs
++;
856 ath10k_recalc_radar_detection(ar
);
861 static int ath10k_vdev_stop(struct ath10k_vif
*arvif
)
863 struct ath10k
*ar
= arvif
->ar
;
866 lockdep_assert_held(&ar
->conf_mutex
);
868 reinit_completion(&ar
->vdev_setup_done
);
870 ret
= ath10k_wmi_vdev_stop(ar
, arvif
->vdev_id
);
872 ath10k_warn("failed to stop WMI vdev %i: %d\n",
873 arvif
->vdev_id
, ret
);
877 ret
= ath10k_vdev_setup_sync(ar
);
879 ath10k_warn("failed to syncronise setup for vdev %i: %d\n",
880 arvif
->vdev_id
, ret
);
884 WARN_ON(ar
->num_started_vdevs
== 0);
886 if (ar
->num_started_vdevs
!= 0) {
887 ar
->num_started_vdevs
--;
888 ath10k_recalc_radar_detection(ar
);
894 static void ath10k_control_beaconing(struct ath10k_vif
*arvif
,
895 struct ieee80211_bss_conf
*info
)
899 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
901 if (!info
->enable_beacon
) {
902 ath10k_vdev_stop(arvif
);
904 arvif
->is_started
= false;
905 arvif
->is_up
= false;
907 spin_lock_bh(&arvif
->ar
->data_lock
);
909 dma_unmap_single(arvif
->ar
->dev
,
910 ATH10K_SKB_CB(arvif
->beacon
)->paddr
,
911 arvif
->beacon
->len
, DMA_TO_DEVICE
);
912 dev_kfree_skb_any(arvif
->beacon
);
914 arvif
->beacon
= NULL
;
915 arvif
->beacon_sent
= false;
917 spin_unlock_bh(&arvif
->ar
->data_lock
);
922 arvif
->tx_seq_no
= 0x1000;
924 ret
= ath10k_vdev_start(arvif
);
929 memcpy(arvif
->bssid
, info
->bssid
, ETH_ALEN
);
931 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
934 ath10k_warn("failed to bring up vdev %d: %i\n",
935 arvif
->vdev_id
, ret
);
936 ath10k_vdev_stop(arvif
);
940 arvif
->is_started
= true;
943 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d up\n", arvif
->vdev_id
);
946 static void ath10k_control_ibss(struct ath10k_vif
*arvif
,
947 struct ieee80211_bss_conf
*info
,
948 const u8 self_peer
[ETH_ALEN
])
953 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
955 if (!info
->ibss_joined
) {
956 ret
= ath10k_peer_delete(arvif
->ar
, arvif
->vdev_id
, self_peer
);
958 ath10k_warn("failed to delete IBSS self peer %pM for vdev %d: %d\n",
959 self_peer
, arvif
->vdev_id
, ret
);
961 if (is_zero_ether_addr(arvif
->bssid
))
964 ret
= ath10k_peer_delete(arvif
->ar
, arvif
->vdev_id
,
967 ath10k_warn("failed to delete IBSS BSSID peer %pM for vdev %d: %d\n",
968 arvif
->bssid
, arvif
->vdev_id
, ret
);
972 memset(arvif
->bssid
, 0, ETH_ALEN
);
977 ret
= ath10k_peer_create(arvif
->ar
, arvif
->vdev_id
, self_peer
);
979 ath10k_warn("failed to create IBSS self peer %pM for vdev %d: %d\n",
980 self_peer
, arvif
->vdev_id
, ret
);
984 vdev_param
= arvif
->ar
->wmi
.vdev_param
->atim_window
;
985 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
, arvif
->vdev_id
, vdev_param
,
986 ATH10K_DEFAULT_ATIM
);
988 ath10k_warn("failed to set IBSS ATIM for vdev %d: %d\n",
989 arvif
->vdev_id
, ret
);
993 * Review this when mac80211 gains per-interface powersave support.
995 static int ath10k_mac_vif_setup_ps(struct ath10k_vif
*arvif
)
997 struct ath10k
*ar
= arvif
->ar
;
998 struct ieee80211_conf
*conf
= &ar
->hw
->conf
;
999 enum wmi_sta_powersave_param param
;
1000 enum wmi_sta_ps_mode psmode
;
1003 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1005 if (arvif
->vif
->type
!= NL80211_IFTYPE_STATION
)
1008 if (conf
->flags
& IEEE80211_CONF_PS
) {
1009 psmode
= WMI_STA_PS_MODE_ENABLED
;
1010 param
= WMI_STA_PS_PARAM_INACTIVITY_TIME
;
1012 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
,
1013 conf
->dynamic_ps_timeout
);
1015 ath10k_warn("failed to set inactivity time for vdev %d: %i\n",
1016 arvif
->vdev_id
, ret
);
1020 psmode
= WMI_STA_PS_MODE_DISABLED
;
1023 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d psmode %s\n",
1024 arvif
->vdev_id
, psmode
? "enable" : "disable");
1026 ret
= ath10k_wmi_set_psmode(ar
, arvif
->vdev_id
, psmode
);
1028 ath10k_warn("failed to set PS Mode %d for vdev %d: %d\n",
1029 psmode
, arvif
->vdev_id
, ret
);
1036 /**********************/
1037 /* Station management */
1038 /**********************/
1040 static void ath10k_peer_assoc_h_basic(struct ath10k
*ar
,
1041 struct ath10k_vif
*arvif
,
1042 struct ieee80211_sta
*sta
,
1043 struct ieee80211_bss_conf
*bss_conf
,
1044 struct wmi_peer_assoc_complete_arg
*arg
)
1046 lockdep_assert_held(&ar
->conf_mutex
);
1048 memcpy(arg
->addr
, sta
->addr
, ETH_ALEN
);
1049 arg
->vdev_id
= arvif
->vdev_id
;
1050 arg
->peer_aid
= sta
->aid
;
1051 arg
->peer_flags
|= WMI_PEER_AUTH
;
1053 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
)
1055 * Seems FW have problems with Power Save in STA
1056 * mode when we setup this parameter to high (eg. 5).
1057 * Often we see that FW don't send NULL (with clean P flags)
1058 * frame even there is info about buffered frames in beacons.
1059 * Sometimes we have to wait more than 10 seconds before FW
1060 * will wakeup. Often sending one ping from AP to our device
1061 * just fail (more than 50%).
1063 * Seems setting this FW parameter to 1 couse FW
1064 * will check every beacon and will wakup immediately
1065 * after detection buffered data.
1067 arg
->peer_listen_intval
= 1;
1069 arg
->peer_listen_intval
= ar
->hw
->conf
.listen_interval
;
1071 arg
->peer_num_spatial_streams
= 1;
1074 * The assoc capabilities are available only in managed mode.
1076 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
&& bss_conf
)
1077 arg
->peer_caps
= bss_conf
->assoc_capability
;
1080 static void ath10k_peer_assoc_h_crypto(struct ath10k
*ar
,
1081 struct ath10k_vif
*arvif
,
1082 struct wmi_peer_assoc_complete_arg
*arg
)
1084 struct ieee80211_vif
*vif
= arvif
->vif
;
1085 struct ieee80211_bss_conf
*info
= &vif
->bss_conf
;
1086 struct cfg80211_bss
*bss
;
1087 const u8
*rsnie
= NULL
;
1088 const u8
*wpaie
= NULL
;
1090 lockdep_assert_held(&ar
->conf_mutex
);
1092 bss
= cfg80211_get_bss(ar
->hw
->wiphy
, ar
->hw
->conf
.chandef
.chan
,
1093 info
->bssid
, NULL
, 0, 0, 0);
1095 const struct cfg80211_bss_ies
*ies
;
1098 rsnie
= ieee80211_bss_get_ie(bss
, WLAN_EID_RSN
);
1100 ies
= rcu_dereference(bss
->ies
);
1102 wpaie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
1103 WLAN_OUI_TYPE_MICROSOFT_WPA
,
1107 cfg80211_put_bss(ar
->hw
->wiphy
, bss
);
1110 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1111 if (rsnie
|| wpaie
) {
1112 ath10k_dbg(ATH10K_DBG_WMI
, "%s: rsn ie found\n", __func__
);
1113 arg
->peer_flags
|= WMI_PEER_NEED_PTK_4_WAY
;
1117 ath10k_dbg(ATH10K_DBG_WMI
, "%s: wpa ie found\n", __func__
);
1118 arg
->peer_flags
|= WMI_PEER_NEED_GTK_2_WAY
;
1122 static void ath10k_peer_assoc_h_rates(struct ath10k
*ar
,
1123 struct ieee80211_sta
*sta
,
1124 struct wmi_peer_assoc_complete_arg
*arg
)
1126 struct wmi_rate_set_arg
*rateset
= &arg
->peer_legacy_rates
;
1127 const struct ieee80211_supported_band
*sband
;
1128 const struct ieee80211_rate
*rates
;
1132 lockdep_assert_held(&ar
->conf_mutex
);
1134 sband
= ar
->hw
->wiphy
->bands
[ar
->hw
->conf
.chandef
.chan
->band
];
1135 ratemask
= sta
->supp_rates
[ar
->hw
->conf
.chandef
.chan
->band
];
1136 rates
= sband
->bitrates
;
1138 rateset
->num_rates
= 0;
1140 for (i
= 0; i
< 32; i
++, ratemask
>>= 1, rates
++) {
1141 if (!(ratemask
& 1))
1144 rateset
->rates
[rateset
->num_rates
] = rates
->hw_value
;
1145 rateset
->num_rates
++;
1149 static void ath10k_peer_assoc_h_ht(struct ath10k
*ar
,
1150 struct ieee80211_sta
*sta
,
1151 struct wmi_peer_assoc_complete_arg
*arg
)
1153 const struct ieee80211_sta_ht_cap
*ht_cap
= &sta
->ht_cap
;
1156 lockdep_assert_held(&ar
->conf_mutex
);
1158 if (!ht_cap
->ht_supported
)
1161 arg
->peer_flags
|= WMI_PEER_HT
;
1162 arg
->peer_max_mpdu
= (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
1163 ht_cap
->ampdu_factor
)) - 1;
1165 arg
->peer_mpdu_density
=
1166 ath10k_parse_mpdudensity(ht_cap
->ampdu_density
);
1168 arg
->peer_ht_caps
= ht_cap
->cap
;
1169 arg
->peer_rate_caps
|= WMI_RC_HT_FLAG
;
1171 if (ht_cap
->cap
& IEEE80211_HT_CAP_LDPC_CODING
)
1172 arg
->peer_flags
|= WMI_PEER_LDPC
;
1174 if (sta
->bandwidth
>= IEEE80211_STA_RX_BW_40
) {
1175 arg
->peer_flags
|= WMI_PEER_40MHZ
;
1176 arg
->peer_rate_caps
|= WMI_RC_CW40_FLAG
;
1179 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_20
)
1180 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
1182 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_40
)
1183 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
1185 if (ht_cap
->cap
& IEEE80211_HT_CAP_TX_STBC
) {
1186 arg
->peer_rate_caps
|= WMI_RC_TX_STBC_FLAG
;
1187 arg
->peer_flags
|= WMI_PEER_STBC
;
1190 if (ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
) {
1192 stbc
= ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
;
1193 stbc
= stbc
>> IEEE80211_HT_CAP_RX_STBC_SHIFT
;
1194 stbc
= stbc
<< WMI_RC_RX_STBC_FLAG_S
;
1195 arg
->peer_rate_caps
|= stbc
;
1196 arg
->peer_flags
|= WMI_PEER_STBC
;
1199 if (ht_cap
->mcs
.rx_mask
[1] && ht_cap
->mcs
.rx_mask
[2])
1200 arg
->peer_rate_caps
|= WMI_RC_TS_FLAG
;
1201 else if (ht_cap
->mcs
.rx_mask
[1])
1202 arg
->peer_rate_caps
|= WMI_RC_DS_FLAG
;
1204 for (i
= 0, n
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
*8; i
++)
1205 if (ht_cap
->mcs
.rx_mask
[i
/8] & (1 << i
%8))
1206 arg
->peer_ht_rates
.rates
[n
++] = i
;
1209 * This is a workaround for HT-enabled STAs which break the spec
1210 * and have no HT capabilities RX mask (no HT RX MCS map).
1212 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1213 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1215 * Firmware asserts if such situation occurs.
1218 arg
->peer_ht_rates
.num_rates
= 8;
1219 for (i
= 0; i
< arg
->peer_ht_rates
.num_rates
; i
++)
1220 arg
->peer_ht_rates
.rates
[i
] = i
;
1222 arg
->peer_ht_rates
.num_rates
= n
;
1223 arg
->peer_num_spatial_streams
= sta
->rx_nss
;
1226 ath10k_dbg(ATH10K_DBG_MAC
, "mac ht peer %pM mcs cnt %d nss %d\n",
1228 arg
->peer_ht_rates
.num_rates
,
1229 arg
->peer_num_spatial_streams
);
1232 static int ath10k_peer_assoc_qos_ap(struct ath10k
*ar
,
1233 struct ath10k_vif
*arvif
,
1234 struct ieee80211_sta
*sta
)
1240 lockdep_assert_held(&ar
->conf_mutex
);
1242 if (sta
->wme
&& sta
->uapsd_queues
) {
1243 ath10k_dbg(ATH10K_DBG_MAC
, "mac uapsd_queues 0x%x max_sp %d\n",
1244 sta
->uapsd_queues
, sta
->max_sp
);
1246 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
)
1247 uapsd
|= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN
|
1248 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN
;
1249 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VI
)
1250 uapsd
|= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN
|
1251 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN
;
1252 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
)
1253 uapsd
|= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN
|
1254 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN
;
1255 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BE
)
1256 uapsd
|= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN
|
1257 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN
;
1260 if (sta
->max_sp
< MAX_WMI_AP_PS_PEER_PARAM_MAX_SP
)
1261 max_sp
= sta
->max_sp
;
1263 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
1265 WMI_AP_PS_PEER_PARAM_UAPSD
,
1268 ath10k_warn("failed to set ap ps peer param uapsd for vdev %i: %d\n",
1269 arvif
->vdev_id
, ret
);
1273 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
1275 WMI_AP_PS_PEER_PARAM_MAX_SP
,
1278 ath10k_warn("failed to set ap ps peer param max sp for vdev %i: %d\n",
1279 arvif
->vdev_id
, ret
);
1283 /* TODO setup this based on STA listen interval and
1284 beacon interval. Currently we don't know
1285 sta->listen_interval - mac80211 patch required.
1286 Currently use 10 seconds */
1287 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
, sta
->addr
,
1288 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME
, 10);
1290 ath10k_warn("failed to set ap ps peer param ageout time for vdev %i: %d\n",
1291 arvif
->vdev_id
, ret
);
1299 static void ath10k_peer_assoc_h_vht(struct ath10k
*ar
,
1300 struct ieee80211_sta
*sta
,
1301 struct wmi_peer_assoc_complete_arg
*arg
)
1303 const struct ieee80211_sta_vht_cap
*vht_cap
= &sta
->vht_cap
;
1306 if (!vht_cap
->vht_supported
)
1309 arg
->peer_flags
|= WMI_PEER_VHT
;
1310 arg
->peer_vht_caps
= vht_cap
->cap
;
1313 ampdu_factor
= (vht_cap
->cap
&
1314 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
) >>
1315 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT
;
1317 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1318 * zero in VHT IE. Using it would result in degraded throughput.
1319 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1320 * it if VHT max_mpdu is smaller. */
1321 arg
->peer_max_mpdu
= max(arg
->peer_max_mpdu
,
1322 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
1323 ampdu_factor
)) - 1);
1325 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
1326 arg
->peer_flags
|= WMI_PEER_80MHZ
;
1328 arg
->peer_vht_rates
.rx_max_rate
=
1329 __le16_to_cpu(vht_cap
->vht_mcs
.rx_highest
);
1330 arg
->peer_vht_rates
.rx_mcs_set
=
1331 __le16_to_cpu(vht_cap
->vht_mcs
.rx_mcs_map
);
1332 arg
->peer_vht_rates
.tx_max_rate
=
1333 __le16_to_cpu(vht_cap
->vht_mcs
.tx_highest
);
1334 arg
->peer_vht_rates
.tx_mcs_set
=
1335 __le16_to_cpu(vht_cap
->vht_mcs
.tx_mcs_map
);
1337 ath10k_dbg(ATH10K_DBG_MAC
, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1338 sta
->addr
, arg
->peer_max_mpdu
, arg
->peer_flags
);
1341 static void ath10k_peer_assoc_h_qos(struct ath10k
*ar
,
1342 struct ath10k_vif
*arvif
,
1343 struct ieee80211_sta
*sta
,
1344 struct ieee80211_bss_conf
*bss_conf
,
1345 struct wmi_peer_assoc_complete_arg
*arg
)
1347 switch (arvif
->vdev_type
) {
1348 case WMI_VDEV_TYPE_AP
:
1350 arg
->peer_flags
|= WMI_PEER_QOS
;
1352 if (sta
->wme
&& sta
->uapsd_queues
) {
1353 arg
->peer_flags
|= WMI_PEER_APSD
;
1354 arg
->peer_rate_caps
|= WMI_RC_UAPSD_FLAG
;
1357 case WMI_VDEV_TYPE_STA
:
1359 arg
->peer_flags
|= WMI_PEER_QOS
;
1366 static void ath10k_peer_assoc_h_phymode(struct ath10k
*ar
,
1367 struct ath10k_vif
*arvif
,
1368 struct ieee80211_sta
*sta
,
1369 struct wmi_peer_assoc_complete_arg
*arg
)
1371 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
1373 switch (ar
->hw
->conf
.chandef
.chan
->band
) {
1374 case IEEE80211_BAND_2GHZ
:
1375 if (sta
->ht_cap
.ht_supported
) {
1376 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1377 phymode
= MODE_11NG_HT40
;
1379 phymode
= MODE_11NG_HT20
;
1385 case IEEE80211_BAND_5GHZ
:
1389 if (sta
->vht_cap
.vht_supported
) {
1390 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
1391 phymode
= MODE_11AC_VHT80
;
1392 else if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1393 phymode
= MODE_11AC_VHT40
;
1394 else if (sta
->bandwidth
== IEEE80211_STA_RX_BW_20
)
1395 phymode
= MODE_11AC_VHT20
;
1396 } else if (sta
->ht_cap
.ht_supported
) {
1397 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
1398 phymode
= MODE_11NA_HT40
;
1400 phymode
= MODE_11NA_HT20
;
1410 ath10k_dbg(ATH10K_DBG_MAC
, "mac peer %pM phymode %s\n",
1411 sta
->addr
, ath10k_wmi_phymode_str(phymode
));
1413 arg
->peer_phymode
= phymode
;
1414 WARN_ON(phymode
== MODE_UNKNOWN
);
1417 static int ath10k_peer_assoc_prepare(struct ath10k
*ar
,
1418 struct ath10k_vif
*arvif
,
1419 struct ieee80211_sta
*sta
,
1420 struct ieee80211_bss_conf
*bss_conf
,
1421 struct wmi_peer_assoc_complete_arg
*arg
)
1423 lockdep_assert_held(&ar
->conf_mutex
);
1425 memset(arg
, 0, sizeof(*arg
));
1427 ath10k_peer_assoc_h_basic(ar
, arvif
, sta
, bss_conf
, arg
);
1428 ath10k_peer_assoc_h_crypto(ar
, arvif
, arg
);
1429 ath10k_peer_assoc_h_rates(ar
, sta
, arg
);
1430 ath10k_peer_assoc_h_ht(ar
, sta
, arg
);
1431 ath10k_peer_assoc_h_vht(ar
, sta
, arg
);
1432 ath10k_peer_assoc_h_qos(ar
, arvif
, sta
, bss_conf
, arg
);
1433 ath10k_peer_assoc_h_phymode(ar
, arvif
, sta
, arg
);
1438 static const u32 ath10k_smps_map
[] = {
1439 [WLAN_HT_CAP_SM_PS_STATIC
] = WMI_PEER_SMPS_STATIC
,
1440 [WLAN_HT_CAP_SM_PS_DYNAMIC
] = WMI_PEER_SMPS_DYNAMIC
,
1441 [WLAN_HT_CAP_SM_PS_INVALID
] = WMI_PEER_SMPS_PS_NONE
,
1442 [WLAN_HT_CAP_SM_PS_DISABLED
] = WMI_PEER_SMPS_PS_NONE
,
1445 static int ath10k_setup_peer_smps(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
1447 const struct ieee80211_sta_ht_cap
*ht_cap
)
1451 if (!ht_cap
->ht_supported
)
1454 smps
= ht_cap
->cap
& IEEE80211_HT_CAP_SM_PS
;
1455 smps
>>= IEEE80211_HT_CAP_SM_PS_SHIFT
;
1457 if (smps
>= ARRAY_SIZE(ath10k_smps_map
))
1460 return ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, addr
,
1461 WMI_PEER_SMPS_STATE
,
1462 ath10k_smps_map
[smps
]);
1465 /* can be called only in mac80211 callbacks due to `key_count` usage */
1466 static void ath10k_bss_assoc(struct ieee80211_hw
*hw
,
1467 struct ieee80211_vif
*vif
,
1468 struct ieee80211_bss_conf
*bss_conf
)
1470 struct ath10k
*ar
= hw
->priv
;
1471 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1472 struct ieee80211_sta_ht_cap ht_cap
;
1473 struct wmi_peer_assoc_complete_arg peer_arg
;
1474 struct ieee80211_sta
*ap_sta
;
1477 lockdep_assert_held(&ar
->conf_mutex
);
1481 ap_sta
= ieee80211_find_sta(vif
, bss_conf
->bssid
);
1483 ath10k_warn("failed to find station entry for bss %pM vdev %i\n",
1484 bss_conf
->bssid
, arvif
->vdev_id
);
1489 /* ap_sta must be accessed only within rcu section which must be left
1490 * before calling ath10k_setup_peer_smps() which might sleep. */
1491 ht_cap
= ap_sta
->ht_cap
;
1493 ret
= ath10k_peer_assoc_prepare(ar
, arvif
, ap_sta
,
1494 bss_conf
, &peer_arg
);
1496 ath10k_warn("failed to prepare peer assoc for %pM vdev %i: %d\n",
1497 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
1504 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
1506 ath10k_warn("failed to run peer assoc for %pM vdev %i: %d\n",
1507 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
1511 ret
= ath10k_setup_peer_smps(ar
, arvif
, bss_conf
->bssid
, &ht_cap
);
1513 ath10k_warn("failed to setup peer SMPS for vdev %i: %d\n",
1514 arvif
->vdev_id
, ret
);
1518 ath10k_dbg(ATH10K_DBG_MAC
,
1519 "mac vdev %d up (associated) bssid %pM aid %d\n",
1520 arvif
->vdev_id
, bss_conf
->bssid
, bss_conf
->aid
);
1522 arvif
->aid
= bss_conf
->aid
;
1523 memcpy(arvif
->bssid
, bss_conf
->bssid
, ETH_ALEN
);
1525 ret
= ath10k_wmi_vdev_up(ar
, arvif
->vdev_id
, arvif
->aid
, arvif
->bssid
);
1527 ath10k_warn("failed to set vdev %d up: %d\n",
1528 arvif
->vdev_id
, ret
);
1532 arvif
->is_up
= true;
1538 static void ath10k_bss_disassoc(struct ieee80211_hw
*hw
,
1539 struct ieee80211_vif
*vif
)
1541 struct ath10k
*ar
= hw
->priv
;
1542 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1545 lockdep_assert_held(&ar
->conf_mutex
);
1548 * For some reason, calling VDEV-DOWN before VDEV-STOP
1549 * makes the FW to send frames via HTT after disassociation.
1550 * No idea why this happens, even though VDEV-DOWN is supposed
1551 * to be analogous to link down, so just stop the VDEV.
1553 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d stop (disassociated\n",
1556 /* FIXME: check return value */
1557 ret
= ath10k_vdev_stop(arvif
);
1560 * If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
1561 * report beacons from previously associated network through HTT.
1562 * This in turn would spam mac80211 WARN_ON if we bring down all
1563 * interfaces as it expects there is no rx when no interface is
1566 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d down\n", arvif
->vdev_id
);
1568 /* FIXME: why don't we print error if wmi call fails? */
1569 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
1571 arvif
->def_wep_key_idx
= 0;
1573 arvif
->is_started
= false;
1574 arvif
->is_up
= false;
1577 static int ath10k_station_assoc(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
1578 struct ieee80211_sta
*sta
, bool reassoc
)
1580 struct wmi_peer_assoc_complete_arg peer_arg
;
1583 lockdep_assert_held(&ar
->conf_mutex
);
1585 ret
= ath10k_peer_assoc_prepare(ar
, arvif
, sta
, NULL
, &peer_arg
);
1587 ath10k_warn("failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
1588 sta
->addr
, arvif
->vdev_id
, ret
);
1592 peer_arg
.peer_reassoc
= reassoc
;
1593 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
1595 ath10k_warn("failed to run peer assoc for STA %pM vdev %i: %d\n",
1596 sta
->addr
, arvif
->vdev_id
, ret
);
1600 ret
= ath10k_setup_peer_smps(ar
, arvif
, sta
->addr
, &sta
->ht_cap
);
1602 ath10k_warn("failed to setup peer SMPS for vdev %d: %d\n",
1603 arvif
->vdev_id
, ret
);
1608 arvif
->num_legacy_stations
++;
1609 ret
= ath10k_recalc_rtscts_prot(arvif
);
1611 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1612 arvif
->vdev_id
, ret
);
1617 ret
= ath10k_install_peer_wep_keys(arvif
, sta
->addr
);
1619 ath10k_warn("failed to install peer wep keys for vdev %i: %d\n",
1620 arvif
->vdev_id
, ret
);
1624 ret
= ath10k_peer_assoc_qos_ap(ar
, arvif
, sta
);
1626 ath10k_warn("failed to set qos params for STA %pM for vdev %i: %d\n",
1627 sta
->addr
, arvif
->vdev_id
, ret
);
1634 static int ath10k_station_disassoc(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
1635 struct ieee80211_sta
*sta
)
1639 lockdep_assert_held(&ar
->conf_mutex
);
1642 arvif
->num_legacy_stations
--;
1643 ret
= ath10k_recalc_rtscts_prot(arvif
);
1645 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
1646 arvif
->vdev_id
, ret
);
1651 ret
= ath10k_clear_peer_keys(arvif
, sta
->addr
);
1653 ath10k_warn("failed to clear all peer wep keys for vdev %i: %d\n",
1654 arvif
->vdev_id
, ret
);
1665 static int ath10k_update_channel_list(struct ath10k
*ar
)
1667 struct ieee80211_hw
*hw
= ar
->hw
;
1668 struct ieee80211_supported_band
**bands
;
1669 enum ieee80211_band band
;
1670 struct ieee80211_channel
*channel
;
1671 struct wmi_scan_chan_list_arg arg
= {0};
1672 struct wmi_channel_arg
*ch
;
1678 lockdep_assert_held(&ar
->conf_mutex
);
1680 bands
= hw
->wiphy
->bands
;
1681 for (band
= 0; band
< IEEE80211_NUM_BANDS
; band
++) {
1685 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
1686 if (bands
[band
]->channels
[i
].flags
&
1687 IEEE80211_CHAN_DISABLED
)
1694 len
= sizeof(struct wmi_channel_arg
) * arg
.n_channels
;
1695 arg
.channels
= kzalloc(len
, GFP_KERNEL
);
1700 for (band
= 0; band
< IEEE80211_NUM_BANDS
; band
++) {
1704 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
1705 channel
= &bands
[band
]->channels
[i
];
1707 if (channel
->flags
& IEEE80211_CHAN_DISABLED
)
1710 ch
->allow_ht
= true;
1712 /* FIXME: when should we really allow VHT? */
1713 ch
->allow_vht
= true;
1716 !(channel
->flags
& IEEE80211_CHAN_NO_IR
);
1719 !(channel
->flags
& IEEE80211_CHAN_NO_HT40PLUS
);
1722 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
1724 passive
= channel
->flags
& IEEE80211_CHAN_NO_IR
;
1725 ch
->passive
= passive
;
1727 ch
->freq
= channel
->center_freq
;
1729 ch
->max_power
= channel
->max_power
* 2;
1730 ch
->max_reg_power
= channel
->max_reg_power
* 2;
1731 ch
->max_antenna_gain
= channel
->max_antenna_gain
* 2;
1732 ch
->reg_class_id
= 0; /* FIXME */
1734 /* FIXME: why use only legacy modes, why not any
1735 * HT/VHT modes? Would that even make any
1737 if (channel
->band
== IEEE80211_BAND_2GHZ
)
1738 ch
->mode
= MODE_11G
;
1740 ch
->mode
= MODE_11A
;
1742 if (WARN_ON_ONCE(ch
->mode
== MODE_UNKNOWN
))
1745 ath10k_dbg(ATH10K_DBG_WMI
,
1746 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
1747 ch
- arg
.channels
, arg
.n_channels
,
1748 ch
->freq
, ch
->max_power
, ch
->max_reg_power
,
1749 ch
->max_antenna_gain
, ch
->mode
);
1755 ret
= ath10k_wmi_scan_chan_list(ar
, &arg
);
1756 kfree(arg
.channels
);
1761 static enum wmi_dfs_region
1762 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region
)
1764 switch (dfs_region
) {
1765 case NL80211_DFS_UNSET
:
1766 return WMI_UNINIT_DFS_DOMAIN
;
1767 case NL80211_DFS_FCC
:
1768 return WMI_FCC_DFS_DOMAIN
;
1769 case NL80211_DFS_ETSI
:
1770 return WMI_ETSI_DFS_DOMAIN
;
1771 case NL80211_DFS_JP
:
1772 return WMI_MKK4_DFS_DOMAIN
;
1774 return WMI_UNINIT_DFS_DOMAIN
;
1777 static void ath10k_regd_update(struct ath10k
*ar
)
1779 struct reg_dmn_pair_mapping
*regpair
;
1781 enum wmi_dfs_region wmi_dfs_reg
;
1782 enum nl80211_dfs_regions nl_dfs_reg
;
1784 lockdep_assert_held(&ar
->conf_mutex
);
1786 ret
= ath10k_update_channel_list(ar
);
1788 ath10k_warn("failed to update channel list: %d\n", ret
);
1790 regpair
= ar
->ath_common
.regulatory
.regpair
;
1792 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
1793 nl_dfs_reg
= ar
->dfs_detector
->region
;
1794 wmi_dfs_reg
= ath10k_mac_get_dfs_region(nl_dfs_reg
);
1796 wmi_dfs_reg
= WMI_UNINIT_DFS_DOMAIN
;
1799 /* Target allows setting up per-band regdomain but ath_common provides
1800 * a combined one only */
1801 ret
= ath10k_wmi_pdev_set_regdomain(ar
,
1802 regpair
->reg_domain
,
1803 regpair
->reg_domain
, /* 2ghz */
1804 regpair
->reg_domain
, /* 5ghz */
1805 regpair
->reg_2ghz_ctl
,
1806 regpair
->reg_5ghz_ctl
,
1809 ath10k_warn("failed to set pdev regdomain: %d\n", ret
);
1812 static void ath10k_reg_notifier(struct wiphy
*wiphy
,
1813 struct regulatory_request
*request
)
1815 struct ieee80211_hw
*hw
= wiphy_to_ieee80211_hw(wiphy
);
1816 struct ath10k
*ar
= hw
->priv
;
1819 ath_reg_notifier_apply(wiphy
, request
, &ar
->ath_common
.regulatory
);
1821 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
1822 ath10k_dbg(ATH10K_DBG_REGULATORY
, "dfs region 0x%x\n",
1823 request
->dfs_region
);
1824 result
= ar
->dfs_detector
->set_dfs_domain(ar
->dfs_detector
,
1825 request
->dfs_region
);
1827 ath10k_warn("DFS region 0x%X not supported, will trigger radar for every pulse\n",
1828 request
->dfs_region
);
1831 mutex_lock(&ar
->conf_mutex
);
1832 if (ar
->state
== ATH10K_STATE_ON
)
1833 ath10k_regd_update(ar
);
1834 mutex_unlock(&ar
->conf_mutex
);
1841 static u8
ath10k_tx_h_get_tid(struct ieee80211_hdr
*hdr
)
1843 if (ieee80211_is_mgmt(hdr
->frame_control
))
1844 return HTT_DATA_TX_EXT_TID_MGMT
;
1846 if (!ieee80211_is_data_qos(hdr
->frame_control
))
1847 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST
;
1849 if (!is_unicast_ether_addr(ieee80211_get_DA(hdr
)))
1850 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST
;
1852 return ieee80211_get_qos_ctl(hdr
)[0] & IEEE80211_QOS_CTL_TID_MASK
;
1855 static u8
ath10k_tx_h_get_vdev_id(struct ath10k
*ar
,
1856 struct ieee80211_tx_info
*info
)
1858 if (info
->control
.vif
)
1859 return ath10k_vif_to_arvif(info
->control
.vif
)->vdev_id
;
1861 if (ar
->monitor_started
)
1862 return ar
->monitor_vdev_id
;
1864 ath10k_warn("failed to resolve vdev id\n");
1869 * Frames sent to the FW have to be in "Native Wifi" format.
1870 * Strip the QoS field from the 802.11 header.
1872 static void ath10k_tx_h_qos_workaround(struct ieee80211_hw
*hw
,
1873 struct ieee80211_tx_control
*control
,
1874 struct sk_buff
*skb
)
1876 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
1879 if (!ieee80211_is_data_qos(hdr
->frame_control
))
1882 qos_ctl
= ieee80211_get_qos_ctl(hdr
);
1883 memmove(skb
->data
+ IEEE80211_QOS_CTL_LEN
,
1884 skb
->data
, (void *)qos_ctl
- (void *)skb
->data
);
1885 skb_pull(skb
, IEEE80211_QOS_CTL_LEN
);
1888 static void ath10k_tx_wep_key_work(struct work_struct
*work
)
1890 struct ath10k_vif
*arvif
= container_of(work
, struct ath10k_vif
,
1892 int ret
, keyidx
= arvif
->def_wep_key_newidx
;
1894 if (arvif
->def_wep_key_idx
== keyidx
)
1897 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d set keyidx %d\n",
1898 arvif
->vdev_id
, keyidx
);
1900 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
,
1902 arvif
->ar
->wmi
.vdev_param
->def_keyid
,
1905 ath10k_warn("failed to update wep key index for vdev %d: %d\n",
1911 arvif
->def_wep_key_idx
= keyidx
;
1914 static void ath10k_tx_h_update_wep_key(struct sk_buff
*skb
)
1916 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
1917 struct ieee80211_vif
*vif
= info
->control
.vif
;
1918 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1919 struct ath10k
*ar
= arvif
->ar
;
1920 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
1921 struct ieee80211_key_conf
*key
= info
->control
.hw_key
;
1923 if (!ieee80211_has_protected(hdr
->frame_control
))
1929 if (key
->cipher
!= WLAN_CIPHER_SUITE_WEP40
&&
1930 key
->cipher
!= WLAN_CIPHER_SUITE_WEP104
)
1933 if (key
->keyidx
== arvif
->def_wep_key_idx
)
1936 /* FIXME: Most likely a few frames will be TXed with an old key. Simply
1937 * queueing frames until key index is updated is not an option because
1938 * sk_buff may need more processing to be done, e.g. offchannel */
1939 arvif
->def_wep_key_newidx
= key
->keyidx
;
1940 ieee80211_queue_work(ar
->hw
, &arvif
->wep_key_work
);
1943 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k
*ar
, struct sk_buff
*skb
)
1945 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
1946 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
1947 struct ieee80211_vif
*vif
= info
->control
.vif
;
1948 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1950 /* This is case only for P2P_GO */
1951 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
||
1952 arvif
->vdev_subtype
!= WMI_VDEV_SUBTYPE_P2P_GO
)
1955 if (unlikely(ieee80211_is_probe_resp(hdr
->frame_control
))) {
1956 spin_lock_bh(&ar
->data_lock
);
1957 if (arvif
->u
.ap
.noa_data
)
1958 if (!pskb_expand_head(skb
, 0, arvif
->u
.ap
.noa_len
,
1960 memcpy(skb_put(skb
, arvif
->u
.ap
.noa_len
),
1961 arvif
->u
.ap
.noa_data
,
1962 arvif
->u
.ap
.noa_len
);
1963 spin_unlock_bh(&ar
->data_lock
);
1967 static void ath10k_tx_htt(struct ath10k
*ar
, struct sk_buff
*skb
)
1969 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
1972 if (ar
->htt
.target_version_major
>= 3) {
1973 /* Since HTT 3.0 there is no separate mgmt tx command */
1974 ret
= ath10k_htt_tx(&ar
->htt
, skb
);
1978 if (ieee80211_is_mgmt(hdr
->frame_control
)) {
1979 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
1981 if (skb_queue_len(&ar
->wmi_mgmt_tx_queue
) >=
1982 ATH10K_MAX_NUM_MGMT_PENDING
) {
1983 ath10k_warn("reached WMI management tranmist queue limit\n");
1988 skb_queue_tail(&ar
->wmi_mgmt_tx_queue
, skb
);
1989 ieee80211_queue_work(ar
->hw
, &ar
->wmi_mgmt_tx_work
);
1991 ret
= ath10k_htt_mgmt_tx(&ar
->htt
, skb
);
1993 } else if (!test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
1995 ieee80211_is_nullfunc(hdr
->frame_control
)) {
1996 /* FW does not report tx status properly for NullFunc frames
1997 * unless they are sent through mgmt tx path. mac80211 sends
1998 * those frames when it detects link/beacon loss and depends
1999 * on the tx status to be correct. */
2000 ret
= ath10k_htt_mgmt_tx(&ar
->htt
, skb
);
2002 ret
= ath10k_htt_tx(&ar
->htt
, skb
);
2007 ath10k_warn("failed to transmit packet, dropping: %d\n", ret
);
2008 ieee80211_free_txskb(ar
->hw
, skb
);
2012 void ath10k_offchan_tx_purge(struct ath10k
*ar
)
2014 struct sk_buff
*skb
;
2017 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
2021 ieee80211_free_txskb(ar
->hw
, skb
);
2025 void ath10k_offchan_tx_work(struct work_struct
*work
)
2027 struct ath10k
*ar
= container_of(work
, struct ath10k
, offchan_tx_work
);
2028 struct ath10k_peer
*peer
;
2029 struct ieee80211_hdr
*hdr
;
2030 struct sk_buff
*skb
;
2031 const u8
*peer_addr
;
2035 /* FW requirement: We must create a peer before FW will send out
2036 * an offchannel frame. Otherwise the frame will be stuck and
2037 * never transmitted. We delete the peer upon tx completion.
2038 * It is unlikely that a peer for offchannel tx will already be
2039 * present. However it may be in some rare cases so account for that.
2040 * Otherwise we might remove a legitimate peer and break stuff. */
2043 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
2047 mutex_lock(&ar
->conf_mutex
);
2049 ath10k_dbg(ATH10K_DBG_MAC
, "mac offchannel skb %p\n",
2052 hdr
= (struct ieee80211_hdr
*)skb
->data
;
2053 peer_addr
= ieee80211_get_DA(hdr
);
2054 vdev_id
= ATH10K_SKB_CB(skb
)->vdev_id
;
2056 spin_lock_bh(&ar
->data_lock
);
2057 peer
= ath10k_peer_find(ar
, vdev_id
, peer_addr
);
2058 spin_unlock_bh(&ar
->data_lock
);
2061 /* FIXME: should this use ath10k_warn()? */
2062 ath10k_dbg(ATH10K_DBG_MAC
, "peer %pM on vdev %d already present\n",
2063 peer_addr
, vdev_id
);
2066 ret
= ath10k_peer_create(ar
, vdev_id
, peer_addr
);
2068 ath10k_warn("failed to create peer %pM on vdev %d: %d\n",
2069 peer_addr
, vdev_id
, ret
);
2072 spin_lock_bh(&ar
->data_lock
);
2073 reinit_completion(&ar
->offchan_tx_completed
);
2074 ar
->offchan_tx_skb
= skb
;
2075 spin_unlock_bh(&ar
->data_lock
);
2077 ath10k_tx_htt(ar
, skb
);
2079 ret
= wait_for_completion_timeout(&ar
->offchan_tx_completed
,
2082 ath10k_warn("timed out waiting for offchannel skb %p\n",
2086 ret
= ath10k_peer_delete(ar
, vdev_id
, peer_addr
);
2088 ath10k_warn("failed to delete peer %pM on vdev %d: %d\n",
2089 peer_addr
, vdev_id
, ret
);
2092 mutex_unlock(&ar
->conf_mutex
);
2096 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k
*ar
)
2098 struct sk_buff
*skb
;
2101 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
2105 ieee80211_free_txskb(ar
->hw
, skb
);
2109 void ath10k_mgmt_over_wmi_tx_work(struct work_struct
*work
)
2111 struct ath10k
*ar
= container_of(work
, struct ath10k
, wmi_mgmt_tx_work
);
2112 struct sk_buff
*skb
;
2116 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
2120 ret
= ath10k_wmi_mgmt_tx(ar
, skb
);
2122 ath10k_warn("failed to transmit management frame via WMI: %d\n",
2124 ieee80211_free_txskb(ar
->hw
, skb
);
2134 * This gets called if we dont get a heart-beat during scan.
2135 * This may indicate the FW has hung and we need to abort the
2136 * scan manually to prevent cancel_hw_scan() from deadlocking
2138 void ath10k_reset_scan(unsigned long ptr
)
2140 struct ath10k
*ar
= (struct ath10k
*)ptr
;
2142 spin_lock_bh(&ar
->data_lock
);
2143 if (!ar
->scan
.in_progress
) {
2144 spin_unlock_bh(&ar
->data_lock
);
2148 ath10k_warn("scan timed out, firmware problem?\n");
2150 if (ar
->scan
.is_roc
)
2151 ieee80211_remain_on_channel_expired(ar
->hw
);
2153 ieee80211_scan_completed(ar
->hw
, 1 /* aborted */);
2155 ar
->scan
.in_progress
= false;
2156 complete_all(&ar
->scan
.completed
);
2157 spin_unlock_bh(&ar
->data_lock
);
2160 static int ath10k_abort_scan(struct ath10k
*ar
)
2162 struct wmi_stop_scan_arg arg
= {
2163 .req_id
= 1, /* FIXME */
2164 .req_type
= WMI_SCAN_STOP_ONE
,
2165 .u
.scan_id
= ATH10K_SCAN_ID
,
2169 lockdep_assert_held(&ar
->conf_mutex
);
2171 del_timer_sync(&ar
->scan
.timeout
);
2173 spin_lock_bh(&ar
->data_lock
);
2174 if (!ar
->scan
.in_progress
) {
2175 spin_unlock_bh(&ar
->data_lock
);
2179 ar
->scan
.aborting
= true;
2180 spin_unlock_bh(&ar
->data_lock
);
2182 ret
= ath10k_wmi_stop_scan(ar
, &arg
);
2184 ath10k_warn("failed to stop wmi scan: %d\n", ret
);
2185 spin_lock_bh(&ar
->data_lock
);
2186 ar
->scan
.in_progress
= false;
2187 ath10k_offchan_tx_purge(ar
);
2188 spin_unlock_bh(&ar
->data_lock
);
2192 ret
= wait_for_completion_timeout(&ar
->scan
.completed
, 3*HZ
);
2194 ath10k_warn("timed out while waiting for scan to stop\n");
2196 /* scan completion may be done right after we timeout here, so let's
2197 * check the in_progress and tell mac80211 scan is completed. if we
2198 * don't do that and FW fails to send us scan completion indication
2199 * then userspace won't be able to scan anymore */
2202 spin_lock_bh(&ar
->data_lock
);
2203 if (ar
->scan
.in_progress
) {
2204 ath10k_warn("failed to stop scan, it's still in progress\n");
2205 ar
->scan
.in_progress
= false;
2206 ath10k_offchan_tx_purge(ar
);
2209 spin_unlock_bh(&ar
->data_lock
);
2214 static int ath10k_start_scan(struct ath10k
*ar
,
2215 const struct wmi_start_scan_arg
*arg
)
2219 lockdep_assert_held(&ar
->conf_mutex
);
2221 ret
= ath10k_wmi_start_scan(ar
, arg
);
2225 ret
= wait_for_completion_timeout(&ar
->scan
.started
, 1*HZ
);
2227 ath10k_abort_scan(ar
);
2231 /* the scan can complete earlier, before we even
2232 * start the timer. in that case the timer handler
2233 * checks ar->scan.in_progress and bails out if its
2234 * false. Add a 200ms margin to account event/command
2236 mod_timer(&ar
->scan
.timeout
, jiffies
+
2237 msecs_to_jiffies(arg
->max_scan_time
+200));
2241 /**********************/
2242 /* mac80211 callbacks */
2243 /**********************/
2245 static void ath10k_tx(struct ieee80211_hw
*hw
,
2246 struct ieee80211_tx_control
*control
,
2247 struct sk_buff
*skb
)
2249 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
2250 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
2251 struct ath10k
*ar
= hw
->priv
;
2254 /* We should disable CCK RATE due to P2P */
2255 if (info
->flags
& IEEE80211_TX_CTL_NO_CCK_RATE
)
2256 ath10k_dbg(ATH10K_DBG_MAC
, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2258 /* we must calculate tid before we apply qos workaround
2259 * as we'd lose the qos control field */
2260 tid
= ath10k_tx_h_get_tid(hdr
);
2261 vdev_id
= ath10k_tx_h_get_vdev_id(ar
, info
);
2263 /* it makes no sense to process injected frames like that */
2264 if (info
->control
.vif
&&
2265 info
->control
.vif
->type
!= NL80211_IFTYPE_MONITOR
) {
2266 ath10k_tx_h_qos_workaround(hw
, control
, skb
);
2267 ath10k_tx_h_update_wep_key(skb
);
2268 ath10k_tx_h_add_p2p_noa_ie(ar
, skb
);
2269 ath10k_tx_h_seq_no(skb
);
2272 ATH10K_SKB_CB(skb
)->vdev_id
= vdev_id
;
2273 ATH10K_SKB_CB(skb
)->htt
.is_offchan
= false;
2274 ATH10K_SKB_CB(skb
)->htt
.tid
= tid
;
2276 if (info
->flags
& IEEE80211_TX_CTL_TX_OFFCHAN
) {
2277 spin_lock_bh(&ar
->data_lock
);
2278 ATH10K_SKB_CB(skb
)->htt
.is_offchan
= true;
2279 ATH10K_SKB_CB(skb
)->vdev_id
= ar
->scan
.vdev_id
;
2280 spin_unlock_bh(&ar
->data_lock
);
2282 ath10k_dbg(ATH10K_DBG_MAC
, "queued offchannel skb %p\n", skb
);
2284 skb_queue_tail(&ar
->offchan_tx_queue
, skb
);
2285 ieee80211_queue_work(hw
, &ar
->offchan_tx_work
);
2289 ath10k_tx_htt(ar
, skb
);
2293 * Initialize various parameters with default vaules.
2295 void ath10k_halt(struct ath10k
*ar
)
2297 struct ath10k_vif
*arvif
;
2299 lockdep_assert_held(&ar
->conf_mutex
);
2301 if (ath10k_monitor_is_enabled(ar
)) {
2302 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
2303 ar
->promisc
= false;
2304 ar
->monitor
= false;
2305 ath10k_monitor_stop(ar
);
2308 del_timer_sync(&ar
->scan
.timeout
);
2309 ath10k_offchan_tx_purge(ar
);
2310 ath10k_mgmt_over_wmi_tx_purge(ar
);
2311 ath10k_peer_cleanup_all(ar
);
2312 ath10k_core_stop(ar
);
2313 ath10k_hif_power_down(ar
);
2315 spin_lock_bh(&ar
->data_lock
);
2316 if (ar
->scan
.in_progress
) {
2317 del_timer(&ar
->scan
.timeout
);
2318 ar
->scan
.in_progress
= false;
2319 ieee80211_scan_completed(ar
->hw
, true);
2322 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
2326 dma_unmap_single(arvif
->ar
->dev
,
2327 ATH10K_SKB_CB(arvif
->beacon
)->paddr
,
2328 arvif
->beacon
->len
, DMA_TO_DEVICE
);
2329 dev_kfree_skb_any(arvif
->beacon
);
2330 arvif
->beacon
= NULL
;
2332 spin_unlock_bh(&ar
->data_lock
);
2335 static int ath10k_get_antenna(struct ieee80211_hw
*hw
, u32
*tx_ant
, u32
*rx_ant
)
2337 struct ath10k
*ar
= hw
->priv
;
2339 mutex_lock(&ar
->conf_mutex
);
2341 if (ar
->cfg_tx_chainmask
) {
2342 *tx_ant
= ar
->cfg_tx_chainmask
;
2343 *rx_ant
= ar
->cfg_rx_chainmask
;
2345 *tx_ant
= ar
->supp_tx_chainmask
;
2346 *rx_ant
= ar
->supp_rx_chainmask
;
2349 mutex_unlock(&ar
->conf_mutex
);
2354 static int __ath10k_set_antenna(struct ath10k
*ar
, u32 tx_ant
, u32 rx_ant
)
2358 lockdep_assert_held(&ar
->conf_mutex
);
2360 ar
->cfg_tx_chainmask
= tx_ant
;
2361 ar
->cfg_rx_chainmask
= rx_ant
;
2363 if ((ar
->state
!= ATH10K_STATE_ON
) &&
2364 (ar
->state
!= ATH10K_STATE_RESTARTED
))
2367 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->tx_chain_mask
,
2370 ath10k_warn("failed to set tx-chainmask: %d, req 0x%x\n",
2375 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->rx_chain_mask
,
2378 ath10k_warn("failed to set rx-chainmask: %d, req 0x%x\n",
2386 static int ath10k_set_antenna(struct ieee80211_hw
*hw
, u32 tx_ant
, u32 rx_ant
)
2388 struct ath10k
*ar
= hw
->priv
;
2391 mutex_lock(&ar
->conf_mutex
);
2392 ret
= __ath10k_set_antenna(ar
, tx_ant
, rx_ant
);
2393 mutex_unlock(&ar
->conf_mutex
);
2397 static int ath10k_start(struct ieee80211_hw
*hw
)
2399 struct ath10k
*ar
= hw
->priv
;
2402 mutex_lock(&ar
->conf_mutex
);
2404 if (ar
->state
!= ATH10K_STATE_OFF
&&
2405 ar
->state
!= ATH10K_STATE_RESTARTING
) {
2410 ret
= ath10k_hif_power_up(ar
);
2412 ath10k_err("Could not init hif: %d\n", ret
);
2413 ar
->state
= ATH10K_STATE_OFF
;
2417 ret
= ath10k_core_start(ar
);
2419 ath10k_err("Could not init core: %d\n", ret
);
2420 ath10k_hif_power_down(ar
);
2421 ar
->state
= ATH10K_STATE_OFF
;
2425 if (ar
->state
== ATH10K_STATE_OFF
)
2426 ar
->state
= ATH10K_STATE_ON
;
2427 else if (ar
->state
== ATH10K_STATE_RESTARTING
)
2428 ar
->state
= ATH10K_STATE_RESTARTED
;
2430 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->pmf_qos
, 1);
2432 ath10k_warn("failed to enable PMF QOS: %d\n", ret
);
2434 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->dynamic_bw
, 1);
2436 ath10k_warn("failed to enable dynamic BW: %d\n", ret
);
2438 if (ar
->cfg_tx_chainmask
)
2439 __ath10k_set_antenna(ar
, ar
->cfg_tx_chainmask
,
2440 ar
->cfg_rx_chainmask
);
2443 * By default FW set ARP frames ac to voice (6). In that case ARP
2444 * exchange is not working properly for UAPSD enabled AP. ARP requests
2445 * which arrives with access category 0 are processed by network stack
2446 * and send back with access category 0, but FW changes access category
2447 * to 6. Set ARP frames access category to best effort (0) solves
2451 ret
= ath10k_wmi_pdev_set_param(ar
,
2452 ar
->wmi
.pdev_param
->arp_ac_override
, 0);
2454 ath10k_warn("failed to set arp ac override parameter: %d\n",
2459 ar
->num_started_vdevs
= 0;
2460 ath10k_regd_update(ar
);
2464 mutex_unlock(&ar
->conf_mutex
);
2468 static void ath10k_stop(struct ieee80211_hw
*hw
)
2470 struct ath10k
*ar
= hw
->priv
;
2472 mutex_lock(&ar
->conf_mutex
);
2473 if (ar
->state
== ATH10K_STATE_ON
||
2474 ar
->state
== ATH10K_STATE_RESTARTED
||
2475 ar
->state
== ATH10K_STATE_WEDGED
)
2478 ar
->state
= ATH10K_STATE_OFF
;
2479 mutex_unlock(&ar
->conf_mutex
);
2481 ath10k_mgmt_over_wmi_tx_purge(ar
);
2483 cancel_work_sync(&ar
->offchan_tx_work
);
2484 cancel_work_sync(&ar
->wmi_mgmt_tx_work
);
2485 cancel_work_sync(&ar
->restart_work
);
2488 static int ath10k_config_ps(struct ath10k
*ar
)
2490 struct ath10k_vif
*arvif
;
2493 lockdep_assert_held(&ar
->conf_mutex
);
2495 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
2496 ret
= ath10k_mac_vif_setup_ps(arvif
);
2498 ath10k_warn("failed to setup powersave: %d\n", ret
);
2506 static const char *chandef_get_width(enum nl80211_chan_width width
)
2509 case NL80211_CHAN_WIDTH_20_NOHT
:
2511 case NL80211_CHAN_WIDTH_20
:
2513 case NL80211_CHAN_WIDTH_40
:
2515 case NL80211_CHAN_WIDTH_80
:
2517 case NL80211_CHAN_WIDTH_80P80
:
2519 case NL80211_CHAN_WIDTH_160
:
2521 case NL80211_CHAN_WIDTH_5
:
2523 case NL80211_CHAN_WIDTH_10
:
2529 static void ath10k_config_chan(struct ath10k
*ar
)
2531 struct ath10k_vif
*arvif
;
2534 lockdep_assert_held(&ar
->conf_mutex
);
2536 ath10k_dbg(ATH10K_DBG_MAC
,
2537 "mac config channel to %dMHz (cf1 %dMHz cf2 %dMHz width %s)\n",
2538 ar
->chandef
.chan
->center_freq
,
2539 ar
->chandef
.center_freq1
,
2540 ar
->chandef
.center_freq2
,
2541 chandef_get_width(ar
->chandef
.width
));
2543 /* First stop monitor interface. Some FW versions crash if there's a
2544 * lone monitor interface. */
2545 if (ar
->monitor_started
)
2546 ath10k_monitor_vdev_stop(ar
);
2548 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
2549 if (!arvif
->is_started
)
2552 if (arvif
->vdev_type
== WMI_VDEV_TYPE_MONITOR
)
2555 ret
= ath10k_vdev_stop(arvif
);
2557 ath10k_warn("failed to stop vdev %d: %d\n",
2558 arvif
->vdev_id
, ret
);
2563 /* all vdevs are now stopped - now attempt to restart them */
2565 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
2566 if (!arvif
->is_started
)
2569 if (arvif
->vdev_type
== WMI_VDEV_TYPE_MONITOR
)
2572 ret
= ath10k_vdev_start(arvif
);
2574 ath10k_warn("failed to start vdev %d: %d\n",
2575 arvif
->vdev_id
, ret
);
2582 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
2585 ath10k_warn("failed to bring vdev up %d: %d\n",
2586 arvif
->vdev_id
, ret
);
2591 if (ath10k_monitor_is_enabled(ar
))
2592 ath10k_monitor_vdev_start(ar
, ar
->monitor_vdev_id
);
2595 static int ath10k_config(struct ieee80211_hw
*hw
, u32 changed
)
2597 struct ath10k
*ar
= hw
->priv
;
2598 struct ieee80211_conf
*conf
= &hw
->conf
;
2602 mutex_lock(&ar
->conf_mutex
);
2604 if (changed
& IEEE80211_CONF_CHANGE_CHANNEL
) {
2605 ath10k_dbg(ATH10K_DBG_MAC
,
2606 "mac config channel %dMHz flags 0x%x radar %d\n",
2607 conf
->chandef
.chan
->center_freq
,
2608 conf
->chandef
.chan
->flags
,
2609 conf
->radar_enabled
);
2611 spin_lock_bh(&ar
->data_lock
);
2612 ar
->rx_channel
= conf
->chandef
.chan
;
2613 spin_unlock_bh(&ar
->data_lock
);
2615 ar
->radar_enabled
= conf
->radar_enabled
;
2616 ath10k_recalc_radar_detection(ar
);
2618 if (!cfg80211_chandef_identical(&ar
->chandef
, &conf
->chandef
)) {
2619 ar
->chandef
= conf
->chandef
;
2620 ath10k_config_chan(ar
);
2624 if (changed
& IEEE80211_CONF_CHANGE_POWER
) {
2625 ath10k_dbg(ATH10K_DBG_MAC
, "mac config power %d\n",
2626 hw
->conf
.power_level
);
2628 param
= ar
->wmi
.pdev_param
->txpower_limit2g
;
2629 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
2630 hw
->conf
.power_level
* 2);
2632 ath10k_warn("failed to set 2g txpower %d: %d\n",
2633 hw
->conf
.power_level
, ret
);
2635 param
= ar
->wmi
.pdev_param
->txpower_limit5g
;
2636 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
2637 hw
->conf
.power_level
* 2);
2639 ath10k_warn("failed to set 5g txpower %d: %d\n",
2640 hw
->conf
.power_level
, ret
);
2643 if (changed
& IEEE80211_CONF_CHANGE_PS
)
2644 ath10k_config_ps(ar
);
2646 if (changed
& IEEE80211_CONF_CHANGE_MONITOR
) {
2647 if (conf
->flags
& IEEE80211_CONF_MONITOR
&& !ar
->monitor
) {
2649 ret
= ath10k_monitor_start(ar
);
2651 ath10k_warn("failed to start monitor (config): %d\n",
2653 ar
->monitor
= false;
2655 } else if (!(conf
->flags
& IEEE80211_CONF_MONITOR
) &&
2657 ar
->monitor
= false;
2658 ath10k_monitor_stop(ar
);
2662 mutex_unlock(&ar
->conf_mutex
);
2668 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
2669 * because we will send mgmt frames without CCK. This requirement
2670 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
2673 static int ath10k_add_interface(struct ieee80211_hw
*hw
,
2674 struct ieee80211_vif
*vif
)
2676 struct ath10k
*ar
= hw
->priv
;
2677 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2678 enum wmi_sta_powersave_param param
;
2684 mutex_lock(&ar
->conf_mutex
);
2686 memset(arvif
, 0, sizeof(*arvif
));
2691 INIT_WORK(&arvif
->wep_key_work
, ath10k_tx_wep_key_work
);
2692 INIT_LIST_HEAD(&arvif
->list
);
2694 bit
= ffs(ar
->free_vdev_map
);
2700 arvif
->vdev_id
= bit
- 1;
2701 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_NONE
;
2704 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_P2P_DEVICE
;
2706 switch (vif
->type
) {
2707 case NL80211_IFTYPE_UNSPECIFIED
:
2708 case NL80211_IFTYPE_STATION
:
2709 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
2711 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_P2P_CLIENT
;
2713 case NL80211_IFTYPE_ADHOC
:
2714 arvif
->vdev_type
= WMI_VDEV_TYPE_IBSS
;
2716 case NL80211_IFTYPE_AP
:
2717 arvif
->vdev_type
= WMI_VDEV_TYPE_AP
;
2720 arvif
->vdev_subtype
= WMI_VDEV_SUBTYPE_P2P_GO
;
2722 case NL80211_IFTYPE_MONITOR
:
2723 arvif
->vdev_type
= WMI_VDEV_TYPE_MONITOR
;
2730 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev create %d (add interface) type %d subtype %d\n",
2731 arvif
->vdev_id
, arvif
->vdev_type
, arvif
->vdev_subtype
);
2733 ret
= ath10k_wmi_vdev_create(ar
, arvif
->vdev_id
, arvif
->vdev_type
,
2734 arvif
->vdev_subtype
, vif
->addr
);
2736 ath10k_warn("failed to create WMI vdev %i: %d\n",
2737 arvif
->vdev_id
, ret
);
2741 ar
->free_vdev_map
&= ~BIT(arvif
->vdev_id
);
2742 list_add(&arvif
->list
, &ar
->arvifs
);
2744 vdev_param
= ar
->wmi
.vdev_param
->def_keyid
;
2745 ret
= ath10k_wmi_vdev_set_param(ar
, 0, vdev_param
,
2746 arvif
->def_wep_key_idx
);
2748 ath10k_warn("failed to set vdev %i default key id: %d\n",
2749 arvif
->vdev_id
, ret
);
2750 goto err_vdev_delete
;
2753 vdev_param
= ar
->wmi
.vdev_param
->tx_encap_type
;
2754 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
2755 ATH10K_HW_TXRX_NATIVE_WIFI
);
2756 /* 10.X firmware does not support this VDEV parameter. Do not warn */
2757 if (ret
&& ret
!= -EOPNOTSUPP
) {
2758 ath10k_warn("failed to set vdev %i TX encapsulation: %d\n",
2759 arvif
->vdev_id
, ret
);
2760 goto err_vdev_delete
;
2763 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
2764 ret
= ath10k_peer_create(ar
, arvif
->vdev_id
, vif
->addr
);
2766 ath10k_warn("failed to create vdev %i peer for AP: %d\n",
2767 arvif
->vdev_id
, ret
);
2768 goto err_vdev_delete
;
2771 ret
= ath10k_mac_set_kickout(arvif
);
2773 ath10k_warn("failed to set vdev %i kickout parameters: %d\n",
2774 arvif
->vdev_id
, ret
);
2775 goto err_peer_delete
;
2779 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
) {
2780 param
= WMI_STA_PS_PARAM_RX_WAKE_POLICY
;
2781 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
2782 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
2785 ath10k_warn("failed to set vdev %i RX wake policy: %d\n",
2786 arvif
->vdev_id
, ret
);
2787 goto err_peer_delete
;
2790 param
= WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD
;
2791 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS
;
2792 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
2795 ath10k_warn("failed to set vdev %i TX wake thresh: %d\n",
2796 arvif
->vdev_id
, ret
);
2797 goto err_peer_delete
;
2800 param
= WMI_STA_PS_PARAM_PSPOLL_COUNT
;
2801 value
= WMI_STA_PS_PSPOLL_COUNT_NO_MAX
;
2802 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
2805 ath10k_warn("failed to set vdev %i PSPOLL count: %d\n",
2806 arvif
->vdev_id
, ret
);
2807 goto err_peer_delete
;
2811 ret
= ath10k_mac_set_rts(arvif
, ar
->hw
->wiphy
->rts_threshold
);
2813 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
2814 arvif
->vdev_id
, ret
);
2815 goto err_peer_delete
;
2818 ret
= ath10k_mac_set_frag(arvif
, ar
->hw
->wiphy
->frag_threshold
);
2820 ath10k_warn("failed to set frag threshold for vdev %d: %d\n",
2821 arvif
->vdev_id
, ret
);
2822 goto err_peer_delete
;
2825 mutex_unlock(&ar
->conf_mutex
);
2829 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
)
2830 ath10k_wmi_peer_delete(ar
, arvif
->vdev_id
, vif
->addr
);
2833 ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
2834 ar
->free_vdev_map
&= ~BIT(arvif
->vdev_id
);
2835 list_del(&arvif
->list
);
2838 mutex_unlock(&ar
->conf_mutex
);
2843 static void ath10k_remove_interface(struct ieee80211_hw
*hw
,
2844 struct ieee80211_vif
*vif
)
2846 struct ath10k
*ar
= hw
->priv
;
2847 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2850 mutex_lock(&ar
->conf_mutex
);
2852 cancel_work_sync(&arvif
->wep_key_work
);
2854 spin_lock_bh(&ar
->data_lock
);
2855 if (arvif
->beacon
) {
2856 dma_unmap_single(arvif
->ar
->dev
,
2857 ATH10K_SKB_CB(arvif
->beacon
)->paddr
,
2858 arvif
->beacon
->len
, DMA_TO_DEVICE
);
2859 dev_kfree_skb_any(arvif
->beacon
);
2860 arvif
->beacon
= NULL
;
2862 spin_unlock_bh(&ar
->data_lock
);
2864 ar
->free_vdev_map
|= 1 << (arvif
->vdev_id
);
2865 list_del(&arvif
->list
);
2867 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
2868 ret
= ath10k_peer_delete(arvif
->ar
, arvif
->vdev_id
, vif
->addr
);
2870 ath10k_warn("failed to remove peer for AP vdev %i: %d\n",
2871 arvif
->vdev_id
, ret
);
2873 kfree(arvif
->u
.ap
.noa_data
);
2876 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %i delete (remove interface)\n",
2879 ret
= ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
2881 ath10k_warn("failed to delete WMI vdev %i: %d\n",
2882 arvif
->vdev_id
, ret
);
2884 ath10k_peer_cleanup(ar
, arvif
->vdev_id
);
2886 mutex_unlock(&ar
->conf_mutex
);
2890 * FIXME: Has to be verified.
2892 #define SUPPORTED_FILTERS \
2893 (FIF_PROMISC_IN_BSS | \
2898 FIF_BCN_PRBRESP_PROMISC | \
2902 static void ath10k_configure_filter(struct ieee80211_hw
*hw
,
2903 unsigned int changed_flags
,
2904 unsigned int *total_flags
,
2907 struct ath10k
*ar
= hw
->priv
;
2910 mutex_lock(&ar
->conf_mutex
);
2912 changed_flags
&= SUPPORTED_FILTERS
;
2913 *total_flags
&= SUPPORTED_FILTERS
;
2914 ar
->filter_flags
= *total_flags
;
2916 if (ar
->filter_flags
& FIF_PROMISC_IN_BSS
&& !ar
->promisc
) {
2918 ret
= ath10k_monitor_start(ar
);
2920 ath10k_warn("failed to start monitor (promisc): %d\n",
2922 ar
->promisc
= false;
2924 } else if (!(ar
->filter_flags
& FIF_PROMISC_IN_BSS
) && ar
->promisc
) {
2925 ar
->promisc
= false;
2926 ath10k_monitor_stop(ar
);
2929 mutex_unlock(&ar
->conf_mutex
);
2932 static void ath10k_bss_info_changed(struct ieee80211_hw
*hw
,
2933 struct ieee80211_vif
*vif
,
2934 struct ieee80211_bss_conf
*info
,
2937 struct ath10k
*ar
= hw
->priv
;
2938 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2940 u32 vdev_param
, pdev_param
;
2942 mutex_lock(&ar
->conf_mutex
);
2944 if (changed
& BSS_CHANGED_IBSS
)
2945 ath10k_control_ibss(arvif
, info
, vif
->addr
);
2947 if (changed
& BSS_CHANGED_BEACON_INT
) {
2948 arvif
->beacon_interval
= info
->beacon_int
;
2949 vdev_param
= ar
->wmi
.vdev_param
->beacon_interval
;
2950 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
2951 arvif
->beacon_interval
);
2952 ath10k_dbg(ATH10K_DBG_MAC
,
2953 "mac vdev %d beacon_interval %d\n",
2954 arvif
->vdev_id
, arvif
->beacon_interval
);
2957 ath10k_warn("failed to set beacon interval for vdev %d: %i\n",
2958 arvif
->vdev_id
, ret
);
2961 if (changed
& BSS_CHANGED_BEACON
) {
2962 ath10k_dbg(ATH10K_DBG_MAC
,
2963 "vdev %d set beacon tx mode to staggered\n",
2966 pdev_param
= ar
->wmi
.pdev_param
->beacon_tx_mode
;
2967 ret
= ath10k_wmi_pdev_set_param(ar
, pdev_param
,
2968 WMI_BEACON_STAGGERED_MODE
);
2970 ath10k_warn("failed to set beacon mode for vdev %d: %i\n",
2971 arvif
->vdev_id
, ret
);
2974 if (changed
& BSS_CHANGED_BEACON_INFO
) {
2975 arvif
->dtim_period
= info
->dtim_period
;
2977 ath10k_dbg(ATH10K_DBG_MAC
,
2978 "mac vdev %d dtim_period %d\n",
2979 arvif
->vdev_id
, arvif
->dtim_period
);
2981 vdev_param
= ar
->wmi
.vdev_param
->dtim_period
;
2982 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
2983 arvif
->dtim_period
);
2985 ath10k_warn("failed to set dtim period for vdev %d: %i\n",
2986 arvif
->vdev_id
, ret
);
2989 if (changed
& BSS_CHANGED_SSID
&&
2990 vif
->type
== NL80211_IFTYPE_AP
) {
2991 arvif
->u
.ap
.ssid_len
= info
->ssid_len
;
2993 memcpy(arvif
->u
.ap
.ssid
, info
->ssid
, info
->ssid_len
);
2994 arvif
->u
.ap
.hidden_ssid
= info
->hidden_ssid
;
2997 if (changed
& BSS_CHANGED_BSSID
) {
2998 if (!is_zero_ether_addr(info
->bssid
)) {
2999 ath10k_dbg(ATH10K_DBG_MAC
,
3000 "mac vdev %d create peer %pM\n",
3001 arvif
->vdev_id
, info
->bssid
);
3003 ret
= ath10k_peer_create(ar
, arvif
->vdev_id
,
3006 ath10k_warn("failed to add peer %pM for vdev %d when changing bssid: %i\n",
3007 info
->bssid
, arvif
->vdev_id
, ret
);
3009 if (vif
->type
== NL80211_IFTYPE_STATION
) {
3011 * this is never erased as we it for crypto key
3012 * clearing; this is FW requirement
3014 memcpy(arvif
->bssid
, info
->bssid
, ETH_ALEN
);
3016 ath10k_dbg(ATH10K_DBG_MAC
,
3017 "mac vdev %d start %pM\n",
3018 arvif
->vdev_id
, info
->bssid
);
3020 ret
= ath10k_vdev_start(arvif
);
3022 ath10k_warn("failed to start vdev %i: %d\n",
3023 arvif
->vdev_id
, ret
);
3027 arvif
->is_started
= true;
3031 * Mac80211 does not keep IBSS bssid when leaving IBSS,
3032 * so driver need to store it. It is needed when leaving
3033 * IBSS in order to remove BSSID peer.
3035 if (vif
->type
== NL80211_IFTYPE_ADHOC
)
3036 memcpy(arvif
->bssid
, info
->bssid
,
3041 if (changed
& BSS_CHANGED_BEACON_ENABLED
)
3042 ath10k_control_beaconing(arvif
, info
);
3044 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
3045 arvif
->use_cts_prot
= info
->use_cts_prot
;
3046 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d cts_prot %d\n",
3047 arvif
->vdev_id
, info
->use_cts_prot
);
3049 ret
= ath10k_recalc_rtscts_prot(arvif
);
3051 ath10k_warn("failed to recalculate rts/cts prot for vdev %d: %d\n",
3052 arvif
->vdev_id
, ret
);
3055 if (changed
& BSS_CHANGED_ERP_SLOT
) {
3057 if (info
->use_short_slot
)
3058 slottime
= WMI_VDEV_SLOT_TIME_SHORT
; /* 9us */
3061 slottime
= WMI_VDEV_SLOT_TIME_LONG
; /* 20us */
3063 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d slot_time %d\n",
3064 arvif
->vdev_id
, slottime
);
3066 vdev_param
= ar
->wmi
.vdev_param
->slot_time
;
3067 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3070 ath10k_warn("failed to set erp slot for vdev %d: %i\n",
3071 arvif
->vdev_id
, ret
);
3074 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
3076 if (info
->use_short_preamble
)
3077 preamble
= WMI_VDEV_PREAMBLE_SHORT
;
3079 preamble
= WMI_VDEV_PREAMBLE_LONG
;
3081 ath10k_dbg(ATH10K_DBG_MAC
,
3082 "mac vdev %d preamble %dn",
3083 arvif
->vdev_id
, preamble
);
3085 vdev_param
= ar
->wmi
.vdev_param
->preamble
;
3086 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3089 ath10k_warn("failed to set preamble for vdev %d: %i\n",
3090 arvif
->vdev_id
, ret
);
3093 if (changed
& BSS_CHANGED_ASSOC
) {
3095 ath10k_bss_assoc(hw
, vif
, info
);
3099 mutex_unlock(&ar
->conf_mutex
);
3102 static int ath10k_hw_scan(struct ieee80211_hw
*hw
,
3103 struct ieee80211_vif
*vif
,
3104 struct cfg80211_scan_request
*req
)
3106 struct ath10k
*ar
= hw
->priv
;
3107 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3108 struct wmi_start_scan_arg arg
;
3112 mutex_lock(&ar
->conf_mutex
);
3114 spin_lock_bh(&ar
->data_lock
);
3115 if (ar
->scan
.in_progress
) {
3116 spin_unlock_bh(&ar
->data_lock
);
3121 reinit_completion(&ar
->scan
.started
);
3122 reinit_completion(&ar
->scan
.completed
);
3123 ar
->scan
.in_progress
= true;
3124 ar
->scan
.aborting
= false;
3125 ar
->scan
.is_roc
= false;
3126 ar
->scan
.vdev_id
= arvif
->vdev_id
;
3127 spin_unlock_bh(&ar
->data_lock
);
3129 memset(&arg
, 0, sizeof(arg
));
3130 ath10k_wmi_start_scan_init(ar
, &arg
);
3131 arg
.vdev_id
= arvif
->vdev_id
;
3132 arg
.scan_id
= ATH10K_SCAN_ID
;
3135 arg
.scan_ctrl_flags
|= WMI_SCAN_ADD_CCK_RATES
;
3138 arg
.ie_len
= req
->ie_len
;
3139 memcpy(arg
.ie
, req
->ie
, arg
.ie_len
);
3143 arg
.n_ssids
= req
->n_ssids
;
3144 for (i
= 0; i
< arg
.n_ssids
; i
++) {
3145 arg
.ssids
[i
].len
= req
->ssids
[i
].ssid_len
;
3146 arg
.ssids
[i
].ssid
= req
->ssids
[i
].ssid
;
3149 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
3152 if (req
->n_channels
) {
3153 arg
.n_channels
= req
->n_channels
;
3154 for (i
= 0; i
< arg
.n_channels
; i
++)
3155 arg
.channels
[i
] = req
->channels
[i
]->center_freq
;
3158 ret
= ath10k_start_scan(ar
, &arg
);
3160 ath10k_warn("failed to start hw scan: %d\n", ret
);
3161 spin_lock_bh(&ar
->data_lock
);
3162 ar
->scan
.in_progress
= false;
3163 spin_unlock_bh(&ar
->data_lock
);
3167 mutex_unlock(&ar
->conf_mutex
);
3171 static void ath10k_cancel_hw_scan(struct ieee80211_hw
*hw
,
3172 struct ieee80211_vif
*vif
)
3174 struct ath10k
*ar
= hw
->priv
;
3177 mutex_lock(&ar
->conf_mutex
);
3178 ret
= ath10k_abort_scan(ar
);
3180 ath10k_warn("failed to abort scan: %d\n", ret
);
3181 ieee80211_scan_completed(hw
, 1 /* aborted */);
3183 mutex_unlock(&ar
->conf_mutex
);
3186 static void ath10k_set_key_h_def_keyidx(struct ath10k
*ar
,
3187 struct ath10k_vif
*arvif
,
3188 enum set_key_cmd cmd
,
3189 struct ieee80211_key_conf
*key
)
3191 u32 vdev_param
= arvif
->ar
->wmi
.vdev_param
->def_keyid
;
3194 /* 10.1 firmware branch requires default key index to be set to group
3195 * key index after installing it. Otherwise FW/HW Txes corrupted
3196 * frames with multi-vif APs. This is not required for main firmware
3197 * branch (e.g. 636).
3199 * FIXME: This has been tested only in AP. It remains unknown if this
3200 * is required for multi-vif STA interfaces on 10.1 */
3202 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
3205 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP40
)
3208 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP104
)
3211 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
3217 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
3220 ath10k_warn("failed to set vdev %i group key as default key: %d\n",
3221 arvif
->vdev_id
, ret
);
3224 static int ath10k_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
3225 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
,
3226 struct ieee80211_key_conf
*key
)
3228 struct ath10k
*ar
= hw
->priv
;
3229 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3230 struct ath10k_peer
*peer
;
3231 const u8
*peer_addr
;
3232 bool is_wep
= key
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
3233 key
->cipher
== WLAN_CIPHER_SUITE_WEP104
;
3236 if (key
->keyidx
> WMI_MAX_KEY_INDEX
)
3239 mutex_lock(&ar
->conf_mutex
);
3242 peer_addr
= sta
->addr
;
3243 else if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
)
3244 peer_addr
= vif
->bss_conf
.bssid
;
3246 peer_addr
= vif
->addr
;
3248 key
->hw_key_idx
= key
->keyidx
;
3250 /* the peer should not disappear in mid-way (unless FW goes awry) since
3251 * we already hold conf_mutex. we just make sure its there now. */
3252 spin_lock_bh(&ar
->data_lock
);
3253 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
3254 spin_unlock_bh(&ar
->data_lock
);
3257 if (cmd
== SET_KEY
) {
3258 ath10k_warn("failed to install key for non-existent peer %pM\n",
3263 /* if the peer doesn't exist there is no key to disable
3271 arvif
->wep_keys
[key
->keyidx
] = key
;
3273 arvif
->wep_keys
[key
->keyidx
] = NULL
;
3275 if (cmd
== DISABLE_KEY
)
3276 ath10k_clear_vdev_key(arvif
, key
);
3279 ret
= ath10k_install_key(arvif
, key
, cmd
, peer_addr
);
3281 ath10k_warn("failed to install key for vdev %i peer %pM: %d\n",
3282 arvif
->vdev_id
, peer_addr
, ret
);
3286 ath10k_set_key_h_def_keyidx(ar
, arvif
, cmd
, key
);
3288 spin_lock_bh(&ar
->data_lock
);
3289 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
3290 if (peer
&& cmd
== SET_KEY
)
3291 peer
->keys
[key
->keyidx
] = key
;
3292 else if (peer
&& cmd
== DISABLE_KEY
)
3293 peer
->keys
[key
->keyidx
] = NULL
;
3294 else if (peer
== NULL
)
3295 /* impossible unless FW goes crazy */
3296 ath10k_warn("Peer %pM disappeared!\n", peer_addr
);
3297 spin_unlock_bh(&ar
->data_lock
);
3300 mutex_unlock(&ar
->conf_mutex
);
3304 static void ath10k_sta_rc_update_wk(struct work_struct
*wk
)
3307 struct ath10k_vif
*arvif
;
3308 struct ath10k_sta
*arsta
;
3309 struct ieee80211_sta
*sta
;
3310 u32 changed
, bw
, nss
, smps
;
3313 arsta
= container_of(wk
, struct ath10k_sta
, update_wk
);
3314 sta
= container_of((void *)arsta
, struct ieee80211_sta
, drv_priv
);
3315 arvif
= arsta
->arvif
;
3318 spin_lock_bh(&ar
->data_lock
);
3320 changed
= arsta
->changed
;
3327 spin_unlock_bh(&ar
->data_lock
);
3329 mutex_lock(&ar
->conf_mutex
);
3331 if (changed
& IEEE80211_RC_BW_CHANGED
) {
3332 ath10k_dbg(ATH10K_DBG_MAC
, "mac update sta %pM peer bw %d\n",
3335 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
3336 WMI_PEER_CHAN_WIDTH
, bw
);
3338 ath10k_warn("failed to update STA %pM peer bw %d: %d\n",
3339 sta
->addr
, bw
, err
);
3342 if (changed
& IEEE80211_RC_NSS_CHANGED
) {
3343 ath10k_dbg(ATH10K_DBG_MAC
, "mac update sta %pM nss %d\n",
3346 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
3349 ath10k_warn("failed to update STA %pM nss %d: %d\n",
3350 sta
->addr
, nss
, err
);
3353 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
3354 ath10k_dbg(ATH10K_DBG_MAC
, "mac update sta %pM smps %d\n",
3357 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
3358 WMI_PEER_SMPS_STATE
, smps
);
3360 ath10k_warn("failed to update STA %pM smps %d: %d\n",
3361 sta
->addr
, smps
, err
);
3364 if (changed
& IEEE80211_RC_SUPP_RATES_CHANGED
) {
3365 ath10k_dbg(ATH10K_DBG_MAC
, "mac update sta %pM supp rates\n",
3368 err
= ath10k_station_assoc(ar
, arvif
, sta
, true);
3370 ath10k_warn("failed to reassociate station: %pM\n",
3374 mutex_unlock(&ar
->conf_mutex
);
3377 static int ath10k_sta_state(struct ieee80211_hw
*hw
,
3378 struct ieee80211_vif
*vif
,
3379 struct ieee80211_sta
*sta
,
3380 enum ieee80211_sta_state old_state
,
3381 enum ieee80211_sta_state new_state
)
3383 struct ath10k
*ar
= hw
->priv
;
3384 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3385 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
3389 if (old_state
== IEEE80211_STA_NOTEXIST
&&
3390 new_state
== IEEE80211_STA_NONE
) {
3391 memset(arsta
, 0, sizeof(*arsta
));
3392 arsta
->arvif
= arvif
;
3393 INIT_WORK(&arsta
->update_wk
, ath10k_sta_rc_update_wk
);
3396 /* cancel must be done outside the mutex to avoid deadlock */
3397 if ((old_state
== IEEE80211_STA_NONE
&&
3398 new_state
== IEEE80211_STA_NOTEXIST
))
3399 cancel_work_sync(&arsta
->update_wk
);
3401 mutex_lock(&ar
->conf_mutex
);
3403 if (old_state
== IEEE80211_STA_NOTEXIST
&&
3404 new_state
== IEEE80211_STA_NONE
&&
3405 vif
->type
!= NL80211_IFTYPE_STATION
) {
3407 * New station addition.
3409 if (test_bit(ATH10K_FW_FEATURE_WMI_10X
, ar
->fw_features
))
3410 max_num_peers
= TARGET_10X_NUM_PEERS_MAX
- 1;
3412 max_num_peers
= TARGET_NUM_PEERS
;
3414 if (ar
->num_peers
>= max_num_peers
) {
3415 ath10k_warn("number of peers exceeded: peers number %d (max peers %d)\n",
3416 ar
->num_peers
, max_num_peers
);
3421 ath10k_dbg(ATH10K_DBG_MAC
,
3422 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
3423 arvif
->vdev_id
, sta
->addr
, ar
->num_peers
);
3425 ret
= ath10k_peer_create(ar
, arvif
->vdev_id
, sta
->addr
);
3427 ath10k_warn("failed to add peer %pM for vdev %d when adding a new sta: %i\n",
3428 sta
->addr
, arvif
->vdev_id
, ret
);
3429 } else if ((old_state
== IEEE80211_STA_NONE
&&
3430 new_state
== IEEE80211_STA_NOTEXIST
)) {
3432 * Existing station deletion.
3434 ath10k_dbg(ATH10K_DBG_MAC
,
3435 "mac vdev %d peer delete %pM (sta gone)\n",
3436 arvif
->vdev_id
, sta
->addr
);
3437 ret
= ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
3439 ath10k_warn("failed to delete peer %pM for vdev %d: %i\n",
3440 sta
->addr
, arvif
->vdev_id
, ret
);
3442 if (vif
->type
== NL80211_IFTYPE_STATION
)
3443 ath10k_bss_disassoc(hw
, vif
);
3444 } else if (old_state
== IEEE80211_STA_AUTH
&&
3445 new_state
== IEEE80211_STA_ASSOC
&&
3446 (vif
->type
== NL80211_IFTYPE_AP
||
3447 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
3451 ath10k_dbg(ATH10K_DBG_MAC
, "mac sta %pM associated\n",
3454 ret
= ath10k_station_assoc(ar
, arvif
, sta
, false);
3456 ath10k_warn("failed to associate station %pM for vdev %i: %i\n",
3457 sta
->addr
, arvif
->vdev_id
, ret
);
3458 } else if (old_state
== IEEE80211_STA_ASSOC
&&
3459 new_state
== IEEE80211_STA_AUTH
&&
3460 (vif
->type
== NL80211_IFTYPE_AP
||
3461 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
3465 ath10k_dbg(ATH10K_DBG_MAC
, "mac sta %pM disassociated\n",
3468 ret
= ath10k_station_disassoc(ar
, arvif
, sta
);
3470 ath10k_warn("failed to disassociate station: %pM vdev %i: %i\n",
3471 sta
->addr
, arvif
->vdev_id
, ret
);
3474 mutex_unlock(&ar
->conf_mutex
);
3478 static int ath10k_conf_tx_uapsd(struct ath10k
*ar
, struct ieee80211_vif
*vif
,
3479 u16 ac
, bool enable
)
3481 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3485 lockdep_assert_held(&ar
->conf_mutex
);
3487 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
3491 case IEEE80211_AC_VO
:
3492 value
= WMI_STA_PS_UAPSD_AC3_DELIVERY_EN
|
3493 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN
;
3495 case IEEE80211_AC_VI
:
3496 value
= WMI_STA_PS_UAPSD_AC2_DELIVERY_EN
|
3497 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN
;
3499 case IEEE80211_AC_BE
:
3500 value
= WMI_STA_PS_UAPSD_AC1_DELIVERY_EN
|
3501 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN
;
3503 case IEEE80211_AC_BK
:
3504 value
= WMI_STA_PS_UAPSD_AC0_DELIVERY_EN
|
3505 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN
;
3510 arvif
->u
.sta
.uapsd
|= value
;
3512 arvif
->u
.sta
.uapsd
&= ~value
;
3514 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
3515 WMI_STA_PS_PARAM_UAPSD
,
3516 arvif
->u
.sta
.uapsd
);
3518 ath10k_warn("failed to set uapsd params: %d\n", ret
);
3522 if (arvif
->u
.sta
.uapsd
)
3523 value
= WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD
;
3525 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
3527 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
3528 WMI_STA_PS_PARAM_RX_WAKE_POLICY
,
3531 ath10k_warn("failed to set rx wake param: %d\n", ret
);
3537 static int ath10k_conf_tx(struct ieee80211_hw
*hw
,
3538 struct ieee80211_vif
*vif
, u16 ac
,
3539 const struct ieee80211_tx_queue_params
*params
)
3541 struct ath10k
*ar
= hw
->priv
;
3542 struct wmi_wmm_params_arg
*p
= NULL
;
3545 mutex_lock(&ar
->conf_mutex
);
3548 case IEEE80211_AC_VO
:
3549 p
= &ar
->wmm_params
.ac_vo
;
3551 case IEEE80211_AC_VI
:
3552 p
= &ar
->wmm_params
.ac_vi
;
3554 case IEEE80211_AC_BE
:
3555 p
= &ar
->wmm_params
.ac_be
;
3557 case IEEE80211_AC_BK
:
3558 p
= &ar
->wmm_params
.ac_bk
;
3567 p
->cwmin
= params
->cw_min
;
3568 p
->cwmax
= params
->cw_max
;
3569 p
->aifs
= params
->aifs
;
3572 * The channel time duration programmed in the HW is in absolute
3573 * microseconds, while mac80211 gives the txop in units of
3576 p
->txop
= params
->txop
* 32;
3578 /* FIXME: FW accepts wmm params per hw, not per vif */
3579 ret
= ath10k_wmi_pdev_set_wmm_params(ar
, &ar
->wmm_params
);
3581 ath10k_warn("failed to set wmm params: %d\n", ret
);
3585 ret
= ath10k_conf_tx_uapsd(ar
, vif
, ac
, params
->uapsd
);
3587 ath10k_warn("failed to set sta uapsd: %d\n", ret
);
3590 mutex_unlock(&ar
->conf_mutex
);
3594 #define ATH10K_ROC_TIMEOUT_HZ (2*HZ)
3596 static int ath10k_remain_on_channel(struct ieee80211_hw
*hw
,
3597 struct ieee80211_vif
*vif
,
3598 struct ieee80211_channel
*chan
,
3600 enum ieee80211_roc_type type
)
3602 struct ath10k
*ar
= hw
->priv
;
3603 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3604 struct wmi_start_scan_arg arg
;
3607 mutex_lock(&ar
->conf_mutex
);
3609 spin_lock_bh(&ar
->data_lock
);
3610 if (ar
->scan
.in_progress
) {
3611 spin_unlock_bh(&ar
->data_lock
);
3616 reinit_completion(&ar
->scan
.started
);
3617 reinit_completion(&ar
->scan
.completed
);
3618 reinit_completion(&ar
->scan
.on_channel
);
3619 ar
->scan
.in_progress
= true;
3620 ar
->scan
.aborting
= false;
3621 ar
->scan
.is_roc
= true;
3622 ar
->scan
.vdev_id
= arvif
->vdev_id
;
3623 ar
->scan
.roc_freq
= chan
->center_freq
;
3624 spin_unlock_bh(&ar
->data_lock
);
3626 memset(&arg
, 0, sizeof(arg
));
3627 ath10k_wmi_start_scan_init(ar
, &arg
);
3628 arg
.vdev_id
= arvif
->vdev_id
;
3629 arg
.scan_id
= ATH10K_SCAN_ID
;
3631 arg
.channels
[0] = chan
->center_freq
;
3632 arg
.dwell_time_active
= duration
;
3633 arg
.dwell_time_passive
= duration
;
3634 arg
.max_scan_time
= 2 * duration
;
3635 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
3636 arg
.scan_ctrl_flags
|= WMI_SCAN_FILTER_PROBE_REQ
;
3638 ret
= ath10k_start_scan(ar
, &arg
);
3640 ath10k_warn("failed to start roc scan: %d\n", ret
);
3641 spin_lock_bh(&ar
->data_lock
);
3642 ar
->scan
.in_progress
= false;
3643 spin_unlock_bh(&ar
->data_lock
);
3647 ret
= wait_for_completion_timeout(&ar
->scan
.on_channel
, 3*HZ
);
3649 ath10k_warn("failed to switch to channel for roc scan\n");
3650 ath10k_abort_scan(ar
);
3657 mutex_unlock(&ar
->conf_mutex
);
3661 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw
*hw
)
3663 struct ath10k
*ar
= hw
->priv
;
3665 mutex_lock(&ar
->conf_mutex
);
3666 ath10k_abort_scan(ar
);
3667 mutex_unlock(&ar
->conf_mutex
);
3673 * Both RTS and Fragmentation threshold are interface-specific
3674 * in ath10k, but device-specific in mac80211.
3677 static int ath10k_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
3679 struct ath10k
*ar
= hw
->priv
;
3680 struct ath10k_vif
*arvif
;
3683 mutex_lock(&ar
->conf_mutex
);
3684 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
3685 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d rts threshold %d\n",
3686 arvif
->vdev_id
, value
);
3688 ret
= ath10k_mac_set_rts(arvif
, value
);
3690 ath10k_warn("failed to set rts threshold for vdev %d: %d\n",
3691 arvif
->vdev_id
, ret
);
3695 mutex_unlock(&ar
->conf_mutex
);
3700 static int ath10k_set_frag_threshold(struct ieee80211_hw
*hw
, u32 value
)
3702 struct ath10k
*ar
= hw
->priv
;
3703 struct ath10k_vif
*arvif
;
3706 mutex_lock(&ar
->conf_mutex
);
3707 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
3708 ath10k_dbg(ATH10K_DBG_MAC
, "mac vdev %d fragmentation threshold %d\n",
3709 arvif
->vdev_id
, value
);
3711 ret
= ath10k_mac_set_rts(arvif
, value
);
3713 ath10k_warn("failed to set fragmentation threshold for vdev %d: %d\n",
3714 arvif
->vdev_id
, ret
);
3718 mutex_unlock(&ar
->conf_mutex
);
3723 static void ath10k_flush(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
3724 u32 queues
, bool drop
)
3726 struct ath10k
*ar
= hw
->priv
;
3730 /* mac80211 doesn't care if we really xmit queued frames or not
3731 * we'll collect those frames either way if we stop/delete vdevs */
3735 mutex_lock(&ar
->conf_mutex
);
3737 if (ar
->state
== ATH10K_STATE_WEDGED
)
3740 ret
= wait_event_timeout(ar
->htt
.empty_tx_wq
, ({
3743 spin_lock_bh(&ar
->htt
.tx_lock
);
3744 empty
= (ar
->htt
.num_pending_tx
== 0);
3745 spin_unlock_bh(&ar
->htt
.tx_lock
);
3747 skip
= (ar
->state
== ATH10K_STATE_WEDGED
);
3750 }), ATH10K_FLUSH_TIMEOUT_HZ
);
3752 if (ret
<= 0 || skip
)
3753 ath10k_warn("failed to flush transmit queue (skip %i ar-state %i): %i\n",
3754 skip
, ar
->state
, ret
);
3757 mutex_unlock(&ar
->conf_mutex
);
3760 /* TODO: Implement this function properly
3761 * For now it is needed to reply to Probe Requests in IBSS mode.
3762 * Propably we need this information from FW.
3764 static int ath10k_tx_last_beacon(struct ieee80211_hw
*hw
)
3770 static int ath10k_suspend(struct ieee80211_hw
*hw
,
3771 struct cfg80211_wowlan
*wowlan
)
3773 struct ath10k
*ar
= hw
->priv
;
3776 mutex_lock(&ar
->conf_mutex
);
3778 ret
= ath10k_wait_for_suspend(ar
, WMI_PDEV_SUSPEND
);
3780 if (ret
== -ETIMEDOUT
)
3786 ret
= ath10k_hif_suspend(ar
);
3788 ath10k_warn("failed to suspend hif: %d\n", ret
);
3795 ret
= ath10k_wmi_pdev_resume_target(ar
);
3797 ath10k_warn("failed to resume target: %d\n", ret
);
3801 mutex_unlock(&ar
->conf_mutex
);
3805 static int ath10k_resume(struct ieee80211_hw
*hw
)
3807 struct ath10k
*ar
= hw
->priv
;
3810 mutex_lock(&ar
->conf_mutex
);
3812 ret
= ath10k_hif_resume(ar
);
3814 ath10k_warn("failed to resume hif: %d\n", ret
);
3819 ret
= ath10k_wmi_pdev_resume_target(ar
);
3821 ath10k_warn("failed to resume target: %d\n", ret
);
3828 mutex_unlock(&ar
->conf_mutex
);
3833 static void ath10k_restart_complete(struct ieee80211_hw
*hw
)
3835 struct ath10k
*ar
= hw
->priv
;
3837 mutex_lock(&ar
->conf_mutex
);
3839 /* If device failed to restart it will be in a different state, e.g.
3840 * ATH10K_STATE_WEDGED */
3841 if (ar
->state
== ATH10K_STATE_RESTARTED
) {
3842 ath10k_info("device successfully recovered\n");
3843 ar
->state
= ATH10K_STATE_ON
;
3846 mutex_unlock(&ar
->conf_mutex
);
3849 static int ath10k_get_survey(struct ieee80211_hw
*hw
, int idx
,
3850 struct survey_info
*survey
)
3852 struct ath10k
*ar
= hw
->priv
;
3853 struct ieee80211_supported_band
*sband
;
3854 struct survey_info
*ar_survey
= &ar
->survey
[idx
];
3857 mutex_lock(&ar
->conf_mutex
);
3859 sband
= hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
];
3860 if (sband
&& idx
>= sband
->n_channels
) {
3861 idx
-= sband
->n_channels
;
3866 sband
= hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
];
3868 if (!sband
|| idx
>= sband
->n_channels
) {
3873 spin_lock_bh(&ar
->data_lock
);
3874 memcpy(survey
, ar_survey
, sizeof(*survey
));
3875 spin_unlock_bh(&ar
->data_lock
);
3877 survey
->channel
= &sband
->channels
[idx
];
3880 mutex_unlock(&ar
->conf_mutex
);
3884 /* Helper table for legacy fixed_rate/bitrate_mask */
3885 static const u8 cck_ofdm_rate
[] = {
3902 /* Check if only one bit set */
3903 static int ath10k_check_single_mask(u32 mask
)
3911 mask
&= ~BIT(bit
- 1);
3919 ath10k_default_bitrate_mask(struct ath10k
*ar
,
3920 enum ieee80211_band band
,
3921 const struct cfg80211_bitrate_mask
*mask
)
3923 u32 legacy
= 0x00ff;
3928 case IEEE80211_BAND_2GHZ
:
3932 case IEEE80211_BAND_5GHZ
:
3938 if (mask
->control
[band
].legacy
!= legacy
)
3941 for (i
= 0; i
< ar
->num_rf_chains
; i
++)
3942 if (mask
->control
[band
].ht_mcs
[i
] != ht
)
3945 for (i
= 0; i
< ar
->num_rf_chains
; i
++)
3946 if (mask
->control
[band
].vht_mcs
[i
] != vht
)
3953 ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask
*mask
,
3954 enum ieee80211_band band
,
3957 int ht_nss
= 0, vht_nss
= 0, i
;
3960 if (ath10k_check_single_mask(mask
->control
[band
].legacy
))
3964 for (i
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
; i
++) {
3965 if (mask
->control
[band
].ht_mcs
[i
] == 0xff)
3967 else if (mask
->control
[band
].ht_mcs
[i
] == 0x00)
3976 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++) {
3977 if (mask
->control
[band
].vht_mcs
[i
] == 0x03ff)
3979 else if (mask
->control
[band
].vht_mcs
[i
] == 0x0000)
3987 if (ht_nss
> 0 && vht_nss
> 0)
3991 *fixed_nss
= ht_nss
;
3993 *fixed_nss
= vht_nss
;
4001 ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask
*mask
,
4002 enum ieee80211_band band
,
4003 enum wmi_rate_preamble
*preamble
)
4005 int legacy
= 0, ht
= 0, vht
= 0, i
;
4007 *preamble
= WMI_RATE_PREAMBLE_OFDM
;
4010 legacy
= ath10k_check_single_mask(mask
->control
[band
].legacy
);
4015 for (i
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
; i
++)
4016 ht
+= ath10k_check_single_mask(mask
->control
[band
].ht_mcs
[i
]);
4021 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++)
4022 vht
+= ath10k_check_single_mask(mask
->control
[band
].vht_mcs
[i
]);
4026 /* Currently we support only one fixed_rate */
4027 if ((legacy
+ ht
+ vht
) != 1)
4031 *preamble
= WMI_RATE_PREAMBLE_HT
;
4033 *preamble
= WMI_RATE_PREAMBLE_VHT
;
4039 ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask
*mask
,
4040 enum ieee80211_band band
,
4044 u8 rate
= 0, pream
= 0, nss
= 0, i
;
4045 enum wmi_rate_preamble preamble
;
4047 /* Check if single rate correct */
4048 if (!ath10k_bitrate_mask_correct(mask
, band
, &preamble
))
4054 case WMI_RATE_PREAMBLE_CCK
:
4055 case WMI_RATE_PREAMBLE_OFDM
:
4056 i
= ffs(mask
->control
[band
].legacy
) - 1;
4058 if (band
== IEEE80211_BAND_2GHZ
&& i
< 4)
4059 pream
= WMI_RATE_PREAMBLE_CCK
;
4061 if (band
== IEEE80211_BAND_5GHZ
)
4064 if (i
>= ARRAY_SIZE(cck_ofdm_rate
))
4067 rate
= cck_ofdm_rate
[i
];
4069 case WMI_RATE_PREAMBLE_HT
:
4070 for (i
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
; i
++)
4071 if (mask
->control
[band
].ht_mcs
[i
])
4074 if (i
== IEEE80211_HT_MCS_MASK_LEN
)
4077 rate
= ffs(mask
->control
[band
].ht_mcs
[i
]) - 1;
4080 case WMI_RATE_PREAMBLE_VHT
:
4081 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++)
4082 if (mask
->control
[band
].vht_mcs
[i
])
4085 if (i
== NL80211_VHT_NSS_MAX
)
4088 rate
= ffs(mask
->control
[band
].vht_mcs
[i
]) - 1;
4093 *fixed_nss
= nss
+ 1;
4097 ath10k_dbg(ATH10K_DBG_MAC
, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
4100 *fixed_rate
= pream
| nss
| rate
;
4105 static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask
*mask
,
4106 enum ieee80211_band band
,
4110 /* First check full NSS mask, if we can simply limit NSS */
4111 if (ath10k_bitrate_mask_nss(mask
, band
, fixed_nss
))
4114 /* Next Check single rate is set */
4115 return ath10k_bitrate_mask_rate(mask
, band
, fixed_rate
, fixed_nss
);
4118 static int ath10k_set_fixed_rate_param(struct ath10k_vif
*arvif
,
4123 struct ath10k
*ar
= arvif
->ar
;
4127 mutex_lock(&ar
->conf_mutex
);
4129 if (arvif
->fixed_rate
== fixed_rate
&&
4130 arvif
->fixed_nss
== fixed_nss
&&
4131 arvif
->force_sgi
== force_sgi
)
4134 if (fixed_rate
== WMI_FIXED_RATE_NONE
)
4135 ath10k_dbg(ATH10K_DBG_MAC
, "mac disable fixed bitrate mask\n");
4138 ath10k_dbg(ATH10K_DBG_MAC
, "mac force sgi\n");
4140 vdev_param
= ar
->wmi
.vdev_param
->fixed_rate
;
4141 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
4142 vdev_param
, fixed_rate
);
4144 ath10k_warn("failed to set fixed rate param 0x%02x: %d\n",
4150 arvif
->fixed_rate
= fixed_rate
;
4152 vdev_param
= ar
->wmi
.vdev_param
->nss
;
4153 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
4154 vdev_param
, fixed_nss
);
4157 ath10k_warn("failed to set fixed nss param %d: %d\n",
4163 arvif
->fixed_nss
= fixed_nss
;
4165 vdev_param
= ar
->wmi
.vdev_param
->sgi
;
4166 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
4170 ath10k_warn("failed to set sgi param %d: %d\n",
4176 arvif
->force_sgi
= force_sgi
;
4179 mutex_unlock(&ar
->conf_mutex
);
4183 static int ath10k_set_bitrate_mask(struct ieee80211_hw
*hw
,
4184 struct ieee80211_vif
*vif
,
4185 const struct cfg80211_bitrate_mask
*mask
)
4187 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4188 struct ath10k
*ar
= arvif
->ar
;
4189 enum ieee80211_band band
= ar
->hw
->conf
.chandef
.chan
->band
;
4190 u8 fixed_rate
= WMI_FIXED_RATE_NONE
;
4191 u8 fixed_nss
= ar
->num_rf_chains
;
4194 force_sgi
= mask
->control
[band
].gi
;
4195 if (force_sgi
== NL80211_TXRATE_FORCE_LGI
)
4198 if (!ath10k_default_bitrate_mask(ar
, band
, mask
)) {
4199 if (!ath10k_get_fixed_rate_nss(mask
, band
,
4205 if (fixed_rate
== WMI_FIXED_RATE_NONE
&& force_sgi
) {
4206 ath10k_warn("failed to force SGI usage for default rate settings\n");
4210 return ath10k_set_fixed_rate_param(arvif
, fixed_rate
,
4211 fixed_nss
, force_sgi
);
4214 static void ath10k_channel_switch_beacon(struct ieee80211_hw
*hw
,
4215 struct ieee80211_vif
*vif
,
4216 struct cfg80211_chan_def
*chandef
)
4218 /* there's no need to do anything here. vif->csa_active is enough */
4222 static void ath10k_sta_rc_update(struct ieee80211_hw
*hw
,
4223 struct ieee80211_vif
*vif
,
4224 struct ieee80211_sta
*sta
,
4227 struct ath10k
*ar
= hw
->priv
;
4228 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
4231 spin_lock_bh(&ar
->data_lock
);
4233 ath10k_dbg(ATH10K_DBG_MAC
,
4234 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4235 sta
->addr
, changed
, sta
->bandwidth
, sta
->rx_nss
,
4238 if (changed
& IEEE80211_RC_BW_CHANGED
) {
4239 bw
= WMI_PEER_CHWIDTH_20MHZ
;
4241 switch (sta
->bandwidth
) {
4242 case IEEE80211_STA_RX_BW_20
:
4243 bw
= WMI_PEER_CHWIDTH_20MHZ
;
4245 case IEEE80211_STA_RX_BW_40
:
4246 bw
= WMI_PEER_CHWIDTH_40MHZ
;
4248 case IEEE80211_STA_RX_BW_80
:
4249 bw
= WMI_PEER_CHWIDTH_80MHZ
;
4251 case IEEE80211_STA_RX_BW_160
:
4252 ath10k_warn("Invalid bandwith %d in rc update for %pM\n",
4253 sta
->bandwidth
, sta
->addr
);
4254 bw
= WMI_PEER_CHWIDTH_20MHZ
;
4261 if (changed
& IEEE80211_RC_NSS_CHANGED
)
4262 arsta
->nss
= sta
->rx_nss
;
4264 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
4265 smps
= WMI_PEER_SMPS_PS_NONE
;
4267 switch (sta
->smps_mode
) {
4268 case IEEE80211_SMPS_AUTOMATIC
:
4269 case IEEE80211_SMPS_OFF
:
4270 smps
= WMI_PEER_SMPS_PS_NONE
;
4272 case IEEE80211_SMPS_STATIC
:
4273 smps
= WMI_PEER_SMPS_STATIC
;
4275 case IEEE80211_SMPS_DYNAMIC
:
4276 smps
= WMI_PEER_SMPS_DYNAMIC
;
4278 case IEEE80211_SMPS_NUM_MODES
:
4279 ath10k_warn("Invalid smps %d in sta rc update for %pM\n",
4280 sta
->smps_mode
, sta
->addr
);
4281 smps
= WMI_PEER_SMPS_PS_NONE
;
4288 arsta
->changed
|= changed
;
4290 spin_unlock_bh(&ar
->data_lock
);
4292 ieee80211_queue_work(hw
, &arsta
->update_wk
);
4295 static u64
ath10k_get_tsf(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
)
4298 * FIXME: Return 0 for time being. Need to figure out whether FW
4299 * has the API to fetch 64-bit local TSF
4305 static const struct ieee80211_ops ath10k_ops
= {
4307 .start
= ath10k_start
,
4308 .stop
= ath10k_stop
,
4309 .config
= ath10k_config
,
4310 .add_interface
= ath10k_add_interface
,
4311 .remove_interface
= ath10k_remove_interface
,
4312 .configure_filter
= ath10k_configure_filter
,
4313 .bss_info_changed
= ath10k_bss_info_changed
,
4314 .hw_scan
= ath10k_hw_scan
,
4315 .cancel_hw_scan
= ath10k_cancel_hw_scan
,
4316 .set_key
= ath10k_set_key
,
4317 .sta_state
= ath10k_sta_state
,
4318 .conf_tx
= ath10k_conf_tx
,
4319 .remain_on_channel
= ath10k_remain_on_channel
,
4320 .cancel_remain_on_channel
= ath10k_cancel_remain_on_channel
,
4321 .set_rts_threshold
= ath10k_set_rts_threshold
,
4322 .set_frag_threshold
= ath10k_set_frag_threshold
,
4323 .flush
= ath10k_flush
,
4324 .tx_last_beacon
= ath10k_tx_last_beacon
,
4325 .set_antenna
= ath10k_set_antenna
,
4326 .get_antenna
= ath10k_get_antenna
,
4327 .restart_complete
= ath10k_restart_complete
,
4328 .get_survey
= ath10k_get_survey
,
4329 .set_bitrate_mask
= ath10k_set_bitrate_mask
,
4330 .channel_switch_beacon
= ath10k_channel_switch_beacon
,
4331 .sta_rc_update
= ath10k_sta_rc_update
,
4332 .get_tsf
= ath10k_get_tsf
,
4334 .suspend
= ath10k_suspend
,
4335 .resume
= ath10k_resume
,
4339 #define RATETAB_ENT(_rate, _rateid, _flags) { \
4340 .bitrate = (_rate), \
4341 .flags = (_flags), \
4342 .hw_value = (_rateid), \
4345 #define CHAN2G(_channel, _freq, _flags) { \
4346 .band = IEEE80211_BAND_2GHZ, \
4347 .hw_value = (_channel), \
4348 .center_freq = (_freq), \
4349 .flags = (_flags), \
4350 .max_antenna_gain = 0, \
4354 #define CHAN5G(_channel, _freq, _flags) { \
4355 .band = IEEE80211_BAND_5GHZ, \
4356 .hw_value = (_channel), \
4357 .center_freq = (_freq), \
4358 .flags = (_flags), \
4359 .max_antenna_gain = 0, \
4363 static const struct ieee80211_channel ath10k_2ghz_channels
[] = {
4373 CHAN2G(10, 2457, 0),
4374 CHAN2G(11, 2462, 0),
4375 CHAN2G(12, 2467, 0),
4376 CHAN2G(13, 2472, 0),
4377 CHAN2G(14, 2484, 0),
4380 static const struct ieee80211_channel ath10k_5ghz_channels
[] = {
4381 CHAN5G(36, 5180, 0),
4382 CHAN5G(40, 5200, 0),
4383 CHAN5G(44, 5220, 0),
4384 CHAN5G(48, 5240, 0),
4385 CHAN5G(52, 5260, 0),
4386 CHAN5G(56, 5280, 0),
4387 CHAN5G(60, 5300, 0),
4388 CHAN5G(64, 5320, 0),
4389 CHAN5G(100, 5500, 0),
4390 CHAN5G(104, 5520, 0),
4391 CHAN5G(108, 5540, 0),
4392 CHAN5G(112, 5560, 0),
4393 CHAN5G(116, 5580, 0),
4394 CHAN5G(120, 5600, 0),
4395 CHAN5G(124, 5620, 0),
4396 CHAN5G(128, 5640, 0),
4397 CHAN5G(132, 5660, 0),
4398 CHAN5G(136, 5680, 0),
4399 CHAN5G(140, 5700, 0),
4400 CHAN5G(149, 5745, 0),
4401 CHAN5G(153, 5765, 0),
4402 CHAN5G(157, 5785, 0),
4403 CHAN5G(161, 5805, 0),
4404 CHAN5G(165, 5825, 0),
4407 static struct ieee80211_rate ath10k_rates
[] = {
4409 RATETAB_ENT(10, 0x82, 0),
4410 RATETAB_ENT(20, 0x84, 0),
4411 RATETAB_ENT(55, 0x8b, 0),
4412 RATETAB_ENT(110, 0x96, 0),
4414 RATETAB_ENT(60, 0x0c, 0),
4415 RATETAB_ENT(90, 0x12, 0),
4416 RATETAB_ENT(120, 0x18, 0),
4417 RATETAB_ENT(180, 0x24, 0),
4418 RATETAB_ENT(240, 0x30, 0),
4419 RATETAB_ENT(360, 0x48, 0),
4420 RATETAB_ENT(480, 0x60, 0),
4421 RATETAB_ENT(540, 0x6c, 0),
4424 #define ath10k_a_rates (ath10k_rates + 4)
4425 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - 4)
4426 #define ath10k_g_rates (ath10k_rates + 0)
4427 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
4429 struct ath10k
*ath10k_mac_create(void)
4431 struct ieee80211_hw
*hw
;
4434 hw
= ieee80211_alloc_hw(sizeof(struct ath10k
), &ath10k_ops
);
4444 void ath10k_mac_destroy(struct ath10k
*ar
)
4446 ieee80211_free_hw(ar
->hw
);
4449 static const struct ieee80211_iface_limit ath10k_if_limits
[] = {
4452 .types
= BIT(NL80211_IFTYPE_STATION
)
4453 | BIT(NL80211_IFTYPE_P2P_CLIENT
)
4457 .types
= BIT(NL80211_IFTYPE_P2P_GO
)
4461 .types
= BIT(NL80211_IFTYPE_AP
)
4465 static const struct ieee80211_iface_limit ath10k_10x_if_limits
[] = {
4468 .types
= BIT(NL80211_IFTYPE_AP
)
4472 static const struct ieee80211_iface_combination ath10k_if_comb
[] = {
4474 .limits
= ath10k_if_limits
,
4475 .n_limits
= ARRAY_SIZE(ath10k_if_limits
),
4476 .max_interfaces
= 8,
4477 .num_different_channels
= 1,
4478 .beacon_int_infra_match
= true,
4482 static const struct ieee80211_iface_combination ath10k_10x_if_comb
[] = {
4484 .limits
= ath10k_10x_if_limits
,
4485 .n_limits
= ARRAY_SIZE(ath10k_10x_if_limits
),
4486 .max_interfaces
= 8,
4487 .num_different_channels
= 1,
4488 .beacon_int_infra_match
= true,
4489 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
4490 .radar_detect_widths
= BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
4491 BIT(NL80211_CHAN_WIDTH_20
) |
4492 BIT(NL80211_CHAN_WIDTH_40
) |
4493 BIT(NL80211_CHAN_WIDTH_80
),
4498 static struct ieee80211_sta_vht_cap
ath10k_create_vht_cap(struct ath10k
*ar
)
4500 struct ieee80211_sta_vht_cap vht_cap
= {0};
4504 vht_cap
.vht_supported
= 1;
4505 vht_cap
.cap
= ar
->vht_cap_info
;
4508 for (i
= 0; i
< 8; i
++) {
4509 if (i
< ar
->num_rf_chains
)
4510 mcs_map
|= IEEE80211_VHT_MCS_SUPPORT_0_9
<< (i
*2);
4512 mcs_map
|= IEEE80211_VHT_MCS_NOT_SUPPORTED
<< (i
*2);
4515 vht_cap
.vht_mcs
.rx_mcs_map
= cpu_to_le16(mcs_map
);
4516 vht_cap
.vht_mcs
.tx_mcs_map
= cpu_to_le16(mcs_map
);
4521 static struct ieee80211_sta_ht_cap
ath10k_get_ht_cap(struct ath10k
*ar
)
4524 struct ieee80211_sta_ht_cap ht_cap
= {0};
4526 if (!(ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
))
4529 ht_cap
.ht_supported
= 1;
4530 ht_cap
.ampdu_factor
= IEEE80211_HT_MAX_AMPDU_64K
;
4531 ht_cap
.ampdu_density
= IEEE80211_HT_MPDU_DENSITY_8
;
4532 ht_cap
.cap
|= IEEE80211_HT_CAP_SUP_WIDTH_20_40
;
4533 ht_cap
.cap
|= IEEE80211_HT_CAP_DSSSCCK40
;
4534 ht_cap
.cap
|= WLAN_HT_CAP_SM_PS_STATIC
<< IEEE80211_HT_CAP_SM_PS_SHIFT
;
4536 if (ar
->ht_cap_info
& WMI_HT_CAP_HT20_SGI
)
4537 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_20
;
4539 if (ar
->ht_cap_info
& WMI_HT_CAP_HT40_SGI
)
4540 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_40
;
4542 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
) {
4545 smps
= WLAN_HT_CAP_SM_PS_DYNAMIC
;
4546 smps
<<= IEEE80211_HT_CAP_SM_PS_SHIFT
;
4551 if (ar
->ht_cap_info
& WMI_HT_CAP_TX_STBC
)
4552 ht_cap
.cap
|= IEEE80211_HT_CAP_TX_STBC
;
4554 if (ar
->ht_cap_info
& WMI_HT_CAP_RX_STBC
) {
4557 stbc
= ar
->ht_cap_info
;
4558 stbc
&= WMI_HT_CAP_RX_STBC
;
4559 stbc
>>= WMI_HT_CAP_RX_STBC_MASK_SHIFT
;
4560 stbc
<<= IEEE80211_HT_CAP_RX_STBC_SHIFT
;
4561 stbc
&= IEEE80211_HT_CAP_RX_STBC
;
4566 if (ar
->ht_cap_info
& WMI_HT_CAP_LDPC
)
4567 ht_cap
.cap
|= IEEE80211_HT_CAP_LDPC_CODING
;
4569 if (ar
->ht_cap_info
& WMI_HT_CAP_L_SIG_TXOP_PROT
)
4570 ht_cap
.cap
|= IEEE80211_HT_CAP_LSIG_TXOP_PROT
;
4572 /* max AMSDU is implicitly taken from vht_cap_info */
4573 if (ar
->vht_cap_info
& WMI_VHT_CAP_MAX_MPDU_LEN_MASK
)
4574 ht_cap
.cap
|= IEEE80211_HT_CAP_MAX_AMSDU
;
4576 for (i
= 0; i
< ar
->num_rf_chains
; i
++)
4577 ht_cap
.mcs
.rx_mask
[i
] = 0xFF;
4579 ht_cap
.mcs
.tx_params
|= IEEE80211_HT_MCS_TX_DEFINED
;
4585 static void ath10k_get_arvif_iter(void *data
, u8
*mac
,
4586 struct ieee80211_vif
*vif
)
4588 struct ath10k_vif_iter
*arvif_iter
= data
;
4589 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4591 if (arvif
->vdev_id
== arvif_iter
->vdev_id
)
4592 arvif_iter
->arvif
= arvif
;
4595 struct ath10k_vif
*ath10k_get_arvif(struct ath10k
*ar
, u32 vdev_id
)
4597 struct ath10k_vif_iter arvif_iter
;
4600 memset(&arvif_iter
, 0, sizeof(struct ath10k_vif_iter
));
4601 arvif_iter
.vdev_id
= vdev_id
;
4603 flags
= IEEE80211_IFACE_ITER_RESUME_ALL
;
4604 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
4606 ath10k_get_arvif_iter
,
4608 if (!arvif_iter
.arvif
) {
4609 ath10k_warn("No VIF found for vdev %d\n", vdev_id
);
4613 return arvif_iter
.arvif
;
4616 int ath10k_mac_register(struct ath10k
*ar
)
4618 struct ieee80211_supported_band
*band
;
4619 struct ieee80211_sta_vht_cap vht_cap
;
4620 struct ieee80211_sta_ht_cap ht_cap
;
4624 SET_IEEE80211_PERM_ADDR(ar
->hw
, ar
->mac_addr
);
4626 SET_IEEE80211_DEV(ar
->hw
, ar
->dev
);
4628 ht_cap
= ath10k_get_ht_cap(ar
);
4629 vht_cap
= ath10k_create_vht_cap(ar
);
4631 if (ar
->phy_capability
& WHAL_WLAN_11G_CAPABILITY
) {
4632 channels
= kmemdup(ath10k_2ghz_channels
,
4633 sizeof(ath10k_2ghz_channels
),
4640 band
= &ar
->mac
.sbands
[IEEE80211_BAND_2GHZ
];
4641 band
->n_channels
= ARRAY_SIZE(ath10k_2ghz_channels
);
4642 band
->channels
= channels
;
4643 band
->n_bitrates
= ath10k_g_rates_size
;
4644 band
->bitrates
= ath10k_g_rates
;
4645 band
->ht_cap
= ht_cap
;
4647 /* vht is not supported in 2.4 GHz */
4649 ar
->hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = band
;
4652 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
) {
4653 channels
= kmemdup(ath10k_5ghz_channels
,
4654 sizeof(ath10k_5ghz_channels
),
4661 band
= &ar
->mac
.sbands
[IEEE80211_BAND_5GHZ
];
4662 band
->n_channels
= ARRAY_SIZE(ath10k_5ghz_channels
);
4663 band
->channels
= channels
;
4664 band
->n_bitrates
= ath10k_a_rates_size
;
4665 band
->bitrates
= ath10k_a_rates
;
4666 band
->ht_cap
= ht_cap
;
4667 band
->vht_cap
= vht_cap
;
4668 ar
->hw
->wiphy
->bands
[IEEE80211_BAND_5GHZ
] = band
;
4671 ar
->hw
->wiphy
->interface_modes
=
4672 BIT(NL80211_IFTYPE_STATION
) |
4673 BIT(NL80211_IFTYPE_ADHOC
) |
4674 BIT(NL80211_IFTYPE_AP
);
4676 if (test_bit(ATH10K_FW_FEATURE_WMI_10X
, ar
->fw_features
)) {
4677 /* TODO: Have to deal with 2x2 chips if/when the come out. */
4678 ar
->supp_tx_chainmask
= TARGET_10X_TX_CHAIN_MASK
;
4679 ar
->supp_rx_chainmask
= TARGET_10X_RX_CHAIN_MASK
;
4681 ar
->supp_tx_chainmask
= TARGET_TX_CHAIN_MASK
;
4682 ar
->supp_rx_chainmask
= TARGET_RX_CHAIN_MASK
;
4685 ar
->hw
->wiphy
->available_antennas_rx
= ar
->supp_rx_chainmask
;
4686 ar
->hw
->wiphy
->available_antennas_tx
= ar
->supp_tx_chainmask
;
4688 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P
, ar
->fw_features
))
4689 ar
->hw
->wiphy
->interface_modes
|=
4690 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
4691 BIT(NL80211_IFTYPE_P2P_GO
);
4693 ar
->hw
->flags
= IEEE80211_HW_SIGNAL_DBM
|
4694 IEEE80211_HW_SUPPORTS_PS
|
4695 IEEE80211_HW_SUPPORTS_DYNAMIC_PS
|
4696 IEEE80211_HW_SUPPORTS_UAPSD
|
4697 IEEE80211_HW_MFP_CAPABLE
|
4698 IEEE80211_HW_REPORTS_TX_ACK_STATUS
|
4699 IEEE80211_HW_HAS_RATE_CONTROL
|
4700 IEEE80211_HW_SUPPORTS_STATIC_SMPS
|
4701 IEEE80211_HW_AP_LINK_PS
|
4702 IEEE80211_HW_SPECTRUM_MGMT
;
4704 /* MSDU can have HTT TX fragment pushed in front. The additional 4
4705 * bytes is used for padding/alignment if necessary. */
4706 ar
->hw
->extra_tx_headroom
+= sizeof(struct htt_data_tx_desc_frag
)*2 + 4;
4708 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
)
4709 ar
->hw
->flags
|= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS
;
4711 if (ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
) {
4712 ar
->hw
->flags
|= IEEE80211_HW_AMPDU_AGGREGATION
;
4713 ar
->hw
->flags
|= IEEE80211_HW_TX_AMPDU_SETUP_IN_HW
;
4716 ar
->hw
->wiphy
->max_scan_ssids
= WLAN_SCAN_PARAMS_MAX_SSID
;
4717 ar
->hw
->wiphy
->max_scan_ie_len
= WLAN_SCAN_PARAMS_MAX_IE_LEN
;
4719 ar
->hw
->vif_data_size
= sizeof(struct ath10k_vif
);
4720 ar
->hw
->sta_data_size
= sizeof(struct ath10k_sta
);
4722 ar
->hw
->max_listen_interval
= ATH10K_MAX_HW_LISTEN_INTERVAL
;
4724 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
;
4725 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_CHANNEL_SWITCH
;
4726 ar
->hw
->wiphy
->max_remain_on_channel_duration
= 5000;
4728 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_UAPSD
;
4730 * on LL hardware queues are managed entirely by the FW
4731 * so we only advertise to mac we can do the queues thing
4735 if (test_bit(ATH10K_FW_FEATURE_WMI_10X
, ar
->fw_features
)) {
4736 ar
->hw
->wiphy
->iface_combinations
= ath10k_10x_if_comb
;
4737 ar
->hw
->wiphy
->n_iface_combinations
=
4738 ARRAY_SIZE(ath10k_10x_if_comb
);
4740 ar
->hw
->wiphy
->iface_combinations
= ath10k_if_comb
;
4741 ar
->hw
->wiphy
->n_iface_combinations
=
4742 ARRAY_SIZE(ath10k_if_comb
);
4745 ar
->hw
->netdev_features
= NETIF_F_HW_CSUM
;
4747 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
)) {
4748 /* Init ath dfs pattern detector */
4749 ar
->ath_common
.debug_mask
= ATH_DBG_DFS
;
4750 ar
->dfs_detector
= dfs_pattern_detector_init(&ar
->ath_common
,
4753 if (!ar
->dfs_detector
)
4754 ath10k_warn("failed to initialise DFS pattern detector\n");
4757 ret
= ath_regd_init(&ar
->ath_common
.regulatory
, ar
->hw
->wiphy
,
4758 ath10k_reg_notifier
);
4760 ath10k_err("failed to initialise regulatory: %i\n", ret
);
4764 ret
= ieee80211_register_hw(ar
->hw
);
4766 ath10k_err("failed to register ieee80211: %d\n", ret
);
4770 if (!ath_is_world_regd(&ar
->ath_common
.regulatory
)) {
4771 ret
= regulatory_hint(ar
->hw
->wiphy
,
4772 ar
->ath_common
.regulatory
.alpha2
);
4774 goto err_unregister
;
4780 ieee80211_unregister_hw(ar
->hw
);
4782 kfree(ar
->mac
.sbands
[IEEE80211_BAND_2GHZ
].channels
);
4783 kfree(ar
->mac
.sbands
[IEEE80211_BAND_5GHZ
].channels
);
4788 void ath10k_mac_unregister(struct ath10k
*ar
)
4790 ieee80211_unregister_hw(ar
->hw
);
4792 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
)
4793 ar
->dfs_detector
->exit(ar
->dfs_detector
);
4795 kfree(ar
->mac
.sbands
[IEEE80211_BAND_2GHZ
].channels
);
4796 kfree(ar
->mac
.sbands
[IEEE80211_BAND_5GHZ
].channels
);
4798 SET_IEEE80211_DEV(ar
->hw
, NULL
);