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>
22 #include <linux/acpi.h>
40 static struct ieee80211_rate ath10k_rates
[] = {
42 .hw_value
= ATH10K_HW_RATE_CCK_LP_1M
},
44 .hw_value
= ATH10K_HW_RATE_CCK_LP_2M
,
45 .hw_value_short
= ATH10K_HW_RATE_CCK_SP_2M
,
46 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
48 .hw_value
= ATH10K_HW_RATE_CCK_LP_5_5M
,
49 .hw_value_short
= ATH10K_HW_RATE_CCK_SP_5_5M
,
50 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
52 .hw_value
= ATH10K_HW_RATE_CCK_LP_11M
,
53 .hw_value_short
= ATH10K_HW_RATE_CCK_SP_11M
,
54 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
56 { .bitrate
= 60, .hw_value
= ATH10K_HW_RATE_OFDM_6M
},
57 { .bitrate
= 90, .hw_value
= ATH10K_HW_RATE_OFDM_9M
},
58 { .bitrate
= 120, .hw_value
= ATH10K_HW_RATE_OFDM_12M
},
59 { .bitrate
= 180, .hw_value
= ATH10K_HW_RATE_OFDM_18M
},
60 { .bitrate
= 240, .hw_value
= ATH10K_HW_RATE_OFDM_24M
},
61 { .bitrate
= 360, .hw_value
= ATH10K_HW_RATE_OFDM_36M
},
62 { .bitrate
= 480, .hw_value
= ATH10K_HW_RATE_OFDM_48M
},
63 { .bitrate
= 540, .hw_value
= ATH10K_HW_RATE_OFDM_54M
},
66 static struct ieee80211_rate ath10k_rates_rev2
[] = {
68 .hw_value
= ATH10K_HW_RATE_REV2_CCK_LP_1M
},
70 .hw_value
= ATH10K_HW_RATE_REV2_CCK_LP_2M
,
71 .hw_value_short
= ATH10K_HW_RATE_REV2_CCK_SP_2M
,
72 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
74 .hw_value
= ATH10K_HW_RATE_REV2_CCK_LP_5_5M
,
75 .hw_value_short
= ATH10K_HW_RATE_REV2_CCK_SP_5_5M
,
76 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
78 .hw_value
= ATH10K_HW_RATE_REV2_CCK_LP_11M
,
79 .hw_value_short
= ATH10K_HW_RATE_REV2_CCK_SP_11M
,
80 .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
82 { .bitrate
= 60, .hw_value
= ATH10K_HW_RATE_OFDM_6M
},
83 { .bitrate
= 90, .hw_value
= ATH10K_HW_RATE_OFDM_9M
},
84 { .bitrate
= 120, .hw_value
= ATH10K_HW_RATE_OFDM_12M
},
85 { .bitrate
= 180, .hw_value
= ATH10K_HW_RATE_OFDM_18M
},
86 { .bitrate
= 240, .hw_value
= ATH10K_HW_RATE_OFDM_24M
},
87 { .bitrate
= 360, .hw_value
= ATH10K_HW_RATE_OFDM_36M
},
88 { .bitrate
= 480, .hw_value
= ATH10K_HW_RATE_OFDM_48M
},
89 { .bitrate
= 540, .hw_value
= ATH10K_HW_RATE_OFDM_54M
},
92 #define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
94 #define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
95 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
96 ATH10K_MAC_FIRST_OFDM_RATE_IDX)
97 #define ath10k_g_rates (ath10k_rates + 0)
98 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
100 #define ath10k_g_rates_rev2 (ath10k_rates_rev2 + 0)
101 #define ath10k_g_rates_rev2_size (ARRAY_SIZE(ath10k_rates_rev2))
103 static bool ath10k_mac_bitrate_is_cck(int bitrate
)
116 static u8
ath10k_mac_bitrate_to_rate(int bitrate
)
118 return DIV_ROUND_UP(bitrate
, 5) |
119 (ath10k_mac_bitrate_is_cck(bitrate
) ? BIT(7) : 0);
122 u8
ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band
*sband
,
123 u8 hw_rate
, bool cck
)
125 const struct ieee80211_rate
*rate
;
128 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
129 rate
= &sband
->bitrates
[i
];
131 if (ath10k_mac_bitrate_is_cck(rate
->bitrate
) != cck
)
134 if (rate
->hw_value
== hw_rate
)
136 else if (rate
->flags
& IEEE80211_RATE_SHORT_PREAMBLE
&&
137 rate
->hw_value_short
== hw_rate
)
144 u8
ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band
*sband
,
149 for (i
= 0; i
< sband
->n_bitrates
; i
++)
150 if (sband
->bitrates
[i
].bitrate
== bitrate
)
156 static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map
, int nss
)
158 switch ((mcs_map
>> (2 * nss
)) & 0x3) {
159 case IEEE80211_VHT_MCS_SUPPORT_0_7
: return BIT(8) - 1;
160 case IEEE80211_VHT_MCS_SUPPORT_0_8
: return BIT(9) - 1;
161 case IEEE80211_VHT_MCS_SUPPORT_0_9
: return BIT(10) - 1;
167 ath10k_mac_max_ht_nss(const u8 ht_mcs_mask
[IEEE80211_HT_MCS_MASK_LEN
])
171 for (nss
= IEEE80211_HT_MCS_MASK_LEN
- 1; nss
>= 0; nss
--)
172 if (ht_mcs_mask
[nss
])
179 ath10k_mac_max_vht_nss(const u16 vht_mcs_mask
[NL80211_VHT_NSS_MAX
])
183 for (nss
= NL80211_VHT_NSS_MAX
- 1; nss
>= 0; nss
--)
184 if (vht_mcs_mask
[nss
])
190 int ath10k_mac_ext_resource_config(struct ath10k
*ar
, u32 val
)
192 enum wmi_host_platform_type platform_type
;
195 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC
, ar
->wmi
.svc_map
))
196 platform_type
= WMI_HOST_PLATFORM_LOW_PERF
;
198 platform_type
= WMI_HOST_PLATFORM_HIGH_PERF
;
200 ret
= ath10k_wmi_ext_resource_config(ar
, platform_type
, val
);
202 if (ret
&& ret
!= -EOPNOTSUPP
) {
203 ath10k_warn(ar
, "failed to configure ext resource: %d\n", ret
);
214 static int ath10k_send_key(struct ath10k_vif
*arvif
,
215 struct ieee80211_key_conf
*key
,
216 enum set_key_cmd cmd
,
217 const u8
*macaddr
, u32 flags
)
219 struct ath10k
*ar
= arvif
->ar
;
220 struct wmi_vdev_install_key_arg arg
= {
221 .vdev_id
= arvif
->vdev_id
,
222 .key_idx
= key
->keyidx
,
223 .key_len
= key
->keylen
,
224 .key_data
= key
->key
,
229 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
231 switch (key
->cipher
) {
232 case WLAN_CIPHER_SUITE_CCMP
:
233 arg
.key_cipher
= WMI_CIPHER_AES_CCM
;
234 key
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT
;
236 case WLAN_CIPHER_SUITE_TKIP
:
237 arg
.key_cipher
= WMI_CIPHER_TKIP
;
238 arg
.key_txmic_len
= 8;
239 arg
.key_rxmic_len
= 8;
241 case WLAN_CIPHER_SUITE_WEP40
:
242 case WLAN_CIPHER_SUITE_WEP104
:
243 arg
.key_cipher
= WMI_CIPHER_WEP
;
245 case WLAN_CIPHER_SUITE_AES_CMAC
:
249 ath10k_warn(ar
, "cipher %d is not supported\n", key
->cipher
);
253 if (test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
254 key
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
256 if (cmd
== DISABLE_KEY
) {
257 arg
.key_cipher
= WMI_CIPHER_NONE
;
261 return ath10k_wmi_vdev_install_key(arvif
->ar
, &arg
);
264 static int ath10k_install_key(struct ath10k_vif
*arvif
,
265 struct ieee80211_key_conf
*key
,
266 enum set_key_cmd cmd
,
267 const u8
*macaddr
, u32 flags
)
269 struct ath10k
*ar
= arvif
->ar
;
271 unsigned long time_left
;
273 lockdep_assert_held(&ar
->conf_mutex
);
275 reinit_completion(&ar
->install_key_done
);
277 if (arvif
->nohwcrypt
)
280 ret
= ath10k_send_key(arvif
, key
, cmd
, macaddr
, flags
);
284 time_left
= wait_for_completion_timeout(&ar
->install_key_done
, 3 * HZ
);
291 static int ath10k_install_peer_wep_keys(struct ath10k_vif
*arvif
,
294 struct ath10k
*ar
= arvif
->ar
;
295 struct ath10k_peer
*peer
;
300 lockdep_assert_held(&ar
->conf_mutex
);
302 if (WARN_ON(arvif
->vif
->type
!= NL80211_IFTYPE_AP
&&
303 arvif
->vif
->type
!= NL80211_IFTYPE_ADHOC
&&
304 arvif
->vif
->type
!= NL80211_IFTYPE_MESH_POINT
))
307 spin_lock_bh(&ar
->data_lock
);
308 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
309 spin_unlock_bh(&ar
->data_lock
);
314 for (i
= 0; i
< ARRAY_SIZE(arvif
->wep_keys
); i
++) {
315 if (arvif
->wep_keys
[i
] == NULL
)
318 switch (arvif
->vif
->type
) {
319 case NL80211_IFTYPE_AP
:
320 flags
= WMI_KEY_PAIRWISE
;
322 if (arvif
->def_wep_key_idx
== i
)
323 flags
|= WMI_KEY_TX_USAGE
;
325 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
],
326 SET_KEY
, addr
, flags
);
330 case NL80211_IFTYPE_ADHOC
:
331 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
],
337 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
],
338 SET_KEY
, addr
, WMI_KEY_GROUP
);
347 spin_lock_bh(&ar
->data_lock
);
348 peer
->keys
[i
] = arvif
->wep_keys
[i
];
349 spin_unlock_bh(&ar
->data_lock
);
352 /* In some cases (notably with static WEP IBSS with multiple keys)
353 * multicast Tx becomes broken. Both pairwise and groupwise keys are
354 * installed already. Using WMI_KEY_TX_USAGE in different combinations
355 * didn't seem help. Using def_keyid vdev parameter seems to be
356 * effective so use that.
358 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
360 if (arvif
->vif
->type
!= NL80211_IFTYPE_ADHOC
)
363 if (arvif
->def_wep_key_idx
== -1)
366 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
,
368 arvif
->ar
->wmi
.vdev_param
->def_keyid
,
369 arvif
->def_wep_key_idx
);
371 ath10k_warn(ar
, "failed to re-set def wpa key idxon vdev %i: %d\n",
372 arvif
->vdev_id
, ret
);
379 static int ath10k_clear_peer_keys(struct ath10k_vif
*arvif
,
382 struct ath10k
*ar
= arvif
->ar
;
383 struct ath10k_peer
*peer
;
389 lockdep_assert_held(&ar
->conf_mutex
);
391 spin_lock_bh(&ar
->data_lock
);
392 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
393 spin_unlock_bh(&ar
->data_lock
);
398 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
399 if (peer
->keys
[i
] == NULL
)
402 /* key flags are not required to delete the key */
403 ret
= ath10k_install_key(arvif
, peer
->keys
[i
],
404 DISABLE_KEY
, addr
, flags
);
405 if (ret
< 0 && first_errno
== 0)
409 ath10k_warn(ar
, "failed to remove peer wep key %d: %d\n",
412 spin_lock_bh(&ar
->data_lock
);
413 peer
->keys
[i
] = NULL
;
414 spin_unlock_bh(&ar
->data_lock
);
420 bool ath10k_mac_is_peer_wep_key_set(struct ath10k
*ar
, const u8
*addr
,
423 struct ath10k_peer
*peer
;
426 lockdep_assert_held(&ar
->data_lock
);
428 /* We don't know which vdev this peer belongs to,
429 * since WMI doesn't give us that information.
431 * FIXME: multi-bss needs to be handled.
433 peer
= ath10k_peer_find(ar
, 0, addr
);
437 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
438 if (peer
->keys
[i
] && peer
->keys
[i
]->keyidx
== keyidx
)
445 static int ath10k_clear_vdev_key(struct ath10k_vif
*arvif
,
446 struct ieee80211_key_conf
*key
)
448 struct ath10k
*ar
= arvif
->ar
;
449 struct ath10k_peer
*peer
;
456 lockdep_assert_held(&ar
->conf_mutex
);
459 /* since ath10k_install_key we can't hold data_lock all the
460 * time, so we try to remove the keys incrementally */
461 spin_lock_bh(&ar
->data_lock
);
463 list_for_each_entry(peer
, &ar
->peers
, list
) {
464 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
465 if (peer
->keys
[i
] == key
) {
466 ether_addr_copy(addr
, peer
->addr
);
467 peer
->keys
[i
] = NULL
;
472 if (i
< ARRAY_SIZE(peer
->keys
))
475 spin_unlock_bh(&ar
->data_lock
);
477 if (i
== ARRAY_SIZE(peer
->keys
))
479 /* key flags are not required to delete the key */
480 ret
= ath10k_install_key(arvif
, key
, DISABLE_KEY
, addr
, flags
);
481 if (ret
< 0 && first_errno
== 0)
485 ath10k_warn(ar
, "failed to remove key for %pM: %d\n",
492 static int ath10k_mac_vif_update_wep_key(struct ath10k_vif
*arvif
,
493 struct ieee80211_key_conf
*key
)
495 struct ath10k
*ar
= arvif
->ar
;
496 struct ath10k_peer
*peer
;
499 lockdep_assert_held(&ar
->conf_mutex
);
501 list_for_each_entry(peer
, &ar
->peers
, list
) {
502 if (ether_addr_equal(peer
->addr
, arvif
->vif
->addr
))
505 if (ether_addr_equal(peer
->addr
, arvif
->bssid
))
508 if (peer
->keys
[key
->keyidx
] == key
)
511 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vif vdev %i update key %i needs update\n",
512 arvif
->vdev_id
, key
->keyidx
);
514 ret
= ath10k_install_peer_wep_keys(arvif
, peer
->addr
);
516 ath10k_warn(ar
, "failed to update wep keys on vdev %i for peer %pM: %d\n",
517 arvif
->vdev_id
, peer
->addr
, ret
);
525 /*********************/
526 /* General utilities */
527 /*********************/
529 static inline enum wmi_phy_mode
530 chan_to_phymode(const struct cfg80211_chan_def
*chandef
)
532 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
534 switch (chandef
->chan
->band
) {
535 case NL80211_BAND_2GHZ
:
536 switch (chandef
->width
) {
537 case NL80211_CHAN_WIDTH_20_NOHT
:
538 if (chandef
->chan
->flags
& IEEE80211_CHAN_NO_OFDM
)
543 case NL80211_CHAN_WIDTH_20
:
544 phymode
= MODE_11NG_HT20
;
546 case NL80211_CHAN_WIDTH_40
:
547 phymode
= MODE_11NG_HT40
;
549 case NL80211_CHAN_WIDTH_5
:
550 case NL80211_CHAN_WIDTH_10
:
551 case NL80211_CHAN_WIDTH_80
:
552 case NL80211_CHAN_WIDTH_80P80
:
553 case NL80211_CHAN_WIDTH_160
:
554 phymode
= MODE_UNKNOWN
;
558 case NL80211_BAND_5GHZ
:
559 switch (chandef
->width
) {
560 case NL80211_CHAN_WIDTH_20_NOHT
:
563 case NL80211_CHAN_WIDTH_20
:
564 phymode
= MODE_11NA_HT20
;
566 case NL80211_CHAN_WIDTH_40
:
567 phymode
= MODE_11NA_HT40
;
569 case NL80211_CHAN_WIDTH_80
:
570 phymode
= MODE_11AC_VHT80
;
572 case NL80211_CHAN_WIDTH_5
:
573 case NL80211_CHAN_WIDTH_10
:
574 case NL80211_CHAN_WIDTH_80P80
:
575 case NL80211_CHAN_WIDTH_160
:
576 phymode
= MODE_UNKNOWN
;
584 WARN_ON(phymode
== MODE_UNKNOWN
);
588 static u8
ath10k_parse_mpdudensity(u8 mpdudensity
)
591 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
592 * 0 for no restriction
601 switch (mpdudensity
) {
607 /* Our lower layer calculations limit our precision to
623 int ath10k_mac_vif_chan(struct ieee80211_vif
*vif
,
624 struct cfg80211_chan_def
*def
)
626 struct ieee80211_chanctx_conf
*conf
;
629 conf
= rcu_dereference(vif
->chanctx_conf
);
641 static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw
*hw
,
642 struct ieee80211_chanctx_conf
*conf
,
650 static int ath10k_mac_num_chanctxs(struct ath10k
*ar
)
654 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
655 ath10k_mac_num_chanctxs_iter
,
662 ath10k_mac_get_any_chandef_iter(struct ieee80211_hw
*hw
,
663 struct ieee80211_chanctx_conf
*conf
,
666 struct cfg80211_chan_def
**def
= data
;
671 static int ath10k_peer_create(struct ath10k
*ar
,
672 struct ieee80211_vif
*vif
,
673 struct ieee80211_sta
*sta
,
676 enum wmi_peer_type peer_type
)
678 struct ath10k_vif
*arvif
;
679 struct ath10k_peer
*peer
;
683 lockdep_assert_held(&ar
->conf_mutex
);
685 num_peers
= ar
->num_peers
;
687 /* Each vdev consumes a peer entry as well */
688 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
691 if (num_peers
>= ar
->max_num_peers
)
694 ret
= ath10k_wmi_peer_create(ar
, vdev_id
, addr
, peer_type
);
696 ath10k_warn(ar
, "failed to create wmi peer %pM on vdev %i: %i\n",
701 ret
= ath10k_wait_for_peer_created(ar
, vdev_id
, addr
);
703 ath10k_warn(ar
, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
708 spin_lock_bh(&ar
->data_lock
);
710 peer
= ath10k_peer_find(ar
, vdev_id
, addr
);
712 spin_unlock_bh(&ar
->data_lock
);
713 ath10k_warn(ar
, "failed to find peer %pM on vdev %i after creation\n",
715 ath10k_wmi_peer_delete(ar
, vdev_id
, addr
);
722 spin_unlock_bh(&ar
->data_lock
);
729 static int ath10k_mac_set_kickout(struct ath10k_vif
*arvif
)
731 struct ath10k
*ar
= arvif
->ar
;
735 param
= ar
->wmi
.pdev_param
->sta_kickout_th
;
736 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
737 ATH10K_KICKOUT_THRESHOLD
);
739 ath10k_warn(ar
, "failed to set kickout threshold on vdev %i: %d\n",
740 arvif
->vdev_id
, ret
);
744 param
= ar
->wmi
.vdev_param
->ap_keepalive_min_idle_inactive_time_secs
;
745 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
746 ATH10K_KEEPALIVE_MIN_IDLE
);
748 ath10k_warn(ar
, "failed to set keepalive minimum idle time on vdev %i: %d\n",
749 arvif
->vdev_id
, ret
);
753 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_idle_inactive_time_secs
;
754 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
755 ATH10K_KEEPALIVE_MAX_IDLE
);
757 ath10k_warn(ar
, "failed to set keepalive maximum idle time on vdev %i: %d\n",
758 arvif
->vdev_id
, ret
);
762 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_unresponsive_time_secs
;
763 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
764 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE
);
766 ath10k_warn(ar
, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
767 arvif
->vdev_id
, ret
);
774 static int ath10k_mac_set_rts(struct ath10k_vif
*arvif
, u32 value
)
776 struct ath10k
*ar
= arvif
->ar
;
779 vdev_param
= ar
->wmi
.vdev_param
->rts_threshold
;
780 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, value
);
783 static int ath10k_peer_delete(struct ath10k
*ar
, u32 vdev_id
, const u8
*addr
)
787 lockdep_assert_held(&ar
->conf_mutex
);
789 ret
= ath10k_wmi_peer_delete(ar
, vdev_id
, addr
);
793 ret
= ath10k_wait_for_peer_deleted(ar
, vdev_id
, addr
);
802 static void ath10k_peer_cleanup(struct ath10k
*ar
, u32 vdev_id
)
804 struct ath10k_peer
*peer
, *tmp
;
808 lockdep_assert_held(&ar
->conf_mutex
);
810 spin_lock_bh(&ar
->data_lock
);
811 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
812 if (peer
->vdev_id
!= vdev_id
)
815 ath10k_warn(ar
, "removing stale peer %pM from vdev_id %d\n",
816 peer
->addr
, vdev_id
);
818 for_each_set_bit(peer_id
, peer
->peer_ids
,
819 ATH10K_MAX_NUM_PEER_IDS
) {
820 ar
->peer_map
[peer_id
] = NULL
;
823 /* Double check that peer is properly un-referenced from
826 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++) {
827 if (ar
->peer_map
[i
] == peer
) {
828 ath10k_warn(ar
, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n",
829 peer
->addr
, peer
, i
);
830 ar
->peer_map
[i
] = NULL
;
834 list_del(&peer
->list
);
838 spin_unlock_bh(&ar
->data_lock
);
841 static void ath10k_peer_cleanup_all(struct ath10k
*ar
)
843 struct ath10k_peer
*peer
, *tmp
;
846 lockdep_assert_held(&ar
->conf_mutex
);
848 spin_lock_bh(&ar
->data_lock
);
849 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
850 list_del(&peer
->list
);
854 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++)
855 ar
->peer_map
[i
] = NULL
;
857 spin_unlock_bh(&ar
->data_lock
);
860 ar
->num_stations
= 0;
863 static int ath10k_mac_tdls_peer_update(struct ath10k
*ar
, u32 vdev_id
,
864 struct ieee80211_sta
*sta
,
865 enum wmi_tdls_peer_state state
)
868 struct wmi_tdls_peer_update_cmd_arg arg
= {};
869 struct wmi_tdls_peer_capab_arg cap
= {};
870 struct wmi_channel_arg chan_arg
= {};
872 lockdep_assert_held(&ar
->conf_mutex
);
874 arg
.vdev_id
= vdev_id
;
875 arg
.peer_state
= state
;
876 ether_addr_copy(arg
.addr
, sta
->addr
);
878 cap
.peer_max_sp
= sta
->max_sp
;
879 cap
.peer_uapsd_queues
= sta
->uapsd_queues
;
881 if (state
== WMI_TDLS_PEER_STATE_CONNECTED
&&
882 !sta
->tdls_initiator
)
883 cap
.is_peer_responder
= 1;
885 ret
= ath10k_wmi_tdls_peer_update(ar
, &arg
, &cap
, &chan_arg
);
887 ath10k_warn(ar
, "failed to update tdls peer %pM on vdev %i: %i\n",
888 arg
.addr
, vdev_id
, ret
);
895 /************************/
896 /* Interface management */
897 /************************/
899 void ath10k_mac_vif_beacon_free(struct ath10k_vif
*arvif
)
901 struct ath10k
*ar
= arvif
->ar
;
903 lockdep_assert_held(&ar
->data_lock
);
908 if (!arvif
->beacon_buf
)
909 dma_unmap_single(ar
->dev
, ATH10K_SKB_CB(arvif
->beacon
)->paddr
,
910 arvif
->beacon
->len
, DMA_TO_DEVICE
);
912 if (WARN_ON(arvif
->beacon_state
!= ATH10K_BEACON_SCHEDULED
&&
913 arvif
->beacon_state
!= ATH10K_BEACON_SENT
))
916 dev_kfree_skb_any(arvif
->beacon
);
918 arvif
->beacon
= NULL
;
919 arvif
->beacon_state
= ATH10K_BEACON_SCHEDULED
;
922 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif
*arvif
)
924 struct ath10k
*ar
= arvif
->ar
;
926 lockdep_assert_held(&ar
->data_lock
);
928 ath10k_mac_vif_beacon_free(arvif
);
930 if (arvif
->beacon_buf
) {
931 dma_free_coherent(ar
->dev
, IEEE80211_MAX_FRAME_LEN
,
932 arvif
->beacon_buf
, arvif
->beacon_paddr
);
933 arvif
->beacon_buf
= NULL
;
937 static inline int ath10k_vdev_setup_sync(struct ath10k
*ar
)
939 unsigned long time_left
;
941 lockdep_assert_held(&ar
->conf_mutex
);
943 if (test_bit(ATH10K_FLAG_CRASH_FLUSH
, &ar
->dev_flags
))
946 time_left
= wait_for_completion_timeout(&ar
->vdev_setup_done
,
947 ATH10K_VDEV_SETUP_TIMEOUT_HZ
);
954 static int ath10k_monitor_vdev_start(struct ath10k
*ar
, int vdev_id
)
956 struct cfg80211_chan_def
*chandef
= NULL
;
957 struct ieee80211_channel
*channel
= NULL
;
958 struct wmi_vdev_start_request_arg arg
= {};
961 lockdep_assert_held(&ar
->conf_mutex
);
963 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
964 ath10k_mac_get_any_chandef_iter
,
966 if (WARN_ON_ONCE(!chandef
))
969 channel
= chandef
->chan
;
971 arg
.vdev_id
= vdev_id
;
972 arg
.channel
.freq
= channel
->center_freq
;
973 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
975 /* TODO setup this dynamically, what in case we
976 don't have any vifs? */
977 arg
.channel
.mode
= chan_to_phymode(chandef
);
978 arg
.channel
.chan_radar
=
979 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
981 arg
.channel
.min_power
= 0;
982 arg
.channel
.max_power
= channel
->max_power
* 2;
983 arg
.channel
.max_reg_power
= channel
->max_reg_power
* 2;
984 arg
.channel
.max_antenna_gain
= channel
->max_antenna_gain
* 2;
986 reinit_completion(&ar
->vdev_setup_done
);
988 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
990 ath10k_warn(ar
, "failed to request monitor vdev %i start: %d\n",
995 ret
= ath10k_vdev_setup_sync(ar
);
997 ath10k_warn(ar
, "failed to synchronize setup for monitor vdev %i start: %d\n",
1002 ret
= ath10k_wmi_vdev_up(ar
, vdev_id
, 0, ar
->mac_addr
);
1004 ath10k_warn(ar
, "failed to put up monitor vdev %i: %d\n",
1009 ar
->monitor_vdev_id
= vdev_id
;
1011 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %i started\n",
1012 ar
->monitor_vdev_id
);
1016 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
1018 ath10k_warn(ar
, "failed to stop monitor vdev %i after start failure: %d\n",
1019 ar
->monitor_vdev_id
, ret
);
1024 static int ath10k_monitor_vdev_stop(struct ath10k
*ar
)
1028 lockdep_assert_held(&ar
->conf_mutex
);
1030 ret
= ath10k_wmi_vdev_down(ar
, ar
->monitor_vdev_id
);
1032 ath10k_warn(ar
, "failed to put down monitor vdev %i: %d\n",
1033 ar
->monitor_vdev_id
, ret
);
1035 reinit_completion(&ar
->vdev_setup_done
);
1037 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
1039 ath10k_warn(ar
, "failed to to request monitor vdev %i stop: %d\n",
1040 ar
->monitor_vdev_id
, ret
);
1042 ret
= ath10k_vdev_setup_sync(ar
);
1044 ath10k_warn(ar
, "failed to synchronize monitor vdev %i stop: %d\n",
1045 ar
->monitor_vdev_id
, ret
);
1047 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %i stopped\n",
1048 ar
->monitor_vdev_id
);
1052 static int ath10k_monitor_vdev_create(struct ath10k
*ar
)
1056 lockdep_assert_held(&ar
->conf_mutex
);
1058 if (ar
->free_vdev_map
== 0) {
1059 ath10k_warn(ar
, "failed to find free vdev id for monitor vdev\n");
1063 bit
= __ffs64(ar
->free_vdev_map
);
1065 ar
->monitor_vdev_id
= bit
;
1067 ret
= ath10k_wmi_vdev_create(ar
, ar
->monitor_vdev_id
,
1068 WMI_VDEV_TYPE_MONITOR
,
1071 ath10k_warn(ar
, "failed to request monitor vdev %i creation: %d\n",
1072 ar
->monitor_vdev_id
, ret
);
1076 ar
->free_vdev_map
&= ~(1LL << ar
->monitor_vdev_id
);
1077 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %d created\n",
1078 ar
->monitor_vdev_id
);
1083 static int ath10k_monitor_vdev_delete(struct ath10k
*ar
)
1087 lockdep_assert_held(&ar
->conf_mutex
);
1089 ret
= ath10k_wmi_vdev_delete(ar
, ar
->monitor_vdev_id
);
1091 ath10k_warn(ar
, "failed to request wmi monitor vdev %i removal: %d\n",
1092 ar
->monitor_vdev_id
, ret
);
1096 ar
->free_vdev_map
|= 1LL << ar
->monitor_vdev_id
;
1098 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %d deleted\n",
1099 ar
->monitor_vdev_id
);
1103 static int ath10k_monitor_start(struct ath10k
*ar
)
1107 lockdep_assert_held(&ar
->conf_mutex
);
1109 ret
= ath10k_monitor_vdev_create(ar
);
1111 ath10k_warn(ar
, "failed to create monitor vdev: %d\n", ret
);
1115 ret
= ath10k_monitor_vdev_start(ar
, ar
->monitor_vdev_id
);
1117 ath10k_warn(ar
, "failed to start monitor vdev: %d\n", ret
);
1118 ath10k_monitor_vdev_delete(ar
);
1122 ar
->monitor_started
= true;
1123 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor started\n");
1128 static int ath10k_monitor_stop(struct ath10k
*ar
)
1132 lockdep_assert_held(&ar
->conf_mutex
);
1134 ret
= ath10k_monitor_vdev_stop(ar
);
1136 ath10k_warn(ar
, "failed to stop monitor vdev: %d\n", ret
);
1140 ret
= ath10k_monitor_vdev_delete(ar
);
1142 ath10k_warn(ar
, "failed to delete monitor vdev: %d\n", ret
);
1146 ar
->monitor_started
= false;
1147 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor stopped\n");
1152 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k
*ar
)
1156 /* At least one chanctx is required to derive a channel to start
1159 num_ctx
= ath10k_mac_num_chanctxs(ar
);
1163 /* If there's already an existing special monitor interface then don't
1164 * bother creating another monitor vdev.
1166 if (ar
->monitor_arvif
)
1169 return ar
->monitor
||
1170 ar
->filter_flags
& FIF_OTHER_BSS
||
1171 test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1174 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k
*ar
)
1178 num_ctx
= ath10k_mac_num_chanctxs(ar
);
1180 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1181 * shouldn't allow this but make sure to prevent handling the following
1182 * case anyway since multi-channel DFS hasn't been tested at all.
1184 if (test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
) && num_ctx
> 1)
1190 static int ath10k_monitor_recalc(struct ath10k
*ar
)
1196 lockdep_assert_held(&ar
->conf_mutex
);
1198 needed
= ath10k_mac_monitor_vdev_is_needed(ar
);
1199 allowed
= ath10k_mac_monitor_vdev_is_allowed(ar
);
1201 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
1202 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1203 ar
->monitor_started
, needed
, allowed
);
1205 if (WARN_ON(needed
&& !allowed
)) {
1206 if (ar
->monitor_started
) {
1207 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor stopping disallowed monitor\n");
1209 ret
= ath10k_monitor_stop(ar
);
1211 ath10k_warn(ar
, "failed to stop disallowed monitor: %d\n",
1219 if (needed
== ar
->monitor_started
)
1223 return ath10k_monitor_start(ar
);
1225 return ath10k_monitor_stop(ar
);
1228 static int ath10k_recalc_rtscts_prot(struct ath10k_vif
*arvif
)
1230 struct ath10k
*ar
= arvif
->ar
;
1231 u32 vdev_param
, rts_cts
= 0;
1233 lockdep_assert_held(&ar
->conf_mutex
);
1235 vdev_param
= ar
->wmi
.vdev_param
->enable_rtscts
;
1237 rts_cts
|= SM(WMI_RTSCTS_ENABLED
, WMI_RTSCTS_SET
);
1239 if (arvif
->num_legacy_stations
> 0)
1240 rts_cts
|= SM(WMI_RTSCTS_ACROSS_SW_RETRIES
,
1241 WMI_RTSCTS_PROFILE
);
1243 rts_cts
|= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES
,
1244 WMI_RTSCTS_PROFILE
);
1246 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
1250 static int ath10k_start_cac(struct ath10k
*ar
)
1254 lockdep_assert_held(&ar
->conf_mutex
);
1256 set_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1258 ret
= ath10k_monitor_recalc(ar
);
1260 ath10k_warn(ar
, "failed to start monitor (cac): %d\n", ret
);
1261 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1265 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac cac start monitor vdev %d\n",
1266 ar
->monitor_vdev_id
);
1271 static int ath10k_stop_cac(struct ath10k
*ar
)
1273 lockdep_assert_held(&ar
->conf_mutex
);
1275 /* CAC is not running - do nothing */
1276 if (!test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
))
1279 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1280 ath10k_monitor_stop(ar
);
1282 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac cac finished\n");
1287 static void ath10k_mac_has_radar_iter(struct ieee80211_hw
*hw
,
1288 struct ieee80211_chanctx_conf
*conf
,
1293 if (!*ret
&& conf
->radar_enabled
)
1297 static bool ath10k_mac_has_radar_enabled(struct ath10k
*ar
)
1299 bool has_radar
= false;
1301 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
1302 ath10k_mac_has_radar_iter
,
1308 static void ath10k_recalc_radar_detection(struct ath10k
*ar
)
1312 lockdep_assert_held(&ar
->conf_mutex
);
1314 ath10k_stop_cac(ar
);
1316 if (!ath10k_mac_has_radar_enabled(ar
))
1319 if (ar
->num_started_vdevs
> 0)
1322 ret
= ath10k_start_cac(ar
);
1325 * Not possible to start CAC on current channel so starting
1326 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1327 * by indicating that radar was detected.
1329 ath10k_warn(ar
, "failed to start CAC: %d\n", ret
);
1330 ieee80211_radar_detected(ar
->hw
);
1334 static int ath10k_vdev_stop(struct ath10k_vif
*arvif
)
1336 struct ath10k
*ar
= arvif
->ar
;
1339 lockdep_assert_held(&ar
->conf_mutex
);
1341 reinit_completion(&ar
->vdev_setup_done
);
1343 ret
= ath10k_wmi_vdev_stop(ar
, arvif
->vdev_id
);
1345 ath10k_warn(ar
, "failed to stop WMI vdev %i: %d\n",
1346 arvif
->vdev_id
, ret
);
1350 ret
= ath10k_vdev_setup_sync(ar
);
1352 ath10k_warn(ar
, "failed to syncronise setup for vdev %i: %d\n",
1353 arvif
->vdev_id
, ret
);
1357 WARN_ON(ar
->num_started_vdevs
== 0);
1359 if (ar
->num_started_vdevs
!= 0) {
1360 ar
->num_started_vdevs
--;
1361 ath10k_recalc_radar_detection(ar
);
1367 static int ath10k_vdev_start_restart(struct ath10k_vif
*arvif
,
1368 const struct cfg80211_chan_def
*chandef
,
1371 struct ath10k
*ar
= arvif
->ar
;
1372 struct wmi_vdev_start_request_arg arg
= {};
1375 lockdep_assert_held(&ar
->conf_mutex
);
1377 reinit_completion(&ar
->vdev_setup_done
);
1379 arg
.vdev_id
= arvif
->vdev_id
;
1380 arg
.dtim_period
= arvif
->dtim_period
;
1381 arg
.bcn_intval
= arvif
->beacon_interval
;
1383 arg
.channel
.freq
= chandef
->chan
->center_freq
;
1384 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
1385 arg
.channel
.mode
= chan_to_phymode(chandef
);
1387 arg
.channel
.min_power
= 0;
1388 arg
.channel
.max_power
= chandef
->chan
->max_power
* 2;
1389 arg
.channel
.max_reg_power
= chandef
->chan
->max_reg_power
* 2;
1390 arg
.channel
.max_antenna_gain
= chandef
->chan
->max_antenna_gain
* 2;
1392 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
1393 arg
.ssid
= arvif
->u
.ap
.ssid
;
1394 arg
.ssid_len
= arvif
->u
.ap
.ssid_len
;
1395 arg
.hidden_ssid
= arvif
->u
.ap
.hidden_ssid
;
1397 /* For now allow DFS for AP mode */
1398 arg
.channel
.chan_radar
=
1399 !!(chandef
->chan
->flags
& IEEE80211_CHAN_RADAR
);
1400 } else if (arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
1401 arg
.ssid
= arvif
->vif
->bss_conf
.ssid
;
1402 arg
.ssid_len
= arvif
->vif
->bss_conf
.ssid_len
;
1405 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
1406 "mac vdev %d start center_freq %d phymode %s\n",
1407 arg
.vdev_id
, arg
.channel
.freq
,
1408 ath10k_wmi_phymode_str(arg
.channel
.mode
));
1411 ret
= ath10k_wmi_vdev_restart(ar
, &arg
);
1413 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
1416 ath10k_warn(ar
, "failed to start WMI vdev %i: %d\n",
1421 ret
= ath10k_vdev_setup_sync(ar
);
1424 "failed to synchronize setup for vdev %i restart %d: %d\n",
1425 arg
.vdev_id
, restart
, ret
);
1429 ar
->num_started_vdevs
++;
1430 ath10k_recalc_radar_detection(ar
);
1435 static int ath10k_vdev_start(struct ath10k_vif
*arvif
,
1436 const struct cfg80211_chan_def
*def
)
1438 return ath10k_vdev_start_restart(arvif
, def
, false);
1441 static int ath10k_vdev_restart(struct ath10k_vif
*arvif
,
1442 const struct cfg80211_chan_def
*def
)
1444 return ath10k_vdev_start_restart(arvif
, def
, true);
1447 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif
*arvif
,
1448 struct sk_buff
*bcn
)
1450 struct ath10k
*ar
= arvif
->ar
;
1451 struct ieee80211_mgmt
*mgmt
;
1455 if (arvif
->vif
->type
!= NL80211_IFTYPE_AP
|| !arvif
->vif
->p2p
)
1458 mgmt
= (void *)bcn
->data
;
1459 p2p_ie
= cfg80211_find_vendor_ie(WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1460 mgmt
->u
.beacon
.variable
,
1461 bcn
->len
- (mgmt
->u
.beacon
.variable
-
1466 ret
= ath10k_wmi_p2p_go_bcn_ie(ar
, arvif
->vdev_id
, p2p_ie
);
1468 ath10k_warn(ar
, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1469 arvif
->vdev_id
, ret
);
1476 static int ath10k_mac_remove_vendor_ie(struct sk_buff
*skb
, unsigned int oui
,
1477 u8 oui_type
, size_t ie_offset
)
1484 if (WARN_ON(skb
->len
< ie_offset
))
1487 ie
= (u8
*)cfg80211_find_vendor_ie(oui
, oui_type
,
1488 skb
->data
+ ie_offset
,
1489 skb
->len
- ie_offset
);
1494 end
= skb
->data
+ skb
->len
;
1497 if (WARN_ON(next
> end
))
1500 memmove(ie
, next
, end
- next
);
1501 skb_trim(skb
, skb
->len
- len
);
1506 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif
*arvif
)
1508 struct ath10k
*ar
= arvif
->ar
;
1509 struct ieee80211_hw
*hw
= ar
->hw
;
1510 struct ieee80211_vif
*vif
= arvif
->vif
;
1511 struct ieee80211_mutable_offsets offs
= {};
1512 struct sk_buff
*bcn
;
1515 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1518 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
&&
1519 arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
1522 bcn
= ieee80211_beacon_get_template(hw
, vif
, &offs
);
1524 ath10k_warn(ar
, "failed to get beacon template from mac80211\n");
1528 ret
= ath10k_mac_setup_bcn_p2p_ie(arvif
, bcn
);
1530 ath10k_warn(ar
, "failed to setup p2p go bcn ie: %d\n", ret
);
1535 /* P2P IE is inserted by firmware automatically (as configured above)
1536 * so remove it from the base beacon template to avoid duplicate P2P
1537 * IEs in beacon frames.
1539 ath10k_mac_remove_vendor_ie(bcn
, WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1540 offsetof(struct ieee80211_mgmt
,
1541 u
.beacon
.variable
));
1543 ret
= ath10k_wmi_bcn_tmpl(ar
, arvif
->vdev_id
, offs
.tim_offset
, bcn
, 0,
1548 ath10k_warn(ar
, "failed to submit beacon template command: %d\n",
1556 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif
*arvif
)
1558 struct ath10k
*ar
= arvif
->ar
;
1559 struct ieee80211_hw
*hw
= ar
->hw
;
1560 struct ieee80211_vif
*vif
= arvif
->vif
;
1561 struct sk_buff
*prb
;
1564 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1567 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
1570 prb
= ieee80211_proberesp_get(hw
, vif
);
1572 ath10k_warn(ar
, "failed to get probe resp template from mac80211\n");
1576 ret
= ath10k_wmi_prb_tmpl(ar
, arvif
->vdev_id
, prb
);
1580 ath10k_warn(ar
, "failed to submit probe resp template command: %d\n",
1588 static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif
*arvif
)
1590 struct ath10k
*ar
= arvif
->ar
;
1591 struct cfg80211_chan_def def
;
1594 /* When originally vdev is started during assign_vif_chanctx() some
1595 * information is missing, notably SSID. Firmware revisions with beacon
1596 * offloading require the SSID to be provided during vdev (re)start to
1597 * handle hidden SSID properly.
1599 * Vdev restart must be done after vdev has been both started and
1600 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1601 * deliver vdev restart response event causing timeouts during vdev
1602 * syncing in ath10k.
1604 * Note: The vdev down/up and template reinstallation could be skipped
1605 * since only wmi-tlv firmware are known to have beacon offload and
1606 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1607 * response delivery. It's probably more robust to keep it as is.
1609 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1612 if (WARN_ON(!arvif
->is_started
))
1615 if (WARN_ON(!arvif
->is_up
))
1618 if (WARN_ON(ath10k_mac_vif_chan(arvif
->vif
, &def
)))
1621 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
1623 ath10k_warn(ar
, "failed to bring down ap vdev %i: %d\n",
1624 arvif
->vdev_id
, ret
);
1628 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1629 * firmware will crash upon vdev up.
1632 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
1634 ath10k_warn(ar
, "failed to update beacon template: %d\n", ret
);
1638 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
1640 ath10k_warn(ar
, "failed to update presp template: %d\n", ret
);
1644 ret
= ath10k_vdev_restart(arvif
, &def
);
1646 ath10k_warn(ar
, "failed to restart ap vdev %i: %d\n",
1647 arvif
->vdev_id
, ret
);
1651 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
1654 ath10k_warn(ar
, "failed to bring up ap vdev %i: %d\n",
1655 arvif
->vdev_id
, ret
);
1662 static void ath10k_control_beaconing(struct ath10k_vif
*arvif
,
1663 struct ieee80211_bss_conf
*info
)
1665 struct ath10k
*ar
= arvif
->ar
;
1668 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1670 if (!info
->enable_beacon
) {
1671 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
1673 ath10k_warn(ar
, "failed to down vdev_id %i: %d\n",
1674 arvif
->vdev_id
, ret
);
1676 arvif
->is_up
= false;
1678 spin_lock_bh(&arvif
->ar
->data_lock
);
1679 ath10k_mac_vif_beacon_free(arvif
);
1680 spin_unlock_bh(&arvif
->ar
->data_lock
);
1685 arvif
->tx_seq_no
= 0x1000;
1688 ether_addr_copy(arvif
->bssid
, info
->bssid
);
1690 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
1693 ath10k_warn(ar
, "failed to bring up vdev %d: %i\n",
1694 arvif
->vdev_id
, ret
);
1698 arvif
->is_up
= true;
1700 ret
= ath10k_mac_vif_fix_hidden_ssid(arvif
);
1702 ath10k_warn(ar
, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1703 arvif
->vdev_id
, ret
);
1707 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d up\n", arvif
->vdev_id
);
1710 static void ath10k_control_ibss(struct ath10k_vif
*arvif
,
1711 struct ieee80211_bss_conf
*info
,
1712 const u8 self_peer
[ETH_ALEN
])
1714 struct ath10k
*ar
= arvif
->ar
;
1718 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1720 if (!info
->ibss_joined
) {
1721 if (is_zero_ether_addr(arvif
->bssid
))
1724 eth_zero_addr(arvif
->bssid
);
1729 vdev_param
= arvif
->ar
->wmi
.vdev_param
->atim_window
;
1730 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
, arvif
->vdev_id
, vdev_param
,
1731 ATH10K_DEFAULT_ATIM
);
1733 ath10k_warn(ar
, "failed to set IBSS ATIM for vdev %d: %d\n",
1734 arvif
->vdev_id
, ret
);
1737 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif
*arvif
)
1739 struct ath10k
*ar
= arvif
->ar
;
1744 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1746 if (arvif
->u
.sta
.uapsd
)
1747 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER
;
1749 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS
;
1751 param
= WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD
;
1752 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
, value
);
1754 ath10k_warn(ar
, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1755 value
, arvif
->vdev_id
, ret
);
1762 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif
*arvif
)
1764 struct ath10k
*ar
= arvif
->ar
;
1769 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1771 if (arvif
->u
.sta
.uapsd
)
1772 value
= WMI_STA_PS_PSPOLL_COUNT_UAPSD
;
1774 value
= WMI_STA_PS_PSPOLL_COUNT_NO_MAX
;
1776 param
= WMI_STA_PS_PARAM_PSPOLL_COUNT
;
1777 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
1780 ath10k_warn(ar
, "failed to submit ps poll count %u on vdev %i: %d\n",
1781 value
, arvif
->vdev_id
, ret
);
1788 static int ath10k_mac_num_vifs_started(struct ath10k
*ar
)
1790 struct ath10k_vif
*arvif
;
1793 lockdep_assert_held(&ar
->conf_mutex
);
1795 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
1796 if (arvif
->is_started
)
1802 static int ath10k_mac_vif_setup_ps(struct ath10k_vif
*arvif
)
1804 struct ath10k
*ar
= arvif
->ar
;
1805 struct ieee80211_vif
*vif
= arvif
->vif
;
1806 struct ieee80211_conf
*conf
= &ar
->hw
->conf
;
1807 enum wmi_sta_powersave_param param
;
1808 enum wmi_sta_ps_mode psmode
;
1813 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1815 if (arvif
->vif
->type
!= NL80211_IFTYPE_STATION
)
1818 enable_ps
= arvif
->ps
;
1820 if (enable_ps
&& ath10k_mac_num_vifs_started(ar
) > 1 &&
1821 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT
,
1822 ar
->running_fw
->fw_file
.fw_features
)) {
1823 ath10k_warn(ar
, "refusing to enable ps on vdev %i: not supported by fw\n",
1828 if (!arvif
->is_started
) {
1829 /* mac80211 can update vif powersave state while disconnected.
1830 * Firmware doesn't behave nicely and consumes more power than
1831 * necessary if PS is disabled on a non-started vdev. Hence
1832 * force-enable PS for non-running vdevs.
1834 psmode
= WMI_STA_PS_MODE_ENABLED
;
1835 } else if (enable_ps
) {
1836 psmode
= WMI_STA_PS_MODE_ENABLED
;
1837 param
= WMI_STA_PS_PARAM_INACTIVITY_TIME
;
1839 ps_timeout
= conf
->dynamic_ps_timeout
;
1840 if (ps_timeout
== 0) {
1841 /* Firmware doesn't like 0 */
1842 ps_timeout
= ieee80211_tu_to_usec(
1843 vif
->bss_conf
.beacon_int
) / 1000;
1846 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
,
1849 ath10k_warn(ar
, "failed to set inactivity time for vdev %d: %i\n",
1850 arvif
->vdev_id
, ret
);
1854 psmode
= WMI_STA_PS_MODE_DISABLED
;
1857 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d psmode %s\n",
1858 arvif
->vdev_id
, psmode
? "enable" : "disable");
1860 ret
= ath10k_wmi_set_psmode(ar
, arvif
->vdev_id
, psmode
);
1862 ath10k_warn(ar
, "failed to set PS Mode %d for vdev %d: %d\n",
1863 psmode
, arvif
->vdev_id
, ret
);
1870 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif
*arvif
)
1872 struct ath10k
*ar
= arvif
->ar
;
1873 struct wmi_sta_keepalive_arg arg
= {};
1876 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1878 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
1881 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE
, ar
->wmi
.svc_map
))
1884 /* Some firmware revisions have a bug and ignore the `enabled` field.
1885 * Instead use the interval to disable the keepalive.
1887 arg
.vdev_id
= arvif
->vdev_id
;
1889 arg
.method
= WMI_STA_KEEPALIVE_METHOD_NULL_FRAME
;
1890 arg
.interval
= WMI_STA_KEEPALIVE_INTERVAL_DISABLE
;
1892 ret
= ath10k_wmi_sta_keepalive(ar
, &arg
);
1894 ath10k_warn(ar
, "failed to submit keepalive on vdev %i: %d\n",
1895 arvif
->vdev_id
, ret
);
1902 static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif
*arvif
)
1904 struct ath10k
*ar
= arvif
->ar
;
1905 struct ieee80211_vif
*vif
= arvif
->vif
;
1908 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1910 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
)))
1913 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
1916 if (!vif
->csa_active
)
1922 if (!ieee80211_csa_is_complete(vif
)) {
1923 ieee80211_csa_update_counter(vif
);
1925 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
1927 ath10k_warn(ar
, "failed to update bcn tmpl during csa: %d\n",
1930 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
1932 ath10k_warn(ar
, "failed to update prb tmpl during csa: %d\n",
1935 ieee80211_csa_finish(vif
);
1939 static void ath10k_mac_vif_ap_csa_work(struct work_struct
*work
)
1941 struct ath10k_vif
*arvif
= container_of(work
, struct ath10k_vif
,
1943 struct ath10k
*ar
= arvif
->ar
;
1945 mutex_lock(&ar
->conf_mutex
);
1946 ath10k_mac_vif_ap_csa_count_down(arvif
);
1947 mutex_unlock(&ar
->conf_mutex
);
1950 static void ath10k_mac_handle_beacon_iter(void *data
, u8
*mac
,
1951 struct ieee80211_vif
*vif
)
1953 struct sk_buff
*skb
= data
;
1954 struct ieee80211_mgmt
*mgmt
= (void *)skb
->data
;
1955 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1957 if (vif
->type
!= NL80211_IFTYPE_STATION
)
1960 if (!ether_addr_equal(mgmt
->bssid
, vif
->bss_conf
.bssid
))
1963 cancel_delayed_work(&arvif
->connection_loss_work
);
1966 void ath10k_mac_handle_beacon(struct ath10k
*ar
, struct sk_buff
*skb
)
1968 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
1969 IEEE80211_IFACE_ITER_NORMAL
,
1970 ath10k_mac_handle_beacon_iter
,
1974 static void ath10k_mac_handle_beacon_miss_iter(void *data
, u8
*mac
,
1975 struct ieee80211_vif
*vif
)
1977 u32
*vdev_id
= data
;
1978 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
1979 struct ath10k
*ar
= arvif
->ar
;
1980 struct ieee80211_hw
*hw
= ar
->hw
;
1982 if (arvif
->vdev_id
!= *vdev_id
)
1988 ieee80211_beacon_loss(vif
);
1990 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1991 * (done by mac80211) succeeds but beacons do not resume then it
1992 * doesn't make sense to continue operation. Queue connection loss work
1993 * which can be cancelled when beacon is received.
1995 ieee80211_queue_delayed_work(hw
, &arvif
->connection_loss_work
,
1996 ATH10K_CONNECTION_LOSS_HZ
);
1999 void ath10k_mac_handle_beacon_miss(struct ath10k
*ar
, u32 vdev_id
)
2001 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
2002 IEEE80211_IFACE_ITER_NORMAL
,
2003 ath10k_mac_handle_beacon_miss_iter
,
2007 static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct
*work
)
2009 struct ath10k_vif
*arvif
= container_of(work
, struct ath10k_vif
,
2010 connection_loss_work
.work
);
2011 struct ieee80211_vif
*vif
= arvif
->vif
;
2016 ieee80211_connection_loss(vif
);
2019 /**********************/
2020 /* Station management */
2021 /**********************/
2023 static u32
ath10k_peer_assoc_h_listen_intval(struct ath10k
*ar
,
2024 struct ieee80211_vif
*vif
)
2026 /* Some firmware revisions have unstable STA powersave when listen
2027 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
2028 * generate NullFunc frames properly even if buffered frames have been
2029 * indicated in Beacon TIM. Firmware would seldom wake up to pull
2030 * buffered frames. Often pinging the device from AP would simply fail.
2032 * As a workaround set it to 1.
2034 if (vif
->type
== NL80211_IFTYPE_STATION
)
2037 return ar
->hw
->conf
.listen_interval
;
2040 static void ath10k_peer_assoc_h_basic(struct ath10k
*ar
,
2041 struct ieee80211_vif
*vif
,
2042 struct ieee80211_sta
*sta
,
2043 struct wmi_peer_assoc_complete_arg
*arg
)
2045 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2048 lockdep_assert_held(&ar
->conf_mutex
);
2050 if (vif
->type
== NL80211_IFTYPE_STATION
)
2051 aid
= vif
->bss_conf
.aid
;
2055 ether_addr_copy(arg
->addr
, sta
->addr
);
2056 arg
->vdev_id
= arvif
->vdev_id
;
2057 arg
->peer_aid
= aid
;
2058 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->auth
;
2059 arg
->peer_listen_intval
= ath10k_peer_assoc_h_listen_intval(ar
, vif
);
2060 arg
->peer_num_spatial_streams
= 1;
2061 arg
->peer_caps
= vif
->bss_conf
.assoc_capability
;
2064 static void ath10k_peer_assoc_h_crypto(struct ath10k
*ar
,
2065 struct ieee80211_vif
*vif
,
2066 struct ieee80211_sta
*sta
,
2067 struct wmi_peer_assoc_complete_arg
*arg
)
2069 struct ieee80211_bss_conf
*info
= &vif
->bss_conf
;
2070 struct cfg80211_chan_def def
;
2071 struct cfg80211_bss
*bss
;
2072 const u8
*rsnie
= NULL
;
2073 const u8
*wpaie
= NULL
;
2075 lockdep_assert_held(&ar
->conf_mutex
);
2077 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2080 bss
= cfg80211_get_bss(ar
->hw
->wiphy
, def
.chan
, info
->bssid
, NULL
, 0,
2081 IEEE80211_BSS_TYPE_ANY
, IEEE80211_PRIVACY_ANY
);
2083 const struct cfg80211_bss_ies
*ies
;
2086 rsnie
= ieee80211_bss_get_ie(bss
, WLAN_EID_RSN
);
2088 ies
= rcu_dereference(bss
->ies
);
2090 wpaie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
2091 WLAN_OUI_TYPE_MICROSOFT_WPA
,
2095 cfg80211_put_bss(ar
->hw
->wiphy
, bss
);
2098 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2099 if (rsnie
|| wpaie
) {
2100 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "%s: rsn ie found\n", __func__
);
2101 arg
->peer_flags
|= ar
->wmi
.peer_flags
->need_ptk_4_way
;
2105 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "%s: wpa ie found\n", __func__
);
2106 arg
->peer_flags
|= ar
->wmi
.peer_flags
->need_gtk_2_way
;
2110 test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT
,
2111 ar
->running_fw
->fw_file
.fw_features
)) {
2112 arg
->peer_flags
|= ar
->wmi
.peer_flags
->pmf
;
2116 static void ath10k_peer_assoc_h_rates(struct ath10k
*ar
,
2117 struct ieee80211_vif
*vif
,
2118 struct ieee80211_sta
*sta
,
2119 struct wmi_peer_assoc_complete_arg
*arg
)
2121 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2122 struct wmi_rate_set_arg
*rateset
= &arg
->peer_legacy_rates
;
2123 struct cfg80211_chan_def def
;
2124 const struct ieee80211_supported_band
*sband
;
2125 const struct ieee80211_rate
*rates
;
2126 enum nl80211_band band
;
2131 lockdep_assert_held(&ar
->conf_mutex
);
2133 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2136 band
= def
.chan
->band
;
2137 sband
= ar
->hw
->wiphy
->bands
[band
];
2138 ratemask
= sta
->supp_rates
[band
];
2139 ratemask
&= arvif
->bitrate_mask
.control
[band
].legacy
;
2140 rates
= sband
->bitrates
;
2142 rateset
->num_rates
= 0;
2144 for (i
= 0; i
< 32; i
++, ratemask
>>= 1, rates
++) {
2145 if (!(ratemask
& 1))
2148 rate
= ath10k_mac_bitrate_to_rate(rates
->bitrate
);
2149 rateset
->rates
[rateset
->num_rates
] = rate
;
2150 rateset
->num_rates
++;
2155 ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask
[IEEE80211_HT_MCS_MASK_LEN
])
2159 for (nss
= 0; nss
< IEEE80211_HT_MCS_MASK_LEN
; nss
++)
2160 if (ht_mcs_mask
[nss
])
2167 ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask
[NL80211_VHT_NSS_MAX
])
2171 for (nss
= 0; nss
< NL80211_VHT_NSS_MAX
; nss
++)
2172 if (vht_mcs_mask
[nss
])
2178 static void ath10k_peer_assoc_h_ht(struct ath10k
*ar
,
2179 struct ieee80211_vif
*vif
,
2180 struct ieee80211_sta
*sta
,
2181 struct wmi_peer_assoc_complete_arg
*arg
)
2183 const struct ieee80211_sta_ht_cap
*ht_cap
= &sta
->ht_cap
;
2184 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2185 struct cfg80211_chan_def def
;
2186 enum nl80211_band band
;
2187 const u8
*ht_mcs_mask
;
2188 const u16
*vht_mcs_mask
;
2193 lockdep_assert_held(&ar
->conf_mutex
);
2195 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2198 if (!ht_cap
->ht_supported
)
2201 band
= def
.chan
->band
;
2202 ht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].ht_mcs
;
2203 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
2205 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask
) &&
2206 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
))
2209 arg
->peer_flags
|= ar
->wmi
.peer_flags
->ht
;
2210 arg
->peer_max_mpdu
= (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
2211 ht_cap
->ampdu_factor
)) - 1;
2213 arg
->peer_mpdu_density
=
2214 ath10k_parse_mpdudensity(ht_cap
->ampdu_density
);
2216 arg
->peer_ht_caps
= ht_cap
->cap
;
2217 arg
->peer_rate_caps
|= WMI_RC_HT_FLAG
;
2219 if (ht_cap
->cap
& IEEE80211_HT_CAP_LDPC_CODING
)
2220 arg
->peer_flags
|= ar
->wmi
.peer_flags
->ldbc
;
2222 if (sta
->bandwidth
>= IEEE80211_STA_RX_BW_40
) {
2223 arg
->peer_flags
|= ar
->wmi
.peer_flags
->bw40
;
2224 arg
->peer_rate_caps
|= WMI_RC_CW40_FLAG
;
2227 if (arvif
->bitrate_mask
.control
[band
].gi
!= NL80211_TXRATE_FORCE_LGI
) {
2228 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_20
)
2229 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
2231 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_40
)
2232 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
2235 if (ht_cap
->cap
& IEEE80211_HT_CAP_TX_STBC
) {
2236 arg
->peer_rate_caps
|= WMI_RC_TX_STBC_FLAG
;
2237 arg
->peer_flags
|= ar
->wmi
.peer_flags
->stbc
;
2240 if (ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
) {
2241 stbc
= ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
;
2242 stbc
= stbc
>> IEEE80211_HT_CAP_RX_STBC_SHIFT
;
2243 stbc
= stbc
<< WMI_RC_RX_STBC_FLAG_S
;
2244 arg
->peer_rate_caps
|= stbc
;
2245 arg
->peer_flags
|= ar
->wmi
.peer_flags
->stbc
;
2248 if (ht_cap
->mcs
.rx_mask
[1] && ht_cap
->mcs
.rx_mask
[2])
2249 arg
->peer_rate_caps
|= WMI_RC_TS_FLAG
;
2250 else if (ht_cap
->mcs
.rx_mask
[1])
2251 arg
->peer_rate_caps
|= WMI_RC_DS_FLAG
;
2253 for (i
= 0, n
= 0, max_nss
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
* 8; i
++)
2254 if ((ht_cap
->mcs
.rx_mask
[i
/ 8] & BIT(i
% 8)) &&
2255 (ht_mcs_mask
[i
/ 8] & BIT(i
% 8))) {
2256 max_nss
= (i
/ 8) + 1;
2257 arg
->peer_ht_rates
.rates
[n
++] = i
;
2261 * This is a workaround for HT-enabled STAs which break the spec
2262 * and have no HT capabilities RX mask (no HT RX MCS map).
2264 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2265 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2267 * Firmware asserts if such situation occurs.
2270 arg
->peer_ht_rates
.num_rates
= 8;
2271 for (i
= 0; i
< arg
->peer_ht_rates
.num_rates
; i
++)
2272 arg
->peer_ht_rates
.rates
[i
] = i
;
2274 arg
->peer_ht_rates
.num_rates
= n
;
2275 arg
->peer_num_spatial_streams
= min(sta
->rx_nss
, max_nss
);
2278 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac ht peer %pM mcs cnt %d nss %d\n",
2280 arg
->peer_ht_rates
.num_rates
,
2281 arg
->peer_num_spatial_streams
);
2284 static int ath10k_peer_assoc_qos_ap(struct ath10k
*ar
,
2285 struct ath10k_vif
*arvif
,
2286 struct ieee80211_sta
*sta
)
2292 lockdep_assert_held(&ar
->conf_mutex
);
2294 if (sta
->wme
&& sta
->uapsd_queues
) {
2295 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac uapsd_queues 0x%x max_sp %d\n",
2296 sta
->uapsd_queues
, sta
->max_sp
);
2298 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
)
2299 uapsd
|= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN
|
2300 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN
;
2301 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VI
)
2302 uapsd
|= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN
|
2303 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN
;
2304 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
)
2305 uapsd
|= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN
|
2306 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN
;
2307 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BE
)
2308 uapsd
|= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN
|
2309 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN
;
2311 if (sta
->max_sp
< MAX_WMI_AP_PS_PEER_PARAM_MAX_SP
)
2312 max_sp
= sta
->max_sp
;
2314 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
2316 WMI_AP_PS_PEER_PARAM_UAPSD
,
2319 ath10k_warn(ar
, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2320 arvif
->vdev_id
, ret
);
2324 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
2326 WMI_AP_PS_PEER_PARAM_MAX_SP
,
2329 ath10k_warn(ar
, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2330 arvif
->vdev_id
, ret
);
2334 /* TODO setup this based on STA listen interval and
2335 beacon interval. Currently we don't know
2336 sta->listen_interval - mac80211 patch required.
2337 Currently use 10 seconds */
2338 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
, sta
->addr
,
2339 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME
,
2342 ath10k_warn(ar
, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2343 arvif
->vdev_id
, ret
);
2352 ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set
,
2353 const u16 vht_mcs_limit
[NL80211_VHT_NSS_MAX
])
2360 for (nss
= 0; nss
< NL80211_VHT_NSS_MAX
; nss
++) {
2361 mcs_map
= ath10k_mac_get_max_vht_mcs_map(tx_mcs_set
, nss
) &
2365 idx_limit
= fls(mcs_map
) - 1;
2369 switch (idx_limit
) {
2370 case 0: /* fall through */
2371 case 1: /* fall through */
2372 case 2: /* fall through */
2373 case 3: /* fall through */
2374 case 4: /* fall through */
2375 case 5: /* fall through */
2376 case 6: /* fall through */
2378 /* see ath10k_mac_can_set_bitrate_mask() */
2382 mcs
= IEEE80211_VHT_MCS_NOT_SUPPORTED
;
2385 mcs
= IEEE80211_VHT_MCS_SUPPORT_0_7
;
2388 mcs
= IEEE80211_VHT_MCS_SUPPORT_0_8
;
2391 mcs
= IEEE80211_VHT_MCS_SUPPORT_0_9
;
2395 tx_mcs_set
&= ~(0x3 << (nss
* 2));
2396 tx_mcs_set
|= mcs
<< (nss
* 2);
2402 static void ath10k_peer_assoc_h_vht(struct ath10k
*ar
,
2403 struct ieee80211_vif
*vif
,
2404 struct ieee80211_sta
*sta
,
2405 struct wmi_peer_assoc_complete_arg
*arg
)
2407 const struct ieee80211_sta_vht_cap
*vht_cap
= &sta
->vht_cap
;
2408 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2409 struct cfg80211_chan_def def
;
2410 enum nl80211_band band
;
2411 const u16
*vht_mcs_mask
;
2414 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2417 if (!vht_cap
->vht_supported
)
2420 band
= def
.chan
->band
;
2421 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
2423 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
))
2426 arg
->peer_flags
|= ar
->wmi
.peer_flags
->vht
;
2428 if (def
.chan
->band
== NL80211_BAND_2GHZ
)
2429 arg
->peer_flags
|= ar
->wmi
.peer_flags
->vht_2g
;
2431 arg
->peer_vht_caps
= vht_cap
->cap
;
2433 ampdu_factor
= (vht_cap
->cap
&
2434 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
) >>
2435 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT
;
2437 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2438 * zero in VHT IE. Using it would result in degraded throughput.
2439 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2440 * it if VHT max_mpdu is smaller. */
2441 arg
->peer_max_mpdu
= max(arg
->peer_max_mpdu
,
2442 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
2443 ampdu_factor
)) - 1);
2445 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
2446 arg
->peer_flags
|= ar
->wmi
.peer_flags
->bw80
;
2448 arg
->peer_vht_rates
.rx_max_rate
=
2449 __le16_to_cpu(vht_cap
->vht_mcs
.rx_highest
);
2450 arg
->peer_vht_rates
.rx_mcs_set
=
2451 __le16_to_cpu(vht_cap
->vht_mcs
.rx_mcs_map
);
2452 arg
->peer_vht_rates
.tx_max_rate
=
2453 __le16_to_cpu(vht_cap
->vht_mcs
.tx_highest
);
2454 arg
->peer_vht_rates
.tx_mcs_set
= ath10k_peer_assoc_h_vht_limit(
2455 __le16_to_cpu(vht_cap
->vht_mcs
.tx_mcs_map
), vht_mcs_mask
);
2457 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
2458 sta
->addr
, arg
->peer_max_mpdu
, arg
->peer_flags
);
2461 static void ath10k_peer_assoc_h_qos(struct ath10k
*ar
,
2462 struct ieee80211_vif
*vif
,
2463 struct ieee80211_sta
*sta
,
2464 struct wmi_peer_assoc_complete_arg
*arg
)
2466 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2468 switch (arvif
->vdev_type
) {
2469 case WMI_VDEV_TYPE_AP
:
2471 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->qos
;
2473 if (sta
->wme
&& sta
->uapsd_queues
) {
2474 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->apsd
;
2475 arg
->peer_rate_caps
|= WMI_RC_UAPSD_FLAG
;
2478 case WMI_VDEV_TYPE_STA
:
2479 if (vif
->bss_conf
.qos
)
2480 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->qos
;
2482 case WMI_VDEV_TYPE_IBSS
:
2484 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->qos
;
2490 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac peer %pM qos %d\n",
2491 sta
->addr
, !!(arg
->peer_flags
&
2492 arvif
->ar
->wmi
.peer_flags
->qos
));
2495 static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta
*sta
)
2497 return sta
->supp_rates
[NL80211_BAND_2GHZ
] >>
2498 ATH10K_MAC_FIRST_OFDM_RATE_IDX
;
2501 static void ath10k_peer_assoc_h_phymode(struct ath10k
*ar
,
2502 struct ieee80211_vif
*vif
,
2503 struct ieee80211_sta
*sta
,
2504 struct wmi_peer_assoc_complete_arg
*arg
)
2506 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2507 struct cfg80211_chan_def def
;
2508 enum nl80211_band band
;
2509 const u8
*ht_mcs_mask
;
2510 const u16
*vht_mcs_mask
;
2511 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
2513 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2516 band
= def
.chan
->band
;
2517 ht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].ht_mcs
;
2518 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
2521 case NL80211_BAND_2GHZ
:
2522 if (sta
->vht_cap
.vht_supported
&&
2523 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
)) {
2524 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
2525 phymode
= MODE_11AC_VHT40
;
2527 phymode
= MODE_11AC_VHT20
;
2528 } else if (sta
->ht_cap
.ht_supported
&&
2529 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask
)) {
2530 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
2531 phymode
= MODE_11NG_HT40
;
2533 phymode
= MODE_11NG_HT20
;
2534 } else if (ath10k_mac_sta_has_ofdm_only(sta
)) {
2541 case NL80211_BAND_5GHZ
:
2545 if (sta
->vht_cap
.vht_supported
&&
2546 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
)) {
2547 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
2548 phymode
= MODE_11AC_VHT80
;
2549 else if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
2550 phymode
= MODE_11AC_VHT40
;
2551 else if (sta
->bandwidth
== IEEE80211_STA_RX_BW_20
)
2552 phymode
= MODE_11AC_VHT20
;
2553 } else if (sta
->ht_cap
.ht_supported
&&
2554 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask
)) {
2555 if (sta
->bandwidth
>= IEEE80211_STA_RX_BW_40
)
2556 phymode
= MODE_11NA_HT40
;
2558 phymode
= MODE_11NA_HT20
;
2568 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac peer %pM phymode %s\n",
2569 sta
->addr
, ath10k_wmi_phymode_str(phymode
));
2571 arg
->peer_phymode
= phymode
;
2572 WARN_ON(phymode
== MODE_UNKNOWN
);
2575 static int ath10k_peer_assoc_prepare(struct ath10k
*ar
,
2576 struct ieee80211_vif
*vif
,
2577 struct ieee80211_sta
*sta
,
2578 struct wmi_peer_assoc_complete_arg
*arg
)
2580 lockdep_assert_held(&ar
->conf_mutex
);
2582 memset(arg
, 0, sizeof(*arg
));
2584 ath10k_peer_assoc_h_basic(ar
, vif
, sta
, arg
);
2585 ath10k_peer_assoc_h_crypto(ar
, vif
, sta
, arg
);
2586 ath10k_peer_assoc_h_rates(ar
, vif
, sta
, arg
);
2587 ath10k_peer_assoc_h_ht(ar
, vif
, sta
, arg
);
2588 ath10k_peer_assoc_h_vht(ar
, vif
, sta
, arg
);
2589 ath10k_peer_assoc_h_qos(ar
, vif
, sta
, arg
);
2590 ath10k_peer_assoc_h_phymode(ar
, vif
, sta
, arg
);
2595 static const u32 ath10k_smps_map
[] = {
2596 [WLAN_HT_CAP_SM_PS_STATIC
] = WMI_PEER_SMPS_STATIC
,
2597 [WLAN_HT_CAP_SM_PS_DYNAMIC
] = WMI_PEER_SMPS_DYNAMIC
,
2598 [WLAN_HT_CAP_SM_PS_INVALID
] = WMI_PEER_SMPS_PS_NONE
,
2599 [WLAN_HT_CAP_SM_PS_DISABLED
] = WMI_PEER_SMPS_PS_NONE
,
2602 static int ath10k_setup_peer_smps(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
2604 const struct ieee80211_sta_ht_cap
*ht_cap
)
2608 if (!ht_cap
->ht_supported
)
2611 smps
= ht_cap
->cap
& IEEE80211_HT_CAP_SM_PS
;
2612 smps
>>= IEEE80211_HT_CAP_SM_PS_SHIFT
;
2614 if (smps
>= ARRAY_SIZE(ath10k_smps_map
))
2617 return ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, addr
,
2618 WMI_PEER_SMPS_STATE
,
2619 ath10k_smps_map
[smps
]);
2622 static int ath10k_mac_vif_recalc_txbf(struct ath10k
*ar
,
2623 struct ieee80211_vif
*vif
,
2624 struct ieee80211_sta_vht_cap vht_cap
)
2626 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2631 if (ath10k_wmi_get_txbf_conf_scheme(ar
) != WMI_TXBF_CONF_AFTER_ASSOC
)
2634 if (!(ar
->vht_cap_info
&
2635 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
2636 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
|
2637 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
2638 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)))
2641 param
= ar
->wmi
.vdev_param
->txbf
;
2644 if (WARN_ON(param
== WMI_VDEV_PARAM_UNSUPPORTED
))
2647 /* The following logic is correct. If a remote STA advertises support
2648 * for being a beamformer then we should enable us being a beamformee.
2651 if (ar
->vht_cap_info
&
2652 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
2653 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)) {
2654 if (vht_cap
.cap
& IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
)
2655 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
2657 if (vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)
2658 value
|= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
;
2661 if (ar
->vht_cap_info
&
2662 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
2663 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)) {
2664 if (vht_cap
.cap
& IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
)
2665 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
2667 if (vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)
2668 value
|= WMI_VDEV_PARAM_TXBF_MU_TX_BFER
;
2671 if (value
& WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
)
2672 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
2674 if (value
& WMI_VDEV_PARAM_TXBF_MU_TX_BFER
)
2675 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
2677 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
, value
);
2679 ath10k_warn(ar
, "failed to submit vdev param txbf 0x%x: %d\n",
2687 /* can be called only in mac80211 callbacks due to `key_count` usage */
2688 static void ath10k_bss_assoc(struct ieee80211_hw
*hw
,
2689 struct ieee80211_vif
*vif
,
2690 struct ieee80211_bss_conf
*bss_conf
)
2692 struct ath10k
*ar
= hw
->priv
;
2693 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2694 struct ieee80211_sta_ht_cap ht_cap
;
2695 struct ieee80211_sta_vht_cap vht_cap
;
2696 struct wmi_peer_assoc_complete_arg peer_arg
;
2697 struct ieee80211_sta
*ap_sta
;
2700 lockdep_assert_held(&ar
->conf_mutex
);
2702 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i assoc bssid %pM aid %d\n",
2703 arvif
->vdev_id
, arvif
->bssid
, arvif
->aid
);
2707 ap_sta
= ieee80211_find_sta(vif
, bss_conf
->bssid
);
2709 ath10k_warn(ar
, "failed to find station entry for bss %pM vdev %i\n",
2710 bss_conf
->bssid
, arvif
->vdev_id
);
2715 /* ap_sta must be accessed only within rcu section which must be left
2716 * before calling ath10k_setup_peer_smps() which might sleep. */
2717 ht_cap
= ap_sta
->ht_cap
;
2718 vht_cap
= ap_sta
->vht_cap
;
2720 ret
= ath10k_peer_assoc_prepare(ar
, vif
, ap_sta
, &peer_arg
);
2722 ath10k_warn(ar
, "failed to prepare peer assoc for %pM vdev %i: %d\n",
2723 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
2730 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
2732 ath10k_warn(ar
, "failed to run peer assoc for %pM vdev %i: %d\n",
2733 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
2737 ret
= ath10k_setup_peer_smps(ar
, arvif
, bss_conf
->bssid
, &ht_cap
);
2739 ath10k_warn(ar
, "failed to setup peer SMPS for vdev %i: %d\n",
2740 arvif
->vdev_id
, ret
);
2744 ret
= ath10k_mac_vif_recalc_txbf(ar
, vif
, vht_cap
);
2746 ath10k_warn(ar
, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2747 arvif
->vdev_id
, bss_conf
->bssid
, ret
);
2751 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
2752 "mac vdev %d up (associated) bssid %pM aid %d\n",
2753 arvif
->vdev_id
, bss_conf
->bssid
, bss_conf
->aid
);
2755 WARN_ON(arvif
->is_up
);
2757 arvif
->aid
= bss_conf
->aid
;
2758 ether_addr_copy(arvif
->bssid
, bss_conf
->bssid
);
2760 ret
= ath10k_wmi_vdev_up(ar
, arvif
->vdev_id
, arvif
->aid
, arvif
->bssid
);
2762 ath10k_warn(ar
, "failed to set vdev %d up: %d\n",
2763 arvif
->vdev_id
, ret
);
2767 arvif
->is_up
= true;
2769 /* Workaround: Some firmware revisions (tested with qca6174
2770 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2771 * poked with peer param command.
2773 ret
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, arvif
->bssid
,
2774 WMI_PEER_DUMMY_VAR
, 1);
2776 ath10k_warn(ar
, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2777 arvif
->bssid
, arvif
->vdev_id
, ret
);
2782 static void ath10k_bss_disassoc(struct ieee80211_hw
*hw
,
2783 struct ieee80211_vif
*vif
)
2785 struct ath10k
*ar
= hw
->priv
;
2786 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2787 struct ieee80211_sta_vht_cap vht_cap
= {};
2790 lockdep_assert_held(&ar
->conf_mutex
);
2792 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i disassoc bssid %pM\n",
2793 arvif
->vdev_id
, arvif
->bssid
);
2795 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
2797 ath10k_warn(ar
, "failed to down vdev %i: %d\n",
2798 arvif
->vdev_id
, ret
);
2800 arvif
->def_wep_key_idx
= -1;
2802 ret
= ath10k_mac_vif_recalc_txbf(ar
, vif
, vht_cap
);
2804 ath10k_warn(ar
, "failed to recalc txbf for vdev %i: %d\n",
2805 arvif
->vdev_id
, ret
);
2809 arvif
->is_up
= false;
2811 cancel_delayed_work_sync(&arvif
->connection_loss_work
);
2814 static int ath10k_station_assoc(struct ath10k
*ar
,
2815 struct ieee80211_vif
*vif
,
2816 struct ieee80211_sta
*sta
,
2819 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2820 struct wmi_peer_assoc_complete_arg peer_arg
;
2823 lockdep_assert_held(&ar
->conf_mutex
);
2825 ret
= ath10k_peer_assoc_prepare(ar
, vif
, sta
, &peer_arg
);
2827 ath10k_warn(ar
, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
2828 sta
->addr
, arvif
->vdev_id
, ret
);
2832 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
2834 ath10k_warn(ar
, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2835 sta
->addr
, arvif
->vdev_id
, ret
);
2839 /* Re-assoc is run only to update supported rates for given station. It
2840 * doesn't make much sense to reconfigure the peer completely.
2843 ret
= ath10k_setup_peer_smps(ar
, arvif
, sta
->addr
,
2846 ath10k_warn(ar
, "failed to setup peer SMPS for vdev %d: %d\n",
2847 arvif
->vdev_id
, ret
);
2851 ret
= ath10k_peer_assoc_qos_ap(ar
, arvif
, sta
);
2853 ath10k_warn(ar
, "failed to set qos params for STA %pM for vdev %i: %d\n",
2854 sta
->addr
, arvif
->vdev_id
, ret
);
2859 arvif
->num_legacy_stations
++;
2860 ret
= ath10k_recalc_rtscts_prot(arvif
);
2862 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2863 arvif
->vdev_id
, ret
);
2868 /* Plumb cached keys only for static WEP */
2869 if (arvif
->def_wep_key_idx
!= -1) {
2870 ret
= ath10k_install_peer_wep_keys(arvif
, sta
->addr
);
2872 ath10k_warn(ar
, "failed to install peer wep keys for vdev %i: %d\n",
2873 arvif
->vdev_id
, ret
);
2882 static int ath10k_station_disassoc(struct ath10k
*ar
,
2883 struct ieee80211_vif
*vif
,
2884 struct ieee80211_sta
*sta
)
2886 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
2889 lockdep_assert_held(&ar
->conf_mutex
);
2892 arvif
->num_legacy_stations
--;
2893 ret
= ath10k_recalc_rtscts_prot(arvif
);
2895 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2896 arvif
->vdev_id
, ret
);
2901 ret
= ath10k_clear_peer_keys(arvif
, sta
->addr
);
2903 ath10k_warn(ar
, "failed to clear all peer wep keys for vdev %i: %d\n",
2904 arvif
->vdev_id
, ret
);
2915 static int ath10k_update_channel_list(struct ath10k
*ar
)
2917 struct ieee80211_hw
*hw
= ar
->hw
;
2918 struct ieee80211_supported_band
**bands
;
2919 enum nl80211_band band
;
2920 struct ieee80211_channel
*channel
;
2921 struct wmi_scan_chan_list_arg arg
= {0};
2922 struct wmi_channel_arg
*ch
;
2928 lockdep_assert_held(&ar
->conf_mutex
);
2930 bands
= hw
->wiphy
->bands
;
2931 for (band
= 0; band
< NUM_NL80211_BANDS
; band
++) {
2935 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
2936 if (bands
[band
]->channels
[i
].flags
&
2937 IEEE80211_CHAN_DISABLED
)
2944 len
= sizeof(struct wmi_channel_arg
) * arg
.n_channels
;
2945 arg
.channels
= kzalloc(len
, GFP_KERNEL
);
2950 for (band
= 0; band
< NUM_NL80211_BANDS
; band
++) {
2954 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
2955 channel
= &bands
[band
]->channels
[i
];
2957 if (channel
->flags
& IEEE80211_CHAN_DISABLED
)
2960 ch
->allow_ht
= true;
2962 /* FIXME: when should we really allow VHT? */
2963 ch
->allow_vht
= true;
2966 !(channel
->flags
& IEEE80211_CHAN_NO_IR
);
2969 !(channel
->flags
& IEEE80211_CHAN_NO_HT40PLUS
);
2972 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
2974 passive
= channel
->flags
& IEEE80211_CHAN_NO_IR
;
2975 ch
->passive
= passive
;
2977 ch
->freq
= channel
->center_freq
;
2978 ch
->band_center_freq1
= channel
->center_freq
;
2980 ch
->max_power
= channel
->max_power
* 2;
2981 ch
->max_reg_power
= channel
->max_reg_power
* 2;
2982 ch
->max_antenna_gain
= channel
->max_antenna_gain
* 2;
2983 ch
->reg_class_id
= 0; /* FIXME */
2985 /* FIXME: why use only legacy modes, why not any
2986 * HT/VHT modes? Would that even make any
2988 if (channel
->band
== NL80211_BAND_2GHZ
)
2989 ch
->mode
= MODE_11G
;
2991 ch
->mode
= MODE_11A
;
2993 if (WARN_ON_ONCE(ch
->mode
== MODE_UNKNOWN
))
2996 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
2997 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
2998 ch
- arg
.channels
, arg
.n_channels
,
2999 ch
->freq
, ch
->max_power
, ch
->max_reg_power
,
3000 ch
->max_antenna_gain
, ch
->mode
);
3006 ret
= ath10k_wmi_scan_chan_list(ar
, &arg
);
3007 kfree(arg
.channels
);
3012 static enum wmi_dfs_region
3013 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region
)
3015 switch (dfs_region
) {
3016 case NL80211_DFS_UNSET
:
3017 return WMI_UNINIT_DFS_DOMAIN
;
3018 case NL80211_DFS_FCC
:
3019 return WMI_FCC_DFS_DOMAIN
;
3020 case NL80211_DFS_ETSI
:
3021 return WMI_ETSI_DFS_DOMAIN
;
3022 case NL80211_DFS_JP
:
3023 return WMI_MKK4_DFS_DOMAIN
;
3025 return WMI_UNINIT_DFS_DOMAIN
;
3028 static void ath10k_regd_update(struct ath10k
*ar
)
3030 struct reg_dmn_pair_mapping
*regpair
;
3032 enum wmi_dfs_region wmi_dfs_reg
;
3033 enum nl80211_dfs_regions nl_dfs_reg
;
3035 lockdep_assert_held(&ar
->conf_mutex
);
3037 ret
= ath10k_update_channel_list(ar
);
3039 ath10k_warn(ar
, "failed to update channel list: %d\n", ret
);
3041 regpair
= ar
->ath_common
.regulatory
.regpair
;
3043 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
3044 nl_dfs_reg
= ar
->dfs_detector
->region
;
3045 wmi_dfs_reg
= ath10k_mac_get_dfs_region(nl_dfs_reg
);
3047 wmi_dfs_reg
= WMI_UNINIT_DFS_DOMAIN
;
3050 /* Target allows setting up per-band regdomain but ath_common provides
3051 * a combined one only */
3052 ret
= ath10k_wmi_pdev_set_regdomain(ar
,
3053 regpair
->reg_domain
,
3054 regpair
->reg_domain
, /* 2ghz */
3055 regpair
->reg_domain
, /* 5ghz */
3056 regpair
->reg_2ghz_ctl
,
3057 regpair
->reg_5ghz_ctl
,
3060 ath10k_warn(ar
, "failed to set pdev regdomain: %d\n", ret
);
3063 static void ath10k_reg_notifier(struct wiphy
*wiphy
,
3064 struct regulatory_request
*request
)
3066 struct ieee80211_hw
*hw
= wiphy_to_ieee80211_hw(wiphy
);
3067 struct ath10k
*ar
= hw
->priv
;
3070 ath_reg_notifier_apply(wiphy
, request
, &ar
->ath_common
.regulatory
);
3072 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
3073 ath10k_dbg(ar
, ATH10K_DBG_REGULATORY
, "dfs region 0x%x\n",
3074 request
->dfs_region
);
3075 result
= ar
->dfs_detector
->set_dfs_domain(ar
->dfs_detector
,
3076 request
->dfs_region
);
3078 ath10k_warn(ar
, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3079 request
->dfs_region
);
3082 mutex_lock(&ar
->conf_mutex
);
3083 if (ar
->state
== ATH10K_STATE_ON
)
3084 ath10k_regd_update(ar
);
3085 mutex_unlock(&ar
->conf_mutex
);
3092 enum ath10k_mac_tx_path
{
3094 ATH10K_MAC_TX_HTT_MGMT
,
3095 ATH10K_MAC_TX_WMI_MGMT
,
3096 ATH10K_MAC_TX_UNKNOWN
,
3099 void ath10k_mac_tx_lock(struct ath10k
*ar
, int reason
)
3101 lockdep_assert_held(&ar
->htt
.tx_lock
);
3103 WARN_ON(reason
>= ATH10K_TX_PAUSE_MAX
);
3104 ar
->tx_paused
|= BIT(reason
);
3105 ieee80211_stop_queues(ar
->hw
);
3108 static void ath10k_mac_tx_unlock_iter(void *data
, u8
*mac
,
3109 struct ieee80211_vif
*vif
)
3111 struct ath10k
*ar
= data
;
3112 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3114 if (arvif
->tx_paused
)
3117 ieee80211_wake_queue(ar
->hw
, arvif
->vdev_id
);
3120 void ath10k_mac_tx_unlock(struct ath10k
*ar
, int reason
)
3122 lockdep_assert_held(&ar
->htt
.tx_lock
);
3124 WARN_ON(reason
>= ATH10K_TX_PAUSE_MAX
);
3125 ar
->tx_paused
&= ~BIT(reason
);
3130 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
3131 IEEE80211_IFACE_ITER_RESUME_ALL
,
3132 ath10k_mac_tx_unlock_iter
,
3135 ieee80211_wake_queue(ar
->hw
, ar
->hw
->offchannel_tx_hw_queue
);
3138 void ath10k_mac_vif_tx_lock(struct ath10k_vif
*arvif
, int reason
)
3140 struct ath10k
*ar
= arvif
->ar
;
3142 lockdep_assert_held(&ar
->htt
.tx_lock
);
3144 WARN_ON(reason
>= BITS_PER_LONG
);
3145 arvif
->tx_paused
|= BIT(reason
);
3146 ieee80211_stop_queue(ar
->hw
, arvif
->vdev_id
);
3149 void ath10k_mac_vif_tx_unlock(struct ath10k_vif
*arvif
, int reason
)
3151 struct ath10k
*ar
= arvif
->ar
;
3153 lockdep_assert_held(&ar
->htt
.tx_lock
);
3155 WARN_ON(reason
>= BITS_PER_LONG
);
3156 arvif
->tx_paused
&= ~BIT(reason
);
3161 if (arvif
->tx_paused
)
3164 ieee80211_wake_queue(ar
->hw
, arvif
->vdev_id
);
3167 static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif
*arvif
,
3168 enum wmi_tlv_tx_pause_id pause_id
,
3169 enum wmi_tlv_tx_pause_action action
)
3171 struct ath10k
*ar
= arvif
->ar
;
3173 lockdep_assert_held(&ar
->htt
.tx_lock
);
3176 case WMI_TLV_TX_PAUSE_ACTION_STOP
:
3177 ath10k_mac_vif_tx_lock(arvif
, pause_id
);
3179 case WMI_TLV_TX_PAUSE_ACTION_WAKE
:
3180 ath10k_mac_vif_tx_unlock(arvif
, pause_id
);
3183 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
3184 "received unknown tx pause action %d on vdev %i, ignoring\n",
3185 action
, arvif
->vdev_id
);
3190 struct ath10k_mac_tx_pause
{
3192 enum wmi_tlv_tx_pause_id pause_id
;
3193 enum wmi_tlv_tx_pause_action action
;
3196 static void ath10k_mac_handle_tx_pause_iter(void *data
, u8
*mac
,
3197 struct ieee80211_vif
*vif
)
3199 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3200 struct ath10k_mac_tx_pause
*arg
= data
;
3202 if (arvif
->vdev_id
!= arg
->vdev_id
)
3205 ath10k_mac_vif_handle_tx_pause(arvif
, arg
->pause_id
, arg
->action
);
3208 void ath10k_mac_handle_tx_pause_vdev(struct ath10k
*ar
, u32 vdev_id
,
3209 enum wmi_tlv_tx_pause_id pause_id
,
3210 enum wmi_tlv_tx_pause_action action
)
3212 struct ath10k_mac_tx_pause arg
= {
3214 .pause_id
= pause_id
,
3218 spin_lock_bh(&ar
->htt
.tx_lock
);
3219 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
3220 IEEE80211_IFACE_ITER_RESUME_ALL
,
3221 ath10k_mac_handle_tx_pause_iter
,
3223 spin_unlock_bh(&ar
->htt
.tx_lock
);
3226 static enum ath10k_hw_txrx_mode
3227 ath10k_mac_tx_h_get_txmode(struct ath10k
*ar
,
3228 struct ieee80211_vif
*vif
,
3229 struct ieee80211_sta
*sta
,
3230 struct sk_buff
*skb
)
3232 const struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3233 __le16 fc
= hdr
->frame_control
;
3235 if (!vif
|| vif
->type
== NL80211_IFTYPE_MONITOR
)
3236 return ATH10K_HW_TXRX_RAW
;
3238 if (ieee80211_is_mgmt(fc
))
3239 return ATH10K_HW_TXRX_MGMT
;
3243 * NullFunc frames are mostly used to ping if a client or AP are still
3244 * reachable and responsive. This implies tx status reports must be
3245 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3246 * come to a conclusion that the other end disappeared and tear down
3247 * BSS connection or it can never disconnect from BSS/client (which is
3250 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3251 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3252 * which seems to deliver correct tx reports for NullFunc frames. The
3253 * downside of using it is it ignores client powersave state so it can
3254 * end up disconnecting sleeping clients in AP mode. It should fix STA
3255 * mode though because AP don't sleep.
3257 if (ar
->htt
.target_version_major
< 3 &&
3258 (ieee80211_is_nullfunc(fc
) || ieee80211_is_qos_nullfunc(fc
)) &&
3259 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
3260 ar
->running_fw
->fw_file
.fw_features
))
3261 return ATH10K_HW_TXRX_MGMT
;
3265 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3266 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3267 * to work with Ethernet txmode so use it.
3269 * FIXME: Check if raw mode works with TDLS.
3271 if (ieee80211_is_data_present(fc
) && sta
&& sta
->tdls
)
3272 return ATH10K_HW_TXRX_ETHERNET
;
3274 if (test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
3275 return ATH10K_HW_TXRX_RAW
;
3277 return ATH10K_HW_TXRX_NATIVE_WIFI
;
3280 static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif
*vif
,
3281 struct sk_buff
*skb
)
3283 const struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
3284 const struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3285 const u32 mask
= IEEE80211_TX_INTFL_DONT_ENCRYPT
|
3286 IEEE80211_TX_CTL_INJECTED
;
3288 if (!ieee80211_has_protected(hdr
->frame_control
))
3291 if ((info
->flags
& mask
) == mask
)
3295 return !ath10k_vif_to_arvif(vif
)->nohwcrypt
;
3300 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3301 * Control in the header.
3303 static void ath10k_tx_h_nwifi(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
3305 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3306 struct ath10k_skb_cb
*cb
= ATH10K_SKB_CB(skb
);
3309 if (!ieee80211_is_data_qos(hdr
->frame_control
))
3312 qos_ctl
= ieee80211_get_qos_ctl(hdr
);
3313 memmove(skb
->data
+ IEEE80211_QOS_CTL_LEN
,
3314 skb
->data
, (void *)qos_ctl
- (void *)skb
->data
);
3315 skb_pull(skb
, IEEE80211_QOS_CTL_LEN
);
3317 /* Some firmware revisions don't handle sending QoS NullFunc well.
3318 * These frames are mainly used for CQM purposes so it doesn't really
3319 * matter whether QoS NullFunc or NullFunc are sent.
3321 hdr
= (void *)skb
->data
;
3322 if (ieee80211_is_qos_nullfunc(hdr
->frame_control
))
3323 cb
->flags
&= ~ATH10K_SKB_F_QOS
;
3325 hdr
->frame_control
&= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA
);
3328 static void ath10k_tx_h_8023(struct sk_buff
*skb
)
3330 struct ieee80211_hdr
*hdr
;
3331 struct rfc1042_hdr
*rfc1042
;
3338 hdr
= (void *)skb
->data
;
3339 hdrlen
= ieee80211_hdrlen(hdr
->frame_control
);
3340 rfc1042
= (void *)skb
->data
+ hdrlen
;
3342 ether_addr_copy(da
, ieee80211_get_DA(hdr
));
3343 ether_addr_copy(sa
, ieee80211_get_SA(hdr
));
3344 type
= rfc1042
->snap_type
;
3346 skb_pull(skb
, hdrlen
+ sizeof(*rfc1042
));
3347 skb_push(skb
, sizeof(*eth
));
3349 eth
= (void *)skb
->data
;
3350 ether_addr_copy(eth
->h_dest
, da
);
3351 ether_addr_copy(eth
->h_source
, sa
);
3352 eth
->h_proto
= type
;
3355 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k
*ar
,
3356 struct ieee80211_vif
*vif
,
3357 struct sk_buff
*skb
)
3359 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
3360 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
3362 /* This is case only for P2P_GO */
3363 if (vif
->type
!= NL80211_IFTYPE_AP
|| !vif
->p2p
)
3366 if (unlikely(ieee80211_is_probe_resp(hdr
->frame_control
))) {
3367 spin_lock_bh(&ar
->data_lock
);
3368 if (arvif
->u
.ap
.noa_data
)
3369 if (!pskb_expand_head(skb
, 0, arvif
->u
.ap
.noa_len
,
3371 memcpy(skb_put(skb
, arvif
->u
.ap
.noa_len
),
3372 arvif
->u
.ap
.noa_data
,
3373 arvif
->u
.ap
.noa_len
);
3374 spin_unlock_bh(&ar
->data_lock
);
3378 static void ath10k_mac_tx_h_fill_cb(struct ath10k
*ar
,
3379 struct ieee80211_vif
*vif
,
3380 struct ieee80211_txq
*txq
,
3381 struct sk_buff
*skb
)
3383 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3384 struct ath10k_skb_cb
*cb
= ATH10K_SKB_CB(skb
);
3387 if (!ath10k_tx_h_use_hwcrypto(vif
, skb
))
3388 cb
->flags
|= ATH10K_SKB_F_NO_HWCRYPT
;
3390 if (ieee80211_is_mgmt(hdr
->frame_control
))
3391 cb
->flags
|= ATH10K_SKB_F_MGMT
;
3393 if (ieee80211_is_data_qos(hdr
->frame_control
))
3394 cb
->flags
|= ATH10K_SKB_F_QOS
;
3400 bool ath10k_mac_tx_frm_has_freq(struct ath10k
*ar
)
3402 /* FIXME: Not really sure since when the behaviour changed. At some
3403 * point new firmware stopped requiring creation of peer entries for
3404 * offchannel tx (and actually creating them causes issues with wmi-htc
3405 * tx credit replenishment and reliability). Assuming it's at least 3.4
3406 * because that's when the `freq` was introduced to TX_FRM HTT command.
3408 return (ar
->htt
.target_version_major
>= 3 &&
3409 ar
->htt
.target_version_minor
>= 4 &&
3410 ar
->running_fw
->fw_file
.htt_op_version
== ATH10K_FW_HTT_OP_VERSION_TLV
);
3413 static int ath10k_mac_tx_wmi_mgmt(struct ath10k
*ar
, struct sk_buff
*skb
)
3415 struct sk_buff_head
*q
= &ar
->wmi_mgmt_tx_queue
;
3418 spin_lock_bh(&ar
->data_lock
);
3420 if (skb_queue_len(q
) == ATH10K_MAX_NUM_MGMT_PENDING
) {
3421 ath10k_warn(ar
, "wmi mgmt tx queue is full\n");
3426 __skb_queue_tail(q
, skb
);
3427 ieee80211_queue_work(ar
->hw
, &ar
->wmi_mgmt_tx_work
);
3430 spin_unlock_bh(&ar
->data_lock
);
3435 static enum ath10k_mac_tx_path
3436 ath10k_mac_tx_h_get_txpath(struct ath10k
*ar
,
3437 struct sk_buff
*skb
,
3438 enum ath10k_hw_txrx_mode txmode
)
3441 case ATH10K_HW_TXRX_RAW
:
3442 case ATH10K_HW_TXRX_NATIVE_WIFI
:
3443 case ATH10K_HW_TXRX_ETHERNET
:
3444 return ATH10K_MAC_TX_HTT
;
3445 case ATH10K_HW_TXRX_MGMT
:
3446 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
3447 ar
->running_fw
->fw_file
.fw_features
))
3448 return ATH10K_MAC_TX_WMI_MGMT
;
3449 else if (ar
->htt
.target_version_major
>= 3)
3450 return ATH10K_MAC_TX_HTT
;
3452 return ATH10K_MAC_TX_HTT_MGMT
;
3455 return ATH10K_MAC_TX_UNKNOWN
;
3458 static int ath10k_mac_tx_submit(struct ath10k
*ar
,
3459 enum ath10k_hw_txrx_mode txmode
,
3460 enum ath10k_mac_tx_path txpath
,
3461 struct sk_buff
*skb
)
3463 struct ath10k_htt
*htt
= &ar
->htt
;
3467 case ATH10K_MAC_TX_HTT
:
3468 ret
= ath10k_htt_tx(htt
, txmode
, skb
);
3470 case ATH10K_MAC_TX_HTT_MGMT
:
3471 ret
= ath10k_htt_mgmt_tx(htt
, skb
);
3473 case ATH10K_MAC_TX_WMI_MGMT
:
3474 ret
= ath10k_mac_tx_wmi_mgmt(ar
, skb
);
3476 case ATH10K_MAC_TX_UNKNOWN
:
3483 ath10k_warn(ar
, "failed to transmit packet, dropping: %d\n",
3485 ieee80211_free_txskb(ar
->hw
, skb
);
3491 /* This function consumes the sk_buff regardless of return value as far as
3492 * caller is concerned so no freeing is necessary afterwards.
3494 static int ath10k_mac_tx(struct ath10k
*ar
,
3495 struct ieee80211_vif
*vif
,
3496 struct ieee80211_sta
*sta
,
3497 enum ath10k_hw_txrx_mode txmode
,
3498 enum ath10k_mac_tx_path txpath
,
3499 struct sk_buff
*skb
)
3501 struct ieee80211_hw
*hw
= ar
->hw
;
3502 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
3505 /* We should disable CCK RATE due to P2P */
3506 if (info
->flags
& IEEE80211_TX_CTL_NO_CCK_RATE
)
3507 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
3510 case ATH10K_HW_TXRX_MGMT
:
3511 case ATH10K_HW_TXRX_NATIVE_WIFI
:
3512 ath10k_tx_h_nwifi(hw
, skb
);
3513 ath10k_tx_h_add_p2p_noa_ie(ar
, vif
, skb
);
3514 ath10k_tx_h_seq_no(vif
, skb
);
3516 case ATH10K_HW_TXRX_ETHERNET
:
3517 ath10k_tx_h_8023(skb
);
3519 case ATH10K_HW_TXRX_RAW
:
3520 if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
)) {
3522 ieee80211_free_txskb(hw
, skb
);
3527 if (info
->flags
& IEEE80211_TX_CTL_TX_OFFCHAN
) {
3528 if (!ath10k_mac_tx_frm_has_freq(ar
)) {
3529 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "queued offchannel skb %pK\n",
3532 skb_queue_tail(&ar
->offchan_tx_queue
, skb
);
3533 ieee80211_queue_work(hw
, &ar
->offchan_tx_work
);
3538 ret
= ath10k_mac_tx_submit(ar
, txmode
, txpath
, skb
);
3540 ath10k_warn(ar
, "failed to submit frame: %d\n", ret
);
3547 void ath10k_offchan_tx_purge(struct ath10k
*ar
)
3549 struct sk_buff
*skb
;
3552 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
3556 ieee80211_free_txskb(ar
->hw
, skb
);
3560 void ath10k_offchan_tx_work(struct work_struct
*work
)
3562 struct ath10k
*ar
= container_of(work
, struct ath10k
, offchan_tx_work
);
3563 struct ath10k_peer
*peer
;
3564 struct ath10k_vif
*arvif
;
3565 enum ath10k_hw_txrx_mode txmode
;
3566 enum ath10k_mac_tx_path txpath
;
3567 struct ieee80211_hdr
*hdr
;
3568 struct ieee80211_vif
*vif
;
3569 struct ieee80211_sta
*sta
;
3570 struct sk_buff
*skb
;
3571 const u8
*peer_addr
;
3574 unsigned long time_left
;
3575 bool tmp_peer_created
= false;
3577 /* FW requirement: We must create a peer before FW will send out
3578 * an offchannel frame. Otherwise the frame will be stuck and
3579 * never transmitted. We delete the peer upon tx completion.
3580 * It is unlikely that a peer for offchannel tx will already be
3581 * present. However it may be in some rare cases so account for that.
3582 * Otherwise we might remove a legitimate peer and break stuff. */
3585 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
3589 mutex_lock(&ar
->conf_mutex
);
3591 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac offchannel skb %pK\n",
3594 hdr
= (struct ieee80211_hdr
*)skb
->data
;
3595 peer_addr
= ieee80211_get_DA(hdr
);
3597 spin_lock_bh(&ar
->data_lock
);
3598 vdev_id
= ar
->scan
.vdev_id
;
3599 peer
= ath10k_peer_find(ar
, vdev_id
, peer_addr
);
3600 spin_unlock_bh(&ar
->data_lock
);
3603 /* FIXME: should this use ath10k_warn()? */
3604 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "peer %pM on vdev %d already present\n",
3605 peer_addr
, vdev_id
);
3608 ret
= ath10k_peer_create(ar
, NULL
, NULL
, vdev_id
,
3610 WMI_PEER_TYPE_DEFAULT
);
3612 ath10k_warn(ar
, "failed to create peer %pM on vdev %d: %d\n",
3613 peer_addr
, vdev_id
, ret
);
3614 tmp_peer_created
= (ret
== 0);
3617 spin_lock_bh(&ar
->data_lock
);
3618 reinit_completion(&ar
->offchan_tx_completed
);
3619 ar
->offchan_tx_skb
= skb
;
3620 spin_unlock_bh(&ar
->data_lock
);
3622 /* It's safe to access vif and sta - conf_mutex guarantees that
3623 * sta_state() and remove_interface() are locked exclusively
3624 * out wrt to this offchannel worker.
3626 arvif
= ath10k_get_arvif(ar
, vdev_id
);
3629 sta
= ieee80211_find_sta(vif
, peer_addr
);
3635 txmode
= ath10k_mac_tx_h_get_txmode(ar
, vif
, sta
, skb
);
3636 txpath
= ath10k_mac_tx_h_get_txpath(ar
, skb
, txmode
);
3638 ret
= ath10k_mac_tx(ar
, vif
, sta
, txmode
, txpath
, skb
);
3640 ath10k_warn(ar
, "failed to transmit offchannel frame: %d\n",
3646 wait_for_completion_timeout(&ar
->offchan_tx_completed
, 3 * HZ
);
3648 ath10k_warn(ar
, "timed out waiting for offchannel skb %pK\n",
3651 if (!peer
&& tmp_peer_created
) {
3652 ret
= ath10k_peer_delete(ar
, vdev_id
, peer_addr
);
3654 ath10k_warn(ar
, "failed to delete peer %pM on vdev %d: %d\n",
3655 peer_addr
, vdev_id
, ret
);
3658 mutex_unlock(&ar
->conf_mutex
);
3662 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k
*ar
)
3664 struct sk_buff
*skb
;
3667 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
3671 ieee80211_free_txskb(ar
->hw
, skb
);
3675 void ath10k_mgmt_over_wmi_tx_work(struct work_struct
*work
)
3677 struct ath10k
*ar
= container_of(work
, struct ath10k
, wmi_mgmt_tx_work
);
3678 struct sk_buff
*skb
;
3682 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
3686 ret
= ath10k_wmi_mgmt_tx(ar
, skb
);
3688 ath10k_warn(ar
, "failed to transmit management frame via WMI: %d\n",
3690 ieee80211_free_txskb(ar
->hw
, skb
);
3695 static void ath10k_mac_txq_init(struct ieee80211_txq
*txq
)
3697 struct ath10k_txq
*artxq
;
3702 artxq
= (void *)txq
->drv_priv
;
3703 INIT_LIST_HEAD(&artxq
->list
);
3706 static void ath10k_mac_txq_unref(struct ath10k
*ar
, struct ieee80211_txq
*txq
)
3708 struct ath10k_txq
*artxq
;
3709 struct ath10k_skb_cb
*cb
;
3710 struct sk_buff
*msdu
;
3716 artxq
= (void *)txq
->drv_priv
;
3717 spin_lock_bh(&ar
->txqs_lock
);
3718 if (!list_empty(&artxq
->list
))
3719 list_del_init(&artxq
->list
);
3720 spin_unlock_bh(&ar
->txqs_lock
);
3722 spin_lock_bh(&ar
->htt
.tx_lock
);
3723 idr_for_each_entry(&ar
->htt
.pending_tx
, msdu
, msdu_id
) {
3724 cb
= ATH10K_SKB_CB(msdu
);
3728 spin_unlock_bh(&ar
->htt
.tx_lock
);
3731 struct ieee80211_txq
*ath10k_mac_txq_lookup(struct ath10k
*ar
,
3735 struct ath10k_peer
*peer
;
3737 lockdep_assert_held(&ar
->data_lock
);
3739 peer
= ar
->peer_map
[peer_id
];
3744 return peer
->sta
->txq
[tid
];
3746 return peer
->vif
->txq
;
3751 static bool ath10k_mac_tx_can_push(struct ieee80211_hw
*hw
,
3752 struct ieee80211_txq
*txq
)
3754 struct ath10k
*ar
= hw
->priv
;
3755 struct ath10k_txq
*artxq
= (void *)txq
->drv_priv
;
3757 /* No need to get locks */
3759 if (ar
->htt
.tx_q_state
.mode
== HTT_TX_MODE_SWITCH_PUSH
)
3762 if (ar
->htt
.num_pending_tx
< ar
->htt
.tx_q_state
.num_push_allowed
)
3765 if (artxq
->num_fw_queued
< artxq
->num_push_allowed
)
3771 int ath10k_mac_tx_push_txq(struct ieee80211_hw
*hw
,
3772 struct ieee80211_txq
*txq
)
3774 struct ath10k
*ar
= hw
->priv
;
3775 struct ath10k_htt
*htt
= &ar
->htt
;
3776 struct ath10k_txq
*artxq
= (void *)txq
->drv_priv
;
3777 struct ieee80211_vif
*vif
= txq
->vif
;
3778 struct ieee80211_sta
*sta
= txq
->sta
;
3779 enum ath10k_hw_txrx_mode txmode
;
3780 enum ath10k_mac_tx_path txpath
;
3781 struct sk_buff
*skb
;
3782 struct ieee80211_hdr
*hdr
;
3784 bool is_mgmt
, is_presp
;
3787 spin_lock_bh(&ar
->htt
.tx_lock
);
3788 ret
= ath10k_htt_tx_inc_pending(htt
);
3789 spin_unlock_bh(&ar
->htt
.tx_lock
);
3794 skb
= ieee80211_tx_dequeue(hw
, txq
);
3796 spin_lock_bh(&ar
->htt
.tx_lock
);
3797 ath10k_htt_tx_dec_pending(htt
);
3798 spin_unlock_bh(&ar
->htt
.tx_lock
);
3803 ath10k_mac_tx_h_fill_cb(ar
, vif
, txq
, skb
);
3806 txmode
= ath10k_mac_tx_h_get_txmode(ar
, vif
, sta
, skb
);
3807 txpath
= ath10k_mac_tx_h_get_txpath(ar
, skb
, txmode
);
3808 is_mgmt
= (txpath
== ATH10K_MAC_TX_HTT_MGMT
);
3811 hdr
= (struct ieee80211_hdr
*)skb
->data
;
3812 is_presp
= ieee80211_is_probe_resp(hdr
->frame_control
);
3814 spin_lock_bh(&ar
->htt
.tx_lock
);
3815 ret
= ath10k_htt_tx_mgmt_inc_pending(htt
, is_mgmt
, is_presp
);
3818 ath10k_htt_tx_dec_pending(htt
);
3819 spin_unlock_bh(&ar
->htt
.tx_lock
);
3822 spin_unlock_bh(&ar
->htt
.tx_lock
);
3825 ret
= ath10k_mac_tx(ar
, vif
, sta
, txmode
, txpath
, skb
);
3826 if (unlikely(ret
)) {
3827 ath10k_warn(ar
, "failed to push frame: %d\n", ret
);
3829 spin_lock_bh(&ar
->htt
.tx_lock
);
3830 ath10k_htt_tx_dec_pending(htt
);
3832 ath10k_htt_tx_mgmt_dec_pending(htt
);
3833 spin_unlock_bh(&ar
->htt
.tx_lock
);
3838 spin_lock_bh(&ar
->htt
.tx_lock
);
3839 artxq
->num_fw_queued
++;
3840 spin_unlock_bh(&ar
->htt
.tx_lock
);
3845 void ath10k_mac_tx_push_pending(struct ath10k
*ar
)
3847 struct ieee80211_hw
*hw
= ar
->hw
;
3848 struct ieee80211_txq
*txq
;
3849 struct ath10k_txq
*artxq
;
3850 struct ath10k_txq
*last
;
3854 if (ar
->htt
.num_pending_tx
>= (ar
->htt
.max_num_pending_tx
/ 2))
3857 spin_lock_bh(&ar
->txqs_lock
);
3860 last
= list_last_entry(&ar
->txqs
, struct ath10k_txq
, list
);
3861 while (!list_empty(&ar
->txqs
)) {
3862 artxq
= list_first_entry(&ar
->txqs
, struct ath10k_txq
, list
);
3863 txq
= container_of((void *)artxq
, struct ieee80211_txq
,
3866 /* Prevent aggressive sta/tid taking over tx queue */
3869 while (ath10k_mac_tx_can_push(hw
, txq
) && max
--) {
3870 ret
= ath10k_mac_tx_push_txq(hw
, txq
);
3875 list_del_init(&artxq
->list
);
3877 list_add_tail(&artxq
->list
, &ar
->txqs
);
3879 ath10k_htt_tx_txq_update(hw
, txq
);
3881 if (artxq
== last
|| (ret
< 0 && ret
!= -ENOENT
))
3886 spin_unlock_bh(&ar
->txqs_lock
);
3893 void __ath10k_scan_finish(struct ath10k
*ar
)
3895 lockdep_assert_held(&ar
->data_lock
);
3897 switch (ar
->scan
.state
) {
3898 case ATH10K_SCAN_IDLE
:
3900 case ATH10K_SCAN_RUNNING
:
3901 case ATH10K_SCAN_ABORTING
:
3902 if (!ar
->scan
.is_roc
) {
3903 struct cfg80211_scan_info info
= {
3904 .aborted
= (ar
->scan
.state
==
3905 ATH10K_SCAN_ABORTING
),
3908 ieee80211_scan_completed(ar
->hw
, &info
);
3909 } else if (ar
->scan
.roc_notify
) {
3910 ieee80211_remain_on_channel_expired(ar
->hw
);
3913 case ATH10K_SCAN_STARTING
:
3914 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
3915 ar
->scan_channel
= NULL
;
3916 ar
->scan
.roc_freq
= 0;
3917 ath10k_offchan_tx_purge(ar
);
3918 cancel_delayed_work(&ar
->scan
.timeout
);
3919 complete(&ar
->scan
.completed
);
3924 void ath10k_scan_finish(struct ath10k
*ar
)
3926 spin_lock_bh(&ar
->data_lock
);
3927 __ath10k_scan_finish(ar
);
3928 spin_unlock_bh(&ar
->data_lock
);
3931 static int ath10k_scan_stop(struct ath10k
*ar
)
3933 struct wmi_stop_scan_arg arg
= {
3934 .req_id
= 1, /* FIXME */
3935 .req_type
= WMI_SCAN_STOP_ONE
,
3936 .u
.scan_id
= ATH10K_SCAN_ID
,
3940 lockdep_assert_held(&ar
->conf_mutex
);
3942 ret
= ath10k_wmi_stop_scan(ar
, &arg
);
3944 ath10k_warn(ar
, "failed to stop wmi scan: %d\n", ret
);
3948 ret
= wait_for_completion_timeout(&ar
->scan
.completed
, 3 * HZ
);
3950 ath10k_warn(ar
, "failed to receive scan abortion completion: timed out\n");
3952 } else if (ret
> 0) {
3957 /* Scan state should be updated upon scan completion but in case
3958 * firmware fails to deliver the event (for whatever reason) it is
3959 * desired to clean up scan state anyway. Firmware may have just
3960 * dropped the scan completion event delivery due to transport pipe
3961 * being overflown with data and/or it can recover on its own before
3962 * next scan request is submitted.
3964 spin_lock_bh(&ar
->data_lock
);
3965 if (ar
->scan
.state
!= ATH10K_SCAN_IDLE
)
3966 __ath10k_scan_finish(ar
);
3967 spin_unlock_bh(&ar
->data_lock
);
3972 static void ath10k_scan_abort(struct ath10k
*ar
)
3976 lockdep_assert_held(&ar
->conf_mutex
);
3978 spin_lock_bh(&ar
->data_lock
);
3980 switch (ar
->scan
.state
) {
3981 case ATH10K_SCAN_IDLE
:
3982 /* This can happen if timeout worker kicked in and called
3983 * abortion while scan completion was being processed.
3986 case ATH10K_SCAN_STARTING
:
3987 case ATH10K_SCAN_ABORTING
:
3988 ath10k_warn(ar
, "refusing scan abortion due to invalid scan state: %s (%d)\n",
3989 ath10k_scan_state_str(ar
->scan
.state
),
3992 case ATH10K_SCAN_RUNNING
:
3993 ar
->scan
.state
= ATH10K_SCAN_ABORTING
;
3994 spin_unlock_bh(&ar
->data_lock
);
3996 ret
= ath10k_scan_stop(ar
);
3998 ath10k_warn(ar
, "failed to abort scan: %d\n", ret
);
4000 spin_lock_bh(&ar
->data_lock
);
4004 spin_unlock_bh(&ar
->data_lock
);
4007 void ath10k_scan_timeout_work(struct work_struct
*work
)
4009 struct ath10k
*ar
= container_of(work
, struct ath10k
,
4012 mutex_lock(&ar
->conf_mutex
);
4013 ath10k_scan_abort(ar
);
4014 mutex_unlock(&ar
->conf_mutex
);
4017 static int ath10k_start_scan(struct ath10k
*ar
,
4018 const struct wmi_start_scan_arg
*arg
)
4022 lockdep_assert_held(&ar
->conf_mutex
);
4024 ret
= ath10k_wmi_start_scan(ar
, arg
);
4028 ret
= wait_for_completion_timeout(&ar
->scan
.started
, 1 * HZ
);
4030 ret
= ath10k_scan_stop(ar
);
4032 ath10k_warn(ar
, "failed to stop scan: %d\n", ret
);
4037 /* If we failed to start the scan, return error code at
4038 * this point. This is probably due to some issue in the
4039 * firmware, but no need to wedge the driver due to that...
4041 spin_lock_bh(&ar
->data_lock
);
4042 if (ar
->scan
.state
== ATH10K_SCAN_IDLE
) {
4043 spin_unlock_bh(&ar
->data_lock
);
4046 spin_unlock_bh(&ar
->data_lock
);
4051 /**********************/
4052 /* mac80211 callbacks */
4053 /**********************/
4055 static void ath10k_mac_op_tx(struct ieee80211_hw
*hw
,
4056 struct ieee80211_tx_control
*control
,
4057 struct sk_buff
*skb
)
4059 struct ath10k
*ar
= hw
->priv
;
4060 struct ath10k_htt
*htt
= &ar
->htt
;
4061 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
4062 struct ieee80211_vif
*vif
= info
->control
.vif
;
4063 struct ieee80211_sta
*sta
= control
->sta
;
4064 struct ieee80211_txq
*txq
= NULL
;
4065 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
4066 enum ath10k_hw_txrx_mode txmode
;
4067 enum ath10k_mac_tx_path txpath
;
4073 ath10k_mac_tx_h_fill_cb(ar
, vif
, txq
, skb
);
4075 txmode
= ath10k_mac_tx_h_get_txmode(ar
, vif
, sta
, skb
);
4076 txpath
= ath10k_mac_tx_h_get_txpath(ar
, skb
, txmode
);
4077 is_htt
= (txpath
== ATH10K_MAC_TX_HTT
||
4078 txpath
== ATH10K_MAC_TX_HTT_MGMT
);
4079 is_mgmt
= (txpath
== ATH10K_MAC_TX_HTT_MGMT
);
4082 spin_lock_bh(&ar
->htt
.tx_lock
);
4083 is_presp
= ieee80211_is_probe_resp(hdr
->frame_control
);
4085 ret
= ath10k_htt_tx_inc_pending(htt
);
4087 ath10k_warn(ar
, "failed to increase tx pending count: %d, dropping\n",
4089 spin_unlock_bh(&ar
->htt
.tx_lock
);
4090 ieee80211_free_txskb(ar
->hw
, skb
);
4094 ret
= ath10k_htt_tx_mgmt_inc_pending(htt
, is_mgmt
, is_presp
);
4096 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "failed to increase tx mgmt pending count: %d, dropping\n",
4098 ath10k_htt_tx_dec_pending(htt
);
4099 spin_unlock_bh(&ar
->htt
.tx_lock
);
4100 ieee80211_free_txskb(ar
->hw
, skb
);
4103 spin_unlock_bh(&ar
->htt
.tx_lock
);
4106 ret
= ath10k_mac_tx(ar
, vif
, sta
, txmode
, txpath
, skb
);
4108 ath10k_warn(ar
, "failed to transmit frame: %d\n", ret
);
4110 spin_lock_bh(&ar
->htt
.tx_lock
);
4111 ath10k_htt_tx_dec_pending(htt
);
4113 ath10k_htt_tx_mgmt_dec_pending(htt
);
4114 spin_unlock_bh(&ar
->htt
.tx_lock
);
4120 static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw
*hw
,
4121 struct ieee80211_txq
*txq
)
4123 struct ath10k
*ar
= hw
->priv
;
4124 struct ath10k_txq
*artxq
= (void *)txq
->drv_priv
;
4125 struct ieee80211_txq
*f_txq
;
4126 struct ath10k_txq
*f_artxq
;
4130 spin_lock_bh(&ar
->txqs_lock
);
4131 if (list_empty(&artxq
->list
))
4132 list_add_tail(&artxq
->list
, &ar
->txqs
);
4134 f_artxq
= list_first_entry(&ar
->txqs
, struct ath10k_txq
, list
);
4135 f_txq
= container_of((void *)f_artxq
, struct ieee80211_txq
, drv_priv
);
4136 list_del_init(&f_artxq
->list
);
4138 while (ath10k_mac_tx_can_push(hw
, f_txq
) && max
--) {
4139 ret
= ath10k_mac_tx_push_txq(hw
, f_txq
);
4144 list_add_tail(&f_artxq
->list
, &ar
->txqs
);
4145 spin_unlock_bh(&ar
->txqs_lock
);
4147 ath10k_htt_tx_txq_update(hw
, f_txq
);
4148 ath10k_htt_tx_txq_update(hw
, txq
);
4151 /* Must not be called with conf_mutex held as workers can use that also. */
4152 void ath10k_drain_tx(struct ath10k
*ar
)
4154 /* make sure rcu-protected mac80211 tx path itself is drained */
4157 ath10k_offchan_tx_purge(ar
);
4158 ath10k_mgmt_over_wmi_tx_purge(ar
);
4160 cancel_work_sync(&ar
->offchan_tx_work
);
4161 cancel_work_sync(&ar
->wmi_mgmt_tx_work
);
4164 void ath10k_halt(struct ath10k
*ar
)
4166 struct ath10k_vif
*arvif
;
4168 lockdep_assert_held(&ar
->conf_mutex
);
4170 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
4171 ar
->filter_flags
= 0;
4172 ar
->monitor
= false;
4173 ar
->monitor_arvif
= NULL
;
4175 if (ar
->monitor_started
)
4176 ath10k_monitor_stop(ar
);
4178 ar
->monitor_started
= false;
4181 ath10k_scan_finish(ar
);
4182 ath10k_peer_cleanup_all(ar
);
4183 ath10k_core_stop(ar
);
4184 ath10k_hif_power_down(ar
);
4186 spin_lock_bh(&ar
->data_lock
);
4187 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
4188 ath10k_mac_vif_beacon_cleanup(arvif
);
4189 spin_unlock_bh(&ar
->data_lock
);
4192 static int ath10k_get_antenna(struct ieee80211_hw
*hw
, u32
*tx_ant
, u32
*rx_ant
)
4194 struct ath10k
*ar
= hw
->priv
;
4196 mutex_lock(&ar
->conf_mutex
);
4198 *tx_ant
= ar
->cfg_tx_chainmask
;
4199 *rx_ant
= ar
->cfg_rx_chainmask
;
4201 mutex_unlock(&ar
->conf_mutex
);
4206 static void ath10k_check_chain_mask(struct ath10k
*ar
, u32 cm
, const char *dbg
)
4208 /* It is not clear that allowing gaps in chainmask
4209 * is helpful. Probably it will not do what user
4210 * is hoping for, so warn in that case.
4212 if (cm
== 15 || cm
== 7 || cm
== 3 || cm
== 1 || cm
== 0)
4215 ath10k_warn(ar
, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
4219 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k
*ar
)
4221 int nsts
= ar
->vht_cap_info
;
4223 nsts
&= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK
;
4224 nsts
>>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT
;
4226 /* If firmware does not deliver to host number of space-time
4227 * streams supported, assume it support up to 4 BF STS and return
4228 * the value for VHT CAP: nsts-1)
4236 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k
*ar
)
4238 int sound_dim
= ar
->vht_cap_info
;
4240 sound_dim
&= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK
;
4241 sound_dim
>>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT
;
4243 /* If the sounding dimension is not advertised by the firmware,
4244 * let's use a default value of 1
4252 static struct ieee80211_sta_vht_cap
ath10k_create_vht_cap(struct ath10k
*ar
)
4254 struct ieee80211_sta_vht_cap vht_cap
= {0};
4259 vht_cap
.vht_supported
= 1;
4260 vht_cap
.cap
= ar
->vht_cap_info
;
4262 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
4263 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)) {
4264 val
= ath10k_mac_get_vht_cap_bf_sts(ar
);
4265 val
<<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT
;
4266 val
&= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK
;
4271 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
4272 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)) {
4273 val
= ath10k_mac_get_vht_cap_bf_sound_dim(ar
);
4274 val
<<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT
;
4275 val
&= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK
;
4281 for (i
= 0; i
< 8; i
++) {
4282 if ((i
< ar
->num_rf_chains
) && (ar
->cfg_tx_chainmask
& BIT(i
)))
4283 mcs_map
|= IEEE80211_VHT_MCS_SUPPORT_0_9
<< (i
* 2);
4285 mcs_map
|= IEEE80211_VHT_MCS_NOT_SUPPORTED
<< (i
* 2);
4288 if (ar
->cfg_tx_chainmask
<= 1)
4289 vht_cap
.cap
&= ~IEEE80211_VHT_CAP_TXSTBC
;
4291 vht_cap
.vht_mcs
.rx_mcs_map
= cpu_to_le16(mcs_map
);
4292 vht_cap
.vht_mcs
.tx_mcs_map
= cpu_to_le16(mcs_map
);
4297 static struct ieee80211_sta_ht_cap
ath10k_get_ht_cap(struct ath10k
*ar
)
4300 struct ieee80211_sta_ht_cap ht_cap
= {0};
4302 if (!(ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
))
4305 ht_cap
.ht_supported
= 1;
4306 ht_cap
.ampdu_factor
= IEEE80211_HT_MAX_AMPDU_64K
;
4307 ht_cap
.ampdu_density
= IEEE80211_HT_MPDU_DENSITY_8
;
4308 ht_cap
.cap
|= IEEE80211_HT_CAP_SUP_WIDTH_20_40
;
4309 ht_cap
.cap
|= IEEE80211_HT_CAP_DSSSCCK40
;
4311 WLAN_HT_CAP_SM_PS_DISABLED
<< IEEE80211_HT_CAP_SM_PS_SHIFT
;
4313 if (ar
->ht_cap_info
& WMI_HT_CAP_HT20_SGI
)
4314 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_20
;
4316 if (ar
->ht_cap_info
& WMI_HT_CAP_HT40_SGI
)
4317 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_40
;
4319 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
) {
4322 smps
= WLAN_HT_CAP_SM_PS_DYNAMIC
;
4323 smps
<<= IEEE80211_HT_CAP_SM_PS_SHIFT
;
4328 if (ar
->ht_cap_info
& WMI_HT_CAP_TX_STBC
&& (ar
->cfg_tx_chainmask
> 1))
4329 ht_cap
.cap
|= IEEE80211_HT_CAP_TX_STBC
;
4331 if (ar
->ht_cap_info
& WMI_HT_CAP_RX_STBC
) {
4334 stbc
= ar
->ht_cap_info
;
4335 stbc
&= WMI_HT_CAP_RX_STBC
;
4336 stbc
>>= WMI_HT_CAP_RX_STBC_MASK_SHIFT
;
4337 stbc
<<= IEEE80211_HT_CAP_RX_STBC_SHIFT
;
4338 stbc
&= IEEE80211_HT_CAP_RX_STBC
;
4343 if (ar
->ht_cap_info
& WMI_HT_CAP_LDPC
)
4344 ht_cap
.cap
|= IEEE80211_HT_CAP_LDPC_CODING
;
4346 if (ar
->ht_cap_info
& WMI_HT_CAP_L_SIG_TXOP_PROT
)
4347 ht_cap
.cap
|= IEEE80211_HT_CAP_LSIG_TXOP_PROT
;
4349 /* max AMSDU is implicitly taken from vht_cap_info */
4350 if (ar
->vht_cap_info
& WMI_VHT_CAP_MAX_MPDU_LEN_MASK
)
4351 ht_cap
.cap
|= IEEE80211_HT_CAP_MAX_AMSDU
;
4353 for (i
= 0; i
< ar
->num_rf_chains
; i
++) {
4354 if (ar
->cfg_rx_chainmask
& BIT(i
))
4355 ht_cap
.mcs
.rx_mask
[i
] = 0xFF;
4358 ht_cap
.mcs
.tx_params
|= IEEE80211_HT_MCS_TX_DEFINED
;
4363 static void ath10k_mac_setup_ht_vht_cap(struct ath10k
*ar
)
4365 struct ieee80211_supported_band
*band
;
4366 struct ieee80211_sta_vht_cap vht_cap
;
4367 struct ieee80211_sta_ht_cap ht_cap
;
4369 ht_cap
= ath10k_get_ht_cap(ar
);
4370 vht_cap
= ath10k_create_vht_cap(ar
);
4372 if (ar
->phy_capability
& WHAL_WLAN_11G_CAPABILITY
) {
4373 band
= &ar
->mac
.sbands
[NL80211_BAND_2GHZ
];
4374 band
->ht_cap
= ht_cap
;
4376 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
) {
4377 band
= &ar
->mac
.sbands
[NL80211_BAND_5GHZ
];
4378 band
->ht_cap
= ht_cap
;
4379 band
->vht_cap
= vht_cap
;
4383 static int __ath10k_set_antenna(struct ath10k
*ar
, u32 tx_ant
, u32 rx_ant
)
4387 lockdep_assert_held(&ar
->conf_mutex
);
4389 ath10k_check_chain_mask(ar
, tx_ant
, "tx");
4390 ath10k_check_chain_mask(ar
, rx_ant
, "rx");
4392 ar
->cfg_tx_chainmask
= tx_ant
;
4393 ar
->cfg_rx_chainmask
= rx_ant
;
4395 if ((ar
->state
!= ATH10K_STATE_ON
) &&
4396 (ar
->state
!= ATH10K_STATE_RESTARTED
))
4399 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->tx_chain_mask
,
4402 ath10k_warn(ar
, "failed to set tx-chainmask: %d, req 0x%x\n",
4407 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->rx_chain_mask
,
4410 ath10k_warn(ar
, "failed to set rx-chainmask: %d, req 0x%x\n",
4415 /* Reload HT/VHT capability */
4416 ath10k_mac_setup_ht_vht_cap(ar
);
4421 static int ath10k_set_antenna(struct ieee80211_hw
*hw
, u32 tx_ant
, u32 rx_ant
)
4423 struct ath10k
*ar
= hw
->priv
;
4426 mutex_lock(&ar
->conf_mutex
);
4427 ret
= __ath10k_set_antenna(ar
, tx_ant
, rx_ant
);
4428 mutex_unlock(&ar
->conf_mutex
);
4432 static int ath10k_start(struct ieee80211_hw
*hw
)
4434 struct ath10k
*ar
= hw
->priv
;
4439 * This makes sense only when restarting hw. It is harmless to call
4440 * unconditionally. This is necessary to make sure no HTT/WMI tx
4441 * commands will be submitted while restarting.
4443 ath10k_drain_tx(ar
);
4445 mutex_lock(&ar
->conf_mutex
);
4447 switch (ar
->state
) {
4448 case ATH10K_STATE_OFF
:
4449 ar
->state
= ATH10K_STATE_ON
;
4451 case ATH10K_STATE_RESTARTING
:
4453 ar
->state
= ATH10K_STATE_RESTARTED
;
4455 case ATH10K_STATE_ON
:
4456 case ATH10K_STATE_RESTARTED
:
4457 case ATH10K_STATE_WEDGED
:
4461 case ATH10K_STATE_UTF
:
4466 ret
= ath10k_hif_power_up(ar
);
4468 ath10k_err(ar
, "Could not init hif: %d\n", ret
);
4472 ret
= ath10k_core_start(ar
, ATH10K_FIRMWARE_MODE_NORMAL
,
4473 &ar
->normal_mode_fw
);
4475 ath10k_err(ar
, "Could not init core: %d\n", ret
);
4476 goto err_power_down
;
4479 param
= ar
->wmi
.pdev_param
->pmf_qos
;
4480 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 1);
4482 ath10k_warn(ar
, "failed to enable PMF QOS: %d\n", ret
);
4486 param
= ar
->wmi
.pdev_param
->dynamic_bw
;
4487 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 1);
4489 ath10k_warn(ar
, "failed to enable dynamic BW: %d\n", ret
);
4493 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS
, ar
->wmi
.svc_map
)) {
4494 ret
= ath10k_wmi_adaptive_qcs(ar
, true);
4496 ath10k_warn(ar
, "failed to enable adaptive qcs: %d\n",
4502 if (test_bit(WMI_SERVICE_BURST
, ar
->wmi
.svc_map
)) {
4503 param
= ar
->wmi
.pdev_param
->burst_enable
;
4504 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 0);
4506 ath10k_warn(ar
, "failed to disable burst: %d\n", ret
);
4511 __ath10k_set_antenna(ar
, ar
->cfg_tx_chainmask
, ar
->cfg_rx_chainmask
);
4514 * By default FW set ARP frames ac to voice (6). In that case ARP
4515 * exchange is not working properly for UAPSD enabled AP. ARP requests
4516 * which arrives with access category 0 are processed by network stack
4517 * and send back with access category 0, but FW changes access category
4518 * to 6. Set ARP frames access category to best effort (0) solves
4522 param
= ar
->wmi
.pdev_param
->arp_ac_override
;
4523 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 0);
4525 ath10k_warn(ar
, "failed to set arp ac override parameter: %d\n",
4530 if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA
,
4531 ar
->running_fw
->fw_file
.fw_features
)) {
4532 ret
= ath10k_wmi_pdev_enable_adaptive_cca(ar
, 1,
4533 WMI_CCA_DETECT_LEVEL_AUTO
,
4534 WMI_CCA_DETECT_MARGIN_AUTO
);
4536 ath10k_warn(ar
, "failed to enable adaptive cca: %d\n",
4542 param
= ar
->wmi
.pdev_param
->ani_enable
;
4543 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 1);
4545 ath10k_warn(ar
, "failed to enable ani by default: %d\n",
4550 ar
->ani_enabled
= true;
4552 if (ath10k_peer_stats_enabled(ar
)) {
4553 param
= ar
->wmi
.pdev_param
->peer_stats_update_period
;
4554 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
4555 PEER_DEFAULT_STATS_UPDATE_PERIOD
);
4558 "failed to set peer stats period : %d\n",
4564 param
= ar
->wmi
.pdev_param
->enable_btcoex
;
4565 if (test_bit(WMI_SERVICE_COEX_GPIO
, ar
->wmi
.svc_map
) &&
4566 test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM
,
4567 ar
->running_fw
->fw_file
.fw_features
)) {
4568 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 0);
4571 "failed to set btcoex param: %d\n", ret
);
4574 clear_bit(ATH10K_FLAG_BTCOEX
, &ar
->dev_flags
);
4577 ar
->num_started_vdevs
= 0;
4578 ath10k_regd_update(ar
);
4580 ath10k_spectral_start(ar
);
4581 ath10k_thermal_set_throttling(ar
);
4583 mutex_unlock(&ar
->conf_mutex
);
4587 ath10k_core_stop(ar
);
4590 ath10k_hif_power_down(ar
);
4593 ar
->state
= ATH10K_STATE_OFF
;
4596 mutex_unlock(&ar
->conf_mutex
);
4600 static void ath10k_stop(struct ieee80211_hw
*hw
)
4602 struct ath10k
*ar
= hw
->priv
;
4604 ath10k_drain_tx(ar
);
4606 mutex_lock(&ar
->conf_mutex
);
4607 if (ar
->state
!= ATH10K_STATE_OFF
) {
4609 ar
->state
= ATH10K_STATE_OFF
;
4611 mutex_unlock(&ar
->conf_mutex
);
4613 cancel_delayed_work_sync(&ar
->scan
.timeout
);
4614 cancel_work_sync(&ar
->restart_work
);
4617 static int ath10k_config_ps(struct ath10k
*ar
)
4619 struct ath10k_vif
*arvif
;
4622 lockdep_assert_held(&ar
->conf_mutex
);
4624 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
4625 ret
= ath10k_mac_vif_setup_ps(arvif
);
4627 ath10k_warn(ar
, "failed to setup powersave: %d\n", ret
);
4635 static int ath10k_mac_txpower_setup(struct ath10k
*ar
, int txpower
)
4640 lockdep_assert_held(&ar
->conf_mutex
);
4642 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac txpower %d\n", txpower
);
4644 param
= ar
->wmi
.pdev_param
->txpower_limit2g
;
4645 ret
= ath10k_wmi_pdev_set_param(ar
, param
, txpower
* 2);
4647 ath10k_warn(ar
, "failed to set 2g txpower %d: %d\n",
4652 param
= ar
->wmi
.pdev_param
->txpower_limit5g
;
4653 ret
= ath10k_wmi_pdev_set_param(ar
, param
, txpower
* 2);
4655 ath10k_warn(ar
, "failed to set 5g txpower %d: %d\n",
4663 static int ath10k_mac_txpower_recalc(struct ath10k
*ar
)
4665 struct ath10k_vif
*arvif
;
4666 int ret
, txpower
= -1;
4668 lockdep_assert_held(&ar
->conf_mutex
);
4670 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
4671 WARN_ON(arvif
->txpower
< 0);
4674 txpower
= arvif
->txpower
;
4676 txpower
= min(txpower
, arvif
->txpower
);
4679 if (WARN_ON(txpower
== -1))
4682 ret
= ath10k_mac_txpower_setup(ar
, txpower
);
4684 ath10k_warn(ar
, "failed to setup tx power %d: %d\n",
4692 static int ath10k_config(struct ieee80211_hw
*hw
, u32 changed
)
4694 struct ath10k
*ar
= hw
->priv
;
4695 struct ieee80211_conf
*conf
= &hw
->conf
;
4698 mutex_lock(&ar
->conf_mutex
);
4700 if (changed
& IEEE80211_CONF_CHANGE_PS
)
4701 ath10k_config_ps(ar
);
4703 if (changed
& IEEE80211_CONF_CHANGE_MONITOR
) {
4704 ar
->monitor
= conf
->flags
& IEEE80211_CONF_MONITOR
;
4705 ret
= ath10k_monitor_recalc(ar
);
4707 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
4710 mutex_unlock(&ar
->conf_mutex
);
4714 static u32
get_nss_from_chainmask(u16 chain_mask
)
4716 if ((chain_mask
& 0xf) == 0xf)
4718 else if ((chain_mask
& 0x7) == 0x7)
4720 else if ((chain_mask
& 0x3) == 0x3)
4725 static int ath10k_mac_set_txbf_conf(struct ath10k_vif
*arvif
)
4728 struct ath10k
*ar
= arvif
->ar
;
4732 if (ath10k_wmi_get_txbf_conf_scheme(ar
) != WMI_TXBF_CONF_BEFORE_ASSOC
)
4735 nsts
= ath10k_mac_get_vht_cap_bf_sts(ar
);
4736 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
4737 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
))
4738 value
|= SM(nsts
, WMI_TXBF_STS_CAP_OFFSET
);
4740 sound_dim
= ath10k_mac_get_vht_cap_bf_sound_dim(ar
);
4741 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
4742 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
))
4743 value
|= SM(sound_dim
, WMI_BF_SOUND_DIM_OFFSET
);
4748 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
)
4749 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
4751 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)
4752 value
|= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER
|
4753 WMI_VDEV_PARAM_TXBF_SU_TX_BFER
);
4755 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
)
4756 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
4758 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)
4759 value
|= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
|
4760 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
);
4762 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
4763 ar
->wmi
.vdev_param
->txbf
, value
);
4768 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4769 * because we will send mgmt frames without CCK. This requirement
4770 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4773 static int ath10k_add_interface(struct ieee80211_hw
*hw
,
4774 struct ieee80211_vif
*vif
)
4776 struct ath10k
*ar
= hw
->priv
;
4777 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
4778 struct ath10k_peer
*peer
;
4779 enum wmi_sta_powersave_param param
;
4786 vif
->driver_flags
|= IEEE80211_VIF_SUPPORTS_UAPSD
;
4788 mutex_lock(&ar
->conf_mutex
);
4790 memset(arvif
, 0, sizeof(*arvif
));
4791 ath10k_mac_txq_init(vif
->txq
);
4796 INIT_LIST_HEAD(&arvif
->list
);
4797 INIT_WORK(&arvif
->ap_csa_work
, ath10k_mac_vif_ap_csa_work
);
4798 INIT_DELAYED_WORK(&arvif
->connection_loss_work
,
4799 ath10k_mac_vif_sta_connection_loss_work
);
4801 for (i
= 0; i
< ARRAY_SIZE(arvif
->bitrate_mask
.control
); i
++) {
4802 arvif
->bitrate_mask
.control
[i
].legacy
= 0xffffffff;
4803 memset(arvif
->bitrate_mask
.control
[i
].ht_mcs
, 0xff,
4804 sizeof(arvif
->bitrate_mask
.control
[i
].ht_mcs
));
4805 memset(arvif
->bitrate_mask
.control
[i
].vht_mcs
, 0xff,
4806 sizeof(arvif
->bitrate_mask
.control
[i
].vht_mcs
));
4809 if (ar
->num_peers
>= ar
->max_num_peers
) {
4810 ath10k_warn(ar
, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
4815 if (ar
->free_vdev_map
== 0) {
4816 ath10k_warn(ar
, "Free vdev map is empty, no more interfaces allowed.\n");
4820 bit
= __ffs64(ar
->free_vdev_map
);
4822 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac create vdev %i map %llx\n",
4823 bit
, ar
->free_vdev_map
);
4825 arvif
->vdev_id
= bit
;
4826 arvif
->vdev_subtype
=
4827 ath10k_wmi_get_vdev_subtype(ar
, WMI_VDEV_SUBTYPE_NONE
);
4829 switch (vif
->type
) {
4830 case NL80211_IFTYPE_P2P_DEVICE
:
4831 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
4832 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
4833 (ar
, WMI_VDEV_SUBTYPE_P2P_DEVICE
);
4835 case NL80211_IFTYPE_UNSPECIFIED
:
4836 case NL80211_IFTYPE_STATION
:
4837 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
4839 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
4840 (ar
, WMI_VDEV_SUBTYPE_P2P_CLIENT
);
4842 case NL80211_IFTYPE_ADHOC
:
4843 arvif
->vdev_type
= WMI_VDEV_TYPE_IBSS
;
4845 case NL80211_IFTYPE_MESH_POINT
:
4846 if (test_bit(WMI_SERVICE_MESH_11S
, ar
->wmi
.svc_map
)) {
4847 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
4848 (ar
, WMI_VDEV_SUBTYPE_MESH_11S
);
4849 } else if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
)) {
4851 ath10k_warn(ar
, "must load driver with rawmode=1 to add mesh interfaces\n");
4854 arvif
->vdev_type
= WMI_VDEV_TYPE_AP
;
4856 case NL80211_IFTYPE_AP
:
4857 arvif
->vdev_type
= WMI_VDEV_TYPE_AP
;
4860 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
4861 (ar
, WMI_VDEV_SUBTYPE_P2P_GO
);
4863 case NL80211_IFTYPE_MONITOR
:
4864 arvif
->vdev_type
= WMI_VDEV_TYPE_MONITOR
;
4871 /* Using vdev_id as queue number will make it very easy to do per-vif
4872 * tx queue locking. This shouldn't wrap due to interface combinations
4873 * but do a modulo for correctness sake and prevent using offchannel tx
4874 * queues for regular vif tx.
4876 vif
->cab_queue
= arvif
->vdev_id
% (IEEE80211_MAX_QUEUES
- 1);
4877 for (i
= 0; i
< ARRAY_SIZE(vif
->hw_queue
); i
++)
4878 vif
->hw_queue
[i
] = arvif
->vdev_id
% (IEEE80211_MAX_QUEUES
- 1);
4880 /* Some firmware revisions don't wait for beacon tx completion before
4881 * sending another SWBA event. This could lead to hardware using old
4882 * (freed) beacon data in some cases, e.g. tx credit starvation
4883 * combined with missed TBTT. This is very very rare.
4885 * On non-IOMMU-enabled hosts this could be a possible security issue
4886 * because hw could beacon some random data on the air. On
4887 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
4888 * device would crash.
4890 * Since there are no beacon tx completions (implicit nor explicit)
4891 * propagated to host the only workaround for this is to allocate a
4892 * DMA-coherent buffer for a lifetime of a vif and use it for all
4893 * beacon tx commands. Worst case for this approach is some beacons may
4894 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
4896 if (vif
->type
== NL80211_IFTYPE_ADHOC
||
4897 vif
->type
== NL80211_IFTYPE_MESH_POINT
||
4898 vif
->type
== NL80211_IFTYPE_AP
) {
4899 arvif
->beacon_buf
= dma_zalloc_coherent(ar
->dev
,
4900 IEEE80211_MAX_FRAME_LEN
,
4901 &arvif
->beacon_paddr
,
4903 if (!arvif
->beacon_buf
) {
4905 ath10k_warn(ar
, "failed to allocate beacon buffer: %d\n",
4910 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED
, &ar
->dev_flags
))
4911 arvif
->nohwcrypt
= true;
4913 if (arvif
->nohwcrypt
&&
4914 !test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
)) {
4915 ath10k_warn(ar
, "cryptmode module param needed for sw crypto\n");
4919 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
4920 arvif
->vdev_id
, arvif
->vdev_type
, arvif
->vdev_subtype
,
4921 arvif
->beacon_buf
? "single-buf" : "per-skb");
4923 ret
= ath10k_wmi_vdev_create(ar
, arvif
->vdev_id
, arvif
->vdev_type
,
4924 arvif
->vdev_subtype
, vif
->addr
);
4926 ath10k_warn(ar
, "failed to create WMI vdev %i: %d\n",
4927 arvif
->vdev_id
, ret
);
4931 ar
->free_vdev_map
&= ~(1LL << arvif
->vdev_id
);
4932 spin_lock_bh(&ar
->data_lock
);
4933 list_add(&arvif
->list
, &ar
->arvifs
);
4934 spin_unlock_bh(&ar
->data_lock
);
4936 /* It makes no sense to have firmware do keepalives. mac80211 already
4937 * takes care of this with idle connection polling.
4939 ret
= ath10k_mac_vif_disable_keepalive(arvif
);
4941 ath10k_warn(ar
, "failed to disable keepalive on vdev %i: %d\n",
4942 arvif
->vdev_id
, ret
);
4943 goto err_vdev_delete
;
4946 arvif
->def_wep_key_idx
= -1;
4948 vdev_param
= ar
->wmi
.vdev_param
->tx_encap_type
;
4949 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
4950 ATH10K_HW_TXRX_NATIVE_WIFI
);
4951 /* 10.X firmware does not support this VDEV parameter. Do not warn */
4952 if (ret
&& ret
!= -EOPNOTSUPP
) {
4953 ath10k_warn(ar
, "failed to set vdev %i TX encapsulation: %d\n",
4954 arvif
->vdev_id
, ret
);
4955 goto err_vdev_delete
;
4958 /* Configuring number of spatial stream for monitor interface is causing
4959 * target assert in qca9888 and qca6174.
4961 if (ar
->cfg_tx_chainmask
&& (vif
->type
!= NL80211_IFTYPE_MONITOR
)) {
4962 u16 nss
= get_nss_from_chainmask(ar
->cfg_tx_chainmask
);
4964 vdev_param
= ar
->wmi
.vdev_param
->nss
;
4965 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
4968 ath10k_warn(ar
, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
4969 arvif
->vdev_id
, ar
->cfg_tx_chainmask
, nss
,
4971 goto err_vdev_delete
;
4975 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
4976 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
4977 ret
= ath10k_peer_create(ar
, vif
, NULL
, arvif
->vdev_id
,
4978 vif
->addr
, WMI_PEER_TYPE_DEFAULT
);
4980 ath10k_warn(ar
, "failed to create vdev %i peer for AP/IBSS: %d\n",
4981 arvif
->vdev_id
, ret
);
4982 goto err_vdev_delete
;
4985 spin_lock_bh(&ar
->data_lock
);
4987 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, vif
->addr
);
4989 ath10k_warn(ar
, "failed to lookup peer %pM on vdev %i\n",
4990 vif
->addr
, arvif
->vdev_id
);
4991 spin_unlock_bh(&ar
->data_lock
);
4993 goto err_peer_delete
;
4996 arvif
->peer_id
= find_first_bit(peer
->peer_ids
,
4997 ATH10K_MAX_NUM_PEER_IDS
);
4999 spin_unlock_bh(&ar
->data_lock
);
5001 arvif
->peer_id
= HTT_INVALID_PEERID
;
5004 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
5005 ret
= ath10k_mac_set_kickout(arvif
);
5007 ath10k_warn(ar
, "failed to set vdev %i kickout parameters: %d\n",
5008 arvif
->vdev_id
, ret
);
5009 goto err_peer_delete
;
5013 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
) {
5014 param
= WMI_STA_PS_PARAM_RX_WAKE_POLICY
;
5015 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
5016 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
5019 ath10k_warn(ar
, "failed to set vdev %i RX wake policy: %d\n",
5020 arvif
->vdev_id
, ret
);
5021 goto err_peer_delete
;
5024 ret
= ath10k_mac_vif_recalc_ps_wake_threshold(arvif
);
5026 ath10k_warn(ar
, "failed to recalc ps wake threshold on vdev %i: %d\n",
5027 arvif
->vdev_id
, ret
);
5028 goto err_peer_delete
;
5031 ret
= ath10k_mac_vif_recalc_ps_poll_count(arvif
);
5033 ath10k_warn(ar
, "failed to recalc ps poll count on vdev %i: %d\n",
5034 arvif
->vdev_id
, ret
);
5035 goto err_peer_delete
;
5039 ret
= ath10k_mac_set_txbf_conf(arvif
);
5041 ath10k_warn(ar
, "failed to set txbf for vdev %d: %d\n",
5042 arvif
->vdev_id
, ret
);
5043 goto err_peer_delete
;
5046 ret
= ath10k_mac_set_rts(arvif
, ar
->hw
->wiphy
->rts_threshold
);
5048 ath10k_warn(ar
, "failed to set rts threshold for vdev %d: %d\n",
5049 arvif
->vdev_id
, ret
);
5050 goto err_peer_delete
;
5053 arvif
->txpower
= vif
->bss_conf
.txpower
;
5054 ret
= ath10k_mac_txpower_recalc(ar
);
5056 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
5057 goto err_peer_delete
;
5060 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
5061 ar
->monitor_arvif
= arvif
;
5062 ret
= ath10k_monitor_recalc(ar
);
5064 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
5065 goto err_peer_delete
;
5069 spin_lock_bh(&ar
->htt
.tx_lock
);
5071 ieee80211_wake_queue(ar
->hw
, arvif
->vdev_id
);
5072 spin_unlock_bh(&ar
->htt
.tx_lock
);
5074 mutex_unlock(&ar
->conf_mutex
);
5078 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5079 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
)
5080 ath10k_wmi_peer_delete(ar
, arvif
->vdev_id
, vif
->addr
);
5083 ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
5084 ar
->free_vdev_map
|= 1LL << arvif
->vdev_id
;
5085 spin_lock_bh(&ar
->data_lock
);
5086 list_del(&arvif
->list
);
5087 spin_unlock_bh(&ar
->data_lock
);
5090 if (arvif
->beacon_buf
) {
5091 dma_free_coherent(ar
->dev
, IEEE80211_MAX_FRAME_LEN
,
5092 arvif
->beacon_buf
, arvif
->beacon_paddr
);
5093 arvif
->beacon_buf
= NULL
;
5096 mutex_unlock(&ar
->conf_mutex
);
5101 static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif
*arvif
)
5105 for (i
= 0; i
< BITS_PER_LONG
; i
++)
5106 ath10k_mac_vif_tx_unlock(arvif
, i
);
5109 static void ath10k_remove_interface(struct ieee80211_hw
*hw
,
5110 struct ieee80211_vif
*vif
)
5112 struct ath10k
*ar
= hw
->priv
;
5113 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5114 struct ath10k_peer
*peer
;
5118 cancel_work_sync(&arvif
->ap_csa_work
);
5119 cancel_delayed_work_sync(&arvif
->connection_loss_work
);
5121 mutex_lock(&ar
->conf_mutex
);
5123 spin_lock_bh(&ar
->data_lock
);
5124 ath10k_mac_vif_beacon_cleanup(arvif
);
5125 spin_unlock_bh(&ar
->data_lock
);
5127 ret
= ath10k_spectral_vif_stop(arvif
);
5129 ath10k_warn(ar
, "failed to stop spectral for vdev %i: %d\n",
5130 arvif
->vdev_id
, ret
);
5132 ar
->free_vdev_map
|= 1LL << arvif
->vdev_id
;
5133 spin_lock_bh(&ar
->data_lock
);
5134 list_del(&arvif
->list
);
5135 spin_unlock_bh(&ar
->data_lock
);
5137 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5138 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
5139 ret
= ath10k_wmi_peer_delete(arvif
->ar
, arvif
->vdev_id
,
5142 ath10k_warn(ar
, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5143 arvif
->vdev_id
, ret
);
5145 kfree(arvif
->u
.ap
.noa_data
);
5148 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i delete (remove interface)\n",
5151 ret
= ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
5153 ath10k_warn(ar
, "failed to delete WMI vdev %i: %d\n",
5154 arvif
->vdev_id
, ret
);
5156 /* Some firmware revisions don't notify host about self-peer removal
5157 * until after associated vdev is deleted.
5159 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5160 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
5161 ret
= ath10k_wait_for_peer_deleted(ar
, arvif
->vdev_id
,
5164 ath10k_warn(ar
, "failed to remove AP self-peer on vdev %i: %d\n",
5165 arvif
->vdev_id
, ret
);
5167 spin_lock_bh(&ar
->data_lock
);
5169 spin_unlock_bh(&ar
->data_lock
);
5172 spin_lock_bh(&ar
->data_lock
);
5173 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++) {
5174 peer
= ar
->peer_map
[i
];
5178 if (peer
->vif
== vif
) {
5179 ath10k_warn(ar
, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
5180 vif
->addr
, arvif
->vdev_id
);
5184 spin_unlock_bh(&ar
->data_lock
);
5186 ath10k_peer_cleanup(ar
, arvif
->vdev_id
);
5187 ath10k_mac_txq_unref(ar
, vif
->txq
);
5189 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
5190 ar
->monitor_arvif
= NULL
;
5191 ret
= ath10k_monitor_recalc(ar
);
5193 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
5196 spin_lock_bh(&ar
->htt
.tx_lock
);
5197 ath10k_mac_vif_tx_unlock_all(arvif
);
5198 spin_unlock_bh(&ar
->htt
.tx_lock
);
5200 ath10k_mac_txq_unref(ar
, vif
->txq
);
5202 mutex_unlock(&ar
->conf_mutex
);
5206 * FIXME: Has to be verified.
5208 #define SUPPORTED_FILTERS \
5213 FIF_BCN_PRBRESP_PROMISC | \
5217 static void ath10k_configure_filter(struct ieee80211_hw
*hw
,
5218 unsigned int changed_flags
,
5219 unsigned int *total_flags
,
5222 struct ath10k
*ar
= hw
->priv
;
5225 mutex_lock(&ar
->conf_mutex
);
5227 changed_flags
&= SUPPORTED_FILTERS
;
5228 *total_flags
&= SUPPORTED_FILTERS
;
5229 ar
->filter_flags
= *total_flags
;
5231 ret
= ath10k_monitor_recalc(ar
);
5233 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
5235 mutex_unlock(&ar
->conf_mutex
);
5238 static void ath10k_bss_info_changed(struct ieee80211_hw
*hw
,
5239 struct ieee80211_vif
*vif
,
5240 struct ieee80211_bss_conf
*info
,
5243 struct ath10k
*ar
= hw
->priv
;
5244 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5246 u32 vdev_param
, pdev_param
, slottime
, preamble
;
5248 mutex_lock(&ar
->conf_mutex
);
5250 if (changed
& BSS_CHANGED_IBSS
)
5251 ath10k_control_ibss(arvif
, info
, vif
->addr
);
5253 if (changed
& BSS_CHANGED_BEACON_INT
) {
5254 arvif
->beacon_interval
= info
->beacon_int
;
5255 vdev_param
= ar
->wmi
.vdev_param
->beacon_interval
;
5256 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5257 arvif
->beacon_interval
);
5258 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5259 "mac vdev %d beacon_interval %d\n",
5260 arvif
->vdev_id
, arvif
->beacon_interval
);
5263 ath10k_warn(ar
, "failed to set beacon interval for vdev %d: %i\n",
5264 arvif
->vdev_id
, ret
);
5267 if (changed
& BSS_CHANGED_BEACON
) {
5268 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5269 "vdev %d set beacon tx mode to staggered\n",
5272 pdev_param
= ar
->wmi
.pdev_param
->beacon_tx_mode
;
5273 ret
= ath10k_wmi_pdev_set_param(ar
, pdev_param
,
5274 WMI_BEACON_STAGGERED_MODE
);
5276 ath10k_warn(ar
, "failed to set beacon mode for vdev %d: %i\n",
5277 arvif
->vdev_id
, ret
);
5279 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
5281 ath10k_warn(ar
, "failed to update beacon template: %d\n",
5284 if (ieee80211_vif_is_mesh(vif
)) {
5285 /* mesh doesn't use SSID but firmware needs it */
5286 strncpy(arvif
->u
.ap
.ssid
, "mesh",
5287 sizeof(arvif
->u
.ap
.ssid
));
5288 arvif
->u
.ap
.ssid_len
= 4;
5292 if (changed
& BSS_CHANGED_AP_PROBE_RESP
) {
5293 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
5295 ath10k_warn(ar
, "failed to setup probe resp template on vdev %i: %d\n",
5296 arvif
->vdev_id
, ret
);
5299 if (changed
& (BSS_CHANGED_BEACON_INFO
| BSS_CHANGED_BEACON
)) {
5300 arvif
->dtim_period
= info
->dtim_period
;
5302 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5303 "mac vdev %d dtim_period %d\n",
5304 arvif
->vdev_id
, arvif
->dtim_period
);
5306 vdev_param
= ar
->wmi
.vdev_param
->dtim_period
;
5307 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5308 arvif
->dtim_period
);
5310 ath10k_warn(ar
, "failed to set dtim period for vdev %d: %i\n",
5311 arvif
->vdev_id
, ret
);
5314 if (changed
& BSS_CHANGED_SSID
&&
5315 vif
->type
== NL80211_IFTYPE_AP
) {
5316 arvif
->u
.ap
.ssid_len
= info
->ssid_len
;
5318 memcpy(arvif
->u
.ap
.ssid
, info
->ssid
, info
->ssid_len
);
5319 arvif
->u
.ap
.hidden_ssid
= info
->hidden_ssid
;
5322 if (changed
& BSS_CHANGED_BSSID
&& !is_zero_ether_addr(info
->bssid
))
5323 ether_addr_copy(arvif
->bssid
, info
->bssid
);
5325 if (changed
& BSS_CHANGED_BEACON_ENABLED
)
5326 ath10k_control_beaconing(arvif
, info
);
5328 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
5329 arvif
->use_cts_prot
= info
->use_cts_prot
;
5330 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d cts_prot %d\n",
5331 arvif
->vdev_id
, info
->use_cts_prot
);
5333 ret
= ath10k_recalc_rtscts_prot(arvif
);
5335 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
5336 arvif
->vdev_id
, ret
);
5338 vdev_param
= ar
->wmi
.vdev_param
->protection_mode
;
5339 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5340 info
->use_cts_prot
? 1 : 0);
5342 ath10k_warn(ar
, "failed to set protection mode %d on vdev %i: %d\n",
5343 info
->use_cts_prot
, arvif
->vdev_id
, ret
);
5346 if (changed
& BSS_CHANGED_ERP_SLOT
) {
5347 if (info
->use_short_slot
)
5348 slottime
= WMI_VDEV_SLOT_TIME_SHORT
; /* 9us */
5351 slottime
= WMI_VDEV_SLOT_TIME_LONG
; /* 20us */
5353 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d slot_time %d\n",
5354 arvif
->vdev_id
, slottime
);
5356 vdev_param
= ar
->wmi
.vdev_param
->slot_time
;
5357 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5360 ath10k_warn(ar
, "failed to set erp slot for vdev %d: %i\n",
5361 arvif
->vdev_id
, ret
);
5364 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
5365 if (info
->use_short_preamble
)
5366 preamble
= WMI_VDEV_PREAMBLE_SHORT
;
5368 preamble
= WMI_VDEV_PREAMBLE_LONG
;
5370 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5371 "mac vdev %d preamble %dn",
5372 arvif
->vdev_id
, preamble
);
5374 vdev_param
= ar
->wmi
.vdev_param
->preamble
;
5375 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5378 ath10k_warn(ar
, "failed to set preamble for vdev %d: %i\n",
5379 arvif
->vdev_id
, ret
);
5382 if (changed
& BSS_CHANGED_ASSOC
) {
5384 /* Workaround: Make sure monitor vdev is not running
5385 * when associating to prevent some firmware revisions
5386 * (e.g. 10.1 and 10.2) from crashing.
5388 if (ar
->monitor_started
)
5389 ath10k_monitor_stop(ar
);
5390 ath10k_bss_assoc(hw
, vif
, info
);
5391 ath10k_monitor_recalc(ar
);
5393 ath10k_bss_disassoc(hw
, vif
);
5397 if (changed
& BSS_CHANGED_TXPOWER
) {
5398 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev_id %i txpower %d\n",
5399 arvif
->vdev_id
, info
->txpower
);
5401 arvif
->txpower
= info
->txpower
;
5402 ret
= ath10k_mac_txpower_recalc(ar
);
5404 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
5407 if (changed
& BSS_CHANGED_PS
) {
5408 arvif
->ps
= vif
->bss_conf
.ps
;
5410 ret
= ath10k_config_ps(ar
);
5412 ath10k_warn(ar
, "failed to setup ps on vdev %i: %d\n",
5413 arvif
->vdev_id
, ret
);
5416 mutex_unlock(&ar
->conf_mutex
);
5419 static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw
*hw
, s16 value
)
5421 struct ath10k
*ar
= hw
->priv
;
5423 /* This function should never be called if setting the coverage class
5424 * is not supported on this hardware.
5426 if (!ar
->hw_params
.hw_ops
->set_coverage_class
) {
5430 ar
->hw_params
.hw_ops
->set_coverage_class(ar
, value
);
5433 static int ath10k_hw_scan(struct ieee80211_hw
*hw
,
5434 struct ieee80211_vif
*vif
,
5435 struct ieee80211_scan_request
*hw_req
)
5437 struct ath10k
*ar
= hw
->priv
;
5438 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5439 struct cfg80211_scan_request
*req
= &hw_req
->req
;
5440 struct wmi_start_scan_arg arg
;
5444 mutex_lock(&ar
->conf_mutex
);
5446 spin_lock_bh(&ar
->data_lock
);
5447 switch (ar
->scan
.state
) {
5448 case ATH10K_SCAN_IDLE
:
5449 reinit_completion(&ar
->scan
.started
);
5450 reinit_completion(&ar
->scan
.completed
);
5451 ar
->scan
.state
= ATH10K_SCAN_STARTING
;
5452 ar
->scan
.is_roc
= false;
5453 ar
->scan
.vdev_id
= arvif
->vdev_id
;
5456 case ATH10K_SCAN_STARTING
:
5457 case ATH10K_SCAN_RUNNING
:
5458 case ATH10K_SCAN_ABORTING
:
5462 spin_unlock_bh(&ar
->data_lock
);
5467 memset(&arg
, 0, sizeof(arg
));
5468 ath10k_wmi_start_scan_init(ar
, &arg
);
5469 arg
.vdev_id
= arvif
->vdev_id
;
5470 arg
.scan_id
= ATH10K_SCAN_ID
;
5473 arg
.ie_len
= req
->ie_len
;
5474 memcpy(arg
.ie
, req
->ie
, arg
.ie_len
);
5478 arg
.n_ssids
= req
->n_ssids
;
5479 for (i
= 0; i
< arg
.n_ssids
; i
++) {
5480 arg
.ssids
[i
].len
= req
->ssids
[i
].ssid_len
;
5481 arg
.ssids
[i
].ssid
= req
->ssids
[i
].ssid
;
5484 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
5487 if (req
->n_channels
) {
5488 arg
.n_channels
= req
->n_channels
;
5489 for (i
= 0; i
< arg
.n_channels
; i
++)
5490 arg
.channels
[i
] = req
->channels
[i
]->center_freq
;
5493 ret
= ath10k_start_scan(ar
, &arg
);
5495 ath10k_warn(ar
, "failed to start hw scan: %d\n", ret
);
5496 spin_lock_bh(&ar
->data_lock
);
5497 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
5498 spin_unlock_bh(&ar
->data_lock
);
5501 /* Add a 200ms margin to account for event/command processing */
5502 ieee80211_queue_delayed_work(ar
->hw
, &ar
->scan
.timeout
,
5503 msecs_to_jiffies(arg
.max_scan_time
+
5507 mutex_unlock(&ar
->conf_mutex
);
5511 static void ath10k_cancel_hw_scan(struct ieee80211_hw
*hw
,
5512 struct ieee80211_vif
*vif
)
5514 struct ath10k
*ar
= hw
->priv
;
5516 mutex_lock(&ar
->conf_mutex
);
5517 ath10k_scan_abort(ar
);
5518 mutex_unlock(&ar
->conf_mutex
);
5520 cancel_delayed_work_sync(&ar
->scan
.timeout
);
5523 static void ath10k_set_key_h_def_keyidx(struct ath10k
*ar
,
5524 struct ath10k_vif
*arvif
,
5525 enum set_key_cmd cmd
,
5526 struct ieee80211_key_conf
*key
)
5528 u32 vdev_param
= arvif
->ar
->wmi
.vdev_param
->def_keyid
;
5531 /* 10.1 firmware branch requires default key index to be set to group
5532 * key index after installing it. Otherwise FW/HW Txes corrupted
5533 * frames with multi-vif APs. This is not required for main firmware
5534 * branch (e.g. 636).
5536 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
5538 * FIXME: It remains unknown if this is required for multi-vif STA
5539 * interfaces on 10.1.
5542 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
&&
5543 arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
5546 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP40
)
5549 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP104
)
5552 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
5558 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5561 ath10k_warn(ar
, "failed to set vdev %i group key as default key: %d\n",
5562 arvif
->vdev_id
, ret
);
5565 static int ath10k_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
5566 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
,
5567 struct ieee80211_key_conf
*key
)
5569 struct ath10k
*ar
= hw
->priv
;
5570 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5571 struct ath10k_peer
*peer
;
5572 const u8
*peer_addr
;
5573 bool is_wep
= key
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
5574 key
->cipher
== WLAN_CIPHER_SUITE_WEP104
;
5580 /* this one needs to be done in software */
5581 if (key
->cipher
== WLAN_CIPHER_SUITE_AES_CMAC
)
5584 if (arvif
->nohwcrypt
)
5587 if (key
->keyidx
> WMI_MAX_KEY_INDEX
)
5590 mutex_lock(&ar
->conf_mutex
);
5593 peer_addr
= sta
->addr
;
5594 else if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
)
5595 peer_addr
= vif
->bss_conf
.bssid
;
5597 peer_addr
= vif
->addr
;
5599 key
->hw_key_idx
= key
->keyidx
;
5603 arvif
->wep_keys
[key
->keyidx
] = key
;
5605 arvif
->wep_keys
[key
->keyidx
] = NULL
;
5608 /* the peer should not disappear in mid-way (unless FW goes awry) since
5609 * we already hold conf_mutex. we just make sure its there now. */
5610 spin_lock_bh(&ar
->data_lock
);
5611 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
5612 spin_unlock_bh(&ar
->data_lock
);
5615 if (cmd
== SET_KEY
) {
5616 ath10k_warn(ar
, "failed to install key for non-existent peer %pM\n",
5621 /* if the peer doesn't exist there is no key to disable
5627 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
5628 flags
|= WMI_KEY_PAIRWISE
;
5630 flags
|= WMI_KEY_GROUP
;
5633 if (cmd
== DISABLE_KEY
)
5634 ath10k_clear_vdev_key(arvif
, key
);
5636 /* When WEP keys are uploaded it's possible that there are
5637 * stations associated already (e.g. when merging) without any
5638 * keys. Static WEP needs an explicit per-peer key upload.
5640 if (vif
->type
== NL80211_IFTYPE_ADHOC
&&
5642 ath10k_mac_vif_update_wep_key(arvif
, key
);
5644 /* 802.1x never sets the def_wep_key_idx so each set_key()
5645 * call changes default tx key.
5647 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
5648 * after first set_key().
5650 if (cmd
== SET_KEY
&& arvif
->def_wep_key_idx
== -1)
5651 flags
|= WMI_KEY_TX_USAGE
;
5654 ret
= ath10k_install_key(arvif
, key
, cmd
, peer_addr
, flags
);
5657 ath10k_warn(ar
, "failed to install key for vdev %i peer %pM: %d\n",
5658 arvif
->vdev_id
, peer_addr
, ret
);
5662 /* mac80211 sets static WEP keys as groupwise while firmware requires
5663 * them to be installed twice as both pairwise and groupwise.
5665 if (is_wep
&& !sta
&& vif
->type
== NL80211_IFTYPE_STATION
) {
5667 flags2
&= ~WMI_KEY_GROUP
;
5668 flags2
|= WMI_KEY_PAIRWISE
;
5670 ret
= ath10k_install_key(arvif
, key
, cmd
, peer_addr
, flags2
);
5673 ath10k_warn(ar
, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
5674 arvif
->vdev_id
, peer_addr
, ret
);
5675 ret2
= ath10k_install_key(arvif
, key
, DISABLE_KEY
,
5679 ath10k_warn(ar
, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
5680 arvif
->vdev_id
, peer_addr
, ret2
);
5686 ath10k_set_key_h_def_keyidx(ar
, arvif
, cmd
, key
);
5688 spin_lock_bh(&ar
->data_lock
);
5689 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
5690 if (peer
&& cmd
== SET_KEY
)
5691 peer
->keys
[key
->keyidx
] = key
;
5692 else if (peer
&& cmd
== DISABLE_KEY
)
5693 peer
->keys
[key
->keyidx
] = NULL
;
5694 else if (peer
== NULL
)
5695 /* impossible unless FW goes crazy */
5696 ath10k_warn(ar
, "Peer %pM disappeared!\n", peer_addr
);
5697 spin_unlock_bh(&ar
->data_lock
);
5700 mutex_unlock(&ar
->conf_mutex
);
5704 static void ath10k_set_default_unicast_key(struct ieee80211_hw
*hw
,
5705 struct ieee80211_vif
*vif
,
5708 struct ath10k
*ar
= hw
->priv
;
5709 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5712 mutex_lock(&arvif
->ar
->conf_mutex
);
5714 if (arvif
->ar
->state
!= ATH10K_STATE_ON
)
5717 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d set keyidx %d\n",
5718 arvif
->vdev_id
, keyidx
);
5720 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
,
5722 arvif
->ar
->wmi
.vdev_param
->def_keyid
,
5726 ath10k_warn(ar
, "failed to update wep key index for vdev %d: %d\n",
5732 arvif
->def_wep_key_idx
= keyidx
;
5735 mutex_unlock(&arvif
->ar
->conf_mutex
);
5738 static void ath10k_sta_rc_update_wk(struct work_struct
*wk
)
5741 struct ath10k_vif
*arvif
;
5742 struct ath10k_sta
*arsta
;
5743 struct ieee80211_sta
*sta
;
5744 struct cfg80211_chan_def def
;
5745 enum nl80211_band band
;
5746 const u8
*ht_mcs_mask
;
5747 const u16
*vht_mcs_mask
;
5748 u32 changed
, bw
, nss
, smps
;
5751 arsta
= container_of(wk
, struct ath10k_sta
, update_wk
);
5752 sta
= container_of((void *)arsta
, struct ieee80211_sta
, drv_priv
);
5753 arvif
= arsta
->arvif
;
5756 if (WARN_ON(ath10k_mac_vif_chan(arvif
->vif
, &def
)))
5759 band
= def
.chan
->band
;
5760 ht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].ht_mcs
;
5761 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
5763 spin_lock_bh(&ar
->data_lock
);
5765 changed
= arsta
->changed
;
5772 spin_unlock_bh(&ar
->data_lock
);
5774 mutex_lock(&ar
->conf_mutex
);
5776 nss
= max_t(u32
, 1, nss
);
5777 nss
= min(nss
, max(ath10k_mac_max_ht_nss(ht_mcs_mask
),
5778 ath10k_mac_max_vht_nss(vht_mcs_mask
)));
5780 if (changed
& IEEE80211_RC_BW_CHANGED
) {
5781 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM peer bw %d\n",
5784 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
5785 WMI_PEER_CHAN_WIDTH
, bw
);
5787 ath10k_warn(ar
, "failed to update STA %pM peer bw %d: %d\n",
5788 sta
->addr
, bw
, err
);
5791 if (changed
& IEEE80211_RC_NSS_CHANGED
) {
5792 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM nss %d\n",
5795 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
5798 ath10k_warn(ar
, "failed to update STA %pM nss %d: %d\n",
5799 sta
->addr
, nss
, err
);
5802 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
5803 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM smps %d\n",
5806 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
5807 WMI_PEER_SMPS_STATE
, smps
);
5809 ath10k_warn(ar
, "failed to update STA %pM smps %d: %d\n",
5810 sta
->addr
, smps
, err
);
5813 if (changed
& IEEE80211_RC_SUPP_RATES_CHANGED
||
5814 changed
& IEEE80211_RC_NSS_CHANGED
) {
5815 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM supp rates/nss\n",
5818 err
= ath10k_station_assoc(ar
, arvif
->vif
, sta
, true);
5820 ath10k_warn(ar
, "failed to reassociate station: %pM\n",
5824 mutex_unlock(&ar
->conf_mutex
);
5827 static int ath10k_mac_inc_num_stations(struct ath10k_vif
*arvif
,
5828 struct ieee80211_sta
*sta
)
5830 struct ath10k
*ar
= arvif
->ar
;
5832 lockdep_assert_held(&ar
->conf_mutex
);
5834 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
&& !sta
->tdls
)
5837 if (ar
->num_stations
>= ar
->max_num_stations
)
5845 static void ath10k_mac_dec_num_stations(struct ath10k_vif
*arvif
,
5846 struct ieee80211_sta
*sta
)
5848 struct ath10k
*ar
= arvif
->ar
;
5850 lockdep_assert_held(&ar
->conf_mutex
);
5852 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
&& !sta
->tdls
)
5858 struct ath10k_mac_tdls_iter_data
{
5859 u32 num_tdls_stations
;
5860 struct ieee80211_vif
*curr_vif
;
5863 static void ath10k_mac_tdls_vif_stations_count_iter(void *data
,
5864 struct ieee80211_sta
*sta
)
5866 struct ath10k_mac_tdls_iter_data
*iter_data
= data
;
5867 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
5868 struct ieee80211_vif
*sta_vif
= arsta
->arvif
->vif
;
5870 if (sta
->tdls
&& sta_vif
== iter_data
->curr_vif
)
5871 iter_data
->num_tdls_stations
++;
5874 static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw
*hw
,
5875 struct ieee80211_vif
*vif
)
5877 struct ath10k_mac_tdls_iter_data data
= {};
5879 data
.curr_vif
= vif
;
5881 ieee80211_iterate_stations_atomic(hw
,
5882 ath10k_mac_tdls_vif_stations_count_iter
,
5884 return data
.num_tdls_stations
;
5887 static void ath10k_mac_tdls_vifs_count_iter(void *data
, u8
*mac
,
5888 struct ieee80211_vif
*vif
)
5890 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5891 int *num_tdls_vifs
= data
;
5893 if (vif
->type
!= NL80211_IFTYPE_STATION
)
5896 if (ath10k_mac_tdls_vif_stations_count(arvif
->ar
->hw
, vif
) > 0)
5900 static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw
*hw
)
5902 int num_tdls_vifs
= 0;
5904 ieee80211_iterate_active_interfaces_atomic(hw
,
5905 IEEE80211_IFACE_ITER_NORMAL
,
5906 ath10k_mac_tdls_vifs_count_iter
,
5908 return num_tdls_vifs
;
5911 static int ath10k_sta_state(struct ieee80211_hw
*hw
,
5912 struct ieee80211_vif
*vif
,
5913 struct ieee80211_sta
*sta
,
5914 enum ieee80211_sta_state old_state
,
5915 enum ieee80211_sta_state new_state
)
5917 struct ath10k
*ar
= hw
->priv
;
5918 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
5919 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
5920 struct ath10k_peer
*peer
;
5924 if (old_state
== IEEE80211_STA_NOTEXIST
&&
5925 new_state
== IEEE80211_STA_NONE
) {
5926 memset(arsta
, 0, sizeof(*arsta
));
5927 arsta
->arvif
= arvif
;
5928 INIT_WORK(&arsta
->update_wk
, ath10k_sta_rc_update_wk
);
5930 for (i
= 0; i
< ARRAY_SIZE(sta
->txq
); i
++)
5931 ath10k_mac_txq_init(sta
->txq
[i
]);
5934 /* cancel must be done outside the mutex to avoid deadlock */
5935 if ((old_state
== IEEE80211_STA_NONE
&&
5936 new_state
== IEEE80211_STA_NOTEXIST
))
5937 cancel_work_sync(&arsta
->update_wk
);
5939 mutex_lock(&ar
->conf_mutex
);
5941 if (old_state
== IEEE80211_STA_NOTEXIST
&&
5942 new_state
== IEEE80211_STA_NONE
) {
5944 * New station addition.
5946 enum wmi_peer_type peer_type
= WMI_PEER_TYPE_DEFAULT
;
5947 u32 num_tdls_stations
;
5950 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5951 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
5952 arvif
->vdev_id
, sta
->addr
,
5953 ar
->num_stations
+ 1, ar
->max_num_stations
,
5954 ar
->num_peers
+ 1, ar
->max_num_peers
);
5956 ret
= ath10k_mac_inc_num_stations(arvif
, sta
);
5958 ath10k_warn(ar
, "refusing to associate station: too many connected already (%d)\n",
5959 ar
->max_num_stations
);
5964 peer_type
= WMI_PEER_TYPE_TDLS
;
5966 ret
= ath10k_peer_create(ar
, vif
, sta
, arvif
->vdev_id
,
5967 sta
->addr
, peer_type
);
5969 ath10k_warn(ar
, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
5970 sta
->addr
, arvif
->vdev_id
, ret
);
5971 ath10k_mac_dec_num_stations(arvif
, sta
);
5975 spin_lock_bh(&ar
->data_lock
);
5977 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, sta
->addr
);
5979 ath10k_warn(ar
, "failed to lookup peer %pM on vdev %i\n",
5980 vif
->addr
, arvif
->vdev_id
);
5981 spin_unlock_bh(&ar
->data_lock
);
5982 ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
5983 ath10k_mac_dec_num_stations(arvif
, sta
);
5988 arsta
->peer_id
= find_first_bit(peer
->peer_ids
,
5989 ATH10K_MAX_NUM_PEER_IDS
);
5991 spin_unlock_bh(&ar
->data_lock
);
5996 num_tdls_stations
= ath10k_mac_tdls_vif_stations_count(hw
, vif
);
5997 num_tdls_vifs
= ath10k_mac_tdls_vifs_count(hw
);
5999 if (num_tdls_vifs
>= ar
->max_num_tdls_vdevs
&&
6000 num_tdls_stations
== 0) {
6001 ath10k_warn(ar
, "vdev %i exceeded maximum number of tdls vdevs %i\n",
6002 arvif
->vdev_id
, ar
->max_num_tdls_vdevs
);
6003 ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
6004 ath10k_mac_dec_num_stations(arvif
, sta
);
6009 if (num_tdls_stations
== 0) {
6010 /* This is the first tdls peer in current vif */
6011 enum wmi_tdls_state state
= WMI_TDLS_ENABLE_ACTIVE
;
6013 ret
= ath10k_wmi_update_fw_tdls_state(ar
, arvif
->vdev_id
,
6016 ath10k_warn(ar
, "failed to update fw tdls state on vdev %i: %i\n",
6017 arvif
->vdev_id
, ret
);
6018 ath10k_peer_delete(ar
, arvif
->vdev_id
,
6020 ath10k_mac_dec_num_stations(arvif
, sta
);
6025 ret
= ath10k_mac_tdls_peer_update(ar
, arvif
->vdev_id
, sta
,
6026 WMI_TDLS_PEER_STATE_PEERING
);
6029 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
6030 sta
->addr
, arvif
->vdev_id
, ret
);
6031 ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
6032 ath10k_mac_dec_num_stations(arvif
, sta
);
6034 if (num_tdls_stations
!= 0)
6036 ath10k_wmi_update_fw_tdls_state(ar
, arvif
->vdev_id
,
6039 } else if ((old_state
== IEEE80211_STA_NONE
&&
6040 new_state
== IEEE80211_STA_NOTEXIST
)) {
6042 * Existing station deletion.
6044 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
6045 "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
6046 arvif
->vdev_id
, sta
->addr
, sta
);
6048 ret
= ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
6050 ath10k_warn(ar
, "failed to delete peer %pM for vdev %d: %i\n",
6051 sta
->addr
, arvif
->vdev_id
, ret
);
6053 ath10k_mac_dec_num_stations(arvif
, sta
);
6055 spin_lock_bh(&ar
->data_lock
);
6056 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++) {
6057 peer
= ar
->peer_map
[i
];
6061 if (peer
->sta
== sta
) {
6062 ath10k_warn(ar
, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly removed\n",
6063 sta
->addr
, peer
, i
, arvif
->vdev_id
);
6066 /* Clean up the peer object as well since we
6067 * must have failed to do this above.
6069 list_del(&peer
->list
);
6070 ar
->peer_map
[i
] = NULL
;
6075 spin_unlock_bh(&ar
->data_lock
);
6077 for (i
= 0; i
< ARRAY_SIZE(sta
->txq
); i
++)
6078 ath10k_mac_txq_unref(ar
, sta
->txq
[i
]);
6083 if (ath10k_mac_tdls_vif_stations_count(hw
, vif
))
6086 /* This was the last tdls peer in current vif */
6087 ret
= ath10k_wmi_update_fw_tdls_state(ar
, arvif
->vdev_id
,
6090 ath10k_warn(ar
, "failed to update fw tdls state on vdev %i: %i\n",
6091 arvif
->vdev_id
, ret
);
6093 } else if (old_state
== IEEE80211_STA_AUTH
&&
6094 new_state
== IEEE80211_STA_ASSOC
&&
6095 (vif
->type
== NL80211_IFTYPE_AP
||
6096 vif
->type
== NL80211_IFTYPE_MESH_POINT
||
6097 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
6101 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac sta %pM associated\n",
6104 ret
= ath10k_station_assoc(ar
, vif
, sta
, false);
6106 ath10k_warn(ar
, "failed to associate station %pM for vdev %i: %i\n",
6107 sta
->addr
, arvif
->vdev_id
, ret
);
6108 } else if (old_state
== IEEE80211_STA_ASSOC
&&
6109 new_state
== IEEE80211_STA_AUTHORIZED
&&
6112 * Tdls station authorized.
6114 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac tdls sta %pM authorized\n",
6117 ret
= ath10k_station_assoc(ar
, vif
, sta
, false);
6119 ath10k_warn(ar
, "failed to associate tdls station %pM for vdev %i: %i\n",
6120 sta
->addr
, arvif
->vdev_id
, ret
);
6124 ret
= ath10k_mac_tdls_peer_update(ar
, arvif
->vdev_id
, sta
,
6125 WMI_TDLS_PEER_STATE_CONNECTED
);
6127 ath10k_warn(ar
, "failed to update tdls peer %pM for vdev %i: %i\n",
6128 sta
->addr
, arvif
->vdev_id
, ret
);
6129 } else if (old_state
== IEEE80211_STA_ASSOC
&&
6130 new_state
== IEEE80211_STA_AUTH
&&
6131 (vif
->type
== NL80211_IFTYPE_AP
||
6132 vif
->type
== NL80211_IFTYPE_MESH_POINT
||
6133 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
6137 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac sta %pM disassociated\n",
6140 ret
= ath10k_station_disassoc(ar
, vif
, sta
);
6142 ath10k_warn(ar
, "failed to disassociate station: %pM vdev %i: %i\n",
6143 sta
->addr
, arvif
->vdev_id
, ret
);
6146 mutex_unlock(&ar
->conf_mutex
);
6150 static int ath10k_conf_tx_uapsd(struct ath10k
*ar
, struct ieee80211_vif
*vif
,
6151 u16 ac
, bool enable
)
6153 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
6154 struct wmi_sta_uapsd_auto_trig_arg arg
= {};
6155 u32 prio
= 0, acc
= 0;
6159 lockdep_assert_held(&ar
->conf_mutex
);
6161 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
6165 case IEEE80211_AC_VO
:
6166 value
= WMI_STA_PS_UAPSD_AC3_DELIVERY_EN
|
6167 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN
;
6171 case IEEE80211_AC_VI
:
6172 value
= WMI_STA_PS_UAPSD_AC2_DELIVERY_EN
|
6173 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN
;
6177 case IEEE80211_AC_BE
:
6178 value
= WMI_STA_PS_UAPSD_AC1_DELIVERY_EN
|
6179 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN
;
6183 case IEEE80211_AC_BK
:
6184 value
= WMI_STA_PS_UAPSD_AC0_DELIVERY_EN
|
6185 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN
;
6192 arvif
->u
.sta
.uapsd
|= value
;
6194 arvif
->u
.sta
.uapsd
&= ~value
;
6196 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
6197 WMI_STA_PS_PARAM_UAPSD
,
6198 arvif
->u
.sta
.uapsd
);
6200 ath10k_warn(ar
, "failed to set uapsd params: %d\n", ret
);
6204 if (arvif
->u
.sta
.uapsd
)
6205 value
= WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD
;
6207 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
6209 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
6210 WMI_STA_PS_PARAM_RX_WAKE_POLICY
,
6213 ath10k_warn(ar
, "failed to set rx wake param: %d\n", ret
);
6215 ret
= ath10k_mac_vif_recalc_ps_wake_threshold(arvif
);
6217 ath10k_warn(ar
, "failed to recalc ps wake threshold on vdev %i: %d\n",
6218 arvif
->vdev_id
, ret
);
6222 ret
= ath10k_mac_vif_recalc_ps_poll_count(arvif
);
6224 ath10k_warn(ar
, "failed to recalc ps poll count on vdev %i: %d\n",
6225 arvif
->vdev_id
, ret
);
6229 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG
, ar
->wmi
.svc_map
) ||
6230 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG
, ar
->wmi
.svc_map
)) {
6231 /* Only userspace can make an educated decision when to send
6232 * trigger frame. The following effectively disables u-UAPSD
6233 * autotrigger in firmware (which is enabled by default
6234 * provided the autotrigger service is available).
6238 arg
.user_priority
= prio
;
6239 arg
.service_interval
= 0;
6240 arg
.suspend_interval
= WMI_STA_UAPSD_MAX_INTERVAL_MSEC
;
6241 arg
.delay_interval
= WMI_STA_UAPSD_MAX_INTERVAL_MSEC
;
6243 ret
= ath10k_wmi_vdev_sta_uapsd(ar
, arvif
->vdev_id
,
6244 arvif
->bssid
, &arg
, 1);
6246 ath10k_warn(ar
, "failed to set uapsd auto trigger %d\n",
6256 static int ath10k_conf_tx(struct ieee80211_hw
*hw
,
6257 struct ieee80211_vif
*vif
, u16 ac
,
6258 const struct ieee80211_tx_queue_params
*params
)
6260 struct ath10k
*ar
= hw
->priv
;
6261 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
6262 struct wmi_wmm_params_arg
*p
= NULL
;
6265 mutex_lock(&ar
->conf_mutex
);
6268 case IEEE80211_AC_VO
:
6269 p
= &arvif
->wmm_params
.ac_vo
;
6271 case IEEE80211_AC_VI
:
6272 p
= &arvif
->wmm_params
.ac_vi
;
6274 case IEEE80211_AC_BE
:
6275 p
= &arvif
->wmm_params
.ac_be
;
6277 case IEEE80211_AC_BK
:
6278 p
= &arvif
->wmm_params
.ac_bk
;
6287 p
->cwmin
= params
->cw_min
;
6288 p
->cwmax
= params
->cw_max
;
6289 p
->aifs
= params
->aifs
;
6292 * The channel time duration programmed in the HW is in absolute
6293 * microseconds, while mac80211 gives the txop in units of
6296 p
->txop
= params
->txop
* 32;
6298 if (ar
->wmi
.ops
->gen_vdev_wmm_conf
) {
6299 ret
= ath10k_wmi_vdev_wmm_conf(ar
, arvif
->vdev_id
,
6300 &arvif
->wmm_params
);
6302 ath10k_warn(ar
, "failed to set vdev wmm params on vdev %i: %d\n",
6303 arvif
->vdev_id
, ret
);
6307 /* This won't work well with multi-interface cases but it's
6308 * better than nothing.
6310 ret
= ath10k_wmi_pdev_set_wmm_params(ar
, &arvif
->wmm_params
);
6312 ath10k_warn(ar
, "failed to set wmm params: %d\n", ret
);
6317 ret
= ath10k_conf_tx_uapsd(ar
, vif
, ac
, params
->uapsd
);
6319 ath10k_warn(ar
, "failed to set sta uapsd: %d\n", ret
);
6322 mutex_unlock(&ar
->conf_mutex
);
6326 #define ATH10K_ROC_TIMEOUT_HZ (2 * HZ)
6328 static int ath10k_remain_on_channel(struct ieee80211_hw
*hw
,
6329 struct ieee80211_vif
*vif
,
6330 struct ieee80211_channel
*chan
,
6332 enum ieee80211_roc_type type
)
6334 struct ath10k
*ar
= hw
->priv
;
6335 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
6336 struct wmi_start_scan_arg arg
;
6340 mutex_lock(&ar
->conf_mutex
);
6342 spin_lock_bh(&ar
->data_lock
);
6343 switch (ar
->scan
.state
) {
6344 case ATH10K_SCAN_IDLE
:
6345 reinit_completion(&ar
->scan
.started
);
6346 reinit_completion(&ar
->scan
.completed
);
6347 reinit_completion(&ar
->scan
.on_channel
);
6348 ar
->scan
.state
= ATH10K_SCAN_STARTING
;
6349 ar
->scan
.is_roc
= true;
6350 ar
->scan
.vdev_id
= arvif
->vdev_id
;
6351 ar
->scan
.roc_freq
= chan
->center_freq
;
6352 ar
->scan
.roc_notify
= true;
6355 case ATH10K_SCAN_STARTING
:
6356 case ATH10K_SCAN_RUNNING
:
6357 case ATH10K_SCAN_ABORTING
:
6361 spin_unlock_bh(&ar
->data_lock
);
6366 scan_time_msec
= ar
->hw
->wiphy
->max_remain_on_channel_duration
* 2;
6368 memset(&arg
, 0, sizeof(arg
));
6369 ath10k_wmi_start_scan_init(ar
, &arg
);
6370 arg
.vdev_id
= arvif
->vdev_id
;
6371 arg
.scan_id
= ATH10K_SCAN_ID
;
6373 arg
.channels
[0] = chan
->center_freq
;
6374 arg
.dwell_time_active
= scan_time_msec
;
6375 arg
.dwell_time_passive
= scan_time_msec
;
6376 arg
.max_scan_time
= scan_time_msec
;
6377 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
6378 arg
.scan_ctrl_flags
|= WMI_SCAN_FILTER_PROBE_REQ
;
6379 arg
.burst_duration_ms
= duration
;
6381 ret
= ath10k_start_scan(ar
, &arg
);
6383 ath10k_warn(ar
, "failed to start roc scan: %d\n", ret
);
6384 spin_lock_bh(&ar
->data_lock
);
6385 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
6386 spin_unlock_bh(&ar
->data_lock
);
6390 ret
= wait_for_completion_timeout(&ar
->scan
.on_channel
, 3 * HZ
);
6392 ath10k_warn(ar
, "failed to switch to channel for roc scan\n");
6394 ret
= ath10k_scan_stop(ar
);
6396 ath10k_warn(ar
, "failed to stop scan: %d\n", ret
);
6402 ieee80211_queue_delayed_work(ar
->hw
, &ar
->scan
.timeout
,
6403 msecs_to_jiffies(duration
));
6407 mutex_unlock(&ar
->conf_mutex
);
6411 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw
*hw
)
6413 struct ath10k
*ar
= hw
->priv
;
6415 mutex_lock(&ar
->conf_mutex
);
6417 spin_lock_bh(&ar
->data_lock
);
6418 ar
->scan
.roc_notify
= false;
6419 spin_unlock_bh(&ar
->data_lock
);
6421 ath10k_scan_abort(ar
);
6423 mutex_unlock(&ar
->conf_mutex
);
6425 cancel_delayed_work_sync(&ar
->scan
.timeout
);
6431 * Both RTS and Fragmentation threshold are interface-specific
6432 * in ath10k, but device-specific in mac80211.
6435 static int ath10k_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
6437 struct ath10k
*ar
= hw
->priv
;
6438 struct ath10k_vif
*arvif
;
6441 mutex_lock(&ar
->conf_mutex
);
6442 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
6443 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d rts threshold %d\n",
6444 arvif
->vdev_id
, value
);
6446 ret
= ath10k_mac_set_rts(arvif
, value
);
6448 ath10k_warn(ar
, "failed to set rts threshold for vdev %d: %d\n",
6449 arvif
->vdev_id
, ret
);
6453 mutex_unlock(&ar
->conf_mutex
);
6458 static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw
*hw
, u32 value
)
6460 /* Even though there's a WMI enum for fragmentation threshold no known
6461 * firmware actually implements it. Moreover it is not possible to rely
6462 * frame fragmentation to mac80211 because firmware clears the "more
6463 * fragments" bit in frame control making it impossible for remote
6464 * devices to reassemble frames.
6466 * Hence implement a dummy callback just to say fragmentation isn't
6467 * supported. This effectively prevents mac80211 from doing frame
6468 * fragmentation in software.
6473 static void ath10k_flush(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
6474 u32 queues
, bool drop
)
6476 struct ath10k
*ar
= hw
->priv
;
6480 /* mac80211 doesn't care if we really xmit queued frames or not
6481 * we'll collect those frames either way if we stop/delete vdevs */
6485 mutex_lock(&ar
->conf_mutex
);
6487 if (ar
->state
== ATH10K_STATE_WEDGED
)
6490 time_left
= wait_event_timeout(ar
->htt
.empty_tx_wq
, ({
6493 spin_lock_bh(&ar
->htt
.tx_lock
);
6494 empty
= (ar
->htt
.num_pending_tx
== 0);
6495 spin_unlock_bh(&ar
->htt
.tx_lock
);
6497 skip
= (ar
->state
== ATH10K_STATE_WEDGED
) ||
6498 test_bit(ATH10K_FLAG_CRASH_FLUSH
,
6502 }), ATH10K_FLUSH_TIMEOUT_HZ
);
6504 if (time_left
== 0 || skip
)
6505 ath10k_warn(ar
, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
6506 skip
, ar
->state
, time_left
);
6509 mutex_unlock(&ar
->conf_mutex
);
6512 /* TODO: Implement this function properly
6513 * For now it is needed to reply to Probe Requests in IBSS mode.
6514 * Propably we need this information from FW.
6516 static int ath10k_tx_last_beacon(struct ieee80211_hw
*hw
)
6521 static void ath10k_reconfig_complete(struct ieee80211_hw
*hw
,
6522 enum ieee80211_reconfig_type reconfig_type
)
6524 struct ath10k
*ar
= hw
->priv
;
6526 if (reconfig_type
!= IEEE80211_RECONFIG_TYPE_RESTART
)
6529 mutex_lock(&ar
->conf_mutex
);
6531 /* If device failed to restart it will be in a different state, e.g.
6532 * ATH10K_STATE_WEDGED */
6533 if (ar
->state
== ATH10K_STATE_RESTARTED
) {
6534 ath10k_info(ar
, "device successfully recovered\n");
6535 ar
->state
= ATH10K_STATE_ON
;
6536 ieee80211_wake_queues(ar
->hw
);
6539 mutex_unlock(&ar
->conf_mutex
);
6543 ath10k_mac_update_bss_chan_survey(struct ath10k
*ar
,
6544 struct ieee80211_channel
*channel
)
6547 enum wmi_bss_survey_req_type type
= WMI_BSS_SURVEY_REQ_TYPE_READ_CLEAR
;
6549 lockdep_assert_held(&ar
->conf_mutex
);
6551 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64
, ar
->wmi
.svc_map
) ||
6552 (ar
->rx_channel
!= channel
))
6555 if (ar
->scan
.state
!= ATH10K_SCAN_IDLE
) {
6556 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "ignoring bss chan info request while scanning..\n");
6560 reinit_completion(&ar
->bss_survey_done
);
6562 ret
= ath10k_wmi_pdev_bss_chan_info_request(ar
, type
);
6564 ath10k_warn(ar
, "failed to send pdev bss chan info request\n");
6568 ret
= wait_for_completion_timeout(&ar
->bss_survey_done
, 3 * HZ
);
6570 ath10k_warn(ar
, "bss channel survey timed out\n");
6575 static int ath10k_get_survey(struct ieee80211_hw
*hw
, int idx
,
6576 struct survey_info
*survey
)
6578 struct ath10k
*ar
= hw
->priv
;
6579 struct ieee80211_supported_band
*sband
;
6580 struct survey_info
*ar_survey
= &ar
->survey
[idx
];
6583 mutex_lock(&ar
->conf_mutex
);
6585 sband
= hw
->wiphy
->bands
[NL80211_BAND_2GHZ
];
6586 if (sband
&& idx
>= sband
->n_channels
) {
6587 idx
-= sband
->n_channels
;
6592 sband
= hw
->wiphy
->bands
[NL80211_BAND_5GHZ
];
6594 if (!sband
|| idx
>= sband
->n_channels
) {
6599 ath10k_mac_update_bss_chan_survey(ar
, &sband
->channels
[idx
]);
6601 spin_lock_bh(&ar
->data_lock
);
6602 memcpy(survey
, ar_survey
, sizeof(*survey
));
6603 spin_unlock_bh(&ar
->data_lock
);
6605 survey
->channel
= &sband
->channels
[idx
];
6607 if (ar
->rx_channel
== survey
->channel
)
6608 survey
->filled
|= SURVEY_INFO_IN_USE
;
6611 mutex_unlock(&ar
->conf_mutex
);
6616 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k
*ar
,
6617 enum nl80211_band band
,
6618 const struct cfg80211_bitrate_mask
*mask
)
6623 num_rates
+= hweight32(mask
->control
[band
].legacy
);
6625 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].ht_mcs
); i
++)
6626 num_rates
+= hweight8(mask
->control
[band
].ht_mcs
[i
]);
6628 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].vht_mcs
); i
++)
6629 num_rates
+= hweight16(mask
->control
[band
].vht_mcs
[i
]);
6631 return num_rates
== 1;
6635 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k
*ar
,
6636 enum nl80211_band band
,
6637 const struct cfg80211_bitrate_mask
*mask
,
6640 struct ieee80211_supported_band
*sband
= &ar
->mac
.sbands
[band
];
6641 u16 vht_mcs_map
= le16_to_cpu(sband
->vht_cap
.vht_mcs
.tx_mcs_map
);
6643 u8 vht_nss_mask
= 0;
6646 if (mask
->control
[band
].legacy
)
6649 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].ht_mcs
); i
++) {
6650 if (mask
->control
[band
].ht_mcs
[i
] == 0)
6652 else if (mask
->control
[band
].ht_mcs
[i
] ==
6653 sband
->ht_cap
.mcs
.rx_mask
[i
])
6654 ht_nss_mask
|= BIT(i
);
6659 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].vht_mcs
); i
++) {
6660 if (mask
->control
[band
].vht_mcs
[i
] == 0)
6662 else if (mask
->control
[band
].vht_mcs
[i
] ==
6663 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map
, i
))
6664 vht_nss_mask
|= BIT(i
);
6669 if (ht_nss_mask
!= vht_nss_mask
)
6672 if (ht_nss_mask
== 0)
6675 if (BIT(fls(ht_nss_mask
)) - 1 != ht_nss_mask
)
6678 *nss
= fls(ht_nss_mask
);
6684 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k
*ar
,
6685 enum nl80211_band band
,
6686 const struct cfg80211_bitrate_mask
*mask
,
6689 struct ieee80211_supported_band
*sband
= &ar
->mac
.sbands
[band
];
6696 if (hweight32(mask
->control
[band
].legacy
) == 1) {
6697 rate_idx
= ffs(mask
->control
[band
].legacy
) - 1;
6699 hw_rate
= sband
->bitrates
[rate_idx
].hw_value
;
6700 bitrate
= sband
->bitrates
[rate_idx
].bitrate
;
6702 if (ath10k_mac_bitrate_is_cck(bitrate
))
6703 preamble
= WMI_RATE_PREAMBLE_CCK
;
6705 preamble
= WMI_RATE_PREAMBLE_OFDM
;
6708 *rate
= preamble
<< 6 |
6715 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].ht_mcs
); i
++) {
6716 if (hweight8(mask
->control
[band
].ht_mcs
[i
]) == 1) {
6718 *rate
= WMI_RATE_PREAMBLE_HT
<< 6 |
6720 (ffs(mask
->control
[band
].ht_mcs
[i
]) - 1);
6726 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].vht_mcs
); i
++) {
6727 if (hweight16(mask
->control
[band
].vht_mcs
[i
]) == 1) {
6729 *rate
= WMI_RATE_PREAMBLE_VHT
<< 6 |
6731 (ffs(mask
->control
[band
].vht_mcs
[i
]) - 1);
6740 static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif
*arvif
,
6741 u8 rate
, u8 nss
, u8 sgi
, u8 ldpc
)
6743 struct ath10k
*ar
= arvif
->ar
;
6747 lockdep_assert_held(&ar
->conf_mutex
);
6749 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
6750 arvif
->vdev_id
, rate
, nss
, sgi
);
6752 vdev_param
= ar
->wmi
.vdev_param
->fixed_rate
;
6753 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, rate
);
6755 ath10k_warn(ar
, "failed to set fixed rate param 0x%02x: %d\n",
6760 vdev_param
= ar
->wmi
.vdev_param
->nss
;
6761 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, nss
);
6763 ath10k_warn(ar
, "failed to set nss param %d: %d\n", nss
, ret
);
6767 vdev_param
= ar
->wmi
.vdev_param
->sgi
;
6768 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, sgi
);
6770 ath10k_warn(ar
, "failed to set sgi param %d: %d\n", sgi
, ret
);
6774 vdev_param
= ar
->wmi
.vdev_param
->ldpc
;
6775 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, ldpc
);
6777 ath10k_warn(ar
, "failed to set ldpc param %d: %d\n", ldpc
, ret
);
6785 ath10k_mac_can_set_bitrate_mask(struct ath10k
*ar
,
6786 enum nl80211_band band
,
6787 const struct cfg80211_bitrate_mask
*mask
)
6792 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6793 * to express all VHT MCS rate masks. Effectively only the following
6794 * ranges can be used: none, 0-7, 0-8 and 0-9.
6796 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++) {
6797 vht_mcs
= mask
->control
[band
].vht_mcs
[i
];
6806 ath10k_warn(ar
, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6814 static void ath10k_mac_set_bitrate_mask_iter(void *data
,
6815 struct ieee80211_sta
*sta
)
6817 struct ath10k_vif
*arvif
= data
;
6818 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
6819 struct ath10k
*ar
= arvif
->ar
;
6821 if (arsta
->arvif
!= arvif
)
6824 spin_lock_bh(&ar
->data_lock
);
6825 arsta
->changed
|= IEEE80211_RC_SUPP_RATES_CHANGED
;
6826 spin_unlock_bh(&ar
->data_lock
);
6828 ieee80211_queue_work(ar
->hw
, &arsta
->update_wk
);
6831 static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw
*hw
,
6832 struct ieee80211_vif
*vif
,
6833 const struct cfg80211_bitrate_mask
*mask
)
6835 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
6836 struct cfg80211_chan_def def
;
6837 struct ath10k
*ar
= arvif
->ar
;
6838 enum nl80211_band band
;
6839 const u8
*ht_mcs_mask
;
6840 const u16
*vht_mcs_mask
;
6848 if (ath10k_mac_vif_chan(vif
, &def
))
6851 band
= def
.chan
->band
;
6852 ht_mcs_mask
= mask
->control
[band
].ht_mcs
;
6853 vht_mcs_mask
= mask
->control
[band
].vht_mcs
;
6854 ldpc
= !!(ar
->ht_cap_info
& WMI_HT_CAP_LDPC
);
6856 sgi
= mask
->control
[band
].gi
;
6857 if (sgi
== NL80211_TXRATE_FORCE_LGI
)
6860 if (ath10k_mac_bitrate_mask_has_single_rate(ar
, band
, mask
)) {
6861 ret
= ath10k_mac_bitrate_mask_get_single_rate(ar
, band
, mask
,
6864 ath10k_warn(ar
, "failed to get single rate for vdev %i: %d\n",
6865 arvif
->vdev_id
, ret
);
6868 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar
, band
, mask
,
6870 rate
= WMI_FIXED_RATE_NONE
;
6873 rate
= WMI_FIXED_RATE_NONE
;
6874 nss
= min(ar
->num_rf_chains
,
6875 max(ath10k_mac_max_ht_nss(ht_mcs_mask
),
6876 ath10k_mac_max_vht_nss(vht_mcs_mask
)));
6878 if (!ath10k_mac_can_set_bitrate_mask(ar
, band
, mask
))
6881 mutex_lock(&ar
->conf_mutex
);
6883 arvif
->bitrate_mask
= *mask
;
6884 ieee80211_iterate_stations_atomic(ar
->hw
,
6885 ath10k_mac_set_bitrate_mask_iter
,
6888 mutex_unlock(&ar
->conf_mutex
);
6891 mutex_lock(&ar
->conf_mutex
);
6893 ret
= ath10k_mac_set_fixed_rate_params(arvif
, rate
, nss
, sgi
, ldpc
);
6895 ath10k_warn(ar
, "failed to set fixed rate params on vdev %i: %d\n",
6896 arvif
->vdev_id
, ret
);
6901 mutex_unlock(&ar
->conf_mutex
);
6906 static void ath10k_sta_rc_update(struct ieee80211_hw
*hw
,
6907 struct ieee80211_vif
*vif
,
6908 struct ieee80211_sta
*sta
,
6911 struct ath10k
*ar
= hw
->priv
;
6912 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
6915 spin_lock_bh(&ar
->data_lock
);
6917 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
6918 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
6919 sta
->addr
, changed
, sta
->bandwidth
, sta
->rx_nss
,
6922 if (changed
& IEEE80211_RC_BW_CHANGED
) {
6923 bw
= WMI_PEER_CHWIDTH_20MHZ
;
6925 switch (sta
->bandwidth
) {
6926 case IEEE80211_STA_RX_BW_20
:
6927 bw
= WMI_PEER_CHWIDTH_20MHZ
;
6929 case IEEE80211_STA_RX_BW_40
:
6930 bw
= WMI_PEER_CHWIDTH_40MHZ
;
6932 case IEEE80211_STA_RX_BW_80
:
6933 bw
= WMI_PEER_CHWIDTH_80MHZ
;
6935 case IEEE80211_STA_RX_BW_160
:
6936 ath10k_warn(ar
, "Invalid bandwidth %d in rc update for %pM\n",
6937 sta
->bandwidth
, sta
->addr
);
6938 bw
= WMI_PEER_CHWIDTH_20MHZ
;
6945 if (changed
& IEEE80211_RC_NSS_CHANGED
)
6946 arsta
->nss
= sta
->rx_nss
;
6948 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
6949 smps
= WMI_PEER_SMPS_PS_NONE
;
6951 switch (sta
->smps_mode
) {
6952 case IEEE80211_SMPS_AUTOMATIC
:
6953 case IEEE80211_SMPS_OFF
:
6954 smps
= WMI_PEER_SMPS_PS_NONE
;
6956 case IEEE80211_SMPS_STATIC
:
6957 smps
= WMI_PEER_SMPS_STATIC
;
6959 case IEEE80211_SMPS_DYNAMIC
:
6960 smps
= WMI_PEER_SMPS_DYNAMIC
;
6962 case IEEE80211_SMPS_NUM_MODES
:
6963 ath10k_warn(ar
, "Invalid smps %d in sta rc update for %pM\n",
6964 sta
->smps_mode
, sta
->addr
);
6965 smps
= WMI_PEER_SMPS_PS_NONE
;
6972 arsta
->changed
|= changed
;
6974 spin_unlock_bh(&ar
->data_lock
);
6976 ieee80211_queue_work(hw
, &arsta
->update_wk
);
6979 static u64
ath10k_get_tsf(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
)
6982 * FIXME: Return 0 for time being. Need to figure out whether FW
6983 * has the API to fetch 64-bit local TSF
6989 static void ath10k_set_tsf(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
6992 struct ath10k
*ar
= hw
->priv
;
6993 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
6994 u32 tsf_offset
, vdev_param
= ar
->wmi
.vdev_param
->set_tsf
;
6999 * Given tsf argument is entire TSF value, but firmware accepts
7000 * only TSF offset to current TSF.
7002 * get_tsf function is used to get offset value, however since
7003 * ath10k_get_tsf is not implemented properly, it will return 0 always.
7004 * Luckily all the caller functions to set_tsf, as of now, also rely on
7005 * get_tsf function to get entire tsf value such get_tsf() + tsf_delta,
7006 * final tsf offset value to firmware will be arithmetically correct.
7008 tsf_offset
= tsf
- ath10k_get_tsf(hw
, vif
);
7009 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
7010 vdev_param
, tsf_offset
);
7011 if (ret
&& ret
!= -EOPNOTSUPP
)
7012 ath10k_warn(ar
, "failed to set tsf offset: %d\n", ret
);
7015 static int ath10k_ampdu_action(struct ieee80211_hw
*hw
,
7016 struct ieee80211_vif
*vif
,
7017 struct ieee80211_ampdu_params
*params
)
7019 struct ath10k
*ar
= hw
->priv
;
7020 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
7021 struct ieee80211_sta
*sta
= params
->sta
;
7022 enum ieee80211_ampdu_mlme_action action
= params
->action
;
7023 u16 tid
= params
->tid
;
7025 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
7026 arvif
->vdev_id
, sta
->addr
, tid
, action
);
7029 case IEEE80211_AMPDU_RX_START
:
7030 case IEEE80211_AMPDU_RX_STOP
:
7031 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
7032 * creation/removal. Do we need to verify this?
7035 case IEEE80211_AMPDU_TX_START
:
7036 case IEEE80211_AMPDU_TX_STOP_CONT
:
7037 case IEEE80211_AMPDU_TX_STOP_FLUSH
:
7038 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT
:
7039 case IEEE80211_AMPDU_TX_OPERATIONAL
:
7040 /* Firmware offloads Tx aggregation entirely so deny mac80211
7041 * Tx aggregation requests.
7050 ath10k_mac_update_rx_channel(struct ath10k
*ar
,
7051 struct ieee80211_chanctx_conf
*ctx
,
7052 struct ieee80211_vif_chanctx_switch
*vifs
,
7055 struct cfg80211_chan_def
*def
= NULL
;
7057 /* Both locks are required because ar->rx_channel is modified. This
7058 * allows readers to hold either lock.
7060 lockdep_assert_held(&ar
->conf_mutex
);
7061 lockdep_assert_held(&ar
->data_lock
);
7063 WARN_ON(ctx
&& vifs
);
7064 WARN_ON(vifs
&& n_vifs
!= 1);
7066 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
7067 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
7068 * ppdu on Rx may reduce performance on low-end systems. It should be
7069 * possible to make tables/hashmaps to speed the lookup up (be vary of
7070 * cpu data cache lines though regarding sizes) but to keep the initial
7071 * implementation simple and less intrusive fallback to the slow lookup
7072 * only for multi-channel cases. Single-channel cases will remain to
7073 * use the old channel derival and thus performance should not be
7077 if (!ctx
&& ath10k_mac_num_chanctxs(ar
) == 1) {
7078 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
7079 ath10k_mac_get_any_chandef_iter
,
7083 def
= &vifs
[0].new_ctx
->def
;
7085 ar
->rx_channel
= def
->chan
;
7086 } else if ((ctx
&& ath10k_mac_num_chanctxs(ar
) == 0) ||
7087 (ctx
&& (ar
->state
== ATH10K_STATE_RESTARTED
))) {
7088 /* During driver restart due to firmware assert, since mac80211
7089 * already has valid channel context for given radio, channel
7090 * context iteration return num_chanctx > 0. So fix rx_channel
7091 * when restart is in progress.
7093 ar
->rx_channel
= ctx
->def
.chan
;
7095 ar
->rx_channel
= NULL
;
7101 ath10k_mac_update_vif_chan(struct ath10k
*ar
,
7102 struct ieee80211_vif_chanctx_switch
*vifs
,
7105 struct ath10k_vif
*arvif
;
7109 lockdep_assert_held(&ar
->conf_mutex
);
7111 /* First stop monitor interface. Some FW versions crash if there's a
7112 * lone monitor interface.
7114 if (ar
->monitor_started
)
7115 ath10k_monitor_stop(ar
);
7117 for (i
= 0; i
< n_vifs
; i
++) {
7118 arvif
= ath10k_vif_to_arvif(vifs
[i
].vif
);
7120 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7121 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
7123 vifs
[i
].old_ctx
->def
.chan
->center_freq
,
7124 vifs
[i
].new_ctx
->def
.chan
->center_freq
,
7125 vifs
[i
].old_ctx
->def
.width
,
7126 vifs
[i
].new_ctx
->def
.width
);
7128 if (WARN_ON(!arvif
->is_started
))
7131 if (WARN_ON(!arvif
->is_up
))
7134 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
7136 ath10k_warn(ar
, "failed to down vdev %d: %d\n",
7137 arvif
->vdev_id
, ret
);
7142 /* All relevant vdevs are downed and associated channel resources
7143 * should be available for the channel switch now.
7146 spin_lock_bh(&ar
->data_lock
);
7147 ath10k_mac_update_rx_channel(ar
, NULL
, vifs
, n_vifs
);
7148 spin_unlock_bh(&ar
->data_lock
);
7150 for (i
= 0; i
< n_vifs
; i
++) {
7151 arvif
= ath10k_vif_to_arvif(vifs
[i
].vif
);
7153 if (WARN_ON(!arvif
->is_started
))
7156 if (WARN_ON(!arvif
->is_up
))
7159 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
7161 ath10k_warn(ar
, "failed to update bcn tmpl during csa: %d\n",
7164 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
7166 ath10k_warn(ar
, "failed to update prb tmpl during csa: %d\n",
7169 ret
= ath10k_vdev_restart(arvif
, &vifs
[i
].new_ctx
->def
);
7171 ath10k_warn(ar
, "failed to restart vdev %d: %d\n",
7172 arvif
->vdev_id
, ret
);
7176 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
7179 ath10k_warn(ar
, "failed to bring vdev up %d: %d\n",
7180 arvif
->vdev_id
, ret
);
7185 ath10k_monitor_recalc(ar
);
7189 ath10k_mac_op_add_chanctx(struct ieee80211_hw
*hw
,
7190 struct ieee80211_chanctx_conf
*ctx
)
7192 struct ath10k
*ar
= hw
->priv
;
7194 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7195 "mac chanctx add freq %hu width %d ptr %pK\n",
7196 ctx
->def
.chan
->center_freq
, ctx
->def
.width
, ctx
);
7198 mutex_lock(&ar
->conf_mutex
);
7200 spin_lock_bh(&ar
->data_lock
);
7201 ath10k_mac_update_rx_channel(ar
, ctx
, NULL
, 0);
7202 spin_unlock_bh(&ar
->data_lock
);
7204 ath10k_recalc_radar_detection(ar
);
7205 ath10k_monitor_recalc(ar
);
7207 mutex_unlock(&ar
->conf_mutex
);
7213 ath10k_mac_op_remove_chanctx(struct ieee80211_hw
*hw
,
7214 struct ieee80211_chanctx_conf
*ctx
)
7216 struct ath10k
*ar
= hw
->priv
;
7218 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7219 "mac chanctx remove freq %hu width %d ptr %pK\n",
7220 ctx
->def
.chan
->center_freq
, ctx
->def
.width
, ctx
);
7222 mutex_lock(&ar
->conf_mutex
);
7224 spin_lock_bh(&ar
->data_lock
);
7225 ath10k_mac_update_rx_channel(ar
, NULL
, NULL
, 0);
7226 spin_unlock_bh(&ar
->data_lock
);
7228 ath10k_recalc_radar_detection(ar
);
7229 ath10k_monitor_recalc(ar
);
7231 mutex_unlock(&ar
->conf_mutex
);
7234 struct ath10k_mac_change_chanctx_arg
{
7235 struct ieee80211_chanctx_conf
*ctx
;
7236 struct ieee80211_vif_chanctx_switch
*vifs
;
7242 ath10k_mac_change_chanctx_cnt_iter(void *data
, u8
*mac
,
7243 struct ieee80211_vif
*vif
)
7245 struct ath10k_mac_change_chanctx_arg
*arg
= data
;
7247 if (rcu_access_pointer(vif
->chanctx_conf
) != arg
->ctx
)
7254 ath10k_mac_change_chanctx_fill_iter(void *data
, u8
*mac
,
7255 struct ieee80211_vif
*vif
)
7257 struct ath10k_mac_change_chanctx_arg
*arg
= data
;
7258 struct ieee80211_chanctx_conf
*ctx
;
7260 ctx
= rcu_access_pointer(vif
->chanctx_conf
);
7261 if (ctx
!= arg
->ctx
)
7264 if (WARN_ON(arg
->next_vif
== arg
->n_vifs
))
7267 arg
->vifs
[arg
->next_vif
].vif
= vif
;
7268 arg
->vifs
[arg
->next_vif
].old_ctx
= ctx
;
7269 arg
->vifs
[arg
->next_vif
].new_ctx
= ctx
;
7274 ath10k_mac_op_change_chanctx(struct ieee80211_hw
*hw
,
7275 struct ieee80211_chanctx_conf
*ctx
,
7278 struct ath10k
*ar
= hw
->priv
;
7279 struct ath10k_mac_change_chanctx_arg arg
= { .ctx
= ctx
};
7281 mutex_lock(&ar
->conf_mutex
);
7283 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7284 "mac chanctx change freq %hu width %d ptr %pK changed %x\n",
7285 ctx
->def
.chan
->center_freq
, ctx
->def
.width
, ctx
, changed
);
7287 /* This shouldn't really happen because channel switching should use
7288 * switch_vif_chanctx().
7290 if (WARN_ON(changed
& IEEE80211_CHANCTX_CHANGE_CHANNEL
))
7293 if (changed
& IEEE80211_CHANCTX_CHANGE_WIDTH
) {
7294 ieee80211_iterate_active_interfaces_atomic(
7296 IEEE80211_IFACE_ITER_NORMAL
,
7297 ath10k_mac_change_chanctx_cnt_iter
,
7299 if (arg
.n_vifs
== 0)
7302 arg
.vifs
= kcalloc(arg
.n_vifs
, sizeof(arg
.vifs
[0]),
7307 ieee80211_iterate_active_interfaces_atomic(
7309 IEEE80211_IFACE_ITER_NORMAL
,
7310 ath10k_mac_change_chanctx_fill_iter
,
7312 ath10k_mac_update_vif_chan(ar
, arg
.vifs
, arg
.n_vifs
);
7317 ath10k_recalc_radar_detection(ar
);
7319 /* FIXME: How to configure Rx chains properly? */
7321 /* No other actions are actually necessary. Firmware maintains channel
7322 * definitions per vdev internally and there's no host-side channel
7323 * context abstraction to configure, e.g. channel width.
7327 mutex_unlock(&ar
->conf_mutex
);
7331 ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw
*hw
,
7332 struct ieee80211_vif
*vif
,
7333 struct ieee80211_chanctx_conf
*ctx
)
7335 struct ath10k
*ar
= hw
->priv
;
7336 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7339 mutex_lock(&ar
->conf_mutex
);
7341 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7342 "mac chanctx assign ptr %pK vdev_id %i\n",
7343 ctx
, arvif
->vdev_id
);
7345 if (WARN_ON(arvif
->is_started
)) {
7346 mutex_unlock(&ar
->conf_mutex
);
7350 ret
= ath10k_vdev_start(arvif
, &ctx
->def
);
7352 ath10k_warn(ar
, "failed to start vdev %i addr %pM on freq %d: %d\n",
7353 arvif
->vdev_id
, vif
->addr
,
7354 ctx
->def
.chan
->center_freq
, ret
);
7358 arvif
->is_started
= true;
7360 ret
= ath10k_mac_vif_setup_ps(arvif
);
7362 ath10k_warn(ar
, "failed to update vdev %i ps: %d\n",
7363 arvif
->vdev_id
, ret
);
7367 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
7368 ret
= ath10k_wmi_vdev_up(ar
, arvif
->vdev_id
, 0, vif
->addr
);
7370 ath10k_warn(ar
, "failed to up monitor vdev %i: %d\n",
7371 arvif
->vdev_id
, ret
);
7375 arvif
->is_up
= true;
7378 mutex_unlock(&ar
->conf_mutex
);
7382 ath10k_vdev_stop(arvif
);
7383 arvif
->is_started
= false;
7384 ath10k_mac_vif_setup_ps(arvif
);
7387 mutex_unlock(&ar
->conf_mutex
);
7392 ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw
*hw
,
7393 struct ieee80211_vif
*vif
,
7394 struct ieee80211_chanctx_conf
*ctx
)
7396 struct ath10k
*ar
= hw
->priv
;
7397 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7400 mutex_lock(&ar
->conf_mutex
);
7402 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7403 "mac chanctx unassign ptr %pK vdev_id %i\n",
7404 ctx
, arvif
->vdev_id
);
7406 WARN_ON(!arvif
->is_started
);
7408 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
7409 WARN_ON(!arvif
->is_up
);
7411 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
7413 ath10k_warn(ar
, "failed to down monitor vdev %i: %d\n",
7414 arvif
->vdev_id
, ret
);
7416 arvif
->is_up
= false;
7419 ret
= ath10k_vdev_stop(arvif
);
7421 ath10k_warn(ar
, "failed to stop vdev %i: %d\n",
7422 arvif
->vdev_id
, ret
);
7424 arvif
->is_started
= false;
7426 mutex_unlock(&ar
->conf_mutex
);
7430 ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw
*hw
,
7431 struct ieee80211_vif_chanctx_switch
*vifs
,
7433 enum ieee80211_chanctx_switch_mode mode
)
7435 struct ath10k
*ar
= hw
->priv
;
7437 mutex_lock(&ar
->conf_mutex
);
7439 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7440 "mac chanctx switch n_vifs %d mode %d\n",
7442 ath10k_mac_update_vif_chan(ar
, vifs
, n_vifs
);
7444 mutex_unlock(&ar
->conf_mutex
);
7448 static const struct ieee80211_ops ath10k_ops
= {
7449 .tx
= ath10k_mac_op_tx
,
7450 .wake_tx_queue
= ath10k_mac_op_wake_tx_queue
,
7451 .start
= ath10k_start
,
7452 .stop
= ath10k_stop
,
7453 .config
= ath10k_config
,
7454 .add_interface
= ath10k_add_interface
,
7455 .remove_interface
= ath10k_remove_interface
,
7456 .configure_filter
= ath10k_configure_filter
,
7457 .bss_info_changed
= ath10k_bss_info_changed
,
7458 .set_coverage_class
= ath10k_mac_op_set_coverage_class
,
7459 .hw_scan
= ath10k_hw_scan
,
7460 .cancel_hw_scan
= ath10k_cancel_hw_scan
,
7461 .set_key
= ath10k_set_key
,
7462 .set_default_unicast_key
= ath10k_set_default_unicast_key
,
7463 .sta_state
= ath10k_sta_state
,
7464 .conf_tx
= ath10k_conf_tx
,
7465 .remain_on_channel
= ath10k_remain_on_channel
,
7466 .cancel_remain_on_channel
= ath10k_cancel_remain_on_channel
,
7467 .set_rts_threshold
= ath10k_set_rts_threshold
,
7468 .set_frag_threshold
= ath10k_mac_op_set_frag_threshold
,
7469 .flush
= ath10k_flush
,
7470 .tx_last_beacon
= ath10k_tx_last_beacon
,
7471 .set_antenna
= ath10k_set_antenna
,
7472 .get_antenna
= ath10k_get_antenna
,
7473 .reconfig_complete
= ath10k_reconfig_complete
,
7474 .get_survey
= ath10k_get_survey
,
7475 .set_bitrate_mask
= ath10k_mac_op_set_bitrate_mask
,
7476 .sta_rc_update
= ath10k_sta_rc_update
,
7477 .get_tsf
= ath10k_get_tsf
,
7478 .set_tsf
= ath10k_set_tsf
,
7479 .ampdu_action
= ath10k_ampdu_action
,
7480 .get_et_sset_count
= ath10k_debug_get_et_sset_count
,
7481 .get_et_stats
= ath10k_debug_get_et_stats
,
7482 .get_et_strings
= ath10k_debug_get_et_strings
,
7483 .add_chanctx
= ath10k_mac_op_add_chanctx
,
7484 .remove_chanctx
= ath10k_mac_op_remove_chanctx
,
7485 .change_chanctx
= ath10k_mac_op_change_chanctx
,
7486 .assign_vif_chanctx
= ath10k_mac_op_assign_vif_chanctx
,
7487 .unassign_vif_chanctx
= ath10k_mac_op_unassign_vif_chanctx
,
7488 .switch_vif_chanctx
= ath10k_mac_op_switch_vif_chanctx
,
7490 CFG80211_TESTMODE_CMD(ath10k_tm_cmd
)
7493 .suspend
= ath10k_wow_op_suspend
,
7494 .resume
= ath10k_wow_op_resume
,
7496 #ifdef CONFIG_MAC80211_DEBUGFS
7497 .sta_add_debugfs
= ath10k_sta_add_debugfs
,
7498 .sta_statistics
= ath10k_sta_statistics
,
7502 #define CHAN2G(_channel, _freq, _flags) { \
7503 .band = NL80211_BAND_2GHZ, \
7504 .hw_value = (_channel), \
7505 .center_freq = (_freq), \
7506 .flags = (_flags), \
7507 .max_antenna_gain = 0, \
7511 #define CHAN5G(_channel, _freq, _flags) { \
7512 .band = NL80211_BAND_5GHZ, \
7513 .hw_value = (_channel), \
7514 .center_freq = (_freq), \
7515 .flags = (_flags), \
7516 .max_antenna_gain = 0, \
7520 static const struct ieee80211_channel ath10k_2ghz_channels
[] = {
7530 CHAN2G(10, 2457, 0),
7531 CHAN2G(11, 2462, 0),
7532 CHAN2G(12, 2467, 0),
7533 CHAN2G(13, 2472, 0),
7534 CHAN2G(14, 2484, 0),
7537 static const struct ieee80211_channel ath10k_5ghz_channels
[] = {
7538 CHAN5G(36, 5180, 0),
7539 CHAN5G(40, 5200, 0),
7540 CHAN5G(44, 5220, 0),
7541 CHAN5G(48, 5240, 0),
7542 CHAN5G(52, 5260, 0),
7543 CHAN5G(56, 5280, 0),
7544 CHAN5G(60, 5300, 0),
7545 CHAN5G(64, 5320, 0),
7546 CHAN5G(100, 5500, 0),
7547 CHAN5G(104, 5520, 0),
7548 CHAN5G(108, 5540, 0),
7549 CHAN5G(112, 5560, 0),
7550 CHAN5G(116, 5580, 0),
7551 CHAN5G(120, 5600, 0),
7552 CHAN5G(124, 5620, 0),
7553 CHAN5G(128, 5640, 0),
7554 CHAN5G(132, 5660, 0),
7555 CHAN5G(136, 5680, 0),
7556 CHAN5G(140, 5700, 0),
7557 CHAN5G(144, 5720, 0),
7558 CHAN5G(149, 5745, 0),
7559 CHAN5G(153, 5765, 0),
7560 CHAN5G(157, 5785, 0),
7561 CHAN5G(161, 5805, 0),
7562 CHAN5G(165, 5825, 0),
7565 struct ath10k
*ath10k_mac_create(size_t priv_size
)
7567 struct ieee80211_hw
*hw
;
7568 struct ieee80211_ops
*ops
;
7571 ops
= kmemdup(&ath10k_ops
, sizeof(ath10k_ops
), GFP_KERNEL
);
7575 hw
= ieee80211_alloc_hw(sizeof(struct ath10k
) + priv_size
, ops
);
7588 void ath10k_mac_destroy(struct ath10k
*ar
)
7590 struct ieee80211_ops
*ops
= ar
->ops
;
7592 ieee80211_free_hw(ar
->hw
);
7596 static const struct ieee80211_iface_limit ath10k_if_limits
[] = {
7599 .types
= BIT(NL80211_IFTYPE_STATION
)
7600 | BIT(NL80211_IFTYPE_P2P_CLIENT
)
7604 .types
= BIT(NL80211_IFTYPE_P2P_GO
)
7608 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
)
7612 .types
= BIT(NL80211_IFTYPE_AP
)
7613 #ifdef CONFIG_MAC80211_MESH
7614 | BIT(NL80211_IFTYPE_MESH_POINT
)
7619 static const struct ieee80211_iface_limit ath10k_10x_if_limits
[] = {
7622 .types
= BIT(NL80211_IFTYPE_AP
)
7623 #ifdef CONFIG_MAC80211_MESH
7624 | BIT(NL80211_IFTYPE_MESH_POINT
)
7629 .types
= BIT(NL80211_IFTYPE_STATION
)
7633 static const struct ieee80211_iface_combination ath10k_if_comb
[] = {
7635 .limits
= ath10k_if_limits
,
7636 .n_limits
= ARRAY_SIZE(ath10k_if_limits
),
7637 .max_interfaces
= 8,
7638 .num_different_channels
= 1,
7639 .beacon_int_infra_match
= true,
7643 static const struct ieee80211_iface_combination ath10k_10x_if_comb
[] = {
7645 .limits
= ath10k_10x_if_limits
,
7646 .n_limits
= ARRAY_SIZE(ath10k_10x_if_limits
),
7647 .max_interfaces
= 8,
7648 .num_different_channels
= 1,
7649 .beacon_int_infra_match
= true,
7650 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
7651 .radar_detect_widths
= BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
7652 BIT(NL80211_CHAN_WIDTH_20
) |
7653 BIT(NL80211_CHAN_WIDTH_40
) |
7654 BIT(NL80211_CHAN_WIDTH_80
),
7659 static const struct ieee80211_iface_limit ath10k_tlv_if_limit
[] = {
7662 .types
= BIT(NL80211_IFTYPE_STATION
),
7666 .types
= BIT(NL80211_IFTYPE_AP
) |
7667 #ifdef CONFIG_MAC80211_MESH
7668 BIT(NL80211_IFTYPE_MESH_POINT
) |
7670 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
7671 BIT(NL80211_IFTYPE_P2P_GO
),
7675 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
),
7679 static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit
[] = {
7682 .types
= BIT(NL80211_IFTYPE_STATION
),
7686 .types
= BIT(NL80211_IFTYPE_P2P_CLIENT
),
7690 .types
= BIT(NL80211_IFTYPE_AP
) |
7691 #ifdef CONFIG_MAC80211_MESH
7692 BIT(NL80211_IFTYPE_MESH_POINT
) |
7694 BIT(NL80211_IFTYPE_P2P_GO
),
7698 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
),
7702 static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss
[] = {
7705 .types
= BIT(NL80211_IFTYPE_STATION
),
7709 .types
= BIT(NL80211_IFTYPE_ADHOC
),
7713 /* FIXME: This is not thouroughly tested. These combinations may over- or
7714 * underestimate hw/fw capabilities.
7716 static struct ieee80211_iface_combination ath10k_tlv_if_comb
[] = {
7718 .limits
= ath10k_tlv_if_limit
,
7719 .num_different_channels
= 1,
7720 .max_interfaces
= 4,
7721 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit
),
7724 .limits
= ath10k_tlv_if_limit_ibss
,
7725 .num_different_channels
= 1,
7726 .max_interfaces
= 2,
7727 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit_ibss
),
7731 static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb
[] = {
7733 .limits
= ath10k_tlv_if_limit
,
7734 .num_different_channels
= 1,
7735 .max_interfaces
= 4,
7736 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit
),
7739 .limits
= ath10k_tlv_qcs_if_limit
,
7740 .num_different_channels
= 2,
7741 .max_interfaces
= 4,
7742 .n_limits
= ARRAY_SIZE(ath10k_tlv_qcs_if_limit
),
7745 .limits
= ath10k_tlv_if_limit_ibss
,
7746 .num_different_channels
= 1,
7747 .max_interfaces
= 2,
7748 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit_ibss
),
7752 static const struct ieee80211_iface_limit ath10k_10_4_if_limits
[] = {
7755 .types
= BIT(NL80211_IFTYPE_STATION
),
7759 .types
= BIT(NL80211_IFTYPE_AP
)
7760 #ifdef CONFIG_MAC80211_MESH
7761 | BIT(NL80211_IFTYPE_MESH_POINT
)
7766 static const struct ieee80211_iface_combination ath10k_10_4_if_comb
[] = {
7768 .limits
= ath10k_10_4_if_limits
,
7769 .n_limits
= ARRAY_SIZE(ath10k_10_4_if_limits
),
7770 .max_interfaces
= 16,
7771 .num_different_channels
= 1,
7772 .beacon_int_infra_match
= true,
7773 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
7774 .radar_detect_widths
= BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
7775 BIT(NL80211_CHAN_WIDTH_20
) |
7776 BIT(NL80211_CHAN_WIDTH_40
) |
7777 BIT(NL80211_CHAN_WIDTH_80
),
7782 static void ath10k_get_arvif_iter(void *data
, u8
*mac
,
7783 struct ieee80211_vif
*vif
)
7785 struct ath10k_vif_iter
*arvif_iter
= data
;
7786 struct ath10k_vif
*arvif
= ath10k_vif_to_arvif(vif
);
7788 if (arvif
->vdev_id
== arvif_iter
->vdev_id
)
7789 arvif_iter
->arvif
= arvif
;
7792 struct ath10k_vif
*ath10k_get_arvif(struct ath10k
*ar
, u32 vdev_id
)
7794 struct ath10k_vif_iter arvif_iter
;
7797 memset(&arvif_iter
, 0, sizeof(struct ath10k_vif_iter
));
7798 arvif_iter
.vdev_id
= vdev_id
;
7800 flags
= IEEE80211_IFACE_ITER_RESUME_ALL
;
7801 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
7803 ath10k_get_arvif_iter
,
7805 if (!arvif_iter
.arvif
) {
7806 ath10k_warn(ar
, "No VIF found for vdev %d\n", vdev_id
);
7810 return arvif_iter
.arvif
;
7813 #define WRD_METHOD "WRDD"
7814 #define WRDD_WIFI (0x07)
7816 static u32
ath10k_mac_wrdd_get_mcc(struct ath10k
*ar
, union acpi_object
*wrdd
)
7818 union acpi_object
*mcc_pkg
;
7819 union acpi_object
*domain_type
;
7820 union acpi_object
*mcc_value
;
7823 if (wrdd
->type
!= ACPI_TYPE_PACKAGE
||
7824 wrdd
->package
.count
< 2 ||
7825 wrdd
->package
.elements
[0].type
!= ACPI_TYPE_INTEGER
||
7826 wrdd
->package
.elements
[0].integer
.value
!= 0) {
7827 ath10k_warn(ar
, "ignoring malformed/unsupported wrdd structure\n");
7831 for (i
= 1; i
< wrdd
->package
.count
; ++i
) {
7832 mcc_pkg
= &wrdd
->package
.elements
[i
];
7834 if (mcc_pkg
->type
!= ACPI_TYPE_PACKAGE
)
7836 if (mcc_pkg
->package
.count
< 2)
7838 if (mcc_pkg
->package
.elements
[0].type
!= ACPI_TYPE_INTEGER
||
7839 mcc_pkg
->package
.elements
[1].type
!= ACPI_TYPE_INTEGER
)
7842 domain_type
= &mcc_pkg
->package
.elements
[0];
7843 if (domain_type
->integer
.value
!= WRDD_WIFI
)
7846 mcc_value
= &mcc_pkg
->package
.elements
[1];
7847 return mcc_value
->integer
.value
;
7852 static int ath10k_mac_get_wrdd_regulatory(struct ath10k
*ar
, u16
*rd
)
7854 struct pci_dev __maybe_unused
*pdev
= to_pci_dev(ar
->dev
);
7855 acpi_handle root_handle
;
7857 struct acpi_buffer wrdd
= {ACPI_ALLOCATE_BUFFER
, NULL
};
7862 root_handle
= ACPI_HANDLE(&pdev
->dev
);
7866 status
= acpi_get_handle(root_handle
, (acpi_string
)WRD_METHOD
, &handle
);
7867 if (ACPI_FAILURE(status
)) {
7868 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
7869 "failed to get wrd method %d\n", status
);
7873 status
= acpi_evaluate_object(handle
, NULL
, NULL
, &wrdd
);
7874 if (ACPI_FAILURE(status
)) {
7875 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
7876 "failed to call wrdc %d\n", status
);
7880 alpha2_code
= ath10k_mac_wrdd_get_mcc(ar
, wrdd
.pointer
);
7881 kfree(wrdd
.pointer
);
7885 alpha2
[0] = (alpha2_code
>> 8) & 0xff;
7886 alpha2
[1] = (alpha2_code
>> 0) & 0xff;
7889 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
7890 "regulatory hint from WRDD (alpha2-code): %s\n", alpha2
);
7892 *rd
= ath_regd_find_country_by_name(alpha2
);
7896 *rd
|= COUNTRY_ERD_FLAG
;
7900 static int ath10k_mac_init_rd(struct ath10k
*ar
)
7905 ret
= ath10k_mac_get_wrdd_regulatory(ar
, &rd
);
7907 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
7908 "fallback to eeprom programmed regulatory settings\n");
7909 rd
= ar
->hw_eeprom_rd
;
7912 ar
->ath_common
.regulatory
.current_rd
= rd
;
7916 int ath10k_mac_register(struct ath10k
*ar
)
7918 static const u32 cipher_suites
[] = {
7919 WLAN_CIPHER_SUITE_WEP40
,
7920 WLAN_CIPHER_SUITE_WEP104
,
7921 WLAN_CIPHER_SUITE_TKIP
,
7922 WLAN_CIPHER_SUITE_CCMP
,
7923 WLAN_CIPHER_SUITE_AES_CMAC
,
7925 struct ieee80211_supported_band
*band
;
7929 SET_IEEE80211_PERM_ADDR(ar
->hw
, ar
->mac_addr
);
7931 SET_IEEE80211_DEV(ar
->hw
, ar
->dev
);
7933 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels
) +
7934 ARRAY_SIZE(ath10k_5ghz_channels
)) !=
7937 if (ar
->phy_capability
& WHAL_WLAN_11G_CAPABILITY
) {
7938 channels
= kmemdup(ath10k_2ghz_channels
,
7939 sizeof(ath10k_2ghz_channels
),
7946 band
= &ar
->mac
.sbands
[NL80211_BAND_2GHZ
];
7947 band
->n_channels
= ARRAY_SIZE(ath10k_2ghz_channels
);
7948 band
->channels
= channels
;
7950 if (ar
->hw_params
.cck_rate_map_rev2
) {
7951 band
->n_bitrates
= ath10k_g_rates_rev2_size
;
7952 band
->bitrates
= ath10k_g_rates_rev2
;
7954 band
->n_bitrates
= ath10k_g_rates_size
;
7955 band
->bitrates
= ath10k_g_rates
;
7958 ar
->hw
->wiphy
->bands
[NL80211_BAND_2GHZ
] = band
;
7961 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
) {
7962 channels
= kmemdup(ath10k_5ghz_channels
,
7963 sizeof(ath10k_5ghz_channels
),
7970 band
= &ar
->mac
.sbands
[NL80211_BAND_5GHZ
];
7971 band
->n_channels
= ARRAY_SIZE(ath10k_5ghz_channels
);
7972 band
->channels
= channels
;
7973 band
->n_bitrates
= ath10k_a_rates_size
;
7974 band
->bitrates
= ath10k_a_rates
;
7975 ar
->hw
->wiphy
->bands
[NL80211_BAND_5GHZ
] = band
;
7978 ath10k_mac_setup_ht_vht_cap(ar
);
7980 ar
->hw
->wiphy
->interface_modes
=
7981 BIT(NL80211_IFTYPE_STATION
) |
7982 BIT(NL80211_IFTYPE_AP
) |
7983 BIT(NL80211_IFTYPE_MESH_POINT
);
7985 ar
->hw
->wiphy
->available_antennas_rx
= ar
->cfg_rx_chainmask
;
7986 ar
->hw
->wiphy
->available_antennas_tx
= ar
->cfg_tx_chainmask
;
7988 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P
, ar
->normal_mode_fw
.fw_file
.fw_features
))
7989 ar
->hw
->wiphy
->interface_modes
|=
7990 BIT(NL80211_IFTYPE_P2P_DEVICE
) |
7991 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
7992 BIT(NL80211_IFTYPE_P2P_GO
);
7994 ieee80211_hw_set(ar
->hw
, SIGNAL_DBM
);
7995 ieee80211_hw_set(ar
->hw
, SUPPORTS_PS
);
7996 ieee80211_hw_set(ar
->hw
, SUPPORTS_DYNAMIC_PS
);
7997 ieee80211_hw_set(ar
->hw
, MFP_CAPABLE
);
7998 ieee80211_hw_set(ar
->hw
, REPORTS_TX_ACK_STATUS
);
7999 ieee80211_hw_set(ar
->hw
, HAS_RATE_CONTROL
);
8000 ieee80211_hw_set(ar
->hw
, AP_LINK_PS
);
8001 ieee80211_hw_set(ar
->hw
, SPECTRUM_MGMT
);
8002 ieee80211_hw_set(ar
->hw
, SUPPORT_FAST_XMIT
);
8003 ieee80211_hw_set(ar
->hw
, CONNECTION_MONITOR
);
8004 ieee80211_hw_set(ar
->hw
, SUPPORTS_PER_STA_GTK
);
8005 ieee80211_hw_set(ar
->hw
, WANT_MONITOR_VIF
);
8006 ieee80211_hw_set(ar
->hw
, CHANCTX_STA_CSA
);
8007 ieee80211_hw_set(ar
->hw
, QUEUE_CONTROL
);
8008 ieee80211_hw_set(ar
->hw
, SUPPORTS_TX_FRAG
);
8010 if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
8011 ieee80211_hw_set(ar
->hw
, SW_CRYPTO_CONTROL
);
8013 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_STATIC_SMPS
;
8014 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_IBSS_RSN
;
8016 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
)
8017 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_DYNAMIC_SMPS
;
8019 if (ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
) {
8020 ieee80211_hw_set(ar
->hw
, AMPDU_AGGREGATION
);
8021 ieee80211_hw_set(ar
->hw
, TX_AMPDU_SETUP_IN_HW
);
8024 ar
->hw
->wiphy
->max_scan_ssids
= WLAN_SCAN_PARAMS_MAX_SSID
;
8025 ar
->hw
->wiphy
->max_scan_ie_len
= WLAN_SCAN_PARAMS_MAX_IE_LEN
;
8027 ar
->hw
->vif_data_size
= sizeof(struct ath10k_vif
);
8028 ar
->hw
->sta_data_size
= sizeof(struct ath10k_sta
);
8029 ar
->hw
->txq_data_size
= sizeof(struct ath10k_txq
);
8031 ar
->hw
->max_listen_interval
= ATH10K_MAX_HW_LISTEN_INTERVAL
;
8033 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
)) {
8034 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
;
8036 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
8037 * that userspace (e.g. wpa_supplicant/hostapd) can generate
8038 * correct Probe Responses. This is more of a hack advert..
8040 ar
->hw
->wiphy
->probe_resp_offload
|=
8041 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
8042 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
|
8043 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P
;
8046 if (test_bit(WMI_SERVICE_TDLS
, ar
->wmi
.svc_map
))
8047 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_SUPPORTS_TDLS
;
8049 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
;
8050 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_CHANNEL_SWITCH
;
8051 ar
->hw
->wiphy
->max_remain_on_channel_duration
= 5000;
8053 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_UAPSD
;
8054 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE
|
8055 NL80211_FEATURE_AP_SCAN
;
8057 ar
->hw
->wiphy
->max_ap_assoc_sta
= ar
->max_num_stations
;
8059 ret
= ath10k_wow_init(ar
);
8061 ath10k_warn(ar
, "failed to init wow: %d\n", ret
);
8065 wiphy_ext_feature_set(ar
->hw
->wiphy
, NL80211_EXT_FEATURE_VHT_IBSS
);
8068 * on LL hardware queues are managed entirely by the FW
8069 * so we only advertise to mac we can do the queues thing
8071 ar
->hw
->queues
= IEEE80211_MAX_QUEUES
;
8073 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
8074 * something that vdev_ids can't reach so that we don't stop the queue
8077 ar
->hw
->offchannel_tx_hw_queue
= IEEE80211_MAX_QUEUES
- 1;
8079 switch (ar
->running_fw
->fw_file
.wmi_op_version
) {
8080 case ATH10K_FW_WMI_OP_VERSION_MAIN
:
8081 ar
->hw
->wiphy
->iface_combinations
= ath10k_if_comb
;
8082 ar
->hw
->wiphy
->n_iface_combinations
=
8083 ARRAY_SIZE(ath10k_if_comb
);
8084 ar
->hw
->wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
8086 case ATH10K_FW_WMI_OP_VERSION_TLV
:
8087 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS
, ar
->wmi
.svc_map
)) {
8088 ar
->hw
->wiphy
->iface_combinations
=
8089 ath10k_tlv_qcs_if_comb
;
8090 ar
->hw
->wiphy
->n_iface_combinations
=
8091 ARRAY_SIZE(ath10k_tlv_qcs_if_comb
);
8093 ar
->hw
->wiphy
->iface_combinations
= ath10k_tlv_if_comb
;
8094 ar
->hw
->wiphy
->n_iface_combinations
=
8095 ARRAY_SIZE(ath10k_tlv_if_comb
);
8097 ar
->hw
->wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
8099 case ATH10K_FW_WMI_OP_VERSION_10_1
:
8100 case ATH10K_FW_WMI_OP_VERSION_10_2
:
8101 case ATH10K_FW_WMI_OP_VERSION_10_2_4
:
8102 ar
->hw
->wiphy
->iface_combinations
= ath10k_10x_if_comb
;
8103 ar
->hw
->wiphy
->n_iface_combinations
=
8104 ARRAY_SIZE(ath10k_10x_if_comb
);
8106 case ATH10K_FW_WMI_OP_VERSION_10_4
:
8107 ar
->hw
->wiphy
->iface_combinations
= ath10k_10_4_if_comb
;
8108 ar
->hw
->wiphy
->n_iface_combinations
=
8109 ARRAY_SIZE(ath10k_10_4_if_comb
);
8111 case ATH10K_FW_WMI_OP_VERSION_UNSET
:
8112 case ATH10K_FW_WMI_OP_VERSION_MAX
:
8118 if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
8119 ar
->hw
->netdev_features
= NETIF_F_HW_CSUM
;
8121 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
)) {
8122 /* Init ath dfs pattern detector */
8123 ar
->ath_common
.debug_mask
= ATH_DBG_DFS
;
8124 ar
->dfs_detector
= dfs_pattern_detector_init(&ar
->ath_common
,
8127 if (!ar
->dfs_detector
)
8128 ath10k_warn(ar
, "failed to initialise DFS pattern detector\n");
8131 /* Current wake_tx_queue implementation imposes a significant
8132 * performance penalty in some setups. The tx scheduling code needs
8133 * more work anyway so disable the wake_tx_queue unless firmware
8134 * supports the pull-push mechanism.
8136 if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL
,
8137 ar
->running_fw
->fw_file
.fw_features
))
8138 ar
->ops
->wake_tx_queue
= NULL
;
8140 ret
= ath10k_mac_init_rd(ar
);
8142 ath10k_err(ar
, "failed to derive regdom: %d\n", ret
);
8143 goto err_dfs_detector_exit
;
8146 /* Disable set_coverage_class for chipsets that do not support it. */
8147 if (!ar
->hw_params
.hw_ops
->set_coverage_class
)
8148 ar
->ops
->set_coverage_class
= NULL
;
8150 ret
= ath_regd_init(&ar
->ath_common
.regulatory
, ar
->hw
->wiphy
,
8151 ath10k_reg_notifier
);
8153 ath10k_err(ar
, "failed to initialise regulatory: %i\n", ret
);
8154 goto err_dfs_detector_exit
;
8157 ar
->hw
->wiphy
->cipher_suites
= cipher_suites
;
8158 ar
->hw
->wiphy
->n_cipher_suites
= ARRAY_SIZE(cipher_suites
);
8160 ret
= ieee80211_register_hw(ar
->hw
);
8162 ath10k_err(ar
, "failed to register ieee80211: %d\n", ret
);
8163 goto err_dfs_detector_exit
;
8166 if (!ath_is_world_regd(&ar
->ath_common
.regulatory
)) {
8167 ret
= regulatory_hint(ar
->hw
->wiphy
,
8168 ar
->ath_common
.regulatory
.alpha2
);
8170 goto err_unregister
;
8176 ieee80211_unregister_hw(ar
->hw
);
8178 err_dfs_detector_exit
:
8179 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
)
8180 ar
->dfs_detector
->exit(ar
->dfs_detector
);
8183 kfree(ar
->mac
.sbands
[NL80211_BAND_2GHZ
].channels
);
8184 kfree(ar
->mac
.sbands
[NL80211_BAND_5GHZ
].channels
);
8186 SET_IEEE80211_DEV(ar
->hw
, NULL
);
8190 void ath10k_mac_unregister(struct ath10k
*ar
)
8192 ieee80211_unregister_hw(ar
->hw
);
8194 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
)
8195 ar
->dfs_detector
->exit(ar
->dfs_detector
);
8197 kfree(ar
->mac
.sbands
[NL80211_BAND_2GHZ
].channels
);
8198 kfree(ar
->mac
.sbands
[NL80211_BAND_5GHZ
].channels
);
8200 SET_IEEE80211_DEV(ar
->hw
, NULL
);