1  /*
2   * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
3   * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for any
6   * purpose with or without fee is hereby granted, provided that the above
7   * copyright notice and this permission notice appear in all copies.
8   *
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16   */
17  
18  #ifndef _DP_IPA_H_
19  #define _DP_IPA_H_
20  
21  #if defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_KIWI_V2)
22  /* Index into soc->tcl_data_ring[] */
23  #define IPA_TCL_DATA_RING_IDX	3
24  #else
25  #define IPA_TCL_DATA_RING_IDX	2
26  #endif
27  /* Index into soc->tx_comp_ring[] */
28  #define IPA_TX_COMP_RING_IDX IPA_TCL_DATA_RING_IDX
29  
30  #ifdef IPA_OFFLOAD
31  
32  #define DP_IPA_MAX_IFACE	3
33  #define IPA_REO_DEST_RING_IDX	3
34  #define IPA_REO_DEST_RING_IDX_2	7
35  
36  #define IPA_RX_REFILL_BUF_RING_IDX	2
37  
38  #define IPA_ALT_REO_DEST_RING_IDX	2
39  #define IPA_RX_ALT_REFILL_BUF_RING_IDX	3
40  
41  /* Adding delay before disabling ipa pipes if any Tx Completions are pending */
42  #define TX_COMP_DRAIN_WAIT_MS	50
43  #define TX_COMP_DRAIN_WAIT_TIMEOUT_MS	100
44  
45  #ifdef IPA_WDI3_TX_TWO_PIPES
46  #if defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_KIWI_V2)
47  /* Index into soc->tcl_data_ring[] and soc->tx_comp_ring[] */
48  #define IPA_TX_ALT_RING_IDX 4
49  #define IPA_TX_ALT_COMP_RING_IDX IPA_TX_ALT_RING_IDX
50  #elif defined(QCA_WIFI_QCN9224)
51  #define IPA_TX_ALT_RING_IDX 3
52  #define IPA_TX_ALT_COMP_RING_IDX IPA_TX_ALT_RING_IDX
53  #else /* !KIWI */
54  #define IPA_TX_ALT_RING_IDX 1
55  /*
56   * must be same as IPA_TX_ALT_RING_IDX as tcl and wbm ring
57   * are initialized with same index as a pair.
58   */
59  #define IPA_TX_ALT_COMP_RING_IDX 1
60  #endif /* KIWI */
61  
62  #define IPA_SESSION_ID_SHIFT 1
63  #endif /* IPA_WDI3_TX_TWO_PIPES */
64  
65  /**
66   * struct dp_ipa_uc_tx_hdr - full tx header registered to IPA hardware
67   * @eth:     ether II header
68   */
69  struct dp_ipa_uc_tx_hdr {
70  	struct ethhdr eth;
71  } __packed;
72  
73  /**
74   * struct dp_ipa_uc_tx_vlan_hdr - full tx header registered to IPA hardware
75   * @eth:     ether II header
76   */
77  struct dp_ipa_uc_tx_vlan_hdr {
78  	struct vlan_ethhdr eth;
79  } __packed;
80  
81  /**
82   * struct dp_ipa_uc_rx_hdr - full rx header registered to IPA hardware
83   * @eth:     ether II header
84   */
85  struct dp_ipa_uc_rx_hdr {
86  	struct ethhdr eth;
87  } __packed;
88  
89  #define DP_IPA_UC_WLAN_TX_HDR_LEN      sizeof(struct dp_ipa_uc_tx_hdr)
90  #define DP_IPA_UC_WLAN_TX_VLAN_HDR_LEN sizeof(struct dp_ipa_uc_tx_vlan_hdr)
91  #define DP_IPA_UC_WLAN_RX_HDR_LEN      sizeof(struct dp_ipa_uc_rx_hdr)
92  /* 28 <bytes of rx_msdu_end_tlv> + 16 <bytes of attn tlv> +
93   * 52 <bytes of rx_mpdu_start_tlv> + <L2 Header>
94   */
95  #define DP_IPA_UC_WLAN_RX_HDR_LEN_AST  110
96  #define DP_IPA_UC_WLAN_RX_HDR_LEN_AST_VLAN 114
97  #define DP_IPA_UC_WLAN_HDR_DES_MAC_OFFSET	0
98  
99  #define DP_IPA_HDL_INVALID	0xFF
100  #define DP_IPA_HDL_FIRST	0
101  #define DP_IPA_HDL_SECOND	1
102  #define DP_IPA_HDL_THIRD	2
103  /**
104   * wlan_ipa_get_hdl() - Get ipa handle from IPA component
105   * @psoc: control psoc object
106   * @pdev_id: pdev id
107   *
108   * IPA component will return the IPA handle based on pdev_id
109   *
110   * Return: IPA handle
111   */
112  qdf_ipa_wdi_hdl_t wlan_ipa_get_hdl(void *psoc, uint8_t pdev_id);
113  
114  /**
115   * dp_ipa_get_resource() - Client request resource information
116   * @soc_hdl: data path soc handle
117   * @pdev_id: device instance id
118   *
119   *  IPA client will request IPA UC related resource information
120   *  Resource information will be distributed to IPA module
121   *  All of the required resources should be pre-allocated
122   *
123   * Return: QDF_STATUS
124   */
125  QDF_STATUS dp_ipa_get_resource(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
126  
127  /**
128   * dp_ipa_set_doorbell_paddr() - Set doorbell register physical address to SRNG
129   * @soc_hdl: data path soc handle
130   * @pdev_id: device instance id
131   *
132   * Set TX_COMP_DOORBELL register physical address to WBM Head_Ptr_MemAddr_LSB
133   * Set RX_READ_DOORBELL register physical address to REO Head_Ptr_MemAddr_LSB
134   *
135   * Return: QDF_STATUS
136   */
137  QDF_STATUS dp_ipa_set_doorbell_paddr(struct cdp_soc_t *soc_hdl,
138  				     uint8_t pdev_id);
139  
140  /**
141   * dp_ipa_iounmap_doorbell_vaddr() - unmap ipa RX db vaddr
142   * @soc_hdl: data path soc handle
143   * @pdev_id: device instance id
144   *
145   * Return: QDF_STATUS
146   */
147  QDF_STATUS dp_ipa_iounmap_doorbell_vaddr(struct cdp_soc_t *soc_hdl,
148  					 uint8_t pdev_id);
149  
150  /**
151   * dp_ipa_op_response() - Handle OP command response from firmware
152   * @soc_hdl: data path soc handle
153   * @pdev_id: device instance id
154   * @op_msg: op response message from firmware
155   *
156   * Return: QDF_STATUS
157   */
158  QDF_STATUS dp_ipa_op_response(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
159  			      uint8_t *op_msg);
160  
161  /**
162   * dp_ipa_register_op_cb() - Register OP handler function
163   * @soc_hdl: data path soc handle
164   * @pdev_id: device instance id
165   * @op_cb: handler function pointer
166   * @usr_ctxt: user context passed back to handler function
167   *
168   * Return: QDF_STATUS
169   */
170  QDF_STATUS dp_ipa_register_op_cb(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
171  				 ipa_uc_op_cb_type op_cb, void *usr_ctxt);
172  
173  /**
174   * dp_ipa_deregister_op_cb() - Deregister OP handler function
175   * @soc_hdl: data path soc handle
176   * @pdev_id: device instance id
177   *
178   * Return: none
179   */
180  void dp_ipa_deregister_op_cb(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
181  
182  /**
183   * dp_ipa_get_stat() - Get firmware wdi status
184   * @soc_hdl: data path soc handle
185   * @pdev_id: device instance id
186   *
187   * Return: QDF_STATUS
188   */
189  QDF_STATUS dp_ipa_get_stat(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
190  
191  /**
192   * dp_tx_send_ipa_data_frame() - send IPA data frame
193   * @soc_hdl: datapath soc handle
194   * @vdev_id: virtual device/interface id
195   * @skb: skb
196   *
197   * Return: skb/ NULL is for success
198   */
199  qdf_nbuf_t dp_tx_send_ipa_data_frame(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
200  				     qdf_nbuf_t skb);
201  
202  /**
203   * dp_ipa_enable_autonomy() - Enable autonomy RX path
204   * @soc_hdl: data path soc handle
205   * @pdev_id: device instance id
206   *
207   * Set all RX packet route to IPA REO ring
208   * Program Destination_Ring_Ctrl_IX_0 REO register to point IPA REO ring
209   *
210   * Return: QDF_STATUS
211   */
212  QDF_STATUS dp_ipa_enable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
213  
214  /**
215   * dp_ipa_disable_autonomy() - Disable autonomy RX path
216   * @soc_hdl: data path soc handle
217   * @pdev_id: device instance id
218   *
219   * Disable RX packet routing to IPA REO
220   * Program Destination_Ring_Ctrl_IX_0 REO register to disable
221   *
222   * Return: QDF_STATUS
223   */
224  QDF_STATUS dp_ipa_disable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
225  
226  #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \
227  	defined(CONFIG_IPA_WDI_UNIFIED_API)
228  /**
229   * dp_ipa_setup() - Setup and connect IPA pipes
230   * @soc_hdl: data path soc handle
231   * @pdev_id: device instance id
232   * @ipa_i2w_cb: IPA to WLAN callback
233   * @ipa_w2i_cb: WLAN to IPA callback
234   * @ipa_wdi_meter_notifier_cb: IPA WDI metering callback
235   * @ipa_desc_size: IPA descriptor size
236   * @ipa_priv: handle to the HTT instance
237   * @is_rm_enabled: Is IPA RM enabled or not
238   * @tx_pipe_handle: pointer to Tx pipe handle
239   * @rx_pipe_handle: pointer to Rx pipe handle
240   * @is_smmu_enabled: Is SMMU enabled or not
241   * @sys_in: parameters to setup sys pipe in mcc mode
242   * @over_gsi:
243   * @hdl: IPA handle
244   * @id: IPA instance id
245   * @ipa_ast_notify_cb: IPA to WLAN callback for ast create and update
246   *
247   * Return: QDF_STATUS
248   */
249  QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
250  			void *ipa_i2w_cb, void *ipa_w2i_cb,
251  			void *ipa_wdi_meter_notifier_cb,
252  			uint32_t ipa_desc_size, void *ipa_priv,
253  			bool is_rm_enabled, uint32_t *tx_pipe_handle,
254  			uint32_t *rx_pipe_handle,
255  			bool is_smmu_enabled,
256  			qdf_ipa_sys_connect_params_t *sys_in, bool over_gsi,
257  			qdf_ipa_wdi_hdl_t hdl, qdf_ipa_wdi_hdl_t id,
258  			void *ipa_ast_notify_cb);
259  #else /* CONFIG_IPA_WDI_UNIFIED_API */
260  /**
261   * dp_ipa_setup() - Setup and connect IPA pipes
262   * @soc_hdl: data path soc handle
263   * @pdev_id: device instance id
264   * @ipa_i2w_cb: IPA to WLAN callback
265   * @ipa_w2i_cb: WLAN to IPA callback
266   * @ipa_wdi_meter_notifier_cb: IPA WDI metering callback
267   * @ipa_desc_size: IPA descriptor size
268   * @ipa_priv: handle to the HTT instance
269   * @is_rm_enabled: Is IPA RM enabled or not
270   * @tx_pipe_handle: pointer to Tx pipe handle
271   * @rx_pipe_handle: pointer to Rx pipe handle
272   *
273   * Return: QDF_STATUS
274   */
275  QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
276  			void *ipa_i2w_cb, void *ipa_w2i_cb,
277  			void *ipa_wdi_meter_notifier_cb,
278  			uint32_t ipa_desc_size, void *ipa_priv,
279  			bool is_rm_enabled, uint32_t *tx_pipe_handle,
280  			uint32_t *rx_pipe_handle);
281  #endif /* CONFIG_IPA_WDI_UNIFIED_API */
282  
283  /**
284   * dp_ipa_cleanup() - Disconnect IPA pipes
285   * @soc_hdl: dp soc handle
286   * @pdev_id: dp pdev id
287   * @tx_pipe_handle: Tx pipe handle
288   * @rx_pipe_handle: Rx pipe handle
289   * @hdl: IPA handle
290   *
291   * Return: QDF_STATUS
292   */
293  QDF_STATUS dp_ipa_cleanup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
294  			  uint32_t tx_pipe_handle, uint32_t rx_pipe_handle,
295  			  qdf_ipa_wdi_hdl_t hdl);
296  
297  /**
298   * dp_ipa_setup_iface() - Setup IPA header and register interface
299   * @ifname: Interface name
300   * @mac_addr: Interface MAC address
301   * @prod_client: IPA prod client type
302   * @cons_client: IPA cons client type
303   * @session_id: Session ID
304   * @is_ipv6_enabled: Is IPV6 enabled or not
305   * @hdl: IPA handle
306   *
307   * Return: QDF_STATUS
308   */
309  QDF_STATUS dp_ipa_setup_iface(char *ifname, uint8_t *mac_addr,
310  			      qdf_ipa_client_type_t prod_client,
311  			      qdf_ipa_client_type_t cons_client,
312  			      uint8_t session_id, bool is_ipv6_enabled,
313  			      qdf_ipa_wdi_hdl_t hdl);
314  
315  /**
316   * dp_ipa_cleanup_iface() - Cleanup IPA header and deregister interface
317   * @ifname: Interface name
318   * @is_ipv6_enabled: Is IPV6 enabled or not
319   * @hdl: IPA handle
320   *
321   * Return: QDF_STATUS
322   */
323  QDF_STATUS dp_ipa_cleanup_iface(char *ifname, bool is_ipv6_enabled,
324  				qdf_ipa_wdi_hdl_t hdl);
325  
326  /**
327   * dp_ipa_enable_pipes() - Enable and resume traffic on Tx/Rx pipes
328   * @soc_hdl: handle to the soc
329   * @pdev_id: pdev id number, to get the handle
330   * @hdl: IPA handle
331   *
332   * Return: QDF_STATUS
333   */
334  QDF_STATUS dp_ipa_enable_pipes(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
335  			       qdf_ipa_wdi_hdl_t hdl);
336  
337  /**
338   * dp_ipa_disable_pipes() - Suspend traffic and disable Tx/Rx pipes
339   * @soc_hdl: handle to the soc
340   * @pdev_id: pdev id number, to get the handle
341   * @hdl: IPA handle
342   *
343   * Return: QDF_STATUS
344   */
345  QDF_STATUS dp_ipa_disable_pipes(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
346  				qdf_ipa_wdi_hdl_t hdl);
347  
348  /**
349   * dp_ipa_set_perf_level() - Set IPA clock bandwidth based on data rates
350   * @client: Client type
351   * @max_supported_bw_mbps: Maximum bandwidth needed (in Mbps)
352   * @hdl: IPA handle
353   *
354   * Return: QDF_STATUS
355   */
356  QDF_STATUS dp_ipa_set_perf_level(int client, uint32_t max_supported_bw_mbps,
357  				 qdf_ipa_wdi_hdl_t hdl);
358  #ifdef IPA_OPT_WIFI_DP
359  QDF_STATUS dp_ipa_rx_super_rule_setup(struct cdp_soc_t *soc_hdl,
360  				      void *flt_params);
361  int dp_ipa_pcie_link_up(struct cdp_soc_t *soc_hdl);
362  void dp_ipa_pcie_link_down(struct cdp_soc_t *soc_hdl);
363  #endif
364  
365  #ifdef QCA_SUPPORT_WDS_EXTENDED
366  /**
367   * dp_ipa_rx_wdsext_iface() -  Forward RX exception packets to wdsext interface
368   * @soc_hdl: data path SoC handle
369   * @peer_id: Peer ID to get respective peer
370   * @skb: socket buffer
371   *
372   * Return: bool
373   */
374  bool dp_ipa_rx_wdsext_iface(struct cdp_soc_t *soc_hdl, uint8_t peer_id,
375  			    qdf_nbuf_t skb);
376  #endif
377  
378  /**
379   * dp_ipa_rx_intrabss_fwd() - Perform intra-bss fwd for IPA RX path
380   *
381   * @soc_hdl: data path soc handle
382   * @vdev_id: virtual device/interface id
383   * @nbuf: pointer to skb of ethernet packet received from IPA RX path
384   * @fwd_success: pointer to indicate if skb succeeded in intra-bss TX
385   *
386   * This function performs intra-bss forwarding for WDI 3.0 IPA RX path.
387   *
388   * Return: true if packet is intra-bss fwd-ed and no need to pass to
389   *	   network stack. false if packet needs to be passed to network stack.
390   */
391  bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
392  			    qdf_nbuf_t nbuf, bool *fwd_success);
393  int dp_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev);
394  int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev);
395  
396  /**
397   * dp_ipa_ring_resource_setup() - setup IPA ring resources
398   * @soc: data path SoC handle
399   * @pdev:
400   *
401   * Return: status
402   */
403  int dp_ipa_ring_resource_setup(struct dp_soc *soc,
404  			       struct dp_pdev *pdev);
405  
406  bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap0,
407  			 uint32_t *remap1, uint32_t *remap2);
408  bool dp_ipa_is_mdm_platform(void);
409  
410  /**
411   * dp_ipa_handle_rx_reo_reinject() - Handle RX REO reinject skb buffer
412   * @soc: soc
413   * @nbuf: skb
414   *
415   * Return: nbuf if success and otherwise NULL
416   */
417  qdf_nbuf_t dp_ipa_handle_rx_reo_reinject(struct dp_soc *soc, qdf_nbuf_t nbuf);
418  
419  QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
420  					     qdf_nbuf_t nbuf,
421  					     uint32_t size,
422  					     bool create,
423  					     const char *func,
424  					     uint32_t line);
425  /**
426   * dp_ipa_tx_buf_smmu_mapping() - Create SMMU mappings for IPA
427   *				  allocated TX buffers
428   * @soc_hdl: handle to the soc
429   * @pdev_id: pdev id number, to get the handle
430   * @func: caller function
431   * @line: line number
432   *
433   * Return: QDF_STATUS
434   */
435  QDF_STATUS dp_ipa_tx_buf_smmu_mapping(struct cdp_soc_t *soc_hdl,
436  				      uint8_t pdev_id, const char *func,
437  				      uint32_t line);
438  
439  /**
440   * dp_ipa_tx_buf_smmu_unmapping() - Release SMMU mappings for IPA
441   *				    allocated TX buffers
442   * @soc_hdl: handle to the soc
443   * @pdev_id: pdev id number, to get the handle
444   * @func: caller function
445   * @line: line number
446   *
447   * Return: QDF_STATUS
448   */
449  QDF_STATUS dp_ipa_tx_buf_smmu_unmapping(struct cdp_soc_t *soc_hdl,
450  					uint8_t pdev_id, const char *func,
451  					uint32_t line);
452  QDF_STATUS dp_ipa_rx_buf_pool_smmu_mapping(struct cdp_soc_t *soc_hdl,
453  					   uint8_t pdev_id,
454  					   bool create,
455  					   const char *func,
456  					   uint32_t line);
457  QDF_STATUS dp_ipa_set_smmu_mapped(struct cdp_soc_t *soc, int val);
458  int dp_ipa_get_smmu_mapped(struct cdp_soc_t *soc);
459  
460  #ifndef QCA_OL_DP_SRNG_LOCK_LESS_ACCESS
461  static inline void
dp_ipa_rx_buf_smmu_mapping_lock(struct dp_soc * soc)462  dp_ipa_rx_buf_smmu_mapping_lock(struct dp_soc *soc)
463  {
464  	if (soc->ipa_rx_buf_map_lock_initialized)
465  		qdf_spin_lock_bh(&soc->ipa_rx_buf_map_lock);
466  }
467  
468  static inline void
dp_ipa_rx_buf_smmu_mapping_unlock(struct dp_soc * soc)469  dp_ipa_rx_buf_smmu_mapping_unlock(struct dp_soc *soc)
470  {
471  	if (soc->ipa_rx_buf_map_lock_initialized)
472  		qdf_spin_unlock_bh(&soc->ipa_rx_buf_map_lock);
473  }
474  
475  static inline void
dp_ipa_reo_ctx_buf_mapping_lock(struct dp_soc * soc,uint32_t reo_ring_num)476  dp_ipa_reo_ctx_buf_mapping_lock(struct dp_soc *soc,
477  				uint32_t reo_ring_num)
478  {
479  	if (!soc->ipa_reo_ctx_lock_required[reo_ring_num])
480  		return;
481  
482  	qdf_spin_lock_bh(&soc->ipa_rx_buf_map_lock);
483  }
484  
485  static inline void
dp_ipa_reo_ctx_buf_mapping_unlock(struct dp_soc * soc,uint32_t reo_ring_num)486  dp_ipa_reo_ctx_buf_mapping_unlock(struct dp_soc *soc,
487  				  uint32_t reo_ring_num)
488  {
489  	if (!soc->ipa_reo_ctx_lock_required[reo_ring_num])
490  		return;
491  
492  	qdf_spin_unlock_bh(&soc->ipa_rx_buf_map_lock);
493  }
494  #else
495  
496  static inline void
dp_ipa_rx_buf_smmu_mapping_lock(struct dp_soc * soc)497  dp_ipa_rx_buf_smmu_mapping_lock(struct dp_soc *soc)
498  {
499  }
500  
501  static inline void
dp_ipa_rx_buf_smmu_mapping_unlock(struct dp_soc * soc)502  dp_ipa_rx_buf_smmu_mapping_unlock(struct dp_soc *soc)
503  {
504  }
505  
506  static inline void
dp_ipa_reo_ctx_buf_mapping_lock(struct dp_soc * soc,uint32_t reo_ring_num)507  dp_ipa_reo_ctx_buf_mapping_lock(struct dp_soc *soc,
508  				uint32_t reo_ring_num)
509  {
510  }
511  
512  static inline void
dp_ipa_reo_ctx_buf_mapping_unlock(struct dp_soc * soc,uint32_t reo_ring_num)513  dp_ipa_reo_ctx_buf_mapping_unlock(struct dp_soc *soc,
514  				  uint32_t reo_ring_num)
515  {
516  }
517  #endif
518  
519  #ifdef IPA_WDS_EASYMESH_FEATURE
520  /**
521   * dp_ipa_ast_create() - Create/update AST entry in AST table
522   *			 for learning/roaming packets from IPA
523   * @soc_hdl: data path soc handle
524   * @data: Structure used for updating the AST table
525   *
526   * Create/update AST entry in AST table for learning/roaming packets from IPA
527   *
528   * Return: QDF_STATUS
529   */
530  QDF_STATUS dp_ipa_ast_create(struct cdp_soc_t *soc_hdl,
531  			     qdf_ipa_ast_info_type_t *data);
532  
533  /**
534   * dp_ipa_ast_notify_cb() - Provide ast notify cb to IPA
535   * @pipe_in: WDI conn pipe in params
536   * @ipa_ast_notify_cb: ipa ast notify cb
537   *
538   * Return: None
539   */
540  static inline void
dp_ipa_ast_notify_cb(qdf_ipa_wdi_conn_in_params_t * pipe_in,void * ipa_ast_notify_cb)541  dp_ipa_ast_notify_cb(qdf_ipa_wdi_conn_in_params_t *pipe_in,
542  		     void *ipa_ast_notify_cb)
543  {
544  	QDF_IPA_WDI_CONN_IN_PARAMS_AST_NOTIFY(pipe_in) = ipa_ast_notify_cb;
545  }
546  #else
547  static inline void
dp_ipa_ast_notify_cb(qdf_ipa_wdi_conn_in_params_t * pipe_in,void * ipa_ast_notify_cb)548  dp_ipa_ast_notify_cb(qdf_ipa_wdi_conn_in_params_t *pipe_in,
549  		     void *ipa_ast_notify_cb)
550  {
551  }
552  #endif
553  
554  #ifdef IPA_OPT_WIFI_DP
dp_ipa_opt_dp_ixo_remap(uint8_t * ix0_map)555  static inline void dp_ipa_opt_dp_ixo_remap(uint8_t *ix0_map)
556  {
557  	ix0_map[0] = REO_REMAP_SW1;
558  	ix0_map[1] = REO_REMAP_SW1;
559  	ix0_map[2] = REO_REMAP_SW2;
560  	ix0_map[3] = REO_REMAP_SW3;
561  	ix0_map[4] = REO_REMAP_SW4;
562  	ix0_map[5] = REO_REMAP_RELEASE;
563  	ix0_map[6] = REO_REMAP_FW;
564  	ix0_map[7] = REO_REMAP_FW;
565  }
566  #else
dp_ipa_opt_dp_ixo_remap(uint8_t * ix0_map)567  static inline void dp_ipa_opt_dp_ixo_remap(uint8_t *ix0_map)
568  {
569  }
570  #endif
571  #ifdef QCA_ENHANCED_STATS_SUPPORT
572  /**
573   * dp_ipa_txrx_get_peer_stats - fetch peer stats
574   * @soc: soc handle
575   * @vdev_id: id of vdev handle
576   * @peer_mac: peer mac address
577   * @peer_stats: buffer to hold peer stats
578   *
579   * Return: status success/failure
580   */
581  QDF_STATUS dp_ipa_txrx_get_peer_stats(struct cdp_soc_t *soc, uint8_t vdev_id,
582  				      uint8_t *peer_mac,
583  				      struct cdp_peer_stats *peer_stats);
584  
585  /**
586   * dp_ipa_txrx_get_vdev_stats - fetch vdev stats
587   * @soc_hdl: soc handle
588   * @vdev_id: id of vdev handle
589   * @buf: buffer to hold vdev stats
590   * @is_aggregate: for aggregation
591   *
592   * Return: int
593   */
594  int dp_ipa_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
595  			       void *buf, bool is_aggregate);
596  
597  /**
598   * dp_ipa_txrx_get_pdev_stats() - fetch pdev stats
599   * @soc: DP soc handle
600   * @pdev_id: id of DP pdev handle
601   * @pdev_stats: buffer to hold pdev stats
602   *
603   * Return: status success/failure
604   */
605  QDF_STATUS dp_ipa_txrx_get_pdev_stats(struct cdp_soc_t *soc, uint8_t pdev_id,
606  				      struct cdp_pdev_stats *pdev_stats);
607  
608  /**
609   * dp_ipa_update_peer_rx_stats() - update peer rx stats
610   * @soc: soc handle
611   * @vdev_id: vdev id
612   * @peer_mac: Peer Mac Address
613   * @nbuf: data nbuf
614   *
615   * Return: status success/failure
616   */
617  QDF_STATUS dp_ipa_update_peer_rx_stats(struct cdp_soc_t *soc, uint8_t vdev_id,
618  				       uint8_t *peer_mac, qdf_nbuf_t nbuf);
619  #endif
620  /**
621   * dp_ipa_get_wdi_version() - Get WDI version
622   * @soc_hdl: data path soc handle
623   * @wdi_ver: Out parameter for wdi version
624   *
625   * Get WDI version based on soc arch
626   *
627   * Return: None
628   */
629  void dp_ipa_get_wdi_version(struct cdp_soc_t *soc_hdl, uint8_t *wdi_ver);
630  
631  /**
632   * dp_ipa_is_ring_ipa_tx() - Check if the TX ring is used by IPA
633   *
634   * @soc: DP SoC
635   * @ring_id: TX ring id
636   *
637   * Return: bool
638   */
639  bool dp_ipa_is_ring_ipa_tx(struct dp_soc *soc, uint8_t ring_id);
640  #else
dp_ipa_uc_detach(struct dp_soc * soc,struct dp_pdev * pdev)641  static inline int dp_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
642  {
643  	return QDF_STATUS_SUCCESS;
644  }
645  
dp_ipa_uc_attach(struct dp_soc * soc,struct dp_pdev * pdev)646  static inline int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev)
647  {
648  	return QDF_STATUS_SUCCESS;
649  }
650  
dp_ipa_ring_resource_setup(struct dp_soc * soc,struct dp_pdev * pdev)651  static inline int dp_ipa_ring_resource_setup(struct dp_soc *soc,
652  					     struct dp_pdev *pdev)
653  {
654  	return 0;
655  }
656  
dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc * soc,qdf_nbuf_t nbuf,uint32_t size,bool create,const char * func,uint32_t line)657  static inline QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
658  							   qdf_nbuf_t nbuf,
659  							   uint32_t size,
660  							   bool create,
661  							   const char *func,
662  							   uint32_t line)
663  {
664  	return QDF_STATUS_SUCCESS;
665  }
666  
667  static inline void
dp_ipa_rx_buf_smmu_mapping_lock(struct dp_soc * soc)668  dp_ipa_rx_buf_smmu_mapping_lock(struct dp_soc *soc)
669  {
670  }
671  
672  static inline void
dp_ipa_rx_buf_smmu_mapping_unlock(struct dp_soc * soc)673  dp_ipa_rx_buf_smmu_mapping_unlock(struct dp_soc *soc)
674  {
675  }
676  
677  static inline void
dp_ipa_reo_ctx_buf_mapping_lock(struct dp_soc * soc,uint32_t reo_ring_num)678  dp_ipa_reo_ctx_buf_mapping_lock(struct dp_soc *soc,
679  				uint32_t reo_ring_num)
680  {
681  }
682  
683  static inline void
dp_ipa_reo_ctx_buf_mapping_unlock(struct dp_soc * soc,uint32_t reo_ring_num)684  dp_ipa_reo_ctx_buf_mapping_unlock(struct dp_soc *soc,
685  				  uint32_t reo_ring_num)
686  {
687  }
688  
dp_ipa_handle_rx_reo_reinject(struct dp_soc * soc,qdf_nbuf_t nbuf)689  static inline qdf_nbuf_t dp_ipa_handle_rx_reo_reinject(struct dp_soc *soc,
690  						       qdf_nbuf_t nbuf)
691  {
692  	return nbuf;
693  }
694  
dp_ipa_tx_buf_smmu_mapping(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,const char * func,uint32_t line)695  static inline QDF_STATUS dp_ipa_tx_buf_smmu_mapping(struct cdp_soc_t *soc_hdl,
696  						    uint8_t pdev_id,
697  						    const char *func,
698  						    uint32_t line)
699  {
700  	return QDF_STATUS_SUCCESS;
701  }
702  
dp_ipa_tx_buf_smmu_unmapping(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,const char * func,uint32_t line)703  static inline QDF_STATUS dp_ipa_tx_buf_smmu_unmapping(struct cdp_soc_t *soc_hdl,
704  						      uint8_t pdev_id,
705  						      const char *func,
706  						      uint32_t line)
707  {
708  	return QDF_STATUS_SUCCESS;
709  }
710  
dp_ipa_rx_buf_pool_smmu_mapping(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,bool create,const char * func,uint32_t line)711  static inline QDF_STATUS dp_ipa_rx_buf_pool_smmu_mapping(
712  						      struct cdp_soc_t *soc_hdl,
713  						      uint8_t pdev_id,
714  						      bool create,
715  						      const char *func,
716  						      uint32_t line)
717  {
718  	return QDF_STATUS_SUCCESS;
719  }
720  
dp_ipa_set_smmu_mapped(struct cdp_soc_t * soc,int val)721  static inline QDF_STATUS dp_ipa_set_smmu_mapped(struct cdp_soc_t *soc, int val)
722  {
723  	return QDF_STATUS_SUCCESS;
724  }
725  
dp_ipa_get_smmu_mapped(struct cdp_soc_t * soc)726  static inline int dp_ipa_get_smmu_mapped(struct cdp_soc_t *soc)
727  {
728  	return QDF_STATUS_SUCCESS;
729  }
730  
731  #ifdef IPA_WDS_EASYMESH_FEATURE
dp_ipa_ast_create(struct cdp_soc_t * soc_hdl,qdf_ipa_ast_info_type_t * data)732  static inline QDF_STATUS dp_ipa_ast_create(struct cdp_soc_t *soc_hdl,
733  					   qdf_ipa_ast_info_type_t *data)
734  {
735  	return QDF_STATUS_SUCCESS;
736  }
737  #endif
dp_ipa_get_wdi_version(struct cdp_soc_t * soc_hdl,uint8_t * wdi_ver)738  static inline void dp_ipa_get_wdi_version(struct cdp_soc_t *soc_hdl,
739  					  uint8_t *wdi_ver)
740  {
741  }
742  
743  static inline bool
dp_ipa_is_ring_ipa_tx(struct dp_soc * soc,uint8_t ring_id)744  dp_ipa_is_ring_ipa_tx(struct dp_soc *soc, uint8_t ring_id)
745  {
746  	return false;
747  }
748  #endif
749  #endif /* _DP_IPA_H_ */
750