iwlmvm: set properly NIC_NOT_ACK_ENABLED flag
authorShaul Triebitz <shaul.triebitz@intel.com>
Wed, 10 Feb 2021 15:15:13 +0000 (17:15 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 10 Feb 2021 23:52:11 +0000 (01:52 +0200)
The STA_CTXT_HE_NIC_NOT_ACK_ENABLED flag tells the firmware
whether *we* support ack-enabled.
So what should be checked is our *own* capability and not
the *peer's* capability.

Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210210171218.59f44e210096.I8f31968f6f7303255e212d869ca0131becd309aa@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/mac.h
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 2d03d7b..93084bb 100644 (file)
@@ -452,6 +452,10 @@ struct iwl_he_pkt_ext {
  *     enabled AGG, i.e. both BACK and non-BACK frames in a single AGG
  * @STA_CTXT_HE_MU_EDCA_CW: indicates that there is an element of MU EDCA
  *     parameter set, i.e. the backoff counters for trig-based ACs
+ * @STA_CTXT_HE_NIC_NOT_ACK_ENABLED: mark that the NIC doesn't support receiving
+ *     ACK-enabled AGG, (i.e. both BACK and non-BACK frames in single AGG).
+ *     If the NIC is not ACK_ENABLED it may use the EOF-bit in first non-0
+ *     len delim to determine if AGG or single.
  * @STA_CTXT_HE_RU_2MHZ_BLOCK: indicates that 26-tone RU OFDMA transmission are
  *      not allowed (as there are OBSS that might classify such transmissions as
  *      radar pulses).
@@ -466,6 +470,7 @@ enum iwl_he_sta_ctxt_flags {
        STA_CTXT_HE_CONST_TRIG_RND_ALLOC        = BIT(10),
        STA_CTXT_HE_ACK_ENABLED                 = BIT(11),
        STA_CTXT_HE_MU_EDCA_CW                  = BIT(12),
+       STA_CTXT_HE_NIC_NOT_ACK_ENABLED         = BIT(13),
        STA_CTXT_HE_RU_2MHZ_BLOCK               = BIT(14),
 };
 
index aca1ccd..e1f5a97 100644 (file)
@@ -80,4 +80,5 @@ void iwl_nvm_fixups(u32 hw_id, unsigned int section, u8 *data,
  */
 struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
                                 const struct iwl_fw *fw);
+
 #endif /* __iwl_nvm_parse_h__ */
index 6704ad0..baf7404 100644 (file)
@@ -2007,9 +2007,21 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
        struct ieee80211_sta *sta;
        u32 flags;
        int i;
+       const struct ieee80211_sta_he_cap *own_he_cap = NULL;
+       struct ieee80211_chanctx_conf *chanctx_conf;
+       const struct ieee80211_supported_band *sband;
 
        rcu_read_lock();
 
+       chanctx_conf = rcu_dereference(vif->chanctx_conf);
+       if (WARN_ON(!chanctx_conf)) {
+               rcu_read_unlock();
+               return;
+       }
+
+       sband = mvm->hw->wiphy->bands[chanctx_conf->def.chan->band];
+       own_he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
+
        sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_ctxt_cmd.sta_id]);
        if (IS_ERR_OR_NULL(sta)) {
                rcu_read_unlock();
@@ -2196,6 +2208,10 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
                        (vif->bss_conf.uora_ocw_range >> 3) & 0x7;
        }
 
+       if (own_he_cap && !(own_he_cap->he_cap_elem.mac_cap_info[2] &
+                           IEEE80211_HE_MAC_CAP2_ACK_EN))
+               flags |= STA_CTXT_HE_NIC_NOT_ACK_ENABLED;
+
        if (vif->bss_conf.nontransmitted) {
                flags |= STA_CTXT_HE_REF_BSSID_VALID;
                ether_addr_copy(sta_ctxt_cmd.ref_bssid_addr,