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