diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-fw-file.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h | 35 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.c | 157 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.h | 4 |
5 files changed, 177 insertions, 28 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/iwlwifi/iwl-fw-file.h index e4f589898eda..016d91384681 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h +++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h | |||
@@ -270,6 +270,7 @@ enum iwl_ucode_tlv_api { | |||
270 | * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3 | 270 | * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3 |
271 | * @IWL_UCODE_TLV_CAPA_LAR_SUPPORT: supports Location Aware Regulatory | 271 | * @IWL_UCODE_TLV_CAPA_LAR_SUPPORT: supports Location Aware Regulatory |
272 | * @IWL_UCODE_TLV_CAPA_UMAC_SCAN: supports UMAC scan. | 272 | * @IWL_UCODE_TLV_CAPA_UMAC_SCAN: supports UMAC scan. |
273 | * @IWL_UCODE_TLV_CAPA_BEAMFORMER: supports Beamformer | ||
273 | * @IWL_UCODE_TLV_CAPA_TDLS_SUPPORT: support basic TDLS functionality | 274 | * @IWL_UCODE_TLV_CAPA_TDLS_SUPPORT: support basic TDLS functionality |
274 | * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current | 275 | * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current |
275 | * tx power value into TPC Report action frame and Link Measurement Report | 276 | * tx power value into TPC Report action frame and Link Measurement Report |
@@ -288,6 +289,7 @@ enum iwl_ucode_tlv_capa { | |||
288 | IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0), | 289 | IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0), |
289 | IWL_UCODE_TLV_CAPA_LAR_SUPPORT = BIT(1), | 290 | IWL_UCODE_TLV_CAPA_LAR_SUPPORT = BIT(1), |
290 | IWL_UCODE_TLV_CAPA_UMAC_SCAN = BIT(2), | 291 | IWL_UCODE_TLV_CAPA_UMAC_SCAN = BIT(2), |
292 | IWL_UCODE_TLV_CAPA_BEAMFORMER = BIT(3), | ||
291 | IWL_UCODE_TLV_CAPA_TDLS_SUPPORT = BIT(6), | 293 | IWL_UCODE_TLV_CAPA_TDLS_SUPPORT = BIT(6), |
292 | IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8), | 294 | IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8), |
293 | IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = BIT(9), | 295 | IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = BIT(9), |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h index 6a2a6b0ab91b..4c33f2775dc9 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h | |||
@@ -308,16 +308,33 @@ enum { | |||
308 | #define LQ_FLAG_DYNAMIC_BW_POS 6 | 308 | #define LQ_FLAG_DYNAMIC_BW_POS 6 |
309 | #define LQ_FLAG_DYNAMIC_BW_MSK (1 << LQ_FLAG_DYNAMIC_BW_POS) | 309 | #define LQ_FLAG_DYNAMIC_BW_MSK (1 << LQ_FLAG_DYNAMIC_BW_POS) |
310 | 310 | ||
311 | /* Single Stream Parameters | 311 | /* Single Stream Tx Parameters (lq_cmd->ss_params) |
312 | * SS_STBC/BFER_ALLOWED - Controls whether STBC or Beamformer (BFER) is allowed | 312 | * Flags to control a smart FW decision about whether BFER/STBC/SISO will be |
313 | * ucode will make a smart decision between SISO/STBC/BFER | 313 | * used for single stream Tx. |
314 | * SS_PARAMS_VALID - if not set ignore the ss_params field. | ||
315 | */ | 314 | */ |
316 | enum { | 315 | |
317 | RS_SS_STBC_ALLOWED = BIT(0), | 316 | /* Bit 0-1: Max STBC streams allowed. Can be 0-3. |
318 | RS_SS_BFER_ALLOWED = BIT(1), | 317 | * (0) - No STBC allowed |
319 | RS_SS_PARAMS_VALID = BIT(31), | 318 | * (1) - 2x1 STBC allowed (HT/VHT) |
320 | }; | 319 | * (2) - 4x2 STBC allowed (HT/VHT) |
320 | * (3) - 3x2 STBC allowed (HT only) | ||
321 | * All our chips are at most 2 antennas so only (1) is valid for now. | ||
322 | */ | ||
323 | #define LQ_SS_STBC_ALLOWED_POS 0 | ||
324 | #define LQ_SS_STBC_ALLOWED_MSK (3 << LQ_SS_STBC_ALLOWED_MSK) | ||
325 | |||
326 | /* 2x1 STBC is allowed */ | ||
327 | #define LQ_SS_STBC_1SS_ALLOWED (1 << LQ_SS_STBC_ALLOWED_POS) | ||
328 | |||
329 | /* Bit 2: Beamformer (VHT only) is allowed */ | ||
330 | #define LQ_SS_BFER_ALLOWED_POS 2 | ||
331 | #define LQ_SS_BFER_ALLOWED (1 << LQ_SS_BFER_ALLOWED_POS) | ||
332 | |||
333 | /* Bit 31: ss_params field is valid. Used for FW backward compatibility | ||
334 | * with other drivers which don't support the ss_params API yet | ||
335 | */ | ||
336 | #define LQ_SS_PARAMS_VALID_POS 31 | ||
337 | #define LQ_SS_PARAMS_VALID (1 << LQ_SS_PARAMS_VALID_POS) | ||
321 | 338 | ||
322 | /** | 339 | /** |
323 | * struct iwl_lq_cmd - link quality command | 340 | * struct iwl_lq_cmd - link quality command |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index cfd7bfcb3fc6..51e02e6ba0ac 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
@@ -401,10 +401,15 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) | |||
401 | if (mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels) | 401 | if (mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels) |
402 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = | 402 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = |
403 | &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; | 403 | &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; |
404 | if (mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels) | 404 | if (mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels) { |
405 | hw->wiphy->bands[IEEE80211_BAND_5GHZ] = | 405 | hw->wiphy->bands[IEEE80211_BAND_5GHZ] = |
406 | &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; | 406 | &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; |
407 | 407 | ||
408 | if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_BEAMFORMER) | ||
409 | hw->wiphy->bands[IEEE80211_BAND_5GHZ]->vht_cap.cap |= | ||
410 | IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE; | ||
411 | } | ||
412 | |||
408 | hw->wiphy->hw_version = mvm->trans->hw_id; | 413 | hw->wiphy->hw_version = mvm->trans->hw_id; |
409 | 414 | ||
410 | if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM) | 415 | if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM) |
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c index 9f32f2db95bd..95b718b4f8ab 100644 --- a/drivers/net/wireless/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c | |||
@@ -1805,7 +1805,7 @@ static bool rs_stbc_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
1805 | /* Our chip supports Tx STBC and the peer is an HT/VHT STA which | 1805 | /* Our chip supports Tx STBC and the peer is an HT/VHT STA which |
1806 | * supports STBC of at least 1*SS | 1806 | * supports STBC of at least 1*SS |
1807 | */ | 1807 | */ |
1808 | if (!lq_sta->stbc) | 1808 | if (!lq_sta->stbc_capable) |
1809 | return false; | 1809 | return false; |
1810 | 1810 | ||
1811 | if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) | 1811 | if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) |
@@ -2626,7 +2626,7 @@ static void rs_ht_init(struct iwl_mvm *mvm, | |||
2626 | if (mvm->cfg->ht_params->stbc && | 2626 | if (mvm->cfg->ht_params->stbc && |
2627 | (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && | 2627 | (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && |
2628 | (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC)) | 2628 | (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC)) |
2629 | lq_sta->stbc = true; | 2629 | lq_sta->stbc_capable = true; |
2630 | 2630 | ||
2631 | lq_sta->is_vht = false; | 2631 | lq_sta->is_vht = false; |
2632 | } | 2632 | } |
@@ -2645,7 +2645,12 @@ static void rs_vht_init(struct iwl_mvm *mvm, | |||
2645 | if (mvm->cfg->ht_params->stbc && | 2645 | if (mvm->cfg->ht_params->stbc && |
2646 | (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && | 2646 | (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && |
2647 | (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK)) | 2647 | (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK)) |
2648 | lq_sta->stbc = true; | 2648 | lq_sta->stbc_capable = true; |
2649 | |||
2650 | if ((mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_BEAMFORMER) && | ||
2651 | (num_of_ant(iwl_mvm_get_valid_tx_ant(mvm)) > 1) && | ||
2652 | (vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) | ||
2653 | lq_sta->bfer_capable = true; | ||
2649 | 2654 | ||
2650 | lq_sta->is_vht = true; | 2655 | lq_sta->is_vht = true; |
2651 | } | 2656 | } |
@@ -2778,11 +2783,12 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
2778 | rs_get_max_rate_from_mask(lq_sta->active_mimo2_rate); | 2783 | rs_get_max_rate_from_mask(lq_sta->active_mimo2_rate); |
2779 | 2784 | ||
2780 | IWL_DEBUG_RATE(mvm, | 2785 | IWL_DEBUG_RATE(mvm, |
2781 | "RATE MASK: LEGACY=%lX SISO=%lX MIMO2=%lX VHT=%d LDPC=%d STBC=%d\n", | 2786 | "LEGACY=%lX SISO=%lX MIMO2=%lX VHT=%d LDPC=%d STBC=%d BFER=%d\n", |
2782 | lq_sta->active_legacy_rate, | 2787 | lq_sta->active_legacy_rate, |
2783 | lq_sta->active_siso_rate, | 2788 | lq_sta->active_siso_rate, |
2784 | lq_sta->active_mimo2_rate, | 2789 | lq_sta->active_mimo2_rate, |
2785 | lq_sta->is_vht, lq_sta->ldpc, lq_sta->stbc); | 2790 | lq_sta->is_vht, lq_sta->ldpc, lq_sta->stbc_capable, |
2791 | lq_sta->bfer_capable); | ||
2786 | IWL_DEBUG_RATE(mvm, "MAX RATE: LEGACY=%d SISO=%d MIMO2=%d\n", | 2792 | IWL_DEBUG_RATE(mvm, "MAX RATE: LEGACY=%d SISO=%d MIMO2=%d\n", |
2787 | lq_sta->max_legacy_rate_idx, | 2793 | lq_sta->max_legacy_rate_idx, |
2788 | lq_sta->max_siso_rate_idx, | 2794 | lq_sta->max_siso_rate_idx, |
@@ -2916,23 +2922,15 @@ static void rs_build_rates_table(struct iwl_mvm *mvm, | |||
2916 | u8 valid_tx_ant = 0; | 2922 | u8 valid_tx_ant = 0; |
2917 | struct iwl_lq_cmd *lq_cmd = &lq_sta->lq; | 2923 | struct iwl_lq_cmd *lq_cmd = &lq_sta->lq; |
2918 | bool toggle_ant = false; | 2924 | bool toggle_ant = false; |
2919 | bool stbc_allowed = false; | ||
2920 | 2925 | ||
2921 | memcpy(&rate, initial_rate, sizeof(rate)); | 2926 | memcpy(&rate, initial_rate, sizeof(rate)); |
2922 | 2927 | ||
2923 | valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm); | 2928 | valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm); |
2924 | 2929 | ||
2925 | stbc_allowed = rs_stbc_allow(mvm, sta, lq_sta); | 2930 | /* TODO: remove old API when min FW API hits 14 */ |
2926 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LQ_SS_PARAMS) { | 2931 | if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LQ_SS_PARAMS) && |
2927 | u32 ss_params = RS_SS_PARAMS_VALID; | 2932 | rs_stbc_allow(mvm, sta, lq_sta)) |
2928 | 2933 | rate.stbc = true; | |
2929 | if (stbc_allowed) | ||
2930 | ss_params |= RS_SS_STBC_ALLOWED; | ||
2931 | lq_cmd->ss_params = cpu_to_le32(ss_params); | ||
2932 | } else { | ||
2933 | /* TODO: remove old API when min FW API hits 14 */ | ||
2934 | rate.stbc = stbc_allowed; | ||
2935 | } | ||
2936 | 2934 | ||
2937 | if (is_siso(&rate)) { | 2935 | if (is_siso(&rate)) { |
2938 | num_rates = IWL_MVM_RS_INITIAL_SISO_NUM_RATES; | 2936 | num_rates = IWL_MVM_RS_INITIAL_SISO_NUM_RATES; |
@@ -2980,6 +2978,128 @@ static void rs_build_rates_table(struct iwl_mvm *mvm, | |||
2980 | 2978 | ||
2981 | } | 2979 | } |
2982 | 2980 | ||
2981 | struct rs_bfer_active_iter_data { | ||
2982 | struct ieee80211_sta *exclude_sta; | ||
2983 | struct iwl_mvm_sta *bfer_mvmsta; | ||
2984 | }; | ||
2985 | |||
2986 | static void rs_bfer_active_iter(void *_data, | ||
2987 | struct ieee80211_sta *sta) | ||
2988 | { | ||
2989 | struct rs_bfer_active_iter_data *data = _data; | ||
2990 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
2991 | struct iwl_lq_cmd *lq_cmd = &mvmsta->lq_sta.lq; | ||
2992 | u32 ss_params = le32_to_cpu(lq_cmd->ss_params); | ||
2993 | |||
2994 | if (sta == data->exclude_sta) | ||
2995 | return; | ||
2996 | |||
2997 | /* The current sta has BFER allowed */ | ||
2998 | if (ss_params & LQ_SS_BFER_ALLOWED) { | ||
2999 | WARN_ON_ONCE(data->bfer_mvmsta != NULL); | ||
3000 | |||
3001 | data->bfer_mvmsta = mvmsta; | ||
3002 | } | ||
3003 | } | ||
3004 | |||
3005 | static int rs_bfer_priority(struct iwl_mvm_sta *sta) | ||
3006 | { | ||
3007 | int prio = -1; | ||
3008 | enum nl80211_iftype viftype = ieee80211_vif_type_p2p(sta->vif); | ||
3009 | |||
3010 | switch (viftype) { | ||
3011 | case NL80211_IFTYPE_AP: | ||
3012 | case NL80211_IFTYPE_P2P_GO: | ||
3013 | prio = 3; | ||
3014 | break; | ||
3015 | case NL80211_IFTYPE_P2P_CLIENT: | ||
3016 | prio = 2; | ||
3017 | break; | ||
3018 | case NL80211_IFTYPE_STATION: | ||
3019 | prio = 1; | ||
3020 | break; | ||
3021 | default: | ||
3022 | WARN_ONCE(true, "viftype %d sta_id %d", viftype, sta->sta_id); | ||
3023 | prio = -1; | ||
3024 | } | ||
3025 | |||
3026 | return prio; | ||
3027 | } | ||
3028 | |||
3029 | /* Returns >0 if sta1 has a higher BFER priority compared to sta2 */ | ||
3030 | static int rs_bfer_priority_cmp(struct iwl_mvm_sta *sta1, | ||
3031 | struct iwl_mvm_sta *sta2) | ||
3032 | { | ||
3033 | int prio1 = rs_bfer_priority(sta1); | ||
3034 | int prio2 = rs_bfer_priority(sta2); | ||
3035 | |||
3036 | if (prio1 > prio2) | ||
3037 | return 1; | ||
3038 | if (prio1 < prio2) | ||
3039 | return -1; | ||
3040 | return 0; | ||
3041 | } | ||
3042 | |||
3043 | static void rs_set_lq_ss_params(struct iwl_mvm *mvm, | ||
3044 | struct ieee80211_sta *sta, | ||
3045 | struct iwl_lq_sta *lq_sta, | ||
3046 | const struct rs_rate *initial_rate) | ||
3047 | { | ||
3048 | struct iwl_lq_cmd *lq_cmd = &lq_sta->lq; | ||
3049 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
3050 | struct rs_bfer_active_iter_data data = { | ||
3051 | .exclude_sta = sta, | ||
3052 | .bfer_mvmsta = NULL, | ||
3053 | }; | ||
3054 | struct iwl_mvm_sta *bfer_mvmsta = NULL; | ||
3055 | u32 ss_params = LQ_SS_PARAMS_VALID; | ||
3056 | |||
3057 | if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) | ||
3058 | goto out; | ||
3059 | |||
3060 | if (lq_sta->stbc_capable) | ||
3061 | ss_params |= LQ_SS_STBC_1SS_ALLOWED; | ||
3062 | |||
3063 | if (!lq_sta->bfer_capable) | ||
3064 | goto out; | ||
3065 | |||
3066 | ieee80211_iterate_stations_atomic(mvm->hw, | ||
3067 | rs_bfer_active_iter, | ||
3068 | &data); | ||
3069 | bfer_mvmsta = data.bfer_mvmsta; | ||
3070 | |||
3071 | /* This code is safe as it doesn't run concurrently for different | ||
3072 | * stations. This is guaranteed by the fact that calls to | ||
3073 | * ieee80211_tx_status wouldn't run concurrently for a single HW. | ||
3074 | */ | ||
3075 | if (!bfer_mvmsta) { | ||
3076 | IWL_DEBUG_RATE(mvm, "No sta with BFER allowed found. Allow\n"); | ||
3077 | |||
3078 | ss_params |= LQ_SS_BFER_ALLOWED; | ||
3079 | goto out; | ||
3080 | } | ||
3081 | |||
3082 | IWL_DEBUG_RATE(mvm, "Found existing sta %d with BFER activated\n", | ||
3083 | bfer_mvmsta->sta_id); | ||
3084 | |||
3085 | /* Disallow BFER on another STA if active and we're a higher priority */ | ||
3086 | if (rs_bfer_priority_cmp(mvmsta, bfer_mvmsta) > 0) { | ||
3087 | struct iwl_lq_cmd *bfersta_lq_cmd = &bfer_mvmsta->lq_sta.lq; | ||
3088 | u32 bfersta_ss_params = le32_to_cpu(bfersta_lq_cmd->ss_params); | ||
3089 | |||
3090 | bfersta_ss_params &= ~LQ_SS_BFER_ALLOWED; | ||
3091 | bfersta_lq_cmd->ss_params = cpu_to_le32(bfersta_ss_params); | ||
3092 | iwl_mvm_send_lq_cmd(mvm, bfersta_lq_cmd, false); | ||
3093 | |||
3094 | ss_params |= LQ_SS_BFER_ALLOWED; | ||
3095 | IWL_DEBUG_RATE(mvm, | ||
3096 | "Lower priority BFER sta found (%d). Switch BFER\n", | ||
3097 | bfer_mvmsta->sta_id); | ||
3098 | } | ||
3099 | out: | ||
3100 | lq_cmd->ss_params = cpu_to_le32(ss_params); | ||
3101 | } | ||
3102 | |||
2983 | static void rs_fill_lq_cmd(struct iwl_mvm *mvm, | 3103 | static void rs_fill_lq_cmd(struct iwl_mvm *mvm, |
2984 | struct ieee80211_sta *sta, | 3104 | struct ieee80211_sta *sta, |
2985 | struct iwl_lq_sta *lq_sta, | 3105 | struct iwl_lq_sta *lq_sta, |
@@ -3006,6 +3126,9 @@ static void rs_fill_lq_cmd(struct iwl_mvm *mvm, | |||
3006 | 3126 | ||
3007 | rs_build_rates_table(mvm, sta, lq_sta, initial_rate); | 3127 | rs_build_rates_table(mvm, sta, lq_sta, initial_rate); |
3008 | 3128 | ||
3129 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LQ_SS_PARAMS) | ||
3130 | rs_set_lq_ss_params(mvm, sta, lq_sta, initial_rate); | ||
3131 | |||
3009 | if (num_of_ant(initial_rate->ant) == 1) | 3132 | if (num_of_ant(initial_rate->ant) == 1) |
3010 | lq_cmd->single_stream_ant_msk = initial_rate->ant; | 3133 | lq_cmd->single_stream_ant_msk = initial_rate->ant; |
3011 | 3134 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.h b/drivers/net/wireless/iwlwifi/mvm/rs.h index f8f5bf21cc38..ba57f5ae2375 100644 --- a/drivers/net/wireless/iwlwifi/mvm/rs.h +++ b/drivers/net/wireless/iwlwifi/mvm/rs.h | |||
@@ -293,7 +293,9 @@ struct iwl_lq_sta { | |||
293 | u64 last_tx; | 293 | u64 last_tx; |
294 | bool is_vht; | 294 | bool is_vht; |
295 | bool ldpc; /* LDPC Rx is supported by the STA */ | 295 | bool ldpc; /* LDPC Rx is supported by the STA */ |
296 | bool stbc; /* Tx STBC is supported by chip and Rx by STA */ | 296 | bool stbc_capable; /* Tx STBC is supported by chip and Rx by STA */ |
297 | bool bfer_capable; /* Remote supports beamformee and we BFer */ | ||
298 | |||
297 | enum ieee80211_band band; | 299 | enum ieee80211_band band; |
298 | 300 | ||
299 | /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ | 301 | /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ |