iwlwifi: rs-fw: support dcm
authorNaftali Goldstein <naftali.goldstein@intel.com>
Tue, 1 May 2018 11:40:44 +0000 (14:40 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 31 Aug 2018 08:38:40 +0000 (11:38 +0300)
Add flags to the tlc_cfg_cmd for signaling peer support for receiving
Dual Carrier Modulation at BPSK (MCS 0), and set them according to peer
capabilities.

Signed-off-by: Naftali Goldstein <naftali.goldstein@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/rs.h
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c

index 955f2c3..9eddc4d 100644 (file)
  * @IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK: enable LDPC
  * @IWL_TLC_MNG_CFG_FLAGS_HE_STBC_160MHZ_MSK: enable STBC in HE at 160MHz
  *                                           bandwidth
+ * @IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_1_MSK: enable HE Dual Carrier Modulation
+ *                                         for BPSK (MCS 0) with 1 spatial
+ *                                         stream
+ * @IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_2_MSK: enable HE Dual Carrier Modulation
+ *                                         for BPSK (MCS 0) with 2 spatial
+ *                                         streams
  */
 enum iwl_tlc_mng_cfg_flags {
        IWL_TLC_MNG_CFG_FLAGS_STBC_MSK                  = BIT(0),
        IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK                  = BIT(1),
        IWL_TLC_MNG_CFG_FLAGS_HE_STBC_160MHZ_MSK        = BIT(2),
+       IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_1_MSK          = BIT(3),
+       IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_2_MSK          = BIT(4),
 };
 
 /**
index f00ff46..7a98e1a 100644 (file)
@@ -143,6 +143,16 @@ static u16 rs_fw_set_config_flags(struct iwl_mvm *mvm,
             (vht_ena && (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC))))
                flags |= IWL_TLC_MNG_CFG_FLAGS_LDPC_MSK;
 
+       if (he_cap && he_cap->has_he &&
+           (he_cap->he_cap_elem.phy_cap_info[3] &
+            IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK)) {
+               flags |= IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_1_MSK;
+
+               if (he_cap->he_cap_elem.phy_cap_info[3] &
+                   IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_2)
+                       flags |= IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_2_MSK;
+       }
+
        return flags;
 }