wlcore: set channels 12-14 as pactive for sched scan
authorVictor Goldenshtein <victorg@ti.com>
Tue, 15 May 2012 14:04:40 +0000 (17:04 +0300)
committerLuciano Coelho <coelho@ti.com>
Wed, 6 Jun 2012 16:40:27 +0000 (19:40 +0300)
Introduce “pactive” scan mode – which instructs the fw to
perform a passive scan until an activity/energy is detected
on these channels, once energy detected the channel becomes
active.

Signed-off-by: Victor Goldenshtein <victorg@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wlcore/scan.c
drivers/net/wireless/ti/wlcore/scan.h

index e1dbe812615ff7ce9aaf026dc7f5647c4b4c3607..d9daed53ceb72c7d6712fdfdf6cc5b732963ae1e 100644 (file)
@@ -411,7 +411,8 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl,
                                    struct cfg80211_sched_scan_request *req,
                                    struct conn_scan_ch_params *channels,
                                    u32 band, bool radar, bool passive,
-                                   int start, int max_channels)
+                                   int start, int max_channels,
+                                   u8 *n_pactive_ch)
 {
        struct conf_sched_scan_settings *c = &wl->conf.sched_scan;
        int i, j;
@@ -479,6 +480,23 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl,
                        channels[j].tx_power_att = req->channels[i]->max_power;
                        channels[j].channel = req->channels[i]->hw_value;
 
+                       if ((band == IEEE80211_BAND_2GHZ) &&
+                           (channels[j].channel >= 12) &&
+                           (channels[j].channel <= 14) &&
+                           (flags & IEEE80211_CHAN_PASSIVE_SCAN) &&
+                           !force_passive) {
+                               /* pactive channels treated as DFS */
+                               channels[j].flags = SCAN_CHANNEL_FLAGS_DFS;
+
+                               /*
+                                * n_pactive_ch is counted down from the end of
+                                * the passive channel list
+                                */
+                               (*n_pactive_ch)++;
+                               wl1271_debug(DEBUG_SCAN, "n_pactive_ch = %d",
+                                            *n_pactive_ch);
+                       }
+
                        j++;
                }
        }
@@ -491,38 +509,47 @@ wl1271_scan_sched_scan_channels(struct wl1271 *wl,
                                struct cfg80211_sched_scan_request *req,
                                struct wl1271_cmd_sched_scan_config *cfg)
 {
+       u8 n_pactive_ch = 0;
+
        cfg->passive[0] =
                wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels_2,
                                                    IEEE80211_BAND_2GHZ,
                                                    false, true, 0,
-                                                   MAX_CHANNELS_2GHZ);
+                                                   MAX_CHANNELS_2GHZ,
+                                                   &n_pactive_ch);
        cfg->active[0] =
                wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels_2,
                                                    IEEE80211_BAND_2GHZ,
                                                    false, false,
                                                    cfg->passive[0],
-                                                   MAX_CHANNELS_2GHZ);
+                                                   MAX_CHANNELS_2GHZ,
+                                                   &n_pactive_ch);
        cfg->passive[1] =
                wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels_5,
                                                    IEEE80211_BAND_5GHZ,
                                                    false, true, 0,
-                                                   MAX_CHANNELS_5GHZ);
+                                                   MAX_CHANNELS_5GHZ,
+                                                   &n_pactive_ch);
        cfg->dfs =
                wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels_5,
                                                    IEEE80211_BAND_5GHZ,
                                                    true, true,
                                                    cfg->passive[1],
-                                                   MAX_CHANNELS_5GHZ);
+                                                   MAX_CHANNELS_5GHZ,
+                                                   &n_pactive_ch);
        cfg->active[1] =
                wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels_5,
                                                    IEEE80211_BAND_5GHZ,
                                                    false, false,
                                                    cfg->passive[1] + cfg->dfs,
-                                                   MAX_CHANNELS_5GHZ);
+                                                   MAX_CHANNELS_5GHZ,
+                                                   &n_pactive_ch);
        /* 802.11j channels are not supported yet */
        cfg->passive[2] = 0;
        cfg->active[2] = 0;
 
+       cfg->n_pactive_ch = n_pactive_ch;
+
        wl1271_debug(DEBUG_SCAN, "    2.4GHz: active %d passive %d",
                     cfg->active[0], cfg->passive[0]);
        wl1271_debug(DEBUG_SCAN, "    5GHz: active %d passive %d",
index 5b6a609fb46005e17d9f675dd0a70c1c70ab6944..29f3c8d6b0468265dc55528a493eee7de9a8625b 100644 (file)
@@ -142,7 +142,8 @@ enum {
        SCAN_BSS_TYPE_ANY,
 };
 
-#define SCAN_CHANNEL_FLAGS_DFS         BIT(0)
+#define SCAN_CHANNEL_FLAGS_DFS         BIT(0) /* channel is passive until an
+                                                 activity is detected on it */
 #define SCAN_CHANNEL_FLAGS_DFS_ENABLED BIT(1)
 
 struct conn_scan_ch_params {
@@ -185,8 +186,10 @@ struct wl1271_cmd_sched_scan_config {
 
        u8 dfs;
 
+       u8 n_pactive_ch; /* number of pactive (passive until fw detects energy)
+                           channels in BG band */
        u8 role_id;
-       u8 padding[2];
+       u8 padding[1];
 
        struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ];
        struct conn_scan_ch_params channels_5[MAX_CHANNELS_5GHZ];