1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * This file is part of wl18xx 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2012 Texas Instruments. All rights reserved. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __WL18XX_SCAN_H__ 9*4882a593Smuzhiyun #define __WL18XX_SCAN_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include "../wlcore/wlcore.h" 12*4882a593Smuzhiyun #include "../wlcore/cmd.h" 13*4882a593Smuzhiyun #include "../wlcore/scan.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun struct tracking_ch_params { 16*4882a593Smuzhiyun struct conn_scan_ch_params channel; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun __le32 bssid_lsb; 19*4882a593Smuzhiyun __le16 bssid_msb; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun u8 padding[2]; 22*4882a593Smuzhiyun } __packed; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* probe request rate */ 25*4882a593Smuzhiyun enum 26*4882a593Smuzhiyun { 27*4882a593Smuzhiyun WL18XX_SCAN_RATE_1 = 0, 28*4882a593Smuzhiyun WL18XX_SCAN_RATE_5_5 = 1, 29*4882a593Smuzhiyun WL18XX_SCAN_RATE_6 = 2, 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define WL18XX_MAX_CHANNELS_5GHZ 32 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct wl18xx_cmd_scan_params { 35*4882a593Smuzhiyun struct wl1271_cmd_header header; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun u8 role_id; 38*4882a593Smuzhiyun u8 scan_type; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun s8 rssi_threshold; /* for filtering (in dBm) */ 41*4882a593Smuzhiyun s8 snr_threshold; /* for filtering (in dB) */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun u8 bss_type; /* for filtering */ 44*4882a593Smuzhiyun u8 ssid_from_list; /* use ssid from configured ssid list */ 45*4882a593Smuzhiyun u8 filter; /* forward only results with matching ssids */ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* 48*4882a593Smuzhiyun * add broadcast ssid in addition to the configured ssids. 49*4882a593Smuzhiyun * the driver should add dummy entry for it (?). 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun u8 add_broadcast; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun u8 urgency; 54*4882a593Smuzhiyun u8 protect; /* ??? */ 55*4882a593Smuzhiyun u8 n_probe_reqs; /* Number of probes requests per channel */ 56*4882a593Smuzhiyun u8 terminate_after; /* early terminate scan operation */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun u8 passive[SCAN_MAX_BANDS]; /* number of passive scan channels */ 59*4882a593Smuzhiyun u8 active[SCAN_MAX_BANDS]; /* number of active scan channels */ 60*4882a593Smuzhiyun u8 dfs; /* number of dfs channels in 5ghz */ 61*4882a593Smuzhiyun u8 passive_active; /* number of passive before active channels 2.4ghz */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun __le16 short_cycles_msec; 64*4882a593Smuzhiyun __le16 long_cycles_msec; 65*4882a593Smuzhiyun u8 short_cycles_count; 66*4882a593Smuzhiyun u8 total_cycles; /* 0 - infinite */ 67*4882a593Smuzhiyun u8 padding[2]; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun union { 70*4882a593Smuzhiyun struct { 71*4882a593Smuzhiyun struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ]; 72*4882a593Smuzhiyun struct conn_scan_ch_params channels_5[WL18XX_MAX_CHANNELS_5GHZ]; 73*4882a593Smuzhiyun struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ]; 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun struct tracking_ch_params channels_tracking[WL1271_SCAN_MAX_CHANNELS]; 76*4882a593Smuzhiyun } ; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun u8 ssid[IEEE80211_MAX_SSID_LEN]; 79*4882a593Smuzhiyun u8 ssid_len; /* For SCAN_SSID_FILTER_SPECIFIC */ 80*4882a593Smuzhiyun u8 tag; 81*4882a593Smuzhiyun u8 rate; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* send SCAN_REPORT_EVENT in periodic scans after each cycle 84*4882a593Smuzhiyun * if number of results >= report_threshold. Must be 0 for 85*4882a593Smuzhiyun * non periodic scans 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun u8 report_threshold; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* Should periodic scan stop after a report event was created. 90*4882a593Smuzhiyun * Must be 0 for non periodic scans. 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun u8 terminate_on_report; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun u8 padding1[3]; 95*4882a593Smuzhiyun } __packed; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct wl18xx_cmd_scan_stop { 98*4882a593Smuzhiyun struct wl1271_cmd_header header; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun u8 role_id; 101*4882a593Smuzhiyun u8 scan_type; 102*4882a593Smuzhiyun u8 padding[2]; 103*4882a593Smuzhiyun } __packed; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun int wl18xx_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 106*4882a593Smuzhiyun struct cfg80211_scan_request *req); 107*4882a593Smuzhiyun int wl18xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif); 108*4882a593Smuzhiyun void wl18xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif); 109*4882a593Smuzhiyun int wl18xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 110*4882a593Smuzhiyun struct cfg80211_sched_scan_request *req, 111*4882a593Smuzhiyun struct ieee80211_scan_ies *ies); 112*4882a593Smuzhiyun void wl18xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif); 113*4882a593Smuzhiyun #endif 114