xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/ti/wl12xx/scan.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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