xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/wl_android_ext.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun 
2*4882a593Smuzhiyun #ifndef _wl_android_ext_
3*4882a593Smuzhiyun #define _wl_android_ext_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun typedef struct wl_chan_info {
6*4882a593Smuzhiyun 	uint band;
7*4882a593Smuzhiyun 	uint16 chan;
8*4882a593Smuzhiyun } wl_chan_info_t;
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun typedef struct bcol_gtk_para {
11*4882a593Smuzhiyun 	int enable;
12*4882a593Smuzhiyun 	int ptk_len;
13*4882a593Smuzhiyun 	char ptk[64];
14*4882a593Smuzhiyun 	char replay[8];
15*4882a593Smuzhiyun } bcol_gtk_para_t;
16*4882a593Smuzhiyun #define ACS_FW_BIT		(1<<0)
17*4882a593Smuzhiyun #define ACS_DRV_BIT		(1<<1)
18*4882a593Smuzhiyun int wl_ext_autochannel(struct net_device *dev, uint acs, uint32 band);
19*4882a593Smuzhiyun chanspec_band_t wl_ext_wlcband_to_chanspec_band(int band);
20*4882a593Smuzhiyun int wl_android_ext_priv_cmd(struct net_device *net, char *command, int total_len,
21*4882a593Smuzhiyun 	int *bytes_written);
22*4882a593Smuzhiyun void wl_ext_get_sec(struct net_device *dev, int ifmode, char *sec, int total_len, bool dump);
23*4882a593Smuzhiyun bool wl_ext_check_scan(struct net_device *dev, dhd_pub_t *dhdp);
24*4882a593Smuzhiyun int wl_ext_set_scan_time(struct net_device *dev, int scan_time,
25*4882a593Smuzhiyun 	uint32 scan_get, uint32 scan_set);
26*4882a593Smuzhiyun void wl_ext_wait_event_complete(struct dhd_pub *dhd, int ifidx);
27*4882a593Smuzhiyun int wl_ext_add_del_ie(struct net_device *dev, uint pktflag, char *ie_data, const char* add_del_cmd);
28*4882a593Smuzhiyun #ifdef WL_ESCAN
29*4882a593Smuzhiyun int wl_construct_ctl_chanspec_list(struct net_device *dev, wl_uint32_list_t *chan_list);
30*4882a593Smuzhiyun int wl_ext_drv_scan(struct net_device *dev, uint band, bool fast_scan);
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun #ifdef WL_EXT_GENL
33*4882a593Smuzhiyun int wl_ext_genl_init(struct net_device *net);
34*4882a593Smuzhiyun void wl_ext_genl_deinit(struct net_device *net);
35*4882a593Smuzhiyun #endif
36*4882a593Smuzhiyun #ifdef WL_EXT_IAPSTA
37*4882a593Smuzhiyun #ifndef strtoul
38*4882a593Smuzhiyun #define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base))
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun int wl_ext_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len, u32 set);
41*4882a593Smuzhiyun int wl_ext_iovar_getint(struct net_device *dev, s8 *iovar, s32 *val);
42*4882a593Smuzhiyun int wl_ext_iovar_setint(struct net_device *dev, s8 *iovar, s32 val);
43*4882a593Smuzhiyun int wl_ext_iovar_getbuf(struct net_device *dev, s8 *iovar_name,
44*4882a593Smuzhiyun 	void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync);
45*4882a593Smuzhiyun int wl_ext_iovar_setbuf(struct net_device *dev, s8 *iovar_name,
46*4882a593Smuzhiyun 	void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync);
47*4882a593Smuzhiyun int wl_ext_iovar_setbuf_bsscfg(struct net_device *dev, s8 *iovar_name,
48*4882a593Smuzhiyun 	void *param, s32 paramlen, void *buf, s32 buflen, s32 bsscfg_idx,
49*4882a593Smuzhiyun 	struct mutex* buf_sync);
50*4882a593Smuzhiyun chanspec_t wl_ext_chspec_driver_to_host(struct dhd_pub *dhd, chanspec_t chanspec);
51*4882a593Smuzhiyun chanspec_t wl_ext_chspec_host_to_driver(struct dhd_pub *dhd, chanspec_t chanspec);
52*4882a593Smuzhiyun bool wl_ext_dfs_chan(struct wl_chan_info *chan_info);
53*4882a593Smuzhiyun bool wl_ext_passive_chan(struct net_device *dev, struct wl_chan_info *chan_info);
54*4882a593Smuzhiyun uint16 wl_ext_get_default_chan(struct net_device *dev,
55*4882a593Smuzhiyun 	uint16 *chan_2g, uint16 *chan_5g, bool nodfs);
56*4882a593Smuzhiyun int wl_ext_set_chanspec(struct net_device *dev, struct wl_chan_info *chan_info,
57*4882a593Smuzhiyun 	chanspec_t *ret_chspec);
58*4882a593Smuzhiyun int wl_ext_get_ioctl_ver(struct net_device *dev, int *ioctl_ver);
59*4882a593Smuzhiyun #endif
60*4882a593Smuzhiyun #if defined(WL_CFG80211) || defined(WL_ESCAN)
61*4882a593Smuzhiyun void wl_ext_user_sync(struct dhd_pub *dhd, int ifidx, bool lock);
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun #if defined(WL_EXT_IAPSTA) || defined(WL_CFG80211)
64*4882a593Smuzhiyun void wl_ext_bss_iovar_war(struct net_device *dev, s32 *val);
65*4882a593Smuzhiyun #endif /* WL_EXT_IAPSTA ||WL_CFG80211 */
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun typedef struct wl_conn_info {
68*4882a593Smuzhiyun 	uint8 bssidx;
69*4882a593Smuzhiyun 	wlc_ssid_t ssid;
70*4882a593Smuzhiyun 	struct ether_addr bssid;
71*4882a593Smuzhiyun 	uint16 channel;
72*4882a593Smuzhiyun } wl_conn_info_t;
73*4882a593Smuzhiyun #if defined(WL_EXT_IAPSTA) || defined(USE_IW)
74*4882a593Smuzhiyun s32 wl_ext_connect(struct net_device *dev, wl_conn_info_t *conn_info);
75*4882a593Smuzhiyun #endif /* WL_EXT_IAPSTA || USE_IW */
76*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
77*4882a593Smuzhiyun #define strnicmp(str1, str2, len) strncasecmp((str1), (str2), (len))
78*4882a593Smuzhiyun #endif
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* terence:
81*4882a593Smuzhiyun  * BSSCACHE: Cache bss list
82*4882a593Smuzhiyun  * RSSAVG: Average RSSI of BSS list
83*4882a593Smuzhiyun  * RSSIOFFSET: RSSI offset
84*4882a593Smuzhiyun  * SORT_BSS_BY_RSSI: Sort BSS by RSSI
85*4882a593Smuzhiyun  */
86*4882a593Smuzhiyun //#define BSSCACHE
87*4882a593Smuzhiyun //#define RSSIAVG
88*4882a593Smuzhiyun //#define RSSIOFFSET
89*4882a593Smuzhiyun //#define RSSIOFFSET_NEW
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define RSSI_MAXVAL -2
92*4882a593Smuzhiyun #define RSSI_MINVAL -200
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #if defined(ESCAN_RESULT_PATCH)
95*4882a593Smuzhiyun #define REPEATED_SCAN_RESULT_CNT	2
96*4882a593Smuzhiyun #else
97*4882a593Smuzhiyun #define REPEATED_SCAN_RESULT_CNT	1
98*4882a593Smuzhiyun #endif
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #if defined(RSSIAVG) || defined(RSSIOFFSET)
101*4882a593Smuzhiyun extern int g_wifi_on;
102*4882a593Smuzhiyun #endif
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #if defined(RSSIAVG)
105*4882a593Smuzhiyun #define RSSIAVG_LEN (4*REPEATED_SCAN_RESULT_CNT)
106*4882a593Smuzhiyun #define RSSICACHE_TIMEOUT 15
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun typedef struct wl_rssi_cache {
109*4882a593Smuzhiyun 	struct wl_rssi_cache *next;
110*4882a593Smuzhiyun 	int dirty;
111*4882a593Smuzhiyun 	struct osl_timespec tv;
112*4882a593Smuzhiyun 	struct ether_addr BSSID;
113*4882a593Smuzhiyun 	int16 RSSI[RSSIAVG_LEN];
114*4882a593Smuzhiyun } wl_rssi_cache_t;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun typedef struct wl_rssi_cache_ctrl {
117*4882a593Smuzhiyun 	wl_rssi_cache_t *m_cache_head;
118*4882a593Smuzhiyun } wl_rssi_cache_ctrl_t;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun void wl_free_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl);
121*4882a593Smuzhiyun void wl_delete_dirty_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl);
122*4882a593Smuzhiyun void wl_delete_disconnected_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, u8 *bssid);
123*4882a593Smuzhiyun void wl_reset_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl);
124*4882a593Smuzhiyun void wl_update_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, wl_scan_results_v109_t *ss_list);
125*4882a593Smuzhiyun int wl_update_connected_rssi_cache(struct net_device *net, wl_rssi_cache_ctrl_t *rssi_cache_ctrl, int *rssi_avg);
126*4882a593Smuzhiyun int16 wl_get_avg_rssi(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, void *addr);
127*4882a593Smuzhiyun #endif
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #if defined(RSSIOFFSET)
130*4882a593Smuzhiyun #define RSSI_OFFSET	5
131*4882a593Smuzhiyun #if defined(RSSIOFFSET_NEW)
132*4882a593Smuzhiyun #define RSSI_OFFSET_MAXVAL -80
133*4882a593Smuzhiyun #define RSSI_OFFSET_MINVAL -94
134*4882a593Smuzhiyun #define RSSI_OFFSET_INTVAL ((RSSI_OFFSET_MAXVAL-RSSI_OFFSET_MINVAL)/RSSI_OFFSET)
135*4882a593Smuzhiyun #endif
136*4882a593Smuzhiyun #define BCM4330_CHIP_ID		0x4330
137*4882a593Smuzhiyun #define BCM4330B2_CHIP_REV      4
138*4882a593Smuzhiyun int wl_update_rssi_offset(struct net_device *net, int rssi);
139*4882a593Smuzhiyun #endif
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #if defined(BSSCACHE)
142*4882a593Smuzhiyun #define BSSCACHE_TIMEOUT	30
143*4882a593Smuzhiyun #define BSSCACHE_MAXCNT		20
144*4882a593Smuzhiyun #define BSSCACHE_DIRTY		4
145*4882a593Smuzhiyun #define SORT_BSS_CHANNEL
146*4882a593Smuzhiyun //#define SORT_BSS_RSSI
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun typedef struct wl_bss_cache {
149*4882a593Smuzhiyun 	struct wl_bss_cache *next;
150*4882a593Smuzhiyun 	int dirty;
151*4882a593Smuzhiyun 	struct osl_timespec tv;
152*4882a593Smuzhiyun 	wl_scan_results_v109_t results;
153*4882a593Smuzhiyun } wl_bss_cache_t;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun typedef struct wl_bss_cache_ctrl {
156*4882a593Smuzhiyun 	wl_bss_cache_t *m_cache_head;
157*4882a593Smuzhiyun } wl_bss_cache_ctrl_t;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun void wl_free_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl);
160*4882a593Smuzhiyun void wl_delete_dirty_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl);
161*4882a593Smuzhiyun void wl_delete_disconnected_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl, u8 *bssid);
162*4882a593Smuzhiyun int wl_bss_cache_size(wl_bss_cache_ctrl_t *bss_cache_ctrl);
163*4882a593Smuzhiyun void wl_reset_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl);
164*4882a593Smuzhiyun void wl_update_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl,
165*4882a593Smuzhiyun #if defined(RSSIAVG)
166*4882a593Smuzhiyun 	wl_rssi_cache_ctrl_t *rssi_cache_ctrl,
167*4882a593Smuzhiyun #endif
168*4882a593Smuzhiyun 	wl_scan_results_v109_t *ss_list);
169*4882a593Smuzhiyun void wl_release_bss_cache_ctrl(wl_bss_cache_ctrl_t *bss_cache_ctrl);
170*4882a593Smuzhiyun #endif
171*4882a593Smuzhiyun int wl_ext_get_best_channel(struct net_device *net,
172*4882a593Smuzhiyun #if defined(BSSCACHE)
173*4882a593Smuzhiyun 	wl_bss_cache_ctrl_t *bss_cache_ctrl,
174*4882a593Smuzhiyun #else
175*4882a593Smuzhiyun 	wl_scan_results_v109_t *bss_list,
176*4882a593Smuzhiyun #endif
177*4882a593Smuzhiyun 	int *best_2g_ch, int *best_5g_ch, int *best_6g_ch
178*4882a593Smuzhiyun );
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #ifdef WL_6G_BAND
181*4882a593Smuzhiyun #define CHSPEC2BANDSTR(chspec) ((chspec && CHSPEC_IS2G(chspec)) ? "2g" : CHSPEC_IS5G(chspec) ? \
182*4882a593Smuzhiyun 	"5g" : CHSPEC_IS6G(chspec) ? "6g" : "0g")
183*4882a593Smuzhiyun #define WLCBAND2STR(band) ((band == WLC_BAND_2G) ? "2g" : (band == WLC_BAND_5G) ? \
184*4882a593Smuzhiyun 	"5g" : (band == WLC_BAND_6G) ? "6g" : "0g")
185*4882a593Smuzhiyun #else
186*4882a593Smuzhiyun #define CHSPEC2BANDSTR(chspec) ((chspec && CHSPEC_IS2G(chspec)) ? "2g" : CHSPEC_IS5G(chspec) ? \
187*4882a593Smuzhiyun 	"5g" : "0g")
188*4882a593Smuzhiyun #define WLCBAND2STR(band) ((band == WLC_BAND_2G) ? "2g" : (band == WLC_BAND_5G) ? \
189*4882a593Smuzhiyun 	"5g" : "0g")
190*4882a593Smuzhiyun #endif /* WL_6G_BAND */
191*4882a593Smuzhiyun #endif
192