aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
diff options
context:
space:
mode:
authorAvraham Stern <avraham.stern@intel.com>2015-11-26 04:22:33 -0500
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-12-13 01:21:41 -0500
commit355346ba3050f42dc33663d7dd6cba055ba31924 (patch)
tree1209d1bcc2d9536456f888358af4d86f327cebe5 /drivers/net/wireless/intel/iwlwifi/mvm/scan.c
parentcf0cda191074fba464999ef29eb654cdab909e66 (diff)
iwlwifi: mvm: configure scheduled scan according to traffic conditions
Change scan configuration (dwell time, suspend time etc.) according to traffic conditions. This is useful for scans that are managed by the FW (e.g. scheduled scan). Signed-off-by: Avraham Stern <avraham.stern@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/scan.c')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/scan.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index 7cbfb085f60b..4887418b6ad3 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -72,13 +72,6 @@
72#define IWL_DENSE_EBS_SCAN_RATIO 5 72#define IWL_DENSE_EBS_SCAN_RATIO 5
73#define IWL_SPARSE_EBS_SCAN_RATIO 1 73#define IWL_SPARSE_EBS_SCAN_RATIO 1
74 74
75enum iwl_mvm_scan_type {
76 IWL_SCAN_TYPE_UNASSOC,
77 IWL_SCAN_TYPE_WILD,
78 IWL_SCAN_TYPE_MILD,
79 IWL_SCAN_TYPE_FRAGMENTED,
80};
81
82enum iwl_mvm_traffic_load { 75enum iwl_mvm_traffic_load {
83 IWL_MVM_TRAFFIC_LOW, 76 IWL_MVM_TRAFFIC_LOW,
84 IWL_MVM_TRAFFIC_MEDIUM, 77 IWL_MVM_TRAFFIC_MEDIUM,
@@ -206,9 +199,7 @@ static enum iwl_mvm_traffic_load iwl_mvm_get_traffic_load(struct iwl_mvm *mvm)
206} 199}
207 200
208static enum 201static enum
209iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm, 202iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm, bool p2p_device)
210 struct ieee80211_vif *vif,
211 struct iwl_mvm_scan_params *params)
212{ 203{
213 int global_cnt = 0; 204 int global_cnt = 0;
214 enum iwl_mvm_traffic_load load; 205 enum iwl_mvm_traffic_load load;
@@ -224,8 +215,7 @@ iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm,
224 load = iwl_mvm_get_traffic_load(mvm); 215 load = iwl_mvm_get_traffic_load(mvm);
225 low_latency = iwl_mvm_low_latency(mvm); 216 low_latency = iwl_mvm_low_latency(mvm);
226 217
227 if ((load == IWL_MVM_TRAFFIC_HIGH || low_latency) && 218 if ((load == IWL_MVM_TRAFFIC_HIGH || low_latency) && !p2p_device &&
228 vif->type != NL80211_IFTYPE_P2P_DEVICE &&
229 fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAGMENTED_SCAN)) 219 fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAGMENTED_SCAN))
230 return IWL_SCAN_TYPE_FRAGMENTED; 220 return IWL_SCAN_TYPE_FRAGMENTED;
231 221
@@ -917,18 +907,20 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
917 struct iwl_host_cmd cmd = { 907 struct iwl_host_cmd cmd = {
918 .id = iwl_cmd_id(SCAN_CFG_CMD, IWL_ALWAYS_LONG_GROUP, 0), 908 .id = iwl_cmd_id(SCAN_CFG_CMD, IWL_ALWAYS_LONG_GROUP, 0),
919 }; 909 };
910 enum iwl_mvm_scan_type type = iwl_mvm_get_scan_type(mvm, false);
920 911
921 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels)) 912 if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels))
922 return -ENOBUFS; 913 return -ENOBUFS;
923 914
915 if (type == mvm->scan_type)
916 return 0;
917
924 cmd_size = sizeof(*scan_config) + mvm->fw->ucode_capa.n_scan_channels; 918 cmd_size = sizeof(*scan_config) + mvm->fw->ucode_capa.n_scan_channels;
925 919
926 scan_config = kzalloc(cmd_size, GFP_KERNEL); 920 scan_config = kzalloc(cmd_size, GFP_KERNEL);
927 if (!scan_config) 921 if (!scan_config)
928 return -ENOMEM; 922 return -ENOMEM;
929 923
930 mvm->scan_fragmented = iwl_mvm_low_latency(mvm);
931
932 scan_config->flags = cpu_to_le32(SCAN_CONFIG_FLAG_ACTIVATE | 924 scan_config->flags = cpu_to_le32(SCAN_CONFIG_FLAG_ACTIVATE |
933 SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS | 925 SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS |
934 SCAN_CONFIG_FLAG_SET_TX_CHAINS | 926 SCAN_CONFIG_FLAG_SET_TX_CHAINS |
@@ -938,17 +930,18 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
938 SCAN_CONFIG_FLAG_SET_MAC_ADDR | 930 SCAN_CONFIG_FLAG_SET_MAC_ADDR |
939 SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS| 931 SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS|
940 SCAN_CONFIG_N_CHANNELS(num_channels) | 932 SCAN_CONFIG_N_CHANNELS(num_channels) |
941 (mvm->scan_fragmented ? 933 (type == IWL_SCAN_TYPE_FRAGMENTED ?
942 SCAN_CONFIG_FLAG_SET_FRAGMENTED : 934 SCAN_CONFIG_FLAG_SET_FRAGMENTED :
943 SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED)); 935 SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED));
944 scan_config->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); 936 scan_config->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
945 scan_config->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm)); 937 scan_config->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm));
946 scan_config->legacy_rates = iwl_mvm_scan_config_rates(mvm); 938 scan_config->legacy_rates = iwl_mvm_scan_config_rates(mvm);
947 scan_config->out_of_channel_time = cpu_to_le32(170); 939 scan_config->out_of_channel_time =
948 scan_config->suspend_time = cpu_to_le32(30); 940 cpu_to_le32(scan_timing[type].max_out_time);
949 scan_config->dwell_active = 20; 941 scan_config->suspend_time = cpu_to_le32(scan_timing[type].suspend_time);
950 scan_config->dwell_passive = 110; 942 scan_config->dwell_active = scan_timing[type].dwell_active;
951 scan_config->dwell_fragmented = 20; 943 scan_config->dwell_passive = scan_timing[type].dwell_passive;
944 scan_config->dwell_fragmented = scan_timing[type].dwell_fragmented;
952 945
953 memcpy(&scan_config->mac_addr, &mvm->addresses[0].addr, ETH_ALEN); 946 memcpy(&scan_config->mac_addr, &mvm->addresses[0].addr, ETH_ALEN);
954 947
@@ -972,6 +965,8 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
972 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n"); 965 IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n");
973 966
974 ret = iwl_mvm_send_cmd(mvm, &cmd); 967 ret = iwl_mvm_send_cmd(mvm, &cmd);
968 if (!ret)
969 mvm->scan_type = type;
975 970
976 kfree(scan_config); 971 kfree(scan_config);
977 return ret; 972 return ret;
@@ -1225,7 +1220,9 @@ int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1225 params.scan_plans = &scan_plan; 1220 params.scan_plans = &scan_plan;
1226 params.n_scan_plans = 1; 1221 params.n_scan_plans = 1;
1227 1222
1228 params.type = iwl_mvm_get_scan_type(mvm, vif, &params); 1223 params.type =
1224 iwl_mvm_get_scan_type(mvm,
1225 vif->type == NL80211_IFTYPE_P2P_DEVICE);
1229 1226
1230 iwl_mvm_build_scan_probe(mvm, vif, ies, &params); 1227 iwl_mvm_build_scan_probe(mvm, vif, ies, &params);
1231 1228
@@ -1307,7 +1304,9 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
1307 params.n_scan_plans = req->n_scan_plans; 1304 params.n_scan_plans = req->n_scan_plans;
1308 params.scan_plans = req->scan_plans; 1305 params.scan_plans = req->scan_plans;
1309 1306
1310 params.type = iwl_mvm_get_scan_type(mvm, vif, &params); 1307 params.type =
1308 iwl_mvm_get_scan_type(mvm,
1309 vif->type == NL80211_IFTYPE_P2P_DEVICE);
1311 1310
1312 /* In theory, LMAC scans can handle a 32-bit delay, but since 1311 /* In theory, LMAC scans can handle a 32-bit delay, but since
1313 * waiting for over 18 hours to start the scan is a bit silly 1312 * waiting for over 18 hours to start the scan is a bit silly