1 /*
2 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2023 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_TX_MON_2_0_H_
19 #define _DP_TX_MON_2_0_H_
20
21 #include <qdf_nbuf_frag.h>
22 #include <hal_be_api_mon.h>
23
24 struct dp_mon_desc;
25
26 /**
27 * struct dp_tx_mon_desc_list - structure to store descriptor linked list
28 * @desc_list: descriptor list
29 * @tail: descriptor list tail
30 * @tx_mon_reap_cnt: tx monitor reap count
31 */
32 struct dp_tx_mon_desc_list {
33 union dp_mon_desc_list_elem_t *desc_list;
34 union dp_mon_desc_list_elem_t *tail;
35 uint32_t tx_mon_reap_cnt;
36 };
37
38 /**
39 * dp_tx_mon_buf_desc_pool_deinit() - deinit tx monitor descriptor pool
40 * @soc: dp soc handle
41 *
42 */
43 void
44 dp_tx_mon_buf_desc_pool_deinit(struct dp_soc *soc);
45
46 /**
47 * dp_tx_mon_buf_desc_pool_init() - init tx monitor descriptor pool
48 * @soc: dp soc handle
49 *
50 * Return: QDF_STATUS_SUCCESS: Success
51 * QDF_STATUS_E_FAILURE: Error
52 */
53 QDF_STATUS
54 dp_tx_mon_buf_desc_pool_init(struct dp_soc *soc);
55
56 /**
57 * dp_tx_mon_buf_desc_pool_free() - free tx monitor descriptor pool
58 * @soc: dp soc handle
59 *
60 */
61 void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc);
62
63 /**
64 * dp_tx_mon_update_end_reason() - API to update end reason
65 *
66 * @mon_pdev: DP_MON_PDEV handle
67 * @ppdu_id: ppdu_id
68 * @end_reason: monitor destination descriptor end reason
69 *
70 * Return: void
71 */
72 void dp_tx_mon_update_end_reason(struct dp_mon_pdev *mon_pdev,
73 int ppdu_id, int end_reason);
74
75 /**
76 * dp_tx_mon_status_free_packet_buf() - API to free packet buffer
77 * @pdev: pdev Handle
78 * @status_frag: status frag
79 * @end_offset: status fragment end offset
80 * @mon_desc_list_ref: tx monitor descriptor list reference
81 *
82 * Return: void
83 */
84 void
85 dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev,
86 qdf_frag_t status_frag,
87 uint32_t end_offset,
88 struct dp_tx_mon_desc_list *mon_desc_list_ref);
89
90 #if defined(WLAN_TX_PKT_CAPTURE_ENH_BE) && defined(WLAN_PKT_CAPTURE_TX_2_0) && \
91 defined(BE_PKTLOG_SUPPORT)
92 /**
93 * dp_tx_process_pktlog_be() - process pktlog
94 * @soc: dp soc handle
95 * @pdev: dp pdev handle
96 * @status_frag: frag pointer which needs to be added to nbuf
97 * @end_offset: Offset in frag to be added to nbuf_frags
98 *
99 * Return:
100 * * 0 - OK to runtime suspend the device
101 * * -EINVAL - invalid argument
102 * * -ENOMEM - out of memory
103 */
104 QDF_STATUS
105 dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
106 void *status_frag, uint32_t end_offset);
107 #else
108 static inline QDF_STATUS
dp_tx_process_pktlog_be(struct dp_soc * soc,struct dp_pdev * pdev,void * status_frag,uint32_t end_offset)109 dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
110 void *status_frag, uint32_t end_offset)
111 {
112 return QDF_STATUS_SUCCESS;
113 }
114 #endif
115
116 /**
117 * dp_tx_mon_process_status_tlv() - API to processed TLV
118 * invoked from interrupt handler
119 *
120 * @soc: DP_SOC handle
121 * @pdev: DP_PDEV handle
122 * @mon_ring_desc: descriptor status info
123 * @status_frag: status buffer frag address
124 * @end_offset: end offset of buffer that has valid buffer
125 * @mon_desc_list_ref: tx monitor descriptor list reference
126 *
127 * Return: QDF_STATUS
128 */
129 QDF_STATUS
130 dp_tx_mon_process_status_tlv(struct dp_soc *soc,
131 struct dp_pdev *pdev,
132 struct hal_mon_desc *mon_ring_desc,
133 qdf_frag_t status_frag,
134 uint32_t end_offset,
135 struct dp_tx_mon_desc_list *mon_desc_list_ref);
136
137 /**
138 * dp_tx_mon_process_2_0() - tx monitor interrupt process
139 * @soc: dp soc handle
140 * @int_ctx: interrupt context
141 * @mac_id: mac id
142 * @quota: quota to process
143 *
144 */
145 uint32_t
146 dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
147 uint32_t mac_id, uint32_t quota);
148
149 /**
150 * dp_tx_mon_print_ring_stat_2_0() - Print monitor ring stats
151 * @pdev: dp pdev handle
152 *
153 */
154 void
155 dp_tx_mon_print_ring_stat_2_0(struct dp_pdev *pdev);
156
157 /* The maximum buffer length allocated for radiotap for monitor status buffer */
158 #define MAX_MONITOR_HEADER (512)
159 #define MAX_DUMMY_FRM_BODY (128)
160
161 #define MAX_STATUS_BUFFER_IN_PPDU (128)
162 #define TXMON_NO_BUFFER_SZ (64)
163
164 #define DP_BA_ACK_FRAME_SIZE (sizeof(struct ieee80211_ctlframe_addr2) + 36)
165 #define DP_ACK_FRAME_SIZE (sizeof(struct ieee80211_frame_min_one))
166 #define DP_CTS_FRAME_SIZE (sizeof(struct ieee80211_frame_min_one))
167 #define DP_ACKNOACK_FRAME_SIZE (sizeof(struct ieee80211_frame) + 16)
168
169 #define DP_IEEE80211_BAR_CTL_TID_S 12
170 #define DP_IEEE80211_BAR_CTL_TID_M 0xf
171 #define DP_IEEE80211_BAR_CTL_POLICY_S 0
172 #define DP_IEEE80211_BAR_CTL_POLICY_M 0x1
173 #define DP_IEEE80211_BA_S_SEQ_S 4
174 #define DP_IEEE80211_BAR_CTL_COMBA 0x0004
175
176 #define TXMON_PPDU(ppdu_info, field) ppdu_info->field
177 #define TXMON_PPDU_USR(ppdu_info, user_index, field) \
178 ppdu_info->hal_txmon.rx_user_status[user_index].field
179 #define TXMON_PPDU_COM(ppdu_info, field) ppdu_info->hal_txmon.rx_status.field
180 #define TXMON_PPDU_HAL(ppdu_info, field) ppdu_info->hal_txmon.field
181
182 #define HE_DATA_CNT 6
183
184 #define INITIATOR_WINDOW 0
185 #define RESPONSE_WINDOW 1
186
187 #ifdef WLAN_PKT_CAPTURE_TX_2_0
188 /**
189 * enum bf_type - tx monitor supported Beamformed type
190 * @NO_BF:
191 * @LEGACY_BF:
192 * @SU_BF:
193 * @MU_BF:
194 */
195 enum bf_type {
196 NO_BF = 0,
197 LEGACY_BF,
198 SU_BF,
199 MU_BF
200 };
201
202 /**
203 * enum dot11b_preamble_type - tx monitor supported 11b preamble type
204 * @SHORT_PREAMBLE:
205 * @LONG_PREAMBLE:
206 */
207 enum dot11b_preamble_type {
208 SHORT_PREAMBLE = 0,
209 LONG_PREAMBLE,
210 };
211
212 /**
213 * enum bw_type - tx monitor supported bandwidth type
214 * @TXMON_BW_20_MHZ:
215 * @TXMON_BW_40_MHZ:
216 * @TXMON_BW_80_MHZ:
217 * @TXMON_BW_160_MHZ:
218 * @TXMON_BW_240_MHZ:
219 * @TXMON_BW_320_MHZ:
220 */
221 enum bw_type {
222 TXMON_BW_20_MHZ = 0,
223 TXMON_BW_40_MHZ,
224 TXMON_BW_80_MHZ,
225 TXMON_BW_160_MHZ,
226 TXMON_BW_240_MHZ,
227 TXMON_BW_320_MHZ
228 };
229
230 /**
231 * enum ppdu_start_reason - tx monitor supported PPDU start reason type
232 * @TXMON_FES_PROTECTION_FRAME:
233 * @TXMON_FES_AFTER_PROTECTION:
234 * @TXMON_FES_ONLY:
235 * @TXMON_RESPONSE_FRAME:
236 * @TXMON_TRIG_RESPONSE_FRAME:
237 * @TXMON_DYNAMIC_PROTECTION_FES_ONLY:
238 */
239 enum ppdu_start_reason {
240 TXMON_FES_PROTECTION_FRAME,
241 TXMON_FES_AFTER_PROTECTION,
242 TXMON_FES_ONLY,
243 TXMON_RESPONSE_FRAME,
244 TXMON_TRIG_RESPONSE_FRAME,
245 TXMON_DYNAMIC_PROTECTION_FES_ONLY
246 };
247
248 /**
249 * enum guard_interval - tx monitor supported Guard interval type
250 * @TXMON_GI_0_8_US:
251 * @TXMON_GI_0_4_US:
252 * @TXMON_GI_1_6_US:
253 * @TXMON_GI_3_2_US:
254 */
255 enum guard_interval {
256 TXMON_GI_0_8_US = 0,
257 TXMON_GI_0_4_US,
258 TXMON_GI_1_6_US,
259 TXMON_GI_3_2_US
260 };
261
262 /**
263 * enum RU_size_start - tx monitor supported RU size start type
264 * @TXMON_RU_26:
265 * @TXMON_RU_52:
266 * @TXMON_RU_106:
267 * @TXMON_RU_242:
268 * @TXMON_RU_484:
269 * @TXMON_RU_996:
270 * @TXMON_RU_1992:
271 * @TXMON_RU_FULLBW_240:
272 * @TXMON_RU_FULLBW_320:
273 * @TXMON_RU_MULTI_LARGE:
274 * @TXMON_RU_78:
275 * @TXMON_RU_132:
276 */
277 enum RU_size_start {
278 TXMON_RU_26 = 0,
279 TXMON_RU_52,
280 TXMON_RU_106,
281 TXMON_RU_242,
282 TXMON_RU_484,
283 TXMON_RU_996,
284 TXMON_RU_1992,
285 TXMON_RU_FULLBW_240,
286 TXMON_RU_FULLBW_320,
287 TXMON_RU_MULTI_LARGE,
288 TXMON_RU_78,
289 TXMON_RU_132
290 };
291
292 /**
293 * enum response_type_expected - expected response type
294 * @TXMON_RESP_NO_RESP:
295 * @TXMON_RESP_ACK:
296 * @TXMON_RESP_BA_64_BITMAP:
297 * @TXMON_RESP_BA_256:
298 * @TXMON_RESP_ACTIONNOACK:
299 * @TXMON_RESP_ACK_BA:
300 * @TXMON_RESP_CTS:
301 * @TXMON_RESP_ACK_DATA:
302 * @TXMON_RESP_NDP_ACK:
303 * @TXMON_RESP_NDP_MODIFIED_ACK:
304 * @TXMON_RESP_NDP_BA:
305 * @TXMON_RESP_NDP_CTS:
306 * @TXMON_RESP_NDP_ACK_OR_NDP_MODIFIED_ACK:
307 * @TXMON_RESP_UL_MU_BA:
308 * @TXMON_RESP_UL_MU_BA_AND_DATA:
309 * @TXMON_RESP_UL_MU_CBF:
310 * @TXMON_RESP_UL_MU_FRAMES:
311 * @TXMON_RESP_ANY_RESP_TO_DEVICE:
312 * @TXMON_RESP_ANY_RESP_ACCEPTED:
313 * @TXMON_RESP_FRAMELESS_PHYRX_RESP_ACCEPTED:
314 * @TXMON_RESP_RANGING_NDP_AND_LMR:
315 * @TXMON_RESP_BA_512:
316 * @TXMON_RESP_BA_1024:
317 * @TXMON_RESP_UL_MU_RANGING_CTS2S:
318 * @TXMON_RESP_UL_MU_RANGING_NDP:
319 * @TXMON_RESP_UL_MU_RANGING_LMR:
320 */
321 enum response_type_expected {
322 TXMON_RESP_NO_RESP = 0,
323 TXMON_RESP_ACK,
324 TXMON_RESP_BA_64_BITMAP,
325 TXMON_RESP_BA_256,
326 TXMON_RESP_ACTIONNOACK,
327 TXMON_RESP_ACK_BA,
328 TXMON_RESP_CTS,
329 TXMON_RESP_ACK_DATA,
330 TXMON_RESP_NDP_ACK,
331 TXMON_RESP_NDP_MODIFIED_ACK,
332 TXMON_RESP_NDP_BA,
333 TXMON_RESP_NDP_CTS,
334 TXMON_RESP_NDP_ACK_OR_NDP_MODIFIED_ACK,
335 TXMON_RESP_UL_MU_BA,
336 TXMON_RESP_UL_MU_BA_AND_DATA,
337 TXMON_RESP_UL_MU_CBF,
338 TXMON_RESP_UL_MU_FRAMES,
339 TXMON_RESP_ANY_RESP_TO_DEVICE,
340 TXMON_RESP_ANY_RESP_ACCEPTED,
341 TXMON_RESP_FRAMELESS_PHYRX_RESP_ACCEPTED,
342 TXMON_RESP_RANGING_NDP_AND_LMR,
343 TXMON_RESP_BA_512,
344 TXMON_RESP_BA_1024,
345 TXMON_RESP_UL_MU_RANGING_CTS2S,
346 TXMON_RESP_UL_MU_RANGING_NDP,
347 TXMON_RESP_UL_MU_RANGING_LMR
348 };
349
350 /**
351 * enum resposne_to_respone - tx monitor supported response to response type
352 * @TXMON_RESP_TO_RESP_NONE:
353 * @TXMON_RESP_TO_RESP_SU_BA:
354 * @TXMON_RESP_TO_RESP_MU_BA:
355 * @TXMON_RESP_TO_RESP_CMD:
356 */
357 enum resposne_to_respone {
358 TXMON_RESP_TO_RESP_NONE = 0,
359 TXMON_RESP_TO_RESP_SU_BA,
360 TXMON_RESP_TO_RESP_MU_BA,
361 TXMON_RESP_TO_RESP_CMD
362 };
363
364 /**
365 * enum medium_protection_type - tx monitor supported protection type
366 * @TXMON_MEDIUM_NO_PROTECTION:
367 * @TXMON_MEDIUM_RTS_LEGACY:
368 * @TXMON_MEDIUM_RTS_11AC_STATIC_BW:
369 * @TXMON_MEDIUM_RTS_11AC_DYNAMIC_BW:
370 * @TXMON_MEDIUM_CTS2SELF:
371 * @TXMON_MEDIUM_QOS_NULL_NO_ACK_3ADDR:
372 * @TXMON_MEDIUM_QOS_NULL_NO_ACK_4ADDR:
373 */
374 enum medium_protection_type {
375 TXMON_MEDIUM_NO_PROTECTION,
376 TXMON_MEDIUM_RTS_LEGACY,
377 TXMON_MEDIUM_RTS_11AC_STATIC_BW,
378 TXMON_MEDIUM_RTS_11AC_DYNAMIC_BW,
379 TXMON_MEDIUM_CTS2SELF,
380 TXMON_MEDIUM_QOS_NULL_NO_ACK_3ADDR,
381 TXMON_MEDIUM_QOS_NULL_NO_ACK_4ADDR,
382 };
383
384 /**
385 * enum ndp_frame - tx monitor supported ndp frame type
386 * @TXMON_NO_NDP_TRANSMISSION:
387 * @TXMON_BEAMFORMING_NDP:
388 * @TXMON_HE_RANGING_NDP:
389 * @TXMON_HE_FEEDBACK_NDP:
390 */
391 enum ndp_frame {
392 TXMON_NO_NDP_TRANSMISSION,
393 TXMON_BEAMFORMING_NDP,
394 TXMON_HE_RANGING_NDP,
395 TXMON_HE_FEEDBACK_NDP,
396 };
397
398 /**
399 * enum tx_ppdu_info_type - tx monitor supported ppdu type
400 * @TX_PROT_PPDU_INFO:
401 * @TX_DATA_PPDU_INFO:
402 */
403 enum tx_ppdu_info_type {
404 TX_PROT_PPDU_INFO,
405 TX_DATA_PPDU_INFO,
406 };
407
408 /**
409 * struct dp_tx_ppdu_info - structure to store tx ppdu info
410 * @ppdu_id: current ppdu info ppdu id
411 * @frame_type: ppdu info frame type
412 * @cur_usr_idx: current user index of ppdu info
413 * @ulist: union of linked lists
414 * @tx_ppdu_info_dlist_elem: support adding to double linked list
415 * @tx_ppdu_info_slist_elem: support adding to single linked list
416 * @hal_txmon: hal tx monitor info for that ppdu
417 */
418 struct dp_tx_ppdu_info {
419 uint32_t ppdu_id;
420 uint8_t frame_type;
421 uint8_t cur_usr_idx;
422
423 union {
424 TAILQ_ENTRY(dp_tx_ppdu_info) tx_ppdu_info_dlist_elem;
425 STAILQ_ENTRY(dp_tx_ppdu_info) tx_ppdu_info_slist_elem;
426 } ulist;
427
428 #define tx_ppdu_info_list_elem ulist.tx_ppdu_info_dlist_elem
429 #define tx_ppdu_info_queue_elem ulist.tx_ppdu_info_slist_elem
430
431 struct hal_tx_ppdu_info hal_txmon;
432 };
433
434 /**
435 * struct dp_tx_monitor_drop_stats - structure to store tx monitor drop
436 * statistics
437 * @ppdu_drop_cnt: ppdu drop counter
438 * @mpdu_drop_cnt: mpdu drop counter
439 * @tlv_drop_cnt: tlv drop counter
440 * @pkt_buf_recv: tx monitor packet buffer received
441 * @pkt_buf_free: tx monitor packet buffer free
442 * @pkt_buf_processed: tx monitor packet buffer processed
443 * @pkt_buf_to_stack: tx monitor packet buffer send to stack
444 * @status_buf_recv: tx monitor status buffer received
445 * @status_buf_free: tx monitor status buffer free
446 * @totat_tx_mon_replenish_cnt: tx monitor replenish count
447 * @total_tx_mon_reap_cnt: tx monitor reap count
448 * @tx_mon_stuck: tx monitor stuck count
449 * @total_tx_mon_stuck: tx monitor stuck count
450 * @ppdu_info_drop_th: count ppdu info been dropped due threshold reached
451 * @ppdu_info_drop_flush: count ppdu info been dropped due to flush detected
452 * @ppdu_info_drop_trunc: count ppdu info been dropped due to truncated
453 */
454 struct dp_tx_monitor_drop_stats {
455 uint64_t ppdu_drop_cnt;
456 uint64_t mpdu_drop_cnt;
457 uint64_t tlv_drop_cnt;
458
459 uint64_t pkt_buf_recv;
460 uint64_t pkt_buf_free;
461 uint64_t pkt_buf_processed;
462 uint64_t pkt_buf_to_stack;
463
464 uint64_t status_buf_recv;
465 uint64_t status_buf_free;
466
467 uint64_t totat_tx_mon_replenish_cnt;
468 uint64_t total_tx_mon_reap_cnt;
469 uint8_t tx_mon_stuck;
470 uint32_t total_tx_mon_stuck;
471
472 uint64_t ppdu_info_drop_th;
473 uint64_t ppdu_info_drop_flush;
474 uint64_t ppdu_info_drop_trunc;
475 };
476
477 /**
478 * enum dp_tx_monitor_mode - tx monitor supported mode
479 * @TX_MON_BE_DISABLE: tx monitor disable
480 * @TX_MON_BE_FULL_CAPTURE: tx monitor mode to capture full packet
481 * @TX_MON_BE_PEER_FILTER: tx monitor mode to capture peer filter
482 */
483 enum dp_tx_monitor_mode {
484 TX_MON_BE_DISABLE,
485 TX_MON_BE_FULL_CAPTURE,
486 TX_MON_BE_PEER_FILTER,
487 };
488
489 /**
490 * enum dp_tx_monitor_framework_mode - tx monitor framework mode
491 * @TX_MON_BE_FRM_WRK_DISABLE: tx monitor frame work disable
492 * @TX_MON_BE_FRM_WRK_FULL_CAPTURE: tx monitor frame work full capture
493 * @TX_MON_BE_FRM_WRK_128B_CAPTURE: tx monitor frame work 128B capture
494 */
495 enum dp_tx_monitor_framework_mode {
496 TX_MON_BE_FRM_WRK_DISABLE,
497 TX_MON_BE_FRM_WRK_FULL_CAPTURE,
498 TX_MON_BE_FRM_WRK_128B_CAPTURE,
499 };
500
501 #define TX_TAILQ_INSERT_TAIL(pdev, tx_ppdu_info) \
502 do { \
503 STAILQ_INSERT_TAIL(&pdev->tx_ppdu_info_list, \
504 tx_ppdu_info, tx_ppdu_info_list_elem);\
505 pdev->tx_ppdu_info_queue_depth++; \
506 } while (0)
507
508 #define TX_TAILQ_REMOVE(pdev, tx_ppdu_info) \
509 do { \
510 TAILQ_REMOVE(&pdev->tx_ppdu_info_list, tx_ppdu_info, \
511 tx_ppdu_info_list_elem); \
512 pdev->tx_ppdu_info_queue_depth--; \
513 } while (0)
514
515 #define TX_TAILQ_FIRST(pdev) TAILQ_FIRST(&pdev->tx_ppdu_info_list)
516
517 #define TX_TAILQ_FOREACH_SAFE(pdev, tx_ppdu_info) \
518 do { \
519 struct dp_tx_ppdu_info *tx_ppdu_info_next = NULL; \
520 TAILQ_FOREACH_SAFE(tx_ppdu_info, \
521 &pdev->tx_ppdu_info_list, \
522 tx_ppdu_info_list_elem, \
523 tx_ppdu_info_next); \
524 } while (0)
525
526 #ifdef WLAN_TX_MON_CORE_DEBUG
527 /**
528 * struct dp_pdev_tx_monitor_be - info to store tx capture information in pdev
529 * @be_ppdu_id: current ppdu id
530 * @mode: tx monitor core framework current mode
531 * @stats: tx monitor drop stats for that mac
532 *
533 */
534 struct dp_pdev_tx_monitor_be {
535 uint32_t be_ppdu_id;
536 uint32_t mode;
537 struct dp_tx_monitor_drop_stats stats;
538 };
539
540 /**
541 * struct dp_peer_tx_capture_be - Tx monitor peer structure
542 *
543 * This is a dummy structure
544 */
545 struct dp_peer_tx_capture_be {
546 };
547 #endif
548
549 #ifdef WLAN_TX_PKT_CAPTURE_ENH_BE
550 /**
551 * struct dp_txmon_frag_vec - a contiguous range of physical memory address
552 * @frag_buf: frag buffer address
553 * @end_offset: byte offset within the frag buffer where valid data resides
554 */
555 struct dp_txmon_frag_vec {
556 qdf_frag_t frag_buf;
557 uint32_t end_offset;
558 };
559
560 /*
561 * NB: intentionally not using kernel-doc comment because the kernel-doc
562 * script does not handle the STAILQ_HEAD macro
563 * struct dp_pdev_tx_monitor_be - info to store tx capture information in pdev
564 * @be_ppdu_id: current ppdu id
565 * @be_end_reason_bitmap: current end reason bitmap
566 * @mode: tx monitor current mode
567 * @tx_mon_list_lock: spinlock protection to list
568 * @post_ppdu_workqueue: tx monitor workqueue representation
569 * @post_ppdu_work: tx monitor post ppdu work
570 * @tx_ppdu_info_list_depth: list depth counter
571 * @tx_ppdu_info_list: ppdu info list to hold ppdu
572 * @defer_ppdu_info_list_depth: defer ppdu list depth counter
573 * @defer_ppdu_info_list: defer ppdu info list to hold defer ppdu
574 * @stats: tx monitor drop stats for that mac
575 * @tx_prot_ppdu_info: tx monitor protection ppdu info
576 * @tx_data_ppdu_info: tx monitor data ppdu info
577 * @last_prot_ppdu_info: last tx monitor protection ppdu info
578 * @last_data_ppdu_info: last tx monitor data ppdu info
579 * @prot_status_info: protection status info
580 * @data_status_info: data status info
581 * @last_tsft: last received tsft
582 * @last_ppdu_timestamp: last received ppdu_timestamp
583 * @last_frag_q_idx: last index of frag buffer
584 * @cur_frag_q_idx: current index of frag buffer
585 * @status_frag_queue: array of status frag queue to hold 64 status buffer
586 */
587 struct dp_pdev_tx_monitor_be {
588 uint32_t be_ppdu_id;
589 uint32_t be_end_reason_bitmap;
590 uint32_t mode;
591
592 qdf_spinlock_t tx_mon_list_lock;
593
594 qdf_work_t post_ppdu_work;
595 qdf_workqueue_t *post_ppdu_workqueue;
596
597 uint32_t tx_ppdu_info_list_depth;
598
599 STAILQ_HEAD(, dp_tx_ppdu_info) tx_ppdu_info_queue;
600
601 uint32_t defer_ppdu_info_list_depth;
602
603 STAILQ_HEAD(, dp_tx_ppdu_info) defer_tx_ppdu_info_queue;
604
605 struct dp_tx_monitor_drop_stats stats;
606
607 struct dp_tx_ppdu_info *tx_prot_ppdu_info;
608 struct dp_tx_ppdu_info *tx_data_ppdu_info;
609
610 struct dp_tx_ppdu_info *last_prot_ppdu_info;
611 struct dp_tx_ppdu_info *last_data_ppdu_info;
612
613 struct hal_tx_status_info prot_status_info;
614 struct hal_tx_status_info data_status_info;
615
616 uint64_t last_tsft;
617 uint32_t last_ppdu_timestamp;
618
619 uint8_t last_frag_q_idx;
620 uint8_t cur_frag_q_idx;
621 struct dp_txmon_frag_vec frag_q_vec[MAX_STATUS_BUFFER_IN_PPDU];
622 };
623
624 /**
625 * struct dp_peer_tx_capture_be - Tx monitor peer structure
626 *
627 * need to be added here
628 */
629 struct dp_peer_tx_capture_be {
630 };
631
632 /**
633 * dp_tx_mon_free_usr_mpduq() - API to free user mpduq
634 * @tx_ppdu_info: pointer to tx_ppdu_info
635 * @usr_idx: user index
636 * @tx_mon_be: pointer to tx monitor be
637 *
638 * Return: void
639 */
640 void dp_tx_mon_free_usr_mpduq(struct dp_tx_ppdu_info *tx_ppdu_info,
641 uint8_t usr_idx,
642 struct dp_pdev_tx_monitor_be *tx_mon_be);
643
644 #endif /* WLAN_TX_PKT_CAPTURE_ENH_BE */
645
646 /**
647 * dp_tx_mon_ppdu_info_free() - API to free dp_tx_ppdu_info
648 * @tx_ppdu_info: pointer to tx_ppdu_info
649 *
650 * Return: void
651 */
652 void dp_tx_mon_ppdu_info_free(struct dp_tx_ppdu_info *tx_ppdu_info);
653
654 /**
655 * dp_tx_mon_free_ppdu_info() - API to free dp_tx_ppdu_info
656 * @tx_ppdu_info: pointer to tx_ppdu_info
657 * @tx_mon_be: pointer to tx monitor be
658 *
659 * Return: void
660 */
661 void dp_tx_mon_free_ppdu_info(struct dp_tx_ppdu_info *tx_ppdu_info,
662 struct dp_pdev_tx_monitor_be *tx_mon_be);
663
664 /**
665 * dp_tx_mon_get_ppdu_info() - API to allocate dp_tx_ppdu_info
666 * @pdev: pdev handle
667 * @type: type of ppdu_info data or protection
668 * @num_user: number user in a ppdu_info
669 * @ppdu_id: ppdu_id number
670 *
671 * Return: pointer to dp_tx_ppdu_info
672 */
673 struct dp_tx_ppdu_info *dp_tx_mon_get_ppdu_info(struct dp_pdev *pdev,
674 enum tx_ppdu_info_type type,
675 uint8_t num_user,
676 uint32_t ppdu_id);
677
678 #endif /* WLAN_PKT_CAPTURE_TX_2_0 */
679
680 #if (defined(WIFI_MONITOR_SUPPORT) && defined(WLAN_TX_PKT_CAPTURE_ENH_BE))
681 /**
682 * dp_config_enh_tx_monitor_2_0()- API to validate tx monitor feature
683 * @pdev: DP_PDEV handle
684 * @val: user provided value
685 *
686 * Return: QDF_STATUS
687 */
688 QDF_STATUS dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val);
689 #endif
690
691 #ifdef WLAN_TX_MON_CORE_DEBUG
692 /**
693 * dp_config_enh_tx_core_monitor_2_0()- API to validate core framework
694 * @pdev: DP_PDEV handle
695 * @val: user provided value
696 *
697 * Return: QDF_STATUS
698 */
699 QDF_STATUS dp_config_enh_tx_core_monitor_2_0(struct dp_pdev *pdev, uint8_t val);
700 #endif
701
702 #ifdef WLAN_PKT_CAPTURE_TX_2_0
703 QDF_STATUS dp_tx_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
704 struct dp_pdev *pdev,
705 int mac_id,
706 int mac_for_pdev);
707 QDF_STATUS dp_tx_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc,
708 int mac_id);
709 QDF_STATUS dp_tx_mon_pdev_rings_alloc_2_0(struct dp_pdev *pdev, uint32_t lmac_id);
710 void dp_tx_mon_pdev_rings_free_2_0(struct dp_pdev *pdev, uint32_t lmac_id);
711 QDF_STATUS dp_tx_mon_pdev_rings_init_2_0(struct dp_pdev *pdev, uint32_t lmac_id);
712 void dp_tx_mon_pdev_rings_deinit_2_0(struct dp_pdev *pdev, uint32_t lmac_id);
713 QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc);
714 QDF_STATUS dp_tx_mon_soc_attach_2_0(struct dp_soc *soc, uint32_t lmac_id);
715 QDF_STATUS dp_tx_mon_soc_detach_2_0(struct dp_soc *soc, uint32_t lmac_id);
716 void dp_tx_mon_soc_deinit_2_0(struct dp_soc *soc, uint32_t lmac_id);
717 void dp_print_pdev_tx_monitor_stats_2_0(struct dp_pdev *pdev);
718 QDF_STATUS
719 dp_tx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size);
720 void
721 dp_tx_mon_buffers_free(struct dp_soc *soc);
722 QDF_STATUS
723 dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc);
724 void dp_tx_ppdu_stats_attach_2_0(struct dp_pdev *pdev);
725 QDF_STATUS dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val);
726 QDF_STATUS dp_peer_set_tx_capture_enabled_2_0(struct dp_pdev *pdev_handle,
727 struct dp_peer *peer_handle,
728 uint8_t is_tx_pkt_cap_enable,
729 uint8_t *peer_mac);
730 void dp_tx_ppdu_stats_detach_2_0(struct dp_pdev *pdev);
731 #else
732 static inline
dp_tx_mon_pdev_htt_srng_setup_2_0(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)733 QDF_STATUS dp_tx_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
734 struct dp_pdev *pdev,
735 int mac_id,
736 int mac_for_pdev)
737 {
738 return QDF_STATUS_SUCCESS;
739 }
740
741 static inline
dp_tx_mon_soc_htt_srng_setup_2_0(struct dp_soc * soc,int mac_id)742 QDF_STATUS dp_tx_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc,
743 int mac_id)
744 {
745 return QDF_STATUS_SUCCESS;
746 }
747
748 static inline
dp_tx_mon_pdev_rings_alloc_2_0(struct dp_pdev * pdev,uint32_t lmac_id)749 QDF_STATUS dp_tx_mon_pdev_rings_alloc_2_0(struct dp_pdev *pdev, uint32_t lmac_id)
750 {
751 return QDF_STATUS_SUCCESS;
752 }
753
754 static inline
dp_tx_mon_pdev_rings_free_2_0(struct dp_pdev * pdev,uint32_t lmac_id)755 void dp_tx_mon_pdev_rings_free_2_0(struct dp_pdev *pdev, uint32_t lmac_id)
756 {
757 }
758
759 static inline
dp_tx_mon_pdev_rings_init_2_0(struct dp_pdev * pdev,uint32_t lmac_id)760 QDF_STATUS dp_tx_mon_pdev_rings_init_2_0(struct dp_pdev *pdev, uint32_t lmac_id)
761 {
762 return QDF_STATUS_SUCCESS;
763 }
764
765 static inline
dp_tx_mon_pdev_rings_deinit_2_0(struct dp_pdev * pdev,uint32_t lmac_id)766 void dp_tx_mon_pdev_rings_deinit_2_0(struct dp_pdev *pdev, uint32_t lmac_id)
767 {
768 }
769
770 static inline
dp_tx_mon_soc_init_2_0(struct dp_soc * soc)771 QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc)
772 {
773 return QDF_STATUS_SUCCESS;
774 }
775
776 static inline
dp_tx_mon_soc_attach_2_0(struct dp_soc * soc,uint32_t lmac_id)777 QDF_STATUS dp_tx_mon_soc_attach_2_0(struct dp_soc *soc, uint32_t lmac_id)
778 {
779 return QDF_STATUS_SUCCESS;
780 }
781
782 static inline
dp_tx_mon_soc_detach_2_0(struct dp_soc * soc,uint32_t lmac_id)783 QDF_STATUS dp_tx_mon_soc_detach_2_0(struct dp_soc *soc, uint32_t lmac_id)
784 {
785 return QDF_STATUS_SUCCESS;
786 }
787
788 static inline
dp_tx_mon_soc_deinit_2_0(struct dp_soc * soc,uint32_t lmac_id)789 void dp_tx_mon_soc_deinit_2_0(struct dp_soc *soc, uint32_t lmac_id)
790 {
791 }
792
793 static inline void
dp_print_pdev_tx_monitor_stats_2_0(struct dp_pdev * pdev)794 dp_print_pdev_tx_monitor_stats_2_0(struct dp_pdev *pdev)
795 {
796 }
797
798 static inline QDF_STATUS
dp_tx_mon_buffers_alloc(struct dp_soc * soc,uint32_t size)799 dp_tx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
800 {
801 return QDF_STATUS_SUCCESS;
802 }
803
804 static inline void
dp_tx_mon_buffers_free(struct dp_soc * soc)805 dp_tx_mon_buffers_free(struct dp_soc *soc)
806 {
807 }
808
809 static inline QDF_STATUS
dp_tx_mon_buf_desc_pool_alloc(struct dp_soc * soc)810 dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
811 {
812 return QDF_STATUS_SUCCESS;
813 }
814
815 static inline void
dp_tx_ppdu_stats_attach_2_0(struct dp_pdev * pdev)816 dp_tx_ppdu_stats_attach_2_0(struct dp_pdev *pdev)
817 {
818 }
819
820 static inline QDF_STATUS
dp_config_enh_tx_monitor_2_0(struct dp_pdev * pdev,uint8_t val)821 dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val)
822 {
823 return QDF_STATUS_SUCCESS;
824 }
825
826 static inline QDF_STATUS
dp_peer_set_tx_capture_enabled_2_0(struct dp_pdev * pdev_handle,struct dp_peer * peer_handle,uint8_t is_tx_pkt_cap_enable,uint8_t * peer_mac)827 dp_peer_set_tx_capture_enabled_2_0(struct dp_pdev *pdev_handle,
828 struct dp_peer *peer_handle,
829 uint8_t is_tx_pkt_cap_enable,
830 uint8_t *peer_mac)
831 {
832 return QDF_STATUS_SUCCESS;
833 }
834
835 static inline void
dp_tx_ppdu_stats_detach_2_0(struct dp_pdev * pdev)836 dp_tx_ppdu_stats_detach_2_0(struct dp_pdev *pdev)
837 {
838 }
839 #endif
840
841 #endif /* _DP_TX_MON_2_0_H_ */
842