1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef BRCMFMAC_CFG80211_H
18#define BRCMFMAC_CFG80211_H
19
20
21#include <brcmu_d11.h>
22
23#include "core.h"
24#include "fwil_types.h"
25#include "p2p.h"
26
27#define WL_NUM_SCAN_MAX 10
28#define WL_TLV_INFO_MAX 1024
29#define WL_BSS_INFO_MAX 2048
30#define WL_ASSOC_INFO_MAX 512
31#define WL_EXTRA_BUF_MAX 2048
32#define WL_ROAM_TRIGGER_LEVEL -75
33#define WL_ROAM_DELTA 20
34
35
36
37
38#define BRCMF_ESCAN_BUF_SIZE 65000
39#define BRCMF_ESCAN_TIMER_INTERVAL_MS 10000
40
41#define WL_ESCAN_ACTION_START 1
42#define WL_ESCAN_ACTION_CONTINUE 2
43#define WL_ESCAN_ACTION_ABORT 3
44
45#define WL_AUTH_SHARED_KEY 1
46#define IE_MAX_LEN 512
47
48
49#define TLV_LEN_OFF 1
50#define TLV_HDR_LEN 2
51#define TLV_BODY_OFF 2
52#define TLV_OUI_LEN 3
53
54
55#define BRCMF_VNDR_IE_BEACON_FLAG 0x1
56#define BRCMF_VNDR_IE_PRBRSP_FLAG 0x2
57#define BRCMF_VNDR_IE_ASSOCRSP_FLAG 0x4
58#define BRCMF_VNDR_IE_AUTHRSP_FLAG 0x8
59#define BRCMF_VNDR_IE_PRBREQ_FLAG 0x10
60#define BRCMF_VNDR_IE_ASSOCREQ_FLAG 0x20
61
62#define BRCMF_VNDR_IE_IWAPID_FLAG 0x40
63
64#define BRCMF_VNDR_IE_CUSTOM_FLAG 0x100
65
66
67#define BRCMF_VNDR_IE_GONREQ_FLAG 0x001000
68#define BRCMF_VNDR_IE_GONRSP_FLAG 0x002000
69#define BRCMF_VNDR_IE_GONCFM_FLAG 0x004000
70#define BRCMF_VNDR_IE_INVREQ_FLAG 0x008000
71#define BRCMF_VNDR_IE_INVRSP_FLAG 0x010000
72#define BRCMF_VNDR_IE_DISREQ_FLAG 0x020000
73#define BRCMF_VNDR_IE_DISRSP_FLAG 0x040000
74#define BRCMF_VNDR_IE_PRDREQ_FLAG 0x080000
75#define BRCMF_VNDR_IE_PRDRSP_FLAG 0x100000
76
77#define BRCMF_VNDR_IE_P2PAF_SHIFT 12
78
79#define BRCMF_MAX_DEFAULT_KEYS 6
80
81
82#define BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON 2
83#define BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_OFF 4
84
85#define BRCMF_VIF_EVENT_TIMEOUT msecs_to_jiffies(1500)
86
87
88
89
90
91
92
93
94enum brcmf_scan_status {
95 BRCMF_SCAN_STATUS_BUSY,
96 BRCMF_SCAN_STATUS_ABORT,
97 BRCMF_SCAN_STATUS_SUPPRESS,
98};
99
100
101struct brcmf_cfg80211_conf {
102 u32 frag_threshold;
103 u32 rts_threshold;
104 u32 retry_short;
105 u32 retry_long;
106};
107
108
109struct brcmf_cfg80211_security {
110 u32 wpa_versions;
111 u32 auth_type;
112 u32 cipher_pairwise;
113 u32 cipher_group;
114};
115
116
117
118
119
120
121
122
123struct brcmf_cfg80211_profile {
124 u8 bssid[ETH_ALEN];
125 struct brcmf_cfg80211_security sec;
126 struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
127};
128
129
130
131
132
133
134
135
136
137
138enum brcmf_vif_status {
139 BRCMF_VIF_STATUS_READY,
140 BRCMF_VIF_STATUS_CONNECTING,
141 BRCMF_VIF_STATUS_CONNECTED,
142 BRCMF_VIF_STATUS_DISCONNECTING,
143 BRCMF_VIF_STATUS_AP_CREATED
144};
145
146
147
148
149
150
151
152
153
154
155
156struct vif_saved_ie {
157 u8 probe_req_ie[IE_MAX_LEN];
158 u8 probe_res_ie[IE_MAX_LEN];
159 u8 beacon_ie[IE_MAX_LEN];
160 u8 assoc_req_ie[IE_MAX_LEN];
161 u32 probe_req_ie_len;
162 u32 probe_res_ie_len;
163 u32 beacon_ie_len;
164 u32 assoc_req_ie_len;
165};
166
167
168
169
170
171
172
173
174
175
176
177
178struct brcmf_cfg80211_vif {
179 struct brcmf_if *ifp;
180 struct wireless_dev wdev;
181 struct brcmf_cfg80211_profile profile;
182 unsigned long sme_state;
183 struct vif_saved_ie saved_ie;
184 struct list_head list;
185 u16 mgmt_rx_reg;
186 bool mbss;
187 int is_11d;
188};
189
190
191struct brcmf_cfg80211_connect_info {
192 u8 *req_ie;
193 s32 req_ie_len;
194 u8 *resp_ie;
195 s32 resp_ie_len;
196};
197
198
199struct brcmf_cfg80211_assoc_ielen_le {
200 __le32 req_len;
201 __le32 resp_len;
202};
203
204
205enum wl_escan_state {
206 WL_ESCAN_STATE_IDLE,
207 WL_ESCAN_STATE_SCANNING
208};
209
210struct escan_info {
211 u32 escan_state;
212 u8 *escan_buf;
213 struct wiphy *wiphy;
214 struct brcmf_if *ifp;
215 s32 (*run)(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp,
216 struct cfg80211_scan_request *request);
217};
218
219
220
221
222
223
224
225
226
227
228struct brcmf_cfg80211_vif_event {
229 wait_queue_head_t vif_wq;
230 spinlock_t vif_event_lock;
231 u8 action;
232 struct brcmf_cfg80211_vif *vif;
233};
234
235
236
237
238
239
240
241
242
243
244
245
246struct brcmf_cfg80211_wowl {
247 bool active;
248 u32 pre_pmmode;
249 struct cfg80211_wowlan_nd_match *nd;
250 struct cfg80211_wowlan_nd_info *nd_info;
251 wait_queue_head_t nd_data_wait;
252 bool nd_data_completed;
253 bool nd_enabled;
254};
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291struct brcmf_cfg80211_info {
292 struct wiphy *wiphy;
293 struct cfg80211_ops *ops;
294 struct brcmf_cfg80211_conf *conf;
295 struct brcmf_p2p_info p2p;
296 struct brcmf_btcoex_info *btcoex;
297 struct cfg80211_scan_request *scan_request;
298 struct mutex usr_sync;
299 struct wl_cfg80211_bss_info *bss_info;
300 struct brcmf_cfg80211_connect_info conn_info;
301 struct brcmf_pmk_list_le pmk_list;
302 unsigned long scan_status;
303 struct brcmf_pub *pub;
304 u32 channel;
305 bool active_scan;
306 bool sched_escan;
307 bool ibss_starter;
308 bool pwr_save;
309 bool dongle_up;
310 bool scan_tried;
311 u8 *dcmd_buf;
312 u8 *extra_buf;
313 struct dentry *debugfsdir;
314 struct escan_info escan_info;
315 struct timer_list escan_timeout;
316 struct work_struct escan_timeout_work;
317 struct list_head vif_list;
318 struct brcmf_cfg80211_vif_event vif_event;
319 struct completion vif_disabled;
320 struct brcmu_d11inf d11inf;
321 struct brcmf_assoclist_le assoclist;
322 struct brcmf_cfg80211_wowl wowl;
323};
324
325
326
327
328
329
330
331
332struct brcmf_tlv {
333 u8 id;
334 u8 len;
335 u8 data[1];
336};
337
338static inline struct wiphy *cfg_to_wiphy(struct brcmf_cfg80211_info *cfg)
339{
340 return cfg->wiphy;
341}
342
343static inline struct brcmf_cfg80211_info *wiphy_to_cfg(struct wiphy *w)
344{
345 return (struct brcmf_cfg80211_info *)(wiphy_priv(w));
346}
347
348static inline struct brcmf_cfg80211_info *wdev_to_cfg(struct wireless_dev *wd)
349{
350 return (struct brcmf_cfg80211_info *)(wdev_priv(wd));
351}
352
353static inline
354struct net_device *cfg_to_ndev(struct brcmf_cfg80211_info *cfg)
355{
356 struct brcmf_cfg80211_vif *vif;
357 vif = list_first_entry(&cfg->vif_list, struct brcmf_cfg80211_vif, list);
358 return vif->wdev.netdev;
359}
360
361static inline struct brcmf_cfg80211_info *ndev_to_cfg(struct net_device *ndev)
362{
363 return wdev_to_cfg(ndev->ieee80211_ptr);
364}
365
366static inline struct brcmf_cfg80211_profile *ndev_to_prof(struct net_device *nd)
367{
368 struct brcmf_if *ifp = netdev_priv(nd);
369 return &ifp->vif->profile;
370}
371
372static inline struct brcmf_cfg80211_vif *ndev_to_vif(struct net_device *ndev)
373{
374 struct brcmf_if *ifp = netdev_priv(ndev);
375 return ifp->vif;
376}
377
378static inline struct
379brcmf_cfg80211_connect_info *cfg_to_conn(struct brcmf_cfg80211_info *cfg)
380{
381 return &cfg->conn_info;
382}
383
384struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
385 struct device *busdev,
386 bool p2pdev_forced);
387void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
388s32 brcmf_cfg80211_up(struct net_device *ndev);
389s32 brcmf_cfg80211_down(struct net_device *ndev);
390enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);
391
392struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
393 enum nl80211_iftype type);
394void brcmf_free_vif(struct brcmf_cfg80211_vif *vif);
395
396s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
397 const u8 *vndr_ie_buf, u32 vndr_ie_len);
398s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif);
399const struct brcmf_tlv *
400brcmf_parse_tlvs(const void *buf, int buflen, uint key);
401u16 channel_to_chanspec(struct brcmu_d11inf *d11inf,
402 struct ieee80211_channel *ch);
403bool brcmf_get_vif_state_any(struct brcmf_cfg80211_info *cfg,
404 unsigned long state);
405void brcmf_cfg80211_arm_vif_event(struct brcmf_cfg80211_info *cfg,
406 struct brcmf_cfg80211_vif *vif);
407bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg);
408int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg,
409 u8 action, ulong timeout);
410s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
411 struct brcmf_if *ifp, bool aborted,
412 bool fw_abort);
413void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
414void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
415void brcmf_cfg80211_free_netdev(struct net_device *ndev);
416
417#endif
418