xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_ipa_wdi3.h (revision 503663c6daafffe652fa360bde17243568cd6d2a)
1 /*
2  * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  * DOC: i_qdf_ipa_wdi3.h
19  * This file provides OS dependent IPA WDI APIs.
20  */
21 
22 #ifndef I_QDF_IPA_WDI_H
23 #define I_QDF_IPA_WDI_H
24 
25 #ifdef IPA_OFFLOAD
26 
27 #include <qdf_status.h>         /* QDF_STATUS */
28 #include <linux/ipa_wdi3.h>
29 
30 #ifdef CONFIG_IPA_WDI_UNIFIED_API
31 
32 /**
33  * __qdf_ipa_wdi_version_t - IPA WDI version
34  */
35 typedef enum ipa_wdi_version __qdf_ipa_wdi_version_t;
36 
37 /**
38  * __qdf_ipa_wdi_init_in_params_t - wdi init input parameters
39  */
40 typedef struct ipa_wdi_init_in_params __qdf_ipa_wdi_init_in_params_t;
41 
42 #define __QDF_IPA_WDI_INIT_IN_PARAMS_WDI_VERSION(in_params)	\
43 	(((struct ipa_wdi_init_in_params *)(in_params))->wdi_version)
44 #define __QDF_IPA_WDI_INIT_IN_PARAMS_NOTIFY(in_params)	\
45 	(((struct ipa_wdi_init_in_params *)(in_params))->notify)
46 #define __QDF_IPA_WDI_INIT_IN_PARAMS_PRIV(in_params)	\
47 	(((struct ipa_wdi_init_in_params *)(in_params))->priv)
48 #define __QDF_IPA_WDI_INIT_IN_PARAMS_WDI_NOTIFY(in_params)	\
49 	(((struct ipa_wdi_init_in_params *)(in_params))->wdi_notify)
50 
51 /**
52  * __qdf_ipa_wdi_init_out_params_t - wdi init output parameters
53  */
54 typedef struct ipa_wdi_init_out_params __qdf_ipa_wdi_init_out_params_t;
55 
56 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_UC_READY(out_params)	\
57 	(((struct ipa_wdi_init_out_params *)(out_params))->is_uC_ready)
58 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_SMMU_ENABLED(out_params)	\
59 	(((struct ipa_wdi_init_out_params *)(out_params))->is_smmu_enabled)
60 #ifdef IPA_WDI3_GSI
61 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params)	\
62 	(((struct ipa_wdi_init_out_params *)(out_params))->is_over_gsi)
63 #else
64 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params)	\
65 	false
66 #endif
67 
68 /**
69  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
70  */
71 typedef struct ipa_wdi_hdr_info  __qdf_ipa_wdi_hdr_info_t;
72 
73 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
74 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr)
75 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
76 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_len)
77 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
78 	(((struct ipa_wdi_hdr_info *)(hdr_info))->dst_mac_addr_offset)
79 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
80 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_type)
81 
82 /**
83  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
84  *	interface registration
85  */
86 typedef struct ipa_wdi_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
87 
88 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
89 	(((struct ipa_wdi_reg_intf_in_params *)(in))->netdev_name)
90 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
91 	(((struct ipa_wdi_reg_intf_in_params *)(in))->hdr_info)
92 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_ALT_DST_PIPE(in)	\
93 	(((struct ipa_wdi_reg_intf_in_params *)(in))->alt_dst_pipe)
94 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
95 	(((struct ipa_wdi_reg_intf_in_params *)(in))->is_meta_data_valid)
96 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
97 	(((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data)
98 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
99 	(((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data_mask)
100 
101 typedef struct ipa_ep_cfg __qdf_ipa_ep_cfg_t;
102 
103 #define __QDF_IPA_EP_CFG_NAT_EN(cfg)	\
104 	(((struct ipa_ep_cfg *)(cfg))->nat.nat_en)
105 #define __QDF_IPA_EP_CFG_HDR_LEN(cfg)	\
106 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_len)
107 #define __QDF_IPA_EP_CFG_HDR_OFST_METADATA_VALID(cfg)	\
108 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_metadata_valid)
109 #define __QDF_IPA_EP_CFG_HDR_METADATA_REG_VALID(cfg)	\
110 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_metadata_reg_valid)
111 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE_VALID(cfg)	\
112 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size_valid)
113 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE(cfg)	\
114 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size)
115 #define __QDF_IPA_EP_CFG_HDR_ADDITIONAL_CONST_LEN(cfg)	\
116 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_additional_const_len)
117 #define __QDF_IPA_EP_CFG_MODE(cfg)	\
118 	(((struct ipa_ep_cfg *)(cfg))->mode.mode)
119 #define __QDF_IPA_EP_CFG_HDR_LITTLE_ENDIAN(cfg)	\
120 	(((struct ipa_ep_cfg *)(cfg))->hdr_ext.hdr_little_endian)
121 
122 /**
123  * __qdf_ipa_wdi_pipe_setup_info_t - WDI TX/Rx configuration
124  */
125 typedef struct ipa_wdi_pipe_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
126 
127 #define __QDF_IPA_WDI_SETUP_INFO_EP_CFG(txrx)	\
128 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->ipa_ep_cfg)
129 
130 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
131 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->client)
132 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
133 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_base_pa)
134 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
135 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_size)
136 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
137 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_doorbell_pa)
138 #define __QDF_IPA_WDI_SETUP_INFO_IS_TXR_RN_DB_PCIE_ADDR(txrx)  \
139 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->is_txr_rn_db_pcie_addr)
140 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
141 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_base_pa)
142 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
143 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_size)
144 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
145 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_doorbell_pa)
146 #define __QDF_IPA_WDI_SETUP_INFO_IS_EVT_RN_DB_PCIE_ADDR(txrx) \
147 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->is_evt_rn_db_pcie_addr)
148 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
149 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->num_pkt_buffers)
150 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
151 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->pkt_offset)
152 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
153 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->desc_format_template)
154 
155 /**
156  * __qdf_ipa_wdi_pipe_setup_info_smmu_t - WDI TX/Rx configuration
157  */
158 typedef struct ipa_wdi_pipe_setup_info_smmu __qdf_ipa_wdi_pipe_setup_info_smmu_t;
159 
160 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(txrx)	\
161 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->ipa_ep_cfg)
162 
163 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(txrx)	\
164 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->client)
165 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_BASE(txrx)	\
166 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_base)
167 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_SIZE(txrx)	\
168 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_size)
169 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_DOORBELL_PA(txrx)	\
170 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_doorbell_pa)
171 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_IS_TXR_RN_DB_PCIE_ADDR(txrx)  \
172 	(((struct ipa_wdi_pipe_setup_info_smmu *) \
173 	  (txrx))->is_txr_rn_db_pcie_addr)
174 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_BASE(txrx)	\
175 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_base)
176 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_SIZE(txrx)	\
177 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_size)
178 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_DOORBELL_PA(txrx)	\
179 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_doorbell_pa)
180 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_IS_EVT_RN_DB_PCIE_ADDR(txrx) \
181 	(((struct ipa_wdi_pipe_setup_info_smmu *) \
182 	  (txrx))->is_evt_rn_db_pcie_addr)
183 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_NUM_PKT_BUFFERS(txrx)	\
184 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->num_pkt_buffers)
185 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_PKT_OFFSET(txrx)	\
186 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->pkt_offset)
187 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE(txrx)	\
188 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->desc_format_template)
189 
190 /**
191  * __qdf_ipa_wdi_conn_in_params_t - information provided by
192  *		uC offload client
193  */
194 typedef struct ipa_wdi_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
195 
196 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
197 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->notify)
198 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
199 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->priv)
200 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(pipe_in)	\
201 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->is_smmu_enabled)
202 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NUM_SYS_PIPE_NEEDED(pipe_in)	\
203 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->num_sys_pipe_needed)
204 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SYS_IN(in)	\
205 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->sys_in)
206 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
207 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx)
208 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX_SMMU(pipe_in)	\
209 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx_smmu)
210 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
211 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx)
212 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX_SMMU(pipe_in)	\
213 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx_smmu)
214 
215 /**
216  * __qdf_ipa_wdi_conn_out_params_t - information provided
217  *				to WLAN druver
218  */
219 typedef struct ipa_wdi_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
220 
221 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
222 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->tx_uc_db_pa)
223 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
224 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->rx_uc_db_pa)
225 
226 /**
227  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
228  */
229 typedef struct ipa_wdi_perf_profile  __qdf_ipa_wdi_perf_profile_t;
230 
231 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
232 	(((struct ipa_wdi_perf_profile *)(profile))->client)
233 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
234 	(((struct ipa_wdi_perf_profile *)(profile))->max_supported_bw_mbps)
235 
236 /**
237  * __qdf_ipa_wdi_init - Client should call this function to
238  * init WDI IPA offload data path
239  *
240  * Note: Should not be called from atomic context and only
241  * after checking IPA readiness using ipa_register_ipa_ready_cb()
242  *
243  * @Return 0 on success, negative on failure
244  */
245 static inline int __qdf_ipa_wdi_init(struct ipa_wdi_init_in_params *in,
246 		 struct ipa_wdi_init_out_params *out)
247 {
248 	return ipa_wdi_init(in, out);
249 }
250 
251 /**
252  * __qdf_ipa_wdi_cleanup - Client should call this function to
253  * clean up WDI IPA offload data path
254  *
255  * @Return 0 on success, negative on failure
256  */
257 static inline int __qdf_ipa_wdi_cleanup(void)
258 {
259 	return ipa_wdi_cleanup();
260 }
261 
262 /**
263  * __qdf_ipa_wdi_reg_intf - Client should call this function to
264  * init WDI IPA offload data path
265  *
266  * Note: Should not be called from atomic context and only
267  * after checking IPA readiness using ipa_register_ipa_ready_cb()
268  *
269  * @Return 0 on success, negative on failure
270  */
271 static inline int __qdf_ipa_wdi_reg_intf(
272 	struct ipa_wdi_reg_intf_in_params *in)
273 {
274 	return ipa_wdi_reg_intf(in);
275 }
276 
277 /**
278  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
279  * function to deregister before unload and after disconnect
280  *
281  * @Return 0 on success, negative on failure
282  */
283 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
284 {
285 	return ipa_wdi_dereg_intf(netdev_name);
286 }
287 
288 /**
289  * __qdf_ipa_wdi_conn_pipes - Client should call this
290  * function to connect pipes
291  *
292  * @in:	[in] input parameters from client
293  * @out: [out] output params to client
294  *
295  * Note: Should not be called from atomic context and only
296  * after checking IPA readiness using ipa_register_ipa_ready_cb()
297  *
298  * @Return 0 on success, negative on failure
299  */
300 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in,
301 			struct ipa_wdi_conn_out_params *out)
302 {
303 	return ipa_wdi_conn_pipes(in, out);
304 }
305 
306 /**
307  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
308  *		function to disconnect pipes
309  *
310  * Note: Should not be called from atomic context
311  *
312  * Returns: 0 on success, negative on failure
313  */
314 static inline int __qdf_ipa_wdi_disconn_pipes(void)
315 {
316 	return ipa_wdi_disconn_pipes();
317 }
318 
319 /**
320  * __qdf_ipa_wdi_enable_pipes() - Client should call this
321  *		function to enable IPA offload data path
322  *
323  * Note: Should not be called from atomic context
324  *
325  * Returns: 0 on success, negative on failure
326  */
327 static inline int __qdf_ipa_wdi_enable_pipes(void)
328 {
329 	return ipa_wdi_enable_pipes();
330 }
331 
332 /**
333  * __qdf_ipa_wdi_disable_pipes() - Client should call this
334  *		function to disable IPA offload data path
335  *
336  * Note: Should not be called from atomic context
337  *
338  * Returns: 0 on success, negative on failure
339  */
340 static inline int __qdf_ipa_wdi_disable_pipes(void)
341 {
342 	return ipa_wdi_disable_pipes();
343 }
344 
345 /**
346  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
347  *		set IPA clock bandwidth based on data rates
348  *
349  * @profile: [in] BandWidth profile to use
350  *
351  * Returns: 0 on success, negative on failure
352  */
353 static inline int __qdf_ipa_wdi_set_perf_profile(
354 			struct ipa_wdi_perf_profile *profile)
355 {
356 	return ipa_wdi_set_perf_profile(profile);
357 }
358 
359 /**
360  * __qdf_ipa_wdi_create_smmu_mapping() - Client should call this function to
361  *		create smmu mapping
362  *
363  * @num_buffers: [in] number of buffers
364  * @info: [in] wdi buffer info
365  *
366  * Returns: 0 on success, negative on failure
367  */
368 static inline int __qdf_ipa_wdi_create_smmu_mapping(u32 num_buffers,
369 		struct ipa_wdi_buffer_info *info)
370 {
371 	return ipa_wdi_create_smmu_mapping(num_buffers, info);
372 }
373 
374 /**
375  * __qdf_ipa_wdi_release_smmu_mapping() - Client should call this function to
376  *		release smmu mapping
377  *
378  * @num_buffers: [in] number of buffers
379  * @info: [in] wdi buffer info
380  *
381  * Returns: 0 on success, negative on failure
382  */
383 static inline int __qdf_ipa_wdi_release_smmu_mapping(u32 num_buffers,
384 		struct ipa_wdi_buffer_info *info)
385 {
386 	return ipa_wdi_release_smmu_mapping(num_buffers, info);
387 }
388 
389 #ifdef WDI3_STATS_UPDATE
390 /**
391  * __qdf_ipa_wdi_wlan_stats() - Client should call this function to
392  *		send Tx byte counts to IPA driver
393  * @tx_stats: number of Tx bytes on STA and SAP
394  *
395  * Returns: 0 on success, negative on failure
396  */
397 static inline int __qdf_ipa_wdi_wlan_stats(struct ipa_wdi_tx_info *tx_stats)
398 {
399 	return ipa_wdi_sw_stats(tx_stats);
400 }
401 
402 /**
403  * ipa_uc_bw_monitor() - start/stop uc bw monitoring
404  * @bw_info: set bw info levels to monitor
405  *
406  * Returns: 0 on success, negative on failure
407  */
408 static inline int __qdf_ipa_uc_bw_monitor(struct ipa_wdi_bw_info *bw_info)
409 {
410 	return ipa_uc_bw_monitor(bw_info);
411 }
412 #endif
413 #else /* CONFIG_IPA_WDI_UNIFIED_API */
414 
415 /**
416  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
417  */
418 typedef struct ipa_wdi3_hdr_info  __qdf_ipa_wdi_hdr_info_t;
419 
420 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
421 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr)
422 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
423 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len)
424 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
425 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset)
426 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
427 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type)
428 
429 /**
430  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
431  *	interface registration
432  */
433 typedef struct ipa_wdi3_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
434 
435 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
436 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name)
437 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
438 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info)
439 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
440 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid)
441 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
442 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data)
443 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
444 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask)
445 
446 /**
447  * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration
448  */
449 typedef struct ipa_wdi3_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
450 
451 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx)	\
452 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en)
453 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx)	\
454 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len)
455 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx)	\
456 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid)
457 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx)	\
458 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid)
459 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx)	\
460 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid)
461 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx)	\
462 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size)
463 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx)	\
464 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len)
465 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx)	\
466 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode)
467 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx)	\
468 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian)
469 
470 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
471 	(((struct ipa_wdi3_setup_info *)(txrx))->client)
472 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
473 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa)
474 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
475 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size)
476 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
477 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa)
478 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
479 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa)
480 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
481 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size)
482 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
483 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa)
484 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
485 	(((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers)
486 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
487 	(((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset)
488 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
489 	(((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template)
490 
491 /**
492  * __qdf_ipa_wdi_conn_in_params_t - information provided by
493  *		uC offload client
494  */
495 typedef struct ipa_wdi3_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
496 
497 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
498 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify)
499 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
500 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv)
501 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
502 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx)
503 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
504 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx)
505 
506 /**
507  * __qdf_ipa_wdi_conn_out_params_t - information provided
508  *				to WLAN druver
509  */
510 typedef struct ipa_wdi3_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
511 
512 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
513 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa)
514 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out)	\
515 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va)
516 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
517 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa)
518 
519 /**
520  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
521  */
522 typedef struct ipa_wdi3_perf_profile  __qdf_ipa_wdi_perf_profile_t;
523 
524 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
525 	(((struct ipa_wdi3_perf_profile *)(profile))->client)
526 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
527 	(((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps)
528 
529 /**
530  * __qdf_ipa_wdi_reg_intf - Client should call this function to
531  * init WDI3 IPA offload data path
532  *
533  * Note: Should not be called from atomic context and only
534  * after checking IPA readiness using ipa_register_ipa_ready_cb()
535  *
536  * @Return 0 on success, negative on failure
537  */
538 static inline int __qdf_ipa_wdi_reg_intf(
539 	struct ipa_wdi3_reg_intf_in_params *in)
540 {
541 	return ipa_wdi3_reg_intf(in);
542 }
543 
544 /**
545  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
546  * function to deregister before unload and after disconnect
547  *
548  * @Return 0 on success, negative on failure
549  */
550 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
551 {
552 	return ipa_wdi3_dereg_intf(netdev_name);
553 }
554 
555 /**
556  * __qdf_ipa_wdi_conn_pipes - Client should call this
557  * function to connect pipes
558  *
559  * @in:	[in] input parameters from client
560  * @out: [out] output params to client
561  *
562  * Note: Should not be called from atomic context and only
563  * after checking IPA readiness using ipa_register_ipa_ready_cb()
564  *
565  * @Return 0 on success, negative on failure
566  */
567 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in,
568 					   struct ipa_wdi3_conn_out_params *out)
569 {
570 	return ipa_wdi3_conn_pipes(in, out);
571 }
572 
573 /**
574  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
575  *		function to disconnect pipes
576  *
577  * Note: Should not be called from atomic context
578  *
579  * Returns: 0 on success, negative on failure
580  */
581 static inline int __qdf_ipa_wdi_disconn_pipes(void)
582 {
583 	return ipa_wdi3_disconn_pipes();
584 }
585 
586 /**
587  * __qdf_ipa_wdi_enable_pipes() - Client should call this
588  *		function to enable IPA offload data path
589  *
590  * Note: Should not be called from atomic context
591  *
592  * Returns: 0 on success, negative on failure
593  */
594 static inline int __qdf_ipa_wdi_enable_pipes(void)
595 {
596 	return ipa_wdi3_enable_pipes();
597 }
598 
599 /**
600  * __qdf_ipa_wdi_disable_pipes() - Client should call this
601  *		function to disable IPA offload data path
602  *
603  * Note: Should not be called from atomic context
604  *
605  * Returns: 0 on success, negative on failure
606  */
607 static inline int __qdf_ipa_wdi_disable_pipes(void)
608 {
609 	return ipa_wdi3_disable_pipes();
610 }
611 
612 /**
613  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
614  *		set IPA clock bandwidth based on data rates
615  *
616  * @profile: [in] BandWidth profile to use
617  *
618  * Returns: 0 on success, negative on failure
619  */
620 static inline int __qdf_ipa_wdi_set_perf_profile(
621 			struct ipa_wdi3_perf_profile *profile)
622 {
623 	return ipa_wdi3_set_perf_profile(profile);
624 }
625 
626 #endif /* CONFIG_IPA_WDI_UNIFIED_API */
627 
628 #endif /* IPA_OFFLOAD */
629 #endif /* I_QDF_IPA_WDI_H */
630