1/*
2 * Linux Wireless Extensions support
3 *
4 * Copyright (C) 1999-2010, 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 * $Id: wl_iw.h,v 1.5.34.1.6.36.4.1 2010/09/10 19:24:30 Exp $
25 */
26
27
28#ifndef _wl_iw_h_
29#define _wl_iw_h_
30
31#include <linux/wireless.h>
32
33#include <typedefs.h>
34#include <proto/ethernet.h>
35#include <wlioctl.h>
36
37#define WL_SCAN_PARAMS_SSID_MAX 	10
38#define GET_SSID			"SSID="
39#define GET_CHANNEL			"CH="
40#define GET_NPROBE 			"NPROBE="
41#define GET_ACTIVE_ASSOC_DWELL  	"ACTIVE="
42#define GET_PASSIVE_ASSOC_DWELL  	"PASSIVE="
43#define GET_HOME_DWELL  		"HOME="
44#define GET_SCAN_TYPE			"TYPE="
45
46#define BAND_GET_CMD				"GETBAND"
47#define BAND_SET_CMD				"SETBAND"
48#define DTIM_SKIP_GET_CMD			"DTIMSKIPGET"
49#define DTIM_SKIP_SET_CMD			"DTIMSKIPSET"
50#define SETSUSPEND_CMD				"SETSUSPENDOPT"
51#define PNOSSIDCLR_SET_CMD			"PNOSSIDCLR"
52#define PNOSETUP_SET_CMD			"PNOSETUP "
53#define PNOENABLE_SET_CMD			"PNOFORCE"
54#define PNODEBUG_SET_CMD			"PNODEBUG"
55
56#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
57#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
58
59
60typedef struct wl_iw_extra_params {
61	int 	target_channel;
62} wl_iw_extra_params_t;
63
64#define	WL_IW_RSSI_MINVAL	-200
65#define	WL_IW_RSSI_NO_SIGNAL	-91
66#define	WL_IW_RSSI_VERY_LOW	-80
67#define	WL_IW_RSSI_LOW		-70
68#define	WL_IW_RSSI_GOOD		-68
69#define	WL_IW_RSSI_VERY_GOOD	-58
70#define	WL_IW_RSSI_EXCELLENT	-57
71#define	WL_IW_RSSI_INVALID	 0
72#define MAX_WX_STRING		80
73#define isprint(c)		bcm_isprint(c)
74#define WL_IW_SET_ACTIVE_SCAN	(SIOCIWFIRSTPRIV+1)
75#define WL_IW_GET_RSSI		(SIOCIWFIRSTPRIV+3)
76#define WL_IW_SET_PASSIVE_SCAN	(SIOCIWFIRSTPRIV+5)
77#define WL_IW_GET_LINK_SPEED	(SIOCIWFIRSTPRIV+7)
78#define WL_IW_GET_CURR_MACADDR	(SIOCIWFIRSTPRIV+9)
79#define WL_IW_SET_STOP		(SIOCIWFIRSTPRIV+11)
80#define WL_IW_SET_START		(SIOCIWFIRSTPRIV+13)
81
82
83#define WL_SET_AP_CFG           (SIOCIWFIRSTPRIV+15)
84#define WL_AP_STA_LIST          (SIOCIWFIRSTPRIV+17)
85#define WL_AP_MAC_FLTR	        (SIOCIWFIRSTPRIV+19)
86#define WL_AP_BSS_START         (SIOCIWFIRSTPRIV+21)
87#define AP_LPB_CMD              (SIOCIWFIRSTPRIV+23)
88#define WL_AP_STOP              (SIOCIWFIRSTPRIV+25)
89#define WL_FW_RELOAD            (SIOCIWFIRSTPRIV+27)
90#define WL_COMBO_SCAN           (SIOCIWFIRSTPRIV+29)
91#define WL_AP_SPARE3            (SIOCIWFIRSTPRIV+31)
92#define G_SCAN_RESULTS		(8*1024)
93#define WE_ADD_EVENT_FIX	0x80
94#define G_WLAN_SET_ON		0
95#define G_WLAN_SET_OFF		1
96
97#define CHECK_EXTRA_FOR_NULL(extra) \
98if (!extra) { \
99	WL_ERROR(("%s: error : extra is null pointer\n", __FUNCTION__)); \
100	return -EINVAL; \
101}
102
103typedef struct wl_iw {
104	char nickname[IW_ESSID_MAX_SIZE];
105
106	struct iw_statistics wstats;
107
108	int spy_num;
109	uint32 pwsec;
110	uint32 gwsec;
111	bool privacy_invoked;
112
113	struct ether_addr spy_addr[IW_MAX_SPY];
114	struct iw_quality spy_qual[IW_MAX_SPY];
115	void  *wlinfo;
116	dhd_pub_t * pub;
117} wl_iw_t;
118
119#define WLC_IW_SS_CACHE_MAXLEN				512
120#define WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN	32
121#define WLC_IW_BSS_INFO_MAXLEN 				\
122	(WLC_IW_SS_CACHE_MAXLEN - WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN)
123
124typedef struct wl_iw_ss_cache {
125	uint32 buflen;
126	uint32 version;
127	uint32 count;
128	wl_bss_info_t bss_info[1];
129	char dummy[WLC_IW_BSS_INFO_MAXLEN - sizeof(wl_bss_info_t)];
130	int dirty;
131	struct wl_iw_ss_cache *next;
132} wl_iw_ss_cache_t;
133
134typedef struct wl_iw_ss_cache_ctrl {
135	wl_iw_ss_cache_t *m_cache_head;
136	int m_link_down;
137	int m_timer_expired;
138	char m_active_bssid[ETHER_ADDR_LEN];
139	uint m_prev_scan_mode;
140	uint m_cons_br_scan_cnt;
141	struct timer_list *m_timer;
142} wl_iw_ss_cache_ctrl_t;
143typedef enum broadcast_first_scan {
144	BROADCAST_SCAN_FIRST_IDLE = 0,
145	BROADCAST_SCAN_FIRST_STARTED,
146	BROADCAST_SCAN_FIRST_RESULT_READY,
147	BROADCAST_SCAN_FIRST_RESULT_CONSUMED
148} broadcast_first_scan_t;
149#ifdef SOFTAP
150#define SSID_LEN	33
151#define SEC_LEN		16
152#define KEY_LEN		65
153#define PROFILE_OFFSET	32
154struct ap_profile {
155	uint8	ssid[SSID_LEN];
156	uint8	sec[SEC_LEN];
157	uint8	key[KEY_LEN];
158	uint32	channel;
159	uint32	preamble;
160	uint32	max_scb;
161};
162
163
164#define MACLIST_MODE_DISABLED	0
165#define MACLIST_MODE_ENABLED	1
166#define MACLIST_MODE_ALLOW	2
167struct mflist {
168	uint count;
169	struct ether_addr ea[16];
170};
171
172struct mac_list_set {
173	uint32	mode;
174	struct mflist white_list;
175	struct mflist black_list;
176};
177#endif
178
179#if WIRELESS_EXT > 12
180#include <net/iw_handler.h>
181extern const struct iw_handler_def wl_iw_handler_def;
182#endif
183
184extern int wl_iw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
185extern void wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data);
186extern int wl_iw_get_wireless_stats(struct net_device *dev, struct iw_statistics *wstats);
187int wl_iw_attach(struct net_device *dev, void * dhdp);
188void wl_iw_detach(void);
189int wl_control_wl_start(struct net_device *dev);
190
191extern int net_os_wake_lock(struct net_device *dev);
192extern int net_os_wake_unlock(struct net_device *dev);
193extern int net_os_wake_lock_timeout(struct net_device *dev);
194extern int net_os_wake_lock_timeout_enable(struct net_device *dev);
195extern int net_os_set_suspend_disable(struct net_device *dev, int val);
196extern int net_os_set_suspend(struct net_device *dev, int val);
197extern int net_os_set_dtim_skip(struct net_device *dev, int val);
198extern int net_os_set_packet_filter(struct net_device *dev, int val);
199extern int net_os_send_hang_message(struct net_device *dev);
200
201#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
202#define IWE_STREAM_ADD_EVENT(info, stream, ends, iwe, extra) \
203	iwe_stream_add_event(info, stream, ends, iwe, extra)
204#define IWE_STREAM_ADD_VALUE(info, event, value, ends, iwe, event_len) \
205	iwe_stream_add_value(info, event, value, ends, iwe, event_len)
206#define IWE_STREAM_ADD_POINT(info, stream, ends, iwe, extra) \
207	iwe_stream_add_point(info, stream, ends, iwe, extra)
208#else
209#define IWE_STREAM_ADD_EVENT(info, stream, ends, iwe, extra) \
210	iwe_stream_add_event(stream, ends, iwe, extra)
211#define IWE_STREAM_ADD_VALUE(info, event, value, ends, iwe, event_len) \
212	iwe_stream_add_value(event, value, ends, iwe, event_len)
213#define IWE_STREAM_ADD_POINT(info, stream, ends, iwe, extra) \
214	iwe_stream_add_point(stream, ends, iwe, extra)
215#endif
216
217extern int dhd_pno_enable(dhd_pub_t *dhd, int pfn_enabled);
218extern int dhd_pno_clean(dhd_pub_t *dhd);
219extern int dhd_pno_set(dhd_pub_t *dhd, wlc_ssid_t* ssids_local, int nssid, ushort  scan_fr);
220extern int dhd_pno_get_status(dhd_pub_t *dhd);
221extern int dhd_dev_pno_reset(struct net_device *dev);
222extern int dhd_dev_pno_set(struct net_device *dev, wlc_ssid_t* ssids_local, \
223				 int nssid, ushort  scan_fr);
224extern int dhd_dev_pno_enable(struct net_device *dev,  int pfn_enabled);
225extern int dhd_dev_get_pno_status(struct net_device *dev);
226
227#define PNO_TLV_PREFIX			'S'
228#define PNO_TLV_VERSION			1
229#define PNO_TLV_SUBVERSION 		1
230#define PNO_TLV_RESERVED		0
231#define PNO_TLV_TYPE_SSID_IE		'S'
232#define PNO_TLV_TYPE_TIME		'T'
233#define  PNO_EVENT_UP			"PNO_EVENT"
234
235typedef struct cmd_tlv {
236	char prefix;
237	char version;
238	char subver;
239	char reserved;
240} cmd_tlv_t;
241
242#if defined(CSCAN)
243
244typedef struct cscan_tlv {
245	char prefix;
246	char version;
247	char subver;
248	char reserved;
249} cscan_tlv_t;
250
251#define CSCAN_COMMAND				"CSCAN "
252#define CSCAN_TLV_PREFIX 			'S'
253#define CSCAN_TLV_VERSION			1
254#define CSCAN_TLV_SUBVERSION			0
255#define CSCAN_TLV_TYPE_SSID_IE			'S'
256#define CSCAN_TLV_TYPE_CHANNEL_IE		'C'
257#define CSCAN_TLV_TYPE_NPROBE_IE		'N'
258#define CSCAN_TLV_TYPE_ACTIVE_IE		'A'
259#define CSCAN_TLV_TYPE_PASSIVE_IE		'P'
260#define CSCAN_TLV_TYPE_HOME_IE			'H'
261#define CSCAN_TLV_TYPE_STYPE_IE			'T'
262
263extern int wl_iw_parse_channel_list_tlv(char** list_str, uint16* channel_list, \
264					int channel_num, int *bytes_left);
265
266extern int wl_iw_parse_data_tlv(char** list_str, void  *dst, int dst_size, \
267					const char token, int input_size, int *bytes_left);
268
269extern int wl_iw_parse_ssid_list_tlv(char** list_str, wlc_ssid_t* ssid, \
270					int max, int *bytes_left);
271
272extern int wl_iw_parse_ssid_list(char** list_str, wlc_ssid_t* ssid, int idx, int max);
273
274extern int wl_iw_parse_channel_list(char** list_str, uint16* channel_list, int channel_num);
275
276#endif
277
278#endif
279