diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/scan.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 58 | 
1 files changed, 40 insertions, 18 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c index 09eb72c4ae43..6f609dd5c222 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c @@ -70,6 +70,7 @@  #include "mvm.h"  #include "fw-api-scan.h" +#include "iwl-io.h"  #define IWL_DENSE_EBS_SCAN_RATIO 5  #define IWL_SPARSE_EBS_SCAN_RATIO 1 @@ -162,16 +163,16 @@ static inline __le16 iwl_mvm_scan_rx_chain(struct iwl_mvm *mvm)  	return cpu_to_le16(rx_chain);  } -static __le32 iwl_mvm_scan_rxon_flags(enum ieee80211_band band) +static __le32 iwl_mvm_scan_rxon_flags(enum nl80211_band band)  { -	if (band == IEEE80211_BAND_2GHZ) +	if (band == NL80211_BAND_2GHZ)  		return cpu_to_le32(PHY_BAND_24);  	else  		return cpu_to_le32(PHY_BAND_5);  }  static inline __le32 -iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum ieee80211_band band, +iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum nl80211_band band,  			  bool no_cck)  {  	u32 tx_ant; @@ -181,7 +182,7 @@ iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum ieee80211_band band,  				     mvm->scan_last_antenna_idx);  	tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS; -	if (band == IEEE80211_BAND_2GHZ && !no_cck) +	if (band == NL80211_BAND_2GHZ && !no_cck)  		return cpu_to_le32(IWL_RATE_1M_PLCP | RATE_MCS_CCK_MSK |  				   tx_ant);  	else @@ -398,6 +399,10 @@ void iwl_mvm_rx_lmac_scan_complete_notif(struct iwl_mvm *mvm,  		ieee80211_scan_completed(mvm->hw,  				scan_notif->status == IWL_SCAN_OFFLOAD_ABORTED);  		iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); +		del_timer(&mvm->scan_timer); +	} else { +		IWL_ERR(mvm, +			"got scan complete notification but no scan is running\n");  	}  	mvm->last_ebs_successful = @@ -586,14 +591,14 @@ static void iwl_mvm_scan_fill_tx_cmd(struct iwl_mvm *mvm,  	tx_cmd[0].tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL |  					 TX_CMD_FLG_BT_DIS);  	tx_cmd[0].rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, -							   IEEE80211_BAND_2GHZ, +							   NL80211_BAND_2GHZ,  							   no_cck);  	tx_cmd[0].sta_id = mvm->aux_sta.sta_id;  	tx_cmd[1].tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL |  					 TX_CMD_FLG_BT_DIS);  	tx_cmd[1].rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, -							   IEEE80211_BAND_5GHZ, +							   NL80211_BAND_5GHZ,  							   no_cck);  	tx_cmd[1].sta_id = mvm->aux_sta.sta_id;  } @@ -690,19 +695,19 @@ iwl_mvm_build_scan_probe(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	/* Insert ds parameter set element on 2.4 GHz band */  	newpos = iwl_mvm_copy_and_insert_ds_elem(mvm, -						 ies->ies[IEEE80211_BAND_2GHZ], -						 ies->len[IEEE80211_BAND_2GHZ], +						 ies->ies[NL80211_BAND_2GHZ], +						 ies->len[NL80211_BAND_2GHZ],  						 pos);  	params->preq.band_data[0].offset = cpu_to_le16(pos - params->preq.buf);  	params->preq.band_data[0].len = cpu_to_le16(newpos - pos);  	pos = newpos; -	memcpy(pos, ies->ies[IEEE80211_BAND_5GHZ], -	       ies->len[IEEE80211_BAND_5GHZ]); +	memcpy(pos, ies->ies[NL80211_BAND_5GHZ], +	       ies->len[NL80211_BAND_5GHZ]);  	params->preq.band_data[1].offset = cpu_to_le16(pos - params->preq.buf);  	params->preq.band_data[1].len = -		cpu_to_le16(ies->len[IEEE80211_BAND_5GHZ]); -	pos += ies->len[IEEE80211_BAND_5GHZ]; +		cpu_to_le16(ies->len[NL80211_BAND_5GHZ]); +	pos += ies->len[NL80211_BAND_5GHZ];  	memcpy(pos, ies->common_ies, ies->common_ie_len);  	params->preq.common_data.offset = cpu_to_le16(pos - params->preq.buf); @@ -916,10 +921,10 @@ static __le32 iwl_mvm_scan_config_rates(struct iwl_mvm *mvm)  	unsigned int rates = 0;  	int i; -	band = &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; +	band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ];  	for (i = 0; i < band->n_bitrates; i++)  		rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); -	band = &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; +	band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ];  	for (i = 0; i < band->n_bitrates; i++)  		rates |= rate_to_scan_rate_flag(band->bitrates[i].hw_value); @@ -934,8 +939,8 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)  	struct iwl_scan_config *scan_config;  	struct ieee80211_supported_band *band;  	int num_channels = -		mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels + -		mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; +		mvm->nvm_data->bands[NL80211_BAND_2GHZ].n_channels + +		mvm->nvm_data->bands[NL80211_BAND_5GHZ].n_channels;  	int ret, i, j = 0, cmd_size;  	struct iwl_host_cmd cmd = {  		.id = iwl_cmd_id(SCAN_CFG_CMD, IWL_ALWAYS_LONG_GROUP, 0), @@ -961,6 +966,7 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)  					 SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS |  					 SCAN_CONFIG_FLAG_SET_TX_CHAINS |  					 SCAN_CONFIG_FLAG_SET_RX_CHAINS | +					 SCAN_CONFIG_FLAG_SET_AUX_STA_ID |  					 SCAN_CONFIG_FLAG_SET_ALL_TIMES |  					 SCAN_CONFIG_FLAG_SET_LEGACY_RATES |  					 SCAN_CONFIG_FLAG_SET_MAC_ADDR | @@ -988,10 +994,10 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)  				     IWL_CHANNEL_FLAG_EBS_ADD |  				     IWL_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE; -	band = &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; +	band = &mvm->nvm_data->bands[NL80211_BAND_2GHZ];  	for (i = 0; i < band->n_channels; i++, j++)  		scan_config->channel_array[j] = band->channels[i].hw_value; -	band = &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; +	band = &mvm->nvm_data->bands[NL80211_BAND_5GHZ];  	for (i = 0; i < band->n_channels; i++, j++)  		scan_config->channel_array[j] = band->channels[i].hw_value; @@ -1216,6 +1222,18 @@ static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type)  	return -EIO;  } +#define SCAN_TIMEOUT (16 * HZ) + +void iwl_mvm_scan_timeout(unsigned long data) +{ +	struct iwl_mvm *mvm = (struct iwl_mvm *)data; + +	IWL_ERR(mvm, "regular scan timed out\n"); + +	del_timer(&mvm->scan_timer); +	iwl_force_nmi(mvm->trans); +} +  int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  			   struct cfg80211_scan_request *req,  			   struct ieee80211_scan_ies *ies) @@ -1295,6 +1313,8 @@ int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	mvm->scan_status |= IWL_MVM_SCAN_REGULAR;  	iwl_mvm_ref(mvm, IWL_MVM_REF_SCAN); +	mod_timer(&mvm->scan_timer, jiffies + SCAN_TIMEOUT); +  	return 0;  } @@ -1412,6 +1432,7 @@ void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm,  	if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_REGULAR) {  		ieee80211_scan_completed(mvm->hw, aborted);  		iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); +		del_timer(&mvm->scan_timer);  	} else if (mvm->scan_uid_status[uid] == IWL_MVM_SCAN_SCHED) {  		ieee80211_sched_scan_stopped(mvm->hw);  		mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_DISABLED; @@ -1607,6 +1628,7 @@ out:  		 * to release the scan reference here.  		 */  		iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); +		del_timer(&mvm->scan_timer);  		if (notify)  			ieee80211_scan_completed(mvm->hw, true);  	} else if (notify) {  |