Another set of updates, all over the map:
* set sk_pacing_shift for 802.3->802.11 encap offload * some monitor support for 802.11->802.3 decap offload * HE (802.11ax) spec updates * userspace API for TDLS HE support * along with various other small features, cleanups and fixups -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAmB+4y8ACgkQB8qZga/f l8SiGw/9Fz3XETnNDYMvyY7ppmWzZ6vofRq307YJiCz1fszEKqwyyzMQOrHA9tg2 Nasl711egWlVyHTBCN+VCSaTQUjkODsK/5t4XWoxdJ0J3lZkgryVGBJljpl+k4A6 11qpvwUnO1WCmt0s49V2yU/jWgZ9itHfu9dosu/YIq+NfXUVA7ylKmP3gqfmcCeV 631z5AnM8/9N8QVMpnk5F2fE57WUXbA+KdVsw0LXMmjXYSsQ9MyTBX/lRDVcaMWV 7cOtHekkzD0MVfsOoBVvsJl+bybBgEPOfZn2Kt22Rh4JzAch/uUhwRQGzsGxcR3p D8W9BABXCU8C5mhP8gcKlOSuH3h7ydKKqrXXNeRO+y5hymOtUSGJxia93m+uQ8qC 97wootP3cb97/dEzv5cWqw5Pa39uEsny6mQqueD5WcMI9imL98HEo3hrZElbctx8 s9ZE37WAlZ0zw+cGIsmElZfE2qMqEhjxF3mGFcpXLkk9/Y/1jmypYopkBLJh6KcS mIfwk9qWgADbPT5df1A/1388lMkjBRcQGc1SriYxy/olvb70mD8IPPiDSD2kULDt Sq2frnOdvjW0Q5DB6jBKzdMudAxY3WP5MlcGDy1iYwEbY6s4lPfQXG48joJpRQFG I3zPM6Z+Pimx7vcTd5a+IUyKvDoF+DtxiOu8DGKYT2M5tv3/tpI= =b0NQ -----END PGP SIGNATURE----- Merge tag 'mac80211-next-for-net-next-2021-04-20' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next Johannes Berg says: ==================== Another set of updates, all over the map: * set sk_pacing_shift for 802.3->802.11 encap offload * some monitor support for 802.11->802.3 decap offload * HE (802.11ax) spec updates * userspace API for TDLS HE support * along with various other small features, cleanups and fixups ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
08322284c1
|
@ -1334,9 +1334,8 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||||
* request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
|
* request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
|
||||||
* length.
|
* length.
|
||||||
*/
|
*/
|
||||||
ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
|
ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT;
|
|
||||||
|
|
||||||
if (ampdu_factor) {
|
if (ampdu_factor) {
|
||||||
if (sta->vht_cap.vht_supported)
|
if (sta->vht_cap.vht_supported)
|
||||||
|
@ -3876,7 +3875,7 @@ ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
|
||||||
IEEE80211_HE_MAC_CAP4_BQR;
|
IEEE80211_HE_MAC_CAP4_BQR;
|
||||||
he_cap_elem->mac_cap_info[4] &= ~m;
|
he_cap_elem->mac_cap_info[4] &= ~m;
|
||||||
|
|
||||||
m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION |
|
m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
|
||||||
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
|
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
|
||||||
IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
|
IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
|
||||||
IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
|
IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
|
||||||
|
@ -3886,7 +3885,7 @@ ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
|
||||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
|
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
|
||||||
he_cap_elem->phy_cap_info[2] &= ~m;
|
he_cap_elem->phy_cap_info[2] &= ~m;
|
||||||
|
|
||||||
m = IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA |
|
m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
|
||||||
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
|
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
|
||||||
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
|
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
|
||||||
he_cap_elem->phy_cap_info[3] &= ~m;
|
he_cap_elem->phy_cap_info[3] &= ~m;
|
||||||
|
@ -3898,13 +3897,13 @@ ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
|
||||||
he_cap_elem->phy_cap_info[5] &= ~m;
|
he_cap_elem->phy_cap_info[5] &= ~m;
|
||||||
|
|
||||||
m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
|
m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
|
||||||
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB |
|
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
|
||||||
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
|
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
|
||||||
IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
|
IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
|
||||||
he_cap_elem->phy_cap_info[6] &= ~m;
|
he_cap_elem->phy_cap_info[6] &= ~m;
|
||||||
|
|
||||||
m = IEEE80211_HE_PHY_CAP7_SRP_BASED_SR |
|
m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
|
||||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
|
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
|
||||||
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
|
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
|
||||||
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
|
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
|
||||||
he_cap_elem->phy_cap_info[7] &= ~m;
|
he_cap_elem->phy_cap_info[7] &= ~m;
|
||||||
|
|
|
@ -4053,7 +4053,7 @@ static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband =
|
struct ieee80211_supported_band *sband =
|
||||||
dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
|
dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
|
||||||
struct ieee80211_rate *rate;
|
const struct ieee80211_rate *rate;
|
||||||
int i;
|
int i;
|
||||||
u16 basic, direct, offset, basic_offset, rateptr;
|
u16 basic, direct, offset, basic_offset, rateptr;
|
||||||
|
|
||||||
|
|
|
@ -2762,7 +2762,7 @@ static void b43legacy_update_basic_rates(struct b43legacy_wldev *dev, u32 brates
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband =
|
struct ieee80211_supported_band *sband =
|
||||||
dev->wl->hw->wiphy->bands[NL80211_BAND_2GHZ];
|
dev->wl->hw->wiphy->bands[NL80211_BAND_2GHZ];
|
||||||
struct ieee80211_rate *rate;
|
const struct ieee80211_rate *rate;
|
||||||
int i;
|
int i;
|
||||||
u16 basic, direct, offset, basic_offset, rateptr;
|
u16 basic, direct, offset, basic_offset, rateptr;
|
||||||
|
|
||||||
|
|
|
@ -550,9 +550,9 @@ static const struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
||||||
IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP,
|
IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP,
|
||||||
.mac_cap_info[3] =
|
.mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2,
|
||||||
.mac_cap_info[4] =
|
.mac_cap_info[4] =
|
||||||
IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU |
|
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU |
|
||||||
IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39,
|
IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39,
|
||||||
.mac_cap_info[5] =
|
.mac_cap_info[5] =
|
||||||
IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 |
|
IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 |
|
||||||
|
@ -583,11 +583,11 @@ static const struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
||||||
IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 |
|
IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 |
|
||||||
IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2,
|
IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2,
|
||||||
.phy_cap_info[6] =
|
.phy_cap_info[6] =
|
||||||
IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB |
|
IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
|
||||||
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB |
|
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
|
||||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
|
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
|
||||||
.phy_cap_info[7] =
|
.phy_cap_info[7] =
|
||||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
|
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
|
||||||
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI |
|
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI |
|
||||||
IEEE80211_HE_PHY_CAP7_MAX_NC_1,
|
IEEE80211_HE_PHY_CAP7_MAX_NC_1,
|
||||||
.phy_cap_info[8] =
|
.phy_cap_info[8] =
|
||||||
|
@ -636,9 +636,9 @@ static const struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
||||||
IEEE80211_HE_MAC_CAP2_BSR,
|
IEEE80211_HE_MAC_CAP2_BSR,
|
||||||
.mac_cap_info[3] =
|
.mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2,
|
||||||
.mac_cap_info[4] =
|
.mac_cap_info[4] =
|
||||||
IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||||
.mac_cap_info[5] =
|
.mac_cap_info[5] =
|
||||||
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU,
|
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU,
|
||||||
.phy_cap_info[0] =
|
.phy_cap_info[0] =
|
||||||
|
|
|
@ -596,7 +596,7 @@ static const struct nl80211_vendor_cmd_info mac80211_hwsim_vendor_events[] = {
|
||||||
{ .vendor_id = OUI_QCA, .subcmd = 1 },
|
{ .vendor_id = OUI_QCA, .subcmd = 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static spinlock_t hwsim_radio_lock;
|
static DEFINE_SPINLOCK(hwsim_radio_lock);
|
||||||
static LIST_HEAD(hwsim_radios);
|
static LIST_HEAD(hwsim_radios);
|
||||||
static struct rhashtable hwsim_radios_rht;
|
static struct rhashtable hwsim_radios_rht;
|
||||||
static int hwsim_radio_idx;
|
static int hwsim_radio_idx;
|
||||||
|
@ -763,7 +763,7 @@ static const struct nla_policy hwsim_genl_policy[HWSIM_ATTR_MAX + 1] = {
|
||||||
/* MAC80211_HWSIM virtio queues */
|
/* MAC80211_HWSIM virtio queues */
|
||||||
static struct virtqueue *hwsim_vqs[HWSIM_NUM_VQS];
|
static struct virtqueue *hwsim_vqs[HWSIM_NUM_VQS];
|
||||||
static bool hwsim_virtio_enabled;
|
static bool hwsim_virtio_enabled;
|
||||||
static spinlock_t hwsim_virtio_lock;
|
static DEFINE_SPINLOCK(hwsim_virtio_lock);
|
||||||
|
|
||||||
static void hwsim_virtio_rx_work(struct work_struct *work);
|
static void hwsim_virtio_rx_work(struct work_struct *work);
|
||||||
static DECLARE_WORK(hwsim_virtio_rx, hwsim_virtio_rx_work);
|
static DECLARE_WORK(hwsim_virtio_rx, hwsim_virtio_rx_work);
|
||||||
|
@ -2795,8 +2795,8 @@ static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
|
||||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||||
.mac_cap_info[3] =
|
.mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||||
.phy_cap_info[1] =
|
.phy_cap_info[1] =
|
||||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||||
|
@ -2839,8 +2839,8 @@ static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
|
||||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||||
.mac_cap_info[3] =
|
.mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||||
.phy_cap_info[1] =
|
.phy_cap_info[1] =
|
||||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||||
|
@ -2885,8 +2885,8 @@ static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
|
||||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||||
.mac_cap_info[3] =
|
.mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||||
.phy_cap_info[0] =
|
.phy_cap_info[0] =
|
||||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||||
|
@ -2933,8 +2933,8 @@ static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
|
||||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||||
.mac_cap_info[3] =
|
.mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||||
.phy_cap_info[0] =
|
.phy_cap_info[0] =
|
||||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||||
|
@ -4410,8 +4410,6 @@ static struct virtio_driver virtio_hwsim = {
|
||||||
|
|
||||||
static int hwsim_register_virtio_driver(void)
|
static int hwsim_register_virtio_driver(void)
|
||||||
{
|
{
|
||||||
spin_lock_init(&hwsim_virtio_lock);
|
|
||||||
|
|
||||||
return register_virtio_driver(&virtio_hwsim);
|
return register_virtio_driver(&virtio_hwsim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4440,8 +4438,6 @@ static int __init init_mac80211_hwsim(void)
|
||||||
if (channels < 1)
|
if (channels < 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
spin_lock_init(&hwsim_radio_lock);
|
|
||||||
|
|
||||||
err = rhashtable_init(&hwsim_radios_rht, &hwsim_rht_params);
|
err = rhashtable_init(&hwsim_radios_rht, &hwsim_rht_params);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -511,7 +511,7 @@ mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||||
if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
|
if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
|
||||||
cap |= STA_REC_HE_CAP_OM;
|
cap |= STA_REC_HE_CAP_OM;
|
||||||
|
|
||||||
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU)
|
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
|
||||||
cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
|
cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
|
||||||
|
|
||||||
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
||||||
|
|
|
@ -442,8 +442,8 @@ mt7915_set_stream_he_txbf_caps(struct ieee80211_sta_he_cap *he_cap,
|
||||||
IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
|
IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
|
||||||
elem->phy_cap_info[5] &= ~c;
|
elem->phy_cap_info[5] &= ~c;
|
||||||
|
|
||||||
c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB |
|
c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
|
||||||
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB;
|
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB;
|
||||||
elem->phy_cap_info[6] &= ~c;
|
elem->phy_cap_info[6] &= ~c;
|
||||||
|
|
||||||
elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK;
|
elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK;
|
||||||
|
@ -480,8 +480,8 @@ mt7915_set_stream_he_txbf_caps(struct ieee80211_sta_he_cap *he_cap,
|
||||||
c = (nss - 1) | (max_t(int, le16_to_cpu(mcs->tx_mcs_160), 1) << 3);
|
c = (nss - 1) | (max_t(int, le16_to_cpu(mcs->tx_mcs_160), 1) << 3);
|
||||||
elem->phy_cap_info[5] |= c;
|
elem->phy_cap_info[5] |= c;
|
||||||
|
|
||||||
c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB |
|
c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
|
||||||
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB;
|
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB;
|
||||||
elem->phy_cap_info[6] |= c;
|
elem->phy_cap_info[6] |= c;
|
||||||
|
|
||||||
/* the maximum cap is 4 x 3, (Nr, Nc) = (3, 2) */
|
/* the maximum cap is 4 x 3, (Nr, Nc) = (3, 2) */
|
||||||
|
@ -548,9 +548,9 @@ mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band,
|
||||||
IEEE80211_HE_MAC_CAP0_HTC_HE;
|
IEEE80211_HE_MAC_CAP0_HTC_HE;
|
||||||
he_cap_elem->mac_cap_info[3] =
|
he_cap_elem->mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED;
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
|
||||||
he_cap_elem->mac_cap_info[4] =
|
he_cap_elem->mac_cap_info[4] =
|
||||||
IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU;
|
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU;
|
||||||
|
|
||||||
if (band == NL80211_BAND_2GHZ)
|
if (band == NL80211_BAND_2GHZ)
|
||||||
he_cap_elem->phy_cap_info[0] =
|
he_cap_elem->phy_cap_info[0] =
|
||||||
|
@ -607,7 +607,7 @@ mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band,
|
||||||
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
|
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
|
||||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
|
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
|
||||||
he_cap_elem->phy_cap_info[7] |=
|
he_cap_elem->phy_cap_info[7] |=
|
||||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
|
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
|
||||||
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
|
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
|
||||||
he_cap_elem->phy_cap_info[8] |=
|
he_cap_elem->phy_cap_info[8] |=
|
||||||
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
|
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
|
||||||
|
|
|
@ -1355,7 +1355,7 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||||
if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
|
if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
|
||||||
cap |= STA_REC_HE_CAP_OM;
|
cap |= STA_REC_HE_CAP_OM;
|
||||||
|
|
||||||
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU)
|
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
|
||||||
cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
|
cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
|
||||||
|
|
||||||
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
||||||
|
@ -1853,9 +1853,9 @@ mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
|
||||||
|
|
||||||
bf->tx_mode = MT_PHY_TYPE_HE_SU;
|
bf->tx_mode = MT_PHY_TYPE_HE_SU;
|
||||||
mt7915_mcu_sta_sounding_rate(bf);
|
mt7915_mcu_sta_sounding_rate(bf);
|
||||||
bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMER_FB,
|
bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB,
|
||||||
pe->phy_cap_info[6]);
|
pe->phy_cap_info[6]);
|
||||||
bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMER_FB,
|
bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
|
||||||
pe->phy_cap_info[6]);
|
pe->phy_cap_info[6]);
|
||||||
bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
|
bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
|
||||||
ve->phy_cap_info[5]);
|
ve->phy_cap_info[5]);
|
||||||
|
|
|
@ -65,9 +65,9 @@ mt7921_init_he_caps(struct mt7921_phy *phy, enum nl80211_band band,
|
||||||
IEEE80211_HE_MAC_CAP0_HTC_HE;
|
IEEE80211_HE_MAC_CAP0_HTC_HE;
|
||||||
he_cap_elem->mac_cap_info[3] =
|
he_cap_elem->mac_cap_info[3] =
|
||||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED;
|
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
|
||||||
he_cap_elem->mac_cap_info[4] =
|
he_cap_elem->mac_cap_info[4] =
|
||||||
IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU;
|
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU;
|
||||||
|
|
||||||
if (band == NL80211_BAND_2GHZ)
|
if (band == NL80211_BAND_2GHZ)
|
||||||
he_cap_elem->phy_cap_info[0] =
|
he_cap_elem->phy_cap_info[0] =
|
||||||
|
@ -108,7 +108,7 @@ mt7921_init_he_caps(struct mt7921_phy *phy, enum nl80211_band band,
|
||||||
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
|
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
|
||||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
|
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
|
||||||
he_cap_elem->phy_cap_info[7] |=
|
he_cap_elem->phy_cap_info[7] |=
|
||||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
|
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
|
||||||
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
|
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
|
||||||
he_cap_elem->phy_cap_info[8] |=
|
he_cap_elem->phy_cap_info[8] |=
|
||||||
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
|
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
|
||||||
|
|
|
@ -2006,24 +2006,22 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
||||||
* A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the
|
* A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the
|
||||||
* same field in the HE capabilities.
|
* same field in the HE capabilities.
|
||||||
*/
|
*/
|
||||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_USE_VHT 0x00
|
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0 0x00
|
||||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_1 0x08
|
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1 0x08
|
||||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2 0x10
|
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2 0x10
|
||||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED 0x18
|
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3 0x18
|
||||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK 0x18
|
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK 0x18
|
||||||
#define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG 0x20
|
#define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG 0x20
|
||||||
#define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED 0x40
|
#define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED 0x40
|
||||||
#define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS 0x80
|
#define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS 0x80
|
||||||
|
|
||||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT 3
|
|
||||||
|
|
||||||
#define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01
|
#define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01
|
||||||
#define IEEE80211_HE_MAC_CAP4_QTP 0x02
|
#define IEEE80211_HE_MAC_CAP4_QTP 0x02
|
||||||
#define IEEE80211_HE_MAC_CAP4_BQR 0x04
|
#define IEEE80211_HE_MAC_CAP4_BQR 0x04
|
||||||
#define IEEE80211_HE_MAC_CAP4_SRP_RESP 0x08
|
#define IEEE80211_HE_MAC_CAP4_PSR_RESP 0x08
|
||||||
#define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10
|
#define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10
|
||||||
#define IEEE80211_HE_MAC_CAP4_OPS 0x20
|
#define IEEE80211_HE_MAC_CAP4_OPS 0x20
|
||||||
#define IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU 0x40
|
#define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU 0x40
|
||||||
/* Multi TID agg TX is split between byte #4 and #5
|
/* Multi TID agg TX is split between byte #4 and #5
|
||||||
* The value is a combination of B39,B40,B41
|
* The value is a combination of B39,B40,B41
|
||||||
*/
|
*/
|
||||||
|
@ -2031,7 +2029,7 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
||||||
|
|
||||||
#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 0x01
|
#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 0x01
|
||||||
#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 0x02
|
#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 0x02
|
||||||
#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION 0x04
|
#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION 0x04
|
||||||
#define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU 0x08
|
#define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU 0x08
|
||||||
#define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX 0x10
|
#define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX 0x10
|
||||||
#define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS 0x20
|
#define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS 0x20
|
||||||
|
@ -2089,7 +2087,7 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
||||||
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK 0x18
|
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK 0x18
|
||||||
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00
|
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00
|
||||||
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 0x20
|
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 0x20
|
||||||
#define IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA 0x40
|
#define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU 0x40
|
||||||
#define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER 0x80
|
#define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER 0x80
|
||||||
|
|
||||||
#define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE 0x01
|
#define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE 0x01
|
||||||
|
@ -2136,15 +2134,15 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
||||||
|
|
||||||
#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU 0x01
|
#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU 0x01
|
||||||
#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU 0x02
|
#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU 0x02
|
||||||
#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB 0x04
|
#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB 0x04
|
||||||
#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB 0x08
|
#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB 0x08
|
||||||
#define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB 0x10
|
#define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB 0x10
|
||||||
#define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE 0x20
|
#define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE 0x20
|
||||||
#define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO 0x40
|
#define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO 0x40
|
||||||
#define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT 0x80
|
#define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT 0x80
|
||||||
|
|
||||||
#define IEEE80211_HE_PHY_CAP7_SRP_BASED_SR 0x01
|
#define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR 0x01
|
||||||
#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR 0x02
|
#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP 0x02
|
||||||
#define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI 0x04
|
#define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI 0x04
|
||||||
#define IEEE80211_HE_PHY_CAP7_MAX_NC_1 0x08
|
#define IEEE80211_HE_PHY_CAP7_MAX_NC_1 0x08
|
||||||
#define IEEE80211_HE_PHY_CAP7_MAX_NC_2 0x10
|
#define IEEE80211_HE_PHY_CAP7_MAX_NC_2 0x10
|
||||||
|
@ -3861,4 +3859,11 @@ struct ieee80211_neighbor_ap_info {
|
||||||
u8 channel;
|
u8 channel;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
enum ieee80211_range_params_max_total_ltf {
|
||||||
|
IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_4 = 0,
|
||||||
|
IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_8,
|
||||||
|
IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_16,
|
||||||
|
IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_UNSPECIFIED,
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* LINUX_IEEE80211_H */
|
#endif /* LINUX_IEEE80211_H */
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/ethtool.h>
|
#include <linux/ethtool.h>
|
||||||
|
#include <uapi/linux/rfkill.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
@ -359,7 +360,7 @@ struct ieee80211_sta_he_cap {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ieee80211_sband_iftype_data
|
* struct ieee80211_sband_iftype_data - sband data per interface type
|
||||||
*
|
*
|
||||||
* This structure encapsulates sband data that is relevant for the
|
* This structure encapsulates sband data that is relevant for the
|
||||||
* interface types defined in @types_mask. Each type in the
|
* interface types defined in @types_mask. Each type in the
|
||||||
|
@ -3520,6 +3521,8 @@ struct cfg80211_pmsr_result {
|
||||||
* @non_trigger_based: use non trigger based ranging for the measurement
|
* @non_trigger_based: use non trigger based ranging for the measurement
|
||||||
* If neither @trigger_based nor @non_trigger_based is set,
|
* If neither @trigger_based nor @non_trigger_based is set,
|
||||||
* EDCA based ranging will be used.
|
* EDCA based ranging will be used.
|
||||||
|
* @lmr_feedback: negotiate for I2R LMR feedback. Only valid if either
|
||||||
|
* @trigger_based or @non_trigger_based is set.
|
||||||
*
|
*
|
||||||
* See also nl80211 for the respective attribute documentation.
|
* See also nl80211 for the respective attribute documentation.
|
||||||
*/
|
*/
|
||||||
|
@ -3531,7 +3534,8 @@ struct cfg80211_pmsr_ftm_request_peer {
|
||||||
request_lci:1,
|
request_lci:1,
|
||||||
request_civicloc:1,
|
request_civicloc:1,
|
||||||
trigger_based:1,
|
trigger_based:1,
|
||||||
non_trigger_based:1;
|
non_trigger_based:1,
|
||||||
|
lmr_feedback:1;
|
||||||
u8 num_bursts_exp;
|
u8 num_bursts_exp;
|
||||||
u8 burst_duration;
|
u8 burst_duration;
|
||||||
u8 ftms_per_burst;
|
u8 ftms_per_burst;
|
||||||
|
@ -5606,7 +5610,7 @@ static inline bool cfg80211_channel_is_psc(struct ieee80211_channel *chan)
|
||||||
* which is, for this function, given as a bitmap of indices of
|
* which is, for this function, given as a bitmap of indices of
|
||||||
* rates in the band's bitrate table.
|
* rates in the band's bitrate table.
|
||||||
*/
|
*/
|
||||||
struct ieee80211_rate *
|
const struct ieee80211_rate *
|
||||||
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
||||||
u32 basic_rates, int bitrate);
|
u32 basic_rates, int bitrate);
|
||||||
|
|
||||||
|
@ -6633,11 +6637,19 @@ void cfg80211_notify_new_peer_candidate(struct net_device *dev,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state
|
* wiphy_rfkill_set_hw_state_reason - notify cfg80211 about hw block state
|
||||||
* @wiphy: the wiphy
|
* @wiphy: the wiphy
|
||||||
* @blocked: block status
|
* @blocked: block status
|
||||||
|
* @reason: one of reasons in &enum rfkill_hard_block_reasons
|
||||||
*/
|
*/
|
||||||
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked);
|
void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked,
|
||||||
|
enum rfkill_hard_block_reasons reason);
|
||||||
|
|
||||||
|
static inline void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
|
||||||
|
{
|
||||||
|
wiphy_rfkill_set_hw_state_reason(wiphy, blocked,
|
||||||
|
RFKILL_HARD_BLOCK_SIGNAL);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wiphy_rfkill_start_polling - start polling rfkill
|
* wiphy_rfkill_start_polling - start polling rfkill
|
||||||
|
@ -6731,7 +6743,7 @@ cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int approxlen)
|
||||||
int cfg80211_vendor_cmd_reply(struct sk_buff *skb);
|
int cfg80211_vendor_cmd_reply(struct sk_buff *skb);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cfg80211_vendor_cmd_get_sender
|
* cfg80211_vendor_cmd_get_sender - get the current sender netlink ID
|
||||||
* @wiphy: the wiphy
|
* @wiphy: the wiphy
|
||||||
*
|
*
|
||||||
* Return the current netlink port ID in a vendor command handler.
|
* Return the current netlink port ID in a vendor command handler.
|
||||||
|
|
|
@ -1768,10 +1768,7 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev);
|
||||||
*
|
*
|
||||||
* This can be used by mac80211 drivers with direct cfg80211 APIs
|
* This can be used by mac80211 drivers with direct cfg80211 APIs
|
||||||
* (like the vendor commands) that needs to get the wdev for a vif.
|
* (like the vendor commands) that needs to get the wdev for a vif.
|
||||||
*
|
* This can also be useful to get the netdev associated to a vif.
|
||||||
* Note that this function may return %NULL if the given wdev isn't
|
|
||||||
* associated with a vif that the driver knows about (e.g. monitor
|
|
||||||
* or AP_VLAN interfaces.)
|
|
||||||
*/
|
*/
|
||||||
struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif);
|
struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif);
|
||||||
|
|
||||||
|
@ -2399,6 +2396,12 @@ struct ieee80211_txq {
|
||||||
* @IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD: Hardware supports rx decapsulation
|
* @IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD: Hardware supports rx decapsulation
|
||||||
* offload
|
* offload
|
||||||
*
|
*
|
||||||
|
* @IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP: Hardware supports concurrent rx
|
||||||
|
* decapsulation offload and passing raw 802.11 frames for monitor iface.
|
||||||
|
* If this is supported, the driver must pass both 802.3 frames for real
|
||||||
|
* usage and 802.11 frames with %RX_FLAG_ONLY_MONITOR set for monitor to
|
||||||
|
* the stack.
|
||||||
|
*
|
||||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||||
*/
|
*/
|
||||||
enum ieee80211_hw_flags {
|
enum ieee80211_hw_flags {
|
||||||
|
@ -2453,6 +2456,7 @@ enum ieee80211_hw_flags {
|
||||||
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
|
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
|
||||||
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
|
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
|
||||||
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
|
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
|
||||||
|
IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP,
|
||||||
|
|
||||||
/* keep last, obviously */
|
/* keep last, obviously */
|
||||||
NUM_IEEE80211_HW_FLAGS
|
NUM_IEEE80211_HW_FLAGS
|
||||||
|
|
|
@ -655,6 +655,9 @@
|
||||||
* When a security association was established on an 802.1X network using
|
* When a security association was established on an 802.1X network using
|
||||||
* fast transition, this event should be followed by an
|
* fast transition, this event should be followed by an
|
||||||
* %NL80211_CMD_PORT_AUTHORIZED event.
|
* %NL80211_CMD_PORT_AUTHORIZED event.
|
||||||
|
* Following a %NL80211_CMD_ROAM event userspace can issue
|
||||||
|
* %NL80211_CMD_GET_SCAN in order to obtain the scan information for the
|
||||||
|
* new BSS the card/driver roamed to.
|
||||||
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
||||||
* userspace that a connection was dropped by the AP or due to other
|
* userspace that a connection was dropped by the AP or due to other
|
||||||
* reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and
|
* reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and
|
||||||
|
@ -5937,6 +5940,16 @@ enum nl80211_feature_flags {
|
||||||
* @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
|
* @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
|
||||||
* configuration (AP/mesh) with HE rates.
|
* configuration (AP/mesh) with HE rates.
|
||||||
*
|
*
|
||||||
|
* @NL80211_EXT_FEATURE_SECURE_LTF: Device supports secure LTF measurement
|
||||||
|
* exchange protocol.
|
||||||
|
*
|
||||||
|
* @NL80211_EXT_FEATURE_SECURE_RTT: Device supports secure RTT measurement
|
||||||
|
* exchange protocol.
|
||||||
|
*
|
||||||
|
* @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management
|
||||||
|
* frame protection for all management frames exchanged during the
|
||||||
|
* negotiation and range measurement procedure.
|
||||||
|
*
|
||||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||||
*/
|
*/
|
||||||
|
@ -5998,6 +6011,9 @@ enum nl80211_ext_feature_index {
|
||||||
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
||||||
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
||||||
NL80211_EXT_FEATURE_BEACON_RATE_HE,
|
NL80211_EXT_FEATURE_BEACON_RATE_HE,
|
||||||
|
NL80211_EXT_FEATURE_SECURE_LTF,
|
||||||
|
NL80211_EXT_FEATURE_SECURE_RTT,
|
||||||
|
NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
||||||
|
|
||||||
/* add new features before the definition below */
|
/* add new features before the definition below */
|
||||||
NUM_NL80211_EXT_FEATURES,
|
NUM_NL80211_EXT_FEATURES,
|
||||||
|
@ -6295,11 +6311,13 @@ struct nl80211_vendor_cmd_info {
|
||||||
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
||||||
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
||||||
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
||||||
|
* @NL80211_TDLS_PEER_HE: TDLS peer is HE capable.
|
||||||
*/
|
*/
|
||||||
enum nl80211_tdls_peer_capability {
|
enum nl80211_tdls_peer_capability {
|
||||||
NL80211_TDLS_PEER_HT = 1<<0,
|
NL80211_TDLS_PEER_HT = 1<<0,
|
||||||
NL80211_TDLS_PEER_VHT = 1<<1,
|
NL80211_TDLS_PEER_VHT = 1<<1,
|
||||||
NL80211_TDLS_PEER_WMM = 1<<2,
|
NL80211_TDLS_PEER_WMM = 1<<2,
|
||||||
|
NL80211_TDLS_PEER_HE = 1<<3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -6891,6 +6909,9 @@ enum nl80211_peer_measurement_ftm_capa {
|
||||||
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
||||||
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
||||||
* ranging will be used.
|
* ranging will be used.
|
||||||
|
* @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
|
||||||
|
* valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
|
||||||
|
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
|
||||||
*
|
*
|
||||||
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
||||||
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
||||||
|
@ -6909,6 +6930,7 @@ enum nl80211_peer_measurement_ftm_req {
|
||||||
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
||||||
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
||||||
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
||||||
|
NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
|
||||||
|
|
||||||
/* keep last */
|
/* keep last */
|
||||||
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* AES-128-CMAC with TLen 16 for IEEE 802.11w BIP
|
* AES-128-CMAC with TLen 16 for IEEE 802.11w BIP
|
||||||
* Copyright 2008, Jouni Malinen <j@w1.fi>
|
* Copyright 2008, Jouni Malinen <j@w1.fi>
|
||||||
|
* Copyright (C) 2020 Intel Corporation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
@ -73,8 +74,14 @@ struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||||
struct crypto_shash *tfm;
|
struct crypto_shash *tfm;
|
||||||
|
|
||||||
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
tfm = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||||
if (!IS_ERR(tfm))
|
if (!IS_ERR(tfm)) {
|
||||||
crypto_shash_setkey(tfm, key, key_len);
|
int err = crypto_shash_setkey(tfm, key, key_len);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
crypto_free_shash(tfm);
|
||||||
|
return ERR_PTR(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return tfm;
|
return tfm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -456,6 +456,7 @@ static const char *hw_flag_names[] = {
|
||||||
FLAG(AMPDU_KEYBORDER_SUPPORT),
|
FLAG(AMPDU_KEYBORDER_SUPPORT),
|
||||||
FLAG(SUPPORTS_TX_ENCAP_OFFLOAD),
|
FLAG(SUPPORTS_TX_ENCAP_OFFLOAD),
|
||||||
FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
|
FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
|
||||||
|
FLAG(SUPPORTS_CONC_MON_RX_DECAP),
|
||||||
#undef FLAG
|
#undef FLAG
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -711,17 +711,17 @@ static ssize_t sta_he_capa_read(struct file *file, char __user *userbuf,
|
||||||
PFLAG(MAC, 3, OFDMA_RA, "OFDMA-RA");
|
PFLAG(MAC, 3, OFDMA_RA, "OFDMA-RA");
|
||||||
|
|
||||||
switch (cap[3] & IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) {
|
switch (cap[3] & IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) {
|
||||||
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_USE_VHT:
|
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0:
|
||||||
PRINT("MAX-AMPDU-LEN-EXP-USE-VHT");
|
PRINT("MAX-AMPDU-LEN-EXP-USE-EXT-0");
|
||||||
break;
|
break;
|
||||||
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_1:
|
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1:
|
||||||
PRINT("MAX-AMPDU-LEN-EXP-VHT-1");
|
PRINT("MAX-AMPDU-LEN-EXP-VHT-EXT-1");
|
||||||
break;
|
break;
|
||||||
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2:
|
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2:
|
||||||
PRINT("MAX-AMPDU-LEN-EXP-VHT-2");
|
PRINT("MAX-AMPDU-LEN-EXP-VHT-EXT-2");
|
||||||
break;
|
break;
|
||||||
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED:
|
case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3:
|
||||||
PRINT("MAX-AMPDU-LEN-EXP-RESERVED");
|
PRINT("MAX-AMPDU-LEN-EXP-VHT-EXT-3");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,15 +732,15 @@ static ssize_t sta_he_capa_read(struct file *file, char __user *userbuf,
|
||||||
PFLAG(MAC, 4, BSRP_BQRP_A_MPDU_AGG, "BSRP-BQRP-A-MPDU-AGG");
|
PFLAG(MAC, 4, BSRP_BQRP_A_MPDU_AGG, "BSRP-BQRP-A-MPDU-AGG");
|
||||||
PFLAG(MAC, 4, QTP, "QTP");
|
PFLAG(MAC, 4, QTP, "QTP");
|
||||||
PFLAG(MAC, 4, BQR, "BQR");
|
PFLAG(MAC, 4, BQR, "BQR");
|
||||||
PFLAG(MAC, 4, SRP_RESP, "SRP-RESP");
|
PFLAG(MAC, 4, PSR_RESP, "PSR-RESP");
|
||||||
PFLAG(MAC, 4, NDP_FB_REP, "NDP-FB-REP");
|
PFLAG(MAC, 4, NDP_FB_REP, "NDP-FB-REP");
|
||||||
PFLAG(MAC, 4, OPS, "OPS");
|
PFLAG(MAC, 4, OPS, "OPS");
|
||||||
PFLAG(MAC, 4, AMDSU_IN_AMPDU, "AMSDU-IN-AMPDU");
|
PFLAG(MAC, 4, AMSDU_IN_AMPDU, "AMSDU-IN-AMPDU");
|
||||||
|
|
||||||
PRINT("MULTI-TID-AGG-TX-QOS-%d", ((cap[5] << 1) | (cap[4] >> 7)) & 0x7);
|
PRINT("MULTI-TID-AGG-TX-QOS-%d", ((cap[5] << 1) | (cap[4] >> 7)) & 0x7);
|
||||||
|
|
||||||
PFLAG(MAC, 5, SUBCHAN_SELECVITE_TRANSMISSION,
|
PFLAG(MAC, 5, SUBCHAN_SELECTIVE_TRANSMISSION,
|
||||||
"SUBCHAN-SELECVITE-TRANSMISSION");
|
"SUBCHAN-SELECTIVE-TRANSMISSION");
|
||||||
PFLAG(MAC, 5, UL_2x996_TONE_RU, "UL-2x996-TONE-RU");
|
PFLAG(MAC, 5, UL_2x996_TONE_RU, "UL-2x996-TONE-RU");
|
||||||
PFLAG(MAC, 5, OM_CTRL_UL_MU_DATA_DIS_RX, "OM-CTRL-UL-MU-DATA-DIS-RX");
|
PFLAG(MAC, 5, OM_CTRL_UL_MU_DATA_DIS_RX, "OM-CTRL-UL-MU-DATA-DIS-RX");
|
||||||
PFLAG(MAC, 5, HE_DYNAMIC_SM_PS, "HE-DYNAMIC-SM-PS");
|
PFLAG(MAC, 5, HE_DYNAMIC_SM_PS, "HE-DYNAMIC-SM-PS");
|
||||||
|
@ -832,8 +832,8 @@ static ssize_t sta_he_capa_read(struct file *file, char __user *userbuf,
|
||||||
|
|
||||||
PFLAG(PHY, 3, DCM_MAX_RX_NSS_1, "DCM-MAX-RX-NSS-1");
|
PFLAG(PHY, 3, DCM_MAX_RX_NSS_1, "DCM-MAX-RX-NSS-1");
|
||||||
PFLAG(PHY, 3, DCM_MAX_RX_NSS_2, "DCM-MAX-RX-NSS-2");
|
PFLAG(PHY, 3, DCM_MAX_RX_NSS_2, "DCM-MAX-RX-NSS-2");
|
||||||
PFLAG(PHY, 3, RX_HE_MU_PPDU_FROM_NON_AP_STA,
|
PFLAG(PHY, 3, RX_PARTIAL_BW_SU_IN_20MHZ_MU,
|
||||||
"RX-HE-MU-PPDU-FROM-NON-AP-STA");
|
"RX-PARTIAL-BW-SU-IN-20MHZ-MU");
|
||||||
PFLAG(PHY, 3, SU_BEAMFORMER, "SU-BEAMFORMER");
|
PFLAG(PHY, 3, SU_BEAMFORMER, "SU-BEAMFORMER");
|
||||||
|
|
||||||
PFLAG(PHY, 4, SU_BEAMFORMEE, "SU-BEAMFORMEE");
|
PFLAG(PHY, 4, SU_BEAMFORMEE, "SU-BEAMFORMEE");
|
||||||
|
@ -853,16 +853,17 @@ static ssize_t sta_he_capa_read(struct file *file, char __user *userbuf,
|
||||||
|
|
||||||
PFLAG(PHY, 6, CODEBOOK_SIZE_42_SU, "CODEBOOK-SIZE-42-SU");
|
PFLAG(PHY, 6, CODEBOOK_SIZE_42_SU, "CODEBOOK-SIZE-42-SU");
|
||||||
PFLAG(PHY, 6, CODEBOOK_SIZE_75_MU, "CODEBOOK-SIZE-75-MU");
|
PFLAG(PHY, 6, CODEBOOK_SIZE_75_MU, "CODEBOOK-SIZE-75-MU");
|
||||||
PFLAG(PHY, 6, TRIG_SU_BEAMFORMER_FB, "TRIG-SU-BEAMFORMER-FB");
|
PFLAG(PHY, 6, TRIG_SU_BEAMFORMING_FB, "TRIG-SU-BEAMFORMING-FB");
|
||||||
PFLAG(PHY, 6, TRIG_MU_BEAMFORMER_FB, "TRIG-MU-BEAMFORMER-FB");
|
PFLAG(PHY, 6, TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
|
||||||
|
"MU-BEAMFORMING-PARTIAL-BW-FB");
|
||||||
PFLAG(PHY, 6, TRIG_CQI_FB, "TRIG-CQI-FB");
|
PFLAG(PHY, 6, TRIG_CQI_FB, "TRIG-CQI-FB");
|
||||||
PFLAG(PHY, 6, PARTIAL_BW_EXT_RANGE, "PARTIAL-BW-EXT-RANGE");
|
PFLAG(PHY, 6, PARTIAL_BW_EXT_RANGE, "PARTIAL-BW-EXT-RANGE");
|
||||||
PFLAG(PHY, 6, PARTIAL_BANDWIDTH_DL_MUMIMO,
|
PFLAG(PHY, 6, PARTIAL_BANDWIDTH_DL_MUMIMO,
|
||||||
"PARTIAL-BANDWIDTH-DL-MUMIMO");
|
"PARTIAL-BANDWIDTH-DL-MUMIMO");
|
||||||
PFLAG(PHY, 6, PPE_THRESHOLD_PRESENT, "PPE-THRESHOLD-PRESENT");
|
PFLAG(PHY, 6, PPE_THRESHOLD_PRESENT, "PPE-THRESHOLD-PRESENT");
|
||||||
|
|
||||||
PFLAG(PHY, 7, SRP_BASED_SR, "SRP-BASED-SR");
|
PFLAG(PHY, 7, PSR_BASED_SR, "PSR-BASED-SR");
|
||||||
PFLAG(PHY, 7, POWER_BOOST_FACTOR_AR, "POWER-BOOST-FACTOR-AR");
|
PFLAG(PHY, 7, POWER_BOOST_FACTOR_SUPP, "POWER-BOOST-FACTOR-SUPP");
|
||||||
PFLAG(PHY, 7, HE_SU_MU_PPDU_4XLTF_AND_08_US_GI,
|
PFLAG(PHY, 7, HE_SU_MU_PPDU_4XLTF_AND_08_US_GI,
|
||||||
"HE-SU-MU-PPDU-4XLTF-AND-08-US-GI");
|
"HE-SU-MU-PPDU-4XLTF-AND-08-US-GI");
|
||||||
PFLAG_RANGE(PHY, 7, MAX_NC, 0, 1, 1, "MAX-NC-%d");
|
PFLAG_RANGE(PHY, 7, MAX_NC, 0, 1, 1, "MAX-NC-%d");
|
||||||
|
|
|
@ -1660,6 +1660,8 @@ void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
|
||||||
void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata);
|
void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata);
|
||||||
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
|
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
|
||||||
void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata);
|
void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata);
|
||||||
|
void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
||||||
|
u8 *bssid, u8 reason, bool tx);
|
||||||
|
|
||||||
/* IBSS code */
|
/* IBSS code */
|
||||||
void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
|
void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
|
||||||
|
|
|
@ -807,7 +807,8 @@ static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdat
|
||||||
ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) {
|
ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) {
|
||||||
flags |= IEEE80211_OFFLOAD_DECAP_ENABLED;
|
flags |= IEEE80211_OFFLOAD_DECAP_ENABLED;
|
||||||
|
|
||||||
if (local->monitors)
|
if (local->monitors &&
|
||||||
|
!ieee80211_hw_check(&local->hw, SUPPORTS_CONC_MON_RX_DECAP))
|
||||||
flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
|
flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
|
||||||
} else {
|
} else {
|
||||||
flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
|
flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
||||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||||
* Copyright (C) 2017 Intel Deutschland GmbH
|
* Copyright (C) 2017 Intel Deutschland GmbH
|
||||||
* Copyright (C) 2018 - 2019 Intel Corporation
|
* Copyright (C) 2018-2021 Intel Corporation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
@ -282,6 +282,13 @@ static void ieee80211_restart_work(struct work_struct *work)
|
||||||
* Then we can have a race...
|
* Then we can have a race...
|
||||||
*/
|
*/
|
||||||
cancel_work_sync(&sdata->u.mgd.csa_connection_drop_work);
|
cancel_work_sync(&sdata->u.mgd.csa_connection_drop_work);
|
||||||
|
if (sdata->vif.csa_active) {
|
||||||
|
sdata_lock(sdata);
|
||||||
|
ieee80211_sta_connection_lost(sdata,
|
||||||
|
sdata->u.mgd.associated->bssid,
|
||||||
|
WLAN_REASON_UNSPECIFIED, false);
|
||||||
|
sdata_unlock(sdata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
|
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
|
||||||
}
|
}
|
||||||
|
@ -1141,8 +1148,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||||
if (local->hw.wiphy->max_scan_ie_len)
|
if (local->hw.wiphy->max_scan_ie_len)
|
||||||
local->hw.wiphy->max_scan_ie_len -= local->scan_ies_len;
|
local->hw.wiphy->max_scan_ie_len -= local->scan_ies_len;
|
||||||
|
|
||||||
WARN_ON(!ieee80211_cs_list_valid(local->hw.cipher_schemes,
|
if (WARN_ON(!ieee80211_cs_list_valid(local->hw.cipher_schemes,
|
||||||
local->hw.n_cipher_schemes));
|
local->hw.n_cipher_schemes))) {
|
||||||
|
result = -EINVAL;
|
||||||
|
goto fail_workqueue;
|
||||||
|
}
|
||||||
|
|
||||||
result = ieee80211_init_cipher_suites(local);
|
result = ieee80211_init_cipher_suites(local);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
|
|
|
@ -1295,6 +1295,11 @@ static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata)
|
||||||
|
|
||||||
sdata->vif.csa_active = false;
|
sdata->vif.csa_active = false;
|
||||||
ifmgd->csa_waiting_bcn = false;
|
ifmgd->csa_waiting_bcn = false;
|
||||||
|
/*
|
||||||
|
* If the CSA IE is still present on the beacon after the switch,
|
||||||
|
* we need to consider it as a new CSA (possibly to self).
|
||||||
|
*/
|
||||||
|
ifmgd->beacon_crc_valid = false;
|
||||||
|
|
||||||
ret = drv_post_channel_switch(sdata);
|
ret = drv_post_channel_switch(sdata);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1400,11 +1405,8 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
||||||
ch_switch.delay = csa_ie.max_switch_time;
|
ch_switch.delay = csa_ie.max_switch_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res < 0) {
|
if (res < 0)
|
||||||
ieee80211_queue_work(&local->hw,
|
goto lock_and_drop_connection;
|
||||||
&ifmgd->csa_connection_drop_work);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (beacon && sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) {
|
if (beacon && sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) {
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -4382,7 +4384,7 @@ static void ieee80211_sta_timer(struct timer_list *t)
|
||||||
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *bssid, u8 reason, bool tx)
|
u8 *bssid, u8 reason, bool tx)
|
||||||
{
|
{
|
||||||
u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
|
u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
|
||||||
|
|
|
@ -868,7 +868,6 @@ static u16
|
||||||
minstrel_ht_next_jump_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur,
|
minstrel_ht_next_jump_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur,
|
||||||
u32 slow_rate_dur, int *slow_rate_ofs)
|
u32 slow_rate_dur, int *slow_rate_ofs)
|
||||||
{
|
{
|
||||||
struct minstrel_mcs_group_data *mg;
|
|
||||||
struct minstrel_rate_stats *mrs;
|
struct minstrel_rate_stats *mrs;
|
||||||
u32 max_duration = slow_rate_dur;
|
u32 max_duration = slow_rate_dur;
|
||||||
int i, index, offset;
|
int i, index, offset;
|
||||||
|
@ -886,7 +885,6 @@ minstrel_ht_next_jump_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur,
|
||||||
u8 type;
|
u8 type;
|
||||||
|
|
||||||
group = (group + 1) % ARRAY_SIZE(minstrel_mcs_groups);
|
group = (group + 1) % ARRAY_SIZE(minstrel_mcs_groups);
|
||||||
mg = &mi->groups[group];
|
|
||||||
|
|
||||||
supported = mi->supported[group];
|
supported = mi->supported[group];
|
||||||
if (!supported)
|
if (!supported)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
||||||
* Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
|
* Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
|
||||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||||
* Copyright (C) 2018-2020 Intel Corporation
|
* Copyright (C) 2018-2021 Intel Corporation
|
||||||
*
|
*
|
||||||
* Transmit and frame generation functions.
|
* Transmit and frame generation functions.
|
||||||
*/
|
*/
|
||||||
|
@ -1388,8 +1388,20 @@ static void ieee80211_txq_enqueue(struct ieee80211_local *local,
|
||||||
ieee80211_set_skb_enqueue_time(skb);
|
ieee80211_set_skb_enqueue_time(skb);
|
||||||
|
|
||||||
spin_lock_bh(&fq->lock);
|
spin_lock_bh(&fq->lock);
|
||||||
|
/*
|
||||||
|
* For management frames, don't really apply codel etc.,
|
||||||
|
* we don't want to apply any shaping or anything we just
|
||||||
|
* want to simplify the driver API by having them on the
|
||||||
|
* txqi.
|
||||||
|
*/
|
||||||
|
if (unlikely(txqi->txq.tid == IEEE80211_NUM_TIDS)) {
|
||||||
|
IEEE80211_SKB_CB(skb)->control.flags |=
|
||||||
|
IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
|
||||||
|
__skb_queue_tail(&txqi->frags, skb);
|
||||||
|
} else {
|
||||||
fq_tin_enqueue(fq, tin, flow_idx, skb,
|
fq_tin_enqueue(fq, tin, flow_idx, skb,
|
||||||
fq_skb_free_func);
|
fq_skb_free_func);
|
||||||
|
}
|
||||||
spin_unlock_bh(&fq->lock);
|
spin_unlock_bh(&fq->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1684,7 +1696,7 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
struct ieee80211_vif *vif;
|
struct ieee80211_vif *vif;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
bool result = true;
|
bool result;
|
||||||
__le16 fc;
|
__le16 fc;
|
||||||
|
|
||||||
if (WARN_ON(skb_queue_empty(skbs)))
|
if (WARN_ON(skb_queue_empty(skbs)))
|
||||||
|
@ -2267,17 +2279,6 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
|
||||||
payload[7]);
|
payload[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize skb->priority for QoS frames. If the DONT_REORDER flag
|
|
||||||
* is set, stick to the default value for skb->priority to assure
|
|
||||||
* frames injected with this flag are not reordered relative to each
|
|
||||||
* other.
|
|
||||||
*/
|
|
||||||
if (ieee80211_is_data_qos(hdr->frame_control) &&
|
|
||||||
!(info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER)) {
|
|
||||||
u8 *p = ieee80211_get_qos_ctl(hdr);
|
|
||||||
skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2341,6 +2342,15 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
|
||||||
|
|
||||||
info->band = chandef->chan->band;
|
info->band = chandef->chan->band;
|
||||||
|
|
||||||
|
/* Initialize skb->priority according to frame type and TID class,
|
||||||
|
* with respect to the sub interface that the frame will actually
|
||||||
|
* be transmitted on. If the DONT_REORDER flag is set, the original
|
||||||
|
* skb-priority is preserved to assure frames injected with this
|
||||||
|
* flag are not reordered relative to each other.
|
||||||
|
*/
|
||||||
|
ieee80211_select_queue_80211(sdata, skb, hdr);
|
||||||
|
skb_set_queue_mapping(skb, ieee80211_ac_from_tid(skb->priority));
|
||||||
|
|
||||||
/* remove the injection radiotap header */
|
/* remove the injection radiotap header */
|
||||||
skb_pull(skb, len_rthdr);
|
skb_pull(skb, len_rthdr);
|
||||||
|
|
||||||
|
@ -3580,10 +3590,16 @@ begin:
|
||||||
|
|
||||||
/* Make sure fragments stay together. */
|
/* Make sure fragments stay together. */
|
||||||
skb = __skb_dequeue(&txqi->frags);
|
skb = __skb_dequeue(&txqi->frags);
|
||||||
if (skb)
|
if (unlikely(skb)) {
|
||||||
|
if (!(IEEE80211_SKB_CB(skb)->control.flags &
|
||||||
|
IEEE80211_TX_INTCFL_NEED_TXPROCESSING))
|
||||||
goto out;
|
goto out;
|
||||||
|
IEEE80211_SKB_CB(skb)->control.flags &=
|
||||||
|
~IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
|
||||||
|
} else {
|
||||||
skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func);
|
skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func);
|
||||||
|
}
|
||||||
|
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -3835,6 +3851,9 @@ bool ieee80211_txq_airtime_check(struct ieee80211_hw *hw,
|
||||||
if (!txq->sta)
|
if (!txq->sta)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (unlikely(txq->tid == IEEE80211_NUM_TIDS))
|
||||||
|
return true;
|
||||||
|
|
||||||
sta = container_of(txq->sta, struct sta_info, sta);
|
sta = container_of(txq->sta, struct sta_info, sta);
|
||||||
if (atomic_read(&sta->airtime[txq->ac].aql_tx_pending) <
|
if (atomic_read(&sta->airtime[txq->ac].aql_tx_pending) <
|
||||||
sta->airtime[txq->ac].aql_limit_low)
|
sta->airtime[txq->ac].aql_limit_low)
|
||||||
|
@ -4150,6 +4169,9 @@ static bool ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int q = info->hw_queue;
|
int q = info->hw_queue;
|
||||||
|
|
||||||
|
if (sta)
|
||||||
|
sk_pacing_shift_update(skb->sk, local->hw.tx_sk_pacing_shift);
|
||||||
|
|
||||||
if (ieee80211_queue_skb(local, sdata, sta, skb))
|
if (ieee80211_queue_skb(local, sdata, sta, skb))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
@ -888,18 +888,10 @@ EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif);
|
||||||
|
|
||||||
struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
|
struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata;
|
|
||||||
|
|
||||||
if (!vif)
|
if (!vif)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sdata = vif_to_sdata(vif);
|
return &vif_to_sdata(vif)->wdev;
|
||||||
|
|
||||||
if (!ieee80211_sdata_running(sdata) ||
|
|
||||||
!(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return &sdata->wdev;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
|
EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ module_param_named(master_switch_mode, rfkill_master_switch_mode, uint, 0);
|
||||||
MODULE_PARM_DESC(master_switch_mode,
|
MODULE_PARM_DESC(master_switch_mode,
|
||||||
"SW_RFKILL_ALL ON should: 0=do nothing (only unlock); 1=restore; 2=unblock all");
|
"SW_RFKILL_ALL ON should: 0=do nothing (only unlock); 1=restore; 2=unblock all");
|
||||||
|
|
||||||
static spinlock_t rfkill_op_lock;
|
static DEFINE_SPINLOCK(rfkill_op_lock);
|
||||||
static bool rfkill_op_pending;
|
static bool rfkill_op_pending;
|
||||||
static unsigned long rfkill_sw_pending[BITS_TO_LONGS(NUM_RFKILL_TYPES)];
|
static unsigned long rfkill_sw_pending[BITS_TO_LONGS(NUM_RFKILL_TYPES)];
|
||||||
static unsigned long rfkill_sw_state[BITS_TO_LONGS(NUM_RFKILL_TYPES)];
|
static unsigned long rfkill_sw_state[BITS_TO_LONGS(NUM_RFKILL_TYPES)];
|
||||||
|
@ -330,8 +330,6 @@ int __init rfkill_handler_init(void)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_init(&rfkill_op_lock);
|
|
||||||
|
|
||||||
/* Avoid delay at first schedule */
|
/* Avoid delay at first schedule */
|
||||||
rfkill_last_scheduled =
|
rfkill_last_scheduled =
|
||||||
jiffies - msecs_to_jiffies(RFKILL_OPS_DELAY) - 1;
|
jiffies - msecs_to_jiffies(RFKILL_OPS_DELAY) - 1;
|
||||||
|
|
|
@ -1092,14 +1092,15 @@ void wiphy_free(struct wiphy *wiphy)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(wiphy_free);
|
EXPORT_SYMBOL(wiphy_free);
|
||||||
|
|
||||||
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
|
void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked,
|
||||||
|
enum rfkill_hard_block_reasons reason)
|
||||||
{
|
{
|
||||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||||
|
|
||||||
if (rfkill_set_hw_state(rdev->rfkill, blocked))
|
if (rfkill_set_hw_state_reason(rdev->rfkill, blocked, reason))
|
||||||
schedule_work(&rdev->rfkill_block);
|
schedule_work(&rdev->rfkill_block);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);
|
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state_reason);
|
||||||
|
|
||||||
void cfg80211_cqm_config_free(struct wireless_dev *wdev)
|
void cfg80211_cqm_config_free(struct wireless_dev *wdev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -313,6 +313,7 @@ nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = {
|
||||||
[NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG },
|
[NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG },
|
||||||
[NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG },
|
[NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG },
|
||||||
[NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG },
|
[NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG },
|
||||||
|
[NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct nla_policy
|
static const struct nla_policy
|
||||||
|
@ -411,6 +412,7 @@ static const struct nla_policy
|
||||||
nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
|
nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
|
||||||
[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000),
|
[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000),
|
||||||
[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
|
[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
|
||||||
|
[NL80211_FILS_DISCOVERY_ATTR_TMPL] =
|
||||||
NLA_POLICY_RANGE(NLA_BINARY,
|
NLA_POLICY_RANGE(NLA_BINARY,
|
||||||
NL80211_FILS_DISCOVERY_TMPL_MIN_LEN,
|
NL80211_FILS_DISCOVERY_TMPL_MIN_LEN,
|
||||||
IEEE80211_MAX_DATA_LEN),
|
IEEE80211_MAX_DATA_LEN),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 - 2019 Intel Corporation
|
* Copyright (C) 2018 - 2021 Intel Corporation
|
||||||
*/
|
*/
|
||||||
#ifndef __PMSR_H
|
#ifndef __PMSR_H
|
||||||
#define __PMSR_H
|
#define __PMSR_H
|
||||||
|
@ -158,6 +158,16 @@ static int pmsr_parse_ftm(struct cfg80211_registered_device *rdev,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out->ftm.lmr_feedback =
|
||||||
|
!!tb[NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK];
|
||||||
|
if (!out->ftm.trigger_based && !out->ftm.non_trigger_based &&
|
||||||
|
out->ftm.lmr_feedback) {
|
||||||
|
NL_SET_ERR_MSG_ATTR(info->extack,
|
||||||
|
tb[NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK],
|
||||||
|
"FTM: LMR feedback set for EDCA based ranging");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -126,7 +126,7 @@ static int reg_num_devs_support_basehint;
|
||||||
* is relevant for all registered devices.
|
* is relevant for all registered devices.
|
||||||
*/
|
*/
|
||||||
static bool reg_is_indoor;
|
static bool reg_is_indoor;
|
||||||
static spinlock_t reg_indoor_lock;
|
static DEFINE_SPINLOCK(reg_indoor_lock);
|
||||||
|
|
||||||
/* Used to track the userspace process controlling the indoor setting */
|
/* Used to track the userspace process controlling the indoor setting */
|
||||||
static u32 reg_is_indoor_portid;
|
static u32 reg_is_indoor_portid;
|
||||||
|
@ -210,11 +210,11 @@ static struct regulatory_request *get_last_request(void)
|
||||||
|
|
||||||
/* Used to queue up regulatory hints */
|
/* Used to queue up regulatory hints */
|
||||||
static LIST_HEAD(reg_requests_list);
|
static LIST_HEAD(reg_requests_list);
|
||||||
static spinlock_t reg_requests_lock;
|
static DEFINE_SPINLOCK(reg_requests_lock);
|
||||||
|
|
||||||
/* Used to queue up beacon hints for review */
|
/* Used to queue up beacon hints for review */
|
||||||
static LIST_HEAD(reg_pending_beacons);
|
static LIST_HEAD(reg_pending_beacons);
|
||||||
static spinlock_t reg_pending_beacons_lock;
|
static DEFINE_SPINLOCK(reg_pending_beacons_lock);
|
||||||
|
|
||||||
/* Used to keep track of processed beacon hints */
|
/* Used to keep track of processed beacon hints */
|
||||||
static LIST_HEAD(reg_beacon_list);
|
static LIST_HEAD(reg_beacon_list);
|
||||||
|
@ -4262,10 +4262,6 @@ int __init regulatory_init(void)
|
||||||
if (IS_ERR(reg_pdev))
|
if (IS_ERR(reg_pdev))
|
||||||
return PTR_ERR(reg_pdev);
|
return PTR_ERR(reg_pdev);
|
||||||
|
|
||||||
spin_lock_init(®_requests_lock);
|
|
||||||
spin_lock_init(®_pending_beacons_lock);
|
|
||||||
spin_lock_init(®_indoor_lock);
|
|
||||||
|
|
||||||
rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
|
rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
|
||||||
|
|
||||||
user_alpha2[0] = '9';
|
user_alpha2[0] = '9';
|
||||||
|
|
|
@ -589,7 +589,7 @@ static int cfg80211_parse_colocated_ap(const struct cfg80211_bss_ies *ies,
|
||||||
|
|
||||||
elem = cfg80211_find_elem(WLAN_EID_REDUCED_NEIGHBOR_REPORT, ies->data,
|
elem = cfg80211_find_elem(WLAN_EID_REDUCED_NEIGHBOR_REPORT, ies->data,
|
||||||
ies->len);
|
ies->len);
|
||||||
if (!elem || elem->datalen > IEEE80211_MAX_SSID_LEN)
|
if (!elem)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pos = elem->data;
|
pos = elem->data;
|
||||||
|
@ -1751,6 +1751,8 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
|
||||||
|
|
||||||
if (rdev->bss_entries >= bss_entries_limit &&
|
if (rdev->bss_entries >= bss_entries_limit &&
|
||||||
!cfg80211_bss_expire_oldest(rdev)) {
|
!cfg80211_bss_expire_oldest(rdev)) {
|
||||||
|
if (!list_empty(&new->hidden_list))
|
||||||
|
list_del(&new->hidden_list);
|
||||||
kfree(new);
|
kfree(new);
|
||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "rdev-ops.h"
|
#include "rdev-ops.h"
|
||||||
|
|
||||||
|
|
||||||
struct ieee80211_rate *
|
const struct ieee80211_rate *
|
||||||
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
|
||||||
u32 basic_rates, int bitrate)
|
u32 basic_rates, int bitrate)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue