xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_ipa_wdi3.h (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
1 /*
2  * Copyright (c) 2017-2020, 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 #if (defined(IPA_WDI3_GSI)) || (defined(IPA_WDI2_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 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0))
226 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(pipe_out)	\
227 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->is_ddr_mapped)
228 #else
229 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(pipe_out) false
230 #endif
231 
232 /**
233  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
234  */
235 typedef struct ipa_wdi_perf_profile  __qdf_ipa_wdi_perf_profile_t;
236 
237 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
238 	(((struct ipa_wdi_perf_profile *)(profile))->client)
239 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
240 	(((struct ipa_wdi_perf_profile *)(profile))->max_supported_bw_mbps)
241 
242 /**
243  * __qdf_ipa_wdi_init - Client should call this function to
244  * init WDI IPA offload data path
245  *
246  * Note: Should not be called from atomic context and only
247  * after checking IPA readiness using ipa_register_ipa_ready_cb()
248  *
249  * @Return 0 on success, negative on failure
250  */
251 static inline int __qdf_ipa_wdi_init(struct ipa_wdi_init_in_params *in,
252 		 struct ipa_wdi_init_out_params *out)
253 {
254 	return ipa_wdi_init(in, out);
255 }
256 
257 /**
258  * __qdf_ipa_wdi_cleanup - Client should call this function to
259  * clean up WDI IPA offload data path
260  *
261  * @Return 0 on success, negative on failure
262  */
263 static inline int __qdf_ipa_wdi_cleanup(void)
264 {
265 	return ipa_wdi_cleanup();
266 }
267 
268 /**
269  * __qdf_ipa_wdi_reg_intf - Client should call this function to
270  * init WDI IPA offload data path
271  *
272  * Note: Should not be called from atomic context and only
273  * after checking IPA readiness using ipa_register_ipa_ready_cb()
274  *
275  * @Return 0 on success, negative on failure
276  */
277 static inline int __qdf_ipa_wdi_reg_intf(
278 	struct ipa_wdi_reg_intf_in_params *in)
279 {
280 	return ipa_wdi_reg_intf(in);
281 }
282 
283 /**
284  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
285  * function to deregister before unload and after disconnect
286  *
287  * @Return 0 on success, negative on failure
288  */
289 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
290 {
291 	return ipa_wdi_dereg_intf(netdev_name);
292 }
293 
294 /**
295  * __qdf_ipa_wdi_conn_pipes - Client should call this
296  * function to connect pipes
297  *
298  * @in:	[in] input parameters from client
299  * @out: [out] output params to client
300  *
301  * Note: Should not be called from atomic context and only
302  * after checking IPA readiness using ipa_register_ipa_ready_cb()
303  *
304  * @Return 0 on success, negative on failure
305  */
306 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in,
307 			struct ipa_wdi_conn_out_params *out)
308 {
309 	return ipa_wdi_conn_pipes(in, out);
310 }
311 
312 /**
313  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
314  *		function to disconnect pipes
315  *
316  * Note: Should not be called from atomic context
317  *
318  * Returns: 0 on success, negative on failure
319  */
320 static inline int __qdf_ipa_wdi_disconn_pipes(void)
321 {
322 	return ipa_wdi_disconn_pipes();
323 }
324 
325 /**
326  * __qdf_ipa_wdi_enable_pipes() - Client should call this
327  *		function to enable IPA offload data path
328  *
329  * Note: Should not be called from atomic context
330  *
331  * Returns: 0 on success, negative on failure
332  */
333 static inline int __qdf_ipa_wdi_enable_pipes(void)
334 {
335 	return ipa_wdi_enable_pipes();
336 }
337 
338 /**
339  * __qdf_ipa_wdi_disable_pipes() - Client should call this
340  *		function to disable IPA offload data path
341  *
342  * Note: Should not be called from atomic context
343  *
344  * Returns: 0 on success, negative on failure
345  */
346 static inline int __qdf_ipa_wdi_disable_pipes(void)
347 {
348 	return ipa_wdi_disable_pipes();
349 }
350 
351 /**
352  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
353  *		set IPA clock bandwidth based on data rates
354  *
355  * @profile: [in] BandWidth profile to use
356  *
357  * Returns: 0 on success, negative on failure
358  */
359 static inline int __qdf_ipa_wdi_set_perf_profile(
360 			struct ipa_wdi_perf_profile *profile)
361 {
362 	return ipa_wdi_set_perf_profile(profile);
363 }
364 
365 /**
366  * __qdf_ipa_wdi_create_smmu_mapping() - Client should call this function to
367  *		create smmu mapping
368  *
369  * @num_buffers: [in] number of buffers
370  * @info: [in] wdi buffer info
371  *
372  * Returns: 0 on success, negative on failure
373  */
374 static inline int __qdf_ipa_wdi_create_smmu_mapping(u32 num_buffers,
375 		struct ipa_wdi_buffer_info *info)
376 {
377 	return ipa_wdi_create_smmu_mapping(num_buffers, info);
378 }
379 
380 /**
381  * __qdf_ipa_wdi_release_smmu_mapping() - Client should call this function to
382  *		release smmu mapping
383  *
384  * @num_buffers: [in] number of buffers
385  * @info: [in] wdi buffer info
386  *
387  * Returns: 0 on success, negative on failure
388  */
389 static inline int __qdf_ipa_wdi_release_smmu_mapping(u32 num_buffers,
390 		struct ipa_wdi_buffer_info *info)
391 {
392 	return ipa_wdi_release_smmu_mapping(num_buffers, info);
393 }
394 
395 #ifdef WDI3_STATS_UPDATE
396 /**
397  * __qdf_ipa_wdi_wlan_stats() - Client should call this function to
398  *		send Tx byte counts to IPA driver
399  * @tx_stats: number of Tx bytes on STA and SAP
400  *
401  * Returns: 0 on success, negative on failure
402  */
403 static inline int __qdf_ipa_wdi_wlan_stats(struct ipa_wdi_tx_info *tx_stats)
404 {
405 	return ipa_wdi_sw_stats(tx_stats);
406 }
407 
408 /**
409  * ipa_uc_bw_monitor() - start/stop uc bw monitoring
410  * @bw_info: set bw info levels to monitor
411  *
412  * Returns: 0 on success, negative on failure
413  */
414 static inline int __qdf_ipa_uc_bw_monitor(struct ipa_wdi_bw_info *bw_info)
415 {
416 	return ipa_uc_bw_monitor(bw_info);
417 }
418 #endif
419 #else /* CONFIG_IPA_WDI_UNIFIED_API */
420 
421 /**
422  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
423  */
424 typedef struct ipa_wdi3_hdr_info  __qdf_ipa_wdi_hdr_info_t;
425 
426 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
427 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr)
428 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
429 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len)
430 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
431 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset)
432 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
433 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type)
434 
435 /**
436  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
437  *	interface registration
438  */
439 typedef struct ipa_wdi3_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
440 
441 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
442 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name)
443 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
444 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info)
445 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
446 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid)
447 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
448 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data)
449 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
450 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask)
451 
452 /**
453  * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration
454  */
455 typedef struct ipa_wdi3_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
456 
457 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx)	\
458 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en)
459 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx)	\
460 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len)
461 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx)	\
462 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid)
463 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx)	\
464 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid)
465 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx)	\
466 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid)
467 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx)	\
468 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size)
469 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx)	\
470 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len)
471 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx)	\
472 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode)
473 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx)	\
474 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian)
475 
476 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
477 	(((struct ipa_wdi3_setup_info *)(txrx))->client)
478 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
479 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa)
480 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
481 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size)
482 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
483 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa)
484 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
485 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa)
486 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
487 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size)
488 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
489 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa)
490 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
491 	(((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers)
492 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
493 	(((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset)
494 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
495 	(((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template)
496 
497 /**
498  * __qdf_ipa_wdi_conn_in_params_t - information provided by
499  *		uC offload client
500  */
501 typedef struct ipa_wdi3_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
502 
503 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
504 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify)
505 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
506 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv)
507 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
508 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx)
509 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
510 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx)
511 
512 /**
513  * __qdf_ipa_wdi_conn_out_params_t - information provided
514  *				to WLAN druver
515  */
516 typedef struct ipa_wdi3_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
517 
518 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
519 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa)
520 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out)	\
521 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va)
522 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
523 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa)
524 
525 /**
526  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
527  */
528 typedef struct ipa_wdi3_perf_profile  __qdf_ipa_wdi_perf_profile_t;
529 
530 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
531 	(((struct ipa_wdi3_perf_profile *)(profile))->client)
532 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
533 	(((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps)
534 
535 /**
536  * __qdf_ipa_wdi_reg_intf - Client should call this function to
537  * init WDI3 IPA offload data path
538  *
539  * Note: Should not be called from atomic context and only
540  * after checking IPA readiness using ipa_register_ipa_ready_cb()
541  *
542  * @Return 0 on success, negative on failure
543  */
544 static inline int __qdf_ipa_wdi_reg_intf(
545 	struct ipa_wdi3_reg_intf_in_params *in)
546 {
547 	return ipa_wdi3_reg_intf(in);
548 }
549 
550 /**
551  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
552  * function to deregister before unload and after disconnect
553  *
554  * @Return 0 on success, negative on failure
555  */
556 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
557 {
558 	return ipa_wdi3_dereg_intf(netdev_name);
559 }
560 
561 /**
562  * __qdf_ipa_wdi_conn_pipes - Client should call this
563  * function to connect pipes
564  *
565  * @in:	[in] input parameters from client
566  * @out: [out] output params to client
567  *
568  * Note: Should not be called from atomic context and only
569  * after checking IPA readiness using ipa_register_ipa_ready_cb()
570  *
571  * @Return 0 on success, negative on failure
572  */
573 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in,
574 					   struct ipa_wdi3_conn_out_params *out)
575 {
576 	return ipa_wdi3_conn_pipes(in, out);
577 }
578 
579 /**
580  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
581  *		function to disconnect pipes
582  *
583  * Note: Should not be called from atomic context
584  *
585  * Returns: 0 on success, negative on failure
586  */
587 static inline int __qdf_ipa_wdi_disconn_pipes(void)
588 {
589 	return ipa_wdi3_disconn_pipes();
590 }
591 
592 /**
593  * __qdf_ipa_wdi_enable_pipes() - Client should call this
594  *		function to enable IPA offload data path
595  *
596  * Note: Should not be called from atomic context
597  *
598  * Returns: 0 on success, negative on failure
599  */
600 static inline int __qdf_ipa_wdi_enable_pipes(void)
601 {
602 	return ipa_wdi3_enable_pipes();
603 }
604 
605 /**
606  * __qdf_ipa_wdi_disable_pipes() - Client should call this
607  *		function to disable IPA offload data path
608  *
609  * Note: Should not be called from atomic context
610  *
611  * Returns: 0 on success, negative on failure
612  */
613 static inline int __qdf_ipa_wdi_disable_pipes(void)
614 {
615 	return ipa_wdi3_disable_pipes();
616 }
617 
618 /**
619  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
620  *		set IPA clock bandwidth based on data rates
621  *
622  * @profile: [in] BandWidth profile to use
623  *
624  * Returns: 0 on success, negative on failure
625  */
626 static inline int __qdf_ipa_wdi_set_perf_profile(
627 			struct ipa_wdi3_perf_profile *profile)
628 {
629 	return ipa_wdi3_set_perf_profile(profile);
630 }
631 
632 #endif /* CONFIG_IPA_WDI_UNIFIED_API */
633 
634 #endif /* IPA_OFFLOAD */
635 #endif /* I_QDF_IPA_WDI_H */
636