1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * This file is part of wl12xx 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2012 Texas Instruments. All rights reserved. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __WL12XX_SCAN_H__ 9*4882a593Smuzhiyun #define __WL12XX_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 #define WL12XX_MAX_CHANNELS_5GHZ 23 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct basic_scan_params { 18*4882a593Smuzhiyun /* Scan option flags (WL1271_SCAN_OPT_*) */ 19*4882a593Smuzhiyun __le16 scan_options; 20*4882a593Smuzhiyun u8 role_id; 21*4882a593Smuzhiyun /* Number of scan channels in the list (maximum 30) */ 22*4882a593Smuzhiyun u8 n_ch; 23*4882a593Smuzhiyun /* This field indicates the number of probe requests to send 24*4882a593Smuzhiyun per channel for an active scan */ 25*4882a593Smuzhiyun u8 n_probe_reqs; 26*4882a593Smuzhiyun u8 tid_trigger; 27*4882a593Smuzhiyun u8 ssid_len; 28*4882a593Smuzhiyun u8 use_ssid_list; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* Rate bit field for sending the probes */ 31*4882a593Smuzhiyun __le32 tx_rate; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun u8 ssid[IEEE80211_MAX_SSID_LEN]; 34*4882a593Smuzhiyun /* Band to scan */ 35*4882a593Smuzhiyun u8 band; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun u8 scan_tag; 38*4882a593Smuzhiyun u8 padding2[2]; 39*4882a593Smuzhiyun } __packed; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct basic_scan_channel_params { 42*4882a593Smuzhiyun /* Duration in TU to wait for frames on a channel for active scan */ 43*4882a593Smuzhiyun __le32 min_duration; 44*4882a593Smuzhiyun __le32 max_duration; 45*4882a593Smuzhiyun __le32 bssid_lsb; 46*4882a593Smuzhiyun __le16 bssid_msb; 47*4882a593Smuzhiyun u8 early_termination; 48*4882a593Smuzhiyun u8 tx_power_att; 49*4882a593Smuzhiyun u8 channel; 50*4882a593Smuzhiyun /* FW internal use only! */ 51*4882a593Smuzhiyun u8 dfs_candidate; 52*4882a593Smuzhiyun u8 activity_detected; 53*4882a593Smuzhiyun u8 pad; 54*4882a593Smuzhiyun } __packed; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct wl1271_cmd_scan { 57*4882a593Smuzhiyun struct wl1271_cmd_header header; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct basic_scan_params params; 60*4882a593Smuzhiyun struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS]; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* src mac address */ 63*4882a593Smuzhiyun u8 addr[ETH_ALEN]; 64*4882a593Smuzhiyun u8 padding[2]; 65*4882a593Smuzhiyun } __packed; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct wl1271_cmd_sched_scan_config { 68*4882a593Smuzhiyun struct wl1271_cmd_header header; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun __le32 intervals[SCAN_MAX_CYCLE_INTERVALS]; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun s8 rssi_threshold; /* for filtering (in dBm) */ 73*4882a593Smuzhiyun s8 snr_threshold; /* for filtering (in dB) */ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun u8 cycles; /* maximum number of scan cycles */ 76*4882a593Smuzhiyun u8 report_after; /* report when this number of results are received */ 77*4882a593Smuzhiyun u8 terminate; /* stop scanning after reporting */ 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun u8 tag; 80*4882a593Smuzhiyun u8 bss_type; /* for filtering */ 81*4882a593Smuzhiyun u8 filter_type; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun u8 ssid_len; /* For SCAN_SSID_FILTER_SPECIFIC */ 84*4882a593Smuzhiyun u8 ssid[IEEE80211_MAX_SSID_LEN]; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun u8 n_probe_reqs; /* Number of probes requests per channel */ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun u8 passive[SCAN_MAX_BANDS]; 89*4882a593Smuzhiyun u8 active[SCAN_MAX_BANDS]; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun u8 dfs; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun u8 n_pactive_ch; /* number of pactive (passive until fw detects energy) 94*4882a593Smuzhiyun channels in BG band */ 95*4882a593Smuzhiyun u8 role_id; 96*4882a593Smuzhiyun u8 padding[1]; 97*4882a593Smuzhiyun struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ]; 98*4882a593Smuzhiyun struct conn_scan_ch_params channels_5[WL12XX_MAX_CHANNELS_5GHZ]; 99*4882a593Smuzhiyun struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ]; 100*4882a593Smuzhiyun } __packed; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct wl1271_cmd_sched_scan_start { 103*4882a593Smuzhiyun struct wl1271_cmd_header header; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun u8 tag; 106*4882a593Smuzhiyun u8 role_id; 107*4882a593Smuzhiyun u8 padding[2]; 108*4882a593Smuzhiyun } __packed; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct wl1271_cmd_sched_scan_stop { 111*4882a593Smuzhiyun struct wl1271_cmd_header header; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun u8 tag; 114*4882a593Smuzhiyun u8 role_id; 115*4882a593Smuzhiyun u8 padding[2]; 116*4882a593Smuzhiyun } __packed; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun int wl12xx_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 119*4882a593Smuzhiyun struct cfg80211_scan_request *req); 120*4882a593Smuzhiyun int wl12xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif); 121*4882a593Smuzhiyun void wl12xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif); 122*4882a593Smuzhiyun int wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 123*4882a593Smuzhiyun struct cfg80211_sched_scan_request *req, 124*4882a593Smuzhiyun struct ieee80211_scan_ies *ies); 125*4882a593Smuzhiyun void wl12xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif); 126*4882a593Smuzhiyun #endif 127