1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef __SCAN_H__
25#define __SCAN_H__
26
27#include "wl12xx.h"
28
29int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
30 struct cfg80211_scan_request *req);
31int wl1271_scan_stop(struct wl1271 *wl);
32int wl1271_scan_build_probe_req(struct wl1271 *wl,
33 const u8 *ssid, size_t ssid_len,
34 const u8 *ie, size_t ie_len, u8 band);
35void wl1271_scan_stm(struct wl1271 *wl);
36void wl1271_scan_complete_work(struct work_struct *work);
37int wl1271_scan_sched_scan_config(struct wl1271 *wl,
38 struct cfg80211_sched_scan_request *req,
39 struct ieee80211_sched_scan_ies *ies);
40int wl1271_scan_sched_scan_start(struct wl1271 *wl);
41void wl1271_scan_sched_scan_stop(struct wl1271 *wl);
42void wl1271_scan_sched_scan_results(struct wl1271 *wl);
43
44#define WL1271_SCAN_MAX_CHANNELS 24
45#define WL1271_SCAN_DEFAULT_TAG 1
46#define WL1271_SCAN_CURRENT_TX_PWR 0
47#define WL1271_SCAN_OPT_ACTIVE 0
48#define WL1271_SCAN_OPT_PASSIVE 1
49#define WL1271_SCAN_OPT_TRIGGERED_SCAN 2
50#define WL1271_SCAN_OPT_PRIORITY_HIGH 4
51
52#define WL1271_SCAN_OPT_FORCE 8
53#define WL1271_SCAN_BAND_2_4_GHZ 0
54#define WL1271_SCAN_BAND_5_GHZ 1
55
56#define WL1271_SCAN_TIMEOUT 10000
57
58enum {
59 WL1271_SCAN_STATE_IDLE,
60 WL1271_SCAN_STATE_2GHZ_ACTIVE,
61 WL1271_SCAN_STATE_2GHZ_PASSIVE,
62 WL1271_SCAN_STATE_5GHZ_ACTIVE,
63 WL1271_SCAN_STATE_5GHZ_PASSIVE,
64 WL1271_SCAN_STATE_DONE
65};
66
67struct basic_scan_params {
68
69 __le16 scan_options;
70 u8 role_id;
71
72 u8 n_ch;
73
74
75 u8 n_probe_reqs;
76 u8 tid_trigger;
77 u8 ssid_len;
78 u8 use_ssid_list;
79
80
81 __le32 tx_rate;
82
83 u8 ssid[IEEE80211_MAX_SSID_LEN];
84
85 u8 band;
86
87 u8 scan_tag;
88 u8 padding2[2];
89} __packed;
90
91struct basic_scan_channel_params {
92
93 __le32 min_duration;
94 __le32 max_duration;
95 __le32 bssid_lsb;
96 __le16 bssid_msb;
97 u8 early_termination;
98 u8 tx_power_att;
99 u8 channel;
100
101 u8 dfs_candidate;
102 u8 activity_detected;
103 u8 pad;
104} __packed;
105
106struct wl1271_cmd_scan {
107 struct wl1271_cmd_header header;
108
109 struct basic_scan_params params;
110 struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS];
111
112
113 u8 addr[ETH_ALEN];
114 u8 padding[2];
115} __packed;
116
117struct wl1271_cmd_trigger_scan_to {
118 struct wl1271_cmd_header header;
119
120 __le32 timeout;
121} __packed;
122
123#define MAX_CHANNELS_2GHZ 14
124#define MAX_CHANNELS_5GHZ 23
125#define MAX_CHANNELS_4GHZ 4
126
127#define SCAN_MAX_CYCLE_INTERVALS 16
128#define SCAN_MAX_BANDS 3
129
130enum {
131 SCAN_SSID_FILTER_ANY = 0,
132 SCAN_SSID_FILTER_SPECIFIC = 1,
133 SCAN_SSID_FILTER_LIST = 2,
134 SCAN_SSID_FILTER_DISABLED = 3
135};
136
137enum {
138 SCAN_BSS_TYPE_INDEPENDENT,
139 SCAN_BSS_TYPE_INFRASTRUCTURE,
140 SCAN_BSS_TYPE_ANY,
141};
142
143#define SCAN_CHANNEL_FLAGS_DFS BIT(0)
144#define SCAN_CHANNEL_FLAGS_DFS_ENABLED BIT(1)
145
146struct conn_scan_ch_params {
147 __le16 min_duration;
148 __le16 max_duration;
149 __le16 passive_duration;
150
151 u8 channel;
152 u8 tx_power_att;
153
154
155 u8 flags;
156
157 u8 padding[3];
158} __packed;
159
160struct wl1271_cmd_sched_scan_config {
161 struct wl1271_cmd_header header;
162
163 __le32 intervals[SCAN_MAX_CYCLE_INTERVALS];
164
165 s8 rssi_threshold;
166 s8 snr_threshold;
167
168 u8 cycles;
169 u8 report_after;
170 u8 terminate;
171
172 u8 tag;
173 u8 bss_type;
174 u8 filter_type;
175
176 u8 ssid_len;
177 u8 ssid[IEEE80211_MAX_SSID_LEN];
178
179 u8 n_probe_reqs;
180
181 u8 passive[SCAN_MAX_BANDS];
182 u8 active[SCAN_MAX_BANDS];
183
184 u8 dfs;
185
186 u8 padding[3];
187
188 struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ];
189 struct conn_scan_ch_params channels_5[MAX_CHANNELS_5GHZ];
190 struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ];
191} __packed;
192
193
194#define SCHED_SCAN_MAX_SSIDS 16
195
196enum {
197 SCAN_SSID_TYPE_PUBLIC = 0,
198 SCAN_SSID_TYPE_HIDDEN = 1,
199};
200
201struct wl1271_ssid {
202 u8 type;
203 u8 len;
204 u8 ssid[IEEE80211_MAX_SSID_LEN];
205
206} __packed;
207
208struct wl1271_cmd_sched_scan_ssid_list {
209 struct wl1271_cmd_header header;
210
211 u8 n_ssids;
212 struct wl1271_ssid ssids[SCHED_SCAN_MAX_SSIDS];
213 u8 padding[3];
214} __packed;
215
216struct wl1271_cmd_sched_scan_start {
217 struct wl1271_cmd_header header;
218
219 u8 tag;
220 u8 padding[3];
221} __packed;
222
223struct wl1271_cmd_sched_scan_stop {
224 struct wl1271_cmd_header header;
225
226 u8 tag;
227 u8 padding[3];
228} __packed;
229
230
231#endif
232