1  /*
2   * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
3   *
4   * Permission to use, copy, modify, and/or distribute this software for
5   * any purpose with or without fee is hereby granted, provided that the
6   * above copyright notice and this permission notice appear in all
7   * copies.
8   *
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16   * PERFORMANCE OF THIS SOFTWARE.
17   */
18   /**
19    * DOC: wlan_dp_main.h
20    *
21    *
22    */
23  #ifndef __WLAN_DP_MAIN_H__
24  #define __WLAN_DP_MAIN_H__
25  
26  #include "wlan_dp_public_struct.h"
27  #include "wlan_dp_priv.h"
28  #include "wlan_dp_objmgr.h"
29  
30  #define NUM_RX_QUEUES 5
31  
32  #define dp_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_DP, "enter")
33  #define dp_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_DP, "exit")
34  
35  /**
36   * dp_allocate_ctx() - Allocate DP context
37   *
38   */
39  QDF_STATUS dp_allocate_ctx(void);
40  
41  /**
42   * dp_free_ctx() - Free DP context
43   *
44   */
45  void dp_free_ctx(void);
46  
47  /**
48   * dp_get_front_intf_no_lock() - Get the first interface from the intf list
49   * This API does not use any lock in it's implementation. It is the caller's
50   * directive to ensure concurrency safety.
51   * @dp_ctx: pointer to the DP context
52   * @out_intf: double pointer to pass the next interface
53   *
54   * Return: QDF_STATUS
55   */
56  QDF_STATUS
57  dp_get_front_intf_no_lock(struct wlan_dp_psoc_context *dp_ctx,
58  			  struct wlan_dp_intf **out_intf);
59  
60  /**
61   * dp_get_next_intf_no_lock() - Get the next intf from the intf list
62   * This API does not use any lock in it's implementation. It is the caller's
63   * directive to ensure concurrency safety.
64   * @dp_ctx: pointer to the DP context
65   * @cur_intf: pointer to the current intf
66   * @out_intf: double pointer to pass the next intf
67   *
68   * Return: QDF_STATUS
69   */
70  QDF_STATUS
71  dp_get_next_intf_no_lock(struct wlan_dp_psoc_context *dp_ctx,
72  			 struct wlan_dp_intf *cur_intf,
73  			 struct wlan_dp_intf **out_intf);
74  
75  /**
76   * __dp_take_ref_and_fetch_front_intf_safe - Helper macro to lock, fetch
77   * front and next intf, take ref and unlock.
78   * @dp_ctx: the global DP context
79   * @dp_intf: an dp_intf pointer to use as a cursor
80   * @dp_intf_next: dp_intf pointer to next intf
81   *
82   */
83  #define __dp_take_ref_and_fetch_front_intf_safe(dp_ctx, dp_intf, \
84  						dp_intf_next) \
85  	qdf_spin_lock_bh(&dp_ctx->intf_list_lock), \
86  	dp_get_front_intf_no_lock(dp_ctx, &dp_intf), \
87  	dp_get_next_intf_no_lock(dp_ctx, dp_intf, &dp_intf_next), \
88  	qdf_spin_unlock_bh(&dp_ctx->intf_list_lock)
89  
90  /**
91   * __dp_take_ref_and_fetch_next_intf_safe - Helper macro to lock, fetch next
92   * interface, take ref and unlock.
93   * @dp_ctx: the global DP context
94   * @dp_intf: dp_intf pointer to use as a cursor
95   * @dp_intf_next: dp_intf pointer to next interface
96   *
97   */
98  #define __dp_take_ref_and_fetch_next_intf_safe(dp_ctx, dp_intf, \
99  					       dp_intf_next) \
100  	qdf_spin_lock_bh(&dp_ctx->intf_list_lock), \
101  	dp_intf = dp_intf_next, \
102  	dp_get_next_intf_no_lock(dp_ctx, dp_intf, &dp_intf_next), \
103  	qdf_spin_unlock_bh(&dp_ctx->intf_list_lock)
104  
105  /**
106   * __dp_is_intf_valid - Helper macro to return true/false for valid interface.
107   * @_dp_intf: an dp_intf pointer to use as a cursor
108   */
109  #define __dp_is_intf_valid(_dp_intf) !!(_dp_intf)
110  
111  /**
112   * dp_for_each_intf_held_safe - Interface iterator called
113   *                                      in a delete safe manner
114   * @dp_ctx: the global DP context
115   * @dp_intf: an dp_intf pointer to use as a cursor
116   * @dp_intf_next: dp_intf pointer to the next interface
117   *
118   */
119  #define dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) \
120  	for (__dp_take_ref_and_fetch_front_intf_safe(dp_ctx, dp_intf, \
121  						     dp_intf_next); \
122  	     __dp_is_intf_valid(dp_intf); \
123  	     __dp_take_ref_and_fetch_next_intf_safe(dp_ctx, dp_intf, \
124  						    dp_intf_next))
125  
126  /**
127   * dp_get_intf_by_macaddr() - Api to Get interface from MAC address
128   * @dp_ctx: DP context
129   * @addr: MAC address
130   *
131   * Return: Pointer to DP interface.
132   */
133  struct wlan_dp_intf*
134  dp_get_intf_by_macaddr(struct wlan_dp_psoc_context *dp_ctx,
135  		       struct qdf_mac_addr *addr);
136  
137  /**
138   * dp_get_intf_by_netdev() - Api to Get interface from netdev
139   * @dp_ctx: DP context
140   * @dev: Pointer to network device
141   *
142   * Return: Pointer to DP interface.
143   */
144  struct wlan_dp_intf*
145  dp_get_intf_by_netdev(struct wlan_dp_psoc_context *dp_ctx, qdf_netdev_t dev);
146  
147  /**
148   * dp_get_front_link_no_lock() - Get the first link from the dp links list
149   * This API does not use any lock in it's implementation. It is the caller's
150   * directive to ensure concurrency safety.
151   * @dp_intf: DP interface handle
152   * @out_link: double pointer to pass the next link
153   *
154   * Return: QDF_STATUS
155   */
156  QDF_STATUS
157  dp_get_front_link_no_lock(struct wlan_dp_intf *dp_intf,
158  			  struct wlan_dp_link **out_link);
159  
160  /**
161   * dp_get_next_link_no_lock() - Get the next link from the link list
162   * This API does not use any lock in it's implementation. It is the caller's
163   * directive to ensure concurrency safety.
164   * @dp_intf: DP interface handle
165   * @cur_link: pointer to the currentlink
166   * @out_link: double pointer to pass the nextlink
167   *
168   * Return: QDF_STATUS
169   */
170  QDF_STATUS
171  dp_get_next_link_no_lock(struct wlan_dp_intf *dp_intf,
172  			 struct wlan_dp_link *cur_link,
173  			 struct wlan_dp_link **out_link);
174  
175  /**
176   * __dp_take_ref_and_fetch_front_link_safe - Helper macro to lock, fetch
177   * front and next link, take ref and unlock.
178   * @dp_intf: DP interface handle
179   * @dp_link: an dp_link pointer to use as a cursor
180   * @dp_link_next: dp_link pointer to nextlink
181   */
182  #define __dp_take_ref_and_fetch_front_link_safe(dp_intf, dp_link, \
183  						dp_link_next) \
184  	qdf_spin_lock_bh(&(dp_intf)->dp_link_list_lock), \
185  	dp_get_front_link_no_lock(dp_intf, &(dp_link)), \
186  	dp_get_next_link_no_lock(dp_intf, dp_link, &(dp_link_next)), \
187  	qdf_spin_unlock_bh(&(dp_intf)->dp_link_list_lock)
188  
189  /**
190   * __dp_take_ref_and_fetch_next_link_safe - Helper macro to lock, fetch next
191   * interface, take ref and unlock.
192   * @dp_intf: DP interface handle
193   * @dp_link: dp_link pointer to use as a cursor
194   * @dp_link_next: dp_link pointer to next link
195   */
196  #define __dp_take_ref_and_fetch_next_link_safe(dp_intf, dp_link, \
197  					       dp_link_next) \
198  	qdf_spin_lock_bh(&(dp_intf)->dp_link_list_lock), \
199  	dp_link = dp_link_next, \
200  	dp_get_next_link_no_lock(dp_intf, dp_link, &(dp_link_next)), \
201  	qdf_spin_unlock_bh(&(dp_intf)->dp_link_list_lock)
202  
203  /**
204   * __dp_is_link_valid - Helper macro to return true/false for valid interface.
205   * @_dp_link: an dp_link pointer to use as a cursor
206   */
207  #define __dp_is_link_valid(_dp_link) !!(_dp_link)
208  
209  /**
210   * dp_for_each_link_held_safe - Interface iterator called
211   *                                      in a delete safe manner
212   * @dp_intf: DP interface handle
213   * @dp_link: an dp_link pointer to use as a cursor
214   * @dp_link_next: dp_link pointer to the next interface
215   *
216   */
217  #define dp_for_each_link_held_safe(dp_intf, dp_link, dp_link_next) \
218  	for (__dp_take_ref_and_fetch_front_link_safe(dp_intf, dp_link, \
219  						     dp_link_next); \
220  	     __dp_is_link_valid(dp_link); \
221  	     __dp_take_ref_and_fetch_next_link_safe(dp_intf, dp_link, \
222  						    dp_link_next))
223  
224  /* MAX iteration count to wait for dp packet process to complete */
225  #define DP_TASK_MAX_WAIT_CNT  100
226  /* Milli seconds to wait when packet is getting processed */
227  #define DP_TASK_WAIT_TIME 200
228  
229  #define DP_TX_FN_CLR (1 << 0)
230  #define DP_TX_SAP_STOP (1 << 1)
231  #define DP_TX_DFS_CAC_BLOCK (1 << 2)
232  #define WLAN_DP_SUSPEND (1 << 3)
233  
234  /**
235   * dp_wait_complete_tasks: Wait for DP tasks to complete
236   * @dp_ctx: DP context pointer
237   *
238   * This function waits for dp tasks like TX to be completed
239   *
240   * Return: None
241   */
242  void dp_wait_complete_tasks(struct wlan_dp_psoc_context *dp_ctx);
243  
244  #define NUM_RX_QUEUES 5
245  
246  #define dp_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_DP, "enter")
247  #define dp_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_DP, "exit")
248  
249  /**
250   * __wlan_dp_runtime_suspend() - Runtime suspend DP handler
251   * @soc: CDP SoC handle
252   * @pdev_id: DP PDEV ID
253   *
254   * Return: QDF_STATUS
255   */
256  QDF_STATUS __wlan_dp_runtime_suspend(ol_txrx_soc_handle soc, uint8_t pdev_id);
257  
258  /**
259   * __wlan_dp_runtime_resume() - Runtime suspend DP handler
260   * @soc: CDP SoC handle
261   * @pdev_id: DP PDEV ID
262   *
263   * Return: QDF_STATUS
264   */
265  QDF_STATUS __wlan_dp_runtime_resume(ol_txrx_soc_handle soc, uint8_t pdev_id);
266  
267  /**
268   * __wlan_dp_bus_suspend() - BUS suspend DP handler
269   * @soc: CDP SoC handle
270   * @pdev_id: DP PDEV ID
271   *
272   * Return: QDF_STATUS
273   */
274  QDF_STATUS __wlan_dp_bus_suspend(ol_txrx_soc_handle soc, uint8_t pdev_id);
275  
276  /**
277   * __wlan_dp_bus_resume() - BUS resume DP handler
278   * @soc: CDP SoC handle
279   * @pdev_id: DP PDEV ID
280   *
281   * Return: QDF_STATUS
282   */
283  QDF_STATUS __wlan_dp_bus_resume(ol_txrx_soc_handle soc, uint8_t pdev_id);
284  
285  /**
286   * wlan_dp_txrx_soc_attach() - Datapath soc attach
287   * @params: SoC attach params
288   * @is_wifi3_0_target: [OUT] Pointer to update if the target is wifi3.0
289   *
290   * Return: SoC handle
291   */
292  void *wlan_dp_txrx_soc_attach(struct dp_txrx_soc_attach_params *params,
293  			      bool *is_wifi3_0_target);
294  
295  /**
296   * wlan_dp_txrx_soc_detach() - Datapath SoC detach
297   * @soc: DP SoC handle
298   *
299   * Return: None
300   */
301  void wlan_dp_txrx_soc_detach(ol_txrx_soc_handle soc);
302  
303  /**
304   * wlan_dp_txrx_attach_target() - DP target attach
305   * @soc: DP SoC handle
306   * @pdev_id: DP pdev id
307   *
308   * Return: QDF_STATUS
309   */
310  QDF_STATUS wlan_dp_txrx_attach_target(ol_txrx_soc_handle soc, uint8_t pdev_id);
311  
312  /**
313   * wlan_dp_txrx_pdev_attach() - DP pdev attach
314   * @soc: DP SoC handle
315   *
316   * Return: QDF_STATUS
317   */
318  QDF_STATUS wlan_dp_txrx_pdev_attach(ol_txrx_soc_handle soc);
319  
320  /**
321   * wlan_dp_txrx_pdev_detach() - DP pdev detach
322   * @soc: DP SoC handle
323   * @pdev_id: DP pdev id
324   * @force: indicates if force detach is to be done or not
325   *
326   * Return: QDF_STATUS
327   */
328  QDF_STATUS wlan_dp_txrx_pdev_detach(ol_txrx_soc_handle soc, uint8_t pdev_id,
329  				    int force);
330  
331  #ifdef WLAN_FEATURE_11BE_MLO
332  /**
333   * dp_link_switch_notification() - DP notifier for MLO link switch
334   * @vdev: Objmgr vdev handle
335   * @lswitch_req: Link switch request params
336   * @notify_reason: Reason of notification
337   *
338   * Return: QDF_STATUS
339   */
340  QDF_STATUS
341  dp_link_switch_notification(struct wlan_objmgr_vdev *vdev,
342  			    struct wlan_mlo_link_switch_req *lswitch_req,
343  			    enum wlan_mlo_link_switch_notify_reason notify_reason);
344  #endif
345  
346  /**
347   * dp_peer_obj_create_notification(): dp peer create handler
348   * @peer: peer which is going to created by objmgr
349   * @arg: argument for vdev create handler
350   *
351   * Register this api with objmgr to detect peer is created
352   *
353   * Return: QDF_STATUS status in case of success else return error
354   */
355  QDF_STATUS
356  dp_peer_obj_create_notification(struct wlan_objmgr_peer *peer, void *arg);
357  
358  /**
359   * dp_peer_obj_destroy_notification(): dp peer delete handler
360   * @peer: peer which is going to delete by objmgr
361   * @arg: argument for vdev delete handler
362   *
363   * Register this api with objmgr to detect peer is deleted
364   *
365   * Return: QDF_STATUS status in case of success else return error
366   */
367  QDF_STATUS
368  dp_peer_obj_destroy_notification(struct wlan_objmgr_peer *peer, void *arg);
369  
370  /**
371   * dp_vdev_obj_destroy_notification() - Free per DP vdev object
372   * @vdev: vdev context
373   * @arg: Pointer to arguments
374   *
375   * This function gets called from object manager when vdev is being
376   * deleted and delete DP vdev context.
377   *
378   * Return: QDF_STATUS_SUCCESS - in case of success
379   */
380  QDF_STATUS
381  dp_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg);
382  
383  /**
384   * dp_vdev_obj_create_notification() - Allocate per DP vdev object
385   * @vdev: vdev context
386   * @arg: Pointer to arguments
387   *
388   * This function gets called from object manager when vdev is being
389   * created and creates DP vdev context.
390   *
391   * Return: QDF_STATUS_SUCCESS - in case of success
392   */
393  QDF_STATUS
394  dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg);
395  
396  /**
397   * dp_pdev_obj_create_notification() - Allocate per DP pdev object
398   * @pdev: pdev context
399   * @arg: Pointer to arguments
400   *
401   * This function gets called from object manager when pdev is being
402   * created and creates DP pdev context.
403   *
404   * Return: QDF_STATUS_SUCCESS - in case of success
405   */
406  QDF_STATUS
407  dp_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, void *arg);
408  
409  /**
410   * dp_pdev_obj_destroy_notification() - Free per DP pdev object
411   * @pdev: pdev context
412   * @arg: Pointer to arguments
413   *
414   * This function gets called from object manager when pdev is being
415   * deleted and delete DP pdev context.
416   *
417   * Return: QDF_STATUS_SUCCESS - in case of success
418   */
419  QDF_STATUS
420  dp_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, void *arg);
421  
422  /**
423   * dp_psoc_obj_create_notification() - Function to allocate per DP
424   * psoc private object
425   * @psoc: psoc context
426   * @arg: Pointer to arguments
427   *
428   * This function gets called from object manager when psoc is being
429   * created and creates DP soc context.
430   *
431   * Return: QDF_STATUS_SUCCESS - in case of success
432   */
433  QDF_STATUS
434  dp_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc, void *arg);
435  
436  /**
437   * dp_psoc_obj_destroy_notification() - Free psoc private object
438   * @psoc: psoc context
439   * @arg: Pointer to arguments
440   *
441   * This function gets called from object manager when psoc is being
442   * deleted and delete DP soc context.
443   *
444   * Return: QDF_STATUS_SUCCESS - in case of success
445   */
446  QDF_STATUS
447  dp_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc, void *arg);
448  
449  /**
450   * dp_attach_ctx() - Api to attach dp ctx
451   * @dp_ctx : DP Context
452   *
453   * Helper function to attach dp ctx
454   *
455   * Return: None.
456   */
457  void dp_attach_ctx(struct wlan_dp_psoc_context *dp_ctx);
458  
459  /**
460   * dp_detach_ctx() - to detach dp context
461   *
462   * Helper function to detach dp context
463   *
464   * Return: None.
465   */
466  void dp_detach_ctx(void);
467  
468  /**
469   * dp_get_context() - to get dp context
470   *
471   * Helper function to get dp context
472   *
473   * Return: dp context.
474   */
475  struct wlan_dp_psoc_context *dp_get_context(void);
476  
477  /**
478   * dp_add_latency_critical_client() - Add latency critical client
479   * @vdev: pointer to vdev object (Should not be NULL)
480   * @phymode: the phymode of the connected adapter
481   *
482   * This function checks if the present connection is latency critical
483   * and adds to the latency critical clients count and informs the
484   * datapath about this connection being latency critical.
485   *
486   * Returns: None
487   */
488  static inline void
dp_add_latency_critical_client(struct wlan_objmgr_vdev * vdev,enum qca_wlan_802_11_mode phymode)489  dp_add_latency_critical_client(struct wlan_objmgr_vdev *vdev,
490  			       enum qca_wlan_802_11_mode phymode)
491  {
492  	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
493  	struct wlan_dp_intf *dp_intf;
494  
495  	if (!dp_link) {
496  		dp_err("No dp_link for objmgr vdev %pK", vdev);
497  		return;
498  	}
499  
500  	dp_intf = dp_link->dp_intf;
501  	if (!dp_intf) {
502  		dp_err("Invalid dp_intf for dp_link %pK (" QDF_MAC_ADDR_FMT ")",
503  		       dp_link, QDF_MAC_ADDR_REF(dp_link->mac_addr.bytes));
504  		return;
505  	}
506  
507  	switch (phymode) {
508  	case QCA_WLAN_802_11_MODE_11A:
509  	case QCA_WLAN_802_11_MODE_11G:
510  		qdf_atomic_inc(&dp_intf->dp_ctx->num_latency_critical_clients);
511  
512  		dp_debug("Adding latency critical connection for vdev %d",
513  			 dp_link->link_id);
514  		cdp_vdev_inform_ll_conn(cds_get_context(QDF_MODULE_ID_SOC),
515  					dp_link->link_id,
516  					CDP_VDEV_LL_CONN_ADD);
517  		break;
518  	default:
519  		break;
520  	}
521  }
522  
523  /**
524   * dp_del_latency_critical_client() - Add tlatency critical client
525   * @vdev: pointer to vdev object (Should not be NULL)
526   * @phymode: the phymode of the connected adapter
527   *
528   * This function checks if the present connection was latency critical
529   * and removes from the latency critical clients count and informs the
530   * datapath about the removed connection being latency critical.
531   *
532   * Returns: None
533   */
534  static inline void
dp_del_latency_critical_client(struct wlan_objmgr_vdev * vdev,enum qca_wlan_802_11_mode phymode)535  dp_del_latency_critical_client(struct wlan_objmgr_vdev *vdev,
536  			       enum qca_wlan_802_11_mode phymode)
537  {
538  	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
539  	struct wlan_dp_intf *dp_intf;
540  
541  	if (!dp_link) {
542  		dp_err("No dp_link for objmgr vdev %pK", vdev);
543  		return;
544  	}
545  
546  	dp_intf = dp_link->dp_intf;
547  	if (!dp_intf) {
548  		dp_err("Invalid dp_intf for dp_link %pK (" QDF_MAC_ADDR_FMT ")",
549  		       dp_link, QDF_MAC_ADDR_REF(dp_link->mac_addr.bytes));
550  		return;
551  	}
552  
553  	switch (phymode) {
554  	case QCA_WLAN_802_11_MODE_11A:
555  	case QCA_WLAN_802_11_MODE_11G:
556  		qdf_atomic_dec(&dp_intf->dp_ctx->num_latency_critical_clients);
557  
558  		dp_info("Removing latency critical connection for vdev %d",
559  			dp_link->link_id);
560  		cdp_vdev_inform_ll_conn(cds_get_context(QDF_MODULE_ID_SOC),
561  					dp_link->link_id,
562  					CDP_VDEV_LL_CONN_DEL);
563  		break;
564  	default:
565  		break;
566  	}
567  }
568  
569  /**
570   * is_dp_intf_valid() - to check DP interface valid
571   * @dp_intf: DP interface pointer
572   *
573   * API to check whether DP interface is valid
574   *
575   * Return: non zero value on interface valid
576   */
577  int is_dp_intf_valid(struct wlan_dp_intf *dp_intf);
578  
579  /**
580   * is_dp_link_valid() - check if DP link is valid
581   * @dp_link: DP link handle
582   *
583   * API to check whether DP link is valid
584   *
585   * Return: true if dp_link is valid, else false.
586   */
587  bool is_dp_link_valid(struct wlan_dp_link *dp_link);
588  
589  /**
590   * dp_send_rps_ind() - send rps indication to daemon
591   * @dp_intf: DP interface
592   *
593   * If RPS feature enabled by INI, send RPS enable indication to daemon
594   * Indication contents is the name of interface to find correct sysfs node
595   * Should send all available interfaces
596   *
597   * Return: none
598   */
599  void dp_send_rps_ind(struct wlan_dp_intf *dp_intf);
600  
601  /**
602   * dp_try_send_rps_ind() - try to send rps indication to daemon.
603   * @vdev: vdev handle
604   *
605   * If RPS flag is set in DP context then send rsp indication.
606   *
607   * Return: none
608   */
609  void dp_try_send_rps_ind(struct wlan_objmgr_vdev *vdev);
610  
611  /**
612   * dp_send_rps_disable_ind() - send rps disable indication to daemon
613   * @dp_intf: DP interface
614   *
615   * Return: none
616   */
617  void dp_send_rps_disable_ind(struct wlan_dp_intf *dp_intf);
618  
619  #ifdef QCA_CONFIG_RPS
620  /**
621   * dp_set_rps() - Enable/disable RPS for mode specified
622   * @vdev_id: vdev id which RPS needs to be enabled
623   * @enable: Set true to enable RPS in SAP mode
624   *
625   * Callback function registered with ipa
626   *
627   * Return: none
628   */
629  void dp_set_rps(uint8_t vdev_id, bool enable);
630  #else
dp_set_rps(uint8_t vdev_id,bool enable)631  static inline void dp_set_rps(uint8_t vdev_id, bool enable)
632  {
633  }
634  #endif
635  
636  /**
637   * dp_set_rx_mode_rps() - Enable/disable RPS in SAP mode
638   * @enable: Set true to enable RPS in SAP mode
639   *
640   * Callback function registered with core datapath
641   *
642   * Return: none
643   */
644  void dp_set_rx_mode_rps(bool enable);
645  
646  /**
647   * dp_set_rps_cpu_mask - set RPS CPU mask for interfaces
648   * @dp_ctx: pointer to struct dp_context
649   *
650   * Return: none
651   */
652  void dp_set_rps_cpu_mask(struct wlan_dp_psoc_context *dp_ctx);
653  
654  /**
655   * dp_try_set_rps_cpu_mask() - try to set RPS CPU mask
656   * @psoc: psoc handle
657   *
658   * If RPS flag is set in DP context then set RPS CPU mask.
659   *
660   * Return: none
661   */
662  void dp_try_set_rps_cpu_mask(struct wlan_objmgr_psoc *psoc);
663  
664  /**
665   * dp_clear_rps_cpu_mask - clear RPS CPU mask for interfaces
666   * @dp_ctx: pointer to struct dp_context
667   *
668   * Return: none
669   */
670  void dp_clear_rps_cpu_mask(struct wlan_dp_psoc_context *dp_ctx);
671  
672  /**
673   * dp_mic_init_work() - init mic error work
674   * @dp_intf: Pointer to dp interface
675   *
676   * Return: None
677   */
678  void dp_mic_init_work(struct wlan_dp_intf *dp_intf);
679  
680  /**
681   * dp_mic_deinit_work() - deinitialize mic error work
682   * @dp_intf: Pointer to dp interface
683   *
684   * Return: None
685   */
686  void dp_mic_deinit_work(struct wlan_dp_intf *dp_intf);
687  
688  /**
689   * dp_rx_mic_error_ind() - MIC error indication handler
690   * @psoc: opaque handle for UMAC psoc object
691   * @pdev_id: physical device instance id
692   * @mic_failure_info: mic failure information
693   *
694   * This function indicates the Mic failure to the supplicant
695   *
696   * Return: None
697   */
698  void
699  dp_rx_mic_error_ind(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id,
700  		    struct cdp_rx_mic_err_info *mic_failure_info);
701  /**
702   * dp_intf_get_tx_ops: get TX ops from the DP interface
703   * @psoc: pointer to psoc object
704   *
705   * Return: pointer to TX op callback
706   */
707  static inline
dp_intf_get_tx_ops(struct wlan_objmgr_psoc * psoc)708  struct wlan_dp_psoc_sb_ops *dp_intf_get_tx_ops(struct wlan_objmgr_psoc *psoc)
709  {
710  	struct wlan_dp_psoc_context *dp_ctx;
711  
712  	if (!psoc) {
713  		dp_err("psoc is null");
714  		return NULL;
715  	}
716  
717  	dp_ctx = dp_psoc_get_priv(psoc);
718  	if (!dp_ctx) {
719  		dp_err("psoc private object is null");
720  		return NULL;
721  	}
722  
723  	return &dp_ctx->sb_ops;
724  }
725  
726  /**
727   * dp_intf_get_rx_ops: get RX ops from the DP interface
728   * @psoc: pointer to psoc object
729   *
730   * Return: pointer to RX op callback
731   */
732  static inline
dp_intf_get_rx_ops(struct wlan_objmgr_psoc * psoc)733  struct wlan_dp_psoc_nb_ops *dp_intf_get_rx_ops(struct wlan_objmgr_psoc *psoc)
734  {
735  	struct wlan_dp_psoc_context *dp_ctx;
736  
737  	if (!psoc) {
738  		dp_err("psoc is null");
739  		return NULL;
740  	}
741  
742  	dp_ctx = dp_psoc_get_priv(psoc);
743  	if (!dp_ctx) {
744  		dp_err("psoc private object is null");
745  		return NULL;
746  	}
747  
748  	return &dp_ctx->nb_ops;
749  }
750  
751  /**
752   * dp_get_arp_request_ctx: get ARP req context from the DP context
753   * @psoc: pointer to psoc object
754   *
755   * Return: pointer to ARP request ctx.
756   */
757  static inline
dp_get_arp_request_ctx(struct wlan_objmgr_psoc * psoc)758  void *dp_get_arp_request_ctx(struct wlan_objmgr_psoc *psoc)
759  {
760  	struct wlan_dp_psoc_context *dp_ctx;
761  
762  	dp_ctx = dp_psoc_get_priv(psoc);
763  	if (!dp_ctx) {
764  		dp_err("psoc private object is null");
765  		return NULL;
766  	}
767  	return dp_ctx->sb_ops.arp_request_ctx;
768  }
769  
770  /**
771   * dp_get_arp_stats_event_handler() - callback api to update the
772   * stats received from FW
773   * @psoc : psoc handle
774   * @rsp: pointer to data received from FW.
775   *
776   * This is called when wlan driver received response event for
777   * get arp stats to firmware.
778   *
779   * Return: None
780   */
781  QDF_STATUS dp_get_arp_stats_event_handler(struct wlan_objmgr_psoc *psoc,
782  					  struct dp_rsp_stats *rsp);
783  
784  /**
785   * dp_trace_init() - Initialize DP trace
786   * @psoc: psoc handle
787   *
788   * Return: None
789   */
790  
791  void dp_trace_init(struct wlan_objmgr_psoc *psoc);
792  
793  /**
794   * dp_set_dump_dp_trace() - set DP trace dump level
795   * @cmd_type : command type
796   * @count: count
797   *
798   * Return: None
799   */
800  void dp_set_dump_dp_trace(uint16_t cmd_type, uint16_t count);
801  
802  #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH
803  #define DP_BUS_BW_CFG(bus_bw_cfg)	bus_bw_cfg
804  #define DP_BUS_BW_GET_RX_LVL(dp_ctx)	(dp_ctx)->cur_rx_level
805  static inline bool
dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context * dp_ctx)806  dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context *dp_ctx)
807  {
808  	return (qdf_atomic_read(&dp_ctx->low_tput_gro_enable)) ? true : false;
809  }
810  #else
811  #define DP_BUS_BW_CFG(bus_bw_cfg)	0
812  #define DP_BUS_BW_GET_RX_LVL(dp_ctx)	0
813  static inline bool
dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context * dp_ctx)814  dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context *dp_ctx)
815  {
816  	return false;
817  }
818  #endif
819  
820  #define DP_DATA_STALL_ENABLE      BIT(0)
821  #define DP_HOST_STA_TX_TIMEOUT    BIT(16)
822  #define DP_HOST_SAP_TX_TIMEOUT    BIT(17)
823  #define DP_HOST_NUD_FAILURE       BIT(18)
824  #define DP_TIMEOUT_WLM_MODE       BIT(31)
825  #define FW_DATA_STALL_EVT_MASK     0x8000FFFF
826  
827  /**
828   * dp_is_data_stall_event_enabled() - Check if data stall detection is enabled
829   * @evt: Data stall event to be checked
830   *
831   * Return: True if the data stall event is enabled
832   */
833  bool dp_is_data_stall_event_enabled(uint32_t evt);
834  
835  /*
836   * dp_get_net_dev_stats(): Get netdev stats
837   * @dp_intf: DP interface handle
838   * @stats: To hold netdev stats
839   *
840   * Return: None
841   */
842  static inline void
dp_get_net_dev_stats(struct wlan_dp_intf * dp_intf,qdf_net_dev_stats * stats)843  dp_get_net_dev_stats(struct wlan_dp_intf *dp_intf, qdf_net_dev_stats *stats)
844  {
845  	qdf_mem_copy(stats, &dp_intf->stats, sizeof(dp_intf->stats));
846  }
847  
848  /*
849   * dp_clear_net_dev_stats(): Clear netdev stats
850   * @dp_intf: DP interface handle
851   *
852   * Return: None
853   */
854  static inline
dp_clear_net_dev_stats(struct wlan_dp_intf * dp_intf)855  void dp_clear_net_dev_stats(struct wlan_dp_intf *dp_intf)
856  {
857  	qdf_mem_set(&dp_intf->stats, sizeof(dp_intf->stats), 0);
858  }
859  
860  #ifdef FEATURE_DIRECT_LINK
861  /**
862   * dp_direct_link_init() - Initializes Direct Link datapath
863   * @dp_ctx: DP private context
864   *
865   * Return: QDF status
866   */
867  QDF_STATUS dp_direct_link_init(struct wlan_dp_psoc_context *dp_ctx);
868  
869  /**
870   * dp_direct_link_deinit() - De-initializes Direct Link datapath
871   * @dp_ctx: DP private context
872   * @is_ssr: true if SSR is in progress else false
873   *
874   * Return: None
875   */
876  void dp_direct_link_deinit(struct wlan_dp_psoc_context *dp_ctx, bool is_ssr);
877  
878  /**
879   * dp_config_direct_link: Set direct link config of vdev
880   * @dp_intf: DP interface handle
881   * @config_direct_link: Flag to enable direct link path
882   * @enable_low_latency: Flag to enable low link latency
883   *
884   * Return: QDF Status
885   */
886  QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf,
887  				 bool config_direct_link,
888  				 bool enable_low_latency);
889  #else
890  static inline
dp_direct_link_init(struct wlan_dp_psoc_context * dp_ctx)891  QDF_STATUS dp_direct_link_init(struct wlan_dp_psoc_context *dp_ctx)
892  {
893  	return QDF_STATUS_SUCCESS;
894  }
895  
896  static inline
dp_direct_link_deinit(struct wlan_dp_psoc_context * dp_ctx,bool is_ssr)897  void dp_direct_link_deinit(struct wlan_dp_psoc_context *dp_ctx, bool is_ssr)
898  {
899  }
900  
901  static inline
dp_config_direct_link(struct wlan_dp_intf * dp_intf,bool config_direct_link,bool enable_low_latency)902  QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf,
903  				 bool config_direct_link,
904  				 bool enable_low_latency)
905  {
906  	return QDF_STATUS_SUCCESS;
907  }
908  #endif
909  #ifdef WLAN_FEATURE_11BE
910  /**
911   * __wlan_dp_update_peer_map_unmap_version() - update peer map unmap version
912   * @version: Peer map unmap version pointer to be updated
913   *
914   * Return: None
915   */
916  static inline void
__wlan_dp_update_peer_map_unmap_version(uint8_t * version)917  __wlan_dp_update_peer_map_unmap_version(uint8_t *version)
918  {
919  	/* 0x32 -> host supports HTT peer map v3 format and peer unmap v2 format. */
920  	*version = 0x32;
921  }
922  #else
923  static inline void
__wlan_dp_update_peer_map_unmap_version(uint8_t * version)924  __wlan_dp_update_peer_map_unmap_version(uint8_t *version)
925  {
926  }
927  #endif
928  
929  #ifdef WLAN_DP_PROFILE_SUPPORT
930  /**
931   * wlan_dp_get_profile_info() - Get DP memory profile info
932   *
933   * Return: None
934   */
935  struct wlan_dp_memory_profile_info *wlan_dp_get_profile_info(void);
936  
937  /**
938   * wlan_dp_select_profile_cfg() - Select DP profile configuration
939   * @psoc: psoc context
940   *
941   * Return: QDF_STATUS
942   */
943  QDF_STATUS wlan_dp_select_profile_cfg(struct wlan_objmgr_psoc *psoc);
944  
945  /**
946   * wlan_dp_soc_cfg_sync_profile() - Sync DP soc cfg items with profile
947   * @cdp_soc: cdp soc context
948   *
949   * Return: None
950   */
951  void wlan_dp_soc_cfg_sync_profile(struct cdp_soc_t *cdp_soc);
952  
953  /**
954   * wlan_dp_pdev_cfg_sync_profile() - Sync DP pdev cfg items with profile
955   * @cdp_soc: cdp soc context
956   * @pdev_id: pdev id
957   *
958   * Return: QDF_STATUS
959   */
960  void wlan_dp_pdev_cfg_sync_profile(struct cdp_soc_t *cdp_soc, uint8_t pdev_id);
961  #else
962  
963  static inline
wlan_dp_select_profile_cfg(struct wlan_objmgr_psoc * psoc)964  QDF_STATUS wlan_dp_select_profile_cfg(struct wlan_objmgr_psoc *psoc)
965  {
966  	return QDF_STATUS_E_NOSUPPORT;
967  }
968  #endif
969  
970  /**
971   * wlan_dp_link_cdp_vdev_delete_notification() - CDP vdev delete notification
972   * @context: osif_vdev handle
973   *
974   * Return: None
975   */
976  void wlan_dp_link_cdp_vdev_delete_notification(void *context);
977  
978  /* DP CFG APIs - START */
979  
980  #ifdef WLAN_SUPPORT_RX_FISA
981  /**
982   * wlan_dp_cfg_is_rx_fisa_enabled() - Get Rx FISA enabled flag
983   * @dp_cfg: soc configuration context
984   *
985   * Return: true if enabled, false otherwise.
986   */
987  static inline
wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg * dp_cfg)988  bool wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg *dp_cfg)
989  {
990  	return dp_cfg->is_rx_fisa_enabled;
991  }
992  
993  /**
994   * wlan_dp_cfg_is_rx_fisa_lru_del_enabled() - Get Rx FISA LRU del enabled flag
995   * @dp_cfg: soc configuration context
996   *
997   * Return: true if enabled, false otherwise.
998   */
999  static inline
wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg * dp_cfg)1000  bool wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg *dp_cfg)
1001  {
1002  	return dp_cfg->is_rx_fisa_lru_del_enabled;
1003  }
1004  #else
1005  static inline
wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg * dp_cfg)1006  bool wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg *dp_cfg)
1007  {
1008  	return false;
1009  }
1010  
1011  static inline
wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg * dp_cfg)1012  bool wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg *dp_cfg)
1013  {
1014  	return false;
1015  }
1016  #endif
1017  
1018  
1019  /* DP CFG APIs - END */
1020  /**
1021   * __wlan_dp_update_def_link() - update DP interface default link
1022   * @psoc: psoc handle
1023   * @intf_mac: interface MAC address
1024   * @vdev: objmgr vdev handle to set the def_link in dp_intf
1025   *
1026   */
1027  void __wlan_dp_update_def_link(struct wlan_objmgr_psoc *psoc,
1028  			       struct qdf_mac_addr *intf_mac,
1029  			       struct wlan_objmgr_vdev *vdev);
1030  #endif
1031