1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * DHD Linux header file (dhd_linux exports for cfg80211 and other components) 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/Open:>> 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * $Id$ 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* wifi platform functions for power, interrupt and pre-alloc, either 27*4882a593Smuzhiyun * from Android-like platform device data, or Broadcom wifi platform 28*4882a593Smuzhiyun * device data. 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun #ifndef __DHD_LINUX_H__ 32*4882a593Smuzhiyun #define __DHD_LINUX_H__ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #include <linux/kernel.h> 35*4882a593Smuzhiyun #include <linux/init.h> 36*4882a593Smuzhiyun #include <linux/fs.h> 37*4882a593Smuzhiyun #include <dngl_stats.h> 38*4882a593Smuzhiyun #include <dhd.h> 39*4882a593Smuzhiyun #ifdef DHD_WMF 40*4882a593Smuzhiyun #include <dhd_wmf_linux.h> 41*4882a593Smuzhiyun #endif 42*4882a593Smuzhiyun /* Linux wireless extension support */ 43*4882a593Smuzhiyun #if defined(WL_WIRELESS_EXT) 44*4882a593Smuzhiyun #include <wl_iw.h> 45*4882a593Smuzhiyun #endif /* defined(WL_WIRELESS_EXT) */ 46*4882a593Smuzhiyun #if defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) 47*4882a593Smuzhiyun #include <linux/earlysuspend.h> 48*4882a593Smuzhiyun #endif /* defined(CONFIG_HAS_EARLYSUSPEND) && defined(DHD_USE_EARLYSUSPEND) */ 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #ifdef BCMPCIE 51*4882a593Smuzhiyun #include <bcmmsgbuf.h> 52*4882a593Smuzhiyun #endif /* BCMPCIE */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #ifdef PCIE_FULL_DONGLE 55*4882a593Smuzhiyun #include <etd.h> 56*4882a593Smuzhiyun #endif /* PCIE_FULL_DONGLE */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #ifdef WL_MONITOR 59*4882a593Smuzhiyun #ifdef HOST_RADIOTAP_CONV 60*4882a593Smuzhiyun #include <bcmwifi_monitor.h> 61*4882a593Smuzhiyun #else 62*4882a593Smuzhiyun #define MAX_RADIOTAP_SIZE 256 /* Maximum size to hold HE Radiotap header format */ 63*4882a593Smuzhiyun #define MAX_MON_PKT_SIZE (4096 + MAX_RADIOTAP_SIZE) 64*4882a593Smuzhiyun #endif /* HOST_RADIOTAP_CONV */ 65*4882a593Smuzhiyun #endif /* WL_MONITOR */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* dongle status */ 68*4882a593Smuzhiyun enum wifi_adapter_status { 69*4882a593Smuzhiyun WIFI_STATUS_POWER_ON = 0, 70*4882a593Smuzhiyun WIFI_STATUS_FW_READY, 71*4882a593Smuzhiyun WIFI_STATUS_NET_ATTACHED 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun #define wifi_chk_adapter_status(adapter, stat) (test_bit(stat, &(adapter)->status)) 74*4882a593Smuzhiyun #define wifi_get_adapter_status(adapter, stat) (test_bit(stat, &(adapter)->status)) 75*4882a593Smuzhiyun #define wifi_set_adapter_status(adapter, stat) (set_bit(stat, &(adapter)->status)) 76*4882a593Smuzhiyun #define wifi_clr_adapter_status(adapter, stat) (clear_bit(stat, &(adapter)->status)) 77*4882a593Smuzhiyun #define wifi_chg_adapter_status(adapter, stat) (change_bit(stat, &(adapter)->status)) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define DHD_REGISTRATION_TIMEOUT 12000 /* msec : allowed time to finished dhd registration */ 80*4882a593Smuzhiyun #define DHD_FW_READY_TIMEOUT 5000 /* msec : allowed time to finished fw download */ 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun typedef struct wifi_adapter_info { 83*4882a593Smuzhiyun const char *name; 84*4882a593Smuzhiyun uint irq_num; 85*4882a593Smuzhiyun uint intr_flags; 86*4882a593Smuzhiyun const char *fw_path; 87*4882a593Smuzhiyun const char *nv_path; 88*4882a593Smuzhiyun const char *clm_path; 89*4882a593Smuzhiyun const char *conf_path; 90*4882a593Smuzhiyun void *wifi_plat_data; /* wifi ctrl func, for backward compatibility */ 91*4882a593Smuzhiyun uint bus_type; 92*4882a593Smuzhiyun uint bus_num; 93*4882a593Smuzhiyun uint slot_num; 94*4882a593Smuzhiyun int index; 95*4882a593Smuzhiyun int gpio_wl_reg_on; 96*4882a593Smuzhiyun #ifdef CUSTOMER_OOB 97*4882a593Smuzhiyun int gpio_wl_host_wake; 98*4882a593Smuzhiyun #endif 99*4882a593Smuzhiyun wait_queue_head_t status_event; 100*4882a593Smuzhiyun unsigned long status; 101*4882a593Smuzhiyun #if defined (BT_OVER_SDIO) 102*4882a593Smuzhiyun const char *btfw_path; 103*4882a593Smuzhiyun #endif /* defined (BT_OVER_SDIO) */ 104*4882a593Smuzhiyun #if defined(BCMSDIO) 105*4882a593Smuzhiyun struct sdio_func *sdio_func; 106*4882a593Smuzhiyun #endif /* BCMSDIO */ 107*4882a593Smuzhiyun #if defined(BCMPCIE) 108*4882a593Smuzhiyun struct pci_dev *pci_dev; 109*4882a593Smuzhiyun struct pci_saved_state *pci_saved_state; 110*4882a593Smuzhiyun #endif /* BCMPCIE */ 111*4882a593Smuzhiyun #ifdef BCMDHD_PLATDEV 112*4882a593Smuzhiyun struct platform_device *pdev; 113*4882a593Smuzhiyun #endif /* BCMDHD_PLATDEV */ 114*4882a593Smuzhiyun } wifi_adapter_info_t; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #if defined(CONFIG_WIFI_CONTROL_FUNC) || defined(CUSTOMER_HW4) 117*4882a593Smuzhiyun #include <linux/wlan_plat.h> 118*4882a593Smuzhiyun #else 119*4882a593Smuzhiyun #include <dhd_plat.h> 120*4882a593Smuzhiyun #endif /* CONFIG_WIFI_CONTROL_FUNC */ 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun typedef struct bcmdhd_wifi_platdata { 123*4882a593Smuzhiyun uint num_adapters; 124*4882a593Smuzhiyun wifi_adapter_info_t *adapters; 125*4882a593Smuzhiyun } bcmdhd_wifi_platdata_t; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /** Per STA params. A list of dhd_sta objects are managed in dhd_if */ 128*4882a593Smuzhiyun typedef struct dhd_sta { 129*4882a593Smuzhiyun cumm_ctr_t cumm_ctr; /* cummulative queue length of child flowrings */ 130*4882a593Smuzhiyun uint16 flowid[NUMPRIO]; /* allocated flow ring ids (by priority) */ 131*4882a593Smuzhiyun void * ifp; /* associated dhd_if */ 132*4882a593Smuzhiyun struct ether_addr ea; /* stations ethernet mac address */ 133*4882a593Smuzhiyun struct list_head list; /* link into dhd_if::sta_list */ 134*4882a593Smuzhiyun int idx; /* index of self in dhd_pub::sta_pool[] */ 135*4882a593Smuzhiyun int ifidx; /* index of interface in dhd */ 136*4882a593Smuzhiyun #ifdef DHD_WMF 137*4882a593Smuzhiyun struct dhd_sta *psta_prim; /* primary index of psta interface */ 138*4882a593Smuzhiyun #endif /* DHD_WMF */ 139*4882a593Smuzhiyun } dhd_sta_t; 140*4882a593Smuzhiyun typedef dhd_sta_t dhd_sta_pool_t; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #ifdef DHD_4WAYM4_FAIL_DISCONNECT 143*4882a593Smuzhiyun typedef enum { 144*4882a593Smuzhiyun NONE_4WAY, 145*4882a593Smuzhiyun M1_4WAY, 146*4882a593Smuzhiyun M2_4WAY, 147*4882a593Smuzhiyun M3_4WAY, 148*4882a593Smuzhiyun M4_4WAY 149*4882a593Smuzhiyun } msg_4way_t; 150*4882a593Smuzhiyun typedef enum { 151*4882a593Smuzhiyun M3_RXED, 152*4882a593Smuzhiyun M4_TXFAILED 153*4882a593Smuzhiyun } msg_4way_state_t; 154*4882a593Smuzhiyun #define MAX_4WAY_TIMEOUT_MS 2000 155*4882a593Smuzhiyun #endif /* DHD_4WAYM4_FAIL_DISCONNECT */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #if defined(DHD_LB) 158*4882a593Smuzhiyun /* Dynamic CPU selection for load balancing. */ 159*4882a593Smuzhiyun #include <linux/cpu.h> 160*4882a593Smuzhiyun #include <linux/cpumask.h> 161*4882a593Smuzhiyun #include <linux/notifier.h> 162*4882a593Smuzhiyun #include <linux/workqueue.h> 163*4882a593Smuzhiyun #include <asm/atomic.h> 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* FIXME: Make this a module param or a sysfs. */ 166*4882a593Smuzhiyun #if !defined(DHD_LB_PRIMARY_CPUS) 167*4882a593Smuzhiyun #define DHD_LB_PRIMARY_CPUS 0x0 /* Big CPU coreids mask */ 168*4882a593Smuzhiyun #endif 169*4882a593Smuzhiyun #if !defined(DHD_LB_SECONDARY_CPUS) 170*4882a593Smuzhiyun #define DHD_LB_SECONDARY_CPUS 0xFE /* Little CPU coreids mask */ 171*4882a593Smuzhiyun #endif 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define HIST_BIN_SIZE 9 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #if defined(DHD_LB_TXP) 176*4882a593Smuzhiyun /* Pkttag not compatible with PROP_TXSTATUS or WLFC */ 177*4882a593Smuzhiyun typedef struct dhd_tx_lb_pkttag_fr { 178*4882a593Smuzhiyun struct net_device *net; 179*4882a593Smuzhiyun int ifidx; 180*4882a593Smuzhiyun } dhd_tx_lb_pkttag_fr_t; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define DHD_LB_TX_PKTTAG_SET_NETDEV(tag, netdevp) ((tag)->net = netdevp) 183*4882a593Smuzhiyun #define DHD_LB_TX_PKTTAG_NETDEV(tag) ((tag)->net) 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define DHD_LB_TX_PKTTAG_SET_IFIDX(tag, ifidx) ((tag)->ifidx = ifidx) 186*4882a593Smuzhiyun #define DHD_LB_TX_PKTTAG_IFIDX(tag) ((tag)->ifidx) 187*4882a593Smuzhiyun #endif /* DHD_LB_TXP */ 188*4882a593Smuzhiyun #endif /* DHD_LB */ 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define FILE_DUMP_MAX_WAIT_TIME 4000 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #ifdef IL_BIGENDIAN 193*4882a593Smuzhiyun #include <bcmendian.h> 194*4882a593Smuzhiyun #define htod32(i) (bcmswap32(i)) 195*4882a593Smuzhiyun #define htod16(i) (bcmswap16(i)) 196*4882a593Smuzhiyun #define dtoh32(i) (bcmswap32(i)) 197*4882a593Smuzhiyun #define dtoh16(i) (bcmswap16(i)) 198*4882a593Smuzhiyun #define htodchanspec(i) htod16(i) 199*4882a593Smuzhiyun #define dtohchanspec(i) dtoh16(i) 200*4882a593Smuzhiyun #else 201*4882a593Smuzhiyun #define htod32(i) (i) 202*4882a593Smuzhiyun #define htod16(i) (i) 203*4882a593Smuzhiyun #define dtoh32(i) (i) 204*4882a593Smuzhiyun #define dtoh16(i) (i) 205*4882a593Smuzhiyun #define htodchanspec(i) (i) 206*4882a593Smuzhiyun #define dtohchanspec(i) (i) 207*4882a593Smuzhiyun #endif /* IL_BIGENDINA */ 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #if defined(DHD_TCP_WINSIZE_ADJUST) 210*4882a593Smuzhiyun #define MIN_TCP_WIN_SIZE 18000 211*4882a593Smuzhiyun #define WIN_SIZE_SCALE_FACTOR 2 212*4882a593Smuzhiyun #define MAX_TARGET_PORTS 5 213*4882a593Smuzhiyun #endif /* DHD_TCP_WINSIZE_ADJUST */ 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun #ifdef BLOCK_IPV6_PACKET 216*4882a593Smuzhiyun #define HEX_PREF_STR "0x" 217*4882a593Smuzhiyun #define UNI_FILTER_STR "010000000000" 218*4882a593Smuzhiyun #define ZERO_ADDR_STR "000000000000" 219*4882a593Smuzhiyun #define ETHER_TYPE_STR "0000" 220*4882a593Smuzhiyun #define IPV6_FILTER_STR "20" 221*4882a593Smuzhiyun #define ZERO_TYPE_STR "00" 222*4882a593Smuzhiyun #endif /* BLOCK_IPV6_PACKET */ 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun #if defined(OEM_ANDROID) && defined(SOFTAP) 225*4882a593Smuzhiyun extern bool ap_cfg_running; 226*4882a593Smuzhiyun extern bool ap_fw_loaded; 227*4882a593Smuzhiyun #endif 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun #if defined(OEM_ANDROID) && defined(BCMPCIE) 230*4882a593Smuzhiyun extern int dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd, int *dtim_period, int *bcn_interval); 231*4882a593Smuzhiyun #else 232*4882a593Smuzhiyun extern int dhd_get_suspend_bcn_li_dtim(dhd_pub_t *dhd); 233*4882a593Smuzhiyun #endif /* OEM_ANDROID && BCMPCIE */ 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun #ifdef CUSTOMER_HW4 236*4882a593Smuzhiyun #ifdef MIMO_ANT_SETTING 237*4882a593Smuzhiyun #ifdef DHD_EXPORT_CNTL_FILE 238*4882a593Smuzhiyun extern unsigned long antsel; 239*4882a593Smuzhiyun #endif /* DHD_EXPORT_CNTL_FILE */ 240*4882a593Smuzhiyun extern int dhd_sel_ant_from_file(dhd_pub_t *dhd); 241*4882a593Smuzhiyun #endif /* MIMO_ANT_SETTING */ 242*4882a593Smuzhiyun #ifdef WRITE_WLANINFO 243*4882a593Smuzhiyun #define MAX_VERSION_LEN 512 244*4882a593Smuzhiyun #ifdef DHD_EXPORT_CNTL_FILE 245*4882a593Smuzhiyun extern char version_info[MAX_VERSION_LEN]; 246*4882a593Smuzhiyun #endif /* DHD_EXPORT_CNTL_FILE */ 247*4882a593Smuzhiyun extern uint32 sec_save_wlinfo(char *firm_ver, char *dhd_ver, char *nvram_p, char *clm_ver); 248*4882a593Smuzhiyun #endif /* WRITE_WLANINFO */ 249*4882a593Smuzhiyun #ifdef LOGTRACE_FROM_FILE 250*4882a593Smuzhiyun extern int dhd_logtrace_from_file(dhd_pub_t *dhd); 251*4882a593Smuzhiyun #ifdef DHD_EXPORT_CNTL_FILE 252*4882a593Smuzhiyun extern unsigned long logtrace_val; 253*4882a593Smuzhiyun #endif /* DHD_EXPORT_CNTL_FILE */ 254*4882a593Smuzhiyun #endif /* LOGTRACE_FROM_FILE */ 255*4882a593Smuzhiyun #ifdef GEN_SOFTAP_INFO_FILE 256*4882a593Smuzhiyun #define SOFTAP_INFO_BUF_SZ 512 257*4882a593Smuzhiyun #ifdef DHD_EXPORT_CNTL_FILE 258*4882a593Smuzhiyun extern char softapinfostr[SOFTAP_INFO_BUF_SZ]; 259*4882a593Smuzhiyun #endif /* DHD_EXPORT_CNTL_FILE */ 260*4882a593Smuzhiyun extern uint32 sec_save_softap_info(void); 261*4882a593Smuzhiyun #endif /* GEN_SOFTAP_INFO_FILE */ 262*4882a593Smuzhiyun #endif /* CUSTOMER_HW4 */ 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #ifdef DHD_SEND_HANG_PRIVCMD_ERRORS 265*4882a593Smuzhiyun extern uint32 report_hang_privcmd_err; 266*4882a593Smuzhiyun #endif /* DHD_SEND_HANG_PRIVCMD_ERRORS */ 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun #if defined(SOFTAP_TPUT_ENHANCE) 269*4882a593Smuzhiyun extern void dhd_bus_setidletime(dhd_pub_t *dhdp, int idle_time); 270*4882a593Smuzhiyun extern void dhd_bus_getidletime(dhd_pub_t *dhdp, int* idle_time); 271*4882a593Smuzhiyun #endif /* SOFTAP_TPUT_ENHANCE */ 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #if defined(BCM_ROUTER_DHD) 274*4882a593Smuzhiyun void traffic_mgmt_pkt_set_prio(dhd_pub_t *dhdp, void * pktbuf); 275*4882a593Smuzhiyun #endif /* BCM_ROUTER_DHD */ 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #ifdef DHD_LOG_DUMP 278*4882a593Smuzhiyun /* 0: DLD_BUF_TYPE_GENERAL, 1: DLD_BUF_TYPE_PRESERVE 279*4882a593Smuzhiyun * 2: DLD_BUF_TYPE_SPECIAL 280*4882a593Smuzhiyun */ 281*4882a593Smuzhiyun #define DLD_BUFFER_NUM 3 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #ifndef CUSTOM_LOG_DUMP_BUFSIZE_MB 284*4882a593Smuzhiyun #define CUSTOM_LOG_DUMP_BUFSIZE_MB 4 /* DHD_LOG_DUMP_BUF_SIZE 4 MB static memory in kernel */ 285*4882a593Smuzhiyun #endif /* CUSTOM_LOG_DUMP_BUFSIZE_MB */ 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun #define LOG_DUMP_TOTAL_BUFSIZE (1024 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* 290*4882a593Smuzhiyun * Below are different sections that use the prealloced buffer 291*4882a593Smuzhiyun * and sum of the sizes of these should not cross LOG_DUMP_TOTAL_BUFSIZE 292*4882a593Smuzhiyun */ 293*4882a593Smuzhiyun #ifdef EWP_BCM_TRACE 294*4882a593Smuzhiyun #define LOG_DUMP_GENERAL_MAX_BUFSIZE (192 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 295*4882a593Smuzhiyun #define LOG_DUMP_BCM_TRACE_MAX_BUFSIZE (64 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 296*4882a593Smuzhiyun #else 297*4882a593Smuzhiyun #define LOG_DUMP_GENERAL_MAX_BUFSIZE (256 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 298*4882a593Smuzhiyun #define LOG_DUMP_BCM_TRACE_MAX_BUFSIZE 0 299*4882a593Smuzhiyun #endif /* EWP_BCM_TRACE */ 300*4882a593Smuzhiyun #define LOG_DUMP_PRESERVE_MAX_BUFSIZE (128 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 301*4882a593Smuzhiyun #define LOG_DUMP_ECNTRS_MAX_BUFSIZE (256 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 302*4882a593Smuzhiyun #define LOG_DUMP_RTT_MAX_BUFSIZE (256 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 303*4882a593Smuzhiyun #define LOG_DUMP_FILTER_MAX_BUFSIZE (128 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB) 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #if LOG_DUMP_TOTAL_BUFSIZE < \ 306*4882a593Smuzhiyun (LOG_DUMP_GENERAL_MAX_BUFSIZE + LOG_DUMP_PRESERVE_MAX_BUFSIZE + \ 307*4882a593Smuzhiyun LOG_DUMP_ECNTRS_MAX_BUFSIZE + LOG_DUMP_RTT_MAX_BUFSIZE + \ 308*4882a593Smuzhiyun LOG_DUMP_BCM_TRACE_MAX_BUFSIZE + LOG_DUMP_FILTER_MAX_BUFSIZE) 309*4882a593Smuzhiyun #error "LOG_DUMP_TOTAL_BUFSIZE is lesser than sum of all rings" 310*4882a593Smuzhiyun #endif 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun /* Special buffer is allocated as separately in prealloc */ 313*4882a593Smuzhiyun #define LOG_DUMP_SPECIAL_MAX_BUFSIZE (8 * 1024) 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun #define LOG_DUMP_MAX_FILESIZE (8 *1024 * 1024) /* 8 MB default */ 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun #ifdef CONFIG_LOG_BUF_SHIFT 318*4882a593Smuzhiyun /* 15% of kernel log buf size, if for example klog buf size is 512KB 319*4882a593Smuzhiyun * 15% of 512KB ~= 80KB 320*4882a593Smuzhiyun */ 321*4882a593Smuzhiyun #define LOG_DUMP_KERNEL_TAIL_FLUSH_SIZE \ 322*4882a593Smuzhiyun (15 * ((1 << CONFIG_LOG_BUF_SHIFT)/100)) 323*4882a593Smuzhiyun #endif /* CONFIG_LOG_BUF_SHIFT */ 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun #define LOG_DUMP_COOKIE_BUFSIZE 1024u 326*4882a593Smuzhiyun typedef struct { 327*4882a593Smuzhiyun char *hdr_str; 328*4882a593Smuzhiyun log_dump_section_type_t sec_type; 329*4882a593Smuzhiyun } dld_hdr_t; 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun #define DHD_PRINT_BUF_NAME_LEN 30 332*4882a593Smuzhiyun void dhd_get_debug_dump_len(void *handle, struct sk_buff *skb, void *event_info, u8 event); 333*4882a593Smuzhiyun void cfgvendor_log_dump_len(dhd_pub_t *dhdp, log_dump_type_t *type, struct sk_buff *skb); 334*4882a593Smuzhiyun #endif /* DHD_LOG_DUMP */ 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun typedef struct dhd_if_event { 337*4882a593Smuzhiyun struct list_head list; 338*4882a593Smuzhiyun wl_event_data_if_t event; 339*4882a593Smuzhiyun char name[IFNAMSIZ+1]; 340*4882a593Smuzhiyun uint8 mac[ETHER_ADDR_LEN]; 341*4882a593Smuzhiyun } dhd_if_event_t; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun /* Interface control information */ 344*4882a593Smuzhiyun typedef struct dhd_if { 345*4882a593Smuzhiyun struct dhd_info *info; /* back pointer to dhd_info */ 346*4882a593Smuzhiyun /* OS/stack specifics */ 347*4882a593Smuzhiyun struct net_device *net; 348*4882a593Smuzhiyun int idx; /* iface idx in dongle */ 349*4882a593Smuzhiyun uint subunit; /* subunit */ 350*4882a593Smuzhiyun uint8 mac_addr[ETHER_ADDR_LEN]; /* assigned MAC address */ 351*4882a593Smuzhiyun bool set_macaddress; 352*4882a593Smuzhiyun bool set_multicast; 353*4882a593Smuzhiyun uint8 bssidx; /* bsscfg index for the interface */ 354*4882a593Smuzhiyun bool attached; /* Delayed attachment when unset */ 355*4882a593Smuzhiyun bool txflowcontrol; /* Per interface flow control indicator */ 356*4882a593Smuzhiyun char name[IFNAMSIZ+1]; /* linux interface name */ 357*4882a593Smuzhiyun char dngl_name[IFNAMSIZ+1]; /* corresponding dongle interface name */ 358*4882a593Smuzhiyun struct net_device_stats stats; 359*4882a593Smuzhiyun #ifdef DHD_WMF 360*4882a593Smuzhiyun dhd_wmf_t wmf; /* per bsscfg wmf setting */ 361*4882a593Smuzhiyun bool wmf_psta_disable; /* enable/disable MC pkt to each mac 362*4882a593Smuzhiyun * of MC group behind PSTA 363*4882a593Smuzhiyun */ 364*4882a593Smuzhiyun #endif /* DHD_WMF */ 365*4882a593Smuzhiyun #ifdef PCIE_FULL_DONGLE 366*4882a593Smuzhiyun struct list_head sta_list; /* sll of associated stations */ 367*4882a593Smuzhiyun spinlock_t sta_list_lock; /* lock for manipulating sll */ 368*4882a593Smuzhiyun #endif /* PCIE_FULL_DONGLE */ 369*4882a593Smuzhiyun uint32 ap_isolate; /* ap-isolation settings */ 370*4882a593Smuzhiyun #ifdef DHD_L2_FILTER 371*4882a593Smuzhiyun bool parp_enable; 372*4882a593Smuzhiyun bool parp_discard; 373*4882a593Smuzhiyun bool parp_allnode; 374*4882a593Smuzhiyun arp_table_t *phnd_arp_table; 375*4882a593Smuzhiyun /* for Per BSS modification */ 376*4882a593Smuzhiyun bool dhcp_unicast; 377*4882a593Smuzhiyun bool block_ping; 378*4882a593Smuzhiyun bool grat_arp; 379*4882a593Smuzhiyun bool block_tdls; 380*4882a593Smuzhiyun #endif /* DHD_L2_FILTER */ 381*4882a593Smuzhiyun #if (defined(BCM_ROUTER_DHD) && defined(QOS_MAP_SET)) 382*4882a593Smuzhiyun uint8 *qosmap_up_table; /* user priority table, size is UP_TABLE_MAX */ 383*4882a593Smuzhiyun bool qosmap_up_table_enable; /* flag set only when app want to set additional UP */ 384*4882a593Smuzhiyun #endif /* BCM_ROUTER_DHD && QOS_MAP_SET */ 385*4882a593Smuzhiyun #ifdef DHD_MCAST_REGEN 386*4882a593Smuzhiyun bool mcast_regen_bss_enable; 387*4882a593Smuzhiyun #endif 388*4882a593Smuzhiyun bool rx_pkt_chainable; /* set all rx packet to chainable config by default */ 389*4882a593Smuzhiyun cumm_ctr_t cumm_ctr; /* cummulative queue length of child flowrings */ 390*4882a593Smuzhiyun #ifdef BCM_ROUTER_DHD 391*4882a593Smuzhiyun bool primsta_dwds; /* DWDS status of primary sta interface */ 392*4882a593Smuzhiyun #endif /* BCM_ROUTER_DHD */ 393*4882a593Smuzhiyun uint8 tx_paths_active; 394*4882a593Smuzhiyun bool del_in_progress; 395*4882a593Smuzhiyun bool static_if; /* used to avoid some operations on static_if */ 396*4882a593Smuzhiyun #ifdef DHD_4WAYM4_FAIL_DISCONNECT 397*4882a593Smuzhiyun struct delayed_work m4state_work; 398*4882a593Smuzhiyun atomic_t m4state; 399*4882a593Smuzhiyun #endif /* DHD_4WAYM4_FAIL_DISCONNECT */ 400*4882a593Smuzhiyun #ifdef DHDTCPSYNC_FLOOD_BLK 401*4882a593Smuzhiyun uint32 tsync_rcvd; 402*4882a593Smuzhiyun uint32 tsyncack_txed; 403*4882a593Smuzhiyun u64 last_sync; 404*4882a593Smuzhiyun struct work_struct blk_tsfl_work; 405*4882a593Smuzhiyun uint32 tsync_per_sec; 406*4882a593Smuzhiyun bool disconnect_tsync_flood; 407*4882a593Smuzhiyun #endif /* DHDTCPSYNC_FLOOD_BLK */ 408*4882a593Smuzhiyun #ifdef DHD_POST_EAPOL_M1_AFTER_ROAM_EVT 409*4882a593Smuzhiyun bool recv_reassoc_evt; 410*4882a593Smuzhiyun bool post_roam_evt; 411*4882a593Smuzhiyun #endif /* DHD_POST_EAPOL_M1_AFTER_ROAM_EVT */ 412*4882a593Smuzhiyun #ifdef WLDWDS 413*4882a593Smuzhiyun bool dwds; /* DWDS interface */ 414*4882a593Smuzhiyun #endif /* WLDWDS */ 415*4882a593Smuzhiyun #ifdef WLEASYMESH 416*4882a593Smuzhiyun uint8 _1905_al_ucast[ETHER_ADDR_LEN]; 417*4882a593Smuzhiyun uint8 _1905_al_mcast[ETHER_ADDR_LEN]; 418*4882a593Smuzhiyun #endif /* WLEASYMESH */ 419*4882a593Smuzhiyun } dhd_if_t; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun struct ipv6_work_info_t { 422*4882a593Smuzhiyun uint8 if_idx; 423*4882a593Smuzhiyun char ipv6_addr[IPV6_ADDR_LEN]; 424*4882a593Smuzhiyun unsigned long event; 425*4882a593Smuzhiyun }; 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun typedef struct dhd_dump { 428*4882a593Smuzhiyun uint8 *buf; 429*4882a593Smuzhiyun int bufsize; 430*4882a593Smuzhiyun uint8 *hscb_buf; 431*4882a593Smuzhiyun int hscb_bufsize; 432*4882a593Smuzhiyun } dhd_dump_t; 433*4882a593Smuzhiyun #ifdef DNGL_AXI_ERROR_LOGGING 434*4882a593Smuzhiyun typedef struct dhd_axi_error_dump { 435*4882a593Smuzhiyun ulong fault_address; 436*4882a593Smuzhiyun uint32 axid; 437*4882a593Smuzhiyun struct hnd_ext_trap_axi_error_v1 etd_axi_error_v1; 438*4882a593Smuzhiyun } dhd_axi_error_dump_t; 439*4882a593Smuzhiyun #endif /* DNGL_AXI_ERROR_LOGGING */ 440*4882a593Smuzhiyun #ifdef BCM_ROUTER_DHD 441*4882a593Smuzhiyun typedef struct dhd_write_file { 442*4882a593Smuzhiyun char file_path[64]; 443*4882a593Smuzhiyun uint32 file_flags; 444*4882a593Smuzhiyun uint8 *buf; 445*4882a593Smuzhiyun int bufsize; 446*4882a593Smuzhiyun } dhd_write_file_t; 447*4882a593Smuzhiyun #endif 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun #ifdef DHD_PCIE_NATIVE_RUNTIMEPM 450*4882a593Smuzhiyun struct dhd_rx_tx_work { 451*4882a593Smuzhiyun struct work_struct work; 452*4882a593Smuzhiyun struct sk_buff *skb; 453*4882a593Smuzhiyun struct net_device *net; 454*4882a593Smuzhiyun struct dhd_pub *pub; 455*4882a593Smuzhiyun }; 456*4882a593Smuzhiyun #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */ 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun #ifdef FILTER_IE 459*4882a593Smuzhiyun #define FILTER_IE_PATH "/vendor/etc/wifi/filter_ie" 460*4882a593Smuzhiyun #define FILTER_IE_BUFSZ 1024 /* ioc buffsize for FILTER_IE */ 461*4882a593Smuzhiyun #define FILE_BLOCK_READ_SIZE 256 462*4882a593Smuzhiyun #define WL_FILTER_IE_IOV_HDR_SIZE OFFSETOF(wl_filter_ie_iov_v1_t, tlvs) 463*4882a593Smuzhiyun #endif /* FILTER_IE */ 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun #define NULL_CHECK(p, s, err) \ 466*4882a593Smuzhiyun do { \ 467*4882a593Smuzhiyun if (!(p)) { \ 468*4882a593Smuzhiyun printk("NULL POINTER (%s) : %s\n", __FUNCTION__, (s)); \ 469*4882a593Smuzhiyun err = BCME_ERROR; \ 470*4882a593Smuzhiyun return err; \ 471*4882a593Smuzhiyun } \ 472*4882a593Smuzhiyun } while (0) 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun int dhd_wifi_platform_register_drv(void); 475*4882a593Smuzhiyun void dhd_wifi_platform_unregister_drv(void); 476*4882a593Smuzhiyun wifi_adapter_info_t* dhd_wifi_platform_attach_adapter(uint32 bus_type, 477*4882a593Smuzhiyun uint32 bus_num, uint32 slot_num, unsigned long status); 478*4882a593Smuzhiyun wifi_adapter_info_t* dhd_wifi_platform_get_adapter(uint32 bus_type, uint32 bus_num, 479*4882a593Smuzhiyun uint32 slot_num); 480*4882a593Smuzhiyun int wifi_platform_set_power(wifi_adapter_info_t *adapter, bool on, unsigned long msec); 481*4882a593Smuzhiyun int wifi_platform_bus_enumerate(wifi_adapter_info_t *adapter, bool device_present); 482*4882a593Smuzhiyun int wifi_platform_get_irq_number(wifi_adapter_info_t *adapter, unsigned long *irq_flags_ptr); 483*4882a593Smuzhiyun int wifi_platform_get_mac_addr(wifi_adapter_info_t *adapter, unsigned char *buf, int ifidx); 484*4882a593Smuzhiyun #ifdef DHD_COREDUMP 485*4882a593Smuzhiyun int wifi_platform_set_coredump(wifi_adapter_info_t *adapter, const char *buf, int buf_len, 486*4882a593Smuzhiyun const char *info); 487*4882a593Smuzhiyun #endif /* DHD_COREDUMP */ 488*4882a593Smuzhiyun #ifdef CUSTOM_COUNTRY_CODE 489*4882a593Smuzhiyun void *wifi_platform_get_country_code(wifi_adapter_info_t *adapter, char *ccode, 490*4882a593Smuzhiyun u32 flags); 491*4882a593Smuzhiyun #else 492*4882a593Smuzhiyun void *wifi_platform_get_country_code(wifi_adapter_info_t *adapter, char *ccode); 493*4882a593Smuzhiyun #endif /* CUSTOM_COUNTRY_CODE */ 494*4882a593Smuzhiyun void* wifi_platform_prealloc(wifi_adapter_info_t *adapter, int section, unsigned long size); 495*4882a593Smuzhiyun void* wifi_platform_get_prealloc_func_ptr(wifi_adapter_info_t *adapter); 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun int dhd_get_fw_mode(struct dhd_info *dhdinfo); 498*4882a593Smuzhiyun bool dhd_update_fw_nv_path(struct dhd_info *dhdinfo); 499*4882a593Smuzhiyun #ifdef BCM_ROUTER_DHD 500*4882a593Smuzhiyun void dhd_update_dpsta_interface_for_sta(dhd_pub_t* dhdp, int ifidx, void* event_data); 501*4882a593Smuzhiyun #endif /* BCM_ROUTER_DHD */ 502*4882a593Smuzhiyun #ifdef DHD_WMF 503*4882a593Smuzhiyun dhd_wmf_t* dhd_wmf_conf(dhd_pub_t *dhdp, uint32 idx); 504*4882a593Smuzhiyun int dhd_get_wmf_psta_disable(dhd_pub_t *dhdp, uint32 idx); 505*4882a593Smuzhiyun int dhd_set_wmf_psta_disable(dhd_pub_t *dhdp, uint32 idx, int val); 506*4882a593Smuzhiyun void dhd_update_psta_interface_for_sta(dhd_pub_t *dhdp, char* ifname, 507*4882a593Smuzhiyun void* mac_addr, void* event_data); 508*4882a593Smuzhiyun #endif /* DHD_WMF */ 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun #if defined (BT_OVER_SDIO) 511*4882a593Smuzhiyun int dhd_net_bus_get(struct net_device *dev); 512*4882a593Smuzhiyun int dhd_net_bus_put(struct net_device *dev); 513*4882a593Smuzhiyun #endif /* BT_OVER_SDIO */ 514*4882a593Smuzhiyun #if defined(WLADPS) || defined(WLADPS_PRIVATE_CMD) 515*4882a593Smuzhiyun #define ADPS_ENABLE 1 516*4882a593Smuzhiyun #define ADPS_DISABLE 0 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun int dhd_enable_adps(dhd_pub_t *dhd, uint8 on); 519*4882a593Smuzhiyun #endif /* WLADPS || WLADPS_PRIVATE_CMD */ 520*4882a593Smuzhiyun #ifdef DHDTCPSYNC_FLOOD_BLK 521*4882a593Smuzhiyun extern void dhd_reset_tcpsync_info_by_ifp(dhd_if_t *ifp); 522*4882a593Smuzhiyun extern void dhd_reset_tcpsync_info_by_dev(struct net_device *dev); 523*4882a593Smuzhiyun #endif /* DHDTCPSYNC_FLOOD_BLK */ 524*4882a593Smuzhiyun #ifdef PCIE_FULL_DONGLE 525*4882a593Smuzhiyun extern void dhd_net_del_flowrings_sta(dhd_pub_t * dhd, struct net_device * ndev); 526*4882a593Smuzhiyun #endif /* PCIE_FULL_DONGLE */ 527*4882a593Smuzhiyun int dhd_get_fw_capabilities(dhd_pub_t * dhd); 528*4882a593Smuzhiyun #endif /* __DHD_LINUX_H__ */ 529