wlcore: support scan reports during periodic scan
authorEyal Shapira <eyal@wizery.com>
Wed, 28 Nov 2012 09:42:47 +0000 (11:42 +0200)
committerLuciano Coelho <coelho@ti.com>
Tue, 11 Dec 2012 10:37:23 +0000 (12:37 +0200)
FW API changed and now PERIODIC_SCAN_REPORT_EVENT is sent
in case results were found at the end of each sched scan
cycle. Previous FW was missing that and broke sched scan.

This API change is available from 18xx FW 8.5.0.0.27

[Arik - move changes to 18xx specific files, align FW structures to
latest for scan command]

Signed-off-by: Eyal Shapira <eyal@wizery.com>
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wl12xx/event.c
drivers/net/wireless/ti/wl18xx/event.c
drivers/net/wireless/ti/wl18xx/event.h
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/event.c
drivers/net/wireless/ti/wlcore/event.h
drivers/net/wireless/ti/wlcore/scan.c
drivers/net/wireless/ti/wlcore/scan.h

index 6437dac12e703c81fcde2a5912df8e9dac031fbe..6ac0ed751da8062dd262c45dd16866d1050190cc 100644 (file)
@@ -64,9 +64,13 @@ int wl12xx_process_mailbox_events(struct wl1271 *wl)
                        wl12xx_scan_completed(wl, wl->scan_wlvif);
        }
 
-       if (vector & PERIODIC_SCAN_REPORT_EVENT_ID)
-               wlcore_event_sched_scan_report(wl,
-                                              mbox->scheduled_scan_status);
+       if (vector & PERIODIC_SCAN_REPORT_EVENT_ID) {
+               wl1271_debug(DEBUG_EVENT,
+                            "PERIODIC_SCAN_REPORT_EVENT (status 0x%0x)",
+                            mbox->scheduled_scan_status);
+
+               wlcore_scan_sched_scan_results(wl);
+       }
 
        if (vector & PERIODIC_SCAN_COMPLETE_EVENT_ID)
                wlcore_event_sched_scan_completed(wl,
index 02ef5aa9da6b8c7bd853317c3ee7a52502c2ea46..c9199d7804c634380c25bcb5c126f1ebb22f40fd 100644 (file)
@@ -61,6 +61,14 @@ int wl18xx_process_mailbox_events(struct wl1271 *wl)
                        wl18xx_scan_completed(wl, wl->scan_wlvif);
        }
 
+       if (vector & PERIODIC_SCAN_REPORT_EVENT_ID) {
+               wl1271_debug(DEBUG_EVENT,
+                            "PERIODIC_SCAN_REPORT_EVENT (results %d)",
+                            mbox->number_of_sched_scan_results);
+
+               wlcore_scan_sched_scan_results(wl);
+       }
+
        if (vector & PERIODIC_SCAN_COMPLETE_EVENT_ID)
                wlcore_event_sched_scan_completed(wl, 1);
 
