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