blob: 92115156522fd73512fb2d78c2f7267710fac08b [file] [log] [blame]
Luciano Coelho34dd2aa2010-07-08 17:50:06 +03001/*
2 * This file is part of wl1271
3 *
4 * Copyright (C) 2009-2010 Nokia Corporation
5 *
6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20 * 02110-1301 USA
21 *
22 */
23
Shahar Levi00d20102010-11-08 11:20:10 +000024#ifndef __SCAN_H__
25#define __SCAN_H__
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030026
Shahar Levi00d20102010-11-08 11:20:10 +000027#include "wl12xx.h"
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030028
29int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
Luciano Coelho08688d62010-07-08 17:50:07 +030030 struct cfg80211_scan_request *req);
Eliad Peller2aa01592011-06-27 13:06:44 +030031int wl1271_scan_stop(struct wl1271 *wl);
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030032int 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);
Luciano Coelho08688d62010-07-08 17:50:07 +030035void wl1271_scan_stm(struct wl1271 *wl);
Juuso Oikarinenc454f1d2010-08-24 06:28:03 +030036void wl1271_scan_complete_work(struct work_struct *work);
Luciano Coelho95feadc2011-05-10 14:38:59 +030037int 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);
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030043
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
Eliad Pellera4e02f32011-08-14 13:17:10 +030049#define WL1271_SCAN_OPT_TRIGGERED_SCAN 2
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030050#define WL1271_SCAN_OPT_PRIORITY_HIGH 4
Eliad Pellera4e02f32011-08-14 13:17:10 +030051/* scan even if we fail to enter psm */
52#define WL1271_SCAN_OPT_FORCE 8
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030053#define WL1271_SCAN_BAND_2_4_GHZ 0
54#define WL1271_SCAN_BAND_5_GHZ 1
Luciano Coelho08688d62010-07-08 17:50:07 +030055
Juuso Oikarinen78abd322010-09-21 06:23:32 +020056#define WL1271_SCAN_TIMEOUT 10000 /* msec */
57
Luciano Coelho08688d62010-07-08 17:50:07 +030058enum {
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};
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030066
67struct basic_scan_params {
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030068 /* Scan option flags (WL1271_SCAN_OPT_*) */
69 __le16 scan_options;
Eliad Pellera4e02f32011-08-14 13:17:10 +030070 u8 role_id;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030071 /* Number of scan channels in the list (maximum 30) */
Luciano Coelho08688d62010-07-08 17:50:07 +030072 u8 n_ch;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030073 /* This field indicates the number of probe requests to send
74 per channel for an active scan */
Luciano Coelho08688d62010-07-08 17:50:07 +030075 u8 n_probe_reqs;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030076 u8 tid_trigger;
77 u8 ssid_len;
Eliad Pellera4e02f32011-08-14 13:17:10 +030078 u8 use_ssid_list;
79
80 /* Rate bit field for sending the probes */
81 __le32 tx_rate;
82
Johannes Berg3b40c042011-07-13 10:39:16 +020083 u8 ssid[IEEE80211_MAX_SSID_LEN];
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030084 /* Band to scan */
85 u8 band;
Eliad Pellera4e02f32011-08-14 13:17:10 +030086
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030087 u8 scan_tag;
Eliad Pellera4e02f32011-08-14 13:17:10 +030088 u8 padding2[2];
Luciano Coelho72e93e92010-07-09 14:10:58 +030089} __packed;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +030090
91struct basic_scan_channel_params {
92 /* Duration in TU to wait for frames on a channel for active scan */
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 /* FW internal use only! */
101 u8 dfs_candidate;
102 u8 activity_detected;
103 u8 pad;
Luciano Coelho72e93e92010-07-09 14:10:58 +0300104} __packed;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +0300105
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];
Eliad Pellera4e02f32011-08-14 13:17:10 +0300111
112 /* src mac address */
113 u8 addr[ETH_ALEN];
114 u8 padding[2];
Luciano Coelho72e93e92010-07-09 14:10:58 +0300115} __packed;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +0300116
117struct wl1271_cmd_trigger_scan_to {
118 struct wl1271_cmd_header header;
119
120 __le32 timeout;
Luciano Coelho72e93e92010-07-09 14:10:58 +0300121} __packed;
Luciano Coelho34dd2aa2010-07-08 17:50:06 +0300122
Luciano Coelhod2c2bb92011-05-31 16:38:56 +0300123#define MAX_CHANNELS_2GHZ 14
124#define MAX_CHANNELS_5GHZ 23
125#define MAX_CHANNELS_4GHZ 4
126
Luciano Coelho95feadc2011-05-10 14:38:59 +0300127#define SCAN_MAX_CYCLE_INTERVALS 16
128#define SCAN_MAX_BANDS 3
129
130enum {
Luciano Coelho95feadc2011-05-10 14:38:59 +0300131 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
Luciano Coelho2497a242011-05-27 15:34:46 +0300143#define SCAN_CHANNEL_FLAGS_DFS BIT(0)
144#define SCAN_CHANNEL_FLAGS_DFS_ENABLED BIT(1)
145
Luciano Coelho95feadc2011-05-10 14:38:59 +0300146struct 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 /* bit 0: DFS channel; bit 1: DFS enabled */
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; /* for filtering (in dBm) */
166 s8 snr_threshold; /* for filtering (in dB) */
167
168 u8 cycles; /* maximum number of scan cycles */
169 u8 report_after; /* report when this number of results are received */
170 u8 terminate; /* stop scanning after reporting */
171
172 u8 tag;
173 u8 bss_type; /* for filtering */
174 u8 filter_type;
175
176 u8 ssid_len; /* For SCAN_SSID_FILTER_SPECIFIC */
Johannes Berg3b40c042011-07-13 10:39:16 +0200177 u8 ssid[IEEE80211_MAX_SSID_LEN];
Luciano Coelho95feadc2011-05-10 14:38:59 +0300178
179 u8 n_probe_reqs; /* Number of probes requests per channel */
180
181 u8 passive[SCAN_MAX_BANDS];
182 u8 active[SCAN_MAX_BANDS];
183
184 u8 dfs;
185
186 u8 padding[3];
187
Luciano Coelhod2c2bb92011-05-31 16:38:56 +0300188 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];
Luciano Coelho95feadc2011-05-10 14:38:59 +0300191} __packed;
192
193
Eliad Pellera4e02f32011-08-14 13:17:10 +0300194#define SCHED_SCAN_MAX_SSIDS 16
Luciano Coelho95feadc2011-05-10 14:38:59 +0300195
196enum {
197 SCAN_SSID_TYPE_PUBLIC = 0,
198 SCAN_SSID_TYPE_HIDDEN = 1,
199};
200
201struct wl1271_ssid {
202 u8 type;
203 u8 len;
Johannes Berg3b40c042011-07-13 10:39:16 +0200204 u8 ssid[IEEE80211_MAX_SSID_LEN];
Luciano Coelho95feadc2011-05-10 14:38:59 +0300205 /* u8 padding[2]; */
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
Luciano Coelho34dd2aa2010-07-08 17:50:06 +0300231#endif /* __WL1271_SCAN_H__ */