.scan = {
.min_dwell_time_active = 7500,
.max_dwell_time_active = 30000,
- .min_dwell_time_passive = 100000,
- .max_dwell_time_passive = 100000,
+ .dwell_time_passive = 100000,
+ .dwell_time_dfs = 150000,
.num_probe_reqs = 2,
.split_scan_timeout = 50000,
},
cpu_to_le32(c->max_dwell_time_active);
} else {
channels[j].min_duration =
- cpu_to_le32(c->min_dwell_time_passive);
+ cpu_to_le32(c->dwell_time_passive);
channels[j].max_duration =
- cpu_to_le32(c->max_dwell_time_passive);
+ cpu_to_le32(c->dwell_time_passive);
}
channels[j].early_termination = 0;
channels[j].tx_power_att = req->channels[i]->max_power;
}
if (!wlcore_set_scan_chan_params(wl, cfg_channels, req->channels,
- req->n_channels, req->n_ssids)) {
+ req->n_channels, req->n_ssids,
+ SCAN_TYPE_PERIODIC)) {
wl1271_error("scan channel list is empty");
ret = -EINVAL;
goto out;
.scan = {
.min_dwell_time_active = 7500,
.max_dwell_time_active = 30000,
- .min_dwell_time_passive = 100000,
- .max_dwell_time_passive = 100000,
+ .dwell_time_passive = 100000,
+ .dwell_time_dfs = 150000,
.num_probe_reqs = 2,
.split_scan_timeout = 50000,
},
}
wlcore_set_scan_chan_params(wl, cmd_channels, req->channels,
- req->n_channels, req->n_ssids);
+ req->n_channels, req->n_ssids,
+ SCAN_TYPE_SEARCH);
wl18xx_adjust_channels(cmd, cmd_channels);
/*
/* configure channels */
wlcore_set_scan_chan_params(wl, cmd_channels, req->channels,
- req->n_channels, req->n_ssids);
+ req->n_channels, req->n_ssids,
+ SCAN_TYPE_PERIODIC);
wl18xx_adjust_channels(cmd, cmd_channels);
cmd->short_cycles_sec = 0;
u8 padding[2];
} __packed;
-enum
-{
- SCAN_TYPE_SEARCH = 0,
- SCAN_TYPE_PERIODIC = 1,
- SCAN_TYPE_TRACKING = 2,
-};
-
/* probe request rate */
enum
{
*/
u32 max_dwell_time_active;
- /*
- * The minimum time to wait on each channel for passive scans
- *
- * Range: u32 tu/1000
- */
- u32 min_dwell_time_passive;
+ /* time to wait on the channel for passive scans (in TU/1000) */
+ u32 dwell_time_passive;
- /*
- * The maximum time to wait on each channel for passive scans
- *
- * Range: u32 tu/1000
- */
- u32 max_dwell_time_passive;
+ /* time to wait on the channel for DFS scans (in TU/1000) */
+ u32 dwell_time_dfs;
/*
* Number of probe requests to transmit on each active scan channel
* version, the two LSB are the lower driver's private conf
* version.
*/
-#define WLCORE_CONF_VERSION (0x0002 << 16)
+#define WLCORE_CONF_VERSION (0x0003 << 16)
#define WLCORE_CONF_MASK 0xffff0000
#define WLCORE_CONF_SIZE (sizeof(struct wlcore_conf_header) + \
sizeof(struct wlcore_conf))
struct conn_scan_ch_params *channels,
u32 band, bool radar, bool passive,
int start, int max_channels,
- u8 *n_pactive_ch)
+ u8 *n_pactive_ch,
+ int scan_type)
{
- struct conf_sched_scan_settings *c = &wl->conf.sched_scan;
int i, j;
u32 flags;
bool force_passive = !n_ssids;
- u32 min_dwell_time_active, max_dwell_time_active, delta_per_probe;
+ u32 min_dwell_time_active, max_dwell_time_active;
u32 dwell_time_passive, dwell_time_dfs;
- if (band == IEEE80211_BAND_5GHZ)
- delta_per_probe = c->dwell_time_delta_per_probe_5;
- else
- delta_per_probe = c->dwell_time_delta_per_probe;
+ /* configure dwell times according to scan type */
+ if (scan_type == SCAN_TYPE_SEARCH) {
+ struct conf_scan_settings *c = &wl->conf.scan;
- min_dwell_time_active = c->base_dwell_time +
- n_ssids * c->num_probe_reqs * delta_per_probe;
+ min_dwell_time_active = c->min_dwell_time_active;
+ max_dwell_time_active = c->max_dwell_time_active;
+ dwell_time_passive = c->dwell_time_passive;
+ dwell_time_dfs = c->dwell_time_dfs;
+ } else {
+ struct conf_sched_scan_settings *c = &wl->conf.sched_scan;
+ u32 delta_per_probe;
+
+ if (band == IEEE80211_BAND_5GHZ)
+ delta_per_probe = c->dwell_time_delta_per_probe_5;
+ else
+ delta_per_probe = c->dwell_time_delta_per_probe;
- max_dwell_time_active = min_dwell_time_active + c->max_dwell_time_delta;
+ min_dwell_time_active = c->base_dwell_time +
+ n_ssids * c->num_probe_reqs * delta_per_probe;
+ max_dwell_time_active = min_dwell_time_active +
+ c->max_dwell_time_delta;
+ dwell_time_passive = c->dwell_time_passive;
+ dwell_time_dfs = c->dwell_time_dfs;
+ }
min_dwell_time_active = DIV_ROUND_UP(min_dwell_time_active, 1000);
max_dwell_time_active = DIV_ROUND_UP(max_dwell_time_active, 1000);
- dwell_time_passive = DIV_ROUND_UP(c->dwell_time_passive, 1000);
- dwell_time_dfs = DIV_ROUND_UP(c->dwell_time_dfs, 1000);
+ dwell_time_passive = DIV_ROUND_UP(dwell_time_passive, 1000);
+ dwell_time_dfs = DIV_ROUND_UP(dwell_time_dfs, 1000);
for (i = 0, j = start;
i < n_channels && j < max_channels;
struct wlcore_scan_channels *cfg,
struct ieee80211_channel *channels[],
u32 n_channels,
- u32 n_ssids)
+ u32 n_ssids,
+ int scan_type)
{
u8 n_pactive_ch = 0;
IEEE80211_BAND_2GHZ,
false, true, 0,
MAX_CHANNELS_2GHZ,
- &n_pactive_ch);
+ &n_pactive_ch,
+ scan_type);
cfg->active[0] =
wlcore_scan_get_channels(wl,
channels,
false, false,
cfg->passive[0],
MAX_CHANNELS_2GHZ,
- &n_pactive_ch);
+ &n_pactive_ch,
+ scan_type);
cfg->passive[1] =
wlcore_scan_get_channels(wl,
channels,
IEEE80211_BAND_5GHZ,
false, true, 0,
wl->max_channels_5,
- &n_pactive_ch);
+ &n_pactive_ch,
+ scan_type);
cfg->dfs =
wlcore_scan_get_channels(wl,
channels,
true, true,
cfg->passive[1],
wl->max_channels_5,
- &n_pactive_ch);
+ &n_pactive_ch,
+ scan_type);
cfg->active[1] =
wlcore_scan_get_channels(wl,
channels,
false, false,
cfg->passive[1] + cfg->dfs,
wl->max_channels_5,
- &n_pactive_ch);
+ &n_pactive_ch,
+ scan_type);
/* 802.11j channels are not supported yet */
cfg->passive[2] = 0;
struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ];
};
+enum {
+ SCAN_TYPE_SEARCH = 0,
+ SCAN_TYPE_PERIODIC = 1,
+ SCAN_TYPE_TRACKING = 2,
+};
+
bool
wlcore_set_scan_chan_params(struct wl1271 *wl,
struct wlcore_scan_channels *cfg,
struct ieee80211_channel *channels[],
u32 n_channels,
- u32 n_ssids);
+ u32 n_ssids,
+ int scan_type);
int
wlcore_scan_sched_scan_ssid_list(struct wl1271 *wl,