2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2017 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_CCMP_256
:
246 arg
.key_cipher
= WMI_CIPHER_AES_CCM
;
248 case WLAN_CIPHER_SUITE_GCMP
:
249 case WLAN_CIPHER_SUITE_GCMP_256
:
250 arg
.key_cipher
= WMI_CIPHER_AES_GCM
;
252 case WLAN_CIPHER_SUITE_BIP_GMAC_128
:
253 case WLAN_CIPHER_SUITE_BIP_GMAC_256
:
254 case WLAN_CIPHER_SUITE_BIP_CMAC_256
:
255 case WLAN_CIPHER_SUITE_AES_CMAC
:
259 ath10k_warn(ar
, "cipher %d is not supported\n", key
->cipher
);
263 if (test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
264 key
->flags
|= IEEE80211_KEY_FLAG_GENERATE_IV
;
266 if (cmd
== DISABLE_KEY
) {
267 arg
.key_cipher
= WMI_CIPHER_NONE
;
271 return ath10k_wmi_vdev_install_key(arvif
->ar
, &arg
);
274 static int ath10k_install_key(struct ath10k_vif
*arvif
,
275 struct ieee80211_key_conf
*key
,
276 enum set_key_cmd cmd
,
277 const u8
*macaddr
, u32 flags
)
279 struct ath10k
*ar
= arvif
->ar
;
281 unsigned long time_left
;
283 lockdep_assert_held(&ar
->conf_mutex
);
285 reinit_completion(&ar
->install_key_done
);
287 if (arvif
->nohwcrypt
)
290 ret
= ath10k_send_key(arvif
, key
, cmd
, macaddr
, flags
);
294 time_left
= wait_for_completion_timeout(&ar
->install_key_done
, 3 * HZ
);
301 static int ath10k_install_peer_wep_keys(struct ath10k_vif
*arvif
,
304 struct ath10k
*ar
= arvif
->ar
;
305 struct ath10k_peer
*peer
;
310 lockdep_assert_held(&ar
->conf_mutex
);
312 if (WARN_ON(arvif
->vif
->type
!= NL80211_IFTYPE_AP
&&
313 arvif
->vif
->type
!= NL80211_IFTYPE_ADHOC
&&
314 arvif
->vif
->type
!= NL80211_IFTYPE_MESH_POINT
))
317 spin_lock_bh(&ar
->data_lock
);
318 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
319 spin_unlock_bh(&ar
->data_lock
);
324 for (i
= 0; i
< ARRAY_SIZE(arvif
->wep_keys
); i
++) {
325 if (arvif
->wep_keys
[i
] == NULL
)
328 switch (arvif
->vif
->type
) {
329 case NL80211_IFTYPE_AP
:
330 flags
= WMI_KEY_PAIRWISE
;
332 if (arvif
->def_wep_key_idx
== i
)
333 flags
|= WMI_KEY_TX_USAGE
;
335 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
],
336 SET_KEY
, addr
, flags
);
340 case NL80211_IFTYPE_ADHOC
:
341 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
],
347 ret
= ath10k_install_key(arvif
, arvif
->wep_keys
[i
],
348 SET_KEY
, addr
, WMI_KEY_GROUP
);
357 spin_lock_bh(&ar
->data_lock
);
358 peer
->keys
[i
] = arvif
->wep_keys
[i
];
359 spin_unlock_bh(&ar
->data_lock
);
362 /* In some cases (notably with static WEP IBSS with multiple keys)
363 * multicast Tx becomes broken. Both pairwise and groupwise keys are
364 * installed already. Using WMI_KEY_TX_USAGE in different combinations
365 * didn't seem help. Using def_keyid vdev parameter seems to be
366 * effective so use that.
368 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
370 if (arvif
->vif
->type
!= NL80211_IFTYPE_ADHOC
)
373 if (arvif
->def_wep_key_idx
== -1)
376 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
,
378 arvif
->ar
->wmi
.vdev_param
->def_keyid
,
379 arvif
->def_wep_key_idx
);
381 ath10k_warn(ar
, "failed to re-set def wpa key idxon vdev %i: %d\n",
382 arvif
->vdev_id
, ret
);
389 static int ath10k_clear_peer_keys(struct ath10k_vif
*arvif
,
392 struct ath10k
*ar
= arvif
->ar
;
393 struct ath10k_peer
*peer
;
399 lockdep_assert_held(&ar
->conf_mutex
);
401 spin_lock_bh(&ar
->data_lock
);
402 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, addr
);
403 spin_unlock_bh(&ar
->data_lock
);
408 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
409 if (peer
->keys
[i
] == NULL
)
412 /* key flags are not required to delete the key */
413 ret
= ath10k_install_key(arvif
, peer
->keys
[i
],
414 DISABLE_KEY
, addr
, flags
);
415 if (ret
< 0 && first_errno
== 0)
419 ath10k_warn(ar
, "failed to remove peer wep key %d: %d\n",
422 spin_lock_bh(&ar
->data_lock
);
423 peer
->keys
[i
] = NULL
;
424 spin_unlock_bh(&ar
->data_lock
);
430 bool ath10k_mac_is_peer_wep_key_set(struct ath10k
*ar
, const u8
*addr
,
433 struct ath10k_peer
*peer
;
436 lockdep_assert_held(&ar
->data_lock
);
438 /* We don't know which vdev this peer belongs to,
439 * since WMI doesn't give us that information.
441 * FIXME: multi-bss needs to be handled.
443 peer
= ath10k_peer_find(ar
, 0, addr
);
447 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
448 if (peer
->keys
[i
] && peer
->keys
[i
]->keyidx
== keyidx
)
455 static int ath10k_clear_vdev_key(struct ath10k_vif
*arvif
,
456 struct ieee80211_key_conf
*key
)
458 struct ath10k
*ar
= arvif
->ar
;
459 struct ath10k_peer
*peer
;
466 lockdep_assert_held(&ar
->conf_mutex
);
469 /* since ath10k_install_key we can't hold data_lock all the
470 * time, so we try to remove the keys incrementally
472 spin_lock_bh(&ar
->data_lock
);
474 list_for_each_entry(peer
, &ar
->peers
, list
) {
475 for (i
= 0; i
< ARRAY_SIZE(peer
->keys
); i
++) {
476 if (peer
->keys
[i
] == key
) {
477 ether_addr_copy(addr
, peer
->addr
);
478 peer
->keys
[i
] = NULL
;
483 if (i
< ARRAY_SIZE(peer
->keys
))
486 spin_unlock_bh(&ar
->data_lock
);
488 if (i
== ARRAY_SIZE(peer
->keys
))
490 /* key flags are not required to delete the key */
491 ret
= ath10k_install_key(arvif
, key
, DISABLE_KEY
, addr
, flags
);
492 if (ret
< 0 && first_errno
== 0)
496 ath10k_warn(ar
, "failed to remove key for %pM: %d\n",
503 static int ath10k_mac_vif_update_wep_key(struct ath10k_vif
*arvif
,
504 struct ieee80211_key_conf
*key
)
506 struct ath10k
*ar
= arvif
->ar
;
507 struct ath10k_peer
*peer
;
510 lockdep_assert_held(&ar
->conf_mutex
);
512 list_for_each_entry(peer
, &ar
->peers
, list
) {
513 if (ether_addr_equal(peer
->addr
, arvif
->vif
->addr
))
516 if (ether_addr_equal(peer
->addr
, arvif
->bssid
))
519 if (peer
->keys
[key
->keyidx
] == key
)
522 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vif vdev %i update key %i needs update\n",
523 arvif
->vdev_id
, key
->keyidx
);
525 ret
= ath10k_install_peer_wep_keys(arvif
, peer
->addr
);
527 ath10k_warn(ar
, "failed to update wep keys on vdev %i for peer %pM: %d\n",
528 arvif
->vdev_id
, peer
->addr
, ret
);
536 /*********************/
537 /* General utilities */
538 /*********************/
540 static inline enum wmi_phy_mode
541 chan_to_phymode(const struct cfg80211_chan_def
*chandef
)
543 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
545 switch (chandef
->chan
->band
) {
546 case NL80211_BAND_2GHZ
:
547 switch (chandef
->width
) {
548 case NL80211_CHAN_WIDTH_20_NOHT
:
549 if (chandef
->chan
->flags
& IEEE80211_CHAN_NO_OFDM
)
554 case NL80211_CHAN_WIDTH_20
:
555 phymode
= MODE_11NG_HT20
;
557 case NL80211_CHAN_WIDTH_40
:
558 phymode
= MODE_11NG_HT40
;
560 case NL80211_CHAN_WIDTH_5
:
561 case NL80211_CHAN_WIDTH_10
:
562 case NL80211_CHAN_WIDTH_80
:
563 case NL80211_CHAN_WIDTH_80P80
:
564 case NL80211_CHAN_WIDTH_160
:
565 phymode
= MODE_UNKNOWN
;
569 case NL80211_BAND_5GHZ
:
570 switch (chandef
->width
) {
571 case NL80211_CHAN_WIDTH_20_NOHT
:
574 case NL80211_CHAN_WIDTH_20
:
575 phymode
= MODE_11NA_HT20
;
577 case NL80211_CHAN_WIDTH_40
:
578 phymode
= MODE_11NA_HT40
;
580 case NL80211_CHAN_WIDTH_80
:
581 phymode
= MODE_11AC_VHT80
;
583 case NL80211_CHAN_WIDTH_160
:
584 phymode
= MODE_11AC_VHT160
;
586 case NL80211_CHAN_WIDTH_80P80
:
587 phymode
= MODE_11AC_VHT80_80
;
589 case NL80211_CHAN_WIDTH_5
:
590 case NL80211_CHAN_WIDTH_10
:
591 phymode
= MODE_UNKNOWN
;
599 WARN_ON(phymode
== MODE_UNKNOWN
);
603 static u8
ath10k_parse_mpdudensity(u8 mpdudensity
)
606 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
607 * 0 for no restriction
616 switch (mpdudensity
) {
622 /* Our lower layer calculations limit our precision to
639 int ath10k_mac_vif_chan(struct ieee80211_vif
*vif
,
640 struct cfg80211_chan_def
*def
)
642 struct ieee80211_chanctx_conf
*conf
;
645 conf
= rcu_dereference(vif
->chanctx_conf
);
657 static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw
*hw
,
658 struct ieee80211_chanctx_conf
*conf
,
666 static int ath10k_mac_num_chanctxs(struct ath10k
*ar
)
670 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
671 ath10k_mac_num_chanctxs_iter
,
678 ath10k_mac_get_any_chandef_iter(struct ieee80211_hw
*hw
,
679 struct ieee80211_chanctx_conf
*conf
,
682 struct cfg80211_chan_def
**def
= data
;
687 static int ath10k_peer_create(struct ath10k
*ar
,
688 struct ieee80211_vif
*vif
,
689 struct ieee80211_sta
*sta
,
692 enum wmi_peer_type peer_type
)
694 struct ath10k_vif
*arvif
;
695 struct ath10k_peer
*peer
;
699 lockdep_assert_held(&ar
->conf_mutex
);
701 num_peers
= ar
->num_peers
;
703 /* Each vdev consumes a peer entry as well */
704 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
707 if (num_peers
>= ar
->max_num_peers
)
710 ret
= ath10k_wmi_peer_create(ar
, vdev_id
, addr
, peer_type
);
712 ath10k_warn(ar
, "failed to create wmi peer %pM on vdev %i: %i\n",
717 ret
= ath10k_wait_for_peer_created(ar
, vdev_id
, addr
);
719 ath10k_warn(ar
, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
724 spin_lock_bh(&ar
->data_lock
);
726 peer
= ath10k_peer_find(ar
, vdev_id
, addr
);
728 spin_unlock_bh(&ar
->data_lock
);
729 ath10k_warn(ar
, "failed to find peer %pM on vdev %i after creation\n",
731 ath10k_wmi_peer_delete(ar
, vdev_id
, addr
);
738 spin_unlock_bh(&ar
->data_lock
);
745 static int ath10k_mac_set_kickout(struct ath10k_vif
*arvif
)
747 struct ath10k
*ar
= arvif
->ar
;
751 param
= ar
->wmi
.pdev_param
->sta_kickout_th
;
752 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
753 ATH10K_KICKOUT_THRESHOLD
);
755 ath10k_warn(ar
, "failed to set kickout threshold on vdev %i: %d\n",
756 arvif
->vdev_id
, ret
);
760 param
= ar
->wmi
.vdev_param
->ap_keepalive_min_idle_inactive_time_secs
;
761 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
762 ATH10K_KEEPALIVE_MIN_IDLE
);
764 ath10k_warn(ar
, "failed to set keepalive minimum idle time on vdev %i: %d\n",
765 arvif
->vdev_id
, ret
);
769 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_idle_inactive_time_secs
;
770 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
771 ATH10K_KEEPALIVE_MAX_IDLE
);
773 ath10k_warn(ar
, "failed to set keepalive maximum idle time on vdev %i: %d\n",
774 arvif
->vdev_id
, ret
);
778 param
= ar
->wmi
.vdev_param
->ap_keepalive_max_unresponsive_time_secs
;
779 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
,
780 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE
);
782 ath10k_warn(ar
, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
783 arvif
->vdev_id
, ret
);
790 static int ath10k_mac_set_rts(struct ath10k_vif
*arvif
, u32 value
)
792 struct ath10k
*ar
= arvif
->ar
;
795 vdev_param
= ar
->wmi
.vdev_param
->rts_threshold
;
796 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, value
);
799 static int ath10k_peer_delete(struct ath10k
*ar
, u32 vdev_id
, const u8
*addr
)
803 lockdep_assert_held(&ar
->conf_mutex
);
805 ret
= ath10k_wmi_peer_delete(ar
, vdev_id
, addr
);
809 ret
= ath10k_wait_for_peer_deleted(ar
, vdev_id
, addr
);
818 static void ath10k_peer_cleanup(struct ath10k
*ar
, u32 vdev_id
)
820 struct ath10k_peer
*peer
, *tmp
;
824 lockdep_assert_held(&ar
->conf_mutex
);
826 spin_lock_bh(&ar
->data_lock
);
827 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
828 if (peer
->vdev_id
!= vdev_id
)
831 ath10k_warn(ar
, "removing stale peer %pM from vdev_id %d\n",
832 peer
->addr
, vdev_id
);
834 for_each_set_bit(peer_id
, peer
->peer_ids
,
835 ATH10K_MAX_NUM_PEER_IDS
) {
836 ar
->peer_map
[peer_id
] = NULL
;
839 /* Double check that peer is properly un-referenced from
842 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++) {
843 if (ar
->peer_map
[i
] == peer
) {
844 ath10k_warn(ar
, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n",
845 peer
->addr
, peer
, i
);
846 ar
->peer_map
[i
] = NULL
;
850 list_del(&peer
->list
);
854 spin_unlock_bh(&ar
->data_lock
);
857 static void ath10k_peer_cleanup_all(struct ath10k
*ar
)
859 struct ath10k_peer
*peer
, *tmp
;
862 lockdep_assert_held(&ar
->conf_mutex
);
864 spin_lock_bh(&ar
->data_lock
);
865 list_for_each_entry_safe(peer
, tmp
, &ar
->peers
, list
) {
866 list_del(&peer
->list
);
870 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++)
871 ar
->peer_map
[i
] = NULL
;
873 spin_unlock_bh(&ar
->data_lock
);
876 ar
->num_stations
= 0;
879 static int ath10k_mac_tdls_peer_update(struct ath10k
*ar
, u32 vdev_id
,
880 struct ieee80211_sta
*sta
,
881 enum wmi_tdls_peer_state state
)
884 struct wmi_tdls_peer_update_cmd_arg arg
= {};
885 struct wmi_tdls_peer_capab_arg cap
= {};
886 struct wmi_channel_arg chan_arg
= {};
888 lockdep_assert_held(&ar
->conf_mutex
);
890 arg
.vdev_id
= vdev_id
;
891 arg
.peer_state
= state
;
892 ether_addr_copy(arg
.addr
, sta
->addr
);
894 cap
.peer_max_sp
= sta
->max_sp
;
895 cap
.peer_uapsd_queues
= sta
->uapsd_queues
;
897 if (state
== WMI_TDLS_PEER_STATE_CONNECTED
&&
898 !sta
->tdls_initiator
)
899 cap
.is_peer_responder
= 1;
901 ret
= ath10k_wmi_tdls_peer_update(ar
, &arg
, &cap
, &chan_arg
);
903 ath10k_warn(ar
, "failed to update tdls peer %pM on vdev %i: %i\n",
904 arg
.addr
, vdev_id
, ret
);
911 /************************/
912 /* Interface management */
913 /************************/
915 void ath10k_mac_vif_beacon_free(struct ath10k_vif
*arvif
)
917 struct ath10k
*ar
= arvif
->ar
;
919 lockdep_assert_held(&ar
->data_lock
);
924 if (!arvif
->beacon_buf
)
925 dma_unmap_single(ar
->dev
, ATH10K_SKB_CB(arvif
->beacon
)->paddr
,
926 arvif
->beacon
->len
, DMA_TO_DEVICE
);
928 if (WARN_ON(arvif
->beacon_state
!= ATH10K_BEACON_SCHEDULED
&&
929 arvif
->beacon_state
!= ATH10K_BEACON_SENT
))
932 dev_kfree_skb_any(arvif
->beacon
);
934 arvif
->beacon
= NULL
;
935 arvif
->beacon_state
= ATH10K_BEACON_SCHEDULED
;
938 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif
*arvif
)
940 struct ath10k
*ar
= arvif
->ar
;
942 lockdep_assert_held(&ar
->data_lock
);
944 ath10k_mac_vif_beacon_free(arvif
);
946 if (arvif
->beacon_buf
) {
947 dma_free_coherent(ar
->dev
, IEEE80211_MAX_FRAME_LEN
,
948 arvif
->beacon_buf
, arvif
->beacon_paddr
);
949 arvif
->beacon_buf
= NULL
;
953 static inline int ath10k_vdev_setup_sync(struct ath10k
*ar
)
955 unsigned long time_left
;
957 lockdep_assert_held(&ar
->conf_mutex
);
959 if (test_bit(ATH10K_FLAG_CRASH_FLUSH
, &ar
->dev_flags
))
962 time_left
= wait_for_completion_timeout(&ar
->vdev_setup_done
,
963 ATH10K_VDEV_SETUP_TIMEOUT_HZ
);
970 static int ath10k_monitor_vdev_start(struct ath10k
*ar
, int vdev_id
)
972 struct cfg80211_chan_def
*chandef
= NULL
;
973 struct ieee80211_channel
*channel
= NULL
;
974 struct wmi_vdev_start_request_arg arg
= {};
977 lockdep_assert_held(&ar
->conf_mutex
);
979 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
980 ath10k_mac_get_any_chandef_iter
,
982 if (WARN_ON_ONCE(!chandef
))
985 channel
= chandef
->chan
;
987 arg
.vdev_id
= vdev_id
;
988 arg
.channel
.freq
= channel
->center_freq
;
989 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
990 arg
.channel
.band_center_freq2
= chandef
->center_freq2
;
992 /* TODO setup this dynamically, what in case we
993 * don't have any vifs?
995 arg
.channel
.mode
= chan_to_phymode(chandef
);
996 arg
.channel
.chan_radar
=
997 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
999 arg
.channel
.min_power
= 0;
1000 arg
.channel
.max_power
= channel
->max_power
* 2;
1001 arg
.channel
.max_reg_power
= channel
->max_reg_power
* 2;
1002 arg
.channel
.max_antenna_gain
= channel
->max_antenna_gain
* 2;
1004 reinit_completion(&ar
->vdev_setup_done
);
1006 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
1008 ath10k_warn(ar
, "failed to request monitor vdev %i start: %d\n",
1013 ret
= ath10k_vdev_setup_sync(ar
);
1015 ath10k_warn(ar
, "failed to synchronize setup for monitor vdev %i start: %d\n",
1020 ret
= ath10k_wmi_vdev_up(ar
, vdev_id
, 0, ar
->mac_addr
);
1022 ath10k_warn(ar
, "failed to put up monitor vdev %i: %d\n",
1027 ar
->monitor_vdev_id
= vdev_id
;
1029 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %i started\n",
1030 ar
->monitor_vdev_id
);
1034 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
1036 ath10k_warn(ar
, "failed to stop monitor vdev %i after start failure: %d\n",
1037 ar
->monitor_vdev_id
, ret
);
1042 static int ath10k_monitor_vdev_stop(struct ath10k
*ar
)
1046 lockdep_assert_held(&ar
->conf_mutex
);
1048 ret
= ath10k_wmi_vdev_down(ar
, ar
->monitor_vdev_id
);
1050 ath10k_warn(ar
, "failed to put down monitor vdev %i: %d\n",
1051 ar
->monitor_vdev_id
, ret
);
1053 reinit_completion(&ar
->vdev_setup_done
);
1055 ret
= ath10k_wmi_vdev_stop(ar
, ar
->monitor_vdev_id
);
1057 ath10k_warn(ar
, "failed to to request monitor vdev %i stop: %d\n",
1058 ar
->monitor_vdev_id
, ret
);
1060 ret
= ath10k_vdev_setup_sync(ar
);
1062 ath10k_warn(ar
, "failed to synchronize monitor vdev %i stop: %d\n",
1063 ar
->monitor_vdev_id
, ret
);
1065 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %i stopped\n",
1066 ar
->monitor_vdev_id
);
1070 static int ath10k_monitor_vdev_create(struct ath10k
*ar
)
1074 lockdep_assert_held(&ar
->conf_mutex
);
1076 if (ar
->free_vdev_map
== 0) {
1077 ath10k_warn(ar
, "failed to find free vdev id for monitor vdev\n");
1081 bit
= __ffs64(ar
->free_vdev_map
);
1083 ar
->monitor_vdev_id
= bit
;
1085 ret
= ath10k_wmi_vdev_create(ar
, ar
->monitor_vdev_id
,
1086 WMI_VDEV_TYPE_MONITOR
,
1089 ath10k_warn(ar
, "failed to request monitor vdev %i creation: %d\n",
1090 ar
->monitor_vdev_id
, ret
);
1094 ar
->free_vdev_map
&= ~(1LL << ar
->monitor_vdev_id
);
1095 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %d created\n",
1096 ar
->monitor_vdev_id
);
1101 static int ath10k_monitor_vdev_delete(struct ath10k
*ar
)
1105 lockdep_assert_held(&ar
->conf_mutex
);
1107 ret
= ath10k_wmi_vdev_delete(ar
, ar
->monitor_vdev_id
);
1109 ath10k_warn(ar
, "failed to request wmi monitor vdev %i removal: %d\n",
1110 ar
->monitor_vdev_id
, ret
);
1114 ar
->free_vdev_map
|= 1LL << ar
->monitor_vdev_id
;
1116 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor vdev %d deleted\n",
1117 ar
->monitor_vdev_id
);
1121 static int ath10k_monitor_start(struct ath10k
*ar
)
1125 lockdep_assert_held(&ar
->conf_mutex
);
1127 ret
= ath10k_monitor_vdev_create(ar
);
1129 ath10k_warn(ar
, "failed to create monitor vdev: %d\n", ret
);
1133 ret
= ath10k_monitor_vdev_start(ar
, ar
->monitor_vdev_id
);
1135 ath10k_warn(ar
, "failed to start monitor vdev: %d\n", ret
);
1136 ath10k_monitor_vdev_delete(ar
);
1140 ar
->monitor_started
= true;
1141 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor started\n");
1146 static int ath10k_monitor_stop(struct ath10k
*ar
)
1150 lockdep_assert_held(&ar
->conf_mutex
);
1152 ret
= ath10k_monitor_vdev_stop(ar
);
1154 ath10k_warn(ar
, "failed to stop monitor vdev: %d\n", ret
);
1158 ret
= ath10k_monitor_vdev_delete(ar
);
1160 ath10k_warn(ar
, "failed to delete monitor vdev: %d\n", ret
);
1164 ar
->monitor_started
= false;
1165 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor stopped\n");
1170 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k
*ar
)
1174 /* At least one chanctx is required to derive a channel to start
1177 num_ctx
= ath10k_mac_num_chanctxs(ar
);
1181 /* If there's already an existing special monitor interface then don't
1182 * bother creating another monitor vdev.
1184 if (ar
->monitor_arvif
)
1187 return ar
->monitor
||
1188 (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST
,
1189 ar
->running_fw
->fw_file
.fw_features
) &&
1190 (ar
->filter_flags
& FIF_OTHER_BSS
)) ||
1191 test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1194 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k
*ar
)
1198 num_ctx
= ath10k_mac_num_chanctxs(ar
);
1200 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1201 * shouldn't allow this but make sure to prevent handling the following
1202 * case anyway since multi-channel DFS hasn't been tested at all.
1204 if (test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
) && num_ctx
> 1)
1210 static int ath10k_monitor_recalc(struct ath10k
*ar
)
1216 lockdep_assert_held(&ar
->conf_mutex
);
1218 needed
= ath10k_mac_monitor_vdev_is_needed(ar
);
1219 allowed
= ath10k_mac_monitor_vdev_is_allowed(ar
);
1221 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
1222 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1223 ar
->monitor_started
, needed
, allowed
);
1225 if (WARN_ON(needed
&& !allowed
)) {
1226 if (ar
->monitor_started
) {
1227 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac monitor stopping disallowed monitor\n");
1229 ret
= ath10k_monitor_stop(ar
);
1231 ath10k_warn(ar
, "failed to stop disallowed monitor: %d\n",
1239 if (needed
== ar
->monitor_started
)
1243 return ath10k_monitor_start(ar
);
1245 return ath10k_monitor_stop(ar
);
1248 static bool ath10k_mac_can_set_cts_prot(struct ath10k_vif
*arvif
)
1250 struct ath10k
*ar
= arvif
->ar
;
1252 lockdep_assert_held(&ar
->conf_mutex
);
1254 if (!arvif
->is_started
) {
1255 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "defer cts setup, vdev is not ready yet\n");
1262 static int ath10k_mac_set_cts_prot(struct ath10k_vif
*arvif
)
1264 struct ath10k
*ar
= arvif
->ar
;
1267 lockdep_assert_held(&ar
->conf_mutex
);
1269 vdev_param
= ar
->wmi
.vdev_param
->protection_mode
;
1271 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d cts_protection %d\n",
1272 arvif
->vdev_id
, arvif
->use_cts_prot
);
1274 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
1275 arvif
->use_cts_prot
? 1 : 0);
1278 static int ath10k_recalc_rtscts_prot(struct ath10k_vif
*arvif
)
1280 struct ath10k
*ar
= arvif
->ar
;
1281 u32 vdev_param
, rts_cts
= 0;
1283 lockdep_assert_held(&ar
->conf_mutex
);
1285 vdev_param
= ar
->wmi
.vdev_param
->enable_rtscts
;
1287 rts_cts
|= SM(WMI_RTSCTS_ENABLED
, WMI_RTSCTS_SET
);
1289 if (arvif
->num_legacy_stations
> 0)
1290 rts_cts
|= SM(WMI_RTSCTS_ACROSS_SW_RETRIES
,
1291 WMI_RTSCTS_PROFILE
);
1293 rts_cts
|= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES
,
1294 WMI_RTSCTS_PROFILE
);
1296 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d recalc rts/cts prot %d\n",
1297 arvif
->vdev_id
, rts_cts
);
1299 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
1303 static int ath10k_start_cac(struct ath10k
*ar
)
1307 lockdep_assert_held(&ar
->conf_mutex
);
1309 set_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1311 ret
= ath10k_monitor_recalc(ar
);
1313 ath10k_warn(ar
, "failed to start monitor (cac): %d\n", ret
);
1314 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1318 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac cac start monitor vdev %d\n",
1319 ar
->monitor_vdev_id
);
1324 static int ath10k_stop_cac(struct ath10k
*ar
)
1326 lockdep_assert_held(&ar
->conf_mutex
);
1328 /* CAC is not running - do nothing */
1329 if (!test_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
))
1332 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
1333 ath10k_monitor_stop(ar
);
1335 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac cac finished\n");
1340 static void ath10k_mac_has_radar_iter(struct ieee80211_hw
*hw
,
1341 struct ieee80211_chanctx_conf
*conf
,
1346 if (!*ret
&& conf
->radar_enabled
)
1350 static bool ath10k_mac_has_radar_enabled(struct ath10k
*ar
)
1352 bool has_radar
= false;
1354 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
1355 ath10k_mac_has_radar_iter
,
1361 static void ath10k_recalc_radar_detection(struct ath10k
*ar
)
1365 lockdep_assert_held(&ar
->conf_mutex
);
1367 ath10k_stop_cac(ar
);
1369 if (!ath10k_mac_has_radar_enabled(ar
))
1372 if (ar
->num_started_vdevs
> 0)
1375 ret
= ath10k_start_cac(ar
);
1378 * Not possible to start CAC on current channel so starting
1379 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1380 * by indicating that radar was detected.
1382 ath10k_warn(ar
, "failed to start CAC: %d\n", ret
);
1383 ieee80211_radar_detected(ar
->hw
);
1387 static int ath10k_vdev_stop(struct ath10k_vif
*arvif
)
1389 struct ath10k
*ar
= arvif
->ar
;
1392 lockdep_assert_held(&ar
->conf_mutex
);
1394 reinit_completion(&ar
->vdev_setup_done
);
1396 ret
= ath10k_wmi_vdev_stop(ar
, arvif
->vdev_id
);
1398 ath10k_warn(ar
, "failed to stop WMI vdev %i: %d\n",
1399 arvif
->vdev_id
, ret
);
1403 ret
= ath10k_vdev_setup_sync(ar
);
1405 ath10k_warn(ar
, "failed to synchronize setup for vdev %i: %d\n",
1406 arvif
->vdev_id
, ret
);
1410 WARN_ON(ar
->num_started_vdevs
== 0);
1412 if (ar
->num_started_vdevs
!= 0) {
1413 ar
->num_started_vdevs
--;
1414 ath10k_recalc_radar_detection(ar
);
1420 static int ath10k_vdev_start_restart(struct ath10k_vif
*arvif
,
1421 const struct cfg80211_chan_def
*chandef
,
1424 struct ath10k
*ar
= arvif
->ar
;
1425 struct wmi_vdev_start_request_arg arg
= {};
1428 lockdep_assert_held(&ar
->conf_mutex
);
1430 reinit_completion(&ar
->vdev_setup_done
);
1432 arg
.vdev_id
= arvif
->vdev_id
;
1433 arg
.dtim_period
= arvif
->dtim_period
;
1434 arg
.bcn_intval
= arvif
->beacon_interval
;
1436 arg
.channel
.freq
= chandef
->chan
->center_freq
;
1437 arg
.channel
.band_center_freq1
= chandef
->center_freq1
;
1438 arg
.channel
.band_center_freq2
= chandef
->center_freq2
;
1439 arg
.channel
.mode
= chan_to_phymode(chandef
);
1441 arg
.channel
.min_power
= 0;
1442 arg
.channel
.max_power
= chandef
->chan
->max_power
* 2;
1443 arg
.channel
.max_reg_power
= chandef
->chan
->max_reg_power
* 2;
1444 arg
.channel
.max_antenna_gain
= chandef
->chan
->max_antenna_gain
* 2;
1446 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
1447 arg
.ssid
= arvif
->u
.ap
.ssid
;
1448 arg
.ssid_len
= arvif
->u
.ap
.ssid_len
;
1449 arg
.hidden_ssid
= arvif
->u
.ap
.hidden_ssid
;
1451 /* For now allow DFS for AP mode */
1452 arg
.channel
.chan_radar
=
1453 !!(chandef
->chan
->flags
& IEEE80211_CHAN_RADAR
);
1454 } else if (arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
1455 arg
.ssid
= arvif
->vif
->bss_conf
.ssid
;
1456 arg
.ssid_len
= arvif
->vif
->bss_conf
.ssid_len
;
1459 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
1460 "mac vdev %d start center_freq %d phymode %s\n",
1461 arg
.vdev_id
, arg
.channel
.freq
,
1462 ath10k_wmi_phymode_str(arg
.channel
.mode
));
1465 ret
= ath10k_wmi_vdev_restart(ar
, &arg
);
1467 ret
= ath10k_wmi_vdev_start(ar
, &arg
);
1470 ath10k_warn(ar
, "failed to start WMI vdev %i: %d\n",
1475 ret
= ath10k_vdev_setup_sync(ar
);
1478 "failed to synchronize setup for vdev %i restart %d: %d\n",
1479 arg
.vdev_id
, restart
, ret
);
1483 ar
->num_started_vdevs
++;
1484 ath10k_recalc_radar_detection(ar
);
1489 static int ath10k_vdev_start(struct ath10k_vif
*arvif
,
1490 const struct cfg80211_chan_def
*def
)
1492 return ath10k_vdev_start_restart(arvif
, def
, false);
1495 static int ath10k_vdev_restart(struct ath10k_vif
*arvif
,
1496 const struct cfg80211_chan_def
*def
)
1498 return ath10k_vdev_start_restart(arvif
, def
, true);
1501 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif
*arvif
,
1502 struct sk_buff
*bcn
)
1504 struct ath10k
*ar
= arvif
->ar
;
1505 struct ieee80211_mgmt
*mgmt
;
1509 if (arvif
->vif
->type
!= NL80211_IFTYPE_AP
|| !arvif
->vif
->p2p
)
1512 mgmt
= (void *)bcn
->data
;
1513 p2p_ie
= cfg80211_find_vendor_ie(WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1514 mgmt
->u
.beacon
.variable
,
1515 bcn
->len
- (mgmt
->u
.beacon
.variable
-
1520 ret
= ath10k_wmi_p2p_go_bcn_ie(ar
, arvif
->vdev_id
, p2p_ie
);
1522 ath10k_warn(ar
, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1523 arvif
->vdev_id
, ret
);
1530 static int ath10k_mac_remove_vendor_ie(struct sk_buff
*skb
, unsigned int oui
,
1531 u8 oui_type
, size_t ie_offset
)
1538 if (WARN_ON(skb
->len
< ie_offset
))
1541 ie
= (u8
*)cfg80211_find_vendor_ie(oui
, oui_type
,
1542 skb
->data
+ ie_offset
,
1543 skb
->len
- ie_offset
);
1548 end
= skb
->data
+ skb
->len
;
1551 if (WARN_ON(next
> end
))
1554 memmove(ie
, next
, end
- next
);
1555 skb_trim(skb
, skb
->len
- len
);
1560 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif
*arvif
)
1562 struct ath10k
*ar
= arvif
->ar
;
1563 struct ieee80211_hw
*hw
= ar
->hw
;
1564 struct ieee80211_vif
*vif
= arvif
->vif
;
1565 struct ieee80211_mutable_offsets offs
= {};
1566 struct sk_buff
*bcn
;
1569 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1572 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
&&
1573 arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
1576 bcn
= ieee80211_beacon_get_template(hw
, vif
, &offs
);
1578 ath10k_warn(ar
, "failed to get beacon template from mac80211\n");
1582 ret
= ath10k_mac_setup_bcn_p2p_ie(arvif
, bcn
);
1584 ath10k_warn(ar
, "failed to setup p2p go bcn ie: %d\n", ret
);
1589 /* P2P IE is inserted by firmware automatically (as configured above)
1590 * so remove it from the base beacon template to avoid duplicate P2P
1591 * IEs in beacon frames.
1593 ath10k_mac_remove_vendor_ie(bcn
, WLAN_OUI_WFA
, WLAN_OUI_TYPE_WFA_P2P
,
1594 offsetof(struct ieee80211_mgmt
,
1595 u
.beacon
.variable
));
1597 ret
= ath10k_wmi_bcn_tmpl(ar
, arvif
->vdev_id
, offs
.tim_offset
, bcn
, 0,
1602 ath10k_warn(ar
, "failed to submit beacon template command: %d\n",
1610 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif
*arvif
)
1612 struct ath10k
*ar
= arvif
->ar
;
1613 struct ieee80211_hw
*hw
= ar
->hw
;
1614 struct ieee80211_vif
*vif
= arvif
->vif
;
1615 struct sk_buff
*prb
;
1618 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1621 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
1624 prb
= ieee80211_proberesp_get(hw
, vif
);
1626 ath10k_warn(ar
, "failed to get probe resp template from mac80211\n");
1630 ret
= ath10k_wmi_prb_tmpl(ar
, arvif
->vdev_id
, prb
);
1634 ath10k_warn(ar
, "failed to submit probe resp template command: %d\n",
1642 static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif
*arvif
)
1644 struct ath10k
*ar
= arvif
->ar
;
1645 struct cfg80211_chan_def def
;
1648 /* When originally vdev is started during assign_vif_chanctx() some
1649 * information is missing, notably SSID. Firmware revisions with beacon
1650 * offloading require the SSID to be provided during vdev (re)start to
1651 * handle hidden SSID properly.
1653 * Vdev restart must be done after vdev has been both started and
1654 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1655 * deliver vdev restart response event causing timeouts during vdev
1656 * syncing in ath10k.
1658 * Note: The vdev down/up and template reinstallation could be skipped
1659 * since only wmi-tlv firmware are known to have beacon offload and
1660 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1661 * response delivery. It's probably more robust to keep it as is.
1663 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
))
1666 if (WARN_ON(!arvif
->is_started
))
1669 if (WARN_ON(!arvif
->is_up
))
1672 if (WARN_ON(ath10k_mac_vif_chan(arvif
->vif
, &def
)))
1675 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
1677 ath10k_warn(ar
, "failed to bring down ap vdev %i: %d\n",
1678 arvif
->vdev_id
, ret
);
1682 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1683 * firmware will crash upon vdev up.
1686 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
1688 ath10k_warn(ar
, "failed to update beacon template: %d\n", ret
);
1692 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
1694 ath10k_warn(ar
, "failed to update presp template: %d\n", ret
);
1698 ret
= ath10k_vdev_restart(arvif
, &def
);
1700 ath10k_warn(ar
, "failed to restart ap vdev %i: %d\n",
1701 arvif
->vdev_id
, ret
);
1705 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
1708 ath10k_warn(ar
, "failed to bring up ap vdev %i: %d\n",
1709 arvif
->vdev_id
, ret
);
1716 static void ath10k_control_beaconing(struct ath10k_vif
*arvif
,
1717 struct ieee80211_bss_conf
*info
)
1719 struct ath10k
*ar
= arvif
->ar
;
1722 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1724 if (!info
->enable_beacon
) {
1725 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
1727 ath10k_warn(ar
, "failed to down vdev_id %i: %d\n",
1728 arvif
->vdev_id
, ret
);
1730 arvif
->is_up
= false;
1732 spin_lock_bh(&arvif
->ar
->data_lock
);
1733 ath10k_mac_vif_beacon_free(arvif
);
1734 spin_unlock_bh(&arvif
->ar
->data_lock
);
1739 arvif
->tx_seq_no
= 0x1000;
1742 ether_addr_copy(arvif
->bssid
, info
->bssid
);
1744 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
1747 ath10k_warn(ar
, "failed to bring up vdev %d: %i\n",
1748 arvif
->vdev_id
, ret
);
1752 arvif
->is_up
= true;
1754 ret
= ath10k_mac_vif_fix_hidden_ssid(arvif
);
1756 ath10k_warn(ar
, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1757 arvif
->vdev_id
, ret
);
1761 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d up\n", arvif
->vdev_id
);
1764 static void ath10k_control_ibss(struct ath10k_vif
*arvif
,
1765 struct ieee80211_bss_conf
*info
,
1766 const u8 self_peer
[ETH_ALEN
])
1768 struct ath10k
*ar
= arvif
->ar
;
1772 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1774 if (!info
->ibss_joined
) {
1775 if (is_zero_ether_addr(arvif
->bssid
))
1778 eth_zero_addr(arvif
->bssid
);
1783 vdev_param
= arvif
->ar
->wmi
.vdev_param
->atim_window
;
1784 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
, arvif
->vdev_id
, vdev_param
,
1785 ATH10K_DEFAULT_ATIM
);
1787 ath10k_warn(ar
, "failed to set IBSS ATIM for vdev %d: %d\n",
1788 arvif
->vdev_id
, ret
);
1791 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif
*arvif
)
1793 struct ath10k
*ar
= arvif
->ar
;
1798 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1800 if (arvif
->u
.sta
.uapsd
)
1801 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER
;
1803 value
= WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS
;
1805 param
= WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD
;
1806 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
, value
);
1808 ath10k_warn(ar
, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1809 value
, arvif
->vdev_id
, ret
);
1816 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif
*arvif
)
1818 struct ath10k
*ar
= arvif
->ar
;
1823 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1825 if (arvif
->u
.sta
.uapsd
)
1826 value
= WMI_STA_PS_PSPOLL_COUNT_UAPSD
;
1828 value
= WMI_STA_PS_PSPOLL_COUNT_NO_MAX
;
1830 param
= WMI_STA_PS_PARAM_PSPOLL_COUNT
;
1831 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
1834 ath10k_warn(ar
, "failed to submit ps poll count %u on vdev %i: %d\n",
1835 value
, arvif
->vdev_id
, ret
);
1842 static int ath10k_mac_num_vifs_started(struct ath10k
*ar
)
1844 struct ath10k_vif
*arvif
;
1847 lockdep_assert_held(&ar
->conf_mutex
);
1849 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
1850 if (arvif
->is_started
)
1856 static int ath10k_mac_vif_setup_ps(struct ath10k_vif
*arvif
)
1858 struct ath10k
*ar
= arvif
->ar
;
1859 struct ieee80211_vif
*vif
= arvif
->vif
;
1860 struct ieee80211_conf
*conf
= &ar
->hw
->conf
;
1861 enum wmi_sta_powersave_param param
;
1862 enum wmi_sta_ps_mode psmode
;
1867 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1869 if (arvif
->vif
->type
!= NL80211_IFTYPE_STATION
)
1872 enable_ps
= arvif
->ps
;
1874 if (enable_ps
&& ath10k_mac_num_vifs_started(ar
) > 1 &&
1875 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT
,
1876 ar
->running_fw
->fw_file
.fw_features
)) {
1877 ath10k_warn(ar
, "refusing to enable ps on vdev %i: not supported by fw\n",
1882 if (!arvif
->is_started
) {
1883 /* mac80211 can update vif powersave state while disconnected.
1884 * Firmware doesn't behave nicely and consumes more power than
1885 * necessary if PS is disabled on a non-started vdev. Hence
1886 * force-enable PS for non-running vdevs.
1888 psmode
= WMI_STA_PS_MODE_ENABLED
;
1889 } else if (enable_ps
) {
1890 psmode
= WMI_STA_PS_MODE_ENABLED
;
1891 param
= WMI_STA_PS_PARAM_INACTIVITY_TIME
;
1893 ps_timeout
= conf
->dynamic_ps_timeout
;
1894 if (ps_timeout
== 0) {
1895 /* Firmware doesn't like 0 */
1896 ps_timeout
= ieee80211_tu_to_usec(
1897 vif
->bss_conf
.beacon_int
) / 1000;
1900 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
, param
,
1903 ath10k_warn(ar
, "failed to set inactivity time for vdev %d: %i\n",
1904 arvif
->vdev_id
, ret
);
1908 psmode
= WMI_STA_PS_MODE_DISABLED
;
1911 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d psmode %s\n",
1912 arvif
->vdev_id
, psmode
? "enable" : "disable");
1914 ret
= ath10k_wmi_set_psmode(ar
, arvif
->vdev_id
, psmode
);
1916 ath10k_warn(ar
, "failed to set PS Mode %d for vdev %d: %d\n",
1917 psmode
, arvif
->vdev_id
, ret
);
1924 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif
*arvif
)
1926 struct ath10k
*ar
= arvif
->ar
;
1927 struct wmi_sta_keepalive_arg arg
= {};
1930 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1932 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
1935 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE
, ar
->wmi
.svc_map
))
1938 /* Some firmware revisions have a bug and ignore the `enabled` field.
1939 * Instead use the interval to disable the keepalive.
1941 arg
.vdev_id
= arvif
->vdev_id
;
1943 arg
.method
= WMI_STA_KEEPALIVE_METHOD_NULL_FRAME
;
1944 arg
.interval
= WMI_STA_KEEPALIVE_INTERVAL_DISABLE
;
1946 ret
= ath10k_wmi_sta_keepalive(ar
, &arg
);
1948 ath10k_warn(ar
, "failed to submit keepalive on vdev %i: %d\n",
1949 arvif
->vdev_id
, ret
);
1956 static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif
*arvif
)
1958 struct ath10k
*ar
= arvif
->ar
;
1959 struct ieee80211_vif
*vif
= arvif
->vif
;
1962 lockdep_assert_held(&arvif
->ar
->conf_mutex
);
1964 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
)))
1967 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
)
1970 if (!vif
->csa_active
)
1976 if (!ieee80211_csa_is_complete(vif
)) {
1977 ieee80211_csa_update_counter(vif
);
1979 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
1981 ath10k_warn(ar
, "failed to update bcn tmpl during csa: %d\n",
1984 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
1986 ath10k_warn(ar
, "failed to update prb tmpl during csa: %d\n",
1989 ieee80211_csa_finish(vif
);
1993 static void ath10k_mac_vif_ap_csa_work(struct work_struct
*work
)
1995 struct ath10k_vif
*arvif
= container_of(work
, struct ath10k_vif
,
1997 struct ath10k
*ar
= arvif
->ar
;
1999 mutex_lock(&ar
->conf_mutex
);
2000 ath10k_mac_vif_ap_csa_count_down(arvif
);
2001 mutex_unlock(&ar
->conf_mutex
);
2004 static void ath10k_mac_handle_beacon_iter(void *data
, u8
*mac
,
2005 struct ieee80211_vif
*vif
)
2007 struct sk_buff
*skb
= data
;
2008 struct ieee80211_mgmt
*mgmt
= (void *)skb
->data
;
2009 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2011 if (vif
->type
!= NL80211_IFTYPE_STATION
)
2014 if (!ether_addr_equal(mgmt
->bssid
, vif
->bss_conf
.bssid
))
2017 cancel_delayed_work(&arvif
->connection_loss_work
);
2020 void ath10k_mac_handle_beacon(struct ath10k
*ar
, struct sk_buff
*skb
)
2022 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
2023 IEEE80211_IFACE_ITER_NORMAL
,
2024 ath10k_mac_handle_beacon_iter
,
2028 static void ath10k_mac_handle_beacon_miss_iter(void *data
, u8
*mac
,
2029 struct ieee80211_vif
*vif
)
2031 u32
*vdev_id
= data
;
2032 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2033 struct ath10k
*ar
= arvif
->ar
;
2034 struct ieee80211_hw
*hw
= ar
->hw
;
2036 if (arvif
->vdev_id
!= *vdev_id
)
2042 ieee80211_beacon_loss(vif
);
2044 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
2045 * (done by mac80211) succeeds but beacons do not resume then it
2046 * doesn't make sense to continue operation. Queue connection loss work
2047 * which can be cancelled when beacon is received.
2049 ieee80211_queue_delayed_work(hw
, &arvif
->connection_loss_work
,
2050 ATH10K_CONNECTION_LOSS_HZ
);
2053 void ath10k_mac_handle_beacon_miss(struct ath10k
*ar
, u32 vdev_id
)
2055 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
2056 IEEE80211_IFACE_ITER_NORMAL
,
2057 ath10k_mac_handle_beacon_miss_iter
,
2061 static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct
*work
)
2063 struct ath10k_vif
*arvif
= container_of(work
, struct ath10k_vif
,
2064 connection_loss_work
.work
);
2065 struct ieee80211_vif
*vif
= arvif
->vif
;
2070 ieee80211_connection_loss(vif
);
2073 /**********************/
2074 /* Station management */
2075 /**********************/
2077 static u32
ath10k_peer_assoc_h_listen_intval(struct ath10k
*ar
,
2078 struct ieee80211_vif
*vif
)
2080 /* Some firmware revisions have unstable STA powersave when listen
2081 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
2082 * generate NullFunc frames properly even if buffered frames have been
2083 * indicated in Beacon TIM. Firmware would seldom wake up to pull
2084 * buffered frames. Often pinging the device from AP would simply fail.
2086 * As a workaround set it to 1.
2088 if (vif
->type
== NL80211_IFTYPE_STATION
)
2091 return ar
->hw
->conf
.listen_interval
;
2094 static void ath10k_peer_assoc_h_basic(struct ath10k
*ar
,
2095 struct ieee80211_vif
*vif
,
2096 struct ieee80211_sta
*sta
,
2097 struct wmi_peer_assoc_complete_arg
*arg
)
2099 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2102 lockdep_assert_held(&ar
->conf_mutex
);
2104 if (vif
->type
== NL80211_IFTYPE_STATION
)
2105 aid
= vif
->bss_conf
.aid
;
2109 ether_addr_copy(arg
->addr
, sta
->addr
);
2110 arg
->vdev_id
= arvif
->vdev_id
;
2111 arg
->peer_aid
= aid
;
2112 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->auth
;
2113 arg
->peer_listen_intval
= ath10k_peer_assoc_h_listen_intval(ar
, vif
);
2114 arg
->peer_num_spatial_streams
= 1;
2115 arg
->peer_caps
= vif
->bss_conf
.assoc_capability
;
2118 static void ath10k_peer_assoc_h_crypto(struct ath10k
*ar
,
2119 struct ieee80211_vif
*vif
,
2120 struct ieee80211_sta
*sta
,
2121 struct wmi_peer_assoc_complete_arg
*arg
)
2123 struct ieee80211_bss_conf
*info
= &vif
->bss_conf
;
2124 struct cfg80211_chan_def def
;
2125 struct cfg80211_bss
*bss
;
2126 const u8
*rsnie
= NULL
;
2127 const u8
*wpaie
= NULL
;
2129 lockdep_assert_held(&ar
->conf_mutex
);
2131 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2134 bss
= cfg80211_get_bss(ar
->hw
->wiphy
, def
.chan
, info
->bssid
, NULL
, 0,
2135 IEEE80211_BSS_TYPE_ANY
, IEEE80211_PRIVACY_ANY
);
2137 const struct cfg80211_bss_ies
*ies
;
2140 rsnie
= ieee80211_bss_get_ie(bss
, WLAN_EID_RSN
);
2142 ies
= rcu_dereference(bss
->ies
);
2144 wpaie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
2145 WLAN_OUI_TYPE_MICROSOFT_WPA
,
2149 cfg80211_put_bss(ar
->hw
->wiphy
, bss
);
2152 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2153 if (rsnie
|| wpaie
) {
2154 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "%s: rsn ie found\n", __func__
);
2155 arg
->peer_flags
|= ar
->wmi
.peer_flags
->need_ptk_4_way
;
2159 ath10k_dbg(ar
, ATH10K_DBG_WMI
, "%s: wpa ie found\n", __func__
);
2160 arg
->peer_flags
|= ar
->wmi
.peer_flags
->need_gtk_2_way
;
2164 test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT
,
2165 ar
->running_fw
->fw_file
.fw_features
)) {
2166 arg
->peer_flags
|= ar
->wmi
.peer_flags
->pmf
;
2170 static void ath10k_peer_assoc_h_rates(struct ath10k
*ar
,
2171 struct ieee80211_vif
*vif
,
2172 struct ieee80211_sta
*sta
,
2173 struct wmi_peer_assoc_complete_arg
*arg
)
2175 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2176 struct wmi_rate_set_arg
*rateset
= &arg
->peer_legacy_rates
;
2177 struct cfg80211_chan_def def
;
2178 const struct ieee80211_supported_band
*sband
;
2179 const struct ieee80211_rate
*rates
;
2180 enum nl80211_band band
;
2185 lockdep_assert_held(&ar
->conf_mutex
);
2187 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2190 band
= def
.chan
->band
;
2191 sband
= ar
->hw
->wiphy
->bands
[band
];
2192 ratemask
= sta
->supp_rates
[band
];
2193 ratemask
&= arvif
->bitrate_mask
.control
[band
].legacy
;
2194 rates
= sband
->bitrates
;
2196 rateset
->num_rates
= 0;
2198 for (i
= 0; i
< 32; i
++, ratemask
>>= 1, rates
++) {
2199 if (!(ratemask
& 1))
2202 rate
= ath10k_mac_bitrate_to_rate(rates
->bitrate
);
2203 rateset
->rates
[rateset
->num_rates
] = rate
;
2204 rateset
->num_rates
++;
2209 ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask
[IEEE80211_HT_MCS_MASK_LEN
])
2213 for (nss
= 0; nss
< IEEE80211_HT_MCS_MASK_LEN
; nss
++)
2214 if (ht_mcs_mask
[nss
])
2221 ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask
[NL80211_VHT_NSS_MAX
])
2225 for (nss
= 0; nss
< NL80211_VHT_NSS_MAX
; nss
++)
2226 if (vht_mcs_mask
[nss
])
2232 static void ath10k_peer_assoc_h_ht(struct ath10k
*ar
,
2233 struct ieee80211_vif
*vif
,
2234 struct ieee80211_sta
*sta
,
2235 struct wmi_peer_assoc_complete_arg
*arg
)
2237 const struct ieee80211_sta_ht_cap
*ht_cap
= &sta
->ht_cap
;
2238 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2239 struct cfg80211_chan_def def
;
2240 enum nl80211_band band
;
2241 const u8
*ht_mcs_mask
;
2242 const u16
*vht_mcs_mask
;
2247 lockdep_assert_held(&ar
->conf_mutex
);
2249 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2252 if (!ht_cap
->ht_supported
)
2255 band
= def
.chan
->band
;
2256 ht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].ht_mcs
;
2257 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
2259 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask
) &&
2260 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
))
2263 arg
->peer_flags
|= ar
->wmi
.peer_flags
->ht
;
2264 arg
->peer_max_mpdu
= (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
2265 ht_cap
->ampdu_factor
)) - 1;
2267 arg
->peer_mpdu_density
=
2268 ath10k_parse_mpdudensity(ht_cap
->ampdu_density
);
2270 arg
->peer_ht_caps
= ht_cap
->cap
;
2271 arg
->peer_rate_caps
|= WMI_RC_HT_FLAG
;
2273 if (ht_cap
->cap
& IEEE80211_HT_CAP_LDPC_CODING
)
2274 arg
->peer_flags
|= ar
->wmi
.peer_flags
->ldbc
;
2276 if (sta
->bandwidth
>= IEEE80211_STA_RX_BW_40
) {
2277 arg
->peer_flags
|= ar
->wmi
.peer_flags
->bw40
;
2278 arg
->peer_rate_caps
|= WMI_RC_CW40_FLAG
;
2281 if (arvif
->bitrate_mask
.control
[band
].gi
!= NL80211_TXRATE_FORCE_LGI
) {
2282 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_20
)
2283 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
2285 if (ht_cap
->cap
& IEEE80211_HT_CAP_SGI_40
)
2286 arg
->peer_rate_caps
|= WMI_RC_SGI_FLAG
;
2289 if (ht_cap
->cap
& IEEE80211_HT_CAP_TX_STBC
) {
2290 arg
->peer_rate_caps
|= WMI_RC_TX_STBC_FLAG
;
2291 arg
->peer_flags
|= ar
->wmi
.peer_flags
->stbc
;
2294 if (ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
) {
2295 stbc
= ht_cap
->cap
& IEEE80211_HT_CAP_RX_STBC
;
2296 stbc
= stbc
>> IEEE80211_HT_CAP_RX_STBC_SHIFT
;
2297 stbc
= stbc
<< WMI_RC_RX_STBC_FLAG_S
;
2298 arg
->peer_rate_caps
|= stbc
;
2299 arg
->peer_flags
|= ar
->wmi
.peer_flags
->stbc
;
2302 if (ht_cap
->mcs
.rx_mask
[1] && ht_cap
->mcs
.rx_mask
[2])
2303 arg
->peer_rate_caps
|= WMI_RC_TS_FLAG
;
2304 else if (ht_cap
->mcs
.rx_mask
[1])
2305 arg
->peer_rate_caps
|= WMI_RC_DS_FLAG
;
2307 for (i
= 0, n
= 0, max_nss
= 0; i
< IEEE80211_HT_MCS_MASK_LEN
* 8; i
++)
2308 if ((ht_cap
->mcs
.rx_mask
[i
/ 8] & BIT(i
% 8)) &&
2309 (ht_mcs_mask
[i
/ 8] & BIT(i
% 8))) {
2310 max_nss
= (i
/ 8) + 1;
2311 arg
->peer_ht_rates
.rates
[n
++] = i
;
2315 * This is a workaround for HT-enabled STAs which break the spec
2316 * and have no HT capabilities RX mask (no HT RX MCS map).
2318 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2319 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2321 * Firmware asserts if such situation occurs.
2324 arg
->peer_ht_rates
.num_rates
= 8;
2325 for (i
= 0; i
< arg
->peer_ht_rates
.num_rates
; i
++)
2326 arg
->peer_ht_rates
.rates
[i
] = i
;
2328 arg
->peer_ht_rates
.num_rates
= n
;
2329 arg
->peer_num_spatial_streams
= min(sta
->rx_nss
, max_nss
);
2332 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac ht peer %pM mcs cnt %d nss %d\n",
2334 arg
->peer_ht_rates
.num_rates
,
2335 arg
->peer_num_spatial_streams
);
2338 static int ath10k_peer_assoc_qos_ap(struct ath10k
*ar
,
2339 struct ath10k_vif
*arvif
,
2340 struct ieee80211_sta
*sta
)
2346 lockdep_assert_held(&ar
->conf_mutex
);
2348 if (sta
->wme
&& sta
->uapsd_queues
) {
2349 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac uapsd_queues 0x%x max_sp %d\n",
2350 sta
->uapsd_queues
, sta
->max_sp
);
2352 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
)
2353 uapsd
|= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN
|
2354 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN
;
2355 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_VI
)
2356 uapsd
|= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN
|
2357 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN
;
2358 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
)
2359 uapsd
|= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN
|
2360 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN
;
2361 if (sta
->uapsd_queues
& IEEE80211_WMM_IE_STA_QOSINFO_AC_BE
)
2362 uapsd
|= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN
|
2363 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN
;
2365 if (sta
->max_sp
< MAX_WMI_AP_PS_PEER_PARAM_MAX_SP
)
2366 max_sp
= sta
->max_sp
;
2368 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
2370 WMI_AP_PS_PEER_PARAM_UAPSD
,
2373 ath10k_warn(ar
, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2374 arvif
->vdev_id
, ret
);
2378 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
,
2380 WMI_AP_PS_PEER_PARAM_MAX_SP
,
2383 ath10k_warn(ar
, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2384 arvif
->vdev_id
, ret
);
2388 /* TODO setup this based on STA listen interval and
2389 * beacon interval. Currently we don't know
2390 * sta->listen_interval - mac80211 patch required.
2391 * Currently use 10 seconds
2393 ret
= ath10k_wmi_set_ap_ps_param(ar
, arvif
->vdev_id
, sta
->addr
,
2394 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME
,
2397 ath10k_warn(ar
, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2398 arvif
->vdev_id
, ret
);
2407 ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set
,
2408 const u16 vht_mcs_limit
[NL80211_VHT_NSS_MAX
])
2415 for (nss
= 0; nss
< NL80211_VHT_NSS_MAX
; nss
++) {
2416 mcs_map
= ath10k_mac_get_max_vht_mcs_map(tx_mcs_set
, nss
) &
2420 idx_limit
= fls(mcs_map
) - 1;
2424 switch (idx_limit
) {
2425 case 0: /* fall through */
2426 case 1: /* fall through */
2427 case 2: /* fall through */
2428 case 3: /* fall through */
2429 case 4: /* fall through */
2430 case 5: /* fall through */
2431 case 6: /* fall through */
2433 /* see ath10k_mac_can_set_bitrate_mask() */
2437 mcs
= IEEE80211_VHT_MCS_NOT_SUPPORTED
;
2440 mcs
= IEEE80211_VHT_MCS_SUPPORT_0_7
;
2443 mcs
= IEEE80211_VHT_MCS_SUPPORT_0_8
;
2446 mcs
= IEEE80211_VHT_MCS_SUPPORT_0_9
;
2450 tx_mcs_set
&= ~(0x3 << (nss
* 2));
2451 tx_mcs_set
|= mcs
<< (nss
* 2);
2457 static void ath10k_peer_assoc_h_vht(struct ath10k
*ar
,
2458 struct ieee80211_vif
*vif
,
2459 struct ieee80211_sta
*sta
,
2460 struct wmi_peer_assoc_complete_arg
*arg
)
2462 const struct ieee80211_sta_vht_cap
*vht_cap
= &sta
->vht_cap
;
2463 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2464 struct cfg80211_chan_def def
;
2465 enum nl80211_band band
;
2466 const u16
*vht_mcs_mask
;
2468 u8 max_nss
, vht_mcs
;
2471 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2474 if (!vht_cap
->vht_supported
)
2477 band
= def
.chan
->band
;
2478 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
2480 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
))
2483 arg
->peer_flags
|= ar
->wmi
.peer_flags
->vht
;
2485 if (def
.chan
->band
== NL80211_BAND_2GHZ
)
2486 arg
->peer_flags
|= ar
->wmi
.peer_flags
->vht_2g
;
2488 arg
->peer_vht_caps
= vht_cap
->cap
;
2490 ampdu_factor
= (vht_cap
->cap
&
2491 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
) >>
2492 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT
;
2494 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2495 * zero in VHT IE. Using it would result in degraded throughput.
2496 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2497 * it if VHT max_mpdu is smaller.
2499 arg
->peer_max_mpdu
= max(arg
->peer_max_mpdu
,
2500 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR
+
2501 ampdu_factor
)) - 1);
2503 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
2504 arg
->peer_flags
|= ar
->wmi
.peer_flags
->bw80
;
2506 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_160
)
2507 arg
->peer_flags
|= ar
->wmi
.peer_flags
->bw160
;
2509 /* Calculate peer NSS capability from VHT capabilities if STA
2512 for (i
= 0, max_nss
= 0, vht_mcs
= 0; i
< NL80211_VHT_NSS_MAX
; i
++) {
2513 vht_mcs
= __le16_to_cpu(vht_cap
->vht_mcs
.rx_mcs_map
) >>
2516 if ((vht_mcs
!= IEEE80211_VHT_MCS_NOT_SUPPORTED
) &&
2520 arg
->peer_num_spatial_streams
= min(sta
->rx_nss
, max_nss
);
2521 arg
->peer_vht_rates
.rx_max_rate
=
2522 __le16_to_cpu(vht_cap
->vht_mcs
.rx_highest
);
2523 arg
->peer_vht_rates
.rx_mcs_set
=
2524 __le16_to_cpu(vht_cap
->vht_mcs
.rx_mcs_map
);
2525 arg
->peer_vht_rates
.tx_max_rate
=
2526 __le16_to_cpu(vht_cap
->vht_mcs
.tx_highest
);
2527 arg
->peer_vht_rates
.tx_mcs_set
= ath10k_peer_assoc_h_vht_limit(
2528 __le16_to_cpu(vht_cap
->vht_mcs
.tx_mcs_map
), vht_mcs_mask
);
2530 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
2531 sta
->addr
, arg
->peer_max_mpdu
, arg
->peer_flags
);
2533 if (arg
->peer_vht_rates
.rx_max_rate
&&
2534 (sta
->vht_cap
.cap
& IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK
)) {
2535 switch (arg
->peer_vht_rates
.rx_max_rate
) {
2537 /* Must be 2x2 at 160Mhz is all it can do. */
2538 arg
->peer_bw_rxnss_override
= 2;
2541 /* Can only do 1x1 at 160Mhz (Long Guard Interval) */
2542 arg
->peer_bw_rxnss_override
= 1;
2548 static void ath10k_peer_assoc_h_qos(struct ath10k
*ar
,
2549 struct ieee80211_vif
*vif
,
2550 struct ieee80211_sta
*sta
,
2551 struct wmi_peer_assoc_complete_arg
*arg
)
2553 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2555 switch (arvif
->vdev_type
) {
2556 case WMI_VDEV_TYPE_AP
:
2558 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->qos
;
2560 if (sta
->wme
&& sta
->uapsd_queues
) {
2561 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->apsd
;
2562 arg
->peer_rate_caps
|= WMI_RC_UAPSD_FLAG
;
2565 case WMI_VDEV_TYPE_STA
:
2567 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->qos
;
2569 case WMI_VDEV_TYPE_IBSS
:
2571 arg
->peer_flags
|= arvif
->ar
->wmi
.peer_flags
->qos
;
2577 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac peer %pM qos %d\n",
2578 sta
->addr
, !!(arg
->peer_flags
&
2579 arvif
->ar
->wmi
.peer_flags
->qos
));
2582 static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta
*sta
)
2584 return sta
->supp_rates
[NL80211_BAND_2GHZ
] >>
2585 ATH10K_MAC_FIRST_OFDM_RATE_IDX
;
2588 static enum wmi_phy_mode
ath10k_mac_get_phymode_vht(struct ath10k
*ar
,
2589 struct ieee80211_sta
*sta
)
2591 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_160
) {
2592 switch (sta
->vht_cap
.cap
& IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK
) {
2593 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ
:
2594 return MODE_11AC_VHT160
;
2595 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ
:
2596 return MODE_11AC_VHT80_80
;
2598 /* not sure if this is a valid case? */
2599 return MODE_11AC_VHT160
;
2603 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_80
)
2604 return MODE_11AC_VHT80
;
2606 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
2607 return MODE_11AC_VHT40
;
2609 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_20
)
2610 return MODE_11AC_VHT20
;
2612 return MODE_UNKNOWN
;
2615 static void ath10k_peer_assoc_h_phymode(struct ath10k
*ar
,
2616 struct ieee80211_vif
*vif
,
2617 struct ieee80211_sta
*sta
,
2618 struct wmi_peer_assoc_complete_arg
*arg
)
2620 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2621 struct cfg80211_chan_def def
;
2622 enum nl80211_band band
;
2623 const u8
*ht_mcs_mask
;
2624 const u16
*vht_mcs_mask
;
2625 enum wmi_phy_mode phymode
= MODE_UNKNOWN
;
2627 if (WARN_ON(ath10k_mac_vif_chan(vif
, &def
)))
2630 band
= def
.chan
->band
;
2631 ht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].ht_mcs
;
2632 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
2635 case NL80211_BAND_2GHZ
:
2636 if (sta
->vht_cap
.vht_supported
&&
2637 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
)) {
2638 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
2639 phymode
= MODE_11AC_VHT40
;
2641 phymode
= MODE_11AC_VHT20
;
2642 } else if (sta
->ht_cap
.ht_supported
&&
2643 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask
)) {
2644 if (sta
->bandwidth
== IEEE80211_STA_RX_BW_40
)
2645 phymode
= MODE_11NG_HT40
;
2647 phymode
= MODE_11NG_HT20
;
2648 } else if (ath10k_mac_sta_has_ofdm_only(sta
)) {
2655 case NL80211_BAND_5GHZ
:
2659 if (sta
->vht_cap
.vht_supported
&&
2660 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask
)) {
2661 phymode
= ath10k_mac_get_phymode_vht(ar
, sta
);
2662 } else if (sta
->ht_cap
.ht_supported
&&
2663 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask
)) {
2664 if (sta
->bandwidth
>= IEEE80211_STA_RX_BW_40
)
2665 phymode
= MODE_11NA_HT40
;
2667 phymode
= MODE_11NA_HT20
;
2677 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac peer %pM phymode %s\n",
2678 sta
->addr
, ath10k_wmi_phymode_str(phymode
));
2680 arg
->peer_phymode
= phymode
;
2681 WARN_ON(phymode
== MODE_UNKNOWN
);
2684 static int ath10k_peer_assoc_prepare(struct ath10k
*ar
,
2685 struct ieee80211_vif
*vif
,
2686 struct ieee80211_sta
*sta
,
2687 struct wmi_peer_assoc_complete_arg
*arg
)
2689 lockdep_assert_held(&ar
->conf_mutex
);
2691 memset(arg
, 0, sizeof(*arg
));
2693 ath10k_peer_assoc_h_basic(ar
, vif
, sta
, arg
);
2694 ath10k_peer_assoc_h_crypto(ar
, vif
, sta
, arg
);
2695 ath10k_peer_assoc_h_rates(ar
, vif
, sta
, arg
);
2696 ath10k_peer_assoc_h_ht(ar
, vif
, sta
, arg
);
2697 ath10k_peer_assoc_h_vht(ar
, vif
, sta
, arg
);
2698 ath10k_peer_assoc_h_qos(ar
, vif
, sta
, arg
);
2699 ath10k_peer_assoc_h_phymode(ar
, vif
, sta
, arg
);
2704 static const u32 ath10k_smps_map
[] = {
2705 [WLAN_HT_CAP_SM_PS_STATIC
] = WMI_PEER_SMPS_STATIC
,
2706 [WLAN_HT_CAP_SM_PS_DYNAMIC
] = WMI_PEER_SMPS_DYNAMIC
,
2707 [WLAN_HT_CAP_SM_PS_INVALID
] = WMI_PEER_SMPS_PS_NONE
,
2708 [WLAN_HT_CAP_SM_PS_DISABLED
] = WMI_PEER_SMPS_PS_NONE
,
2711 static int ath10k_setup_peer_smps(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
2713 const struct ieee80211_sta_ht_cap
*ht_cap
)
2717 if (!ht_cap
->ht_supported
)
2720 smps
= ht_cap
->cap
& IEEE80211_HT_CAP_SM_PS
;
2721 smps
>>= IEEE80211_HT_CAP_SM_PS_SHIFT
;
2723 if (smps
>= ARRAY_SIZE(ath10k_smps_map
))
2726 return ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, addr
,
2727 WMI_PEER_SMPS_STATE
,
2728 ath10k_smps_map
[smps
]);
2731 static int ath10k_mac_vif_recalc_txbf(struct ath10k
*ar
,
2732 struct ieee80211_vif
*vif
,
2733 struct ieee80211_sta_vht_cap vht_cap
)
2735 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2740 if (ath10k_wmi_get_txbf_conf_scheme(ar
) != WMI_TXBF_CONF_AFTER_ASSOC
)
2743 if (!(ar
->vht_cap_info
&
2744 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
2745 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
|
2746 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
2747 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)))
2750 param
= ar
->wmi
.vdev_param
->txbf
;
2753 if (WARN_ON(param
== WMI_VDEV_PARAM_UNSUPPORTED
))
2756 /* The following logic is correct. If a remote STA advertises support
2757 * for being a beamformer then we should enable us being a beamformee.
2760 if (ar
->vht_cap_info
&
2761 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
2762 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)) {
2763 if (vht_cap
.cap
& IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
)
2764 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
2766 if (vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)
2767 value
|= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
;
2770 if (ar
->vht_cap_info
&
2771 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
2772 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)) {
2773 if (vht_cap
.cap
& IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
)
2774 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
2776 if (vht_cap
.cap
& IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)
2777 value
|= WMI_VDEV_PARAM_TXBF_MU_TX_BFER
;
2780 if (value
& WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
)
2781 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
2783 if (value
& WMI_VDEV_PARAM_TXBF_MU_TX_BFER
)
2784 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
2786 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, param
, value
);
2788 ath10k_warn(ar
, "failed to submit vdev param txbf 0x%x: %d\n",
2796 /* can be called only in mac80211 callbacks due to `key_count` usage */
2797 static void ath10k_bss_assoc(struct ieee80211_hw
*hw
,
2798 struct ieee80211_vif
*vif
,
2799 struct ieee80211_bss_conf
*bss_conf
)
2801 struct ath10k
*ar
= hw
->priv
;
2802 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2803 struct ieee80211_sta_ht_cap ht_cap
;
2804 struct ieee80211_sta_vht_cap vht_cap
;
2805 struct wmi_peer_assoc_complete_arg peer_arg
;
2806 struct ieee80211_sta
*ap_sta
;
2809 lockdep_assert_held(&ar
->conf_mutex
);
2811 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i assoc bssid %pM aid %d\n",
2812 arvif
->vdev_id
, arvif
->bssid
, arvif
->aid
);
2816 ap_sta
= ieee80211_find_sta(vif
, bss_conf
->bssid
);
2818 ath10k_warn(ar
, "failed to find station entry for bss %pM vdev %i\n",
2819 bss_conf
->bssid
, arvif
->vdev_id
);
2824 /* ap_sta must be accessed only within rcu section which must be left
2825 * before calling ath10k_setup_peer_smps() which might sleep.
2827 ht_cap
= ap_sta
->ht_cap
;
2828 vht_cap
= ap_sta
->vht_cap
;
2830 ret
= ath10k_peer_assoc_prepare(ar
, vif
, ap_sta
, &peer_arg
);
2832 ath10k_warn(ar
, "failed to prepare peer assoc for %pM vdev %i: %d\n",
2833 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
2840 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
2842 ath10k_warn(ar
, "failed to run peer assoc for %pM vdev %i: %d\n",
2843 bss_conf
->bssid
, arvif
->vdev_id
, ret
);
2847 ret
= ath10k_setup_peer_smps(ar
, arvif
, bss_conf
->bssid
, &ht_cap
);
2849 ath10k_warn(ar
, "failed to setup peer SMPS for vdev %i: %d\n",
2850 arvif
->vdev_id
, ret
);
2854 ret
= ath10k_mac_vif_recalc_txbf(ar
, vif
, vht_cap
);
2856 ath10k_warn(ar
, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
2857 arvif
->vdev_id
, bss_conf
->bssid
, ret
);
2861 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
2862 "mac vdev %d up (associated) bssid %pM aid %d\n",
2863 arvif
->vdev_id
, bss_conf
->bssid
, bss_conf
->aid
);
2865 WARN_ON(arvif
->is_up
);
2867 arvif
->aid
= bss_conf
->aid
;
2868 ether_addr_copy(arvif
->bssid
, bss_conf
->bssid
);
2870 ret
= ath10k_wmi_vdev_up(ar
, arvif
->vdev_id
, arvif
->aid
, arvif
->bssid
);
2872 ath10k_warn(ar
, "failed to set vdev %d up: %d\n",
2873 arvif
->vdev_id
, ret
);
2877 arvif
->is_up
= true;
2879 /* Workaround: Some firmware revisions (tested with qca6174
2880 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
2881 * poked with peer param command.
2883 ret
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, arvif
->bssid
,
2884 WMI_PEER_DUMMY_VAR
, 1);
2886 ath10k_warn(ar
, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
2887 arvif
->bssid
, arvif
->vdev_id
, ret
);
2892 static void ath10k_bss_disassoc(struct ieee80211_hw
*hw
,
2893 struct ieee80211_vif
*vif
)
2895 struct ath10k
*ar
= hw
->priv
;
2896 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2897 struct ieee80211_sta_vht_cap vht_cap
= {};
2900 lockdep_assert_held(&ar
->conf_mutex
);
2902 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i disassoc bssid %pM\n",
2903 arvif
->vdev_id
, arvif
->bssid
);
2905 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
2907 ath10k_warn(ar
, "failed to down vdev %i: %d\n",
2908 arvif
->vdev_id
, ret
);
2910 arvif
->def_wep_key_idx
= -1;
2912 ret
= ath10k_mac_vif_recalc_txbf(ar
, vif
, vht_cap
);
2914 ath10k_warn(ar
, "failed to recalc txbf for vdev %i: %d\n",
2915 arvif
->vdev_id
, ret
);
2919 arvif
->is_up
= false;
2921 cancel_delayed_work_sync(&arvif
->connection_loss_work
);
2924 static int ath10k_station_assoc(struct ath10k
*ar
,
2925 struct ieee80211_vif
*vif
,
2926 struct ieee80211_sta
*sta
,
2929 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2930 struct wmi_peer_assoc_complete_arg peer_arg
;
2933 lockdep_assert_held(&ar
->conf_mutex
);
2935 ret
= ath10k_peer_assoc_prepare(ar
, vif
, sta
, &peer_arg
);
2937 ath10k_warn(ar
, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
2938 sta
->addr
, arvif
->vdev_id
, ret
);
2942 ret
= ath10k_wmi_peer_assoc(ar
, &peer_arg
);
2944 ath10k_warn(ar
, "failed to run peer assoc for STA %pM vdev %i: %d\n",
2945 sta
->addr
, arvif
->vdev_id
, ret
);
2949 /* Re-assoc is run only to update supported rates for given station. It
2950 * doesn't make much sense to reconfigure the peer completely.
2953 ret
= ath10k_setup_peer_smps(ar
, arvif
, sta
->addr
,
2956 ath10k_warn(ar
, "failed to setup peer SMPS for vdev %d: %d\n",
2957 arvif
->vdev_id
, ret
);
2961 ret
= ath10k_peer_assoc_qos_ap(ar
, arvif
, sta
);
2963 ath10k_warn(ar
, "failed to set qos params for STA %pM for vdev %i: %d\n",
2964 sta
->addr
, arvif
->vdev_id
, ret
);
2969 arvif
->num_legacy_stations
++;
2970 ret
= ath10k_recalc_rtscts_prot(arvif
);
2972 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
2973 arvif
->vdev_id
, ret
);
2978 /* Plumb cached keys only for static WEP */
2979 if (arvif
->def_wep_key_idx
!= -1) {
2980 ret
= ath10k_install_peer_wep_keys(arvif
, sta
->addr
);
2982 ath10k_warn(ar
, "failed to install peer wep keys for vdev %i: %d\n",
2983 arvif
->vdev_id
, ret
);
2992 static int ath10k_station_disassoc(struct ath10k
*ar
,
2993 struct ieee80211_vif
*vif
,
2994 struct ieee80211_sta
*sta
)
2996 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
2999 lockdep_assert_held(&ar
->conf_mutex
);
3002 arvif
->num_legacy_stations
--;
3003 ret
= ath10k_recalc_rtscts_prot(arvif
);
3005 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3006 arvif
->vdev_id
, ret
);
3011 ret
= ath10k_clear_peer_keys(arvif
, sta
->addr
);
3013 ath10k_warn(ar
, "failed to clear all peer wep keys for vdev %i: %d\n",
3014 arvif
->vdev_id
, ret
);
3025 static int ath10k_update_channel_list(struct ath10k
*ar
)
3027 struct ieee80211_hw
*hw
= ar
->hw
;
3028 struct ieee80211_supported_band
**bands
;
3029 enum nl80211_band band
;
3030 struct ieee80211_channel
*channel
;
3031 struct wmi_scan_chan_list_arg arg
= {0};
3032 struct wmi_channel_arg
*ch
;
3038 lockdep_assert_held(&ar
->conf_mutex
);
3040 bands
= hw
->wiphy
->bands
;
3041 for (band
= 0; band
< NUM_NL80211_BANDS
; band
++) {
3045 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
3046 if (bands
[band
]->channels
[i
].flags
&
3047 IEEE80211_CHAN_DISABLED
)
3054 len
= sizeof(struct wmi_channel_arg
) * arg
.n_channels
;
3055 arg
.channels
= kzalloc(len
, GFP_KERNEL
);
3060 for (band
= 0; band
< NUM_NL80211_BANDS
; band
++) {
3064 for (i
= 0; i
< bands
[band
]->n_channels
; i
++) {
3065 channel
= &bands
[band
]->channels
[i
];
3067 if (channel
->flags
& IEEE80211_CHAN_DISABLED
)
3070 ch
->allow_ht
= true;
3072 /* FIXME: when should we really allow VHT? */
3073 ch
->allow_vht
= true;
3076 !(channel
->flags
& IEEE80211_CHAN_NO_IR
);
3079 !(channel
->flags
& IEEE80211_CHAN_NO_HT40PLUS
);
3082 !!(channel
->flags
& IEEE80211_CHAN_RADAR
);
3084 passive
= channel
->flags
& IEEE80211_CHAN_NO_IR
;
3085 ch
->passive
= passive
;
3087 ch
->freq
= channel
->center_freq
;
3088 ch
->band_center_freq1
= channel
->center_freq
;
3090 ch
->max_power
= channel
->max_power
* 2;
3091 ch
->max_reg_power
= channel
->max_reg_power
* 2;
3092 ch
->max_antenna_gain
= channel
->max_antenna_gain
* 2;
3093 ch
->reg_class_id
= 0; /* FIXME */
3095 /* FIXME: why use only legacy modes, why not any
3096 * HT/VHT modes? Would that even make any
3099 if (channel
->band
== NL80211_BAND_2GHZ
)
3100 ch
->mode
= MODE_11G
;
3102 ch
->mode
= MODE_11A
;
3104 if (WARN_ON_ONCE(ch
->mode
== MODE_UNKNOWN
))
3107 ath10k_dbg(ar
, ATH10K_DBG_WMI
,
3108 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
3109 ch
- arg
.channels
, arg
.n_channels
,
3110 ch
->freq
, ch
->max_power
, ch
->max_reg_power
,
3111 ch
->max_antenna_gain
, ch
->mode
);
3117 ret
= ath10k_wmi_scan_chan_list(ar
, &arg
);
3118 kfree(arg
.channels
);
3123 static enum wmi_dfs_region
3124 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region
)
3126 switch (dfs_region
) {
3127 case NL80211_DFS_UNSET
:
3128 return WMI_UNINIT_DFS_DOMAIN
;
3129 case NL80211_DFS_FCC
:
3130 return WMI_FCC_DFS_DOMAIN
;
3131 case NL80211_DFS_ETSI
:
3132 return WMI_ETSI_DFS_DOMAIN
;
3133 case NL80211_DFS_JP
:
3134 return WMI_MKK4_DFS_DOMAIN
;
3136 return WMI_UNINIT_DFS_DOMAIN
;
3139 static void ath10k_regd_update(struct ath10k
*ar
)
3141 struct reg_dmn_pair_mapping
*regpair
;
3143 enum wmi_dfs_region wmi_dfs_reg
;
3144 enum nl80211_dfs_regions nl_dfs_reg
;
3146 lockdep_assert_held(&ar
->conf_mutex
);
3148 ret
= ath10k_update_channel_list(ar
);
3150 ath10k_warn(ar
, "failed to update channel list: %d\n", ret
);
3152 regpair
= ar
->ath_common
.regulatory
.regpair
;
3154 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
3155 nl_dfs_reg
= ar
->dfs_detector
->region
;
3156 wmi_dfs_reg
= ath10k_mac_get_dfs_region(nl_dfs_reg
);
3158 wmi_dfs_reg
= WMI_UNINIT_DFS_DOMAIN
;
3161 /* Target allows setting up per-band regdomain but ath_common provides
3162 * a combined one only
3164 ret
= ath10k_wmi_pdev_set_regdomain(ar
,
3165 regpair
->reg_domain
,
3166 regpair
->reg_domain
, /* 2ghz */
3167 regpair
->reg_domain
, /* 5ghz */
3168 regpair
->reg_2ghz_ctl
,
3169 regpair
->reg_5ghz_ctl
,
3172 ath10k_warn(ar
, "failed to set pdev regdomain: %d\n", ret
);
3175 static void ath10k_mac_update_channel_list(struct ath10k
*ar
,
3176 struct ieee80211_supported_band
*band
)
3180 if (ar
->low_5ghz_chan
&& ar
->high_5ghz_chan
) {
3181 for (i
= 0; i
< band
->n_channels
; i
++) {
3182 if (band
->channels
[i
].center_freq
< ar
->low_5ghz_chan
||
3183 band
->channels
[i
].center_freq
> ar
->high_5ghz_chan
)
3184 band
->channels
[i
].flags
|=
3185 IEEE80211_CHAN_DISABLED
;
3190 static void ath10k_reg_notifier(struct wiphy
*wiphy
,
3191 struct regulatory_request
*request
)
3193 struct ieee80211_hw
*hw
= wiphy_to_ieee80211_hw(wiphy
);
3194 struct ath10k
*ar
= hw
->priv
;
3197 ath_reg_notifier_apply(wiphy
, request
, &ar
->ath_common
.regulatory
);
3199 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
) {
3200 ath10k_dbg(ar
, ATH10K_DBG_REGULATORY
, "dfs region 0x%x\n",
3201 request
->dfs_region
);
3202 result
= ar
->dfs_detector
->set_dfs_domain(ar
->dfs_detector
,
3203 request
->dfs_region
);
3205 ath10k_warn(ar
, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3206 request
->dfs_region
);
3209 mutex_lock(&ar
->conf_mutex
);
3210 if (ar
->state
== ATH10K_STATE_ON
)
3211 ath10k_regd_update(ar
);
3212 mutex_unlock(&ar
->conf_mutex
);
3214 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
)
3215 ath10k_mac_update_channel_list(ar
,
3216 ar
->hw
->wiphy
->bands
[NL80211_BAND_5GHZ
]);
3223 enum ath10k_mac_tx_path
{
3225 ATH10K_MAC_TX_HTT_MGMT
,
3226 ATH10K_MAC_TX_WMI_MGMT
,
3227 ATH10K_MAC_TX_UNKNOWN
,
3230 void ath10k_mac_tx_lock(struct ath10k
*ar
, int reason
)
3232 lockdep_assert_held(&ar
->htt
.tx_lock
);
3234 WARN_ON(reason
>= ATH10K_TX_PAUSE_MAX
);
3235 ar
->tx_paused
|= BIT(reason
);
3236 ieee80211_stop_queues(ar
->hw
);
3239 static void ath10k_mac_tx_unlock_iter(void *data
, u8
*mac
,
3240 struct ieee80211_vif
*vif
)
3242 struct ath10k
*ar
= data
;
3243 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
3245 if (arvif
->tx_paused
)
3248 ieee80211_wake_queue(ar
->hw
, arvif
->vdev_id
);
3251 void ath10k_mac_tx_unlock(struct ath10k
*ar
, int reason
)
3253 lockdep_assert_held(&ar
->htt
.tx_lock
);
3255 WARN_ON(reason
>= ATH10K_TX_PAUSE_MAX
);
3256 ar
->tx_paused
&= ~BIT(reason
);
3261 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
3262 IEEE80211_IFACE_ITER_RESUME_ALL
,
3263 ath10k_mac_tx_unlock_iter
,
3266 ieee80211_wake_queue(ar
->hw
, ar
->hw
->offchannel_tx_hw_queue
);
3269 void ath10k_mac_vif_tx_lock(struct ath10k_vif
*arvif
, int reason
)
3271 struct ath10k
*ar
= arvif
->ar
;
3273 lockdep_assert_held(&ar
->htt
.tx_lock
);
3275 WARN_ON(reason
>= BITS_PER_LONG
);
3276 arvif
->tx_paused
|= BIT(reason
);
3277 ieee80211_stop_queue(ar
->hw
, arvif
->vdev_id
);
3280 void ath10k_mac_vif_tx_unlock(struct ath10k_vif
*arvif
, int reason
)
3282 struct ath10k
*ar
= arvif
->ar
;
3284 lockdep_assert_held(&ar
->htt
.tx_lock
);
3286 WARN_ON(reason
>= BITS_PER_LONG
);
3287 arvif
->tx_paused
&= ~BIT(reason
);
3292 if (arvif
->tx_paused
)
3295 ieee80211_wake_queue(ar
->hw
, arvif
->vdev_id
);
3298 static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif
*arvif
,
3299 enum wmi_tlv_tx_pause_id pause_id
,
3300 enum wmi_tlv_tx_pause_action action
)
3302 struct ath10k
*ar
= arvif
->ar
;
3304 lockdep_assert_held(&ar
->htt
.tx_lock
);
3307 case WMI_TLV_TX_PAUSE_ACTION_STOP
:
3308 ath10k_mac_vif_tx_lock(arvif
, pause_id
);
3310 case WMI_TLV_TX_PAUSE_ACTION_WAKE
:
3311 ath10k_mac_vif_tx_unlock(arvif
, pause_id
);
3314 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
3315 "received unknown tx pause action %d on vdev %i, ignoring\n",
3316 action
, arvif
->vdev_id
);
3321 struct ath10k_mac_tx_pause
{
3323 enum wmi_tlv_tx_pause_id pause_id
;
3324 enum wmi_tlv_tx_pause_action action
;
3327 static void ath10k_mac_handle_tx_pause_iter(void *data
, u8
*mac
,
3328 struct ieee80211_vif
*vif
)
3330 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
3331 struct ath10k_mac_tx_pause
*arg
= data
;
3333 if (arvif
->vdev_id
!= arg
->vdev_id
)
3336 ath10k_mac_vif_handle_tx_pause(arvif
, arg
->pause_id
, arg
->action
);
3339 void ath10k_mac_handle_tx_pause_vdev(struct ath10k
*ar
, u32 vdev_id
,
3340 enum wmi_tlv_tx_pause_id pause_id
,
3341 enum wmi_tlv_tx_pause_action action
)
3343 struct ath10k_mac_tx_pause arg
= {
3345 .pause_id
= pause_id
,
3349 spin_lock_bh(&ar
->htt
.tx_lock
);
3350 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
3351 IEEE80211_IFACE_ITER_RESUME_ALL
,
3352 ath10k_mac_handle_tx_pause_iter
,
3354 spin_unlock_bh(&ar
->htt
.tx_lock
);
3357 static enum ath10k_hw_txrx_mode
3358 ath10k_mac_tx_h_get_txmode(struct ath10k
*ar
,
3359 struct ieee80211_vif
*vif
,
3360 struct ieee80211_sta
*sta
,
3361 struct sk_buff
*skb
)
3363 const struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3364 __le16 fc
= hdr
->frame_control
;
3366 if (!vif
|| vif
->type
== NL80211_IFTYPE_MONITOR
)
3367 return ATH10K_HW_TXRX_RAW
;
3369 if (ieee80211_is_mgmt(fc
))
3370 return ATH10K_HW_TXRX_MGMT
;
3374 * NullFunc frames are mostly used to ping if a client or AP are still
3375 * reachable and responsive. This implies tx status reports must be
3376 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3377 * come to a conclusion that the other end disappeared and tear down
3378 * BSS connection or it can never disconnect from BSS/client (which is
3381 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3382 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3383 * which seems to deliver correct tx reports for NullFunc frames. The
3384 * downside of using it is it ignores client powersave state so it can
3385 * end up disconnecting sleeping clients in AP mode. It should fix STA
3386 * mode though because AP don't sleep.
3388 if (ar
->htt
.target_version_major
< 3 &&
3389 (ieee80211_is_nullfunc(fc
) || ieee80211_is_qos_nullfunc(fc
)) &&
3390 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
3391 ar
->running_fw
->fw_file
.fw_features
))
3392 return ATH10K_HW_TXRX_MGMT
;
3396 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3397 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3398 * to work with Ethernet txmode so use it.
3400 * FIXME: Check if raw mode works with TDLS.
3402 if (ieee80211_is_data_present(fc
) && sta
&& sta
->tdls
)
3403 return ATH10K_HW_TXRX_ETHERNET
;
3405 if (test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
3406 return ATH10K_HW_TXRX_RAW
;
3408 return ATH10K_HW_TXRX_NATIVE_WIFI
;
3411 static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif
*vif
,
3412 struct sk_buff
*skb
)
3414 const struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
3415 const struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3416 const u32 mask
= IEEE80211_TX_INTFL_DONT_ENCRYPT
|
3417 IEEE80211_TX_CTL_INJECTED
;
3419 if (!ieee80211_has_protected(hdr
->frame_control
))
3422 if ((info
->flags
& mask
) == mask
)
3426 return !((struct ath10k_vif
*)vif
->drv_priv
)->nohwcrypt
;
3431 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3432 * Control in the header.
3434 static void ath10k_tx_h_nwifi(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
3436 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3437 struct ath10k_skb_cb
*cb
= ATH10K_SKB_CB(skb
);
3440 if (!ieee80211_is_data_qos(hdr
->frame_control
))
3443 qos_ctl
= ieee80211_get_qos_ctl(hdr
);
3444 memmove(skb
->data
+ IEEE80211_QOS_CTL_LEN
,
3445 skb
->data
, (void *)qos_ctl
- (void *)skb
->data
);
3446 skb_pull(skb
, IEEE80211_QOS_CTL_LEN
);
3448 /* Some firmware revisions don't handle sending QoS NullFunc well.
3449 * These frames are mainly used for CQM purposes so it doesn't really
3450 * matter whether QoS NullFunc or NullFunc are sent.
3452 hdr
= (void *)skb
->data
;
3453 if (ieee80211_is_qos_nullfunc(hdr
->frame_control
))
3454 cb
->flags
&= ~ATH10K_SKB_F_QOS
;
3456 hdr
->frame_control
&= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA
);
3459 static void ath10k_tx_h_8023(struct sk_buff
*skb
)
3461 struct ieee80211_hdr
*hdr
;
3462 struct rfc1042_hdr
*rfc1042
;
3469 hdr
= (void *)skb
->data
;
3470 hdrlen
= ieee80211_hdrlen(hdr
->frame_control
);
3471 rfc1042
= (void *)skb
->data
+ hdrlen
;
3473 ether_addr_copy(da
, ieee80211_get_DA(hdr
));
3474 ether_addr_copy(sa
, ieee80211_get_SA(hdr
));
3475 type
= rfc1042
->snap_type
;
3477 skb_pull(skb
, hdrlen
+ sizeof(*rfc1042
));
3478 skb_push(skb
, sizeof(*eth
));
3480 eth
= (void *)skb
->data
;
3481 ether_addr_copy(eth
->h_dest
, da
);
3482 ether_addr_copy(eth
->h_source
, sa
);
3483 eth
->h_proto
= type
;
3486 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k
*ar
,
3487 struct ieee80211_vif
*vif
,
3488 struct sk_buff
*skb
)
3490 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
3491 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
3493 /* This is case only for P2P_GO */
3494 if (vif
->type
!= NL80211_IFTYPE_AP
|| !vif
->p2p
)
3497 if (unlikely(ieee80211_is_probe_resp(hdr
->frame_control
))) {
3498 spin_lock_bh(&ar
->data_lock
);
3499 if (arvif
->u
.ap
.noa_data
)
3500 if (!pskb_expand_head(skb
, 0, arvif
->u
.ap
.noa_len
,
3502 skb_put_data(skb
, arvif
->u
.ap
.noa_data
,
3503 arvif
->u
.ap
.noa_len
);
3504 spin_unlock_bh(&ar
->data_lock
);
3508 static void ath10k_mac_tx_h_fill_cb(struct ath10k
*ar
,
3509 struct ieee80211_vif
*vif
,
3510 struct ieee80211_txq
*txq
,
3511 struct sk_buff
*skb
)
3513 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3514 struct ath10k_skb_cb
*cb
= ATH10K_SKB_CB(skb
);
3517 if (!ath10k_tx_h_use_hwcrypto(vif
, skb
))
3518 cb
->flags
|= ATH10K_SKB_F_NO_HWCRYPT
;
3520 if (ieee80211_is_mgmt(hdr
->frame_control
))
3521 cb
->flags
|= ATH10K_SKB_F_MGMT
;
3523 if (ieee80211_is_data_qos(hdr
->frame_control
))
3524 cb
->flags
|= ATH10K_SKB_F_QOS
;
3530 bool ath10k_mac_tx_frm_has_freq(struct ath10k
*ar
)
3532 /* FIXME: Not really sure since when the behaviour changed. At some
3533 * point new firmware stopped requiring creation of peer entries for
3534 * offchannel tx (and actually creating them causes issues with wmi-htc
3535 * tx credit replenishment and reliability). Assuming it's at least 3.4
3536 * because that's when the `freq` was introduced to TX_FRM HTT command.
3538 return (ar
->htt
.target_version_major
>= 3 &&
3539 ar
->htt
.target_version_minor
>= 4 &&
3540 ar
->running_fw
->fw_file
.htt_op_version
== ATH10K_FW_HTT_OP_VERSION_TLV
);
3543 static int ath10k_mac_tx_wmi_mgmt(struct ath10k
*ar
, struct sk_buff
*skb
)
3545 struct sk_buff_head
*q
= &ar
->wmi_mgmt_tx_queue
;
3548 spin_lock_bh(&ar
->data_lock
);
3550 if (skb_queue_len(q
) == ATH10K_MAX_NUM_MGMT_PENDING
) {
3551 ath10k_warn(ar
, "wmi mgmt tx queue is full\n");
3556 __skb_queue_tail(q
, skb
);
3557 ieee80211_queue_work(ar
->hw
, &ar
->wmi_mgmt_tx_work
);
3560 spin_unlock_bh(&ar
->data_lock
);
3565 static enum ath10k_mac_tx_path
3566 ath10k_mac_tx_h_get_txpath(struct ath10k
*ar
,
3567 struct sk_buff
*skb
,
3568 enum ath10k_hw_txrx_mode txmode
)
3571 case ATH10K_HW_TXRX_RAW
:
3572 case ATH10K_HW_TXRX_NATIVE_WIFI
:
3573 case ATH10K_HW_TXRX_ETHERNET
:
3574 return ATH10K_MAC_TX_HTT
;
3575 case ATH10K_HW_TXRX_MGMT
:
3576 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX
,
3577 ar
->running_fw
->fw_file
.fw_features
) ||
3578 test_bit(WMI_SERVICE_MGMT_TX_WMI
,
3580 return ATH10K_MAC_TX_WMI_MGMT
;
3581 else if (ar
->htt
.target_version_major
>= 3)
3582 return ATH10K_MAC_TX_HTT
;
3584 return ATH10K_MAC_TX_HTT_MGMT
;
3587 return ATH10K_MAC_TX_UNKNOWN
;
3590 static int ath10k_mac_tx_submit(struct ath10k
*ar
,
3591 enum ath10k_hw_txrx_mode txmode
,
3592 enum ath10k_mac_tx_path txpath
,
3593 struct sk_buff
*skb
)
3595 struct ath10k_htt
*htt
= &ar
->htt
;
3599 case ATH10K_MAC_TX_HTT
:
3600 ret
= htt
->tx_ops
->htt_tx(htt
, txmode
, skb
);
3602 case ATH10K_MAC_TX_HTT_MGMT
:
3603 ret
= ath10k_htt_mgmt_tx(htt
, skb
);
3605 case ATH10K_MAC_TX_WMI_MGMT
:
3606 ret
= ath10k_mac_tx_wmi_mgmt(ar
, skb
);
3608 case ATH10K_MAC_TX_UNKNOWN
:
3615 ath10k_warn(ar
, "failed to transmit packet, dropping: %d\n",
3617 ieee80211_free_txskb(ar
->hw
, skb
);
3623 /* This function consumes the sk_buff regardless of return value as far as
3624 * caller is concerned so no freeing is necessary afterwards.
3626 static int ath10k_mac_tx(struct ath10k
*ar
,
3627 struct ieee80211_vif
*vif
,
3628 enum ath10k_hw_txrx_mode txmode
,
3629 enum ath10k_mac_tx_path txpath
,
3630 struct sk_buff
*skb
)
3632 struct ieee80211_hw
*hw
= ar
->hw
;
3633 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
3636 /* We should disable CCK RATE due to P2P */
3637 if (info
->flags
& IEEE80211_TX_CTL_NO_CCK_RATE
)
3638 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
3641 case ATH10K_HW_TXRX_MGMT
:
3642 case ATH10K_HW_TXRX_NATIVE_WIFI
:
3643 ath10k_tx_h_nwifi(hw
, skb
);
3644 ath10k_tx_h_add_p2p_noa_ie(ar
, vif
, skb
);
3645 ath10k_tx_h_seq_no(vif
, skb
);
3647 case ATH10K_HW_TXRX_ETHERNET
:
3648 ath10k_tx_h_8023(skb
);
3650 case ATH10K_HW_TXRX_RAW
:
3651 if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
)) {
3653 ieee80211_free_txskb(hw
, skb
);
3658 if (info
->flags
& IEEE80211_TX_CTL_TX_OFFCHAN
) {
3659 if (!ath10k_mac_tx_frm_has_freq(ar
)) {
3660 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "queued offchannel skb %pK\n",
3663 skb_queue_tail(&ar
->offchan_tx_queue
, skb
);
3664 ieee80211_queue_work(hw
, &ar
->offchan_tx_work
);
3669 ret
= ath10k_mac_tx_submit(ar
, txmode
, txpath
, skb
);
3671 ath10k_warn(ar
, "failed to submit frame: %d\n", ret
);
3678 void ath10k_offchan_tx_purge(struct ath10k
*ar
)
3680 struct sk_buff
*skb
;
3683 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
3687 ieee80211_free_txskb(ar
->hw
, skb
);
3691 void ath10k_offchan_tx_work(struct work_struct
*work
)
3693 struct ath10k
*ar
= container_of(work
, struct ath10k
, offchan_tx_work
);
3694 struct ath10k_peer
*peer
;
3695 struct ath10k_vif
*arvif
;
3696 enum ath10k_hw_txrx_mode txmode
;
3697 enum ath10k_mac_tx_path txpath
;
3698 struct ieee80211_hdr
*hdr
;
3699 struct ieee80211_vif
*vif
;
3700 struct ieee80211_sta
*sta
;
3701 struct sk_buff
*skb
;
3702 const u8
*peer_addr
;
3705 unsigned long time_left
;
3706 bool tmp_peer_created
= false;
3708 /* FW requirement: We must create a peer before FW will send out
3709 * an offchannel frame. Otherwise the frame will be stuck and
3710 * never transmitted. We delete the peer upon tx completion.
3711 * It is unlikely that a peer for offchannel tx will already be
3712 * present. However it may be in some rare cases so account for that.
3713 * Otherwise we might remove a legitimate peer and break stuff.
3717 skb
= skb_dequeue(&ar
->offchan_tx_queue
);
3721 mutex_lock(&ar
->conf_mutex
);
3723 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac offchannel skb %pK\n",
3726 hdr
= (struct ieee80211_hdr
*)skb
->data
;
3727 peer_addr
= ieee80211_get_DA(hdr
);
3729 spin_lock_bh(&ar
->data_lock
);
3730 vdev_id
= ar
->scan
.vdev_id
;
3731 peer
= ath10k_peer_find(ar
, vdev_id
, peer_addr
);
3732 spin_unlock_bh(&ar
->data_lock
);
3735 /* FIXME: should this use ath10k_warn()? */
3736 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "peer %pM on vdev %d already present\n",
3737 peer_addr
, vdev_id
);
3740 ret
= ath10k_peer_create(ar
, NULL
, NULL
, vdev_id
,
3742 WMI_PEER_TYPE_DEFAULT
);
3744 ath10k_warn(ar
, "failed to create peer %pM on vdev %d: %d\n",
3745 peer_addr
, vdev_id
, ret
);
3746 tmp_peer_created
= (ret
== 0);
3749 spin_lock_bh(&ar
->data_lock
);
3750 reinit_completion(&ar
->offchan_tx_completed
);
3751 ar
->offchan_tx_skb
= skb
;
3752 spin_unlock_bh(&ar
->data_lock
);
3754 /* It's safe to access vif and sta - conf_mutex guarantees that
3755 * sta_state() and remove_interface() are locked exclusively
3756 * out wrt to this offchannel worker.
3758 arvif
= ath10k_get_arvif(ar
, vdev_id
);
3761 sta
= ieee80211_find_sta(vif
, peer_addr
);
3767 txmode
= ath10k_mac_tx_h_get_txmode(ar
, vif
, sta
, skb
);
3768 txpath
= ath10k_mac_tx_h_get_txpath(ar
, skb
, txmode
);
3770 ret
= ath10k_mac_tx(ar
, vif
, txmode
, txpath
, skb
);
3772 ath10k_warn(ar
, "failed to transmit offchannel frame: %d\n",
3778 wait_for_completion_timeout(&ar
->offchan_tx_completed
, 3 * HZ
);
3780 ath10k_warn(ar
, "timed out waiting for offchannel skb %pK\n",
3783 if (!peer
&& tmp_peer_created
) {
3784 ret
= ath10k_peer_delete(ar
, vdev_id
, peer_addr
);
3786 ath10k_warn(ar
, "failed to delete peer %pM on vdev %d: %d\n",
3787 peer_addr
, vdev_id
, ret
);
3790 mutex_unlock(&ar
->conf_mutex
);
3794 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k
*ar
)
3796 struct sk_buff
*skb
;
3799 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
3803 ieee80211_free_txskb(ar
->hw
, skb
);
3807 void ath10k_mgmt_over_wmi_tx_work(struct work_struct
*work
)
3809 struct ath10k
*ar
= container_of(work
, struct ath10k
, wmi_mgmt_tx_work
);
3810 struct sk_buff
*skb
;
3814 skb
= skb_dequeue(&ar
->wmi_mgmt_tx_queue
);
3818 ret
= ath10k_wmi_mgmt_tx(ar
, skb
);
3820 ath10k_warn(ar
, "failed to transmit management frame via WMI: %d\n",
3822 ieee80211_free_txskb(ar
->hw
, skb
);
3827 static void ath10k_mac_txq_init(struct ieee80211_txq
*txq
)
3829 struct ath10k_txq
*artxq
;
3834 artxq
= (void *)txq
->drv_priv
;
3835 INIT_LIST_HEAD(&artxq
->list
);
3838 static void ath10k_mac_txq_unref(struct ath10k
*ar
, struct ieee80211_txq
*txq
)
3840 struct ath10k_txq
*artxq
;
3841 struct ath10k_skb_cb
*cb
;
3842 struct sk_buff
*msdu
;
3848 artxq
= (void *)txq
->drv_priv
;
3849 spin_lock_bh(&ar
->txqs_lock
);
3850 if (!list_empty(&artxq
->list
))
3851 list_del_init(&artxq
->list
);
3852 spin_unlock_bh(&ar
->txqs_lock
);
3854 spin_lock_bh(&ar
->htt
.tx_lock
);
3855 idr_for_each_entry(&ar
->htt
.pending_tx
, msdu
, msdu_id
) {
3856 cb
= ATH10K_SKB_CB(msdu
);
3860 spin_unlock_bh(&ar
->htt
.tx_lock
);
3863 struct ieee80211_txq
*ath10k_mac_txq_lookup(struct ath10k
*ar
,
3867 struct ath10k_peer
*peer
;
3869 lockdep_assert_held(&ar
->data_lock
);
3871 peer
= ar
->peer_map
[peer_id
];
3879 return peer
->sta
->txq
[tid
];
3881 return peer
->vif
->txq
;
3886 static bool ath10k_mac_tx_can_push(struct ieee80211_hw
*hw
,
3887 struct ieee80211_txq
*txq
)
3889 struct ath10k
*ar
= hw
->priv
;
3890 struct ath10k_txq
*artxq
= (void *)txq
->drv_priv
;
3892 /* No need to get locks */
3894 if (ar
->htt
.tx_q_state
.mode
== HTT_TX_MODE_SWITCH_PUSH
)
3897 if (ar
->htt
.num_pending_tx
< ar
->htt
.tx_q_state
.num_push_allowed
)
3900 if (artxq
->num_fw_queued
< artxq
->num_push_allowed
)
3906 int ath10k_mac_tx_push_txq(struct ieee80211_hw
*hw
,
3907 struct ieee80211_txq
*txq
)
3909 struct ath10k
*ar
= hw
->priv
;
3910 struct ath10k_htt
*htt
= &ar
->htt
;
3911 struct ath10k_txq
*artxq
= (void *)txq
->drv_priv
;
3912 struct ieee80211_vif
*vif
= txq
->vif
;
3913 struct ieee80211_sta
*sta
= txq
->sta
;
3914 enum ath10k_hw_txrx_mode txmode
;
3915 enum ath10k_mac_tx_path txpath
;
3916 struct sk_buff
*skb
;
3917 struct ieee80211_hdr
*hdr
;
3919 bool is_mgmt
, is_presp
;
3922 spin_lock_bh(&ar
->htt
.tx_lock
);
3923 ret
= ath10k_htt_tx_inc_pending(htt
);
3924 spin_unlock_bh(&ar
->htt
.tx_lock
);
3929 skb
= ieee80211_tx_dequeue(hw
, txq
);
3931 spin_lock_bh(&ar
->htt
.tx_lock
);
3932 ath10k_htt_tx_dec_pending(htt
);
3933 spin_unlock_bh(&ar
->htt
.tx_lock
);
3938 ath10k_mac_tx_h_fill_cb(ar
, vif
, txq
, skb
);
3941 txmode
= ath10k_mac_tx_h_get_txmode(ar
, vif
, sta
, skb
);
3942 txpath
= ath10k_mac_tx_h_get_txpath(ar
, skb
, txmode
);
3943 is_mgmt
= (txpath
== ATH10K_MAC_TX_HTT_MGMT
);
3946 hdr
= (struct ieee80211_hdr
*)skb
->data
;
3947 is_presp
= ieee80211_is_probe_resp(hdr
->frame_control
);
3949 spin_lock_bh(&ar
->htt
.tx_lock
);
3950 ret
= ath10k_htt_tx_mgmt_inc_pending(htt
, is_mgmt
, is_presp
);
3953 ath10k_htt_tx_dec_pending(htt
);
3954 spin_unlock_bh(&ar
->htt
.tx_lock
);
3957 spin_unlock_bh(&ar
->htt
.tx_lock
);
3960 ret
= ath10k_mac_tx(ar
, vif
, txmode
, txpath
, skb
);
3961 if (unlikely(ret
)) {
3962 ath10k_warn(ar
, "failed to push frame: %d\n", ret
);
3964 spin_lock_bh(&ar
->htt
.tx_lock
);
3965 ath10k_htt_tx_dec_pending(htt
);
3967 ath10k_htt_tx_mgmt_dec_pending(htt
);
3968 spin_unlock_bh(&ar
->htt
.tx_lock
);
3973 spin_lock_bh(&ar
->htt
.tx_lock
);
3974 artxq
->num_fw_queued
++;
3975 spin_unlock_bh(&ar
->htt
.tx_lock
);
3980 void ath10k_mac_tx_push_pending(struct ath10k
*ar
)
3982 struct ieee80211_hw
*hw
= ar
->hw
;
3983 struct ieee80211_txq
*txq
;
3984 struct ath10k_txq
*artxq
;
3985 struct ath10k_txq
*last
;
3989 if (ar
->htt
.num_pending_tx
>= (ar
->htt
.max_num_pending_tx
/ 2))
3992 spin_lock_bh(&ar
->txqs_lock
);
3995 last
= list_last_entry(&ar
->txqs
, struct ath10k_txq
, list
);
3996 while (!list_empty(&ar
->txqs
)) {
3997 artxq
= list_first_entry(&ar
->txqs
, struct ath10k_txq
, list
);
3998 txq
= container_of((void *)artxq
, struct ieee80211_txq
,
4001 /* Prevent aggressive sta/tid taking over tx queue */
4004 while (ath10k_mac_tx_can_push(hw
, txq
) && max
--) {
4005 ret
= ath10k_mac_tx_push_txq(hw
, txq
);
4010 list_del_init(&artxq
->list
);
4012 list_add_tail(&artxq
->list
, &ar
->txqs
);
4014 ath10k_htt_tx_txq_update(hw
, txq
);
4016 if (artxq
== last
|| (ret
< 0 && ret
!= -ENOENT
))
4021 spin_unlock_bh(&ar
->txqs_lock
);
4028 void __ath10k_scan_finish(struct ath10k
*ar
)
4030 lockdep_assert_held(&ar
->data_lock
);
4032 switch (ar
->scan
.state
) {
4033 case ATH10K_SCAN_IDLE
:
4035 case ATH10K_SCAN_RUNNING
:
4036 case ATH10K_SCAN_ABORTING
:
4037 if (!ar
->scan
.is_roc
) {
4038 struct cfg80211_scan_info info
= {
4039 .aborted
= (ar
->scan
.state
==
4040 ATH10K_SCAN_ABORTING
),
4043 ieee80211_scan_completed(ar
->hw
, &info
);
4044 } else if (ar
->scan
.roc_notify
) {
4045 ieee80211_remain_on_channel_expired(ar
->hw
);
4048 case ATH10K_SCAN_STARTING
:
4049 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
4050 ar
->scan_channel
= NULL
;
4051 ar
->scan
.roc_freq
= 0;
4052 ath10k_offchan_tx_purge(ar
);
4053 cancel_delayed_work(&ar
->scan
.timeout
);
4054 complete(&ar
->scan
.completed
);
4059 void ath10k_scan_finish(struct ath10k
*ar
)
4061 spin_lock_bh(&ar
->data_lock
);
4062 __ath10k_scan_finish(ar
);
4063 spin_unlock_bh(&ar
->data_lock
);
4066 static int ath10k_scan_stop(struct ath10k
*ar
)
4068 struct wmi_stop_scan_arg arg
= {
4069 .req_id
= 1, /* FIXME */
4070 .req_type
= WMI_SCAN_STOP_ONE
,
4071 .u
.scan_id
= ATH10K_SCAN_ID
,
4075 lockdep_assert_held(&ar
->conf_mutex
);
4077 ret
= ath10k_wmi_stop_scan(ar
, &arg
);
4079 ath10k_warn(ar
, "failed to stop wmi scan: %d\n", ret
);
4083 ret
= wait_for_completion_timeout(&ar
->scan
.completed
, 3 * HZ
);
4085 ath10k_warn(ar
, "failed to receive scan abortion completion: timed out\n");
4087 } else if (ret
> 0) {
4092 /* Scan state should be updated upon scan completion but in case
4093 * firmware fails to deliver the event (for whatever reason) it is
4094 * desired to clean up scan state anyway. Firmware may have just
4095 * dropped the scan completion event delivery due to transport pipe
4096 * being overflown with data and/or it can recover on its own before
4097 * next scan request is submitted.
4099 spin_lock_bh(&ar
->data_lock
);
4100 if (ar
->scan
.state
!= ATH10K_SCAN_IDLE
)
4101 __ath10k_scan_finish(ar
);
4102 spin_unlock_bh(&ar
->data_lock
);
4107 static void ath10k_scan_abort(struct ath10k
*ar
)
4111 lockdep_assert_held(&ar
->conf_mutex
);
4113 spin_lock_bh(&ar
->data_lock
);
4115 switch (ar
->scan
.state
) {
4116 case ATH10K_SCAN_IDLE
:
4117 /* This can happen if timeout worker kicked in and called
4118 * abortion while scan completion was being processed.
4121 case ATH10K_SCAN_STARTING
:
4122 case ATH10K_SCAN_ABORTING
:
4123 ath10k_warn(ar
, "refusing scan abortion due to invalid scan state: %s (%d)\n",
4124 ath10k_scan_state_str(ar
->scan
.state
),
4127 case ATH10K_SCAN_RUNNING
:
4128 ar
->scan
.state
= ATH10K_SCAN_ABORTING
;
4129 spin_unlock_bh(&ar
->data_lock
);
4131 ret
= ath10k_scan_stop(ar
);
4133 ath10k_warn(ar
, "failed to abort scan: %d\n", ret
);
4135 spin_lock_bh(&ar
->data_lock
);
4139 spin_unlock_bh(&ar
->data_lock
);
4142 void ath10k_scan_timeout_work(struct work_struct
*work
)
4144 struct ath10k
*ar
= container_of(work
, struct ath10k
,
4147 mutex_lock(&ar
->conf_mutex
);
4148 ath10k_scan_abort(ar
);
4149 mutex_unlock(&ar
->conf_mutex
);
4152 static int ath10k_start_scan(struct ath10k
*ar
,
4153 const struct wmi_start_scan_arg
*arg
)
4157 lockdep_assert_held(&ar
->conf_mutex
);
4159 ret
= ath10k_wmi_start_scan(ar
, arg
);
4163 ret
= wait_for_completion_timeout(&ar
->scan
.started
, 1 * HZ
);
4165 ret
= ath10k_scan_stop(ar
);
4167 ath10k_warn(ar
, "failed to stop scan: %d\n", ret
);
4172 /* If we failed to start the scan, return error code at
4173 * this point. This is probably due to some issue in the
4174 * firmware, but no need to wedge the driver due to that...
4176 spin_lock_bh(&ar
->data_lock
);
4177 if (ar
->scan
.state
== ATH10K_SCAN_IDLE
) {
4178 spin_unlock_bh(&ar
->data_lock
);
4181 spin_unlock_bh(&ar
->data_lock
);
4186 /**********************/
4187 /* mac80211 callbacks */
4188 /**********************/
4190 static void ath10k_mac_op_tx(struct ieee80211_hw
*hw
,
4191 struct ieee80211_tx_control
*control
,
4192 struct sk_buff
*skb
)
4194 struct ath10k
*ar
= hw
->priv
;
4195 struct ath10k_htt
*htt
= &ar
->htt
;
4196 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
4197 struct ieee80211_vif
*vif
= info
->control
.vif
;
4198 struct ieee80211_sta
*sta
= control
->sta
;
4199 struct ieee80211_txq
*txq
= NULL
;
4200 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
4201 enum ath10k_hw_txrx_mode txmode
;
4202 enum ath10k_mac_tx_path txpath
;
4208 ath10k_mac_tx_h_fill_cb(ar
, vif
, txq
, skb
);
4210 txmode
= ath10k_mac_tx_h_get_txmode(ar
, vif
, sta
, skb
);
4211 txpath
= ath10k_mac_tx_h_get_txpath(ar
, skb
, txmode
);
4212 is_htt
= (txpath
== ATH10K_MAC_TX_HTT
||
4213 txpath
== ATH10K_MAC_TX_HTT_MGMT
);
4214 is_mgmt
= (txpath
== ATH10K_MAC_TX_HTT_MGMT
);
4217 spin_lock_bh(&ar
->htt
.tx_lock
);
4218 is_presp
= ieee80211_is_probe_resp(hdr
->frame_control
);
4220 ret
= ath10k_htt_tx_inc_pending(htt
);
4222 ath10k_warn(ar
, "failed to increase tx pending count: %d, dropping\n",
4224 spin_unlock_bh(&ar
->htt
.tx_lock
);
4225 ieee80211_free_txskb(ar
->hw
, skb
);
4229 ret
= ath10k_htt_tx_mgmt_inc_pending(htt
, is_mgmt
, is_presp
);
4231 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "failed to increase tx mgmt pending count: %d, dropping\n",
4233 ath10k_htt_tx_dec_pending(htt
);
4234 spin_unlock_bh(&ar
->htt
.tx_lock
);
4235 ieee80211_free_txskb(ar
->hw
, skb
);
4238 spin_unlock_bh(&ar
->htt
.tx_lock
);
4241 ret
= ath10k_mac_tx(ar
, vif
, txmode
, txpath
, skb
);
4243 ath10k_warn(ar
, "failed to transmit frame: %d\n", ret
);
4245 spin_lock_bh(&ar
->htt
.tx_lock
);
4246 ath10k_htt_tx_dec_pending(htt
);
4248 ath10k_htt_tx_mgmt_dec_pending(htt
);
4249 spin_unlock_bh(&ar
->htt
.tx_lock
);
4255 static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw
*hw
,
4256 struct ieee80211_txq
*txq
)
4258 struct ath10k
*ar
= hw
->priv
;
4259 struct ath10k_txq
*artxq
= (void *)txq
->drv_priv
;
4260 struct ieee80211_txq
*f_txq
;
4261 struct ath10k_txq
*f_artxq
;
4265 spin_lock_bh(&ar
->txqs_lock
);
4266 if (list_empty(&artxq
->list
))
4267 list_add_tail(&artxq
->list
, &ar
->txqs
);
4269 f_artxq
= list_first_entry(&ar
->txqs
, struct ath10k_txq
, list
);
4270 f_txq
= container_of((void *)f_artxq
, struct ieee80211_txq
, drv_priv
);
4271 list_del_init(&f_artxq
->list
);
4273 while (ath10k_mac_tx_can_push(hw
, f_txq
) && max
--) {
4274 ret
= ath10k_mac_tx_push_txq(hw
, f_txq
);
4279 list_add_tail(&f_artxq
->list
, &ar
->txqs
);
4280 spin_unlock_bh(&ar
->txqs_lock
);
4282 ath10k_htt_tx_txq_update(hw
, f_txq
);
4283 ath10k_htt_tx_txq_update(hw
, txq
);
4286 /* Must not be called with conf_mutex held as workers can use that also. */
4287 void ath10k_drain_tx(struct ath10k
*ar
)
4289 /* make sure rcu-protected mac80211 tx path itself is drained */
4292 ath10k_offchan_tx_purge(ar
);
4293 ath10k_mgmt_over_wmi_tx_purge(ar
);
4295 cancel_work_sync(&ar
->offchan_tx_work
);
4296 cancel_work_sync(&ar
->wmi_mgmt_tx_work
);
4299 void ath10k_halt(struct ath10k
*ar
)
4301 struct ath10k_vif
*arvif
;
4303 lockdep_assert_held(&ar
->conf_mutex
);
4305 clear_bit(ATH10K_CAC_RUNNING
, &ar
->dev_flags
);
4306 ar
->filter_flags
= 0;
4307 ar
->monitor
= false;
4308 ar
->monitor_arvif
= NULL
;
4310 if (ar
->monitor_started
)
4311 ath10k_monitor_stop(ar
);
4313 ar
->monitor_started
= false;
4316 ath10k_scan_finish(ar
);
4317 ath10k_peer_cleanup_all(ar
);
4318 ath10k_core_stop(ar
);
4319 ath10k_hif_power_down(ar
);
4321 spin_lock_bh(&ar
->data_lock
);
4322 list_for_each_entry(arvif
, &ar
->arvifs
, list
)
4323 ath10k_mac_vif_beacon_cleanup(arvif
);
4324 spin_unlock_bh(&ar
->data_lock
);
4327 static int ath10k_get_antenna(struct ieee80211_hw
*hw
, u32
*tx_ant
, u32
*rx_ant
)
4329 struct ath10k
*ar
= hw
->priv
;
4331 mutex_lock(&ar
->conf_mutex
);
4333 *tx_ant
= ar
->cfg_tx_chainmask
;
4334 *rx_ant
= ar
->cfg_rx_chainmask
;
4336 mutex_unlock(&ar
->conf_mutex
);
4341 static void ath10k_check_chain_mask(struct ath10k
*ar
, u32 cm
, const char *dbg
)
4343 /* It is not clear that allowing gaps in chainmask
4344 * is helpful. Probably it will not do what user
4345 * is hoping for, so warn in that case.
4347 if (cm
== 15 || cm
== 7 || cm
== 3 || cm
== 1 || cm
== 0)
4350 ath10k_warn(ar
, "mac %s antenna chainmask may be invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
4354 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k
*ar
)
4356 int nsts
= ar
->vht_cap_info
;
4358 nsts
&= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK
;
4359 nsts
>>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT
;
4361 /* If firmware does not deliver to host number of space-time
4362 * streams supported, assume it support up to 4 BF STS and return
4363 * the value for VHT CAP: nsts-1)
4371 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k
*ar
)
4373 int sound_dim
= ar
->vht_cap_info
;
4375 sound_dim
&= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK
;
4376 sound_dim
>>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT
;
4378 /* If the sounding dimension is not advertised by the firmware,
4379 * let's use a default value of 1
4387 static struct ieee80211_sta_vht_cap
ath10k_create_vht_cap(struct ath10k
*ar
)
4389 struct ieee80211_sta_vht_cap vht_cap
= {0};
4390 struct ath10k_hw_params
*hw
= &ar
->hw_params
;
4395 vht_cap
.vht_supported
= 1;
4396 vht_cap
.cap
= ar
->vht_cap_info
;
4398 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
4399 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)) {
4400 val
= ath10k_mac_get_vht_cap_bf_sts(ar
);
4401 val
<<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT
;
4402 val
&= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK
;
4407 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
4408 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)) {
4409 val
= ath10k_mac_get_vht_cap_bf_sound_dim(ar
);
4410 val
<<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT
;
4411 val
&= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK
;
4416 /* Currently the firmware seems to be buggy, don't enable 80+80
4417 * mode until that's resolved.
4419 if ((ar
->vht_cap_info
& IEEE80211_VHT_CAP_SHORT_GI_160
) &&
4420 (ar
->vht_cap_info
& IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK
) == 0)
4421 vht_cap
.cap
|= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ
;
4424 for (i
= 0; i
< 8; i
++) {
4425 if ((i
< ar
->num_rf_chains
) && (ar
->cfg_tx_chainmask
& BIT(i
)))
4426 mcs_map
|= IEEE80211_VHT_MCS_SUPPORT_0_9
<< (i
* 2);
4428 mcs_map
|= IEEE80211_VHT_MCS_NOT_SUPPORTED
<< (i
* 2);
4431 if (ar
->cfg_tx_chainmask
<= 1)
4432 vht_cap
.cap
&= ~IEEE80211_VHT_CAP_TXSTBC
;
4434 vht_cap
.vht_mcs
.rx_mcs_map
= cpu_to_le16(mcs_map
);
4435 vht_cap
.vht_mcs
.tx_mcs_map
= cpu_to_le16(mcs_map
);
4437 /* If we are supporting 160Mhz or 80+80, then the NIC may be able to do
4438 * a restricted NSS for 160 or 80+80 vs what it can do for 80Mhz. Give
4439 * user-space a clue if that is the case.
4441 if ((vht_cap
.cap
& IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK
) &&
4442 (hw
->vht160_mcs_rx_highest
!= 0 ||
4443 hw
->vht160_mcs_tx_highest
!= 0)) {
4444 vht_cap
.vht_mcs
.rx_highest
= cpu_to_le16(hw
->vht160_mcs_rx_highest
);
4445 vht_cap
.vht_mcs
.tx_highest
= cpu_to_le16(hw
->vht160_mcs_tx_highest
);
4451 static struct ieee80211_sta_ht_cap
ath10k_get_ht_cap(struct ath10k
*ar
)
4454 struct ieee80211_sta_ht_cap ht_cap
= {0};
4456 if (!(ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
))
4459 ht_cap
.ht_supported
= 1;
4460 ht_cap
.ampdu_factor
= IEEE80211_HT_MAX_AMPDU_64K
;
4461 ht_cap
.ampdu_density
= IEEE80211_HT_MPDU_DENSITY_8
;
4462 ht_cap
.cap
|= IEEE80211_HT_CAP_SUP_WIDTH_20_40
;
4463 ht_cap
.cap
|= IEEE80211_HT_CAP_DSSSCCK40
;
4465 WLAN_HT_CAP_SM_PS_DISABLED
<< IEEE80211_HT_CAP_SM_PS_SHIFT
;
4467 if (ar
->ht_cap_info
& WMI_HT_CAP_HT20_SGI
)
4468 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_20
;
4470 if (ar
->ht_cap_info
& WMI_HT_CAP_HT40_SGI
)
4471 ht_cap
.cap
|= IEEE80211_HT_CAP_SGI_40
;
4473 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
) {
4476 smps
= WLAN_HT_CAP_SM_PS_DYNAMIC
;
4477 smps
<<= IEEE80211_HT_CAP_SM_PS_SHIFT
;
4482 if (ar
->ht_cap_info
& WMI_HT_CAP_TX_STBC
&& (ar
->cfg_tx_chainmask
> 1))
4483 ht_cap
.cap
|= IEEE80211_HT_CAP_TX_STBC
;
4485 if (ar
->ht_cap_info
& WMI_HT_CAP_RX_STBC
) {
4488 stbc
= ar
->ht_cap_info
;
4489 stbc
&= WMI_HT_CAP_RX_STBC
;
4490 stbc
>>= WMI_HT_CAP_RX_STBC_MASK_SHIFT
;
4491 stbc
<<= IEEE80211_HT_CAP_RX_STBC_SHIFT
;
4492 stbc
&= IEEE80211_HT_CAP_RX_STBC
;
4497 if (ar
->ht_cap_info
& WMI_HT_CAP_LDPC
)
4498 ht_cap
.cap
|= IEEE80211_HT_CAP_LDPC_CODING
;
4500 if (ar
->ht_cap_info
& WMI_HT_CAP_L_SIG_TXOP_PROT
)
4501 ht_cap
.cap
|= IEEE80211_HT_CAP_LSIG_TXOP_PROT
;
4503 /* max AMSDU is implicitly taken from vht_cap_info */
4504 if (ar
->vht_cap_info
& WMI_VHT_CAP_MAX_MPDU_LEN_MASK
)
4505 ht_cap
.cap
|= IEEE80211_HT_CAP_MAX_AMSDU
;
4507 for (i
= 0; i
< ar
->num_rf_chains
; i
++) {
4508 if (ar
->cfg_rx_chainmask
& BIT(i
))
4509 ht_cap
.mcs
.rx_mask
[i
] = 0xFF;
4512 ht_cap
.mcs
.tx_params
|= IEEE80211_HT_MCS_TX_DEFINED
;
4517 static void ath10k_mac_setup_ht_vht_cap(struct ath10k
*ar
)
4519 struct ieee80211_supported_band
*band
;
4520 struct ieee80211_sta_vht_cap vht_cap
;
4521 struct ieee80211_sta_ht_cap ht_cap
;
4523 ht_cap
= ath10k_get_ht_cap(ar
);
4524 vht_cap
= ath10k_create_vht_cap(ar
);
4526 if (ar
->phy_capability
& WHAL_WLAN_11G_CAPABILITY
) {
4527 band
= &ar
->mac
.sbands
[NL80211_BAND_2GHZ
];
4528 band
->ht_cap
= ht_cap
;
4530 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
) {
4531 band
= &ar
->mac
.sbands
[NL80211_BAND_5GHZ
];
4532 band
->ht_cap
= ht_cap
;
4533 band
->vht_cap
= vht_cap
;
4537 static int __ath10k_set_antenna(struct ath10k
*ar
, u32 tx_ant
, u32 rx_ant
)
4541 lockdep_assert_held(&ar
->conf_mutex
);
4543 ath10k_check_chain_mask(ar
, tx_ant
, "tx");
4544 ath10k_check_chain_mask(ar
, rx_ant
, "rx");
4546 ar
->cfg_tx_chainmask
= tx_ant
;
4547 ar
->cfg_rx_chainmask
= rx_ant
;
4549 if ((ar
->state
!= ATH10K_STATE_ON
) &&
4550 (ar
->state
!= ATH10K_STATE_RESTARTED
))
4553 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->tx_chain_mask
,
4556 ath10k_warn(ar
, "failed to set tx-chainmask: %d, req 0x%x\n",
4561 ret
= ath10k_wmi_pdev_set_param(ar
, ar
->wmi
.pdev_param
->rx_chain_mask
,
4564 ath10k_warn(ar
, "failed to set rx-chainmask: %d, req 0x%x\n",
4569 /* Reload HT/VHT capability */
4570 ath10k_mac_setup_ht_vht_cap(ar
);
4575 static int ath10k_set_antenna(struct ieee80211_hw
*hw
, u32 tx_ant
, u32 rx_ant
)
4577 struct ath10k
*ar
= hw
->priv
;
4580 mutex_lock(&ar
->conf_mutex
);
4581 ret
= __ath10k_set_antenna(ar
, tx_ant
, rx_ant
);
4582 mutex_unlock(&ar
->conf_mutex
);
4586 static int ath10k_start(struct ieee80211_hw
*hw
)
4588 struct ath10k
*ar
= hw
->priv
;
4593 * This makes sense only when restarting hw. It is harmless to call
4594 * unconditionally. This is necessary to make sure no HTT/WMI tx
4595 * commands will be submitted while restarting.
4597 ath10k_drain_tx(ar
);
4599 mutex_lock(&ar
->conf_mutex
);
4601 switch (ar
->state
) {
4602 case ATH10K_STATE_OFF
:
4603 ar
->state
= ATH10K_STATE_ON
;
4605 case ATH10K_STATE_RESTARTING
:
4606 ar
->state
= ATH10K_STATE_RESTARTED
;
4608 case ATH10K_STATE_ON
:
4609 case ATH10K_STATE_RESTARTED
:
4610 case ATH10K_STATE_WEDGED
:
4614 case ATH10K_STATE_UTF
:
4619 ret
= ath10k_hif_power_up(ar
);
4621 ath10k_err(ar
, "Could not init hif: %d\n", ret
);
4625 ret
= ath10k_core_start(ar
, ATH10K_FIRMWARE_MODE_NORMAL
,
4626 &ar
->normal_mode_fw
);
4628 ath10k_err(ar
, "Could not init core: %d\n", ret
);
4629 goto err_power_down
;
4632 param
= ar
->wmi
.pdev_param
->pmf_qos
;
4633 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 1);
4635 ath10k_warn(ar
, "failed to enable PMF QOS: %d\n", ret
);
4639 param
= ar
->wmi
.pdev_param
->dynamic_bw
;
4640 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 1);
4642 ath10k_warn(ar
, "failed to enable dynamic BW: %d\n", ret
);
4646 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS
, ar
->wmi
.svc_map
)) {
4647 ret
= ath10k_wmi_adaptive_qcs(ar
, true);
4649 ath10k_warn(ar
, "failed to enable adaptive qcs: %d\n",
4655 if (test_bit(WMI_SERVICE_BURST
, ar
->wmi
.svc_map
)) {
4656 param
= ar
->wmi
.pdev_param
->burst_enable
;
4657 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 0);
4659 ath10k_warn(ar
, "failed to disable burst: %d\n", ret
);
4664 __ath10k_set_antenna(ar
, ar
->cfg_tx_chainmask
, ar
->cfg_rx_chainmask
);
4667 * By default FW set ARP frames ac to voice (6). In that case ARP
4668 * exchange is not working properly for UAPSD enabled AP. ARP requests
4669 * which arrives with access category 0 are processed by network stack
4670 * and send back with access category 0, but FW changes access category
4671 * to 6. Set ARP frames access category to best effort (0) solves
4675 param
= ar
->wmi
.pdev_param
->arp_ac_override
;
4676 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 0);
4678 ath10k_warn(ar
, "failed to set arp ac override parameter: %d\n",
4683 if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA
,
4684 ar
->running_fw
->fw_file
.fw_features
)) {
4685 ret
= ath10k_wmi_pdev_enable_adaptive_cca(ar
, 1,
4686 WMI_CCA_DETECT_LEVEL_AUTO
,
4687 WMI_CCA_DETECT_MARGIN_AUTO
);
4689 ath10k_warn(ar
, "failed to enable adaptive cca: %d\n",
4695 param
= ar
->wmi
.pdev_param
->ani_enable
;
4696 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 1);
4698 ath10k_warn(ar
, "failed to enable ani by default: %d\n",
4703 ar
->ani_enabled
= true;
4705 if (ath10k_peer_stats_enabled(ar
)) {
4706 param
= ar
->wmi
.pdev_param
->peer_stats_update_period
;
4707 ret
= ath10k_wmi_pdev_set_param(ar
, param
,
4708 PEER_DEFAULT_STATS_UPDATE_PERIOD
);
4711 "failed to set peer stats period : %d\n",
4717 param
= ar
->wmi
.pdev_param
->enable_btcoex
;
4718 if (test_bit(WMI_SERVICE_COEX_GPIO
, ar
->wmi
.svc_map
) &&
4719 test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM
,
4720 ar
->running_fw
->fw_file
.fw_features
)) {
4721 ret
= ath10k_wmi_pdev_set_param(ar
, param
, 0);
4724 "failed to set btcoex param: %d\n", ret
);
4727 clear_bit(ATH10K_FLAG_BTCOEX
, &ar
->dev_flags
);
4730 ar
->num_started_vdevs
= 0;
4731 ath10k_regd_update(ar
);
4733 ath10k_spectral_start(ar
);
4734 ath10k_thermal_set_throttling(ar
);
4736 mutex_unlock(&ar
->conf_mutex
);
4740 ath10k_core_stop(ar
);
4743 ath10k_hif_power_down(ar
);
4746 ar
->state
= ATH10K_STATE_OFF
;
4749 mutex_unlock(&ar
->conf_mutex
);
4753 static void ath10k_stop(struct ieee80211_hw
*hw
)
4755 struct ath10k
*ar
= hw
->priv
;
4757 ath10k_drain_tx(ar
);
4759 mutex_lock(&ar
->conf_mutex
);
4760 if (ar
->state
!= ATH10K_STATE_OFF
) {
4762 ar
->state
= ATH10K_STATE_OFF
;
4764 mutex_unlock(&ar
->conf_mutex
);
4766 cancel_work_sync(&ar
->set_coverage_class_work
);
4767 cancel_delayed_work_sync(&ar
->scan
.timeout
);
4768 cancel_work_sync(&ar
->restart_work
);
4771 static int ath10k_config_ps(struct ath10k
*ar
)
4773 struct ath10k_vif
*arvif
;
4776 lockdep_assert_held(&ar
->conf_mutex
);
4778 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
4779 ret
= ath10k_mac_vif_setup_ps(arvif
);
4781 ath10k_warn(ar
, "failed to setup powersave: %d\n", ret
);
4789 static int ath10k_mac_txpower_setup(struct ath10k
*ar
, int txpower
)
4794 lockdep_assert_held(&ar
->conf_mutex
);
4796 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac txpower %d\n", txpower
);
4798 param
= ar
->wmi
.pdev_param
->txpower_limit2g
;
4799 ret
= ath10k_wmi_pdev_set_param(ar
, param
, txpower
* 2);
4801 ath10k_warn(ar
, "failed to set 2g txpower %d: %d\n",
4806 param
= ar
->wmi
.pdev_param
->txpower_limit5g
;
4807 ret
= ath10k_wmi_pdev_set_param(ar
, param
, txpower
* 2);
4809 ath10k_warn(ar
, "failed to set 5g txpower %d: %d\n",
4817 static int ath10k_mac_txpower_recalc(struct ath10k
*ar
)
4819 struct ath10k_vif
*arvif
;
4820 int ret
, txpower
= -1;
4822 lockdep_assert_held(&ar
->conf_mutex
);
4824 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
4825 if (arvif
->txpower
<= 0)
4829 txpower
= arvif
->txpower
;
4831 txpower
= min(txpower
, arvif
->txpower
);
4837 ret
= ath10k_mac_txpower_setup(ar
, txpower
);
4839 ath10k_warn(ar
, "failed to setup tx power %d: %d\n",
4847 static int ath10k_config(struct ieee80211_hw
*hw
, u32 changed
)
4849 struct ath10k
*ar
= hw
->priv
;
4850 struct ieee80211_conf
*conf
= &hw
->conf
;
4853 mutex_lock(&ar
->conf_mutex
);
4855 if (changed
& IEEE80211_CONF_CHANGE_PS
)
4856 ath10k_config_ps(ar
);
4858 if (changed
& IEEE80211_CONF_CHANGE_MONITOR
) {
4859 ar
->monitor
= conf
->flags
& IEEE80211_CONF_MONITOR
;
4860 ret
= ath10k_monitor_recalc(ar
);
4862 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
4865 mutex_unlock(&ar
->conf_mutex
);
4869 static u32
get_nss_from_chainmask(u16 chain_mask
)
4871 if ((chain_mask
& 0xf) == 0xf)
4873 else if ((chain_mask
& 0x7) == 0x7)
4875 else if ((chain_mask
& 0x3) == 0x3)
4880 static int ath10k_mac_set_txbf_conf(struct ath10k_vif
*arvif
)
4883 struct ath10k
*ar
= arvif
->ar
;
4887 if (ath10k_wmi_get_txbf_conf_scheme(ar
) != WMI_TXBF_CONF_BEFORE_ASSOC
)
4890 nsts
= ath10k_mac_get_vht_cap_bf_sts(ar
);
4891 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
|
4892 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
))
4893 value
|= SM(nsts
, WMI_TXBF_STS_CAP_OFFSET
);
4895 sound_dim
= ath10k_mac_get_vht_cap_bf_sound_dim(ar
);
4896 if (ar
->vht_cap_info
& (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
|
4897 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
))
4898 value
|= SM(sound_dim
, WMI_BF_SOUND_DIM_OFFSET
);
4903 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE
)
4904 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFER
;
4906 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE
)
4907 value
|= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER
|
4908 WMI_VDEV_PARAM_TXBF_SU_TX_BFER
);
4910 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE
)
4911 value
|= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
;
4913 if (ar
->vht_cap_info
& IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE
)
4914 value
|= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE
|
4915 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE
);
4917 return ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
4918 ar
->wmi
.vdev_param
->txbf
, value
);
4923 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
4924 * because we will send mgmt frames without CCK. This requirement
4925 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
4928 static int ath10k_add_interface(struct ieee80211_hw
*hw
,
4929 struct ieee80211_vif
*vif
)
4931 struct ath10k
*ar
= hw
->priv
;
4932 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
4933 struct ath10k_peer
*peer
;
4934 enum wmi_sta_powersave_param param
;
4941 vif
->driver_flags
|= IEEE80211_VIF_SUPPORTS_UAPSD
;
4943 mutex_lock(&ar
->conf_mutex
);
4945 memset(arvif
, 0, sizeof(*arvif
));
4946 ath10k_mac_txq_init(vif
->txq
);
4951 INIT_LIST_HEAD(&arvif
->list
);
4952 INIT_WORK(&arvif
->ap_csa_work
, ath10k_mac_vif_ap_csa_work
);
4953 INIT_DELAYED_WORK(&arvif
->connection_loss_work
,
4954 ath10k_mac_vif_sta_connection_loss_work
);
4956 for (i
= 0; i
< ARRAY_SIZE(arvif
->bitrate_mask
.control
); i
++) {
4957 arvif
->bitrate_mask
.control
[i
].legacy
= 0xffffffff;
4958 memset(arvif
->bitrate_mask
.control
[i
].ht_mcs
, 0xff,
4959 sizeof(arvif
->bitrate_mask
.control
[i
].ht_mcs
));
4960 memset(arvif
->bitrate_mask
.control
[i
].vht_mcs
, 0xff,
4961 sizeof(arvif
->bitrate_mask
.control
[i
].vht_mcs
));
4964 if (ar
->num_peers
>= ar
->max_num_peers
) {
4965 ath10k_warn(ar
, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
4970 if (ar
->free_vdev_map
== 0) {
4971 ath10k_warn(ar
, "Free vdev map is empty, no more interfaces allowed.\n");
4975 bit
= __ffs64(ar
->free_vdev_map
);
4977 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac create vdev %i map %llx\n",
4978 bit
, ar
->free_vdev_map
);
4980 arvif
->vdev_id
= bit
;
4981 arvif
->vdev_subtype
=
4982 ath10k_wmi_get_vdev_subtype(ar
, WMI_VDEV_SUBTYPE_NONE
);
4984 switch (vif
->type
) {
4985 case NL80211_IFTYPE_P2P_DEVICE
:
4986 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
4987 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
4988 (ar
, WMI_VDEV_SUBTYPE_P2P_DEVICE
);
4990 case NL80211_IFTYPE_UNSPECIFIED
:
4991 case NL80211_IFTYPE_STATION
:
4992 arvif
->vdev_type
= WMI_VDEV_TYPE_STA
;
4994 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
4995 (ar
, WMI_VDEV_SUBTYPE_P2P_CLIENT
);
4997 case NL80211_IFTYPE_ADHOC
:
4998 arvif
->vdev_type
= WMI_VDEV_TYPE_IBSS
;
5000 case NL80211_IFTYPE_MESH_POINT
:
5001 if (test_bit(WMI_SERVICE_MESH_11S
, ar
->wmi
.svc_map
)) {
5002 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
5003 (ar
, WMI_VDEV_SUBTYPE_MESH_11S
);
5004 } else if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
)) {
5006 ath10k_warn(ar
, "must load driver with rawmode=1 to add mesh interfaces\n");
5009 arvif
->vdev_type
= WMI_VDEV_TYPE_AP
;
5011 case NL80211_IFTYPE_AP
:
5012 arvif
->vdev_type
= WMI_VDEV_TYPE_AP
;
5015 arvif
->vdev_subtype
= ath10k_wmi_get_vdev_subtype
5016 (ar
, WMI_VDEV_SUBTYPE_P2P_GO
);
5018 case NL80211_IFTYPE_MONITOR
:
5019 arvif
->vdev_type
= WMI_VDEV_TYPE_MONITOR
;
5026 /* Using vdev_id as queue number will make it very easy to do per-vif
5027 * tx queue locking. This shouldn't wrap due to interface combinations
5028 * but do a modulo for correctness sake and prevent using offchannel tx
5029 * queues for regular vif tx.
5031 vif
->cab_queue
= arvif
->vdev_id
% (IEEE80211_MAX_QUEUES
- 1);
5032 for (i
= 0; i
< ARRAY_SIZE(vif
->hw_queue
); i
++)
5033 vif
->hw_queue
[i
] = arvif
->vdev_id
% (IEEE80211_MAX_QUEUES
- 1);
5035 /* Some firmware revisions don't wait for beacon tx completion before
5036 * sending another SWBA event. This could lead to hardware using old
5037 * (freed) beacon data in some cases, e.g. tx credit starvation
5038 * combined with missed TBTT. This is very very rare.
5040 * On non-IOMMU-enabled hosts this could be a possible security issue
5041 * because hw could beacon some random data on the air. On
5042 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
5043 * device would crash.
5045 * Since there are no beacon tx completions (implicit nor explicit)
5046 * propagated to host the only workaround for this is to allocate a
5047 * DMA-coherent buffer for a lifetime of a vif and use it for all
5048 * beacon tx commands. Worst case for this approach is some beacons may
5049 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
5051 if (vif
->type
== NL80211_IFTYPE_ADHOC
||
5052 vif
->type
== NL80211_IFTYPE_MESH_POINT
||
5053 vif
->type
== NL80211_IFTYPE_AP
) {
5054 arvif
->beacon_buf
= dma_zalloc_coherent(ar
->dev
,
5055 IEEE80211_MAX_FRAME_LEN
,
5056 &arvif
->beacon_paddr
,
5058 if (!arvif
->beacon_buf
) {
5060 ath10k_warn(ar
, "failed to allocate beacon buffer: %d\n",
5065 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED
, &ar
->dev_flags
))
5066 arvif
->nohwcrypt
= true;
5068 if (arvif
->nohwcrypt
&&
5069 !test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
)) {
5070 ath10k_warn(ar
, "cryptmode module param needed for sw crypto\n");
5074 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
5075 arvif
->vdev_id
, arvif
->vdev_type
, arvif
->vdev_subtype
,
5076 arvif
->beacon_buf
? "single-buf" : "per-skb");
5078 ret
= ath10k_wmi_vdev_create(ar
, arvif
->vdev_id
, arvif
->vdev_type
,
5079 arvif
->vdev_subtype
, vif
->addr
);
5081 ath10k_warn(ar
, "failed to create WMI vdev %i: %d\n",
5082 arvif
->vdev_id
, ret
);
5086 ar
->free_vdev_map
&= ~(1LL << arvif
->vdev_id
);
5087 spin_lock_bh(&ar
->data_lock
);
5088 list_add(&arvif
->list
, &ar
->arvifs
);
5089 spin_unlock_bh(&ar
->data_lock
);
5091 /* It makes no sense to have firmware do keepalives. mac80211 already
5092 * takes care of this with idle connection polling.
5094 ret
= ath10k_mac_vif_disable_keepalive(arvif
);
5096 ath10k_warn(ar
, "failed to disable keepalive on vdev %i: %d\n",
5097 arvif
->vdev_id
, ret
);
5098 goto err_vdev_delete
;
5101 arvif
->def_wep_key_idx
= -1;
5103 vdev_param
= ar
->wmi
.vdev_param
->tx_encap_type
;
5104 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5105 ATH10K_HW_TXRX_NATIVE_WIFI
);
5106 /* 10.X firmware does not support this VDEV parameter. Do not warn */
5107 if (ret
&& ret
!= -EOPNOTSUPP
) {
5108 ath10k_warn(ar
, "failed to set vdev %i TX encapsulation: %d\n",
5109 arvif
->vdev_id
, ret
);
5110 goto err_vdev_delete
;
5113 /* Configuring number of spatial stream for monitor interface is causing
5114 * target assert in qca9888 and qca6174.
5116 if (ar
->cfg_tx_chainmask
&& (vif
->type
!= NL80211_IFTYPE_MONITOR
)) {
5117 u16 nss
= get_nss_from_chainmask(ar
->cfg_tx_chainmask
);
5119 vdev_param
= ar
->wmi
.vdev_param
->nss
;
5120 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5123 ath10k_warn(ar
, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
5124 arvif
->vdev_id
, ar
->cfg_tx_chainmask
, nss
,
5126 goto err_vdev_delete
;
5130 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5131 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
5132 ret
= ath10k_peer_create(ar
, vif
, NULL
, arvif
->vdev_id
,
5133 vif
->addr
, WMI_PEER_TYPE_DEFAULT
);
5135 ath10k_warn(ar
, "failed to create vdev %i peer for AP/IBSS: %d\n",
5136 arvif
->vdev_id
, ret
);
5137 goto err_vdev_delete
;
5140 spin_lock_bh(&ar
->data_lock
);
5142 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, vif
->addr
);
5144 ath10k_warn(ar
, "failed to lookup peer %pM on vdev %i\n",
5145 vif
->addr
, arvif
->vdev_id
);
5146 spin_unlock_bh(&ar
->data_lock
);
5148 goto err_peer_delete
;
5151 arvif
->peer_id
= find_first_bit(peer
->peer_ids
,
5152 ATH10K_MAX_NUM_PEER_IDS
);
5154 spin_unlock_bh(&ar
->data_lock
);
5156 arvif
->peer_id
= HTT_INVALID_PEERID
;
5159 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
) {
5160 ret
= ath10k_mac_set_kickout(arvif
);
5162 ath10k_warn(ar
, "failed to set vdev %i kickout parameters: %d\n",
5163 arvif
->vdev_id
, ret
);
5164 goto err_peer_delete
;
5168 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
) {
5169 param
= WMI_STA_PS_PARAM_RX_WAKE_POLICY
;
5170 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
5171 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
5174 ath10k_warn(ar
, "failed to set vdev %i RX wake policy: %d\n",
5175 arvif
->vdev_id
, ret
);
5176 goto err_peer_delete
;
5179 ret
= ath10k_mac_vif_recalc_ps_wake_threshold(arvif
);
5181 ath10k_warn(ar
, "failed to recalc ps wake threshold on vdev %i: %d\n",
5182 arvif
->vdev_id
, ret
);
5183 goto err_peer_delete
;
5186 ret
= ath10k_mac_vif_recalc_ps_poll_count(arvif
);
5188 ath10k_warn(ar
, "failed to recalc ps poll count on vdev %i: %d\n",
5189 arvif
->vdev_id
, ret
);
5190 goto err_peer_delete
;
5194 ret
= ath10k_mac_set_txbf_conf(arvif
);
5196 ath10k_warn(ar
, "failed to set txbf for vdev %d: %d\n",
5197 arvif
->vdev_id
, ret
);
5198 goto err_peer_delete
;
5201 ret
= ath10k_mac_set_rts(arvif
, ar
->hw
->wiphy
->rts_threshold
);
5203 ath10k_warn(ar
, "failed to set rts threshold for vdev %d: %d\n",
5204 arvif
->vdev_id
, ret
);
5205 goto err_peer_delete
;
5208 arvif
->txpower
= vif
->bss_conf
.txpower
;
5209 ret
= ath10k_mac_txpower_recalc(ar
);
5211 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
5212 goto err_peer_delete
;
5215 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
5216 ar
->monitor_arvif
= arvif
;
5217 ret
= ath10k_monitor_recalc(ar
);
5219 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
5220 goto err_peer_delete
;
5224 spin_lock_bh(&ar
->htt
.tx_lock
);
5226 ieee80211_wake_queue(ar
->hw
, arvif
->vdev_id
);
5227 spin_unlock_bh(&ar
->htt
.tx_lock
);
5229 mutex_unlock(&ar
->conf_mutex
);
5233 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5234 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
)
5235 ath10k_wmi_peer_delete(ar
, arvif
->vdev_id
, vif
->addr
);
5238 ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
5239 ar
->free_vdev_map
|= 1LL << arvif
->vdev_id
;
5240 spin_lock_bh(&ar
->data_lock
);
5241 list_del(&arvif
->list
);
5242 spin_unlock_bh(&ar
->data_lock
);
5245 if (arvif
->beacon_buf
) {
5246 dma_free_coherent(ar
->dev
, IEEE80211_MAX_FRAME_LEN
,
5247 arvif
->beacon_buf
, arvif
->beacon_paddr
);
5248 arvif
->beacon_buf
= NULL
;
5251 mutex_unlock(&ar
->conf_mutex
);
5256 static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif
*arvif
)
5260 for (i
= 0; i
< BITS_PER_LONG
; i
++)
5261 ath10k_mac_vif_tx_unlock(arvif
, i
);
5264 static void ath10k_remove_interface(struct ieee80211_hw
*hw
,
5265 struct ieee80211_vif
*vif
)
5267 struct ath10k
*ar
= hw
->priv
;
5268 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
5269 struct ath10k_peer
*peer
;
5273 cancel_work_sync(&arvif
->ap_csa_work
);
5274 cancel_delayed_work_sync(&arvif
->connection_loss_work
);
5276 mutex_lock(&ar
->conf_mutex
);
5278 spin_lock_bh(&ar
->data_lock
);
5279 ath10k_mac_vif_beacon_cleanup(arvif
);
5280 spin_unlock_bh(&ar
->data_lock
);
5282 ret
= ath10k_spectral_vif_stop(arvif
);
5284 ath10k_warn(ar
, "failed to stop spectral for vdev %i: %d\n",
5285 arvif
->vdev_id
, ret
);
5287 ar
->free_vdev_map
|= 1LL << arvif
->vdev_id
;
5288 spin_lock_bh(&ar
->data_lock
);
5289 list_del(&arvif
->list
);
5290 spin_unlock_bh(&ar
->data_lock
);
5292 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5293 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
5294 ret
= ath10k_wmi_peer_delete(arvif
->ar
, arvif
->vdev_id
,
5297 ath10k_warn(ar
, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5298 arvif
->vdev_id
, ret
);
5300 kfree(arvif
->u
.ap
.noa_data
);
5303 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %i delete (remove interface)\n",
5306 ret
= ath10k_wmi_vdev_delete(ar
, arvif
->vdev_id
);
5308 ath10k_warn(ar
, "failed to delete WMI vdev %i: %d\n",
5309 arvif
->vdev_id
, ret
);
5311 /* Some firmware revisions don't notify host about self-peer removal
5312 * until after associated vdev is deleted.
5314 if (arvif
->vdev_type
== WMI_VDEV_TYPE_AP
||
5315 arvif
->vdev_type
== WMI_VDEV_TYPE_IBSS
) {
5316 ret
= ath10k_wait_for_peer_deleted(ar
, arvif
->vdev_id
,
5319 ath10k_warn(ar
, "failed to remove AP self-peer on vdev %i: %d\n",
5320 arvif
->vdev_id
, ret
);
5322 spin_lock_bh(&ar
->data_lock
);
5324 spin_unlock_bh(&ar
->data_lock
);
5327 spin_lock_bh(&ar
->data_lock
);
5328 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++) {
5329 peer
= ar
->peer_map
[i
];
5333 if (peer
->vif
== vif
) {
5334 ath10k_warn(ar
, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
5335 vif
->addr
, arvif
->vdev_id
);
5339 spin_unlock_bh(&ar
->data_lock
);
5341 ath10k_peer_cleanup(ar
, arvif
->vdev_id
);
5342 ath10k_mac_txq_unref(ar
, vif
->txq
);
5344 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
5345 ar
->monitor_arvif
= NULL
;
5346 ret
= ath10k_monitor_recalc(ar
);
5348 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
5351 ret
= ath10k_mac_txpower_recalc(ar
);
5353 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
5355 spin_lock_bh(&ar
->htt
.tx_lock
);
5356 ath10k_mac_vif_tx_unlock_all(arvif
);
5357 spin_unlock_bh(&ar
->htt
.tx_lock
);
5359 ath10k_mac_txq_unref(ar
, vif
->txq
);
5361 mutex_unlock(&ar
->conf_mutex
);
5365 * FIXME: Has to be verified.
5367 #define SUPPORTED_FILTERS \
5372 FIF_BCN_PRBRESP_PROMISC | \
5376 static void ath10k_configure_filter(struct ieee80211_hw
*hw
,
5377 unsigned int changed_flags
,
5378 unsigned int *total_flags
,
5381 struct ath10k
*ar
= hw
->priv
;
5384 mutex_lock(&ar
->conf_mutex
);
5386 changed_flags
&= SUPPORTED_FILTERS
;
5387 *total_flags
&= SUPPORTED_FILTERS
;
5388 ar
->filter_flags
= *total_flags
;
5390 ret
= ath10k_monitor_recalc(ar
);
5392 ath10k_warn(ar
, "failed to recalc monitor: %d\n", ret
);
5394 mutex_unlock(&ar
->conf_mutex
);
5397 static void ath10k_bss_info_changed(struct ieee80211_hw
*hw
,
5398 struct ieee80211_vif
*vif
,
5399 struct ieee80211_bss_conf
*info
,
5402 struct ath10k
*ar
= hw
->priv
;
5403 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
5405 u32 vdev_param
, pdev_param
, slottime
, preamble
;
5407 mutex_lock(&ar
->conf_mutex
);
5409 if (changed
& BSS_CHANGED_IBSS
)
5410 ath10k_control_ibss(arvif
, info
, vif
->addr
);
5412 if (changed
& BSS_CHANGED_BEACON_INT
) {
5413 arvif
->beacon_interval
= info
->beacon_int
;
5414 vdev_param
= ar
->wmi
.vdev_param
->beacon_interval
;
5415 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5416 arvif
->beacon_interval
);
5417 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5418 "mac vdev %d beacon_interval %d\n",
5419 arvif
->vdev_id
, arvif
->beacon_interval
);
5422 ath10k_warn(ar
, "failed to set beacon interval for vdev %d: %i\n",
5423 arvif
->vdev_id
, ret
);
5426 if (changed
& BSS_CHANGED_BEACON
) {
5427 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5428 "vdev %d set beacon tx mode to staggered\n",
5431 pdev_param
= ar
->wmi
.pdev_param
->beacon_tx_mode
;
5432 ret
= ath10k_wmi_pdev_set_param(ar
, pdev_param
,
5433 WMI_BEACON_STAGGERED_MODE
);
5435 ath10k_warn(ar
, "failed to set beacon mode for vdev %d: %i\n",
5436 arvif
->vdev_id
, ret
);
5438 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
5440 ath10k_warn(ar
, "failed to update beacon template: %d\n",
5443 if (ieee80211_vif_is_mesh(vif
)) {
5444 /* mesh doesn't use SSID but firmware needs it */
5445 strncpy(arvif
->u
.ap
.ssid
, "mesh",
5446 sizeof(arvif
->u
.ap
.ssid
));
5447 arvif
->u
.ap
.ssid_len
= 4;
5451 if (changed
& BSS_CHANGED_AP_PROBE_RESP
) {
5452 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
5454 ath10k_warn(ar
, "failed to setup probe resp template on vdev %i: %d\n",
5455 arvif
->vdev_id
, ret
);
5458 if (changed
& (BSS_CHANGED_BEACON_INFO
| BSS_CHANGED_BEACON
)) {
5459 arvif
->dtim_period
= info
->dtim_period
;
5461 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5462 "mac vdev %d dtim_period %d\n",
5463 arvif
->vdev_id
, arvif
->dtim_period
);
5465 vdev_param
= ar
->wmi
.vdev_param
->dtim_period
;
5466 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5467 arvif
->dtim_period
);
5469 ath10k_warn(ar
, "failed to set dtim period for vdev %d: %i\n",
5470 arvif
->vdev_id
, ret
);
5473 if (changed
& BSS_CHANGED_SSID
&&
5474 vif
->type
== NL80211_IFTYPE_AP
) {
5475 arvif
->u
.ap
.ssid_len
= info
->ssid_len
;
5477 memcpy(arvif
->u
.ap
.ssid
, info
->ssid
, info
->ssid_len
);
5478 arvif
->u
.ap
.hidden_ssid
= info
->hidden_ssid
;
5481 if (changed
& BSS_CHANGED_BSSID
&& !is_zero_ether_addr(info
->bssid
))
5482 ether_addr_copy(arvif
->bssid
, info
->bssid
);
5484 if (changed
& BSS_CHANGED_BEACON_ENABLED
)
5485 ath10k_control_beaconing(arvif
, info
);
5487 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
5488 arvif
->use_cts_prot
= info
->use_cts_prot
;
5490 ret
= ath10k_recalc_rtscts_prot(arvif
);
5492 ath10k_warn(ar
, "failed to recalculate rts/cts prot for vdev %d: %d\n",
5493 arvif
->vdev_id
, ret
);
5495 if (ath10k_mac_can_set_cts_prot(arvif
)) {
5496 ret
= ath10k_mac_set_cts_prot(arvif
);
5498 ath10k_warn(ar
, "failed to set cts protection for vdev %d: %d\n",
5499 arvif
->vdev_id
, ret
);
5503 if (changed
& BSS_CHANGED_ERP_SLOT
) {
5504 if (info
->use_short_slot
)
5505 slottime
= WMI_VDEV_SLOT_TIME_SHORT
; /* 9us */
5508 slottime
= WMI_VDEV_SLOT_TIME_LONG
; /* 20us */
5510 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d slot_time %d\n",
5511 arvif
->vdev_id
, slottime
);
5513 vdev_param
= ar
->wmi
.vdev_param
->slot_time
;
5514 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5517 ath10k_warn(ar
, "failed to set erp slot for vdev %d: %i\n",
5518 arvif
->vdev_id
, ret
);
5521 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
5522 if (info
->use_short_preamble
)
5523 preamble
= WMI_VDEV_PREAMBLE_SHORT
;
5525 preamble
= WMI_VDEV_PREAMBLE_LONG
;
5527 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
5528 "mac vdev %d preamble %dn",
5529 arvif
->vdev_id
, preamble
);
5531 vdev_param
= ar
->wmi
.vdev_param
->preamble
;
5532 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5535 ath10k_warn(ar
, "failed to set preamble for vdev %d: %i\n",
5536 arvif
->vdev_id
, ret
);
5539 if (changed
& BSS_CHANGED_ASSOC
) {
5541 /* Workaround: Make sure monitor vdev is not running
5542 * when associating to prevent some firmware revisions
5543 * (e.g. 10.1 and 10.2) from crashing.
5545 if (ar
->monitor_started
)
5546 ath10k_monitor_stop(ar
);
5547 ath10k_bss_assoc(hw
, vif
, info
);
5548 ath10k_monitor_recalc(ar
);
5550 ath10k_bss_disassoc(hw
, vif
);
5554 if (changed
& BSS_CHANGED_TXPOWER
) {
5555 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev_id %i txpower %d\n",
5556 arvif
->vdev_id
, info
->txpower
);
5558 arvif
->txpower
= info
->txpower
;
5559 ret
= ath10k_mac_txpower_recalc(ar
);
5561 ath10k_warn(ar
, "failed to recalc tx power: %d\n", ret
);
5564 if (changed
& BSS_CHANGED_PS
) {
5565 arvif
->ps
= vif
->bss_conf
.ps
;
5567 ret
= ath10k_config_ps(ar
);
5569 ath10k_warn(ar
, "failed to setup ps on vdev %i: %d\n",
5570 arvif
->vdev_id
, ret
);
5573 mutex_unlock(&ar
->conf_mutex
);
5576 static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw
*hw
, s16 value
)
5578 struct ath10k
*ar
= hw
->priv
;
5580 /* This function should never be called if setting the coverage class
5581 * is not supported on this hardware.
5583 if (!ar
->hw_params
.hw_ops
->set_coverage_class
) {
5587 ar
->hw_params
.hw_ops
->set_coverage_class(ar
, value
);
5590 struct ath10k_mac_tdls_iter_data
{
5591 u32 num_tdls_stations
;
5592 struct ieee80211_vif
*curr_vif
;
5595 static void ath10k_mac_tdls_vif_stations_count_iter(void *data
,
5596 struct ieee80211_sta
*sta
)
5598 struct ath10k_mac_tdls_iter_data
*iter_data
= data
;
5599 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
5600 struct ieee80211_vif
*sta_vif
= arsta
->arvif
->vif
;
5602 if (sta
->tdls
&& sta_vif
== iter_data
->curr_vif
)
5603 iter_data
->num_tdls_stations
++;
5606 static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw
*hw
,
5607 struct ieee80211_vif
*vif
)
5609 struct ath10k_mac_tdls_iter_data data
= {};
5611 data
.curr_vif
= vif
;
5613 ieee80211_iterate_stations_atomic(hw
,
5614 ath10k_mac_tdls_vif_stations_count_iter
,
5616 return data
.num_tdls_stations
;
5619 static void ath10k_mac_tdls_vifs_count_iter(void *data
, u8
*mac
,
5620 struct ieee80211_vif
*vif
)
5622 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
5623 int *num_tdls_vifs
= data
;
5625 if (vif
->type
!= NL80211_IFTYPE_STATION
)
5628 if (ath10k_mac_tdls_vif_stations_count(arvif
->ar
->hw
, vif
) > 0)
5632 static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw
*hw
)
5634 int num_tdls_vifs
= 0;
5636 ieee80211_iterate_active_interfaces_atomic(hw
,
5637 IEEE80211_IFACE_ITER_NORMAL
,
5638 ath10k_mac_tdls_vifs_count_iter
,
5640 return num_tdls_vifs
;
5643 static int ath10k_hw_scan(struct ieee80211_hw
*hw
,
5644 struct ieee80211_vif
*vif
,
5645 struct ieee80211_scan_request
*hw_req
)
5647 struct ath10k
*ar
= hw
->priv
;
5648 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
5649 struct cfg80211_scan_request
*req
= &hw_req
->req
;
5650 struct wmi_start_scan_arg arg
;
5654 mutex_lock(&ar
->conf_mutex
);
5656 if (ath10k_mac_tdls_vif_stations_count(hw
, vif
) > 0) {
5661 spin_lock_bh(&ar
->data_lock
);
5662 switch (ar
->scan
.state
) {
5663 case ATH10K_SCAN_IDLE
:
5664 reinit_completion(&ar
->scan
.started
);
5665 reinit_completion(&ar
->scan
.completed
);
5666 ar
->scan
.state
= ATH10K_SCAN_STARTING
;
5667 ar
->scan
.is_roc
= false;
5668 ar
->scan
.vdev_id
= arvif
->vdev_id
;
5671 case ATH10K_SCAN_STARTING
:
5672 case ATH10K_SCAN_RUNNING
:
5673 case ATH10K_SCAN_ABORTING
:
5677 spin_unlock_bh(&ar
->data_lock
);
5682 memset(&arg
, 0, sizeof(arg
));
5683 ath10k_wmi_start_scan_init(ar
, &arg
);
5684 arg
.vdev_id
= arvif
->vdev_id
;
5685 arg
.scan_id
= ATH10K_SCAN_ID
;
5688 arg
.ie_len
= req
->ie_len
;
5689 memcpy(arg
.ie
, req
->ie
, arg
.ie_len
);
5693 arg
.n_ssids
= req
->n_ssids
;
5694 for (i
= 0; i
< arg
.n_ssids
; i
++) {
5695 arg
.ssids
[i
].len
= req
->ssids
[i
].ssid_len
;
5696 arg
.ssids
[i
].ssid
= req
->ssids
[i
].ssid
;
5699 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
5702 if (req
->n_channels
) {
5703 arg
.n_channels
= req
->n_channels
;
5704 for (i
= 0; i
< arg
.n_channels
; i
++)
5705 arg
.channels
[i
] = req
->channels
[i
]->center_freq
;
5708 ret
= ath10k_start_scan(ar
, &arg
);
5710 ath10k_warn(ar
, "failed to start hw scan: %d\n", ret
);
5711 spin_lock_bh(&ar
->data_lock
);
5712 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
5713 spin_unlock_bh(&ar
->data_lock
);
5716 /* Add a 200ms margin to account for event/command processing */
5717 ieee80211_queue_delayed_work(ar
->hw
, &ar
->scan
.timeout
,
5718 msecs_to_jiffies(arg
.max_scan_time
+
5722 mutex_unlock(&ar
->conf_mutex
);
5726 static void ath10k_cancel_hw_scan(struct ieee80211_hw
*hw
,
5727 struct ieee80211_vif
*vif
)
5729 struct ath10k
*ar
= hw
->priv
;
5731 mutex_lock(&ar
->conf_mutex
);
5732 ath10k_scan_abort(ar
);
5733 mutex_unlock(&ar
->conf_mutex
);
5735 cancel_delayed_work_sync(&ar
->scan
.timeout
);
5738 static void ath10k_set_key_h_def_keyidx(struct ath10k
*ar
,
5739 struct ath10k_vif
*arvif
,
5740 enum set_key_cmd cmd
,
5741 struct ieee80211_key_conf
*key
)
5743 u32 vdev_param
= arvif
->ar
->wmi
.vdev_param
->def_keyid
;
5746 /* 10.1 firmware branch requires default key index to be set to group
5747 * key index after installing it. Otherwise FW/HW Txes corrupted
5748 * frames with multi-vif APs. This is not required for main firmware
5749 * branch (e.g. 636).
5751 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
5753 * FIXME: It remains unknown if this is required for multi-vif STA
5754 * interfaces on 10.1.
5757 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_AP
&&
5758 arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
5761 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP40
)
5764 if (key
->cipher
== WLAN_CIPHER_SUITE_WEP104
)
5767 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
5773 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
,
5776 ath10k_warn(ar
, "failed to set vdev %i group key as default key: %d\n",
5777 arvif
->vdev_id
, ret
);
5780 static int ath10k_set_key(struct ieee80211_hw
*hw
, enum set_key_cmd cmd
,
5781 struct ieee80211_vif
*vif
, struct ieee80211_sta
*sta
,
5782 struct ieee80211_key_conf
*key
)
5784 struct ath10k
*ar
= hw
->priv
;
5785 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
5786 struct ath10k_peer
*peer
;
5787 const u8
*peer_addr
;
5788 bool is_wep
= key
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
5789 key
->cipher
== WLAN_CIPHER_SUITE_WEP104
;
5795 /* this one needs to be done in software */
5796 if (key
->cipher
== WLAN_CIPHER_SUITE_AES_CMAC
||
5797 key
->cipher
== WLAN_CIPHER_SUITE_BIP_GMAC_128
||
5798 key
->cipher
== WLAN_CIPHER_SUITE_BIP_GMAC_256
||
5799 key
->cipher
== WLAN_CIPHER_SUITE_BIP_CMAC_256
)
5802 if (arvif
->nohwcrypt
)
5805 if (key
->keyidx
> WMI_MAX_KEY_INDEX
)
5808 mutex_lock(&ar
->conf_mutex
);
5811 peer_addr
= sta
->addr
;
5812 else if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
)
5813 peer_addr
= vif
->bss_conf
.bssid
;
5815 peer_addr
= vif
->addr
;
5817 key
->hw_key_idx
= key
->keyidx
;
5821 arvif
->wep_keys
[key
->keyidx
] = key
;
5823 arvif
->wep_keys
[key
->keyidx
] = NULL
;
5826 /* the peer should not disappear in mid-way (unless FW goes awry) since
5827 * we already hold conf_mutex. we just make sure its there now.
5829 spin_lock_bh(&ar
->data_lock
);
5830 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
5831 spin_unlock_bh(&ar
->data_lock
);
5834 if (cmd
== SET_KEY
) {
5835 ath10k_warn(ar
, "failed to install key for non-existent peer %pM\n",
5840 /* if the peer doesn't exist there is no key to disable anymore */
5845 if (key
->flags
& IEEE80211_KEY_FLAG_PAIRWISE
)
5846 flags
|= WMI_KEY_PAIRWISE
;
5848 flags
|= WMI_KEY_GROUP
;
5851 if (cmd
== DISABLE_KEY
)
5852 ath10k_clear_vdev_key(arvif
, key
);
5854 /* When WEP keys are uploaded it's possible that there are
5855 * stations associated already (e.g. when merging) without any
5856 * keys. Static WEP needs an explicit per-peer key upload.
5858 if (vif
->type
== NL80211_IFTYPE_ADHOC
&&
5860 ath10k_mac_vif_update_wep_key(arvif
, key
);
5862 /* 802.1x never sets the def_wep_key_idx so each set_key()
5863 * call changes default tx key.
5865 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
5866 * after first set_key().
5868 if (cmd
== SET_KEY
&& arvif
->def_wep_key_idx
== -1)
5869 flags
|= WMI_KEY_TX_USAGE
;
5872 ret
= ath10k_install_key(arvif
, key
, cmd
, peer_addr
, flags
);
5875 ath10k_warn(ar
, "failed to install key for vdev %i peer %pM: %d\n",
5876 arvif
->vdev_id
, peer_addr
, ret
);
5880 /* mac80211 sets static WEP keys as groupwise while firmware requires
5881 * them to be installed twice as both pairwise and groupwise.
5883 if (is_wep
&& !sta
&& vif
->type
== NL80211_IFTYPE_STATION
) {
5885 flags2
&= ~WMI_KEY_GROUP
;
5886 flags2
|= WMI_KEY_PAIRWISE
;
5888 ret
= ath10k_install_key(arvif
, key
, cmd
, peer_addr
, flags2
);
5891 ath10k_warn(ar
, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
5892 arvif
->vdev_id
, peer_addr
, ret
);
5893 ret2
= ath10k_install_key(arvif
, key
, DISABLE_KEY
,
5897 ath10k_warn(ar
, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
5898 arvif
->vdev_id
, peer_addr
, ret2
);
5904 ath10k_set_key_h_def_keyidx(ar
, arvif
, cmd
, key
);
5906 spin_lock_bh(&ar
->data_lock
);
5907 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, peer_addr
);
5908 if (peer
&& cmd
== SET_KEY
)
5909 peer
->keys
[key
->keyidx
] = key
;
5910 else if (peer
&& cmd
== DISABLE_KEY
)
5911 peer
->keys
[key
->keyidx
] = NULL
;
5912 else if (peer
== NULL
)
5913 /* impossible unless FW goes crazy */
5914 ath10k_warn(ar
, "Peer %pM disappeared!\n", peer_addr
);
5915 spin_unlock_bh(&ar
->data_lock
);
5918 mutex_unlock(&ar
->conf_mutex
);
5922 static void ath10k_set_default_unicast_key(struct ieee80211_hw
*hw
,
5923 struct ieee80211_vif
*vif
,
5926 struct ath10k
*ar
= hw
->priv
;
5927 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
5930 mutex_lock(&arvif
->ar
->conf_mutex
);
5932 if (arvif
->ar
->state
!= ATH10K_STATE_ON
)
5935 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d set keyidx %d\n",
5936 arvif
->vdev_id
, keyidx
);
5938 ret
= ath10k_wmi_vdev_set_param(arvif
->ar
,
5940 arvif
->ar
->wmi
.vdev_param
->def_keyid
,
5944 ath10k_warn(ar
, "failed to update wep key index for vdev %d: %d\n",
5950 arvif
->def_wep_key_idx
= keyidx
;
5953 mutex_unlock(&arvif
->ar
->conf_mutex
);
5956 static void ath10k_sta_rc_update_wk(struct work_struct
*wk
)
5959 struct ath10k_vif
*arvif
;
5960 struct ath10k_sta
*arsta
;
5961 struct ieee80211_sta
*sta
;
5962 struct cfg80211_chan_def def
;
5963 enum nl80211_band band
;
5964 const u8
*ht_mcs_mask
;
5965 const u16
*vht_mcs_mask
;
5966 u32 changed
, bw
, nss
, smps
;
5969 arsta
= container_of(wk
, struct ath10k_sta
, update_wk
);
5970 sta
= container_of((void *)arsta
, struct ieee80211_sta
, drv_priv
);
5971 arvif
= arsta
->arvif
;
5974 if (WARN_ON(ath10k_mac_vif_chan(arvif
->vif
, &def
)))
5977 band
= def
.chan
->band
;
5978 ht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].ht_mcs
;
5979 vht_mcs_mask
= arvif
->bitrate_mask
.control
[band
].vht_mcs
;
5981 spin_lock_bh(&ar
->data_lock
);
5983 changed
= arsta
->changed
;
5990 spin_unlock_bh(&ar
->data_lock
);
5992 mutex_lock(&ar
->conf_mutex
);
5994 nss
= max_t(u32
, 1, nss
);
5995 nss
= min(nss
, max(ath10k_mac_max_ht_nss(ht_mcs_mask
),
5996 ath10k_mac_max_vht_nss(vht_mcs_mask
)));
5998 if (changed
& IEEE80211_RC_BW_CHANGED
) {
5999 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM peer bw %d\n",
6002 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
6003 WMI_PEER_CHAN_WIDTH
, bw
);
6005 ath10k_warn(ar
, "failed to update STA %pM peer bw %d: %d\n",
6006 sta
->addr
, bw
, err
);
6009 if (changed
& IEEE80211_RC_NSS_CHANGED
) {
6010 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM nss %d\n",
6013 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
6016 ath10k_warn(ar
, "failed to update STA %pM nss %d: %d\n",
6017 sta
->addr
, nss
, err
);
6020 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
6021 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM smps %d\n",
6024 err
= ath10k_wmi_peer_set_param(ar
, arvif
->vdev_id
, sta
->addr
,
6025 WMI_PEER_SMPS_STATE
, smps
);
6027 ath10k_warn(ar
, "failed to update STA %pM smps %d: %d\n",
6028 sta
->addr
, smps
, err
);
6031 if (changed
& IEEE80211_RC_SUPP_RATES_CHANGED
||
6032 changed
& IEEE80211_RC_NSS_CHANGED
) {
6033 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac update sta %pM supp rates/nss\n",
6036 err
= ath10k_station_assoc(ar
, arvif
->vif
, sta
, true);
6038 ath10k_warn(ar
, "failed to reassociate station: %pM\n",
6042 mutex_unlock(&ar
->conf_mutex
);
6045 static int ath10k_mac_inc_num_stations(struct ath10k_vif
*arvif
,
6046 struct ieee80211_sta
*sta
)
6048 struct ath10k
*ar
= arvif
->ar
;
6050 lockdep_assert_held(&ar
->conf_mutex
);
6052 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
&& !sta
->tdls
)
6055 if (ar
->num_stations
>= ar
->max_num_stations
)
6063 static void ath10k_mac_dec_num_stations(struct ath10k_vif
*arvif
,
6064 struct ieee80211_sta
*sta
)
6066 struct ath10k
*ar
= arvif
->ar
;
6068 lockdep_assert_held(&ar
->conf_mutex
);
6070 if (arvif
->vdev_type
== WMI_VDEV_TYPE_STA
&& !sta
->tdls
)
6076 static int ath10k_sta_state(struct ieee80211_hw
*hw
,
6077 struct ieee80211_vif
*vif
,
6078 struct ieee80211_sta
*sta
,
6079 enum ieee80211_sta_state old_state
,
6080 enum ieee80211_sta_state new_state
)
6082 struct ath10k
*ar
= hw
->priv
;
6083 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
6084 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
6085 struct ath10k_peer
*peer
;
6089 if (old_state
== IEEE80211_STA_NOTEXIST
&&
6090 new_state
== IEEE80211_STA_NONE
) {
6091 memset(arsta
, 0, sizeof(*arsta
));
6092 arsta
->arvif
= arvif
;
6093 INIT_WORK(&arsta
->update_wk
, ath10k_sta_rc_update_wk
);
6095 for (i
= 0; i
< ARRAY_SIZE(sta
->txq
); i
++)
6096 ath10k_mac_txq_init(sta
->txq
[i
]);
6099 /* cancel must be done outside the mutex to avoid deadlock */
6100 if ((old_state
== IEEE80211_STA_NONE
&&
6101 new_state
== IEEE80211_STA_NOTEXIST
))
6102 cancel_work_sync(&arsta
->update_wk
);
6104 mutex_lock(&ar
->conf_mutex
);
6106 if (old_state
== IEEE80211_STA_NOTEXIST
&&
6107 new_state
== IEEE80211_STA_NONE
) {
6109 * New station addition.
6111 enum wmi_peer_type peer_type
= WMI_PEER_TYPE_DEFAULT
;
6112 u32 num_tdls_stations
;
6115 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
6116 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
6117 arvif
->vdev_id
, sta
->addr
,
6118 ar
->num_stations
+ 1, ar
->max_num_stations
,
6119 ar
->num_peers
+ 1, ar
->max_num_peers
);
6121 num_tdls_stations
= ath10k_mac_tdls_vif_stations_count(hw
, vif
);
6122 num_tdls_vifs
= ath10k_mac_tdls_vifs_count(hw
);
6125 if (num_tdls_stations
>= ar
->max_num_tdls_vdevs
) {
6126 ath10k_warn(ar
, "vdev %i exceeded maximum number of tdls vdevs %i\n",
6128 ar
->max_num_tdls_vdevs
);
6132 peer_type
= WMI_PEER_TYPE_TDLS
;
6135 ret
= ath10k_mac_inc_num_stations(arvif
, sta
);
6137 ath10k_warn(ar
, "refusing to associate station: too many connected already (%d)\n",
6138 ar
->max_num_stations
);
6142 ret
= ath10k_peer_create(ar
, vif
, sta
, arvif
->vdev_id
,
6143 sta
->addr
, peer_type
);
6145 ath10k_warn(ar
, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
6146 sta
->addr
, arvif
->vdev_id
, ret
);
6147 ath10k_mac_dec_num_stations(arvif
, sta
);
6151 spin_lock_bh(&ar
->data_lock
);
6153 peer
= ath10k_peer_find(ar
, arvif
->vdev_id
, sta
->addr
);
6155 ath10k_warn(ar
, "failed to lookup peer %pM on vdev %i\n",
6156 vif
->addr
, arvif
->vdev_id
);
6157 spin_unlock_bh(&ar
->data_lock
);
6158 ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
6159 ath10k_mac_dec_num_stations(arvif
, sta
);
6164 arsta
->peer_id
= find_first_bit(peer
->peer_ids
,
6165 ATH10K_MAX_NUM_PEER_IDS
);
6167 spin_unlock_bh(&ar
->data_lock
);
6172 ret
= ath10k_wmi_update_fw_tdls_state(ar
, arvif
->vdev_id
,
6173 WMI_TDLS_ENABLE_ACTIVE
);
6175 ath10k_warn(ar
, "failed to update fw tdls state on vdev %i: %i\n",
6176 arvif
->vdev_id
, ret
);
6177 ath10k_peer_delete(ar
, arvif
->vdev_id
,
6179 ath10k_mac_dec_num_stations(arvif
, sta
);
6183 ret
= ath10k_mac_tdls_peer_update(ar
, arvif
->vdev_id
, sta
,
6184 WMI_TDLS_PEER_STATE_PEERING
);
6187 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
6188 sta
->addr
, arvif
->vdev_id
, ret
);
6189 ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
6190 ath10k_mac_dec_num_stations(arvif
, sta
);
6192 if (num_tdls_stations
!= 0)
6194 ath10k_wmi_update_fw_tdls_state(ar
, arvif
->vdev_id
,
6197 } else if ((old_state
== IEEE80211_STA_NONE
&&
6198 new_state
== IEEE80211_STA_NOTEXIST
)) {
6200 * Existing station deletion.
6202 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
6203 "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
6204 arvif
->vdev_id
, sta
->addr
, sta
);
6207 ret
= ath10k_mac_tdls_peer_update(ar
, arvif
->vdev_id
,
6209 WMI_TDLS_PEER_STATE_TEARDOWN
);
6211 ath10k_warn(ar
, "failed to update tdls peer state for %pM state %d: %i\n",
6213 WMI_TDLS_PEER_STATE_TEARDOWN
, ret
);
6216 ret
= ath10k_peer_delete(ar
, arvif
->vdev_id
, sta
->addr
);
6218 ath10k_warn(ar
, "failed to delete peer %pM for vdev %d: %i\n",
6219 sta
->addr
, arvif
->vdev_id
, ret
);
6221 ath10k_mac_dec_num_stations(arvif
, sta
);
6223 spin_lock_bh(&ar
->data_lock
);
6224 for (i
= 0; i
< ARRAY_SIZE(ar
->peer_map
); i
++) {
6225 peer
= ar
->peer_map
[i
];
6229 if (peer
->sta
== sta
) {
6230 ath10k_warn(ar
, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly removed\n",
6231 sta
->addr
, peer
, i
, arvif
->vdev_id
);
6234 /* Clean up the peer object as well since we
6235 * must have failed to do this above.
6237 list_del(&peer
->list
);
6238 ar
->peer_map
[i
] = NULL
;
6243 spin_unlock_bh(&ar
->data_lock
);
6245 for (i
= 0; i
< ARRAY_SIZE(sta
->txq
); i
++)
6246 ath10k_mac_txq_unref(ar
, sta
->txq
[i
]);
6251 if (ath10k_mac_tdls_vif_stations_count(hw
, vif
))
6254 /* This was the last tdls peer in current vif */
6255 ret
= ath10k_wmi_update_fw_tdls_state(ar
, arvif
->vdev_id
,
6258 ath10k_warn(ar
, "failed to update fw tdls state on vdev %i: %i\n",
6259 arvif
->vdev_id
, ret
);
6261 } else if (old_state
== IEEE80211_STA_AUTH
&&
6262 new_state
== IEEE80211_STA_ASSOC
&&
6263 (vif
->type
== NL80211_IFTYPE_AP
||
6264 vif
->type
== NL80211_IFTYPE_MESH_POINT
||
6265 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
6269 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac sta %pM associated\n",
6272 ret
= ath10k_station_assoc(ar
, vif
, sta
, false);
6274 ath10k_warn(ar
, "failed to associate station %pM for vdev %i: %i\n",
6275 sta
->addr
, arvif
->vdev_id
, ret
);
6276 } else if (old_state
== IEEE80211_STA_ASSOC
&&
6277 new_state
== IEEE80211_STA_AUTHORIZED
&&
6280 * Tdls station authorized.
6282 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac tdls sta %pM authorized\n",
6285 ret
= ath10k_station_assoc(ar
, vif
, sta
, false);
6287 ath10k_warn(ar
, "failed to associate tdls station %pM for vdev %i: %i\n",
6288 sta
->addr
, arvif
->vdev_id
, ret
);
6292 ret
= ath10k_mac_tdls_peer_update(ar
, arvif
->vdev_id
, sta
,
6293 WMI_TDLS_PEER_STATE_CONNECTED
);
6295 ath10k_warn(ar
, "failed to update tdls peer %pM for vdev %i: %i\n",
6296 sta
->addr
, arvif
->vdev_id
, ret
);
6297 } else if (old_state
== IEEE80211_STA_ASSOC
&&
6298 new_state
== IEEE80211_STA_AUTH
&&
6299 (vif
->type
== NL80211_IFTYPE_AP
||
6300 vif
->type
== NL80211_IFTYPE_MESH_POINT
||
6301 vif
->type
== NL80211_IFTYPE_ADHOC
)) {
6305 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac sta %pM disassociated\n",
6308 ret
= ath10k_station_disassoc(ar
, vif
, sta
);
6310 ath10k_warn(ar
, "failed to disassociate station: %pM vdev %i: %i\n",
6311 sta
->addr
, arvif
->vdev_id
, ret
);
6314 mutex_unlock(&ar
->conf_mutex
);
6318 static int ath10k_conf_tx_uapsd(struct ath10k
*ar
, struct ieee80211_vif
*vif
,
6319 u16 ac
, bool enable
)
6321 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
6322 struct wmi_sta_uapsd_auto_trig_arg arg
= {};
6323 u32 prio
= 0, acc
= 0;
6327 lockdep_assert_held(&ar
->conf_mutex
);
6329 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_STA
)
6333 case IEEE80211_AC_VO
:
6334 value
= WMI_STA_PS_UAPSD_AC3_DELIVERY_EN
|
6335 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN
;
6339 case IEEE80211_AC_VI
:
6340 value
= WMI_STA_PS_UAPSD_AC2_DELIVERY_EN
|
6341 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN
;
6345 case IEEE80211_AC_BE
:
6346 value
= WMI_STA_PS_UAPSD_AC1_DELIVERY_EN
|
6347 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN
;
6351 case IEEE80211_AC_BK
:
6352 value
= WMI_STA_PS_UAPSD_AC0_DELIVERY_EN
|
6353 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN
;
6360 arvif
->u
.sta
.uapsd
|= value
;
6362 arvif
->u
.sta
.uapsd
&= ~value
;
6364 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
6365 WMI_STA_PS_PARAM_UAPSD
,
6366 arvif
->u
.sta
.uapsd
);
6368 ath10k_warn(ar
, "failed to set uapsd params: %d\n", ret
);
6372 if (arvif
->u
.sta
.uapsd
)
6373 value
= WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD
;
6375 value
= WMI_STA_PS_RX_WAKE_POLICY_WAKE
;
6377 ret
= ath10k_wmi_set_sta_ps_param(ar
, arvif
->vdev_id
,
6378 WMI_STA_PS_PARAM_RX_WAKE_POLICY
,
6381 ath10k_warn(ar
, "failed to set rx wake param: %d\n", ret
);
6383 ret
= ath10k_mac_vif_recalc_ps_wake_threshold(arvif
);
6385 ath10k_warn(ar
, "failed to recalc ps wake threshold on vdev %i: %d\n",
6386 arvif
->vdev_id
, ret
);
6390 ret
= ath10k_mac_vif_recalc_ps_poll_count(arvif
);
6392 ath10k_warn(ar
, "failed to recalc ps poll count on vdev %i: %d\n",
6393 arvif
->vdev_id
, ret
);
6397 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG
, ar
->wmi
.svc_map
) ||
6398 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG
, ar
->wmi
.svc_map
)) {
6399 /* Only userspace can make an educated decision when to send
6400 * trigger frame. The following effectively disables u-UAPSD
6401 * autotrigger in firmware (which is enabled by default
6402 * provided the autotrigger service is available).
6406 arg
.user_priority
= prio
;
6407 arg
.service_interval
= 0;
6408 arg
.suspend_interval
= WMI_STA_UAPSD_MAX_INTERVAL_MSEC
;
6409 arg
.delay_interval
= WMI_STA_UAPSD_MAX_INTERVAL_MSEC
;
6411 ret
= ath10k_wmi_vdev_sta_uapsd(ar
, arvif
->vdev_id
,
6412 arvif
->bssid
, &arg
, 1);
6414 ath10k_warn(ar
, "failed to set uapsd auto trigger %d\n",
6424 static int ath10k_conf_tx(struct ieee80211_hw
*hw
,
6425 struct ieee80211_vif
*vif
, u16 ac
,
6426 const struct ieee80211_tx_queue_params
*params
)
6428 struct ath10k
*ar
= hw
->priv
;
6429 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
6430 struct wmi_wmm_params_arg
*p
= NULL
;
6433 mutex_lock(&ar
->conf_mutex
);
6436 case IEEE80211_AC_VO
:
6437 p
= &arvif
->wmm_params
.ac_vo
;
6439 case IEEE80211_AC_VI
:
6440 p
= &arvif
->wmm_params
.ac_vi
;
6442 case IEEE80211_AC_BE
:
6443 p
= &arvif
->wmm_params
.ac_be
;
6445 case IEEE80211_AC_BK
:
6446 p
= &arvif
->wmm_params
.ac_bk
;
6455 p
->cwmin
= params
->cw_min
;
6456 p
->cwmax
= params
->cw_max
;
6457 p
->aifs
= params
->aifs
;
6460 * The channel time duration programmed in the HW is in absolute
6461 * microseconds, while mac80211 gives the txop in units of
6464 p
->txop
= params
->txop
* 32;
6466 if (ar
->wmi
.ops
->gen_vdev_wmm_conf
) {
6467 ret
= ath10k_wmi_vdev_wmm_conf(ar
, arvif
->vdev_id
,
6468 &arvif
->wmm_params
);
6470 ath10k_warn(ar
, "failed to set vdev wmm params on vdev %i: %d\n",
6471 arvif
->vdev_id
, ret
);
6475 /* This won't work well with multi-interface cases but it's
6476 * better than nothing.
6478 ret
= ath10k_wmi_pdev_set_wmm_params(ar
, &arvif
->wmm_params
);
6480 ath10k_warn(ar
, "failed to set wmm params: %d\n", ret
);
6485 ret
= ath10k_conf_tx_uapsd(ar
, vif
, ac
, params
->uapsd
);
6487 ath10k_warn(ar
, "failed to set sta uapsd: %d\n", ret
);
6490 mutex_unlock(&ar
->conf_mutex
);
6494 #define ATH10K_ROC_TIMEOUT_HZ (2 * HZ)
6496 static int ath10k_remain_on_channel(struct ieee80211_hw
*hw
,
6497 struct ieee80211_vif
*vif
,
6498 struct ieee80211_channel
*chan
,
6500 enum ieee80211_roc_type type
)
6502 struct ath10k
*ar
= hw
->priv
;
6503 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
6504 struct wmi_start_scan_arg arg
;
6508 mutex_lock(&ar
->conf_mutex
);
6510 if (ath10k_mac_tdls_vif_stations_count(hw
, vif
) > 0) {
6515 spin_lock_bh(&ar
->data_lock
);
6516 switch (ar
->scan
.state
) {
6517 case ATH10K_SCAN_IDLE
:
6518 reinit_completion(&ar
->scan
.started
);
6519 reinit_completion(&ar
->scan
.completed
);
6520 reinit_completion(&ar
->scan
.on_channel
);
6521 ar
->scan
.state
= ATH10K_SCAN_STARTING
;
6522 ar
->scan
.is_roc
= true;
6523 ar
->scan
.vdev_id
= arvif
->vdev_id
;
6524 ar
->scan
.roc_freq
= chan
->center_freq
;
6525 ar
->scan
.roc_notify
= true;
6528 case ATH10K_SCAN_STARTING
:
6529 case ATH10K_SCAN_RUNNING
:
6530 case ATH10K_SCAN_ABORTING
:
6534 spin_unlock_bh(&ar
->data_lock
);
6539 scan_time_msec
= ar
->hw
->wiphy
->max_remain_on_channel_duration
* 2;
6541 memset(&arg
, 0, sizeof(arg
));
6542 ath10k_wmi_start_scan_init(ar
, &arg
);
6543 arg
.vdev_id
= arvif
->vdev_id
;
6544 arg
.scan_id
= ATH10K_SCAN_ID
;
6546 arg
.channels
[0] = chan
->center_freq
;
6547 arg
.dwell_time_active
= scan_time_msec
;
6548 arg
.dwell_time_passive
= scan_time_msec
;
6549 arg
.max_scan_time
= scan_time_msec
;
6550 arg
.scan_ctrl_flags
|= WMI_SCAN_FLAG_PASSIVE
;
6551 arg
.scan_ctrl_flags
|= WMI_SCAN_FILTER_PROBE_REQ
;
6552 arg
.burst_duration_ms
= duration
;
6554 ret
= ath10k_start_scan(ar
, &arg
);
6556 ath10k_warn(ar
, "failed to start roc scan: %d\n", ret
);
6557 spin_lock_bh(&ar
->data_lock
);
6558 ar
->scan
.state
= ATH10K_SCAN_IDLE
;
6559 spin_unlock_bh(&ar
->data_lock
);
6563 ret
= wait_for_completion_timeout(&ar
->scan
.on_channel
, 3 * HZ
);
6565 ath10k_warn(ar
, "failed to switch to channel for roc scan\n");
6567 ret
= ath10k_scan_stop(ar
);
6569 ath10k_warn(ar
, "failed to stop scan: %d\n", ret
);
6575 ieee80211_queue_delayed_work(ar
->hw
, &ar
->scan
.timeout
,
6576 msecs_to_jiffies(duration
));
6580 mutex_unlock(&ar
->conf_mutex
);
6584 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw
*hw
)
6586 struct ath10k
*ar
= hw
->priv
;
6588 mutex_lock(&ar
->conf_mutex
);
6590 spin_lock_bh(&ar
->data_lock
);
6591 ar
->scan
.roc_notify
= false;
6592 spin_unlock_bh(&ar
->data_lock
);
6594 ath10k_scan_abort(ar
);
6596 mutex_unlock(&ar
->conf_mutex
);
6598 cancel_delayed_work_sync(&ar
->scan
.timeout
);
6604 * Both RTS and Fragmentation threshold are interface-specific
6605 * in ath10k, but device-specific in mac80211.
6608 static int ath10k_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
6610 struct ath10k
*ar
= hw
->priv
;
6611 struct ath10k_vif
*arvif
;
6614 mutex_lock(&ar
->conf_mutex
);
6615 list_for_each_entry(arvif
, &ar
->arvifs
, list
) {
6616 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac vdev %d rts threshold %d\n",
6617 arvif
->vdev_id
, value
);
6619 ret
= ath10k_mac_set_rts(arvif
, value
);
6621 ath10k_warn(ar
, "failed to set rts threshold for vdev %d: %d\n",
6622 arvif
->vdev_id
, ret
);
6626 mutex_unlock(&ar
->conf_mutex
);
6631 static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw
*hw
, u32 value
)
6633 /* Even though there's a WMI enum for fragmentation threshold no known
6634 * firmware actually implements it. Moreover it is not possible to rely
6635 * frame fragmentation to mac80211 because firmware clears the "more
6636 * fragments" bit in frame control making it impossible for remote
6637 * devices to reassemble frames.
6639 * Hence implement a dummy callback just to say fragmentation isn't
6640 * supported. This effectively prevents mac80211 from doing frame
6641 * fragmentation in software.
6646 static void ath10k_flush(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
6647 u32 queues
, bool drop
)
6649 struct ath10k
*ar
= hw
->priv
;
6653 /* mac80211 doesn't care if we really xmit queued frames or not
6654 * we'll collect those frames either way if we stop/delete vdevs
6659 mutex_lock(&ar
->conf_mutex
);
6661 if (ar
->state
== ATH10K_STATE_WEDGED
)
6664 time_left
= wait_event_timeout(ar
->htt
.empty_tx_wq
, ({
6667 spin_lock_bh(&ar
->htt
.tx_lock
);
6668 empty
= (ar
->htt
.num_pending_tx
== 0);
6669 spin_unlock_bh(&ar
->htt
.tx_lock
);
6671 skip
= (ar
->state
== ATH10K_STATE_WEDGED
) ||
6672 test_bit(ATH10K_FLAG_CRASH_FLUSH
,
6676 }), ATH10K_FLUSH_TIMEOUT_HZ
);
6678 if (time_left
== 0 || skip
)
6679 ath10k_warn(ar
, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
6680 skip
, ar
->state
, time_left
);
6683 mutex_unlock(&ar
->conf_mutex
);
6686 /* TODO: Implement this function properly
6687 * For now it is needed to reply to Probe Requests in IBSS mode.
6688 * Propably we need this information from FW.
6690 static int ath10k_tx_last_beacon(struct ieee80211_hw
*hw
)
6695 static void ath10k_reconfig_complete(struct ieee80211_hw
*hw
,
6696 enum ieee80211_reconfig_type reconfig_type
)
6698 struct ath10k
*ar
= hw
->priv
;
6700 if (reconfig_type
!= IEEE80211_RECONFIG_TYPE_RESTART
)
6703 mutex_lock(&ar
->conf_mutex
);
6705 /* If device failed to restart it will be in a different state, e.g.
6706 * ATH10K_STATE_WEDGED
6708 if (ar
->state
== ATH10K_STATE_RESTARTED
) {
6709 ath10k_info(ar
, "device successfully recovered\n");
6710 ar
->state
= ATH10K_STATE_ON
;
6711 ieee80211_wake_queues(ar
->hw
);
6714 mutex_unlock(&ar
->conf_mutex
);
6718 ath10k_mac_update_bss_chan_survey(struct ath10k
*ar
,
6719 struct ieee80211_channel
*channel
)
6722 enum wmi_bss_survey_req_type type
= WMI_BSS_SURVEY_REQ_TYPE_READ_CLEAR
;
6724 lockdep_assert_held(&ar
->conf_mutex
);
6726 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64
, ar
->wmi
.svc_map
) ||
6727 (ar
->rx_channel
!= channel
))
6730 if (ar
->scan
.state
!= ATH10K_SCAN_IDLE
) {
6731 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "ignoring bss chan info request while scanning..\n");
6735 reinit_completion(&ar
->bss_survey_done
);
6737 ret
= ath10k_wmi_pdev_bss_chan_info_request(ar
, type
);
6739 ath10k_warn(ar
, "failed to send pdev bss chan info request\n");
6743 ret
= wait_for_completion_timeout(&ar
->bss_survey_done
, 3 * HZ
);
6745 ath10k_warn(ar
, "bss channel survey timed out\n");
6750 static int ath10k_get_survey(struct ieee80211_hw
*hw
, int idx
,
6751 struct survey_info
*survey
)
6753 struct ath10k
*ar
= hw
->priv
;
6754 struct ieee80211_supported_band
*sband
;
6755 struct survey_info
*ar_survey
= &ar
->survey
[idx
];
6758 mutex_lock(&ar
->conf_mutex
);
6760 sband
= hw
->wiphy
->bands
[NL80211_BAND_2GHZ
];
6761 if (sband
&& idx
>= sband
->n_channels
) {
6762 idx
-= sband
->n_channels
;
6767 sband
= hw
->wiphy
->bands
[NL80211_BAND_5GHZ
];
6769 if (!sband
|| idx
>= sband
->n_channels
) {
6774 ath10k_mac_update_bss_chan_survey(ar
, &sband
->channels
[idx
]);
6776 spin_lock_bh(&ar
->data_lock
);
6777 memcpy(survey
, ar_survey
, sizeof(*survey
));
6778 spin_unlock_bh(&ar
->data_lock
);
6780 survey
->channel
= &sband
->channels
[idx
];
6782 if (ar
->rx_channel
== survey
->channel
)
6783 survey
->filled
|= SURVEY_INFO_IN_USE
;
6786 mutex_unlock(&ar
->conf_mutex
);
6791 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k
*ar
,
6792 enum nl80211_band band
,
6793 const struct cfg80211_bitrate_mask
*mask
)
6798 num_rates
+= hweight32(mask
->control
[band
].legacy
);
6800 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].ht_mcs
); i
++)
6801 num_rates
+= hweight8(mask
->control
[band
].ht_mcs
[i
]);
6803 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].vht_mcs
); i
++)
6804 num_rates
+= hweight16(mask
->control
[band
].vht_mcs
[i
]);
6806 return num_rates
== 1;
6810 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k
*ar
,
6811 enum nl80211_band band
,
6812 const struct cfg80211_bitrate_mask
*mask
,
6815 struct ieee80211_supported_band
*sband
= &ar
->mac
.sbands
[band
];
6816 u16 vht_mcs_map
= le16_to_cpu(sband
->vht_cap
.vht_mcs
.tx_mcs_map
);
6818 u8 vht_nss_mask
= 0;
6821 if (mask
->control
[band
].legacy
)
6824 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].ht_mcs
); i
++) {
6825 if (mask
->control
[band
].ht_mcs
[i
] == 0)
6827 else if (mask
->control
[band
].ht_mcs
[i
] ==
6828 sband
->ht_cap
.mcs
.rx_mask
[i
])
6829 ht_nss_mask
|= BIT(i
);
6834 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].vht_mcs
); i
++) {
6835 if (mask
->control
[band
].vht_mcs
[i
] == 0)
6837 else if (mask
->control
[band
].vht_mcs
[i
] ==
6838 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map
, i
))
6839 vht_nss_mask
|= BIT(i
);
6844 if (ht_nss_mask
!= vht_nss_mask
)
6847 if (ht_nss_mask
== 0)
6850 if (BIT(fls(ht_nss_mask
)) - 1 != ht_nss_mask
)
6853 *nss
= fls(ht_nss_mask
);
6859 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k
*ar
,
6860 enum nl80211_band band
,
6861 const struct cfg80211_bitrate_mask
*mask
,
6864 struct ieee80211_supported_band
*sband
= &ar
->mac
.sbands
[band
];
6871 if (hweight32(mask
->control
[band
].legacy
) == 1) {
6872 rate_idx
= ffs(mask
->control
[band
].legacy
) - 1;
6874 hw_rate
= sband
->bitrates
[rate_idx
].hw_value
;
6875 bitrate
= sband
->bitrates
[rate_idx
].bitrate
;
6877 if (ath10k_mac_bitrate_is_cck(bitrate
))
6878 preamble
= WMI_RATE_PREAMBLE_CCK
;
6880 preamble
= WMI_RATE_PREAMBLE_OFDM
;
6883 *rate
= preamble
<< 6 |
6890 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].ht_mcs
); i
++) {
6891 if (hweight8(mask
->control
[band
].ht_mcs
[i
]) == 1) {
6893 *rate
= WMI_RATE_PREAMBLE_HT
<< 6 |
6895 (ffs(mask
->control
[band
].ht_mcs
[i
]) - 1);
6901 for (i
= 0; i
< ARRAY_SIZE(mask
->control
[band
].vht_mcs
); i
++) {
6902 if (hweight16(mask
->control
[band
].vht_mcs
[i
]) == 1) {
6904 *rate
= WMI_RATE_PREAMBLE_VHT
<< 6 |
6906 (ffs(mask
->control
[band
].vht_mcs
[i
]) - 1);
6915 static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif
*arvif
,
6916 u8 rate
, u8 nss
, u8 sgi
, u8 ldpc
)
6918 struct ath10k
*ar
= arvif
->ar
;
6922 lockdep_assert_held(&ar
->conf_mutex
);
6924 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac set fixed rate params vdev %i rate 0x%02hhx nss %hhu sgi %hhu\n",
6925 arvif
->vdev_id
, rate
, nss
, sgi
);
6927 vdev_param
= ar
->wmi
.vdev_param
->fixed_rate
;
6928 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, rate
);
6930 ath10k_warn(ar
, "failed to set fixed rate param 0x%02x: %d\n",
6935 vdev_param
= ar
->wmi
.vdev_param
->nss
;
6936 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, nss
);
6938 ath10k_warn(ar
, "failed to set nss param %d: %d\n", nss
, ret
);
6942 vdev_param
= ar
->wmi
.vdev_param
->sgi
;
6943 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, sgi
);
6945 ath10k_warn(ar
, "failed to set sgi param %d: %d\n", sgi
, ret
);
6949 vdev_param
= ar
->wmi
.vdev_param
->ldpc
;
6950 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
, vdev_param
, ldpc
);
6952 ath10k_warn(ar
, "failed to set ldpc param %d: %d\n", ldpc
, ret
);
6960 ath10k_mac_can_set_bitrate_mask(struct ath10k
*ar
,
6961 enum nl80211_band band
,
6962 const struct cfg80211_bitrate_mask
*mask
)
6967 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
6968 * to express all VHT MCS rate masks. Effectively only the following
6969 * ranges can be used: none, 0-7, 0-8 and 0-9.
6971 for (i
= 0; i
< NL80211_VHT_NSS_MAX
; i
++) {
6972 vht_mcs
= mask
->control
[band
].vht_mcs
[i
];
6981 ath10k_warn(ar
, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
6989 static void ath10k_mac_set_bitrate_mask_iter(void *data
,
6990 struct ieee80211_sta
*sta
)
6992 struct ath10k_vif
*arvif
= data
;
6993 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
6994 struct ath10k
*ar
= arvif
->ar
;
6996 if (arsta
->arvif
!= arvif
)
6999 spin_lock_bh(&ar
->data_lock
);
7000 arsta
->changed
|= IEEE80211_RC_SUPP_RATES_CHANGED
;
7001 spin_unlock_bh(&ar
->data_lock
);
7003 ieee80211_queue_work(ar
->hw
, &arsta
->update_wk
);
7006 static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw
*hw
,
7007 struct ieee80211_vif
*vif
,
7008 const struct cfg80211_bitrate_mask
*mask
)
7010 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7011 struct cfg80211_chan_def def
;
7012 struct ath10k
*ar
= arvif
->ar
;
7013 enum nl80211_band band
;
7014 const u8
*ht_mcs_mask
;
7015 const u16
*vht_mcs_mask
;
7023 if (ath10k_mac_vif_chan(vif
, &def
))
7026 band
= def
.chan
->band
;
7027 ht_mcs_mask
= mask
->control
[band
].ht_mcs
;
7028 vht_mcs_mask
= mask
->control
[band
].vht_mcs
;
7029 ldpc
= !!(ar
->ht_cap_info
& WMI_HT_CAP_LDPC
);
7031 sgi
= mask
->control
[band
].gi
;
7032 if (sgi
== NL80211_TXRATE_FORCE_LGI
)
7035 if (ath10k_mac_bitrate_mask_has_single_rate(ar
, band
, mask
)) {
7036 ret
= ath10k_mac_bitrate_mask_get_single_rate(ar
, band
, mask
,
7039 ath10k_warn(ar
, "failed to get single rate for vdev %i: %d\n",
7040 arvif
->vdev_id
, ret
);
7043 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar
, band
, mask
,
7045 rate
= WMI_FIXED_RATE_NONE
;
7048 rate
= WMI_FIXED_RATE_NONE
;
7049 nss
= min(ar
->num_rf_chains
,
7050 max(ath10k_mac_max_ht_nss(ht_mcs_mask
),
7051 ath10k_mac_max_vht_nss(vht_mcs_mask
)));
7053 if (!ath10k_mac_can_set_bitrate_mask(ar
, band
, mask
))
7056 mutex_lock(&ar
->conf_mutex
);
7058 arvif
->bitrate_mask
= *mask
;
7059 ieee80211_iterate_stations_atomic(ar
->hw
,
7060 ath10k_mac_set_bitrate_mask_iter
,
7063 mutex_unlock(&ar
->conf_mutex
);
7066 mutex_lock(&ar
->conf_mutex
);
7068 ret
= ath10k_mac_set_fixed_rate_params(arvif
, rate
, nss
, sgi
, ldpc
);
7070 ath10k_warn(ar
, "failed to set fixed rate params on vdev %i: %d\n",
7071 arvif
->vdev_id
, ret
);
7076 mutex_unlock(&ar
->conf_mutex
);
7081 static void ath10k_sta_rc_update(struct ieee80211_hw
*hw
,
7082 struct ieee80211_vif
*vif
,
7083 struct ieee80211_sta
*sta
,
7086 struct ath10k
*ar
= hw
->priv
;
7087 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
7090 spin_lock_bh(&ar
->data_lock
);
7092 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7093 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7094 sta
->addr
, changed
, sta
->bandwidth
, sta
->rx_nss
,
7097 if (changed
& IEEE80211_RC_BW_CHANGED
) {
7098 bw
= WMI_PEER_CHWIDTH_20MHZ
;
7100 switch (sta
->bandwidth
) {
7101 case IEEE80211_STA_RX_BW_20
:
7102 bw
= WMI_PEER_CHWIDTH_20MHZ
;
7104 case IEEE80211_STA_RX_BW_40
:
7105 bw
= WMI_PEER_CHWIDTH_40MHZ
;
7107 case IEEE80211_STA_RX_BW_80
:
7108 bw
= WMI_PEER_CHWIDTH_80MHZ
;
7110 case IEEE80211_STA_RX_BW_160
:
7111 bw
= WMI_PEER_CHWIDTH_160MHZ
;
7114 ath10k_warn(ar
, "Invalid bandwidth %d in rc update for %pM\n",
7115 sta
->bandwidth
, sta
->addr
);
7116 bw
= WMI_PEER_CHWIDTH_20MHZ
;
7123 if (changed
& IEEE80211_RC_NSS_CHANGED
)
7124 arsta
->nss
= sta
->rx_nss
;
7126 if (changed
& IEEE80211_RC_SMPS_CHANGED
) {
7127 smps
= WMI_PEER_SMPS_PS_NONE
;
7129 switch (sta
->smps_mode
) {
7130 case IEEE80211_SMPS_AUTOMATIC
:
7131 case IEEE80211_SMPS_OFF
:
7132 smps
= WMI_PEER_SMPS_PS_NONE
;
7134 case IEEE80211_SMPS_STATIC
:
7135 smps
= WMI_PEER_SMPS_STATIC
;
7137 case IEEE80211_SMPS_DYNAMIC
:
7138 smps
= WMI_PEER_SMPS_DYNAMIC
;
7140 case IEEE80211_SMPS_NUM_MODES
:
7141 ath10k_warn(ar
, "Invalid smps %d in sta rc update for %pM\n",
7142 sta
->smps_mode
, sta
->addr
);
7143 smps
= WMI_PEER_SMPS_PS_NONE
;
7150 arsta
->changed
|= changed
;
7152 spin_unlock_bh(&ar
->data_lock
);
7154 ieee80211_queue_work(hw
, &arsta
->update_wk
);
7157 static void ath10k_offset_tsf(struct ieee80211_hw
*hw
,
7158 struct ieee80211_vif
*vif
, s64 tsf_offset
)
7160 struct ath10k
*ar
= hw
->priv
;
7161 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7162 u32 offset
, vdev_param
;
7165 if (tsf_offset
< 0) {
7166 vdev_param
= ar
->wmi
.vdev_param
->dec_tsf
;
7167 offset
= -tsf_offset
;
7169 vdev_param
= ar
->wmi
.vdev_param
->inc_tsf
;
7170 offset
= tsf_offset
;
7173 ret
= ath10k_wmi_vdev_set_param(ar
, arvif
->vdev_id
,
7174 vdev_param
, offset
);
7176 if (ret
&& ret
!= -EOPNOTSUPP
)
7177 ath10k_warn(ar
, "failed to set tsf offset %d cmd %d: %d\n",
7178 offset
, vdev_param
, ret
);
7181 static int ath10k_ampdu_action(struct ieee80211_hw
*hw
,
7182 struct ieee80211_vif
*vif
,
7183 struct ieee80211_ampdu_params
*params
)
7185 struct ath10k
*ar
= hw
->priv
;
7186 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7187 struct ieee80211_sta
*sta
= params
->sta
;
7188 enum ieee80211_ampdu_mlme_action action
= params
->action
;
7189 u16 tid
= params
->tid
;
7191 ath10k_dbg(ar
, ATH10K_DBG_MAC
, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
7192 arvif
->vdev_id
, sta
->addr
, tid
, action
);
7195 case IEEE80211_AMPDU_RX_START
:
7196 case IEEE80211_AMPDU_RX_STOP
:
7197 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
7198 * creation/removal. Do we need to verify this?
7201 case IEEE80211_AMPDU_TX_START
:
7202 case IEEE80211_AMPDU_TX_STOP_CONT
:
7203 case IEEE80211_AMPDU_TX_STOP_FLUSH
:
7204 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT
:
7205 case IEEE80211_AMPDU_TX_OPERATIONAL
:
7206 /* Firmware offloads Tx aggregation entirely so deny mac80211
7207 * Tx aggregation requests.
7216 ath10k_mac_update_rx_channel(struct ath10k
*ar
,
7217 struct ieee80211_chanctx_conf
*ctx
,
7218 struct ieee80211_vif_chanctx_switch
*vifs
,
7221 struct cfg80211_chan_def
*def
= NULL
;
7223 /* Both locks are required because ar->rx_channel is modified. This
7224 * allows readers to hold either lock.
7226 lockdep_assert_held(&ar
->conf_mutex
);
7227 lockdep_assert_held(&ar
->data_lock
);
7229 WARN_ON(ctx
&& vifs
);
7230 WARN_ON(vifs
&& !n_vifs
);
7232 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
7233 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
7234 * ppdu on Rx may reduce performance on low-end systems. It should be
7235 * possible to make tables/hashmaps to speed the lookup up (be vary of
7236 * cpu data cache lines though regarding sizes) but to keep the initial
7237 * implementation simple and less intrusive fallback to the slow lookup
7238 * only for multi-channel cases. Single-channel cases will remain to
7239 * use the old channel derival and thus performance should not be
7243 if (!ctx
&& ath10k_mac_num_chanctxs(ar
) == 1) {
7244 ieee80211_iter_chan_contexts_atomic(ar
->hw
,
7245 ath10k_mac_get_any_chandef_iter
,
7249 def
= &vifs
[0].new_ctx
->def
;
7251 ar
->rx_channel
= def
->chan
;
7252 } else if ((ctx
&& ath10k_mac_num_chanctxs(ar
) == 0) ||
7253 (ctx
&& (ar
->state
== ATH10K_STATE_RESTARTED
))) {
7254 /* During driver restart due to firmware assert, since mac80211
7255 * already has valid channel context for given radio, channel
7256 * context iteration return num_chanctx > 0. So fix rx_channel
7257 * when restart is in progress.
7259 ar
->rx_channel
= ctx
->def
.chan
;
7261 ar
->rx_channel
= NULL
;
7267 ath10k_mac_update_vif_chan(struct ath10k
*ar
,
7268 struct ieee80211_vif_chanctx_switch
*vifs
,
7271 struct ath10k_vif
*arvif
;
7275 lockdep_assert_held(&ar
->conf_mutex
);
7277 /* First stop monitor interface. Some FW versions crash if there's a
7278 * lone monitor interface.
7280 if (ar
->monitor_started
)
7281 ath10k_monitor_stop(ar
);
7283 for (i
= 0; i
< n_vifs
; i
++) {
7284 arvif
= (void *)vifs
[i
].vif
->drv_priv
;
7286 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7287 "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
7289 vifs
[i
].old_ctx
->def
.chan
->center_freq
,
7290 vifs
[i
].new_ctx
->def
.chan
->center_freq
,
7291 vifs
[i
].old_ctx
->def
.width
,
7292 vifs
[i
].new_ctx
->def
.width
);
7294 if (WARN_ON(!arvif
->is_started
))
7297 if (WARN_ON(!arvif
->is_up
))
7300 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
7302 ath10k_warn(ar
, "failed to down vdev %d: %d\n",
7303 arvif
->vdev_id
, ret
);
7308 /* All relevant vdevs are downed and associated channel resources
7309 * should be available for the channel switch now.
7312 spin_lock_bh(&ar
->data_lock
);
7313 ath10k_mac_update_rx_channel(ar
, NULL
, vifs
, n_vifs
);
7314 spin_unlock_bh(&ar
->data_lock
);
7316 for (i
= 0; i
< n_vifs
; i
++) {
7317 arvif
= (void *)vifs
[i
].vif
->drv_priv
;
7319 if (WARN_ON(!arvif
->is_started
))
7322 if (WARN_ON(!arvif
->is_up
))
7325 ret
= ath10k_mac_setup_bcn_tmpl(arvif
);
7327 ath10k_warn(ar
, "failed to update bcn tmpl during csa: %d\n",
7330 ret
= ath10k_mac_setup_prb_tmpl(arvif
);
7332 ath10k_warn(ar
, "failed to update prb tmpl during csa: %d\n",
7335 ret
= ath10k_vdev_restart(arvif
, &vifs
[i
].new_ctx
->def
);
7337 ath10k_warn(ar
, "failed to restart vdev %d: %d\n",
7338 arvif
->vdev_id
, ret
);
7342 ret
= ath10k_wmi_vdev_up(arvif
->ar
, arvif
->vdev_id
, arvif
->aid
,
7345 ath10k_warn(ar
, "failed to bring vdev up %d: %d\n",
7346 arvif
->vdev_id
, ret
);
7351 ath10k_monitor_recalc(ar
);
7355 ath10k_mac_op_add_chanctx(struct ieee80211_hw
*hw
,
7356 struct ieee80211_chanctx_conf
*ctx
)
7358 struct ath10k
*ar
= hw
->priv
;
7360 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7361 "mac chanctx add freq %hu width %d ptr %pK\n",
7362 ctx
->def
.chan
->center_freq
, ctx
->def
.width
, ctx
);
7364 mutex_lock(&ar
->conf_mutex
);
7366 spin_lock_bh(&ar
->data_lock
);
7367 ath10k_mac_update_rx_channel(ar
, ctx
, NULL
, 0);
7368 spin_unlock_bh(&ar
->data_lock
);
7370 ath10k_recalc_radar_detection(ar
);
7371 ath10k_monitor_recalc(ar
);
7373 mutex_unlock(&ar
->conf_mutex
);
7379 ath10k_mac_op_remove_chanctx(struct ieee80211_hw
*hw
,
7380 struct ieee80211_chanctx_conf
*ctx
)
7382 struct ath10k
*ar
= hw
->priv
;
7384 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7385 "mac chanctx remove freq %hu width %d ptr %pK\n",
7386 ctx
->def
.chan
->center_freq
, ctx
->def
.width
, ctx
);
7388 mutex_lock(&ar
->conf_mutex
);
7390 spin_lock_bh(&ar
->data_lock
);
7391 ath10k_mac_update_rx_channel(ar
, NULL
, NULL
, 0);
7392 spin_unlock_bh(&ar
->data_lock
);
7394 ath10k_recalc_radar_detection(ar
);
7395 ath10k_monitor_recalc(ar
);
7397 mutex_unlock(&ar
->conf_mutex
);
7400 struct ath10k_mac_change_chanctx_arg
{
7401 struct ieee80211_chanctx_conf
*ctx
;
7402 struct ieee80211_vif_chanctx_switch
*vifs
;
7408 ath10k_mac_change_chanctx_cnt_iter(void *data
, u8
*mac
,
7409 struct ieee80211_vif
*vif
)
7411 struct ath10k_mac_change_chanctx_arg
*arg
= data
;
7413 if (rcu_access_pointer(vif
->chanctx_conf
) != arg
->ctx
)
7420 ath10k_mac_change_chanctx_fill_iter(void *data
, u8
*mac
,
7421 struct ieee80211_vif
*vif
)
7423 struct ath10k_mac_change_chanctx_arg
*arg
= data
;
7424 struct ieee80211_chanctx_conf
*ctx
;
7426 ctx
= rcu_access_pointer(vif
->chanctx_conf
);
7427 if (ctx
!= arg
->ctx
)
7430 if (WARN_ON(arg
->next_vif
== arg
->n_vifs
))
7433 arg
->vifs
[arg
->next_vif
].vif
= vif
;
7434 arg
->vifs
[arg
->next_vif
].old_ctx
= ctx
;
7435 arg
->vifs
[arg
->next_vif
].new_ctx
= ctx
;
7440 ath10k_mac_op_change_chanctx(struct ieee80211_hw
*hw
,
7441 struct ieee80211_chanctx_conf
*ctx
,
7444 struct ath10k
*ar
= hw
->priv
;
7445 struct ath10k_mac_change_chanctx_arg arg
= { .ctx
= ctx
};
7447 mutex_lock(&ar
->conf_mutex
);
7449 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7450 "mac chanctx change freq %hu width %d ptr %pK changed %x\n",
7451 ctx
->def
.chan
->center_freq
, ctx
->def
.width
, ctx
, changed
);
7453 /* This shouldn't really happen because channel switching should use
7454 * switch_vif_chanctx().
7456 if (WARN_ON(changed
& IEEE80211_CHANCTX_CHANGE_CHANNEL
))
7459 if (changed
& IEEE80211_CHANCTX_CHANGE_WIDTH
) {
7460 ieee80211_iterate_active_interfaces_atomic(
7462 IEEE80211_IFACE_ITER_NORMAL
,
7463 ath10k_mac_change_chanctx_cnt_iter
,
7465 if (arg
.n_vifs
== 0)
7468 arg
.vifs
= kcalloc(arg
.n_vifs
, sizeof(arg
.vifs
[0]),
7473 ieee80211_iterate_active_interfaces_atomic(
7475 IEEE80211_IFACE_ITER_NORMAL
,
7476 ath10k_mac_change_chanctx_fill_iter
,
7478 ath10k_mac_update_vif_chan(ar
, arg
.vifs
, arg
.n_vifs
);
7483 ath10k_recalc_radar_detection(ar
);
7485 /* FIXME: How to configure Rx chains properly? */
7487 /* No other actions are actually necessary. Firmware maintains channel
7488 * definitions per vdev internally and there's no host-side channel
7489 * context abstraction to configure, e.g. channel width.
7493 mutex_unlock(&ar
->conf_mutex
);
7497 ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw
*hw
,
7498 struct ieee80211_vif
*vif
,
7499 struct ieee80211_chanctx_conf
*ctx
)
7501 struct ath10k
*ar
= hw
->priv
;
7502 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7505 mutex_lock(&ar
->conf_mutex
);
7507 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7508 "mac chanctx assign ptr %pK vdev_id %i\n",
7509 ctx
, arvif
->vdev_id
);
7511 if (WARN_ON(arvif
->is_started
)) {
7512 mutex_unlock(&ar
->conf_mutex
);
7516 ret
= ath10k_vdev_start(arvif
, &ctx
->def
);
7518 ath10k_warn(ar
, "failed to start vdev %i addr %pM on freq %d: %d\n",
7519 arvif
->vdev_id
, vif
->addr
,
7520 ctx
->def
.chan
->center_freq
, ret
);
7524 arvif
->is_started
= true;
7526 ret
= ath10k_mac_vif_setup_ps(arvif
);
7528 ath10k_warn(ar
, "failed to update vdev %i ps: %d\n",
7529 arvif
->vdev_id
, ret
);
7533 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
7534 ret
= ath10k_wmi_vdev_up(ar
, arvif
->vdev_id
, 0, vif
->addr
);
7536 ath10k_warn(ar
, "failed to up monitor vdev %i: %d\n",
7537 arvif
->vdev_id
, ret
);
7541 arvif
->is_up
= true;
7544 if (ath10k_mac_can_set_cts_prot(arvif
)) {
7545 ret
= ath10k_mac_set_cts_prot(arvif
);
7547 ath10k_warn(ar
, "failed to set cts protection for vdev %d: %d\n",
7548 arvif
->vdev_id
, ret
);
7551 if (ath10k_peer_stats_enabled(ar
)) {
7552 ar
->pktlog_filter
|= ATH10K_PKTLOG_PEER_STATS
;
7553 ret
= ath10k_wmi_pdev_pktlog_enable(ar
,
7556 ath10k_warn(ar
, "failed to enable pktlog %d\n", ret
);
7561 mutex_unlock(&ar
->conf_mutex
);
7565 ath10k_vdev_stop(arvif
);
7566 arvif
->is_started
= false;
7567 ath10k_mac_vif_setup_ps(arvif
);
7570 mutex_unlock(&ar
->conf_mutex
);
7575 ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw
*hw
,
7576 struct ieee80211_vif
*vif
,
7577 struct ieee80211_chanctx_conf
*ctx
)
7579 struct ath10k
*ar
= hw
->priv
;
7580 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
7583 mutex_lock(&ar
->conf_mutex
);
7585 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7586 "mac chanctx unassign ptr %pK vdev_id %i\n",
7587 ctx
, arvif
->vdev_id
);
7589 WARN_ON(!arvif
->is_started
);
7591 if (vif
->type
== NL80211_IFTYPE_MONITOR
) {
7592 WARN_ON(!arvif
->is_up
);
7594 ret
= ath10k_wmi_vdev_down(ar
, arvif
->vdev_id
);
7596 ath10k_warn(ar
, "failed to down monitor vdev %i: %d\n",
7597 arvif
->vdev_id
, ret
);
7599 arvif
->is_up
= false;
7602 ret
= ath10k_vdev_stop(arvif
);
7604 ath10k_warn(ar
, "failed to stop vdev %i: %d\n",
7605 arvif
->vdev_id
, ret
);
7607 arvif
->is_started
= false;
7609 mutex_unlock(&ar
->conf_mutex
);
7613 ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw
*hw
,
7614 struct ieee80211_vif_chanctx_switch
*vifs
,
7616 enum ieee80211_chanctx_switch_mode mode
)
7618 struct ath10k
*ar
= hw
->priv
;
7620 mutex_lock(&ar
->conf_mutex
);
7622 ath10k_dbg(ar
, ATH10K_DBG_MAC
,
7623 "mac chanctx switch n_vifs %d mode %d\n",
7625 ath10k_mac_update_vif_chan(ar
, vifs
, n_vifs
);
7627 mutex_unlock(&ar
->conf_mutex
);
7631 static void ath10k_mac_op_sta_pre_rcu_remove(struct ieee80211_hw
*hw
,
7632 struct ieee80211_vif
*vif
,
7633 struct ieee80211_sta
*sta
)
7636 struct ath10k_peer
*peer
;
7640 list_for_each_entry(peer
, &ar
->peers
, list
)
7641 if (peer
->sta
== sta
)
7642 peer
->removed
= true;
7645 static void ath10k_sta_statistics(struct ieee80211_hw
*hw
,
7646 struct ieee80211_vif
*vif
,
7647 struct ieee80211_sta
*sta
,
7648 struct station_info
*sinfo
)
7650 struct ath10k_sta
*arsta
= (struct ath10k_sta
*)sta
->drv_priv
;
7651 struct ath10k
*ar
= arsta
->arvif
->ar
;
7653 if (!ath10k_peer_stats_enabled(ar
))
7656 sinfo
->rx_duration
= arsta
->rx_duration
;
7657 sinfo
->filled
|= 1ULL << NL80211_STA_INFO_RX_DURATION
;
7659 if (!arsta
->txrate
.legacy
&& !arsta
->txrate
.nss
)
7662 if (arsta
->txrate
.legacy
) {
7663 sinfo
->txrate
.legacy
= arsta
->txrate
.legacy
;
7665 sinfo
->txrate
.mcs
= arsta
->txrate
.mcs
;
7666 sinfo
->txrate
.nss
= arsta
->txrate
.nss
;
7667 sinfo
->txrate
.bw
= arsta
->txrate
.bw
;
7669 sinfo
->txrate
.flags
= arsta
->txrate
.flags
;
7670 sinfo
->filled
|= 1ULL << NL80211_STA_INFO_TX_BITRATE
;
7673 static const struct ieee80211_ops ath10k_ops
= {
7674 .tx
= ath10k_mac_op_tx
,
7675 .wake_tx_queue
= ath10k_mac_op_wake_tx_queue
,
7676 .start
= ath10k_start
,
7677 .stop
= ath10k_stop
,
7678 .config
= ath10k_config
,
7679 .add_interface
= ath10k_add_interface
,
7680 .remove_interface
= ath10k_remove_interface
,
7681 .configure_filter
= ath10k_configure_filter
,
7682 .bss_info_changed
= ath10k_bss_info_changed
,
7683 .set_coverage_class
= ath10k_mac_op_set_coverage_class
,
7684 .hw_scan
= ath10k_hw_scan
,
7685 .cancel_hw_scan
= ath10k_cancel_hw_scan
,
7686 .set_key
= ath10k_set_key
,
7687 .set_default_unicast_key
= ath10k_set_default_unicast_key
,
7688 .sta_state
= ath10k_sta_state
,
7689 .conf_tx
= ath10k_conf_tx
,
7690 .remain_on_channel
= ath10k_remain_on_channel
,
7691 .cancel_remain_on_channel
= ath10k_cancel_remain_on_channel
,
7692 .set_rts_threshold
= ath10k_set_rts_threshold
,
7693 .set_frag_threshold
= ath10k_mac_op_set_frag_threshold
,
7694 .flush
= ath10k_flush
,
7695 .tx_last_beacon
= ath10k_tx_last_beacon
,
7696 .set_antenna
= ath10k_set_antenna
,
7697 .get_antenna
= ath10k_get_antenna
,
7698 .reconfig_complete
= ath10k_reconfig_complete
,
7699 .get_survey
= ath10k_get_survey
,
7700 .set_bitrate_mask
= ath10k_mac_op_set_bitrate_mask
,
7701 .sta_rc_update
= ath10k_sta_rc_update
,
7702 .offset_tsf
= ath10k_offset_tsf
,
7703 .ampdu_action
= ath10k_ampdu_action
,
7704 .get_et_sset_count
= ath10k_debug_get_et_sset_count
,
7705 .get_et_stats
= ath10k_debug_get_et_stats
,
7706 .get_et_strings
= ath10k_debug_get_et_strings
,
7707 .add_chanctx
= ath10k_mac_op_add_chanctx
,
7708 .remove_chanctx
= ath10k_mac_op_remove_chanctx
,
7709 .change_chanctx
= ath10k_mac_op_change_chanctx
,
7710 .assign_vif_chanctx
= ath10k_mac_op_assign_vif_chanctx
,
7711 .unassign_vif_chanctx
= ath10k_mac_op_unassign_vif_chanctx
,
7712 .switch_vif_chanctx
= ath10k_mac_op_switch_vif_chanctx
,
7713 .sta_pre_rcu_remove
= ath10k_mac_op_sta_pre_rcu_remove
,
7714 .sta_statistics
= ath10k_sta_statistics
,
7716 CFG80211_TESTMODE_CMD(ath10k_tm_cmd
)
7719 .suspend
= ath10k_wow_op_suspend
,
7720 .resume
= ath10k_wow_op_resume
,
7721 .set_wakeup
= ath10k_wow_op_set_wakeup
,
7723 #ifdef CONFIG_MAC80211_DEBUGFS
7724 .sta_add_debugfs
= ath10k_sta_add_debugfs
,
7728 #define CHAN2G(_channel, _freq, _flags) { \
7729 .band = NL80211_BAND_2GHZ, \
7730 .hw_value = (_channel), \
7731 .center_freq = (_freq), \
7732 .flags = (_flags), \
7733 .max_antenna_gain = 0, \
7737 #define CHAN5G(_channel, _freq, _flags) { \
7738 .band = NL80211_BAND_5GHZ, \
7739 .hw_value = (_channel), \
7740 .center_freq = (_freq), \
7741 .flags = (_flags), \
7742 .max_antenna_gain = 0, \
7746 static const struct ieee80211_channel ath10k_2ghz_channels
[] = {
7756 CHAN2G(10, 2457, 0),
7757 CHAN2G(11, 2462, 0),
7758 CHAN2G(12, 2467, 0),
7759 CHAN2G(13, 2472, 0),
7760 CHAN2G(14, 2484, 0),
7763 static const struct ieee80211_channel ath10k_5ghz_channels
[] = {
7764 CHAN5G(36, 5180, 0),
7765 CHAN5G(40, 5200, 0),
7766 CHAN5G(44, 5220, 0),
7767 CHAN5G(48, 5240, 0),
7768 CHAN5G(52, 5260, 0),
7769 CHAN5G(56, 5280, 0),
7770 CHAN5G(60, 5300, 0),
7771 CHAN5G(64, 5320, 0),
7772 CHAN5G(100, 5500, 0),
7773 CHAN5G(104, 5520, 0),
7774 CHAN5G(108, 5540, 0),
7775 CHAN5G(112, 5560, 0),
7776 CHAN5G(116, 5580, 0),
7777 CHAN5G(120, 5600, 0),
7778 CHAN5G(124, 5620, 0),
7779 CHAN5G(128, 5640, 0),
7780 CHAN5G(132, 5660, 0),
7781 CHAN5G(136, 5680, 0),
7782 CHAN5G(140, 5700, 0),
7783 CHAN5G(144, 5720, 0),
7784 CHAN5G(149, 5745, 0),
7785 CHAN5G(153, 5765, 0),
7786 CHAN5G(157, 5785, 0),
7787 CHAN5G(161, 5805, 0),
7788 CHAN5G(165, 5825, 0),
7789 CHAN5G(169, 5845, 0),
7792 struct ath10k
*ath10k_mac_create(size_t priv_size
)
7794 struct ieee80211_hw
*hw
;
7795 struct ieee80211_ops
*ops
;
7798 ops
= kmemdup(&ath10k_ops
, sizeof(ath10k_ops
), GFP_KERNEL
);
7802 hw
= ieee80211_alloc_hw(sizeof(struct ath10k
) + priv_size
, ops
);
7815 void ath10k_mac_destroy(struct ath10k
*ar
)
7817 struct ieee80211_ops
*ops
= ar
->ops
;
7819 ieee80211_free_hw(ar
->hw
);
7823 static const struct ieee80211_iface_limit ath10k_if_limits
[] = {
7826 .types
= BIT(NL80211_IFTYPE_STATION
)
7827 | BIT(NL80211_IFTYPE_P2P_CLIENT
)
7831 .types
= BIT(NL80211_IFTYPE_P2P_GO
)
7835 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
)
7839 .types
= BIT(NL80211_IFTYPE_AP
)
7840 #ifdef CONFIG_MAC80211_MESH
7841 | BIT(NL80211_IFTYPE_MESH_POINT
)
7846 static const struct ieee80211_iface_limit ath10k_10x_if_limits
[] = {
7849 .types
= BIT(NL80211_IFTYPE_AP
)
7850 #ifdef CONFIG_MAC80211_MESH
7851 | BIT(NL80211_IFTYPE_MESH_POINT
)
7856 .types
= BIT(NL80211_IFTYPE_STATION
)
7860 static const struct ieee80211_iface_combination ath10k_if_comb
[] = {
7862 .limits
= ath10k_if_limits
,
7863 .n_limits
= ARRAY_SIZE(ath10k_if_limits
),
7864 .max_interfaces
= 8,
7865 .num_different_channels
= 1,
7866 .beacon_int_infra_match
= true,
7870 static const struct ieee80211_iface_combination ath10k_10x_if_comb
[] = {
7872 .limits
= ath10k_10x_if_limits
,
7873 .n_limits
= ARRAY_SIZE(ath10k_10x_if_limits
),
7874 .max_interfaces
= 8,
7875 .num_different_channels
= 1,
7876 .beacon_int_infra_match
= true,
7877 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
7878 .radar_detect_widths
= BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
7879 BIT(NL80211_CHAN_WIDTH_20
) |
7880 BIT(NL80211_CHAN_WIDTH_40
) |
7881 BIT(NL80211_CHAN_WIDTH_80
),
7886 static const struct ieee80211_iface_limit ath10k_tlv_if_limit
[] = {
7889 .types
= BIT(NL80211_IFTYPE_STATION
),
7893 .types
= BIT(NL80211_IFTYPE_AP
) |
7894 #ifdef CONFIG_MAC80211_MESH
7895 BIT(NL80211_IFTYPE_MESH_POINT
) |
7897 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
7898 BIT(NL80211_IFTYPE_P2P_GO
),
7902 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
),
7906 static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit
[] = {
7909 .types
= BIT(NL80211_IFTYPE_STATION
),
7913 .types
= BIT(NL80211_IFTYPE_P2P_CLIENT
),
7917 .types
= BIT(NL80211_IFTYPE_AP
) |
7918 #ifdef CONFIG_MAC80211_MESH
7919 BIT(NL80211_IFTYPE_MESH_POINT
) |
7921 BIT(NL80211_IFTYPE_P2P_GO
),
7925 .types
= BIT(NL80211_IFTYPE_P2P_DEVICE
),
7929 static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss
[] = {
7932 .types
= BIT(NL80211_IFTYPE_STATION
),
7936 .types
= BIT(NL80211_IFTYPE_ADHOC
),
7940 /* FIXME: This is not thouroughly tested. These combinations may over- or
7941 * underestimate hw/fw capabilities.
7943 static struct ieee80211_iface_combination ath10k_tlv_if_comb
[] = {
7945 .limits
= ath10k_tlv_if_limit
,
7946 .num_different_channels
= 1,
7947 .max_interfaces
= 4,
7948 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit
),
7951 .limits
= ath10k_tlv_if_limit_ibss
,
7952 .num_different_channels
= 1,
7953 .max_interfaces
= 2,
7954 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit_ibss
),
7958 static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb
[] = {
7960 .limits
= ath10k_tlv_if_limit
,
7961 .num_different_channels
= 1,
7962 .max_interfaces
= 4,
7963 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit
),
7966 .limits
= ath10k_tlv_qcs_if_limit
,
7967 .num_different_channels
= 2,
7968 .max_interfaces
= 4,
7969 .n_limits
= ARRAY_SIZE(ath10k_tlv_qcs_if_limit
),
7972 .limits
= ath10k_tlv_if_limit_ibss
,
7973 .num_different_channels
= 1,
7974 .max_interfaces
= 2,
7975 .n_limits
= ARRAY_SIZE(ath10k_tlv_if_limit_ibss
),
7979 static const struct ieee80211_iface_limit ath10k_10_4_if_limits
[] = {
7982 .types
= BIT(NL80211_IFTYPE_STATION
),
7986 .types
= BIT(NL80211_IFTYPE_AP
)
7987 #ifdef CONFIG_MAC80211_MESH
7988 | BIT(NL80211_IFTYPE_MESH_POINT
)
7993 static const struct ieee80211_iface_combination ath10k_10_4_if_comb
[] = {
7995 .limits
= ath10k_10_4_if_limits
,
7996 .n_limits
= ARRAY_SIZE(ath10k_10_4_if_limits
),
7997 .max_interfaces
= 16,
7998 .num_different_channels
= 1,
7999 .beacon_int_infra_match
= true,
8000 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
8001 .radar_detect_widths
= BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
8002 BIT(NL80211_CHAN_WIDTH_20
) |
8003 BIT(NL80211_CHAN_WIDTH_40
) |
8004 BIT(NL80211_CHAN_WIDTH_80
),
8009 static void ath10k_get_arvif_iter(void *data
, u8
*mac
,
8010 struct ieee80211_vif
*vif
)
8012 struct ath10k_vif_iter
*arvif_iter
= data
;
8013 struct ath10k_vif
*arvif
= (void *)vif
->drv_priv
;
8015 if (arvif
->vdev_id
== arvif_iter
->vdev_id
)
8016 arvif_iter
->arvif
= arvif
;
8019 struct ath10k_vif
*ath10k_get_arvif(struct ath10k
*ar
, u32 vdev_id
)
8021 struct ath10k_vif_iter arvif_iter
;
8024 memset(&arvif_iter
, 0, sizeof(struct ath10k_vif_iter
));
8025 arvif_iter
.vdev_id
= vdev_id
;
8027 flags
= IEEE80211_IFACE_ITER_RESUME_ALL
;
8028 ieee80211_iterate_active_interfaces_atomic(ar
->hw
,
8030 ath10k_get_arvif_iter
,
8032 if (!arvif_iter
.arvif
) {
8033 ath10k_warn(ar
, "No VIF found for vdev %d\n", vdev_id
);
8037 return arvif_iter
.arvif
;
8040 #define WRD_METHOD "WRDD"
8041 #define WRDD_WIFI (0x07)
8043 static u32
ath10k_mac_wrdd_get_mcc(struct ath10k
*ar
, union acpi_object
*wrdd
)
8045 union acpi_object
*mcc_pkg
;
8046 union acpi_object
*domain_type
;
8047 union acpi_object
*mcc_value
;
8050 if (wrdd
->type
!= ACPI_TYPE_PACKAGE
||
8051 wrdd
->package
.count
< 2 ||
8052 wrdd
->package
.elements
[0].type
!= ACPI_TYPE_INTEGER
||
8053 wrdd
->package
.elements
[0].integer
.value
!= 0) {
8054 ath10k_warn(ar
, "ignoring malformed/unsupported wrdd structure\n");
8058 for (i
= 1; i
< wrdd
->package
.count
; ++i
) {
8059 mcc_pkg
= &wrdd
->package
.elements
[i
];
8061 if (mcc_pkg
->type
!= ACPI_TYPE_PACKAGE
)
8063 if (mcc_pkg
->package
.count
< 2)
8065 if (mcc_pkg
->package
.elements
[0].type
!= ACPI_TYPE_INTEGER
||
8066 mcc_pkg
->package
.elements
[1].type
!= ACPI_TYPE_INTEGER
)
8069 domain_type
= &mcc_pkg
->package
.elements
[0];
8070 if (domain_type
->integer
.value
!= WRDD_WIFI
)
8073 mcc_value
= &mcc_pkg
->package
.elements
[1];
8074 return mcc_value
->integer
.value
;
8079 static int ath10k_mac_get_wrdd_regulatory(struct ath10k
*ar
, u16
*rd
)
8081 struct pci_dev __maybe_unused
*pdev
= to_pci_dev(ar
->dev
);
8082 acpi_handle root_handle
;
8084 struct acpi_buffer wrdd
= {ACPI_ALLOCATE_BUFFER
, NULL
};
8089 root_handle
= ACPI_HANDLE(&pdev
->dev
);
8093 status
= acpi_get_handle(root_handle
, (acpi_string
)WRD_METHOD
, &handle
);
8094 if (ACPI_FAILURE(status
)) {
8095 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
8096 "failed to get wrd method %d\n", status
);
8100 status
= acpi_evaluate_object(handle
, NULL
, NULL
, &wrdd
);
8101 if (ACPI_FAILURE(status
)) {
8102 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
8103 "failed to call wrdc %d\n", status
);
8107 alpha2_code
= ath10k_mac_wrdd_get_mcc(ar
, wrdd
.pointer
);
8108 kfree(wrdd
.pointer
);
8112 alpha2
[0] = (alpha2_code
>> 8) & 0xff;
8113 alpha2
[1] = (alpha2_code
>> 0) & 0xff;
8116 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
8117 "regulatory hint from WRDD (alpha2-code): %s\n", alpha2
);
8119 *rd
= ath_regd_find_country_by_name(alpha2
);
8123 *rd
|= COUNTRY_ERD_FLAG
;
8127 static int ath10k_mac_init_rd(struct ath10k
*ar
)
8132 ret
= ath10k_mac_get_wrdd_regulatory(ar
, &rd
);
8134 ath10k_dbg(ar
, ATH10K_DBG_BOOT
,
8135 "fallback to eeprom programmed regulatory settings\n");
8136 rd
= ar
->hw_eeprom_rd
;
8139 ar
->ath_common
.regulatory
.current_rd
= rd
;
8143 int ath10k_mac_register(struct ath10k
*ar
)
8145 static const u32 cipher_suites
[] = {
8146 WLAN_CIPHER_SUITE_WEP40
,
8147 WLAN_CIPHER_SUITE_WEP104
,
8148 WLAN_CIPHER_SUITE_TKIP
,
8149 WLAN_CIPHER_SUITE_CCMP
,
8151 /* Do not add hardware supported ciphers before this line.
8152 * Allow software encryption for all chips. Don't forget to
8153 * update n_cipher_suites below.
8155 WLAN_CIPHER_SUITE_AES_CMAC
,
8156 WLAN_CIPHER_SUITE_BIP_CMAC_256
,
8157 WLAN_CIPHER_SUITE_BIP_GMAC_128
,
8158 WLAN_CIPHER_SUITE_BIP_GMAC_256
,
8160 /* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256
8161 * and CCMP-256 in hardware.
8163 WLAN_CIPHER_SUITE_GCMP
,
8164 WLAN_CIPHER_SUITE_GCMP_256
,
8165 WLAN_CIPHER_SUITE_CCMP_256
,
8167 struct ieee80211_supported_band
*band
;
8171 SET_IEEE80211_PERM_ADDR(ar
->hw
, ar
->mac_addr
);
8173 SET_IEEE80211_DEV(ar
->hw
, ar
->dev
);
8175 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels
) +
8176 ARRAY_SIZE(ath10k_5ghz_channels
)) !=
8179 if (ar
->phy_capability
& WHAL_WLAN_11G_CAPABILITY
) {
8180 channels
= kmemdup(ath10k_2ghz_channels
,
8181 sizeof(ath10k_2ghz_channels
),
8188 band
= &ar
->mac
.sbands
[NL80211_BAND_2GHZ
];
8189 band
->n_channels
= ARRAY_SIZE(ath10k_2ghz_channels
);
8190 band
->channels
= channels
;
8192 if (ar
->hw_params
.cck_rate_map_rev2
) {
8193 band
->n_bitrates
= ath10k_g_rates_rev2_size
;
8194 band
->bitrates
= ath10k_g_rates_rev2
;
8196 band
->n_bitrates
= ath10k_g_rates_size
;
8197 band
->bitrates
= ath10k_g_rates
;
8200 ar
->hw
->wiphy
->bands
[NL80211_BAND_2GHZ
] = band
;
8203 if (ar
->phy_capability
& WHAL_WLAN_11A_CAPABILITY
) {
8204 channels
= kmemdup(ath10k_5ghz_channels
,
8205 sizeof(ath10k_5ghz_channels
),
8212 band
= &ar
->mac
.sbands
[NL80211_BAND_5GHZ
];
8213 band
->n_channels
= ARRAY_SIZE(ath10k_5ghz_channels
);
8214 band
->channels
= channels
;
8215 band
->n_bitrates
= ath10k_a_rates_size
;
8216 band
->bitrates
= ath10k_a_rates
;
8217 ar
->hw
->wiphy
->bands
[NL80211_BAND_5GHZ
] = band
;
8220 ath10k_mac_setup_ht_vht_cap(ar
);
8222 ar
->hw
->wiphy
->interface_modes
=
8223 BIT(NL80211_IFTYPE_STATION
) |
8224 BIT(NL80211_IFTYPE_AP
) |
8225 BIT(NL80211_IFTYPE_MESH_POINT
);
8227 ar
->hw
->wiphy
->available_antennas_rx
= ar
->cfg_rx_chainmask
;
8228 ar
->hw
->wiphy
->available_antennas_tx
= ar
->cfg_tx_chainmask
;
8230 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P
, ar
->normal_mode_fw
.fw_file
.fw_features
))
8231 ar
->hw
->wiphy
->interface_modes
|=
8232 BIT(NL80211_IFTYPE_P2P_DEVICE
) |
8233 BIT(NL80211_IFTYPE_P2P_CLIENT
) |
8234 BIT(NL80211_IFTYPE_P2P_GO
);
8236 ieee80211_hw_set(ar
->hw
, SIGNAL_DBM
);
8238 if (!test_bit(ATH10K_FW_FEATURE_NO_PS
,
8239 ar
->running_fw
->fw_file
.fw_features
)) {
8240 ieee80211_hw_set(ar
->hw
, SUPPORTS_PS
);
8241 ieee80211_hw_set(ar
->hw
, SUPPORTS_DYNAMIC_PS
);
8244 ieee80211_hw_set(ar
->hw
, MFP_CAPABLE
);
8245 ieee80211_hw_set(ar
->hw
, REPORTS_TX_ACK_STATUS
);
8246 ieee80211_hw_set(ar
->hw
, HAS_RATE_CONTROL
);
8247 ieee80211_hw_set(ar
->hw
, AP_LINK_PS
);
8248 ieee80211_hw_set(ar
->hw
, SPECTRUM_MGMT
);
8249 ieee80211_hw_set(ar
->hw
, SUPPORT_FAST_XMIT
);
8250 ieee80211_hw_set(ar
->hw
, CONNECTION_MONITOR
);
8251 ieee80211_hw_set(ar
->hw
, SUPPORTS_PER_STA_GTK
);
8252 ieee80211_hw_set(ar
->hw
, WANT_MONITOR_VIF
);
8253 ieee80211_hw_set(ar
->hw
, CHANCTX_STA_CSA
);
8254 ieee80211_hw_set(ar
->hw
, QUEUE_CONTROL
);
8255 ieee80211_hw_set(ar
->hw
, SUPPORTS_TX_FRAG
);
8256 ieee80211_hw_set(ar
->hw
, REPORTS_LOW_ACK
);
8258 if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
8259 ieee80211_hw_set(ar
->hw
, SW_CRYPTO_CONTROL
);
8261 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_STATIC_SMPS
;
8262 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_IBSS_RSN
;
8264 if (ar
->ht_cap_info
& WMI_HT_CAP_DYNAMIC_SMPS
)
8265 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_DYNAMIC_SMPS
;
8267 if (ar
->ht_cap_info
& WMI_HT_CAP_ENABLED
) {
8268 ieee80211_hw_set(ar
->hw
, AMPDU_AGGREGATION
);
8269 ieee80211_hw_set(ar
->hw
, TX_AMPDU_SETUP_IN_HW
);
8272 ar
->hw
->wiphy
->max_scan_ssids
= WLAN_SCAN_PARAMS_MAX_SSID
;
8273 ar
->hw
->wiphy
->max_scan_ie_len
= WLAN_SCAN_PARAMS_MAX_IE_LEN
;
8275 ar
->hw
->vif_data_size
= sizeof(struct ath10k_vif
);
8276 ar
->hw
->sta_data_size
= sizeof(struct ath10k_sta
);
8277 ar
->hw
->txq_data_size
= sizeof(struct ath10k_txq
);
8279 ar
->hw
->max_listen_interval
= ATH10K_MAX_HW_LISTEN_INTERVAL
;
8281 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD
, ar
->wmi
.svc_map
)) {
8282 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
;
8284 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
8285 * that userspace (e.g. wpa_supplicant/hostapd) can generate
8286 * correct Probe Responses. This is more of a hack advert..
8288 ar
->hw
->wiphy
->probe_resp_offload
|=
8289 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
8290 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
|
8291 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P
;
8294 if (test_bit(WMI_SERVICE_TDLS
, ar
->wmi
.svc_map
) ||
8295 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY
, ar
->wmi
.svc_map
)) {
8296 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_SUPPORTS_TDLS
;
8297 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH
, ar
->wmi
.svc_map
))
8298 ieee80211_hw_set(ar
->hw
, TDLS_WIDER_BW
);
8301 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
;
8302 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_HAS_CHANNEL_SWITCH
;
8303 ar
->hw
->wiphy
->max_remain_on_channel_duration
= 5000;
8305 ar
->hw
->wiphy
->flags
|= WIPHY_FLAG_AP_UAPSD
;
8306 ar
->hw
->wiphy
->features
|= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE
|
8307 NL80211_FEATURE_AP_SCAN
;
8309 ar
->hw
->wiphy
->max_ap_assoc_sta
= ar
->max_num_stations
;
8311 ret
= ath10k_wow_init(ar
);
8313 ath10k_warn(ar
, "failed to init wow: %d\n", ret
);
8317 wiphy_ext_feature_set(ar
->hw
->wiphy
, NL80211_EXT_FEATURE_VHT_IBSS
);
8320 * on LL hardware queues are managed entirely by the FW
8321 * so we only advertise to mac we can do the queues thing
8323 ar
->hw
->queues
= IEEE80211_MAX_QUEUES
;
8325 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
8326 * something that vdev_ids can't reach so that we don't stop the queue
8329 ar
->hw
->offchannel_tx_hw_queue
= IEEE80211_MAX_QUEUES
- 1;
8331 switch (ar
->running_fw
->fw_file
.wmi_op_version
) {
8332 case ATH10K_FW_WMI_OP_VERSION_MAIN
:
8333 ar
->hw
->wiphy
->iface_combinations
= ath10k_if_comb
;
8334 ar
->hw
->wiphy
->n_iface_combinations
=
8335 ARRAY_SIZE(ath10k_if_comb
);
8336 ar
->hw
->wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
8338 case ATH10K_FW_WMI_OP_VERSION_TLV
:
8339 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS
, ar
->wmi
.svc_map
)) {
8340 ar
->hw
->wiphy
->iface_combinations
=
8341 ath10k_tlv_qcs_if_comb
;
8342 ar
->hw
->wiphy
->n_iface_combinations
=
8343 ARRAY_SIZE(ath10k_tlv_qcs_if_comb
);
8345 ar
->hw
->wiphy
->iface_combinations
= ath10k_tlv_if_comb
;
8346 ar
->hw
->wiphy
->n_iface_combinations
=
8347 ARRAY_SIZE(ath10k_tlv_if_comb
);
8349 ar
->hw
->wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_ADHOC
);
8351 case ATH10K_FW_WMI_OP_VERSION_10_1
:
8352 case ATH10K_FW_WMI_OP_VERSION_10_2
:
8353 case ATH10K_FW_WMI_OP_VERSION_10_2_4
:
8354 ar
->hw
->wiphy
->iface_combinations
= ath10k_10x_if_comb
;
8355 ar
->hw
->wiphy
->n_iface_combinations
=
8356 ARRAY_SIZE(ath10k_10x_if_comb
);
8358 case ATH10K_FW_WMI_OP_VERSION_10_4
:
8359 ar
->hw
->wiphy
->iface_combinations
= ath10k_10_4_if_comb
;
8360 ar
->hw
->wiphy
->n_iface_combinations
=
8361 ARRAY_SIZE(ath10k_10_4_if_comb
);
8363 case ATH10K_FW_WMI_OP_VERSION_UNSET
:
8364 case ATH10K_FW_WMI_OP_VERSION_MAX
:
8370 if (!test_bit(ATH10K_FLAG_RAW_MODE
, &ar
->dev_flags
))
8371 ar
->hw
->netdev_features
= NETIF_F_HW_CSUM
;
8373 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
)) {
8374 /* Init ath dfs pattern detector */
8375 ar
->ath_common
.debug_mask
= ATH_DBG_DFS
;
8376 ar
->dfs_detector
= dfs_pattern_detector_init(&ar
->ath_common
,
8379 if (!ar
->dfs_detector
)
8380 ath10k_warn(ar
, "failed to initialise DFS pattern detector\n");
8383 ret
= ath10k_mac_init_rd(ar
);
8385 ath10k_err(ar
, "failed to derive regdom: %d\n", ret
);
8386 goto err_dfs_detector_exit
;
8389 /* Disable set_coverage_class for chipsets that do not support it. */
8390 if (!ar
->hw_params
.hw_ops
->set_coverage_class
)
8391 ar
->ops
->set_coverage_class
= NULL
;
8393 ret
= ath_regd_init(&ar
->ath_common
.regulatory
, ar
->hw
->wiphy
,
8394 ath10k_reg_notifier
);
8396 ath10k_err(ar
, "failed to initialise regulatory: %i\n", ret
);
8397 goto err_dfs_detector_exit
;
8400 ar
->hw
->wiphy
->cipher_suites
= cipher_suites
;
8402 /* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
8403 * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
8404 * from chip specific hw_param table.
8406 if (!ar
->hw_params
.n_cipher_suites
||
8407 ar
->hw_params
.n_cipher_suites
> ARRAY_SIZE(cipher_suites
)) {
8408 ath10k_err(ar
, "invalid hw_params.n_cipher_suites %d\n",
8409 ar
->hw_params
.n_cipher_suites
);
8410 ar
->hw_params
.n_cipher_suites
= 8;
8412 ar
->hw
->wiphy
->n_cipher_suites
= ar
->hw_params
.n_cipher_suites
;
8414 wiphy_ext_feature_set(ar
->hw
->wiphy
, NL80211_EXT_FEATURE_CQM_RSSI_LIST
);
8416 ret
= ieee80211_register_hw(ar
->hw
);
8418 ath10k_err(ar
, "failed to register ieee80211: %d\n", ret
);
8419 goto err_dfs_detector_exit
;
8422 if (!ath_is_world_regd(&ar
->ath_common
.regulatory
)) {
8423 ret
= regulatory_hint(ar
->hw
->wiphy
,
8424 ar
->ath_common
.regulatory
.alpha2
);
8426 goto err_unregister
;
8432 ieee80211_unregister_hw(ar
->hw
);
8434 err_dfs_detector_exit
:
8435 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
)
8436 ar
->dfs_detector
->exit(ar
->dfs_detector
);
8439 kfree(ar
->mac
.sbands
[NL80211_BAND_2GHZ
].channels
);
8440 kfree(ar
->mac
.sbands
[NL80211_BAND_5GHZ
].channels
);
8442 SET_IEEE80211_DEV(ar
->hw
, NULL
);
8446 void ath10k_mac_unregister(struct ath10k
*ar
)
8448 ieee80211_unregister_hw(ar
->hw
);
8450 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED
) && ar
->dfs_detector
)
8451 ar
->dfs_detector
->exit(ar
->dfs_detector
);
8453 kfree(ar
->mac
.sbands
[NL80211_BAND_2GHZ
].channels
);
8454 kfree(ar
->mac
.sbands
[NL80211_BAND_5GHZ
].channels
);
8456 SET_IEEE80211_DEV(ar
->hw
, NULL
);