wlcore: configure dwell times according to scan type
authorEliad Peller <eliad@wizery.com>
Mon, 26 Nov 2012 16:05:40 +0000 (18:05 +0200)
committerLuciano Coelho <coelho@ti.com>
Wed, 28 Nov 2012 09:45:42 +0000 (11:45 +0200)
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>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wl12xx/scan.c
drivers/net/wireless/ti/wl18xx/main.c
drivers/net/wireless/ti/wl18xx/scan.c
drivers/net/wireless/ti/wl18xx/scan.h
drivers/net/wireless/ti/wlcore/conf.h
drivers/net/wireless/ti/wlcore/scan.c
drivers/net/wireless/ti/wlcore/scan.h

index 7138fe49c63d429a4a1114087dd40c04bc0ff3cf..17ee0fd14bccf79f65d53298b287e0d86dfa2385 100644 (file)
@@ -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,
        },
index a99e8764162daa0eb914f4cec537edf692ae8085..affdb3ec6225a39b7343babcf4633cd47990b90e 100644 (file)
@@ -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;
@@ -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;
index bb67d701f8a41fcc22bcb4ab106ed10753afa350..c015231d295f5f5df312f4261914bd9399ef32b5 100644 (file)
@@ -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,
        },
index f31d0d480d1b581c596bf9498094908a2d2da3db..daaebad78e1c0a3764d9890744e64724d5aaa9d5 100644 (file)
@@ -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);
 
        /*
@@ -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;
index 0e026ecb311ebf74983e31b6a3657676ef053108..5eb8c7fc1567e7e759de62b5e57226cdaebf1fd8 100644 (file)
@@ -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
 {
index a5d190816f342b8858ca93fa29df19d8ee820209..c9de4d5c8965307de73640b98380f01c5345872a 100644 (file)
@@ -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
@@ -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))
index c9137004982ebdbcb9e1e655445f7688f1873ca4..7f42f8a4d90b94562f430419c5d094e250b5ec16 100644 (file)
@@ -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;
@@ -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;
 
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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;
index 8465f35c6a0658ce0cfb460dcb174f517578e91b..9ae606555aeb319ca4258e43f8cd209fbe68d417 100644 (file)
@@ -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,