Skip to content

Commit

Permalink
wlcore: configure dwell times according to scan type
Browse files Browse the repository at this point in the history
Allow configuring different dwell times to the different
scan types (regular and scheduled).

Add new configuration entry (dwell_time_dfs) to
conf_scan_settings, in order to allow setting
different values for normal scan and scheduled scan.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information
Eliad Peller authored and Luciano Coelho committed Nov 28, 2012
1 parent 6507bab commit 7c482c1
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 48 deletions.
4 changes: 2 additions & 2 deletions drivers/net/wireless/ti/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,8 @@ static struct wlcore_conf wl12xx_conf = {
.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,
},
Expand Down
7 changes: 4 additions & 3 deletions drivers/net/wireless/ti/wl12xx/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ static int wl1271_get_scan_channels(struct wl1271 *wl,
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;
Expand Down Expand Up @@ -364,7 +364,8 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
}

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;
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/wireless/ti/wl18xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,8 +394,8 @@ static struct wlcore_conf wl18xx_conf = {
.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,
},
Expand Down
6 changes: 4 additions & 2 deletions drivers/net/wireless/ti/wl18xx/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ static int wl18xx_scan_send(struct wl1271 *wl, struct wl12xx_vif *wlvif,
}

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);

/*
Expand Down Expand Up @@ -214,7 +215,8 @@ int wl18xx_scan_sched_scan_config(struct wl1271 *wl,

/* 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;
Expand Down
7 changes: 0 additions & 7 deletions drivers/net/wireless/ti/wl18xx/scan.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,6 @@ struct tracking_ch_params {
u8 padding[2];
} __packed;

enum
{
SCAN_TYPE_SEARCH = 0,
SCAN_TYPE_PERIODIC = 1,
SCAN_TYPE_TRACKING = 2,
};

/* probe request rate */
enum
{
Expand Down
18 changes: 5 additions & 13 deletions drivers/net/wireless/ti/wlcore/conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -1059,19 +1059,11 @@ struct conf_scan_settings {
*/
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
Expand Down Expand Up @@ -1281,7 +1273,7 @@ struct conf_hangover_settings {
* 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))
Expand Down
57 changes: 39 additions & 18 deletions drivers/net/wireless/ti/wlcore/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,29 +97,44 @@ wlcore_scan_get_channels(struct wl1271 *wl,
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;
Expand Down Expand Up @@ -195,7 +210,8 @@ 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)
{
u8 n_pactive_ch = 0;

Expand All @@ -208,7 +224,8 @@ wlcore_set_scan_chan_params(struct wl1271 *wl,
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,
Expand All @@ -219,7 +236,8 @@ wlcore_set_scan_chan_params(struct wl1271 *wl,
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,
Expand All @@ -229,7 +247,8 @@ wlcore_set_scan_chan_params(struct wl1271 *wl,
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,
Expand All @@ -240,7 +259,8 @@ wlcore_set_scan_chan_params(struct wl1271 *wl,
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,
Expand All @@ -251,7 +271,8 @@ wlcore_set_scan_chan_params(struct wl1271 *wl,
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;
Expand Down
9 changes: 8 additions & 1 deletion drivers/net/wireless/ti/wlcore/scan.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,19 @@ struct wlcore_scan_channels {
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,
Expand Down

0 comments on commit 7c482c1

Please sign in to comment.