1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _wl_cfg80211_h_
18#define _wl_cfg80211_h_
19
20
21#include <brcmu_d11.h>
22
23#define WL_NUM_SCAN_MAX 10
24#define WL_NUM_PMKIDS_MAX MAXPMKID
25#define WL_TLV_INFO_MAX 1024
26#define WL_BSS_INFO_MAX 2048
27#define WL_ASSOC_INFO_MAX 512
28#define WL_EXTRA_BUF_MAX 2048
29#define WL_ROAM_TRIGGER_LEVEL -75
30#define WL_ROAM_DELTA 20
31#define WL_BEACON_TIMEOUT 3
32
33#define WL_SCAN_CHANNEL_TIME 40
34#define WL_SCAN_UNASSOC_TIME 40
35#define WL_SCAN_PASSIVE_TIME 120
36
37#define WL_ESCAN_BUF_SIZE (1024 * 64)
38#define WL_ESCAN_TIMER_INTERVAL_MS 8000
39
40#define WL_ESCAN_ACTION_START 1
41#define WL_ESCAN_ACTION_CONTINUE 2
42#define WL_ESCAN_ACTION_ABORT 3
43
44#define WL_AUTH_SHARED_KEY 1
45#define IE_MAX_LEN 512
46
47
48#define TLV_LEN_OFF 1
49#define TLV_HDR_LEN 2
50#define TLV_BODY_OFF 2
51#define TLV_OUI_LEN 3
52
53
54#define BRCMF_VNDR_IE_BEACON_FLAG 0x1
55#define BRCMF_VNDR_IE_PRBRSP_FLAG 0x2
56#define BRCMF_VNDR_IE_ASSOCRSP_FLAG 0x4
57#define BRCMF_VNDR_IE_AUTHRSP_FLAG 0x8
58#define BRCMF_VNDR_IE_PRBREQ_FLAG 0x10
59#define BRCMF_VNDR_IE_ASSOCREQ_FLAG 0x20
60
61#define BRCMF_VNDR_IE_IWAPID_FLAG 0x40
62
63#define BRCMF_VNDR_IE_CUSTOM_FLAG 0x100
64
65
66#define BRCMF_VNDR_IE_GONREQ_FLAG 0x001000
67#define BRCMF_VNDR_IE_GONRSP_FLAG 0x002000
68#define BRCMF_VNDR_IE_GONCFM_FLAG 0x004000
69#define BRCMF_VNDR_IE_INVREQ_FLAG 0x008000
70#define BRCMF_VNDR_IE_INVRSP_FLAG 0x010000
71#define BRCMF_VNDR_IE_DISREQ_FLAG 0x020000
72#define BRCMF_VNDR_IE_DISRSP_FLAG 0x040000
73#define BRCMF_VNDR_IE_PRDREQ_FLAG 0x080000
74#define BRCMF_VNDR_IE_PRDRSP_FLAG 0x100000
75
76#define BRCMF_VNDR_IE_P2PAF_SHIFT 12
77
78
79
80
81
82
83
84
85
86enum brcmf_scan_status {
87 BRCMF_SCAN_STATUS_BUSY,
88 BRCMF_SCAN_STATUS_ABORT,
89 BRCMF_SCAN_STATUS_SUPPRESS,
90};
91
92
93
94
95
96
97
98
99
100enum wl_mode {
101 WL_MODE_BSS,
102 WL_MODE_IBSS,
103 WL_MODE_AP,
104 WL_MODE_P2P
105};
106
107
108struct brcmf_cfg80211_conf {
109 u32 frag_threshold;
110 u32 rts_threshold;
111 u32 retry_short;
112 u32 retry_long;
113 s32 tx_power;
114 struct ieee80211_channel channel;
115};
116
117
118struct brcmf_cfg80211_scan_req {
119 struct brcmf_ssid_le ssid_le;
120};
121
122
123struct brcmf_cfg80211_ie {
124 u16 offset;
125 u8 buf[WL_TLV_INFO_MAX];
126};
127
128
129struct brcmf_cfg80211_security {
130 u32 wpa_versions;
131 u32 auth_type;
132 u32 cipher_pairwise;
133 u32 cipher_group;
134 u32 wpa_auth;
135};
136
137
138
139
140
141
142
143
144struct brcmf_cfg80211_profile {
145 struct brcmf_ssid ssid;
146 u8 bssid[ETH_ALEN];
147 struct brcmf_cfg80211_security sec;
148};
149
150
151
152
153
154
155
156
157
158
159
160enum brcmf_vif_status {
161 BRCMF_VIF_STATUS_READY,
162 BRCMF_VIF_STATUS_CONNECTING,
163 BRCMF_VIF_STATUS_CONNECTED,
164 BRCMF_VIF_STATUS_DISCONNECTING,
165 BRCMF_VIF_STATUS_AP_CREATING,
166 BRCMF_VIF_STATUS_AP_CREATED
167};
168
169
170
171
172
173
174
175
176
177
178
179struct vif_saved_ie {
180 u8 probe_req_ie[IE_MAX_LEN];
181 u8 probe_res_ie[IE_MAX_LEN];
182 u8 beacon_ie[IE_MAX_LEN];
183 u8 assoc_req_ie[IE_MAX_LEN];
184 u32 probe_req_ie_len;
185 u32 probe_res_ie_len;
186 u32 beacon_ie_len;
187 u32 assoc_req_ie_len;
188};
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203struct brcmf_cfg80211_vif {
204 struct brcmf_if *ifp;
205 struct wireless_dev wdev;
206 struct brcmf_cfg80211_profile profile;
207 s32 mode;
208 s32 roam_off;
209 unsigned long sme_state;
210 bool pm_block;
211 struct vif_saved_ie saved_ie;
212 struct list_head list;
213 u16 mgmt_rx_reg;
214};
215
216
217struct brcmf_cfg80211_connect_info {
218 u8 *req_ie;
219 s32 req_ie_len;
220 u8 *resp_ie;
221 s32 resp_ie_len;
222};
223
224
225struct brcmf_cfg80211_assoc_ielen_le {
226 __le32 req_len;
227 __le32 resp_len;
228};
229
230
231struct brcmf_cfg80211_pmk_list {
232 struct pmkid_list pmkids;
233 struct pmkid foo[MAXPMKID - 1];
234};
235
236
237enum wl_escan_state {
238 WL_ESCAN_STATE_IDLE,
239 WL_ESCAN_STATE_SCANNING
240};
241
242struct escan_info {
243 u32 escan_state;
244 u8 escan_buf[WL_ESCAN_BUF_SIZE];
245 struct wiphy *wiphy;
246 struct brcmf_if *ifp;
247 s32 (*run)(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp,
248 struct cfg80211_scan_request *request, u16 action);
249};
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268struct brcmf_pno_param_le {
269 __le32 version;
270 __le32 scan_freq;
271 __le32 lost_network_timeout;
272 __le16 flags;
273 __le16 rssi_margin;
274 u8 bestn;
275 u8 mscan;
276 u8 repeat;
277 u8 exp;
278 __le32 slow_freq;
279};
280
281
282
283
284
285
286
287
288
289
290
291struct brcmf_pno_net_param_le {
292 struct brcmf_ssid_le ssid;
293 __le32 flags;
294 __le32 infra;
295 __le32 auth;
296 __le32 wpa_auth;
297 __le32 wsec;
298};
299
300
301
302
303
304
305
306
307
308
309
310struct brcmf_pno_net_info_le {
311 u8 bssid[ETH_ALEN];
312 u8 channel;
313 u8 SSID_len;
314 u8 SSID[32];
315 __le16 RSSI;
316 __le16 timestamp;
317};
318
319
320
321
322
323
324
325
326struct brcmf_pno_scanresults_le {
327 __le32 version;
328 __le32 status;
329 __le32 count;
330};
331
332
333
334
335
336
337
338
339
340
341struct brcmf_cfg80211_vif_event {
342 wait_queue_head_t vif_wq;
343 struct mutex vif_event_lock;
344 u8 action;
345 struct brcmf_cfg80211_vif *vif;
346};
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384struct brcmf_cfg80211_info {
385 struct wiphy *wiphy;
386 struct brcmf_cfg80211_conf *conf;
387 struct brcmf_p2p_info p2p;
388 struct brcmf_btcoex_info *btcoex;
389 struct cfg80211_scan_request *scan_request;
390 struct mutex usr_sync;
391 struct brcmf_scan_results *bss_list;
392 struct brcmf_cfg80211_scan_req scan_req_int;
393 struct wl_cfg80211_bss_info *bss_info;
394 struct brcmf_cfg80211_ie ie;
395 struct brcmf_cfg80211_connect_info conn_info;
396 struct brcmf_cfg80211_pmk_list *pmk_list;
397 unsigned long scan_status;
398 struct brcmf_pub *pub;
399 u32 channel;
400 bool active_scan;
401 bool sched_escan;
402 bool ibss_starter;
403 bool pwr_save;
404 bool dongle_up;
405 bool roam_on;
406 bool scan_tried;
407 u8 *dcmd_buf;
408 u8 *extra_buf;
409 struct dentry *debugfsdir;
410 struct escan_info escan_info;
411 struct timer_list escan_timeout;
412 struct work_struct escan_timeout_work;
413 u8 *escan_ioctl_buf;
414 struct list_head vif_list;
415 u8 vif_cnt;
416 struct brcmf_cfg80211_vif_event vif_event;
417 struct completion vif_disabled;
418 struct brcmu_d11inf d11inf;
419};
420
421
422
423
424
425
426
427
428struct brcmf_tlv {
429 u8 id;
430 u8 len;
431 u8 data[1];
432};
433
434static inline struct wiphy *cfg_to_wiphy(struct brcmf_cfg80211_info *cfg)
435{
436 return cfg->wiphy;
437}
438
439static inline struct brcmf_cfg80211_info *wiphy_to_cfg(struct wiphy *w)
440{
441 return (struct brcmf_cfg80211_info *)(wiphy_priv(w));
442}
443
444static inline struct brcmf_cfg80211_info *wdev_to_cfg(struct wireless_dev *wd)
445{
446 return (struct brcmf_cfg80211_info *)(wdev_priv(wd));
447}
448
449static inline
450struct net_device *cfg_to_ndev(struct brcmf_cfg80211_info *cfg)
451{
452 struct brcmf_cfg80211_vif *vif;
453 vif = list_first_entry(&cfg->vif_list, struct brcmf_cfg80211_vif, list);
454 return vif->wdev.netdev;
455}
456
457static inline struct brcmf_cfg80211_info *ndev_to_cfg(struct net_device *ndev)
458{
459 return wdev_to_cfg(ndev->ieee80211_ptr);
460}
461
462static inline struct brcmf_cfg80211_profile *ndev_to_prof(struct net_device *nd)
463{
464 struct brcmf_if *ifp = netdev_priv(nd);
465 return &ifp->vif->profile;
466}
467
468static inline struct brcmf_cfg80211_vif *ndev_to_vif(struct net_device *ndev)
469{
470 struct brcmf_if *ifp = netdev_priv(ndev);
471 return ifp->vif;
472}
473
474static inline struct
475brcmf_cfg80211_connect_info *cfg_to_conn(struct brcmf_cfg80211_info *cfg)
476{
477 return &cfg->conn_info;
478}
479
480struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
481 struct device *busdev);
482void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
483s32 brcmf_cfg80211_up(struct net_device *ndev);
484s32 brcmf_cfg80211_down(struct net_device *ndev);
485enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);
486
487struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
488 enum nl80211_iftype type,
489 bool pm_block);
490void brcmf_free_vif(struct brcmf_cfg80211_info *cfg,
491 struct brcmf_cfg80211_vif *vif);
492
493s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
494 const u8 *vndr_ie_buf, u32 vndr_ie_len);
495s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif);
496struct brcmf_tlv *brcmf_parse_tlvs(void *buf, int buflen, uint key);
497u16 channel_to_chanspec(struct brcmu_d11inf *d11inf,
498 struct ieee80211_channel *ch);
499u32 wl_get_vif_state_all(struct brcmf_cfg80211_info *cfg, unsigned long state);
500void brcmf_cfg80211_arm_vif_event(struct brcmf_cfg80211_info *cfg,
501 struct brcmf_cfg80211_vif *vif);
502bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg);
503int brcmf_cfg80211_wait_vif_event_timeout(struct brcmf_cfg80211_info *cfg,
504 u8 action, ulong timeout);
505s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
506 struct brcmf_if *ifp, bool aborted,
507 bool fw_abort);
508void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
509void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
510
511#endif
512