wl18xx: use long intervals in sched scan
authorEliad Peller <eliad@wizery.com>
Thu, 30 Jul 2015 19:38:20 +0000 (22:38 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 10 Aug 2015 19:16:21 +0000 (22:16 +0300)
Add support for long intervals on sched scan.

If configured, the original request interval will
be used num_short_interval times, and then the
long interval will be used.

While on it, fix the scan command field names
to reflect the expected value is in ms (rather
than secs).

These values will be taken from the conf file,
so bump its version accordingly.

Signed-off-by: Eyal Shapira <eyal@wizery.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
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.h

index 3da6ac60c65d030176292c49ea5d671de4f67052..f9c9d5cf0854dc24a224447ae26b882423810e61 100644 (file)
@@ -422,6 +422,8 @@ static struct wlcore_conf wl18xx_conf = {
                .num_probe_reqs                 = 2,
                .rssi_threshold                 = -90,
                .snr_threshold                  = 0,
+               .num_short_intervals            = SCAN_MAX_SHORT_INTERVALS,
+               .long_interval                  = 30000,
        },
        .ht = {
                .rx_ba_win_size = 32,
index 98666f235a12d9a70873e18eaa3245298007284f..ec2eb147add3b3afe800083a7eabc7e687633612 100644 (file)
@@ -223,9 +223,20 @@ int wl18xx_scan_sched_scan_config(struct wl1271 *wl,
                                    SCAN_TYPE_PERIODIC);
        wl18xx_adjust_channels(cmd, cmd_channels);
 
-       cmd->short_cycles_sec = 0;
-       cmd->long_cycles_sec = cpu_to_le16(req->interval);
-       cmd->short_cycles_count = 0;
+       if (c->num_short_intervals && c->long_interval &&
+           c->long_interval > req->interval) {
+               cmd->short_cycles_msec = cpu_to_le16(req->interval);
+               cmd->long_cycles_msec = cpu_to_le16(c->long_interval);
+               cmd->short_cycles_count = c->num_short_intervals;
+       } else {
+               cmd->short_cycles_msec = 0;
+               cmd->long_cycles_msec = cpu_to_le16(req->interval);
+               cmd->short_cycles_count = 0;
+       }
+       wl1271_debug(DEBUG_SCAN, "short_interval: %d, long_interval: %d, num_short: %d",
+                    le16_to_cpu(cmd->short_cycles_msec),
+                    le16_to_cpu(cmd->long_cycles_msec),
+                    cmd->short_cycles_count);
 
        cmd->total_cycles = 0;
 
index 2e636aa5dba9bac8d11ff63d5fe02b7efc19af9c..66a763f644d2f8a043050623601f6c9c3fffce08 100644 (file)
@@ -74,8 +74,8 @@ struct wl18xx_cmd_scan_params {
        u8 dfs;            /* number of dfs channels in 5ghz */
        u8 passive_active; /* number of passive before active channels 2.4ghz */
 
-       __le16 short_cycles_sec;
-       __le16 long_cycles_sec;
+       __le16 short_cycles_msec;
+       __le16 long_cycles_msec;
        u8 short_cycles_count;
        u8 total_cycles; /* 0 - infinite */
        u8 padding[2];
index 166add00b50fb43984b458f4ab9cf254b9a456d5..52a9d1b140203612ba05285c1542f3ce7c28182d 100644 (file)
@@ -1186,6 +1186,15 @@ struct conf_sched_scan_settings {
 
        /* SNR threshold to be used for filtering */
        s8 snr_threshold;
+
+       /*
+        * number of short intervals scheduled scan cycles before
+        * switching to long intervals
+        */
+       u8 num_short_intervals;
+
+       /* interval between each long scheduled scan cycle (in ms) */
+       u16 long_interval;
 } __packed;
 
 struct conf_ht_setting {
@@ -1352,7 +1361,7 @@ struct conf_recovery_settings {
  * version, the two LSB are the lower driver's private conf
  * version.
  */
-#define WLCORE_CONF_VERSION    (0x0006 << 16)
+#define WLCORE_CONF_VERSION    (0x0007 << 16)
 #define WLCORE_CONF_MASK       0xffff0000
 #define WLCORE_CONF_SIZE       (sizeof(struct wlcore_conf_header) +    \
                                 sizeof(struct wlcore_conf))
index 4dadd0c62cde5251f83d924e20b1c5312e3d2806..782eb297c196955c9d0b90002d8e8e05588ac511 100644 (file)
@@ -83,6 +83,12 @@ struct wl1271_cmd_trigger_scan_to {
 #define MAX_CHANNELS_5GHZ      42
 
 #define SCAN_MAX_CYCLE_INTERVALS 16
+
+/* The FW intervals can take up to 16 entries.
+ * The 1st entry isn't used (scan is immediate). The last
+ * entry should be used for the long_interval
+ */
+#define SCAN_MAX_SHORT_INTERVALS (SCAN_MAX_CYCLE_INTERVALS - 2)
 #define SCAN_MAX_BANDS 3
 
 enum {