Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1a75153 authored by Zamir, Roee's avatar Zamir, Roee Committed by Luca Coelho
Browse files

iwlwifi: mvm: add adaptive dwell support



Update the scan command API with support for adaptive dwell.  Adaptive
dwell is a type of scan that dynamically changes the time it remains
on each channel listening for beacons or probe responses.

Signed-off-by: default avatarRoee Zamir <roee.zamir@intel.com>
Signed-off-by: default avatarBeni Lev <beni.lev@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 9a233bb8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -110,6 +110,8 @@
#define IWL_MVM_SW_TX_CSUM_OFFLOAD		0
#define IWL_MVM_HW_CSUM_DISABLE			0
#define IWL_MVM_PARSE_NVM			0
#define IWL_MVM_ADWELL_ENABLE			1
#define IWL_MVM_ADWELL_MAX_BUDGET		0
#define IWL_MVM_RS_NUM_TRY_BEFORE_ANT_TOGGLE    1
#define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE      2
#define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE_TW   1
+65 −33
Original line number Diff line number Diff line
@@ -86,6 +86,15 @@ enum iwl_mvm_traffic_load {
#define IWL_SCAN_DWELL_FRAGMENTED	44
#define IWL_SCAN_DWELL_EXTENDED		90

/* adaptive dwell max budget time [TU] for full scan */
#define IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN 300
/* adaptive dwell max budget time [TU] for directed scan */
#define IWL_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN 100
/* adaptive dwell default APs number */
#define IWL_SCAN_ADWELL_DEFAULT_N_APS 2
/* adaptive dwell default APs number in social channels (1, 6, 11) */
#define IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL 10

struct iwl_mvm_scan_timing_params {
	u32 suspend_time;
	u32 max_out_time;
@@ -1115,11 +1124,6 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
{
	struct iwl_mvm_scan_timing_params *timing = &scan_timing[params->type];

	if (iwl_mvm_is_regular_scan(params))
		cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
	else
		cmd->ooc_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_2);

	if (iwl_mvm_is_adaptive_dwell_supported(mvm)) {
		if (params->measurement_dwell) {
			cmd->v7.active_dwell = params->measurement_dwell;
@@ -1129,6 +1133,21 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
			cmd->v7.passive_dwell = IWL_SCAN_DWELL_PASSIVE;
		}
		cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
		cmd->v7.adwell_default_n_aps_social =
			IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL;
		cmd->v7.adwell_default_n_aps =
			IWL_SCAN_ADWELL_DEFAULT_N_APS;

		/* if custom max budget was configured with debugfs */
		if (IWL_MVM_ADWELL_MAX_BUDGET)
			cmd->v7.adwell_max_budget =
				cpu_to_le16(IWL_MVM_ADWELL_MAX_BUDGET);
		else if (params->ssids && params->ssids[0].ssid_len)
			cmd->v7.adwell_max_budget =
				cpu_to_le16(IWL_SCAN_ADWELL_MAX_BUDGET_DIRECTED_SCAN);
		else
			cmd->v7.adwell_max_budget =
				cpu_to_le16(IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN);

		cmd->v7.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
		cmd->v7.max_out_time[SCAN_LB_LMAC_IDX] =
@@ -1136,15 +1155,12 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
		cmd->v7.suspend_time[SCAN_LB_LMAC_IDX] =
			cpu_to_le32(timing->suspend_time);
		if (iwl_mvm_is_cdb_supported(mvm)) {
			cmd->v7.max_out_time[SCAN_HB_LMAC_IDX] =
			cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] =
				cpu_to_le32(timing->max_out_time);
			cmd->v7.suspend_time[SCAN_HB_LMAC_IDX] =
			cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] =
				cpu_to_le32(timing->suspend_time);
		}

		return;
	}

	} else {
		if (params->measurement_dwell) {
			cmd->v1.active_dwell = params->measurement_dwell;
			cmd->v1.passive_dwell = params->measurement_dwell;
@@ -1155,24 +1171,31 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
			cmd->v1.extended_dwell = IWL_SCAN_DWELL_EXTENDED;
		}
		cmd->v1.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
		if (iwl_mvm_is_cdb_supported(mvm)) {
			struct iwl_mvm_scan_timing_params *hb_timing =
				&scan_timing[params->type];

			cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] =
					cpu_to_le32(hb_timing->max_out_time);
			cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] =
					cpu_to_le32(hb_timing->suspend_time);
		}

		if (iwl_mvm_has_new_tx_api(mvm)) {
		cmd->v6.scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
			cmd->v6.scan_priority =
				cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
			cmd->v6.max_out_time[SCAN_LB_LMAC_IDX] =
				cpu_to_le32(timing->max_out_time);
			cmd->v6.suspend_time[SCAN_LB_LMAC_IDX] =
				cpu_to_le32(timing->suspend_time);
		if (iwl_mvm_is_cdb_supported(mvm)) {
			cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] =
				cpu_to_le32(timing->max_out_time);
			cmd->v6.suspend_time[SCAN_HB_LMAC_IDX] =
				cpu_to_le32(timing->suspend_time);
		}
		} else {
		cmd->v1.max_out_time = cpu_to_le32(timing->max_out_time);
		cmd->v1.suspend_time = cpu_to_le32(timing->suspend_time);
			cmd->v1.scan_priority =
				cpu_to_le32(IWL_SCAN_PRIORITY_EXT_6);
			cmd->v1.max_out_time =
				cpu_to_le32(timing->max_out_time);
			cmd->v1.suspend_time =
				cpu_to_le32(timing->suspend_time);
		}
	}
}

@@ -1234,6 +1257,15 @@ static u16 iwl_mvm_scan_umac_flags(struct iwl_mvm *mvm,
	if (mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED)
		flags |= IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE;

	if (iwl_mvm_is_adaptive_dwell_supported(mvm) && IWL_MVM_ADWELL_ENABLE &&
	    vif->type != NL80211_IFTYPE_P2P_DEVICE)
		flags |= IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL;

	/*
	 * Extended dwell is relevant only for low band to start with, as it is
	 * being used for social channles only (1, 6, 11), so we can check
	 * only scan type on low band also for CDB.
	 */
	if (iwl_mvm_is_regular_scan(params) &&
	    vif->type != NL80211_IFTYPE_P2P_DEVICE &&
	    params->type != IWL_SCAN_TYPE_FRAGMENTED)