|
@@ -35,6 +35,7 @@
|
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
|
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
|
|
+ * Copyright(c) 2018 Intel Corporation
|
|
|
* All rights reserved.
|
|
|
*
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
@@ -85,6 +86,8 @@ enum iwl_mvm_traffic_load {
|
|
|
#define IWL_SCAN_DWELL_PASSIVE 110
|
|
|
#define IWL_SCAN_DWELL_FRAGMENTED 44
|
|
|
#define IWL_SCAN_DWELL_EXTENDED 90
|
|
|
+#define IWL_SCAN_NUM_OF_FRAGS 3
|
|
|
+
|
|
|
|
|
|
/* adaptive dwell max budget time [TU] for full scan */
|
|
|
#define IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN 300
|
|
@@ -143,6 +146,9 @@ static inline void *iwl_mvm_get_scan_req_umac_data(struct iwl_mvm *mvm)
|
|
|
{
|
|
|
struct iwl_scan_req_umac *cmd = mvm->scan_cmd;
|
|
|
|
|
|
+ if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm))
|
|
|
+ return (void *)&cmd->v8.data;
|
|
|
+
|
|
|
if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
|
|
return (void *)&cmd->v7.data;
|
|
|
|
|
@@ -152,6 +158,23 @@ static inline void *iwl_mvm_get_scan_req_umac_data(struct iwl_mvm *mvm)
|
|
|
return (void *)&cmd->v1.data;
|
|
|
}
|
|
|
|
|
|
+static inline struct iwl_scan_umac_chan_param *
|
|
|
+iwl_mvm_get_scan_req_umac_channel(struct iwl_mvm *mvm)
|
|
|
+{
|
|
|
+ struct iwl_scan_req_umac *cmd = mvm->scan_cmd;
|
|
|
+
|
|
|
+ if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm))
|
|
|
+ return &cmd->v8.channel;
|
|
|
+
|
|
|
+ if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
|
|
+ return &cmd->v7.channel;
|
|
|
+
|
|
|
+ if (iwl_mvm_has_new_tx_api(mvm))
|
|
|
+ return &cmd->v6.channel;
|
|
|
+
|
|
|
+ return &cmd->v1.channel;
|
|
|
+}
|
|
|
+
|
|
|
static u8 iwl_mvm_scan_rx_ant(struct iwl_mvm *mvm)
|
|
|
{
|
|
|
if (mvm->scan_rx_ant != ANT_NONE)
|
|
@@ -1122,17 +1145,16 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
|
|
|
struct iwl_scan_req_umac *cmd,
|
|
|
struct iwl_mvm_scan_params *params)
|
|
|
{
|
|
|
- struct iwl_mvm_scan_timing_params *timing = &scan_timing[params->type];
|
|
|
+ struct iwl_mvm_scan_timing_params *timing, *hb_timing;
|
|
|
+ u8 active_dwell, passive_dwell;
|
|
|
+
|
|
|
+ timing = &scan_timing[params->type];
|
|
|
+ active_dwell = params->measurement_dwell ?
|
|
|
+ params->measurement_dwell : IWL_SCAN_DWELL_ACTIVE;
|
|
|
+ passive_dwell = params->measurement_dwell ?
|
|
|
+ params->measurement_dwell : IWL_SCAN_DWELL_PASSIVE;
|
|
|
|
|
|
if (iwl_mvm_is_adaptive_dwell_supported(mvm)) {
|
|
|
- if (params->measurement_dwell) {
|
|
|
- cmd->v7.active_dwell = params->measurement_dwell;
|
|
|
- cmd->v7.passive_dwell = params->measurement_dwell;
|
|
|
- } else {
|
|
|
- cmd->v7.active_dwell = IWL_SCAN_DWELL_ACTIVE;
|
|
|
- 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 =
|
|
@@ -1154,26 +1176,39 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
|
|
|
cpu_to_le32(timing->max_out_time);
|
|
|
cmd->v7.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);
|
|
|
+ hb_timing = &scan_timing[params->type];
|
|
|
+
|
|
|
+ cmd->v7.max_out_time[SCAN_HB_LMAC_IDX] =
|
|
|
+ cpu_to_le32(hb_timing->max_out_time);
|
|
|
+ cmd->v7.suspend_time[SCAN_HB_LMAC_IDX] =
|
|
|
+ cpu_to_le32(hb_timing->suspend_time);
|
|
|
}
|
|
|
- } else {
|
|
|
- if (params->measurement_dwell) {
|
|
|
- cmd->v1.active_dwell = params->measurement_dwell;
|
|
|
- cmd->v1.passive_dwell = params->measurement_dwell;
|
|
|
- cmd->v1.extended_dwell = params->measurement_dwell;
|
|
|
+
|
|
|
+ if (!iwl_mvm_is_adaptive_dwell_v2_supported(mvm)) {
|
|
|
+ cmd->v7.active_dwell = active_dwell;
|
|
|
+ cmd->v7.passive_dwell = passive_dwell;
|
|
|
+ cmd->v7.fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED;
|
|
|
} else {
|
|
|
- cmd->v1.active_dwell = IWL_SCAN_DWELL_ACTIVE;
|
|
|
- cmd->v1.passive_dwell = IWL_SCAN_DWELL_PASSIVE;
|
|
|
- cmd->v1.extended_dwell = IWL_SCAN_DWELL_EXTENDED;
|
|
|
+ cmd->v8.active_dwell[SCAN_LB_LMAC_IDX] = active_dwell;
|
|
|
+ cmd->v8.passive_dwell[SCAN_LB_LMAC_IDX] = passive_dwell;
|
|
|
+ if (iwl_mvm_is_cdb_supported(mvm)) {
|
|
|
+ cmd->v8.active_dwell[SCAN_HB_LMAC_IDX] =
|
|
|
+ active_dwell;
|
|
|
+ cmd->v8.passive_dwell[SCAN_HB_LMAC_IDX] =
|
|
|
+ passive_dwell;
|
|
|
+ }
|
|
|
}
|
|
|
+ } else {
|
|
|
+ cmd->v1.extended_dwell = params->measurement_dwell ?
|
|
|
+ params->measurement_dwell : IWL_SCAN_DWELL_EXTENDED;
|
|
|
+ cmd->v1.active_dwell = active_dwell;
|
|
|
+ cmd->v1.passive_dwell = passive_dwell;
|
|
|
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];
|
|
|
+ hb_timing = &scan_timing[params->type];
|
|
|
|
|
|
cmd->v6.max_out_time[SCAN_HB_LMAC_IDX] =
|
|
|
cpu_to_le32(hb_timing->max_out_time);
|
|
@@ -1298,6 +1333,7 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|
|
int type)
|
|
|
{
|
|
|
struct iwl_scan_req_umac *cmd = mvm->scan_cmd;
|
|
|
+ struct iwl_scan_umac_chan_param *chan_param;
|
|
|
void *cmd_data = iwl_mvm_get_scan_req_umac_data(mvm);
|
|
|
struct iwl_scan_req_umac_tail *sec_part = cmd_data +
|
|
|
sizeof(struct iwl_scan_channel_cfg_umac) *
|
|
@@ -1305,8 +1341,11 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|
|
int uid, i;
|
|
|
u32 ssid_bitmap = 0;
|
|
|
u8 channel_flags = 0;
|
|
|
+ u16 gen_flags;
|
|
|
struct iwl_mvm_vif *scan_vif = iwl_mvm_vif_from_mac80211(vif);
|
|
|
|
|
|
+ chan_param = iwl_mvm_get_scan_req_umac_channel(mvm);
|
|
|
+
|
|
|
lockdep_assert_held(&mvm->mutex);
|
|
|
|
|
|
if (WARN_ON(params->n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS))
|
|
@@ -1323,8 +1362,17 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|
|
mvm->scan_uid_status[uid] = type;
|
|
|
|
|
|
cmd->uid = cpu_to_le32(uid);
|
|
|
- cmd->general_flags = cpu_to_le16(iwl_mvm_scan_umac_flags(mvm, params,
|
|
|
- vif));
|
|
|
+ gen_flags = iwl_mvm_scan_umac_flags(mvm, params, vif);
|
|
|
+ cmd->general_flags = cpu_to_le16(gen_flags);
|
|
|
+ if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm)) {
|
|
|
+ if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED)
|
|
|
+ cmd->v8.num_of_fragments[SCAN_LB_LMAC_IDX] =
|
|
|
+ IWL_SCAN_NUM_OF_FRAGS;
|
|
|
+ if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED)
|
|
|
+ cmd->v8.num_of_fragments[SCAN_HB_LMAC_IDX] =
|
|
|
+ IWL_SCAN_NUM_OF_FRAGS;
|
|
|
+ }
|
|
|
+
|
|
|
cmd->scan_start_mac_id = scan_vif->id;
|
|
|
|
|
|
if (type == IWL_MVM_SCAN_SCHED || type == IWL_MVM_SCAN_NETDETECT)
|
|
@@ -1335,16 +1383,8 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|
|
IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
|
|
|
IWL_SCAN_CHANNEL_FLAG_CACHE_ADD;
|
|
|
|
|
|
- if (iwl_mvm_is_adaptive_dwell_supported(mvm)) {
|
|
|
- cmd->v7.channel_flags = channel_flags;
|
|
|
- cmd->v7.n_channels = params->n_channels;
|
|
|
- } else if (iwl_mvm_has_new_tx_api(mvm)) {
|
|
|
- cmd->v6.channel_flags = channel_flags;
|
|
|
- cmd->v6.n_channels = params->n_channels;
|
|
|
- } else {
|
|
|
- cmd->v1.channel_flags = channel_flags;
|
|
|
- cmd->v1.n_channels = params->n_channels;
|
|
|
- }
|
|
|
+ chan_param->flags = channel_flags;
|
|
|
+ chan_param->count = params->n_channels;
|
|
|
|
|
|
iwl_scan_build_ssids(params, sec_part->direct_scan, &ssid_bitmap);
|
|
|
|
|
@@ -1783,7 +1823,9 @@ int iwl_mvm_scan_size(struct iwl_mvm *mvm)
|
|
|
{
|
|
|
int base_size = IWL_SCAN_REQ_UMAC_SIZE_V1;
|
|
|
|
|
|
- if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
|
|
+ if (iwl_mvm_is_adaptive_dwell_v2_supported(mvm))
|
|
|
+ base_size = IWL_SCAN_REQ_UMAC_SIZE_V8;
|
|
|
+ else if (iwl_mvm_is_adaptive_dwell_supported(mvm))
|
|
|
base_size = IWL_SCAN_REQ_UMAC_SIZE_V7;
|
|
|
else if (iwl_mvm_has_new_tx_api(mvm))
|
|
|
base_size = IWL_SCAN_REQ_UMAC_SIZE_V6;
|