xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_ipa_wdi3.h (revision 1397a33f48ea6455be40871470b286e535820eb8)
1 /*
2  * Copyright (c) 2017-2018, 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 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params)	\
61 	(((struct ipa_wdi_init_out_params *)(out_params))->is_over_gsi)
62 
63 /**
64  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
65  */
66 typedef struct ipa_wdi_hdr_info  __qdf_ipa_wdi_hdr_info_t;
67 
68 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
69 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr)
70 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
71 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_len)
72 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
73 	(((struct ipa_wdi_hdr_info *)(hdr_info))->dst_mac_addr_offset)
74 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
75 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_type)
76 
77 /**
78  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
79  *	interface registration
80  */
81 typedef struct ipa_wdi_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
82 
83 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
84 	(((struct ipa_wdi_reg_intf_in_params *)(in))->netdev_name)
85 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
86 	(((struct ipa_wdi_reg_intf_in_params *)(in))->hdr_info)
87 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_ALT_DST_PIPE(in)	\
88 	(((struct ipa_wdi_reg_intf_in_params *)(in))->alt_dst_pipe)
89 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
90 	(((struct ipa_wdi_reg_intf_in_params *)(in))->is_meta_data_valid)
91 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
92 	(((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data)
93 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
94 	(((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data_mask)
95 
96 typedef struct ipa_ep_cfg __qdf_ipa_ep_cfg_t;
97 
98 #define __QDF_IPA_EP_CFG_NAT_EN(cfg)	\
99 	(((struct ipa_ep_cfg *)(cfg))->nat.nat_en)
100 #define __QDF_IPA_EP_CFG_HDR_LEN(cfg)	\
101 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_len)
102 #define __QDF_IPA_EP_CFG_HDR_OFST_METADATA_VALID(cfg)	\
103 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_metadata_valid)
104 #define __QDF_IPA_EP_CFG_HDR_METADATA_REG_VALID(cfg)	\
105 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_metadata_reg_valid)
106 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE_VALID(cfg)	\
107 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size_valid)
108 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE(cfg)	\
109 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size)
110 #define __QDF_IPA_EP_CFG_HDR_ADDITIONAL_CONST_LEN(cfg)	\
111 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_additional_const_len)
112 #define __QDF_IPA_EP_CFG_MODE(cfg)	\
113 	(((struct ipa_ep_cfg *)(cfg))->mode.mode)
114 #define __QDF_IPA_EP_CFG_HDR_LITTLE_ENDIAN(cfg)	\
115 	(((struct ipa_ep_cfg *)(cfg))->hdr_ext.hdr_little_endian)
116 
117 /**
118  * __qdf_ipa_wdi_pipe_setup_info_t - WDI TX/Rx configuration
119  */
120 typedef struct ipa_wdi_pipe_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
121 
122 #define __QDF_IPA_WDI_SETUP_INFO_EP_CFG(txrx)	\
123 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->ipa_ep_cfg)
124 
125 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
126 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->client)
127 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
128 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_base_pa)
129 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
130 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_size)
131 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
132 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_doorbell_pa)
133 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
134 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_base_pa)
135 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
136 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_size)
137 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
138 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_doorbell_pa)
139 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
140 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->num_pkt_buffers)
141 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
142 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->pkt_offset)
143 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
144 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->desc_format_template)
145 
146 /**
147  * __qdf_ipa_wdi_pipe_setup_info_smmu_t - WDI TX/Rx configuration
148  */
149 typedef struct ipa_wdi_pipe_setup_info_smmu __qdf_ipa_wdi_pipe_setup_info_smmu_t;
150 
151 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(txrx)	\
152 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->ipa_ep_cfg)
153 
154 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(txrx)	\
155 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->client)
156 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_BASE(txrx)	\
157 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_base)
158 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_SIZE(txrx)	\
159 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_size)
160 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_DOORBELL_PA(txrx)	\
161 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_doorbell_pa)
162 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_BASE(txrx)	\
163 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_base)
164 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_SIZE(txrx)	\
165 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_size)
166 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_DOORBELL_PA(txrx)	\
167 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_doorbell_pa)
168 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_NUM_PKT_BUFFERS(txrx)	\
169 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->num_pkt_buffers)
170 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_PKT_OFFSET(txrx)	\
171 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->pkt_offset)
172 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE(txrx)	\
173 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->desc_format_template)
174 
175 /**
176  * __qdf_ipa_wdi_conn_in_params_t - information provided by
177  *		uC offload client
178  */
179 typedef struct ipa_wdi_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
180 
181 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
182 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->notify)
183 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
184 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->priv)
185 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(pipe_in)	\
186 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->is_smmu_enabled)
187 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NUM_SYS_PIPE_NEEDED(pipe_in)	\
188 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->num_sys_pipe_needed)
189 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SYS_IN(in)	\
190 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->sys_in)
191 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
192 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx)
193 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX_SMMU(pipe_in)	\
194 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx_smmu)
195 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
196 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx)
197 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX_SMMU(pipe_in)	\
198 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx_smmu)
199 
200 /**
201  * __qdf_ipa_wdi_conn_out_params_t - information provided
202  *				to WLAN druver
203  */
204 typedef struct ipa_wdi_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
205 
206 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
207 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->tx_uc_db_pa)
208 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
209 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->rx_uc_db_pa)
210 
211 /**
212  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
213  */
214 typedef struct ipa_wdi_perf_profile  __qdf_ipa_wdi_perf_profile_t;
215 
216 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
217 	(((struct ipa_wdi_perf_profile *)(profile))->client)
218 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
219 	(((struct ipa_wdi_perf_profile *)(profile))->max_supported_bw_mbps)
220 
221 /**
222  * __qdf_ipa_wdi_init - Client should call this function to
223  * init WDI IPA offload data path
224  *
225  * Note: Should not be called from atomic context and only
226  * after checking IPA readiness using ipa_register_ipa_ready_cb()
227  *
228  * @Return 0 on success, negative on failure
229  */
230 static inline int __qdf_ipa_wdi_init(struct ipa_wdi_init_in_params *in,
231 		 struct ipa_wdi_init_out_params *out)
232 {
233 	return ipa_wdi_init(in, out);
234 }
235 
236 /**
237  * __qdf_ipa_wdi_cleanup - Client should call this function to
238  * clean up WDI IPA offload data path
239  *
240  * @Return 0 on success, negative on failure
241  */
242 static inline int __qdf_ipa_wdi_cleanup(void)
243 {
244 	return ipa_wdi_cleanup();
245 }
246 
247 /**
248  * __qdf_ipa_wdi_reg_intf - Client should call this function to
249  * init WDI IPA offload data path
250  *
251  * Note: Should not be called from atomic context and only
252  * after checking IPA readiness using ipa_register_ipa_ready_cb()
253  *
254  * @Return 0 on success, negative on failure
255  */
256 static inline int __qdf_ipa_wdi_reg_intf(
257 	struct ipa_wdi_reg_intf_in_params *in)
258 {
259 	return ipa_wdi_reg_intf(in);
260 }
261 
262 /**
263  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
264  * function to deregister before unload and after disconnect
265  *
266  * @Return 0 on success, negative on failure
267  */
268 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
269 {
270 	return ipa_wdi_dereg_intf(netdev_name);
271 }
272 
273 /**
274  * __qdf_ipa_wdi_conn_pipes - Client should call this
275  * function to connect pipes
276  *
277  * @in:	[in] input parameters from client
278  * @out: [out] output params to client
279  *
280  * Note: Should not be called from atomic context and only
281  * after checking IPA readiness using ipa_register_ipa_ready_cb()
282  *
283  * @Return 0 on success, negative on failure
284  */
285 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in,
286 			struct ipa_wdi_conn_out_params *out)
287 {
288 	return ipa_wdi_conn_pipes(in, out);
289 }
290 
291 /**
292  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
293  *		function to disconnect pipes
294  *
295  * Note: Should not be called from atomic context
296  *
297  * Returns: 0 on success, negative on failure
298  */
299 static inline int __qdf_ipa_wdi_disconn_pipes(void)
300 {
301 	return ipa_wdi_disconn_pipes();
302 }
303 
304 /**
305  * __qdf_ipa_wdi_enable_pipes() - Client should call this
306  *		function to enable IPA offload data path
307  *
308  * Note: Should not be called from atomic context
309  *
310  * Returns: 0 on success, negative on failure
311  */
312 static inline int __qdf_ipa_wdi_enable_pipes(void)
313 {
314 	return ipa_wdi_enable_pipes();
315 }
316 
317 /**
318  * __qdf_ipa_wdi_disable_pipes() - Client should call this
319  *		function to disable IPA offload data path
320  *
321  * Note: Should not be called from atomic context
322  *
323  * Returns: 0 on success, negative on failure
324  */
325 static inline int __qdf_ipa_wdi_disable_pipes(void)
326 {
327 	return ipa_wdi_disable_pipes();
328 }
329 
330 /**
331  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
332  *		set IPA clock bandwidth based on data rates
333  *
334  * @profile: [in] BandWidth profile to use
335  *
336  * Returns: 0 on success, negative on failure
337  */
338 static inline int __qdf_ipa_wdi_set_perf_profile(
339 			struct ipa_wdi_perf_profile *profile)
340 {
341 	return ipa_wdi_set_perf_profile(profile);
342 }
343 
344 /**
345  * __qdf_ipa_wdi_create_smmu_mapping() - Client should call this function to
346  *		create smmu mapping
347  *
348  * @num_buffers: [in] number of buffers
349  * @info: [in] wdi buffer info
350  *
351  * Returns: 0 on success, negative on failure
352  */
353 static inline int __qdf_ipa_wdi_create_smmu_mapping(u32 num_buffers,
354 		struct ipa_wdi_buffer_info *info)
355 {
356 	return ipa_wdi_create_smmu_mapping(num_buffers, info);
357 }
358 
359 /**
360  * __qdf_ipa_wdi_release_smmu_mapping() - Client should call this function to
361  *		release 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_release_smmu_mapping(u32 num_buffers,
369 		struct ipa_wdi_buffer_info *info)
370 {
371 	return ipa_wdi_release_smmu_mapping(num_buffers, info);
372 }
373 
374 #else /* CONFIG_IPA_WDI_UNIFIED_API */
375 
376 /**
377  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
378  */
379 typedef struct ipa_wdi3_hdr_info  __qdf_ipa_wdi_hdr_info_t;
380 
381 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
382 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr)
383 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
384 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len)
385 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
386 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset)
387 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
388 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type)
389 
390 /**
391  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
392  *	interface registration
393  */
394 typedef struct ipa_wdi3_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
395 
396 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
397 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name)
398 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
399 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info)
400 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
401 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid)
402 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
403 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data)
404 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
405 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask)
406 
407 /**
408  * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration
409  */
410 typedef struct ipa_wdi3_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
411 
412 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx)	\
413 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en)
414 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx)	\
415 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len)
416 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx)	\
417 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid)
418 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx)	\
419 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid)
420 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx)	\
421 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid)
422 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx)	\
423 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size)
424 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx)	\
425 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len)
426 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx)	\
427 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode)
428 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx)	\
429 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian)
430 
431 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
432 	(((struct ipa_wdi3_setup_info *)(txrx))->client)
433 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
434 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa)
435 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
436 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size)
437 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
438 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa)
439 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
440 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa)
441 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
442 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size)
443 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
444 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa)
445 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
446 	(((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers)
447 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
448 	(((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset)
449 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
450 	(((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template)
451 
452 /**
453  * __qdf_ipa_wdi_conn_in_params_t - information provided by
454  *		uC offload client
455  */
456 typedef struct ipa_wdi3_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
457 
458 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
459 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify)
460 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
461 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv)
462 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
463 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx)
464 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
465 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx)
466 
467 /**
468  * __qdf_ipa_wdi_conn_out_params_t - information provided
469  *				to WLAN druver
470  */
471 typedef struct ipa_wdi3_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
472 
473 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
474 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa)
475 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out)	\
476 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va)
477 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
478 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa)
479 
480 /**
481  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
482  */
483 typedef struct ipa_wdi3_perf_profile  __qdf_ipa_wdi_perf_profile_t;
484 
485 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
486 	(((struct ipa_wdi3_perf_profile *)(profile))->client)
487 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
488 	(((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps)
489 
490 /**
491  * __qdf_ipa_wdi_reg_intf - Client should call this function to
492  * init WDI3 IPA offload data path
493  *
494  * Note: Should not be called from atomic context and only
495  * after checking IPA readiness using ipa_register_ipa_ready_cb()
496  *
497  * @Return 0 on success, negative on failure
498  */
499 static inline int __qdf_ipa_wdi_reg_intf(
500 	struct ipa_wdi3_reg_intf_in_params *in)
501 {
502 	return ipa_wdi3_reg_intf(in);
503 }
504 
505 /**
506  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
507  * function to deregister before unload and after disconnect
508  *
509  * @Return 0 on success, negative on failure
510  */
511 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
512 {
513 	return ipa_wdi3_dereg_intf(netdev_name);
514 }
515 
516 /**
517  * __qdf_ipa_wdi_conn_pipes - Client should call this
518  * function to connect pipes
519  *
520  * @in:	[in] input parameters from client
521  * @out: [out] output params to client
522  *
523  * Note: Should not be called from atomic context and only
524  * after checking IPA readiness using ipa_register_ipa_ready_cb()
525  *
526  * @Return 0 on success, negative on failure
527  */
528 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in,
529 					   struct ipa_wdi3_conn_out_params *out)
530 {
531 	return ipa_wdi3_conn_pipes(in, out);
532 }
533 
534 /**
535  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
536  *		function to disconnect pipes
537  *
538  * Note: Should not be called from atomic context
539  *
540  * Returns: 0 on success, negative on failure
541  */
542 static inline int __qdf_ipa_wdi_disconn_pipes(void)
543 {
544 	return ipa_wdi3_disconn_pipes();
545 }
546 
547 /**
548  * __qdf_ipa_wdi_enable_pipes() - Client should call this
549  *		function to enable IPA offload data path
550  *
551  * Note: Should not be called from atomic context
552  *
553  * Returns: 0 on success, negative on failure
554  */
555 static inline int __qdf_ipa_wdi_enable_pipes(void)
556 {
557 	return ipa_wdi3_enable_pipes();
558 }
559 
560 /**
561  * __qdf_ipa_wdi_disable_pipes() - Client should call this
562  *		function to disable IPA offload data path
563  *
564  * Note: Should not be called from atomic context
565  *
566  * Returns: 0 on success, negative on failure
567  */
568 static inline int __qdf_ipa_wdi_disable_pipes(void)
569 {
570 	return ipa_wdi3_disable_pipes();
571 }
572 
573 /**
574  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
575  *		set IPA clock bandwidth based on data rates
576  *
577  * @profile: [in] BandWidth profile to use
578  *
579  * Returns: 0 on success, negative on failure
580  */
581 static inline int __qdf_ipa_wdi_set_perf_profile(
582 			struct ipa_wdi3_perf_profile *profile)
583 {
584 	return ipa_wdi3_set_perf_profile(profile);
585 }
586 
587 #endif /* CONFIG_IPA_WDI_UNIFIED_API */
588 
589 #endif /* IPA_OFFLOAD */
590 #endif /* I_QDF_IPA_WDI_H */
591