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