Skip to content

Commit 8f691af

Browse files
Zamir, Roeelucacoelho
authored andcommitted
iwlwifi: mvm: add support for oce
Add support for Optimized Connectivity Experience (OCE). Get capabilities from the fw, expose them with nl80211, and enable them in UMAC scan if the relevant nl80211 flags are set by the userspace. Signed-off-by: Roee Zamir <[email protected]> Signed-off-by: Luca Coelho <[email protected]>
1 parent c1a7515 commit 8f691af

File tree

5 files changed

+44
-1
lines changed

5 files changed

+44
-1
lines changed

drivers/net/wireless/intel/iwlwifi/fw/api/scan.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,8 +579,14 @@ enum iwl_umac_scan_general_flags {
579579
IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED = BIT(8),
580580
IWL_UMAC_SCAN_GEN_FLAGS_MATCH = BIT(9),
581581
IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL = BIT(10),
582+
/* Extended dwell is obselete when adaptive dwell is used, making this
583+
* bit reusable. Hence, probe request defer is used only when adaptive
584+
* dwell is supported. */
585+
IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP = BIT(10),
582586
IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED = BIT(11),
583587
IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL = BIT(13),
588+
IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME = BIT(14),
589+
IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE = BIT(15),
584590
};
585591

586592
/**

drivers/net/wireless/intel/iwlwifi/fw/file.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ enum iwl_ucode_tlv_api {
265265
IWL_UCODE_TLV_API_NAN2_VER2 = (__force iwl_ucode_tlv_api_t)31,
266266
/* API Set 1 */
267267
IWL_UCODE_TLV_API_ADAPTIVE_DWELL = (__force iwl_ucode_tlv_api_t)32,
268+
IWL_UCODE_TLV_API_OCE = (__force iwl_ucode_tlv_api_t)33,
268269
IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE = (__force iwl_ucode_tlv_api_t)34,
269270
IWL_UCODE_TLV_API_NEW_RX_STATS = (__force iwl_ucode_tlv_api_t)35,
270271
IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY = (__force iwl_ucode_tlv_api_t)38,

drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,17 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
661661
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
662662
}
663663

664+
if (iwl_mvm_is_oce_supported(mvm)) {
665+
wiphy_ext_feature_set(hw->wiphy,
666+
NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP);
667+
wiphy_ext_feature_set(hw->wiphy,
668+
NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME);
669+
wiphy_ext_feature_set(hw->wiphy,
670+
NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION);
671+
wiphy_ext_feature_set(hw->wiphy,
672+
NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE);
673+
}
674+
664675
mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
665676

666677
#ifdef CONFIG_PM_SLEEP

drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,12 @@ static inline bool iwl_mvm_is_adaptive_dwell_supported(struct iwl_mvm *mvm)
11551155
IWL_UCODE_TLV_API_ADAPTIVE_DWELL);
11561156
}
11571157

1158+
static inline bool iwl_mvm_is_oce_supported(struct iwl_mvm *mvm)
1159+
{
1160+
/* OCE should never be enabled for LMAC scan FWs */
1161+
return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_OCE);
1162+
}
1163+
11581164
static inline bool iwl_mvm_enter_d0i3_on_suspend(struct iwl_mvm *mvm)
11591165
{
11601166
/* For now we only use this mode to differentiate between

drivers/net/wireless/intel/iwlwifi/mvm/scan.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1268,9 +1268,28 @@ static u16 iwl_mvm_scan_umac_flags(struct iwl_mvm *mvm,
12681268
*/
12691269
if (iwl_mvm_is_regular_scan(params) &&
12701270
vif->type != NL80211_IFTYPE_P2P_DEVICE &&
1271-
params->type != IWL_SCAN_TYPE_FRAGMENTED)
1271+
params->type != IWL_SCAN_TYPE_FRAGMENTED &&
1272+
!iwl_mvm_is_adaptive_dwell_supported(mvm) &&
1273+
!iwl_mvm_is_oce_supported(mvm))
12721274
flags |= IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL;
12731275

1276+
if (iwl_mvm_is_oce_supported(mvm)) {
1277+
if ((params->flags &
1278+
NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE))
1279+
flags |= IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE;
1280+
/* Since IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL and
1281+
* NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION shares
1282+
* the same bit, we need to make sure that we use this bit here
1283+
* only when IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL cannot be
1284+
* used. */
1285+
if ((params->flags &
1286+
NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) &&
1287+
!WARN_ON_ONCE(!iwl_mvm_is_adaptive_dwell_supported(mvm)))
1288+
flags |= IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP;
1289+
if ((params->flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME))
1290+
flags |= IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME;
1291+
}
1292+
12741293
return flags;
12751294
}
12761295

0 commit comments

Comments
 (0)