xref: /wlan-driver/qca-wifi-host-cmn/ipa/core/inc/wlan_ipa_priv.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: Declare various struct, macros which are used privately in IPA
22*5113495bSYour Name  * component.
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef _WLAN_IPA_PRIV_STRUCT_H_
26*5113495bSYour Name #define _WLAN_IPA_PRIV_STRUCT_H_
27*5113495bSYour Name 
28*5113495bSYour Name #ifdef IPA_OFFLOAD
29*5113495bSYour Name 
30*5113495bSYour Name #include <linux/version.h>
31*5113495bSYour Name #include <linux/kernel.h>
32*5113495bSYour Name 
33*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \
34*5113495bSYour Name 	defined(CONFIG_IPA_WDI_UNIFIED_API)
35*5113495bSYour Name #include <qdf_ipa_wdi3.h>
36*5113495bSYour Name #else
37*5113495bSYour Name #include <qdf_ipa.h>
38*5113495bSYour Name #endif
39*5113495bSYour Name 
40*5113495bSYour Name #include <qdf_net_types.h>
41*5113495bSYour Name #include <qdf_mc_timer.h>
42*5113495bSYour Name #include <qdf_list.h>
43*5113495bSYour Name #include <qdf_defer.h>
44*5113495bSYour Name #include "qdf_delayed_work.h"
45*5113495bSYour Name #include <qdf_event.h>
46*5113495bSYour Name #include "wlan_ipa_public_struct.h"
47*5113495bSYour Name #ifdef IPA_OPT_WIFI_DP
48*5113495bSYour Name #include "cdp_txrx_ipa.h"
49*5113495bSYour Name #endif
50*5113495bSYour Name 
51*5113495bSYour Name #define WLAN_IPA_RX_INACTIVITY_MSEC_DELAY   1000
52*5113495bSYour Name #define WLAN_IPA_UC_WLAN_8023_HDR_SIZE      14
53*5113495bSYour Name 
54*5113495bSYour Name #define WLAN_IPA_UC_NUM_WDI_PIPE            2
55*5113495bSYour Name #define WLAN_IPA_UC_MAX_PENDING_EVENT       33
56*5113495bSYour Name 
57*5113495bSYour Name #define WLAN_IPA_UC_DEBUG_DUMMY_MEM_SIZE    32000
58*5113495bSYour Name #define WLAN_IPA_UC_RT_DEBUG_PERIOD         300
59*5113495bSYour Name #define WLAN_IPA_UC_RT_DEBUG_BUF_COUNT      30
60*5113495bSYour Name #define WLAN_IPA_UC_RT_DEBUG_FILL_INTERVAL  10000
61*5113495bSYour Name 
62*5113495bSYour Name #define WLAN_IPA_WLAN_HDR_DES_MAC_OFFSET    0
63*5113495bSYour Name #define WLAN_IPA_MAX_IFACE                  MAX_IPA_IFACE
64*5113495bSYour Name #define WLAN_IPA_CLIENT_MAX_IFACE           MAX_IPA_IFACE
65*5113495bSYour Name #define WLAN_IPA_MAX_SYSBAM_PIPE            4
66*5113495bSYour Name 
67*5113495bSYour Name #if defined(IPA_WDS_EASYMESH_FEATURE) || defined(QCA_WIFI_QCN9224)
68*5113495bSYour Name #define WLAN_IPA_MAX_SESSION                MAX_IPA_IFACE //7
69*5113495bSYour Name #else
70*5113495bSYour Name #define WLAN_IPA_MAX_SESSION                5
71*5113495bSYour Name #endif
72*5113495bSYour Name 
73*5113495bSYour Name #ifdef WLAN_MAX_CLIENTS_ALLOWED
74*5113495bSYour Name #define WLAN_IPA_MAX_STA_COUNT              WLAN_MAX_CLIENTS_ALLOWED
75*5113495bSYour Name #else
76*5113495bSYour Name #define WLAN_IPA_MAX_STA_COUNT              41
77*5113495bSYour Name #endif
78*5113495bSYour Name 
79*5113495bSYour Name #define WLAN_IPA_RX_PIPE                    (WLAN_IPA_MAX_SYSBAM_PIPE - 1)
80*5113495bSYour Name #define WLAN_IPA_ENABLE_MASK                BIT(0)
81*5113495bSYour Name #define WLAN_IPA_PRE_FILTER_ENABLE_MASK     BIT(1)
82*5113495bSYour Name #define WLAN_IPA_IPV6_ENABLE_MASK           BIT(2)
83*5113495bSYour Name #define WLAN_IPA_RM_ENABLE_MASK             BIT(3)
84*5113495bSYour Name #define WLAN_IPA_CLK_SCALING_ENABLE_MASK    BIT(4)
85*5113495bSYour Name #define WLAN_IPA_UC_ENABLE_MASK             BIT(5)
86*5113495bSYour Name #define WLAN_IPA_UC_STA_ENABLE_MASK         BIT(6)
87*5113495bSYour Name #define WLAN_IPA_REAL_TIME_DEBUGGING        BIT(8)
88*5113495bSYour Name #define WLAN_IPA_OPT_WIFI_DP                BIT(9)
89*5113495bSYour Name 
90*5113495bSYour Name #ifdef QCA_IPA_LL_TX_FLOW_CONTROL
91*5113495bSYour Name #define WLAN_IPA_MAX_BANDWIDTH              4800
92*5113495bSYour Name #define WLAN_IPA_MAX_BANDWIDTH_2G           1400
93*5113495bSYour Name #else /* !QCA_IPA_LL_TX_FLOW_CONTROL */
94*5113495bSYour Name #define WLAN_IPA_MAX_BANDWIDTH              800
95*5113495bSYour Name #endif /* QCA_IPA_LL_TX_FLOW_CONTROL */
96*5113495bSYour Name 
97*5113495bSYour Name #define WLAN_IPA_MAX_PENDING_EVENT_COUNT    20
98*5113495bSYour Name 
99*5113495bSYour Name #define IPA_WLAN_RX_SOFTIRQ_THRESH 32
100*5113495bSYour Name 
101*5113495bSYour Name #define WLAN_IPA_UC_BW_MONITOR_LEVEL        3
102*5113495bSYour Name 
103*5113495bSYour Name /**
104*5113495bSYour Name  * enum wlan_ipa_uc_op_code - IPA UC operation message
105*5113495bSYour Name  *
106*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_TX_SUSPEND: IPA WDI TX pipe suspend
107*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_TX_RESUME: IPA WDI TX pipe resume
108*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_RX_SUSPEND: IPA WDI RX pipe suspend
109*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_RX_RESUME: IPA WDI RX pipe resume
110*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_STATS: IPA UC stats
111*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_SHARING_STATS: IPA UC sharing stats
112*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_QUOTA_RSP: IPA UC quota response
113*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_QUOTA_IND: IPA UC quota indication
114*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_UC_READY: IPA UC ready indication
115*5113495bSYour Name  * @WLAN_IPA_FILTER_RSV_NOTIFY: OPT WIFI DP filter reserve notification
116*5113495bSYour Name  * @WLAN_IPA_FILTER_REL_NOTIFY: OPT WIFI DP filter release notification
117*5113495bSYour Name  * @WLAN_IPA_SMMU_MAP: IPA SMMU map call
118*5113495bSYour Name  * @WLAN_IPA_SMMU_UNMAP: IPA SMMU unmap call
119*5113495bSYour Name  * @WLAN_IPA_UC_OPCODE_MAX: IPA UC max operation code
120*5113495bSYour Name  */
121*5113495bSYour Name enum wlan_ipa_uc_op_code {
122*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_TX_SUSPEND = 0,
123*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_TX_RESUME = 1,
124*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_RX_SUSPEND = 2,
125*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_RX_RESUME = 3,
126*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_STATS = 4,
127*5113495bSYour Name #ifdef FEATURE_METERING
128*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_SHARING_STATS = 5,
129*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_QUOTA_RSP = 6,
130*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_QUOTA_IND = 7,
131*5113495bSYour Name #endif
132*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_UC_READY = 8,
133*5113495bSYour Name 	WLAN_IPA_FILTER_RSV_NOTIFY = 9,
134*5113495bSYour Name 	WLAN_IPA_FILTER_REL_NOTIFY = 10,
135*5113495bSYour Name 	WLAN_IPA_SMMU_MAP = 11,
136*5113495bSYour Name 	WLAN_IPA_SMMU_UNMAP = 12,
137*5113495bSYour Name 	/* keep this last */
138*5113495bSYour Name 	WLAN_IPA_UC_OPCODE_MAX
139*5113495bSYour Name };
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * enum - Reason codes for stat query
143*5113495bSYour Name  *
144*5113495bSYour Name  * @WLAN_IPA_UC_STAT_REASON_NONE: Initial value
145*5113495bSYour Name  * @WLAN_IPA_UC_STAT_REASON_DEBUG: For debug/info
146*5113495bSYour Name  * @WLAN_IPA_UC_STAT_REASON_BW_CAL: For bandwidth calibration
147*5113495bSYour Name  */
148*5113495bSYour Name enum {
149*5113495bSYour Name 	WLAN_IPA_UC_STAT_REASON_NONE,
150*5113495bSYour Name 	WLAN_IPA_UC_STAT_REASON_DEBUG,
151*5113495bSYour Name 	WLAN_IPA_UC_STAT_REASON_BW_CAL
152*5113495bSYour Name };
153*5113495bSYour Name 
154*5113495bSYour Name /**
155*5113495bSYour Name  * enum wlan_ipa_rm_state - IPA resource manager state
156*5113495bSYour Name  * @WLAN_IPA_RM_RELEASED:      PROD pipe resource released
157*5113495bSYour Name  * @WLAN_IPA_RM_GRANT_PENDING: PROD pipe resource requested but not granted yet
158*5113495bSYour Name  * @WLAN_IPA_RM_GRANTED:       PROD pipe resource granted
159*5113495bSYour Name  */
160*5113495bSYour Name enum wlan_ipa_rm_state {
161*5113495bSYour Name 	WLAN_IPA_RM_RELEASED,
162*5113495bSYour Name 	WLAN_IPA_RM_GRANT_PENDING,
163*5113495bSYour Name 	WLAN_IPA_RM_GRANTED,
164*5113495bSYour Name };
165*5113495bSYour Name 
166*5113495bSYour Name /**
167*5113495bSYour Name  * enum wlan_ipa_forward_type: Type of forward packet received from IPA
168*5113495bSYour Name  * @WLAN_IPA_FORWARD_PKT_NONE: No forward packet
169*5113495bSYour Name  * @WLAN_IPA_FORWARD_PKT_LOCAL_STACK: Packet forwarded to kernel network stack
170*5113495bSYour Name  * @WLAN_IPA_FORWARD_PKT_DISCARD: Discarded packet before sending to kernel
171*5113495bSYour Name  */
172*5113495bSYour Name enum wlan_ipa_forward_type {
173*5113495bSYour Name 	WLAN_IPA_FORWARD_PKT_NONE = 0,
174*5113495bSYour Name 	WLAN_IPA_FORWARD_PKT_LOCAL_STACK = 1,
175*5113495bSYour Name 	WLAN_IPA_FORWARD_PKT_DISCARD = 2
176*5113495bSYour Name };
177*5113495bSYour Name 
178*5113495bSYour Name /**
179*5113495bSYour Name  * struct llc_snap_hdr - LLC snap header
180*5113495bSYour Name  * @dsap: Destination service access point
181*5113495bSYour Name  * @ssap: Source service access point
182*5113495bSYour Name  * @resv: Reserved for future use
183*5113495bSYour Name  * @eth_type: Ether type
184*5113495bSYour Name  */
185*5113495bSYour Name struct llc_snap_hdr {
186*5113495bSYour Name 	uint8_t dsap;
187*5113495bSYour Name 	uint8_t ssap;
188*5113495bSYour Name 	uint8_t resv[4];
189*5113495bSYour Name 	qdf_be16_t eth_type;
190*5113495bSYour Name } qdf_packed;
191*5113495bSYour Name 
192*5113495bSYour Name /**
193*5113495bSYour Name  * struct wlan_ipa_tx_hdr - header type which IPA should handle to TX packet
194*5113495bSYour Name  * @eth:      ether II header
195*5113495bSYour Name  * @llc_snap: LLC snap header
196*5113495bSYour Name  */
197*5113495bSYour Name struct wlan_ipa_tx_hdr {
198*5113495bSYour Name 	qdf_ether_header_t eth;
199*5113495bSYour Name 	struct llc_snap_hdr llc_snap;
200*5113495bSYour Name } qdf_packed;
201*5113495bSYour Name 
202*5113495bSYour Name #if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \
203*5113495bSYour Name     defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) || \
204*5113495bSYour Name     defined(QCA_WIFI_WCN7850) || defined(QCA_WIFI_QCN9000) || \
205*5113495bSYour Name     defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_KIWI_V2)
206*5113495bSYour Name /**
207*5113495bSYour Name  * struct frag_header - fragment header type registered to IPA hardware
208*5113495bSYour Name  * @length:    fragment length
209*5113495bSYour Name  * @reserved: Reserved not used
210*5113495bSYour Name  */
211*5113495bSYour Name struct frag_header {
212*5113495bSYour Name 	__QDF_DECLARE_FLEX_ARRAY(uint8_t, reserved);
213*5113495bSYour Name };
214*5113495bSYour Name #elif defined(QCA_WIFI_3_0)
215*5113495bSYour Name /**
216*5113495bSYour Name  * struct frag_header - fragment header type registered to IPA hardware
217*5113495bSYour Name  * @length:    fragment length
218*5113495bSYour Name  * @reserved1: Reserved not used
219*5113495bSYour Name  * @reserved2: Reserved not used
220*5113495bSYour Name  */
221*5113495bSYour Name struct frag_header {
222*5113495bSYour Name 	uint16_t length;
223*5113495bSYour Name 	uint32_t reserved1;
224*5113495bSYour Name 	uint32_t reserved2;
225*5113495bSYour Name } qdf_packed;
226*5113495bSYour Name #else
227*5113495bSYour Name struct frag_header {
228*5113495bSYour Name 	uint32_t
229*5113495bSYour Name 		length:16,
230*5113495bSYour Name 		reserved16:16;
231*5113495bSYour Name 	uint32_t reserved2;
232*5113495bSYour Name } qdf_packed;
233*5113495bSYour Name #endif
234*5113495bSYour Name 
235*5113495bSYour Name #if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \
236*5113495bSYour Name     defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) || \
237*5113495bSYour Name     defined(QCA_WIFI_WCN7850) || defined(QCA_WIFI_QCN9000) || \
238*5113495bSYour Name     defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_KIWI_V2)
239*5113495bSYour Name /**
240*5113495bSYour Name  * struct ipa_header - ipa header type registered to IPA hardware
241*5113495bSYour Name  * @reserved: Reserved not used
242*5113495bSYour Name  */
243*5113495bSYour Name struct ipa_header {
244*5113495bSYour Name 	__QDF_DECLARE_FLEX_ARRAY(uint8_t, reserved);
245*5113495bSYour Name };
246*5113495bSYour Name #else
247*5113495bSYour Name /**
248*5113495bSYour Name  * struct ipa_header - ipa header type registered to IPA hardware
249*5113495bSYour Name  * @vdev_id:  vdev id
250*5113495bSYour Name  * @reserved: Reserved not used
251*5113495bSYour Name  */
252*5113495bSYour Name struct ipa_header {
253*5113495bSYour Name 	uint32_t
254*5113495bSYour Name 		vdev_id:8,	/* vdev_id field is LSB of IPA DESC */
255*5113495bSYour Name 		reserved:24;
256*5113495bSYour Name } qdf_packed;
257*5113495bSYour Name #endif
258*5113495bSYour Name 
259*5113495bSYour Name /**
260*5113495bSYour Name  * struct wlan_ipa_uc_tx_hdr - full tx header registered to IPA hardware
261*5113495bSYour Name  * @frag_hd: fragment header
262*5113495bSYour Name  * @ipa_hd:  ipa header
263*5113495bSYour Name  * @eth:     ether II header
264*5113495bSYour Name  */
265*5113495bSYour Name struct wlan_ipa_uc_tx_hdr {
266*5113495bSYour Name 	struct frag_header frag_hd;
267*5113495bSYour Name 	struct ipa_header ipa_hd;
268*5113495bSYour Name 	qdf_ether_header_t eth;
269*5113495bSYour Name } qdf_packed;
270*5113495bSYour Name 
271*5113495bSYour Name /**
272*5113495bSYour Name  * struct wlan_ipa_cld_hdr - IPA CLD Header
273*5113495bSYour Name  * @reserved: reserved fields
274*5113495bSYour Name  * @iface_id: interface ID
275*5113495bSYour Name  * @sta_id: Station ID
276*5113495bSYour Name  *
277*5113495bSYour Name  * Packed 32-bit structure
278*5113495bSYour Name  * +----------+----------+--------------+--------+
279*5113495bSYour Name  * | Reserved | QCMAP ID | interface id | STA ID |
280*5113495bSYour Name  * +----------+----------+--------------+--------+
281*5113495bSYour Name  */
282*5113495bSYour Name struct wlan_ipa_cld_hdr {
283*5113495bSYour Name 	uint8_t reserved[2];
284*5113495bSYour Name 	uint8_t iface_id;
285*5113495bSYour Name 	uint8_t sta_id;
286*5113495bSYour Name } qdf_packed;
287*5113495bSYour Name 
288*5113495bSYour Name /**
289*5113495bSYour Name  * struct wlan_ipa_rx_hdr - IPA RX header
290*5113495bSYour Name  * @cld_hdr: IPA CLD header
291*5113495bSYour Name  * @eth:     ether II header
292*5113495bSYour Name  */
293*5113495bSYour Name struct wlan_ipa_rx_hdr {
294*5113495bSYour Name 	struct wlan_ipa_cld_hdr cld_hdr;
295*5113495bSYour Name 	qdf_ether_header_t eth;
296*5113495bSYour Name } qdf_packed;
297*5113495bSYour Name 
298*5113495bSYour Name /**
299*5113495bSYour Name  * struct wlan_ipa_pm_tx_cb - PM resume TX callback
300*5113495bSYour Name  * @exception: Exception packet
301*5113495bSYour Name  * @iface_context: Interface context
302*5113495bSYour Name  * @ipa_tx_desc: IPA TX descriptor
303*5113495bSYour Name  * @send_to_nw: RX exception packet that needs to be passed up to stack
304*5113495bSYour Name  */
305*5113495bSYour Name struct wlan_ipa_pm_tx_cb {
306*5113495bSYour Name 	bool exception;
307*5113495bSYour Name 	struct wlan_ipa_iface_context *iface_context;
308*5113495bSYour Name 	qdf_ipa_rx_data_t *ipa_tx_desc;
309*5113495bSYour Name 	bool send_to_nw;
310*5113495bSYour Name };
311*5113495bSYour Name 
312*5113495bSYour Name /**
313*5113495bSYour Name  * struct wlan_ipa_sys_pipe - IPA system pipe
314*5113495bSYour Name  * @conn_hdl: IPA system pipe connection handle
315*5113495bSYour Name  * @conn_hdl_valid: IPA system pipe valid flag
316*5113495bSYour Name  * @ipa_sys_params: IPA system pipe params
317*5113495bSYour Name  */
318*5113495bSYour Name struct wlan_ipa_sys_pipe {
319*5113495bSYour Name 	uint32_t conn_hdl;
320*5113495bSYour Name 	uint8_t conn_hdl_valid;
321*5113495bSYour Name 	qdf_ipa_sys_connect_params_t ipa_sys_params;
322*5113495bSYour Name };
323*5113495bSYour Name 
324*5113495bSYour Name /**
325*5113495bSYour Name  * struct wlan_ipa_iface_stats - IPA system pipe
326*5113495bSYour Name  * @num_tx: Number of TX packets
327*5113495bSYour Name  * @num_tx_drop: Number of TX packet drops
328*5113495bSYour Name  * @num_tx_err: Number of TX packet errors
329*5113495bSYour Name  * @num_tx_cac_drop: Number of TX packet drop due to CAC
330*5113495bSYour Name  * @num_rx_ipa_excep: Number of RX IPA exception packets
331*5113495bSYour Name  */
332*5113495bSYour Name struct wlan_ipa_iface_stats {
333*5113495bSYour Name 	uint64_t num_tx;
334*5113495bSYour Name 	uint64_t num_tx_drop;
335*5113495bSYour Name 	uint64_t num_tx_err;
336*5113495bSYour Name 	uint64_t num_tx_cac_drop;
337*5113495bSYour Name 	uint64_t num_rx_ipa_excep;
338*5113495bSYour Name };
339*5113495bSYour Name 
340*5113495bSYour Name /* IPA private context structure */
341*5113495bSYour Name struct wlan_ipa_priv;
342*5113495bSYour Name 
343*5113495bSYour Name /**
344*5113495bSYour Name  * struct wlan_ipa_iface_context - IPA interface context
345*5113495bSYour Name  * @ipa_ctx: IPA private context
346*5113495bSYour Name  * @cons_client: IPA consumer pipe
347*5113495bSYour Name  * @prod_client: IPA producer pipe
348*5113495bSYour Name  * @iface_id: IPA interface ID
349*5113495bSYour Name  * @dev: Net device structure
350*5113495bSYour Name  * @device_mode: Interface device mode
351*5113495bSYour Name  * @mac_addr: MAC address
352*5113495bSYour Name  * @conn_count: Connect count
353*5113495bSYour Name  * @disconn_count: Disconnect count
354*5113495bSYour Name  * @session_id: Session ID
355*5113495bSYour Name  * @interface_lock: Interface lock
356*5113495bSYour Name  * @ifa_address: Interface address
357*5113495bSYour Name  * @stats: Interface stats
358*5113495bSYour Name  * @bssid: BSSID. valid only for sta iface ctx
359*5113495bSYour Name  * @is_authenticated: is peer authenticated
360*5113495bSYour Name  * @alt_pipe: Indicate whether the interface uses alternate TX pipe
361*5113495bSYour Name  */
362*5113495bSYour Name struct wlan_ipa_iface_context {
363*5113495bSYour Name 	struct wlan_ipa_priv *ipa_ctx;
364*5113495bSYour Name 
365*5113495bSYour Name 	qdf_ipa_client_type_t cons_client;
366*5113495bSYour Name 	qdf_ipa_client_type_t prod_client;
367*5113495bSYour Name 
368*5113495bSYour Name 	uint8_t iface_id;       /* This iface ID */
369*5113495bSYour Name 	qdf_netdev_t dev;
370*5113495bSYour Name 	enum QDF_OPMODE device_mode;
371*5113495bSYour Name 	uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
372*5113495bSYour Name 	qdf_atomic_t conn_count;
373*5113495bSYour Name 	qdf_atomic_t disconn_count;
374*5113495bSYour Name 	uint8_t session_id;
375*5113495bSYour Name 	qdf_spinlock_t interface_lock;
376*5113495bSYour Name 	uint32_t ifa_address;
377*5113495bSYour Name 	struct wlan_ipa_iface_stats stats;
378*5113495bSYour Name 	struct qdf_mac_addr bssid;
379*5113495bSYour Name 	uint8_t is_authenticated;
380*5113495bSYour Name #ifdef IPA_WDI3_TX_TWO_PIPES
381*5113495bSYour Name 	bool alt_pipe;
382*5113495bSYour Name #endif
383*5113495bSYour Name };
384*5113495bSYour Name 
385*5113495bSYour Name /**
386*5113495bSYour Name  * struct wlan_ipa_stats - IPA system stats
387*5113495bSYour Name  * @event: WLAN IPA event record
388*5113495bSYour Name  * @num_send_msg: Number of sent IPA messages
389*5113495bSYour Name  * @num_free_msg: Number of freed IPA messages
390*5113495bSYour Name  * @num_rm_grant: Number of times IPA RM resource granted
391*5113495bSYour Name  * @num_rm_release: Number of times IPA RM resource released
392*5113495bSYour Name  * @num_rm_grant_imm: Number of immediate IPA RM granted
393*5113495bSYour Name  * @num_cons_perf_req: Number of CONS pipe perf request
394*5113495bSYour Name  * @num_prod_perf_req: Number of PROD pipe perf request
395*5113495bSYour Name  * @num_rx_drop: Number of RX packet drops
396*5113495bSYour Name  * @num_tx_desc_q_cnt: Number of TX descriptor queue count
397*5113495bSYour Name  * @num_tx_desc_error: Number of TX descriptor error
398*5113495bSYour Name  * @num_tx_comp_cnt: Number of TX qdf_event_t count
399*5113495bSYour Name  * @num_tx_queued: Number of TX queued
400*5113495bSYour Name  * @num_tx_dequeued: Number of TX dequeued
401*5113495bSYour Name  * @num_max_pm_queue: Number of packets in PM queue
402*5113495bSYour Name  * @num_rx_excep: Number of RX IPA exception packets
403*5113495bSYour Name  * @num_rx_no_iface_eapol: No of EAPOL pkts before iface setup
404*5113495bSYour Name  * @num_tx_fwd_ok: Number of TX forward packet success
405*5113495bSYour Name  * @num_tx_fwd_err: Number of TX forward packet failures
406*5113495bSYour Name  */
407*5113495bSYour Name struct wlan_ipa_stats {
408*5113495bSYour Name 	uint32_t event[QDF_IPA_WLAN_EVENT_MAX];
409*5113495bSYour Name 	uint64_t num_send_msg;
410*5113495bSYour Name 	uint64_t num_free_msg;
411*5113495bSYour Name 	uint64_t num_rm_grant;
412*5113495bSYour Name 	uint64_t num_rm_release;
413*5113495bSYour Name 	uint64_t num_rm_grant_imm;
414*5113495bSYour Name 	uint64_t num_cons_perf_req;
415*5113495bSYour Name 	uint64_t num_prod_perf_req;
416*5113495bSYour Name 	uint64_t num_rx_drop;
417*5113495bSYour Name 	uint64_t num_tx_desc_q_cnt;
418*5113495bSYour Name 	uint64_t num_tx_desc_error;
419*5113495bSYour Name 	uint64_t num_tx_comp_cnt;
420*5113495bSYour Name 	uint64_t num_tx_queued;
421*5113495bSYour Name 	uint64_t num_tx_dequeued;
422*5113495bSYour Name 	uint64_t num_max_pm_queue;
423*5113495bSYour Name 	uint64_t num_rx_excep;
424*5113495bSYour Name 	uint64_t num_rx_no_iface_eapol;
425*5113495bSYour Name 	uint64_t num_tx_fwd_ok;
426*5113495bSYour Name 	uint64_t num_tx_fwd_err;
427*5113495bSYour Name };
428*5113495bSYour Name 
429*5113495bSYour Name /**
430*5113495bSYour Name  * struct ipa_uc_stas_map - IPA UC assoc station map
431*5113495bSYour Name  * @is_reserved: STA reserved flag
432*5113495bSYour Name  * @is_authenticated: is peer authenticated
433*5113495bSYour Name  * @mac_addr: Station mac address
434*5113495bSYour Name  */
435*5113495bSYour Name struct ipa_uc_stas_map {
436*5113495bSYour Name 	bool is_reserved;
437*5113495bSYour Name 	struct qdf_mac_addr mac_addr;
438*5113495bSYour Name 	uint8_t is_authenticated;
439*5113495bSYour Name };
440*5113495bSYour Name 
441*5113495bSYour Name /**
442*5113495bSYour Name  * struct op_msg_type - IPA operation message type
443*5113495bSYour Name  * @msg_t: Message type
444*5113495bSYour Name  * @rsvd: Reserved
445*5113495bSYour Name  * @op_code: IPA Operation type
446*5113495bSYour Name  * @len: IPA message length
447*5113495bSYour Name  * @rsvd_snd: Reserved
448*5113495bSYour Name  */
449*5113495bSYour Name struct op_msg_type {
450*5113495bSYour Name 	uint8_t msg_t;
451*5113495bSYour Name 	uint8_t rsvd;
452*5113495bSYour Name 	uint16_t op_code;
453*5113495bSYour Name 	uint16_t len;
454*5113495bSYour Name 	uint16_t rsvd_snd;
455*5113495bSYour Name };
456*5113495bSYour Name 
457*5113495bSYour Name /**
458*5113495bSYour Name  * struct ipa_uc_fw_stats - IPA FW stats
459*5113495bSYour Name  * @tx_comp_ring_base: TX completion ring base address
460*5113495bSYour Name  * @tx_comp_ring_size: TX completion ring size
461*5113495bSYour Name  * @tx_comp_ring_dbell_addr: TX completion ring door bell address
462*5113495bSYour Name  * @tx_comp_ring_dbell_ind_val: TX completion ring door bell indication
463*5113495bSYour Name  * @tx_comp_ring_dbell_cached_val: TX completion ring cached value
464*5113495bSYour Name  * @tx_pkts_enqueued: TX packets enqueued
465*5113495bSYour Name  * @tx_pkts_completed: TX packets completed
466*5113495bSYour Name  * @tx_is_suspend: TX suspend flag
467*5113495bSYour Name  * @tx_reserved: Reserved for TX stat
468*5113495bSYour Name  * @rx_ind_ring_base: RX indication ring base address
469*5113495bSYour Name  * @rx_ind_ring_size: RX indication ring size
470*5113495bSYour Name  * @rx_ind_ring_dbell_addr: RX indication ring doorbell address
471*5113495bSYour Name  * @rx_ind_ring_dbell_ind_val: RX indication ring doorbell indication
472*5113495bSYour Name  * @rx_ind_ring_dbell_ind_cached_val: RX indication ring doorbell cached value
473*5113495bSYour Name  * @rx_ind_ring_rdidx_addr: RX indication ring read index address
474*5113495bSYour Name  * @rx_ind_ring_rd_idx_cached_val: RX indication ring read index cached value
475*5113495bSYour Name  * @rx_refill_idx: RX ring refill index
476*5113495bSYour Name  * @rx_num_pkts_indicated: Number of RX packets indicated
477*5113495bSYour Name  * @rx_buf_refilled: Number of RX buffer refilled
478*5113495bSYour Name  * @rx_num_ind_drop_no_space: Number of RX indication drops due to no space
479*5113495bSYour Name  * @rx_num_ind_drop_no_buf: Number of RX indication drops due to no buffer
480*5113495bSYour Name  * @rx_is_suspend: RX suspend flag
481*5113495bSYour Name  * @rx_reserved: Reserved for RX stat
482*5113495bSYour Name  */
483*5113495bSYour Name struct ipa_uc_fw_stats {
484*5113495bSYour Name 	uint32_t tx_comp_ring_base;
485*5113495bSYour Name 	uint32_t tx_comp_ring_size;
486*5113495bSYour Name 	uint32_t tx_comp_ring_dbell_addr;
487*5113495bSYour Name 	uint32_t tx_comp_ring_dbell_ind_val;
488*5113495bSYour Name 	uint32_t tx_comp_ring_dbell_cached_val;
489*5113495bSYour Name 	uint32_t tx_pkts_enqueued;
490*5113495bSYour Name 	uint32_t tx_pkts_completed;
491*5113495bSYour Name 	uint32_t tx_is_suspend;
492*5113495bSYour Name 	uint32_t tx_reserved;
493*5113495bSYour Name 	uint32_t rx_ind_ring_base;
494*5113495bSYour Name 	uint32_t rx_ind_ring_size;
495*5113495bSYour Name 	uint32_t rx_ind_ring_dbell_addr;
496*5113495bSYour Name 	uint32_t rx_ind_ring_dbell_ind_val;
497*5113495bSYour Name 	uint32_t rx_ind_ring_dbell_ind_cached_val;
498*5113495bSYour Name 	uint32_t rx_ind_ring_rdidx_addr;
499*5113495bSYour Name 	uint32_t rx_ind_ring_rd_idx_cached_val;
500*5113495bSYour Name 	uint32_t rx_refill_idx;
501*5113495bSYour Name 	uint32_t rx_num_pkts_indicated;
502*5113495bSYour Name 	uint32_t rx_buf_refilled;
503*5113495bSYour Name 	uint32_t rx_num_ind_drop_no_space;
504*5113495bSYour Name 	uint32_t rx_num_ind_drop_no_buf;
505*5113495bSYour Name 	uint32_t rx_is_suspend;
506*5113495bSYour Name 	uint32_t rx_reserved;
507*5113495bSYour Name };
508*5113495bSYour Name 
509*5113495bSYour Name /**
510*5113495bSYour Name  * struct wlan_ipa_uc_pending_event - WLAN IPA UC pending event
511*5113495bSYour Name  * @node: Pending event list node
512*5113495bSYour Name  * @type: WLAN IPA event type
513*5113495bSYour Name  * @net_dev: network device
514*5113495bSYour Name  * @device_mode: Device mode
515*5113495bSYour Name  * @session_id: Session ID
516*5113495bSYour Name  * @mac_addr: Mac address
517*5113495bSYour Name  * @is_loading: Driver loading flag
518*5113495bSYour Name  * @is_2g_iface: true if interface is operating on 2G band, otherwise false
519*5113495bSYour Name  */
520*5113495bSYour Name struct wlan_ipa_uc_pending_event {
521*5113495bSYour Name 	qdf_list_node_t node;
522*5113495bSYour Name 	qdf_ipa_wlan_event type;
523*5113495bSYour Name 	qdf_netdev_t net_dev;
524*5113495bSYour Name 	uint8_t device_mode;
525*5113495bSYour Name 	uint8_t session_id;
526*5113495bSYour Name 	uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
527*5113495bSYour Name 	bool is_loading;
528*5113495bSYour Name 	bool is_2g_iface;
529*5113495bSYour Name };
530*5113495bSYour Name 
531*5113495bSYour Name /**
532*5113495bSYour Name  * struct uc_rm_work_struct
533*5113495bSYour Name  * @work: uC RM work
534*5113495bSYour Name  * @event: IPA RM event
535*5113495bSYour Name  */
536*5113495bSYour Name struct uc_rm_work_struct {
537*5113495bSYour Name 	qdf_work_t work;
538*5113495bSYour Name 	qdf_ipa_rm_event_t event;
539*5113495bSYour Name };
540*5113495bSYour Name 
541*5113495bSYour Name /**
542*5113495bSYour Name  * struct uc_op_work_struct
543*5113495bSYour Name  * @work: uC OP work
544*5113495bSYour Name  * @msg: OP message
545*5113495bSYour Name  * @osdev: pointer to qdf net device, used by osif_psoc_sync_trans_start_wait
546*5113495bSYour Name  * @ipa_priv_bp: back pointer to ipa_obj
547*5113495bSYour Name  */
548*5113495bSYour Name struct uc_op_work_struct {
549*5113495bSYour Name 	qdf_work_t work;
550*5113495bSYour Name 	struct op_msg_type *msg;
551*5113495bSYour Name 	qdf_device_t osdev;
552*5113495bSYour Name 	struct wlan_ipa_priv *ipa_priv_bp;
553*5113495bSYour Name };
554*5113495bSYour Name 
555*5113495bSYour Name /**
556*5113495bSYour Name  * struct uc_rt_debug_info
557*5113495bSYour Name  * @time: system time
558*5113495bSYour Name  * @ipa_excep_count: IPA exception packet count
559*5113495bSYour Name  * @rx_drop_count: IPA Rx drop packet count
560*5113495bSYour Name  * @net_sent_count: IPA Rx packet sent to network stack count
561*5113495bSYour Name  * @rx_discard_count: IPA Rx discard packet count
562*5113495bSYour Name  * @tx_fwd_ok_count: IPA Tx forward success packet count
563*5113495bSYour Name  * @tx_fwd_count: IPA Tx forward packet count
564*5113495bSYour Name  * @rx_destructor_call: IPA Rx packet destructor count
565*5113495bSYour Name  */
566*5113495bSYour Name struct uc_rt_debug_info {
567*5113495bSYour Name 	uint64_t time;
568*5113495bSYour Name 	uint64_t ipa_excep_count;
569*5113495bSYour Name 	uint64_t rx_drop_count;
570*5113495bSYour Name 	uint64_t net_sent_count;
571*5113495bSYour Name 	uint64_t rx_discard_count;
572*5113495bSYour Name 	uint64_t tx_fwd_ok_count;
573*5113495bSYour Name 	uint64_t tx_fwd_count;
574*5113495bSYour Name 	uint64_t rx_destructor_call;
575*5113495bSYour Name };
576*5113495bSYour Name 
577*5113495bSYour Name #ifdef FEATURE_METERING
578*5113495bSYour Name /**
579*5113495bSYour Name  * struct ipa_uc_sharing_stats - IPA UC sharing stats
580*5113495bSYour Name  * @ipv4_rx_packets: IPv4 RX packets
581*5113495bSYour Name  * @ipv4_rx_bytes: IPv4 RX bytes
582*5113495bSYour Name  * @ipv6_rx_packets: IPv6 RX packets
583*5113495bSYour Name  * @ipv6_rx_bytes: IPv6 RX bytes
584*5113495bSYour Name  * @ipv4_tx_packets: IPv4 TX packets
585*5113495bSYour Name  * @ipv4_tx_bytes: IPv4 TX bytes
586*5113495bSYour Name  * @ipv6_tx_packets: IPv4 TX packets
587*5113495bSYour Name  * @ipv6_tx_bytes: IPv6 TX bytes
588*5113495bSYour Name  */
589*5113495bSYour Name struct ipa_uc_sharing_stats {
590*5113495bSYour Name 	uint64_t ipv4_rx_packets;
591*5113495bSYour Name 	uint64_t ipv4_rx_bytes;
592*5113495bSYour Name 	uint64_t ipv6_rx_packets;
593*5113495bSYour Name 	uint64_t ipv6_rx_bytes;
594*5113495bSYour Name 	uint64_t ipv4_tx_packets;
595*5113495bSYour Name 	uint64_t ipv4_tx_bytes;
596*5113495bSYour Name 	uint64_t ipv6_tx_packets;
597*5113495bSYour Name 	uint64_t ipv6_tx_bytes;
598*5113495bSYour Name };
599*5113495bSYour Name 
600*5113495bSYour Name /**
601*5113495bSYour Name  * struct ipa_uc_quota_rsp - IPA UC quota response
602*5113495bSYour Name  * @success: Success or fail flag
603*5113495bSYour Name  * @reserved: Reserved
604*5113495bSYour Name  * @quota_lo: Quota limit low bytes
605*5113495bSYour Name  * @quota_hi: Quota limit high bytes
606*5113495bSYour Name  */
607*5113495bSYour Name struct ipa_uc_quota_rsp {
608*5113495bSYour Name 	uint8_t success;
609*5113495bSYour Name 	uint8_t reserved[3];
610*5113495bSYour Name 	uint32_t quota_lo;
611*5113495bSYour Name 	uint32_t quota_hi;
612*5113495bSYour Name };
613*5113495bSYour Name 
614*5113495bSYour Name /**
615*5113495bSYour Name  * struct ipa_uc_quota_ind
616*5113495bSYour Name  * @quota_bytes: Quota bytes to set
617*5113495bSYour Name  */
618*5113495bSYour Name struct ipa_uc_quota_ind {
619*5113495bSYour Name 	uint64_t quota_bytes;
620*5113495bSYour Name };
621*5113495bSYour Name #endif
622*5113495bSYour Name 
623*5113495bSYour Name /**
624*5113495bSYour Name  * struct wlan_ipa_tx_desc
625*5113495bSYour Name  * @node: TX descriptor node
626*5113495bSYour Name  * @priv: pointer to priv list entry
627*5113495bSYour Name  * @id: Tx desc idex
628*5113495bSYour Name  * @ipa_tx_desc_ptr: pointer to IPA Tx descriptor
629*5113495bSYour Name  */
630*5113495bSYour Name struct wlan_ipa_tx_desc {
631*5113495bSYour Name 	qdf_list_node_t node;
632*5113495bSYour Name 	void *priv;
633*5113495bSYour Name 	uint32_t id;
634*5113495bSYour Name 	qdf_ipa_rx_data_t *ipa_tx_desc_ptr;
635*5113495bSYour Name };
636*5113495bSYour Name 
637*5113495bSYour Name typedef QDF_STATUS (*wlan_ipa_softap_xmit)(qdf_nbuf_t nbuf, qdf_netdev_t dev);
638*5113495bSYour Name typedef void (*wlan_ipa_send_to_nw)(qdf_nbuf_t nbuf, qdf_netdev_t dev);
639*5113495bSYour Name typedef bool (*wlan_ipa_driver_unloading)(void);
640*5113495bSYour Name 
641*5113495bSYour Name /**
642*5113495bSYour Name  * typedef wlan_ipa_rps_enable - Enable/disable RPS for adapter using vdev id
643*5113495bSYour Name  * @vdev_id: vdev_id of adapter
644*5113495bSYour Name  * @enable: Set true to enable RPS
645*5113495bSYour Name  */
646*5113495bSYour Name typedef void (*wlan_ipa_rps_enable)(uint8_t vdev_id, bool enable);
647*5113495bSYour Name 
648*5113495bSYour Name /* IPA private context structure definition */
649*5113495bSYour Name struct wlan_ipa_priv {
650*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
651*5113495bSYour Name 	struct wlan_ipa_sys_pipe sys_pipe[WLAN_IPA_MAX_SYSBAM_PIPE];
652*5113495bSYour Name 	struct wlan_ipa_iface_context iface_context[WLAN_IPA_MAX_IFACE];
653*5113495bSYour Name 	uint8_t num_iface;
654*5113495bSYour Name 	void *dp_soc;
655*5113495bSYour Name 	uint8_t dp_pdev_id;
656*5113495bSYour Name 	struct wlan_ipa_config *config;
657*5113495bSYour Name 	enum wlan_ipa_rm_state rm_state;
658*5113495bSYour Name 	/*
659*5113495bSYour Name 	 * IPA driver can send RM notifications with IRQ disabled so using qdf
660*5113495bSYour Name 	 * APIs as it is taken care gracefully. Without this, kernel would throw
661*5113495bSYour Name 	 * an warning if spin_lock_bh is used while IRQ is disabled
662*5113495bSYour Name 	 */
663*5113495bSYour Name 	qdf_spinlock_t rm_lock;
664*5113495bSYour Name 	struct uc_rm_work_struct uc_rm_work;
665*5113495bSYour Name 	struct uc_op_work_struct uc_op_work[WLAN_IPA_UC_OPCODE_MAX];
666*5113495bSYour Name 	qdf_wake_lock_t wake_lock;
667*5113495bSYour Name 	struct qdf_delayed_work wake_lock_work;
668*5113495bSYour Name 	bool wake_lock_released;
669*5113495bSYour Name 
670*5113495bSYour Name 	qdf_atomic_t tx_ref_cnt;
671*5113495bSYour Name 	qdf_nbuf_queue_t pm_queue_head;
672*5113495bSYour Name 	qdf_work_t pm_work;
673*5113495bSYour Name 	qdf_spinlock_t pm_lock;
674*5113495bSYour Name 	bool suspended;
675*5113495bSYour Name 	qdf_spinlock_t q_lock;
676*5113495bSYour Name 	qdf_spinlock_t enable_disable_lock;
677*5113495bSYour Name 	/* Flag to indicate wait on pending TX completions */
678*5113495bSYour Name 	qdf_atomic_t waiting_on_pending_tx;
679*5113495bSYour Name 	/* Timer ticks to keep track of time after which pipes are disabled */
680*5113495bSYour Name 	uint64_t pending_tx_start_ticks;
681*5113495bSYour Name 	/* Indicates if cdp_ipa_disable_autonomy is called for IPA pipes */
682*5113495bSYour Name 	qdf_atomic_t autonomy_disabled;
683*5113495bSYour Name 	/* Indicates if cdp_disable_ipa_pipes has been called for IPA pipes */
684*5113495bSYour Name 	qdf_atomic_t pipes_disabled;
685*5113495bSYour Name 	/*
686*5113495bSYour Name 	 * IPA pipes are considered "down" when both autonomy_disabled and
687*5113495bSYour Name 	 * ipa_pipes_disabled are set
688*5113495bSYour Name 	 */
689*5113495bSYour Name 	bool ipa_pipes_down;
690*5113495bSYour Name 	/* Flag for mutual exclusion during IPA disable pipes */
691*5113495bSYour Name 	bool pipes_down_in_progress;
692*5113495bSYour Name 	/* Flag for mutual exclusion during IPA enable pipes */
693*5113495bSYour Name 	bool pipes_enable_in_progress;
694*5113495bSYour Name 	qdf_list_node_t pend_desc_head;
695*5113495bSYour Name 	struct wlan_ipa_tx_desc *tx_desc_pool;
696*5113495bSYour Name 	qdf_list_t tx_desc_free_list;
697*5113495bSYour Name 
698*5113495bSYour Name 	struct wlan_ipa_stats stats;
699*5113495bSYour Name 
700*5113495bSYour Name 	uint32_t curr_prod_bw;
701*5113495bSYour Name 	uint32_t curr_cons_bw;
702*5113495bSYour Name 
703*5113495bSYour Name 	uint8_t activated_fw_pipe;
704*5113495bSYour Name 	uint8_t num_sap_connected;
705*5113495bSYour Name 	uint8_t sap_num_connected_sta;
706*5113495bSYour Name 	uint8_t sta_connected;
707*5113495bSYour Name 	uint32_t tx_pipe_handle;
708*5113495bSYour Name 	uint32_t rx_pipe_handle;
709*5113495bSYour Name 	bool resource_loading;
710*5113495bSYour Name 	bool resource_unloading;
711*5113495bSYour Name 	bool pending_cons_req;
712*5113495bSYour Name 	struct ipa_uc_stas_map assoc_stas_map[WLAN_IPA_MAX_STA_COUNT];
713*5113495bSYour Name 	qdf_list_t pending_event;
714*5113495bSYour Name 	qdf_mutex_t event_lock;
715*5113495bSYour Name 	uint32_t ipa_tx_packets_diff;
716*5113495bSYour Name 	uint32_t ipa_rx_packets_diff;
717*5113495bSYour Name 	uint32_t ipa_p_tx_packets;
718*5113495bSYour Name 	uint32_t ipa_p_rx_packets;
719*5113495bSYour Name 	uint32_t stat_req_reason;
720*5113495bSYour Name 	uint64_t ipa_tx_forward;
721*5113495bSYour Name 	uint64_t ipa_rx_discard;
722*5113495bSYour Name 	uint64_t ipa_rx_net_send_count;
723*5113495bSYour Name 	uint64_t ipa_rx_internal_drop_count;
724*5113495bSYour Name 	uint64_t ipa_rx_destructor_count;
725*5113495bSYour Name 	qdf_mc_timer_t rt_debug_timer;
726*5113495bSYour Name 	struct uc_rt_debug_info rt_bug_buffer[WLAN_IPA_UC_RT_DEBUG_BUF_COUNT];
727*5113495bSYour Name 	unsigned int rt_buf_fill_index;
728*5113495bSYour Name 	qdf_ipa_wdi_in_params_t cons_pipe_in;
729*5113495bSYour Name 	qdf_ipa_wdi_in_params_t prod_pipe_in;
730*5113495bSYour Name 	bool uc_loaded;
731*5113495bSYour Name 	bool wdi_enabled;
732*5113495bSYour Name 	bool over_gsi;
733*5113495bSYour Name 	qdf_mc_timer_t rt_debug_fill_timer;
734*5113495bSYour Name 	qdf_mutex_t rt_debug_lock;
735*5113495bSYour Name 	qdf_mutex_t ipa_lock;
736*5113495bSYour Name 
737*5113495bSYour Name 	uint8_t vdev_to_iface[WLAN_IPA_MAX_SESSION];
738*5113495bSYour Name 	bool vdev_offload_enabled[WLAN_IPA_MAX_SESSION];
739*5113495bSYour Name 	bool mcc_mode;
740*5113495bSYour Name 	qdf_work_t mcc_work;
741*5113495bSYour Name 	bool disable_intrabss_fwd[WLAN_IPA_MAX_SESSION];
742*5113495bSYour Name 	bool dfs_cac_block_tx;
743*5113495bSYour Name #ifdef FEATURE_METERING
744*5113495bSYour Name 	struct ipa_uc_sharing_stats ipa_sharing_stats;
745*5113495bSYour Name 	struct ipa_uc_quota_rsp ipa_quota_rsp;
746*5113495bSYour Name 	struct ipa_uc_quota_ind ipa_quota_ind;
747*5113495bSYour Name 	qdf_event_t ipa_uc_sharing_stats_comp;
748*5113495bSYour Name 	qdf_event_t ipa_uc_set_quota_comp;
749*5113495bSYour Name #endif
750*5113495bSYour Name 
751*5113495bSYour Name 	wlan_ipa_softap_xmit softap_xmit;
752*5113495bSYour Name 	wlan_ipa_send_to_nw send_to_nw;
753*5113495bSYour Name 
754*5113495bSYour Name #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM)
755*5113495bSYour Name 	/*Callback to enable RPS for STA in STA+SAP scenario*/
756*5113495bSYour Name 	wlan_ipa_rps_enable rps_enable;
757*5113495bSYour Name #endif
758*5113495bSYour Name 	wlan_ipa_driver_unloading driver_is_unloading;
759*5113495bSYour Name 	qdf_event_t ipa_resource_comp;
760*5113495bSYour Name 
761*5113495bSYour Name 	uint32_t wdi_version;
762*5113495bSYour Name 	bool is_smmu_enabled;	/* IPA caps returned from ipa_wdi_init */
763*5113495bSYour Name 	/* Flag to notify whether optional wifi dp feature is enabled or not */
764*5113495bSYour Name 	bool opt_wifi_datapath;
765*5113495bSYour Name 	qdf_atomic_t stats_quota;
766*5113495bSYour Name 	uint8_t curr_bw_level;
767*5113495bSYour Name 	qdf_atomic_t deinit_in_prog;
768*5113495bSYour Name 	uint8_t instance_id;
769*5113495bSYour Name 	bool handle_initialized;
770*5113495bSYour Name 	qdf_ipa_wdi_hdl_t hdl;
771*5113495bSYour Name #ifdef IPA_OPT_WIFI_DP
772*5113495bSYour Name 	struct wifi_dp_flt_setup dp_cce_super_rule_flt_param;
773*5113495bSYour Name 	qdf_event_t ipa_flt_evnt;
774*5113495bSYour Name 	qdf_wake_lock_t opt_dp_wake_lock;
775*5113495bSYour Name #endif
776*5113495bSYour Name };
777*5113495bSYour Name 
778*5113495bSYour Name #define WLAN_IPA_WLAN_FRAG_HEADER        sizeof(struct frag_header)
779*5113495bSYour Name #define WLAN_IPA_WLAN_IPA_HEADER         sizeof(struct ipa_header)
780*5113495bSYour Name #define WLAN_IPA_WLAN_CLD_HDR_LEN        sizeof(struct wlan_ipa_cld_hdr)
781*5113495bSYour Name #define WLAN_IPA_UC_WLAN_CLD_HDR_LEN     0
782*5113495bSYour Name #define WLAN_IPA_WLAN_TX_HDR_LEN         sizeof(struct wlan_ipa_tx_hdr)
783*5113495bSYour Name #define WLAN_IPA_UC_WLAN_TX_HDR_LEN      sizeof(struct wlan_ipa_uc_tx_hdr)
784*5113495bSYour Name #define WLAN_IPA_WLAN_RX_HDR_LEN         sizeof(struct wlan_ipa_rx_hdr)
785*5113495bSYour Name #define WLAN_IPA_UC_WLAN_HDR_DES_MAC_OFFSET \
786*5113495bSYour Name 	(WLAN_IPA_WLAN_FRAG_HEADER + WLAN_IPA_WLAN_IPA_HEADER)
787*5113495bSYour Name 
788*5113495bSYour Name #define WLAN_IPA_GET_IFACE_ID(_data) \
789*5113495bSYour Name 	(((struct wlan_ipa_cld_hdr *) (_data))->iface_id)
790*5113495bSYour Name 
791*5113495bSYour Name #define WLAN_IPA_LOG(LVL, fmt, args ...) \
792*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_IPA, LVL, \
793*5113495bSYour Name 		  "%s:%d: "fmt, __func__, __LINE__, ## args)
794*5113495bSYour Name 
795*5113495bSYour Name #define WLAN_IPA_IS_CONFIG_ENABLED(_ipa_cfg, _mask) \
796*5113495bSYour Name 	(((_ipa_cfg)->ipa_config & (_mask)) == (_mask))
797*5113495bSYour Name 
798*5113495bSYour Name #define BW_GET_DIFF(_x, _y) (unsigned long)((ULONG_MAX - (_y)) + (_x) + 1)
799*5113495bSYour Name 
800*5113495bSYour Name #define IPA_RESOURCE_COMP_WAIT_TIME	500
801*5113495bSYour Name 
802*5113495bSYour Name #ifdef FEATURE_METERING
803*5113495bSYour Name #define IPA_UC_SHARING_STATES_WAIT_TIME	500
804*5113495bSYour Name #define IPA_UC_SET_QUOTA_WAIT_TIME	500
805*5113495bSYour Name #endif
806*5113495bSYour Name 
807*5113495bSYour Name /**
808*5113495bSYour Name  * wlan_ipa_wlan_event_to_str() - convert IPA WLAN event to string
809*5113495bSYour Name  * @event: IPA WLAN event to be converted to a string
810*5113495bSYour Name  *
811*5113495bSYour Name  * Return: ASCII string representing the IPA WLAN event
812*5113495bSYour Name  */
wlan_ipa_wlan_event_to_str(qdf_ipa_wlan_event event)813*5113495bSYour Name static inline char *wlan_ipa_wlan_event_to_str(qdf_ipa_wlan_event event)
814*5113495bSYour Name {
815*5113495bSYour Name 	switch (event) {
816*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_CLIENT_CONNECT);
817*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_CLIENT_DISCONNECT);
818*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_AP_CONNECT);
819*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_AP_DISCONNECT);
820*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_STA_CONNECT);
821*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_STA_DISCONNECT);
822*5113495bSYour Name 	CASE_RETURN_STRING(QDF_IPA_CLIENT_CONNECT_EX);
823*5113495bSYour Name 	CASE_RETURN_STRING(QDF_SWITCH_TO_SCC);
824*5113495bSYour Name 	CASE_RETURN_STRING(QDF_SWITCH_TO_MCC);
825*5113495bSYour Name 	CASE_RETURN_STRING(QDF_WDI_ENABLE);
826*5113495bSYour Name 	CASE_RETURN_STRING(QDF_WDI_DISABLE);
827*5113495bSYour Name 	default:
828*5113495bSYour Name 		return "UNKNOWN";
829*5113495bSYour Name 	}
830*5113495bSYour Name }
831*5113495bSYour Name 
832*5113495bSYour Name /**
833*5113495bSYour Name  * wlan_ipa_get_iface() - Get IPA interface
834*5113495bSYour Name  * @ipa_ctx: IPA context
835*5113495bSYour Name  * @mode: Interface device mode
836*5113495bSYour Name  *
837*5113495bSYour Name  * Return: IPA interface address
838*5113495bSYour Name  */
839*5113495bSYour Name struct wlan_ipa_iface_context
840*5113495bSYour Name *wlan_ipa_get_iface(struct wlan_ipa_priv *ipa_ctx, uint8_t mode);
841*5113495bSYour Name 
842*5113495bSYour Name #endif /* IPA_OFFLOAD */
843*5113495bSYour Name #endif /* _WLAN_IPA_PRIV_STRUCT_H_ */
844