index b55fd31e471a76ce556fe4ad3fea6986f59cc698..398f3d2c0a6cc7b5486c2fe31d1c8824163bda31 100644 (file)
@@ -37,6 +37,7 @@ enum {
        BA_SESSION_RX_CONSTRAINT_EVENT_ID        = BIT(17),
        REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID      = BIT(18),
        DFS_CHANNELS_CONFIG_COMPLETE_EVENT       = BIT(19),
+       PERIODIC_SCAN_REPORT_EVENT_ID            = BIT(20),
 };
 
 struct wl18xx_event_mailbox {
index 0ff9bc7b1f33d33b04bbc733bdad5f29a9e6a391..ec331e9e0b740a0f0b9a3e29cb32ff56f5a64a32 100644 (file)
@@ -890,6 +890,7 @@ static int wl18xx_boot(struct wl1271 *wl)
                SCAN_COMPLETE_EVENT_ID |
                RSSI_SNR_TRIGGER_0_EVENT_ID |
                PERIODIC_SCAN_COMPLETE_EVENT_ID |
+               PERIODIC_SCAN_REPORT_EVENT_ID |
                DUMMY_PACKET_EVENT_ID |
                PEER_REMOVE_COMPLETE_EVENT_ID |
                BA_SESSION_RX_CONSTRAINT_EVENT_ID |
index 1df88d5336f3d589efa32cba340b1ca5bcf1652d..09d944505ac0f54f31125ede75d92ef74cd15cea 100644 (file)
@@ -227,6 +227,10 @@ int wl18xx_scan_sched_scan_config(struct wl1271 *wl,
 
        cmd->tag = WL1271_SCAN_DEFAULT_TAG;
 
+       /* create a PERIODIC_SCAN_REPORT_EVENT whenever we've got a match */
+       cmd->report_threshold = 1;
+       cmd->terminate_on_report = 0;
+
        if (cmd->active[0]) {
                u8 band = IEEE80211_BAND_2GHZ;
                ret = wl12xx_cmd_build_probe_req(wl, wlvif,
index 5eb8c7fc1567e7e759de62b5e57226cdaebf1fd8..eadee42689d1802ba6eba714ca798703f2abe843 100644 (file)
@@ -78,8 +78,7 @@ struct wl18xx_cmd_scan_params {
        __le16 long_cycles_sec;
        u8 short_cycles_count;
        u8 total_cycles; /* 0 - infinite */
-       u8 rate;
-       u8 padding[1];
+       u8 padding[2];
 
        union {
                struct {
@@ -93,7 +92,20 @@ struct wl18xx_cmd_scan_params {
        u8 ssid[IEEE80211_MAX_SSID_LEN];
        u8 ssid_len;     /* For SCAN_SSID_FILTER_SPECIFIC */
        u8 tag;
-       u8 padding1[2];
+       u8 rate;
+
+       /* send SCAN_REPORT_EVENT in periodic scans after each cycle
+       * if number of results >= report_threshold. Must be 0 for
+       * non periodic scans
+       */
+       u8 report_threshold;
+
+       /* Should periodic scan stop after a report event was created.
+       * Must be 0 for non periodic scans.
+       */
+       u8 terminate_on_report;
+
+       u8 padding1[3];
 } __packed;
 
 struct wl18xx_cmd_scan_stop {
index 2776d953b6b4b77952e9cf891670bb9dfd48a720..70f289aa1bc6dd8f7991fae5eacf958e35b6d4f2 100644 (file)
@@ -94,16 +94,6 @@ void wlcore_event_soft_gemini_sense(struct wl1271 *wl, u8 enable)
 }
 EXPORT_SYMBOL_GPL(wlcore_event_soft_gemini_sense);
 
-void wlcore_event_sched_scan_report(struct wl1271 *wl,
-                                   u8 status)
-{
-       wl1271_debug(DEBUG_EVENT, "PERIODIC_SCAN_REPORT_EVENT (status 0x%0x)",
-                    status);
-
-       wl1271_scan_sched_scan_results(wl);
-}
-EXPORT_SYMBOL_GPL(wlcore_event_sched_scan_report);
-
 void wlcore_event_sched_scan_completed(struct wl1271 *wl,
                                       u8 status)
 {
index b4353be68ddba0e909089d5958632dbc53a67401..acc7a59d3828f1c40f62e09c7344b72d5942d9e3 100644 (file)
@@ -70,8 +70,6 @@ int wl1271_event_unmask(struct wl1271 *wl);
 int wl1271_event_handle(struct wl1271 *wl, u8 mbox);
 
 void wlcore_event_soft_gemini_sense(struct wl1271 *wl, u8 enable);
-void wlcore_event_sched_scan_report(struct wl1271 *wl,
-                                   u8 status);
 void wlcore_event_sched_scan_completed(struct wl1271 *wl,
                                       u8 status);
 void wlcore_event_ba_rx_constraint(struct wl1271 *wl,
index 6cfdeaea12f0b65b39259c4e17c1734733f60ed6..f407101e525b60a9c4bff3c402865d12f3d6afde 100644 (file)
@@ -460,9 +460,10 @@ out:
 }
 EXPORT_SYMBOL_GPL(wlcore_scan_sched_scan_ssid_list);
 
-void wl1271_scan_sched_scan_results(struct wl1271 *wl)
+void wlcore_scan_sched_scan_results(struct wl1271 *wl)
 {
        wl1271_debug(DEBUG_SCAN, "got periodic scan results");
 
        ieee80211_sched_scan_results(wl->hw);
 }
+EXPORT_SYMBOL_GPL(wlcore_scan_sched_scan_results);
index 9ae606555aeb319ca4258e43f8cd209fbe68d417..a6ab24b5c0f96ab86278f71b93aae80a11048433 100644 (file)
@@ -39,7 +39,7 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
                                     struct cfg80211_sched_scan_request *req,
                                     struct ieee80211_sched_scan_ies *ies);
 int wl1271_scan_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif);
-void wl1271_scan_sched_scan_results(struct wl1271 *wl);
+void wlcore_scan_sched_scan_results(struct wl1271 *wl);
 
 #define WL1271_SCAN_MAX_CHANNELS       24
 #define WL1271_SCAN_DEFAULT_TAG        1