1 /*
2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 #ifndef _DP_RX_MON_H_
21 #define _DP_RX_MON_H_
22
23 #define dp_rx_mon_status_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_RX_MON_STATUS, params)
24 #define dp_rx_mon_status_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_RX_MON_STATUS, params)
25 #define dp_rx_mon_status_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_RX_MON_STATUS, params)
26 #define dp_rx_mon_status_info(params...) \
27 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_RX_MON_STATUS, ## params)
28 #define dp_rx_mon_status_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_RX_MON_STATUS, params)
29
30 #define dp_rx_mon_dest_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_RX_MON_DEST, params)
31 #define dp_rx_mon_dest_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_RX_MON_DEST, params)
32 #define dp_rx_mon_dest_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_RX_MON_DEST, params)
33 #define dp_rx_mon_dest_info(params...) \
34 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_RX_MON_DEST, ## params)
35 #define dp_rx_mon_dest_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_RX_MON_DEST, params)
36
37 /* The maximum buffer length allocated for radiotap for monitor status buffer */
38 #define MAX_MONITOR_HEADER (512)
39
40 /* l2 header pad byte in case of Raw frame is Zero and 2 in non raw */
41 #define DP_RX_MON_RAW_L2_HDR_PAD_BYTE (0)
42 #define DP_RX_MON_NONRAW_L2_HDR_PAD_BYTE (2)
43
44 /*
45 * The maximum headroom reserved for monitor destination buffer to
46 * accommodate radiotap header and protocol flow tag
47 */
48 /*
49 * -------------------------------------------------
50 * | Protocol & Flow TAG | Radiotap header|
51 * | | Length(128 B) |
52 * | ((4* QDF_NBUF_MAX_FRAGS) * 2) | |
53 * -------------------------------------------------
54 */
55 #define DP_RX_MON_MAX_RADIO_TAP_HDR (128)
56 #define DP_RX_MON_PF_TAG_LEN_PER_FRAG (4)
57 #define DP_RX_MON_TOT_PF_TAG_LEN \
58 ((DP_RX_MON_PF_TAG_LEN_PER_FRAG) * (QDF_NBUF_MAX_FRAGS))
59 #define DP_RX_MON_MAX_MONITOR_HEADER \
60 ((DP_RX_MON_TOT_PF_TAG_LEN * 2) + (DP_RX_MON_MAX_RADIO_TAP_HDR))
61
62 #define DP_RX_MON_LLC_SIZE 4
63 #define DP_RX_MON_SNAP_SIZE 4
64 #define DP_RX_MON_DECAP_HDR_SIZE 14
65
66
67 /**
68 * enum dp_mon_reap_status - monitor status ring ppdu status
69 *
70 * @DP_MON_STATUS_NO_DMA: DMA not done for status ring entry
71 * @DP_MON_STATUS_MATCH: status and dest ppdu id matches
72 * @DP_MON_STATUS_LAG: status ppdu id is lagging
73 * @DP_MON_STATUS_LEAD: status ppdu id is leading
74 * @DP_MON_STATUS_REPLENISH: status ring entry is NULL
75 * @DP_MON_STATUS_MAX: max num of different status
76 */
77 enum dp_mon_reap_status {
78 DP_MON_STATUS_NO_DMA,
79 DP_MON_STATUS_MATCH,
80 DP_MON_STATUS_LAG,
81 DP_MON_STATUS_LEAD,
82 DP_MON_STATUS_REPLENISH,
83 DP_MON_STATUS_MAX
84 };
85
86 /**
87 * dp_rx_mon_status_process() - Process monitor status ring and
88 * TLV in status ring.
89 *
90 * @soc: core txrx main context
91 * @int_ctx: interrupt context
92 * @mac_id: mac_id which is one of 3 mac_ids
93 * @quota: No. of ring entry that can be serviced in one shot.
94 *
95 * Return: uint32_t: No. of ring entry that is processed.
96 */
97 uint32_t
98 dp_rx_mon_status_process(struct dp_soc *soc, struct dp_intr *int_ctx,
99 uint32_t mac_id, uint32_t quota);
100
101 /**
102 * dp_rx_populate_cbf_hdr - Send CBF frame with htt header
103 * @soc: Datapath soc handle
104 * @mac_id: Datapath mac id
105 * @event: WDI event
106 * @data: mpdu buffer
107 * @msdu_timestamp: time stamp
108 *
109 * Return: QDF_STATUS
110 */
111 QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc,
112 uint32_t mac_id, uint32_t event,
113 qdf_nbuf_t data, uint32_t msdu_timestamp);
114
115 /**
116 * dp_rx_mon_handle_status_buf_done() - Handle DMA not done case for
117 * monitor status ring
118 *
119 * @pdev: DP pdev handle
120 * @mon_status_srng: Monitor status SRNG
121 *
122 * Return: enum dp_mon_reap_status
123 */
124 enum dp_mon_reap_status
125 dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev,
126 void *mon_status_srng);
127
128 #ifdef QCA_SUPPORT_FULL_MON
129
130 /**
131 * dp_full_mon_attach() - Full monitor mode attach
132 * This API initializes full monitor mode resources
133 *
134 * @pdev: dp pdev object
135 *
136 * Return: void
137 *
138 */
139 void dp_full_mon_attach(struct dp_pdev *pdev);
140
141 /**
142 * dp_full_mon_detach() - Full monitor mode attach
143 * This API deinitilises full monitor mode resources
144 *
145 * @pdev: dp pdev object
146 *
147 * Return: void
148 *
149 */
150 void dp_full_mon_detach(struct dp_pdev *pdev);
151
152 /**
153 * dp_full_mon_partial_detach() - Full monitor mode detach with no locks
154 * This API deinitilises full monitor mode resources but mon_desc not free
155 *
156 * @pdev: dp pdev object
157 *
158 * Return: void
159 *
160 */
161 void dp_full_mon_partial_detach(struct dp_pdev *pdev);
162
163 /**
164 * dp_rx_mon_process()- API to process monitor destination ring for
165 * full monitor mode
166 *
167 * @soc: dp soc handle
168 * @int_ctx: interrupt context
169 * @mac_id: lmac id
170 * @quota: No. of ring entry that can be serviced in one shot.
171 */
172
173 uint32_t dp_rx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
174 uint32_t mac_id, uint32_t quota);
175
176 #else
177 /**
178 * dp_full_mon_attach() - attach full monitor mode resources
179 * @pdev: Datapath PDEV handle
180 *
181 * Return: void
182 */
dp_full_mon_attach(struct dp_pdev * pdev)183 static inline void dp_full_mon_attach(struct dp_pdev *pdev)
184 {
185 }
186
187 /**
188 * dp_full_mon_detach() - detach full monitor mode resources
189 * @pdev: Datapath PDEV handle
190 *
191 * Return: void
192 *
193 */
dp_full_mon_detach(struct dp_pdev * pdev)194 static inline void dp_full_mon_detach(struct dp_pdev *pdev)
195 {
196 }
197 #endif
198
199 /**
200 * dp_mon_link_free() - free monitor link desc pool
201 * @pdev: core txrx pdev context
202 *
203 * This function will release DP link desc pool for monitor mode from
204 * main device context.
205 *
206 * Return: QDF_STATUS_SUCCESS: success
207 * QDF_STATUS_E_RESOURCES: Error return
208 */
209 QDF_STATUS dp_mon_link_free(struct dp_pdev *pdev);
210
211
212 /**
213 * dp_mon_process() - Main monitor mode processing roution.
214 * @soc: core txrx main context
215 * @int_ctx: interrupt context
216 * @mac_id: mac_id which is one of 3 mac_ids
217 * @quota: No. of status ring entry that can be serviced in one shot.
218 *
219 * This call monitor status ring process then monitor
220 * destination ring process.
221 * Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
222 *
223 * Return: uint32_t: No. of ring entry that is processed.
224 */
225 uint32_t dp_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
226 uint32_t mac_id, uint32_t quota);
227
228 QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
229 qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu);
230
231 /**
232 * dp_rx_mon_deliver_non_std() - deliver frames for non standard path
233 * @soc: core txrx main context
234 * @mac_id: MAC ID
235 *
236 * This function delivers the radio tap and dummy MSDU
237 * into user layer application for preamble only PPDU.
238 *
239 * Return: Operation status
240 */
241 QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, uint32_t mac_id);
242
243 #ifndef REMOVE_MON_DBG_STATS
244 /**
245 * dp_rx_mon_update_dbg_ppdu_stats() - Update status ring TLV count
246 * @ppdu_info: HAL RX PPDU info retrieved from status ring TLV
247 * @rx_mon_stats: monitor mode status/destination ring PPDU and MPDU count
248 *
249 * Update status ring PPDU start and end count. Keep track TLV state on
250 * PPDU start and end to find out if start and end is matching. Keep
251 * track missing PPDU start and end count. Keep track matching PPDU
252 * start and end count.
253 *
254 * Return: None
255 */
256 static inline void
dp_rx_mon_update_dbg_ppdu_stats(struct hal_rx_ppdu_info * ppdu_info,struct cdp_pdev_mon_stats * rx_mon_stats)257 dp_rx_mon_update_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
258 struct cdp_pdev_mon_stats *rx_mon_stats)
259 {
260 if (ppdu_info->rx_state ==
261 HAL_RX_MON_PPDU_START) {
262 rx_mon_stats->status_ppdu_start++;
263 if (rx_mon_stats->status_ppdu_state
264 != CDP_MON_PPDU_END)
265 rx_mon_stats->status_ppdu_end_mis++;
266 rx_mon_stats->status_ppdu_state
267 = CDP_MON_PPDU_START;
268 ppdu_info->rx_state = HAL_RX_MON_PPDU_RESET;
269 } else if (ppdu_info->rx_state ==
270 HAL_RX_MON_PPDU_END) {
271 rx_mon_stats->status_ppdu_end++;
272 if (rx_mon_stats->status_ppdu_state
273 != CDP_MON_PPDU_START)
274 rx_mon_stats->status_ppdu_start_mis++;
275 else
276 rx_mon_stats->status_ppdu_compl++;
277 rx_mon_stats->status_ppdu_state
278 = CDP_MON_PPDU_END;
279 ppdu_info->rx_state = HAL_RX_MON_PPDU_RESET;
280 }
281 }
282
283 /**
284 * dp_rx_mon_init_dbg_ppdu_stats() - initialization for monitor mode stats
285 * @ppdu_info: HAL RX PPDU info retrieved from status ring TLV
286 * @rx_mon_stats: monitor mode status/destination ring PPDU and MPDU count
287 *
288 * Return: None
289 */
290 static inline void
dp_rx_mon_init_dbg_ppdu_stats(struct hal_rx_ppdu_info * ppdu_info,struct cdp_pdev_mon_stats * rx_mon_stats)291 dp_rx_mon_init_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
292 struct cdp_pdev_mon_stats *rx_mon_stats)
293 {
294 ppdu_info->rx_state = HAL_RX_MON_PPDU_END;
295 rx_mon_stats->status_ppdu_state
296 = CDP_MON_PPDU_END;
297 }
298
299 #else
300 static inline void
dp_rx_mon_update_dbg_ppdu_stats(struct hal_rx_ppdu_info * ppdu_info,struct cdp_pdev_mon_stats * rx_mon_stats)301 dp_rx_mon_update_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
302 struct cdp_pdev_mon_stats *rx_mon_stats)
303 {
304 }
305
306 static inline void
dp_rx_mon_init_dbg_ppdu_stats(struct hal_rx_ppdu_info * ppdu_info,struct cdp_pdev_mon_stats * rx_mon_stats)307 dp_rx_mon_init_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
308 struct cdp_pdev_mon_stats *rx_mon_stats)
309 {
310 }
311
312 #endif
313
314 #ifdef QCA_ENHANCED_STATS_SUPPORT
315 void
316 dp_rx_populate_rx_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
317 struct cdp_rx_indication_ppdu *cdp_rx_ppdu,
318 struct dp_pdev *pdev);
319
320 /**
321 * dp_rx_populate_su_evm_details() - Populate su evm info
322 * @ppdu_info: ppdu info structure from ppdu ring
323 * @cdp_rx_ppdu: rx ppdu indication structure
324 */
325 void
326 dp_rx_populate_su_evm_details(struct hal_rx_ppdu_info *ppdu_info,
327 struct cdp_rx_indication_ppdu *cdp_rx_ppdu);
328
329 /**
330 * dp_rx_handle_ppdu_stats() - Allocate and deliver ppdu stats to cdp layer
331 * @soc: core txrx main context
332 * @pdev: pdev structure
333 * @ppdu_info: structure for rx ppdu ring
334 *
335 * Return: none
336 */
337 void
338 dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
339 struct hal_rx_ppdu_info *ppdu_info);
340 #else
341 static inline void
dp_rx_populate_rx_rssi_chain(struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)342 dp_rx_populate_rx_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
343 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
344 {
345 }
346
347 static inline void
dp_rx_populate_su_evm_details(struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)348 dp_rx_populate_su_evm_details(struct hal_rx_ppdu_info *ppdu_info,
349 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
350 {
351 }
352
353 static inline void
dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)354 dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
355 struct hal_rx_ppdu_info *ppdu_info,
356 struct cdp_rx_indication_ppdu
357 *cdp_rx_ppdu)
358 {
359 }
360
361 static inline void
dp_rx_populate_cdp_indication_ppdu(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)362 dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev,
363 struct hal_rx_ppdu_info *ppdu_info,
364 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
365 {
366 }
367
dp_rx_rate_stats_update(struct dp_peer * peer,struct cdp_rx_indication_ppdu * ppdu,uint32_t user)368 static inline void dp_rx_rate_stats_update(struct dp_peer *peer,
369 struct cdp_rx_indication_ppdu *ppdu,
370 uint32_t user)
371 {
372 }
373
374 static inline void
dp_rx_handle_ppdu_stats(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info)375 dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
376 struct hal_rx_ppdu_info *ppdu_info)
377 {
378 }
379 #endif /* QCA_ENHANCED_STATS_SUPPORT */
380
381 #ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
382 /**
383 * dp_rx_mon_update_user_ctrl_frame_stats() - Function to update Rx control
384 * frame stats per user.
385 * @pdev: DP Pdev Pointer
386 * @ppdu_info: HAL Rx PPDU info Pointer
387 *
388 * Return: None
389 */
390 void dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
391 struct hal_rx_ppdu_info *ppdu_info);
392 #else
393 static inline void
dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info)394 dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
395 struct hal_rx_ppdu_info *ppdu_info)
396 {
397 }
398 #endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
399
400 #ifdef QCA_UNDECODED_METADATA_SUPPORT
401 /**
402 * dp_rx_handle_ppdu_undecoded_metadata() - Allocate and deliver ppdu info
403 * undecoded metadata to cdp layer
404 * @soc: core txrx main context
405 * @pdev: pdev structure
406 * @ppdu_info: structure for rx ppdu ring
407 *
408 * Return: none
409 */
410 void
411 dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc *soc, struct dp_pdev *pdev,
412 struct hal_rx_ppdu_info *ppdu_info);
413
414 #else
415 static inline void
dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info)416 dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc *soc, struct dp_pdev *pdev,
417 struct hal_rx_ppdu_info *ppdu_info)
418 {
419 }
420 #endif /* QCA_UNDECODED_METADATA_SUPPORT */
421
422 #ifdef QCA_MCOPY_SUPPORT
423 /**
424 * dp_rx_handle_mcopy_mode() - Allocate and deliver first MSDU payload
425 * @soc: core txrx main context
426 * @pdev: pdev structure
427 * @ppdu_info: structure for rx ppdu ring
428 * @nbuf: QDF nbuf
429 * @fcs_ok_mpdu_cnt: fcs passed mpdu index
430 * @deliver_frame: flag to deliver wdi event
431 *
432 * Return: QDF_STATUS_SUCCESS - If nbuf to be freed by caller
433 * QDF_STATUS_E_ALREADY - If nbuf not to be freed by caller
434 */
435 QDF_STATUS
436 dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
437 struct hal_rx_ppdu_info *ppdu_info, qdf_nbuf_t nbuf,
438 uint8_t fcs_ok_mpdu_cnt, bool deliver_frame);
439
440 /**
441 * dp_rx_mcopy_handle_last_mpdu() - cache and delive last MPDU header in a
442 * status buffer if MPDU end tlv is received in different buffer
443 * @soc: core txrx main context
444 * @pdev: pdev structure
445 * @ppdu_info: structure for rx ppdu ring
446 * @status_nbuf: QDF nbuf
447 *
448 * Return: void
449 */
450 void
451 dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
452 struct hal_rx_ppdu_info *ppdu_info,
453 qdf_nbuf_t status_nbuf);
454
455 /**
456 * dp_rx_mcopy_process_ppdu_info() - update mcopy ppdu info
457 * @pdev: pdev structure
458 * @ppdu_info: structure for rx ppdu ring
459 * @tlv_status: processed TLV status
460 *
461 * Return: void
462 */
463 void
464 dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev,
465 struct hal_rx_ppdu_info *ppdu_info,
466 uint32_t tlv_status);
467
468 void
469 dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
470 struct hal_rx_ppdu_info *ppdu_info,
471 uint32_t tlv_status,
472 qdf_nbuf_t status_nbuf);
473 #else
474 static inline QDF_STATUS
dp_rx_handle_mcopy_mode(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,qdf_nbuf_t nbuf,uint8_t fcs_ok_cnt,bool deliver_frame)475 dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
476 struct hal_rx_ppdu_info *ppdu_info, qdf_nbuf_t nbuf,
477 uint8_t fcs_ok_cnt, bool deliver_frame)
478 {
479 return QDF_STATUS_SUCCESS;
480 }
481
482 static inline void
dp_rx_mcopy_handle_last_mpdu(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,qdf_nbuf_t status_nbuf)483 dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
484 struct hal_rx_ppdu_info *ppdu_info,
485 qdf_nbuf_t status_nbuf)
486 {
487 }
488
489 static inline void
dp_rx_mcopy_process_ppdu_info(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,uint32_t tlv_status)490 dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev,
491 struct hal_rx_ppdu_info *ppdu_info,
492 uint32_t tlv_status)
493 {
494 }
495
496 static inline void
dp_rx_process_mcopy_mode(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,uint32_t tlv_status,qdf_nbuf_t status_nbuf)497 dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
498 struct hal_rx_ppdu_info *ppdu_info,
499 uint32_t tlv_status,
500 qdf_nbuf_t status_nbuf)
501 {
502 }
503 #endif /* QCA_MCOPY_SUPPORT */
504
505 /**
506 * dp_rx_handle_smart_mesh_mode() - Deliver header for smart mesh
507 * @soc: Datapath SOC handle
508 * @pdev: Datapath PDEV handle
509 * @ppdu_info: Structure for rx ppdu info
510 * @nbuf: Qdf nbuf abstraction for linux skb
511 *
512 * Return: 0 on success, 1 on failure
513 */
514 int
515 dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev,
516 struct hal_rx_ppdu_info *ppdu_info,
517 qdf_nbuf_t nbuf);
518
519 /**
520 * dp_rx_nbuf_prepare() - prepare RX nbuf
521 * @soc: core txrx main context
522 * @pdev: core txrx pdev context
523 *
524 * This function alloc & map nbuf for RX dma usage, retry it if failed
525 * until retry times reaches max threshold or succeeded.
526 *
527 * Return: qdf_nbuf_t pointer if succeeded, NULL if failed.
528 */
529 qdf_nbuf_t
530 dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev);
531
532 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
533
534 /**
535 * dp_rx_mon_handle_cfr_mu_info() - Gather macaddr and ast_index of peer(s) in
536 * the PPDU received, this will be used for correlation of CFR data captured
537 * for an UL-MU-PPDU
538 * @pdev: pdev ctx
539 * @ppdu_info: pointer to ppdu info structure populated from ppdu status TLVs
540 * @cdp_rx_ppdu: Rx PPDU indication structure
541 *
542 * Return: none
543 */
544 void
545 dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev,
546 struct hal_rx_ppdu_info *ppdu_info,
547 struct cdp_rx_indication_ppdu *cdp_rx_ppdu);
548
549 /**
550 * dp_rx_mon_populate_cfr_ppdu_info() - Populate cdp ppdu info from hal ppdu
551 * info
552 * @pdev: pdev ctx
553 * @ppdu_info: ppdu info structure from ppdu ring
554 * @cdp_rx_ppdu : Rx PPDU indication structure
555 *
556 * Return: none
557 */
558 void
559 dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev *pdev,
560 struct hal_rx_ppdu_info *ppdu_info,
561 struct cdp_rx_indication_ppdu *cdp_rx_ppdu);
562
563 /**
564 * dp_cfr_rcc_mode_status() - Return status of cfr rcc mode
565 * @pdev: pdev ctx
566 *
567 * Return: True or False
568 */
569 bool
570 dp_cfr_rcc_mode_status(struct dp_pdev *pdev);
571
572 /**
573 * dp_rx_mon_populate_cfr_info() - Populate cdp ppdu info from hal cfr info
574 * @pdev: pdev ctx
575 * @ppdu_info: ppdu info structure from ppdu ring
576 * @cdp_rx_ppdu: Rx PPDU indication structure
577 *
578 * Return: none
579 */
580 void
581 dp_rx_mon_populate_cfr_info(struct dp_pdev *pdev,
582 struct hal_rx_ppdu_info *ppdu_info,
583 struct cdp_rx_indication_ppdu *cdp_rx_ppdu);
584
585 /**
586 * dp_update_cfr_dbg_stats() - Increment RCC debug statistics
587 * @pdev: pdev structure
588 * @ppdu_info: structure for rx ppdu ring
589 *
590 * Return: none
591 */
592 void
593 dp_update_cfr_dbg_stats(struct dp_pdev *pdev,
594 struct hal_rx_ppdu_info *ppdu_info);
595
596 /**
597 * dp_rx_handle_cfr() - Gather cfr info from hal ppdu info
598 * @soc: core txrx main context
599 * @pdev: pdev ctx
600 * @ppdu_info: ppdu info structure from ppdu ring
601 *
602 * Return: none
603 */
604 void
605 dp_rx_handle_cfr(struct dp_soc *soc, struct dp_pdev *pdev,
606 struct hal_rx_ppdu_info *ppdu_info);
607
608 /**
609 * dp_rx_populate_cfr_non_assoc_sta() - Populate cfr ppdu info for PPDUs from
610 * non-associated stations
611 * @pdev: pdev ctx
612 * @ppdu_info: ppdu info structure from ppdu ring
613 * @cdp_rx_ppdu: Rx PPDU indication structure
614 *
615 * Return: none
616 */
617 void
618 dp_rx_populate_cfr_non_assoc_sta(struct dp_pdev *pdev,
619 struct hal_rx_ppdu_info *ppdu_info,
620 struct cdp_rx_indication_ppdu *cdp_rx_ppdu);
621
622 #else
623 static inline void
dp_rx_mon_handle_cfr_mu_info(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)624 dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev,
625 struct hal_rx_ppdu_info *ppdu_info,
626 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
627 {
628 }
629
630 static inline void
dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)631 dp_rx_mon_populate_cfr_ppdu_info(struct dp_pdev *pdev,
632 struct hal_rx_ppdu_info *ppdu_info,
633 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
634 {
635 }
636
637 static inline void
dp_rx_mon_populate_cfr_info(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)638 dp_rx_mon_populate_cfr_info(struct dp_pdev *pdev,
639 struct hal_rx_ppdu_info *ppdu_info,
640 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
641 {
642 }
643
644 static inline void
dp_rx_handle_cfr(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info)645 dp_rx_handle_cfr(struct dp_soc *soc, struct dp_pdev *pdev,
646 struct hal_rx_ppdu_info *ppdu_info)
647 {
648 }
649
650 static inline void
dp_rx_populate_cfr_non_assoc_sta(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,struct cdp_rx_indication_ppdu * cdp_rx_ppdu)651 dp_rx_populate_cfr_non_assoc_sta(struct dp_pdev *pdev,
652 struct hal_rx_ppdu_info *ppdu_info,
653 struct cdp_rx_indication_ppdu *cdp_rx_ppdu)
654 {
655 }
656
657 static inline void
dp_update_cfr_dbg_stats(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info)658 dp_update_cfr_dbg_stats(struct dp_pdev *pdev,
659 struct hal_rx_ppdu_info *ppdu_info)
660 {
661 }
662
663 static inline bool
dp_cfr_rcc_mode_status(struct dp_pdev * pdev)664 dp_cfr_rcc_mode_status(struct dp_pdev *pdev)
665 {
666 return false;
667 }
668 #endif /* WLAN_CFR_ENABLE && WLAN_ENH_CFR_ENABLE */
669
670 /**
671 * dp_rx_mon_deliver(): function to deliver packets to stack
672 * @soc: DP soc
673 * @mac_id: MAC ID
674 * @head_msdu: head of msdu list
675 * @tail_msdu: tail of msdu list
676 *
677 * Return: status: 0 - Success, non-zero: Failure
678 */
679 QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc,
680 uint32_t mac_id,
681 qdf_nbuf_t head_msdu,
682 qdf_nbuf_t tail_msdu);
683
684 /**
685 * dp_rx_mon_deliver_non_std()
686 * @soc: core txrx main context
687 * @mac_id: MAC ID
688 *
689 * This function delivers the radio tap and dummy MSDU
690 * into user layer application for preamble only PPDU.
691 *
692 * Return: QDF_STATUS
693 */
694 QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
695 uint32_t mac_id);
696
697 #ifdef DP_RX_MON_MEM_FRAG
698 #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
699 defined(WLAN_SUPPORT_RX_FLOW_TAG)
700 void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc,
701 qdf_nbuf_t nbuf);
702 #else
703 static inline
dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc * soc,qdf_nbuf_t nbuf)704 void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc,
705 qdf_nbuf_t nbuf)
706 {
707 }
708 #endif
709 #else
710 static inline
dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc * soc,qdf_nbuf_t nbuf)711 void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc,
712 qdf_nbuf_t nbuf)
713 {
714 }
715 #endif
716
717 qdf_nbuf_t dp_rx_mon_restitch_mpdu(struct dp_soc *soc, uint32_t mac_id,
718 qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu,
719 struct cdp_mon_status *rs);
720
721 #ifdef DP_RX_MON_MEM_FRAG
722 /**
723 * dp_rx_mon_get_nbuf_80211_hdr() - Get 80211 hdr from nbuf
724 * @nbuf: qdf_nbuf_t
725 *
726 * This function must be called after moving radiotap header.
727 *
728 * Return: Ptr pointing to 80211 header or NULL.
729 */
730 static inline
dp_rx_mon_get_nbuf_80211_hdr(qdf_nbuf_t nbuf)731 qdf_frag_t dp_rx_mon_get_nbuf_80211_hdr(qdf_nbuf_t nbuf)
732 {
733 /* Return NULL if nr_frag is Zero */
734 if (!qdf_nbuf_get_nr_frags(nbuf))
735 return NULL;
736
737 return qdf_nbuf_get_frag_addr(nbuf, 0);
738 }
739 #else
740 static inline
dp_rx_mon_get_nbuf_80211_hdr(qdf_nbuf_t nbuf)741 qdf_frag_t dp_rx_mon_get_nbuf_80211_hdr(qdf_nbuf_t nbuf)
742 {
743 return qdf_nbuf_data(nbuf);
744 }
745 #endif
746
747 /**
748 * dp_rx_mon_process_dest_pktlog(): function to log packet contents to
749 * pktlog buffer and send to pktlog module
750 * @soc: DP soc
751 * @mac_id: MAC ID
752 * @mpdu: MPDU buf
753 * Return: status: 0 - Success, non-zero: Failure
754 */
755 QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
756 uint32_t mac_id,
757 qdf_nbuf_t mpdu);
758
759 #ifdef WLAN_TX_PKT_CAPTURE_ENH
760 void
761 dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
762 qdf_nbuf_t mon_mpdu);
763 #else
764 static inline void
dp_handle_tx_capture(struct dp_soc * soc,struct dp_pdev * pdev,qdf_nbuf_t mon_mpdu)765 dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
766 qdf_nbuf_t mon_mpdu)
767 {
768 }
769 #endif
770
771 /**
772 * dp_rx_get_mon_desc_pool() - Return monitor descriptor pool
773 * based on target
774 * @soc: soc handle
775 * @mac_id: mac id number
776 * @pdev_id: pdev id number
777 *
778 * Return: descriptor pool address
779 */
780 static inline
dp_rx_get_mon_desc_pool(struct dp_soc * soc,uint8_t mac_id,uint8_t pdev_id)781 struct rx_desc_pool *dp_rx_get_mon_desc_pool(struct dp_soc *soc,
782 uint8_t mac_id,
783 uint8_t pdev_id)
784 {
785 if (soc->wlan_cfg_ctx->rxdma1_enable)
786 return &soc->rx_desc_mon[mac_id];
787
788 return &soc->rx_desc_buf[pdev_id];
789 }
790
791 /**
792 * dp_rx_process_peer_based_pktlog() - Process Rx pktlog if peer based
793 * filtering enabled
794 * @soc: core txrx main context
795 * @ppdu_info: Structure for rx ppdu info
796 * @status_nbuf: Qdf nbuf abstraction for linux skb
797 * @pdev_id: mac_id/pdev_id correspondinggly for MCL and WIN
798 *
799 * Return: none
800 */
801 void
802 dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
803 struct hal_rx_ppdu_info *ppdu_info,
804 qdf_nbuf_t status_nbuf, uint32_t pdev_id);
805
806 uint32_t dp_mon_rx_add_tlv(uint8_t id, uint16_t len, void *value,
807 qdf_nbuf_t mpdu_nbuf);
808
809 /**
810 * dp_mon_rx_stats_update_rssi_dbm_params() - update rssi calibration
811 * parameters in rx stats
812 * @mon_pdev: monitor pdev
813 * @ppdu_info: Structure for rx ppdu info
814 *
815 * Return: none
816 */
817 void
818 dp_mon_rx_stats_update_rssi_dbm_params(struct dp_mon_pdev *mon_pdev,
819 struct hal_rx_ppdu_info *ppdu_info);
820
821 #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
822 /**
823 * dp_rx_handle_local_pkt_capture() - Rx handle for local packet capture
824 * @pdev: Datapath PDEV handle
825 * @ppdu_info: Structure for rx ppdu info
826 * @nbuf: Qdf nbuf abstraction for linux skb
827 * @tlv_status: TLV status
828 *
829 * Return: 0 on success, 1 on failure
830 */
831 int
832 dp_rx_handle_local_pkt_capture(struct dp_pdev *pdev,
833 struct hal_rx_ppdu_info *ppdu_info,
834 qdf_nbuf_t nbuf, uint32_t tlv_status);
835 #else
836 static inline int
dp_rx_handle_local_pkt_capture(struct dp_pdev * pdev,struct hal_rx_ppdu_info * ppdu_info,qdf_nbuf_t nbuf,uint32_t tlv_status)837 dp_rx_handle_local_pkt_capture(struct dp_pdev *pdev,
838 struct hal_rx_ppdu_info *ppdu_info,
839 qdf_nbuf_t nbuf, uint32_t tlv_status)
840 {
841 return 0;
842 }
843 #endif
844 #endif /* _DP_RX_MON_H_ */
845