diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/scan.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 42 | 
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c index 8e0df31f1b3e..1cc9c426bb15 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c @@ -48,6 +48,8 @@  /* Number of iterations on the channel for mei filtered scan */  #define IWL_MEI_SCAN_NUM_ITER	5U +#define WFA_TPC_IE_LEN	9 +  struct iwl_mvm_scan_timing_params {  	u32 suspend_time;  	u32 max_out_time; @@ -303,8 +305,8 @@ static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm)  	max_probe_len = SCAN_OFFLOAD_PROBE_REQ_SIZE; -	/* we create the 802.11 header and SSID element */ -	max_probe_len -= 24 + 2; +	/* we create the 802.11 header SSID element and WFA TPC element */ +	max_probe_len -= 24 + 2 + WFA_TPC_IE_LEN;  	/* DS parameter set element is added on 2.4GHZ band if required */  	if (iwl_mvm_rrm_scan_needed(mvm)) @@ -731,8 +733,6 @@ static u8 *iwl_mvm_copy_and_insert_ds_elem(struct iwl_mvm *mvm, const u8 *ies,  	return newpos;  } -#define WFA_TPC_IE_LEN	9 -  static void iwl_mvm_add_tpc_report_ie(u8 *pos)  {  	pos[0] = WLAN_EID_VENDOR_SPECIFIC; @@ -837,8 +837,8 @@ static inline bool iwl_mvm_scan_fits(struct iwl_mvm *mvm, int n_ssids,  	return ((n_ssids <= PROBE_OPTION_MAX) &&  		(n_channels <= mvm->fw->ucode_capa.n_scan_channels) &  		(ies->common_ie_len + -		 ies->len[NL80211_BAND_2GHZ] + -		 ies->len[NL80211_BAND_5GHZ] <= +		 ies->len[NL80211_BAND_2GHZ] + ies->len[NL80211_BAND_5GHZ] + +		 ies->len[NL80211_BAND_6GHZ] <=  		 iwl_mvm_max_scan_ie_fw_cmd_room(mvm)));  } @@ -1659,6 +1659,17 @@ iwl_mvm_umac_scan_cfg_channels_v7(struct iwl_mvm *mvm,  		cfg->v2.channel_num = channels[i]->hw_value;  		if (cfg80211_channel_is_psc(channels[i]))  			cfg->flags = 0; + +		if (band == NL80211_BAND_6GHZ) { +			/* 6 GHz channels should only appear in a scan request +			 * that has scan_6ghz set. The only exception is MLO +			 * scan, which has to be passive. +			 */ +			WARN_ON_ONCE(cfg->flags != 0); +			cfg->flags = +				cpu_to_le32(IWL_UHB_CHAN_CFG_FLAG_FORCE_PASSIVE); +		} +  		cfg->v2.iter_count = 1;  		cfg->v2.iter_interval = 0;  		if (version < 17) @@ -3168,18 +3179,16 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,  		params.n_channels = j;  	} -	if (non_psc_included && -	    !iwl_mvm_scan_fits(mvm, req->n_ssids, ies, params.n_channels)) { -		kfree(params.channels); -		return -ENOBUFS; +	if (!iwl_mvm_scan_fits(mvm, req->n_ssids, ies, params.n_channels)) { +		ret = -ENOBUFS; +		goto out;  	}  	uid = iwl_mvm_build_scan_cmd(mvm, vif, &hcmd, ¶ms, type); - -	if (non_psc_included) -		kfree(params.channels); -	if (uid < 0) -		return uid; +	if (uid < 0) { +		ret = uid; +		goto out; +	}  	ret = iwl_mvm_send_cmd(mvm, &hcmd);  	if (!ret) { @@ -3197,6 +3206,9 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,  		mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED;  	} +out: +	if (non_psc_included) +		kfree(params.channels);  	return ret;  }  | 
