diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/scan.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/scan.c | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index ec9a8e7bae1d..844bf7c4c8de 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
| @@ -72,6 +72,8 @@ | |||
| 72 | 72 | ||
| 73 | #define IWL_PLCP_QUIET_THRESH 1 | 73 | #define IWL_PLCP_QUIET_THRESH 1 |
| 74 | #define IWL_ACTIVE_QUIET_TIME 10 | 74 | #define IWL_ACTIVE_QUIET_TIME 10 |
| 75 | #define IWL_DENSE_EBS_SCAN_RATIO 5 | ||
| 76 | #define IWL_SPARSE_EBS_SCAN_RATIO 1 | ||
| 75 | 77 | ||
| 76 | struct iwl_mvm_scan_params { | 78 | struct iwl_mvm_scan_params { |
| 77 | u32 max_out_time; | 79 | u32 max_out_time; |
| @@ -1105,6 +1107,12 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) | |||
| 1105 | return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, | 1107 | return iwl_umac_scan_stop(mvm, IWL_UMAC_SCAN_UID_SCHED_SCAN, |
| 1106 | notify); | 1108 | notify); |
| 1107 | 1109 | ||
| 1110 | if (mvm->scan_status == IWL_MVM_SCAN_NONE) | ||
| 1111 | return 0; | ||
| 1112 | |||
| 1113 | if (iwl_mvm_is_radio_killed(mvm)) | ||
| 1114 | goto out; | ||
| 1115 | |||
| 1108 | if (mvm->scan_status != IWL_MVM_SCAN_SCHED && | 1116 | if (mvm->scan_status != IWL_MVM_SCAN_SCHED && |
| 1109 | (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || | 1117 | (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) || |
| 1110 | mvm->scan_status != IWL_MVM_SCAN_OS)) { | 1118 | mvm->scan_status != IWL_MVM_SCAN_OS)) { |
| @@ -1141,6 +1149,7 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify) | |||
| 1141 | if (mvm->scan_status == IWL_MVM_SCAN_OS) | 1149 | if (mvm->scan_status == IWL_MVM_SCAN_OS) |
| 1142 | iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); | 1150 | iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); |
| 1143 | 1151 | ||
| 1152 | out: | ||
| 1144 | mvm->scan_status = IWL_MVM_SCAN_NONE; | 1153 | mvm->scan_status = IWL_MVM_SCAN_NONE; |
| 1145 | 1154 | ||
| 1146 | if (notify) { | 1155 | if (notify) { |
| @@ -1297,18 +1306,6 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm, | |||
| 1297 | cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); | 1306 | cmd->scan_prio = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); |
| 1298 | cmd->iter_num = cpu_to_le32(1); | 1307 | cmd->iter_num = cpu_to_le32(1); |
| 1299 | 1308 | ||
| 1300 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && | ||
| 1301 | mvm->last_ebs_successful) { | ||
| 1302 | cmd->channel_opt[0].flags = | ||
| 1303 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1304 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1305 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1306 | cmd->channel_opt[1].flags = | ||
| 1307 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1308 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1309 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | if (iwl_mvm_rrm_scan_needed(mvm)) | 1309 | if (iwl_mvm_rrm_scan_needed(mvm)) |
| 1313 | cmd->scan_flags |= | 1310 | cmd->scan_flags |= |
| 1314 | cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); | 1311 | cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED); |
| @@ -1383,6 +1380,22 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm, | |||
| 1383 | cmd->schedule[1].iterations = 0; | 1380 | cmd->schedule[1].iterations = 0; |
| 1384 | cmd->schedule[1].full_scan_mul = 0; | 1381 | cmd->schedule[1].full_scan_mul = 0; |
| 1385 | 1382 | ||
| 1383 | if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SINGLE_SCAN_EBS && | ||
| 1384 | mvm->last_ebs_successful) { | ||
| 1385 | cmd->channel_opt[0].flags = | ||
| 1386 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1387 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1388 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1389 | cmd->channel_opt[0].non_ebs_ratio = | ||
| 1390 | cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO); | ||
| 1391 | cmd->channel_opt[1].flags = | ||
| 1392 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1393 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1394 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1395 | cmd->channel_opt[1].non_ebs_ratio = | ||
| 1396 | cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO); | ||
| 1397 | } | ||
| 1398 | |||
| 1386 | for (i = 1; i <= req->req.n_ssids; i++) | 1399 | for (i = 1; i <= req->req.n_ssids; i++) |
| 1387 | ssid_bitmap |= BIT(i); | 1400 | ssid_bitmap |= BIT(i); |
| 1388 | 1401 | ||
| @@ -1483,6 +1496,22 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm, | |||
| 1483 | cmd->schedule[1].iterations = 0xff; | 1496 | cmd->schedule[1].iterations = 0xff; |
| 1484 | cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; | 1497 | cmd->schedule[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER; |
| 1485 | 1498 | ||
| 1499 | if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT && | ||
| 1500 | mvm->last_ebs_successful) { | ||
| 1501 | cmd->channel_opt[0].flags = | ||
| 1502 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1503 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1504 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1505 | cmd->channel_opt[0].non_ebs_ratio = | ||
| 1506 | cpu_to_le16(IWL_DENSE_EBS_SCAN_RATIO); | ||
| 1507 | cmd->channel_opt[1].flags = | ||
| 1508 | cpu_to_le16(IWL_SCAN_CHANNEL_FLAG_EBS | | ||
| 1509 | IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | | ||
| 1510 | IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); | ||
| 1511 | cmd->channel_opt[1].non_ebs_ratio = | ||
| 1512 | cpu_to_le16(IWL_SPARSE_EBS_SCAN_RATIO); | ||
| 1513 | } | ||
| 1514 | |||
| 1486 | iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, | 1515 | iwl_mvm_lmac_scan_cfg_channels(mvm, req->channels, req->n_channels, |
| 1487 | ssid_bitmap, cmd); | 1516 | ssid_bitmap, cmd); |
| 1488 | 1517 | ||
