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