Merge tag 'lsk-v4.4-16.06-android'
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rkwifi / bcmdhd / wl_cfgp2p.h
1 /*
2  * Linux cfgp2p driver
3  *
4  * Copyright (C) 1999-2016, Broadcom Corporation
5  * 
6  *      Unless you and Broadcom execute a separate written software license
7  * agreement governing use of this software, this software is licensed to you
8  * under the terms of the GNU General Public License version 2 (the "GPL"),
9  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10  * following added to such license:
11  * 
12  *      As a special exception, the copyright holders of this software give you
13  * permission to link this software with independent modules, and to copy and
14  * distribute the resulting executable under terms of your choice, provided that
15  * you also meet, for each linked independent module, the terms and conditions of
16  * the license of that module.  An independent module is a module which is not
17  * derived from this software.  The special exception does not apply to any
18  * modifications of the software.
19  * 
20  *      Notwithstanding the above, under no circumstances may you combine this
21  * software in any way with any other Broadcom software provided under a license
22  * other than the GPL, without Broadcom's express prior written consent.
23  *
24  *
25  * <<Broadcom-WL-IPTag/Open:>>
26  *
27  * $Id: wl_cfgp2p.h 608203 2015-12-24 05:30:44Z $
28  */
29 #ifndef _wl_cfgp2p_h_
30 #define _wl_cfgp2p_h_
31 #include <proto/802.11.h>
32 #include <proto/p2p.h>
33
34 struct bcm_cfg80211;
35 extern u32 wl_dbg_level;
36
37 typedef struct wifi_p2p_ie wifi_wfd_ie_t;
38 /* Enumeration of the usages of the BSSCFGs used by the P2P Library.  Do not
39  * confuse this with a bsscfg index.  This value is an index into the
40  * saved_ie[] array of structures which in turn contains a bsscfg index field.
41  */
42 typedef enum {
43         P2PAPI_BSSCFG_PRIMARY, /* maps to driver's primary bsscfg */
44         P2PAPI_BSSCFG_DEVICE, /* maps to driver's P2P device discovery bsscfg */
45         P2PAPI_BSSCFG_CONNECTION1, /* maps to driver's P2P connection bsscfg */
46         P2PAPI_BSSCFG_CONNECTION2,
47         P2PAPI_BSSCFG_MAX
48 } p2p_bsscfg_type_t;
49
50 typedef enum {
51         P2P_SCAN_PURPOSE_MIN,
52         P2P_SCAN_SOCIAL_CHANNEL, /* scan for social channel */
53         P2P_SCAN_AFX_PEER_NORMAL, /* scan for action frame search */
54         P2P_SCAN_AFX_PEER_REDUCED, /* scan for action frame search with short time */
55         P2P_SCAN_DURING_CONNECTED, /* scan during connected status */
56         P2P_SCAN_CONNECT_TRY, /* scan for connecting */
57         P2P_SCAN_NORMAL, /* scan during not-connected status */
58         P2P_SCAN_PURPOSE_MAX
59 } p2p_scan_purpose_t;
60
61 /* vendor ies max buffer length for probe response or beacon */
62 #define VNDR_IES_MAX_BUF_LEN    1400
63 /* normal vendor ies buffer length */
64 #define VNDR_IES_BUF_LEN                512
65
66 struct p2p_bss {
67         s32 bssidx;
68         struct net_device *dev;
69         void *private_data;
70         struct ether_addr mac_addr;
71 };
72
73 struct p2p_info {
74         bool on;    /* p2p on/off switch */
75         bool scan;
76         int16 search_state;
77         s8 vir_ifname[IFNAMSIZ];
78         unsigned long status;
79         struct p2p_bss bss[P2PAPI_BSSCFG_MAX];
80         struct timer_list listen_timer;
81         wl_p2p_sched_t noa;
82         wl_p2p_ops_t ops;
83         wlc_ssid_t ssid;
84         s8 p2p_go_count;
85 };
86
87 #define MAX_VNDR_IE_NUMBER      10
88
89 struct parsed_vndr_ie_info {
90         char *ie_ptr;
91         u32 ie_len;     /* total length including id & length field */
92         vndr_ie_t vndrie;
93 };
94
95 struct parsed_vndr_ies {
96         u32 count;
97         struct parsed_vndr_ie_info ie_info[MAX_VNDR_IE_NUMBER];
98 };
99
100 /* dongle status */
101 enum wl_cfgp2p_status {
102         WLP2P_STATUS_DISCOVERY_ON = 0,
103         WLP2P_STATUS_SEARCH_ENABLED,
104         WLP2P_STATUS_IF_ADDING,
105         WLP2P_STATUS_IF_DELETING,
106         WLP2P_STATUS_IF_CHANGING,
107         WLP2P_STATUS_IF_CHANGED,
108         WLP2P_STATUS_LISTEN_EXPIRED,
109         WLP2P_STATUS_ACTION_TX_COMPLETED,
110         WLP2P_STATUS_ACTION_TX_NOACK,
111         WLP2P_STATUS_SCANNING,
112         WLP2P_STATUS_GO_NEG_PHASE,
113         WLP2P_STATUS_DISC_IN_PROGRESS
114 };
115
116
117 #define wl_to_p2p_bss_ndev(cfg, type)           ((cfg)->p2p->bss[type].dev)
118 #define wl_to_p2p_bss_bssidx(cfg, type)         ((cfg)->p2p->bss[type].bssidx)
119 #define wl_to_p2p_bss_macaddr(cfg, type)     &((cfg)->p2p->bss[type].mac_addr)
120 #define wl_to_p2p_bss_saved_ie(cfg, type)       ((cfg)->p2p->bss[type].saved_ie)
121 #define wl_to_p2p_bss_private(cfg, type)                ((cfg)->p2p->bss[type].private_data)
122 #define wl_to_p2p_bss(cfg, type)                        ((cfg)->p2p->bss[type])
123 #define wl_get_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
124                 test_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
125 #define wl_set_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
126                 set_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
127 #define wl_clr_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
128                 clear_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
129 #define wl_chg_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
130         change_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
131 #define p2p_on(cfg) ((cfg)->p2p->on)
132 #define p2p_scan(cfg) ((cfg)->p2p->scan)
133 #define p2p_is_on(cfg) ((cfg)->p2p && (cfg)->p2p->on)
134
135 /* dword align allocation */
136 #define WLC_IOCTL_MAXLEN 8192
137
138 #ifdef CUSTOMER_HW4_DEBUG
139 #define CFGP2P_ERROR_TEXT               "CFGP2P-INFO2) "
140 #else
141 #define CFGP2P_ERROR_TEXT               "CFGP2P-ERROR) "
142 #endif /* CUSTOMER_HW4_DEBUG */
143
144 #ifdef DHD_LOG_DUMP
145 #define CFGP2P_ERR(args)                                                                        \
146         do {                                                                            \
147                 if (wl_dbg_level & WL_DBG_ERR) {                                \
148                         printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : ", __func__);  \
149                         printk args;                                            \
150                         dhd_log_dump_print("[%s] %s: ", \
151                         dhd_log_dump_get_timestamp(), __func__);        \
152                         dhd_log_dump_print args;        \
153                 }                                                                       \
154         } while (0)
155 #else
156 #define CFGP2P_ERR(args)                                                                        \
157         do {                                                                            \
158                 if (wl_dbg_level & WL_DBG_ERR) {                                \
159                         printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : ", __func__);  \
160                         printk args;                                            \
161                 }                                                                       \
162         } while (0)
163 #endif /* DHD_LOG_DUMP */
164 #define CFGP2P_INFO(args)                                                                       \
165         do {                                                                            \
166                 if (wl_dbg_level & WL_DBG_INFO) {                               \
167                         printk(KERN_INFO "CFGP2P-INFO) %s : ", __func__);       \
168                         printk args;                                            \
169                 }                                                                       \
170         } while (0)
171 #define CFGP2P_DBG(args)                                                                \
172         do {                                                                    \
173                 if (wl_dbg_level & WL_DBG_DBG) {                        \
174                         printk(KERN_INFO "CFGP2P-DEBUG) %s :", __func__);       \
175                         printk args;                                                    \
176                 }                                                                       \
177         } while (0)
178
179 #define CFGP2P_ACTION(args)                                                             \
180         do {                                                                    \
181                 if (wl_dbg_level & WL_DBG_P2P_ACTION) {                 \
182                         printk(KERN_INFO "CFGP2P-ACTION) %s :", __func__);      \
183                         printk args;                                                    \
184                 }                                                                       \
185         } while (0)
186 #define INIT_TIMER(timer, func, duration, extra_delay)  \
187         do {                               \
188                 init_timer(timer); \
189                 timer->function = func; \
190                 timer->expires = jiffies + msecs_to_jiffies(duration + extra_delay); \
191                 timer->data = (unsigned long) cfg; \
192                 add_timer(timer); \
193         } while (0);
194
195 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) && !defined(WL_CFG80211_P2P_DEV_IF)
196 #define WL_CFG80211_P2P_DEV_IF
197
198 #ifdef WL_ENABLE_P2P_IF
199 #undef WL_ENABLE_P2P_IF
200 #endif
201
202 #ifdef WL_SUPPORT_BACKPORTED_KPATCHES
203 #undef WL_SUPPORT_BACKPORTED_KPATCHES
204 #endif
205 #else
206 #ifdef WLP2P
207 #ifndef WL_ENABLE_P2P_IF
208 /* Enable P2P network Interface if P2P support is enabled */
209 #define WL_ENABLE_P2P_IF
210 #endif /* WL_ENABLE_P2P_IF */
211 #endif /* WLP2P */
212 #endif /* (LINUX_VERSION >= VERSION(3, 8, 0)) */
213
214 #ifndef WL_CFG80211_P2P_DEV_IF
215 #endif /* WL_CFG80211_P2P_DEV_IF */
216
217 #if defined(WL_ENABLE_P2P_IF) && (defined(WL_CFG80211_P2P_DEV_IF) || \
218         (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)))
219 #error Disable 'WL_ENABLE_P2P_IF', if 'WL_CFG80211_P2P_DEV_IF' is enabled \
220         or kernel version is 3.8.0 or above
221 #endif /* WL_ENABLE_P2P_IF && (WL_CFG80211_P2P_DEV_IF || (LINUX_VERSION >= VERSION(3, 8, 0))) */
222
223 #if !defined(WLP2P) && (defined(WL_ENABLE_P2P_IF) || defined(WL_CFG80211_P2P_DEV_IF))
224 #error WLP2P not defined
225 #endif /* !WLP2P && (WL_ENABLE_P2P_IF || WL_CFG80211_P2P_DEV_IF) */
226
227 #if defined(WL_CFG80211_P2P_DEV_IF)
228 #define bcm_struct_cfgdev       struct wireless_dev
229 #else
230 #define bcm_struct_cfgdev       struct net_device
231 #endif /* WL_CFG80211_P2P_DEV_IF */
232
233 #define P2P_ECSA_CNT 50
234
235 extern void
236 wl_cfgp2p_listen_expired(unsigned long data);
237 extern bool
238 wl_cfgp2p_is_pub_action(void *frame, u32 frame_len);
239 extern bool
240 wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len);
241 extern bool
242 wl_cfgp2p_is_gas_action(void *frame, u32 frame_len);
243 extern bool
244 wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len);
245 extern bool
246 wl_cfgp2p_is_p2p_gas_action(void *frame, u32 frame_len);
247 extern void
248 wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len, u32 channel);
249 extern s32
250 wl_cfgp2p_init_priv(struct bcm_cfg80211 *cfg);
251 extern void
252 wl_cfgp2p_deinit_priv(struct bcm_cfg80211 *cfg);
253 extern s32
254 wl_cfgp2p_set_firm_p2p(struct bcm_cfg80211 *cfg);
255 extern s32
256 wl_cfgp2p_set_p2p_mode(struct bcm_cfg80211 *cfg, u8 mode,
257             u32 channel, u16 listen_ms, int bssidx);
258 extern s32
259 wl_cfgp2p_ifadd(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type,
260             chanspec_t chspec);
261 extern s32
262 wl_cfgp2p_ifdisable(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
263 extern s32
264 wl_cfgp2p_ifdel(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
265 extern s32
266 wl_cfgp2p_ifchange(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type,
267         chanspec_t chspec, s32 conn_idx);
268
269 extern s32
270 wl_cfgp2p_ifidx(struct bcm_cfg80211 *cfg, struct ether_addr *mac, s32 *index);
271
272 extern s32
273 wl_cfgp2p_init_discovery(struct bcm_cfg80211 *cfg);
274 extern s32
275 wl_cfgp2p_enable_discovery(struct bcm_cfg80211 *cfg, struct net_device *dev, const u8 *ie,
276         u32 ie_len);
277 extern s32
278 wl_cfgp2p_disable_discovery(struct bcm_cfg80211 *cfg);
279 extern s32
280 wl_cfgp2p_escan(struct bcm_cfg80211 *cfg, struct net_device *dev, u16 active, u32 num_chans,
281         u16 *channels,
282         s32 search_state, u16 action, u32 bssidx, struct ether_addr *tx_dst_addr,
283         p2p_scan_purpose_t p2p_scan_purpose);
284
285 extern s32
286 wl_cfgp2p_act_frm_search(struct bcm_cfg80211 *cfg, struct net_device *ndev,
287         s32 bssidx, s32 channel, struct ether_addr *tx_dst_addr);
288
289 extern wpa_ie_fixed_t *
290 wl_cfgp2p_find_wpaie(u8 *parse, u32 len);
291
292 extern wpa_ie_fixed_t *
293 wl_cfgp2p_find_wpsie(u8 *parse, u32 len);
294
295 extern wifi_p2p_ie_t *
296 wl_cfgp2p_find_p2pie(u8 *parse, u32 len);
297
298 extern wifi_wfd_ie_t *
299 wl_cfgp2p_find_wfdie(u8 *parse, u32 len);
300 extern s32
301 wl_cfgp2p_set_management_ie(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx,
302             s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len);
303 extern s32
304 wl_cfgp2p_clear_management_ie(struct bcm_cfg80211 *cfg, s32 bssidx);
305
306 extern struct net_device *
307 wl_cfgp2p_find_ndev(struct bcm_cfg80211 *cfg, s32 bssidx);
308 extern s32
309 wl_cfgp2p_find_type(struct bcm_cfg80211 *cfg, s32 bssidx, s32 *type);
310
311
312 extern s32
313 wl_cfgp2p_listen_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
314         const wl_event_msg_t *e, void *data);
315 extern s32
316 wl_cfgp2p_discover_listen(struct bcm_cfg80211 *cfg, s32 channel, u32 duration_ms);
317
318 extern s32
319 wl_cfgp2p_discover_enable_search(struct bcm_cfg80211 *cfg, u8 enable);
320
321 extern s32
322 wl_cfgp2p_action_tx_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
323         const wl_event_msg_t *e, void *data);
324
325 extern s32
326 wl_cfgp2p_tx_action_frame(struct bcm_cfg80211 *cfg, struct net_device *dev,
327         wl_af_params_t *af_params, s32 bssidx);
328
329 extern void
330 wl_cfgp2p_generate_bss_mac(struct bcm_cfg80211 *cfg, struct ether_addr *primary_addr);
331
332 extern void
333 wl_cfg80211_change_ifaddr(u8* buf, struct ether_addr *p2p_int_addr, u8 element_id);
334 extern bool
335 wl_cfgp2p_bss_isup(struct net_device *ndev, int bsscfg_idx);
336
337 extern s32
338 wl_cfgp2p_bss(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bsscfg_idx, s32 up);
339
340
341 extern s32
342 wl_cfgp2p_supported(struct bcm_cfg80211 *cfg, struct net_device *ndev);
343
344 extern s32
345 wl_cfgp2p_down(struct bcm_cfg80211 *cfg);
346
347 extern s32
348 wl_cfgp2p_set_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
349
350 extern s32
351 wl_cfgp2p_get_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
352
353 extern s32
354 wl_cfgp2p_set_p2p_ps(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
355
356 extern s32
357 wl_cfgp2p_set_p2p_ecsa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
358
359 extern u8 *
360 wl_cfgp2p_retreive_p2pattrib(void *buf, u8 element_id);
361
362 extern u8*
363 wl_cfgp2p_find_attrib_in_all_p2p_Ies(u8 *parse, u32 len, u32 attrib);
364
365 extern u8 *
366 wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length);
367
368 extern s32
369 wl_cfgp2p_register_ndev(struct bcm_cfg80211 *cfg);
370
371 extern s32
372 wl_cfgp2p_unregister_ndev(struct bcm_cfg80211 *cfg);
373
374 extern bool
375 wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops);
376
377 extern u32
378 wl_cfgp2p_vndr_ie(struct bcm_cfg80211 *cfg, u8 *iebuf, s32 pktflag,
379         s8 *oui, s32 ie_id, s8 *data, s32 datalen, const s8* add_del_cmd);
380
381 extern int wl_cfgp2p_get_conn_idx(struct bcm_cfg80211 *cfg);
382
383 extern
384 int wl_cfg_multip2p_operational(struct bcm_cfg80211 *cfg);
385
386 extern
387 int wl_cfgp2p_vif_created(struct bcm_cfg80211 *cfg);
388
389 #if defined(WL_CFG80211_P2P_DEV_IF)
390 extern struct wireless_dev *
391 wl_cfgp2p_add_p2p_disc_if(struct bcm_cfg80211 *cfg);
392
393 extern int
394 wl_cfgp2p_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev);
395
396 extern void
397 wl_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev);
398
399 extern int
400 wl_cfgp2p_del_p2p_disc_if(struct wireless_dev *wdev, struct bcm_cfg80211 *cfg);
401
402 #endif /* WL_CFG80211_P2P_DEV_IF */
403
404 extern void
405 wl_cfgp2p_need_wait_actfrmae(struct bcm_cfg80211 *cfg, void *frame, u32 frame_len, bool tx);
406
407 extern int
408 wl_cfgp2p_is_p2p_specific_scan(struct cfg80211_scan_request *request);
409
410 /* WiFi Direct */
411 #define SOCIAL_CHAN_1 1
412 #define SOCIAL_CHAN_2 6
413 #define SOCIAL_CHAN_3 11
414 #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \
415                                         (channel == SOCIAL_CHAN_2) || \
416                                         (channel == SOCIAL_CHAN_3))
417 #define SOCIAL_CHAN_CNT 3
418 #define AF_PEER_SEARCH_CNT 2
419 #define WL_P2P_WILDCARD_SSID "DIRECT-"
420 #define WL_P2P_WILDCARD_SSID_LEN 7
421 #define WL_P2P_INTERFACE_PREFIX "p2p"
422 #define WL_P2P_TEMP_CHAN 11
423 #define WL_P2P_AF_STATUS_OFFSET 9
424
425 /* If the provision discovery is for JOIN operations,
426  * or the device discoverablity frame is destined to GO
427  * then we need not do an internal scan to find GO.
428  */
429 #define IS_ACTPUB_WITHOUT_GROUP_ID(p2p_ie, len) \
430         (wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL)
431
432 #define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \
433                                         ((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \
434                                         (frame->action == P2PSD_ACTION_ID_GAS_CREQ)))
435
436 #define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \
437                                                         ((subtype == P2P_PAF_GON_CONF) || \
438                                                         (subtype == P2P_PAF_INVITE_RSP) || \
439                                                         (subtype == P2P_PAF_PROVDIS_RSP)))
440 #define IS_P2P_SOCIAL(ch) ((ch == SOCIAL_CHAN_1) || (ch == SOCIAL_CHAN_2) || (ch == SOCIAL_CHAN_3))
441 #define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && \
442                                         (len == WL_P2P_WILDCARD_SSID_LEN))
443 #endif                          /* _wl_cfgp2p_h_ */