xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/dhd_linux.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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