Skip to content

Commit

Permalink
wlcore: support scan reports during periodic scan
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eyal Shapira authored and Luciano Coelho committed Dec 11, 2012
1 parent c80daad commit 0b70078
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 20 deletions.
10 changes: 7 additions & 3 deletions drivers/net/wireless/ti/wl12xx/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions drivers/net/wireless/ti/wl18xx/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ti/wl18xx/event.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ti/wl18xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/wireless/ti/wl18xx/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
18 changes: 15 additions & 3 deletions drivers/net/wireless/ti/wl18xx/scan.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
10 changes: 0 additions & 10 deletions drivers/net/wireless/ti/wlcore/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
2 changes: 0 additions & 2 deletions drivers/net/wireless/ti/wlcore/event.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/ti/wlcore/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -460,9 +460,10 @@ wlcore_scan_sched_scan_ssid_list(struct wl1271 *wl,
}
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);
2 changes: 1 addition & 1 deletion drivers/net/wireless/ti/wlcore/scan.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 0b70078

Please sign in to comment.