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 #include <hal_api.h> 19 #include <wlan_cfg.h> 20 #include "dp_types.h" 21 #include "dp_internal.h" 22 #include "dp_htt.h" 23 #include "dp_mon.h" 24 #include "htt.h" 25 #include "htc_api.h" 26 #include "htc.h" 27 #include "htc_packet.h" 28 #include "dp_mon_filter.h" 29 #include <dp_mon_2.0.h> 30 #include <dp_rx_mon_2.0.h> 31 #include <dp_mon_filter_2.0.h> 32 #include <dp_be.h> 33 #ifdef QCA_SUPPORT_LITE_MONITOR 34 #include "dp_lite_mon.h" 35 #endif 36 37 #define HTT_MSG_BUF_SIZE(msg_bytes) \ 38 ((msg_bytes) + HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING) 39 40 void dp_mon_filter_dealloc_2_0(struct dp_pdev *pdev) 41 { 42 enum dp_mon_filter_mode mode; 43 struct dp_mon_filter_be **mon_filter = NULL; 44 struct dp_mon_pdev *mon_pdev = NULL; 45 struct dp_mon_pdev_be *mon_pdev_be = NULL; 46 47 if (!pdev) { 48 dp_mon_filter_err("Pdev context is null"); 49 return; 50 } 51 52 mon_pdev = pdev->monitor_pdev; 53 if (!mon_pdev) { 54 dp_mon_filter_err("Monitor pdev context is null"); 55 return; 56 } 57 58 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 59 mon_filter = mon_pdev_be->filter_be; 60 if (!mon_filter) { 61 dp_mon_filter_err("Found NULL memory for the Monitor filter"); 62 return; 63 } 64 65 for (mode = 0; mode < DP_MON_FILTER_MAX_MODE; mode++) { 66 if (!mon_filter[mode]) 67 continue; 68 69 qdf_mem_free(mon_filter[mode]); 70 mon_filter[mode] = NULL; 71 } 72 73 qdf_mem_free(mon_filter); 74 mon_pdev_be->filter_be = NULL; 75 } 76 77 QDF_STATUS dp_mon_filter_alloc_2_0(struct dp_pdev *pdev) 78 { 79 struct dp_mon_filter_be **mon_filter = NULL; 80 enum dp_mon_filter_mode mode; 81 struct dp_mon_pdev *mon_pdev = NULL; 82 struct dp_mon_pdev_be *mon_pdev_be = NULL; 83 84 if (!pdev) { 85 dp_mon_filter_err("pdev Context is null"); 86 return QDF_STATUS_E_FAILURE; 87 } 88 89 mon_pdev = pdev->monitor_pdev; 90 if (!mon_pdev) { 91 dp_mon_filter_err("Monitor pdev context is null"); 92 return QDF_STATUS_E_FAILURE; 93 } 94 95 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 96 97 mon_filter = (struct dp_mon_filter_be **)qdf_mem_malloc( 98 (sizeof(struct dp_mon_filter_be *) * 99 DP_MON_FILTER_MAX_MODE)); 100 if (!mon_filter) { 101 dp_mon_filter_err("Monitor filter mem allocation failed"); 102 return QDF_STATUS_E_NOMEM; 103 } 104 105 qdf_mem_zero(mon_filter, 106 sizeof(struct dp_mon_filter_be *) * DP_MON_FILTER_MAX_MODE); 107 108 for (mode = 0; mode < DP_MON_FILTER_MAX_MODE; mode++) { 109 mon_filter[mode] = qdf_mem_malloc(sizeof(struct dp_mon_filter_be) * 110 DP_MON_FILTER_SRNG_TYPE_MAX); 111 mon_pdev_be->filter_be = mon_filter; 112 if (!mon_filter[mode]) 113 goto fail; 114 } 115 116 return QDF_STATUS_SUCCESS; 117 fail: 118 dp_mon_filter_dealloc(mon_pdev); 119 return QDF_STATUS_E_FAILURE; 120 } 121 122 void dp_rx_mon_hdr_length_set(uint32_t *msg_word, 123 struct htt_rx_ring_tlv_filter *tlv_filter) 124 { 125 if (!msg_word || !tlv_filter) 126 return; 127 128 HTT_RX_RING_SELECTION_CFG_RX_HDR_LEN_SET(*msg_word, 129 tlv_filter->rx_hdr_length); 130 } 131 132 void dp_rx_mon_packet_length_set(uint32_t *msg_word, 133 struct htt_rx_ring_tlv_filter *tlv_filter) 134 { 135 if (!msg_word || !tlv_filter) 136 return; 137 138 HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word, 139 tlv_filter->mgmt_dma_length); 140 HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word, 141 tlv_filter->ctrl_dma_length); 142 HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_DATA_SET(*msg_word, 143 tlv_filter->data_dma_length); 144 } 145 146 void dp_rx_mon_enable_set(uint32_t *msg_word, 147 struct htt_rx_ring_tlv_filter *tlv_filter) 148 { 149 if (!msg_word || !tlv_filter) 150 return; 151 152 HTT_RX_RING_SELECTION_CFG_RX_MON_GLOBAL_EN_SET(*msg_word, 153 tlv_filter->enable); 154 } 155 156 void dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word, 157 struct htt_rx_ring_tlv_filter *tlv_filter) 158 { 159 if (!msg_word || !tlv_filter) 160 return; 161 162 if (tlv_filter->mgmt_dma_length) { 163 HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 1); 164 HTT_RX_RING_SELECTION_CFG_DMA_MPDU_MGMT_SET(*msg_word, tlv_filter->mgmt_mpdu_log); 165 } 166 167 if (tlv_filter->ctrl_dma_length) { 168 HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 2); 169 HTT_RX_RING_SELECTION_CFG_DMA_MPDU_CTRL_SET(*msg_word, tlv_filter->ctrl_mpdu_log); 170 } 171 172 if (tlv_filter->data_dma_length) { 173 HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 4); 174 HTT_RX_RING_SELECTION_CFG_DMA_MPDU_DATA_SET(*msg_word, tlv_filter->data_mpdu_log); 175 } 176 } 177 178 void 179 dp_rx_mon_word_mask_subscribe(uint32_t *msg_word, 180 struct htt_rx_ring_tlv_filter *tlv_filter) 181 { 182 if (!msg_word || !tlv_filter) 183 return; 184 185 if (!tlv_filter->enable) 186 return; 187 188 HTT_RX_RING_SELECTION_CFG_WORD_MASK_COMPACTION_ENABLE_SET(*msg_word, 1); 189 190 /* word 14 */ 191 msg_word += 3; 192 *msg_word = 0; 193 194 HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_SET( 195 *msg_word, 196 RX_MON_MPDU_START_WMASK); 197 198 /* word 15 */ 199 msg_word++; 200 *msg_word = 0; 201 HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_SET( 202 *msg_word, 203 RX_MON_MSDU_END_WMASK); 204 205 /* word 16 */ 206 msg_word++; 207 /* word 17 */ 208 msg_word++; 209 *msg_word = 0; 210 HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_V2_SET( 211 *msg_word, 212 RX_MON_MPDU_START_WMASK); 213 214 /* word 18 */ 215 msg_word++; 216 *msg_word = 0; 217 HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_V2_SET( 218 *msg_word, 219 RX_MON_MSDU_END_WMASK); 220 /* word 19 */ 221 msg_word++; 222 *msg_word = 0; 223 HTT_RX_RING_SELECTION_CFG_RX_PPDU_END_USR_STATS_WORD_MASK_V2_SET( 224 *msg_word, 225 RX_MON_PPDU_END_USR_STATS_WMASK); 226 } 227 228 void 229 dp_rx_mon_pkt_tlv_offset_subscribe(uint32_t *msg_word, 230 struct htt_rx_ring_tlv_filter *tlv_filter) 231 { 232 if (!msg_word || !tlv_filter) 233 return; 234 235 /* word 16 */ 236 *msg_word = 0; 237 if (tlv_filter->rx_pkt_tlv_offset) { 238 HTT_RX_RING_SELECTION_CFG_ENABLE_RX_PKT_TLV_OFFSET_SET(*msg_word, 1); 239 HTT_RX_RING_SELECTION_CFG_RX_PKT_TLV_OFFSET_SET(*msg_word, 240 tlv_filter->rx_pkt_tlv_offset); 241 } 242 243 } 244 245 void 246 dp_rx_mon_enable_fpmo(uint32_t *msg_word, 247 struct htt_rx_ring_tlv_filter *tlv_filter) 248 { 249 #ifdef FW_SUPPORT_NOT_YET 250 if (!msg_word || !tlv_filter) 251 return; 252 253 if (tlv_filter->enable_fpmo) { 254 /* TYPE: MGMT */ 255 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 256 FPMO, MGMT, 0000, 257 (tlv_filter->fpmo_mgmt_filter & 258 FILTER_MGMT_ASSOC_REQ) ? 1 : 0); 259 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 260 FPMO, MGMT, 0001, 261 (tlv_filter->fpmo_mgmt_filter & 262 FILTER_MGMT_ASSOC_RES) ? 1 : 0); 263 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 264 FPMO, MGMT, 0010, 265 (tlv_filter->fpmo_mgmt_filter & 266 FILTER_MGMT_REASSOC_REQ) ? 1 : 0); 267 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 268 FPMO, MGMT, 0011, 269 (tlv_filter->fpmo_mgmt_filter & 270 FILTER_MGMT_REASSOC_RES) ? 1 : 0); 271 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 272 FPMO, MGMT, 0100, 273 (tlv_filter->fpmo_mgmt_filter & 274 FILTER_MGMT_PROBE_REQ) ? 1 : 0); 275 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 276 FPMO, MGMT, 0101, 277 (tlv_filter->fpmo_mgmt_filter & 278 FILTER_MGMT_PROBE_RES) ? 1 : 0); 279 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 280 FPMO, MGMT, 0110, 281 (tlv_filter->fpmo_mgmt_filter & 282 FILTER_MGMT_TIM_ADVT) ? 1 : 0); 283 /* reserved */ 284 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 285 FPMO, MGMT, 0111, 286 (tlv_filter->fpmo_mgmt_filter & 287 FILTER_MGMT_RESERVED_7) ? 1 : 0); 288 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 289 FPMO, MGMT, 1000, 290 (tlv_filter->fpmo_mgmt_filter & 291 FILTER_MGMT_BEACON) ? 1 : 0); 292 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 293 FPMO, MGMT, 1001, 294 (tlv_filter->fpmo_mgmt_filter & 295 FILTER_MGMT_ATIM) ? 1 : 0); 296 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 297 FPMO, MGMT, 1010, 298 (tlv_filter->fpmo_mgmt_filter & 299 FILTER_MGMT_DISASSOC) ? 1 : 0); 300 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 301 FPMO, MGMT, 1011, 302 (tlv_filter->fpmo_mgmt_filter & 303 FILTER_MGMT_AUTH) ? 1 : 0); 304 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 305 FPMO, MGMT, 1100, 306 (tlv_filter->fpmo_mgmt_filter & 307 FILTER_MGMT_DEAUTH) ? 1 : 0); 308 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 309 FPMO, MGMT, 1101, 310 (tlv_filter->fpmo_mgmt_filter & 311 FILTER_MGMT_ACTION) ? 1 : 0); 312 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 313 FPMO, MGMT, 1110, 314 (tlv_filter->fpmo_mgmt_filter & 315 FILTER_MGMT_ACT_NO_ACK) ? 1 : 0); 316 /* reserved*/ 317 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 318 FPMO, MGMT, 1111, 319 (tlv_filter->fpmo_mgmt_filter & 320 FILTER_MGMT_RESERVED_15) ? 1 : 0); 321 322 /* TYPE: CTRL */ 323 /* reserved */ 324 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 325 FPMO, CTRL, 0000, 326 (tlv_filter->fpmo_ctrl_filter & 327 FILTER_CTRL_RESERVED_1) ? 1 : 0); 328 /* reserved */ 329 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 330 FPMO, CTRL, 0001, 331 (tlv_filter->fpmo_ctrl_filter & 332 FILTER_CTRL_RESERVED_2) ? 1 : 0); 333 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 334 FPMO, CTRL, 0010, 335 (tlv_filter->fpmo_ctrl_filter & 336 FILTER_CTRL_TRIGGER) ? 1 : 0); 337 /* reserved */ 338 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 339 FPMO, CTRL, 0011, 340 (tlv_filter->fpmo_ctrl_filter & 341 FILTER_CTRL_RESERVED_4) ? 1 : 0); 342 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 343 FPMO, CTRL, 0100, 344 (tlv_filter->fpmo_ctrl_filter & 345 FILTER_CTRL_BF_REP_POLL) ? 1 : 0); 346 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 347 FPMO, CTRL, 0101, 348 (tlv_filter->fpmo_ctrl_filter & 349 FILTER_CTRL_VHT_NDP) ? 1 : 0); 350 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 351 FPMO, CTRL, 0110, 352 (tlv_filter->fpmo_ctrl_filter & 353 FILTER_CTRL_FRAME_EXT) ? 1 : 0); 354 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 355 FPMO, CTRL, 0111, 356 (tlv_filter->fpmo_ctrl_filter & 357 FILTER_CTRL_CTRLWRAP) ? 1 : 0); 358 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 359 FPMO, CTRL, 1000, 360 (tlv_filter->fpmo_ctrl_filter & 361 FILTER_CTRL_BA_REQ) ? 1 : 0); 362 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 363 FPMO, CTRL, 1001, 364 (tlv_filter->fpmo_ctrl_filter & 365 FILTER_CTRL_BA) ? 1 : 0); 366 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 367 FPMO, CTRL, 1010, 368 (tlv_filter->fpmo_ctrl_filter & 369 FILTER_CTRL_PSPOLL) ? 1 : 0); 370 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 371 FPMO, CTRL, 1011, 372 (tlv_filter->fpmo_ctrl_filter & 373 FILTER_CTRL_RTS) ? 1 : 0); 374 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 375 FPMO, CTRL, 1100, 376 (tlv_filter->fpmo_ctrl_filter & 377 FILTER_CTRL_CTS) ? 1 : 0); 378 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 379 FPMO, CTRL, 1101, 380 (tlv_filter->fpmo_ctrl_filter & 381 FILTER_CTRL_ACK) ? 1 : 0); 382 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 383 FPMO, CTRL, 1110, 384 (tlv_filter->fpmo_ctrl_filter & 385 FILTER_CTRL_CFEND) ? 1 : 0); 386 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0, 387 FPMO, CTRL, 1111, 388 (tlv_filter->fpmo_ctrl_filter & 389 FILTER_CTRL_CFEND_CFACK) ? 1 : 0); 390 391 /* word 18 */ 392 msg_word++; 393 *msg_word = 0; 394 395 /* TYPE: DATA */ 396 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1, 397 FPMO, DATA, MCAST, 398 (tlv_filter->fpmo_data_filter & 399 FILTER_DATA_MCAST) ? 1 : 0); 400 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1, 401 FPMO, DATA, UCAST, 402 (tlv_filter->fpmo_data_filter & 403 FILTER_DATA_UCAST) ? 1 : 0); 404 htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1, 405 FPMO, DATA, NULL, 406 (tlv_filter->fpmo_data_filter & 407 FILTER_DATA_NULL) ? 1 : 0); 408 409 } else { 410 /* clear word 18 if fpmo is disabled 411 * word 17 is already cleared by caller 412 */ 413 414 /* word 18 */ 415 msg_word++; 416 *msg_word = 0; 417 } 418 #endif 419 } 420 421 static void 422 htt_tx_tlv_filter_mask_set_in0(uint32_t *msg_word, 423 struct htt_tx_ring_tlv_filter *htt_tlv_filter) 424 { 425 struct dp_tx_mon_downstream_tlv_config *tlv = &htt_tlv_filter->dtlvs; 426 427 if (tlv->tx_fes_setup) 428 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 429 TX_FES_SETUP, 430 tlv->tx_fes_setup); 431 432 if (tlv->tx_peer_entry) 433 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 434 TX_PEER_ENTRY, 435 tlv->tx_peer_entry); 436 437 if (tlv->tx_queue_extension) 438 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 439 TX_QUEUE_EXTENSION, 440 tlv->tx_queue_extension); 441 442 if (tlv->tx_last_mpdu_end) 443 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 444 TX_LAST_MPDU_END, 445 tlv->tx_last_mpdu_end); 446 447 if (tlv->tx_last_mpdu_fetched) 448 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 449 TX_LAST_MPDU_FETCHED, 450 tlv->tx_last_mpdu_fetched); 451 452 if (tlv->tx_data_sync) 453 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 454 TX_DATA_SYNC, 455 tlv->tx_data_sync); 456 457 if (tlv->pcu_ppdu_setup_init) 458 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 459 PCU_PPDU_SETUP_INIT, 460 tlv->pcu_ppdu_setup_init); 461 462 if (tlv->fw2s_mon) 463 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 464 FW2SW_MON, 465 tlv->fw2s_mon); 466 467 if (tlv->tx_loopback_setup) 468 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 469 TX_LOOPBACK_SETUP, 470 tlv->tx_loopback_setup); 471 472 if (tlv->sch_critical_tlv_ref) 473 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 474 SCH_CRITICAL_TLV_REFERENCE, 475 tlv->sch_critical_tlv_ref); 476 477 if (tlv->ndp_preamble_done) 478 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 479 NDP_PREAMBLE_DONE, 480 tlv->ndp_preamble_done); 481 482 if (tlv->tx_raw_frame_setup) 483 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 484 TX_RAW_OR_NATIVE_FRAME_SETUP, 485 tlv->tx_raw_frame_setup); 486 487 if (tlv->txpcu_user_setup) 488 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 489 TXPCU_USER_SETUP, 490 tlv->txpcu_user_setup); 491 492 if (tlv->rxpcu_setup) 493 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 494 RXPCU_SETUP, 495 tlv->rxpcu_setup); 496 497 if (tlv->rxpcu_setup_complete) 498 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 499 RXPCU_SETUP_COMPLETE, 500 tlv->rxpcu_setup_complete); 501 502 if (tlv->coex_tx_req) 503 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 504 COEX_TX_REQ, 505 tlv->coex_tx_req); 506 507 if (tlv->rxpcu_user_setup) 508 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 509 RXPCU_USER_SETUP, 510 tlv->rxpcu_user_setup); 511 512 if (tlv->rxpcu_user_setup_ext) 513 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 514 RXPCU_USER_SETUP_EXT, 515 tlv->rxpcu_user_setup_ext); 516 517 if (tlv->wur_data) 518 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 519 TX_WUR_DATA, 520 tlv->wur_data); 521 522 if (tlv->tqm_mpdu_global_start) 523 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 524 TQM_MPDU_GLOBAL_START, 525 tlv->tqm_mpdu_global_start); 526 527 if (tlv->tx_fes_setup_complete) 528 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 529 TX_FES_SETUP_COMPLETE, 530 tlv->tx_fes_setup_complete); 531 532 if (tlv->scheduler_end) 533 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 534 SCHEDULER_END, 535 tlv->scheduler_end); 536 537 if (tlv->sch_wait_instr_tx_path) 538 htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word, 539 SCH_WAIT_INSTR_TX_PATH, 540 tlv->sch_wait_instr_tx_path); 541 } 542 543 static void 544 htt_tx_tlv_filter_mask_set_in1(uint32_t *msg_word, 545 struct htt_tx_ring_tlv_filter *htt_tlv_filter) 546 { 547 struct dp_tx_mon_upstream_tlv_config *tlv = &htt_tlv_filter->utlvs; 548 549 if (tlv->rx_response_required_info) 550 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 551 RX_RESPONSE_REQUIRED_INFO, 552 tlv->rx_response_required_info); 553 554 if (tlv->response_start_status) 555 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 556 RESPONSE_START_STATUS, 557 tlv->response_start_status); 558 559 if (tlv->response_end_status) 560 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 561 RESPONSE_END_STATUS, 562 tlv->response_end_status); 563 564 if (tlv->tx_fes_status_start) 565 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 566 TX_FES_STATUS_START, 567 tlv->tx_fes_status_start); 568 569 if (tlv->tx_fes_status_end) 570 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 571 TX_FES_STATUS_END, 572 tlv->tx_fes_status_end); 573 574 if (tlv->tx_fes_status_start_ppdu) 575 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 576 TX_FES_STATUS_START_PPDU, 577 tlv->tx_fes_status_start_ppdu); 578 579 if (tlv->tx_fes_status_user_ppdu) 580 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 581 TX_FES_STATUS_USER_PPDU, 582 tlv->tx_fes_status_user_ppdu); 583 584 if (tlv->tx_fes_status_ack_or_ba) 585 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 586 TX_FES_STATUS_ACK_OR_BA, 587 tlv->tx_fes_status_ack_or_ba); 588 589 if (tlv->tx_fes_status_1k_ba) 590 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 591 TX_FES_STATUS_1K_BA, 592 tlv->tx_fes_status_1k_ba); 593 594 if (tlv->tx_fes_status_start_prot) 595 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 596 TX_FES_STATUS_START_PROT, 597 tlv->tx_fes_status_start_prot); 598 599 if (tlv->tx_fes_status_prot) 600 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 601 TX_FES_STATUS_PROT, 602 tlv->tx_fes_status_prot); 603 604 if (tlv->tx_fes_status_user_response) 605 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 606 TX_FES_STATUS_USER_RESPONSE, 607 tlv->tx_fes_status_user_response); 608 609 if (tlv->rx_frame_bitmap_ack) 610 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 611 RX_FRAME_BITMAP_ACK, 612 tlv->rx_frame_bitmap_ack); 613 614 if (tlv->rx_frame_1k_bitmap_ack) 615 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 616 RX_FRAME_1K_BITMAP_ACK, 617 tlv->rx_frame_1k_bitmap_ack); 618 619 if (tlv->coex_tx_status) 620 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 621 COEX_TX_STATUS, 622 tlv->coex_tx_status); 623 624 if (tlv->received_response_info) 625 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 626 RECEIVED_RESPONSE_INFO, 627 tlv->received_response_info); 628 629 if (tlv->received_response_info_p2) 630 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 631 RECEIVED_RESPONSE_INFO_PART2, 632 tlv->received_response_info_p2); 633 634 if (tlv->ofdma_trigger_details) 635 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 636 OFDMA_TRIGGER_DETAILS, 637 tlv->ofdma_trigger_details); 638 639 if (tlv->received_trigger_info) 640 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 641 RECEIVED_TRIGGER_INFO, 642 tlv->received_trigger_info); 643 644 if (tlv->pdg_tx_request) 645 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 646 PDG_TX_REQUEST, 647 tlv->pdg_tx_request); 648 649 if (tlv->pdg_response) 650 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 651 PDG_RESPONSE, 652 tlv->pdg_response); 653 654 if (tlv->pdg_trig_response) 655 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 656 PDG_TRIG_RESPONSE, 657 tlv->pdg_trig_response); 658 659 if (tlv->trigger_response_tx_done) 660 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 661 TRIGGER_RESPONSE_TX_DONE, 662 tlv->trigger_response_tx_done); 663 664 if (tlv->prot_tx_end) 665 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 666 PROT_TX_END, 667 tlv->prot_tx_end); 668 669 if (tlv->ppdu_tx_end) 670 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 671 PPDU_TX_END, 672 tlv->ppdu_tx_end); 673 674 if (tlv->r2r_status_end) 675 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 676 R2R_STATUS_END, 677 tlv->r2r_status_end); 678 679 if (tlv->flush_req) 680 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 681 FLUSH_REQ, 682 tlv->flush_req); 683 684 if (tlv->mactx_phy_desc) 685 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 686 MACTX_PHY_DESC, 687 tlv->mactx_phy_desc); 688 689 if (tlv->mactx_user_desc_cmn) 690 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 691 MACTX_USER_DESC_COMMON, 692 tlv->mactx_user_desc_cmn); 693 694 if (tlv->mactx_user_desc_per_usr) 695 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 696 MACTX_USER_DESC_PER_USER, 697 tlv->mactx_user_desc_per_usr); 698 699 if (tlv->l_sig_a) 700 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 701 L_SIG_A, 702 tlv->l_sig_a); 703 704 if (tlv->l_sig_b) 705 htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word, 706 L_SIG_B, 707 tlv->l_sig_b); 708 } 709 710 static void 711 htt_tx_tlv_filter_mask_set_in2(uint32_t *msg_word, 712 struct htt_tx_ring_tlv_filter *htt_tlv_filter) 713 { 714 struct dp_tx_mon_upstream_tlv_config *tlv = &htt_tlv_filter->utlvs; 715 716 if (tlv->ht_sig) 717 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 718 HT_SIG, 719 tlv->ht_sig); 720 721 if (tlv->vht_sig_a) 722 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 723 VHT_SIG_A, 724 tlv->vht_sig_a); 725 726 if (tlv->vht_sig_b_su20) 727 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 728 VHT_SIG_B_SU20, 729 tlv->vht_sig_b_su20); 730 731 if (tlv->vht_sig_b_su40) 732 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 733 VHT_SIG_B_SU40, 734 tlv->vht_sig_b_su40); 735 736 if (tlv->vht_sig_b_su80) 737 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 738 VHT_SIG_B_SU80, 739 tlv->vht_sig_b_su80); 740 741 if (tlv->vht_sig_b_su160) 742 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 743 VHT_SIG_B_SU160, 744 tlv->vht_sig_b_su160); 745 746 if (tlv->vht_sig_b_mu20) 747 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 748 VHT_SIG_B_MU20, 749 tlv->vht_sig_b_mu20); 750 751 if (tlv->vht_sig_b_mu40) 752 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 753 VHT_SIG_B_MU40, 754 tlv->vht_sig_b_mu40); 755 756 if (tlv->vht_sig_b_mu80) 757 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 758 VHT_SIG_B_MU80, 759 tlv->vht_sig_b_mu80); 760 761 if (tlv->vht_sig_b_mu160) 762 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 763 VHT_SIG_B_MU160, 764 tlv->vht_sig_b_mu160); 765 766 if (tlv->tx_service) 767 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 768 TX_SERVICE, 769 tlv->tx_service); 770 771 if (tlv->he_sig_a_su) 772 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 773 HE_SIG_A_SU, 774 tlv->he_sig_a_su); 775 776 if (tlv->he_sig_a_mu_dl) 777 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 778 HE_SIG_A_MU_DL, 779 tlv->he_sig_a_mu_dl); 780 781 if (tlv->he_sig_a_mu_ul) 782 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 783 HE_SIG_A_MU_UL, 784 tlv->he_sig_a_mu_ul); 785 786 if (tlv->he_sig_b1_mu) 787 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 788 HE_SIG_B1_MU, 789 tlv->he_sig_b1_mu); 790 791 if (tlv->he_sig_b2_mu) 792 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 793 HE_SIG_B2_MU, 794 tlv->he_sig_b2_mu); 795 796 if (tlv->he_sig_b2_ofdma) 797 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 798 HE_SIG_B2_OFDMA, 799 tlv->he_sig_b2_ofdma); 800 801 if (tlv->u_sig_eht_su_mu) 802 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 803 U_SIG_EHT_SU_MU, 804 tlv->u_sig_eht_su_mu); 805 806 if (tlv->u_sig_eht_su) 807 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 808 U_SIG_EHT_SU, 809 tlv->u_sig_eht_su); 810 811 if (tlv->u_sig_eht_tb) 812 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 813 U_SIG_EHT_TB, 814 tlv->u_sig_eht_tb); 815 816 if (tlv->eht_sig_usr_su) 817 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 818 EHT_SIG_USR_SU, 819 tlv->eht_sig_usr_su); 820 821 if (tlv->eht_sig_usr_mu_mimo) 822 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 823 EHT_SIG_USR_MU_MIMO, 824 tlv->eht_sig_usr_mu_mimo); 825 826 if (tlv->eht_sig_usr_ofdma) 827 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 828 EHT_SIG_USR_OFDMA, 829 tlv->eht_sig_usr_ofdma); 830 831 if (tlv->phytx_ppdu_header_info_request) 832 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 833 PHYTX_PPDU_HEADER_INFO_REQUEST, 834 tlv->phytx_ppdu_header_info_request); 835 836 if (tlv->tqm_update_tx_mpdu_count) 837 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 838 TQM_UPDATE_TX_MPDU_COUNT, 839 tlv->tqm_update_tx_mpdu_count); 840 841 if (tlv->tqm_acked_mpdu) 842 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 843 TQM_ACKED_MPDU, 844 tlv->tqm_acked_mpdu); 845 846 if (tlv->tqm_acked_1k_mpdu) 847 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 848 TQM_ACKED_1K_MPDU, 849 tlv->tqm_acked_1k_mpdu); 850 851 if (tlv->txpcu_buf_status) 852 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 853 TXPCU_BUFFER_STATUS, 854 tlv->txpcu_buf_status); 855 856 if (tlv->txpcu_user_buf_status) 857 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 858 TXPCU_USER_BUFFER_STATUS, 859 tlv->txpcu_user_buf_status); 860 861 if (tlv->txdma_stop_request) 862 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 863 TXDMA_STOP_REQUEST, 864 tlv->txdma_stop_request); 865 866 if (tlv->expected_response) 867 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 868 EXPECTED_RESPONSE, 869 tlv->expected_response); 870 871 if (tlv->tx_mpdu_count_transfer_end) 872 htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word, 873 TX_MPDU_COUNT_TRANSFER_END, 874 tlv->tx_mpdu_count_transfer_end); 875 } 876 877 static void 878 htt_tx_tlv_filter_mask_set_in3(uint32_t *msg_word, 879 struct htt_tx_ring_tlv_filter *htt_tlv_filter) 880 { 881 struct dp_tx_mon_upstream_tlv_config *tlv = &htt_tlv_filter->utlvs; 882 883 if (tlv->rx_trig_info) 884 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 885 RX_TRIG_INFO, 886 tlv->rx_trig_info); 887 888 if (tlv->rxpcu_tx_setup_clear) 889 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 890 RXPCU_TX_SETUP_CLEAR, 891 tlv->rxpcu_tx_setup_clear); 892 893 if (tlv->rx_frame_bitmap_req) 894 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 895 RX_FRAME_BITMAP_REQ, 896 tlv->rx_frame_bitmap_req); 897 898 if (tlv->rx_phy_sleep) 899 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 900 RX_PHY_SLEEP, 901 tlv->rx_phy_sleep); 902 903 if (tlv->txpcu_preamble_done) 904 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 905 TXPCU_PREAMBLE_DONE, 906 tlv->txpcu_preamble_done); 907 908 if (tlv->txpcu_phytx_debug32) 909 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 910 TXPCU_PHYTX_DEBUG32, 911 tlv->txpcu_phytx_debug32); 912 913 if (tlv->txpcu_phytx_other_transmit_info32) 914 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 915 TXPCU_PHYTX_OTHER_TRANSMIT_INFO32, 916 tlv->txpcu_phytx_other_transmit_info32); 917 918 if (tlv->rx_ppdu_noack_report) 919 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 920 RX_PPDU_NO_ACK_REPORT, 921 tlv->rx_ppdu_noack_report); 922 923 if (tlv->rx_ppdu_ack_report) 924 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 925 RX_PPDU_ACK_REPORT, 926 tlv->rx_ppdu_ack_report); 927 928 if (tlv->coex_rx_status) 929 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 930 COEX_RX_STATUS, 931 tlv->coex_rx_status); 932 933 if (tlv->rx_start_param) 934 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 935 RX_START_PARAM, 936 tlv->rx_start_param); 937 938 if (tlv->tx_cbf_info) 939 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 940 TX_CBF_INFO, 941 tlv->tx_cbf_info); 942 943 if (tlv->rxpcu_early_rx_indication) 944 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 945 RXPCU_EARLY_RX_INDICATION, 946 tlv->rxpcu_early_rx_indication); 947 948 if (tlv->received_response_user_7_0) 949 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 950 RECEIVED_RESPONSE_USER_7_0, 951 tlv->received_response_user_7_0); 952 953 if (tlv->received_response_user_15_8) 954 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 955 RECEIVED_RESPONSE_USER_15_8, 956 tlv->received_response_user_15_8); 957 958 if (tlv->received_response_user_23_16) 959 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 960 RECEIVED_RESPONSE_USER_23_16, 961 tlv->received_response_user_23_16); 962 963 if (tlv->received_response_user_31_24) 964 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 965 RECEIVED_RESPONSE_USER_31_24, 966 tlv->received_response_user_31_24); 967 968 if (tlv->received_response_user_36_32) 969 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 970 RECEIVED_RESPONSE_USER_36_32, 971 tlv->received_response_user_36_32); 972 973 if (tlv->rx_pm_info) 974 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 975 RX_PM_INFO, 976 tlv->rx_pm_info); 977 978 if (tlv->rx_preamble) 979 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 980 RX_PREAMBLE, 981 tlv->rx_preamble); 982 983 if (tlv->others) 984 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 985 OTHERS, 986 tlv->others); 987 988 if (tlv->mactx_pre_phy_desc) 989 htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word, 990 MACTX_PRE_PHY_DESC, 991 tlv->mactx_pre_phy_desc); 992 } 993 994 /* 995 * dp_htt_h2t_send_complete_free_netbuf() - Free completed buffer 996 * @soc: SOC handl 997 * @status: Completion status 998 * @netbuf: HTT buffer 999 */ 1000 static void 1001 dp_htt_h2t_send_complete_free_netbuf( 1002 void *soc, A_STATUS status, qdf_nbuf_t netbuf) 1003 { 1004 qdf_nbuf_free(netbuf); 1005 } 1006 1007 /* 1008 * htt_h2t_tx_ring_cfg() - Send SRNG packet and TLV filter 1009 * config message to target 1010 * @htt_soc: HTT SOC handle 1011 * @pdev_id: WIN- PDEV Id, MCL- mac id 1012 * @hal_srng: Opaque HAL SRNG pointer 1013 * @hal_ring_type: SRNG ring type 1014 * @ring_buf_size: SRNG buffer size 1015 * @htt_tlv_filter: Rx SRNG TLV and filter setting 1016 * Return: 0 on success; error code on failure 1017 */ 1018 int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, 1019 hal_ring_handle_t hal_ring_hdl, 1020 int hal_ring_type, int ring_buf_size, 1021 struct htt_tx_ring_tlv_filter *htt_tlv_filter) 1022 { 1023 struct htt_soc *soc = (struct htt_soc *)htt_soc; 1024 struct dp_htt_htc_pkt *pkt; 1025 qdf_nbuf_t htt_msg; 1026 uint32_t *msg_word; 1027 struct hal_srng_params srng_params; 1028 uint32_t htt_ring_id; 1029 uint8_t *htt_logger_bufp; 1030 int target_pdev_id; 1031 QDF_STATUS status; 1032 1033 htt_msg = qdf_nbuf_alloc(soc->osdev, 1034 HTT_MSG_BUF_SIZE(HTT_TX_MONITOR_CFG_SZ), 1035 1036 /* reserve room for the HTC header */ 1037 HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, TRUE); 1038 if (!htt_msg) 1039 goto fail0; 1040 1041 hal_get_srng_params(soc->hal_soc, hal_ring_hdl, &srng_params); 1042 1043 switch (hal_ring_type) { 1044 case TX_MONITOR_BUF: 1045 htt_ring_id = HTT_TX_MON_HOST2MON_BUF_RING; 1046 break; 1047 case TX_MONITOR_DST: 1048 htt_ring_id = HTT_TX_MON_MON2HOST_DEST_RING; 1049 break; 1050 default: 1051 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, 1052 "%s: Ring currently not supported", __func__); 1053 goto fail1; 1054 } 1055 1056 /* 1057 * Set the length of the message. 1058 * The contribution from the HTC_HDR_ALIGNMENT_PADDING is added 1059 * separately during the below call to qdf_nbuf_push_head. 1060 * The contribution from the HTC header is added separately inside HTC. 1061 */ 1062 if (qdf_nbuf_put_tail(htt_msg, HTT_TX_MONITOR_CFG_SZ) == NULL) { 1063 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, 1064 "%s: Failed to expand head for TX Ring Cfg msg", 1065 __func__); 1066 goto fail1; /* failure */ 1067 } 1068 1069 msg_word = (uint32_t *)qdf_nbuf_data(htt_msg); 1070 1071 /* rewind beyond alignment pad to get to the HTC header reserved area */ 1072 qdf_nbuf_push_head(htt_msg, HTC_HDR_ALIGNMENT_PADDING); 1073 1074 /* word 0 */ 1075 htt_logger_bufp = (uint8_t *)msg_word; 1076 *msg_word = 0; 1077 HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_H2T_MSG_TYPE_TX_MONITOR_CFG); 1078 1079 /* 1080 * pdev_id is indexed from 0 whereas mac_id is indexed from 1 1081 * SW_TO_SW and SW_TO_HW rings are unaffected by this 1082 */ 1083 target_pdev_id = 1084 dp_get_target_pdev_id_for_host_pdev_id(soc->dp_soc, pdev_id); 1085 1086 HTT_TX_MONITOR_CFG_PDEV_ID_SET(*msg_word, 1087 target_pdev_id); 1088 1089 HTT_TX_MONITOR_CFG_RING_ID_SET(*msg_word, htt_ring_id); 1090 1091 HTT_TX_MONITOR_CFG_STATUS_TLV_SET(*msg_word, 1092 !!(srng_params.flags & HAL_SRNG_MSI_SWAP)); 1093 1094 HTT_TX_MONITOR_CFG_TX_MON_GLOBAL_EN_SET(*msg_word, 1095 htt_tlv_filter->enable); 1096 1097 /* word 1 */ 1098 msg_word++; 1099 *msg_word = 0; 1100 HTT_TX_MONITOR_CFG_RING_BUFFER_SIZE_SET(*msg_word, 1101 ring_buf_size); 1102 1103 if (htt_tlv_filter->mgmt_filter) 1104 htt_tx_ring_pkt_type_set(*msg_word, ENABLE_FLAGS, 1105 MGMT, 1); 1106 1107 if (htt_tlv_filter->ctrl_filter) 1108 htt_tx_ring_pkt_type_set(*msg_word, ENABLE_FLAGS, 1109 CTRL, 2); 1110 1111 if (htt_tlv_filter->data_filter) 1112 htt_tx_ring_pkt_type_set(*msg_word, ENABLE_FLAGS, 1113 DATA, 4); 1114 1115 if (htt_tlv_filter->mgmt_dma_length) 1116 HTT_TX_MONITOR_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word, 1117 htt_tlv_filter->mgmt_dma_length); 1118 1119 if (htt_tlv_filter->ctrl_dma_length) 1120 HTT_TX_MONITOR_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word, 1121 htt_tlv_filter->ctrl_dma_length); 1122 1123 if (htt_tlv_filter->data_dma_length) 1124 HTT_TX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word, 1125 htt_tlv_filter->data_dma_length); 1126 1127 /* word 2*/ 1128 msg_word++; 1129 *msg_word = 0; 1130 if (htt_tlv_filter->mgmt_filter) 1131 HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1); 1132 1133 if (htt_tlv_filter->ctrl_filter) 1134 HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 2); 1135 1136 if (htt_tlv_filter->data_filter) 1137 HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 4); 1138 1139 if (htt_tlv_filter->mgmt_mpdu_start) 1140 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_MGMT_SET(*msg_word, 1); 1141 1142 if (htt_tlv_filter->ctrl_mpdu_start) 1143 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_CTRL_SET(*msg_word, 1); 1144 1145 if (htt_tlv_filter->data_mpdu_start) 1146 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_DATA_SET(*msg_word, 1); 1147 1148 if (htt_tlv_filter->mgmt_msdu_start) 1149 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_MGMT_SET(*msg_word, 1); 1150 1151 if (htt_tlv_filter->ctrl_msdu_start) 1152 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_CTRL_SET(*msg_word, 1); 1153 1154 if (htt_tlv_filter->data_msdu_start) 1155 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_DATA_SET(*msg_word, 1); 1156 1157 if (htt_tlv_filter->mgmt_mpdu_end) 1158 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_MGMT_SET(*msg_word, 1); 1159 1160 if (htt_tlv_filter->ctrl_mpdu_end) 1161 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_CTRL_SET(*msg_word, 1); 1162 1163 if (htt_tlv_filter->data_mpdu_end) 1164 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_DATA_SET(*msg_word, 1); 1165 1166 if (htt_tlv_filter->mgmt_msdu_end) 1167 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_MGMT_SET(*msg_word, 1); 1168 1169 if (htt_tlv_filter->ctrl_msdu_end) 1170 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_CTRL_SET(*msg_word, 1); 1171 1172 if (htt_tlv_filter->data_msdu_end) 1173 HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_DATA_SET(*msg_word, 1); 1174 1175 /* word 3 */ 1176 msg_word++; 1177 *msg_word = 0; 1178 1179 htt_tx_tlv_filter_mask_set_in0(msg_word, htt_tlv_filter); 1180 1181 /* word 4 */ 1182 msg_word++; 1183 *msg_word = 0; 1184 1185 htt_tx_tlv_filter_mask_set_in1(msg_word, htt_tlv_filter); 1186 1187 /* word 5 */ 1188 msg_word++; 1189 *msg_word = 0; 1190 1191 htt_tx_tlv_filter_mask_set_in2(msg_word, htt_tlv_filter); 1192 1193 /* word 6 */ 1194 msg_word++; 1195 *msg_word = 0; 1196 1197 htt_tx_tlv_filter_mask_set_in3(msg_word, htt_tlv_filter); 1198 1199 /* word 7 */ 1200 msg_word++; 1201 *msg_word = 0; 1202 if (htt_tlv_filter->wmask.tx_fes_setup) 1203 HTT_TX_MONITOR_CFG_TX_FES_SETUP_WORD_MASK_SET(*msg_word, 1204 htt_tlv_filter->wmask.tx_fes_setup); 1205 1206 if (htt_tlv_filter->wmask.tx_peer_entry) 1207 HTT_TX_MONITOR_CFG_TX_PEER_ENTRY_WORD_MASK_SET(*msg_word, 1208 htt_tlv_filter->wmask.tx_peer_entry); 1209 1210 if (htt_tlv_filter->wmask.tx_queue_ext) 1211 HTT_TX_MONITOR_CFG_TX_QUEUE_EXT_WORD_MASK_SET(*msg_word, 1212 htt_tlv_filter->wmask.tx_queue_ext); 1213 1214 if (htt_tlv_filter->wmask.tx_msdu_start) 1215 HTT_TX_MONITOR_CFG_TX_MSDU_START_WORD_MASK_SET(*msg_word, 1216 htt_tlv_filter->wmask.tx_msdu_start); 1217 1218 /* word 8 */ 1219 msg_word++; 1220 *msg_word = 0; 1221 if (htt_tlv_filter->wmask.pcu_ppdu_setup_init) 1222 HTT_TX_MONITOR_CFG_PCU_PPDU_SETUP_WORD_MASK_SET(*msg_word, 1223 htt_tlv_filter->wmask.pcu_ppdu_setup_init); 1224 1225 /* word 9 */ 1226 msg_word++; 1227 *msg_word = 0; 1228 1229 if (htt_tlv_filter->wmask.tx_mpdu_start) 1230 HTT_TX_MONITOR_CFG_TX_MPDU_START_WORD_MASK_SET(*msg_word, 1231 htt_tlv_filter->wmask.tx_mpdu_start); 1232 1233 if (htt_tlv_filter->wmask.rxpcu_user_setup) 1234 HTT_TX_MONITOR_CFG_RXPCU_USER_SETUP_WORD_MASK_SET(*msg_word, 1235 htt_tlv_filter->wmask.rxpcu_user_setup); 1236 1237 htt_tx_ring_pkt_type_set(*msg_word, ENABLE_MSDU_OR_MPDU_LOGGING, 1238 MGMT, 1239 htt_tlv_filter->mgmt_mpdu_log); 1240 1241 htt_tx_ring_pkt_type_set(*msg_word, ENABLE_MSDU_OR_MPDU_LOGGING, 1242 CTRL, 1243 htt_tlv_filter->ctrl_mpdu_log); 1244 1245 htt_tx_ring_pkt_type_set(*msg_word, ENABLE_MSDU_OR_MPDU_LOGGING, 1246 DATA, 1247 htt_tlv_filter->data_mpdu_log); 1248 1249 HTT_TX_MONITOR_CFG_DMA_MPDU_MGMT_SET(*msg_word, 1250 htt_tlv_filter->mgmt_mpdu_log); 1251 HTT_TX_MONITOR_CFG_DMA_MPDU_CTRL_SET(*msg_word, 1252 htt_tlv_filter->ctrl_mpdu_log); 1253 HTT_TX_MONITOR_CFG_DMA_MPDU_DATA_SET(*msg_word, 1254 htt_tlv_filter->data_mpdu_log); 1255 1256 pkt = htt_htc_pkt_alloc(soc); 1257 if (!pkt) 1258 goto fail1; 1259 1260 pkt->soc_ctxt = NULL; /* not used during send-done callback */ 1261 1262 SET_HTC_PACKET_INFO_TX( 1263 &pkt->htc_pkt, 1264 dp_htt_h2t_send_complete_free_netbuf, 1265 qdf_nbuf_data(htt_msg), 1266 qdf_nbuf_len(htt_msg), 1267 soc->htc_endpoint, 1268 HTC_TX_PACKET_TAG_RUNTIME_PUT); /* tag for no FW response msg */ 1269 1270 SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, htt_msg); 1271 status = DP_HTT_SEND_HTC_PKT(soc, pkt, 1272 HTT_H2T_MSG_TYPE_TX_MONITOR_CFG, 1273 htt_logger_bufp); 1274 1275 if (status != QDF_STATUS_SUCCESS) { 1276 qdf_nbuf_free(htt_msg); 1277 htt_htc_pkt_free(soc, pkt); 1278 } 1279 1280 return status; 1281 1282 fail1: 1283 qdf_nbuf_free(htt_msg); 1284 fail0: 1285 return QDF_STATUS_E_FAILURE; 1286 } 1287 1288 #ifdef QCA_ENHANCED_STATS_SUPPORT 1289 void dp_mon_filter_setup_enhanced_stats_2_0(struct dp_pdev *pdev) 1290 { 1291 struct dp_mon_filter_be filter = {0}; 1292 enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE; 1293 enum dp_mon_filter_srng_type srng_type = 1294 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 1295 struct dp_mon_filter *rx_tlv_filter; 1296 struct dp_mon_pdev *mon_pdev; 1297 struct dp_mon_pdev_be *mon_pdev_be; 1298 1299 if (!pdev) { 1300 dp_mon_filter_err("pdev Context is null"); 1301 return; 1302 } 1303 1304 mon_pdev = pdev->monitor_pdev; 1305 mon_pdev_be = 1306 dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 1307 1308 rx_tlv_filter = &filter.rx_tlv_filter; 1309 dp_mon_filter_set_status_cmn(mon_pdev, rx_tlv_filter); 1310 /* Setup the filter */ 1311 rx_tlv_filter->tlv_filter.ppdu_end_user_stats_ext = 0; 1312 rx_tlv_filter->tlv_filter.enable_mo = 0; 1313 rx_tlv_filter->tlv_filter.mo_mgmt_filter = 0; 1314 rx_tlv_filter->tlv_filter.mo_ctrl_filter = 0; 1315 rx_tlv_filter->tlv_filter.mo_data_filter = 0; 1316 rx_tlv_filter->tlv_filter.ppdu_start_user_info = 1; 1317 /* Enabled the filter */ 1318 rx_tlv_filter->valid = true; 1319 1320 dp_mon_filter_show_rx_filter_be(mode, &filter); 1321 1322 mon_pdev_be->filter_be[mode][srng_type] = filter; 1323 } 1324 1325 void dp_mon_filter_reset_enhanced_stats_2_0(struct dp_pdev *pdev) 1326 { 1327 struct dp_mon_filter_be filter = {0}; 1328 enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE; 1329 enum dp_mon_filter_srng_type srng_type = 1330 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 1331 struct dp_mon_pdev *mon_pdev; 1332 struct dp_mon_pdev_be *mon_pdev_be; 1333 1334 if (!pdev) { 1335 dp_mon_filter_err("pdev Context is null"); 1336 return; 1337 } 1338 1339 mon_pdev = pdev->monitor_pdev; 1340 mon_pdev_be = 1341 dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 1342 1343 mon_pdev_be->filter_be[mode][srng_type] = filter; 1344 } 1345 #endif /* QCA_ENHANCED_STATS_SUPPORT */ 1346 1347 #ifdef QCA_UNDECODED_METADATA_SUPPORT 1348 void 1349 dp_mon_filter_setup_undecoded_metadata_capture_2_0(struct dp_pdev *pdev) 1350 { 1351 } 1352 1353 void 1354 dp_mon_filter_reset_undecoded_metadata_capture_2_0(struct dp_pdev *pdev) 1355 { 1356 } 1357 #endif 1358 1359 void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter) 1360 { 1361 filter->dtlvs.tx_fes_setup = 1; 1362 filter->dtlvs.pcu_ppdu_setup_init = 1; 1363 filter->dtlvs.tx_peer_entry = 1; 1364 filter->dtlvs.tx_queue_extension = 1; 1365 filter->dtlvs.fw2s_mon = 1; 1366 } 1367 1368 void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter) 1369 { 1370 filter->utlvs.tx_fes_status_end = 1; 1371 filter->utlvs.rx_response_required_info = 1; 1372 filter->utlvs.response_end_status = 1; 1373 filter->utlvs.tx_fes_status_start = 1; 1374 filter->utlvs.tx_fes_status_start_prot = 1; 1375 filter->utlvs.tx_fes_status_prot = 1; 1376 filter->utlvs.tx_fes_status_start_ppdu = 1; 1377 filter->utlvs.tx_fes_status_user_ppdu = 1; 1378 filter->utlvs.coex_tx_status = 1; 1379 filter->utlvs.rx_frame_bitmap_ack = 1; 1380 filter->utlvs.rx_frame_1k_bitmap_ack = 1; 1381 filter->utlvs.he_sig_a_su = 1; 1382 filter->utlvs.he_sig_a_mu_dl = 1; 1383 filter->utlvs.he_sig_b1_mu = 1; 1384 filter->utlvs.he_sig_b2_mu = 1; 1385 filter->utlvs.he_sig_b2_ofdma = 1; 1386 filter->utlvs.l_sig_b = 1; 1387 filter->utlvs.l_sig_a = 1; 1388 filter->utlvs.ht_sig = 1; 1389 filter->utlvs.vht_sig_a = 1; 1390 filter->utlvs.mactx_phy_desc = 1; 1391 filter->utlvs.mactx_user_desc_cmn = 1; 1392 filter->utlvs.mactx_user_desc_per_usr = 1; 1393 } 1394 1395 void dp_tx_mon_filter_set_word_mask(struct htt_tx_ring_tlv_filter *filter) 1396 { 1397 filter->wmask.tx_fes_setup = 1; 1398 filter->wmask.tx_peer_entry = 1; 1399 filter->wmask.tx_queue_ext = 1; 1400 filter->wmask.tx_msdu_start = 1; 1401 filter->wmask.tx_mpdu_start = 1; 1402 filter->wmask.pcu_ppdu_setup_init = 1; 1403 filter->wmask.rxpcu_user_setup = 1; 1404 } 1405 1406 void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be, 1407 struct htt_tx_ring_tlv_filter *filter) 1408 { 1409 qdf_mem_zero(&filter->dtlvs, 1410 sizeof(filter->dtlvs)); 1411 qdf_mem_zero(&filter->utlvs, 1412 sizeof(filter->utlvs)); 1413 qdf_mem_zero(&filter->wmask, 1414 sizeof(filter->wmask)); 1415 1416 dp_tx_mon_filter_set_downstream_tlvs(filter); 1417 dp_tx_mon_filter_set_upstream_tlvs(filter); 1418 dp_tx_mon_filter_set_word_mask(filter); 1419 1420 filter->mgmt_filter = 0x1; 1421 filter->data_filter = 0x1; 1422 filter->ctrl_filter = 0x1; 1423 1424 filter->mgmt_mpdu_end = 1; 1425 filter->mgmt_msdu_end = 1; 1426 filter->mgmt_msdu_start = 1; 1427 filter->mgmt_mpdu_start = 1; 1428 filter->ctrl_mpdu_end = 1; 1429 filter->ctrl_msdu_end = 1; 1430 filter->ctrl_msdu_start = 1; 1431 filter->ctrl_mpdu_start = 1; 1432 filter->data_mpdu_end = 1; 1433 filter->data_msdu_end = 1; 1434 filter->data_msdu_start = 1; 1435 filter->data_mpdu_start = 1; 1436 filter->mgmt_mpdu_log = 1; 1437 filter->ctrl_mpdu_log = 1; 1438 filter->data_mpdu_log = 1; 1439 1440 filter->mgmt_dma_length = mon_pdev_be->tx_mon_filter_length; 1441 filter->ctrl_dma_length = mon_pdev_be->tx_mon_filter_length; 1442 filter->data_dma_length = mon_pdev_be->tx_mon_filter_length; 1443 } 1444 1445 void dp_mon_filter_setup_tx_mon_mode_2_0(struct dp_pdev *pdev) 1446 { 1447 struct dp_mon_filter_be filter = {0}; 1448 struct dp_soc *soc = NULL; 1449 enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; 1450 enum dp_mon_filter_srng_type srng_type = 1451 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 1452 struct dp_mon_pdev *mon_pdev = NULL; 1453 struct dp_mon_pdev_be *mon_pdev_be = NULL; 1454 1455 if (!pdev) { 1456 dp_mon_filter_err("pdev Context is null"); 1457 return; 1458 } 1459 1460 soc = pdev->soc; 1461 if (!soc) { 1462 dp_mon_filter_err("Soc Context is null"); 1463 return; 1464 } 1465 1466 mon_pdev = pdev->monitor_pdev; 1467 if (!mon_pdev) { 1468 dp_mon_filter_err("Monitor pdev context is null"); 1469 return; 1470 } 1471 1472 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 1473 1474 filter.tx_valid = !!mon_pdev_be->tx_mon_mode; 1475 dp_tx_mon_filter_set_all(mon_pdev_be, &filter.tx_tlv_filter); 1476 dp_mon_filter_show_tx_filter_be(mode, &filter); 1477 mon_pdev_be->filter_be[mode][srng_type] = filter; 1478 } 1479 1480 void dp_mon_filter_reset_tx_mon_mode_2_0(struct dp_pdev *pdev) 1481 { 1482 struct dp_mon_filter_be filter = {0}; 1483 struct dp_soc *soc = NULL; 1484 enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; 1485 enum dp_mon_filter_srng_type srng_type = 1486 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 1487 struct dp_mon_pdev *mon_pdev; 1488 struct dp_mon_soc *mon_soc; 1489 struct dp_mon_pdev_be *mon_pdev_be; 1490 struct dp_mon_soc_be *mon_soc_be = NULL; 1491 1492 if (!pdev) { 1493 dp_mon_filter_err("pdev Context is null"); 1494 return; 1495 } 1496 1497 soc = pdev->soc; 1498 if (!soc) { 1499 dp_mon_filter_err("Soc Context is null"); 1500 return; 1501 } 1502 1503 mon_pdev = pdev->monitor_pdev; 1504 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 1505 mon_soc = soc->monitor_soc; 1506 mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); 1507 mon_soc_be->tx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT; 1508 mon_soc_be->rx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT; 1509 1510 mon_pdev_be->filter_be[mode][srng_type] = filter; 1511 } 1512 1513 static void dp_mon_filter_set_mon_2_0(struct dp_mon_pdev *mon_pdev, 1514 struct dp_mon_filter *filter) 1515 { 1516 filter->tlv_filter.mpdu_start = 1; 1517 filter->tlv_filter.msdu_start = 1; 1518 filter->tlv_filter.packet = 1; 1519 filter->tlv_filter.packet_header = 1; 1520 filter->tlv_filter.header_per_msdu = 1; 1521 filter->tlv_filter.rx_hdr_length = RX_HDR_DMA_LENGTH_64B; 1522 filter->tlv_filter.msdu_end = 1; 1523 filter->tlv_filter.mpdu_end = 1; 1524 filter->tlv_filter.attention = 0; 1525 filter->tlv_filter.ppdu_start = 1; 1526 filter->tlv_filter.ppdu_end = 1; 1527 filter->tlv_filter.ppdu_end_user_stats = 1; 1528 filter->tlv_filter.ppdu_end_user_stats_ext = 1; 1529 filter->tlv_filter.ppdu_end_status_done = 1; 1530 filter->tlv_filter.ppdu_start_user_info = 1; 1531 filter->tlv_filter.enable_fp = 1532 (mon_pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0; 1533 filter->tlv_filter.enable_mo = 1534 (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0; 1535 filter->tlv_filter.fp_mgmt_filter = mon_pdev->fp_mgmt_filter; 1536 filter->tlv_filter.fp_ctrl_filter = mon_pdev->fp_ctrl_filter; 1537 filter->tlv_filter.fp_data_filter = mon_pdev->fp_data_filter; 1538 filter->tlv_filter.mo_mgmt_filter = mon_pdev->mo_mgmt_filter; 1539 filter->tlv_filter.mo_ctrl_filter = mon_pdev->mo_ctrl_filter; 1540 filter->tlv_filter.mo_data_filter = mon_pdev->mo_data_filter; 1541 filter->tlv_filter.enable_md = 0; 1542 filter->tlv_filter.enable_fpmo = 0; 1543 filter->tlv_filter.offset_valid = false; 1544 filter->tlv_filter.mgmt_dma_length = DEFAULT_DMA_LENGTH; 1545 filter->tlv_filter.data_dma_length = DEFAULT_DMA_LENGTH; 1546 filter->tlv_filter.ctrl_dma_length = DEFAULT_DMA_LENGTH; 1547 /* compute offset size in QWORDS */ 1548 filter->tlv_filter.rx_pkt_tlv_offset = DP_RX_MON_PACKET_OFFSET / 8; 1549 filter->tlv_filter.mgmt_mpdu_log = DP_MON_MSDU_LOGGING; 1550 filter->tlv_filter.ctrl_mpdu_log = DP_MON_MSDU_LOGGING; 1551 filter->tlv_filter.data_mpdu_log = DP_MON_MSDU_LOGGING; 1552 1553 if (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) { 1554 filter->tlv_filter.enable_mo = 1; 1555 filter->tlv_filter.mo_mgmt_filter = FILTER_MGMT_ALL; 1556 filter->tlv_filter.mo_ctrl_filter = FILTER_CTRL_ALL; 1557 filter->tlv_filter.mo_data_filter = FILTER_DATA_ALL; 1558 } else { 1559 filter->tlv_filter.enable_mo = 0; 1560 } 1561 } 1562 1563 void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev) 1564 { 1565 struct dp_mon_filter_be filter = {0}; 1566 struct dp_mon_filter *rx_tlv_filter; 1567 struct dp_soc *soc; 1568 enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; 1569 enum dp_mon_filter_srng_type srng_type = 1570 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 1571 struct dp_mon_pdev *mon_pdev; 1572 struct dp_mon_pdev_be *mon_pdev_be; 1573 1574 if (!pdev) { 1575 dp_mon_filter_err("pdev Context is null"); 1576 return; 1577 } 1578 1579 soc = pdev->soc; 1580 if (!soc) { 1581 dp_mon_filter_err("Soc Context is null"); 1582 return; 1583 } 1584 1585 mon_pdev = pdev->monitor_pdev; 1586 if (!mon_pdev) { 1587 dp_mon_filter_err("mon_pdev Context is null"); 1588 return; 1589 } 1590 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 1591 1592 rx_tlv_filter = &filter.rx_tlv_filter; 1593 rx_tlv_filter->valid = true; 1594 1595 dp_mon_filter_set_mon_2_0(mon_pdev, rx_tlv_filter); 1596 dp_mon_filter_show_rx_filter_be(mode, &filter); 1597 1598 /* Store the above filter */ 1599 mon_pdev_be->filter_be[mode][srng_type] = filter; 1600 } 1601 1602 void dp_mon_filter_reset_rx_mon_mode_2_0(struct dp_pdev *pdev) 1603 { 1604 struct dp_mon_filter_be filter = {0}; 1605 struct dp_mon_filter *rx_tlv_filter; 1606 struct dp_soc *soc = NULL; 1607 1608 enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; 1609 enum dp_mon_filter_srng_type srng_type = 1610 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 1611 struct dp_mon_pdev *mon_pdev; 1612 struct dp_mon_pdev_be *mon_pdev_be; 1613 1614 if (!pdev) { 1615 dp_mon_filter_err("pdev Context is null"); 1616 return; 1617 } 1618 1619 soc = pdev->soc; 1620 if (!soc) { 1621 dp_mon_filter_err("Soc Context is null"); 1622 return; 1623 } 1624 1625 mon_pdev = pdev->monitor_pdev; 1626 if (!mon_pdev) { 1627 dp_mon_filter_err("mon_pdev Context is null"); 1628 return; 1629 } 1630 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 1631 1632 rx_tlv_filter = &filter.rx_tlv_filter; 1633 rx_tlv_filter->valid = true; 1634 1635 qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter)); 1636 /* Store the above filter */ 1637 srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 1638 mon_pdev_be->filter_be[mode][srng_type] = filter; 1639 } 1640 1641 static void dp_rx_mon_filter_show_filter(struct dp_mon_filter_be *filter) 1642 { 1643 struct htt_rx_ring_tlv_filter *rx_tlv_filter = 1644 &filter->rx_tlv_filter.tlv_filter; 1645 1646 DP_MON_FILTER_PRINT("Enable: %d", rx_tlv_filter->enable); 1647 DP_MON_FILTER_PRINT("mpdu_start: %d", rx_tlv_filter->mpdu_start); 1648 DP_MON_FILTER_PRINT("msdu_start: %d", rx_tlv_filter->msdu_start); 1649 DP_MON_FILTER_PRINT("packet: %d", rx_tlv_filter->packet); 1650 DP_MON_FILTER_PRINT("msdu_end: %d", rx_tlv_filter->msdu_end); 1651 DP_MON_FILTER_PRINT("mpdu_end: %d", rx_tlv_filter->mpdu_end); 1652 DP_MON_FILTER_PRINT("packet_header: %d", 1653 rx_tlv_filter->packet_header); 1654 DP_MON_FILTER_PRINT("attention: %d", rx_tlv_filter->attention); 1655 DP_MON_FILTER_PRINT("ppdu_start: %d", rx_tlv_filter->ppdu_start); 1656 DP_MON_FILTER_PRINT("ppdu_end: %d", rx_tlv_filter->ppdu_end); 1657 DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d", 1658 rx_tlv_filter->ppdu_end_user_stats); 1659 DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d", 1660 rx_tlv_filter->ppdu_end_user_stats_ext); 1661 DP_MON_FILTER_PRINT("ppdu_end_status_done: %d", 1662 rx_tlv_filter->ppdu_end_status_done); 1663 DP_MON_FILTER_PRINT("ppdu_start_user_info: %d", 1664 rx_tlv_filter->ppdu_start_user_info); 1665 DP_MON_FILTER_PRINT("header_per_msdu: %d", 1666 rx_tlv_filter->header_per_msdu); 1667 DP_MON_FILTER_PRINT("enable_fp: %d", rx_tlv_filter->enable_fp); 1668 DP_MON_FILTER_PRINT("enable_md: %d", rx_tlv_filter->enable_md); 1669 DP_MON_FILTER_PRINT("enable_mo: %d", rx_tlv_filter->enable_mo); 1670 DP_MON_FILTER_PRINT("enable_fpmo: %d", rx_tlv_filter->enable_fpmo); 1671 DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", 1672 rx_tlv_filter->fp_mgmt_filter); 1673 DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", 1674 rx_tlv_filter->mo_mgmt_filter); 1675 DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", 1676 rx_tlv_filter->fp_ctrl_filter); 1677 DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", 1678 rx_tlv_filter->mo_ctrl_filter); 1679 DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", 1680 rx_tlv_filter->fp_data_filter); 1681 DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", 1682 rx_tlv_filter->mo_data_filter); 1683 DP_MON_FILTER_PRINT("md_data_filter: 0x%x", 1684 rx_tlv_filter->md_data_filter); 1685 DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", 1686 rx_tlv_filter->md_mgmt_filter); 1687 DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", 1688 rx_tlv_filter->md_ctrl_filter); 1689 DP_MON_FILTER_PRINT("fpmo_data_filter: 0x%x", 1690 rx_tlv_filter->fpmo_data_filter); 1691 DP_MON_FILTER_PRINT("fpmo_mgmt_filter: 0x%x", 1692 rx_tlv_filter->fpmo_mgmt_filter); 1693 DP_MON_FILTER_PRINT("fpmo_ctrl_filter: 0x%x", 1694 rx_tlv_filter->fpmo_ctrl_filter); 1695 DP_MON_FILTER_PRINT("mgmt_dma_length: %d", 1696 rx_tlv_filter->mgmt_dma_length); 1697 DP_MON_FILTER_PRINT("ctrl_dma_length: %d", 1698 rx_tlv_filter->ctrl_dma_length); 1699 DP_MON_FILTER_PRINT("data_dma_length: %d", 1700 rx_tlv_filter->data_dma_length); 1701 DP_MON_FILTER_PRINT("rx_mpdu_start_wmask: 0x%x", 1702 rx_tlv_filter->rx_mpdu_start_wmask); 1703 DP_MON_FILTER_PRINT("rx_msdu_end_wmask: 0x%x", 1704 rx_tlv_filter->rx_msdu_end_wmask); 1705 DP_MON_FILTER_PRINT("rx_hdr_length: %d", 1706 rx_tlv_filter->rx_hdr_length); 1707 DP_MON_FILTER_PRINT("mgmt_mpdu_log: 0x%x", 1708 rx_tlv_filter->mgmt_mpdu_log); 1709 DP_MON_FILTER_PRINT("data_mpdu_log: 0x%x", 1710 rx_tlv_filter->data_mpdu_log); 1711 DP_MON_FILTER_PRINT("ctrl_mpdu_log: 0x%x", 1712 rx_tlv_filter->ctrl_mpdu_log); 1713 DP_MON_FILTER_PRINT("mgmt_dma_length: 0x%x", 1714 rx_tlv_filter->mgmt_dma_length); 1715 DP_MON_FILTER_PRINT("data_dma_length: 0x%x", 1716 rx_tlv_filter->data_dma_length); 1717 DP_MON_FILTER_PRINT("ctrl_dma_length: 0x%x", 1718 rx_tlv_filter->ctrl_dma_length); 1719 } 1720 1721 static void dp_tx_mon_filter_show_filter(struct dp_mon_filter_be *filter) 1722 { 1723 struct htt_tx_ring_tlv_filter *tlv_filter = &filter->tx_tlv_filter; 1724 1725 DP_MON_FILTER_PRINT("TX Monitor Filter configuration:"); 1726 DP_MON_FILTER_PRINT("Enable: %d", tlv_filter->enable); 1727 DP_MON_FILTER_PRINT("mgmt_filter: %d", tlv_filter->mgmt_filter); 1728 DP_MON_FILTER_PRINT("data_filter: %d", tlv_filter->data_filter); 1729 DP_MON_FILTER_PRINT("ctrl_filter: %d", tlv_filter->ctrl_filter); 1730 DP_MON_FILTER_PRINT("mgmt_dma_length: %d", tlv_filter->mgmt_dma_length); 1731 DP_MON_FILTER_PRINT("ctrl_dma_length: %d", tlv_filter->ctrl_dma_length); 1732 DP_MON_FILTER_PRINT("data_dma_length: %d", tlv_filter->data_dma_length); 1733 DP_MON_FILTER_PRINT("mgmt_mpdu_end: %d", tlv_filter->mgmt_mpdu_end); 1734 DP_MON_FILTER_PRINT("mgmt_msdu_end: %d", tlv_filter->mgmt_msdu_end); 1735 DP_MON_FILTER_PRINT("mgmt_mpdu_start: %d", tlv_filter->mgmt_mpdu_start); 1736 DP_MON_FILTER_PRINT("mgmt_msdu_start: %d", tlv_filter->mgmt_msdu_start); 1737 DP_MON_FILTER_PRINT("ctrl_mpdu_end: %d", tlv_filter->ctrl_mpdu_end); 1738 DP_MON_FILTER_PRINT("ctrl_msdu_end: %d", tlv_filter->ctrl_msdu_end); 1739 DP_MON_FILTER_PRINT("ctrl_mpdu_start: %d", tlv_filter->ctrl_mpdu_start); 1740 DP_MON_FILTER_PRINT("ctrl_msdu_start: %d", tlv_filter->ctrl_msdu_start); 1741 DP_MON_FILTER_PRINT("data_mpdu_end: %d", tlv_filter->data_mpdu_end); 1742 DP_MON_FILTER_PRINT("data_msdu_end: %d", tlv_filter->data_msdu_end); 1743 DP_MON_FILTER_PRINT("data_mpdu_start: %d", tlv_filter->data_mpdu_start); 1744 DP_MON_FILTER_PRINT("data_msdu_start: %d", tlv_filter->data_msdu_start); 1745 DP_MON_FILTER_PRINT("mgmt_mpdu_log: %d", tlv_filter->mgmt_mpdu_log); 1746 DP_MON_FILTER_PRINT("ctrl_mpdu_log: %d", tlv_filter->ctrl_mpdu_log); 1747 DP_MON_FILTER_PRINT("data_mpdu_log: %d", tlv_filter->data_mpdu_log); 1748 1749 /* Downstream TLVs */ 1750 DP_MON_FILTER_PRINT("Downstream TLVs"); 1751 DP_MON_FILTER_PRINT("tx_fes_setup: %d", tlv_filter->dtlvs.tx_fes_setup); 1752 DP_MON_FILTER_PRINT("tx_peer_entry: %d", 1753 tlv_filter->dtlvs.tx_peer_entry); 1754 DP_MON_FILTER_PRINT("tx_queue_extension: %d", 1755 tlv_filter->dtlvs.tx_queue_extension); 1756 DP_MON_FILTER_PRINT("tx_last_mpdu_fetched: %d", 1757 tlv_filter->dtlvs.tx_last_mpdu_fetched); 1758 DP_MON_FILTER_PRINT("tx_data_sync: %d", tlv_filter->dtlvs.tx_data_sync); 1759 DP_MON_FILTER_PRINT("pcu_ppdu_setup_init: %d", 1760 tlv_filter->dtlvs.pcu_ppdu_setup_init); 1761 DP_MON_FILTER_PRINT("fw2s_mon: %d", tlv_filter->dtlvs.fw2s_mon); 1762 DP_MON_FILTER_PRINT("tx_loopback_setup: %d", 1763 tlv_filter->dtlvs.tx_loopback_setup); 1764 DP_MON_FILTER_PRINT("sch_critical_tlv_ref: %d", 1765 tlv_filter->dtlvs.sch_critical_tlv_ref); 1766 DP_MON_FILTER_PRINT("ndp_preamble_done: %d", 1767 tlv_filter->dtlvs.ndp_preamble_done); 1768 DP_MON_FILTER_PRINT("tx_raw_frame_setup: %d", 1769 tlv_filter->dtlvs.tx_raw_frame_setup); 1770 DP_MON_FILTER_PRINT("txpcu_user_setup: %d", 1771 tlv_filter->dtlvs.txpcu_user_setup); 1772 DP_MON_FILTER_PRINT("rxpcu_setup: %d", tlv_filter->dtlvs.rxpcu_setup); 1773 DP_MON_FILTER_PRINT("rxpcu_setup_complete: %d", 1774 tlv_filter->dtlvs.rxpcu_setup_complete); 1775 DP_MON_FILTER_PRINT("coex_tx_req: %d", tlv_filter->dtlvs.coex_tx_req); 1776 DP_MON_FILTER_PRINT("rxpcu_user_setup: %d", 1777 tlv_filter->dtlvs.rxpcu_user_setup); 1778 DP_MON_FILTER_PRINT("rxpcu_user_setup_ext: %d", 1779 tlv_filter->dtlvs.rxpcu_user_setup_ext); 1780 DP_MON_FILTER_PRINT("wur_data: %d", tlv_filter->dtlvs.wur_data); 1781 DP_MON_FILTER_PRINT("tqm_mpdu_global_start: %d", 1782 tlv_filter->dtlvs.tqm_mpdu_global_start); 1783 DP_MON_FILTER_PRINT("tx_fes_setup_complete: %d", 1784 tlv_filter->dtlvs.tx_fes_setup_complete); 1785 DP_MON_FILTER_PRINT("scheduler_end: %d", 1786 tlv_filter->dtlvs.scheduler_end); 1787 DP_MON_FILTER_PRINT("sch_wait_instr_tx_path: %d", 1788 tlv_filter->dtlvs.sch_wait_instr_tx_path); 1789 1790 /* Upstream TLVs */ 1791 DP_MON_FILTER_PRINT("Upstream TLVs"); 1792 DP_MON_FILTER_PRINT("rx_response_required_info: %d", 1793 tlv_filter->utlvs.rx_response_required_info); 1794 DP_MON_FILTER_PRINT("response_start_status: %d", 1795 tlv_filter->utlvs.response_start_status); 1796 DP_MON_FILTER_PRINT("response_end_status: %d", 1797 tlv_filter->utlvs.response_end_status); 1798 DP_MON_FILTER_PRINT("tx_fes_status_start: %d", 1799 tlv_filter->utlvs.tx_fes_status_start); 1800 DP_MON_FILTER_PRINT("tx_fes_status_end: %d", 1801 tlv_filter->utlvs.tx_fes_status_end); 1802 DP_MON_FILTER_PRINT("tx_fes_status_start_ppdu: %d", 1803 tlv_filter->utlvs.tx_fes_status_start_ppdu); 1804 DP_MON_FILTER_PRINT("tx_fes_status_user_ppdu: %d", 1805 tlv_filter->utlvs.tx_fes_status_user_ppdu); 1806 DP_MON_FILTER_PRINT("tx_fes_status_ack_or_ba: %d", 1807 tlv_filter->utlvs.tx_fes_status_ack_or_ba); 1808 DP_MON_FILTER_PRINT("tx_fes_status_1k_ba: %d", 1809 tlv_filter->utlvs.tx_fes_status_1k_ba); 1810 DP_MON_FILTER_PRINT("tx_fes_status_start_prot: %d", 1811 tlv_filter->utlvs.tx_fes_status_start_prot); 1812 DP_MON_FILTER_PRINT("tx_fes_status_prot: %d", 1813 tlv_filter->utlvs.tx_fes_status_prot); 1814 DP_MON_FILTER_PRINT("tx_fes_status_user_response: %d", 1815 tlv_filter->utlvs.tx_fes_status_user_response); 1816 DP_MON_FILTER_PRINT("rx_frame_bitmap_ack: %d", 1817 tlv_filter->utlvs.rx_frame_bitmap_ack); 1818 DP_MON_FILTER_PRINT("rx_frame_1k_bitmap_ack: %d", 1819 tlv_filter->utlvs.rx_frame_1k_bitmap_ack); 1820 DP_MON_FILTER_PRINT("coex_tx_status: %d", 1821 tlv_filter->utlvs.coex_tx_status); 1822 DP_MON_FILTER_PRINT("received_response_info: %d", 1823 tlv_filter->utlvs.received_response_info); 1824 DP_MON_FILTER_PRINT("received_response_info_p2: %d", 1825 tlv_filter->utlvs.received_response_info_p2); 1826 DP_MON_FILTER_PRINT("ofdma_trigger_details: %d", 1827 tlv_filter->utlvs.ofdma_trigger_details); 1828 DP_MON_FILTER_PRINT("received_trigger_info: %d", 1829 tlv_filter->utlvs.received_trigger_info); 1830 DP_MON_FILTER_PRINT("pdg_tx_request: %d", 1831 tlv_filter->utlvs.pdg_tx_request); 1832 DP_MON_FILTER_PRINT("pdg_response: %d", 1833 tlv_filter->utlvs.pdg_response); 1834 DP_MON_FILTER_PRINT("pdg_trig_response: %d", 1835 tlv_filter->utlvs.pdg_trig_response); 1836 DP_MON_FILTER_PRINT("trigger_response_tx_done: %d", 1837 tlv_filter->utlvs.trigger_response_tx_done); 1838 DP_MON_FILTER_PRINT("prot_tx_end: %d", tlv_filter->utlvs.prot_tx_end); 1839 DP_MON_FILTER_PRINT("ppdu_tx_end: %d", tlv_filter->utlvs.ppdu_tx_end); 1840 DP_MON_FILTER_PRINT("r2r_status_end: %d", 1841 tlv_filter->utlvs.r2r_status_end); 1842 DP_MON_FILTER_PRINT("flush_req: %d", tlv_filter->utlvs.flush_req); 1843 DP_MON_FILTER_PRINT("mactx_phy_desc: %d", 1844 tlv_filter->utlvs.mactx_phy_desc); 1845 DP_MON_FILTER_PRINT("mactx_user_desc_cmn: %d", 1846 tlv_filter->utlvs.mactx_user_desc_cmn); 1847 DP_MON_FILTER_PRINT("mactx_user_desc_per_usr: %d", 1848 tlv_filter->utlvs.mactx_user_desc_per_usr); 1849 1850 DP_MON_FILTER_PRINT("tqm_acked_1k_mpdu: %d", 1851 tlv_filter->utlvs.tqm_acked_1k_mpdu); 1852 DP_MON_FILTER_PRINT("tqm_acked_mpdu: %d", 1853 tlv_filter->utlvs.tqm_acked_mpdu); 1854 DP_MON_FILTER_PRINT("tqm_update_tx_mpdu_count: %d", 1855 tlv_filter->utlvs.tqm_update_tx_mpdu_count); 1856 DP_MON_FILTER_PRINT("phytx_ppdu_header_info_request: %d", 1857 tlv_filter->utlvs.phytx_ppdu_header_info_request); 1858 DP_MON_FILTER_PRINT("u_sig_eht_su_mu: %d", 1859 tlv_filter->utlvs.u_sig_eht_su_mu); 1860 DP_MON_FILTER_PRINT("u_sig_eht_su: %d", tlv_filter->utlvs.u_sig_eht_su); 1861 DP_MON_FILTER_PRINT("u_sig_eht_tb: %d", tlv_filter->utlvs.u_sig_eht_tb); 1862 DP_MON_FILTER_PRINT("eht_sig_usr_su: %d", 1863 tlv_filter->utlvs.eht_sig_usr_su); 1864 DP_MON_FILTER_PRINT("eht_sig_usr_mu_mimo: %d", 1865 tlv_filter->utlvs.eht_sig_usr_mu_mimo); 1866 DP_MON_FILTER_PRINT("eht_sig_usr_ofdma: %d", 1867 tlv_filter->utlvs.eht_sig_usr_ofdma); 1868 DP_MON_FILTER_PRINT("he_sig_a_su: %d", 1869 tlv_filter->utlvs.he_sig_a_su); 1870 DP_MON_FILTER_PRINT("he_sig_a_mu_dl: %d", 1871 tlv_filter->utlvs.he_sig_a_mu_dl); 1872 DP_MON_FILTER_PRINT("he_sig_a_mu_ul: %d", 1873 tlv_filter->utlvs.he_sig_a_mu_ul); 1874 DP_MON_FILTER_PRINT("he_sig_b1_mu: %d", 1875 tlv_filter->utlvs.he_sig_b1_mu); 1876 DP_MON_FILTER_PRINT("he_sig_b2_mu: %d", 1877 tlv_filter->utlvs.he_sig_b2_mu); 1878 DP_MON_FILTER_PRINT("he_sig_b2_ofdma: %d", 1879 tlv_filter->utlvs.he_sig_b2_ofdma); 1880 DP_MON_FILTER_PRINT("vht_sig_b_mu160: %d", 1881 tlv_filter->utlvs.vht_sig_b_mu160); 1882 DP_MON_FILTER_PRINT("vht_sig_b_mu80: %d", 1883 tlv_filter->utlvs.vht_sig_b_mu80); 1884 DP_MON_FILTER_PRINT("vht_sig_b_mu40: %d", 1885 tlv_filter->utlvs.vht_sig_b_mu40); 1886 DP_MON_FILTER_PRINT("vht_sig_b_mu20: %d", 1887 tlv_filter->utlvs.vht_sig_b_mu20); 1888 DP_MON_FILTER_PRINT("vht_sig_b_su160: %d", 1889 tlv_filter->utlvs.vht_sig_b_su160); 1890 DP_MON_FILTER_PRINT("vht_sig_b_su80: %d", 1891 tlv_filter->utlvs.vht_sig_b_su80); 1892 DP_MON_FILTER_PRINT("vht_sig_b_su40: %d", 1893 tlv_filter->utlvs.vht_sig_b_su40); 1894 DP_MON_FILTER_PRINT("vht_sig_b_su20: %d", 1895 tlv_filter->utlvs.vht_sig_b_su20); 1896 DP_MON_FILTER_PRINT("vht_sig_a: %d", tlv_filter->utlvs.vht_sig_a); 1897 DP_MON_FILTER_PRINT("ht_sig: %d", tlv_filter->utlvs.ht_sig); 1898 DP_MON_FILTER_PRINT("l_sig_b: %d", tlv_filter->utlvs.l_sig_b); 1899 DP_MON_FILTER_PRINT("l_sig_a: %d", tlv_filter->utlvs.l_sig_a); 1900 DP_MON_FILTER_PRINT("tx_service: %d", tlv_filter->utlvs.tx_service); 1901 1902 DP_MON_FILTER_PRINT("txpcu_buf_status: %d", 1903 tlv_filter->utlvs.txpcu_buf_status); 1904 DP_MON_FILTER_PRINT("txpcu_user_buf_status: %d", 1905 tlv_filter->utlvs.txpcu_user_buf_status); 1906 DP_MON_FILTER_PRINT("txdma_stop_request: %d", 1907 tlv_filter->utlvs.txdma_stop_request); 1908 DP_MON_FILTER_PRINT("expected_response: %d", 1909 tlv_filter->utlvs.expected_response); 1910 DP_MON_FILTER_PRINT("tx_mpdu_count_transfer_end: %d", 1911 tlv_filter->utlvs.tx_mpdu_count_transfer_end); 1912 DP_MON_FILTER_PRINT("rx_trig_info: %d", 1913 tlv_filter->utlvs.rx_trig_info); 1914 DP_MON_FILTER_PRINT("rxpcu_tx_setup_clear: %d", 1915 tlv_filter->utlvs.rxpcu_tx_setup_clear); 1916 DP_MON_FILTER_PRINT("rx_frame_bitmap_req: %d", 1917 tlv_filter->utlvs.rx_frame_bitmap_req); 1918 DP_MON_FILTER_PRINT("rx_phy_sleep: %d", 1919 tlv_filter->utlvs.rx_phy_sleep); 1920 DP_MON_FILTER_PRINT("txpcu_preamble_done: %d", 1921 tlv_filter->utlvs.txpcu_preamble_done); 1922 DP_MON_FILTER_PRINT("txpcu_phytx_debug32: %d", 1923 tlv_filter->utlvs.txpcu_phytx_debug32); 1924 DP_MON_FILTER_PRINT("txpcu_phytx_other_transmit_info32: %d", 1925 tlv_filter->utlvs.txpcu_phytx_other_transmit_info32); 1926 DP_MON_FILTER_PRINT("rx_ppdu_noack_report: %d", 1927 tlv_filter->utlvs.rx_ppdu_noack_report); 1928 DP_MON_FILTER_PRINT("rx_ppdu_ack_report: %d", 1929 tlv_filter->utlvs.rx_ppdu_ack_report); 1930 DP_MON_FILTER_PRINT("coex_rx_status: %d", 1931 tlv_filter->utlvs.coex_rx_status); 1932 DP_MON_FILTER_PRINT("rx_start_param: %d", 1933 tlv_filter->utlvs.rx_start_param); 1934 DP_MON_FILTER_PRINT("tx_cbf_info: %d", 1935 tlv_filter->utlvs.tx_cbf_info); 1936 DP_MON_FILTER_PRINT("rxpcu_early_rx_indication: %d", 1937 tlv_filter->utlvs.rxpcu_early_rx_indication); 1938 DP_MON_FILTER_PRINT("received_response_user_7_0: %d", 1939 tlv_filter->utlvs.received_response_user_7_0); 1940 DP_MON_FILTER_PRINT("received_response_user_15_8: %d", 1941 tlv_filter->utlvs.received_response_user_15_8); 1942 DP_MON_FILTER_PRINT("received_response_user_23_16: %d", 1943 tlv_filter->utlvs.received_response_user_23_16); 1944 DP_MON_FILTER_PRINT("received_response_user_31_24: %d", 1945 tlv_filter->utlvs.received_response_user_31_24); 1946 DP_MON_FILTER_PRINT("received_response_user_36_32: %d", 1947 tlv_filter->utlvs.received_response_user_36_32); 1948 DP_MON_FILTER_PRINT("rx_pm_info: %d", 1949 tlv_filter->utlvs.rx_pm_info); 1950 DP_MON_FILTER_PRINT("rx_preamble: %d", 1951 tlv_filter->utlvs.rx_preamble); 1952 DP_MON_FILTER_PRINT("others: %d", 1953 tlv_filter->utlvs.others); 1954 DP_MON_FILTER_PRINT("mactx_pre_phy_desc: %d", 1955 tlv_filter->utlvs.mactx_pre_phy_desc); 1956 1957 /* Word mask subscription */ 1958 DP_MON_FILTER_PRINT("wmask tx_fes_setup: %d", 1959 tlv_filter->wmask.tx_fes_setup); 1960 DP_MON_FILTER_PRINT("wmask tx_peer_entry: %d", 1961 tlv_filter->wmask.tx_peer_entry); 1962 DP_MON_FILTER_PRINT("wmask tx_queue_ext: %d", 1963 tlv_filter->wmask.tx_queue_ext); 1964 DP_MON_FILTER_PRINT("wmask tx_msdu_start: %d", 1965 tlv_filter->wmask.tx_msdu_start); 1966 DP_MON_FILTER_PRINT("wmask tx_mpdu_start: %d", 1967 tlv_filter->wmask.tx_mpdu_start); 1968 DP_MON_FILTER_PRINT("wmask pcu_ppdu_setup_init: %d", 1969 tlv_filter->wmask.pcu_ppdu_setup_init); 1970 DP_MON_FILTER_PRINT("wmask rxpcu_user_setup: %d", 1971 tlv_filter->wmask.rxpcu_user_setup); 1972 } 1973 1974 void dp_mon_filter_show_rx_filter_be(enum dp_mon_filter_mode mode, 1975 struct dp_mon_filter_be *filter) 1976 { 1977 DP_MON_FILTER_PRINT("RX MON RING TLV FILTER CONFIG:"); 1978 DP_MON_FILTER_PRINT("[Mode %d]: Valid: %d", 1979 mode, filter->rx_tlv_filter.valid); 1980 1981 if (filter->rx_tlv_filter.valid) 1982 dp_rx_mon_filter_show_filter(filter); 1983 } 1984 1985 void dp_mon_filter_show_tx_filter_be(enum dp_mon_filter_mode mode, 1986 struct dp_mon_filter_be *filter) 1987 { 1988 dp_mon_filter_err("TX MON RING TLV FILTER CONFIG:"); 1989 dp_mon_filter_err("[Mode %d]: Valid: %d", mode, filter->tx_valid); 1990 1991 if (filter->tx_valid) 1992 dp_tx_mon_filter_show_filter(filter); 1993 } 1994 1995 #ifdef WDI_EVENT_ENABLE 1996 void dp_mon_filter_setup_rx_pkt_log_full_2_0(struct dp_pdev *pdev) 1997 { 1998 struct dp_mon_filter_be filter = {0}; 1999 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE; 2000 enum dp_mon_filter_srng_type srng_type = 2001 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2002 struct dp_mon_pdev *mon_pdev = NULL; 2003 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2004 struct htt_rx_ring_tlv_filter *rx_tlv_filter = 2005 &filter.rx_tlv_filter.tlv_filter; 2006 2007 if (!pdev) { 2008 dp_mon_filter_err("pdev Context is null"); 2009 return; 2010 } 2011 2012 mon_pdev = pdev->monitor_pdev; 2013 if (!mon_pdev) { 2014 dp_mon_filter_err("Monitor pdev context is null"); 2015 return; 2016 } 2017 2018 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2019 2020 /* Enabled the filter */ 2021 filter.rx_tlv_filter.valid = true; 2022 dp_mon_filter_set_status_cmn(&mon_pdev_be->mon_pdev, 2023 &filter.rx_tlv_filter); 2024 2025 /* Setup the filter */ 2026 rx_tlv_filter->packet_header = 1; 2027 rx_tlv_filter->msdu_start = 1; 2028 rx_tlv_filter->msdu_end = 1; 2029 rx_tlv_filter->mpdu_end = 1; 2030 2031 dp_mon_filter_show_rx_filter_be(mode, &filter); 2032 mon_pdev_be->filter_be[mode][srng_type] = filter; 2033 } 2034 2035 void dp_mon_filter_reset_rx_pkt_log_full_2_0(struct dp_pdev *pdev) 2036 { 2037 struct dp_mon_filter_be filter = {0}; 2038 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE; 2039 enum dp_mon_filter_srng_type srng_type = 2040 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2041 struct dp_mon_pdev *mon_pdev = NULL; 2042 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2043 2044 if (!pdev) { 2045 dp_mon_filter_err("pdev Context is null"); 2046 return; 2047 } 2048 2049 mon_pdev = pdev->monitor_pdev; 2050 if (!mon_pdev) { 2051 dp_mon_filter_err("Monitor pdev context is null"); 2052 return; 2053 } 2054 2055 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2056 2057 mon_pdev_be->filter_be[mode][srng_type] = filter; 2058 } 2059 2060 void dp_mon_filter_setup_rx_pkt_log_lite_2_0(struct dp_pdev *pdev) 2061 { 2062 struct dp_mon_filter_be filter = {0}; 2063 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE; 2064 enum dp_mon_filter_srng_type srng_type = 2065 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2066 struct dp_mon_pdev *mon_pdev = NULL; 2067 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2068 2069 if (!pdev) { 2070 dp_mon_filter_err("pdev Context is null"); 2071 return; 2072 } 2073 2074 mon_pdev = pdev->monitor_pdev; 2075 if (!mon_pdev) { 2076 dp_mon_filter_err("Monitor pdev context is null"); 2077 return; 2078 } 2079 2080 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2081 2082 /* Enabled the filter */ 2083 filter.rx_tlv_filter.valid = true; 2084 dp_mon_filter_set_status_cmn(&mon_pdev_be->mon_pdev, 2085 &filter.rx_tlv_filter); 2086 2087 dp_mon_filter_show_rx_filter_be(mode, &filter); 2088 mon_pdev_be->filter_be[mode][srng_type] = filter; 2089 } 2090 2091 void dp_mon_filter_reset_rx_pkt_log_lite_2_0(struct dp_pdev *pdev) 2092 { 2093 struct dp_mon_filter_be filter = {0}; 2094 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE; 2095 enum dp_mon_filter_srng_type srng_type = 2096 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2097 struct dp_mon_pdev *mon_pdev = NULL; 2098 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2099 2100 if (!pdev) { 2101 dp_mon_filter_err("pdev Context is null"); 2102 return; 2103 } 2104 2105 mon_pdev = pdev->monitor_pdev; 2106 if (!mon_pdev) { 2107 dp_mon_filter_err("Monitor pdev context is null"); 2108 return; 2109 } 2110 2111 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2112 2113 mon_pdev_be->filter_be[mode][srng_type] = filter; 2114 } 2115 2116 #ifdef QCA_MONITOR_PKT_SUPPORT 2117 static void 2118 dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev_be, 2119 struct dp_mon_filter_be *filter) 2120 { 2121 struct dp_soc *soc = pdev_be->pdev.soc; 2122 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; 2123 enum dp_mon_filter_srng_type srng_type; 2124 struct dp_mon_pdev *mon_pdev = pdev_be->pdev.monitor_pdev; 2125 struct dp_mon_pdev_be *mon_pdev_be = 2126 dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2127 struct htt_rx_ring_tlv_filter *rx_tlv_filter = 2128 &filter->rx_tlv_filter.tlv_filter; 2129 2130 srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? 2131 DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : 2132 DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); 2133 2134 /*set the filter */ 2135 if (filter->rx_tlv_filter.valid) { 2136 dp_mon_filter_set_cbf_cmn(&pdev_be->pdev, 2137 &filter->rx_tlv_filter); 2138 2139 rx_tlv_filter->attention = 0; 2140 dp_mon_filter_show_rx_filter_be(mode, filter); 2141 mon_pdev_be->filter_be[mode][srng_type] = *filter; 2142 } else /* reset the filter */ 2143 mon_pdev_be->filter_be[mode][srng_type] = *filter; 2144 } 2145 #else 2146 static void 2147 dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev, 2148 struct dp_mon_filter_be *filter) 2149 { 2150 } 2151 #endif 2152 2153 void dp_mon_filter_setup_rx_pkt_log_cbf_2_0(struct dp_pdev *pdev) 2154 { 2155 struct dp_mon_filter_be filter = {0}; 2156 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; 2157 enum dp_mon_filter_srng_type srng_type = 2158 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2159 struct dp_mon_pdev *mon_pdev = NULL; 2160 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2161 struct dp_pdev_be *pdev_be = NULL; 2162 2163 if (!pdev) { 2164 dp_mon_filter_err("pdev Context is null"); 2165 return; 2166 } 2167 2168 mon_pdev = pdev->monitor_pdev; 2169 if (!mon_pdev) { 2170 dp_mon_filter_err("Monitor pdev context is null"); 2171 return; 2172 } 2173 2174 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2175 2176 pdev_be = dp_get_be_pdev_from_dp_pdev(pdev); 2177 2178 /* Enabled the filter */ 2179 filter.rx_tlv_filter.valid = true; 2180 2181 dp_mon_filter_set_status_cbf(pdev, &filter.rx_tlv_filter); 2182 dp_mon_filter_show_rx_filter_be(mode, &filter); 2183 mon_pdev_be->filter_be[mode][srng_type] = filter; 2184 2185 /* Clear the filter as the same filter will be used to set the 2186 * monitor status ring 2187 */ 2188 qdf_mem_zero(&filter, sizeof(struct dp_mon_filter_be)); 2189 2190 filter.rx_tlv_filter.valid = true; 2191 dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(pdev_be, &filter); 2192 } 2193 2194 void dp_mon_filter_reset_rx_pktlog_cbf_2_0(struct dp_pdev *pdev) 2195 { 2196 struct dp_mon_filter_be filter = {0}; 2197 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; 2198 enum dp_mon_filter_srng_type srng_type = 2199 DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF; 2200 struct dp_mon_pdev *mon_pdev = NULL; 2201 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2202 struct dp_pdev_be *pdev_be = NULL; 2203 2204 if (!pdev) { 2205 QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR, 2206 FL("pdev Context is null")); 2207 return; 2208 } 2209 2210 mon_pdev = pdev->monitor_pdev; 2211 if (!mon_pdev) { 2212 dp_mon_filter_err("Monitor pdev context is null"); 2213 return; 2214 } 2215 2216 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2217 2218 pdev_be = dp_get_be_pdev_from_dp_pdev(pdev); 2219 2220 /* Enabled the filter */ 2221 filter.rx_tlv_filter.valid = true; 2222 2223 dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(pdev_be, &filter); 2224 2225 srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2226 mon_pdev_be->filter_be[mode][srng_type] = filter; 2227 } 2228 2229 void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev) 2230 { 2231 struct dp_mon_filter_be filter = {0}; 2232 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_HYBRID_MODE; 2233 enum dp_mon_filter_srng_type srng_type = 2234 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 2235 struct htt_tx_ring_tlv_filter *tlv_filter = &filter.tx_tlv_filter; 2236 struct dp_mon_pdev *mon_pdev = NULL; 2237 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2238 2239 if (!pdev) { 2240 dp_mon_filter_err("pdev Context is null"); 2241 return; 2242 } 2243 2244 mon_pdev = pdev->monitor_pdev; 2245 if (!mon_pdev) { 2246 dp_mon_filter_err("Monitor pdev context is null"); 2247 return; 2248 } 2249 2250 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2251 2252 /* Enabled the filter */ 2253 filter.tx_valid = true; 2254 2255 /* Setup the filter */ 2256 tlv_filter->utlvs.tx_fes_status_start = 1; 2257 tlv_filter->utlvs.tx_fes_status_start_prot = 1; 2258 tlv_filter->utlvs.tx_fes_status_prot = 1; 2259 tlv_filter->utlvs.tx_fes_status_start_ppdu = 1; 2260 tlv_filter->utlvs.tx_fes_status_user_ppdu = 1; 2261 tlv_filter->utlvs.tx_fes_status_ack_or_ba = 1; 2262 tlv_filter->utlvs.tx_fes_status_1k_ba = 1; 2263 tlv_filter->utlvs.tx_fes_status_user_response = 1; 2264 tlv_filter->utlvs.tx_fes_status_end = 1; 2265 tlv_filter->utlvs.response_start_status = 1; 2266 tlv_filter->utlvs.received_response_info = 1; 2267 tlv_filter->utlvs.received_response_info_p2 = 1; 2268 tlv_filter->utlvs.response_end_status = 1; 2269 2270 tlv_filter->mgmt_filter = 0x1; 2271 tlv_filter->data_filter = 0x1; 2272 tlv_filter->ctrl_filter = 0x1; 2273 2274 tlv_filter->mgmt_mpdu_end = 1; 2275 tlv_filter->mgmt_msdu_end = 1; 2276 tlv_filter->mgmt_msdu_start = 1; 2277 tlv_filter->mgmt_mpdu_start = 1; 2278 tlv_filter->ctrl_mpdu_end = 1; 2279 tlv_filter->ctrl_msdu_end = 1; 2280 tlv_filter->ctrl_msdu_start = 1; 2281 tlv_filter->ctrl_mpdu_start = 1; 2282 tlv_filter->data_mpdu_end = 1; 2283 tlv_filter->data_msdu_end = 1; 2284 tlv_filter->data_msdu_start = 1; 2285 tlv_filter->data_mpdu_start = 1; 2286 tlv_filter->mgmt_mpdu_log = 1; 2287 tlv_filter->ctrl_mpdu_log = 1; 2288 tlv_filter->data_mpdu_log = 1; 2289 2290 tlv_filter->mgmt_dma_length = mon_pdev_be->tx_mon_filter_length; 2291 tlv_filter->ctrl_dma_length = mon_pdev_be->tx_mon_filter_length; 2292 tlv_filter->data_dma_length = mon_pdev_be->tx_mon_filter_length; 2293 dp_mon_filter_show_tx_filter_be(mode, &filter); 2294 mon_pdev_be->filter_be[mode][srng_type] = filter; 2295 } 2296 2297 void dp_mon_filter_reset_pktlog_hybrid_2_0(struct dp_pdev *pdev) 2298 { 2299 struct dp_mon_filter_be filter = {0}; 2300 enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_HYBRID_MODE; 2301 enum dp_mon_filter_srng_type srng_type = 2302 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 2303 struct dp_mon_pdev *mon_pdev = NULL; 2304 struct dp_mon_pdev_be *mon_pdev_be = NULL; 2305 2306 if (!pdev) { 2307 dp_mon_filter_err("pdev Context is null"); 2308 return; 2309 } 2310 2311 mon_pdev = pdev->monitor_pdev; 2312 if (!mon_pdev) { 2313 dp_mon_filter_err("Monitor pdev context is null"); 2314 return; 2315 } 2316 2317 mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2318 2319 mon_pdev_be->filter_be[mode][srng_type] = filter; 2320 } 2321 #endif /* WDI_EVENT_ENABLE */ 2322 2323 /** 2324 * dp_rx_mon_filter_h2t_setup() - Setup the filter for the Target setup 2325 * @soc: DP soc handle 2326 * @pdev: DP pdev handle 2327 * @srng_type: The srng type for which filter will be set 2328 * @filter: tlv filter 2329 */ 2330 static void 2331 dp_rx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, 2332 enum dp_mon_filter_srng_type srng_type, 2333 struct dp_mon_filter *filter) 2334 { 2335 int32_t current_mode = 0; 2336 struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter; 2337 struct htt_rx_ring_tlv_filter *src_tlv_filter; 2338 struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; 2339 struct dp_mon_pdev_be *mon_pdev_be = 2340 dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2341 struct dp_mon_filter_be *mon_filter; 2342 uint32_t src_filter = 0, dst_filter = 0; 2343 2344 /* 2345 * Loop through all the modes. 2346 */ 2347 for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE; 2348 current_mode++) { 2349 mon_filter = 2350 &mon_pdev_be->filter_be[current_mode][srng_type]; 2351 src_tlv_filter = &mon_filter->rx_tlv_filter.tlv_filter; 2352 2353 /* 2354 * Check if the correct mode is enabled or not. 2355 */ 2356 if (!mon_filter->rx_tlv_filter.valid) 2357 continue; 2358 2359 filter->valid = true; 2360 2361 /* 2362 * Set the super bit fields 2363 */ 2364 src_filter = 2365 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2366 FILTER_TLV); 2367 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV); 2368 dst_filter |= src_filter; 2369 DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter); 2370 2371 /* 2372 * Set the filter management filter. 2373 */ 2374 src_filter = 2375 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2376 FILTER_FP_MGMT); 2377 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT); 2378 dst_filter |= src_filter; 2379 DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter); 2380 2381 /* 2382 * Set the monitor other management filter. 2383 */ 2384 src_filter = 2385 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2386 FILTER_MO_MGMT); 2387 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT); 2388 dst_filter |= src_filter; 2389 DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter); 2390 2391 /* 2392 * Set the filter pass control filter. 2393 */ 2394 src_filter = 2395 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2396 FILTER_FP_CTRL); 2397 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL); 2398 dst_filter |= src_filter; 2399 DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter); 2400 2401 /* 2402 * Set the monitor other control filter. 2403 */ 2404 src_filter = 2405 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2406 FILTER_MO_CTRL); 2407 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL); 2408 dst_filter |= src_filter; 2409 DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter); 2410 2411 /* 2412 * Set the filter pass data filter. 2413 */ 2414 src_filter = 2415 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2416 FILTER_FP_DATA); 2417 dst_filter = DP_MON_FILTER_GET(tlv_filter, 2418 FILTER_FP_DATA); 2419 dst_filter |= src_filter; 2420 DP_MON_FILTER_SET(tlv_filter, FILTER_FP_DATA, dst_filter); 2421 2422 /* 2423 * Set the monitor other data filter. 2424 */ 2425 src_filter = 2426 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2427 FILTER_MO_DATA); 2428 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA); 2429 dst_filter |= src_filter; 2430 DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter); 2431 2432 /* 2433 * Set the monitor direct data filter. 2434 */ 2435 src_filter = 2436 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2437 FILTER_MD_DATA); 2438 dst_filter = DP_MON_FILTER_GET(tlv_filter, 2439 FILTER_MD_DATA); 2440 dst_filter |= src_filter; 2441 DP_MON_FILTER_SET(tlv_filter, 2442 FILTER_MD_DATA, dst_filter); 2443 2444 /* 2445 * Set the monitor direct management filter. 2446 */ 2447 src_filter = 2448 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2449 FILTER_MD_MGMT); 2450 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT); 2451 dst_filter |= src_filter; 2452 DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter); 2453 2454 /* 2455 * Set the monitor direct management filter. 2456 */ 2457 src_filter = 2458 DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter, 2459 FILTER_MD_CTRL); 2460 dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL); 2461 dst_filter |= src_filter; 2462 DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter); 2463 2464 /* 2465 * set the dma length for type mgmt 2466 */ 2467 if (src_tlv_filter->mgmt_dma_length && 2468 !tlv_filter->mgmt_dma_length) 2469 tlv_filter->mgmt_dma_length = 2470 src_tlv_filter->mgmt_dma_length; 2471 2472 /* 2473 * set the dma length for type ctrl 2474 */ 2475 if (src_tlv_filter->ctrl_dma_length && 2476 !tlv_filter->ctrl_dma_length) 2477 tlv_filter->ctrl_dma_length = 2478 src_tlv_filter->ctrl_dma_length; 2479 2480 /* 2481 * set the dma length for type data 2482 */ 2483 if (src_tlv_filter->data_dma_length && 2484 !tlv_filter->data_dma_length) 2485 tlv_filter->data_dma_length = 2486 src_tlv_filter->data_dma_length; 2487 2488 /* 2489 * set mpdu logging for type mgmt 2490 */ 2491 if (src_tlv_filter->mgmt_mpdu_log && 2492 !tlv_filter->mgmt_mpdu_log) 2493 tlv_filter->mgmt_mpdu_log = 2494 src_tlv_filter->mgmt_mpdu_log; 2495 2496 /* 2497 * set mpdu logging for type ctrl 2498 */ 2499 if (src_tlv_filter->ctrl_mpdu_log && 2500 !tlv_filter->ctrl_mpdu_log) 2501 tlv_filter->ctrl_mpdu_log = 2502 src_tlv_filter->ctrl_mpdu_log; 2503 2504 /* 2505 * set mpdu logging for type data 2506 */ 2507 if (src_tlv_filter->data_mpdu_log && 2508 !tlv_filter->data_mpdu_log) 2509 tlv_filter->data_mpdu_log = 2510 src_tlv_filter->data_mpdu_log; 2511 2512 /* 2513 * set hdr tlv length 2514 */ 2515 if (src_tlv_filter->rx_hdr_length && 2516 !tlv_filter->rx_hdr_length) 2517 tlv_filter->rx_hdr_length = 2518 src_tlv_filter->rx_hdr_length; 2519 2520 if (src_tlv_filter->rx_pkt_tlv_offset && 2521 !tlv_filter->rx_pkt_tlv_offset) 2522 tlv_filter->rx_pkt_tlv_offset = 2523 src_tlv_filter->rx_pkt_tlv_offset; 2524 2525 /* 2526 * set fpmo filter settings 2527 */ 2528 if (src_tlv_filter->enable_fpmo && 2529 !tlv_filter->enable_fpmo) { 2530 tlv_filter->enable_fpmo = 2531 src_tlv_filter->enable_fpmo; 2532 tlv_filter->fpmo_data_filter = 2533 src_tlv_filter->fpmo_data_filter; 2534 tlv_filter->fpmo_mgmt_filter = 2535 src_tlv_filter->fpmo_mgmt_filter; 2536 tlv_filter->fpmo_ctrl_filter = 2537 src_tlv_filter->fpmo_ctrl_filter; 2538 } 2539 2540 dp_mon_filter_show_rx_filter_be(current_mode, mon_filter); 2541 } 2542 } 2543 2544 static 2545 void dp_tx_mon_downstream_tlv_set(struct htt_tx_ring_tlv_filter *dst_filter, 2546 struct htt_tx_ring_tlv_filter *src_filter) 2547 { 2548 dst_filter->dtlvs.tx_fes_setup |= 2549 src_filter->dtlvs.tx_fes_setup; 2550 dst_filter->dtlvs.tx_peer_entry |= 2551 src_filter->dtlvs.tx_peer_entry; 2552 dst_filter->dtlvs.tx_queue_extension |= 2553 src_filter->dtlvs.tx_queue_extension; 2554 dst_filter->dtlvs.tx_last_mpdu_end |= 2555 src_filter->dtlvs.tx_last_mpdu_end; 2556 dst_filter->dtlvs.tx_last_mpdu_fetched |= 2557 src_filter->dtlvs.tx_last_mpdu_fetched; 2558 dst_filter->dtlvs.tx_data_sync |= 2559 src_filter->dtlvs.tx_data_sync; 2560 dst_filter->dtlvs.pcu_ppdu_setup_init |= 2561 src_filter->dtlvs.pcu_ppdu_setup_init; 2562 dst_filter->dtlvs.fw2s_mon |= 2563 src_filter->dtlvs.fw2s_mon; 2564 dst_filter->dtlvs.tx_loopback_setup |= 2565 src_filter->dtlvs.tx_loopback_setup; 2566 dst_filter->dtlvs.sch_critical_tlv_ref |= 2567 src_filter->dtlvs.sch_critical_tlv_ref; 2568 dst_filter->dtlvs.ndp_preamble_done |= 2569 src_filter->dtlvs.ndp_preamble_done; 2570 dst_filter->dtlvs.tx_raw_frame_setup |= 2571 src_filter->dtlvs.tx_raw_frame_setup; 2572 dst_filter->dtlvs.txpcu_user_setup |= 2573 src_filter->dtlvs.txpcu_user_setup; 2574 dst_filter->dtlvs.rxpcu_setup |= 2575 src_filter->dtlvs.rxpcu_setup; 2576 dst_filter->dtlvs.rxpcu_setup_complete |= 2577 src_filter->dtlvs.rxpcu_setup_complete; 2578 dst_filter->dtlvs.coex_tx_req |= 2579 src_filter->dtlvs.coex_tx_req; 2580 dst_filter->dtlvs.rxpcu_user_setup |= 2581 src_filter->dtlvs.rxpcu_user_setup; 2582 dst_filter->dtlvs.rxpcu_user_setup_ext |= 2583 src_filter->dtlvs.rxpcu_user_setup_ext; 2584 dst_filter->dtlvs.wur_data |= src_filter->dtlvs.wur_data; 2585 dst_filter->dtlvs.tqm_mpdu_global_start |= 2586 src_filter->dtlvs.tqm_mpdu_global_start; 2587 dst_filter->dtlvs.tx_fes_setup_complete |= 2588 src_filter->dtlvs.tx_fes_setup_complete; 2589 dst_filter->dtlvs.scheduler_end |= src_filter->dtlvs.scheduler_end; 2590 dst_filter->dtlvs.sch_wait_instr_tx_path |= 2591 src_filter->dtlvs.sch_wait_instr_tx_path; 2592 } 2593 2594 static 2595 void dp_tx_mon_upstream_tlv_set(struct htt_tx_ring_tlv_filter *dst_filter, 2596 struct htt_tx_ring_tlv_filter *src_filter) 2597 { 2598 dst_filter->utlvs.rx_response_required_info |= 2599 src_filter->utlvs.rx_response_required_info; 2600 dst_filter->utlvs.response_start_status |= 2601 src_filter->utlvs.response_start_status; 2602 dst_filter->utlvs.response_end_status |= 2603 src_filter->utlvs.response_end_status; 2604 dst_filter->utlvs.tx_fes_status_start |= 2605 src_filter->utlvs.tx_fes_status_start; 2606 dst_filter->utlvs.tx_fes_status_end |= 2607 src_filter->utlvs.tx_fes_status_end; 2608 dst_filter->utlvs.tx_fes_status_start_ppdu |= 2609 src_filter->utlvs.tx_fes_status_start_ppdu; 2610 dst_filter->utlvs.tx_fes_status_user_ppdu |= 2611 src_filter->utlvs.tx_fes_status_user_ppdu; 2612 dst_filter->utlvs.tx_fes_status_ack_or_ba |= 2613 src_filter->utlvs.tx_fes_status_ack_or_ba; 2614 dst_filter->utlvs.tx_fes_status_1k_ba |= 2615 src_filter->utlvs.tx_fes_status_1k_ba; 2616 dst_filter->utlvs.tx_fes_status_start_prot |= 2617 src_filter->utlvs.tx_fes_status_start_prot; 2618 dst_filter->utlvs.tx_fes_status_prot |= 2619 src_filter->utlvs.tx_fes_status_prot; 2620 dst_filter->utlvs.tx_fes_status_user_response |= 2621 src_filter->utlvs.tx_fes_status_user_response; 2622 dst_filter->utlvs.rx_frame_bitmap_ack |= 2623 src_filter->utlvs.rx_frame_bitmap_ack; 2624 dst_filter->utlvs.rx_frame_1k_bitmap_ack |= 2625 src_filter->utlvs.rx_frame_1k_bitmap_ack; 2626 dst_filter->utlvs.coex_tx_status |= 2627 src_filter->utlvs.coex_tx_status; 2628 dst_filter->utlvs.received_response_info |= 2629 src_filter->utlvs.received_response_info; 2630 dst_filter->utlvs.received_response_info_p2 |= 2631 src_filter->utlvs.received_response_info_p2; 2632 dst_filter->utlvs.ofdma_trigger_details |= 2633 src_filter->utlvs.ofdma_trigger_details; 2634 dst_filter->utlvs.received_trigger_info |= 2635 src_filter->utlvs.received_trigger_info; 2636 dst_filter->utlvs.pdg_tx_request |= 2637 src_filter->utlvs.pdg_tx_request; 2638 dst_filter->utlvs.pdg_response |= 2639 src_filter->utlvs.pdg_response; 2640 dst_filter->utlvs.pdg_trig_response |= 2641 src_filter->utlvs.pdg_trig_response; 2642 dst_filter->utlvs.trigger_response_tx_done |= 2643 src_filter->utlvs.trigger_response_tx_done; 2644 dst_filter->utlvs.prot_tx_end |= 2645 src_filter->utlvs.prot_tx_end; 2646 dst_filter->utlvs.ppdu_tx_end |= 2647 src_filter->utlvs.ppdu_tx_end; 2648 dst_filter->utlvs.r2r_status_end |= 2649 src_filter->utlvs.r2r_status_end; 2650 dst_filter->utlvs.flush_req |= 2651 src_filter->utlvs.flush_req; 2652 dst_filter->utlvs.mactx_phy_desc |= 2653 src_filter->utlvs.mactx_phy_desc; 2654 dst_filter->utlvs.mactx_user_desc_cmn |= 2655 src_filter->utlvs.mactx_user_desc_cmn; 2656 dst_filter->utlvs.mactx_user_desc_per_usr |= 2657 src_filter->utlvs.mactx_user_desc_per_usr; 2658 2659 dst_filter->utlvs.tqm_acked_1k_mpdu |= 2660 src_filter->utlvs.tqm_acked_1k_mpdu; 2661 dst_filter->utlvs.tqm_acked_mpdu |= 2662 src_filter->utlvs.tqm_acked_mpdu; 2663 dst_filter->utlvs.tqm_update_tx_mpdu_count |= 2664 src_filter->utlvs.tqm_update_tx_mpdu_count; 2665 dst_filter->utlvs.phytx_ppdu_header_info_request |= 2666 src_filter->utlvs.phytx_ppdu_header_info_request; 2667 dst_filter->utlvs.u_sig_eht_su_mu |= 2668 src_filter->utlvs.u_sig_eht_su_mu; 2669 dst_filter->utlvs.u_sig_eht_su |= 2670 src_filter->utlvs.u_sig_eht_su; 2671 dst_filter->utlvs.u_sig_eht_tb |= 2672 src_filter->utlvs.u_sig_eht_tb; 2673 dst_filter->utlvs.eht_sig_usr_su |= 2674 src_filter->utlvs.eht_sig_usr_su; 2675 dst_filter->utlvs.eht_sig_usr_mu_mimo |= 2676 src_filter->utlvs.eht_sig_usr_mu_mimo; 2677 dst_filter->utlvs.eht_sig_usr_ofdma |= 2678 src_filter->utlvs.eht_sig_usr_ofdma; 2679 dst_filter->utlvs.he_sig_a_su |= 2680 src_filter->utlvs.he_sig_a_su; 2681 dst_filter->utlvs.he_sig_a_mu_dl |= 2682 src_filter->utlvs.he_sig_a_mu_dl; 2683 dst_filter->utlvs.he_sig_a_mu_ul |= 2684 src_filter->utlvs.he_sig_a_mu_ul; 2685 dst_filter->utlvs.he_sig_b1_mu |= 2686 src_filter->utlvs.he_sig_b1_mu; 2687 dst_filter->utlvs.he_sig_b2_mu |= 2688 src_filter->utlvs.he_sig_b2_mu; 2689 dst_filter->utlvs.he_sig_b2_ofdma |= 2690 src_filter->utlvs.he_sig_b2_ofdma; 2691 dst_filter->utlvs.vht_sig_b_mu160 |= 2692 src_filter->utlvs.vht_sig_b_mu160; 2693 dst_filter->utlvs.vht_sig_b_mu80 |= 2694 src_filter->utlvs.vht_sig_b_mu80; 2695 dst_filter->utlvs.vht_sig_b_mu40 |= 2696 src_filter->utlvs.vht_sig_b_mu40; 2697 dst_filter->utlvs.vht_sig_b_mu20 |= 2698 src_filter->utlvs.vht_sig_b_mu20; 2699 dst_filter->utlvs.vht_sig_b_su160 |= 2700 src_filter->utlvs.vht_sig_b_su160; 2701 dst_filter->utlvs.vht_sig_b_su80 |= 2702 src_filter->utlvs.vht_sig_b_su80; 2703 dst_filter->utlvs.vht_sig_b_su40 |= 2704 src_filter->utlvs.vht_sig_b_su40; 2705 dst_filter->utlvs.vht_sig_b_su20 |= 2706 src_filter->utlvs.vht_sig_b_su20; 2707 dst_filter->utlvs.vht_sig_a |= 2708 src_filter->utlvs.vht_sig_a; 2709 dst_filter->utlvs.ht_sig |= 2710 src_filter->utlvs.ht_sig; 2711 dst_filter->utlvs.l_sig_b |= 2712 src_filter->utlvs.l_sig_b; 2713 dst_filter->utlvs.l_sig_a |= 2714 src_filter->utlvs.l_sig_a; 2715 dst_filter->utlvs.tx_service |= 2716 src_filter->utlvs.tx_service; 2717 2718 dst_filter->utlvs.txpcu_buf_status |= 2719 src_filter->utlvs.txpcu_buf_status; 2720 dst_filter->utlvs.txpcu_user_buf_status |= 2721 src_filter->utlvs.txpcu_user_buf_status; 2722 dst_filter->utlvs.txdma_stop_request |= 2723 src_filter->utlvs.txdma_stop_request; 2724 dst_filter->utlvs.expected_response |= 2725 src_filter->utlvs.expected_response; 2726 dst_filter->utlvs.tx_mpdu_count_transfer_end |= 2727 src_filter->utlvs.tx_mpdu_count_transfer_end; 2728 dst_filter->utlvs.rx_trig_info |= 2729 src_filter->utlvs.rx_trig_info; 2730 dst_filter->utlvs.rxpcu_tx_setup_clear |= 2731 src_filter->utlvs.rxpcu_tx_setup_clear; 2732 dst_filter->utlvs.rx_frame_bitmap_req |= 2733 src_filter->utlvs.rx_frame_bitmap_req; 2734 dst_filter->utlvs.rx_phy_sleep |= 2735 src_filter->utlvs.rx_phy_sleep; 2736 dst_filter->utlvs.txpcu_preamble_done |= 2737 src_filter->utlvs.txpcu_preamble_done; 2738 dst_filter->utlvs.txpcu_phytx_debug32 |= 2739 src_filter->utlvs.txpcu_phytx_debug32; 2740 dst_filter->utlvs.txpcu_phytx_other_transmit_info32 |= 2741 src_filter->utlvs.txpcu_phytx_other_transmit_info32; 2742 dst_filter->utlvs.rx_ppdu_noack_report |= 2743 src_filter->utlvs.rx_ppdu_noack_report; 2744 dst_filter->utlvs.rx_ppdu_ack_report |= 2745 src_filter->utlvs.rx_ppdu_ack_report; 2746 dst_filter->utlvs.coex_rx_status |= 2747 src_filter->utlvs.coex_rx_status; 2748 dst_filter->utlvs.rx_start_param |= 2749 src_filter->utlvs.rx_start_param; 2750 dst_filter->utlvs.tx_cbf_info |= 2751 src_filter->utlvs.tx_cbf_info; 2752 dst_filter->utlvs.rxpcu_early_rx_indication |= 2753 src_filter->utlvs.rxpcu_early_rx_indication; 2754 dst_filter->utlvs.received_response_user_7_0 |= 2755 src_filter->utlvs.received_response_user_7_0; 2756 dst_filter->utlvs.received_response_user_15_8 |= 2757 src_filter->utlvs.received_response_user_15_8; 2758 dst_filter->utlvs.received_response_user_23_16 |= 2759 src_filter->utlvs.received_response_user_23_16; 2760 dst_filter->utlvs.received_response_user_31_24 |= 2761 src_filter->utlvs.received_response_user_31_24; 2762 dst_filter->utlvs.received_response_user_36_32 |= 2763 src_filter->utlvs.received_response_user_36_32; 2764 dst_filter->utlvs.rx_pm_info |= 2765 src_filter->utlvs.rx_pm_info; 2766 dst_filter->utlvs.rx_preamble |= 2767 src_filter->utlvs.rx_preamble; 2768 dst_filter->utlvs.others |= 2769 src_filter->utlvs.others; 2770 dst_filter->utlvs.mactx_pre_phy_desc |= 2771 src_filter->utlvs.mactx_pre_phy_desc; 2772 } 2773 2774 static 2775 void dp_tx_mon_wordmask_config_set(struct htt_tx_ring_tlv_filter *dst_filter, 2776 struct htt_tx_ring_tlv_filter *src_filter) 2777 { 2778 dst_filter->wmask.tx_fes_setup |= 2779 src_filter->wmask.tx_fes_setup; 2780 dst_filter->wmask.tx_peer_entry |= 2781 src_filter->wmask.tx_peer_entry; 2782 dst_filter->wmask.tx_queue_ext |= 2783 src_filter->wmask.tx_queue_ext; 2784 dst_filter->wmask.tx_msdu_start |= 2785 src_filter->wmask.tx_msdu_start; 2786 dst_filter->wmask.tx_mpdu_start |= 2787 src_filter->wmask.tx_mpdu_start; 2788 dst_filter->wmask.pcu_ppdu_setup_init |= 2789 src_filter->wmask.pcu_ppdu_setup_init; 2790 dst_filter->wmask.rxpcu_user_setup |= 2791 src_filter->wmask.rxpcu_user_setup; 2792 } 2793 2794 /** 2795 * dp_tx_mon_filter_h2t_setup() - Setup the filter 2796 * @soc: DP soc handle 2797 * @pdev: DP pdev handle 2798 * @srng_type: The srng type for which filter will be set 2799 * @filter: tlv filter 2800 */ 2801 static 2802 void dp_tx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, 2803 enum dp_mon_filter_srng_type srng_type, 2804 struct dp_mon_filter_be *filter) 2805 { 2806 int32_t current_mode = 0; 2807 struct htt_tx_ring_tlv_filter *dst_filter = &filter->tx_tlv_filter; 2808 struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; 2809 struct dp_mon_pdev_be *mon_pdev_be = 2810 dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); 2811 2812 /* 2813 * Loop through all the modes. 2814 */ 2815 for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE; 2816 current_mode++) { 2817 struct dp_mon_filter_be *mon_filter = 2818 &mon_pdev_be->filter_be[current_mode][srng_type]; 2819 struct htt_tx_ring_tlv_filter *src_filter = 2820 &mon_filter->tx_tlv_filter; 2821 2822 /* 2823 * Check if the correct mode is enabled or not. 2824 */ 2825 if (!mon_filter->tx_valid) 2826 continue; 2827 2828 dst_filter->enable = 1; 2829 2830 dp_tx_mon_downstream_tlv_set(dst_filter, src_filter); 2831 dp_tx_mon_upstream_tlv_set(dst_filter, src_filter); 2832 dp_tx_mon_wordmask_config_set(dst_filter, src_filter); 2833 2834 dst_filter->mgmt_filter |= src_filter->mgmt_filter; 2835 dst_filter->data_filter |= src_filter->data_filter; 2836 dst_filter->ctrl_filter |= src_filter->ctrl_filter; 2837 dst_filter->mgmt_dma_length |= src_filter->mgmt_dma_length; 2838 dst_filter->ctrl_dma_length |= src_filter->ctrl_dma_length; 2839 dst_filter->data_dma_length |= src_filter->data_dma_length; 2840 dst_filter->mgmt_mpdu_end |= src_filter->mgmt_mpdu_end; 2841 dst_filter->mgmt_msdu_end |= src_filter->mgmt_msdu_end; 2842 dst_filter->mgmt_msdu_start |= src_filter->mgmt_msdu_start; 2843 dst_filter->mgmt_mpdu_start |= src_filter->mgmt_mpdu_start; 2844 dst_filter->ctrl_mpdu_end |= src_filter->mgmt_mpdu_end; 2845 dst_filter->ctrl_msdu_end |= src_filter->mgmt_msdu_end; 2846 dst_filter->ctrl_msdu_start |= src_filter->mgmt_msdu_start; 2847 dst_filter->ctrl_mpdu_start |= src_filter->mgmt_mpdu_start; 2848 dst_filter->data_mpdu_end |= src_filter->mgmt_mpdu_end; 2849 dst_filter->data_msdu_end |= src_filter->mgmt_msdu_end; 2850 dst_filter->data_msdu_start |= src_filter->mgmt_msdu_start; 2851 dst_filter->data_mpdu_start |= src_filter->mgmt_mpdu_start; 2852 dst_filter->mgmt_mpdu_log |= src_filter->mgmt_mpdu_log; 2853 dst_filter->ctrl_mpdu_log |= src_filter->ctrl_mpdu_log; 2854 dst_filter->data_mpdu_log |= src_filter->data_mpdu_log; 2855 } 2856 DP_MON_FILTER_PRINT("TXMON FINAL FILTER CONFIG:"); 2857 dp_tx_mon_filter_show_filter(filter); 2858 } 2859 2860 static QDF_STATUS 2861 dp_tx_mon_ht2_ring_cfg(struct dp_soc *soc, 2862 struct dp_pdev *pdev, 2863 enum dp_mon_filter_srng_type srng_type, 2864 struct htt_tx_ring_tlv_filter *tlv_filter) 2865 { 2866 int mac_id; 2867 int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx); 2868 QDF_STATUS status = QDF_STATUS_SUCCESS; 2869 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2870 struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); 2871 2872 dp_mon_filter_info("%pK: srng type %d Max_mac_rings %d ", 2873 soc, srng_type, max_mac_rings); 2874 2875 for (mac_id = 0; mac_id < max_mac_rings; mac_id++) { 2876 int mac_for_pdev = 2877 dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); 2878 int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id); 2879 int hal_ring_type, ring_buf_size; 2880 hal_ring_handle_t hal_ring_hdl; 2881 2882 hal_ring_hdl = 2883 mon_soc_be->tx_mon_dst_ring[lmac_id].hal_srng; 2884 hal_ring_type = TX_MONITOR_DST; 2885 ring_buf_size = 2048; 2886 2887 status = htt_h2t_tx_ring_cfg(soc->htt_handle, mac_for_pdev, 2888 hal_ring_hdl, hal_ring_type, 2889 ring_buf_size, 2890 tlv_filter); 2891 if (status != QDF_STATUS_SUCCESS) 2892 return status; 2893 } 2894 2895 return status; 2896 } 2897 2898 QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev) 2899 { 2900 struct dp_soc *soc; 2901 struct dp_mon_filter_be filter = {0}; 2902 enum dp_mon_filter_srng_type srng_type = 2903 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 2904 2905 if (!pdev) { 2906 dp_mon_filter_err("pdev Context is null"); 2907 return QDF_STATUS_E_FAILURE; 2908 } 2909 2910 soc = pdev->soc; 2911 if (!soc) { 2912 dp_mon_filter_err("soc Context is null"); 2913 return QDF_STATUS_E_FAILURE; 2914 } 2915 2916 dp_tx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter); 2917 dp_tx_mon_ht2_ring_cfg(soc, pdev, srng_type, 2918 &filter.tx_tlv_filter); 2919 2920 return QDF_STATUS_SUCCESS; 2921 } 2922 2923 QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev) 2924 { 2925 struct dp_soc *soc; 2926 struct dp_mon_filter_be filter = {0}; 2927 struct htt_rx_ring_tlv_filter *rx_tlv_filter; 2928 enum dp_mon_filter_srng_type srng_type = 2929 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2930 2931 if (!pdev) { 2932 dp_mon_filter_err("pdev Context is null"); 2933 return QDF_STATUS_E_FAILURE; 2934 } 2935 soc = pdev->soc; 2936 2937 rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter; 2938 dp_rx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter); 2939 if (filter.rx_tlv_filter.valid) 2940 rx_tlv_filter->enable = 1; 2941 else 2942 rx_tlv_filter->enable = 0; 2943 2944 dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type, 2945 &filter.rx_tlv_filter.tlv_filter); 2946 return QDF_STATUS_SUCCESS; 2947 } 2948 2949 #ifdef QCA_SUPPORT_LITE_MONITOR 2950 void 2951 dp_mon_filter_reset_rx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev) 2952 { 2953 struct dp_mon_filter_be filter = {0}; 2954 enum dp_mon_filter_mode filter_mode = 2955 DP_MON_FILTER_LITE_MON_MODE; 2956 enum dp_mon_filter_srng_type srng_type = 2957 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2958 struct dp_lite_mon_rx_config *config = NULL; 2959 2960 be_mon_pdev->filter_be[filter_mode][srng_type] = filter; 2961 config = be_mon_pdev->lite_mon_rx_config; 2962 if (config) 2963 config->fp_type_subtype_filter_all = false; 2964 } 2965 2966 void 2967 dp_mon_filter_setup_rx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev) 2968 { 2969 struct dp_mon_filter_be filter = {0}; 2970 struct dp_mon_filter *rx_tlv_filter; 2971 enum dp_mon_filter_mode filter_mode = 2972 DP_MON_FILTER_LITE_MON_MODE; 2973 enum dp_mon_filter_srng_type srng_type = 2974 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 2975 struct dp_lite_mon_rx_config *config = NULL; 2976 uint16_t max_custom_len = 0; 2977 uint16_t mgmt_len = 0; 2978 uint16_t ctrl_len = 0; 2979 uint16_t data_len = 0; 2980 2981 config = be_mon_pdev->lite_mon_rx_config; 2982 if (!config) 2983 return; 2984 2985 rx_tlv_filter = &filter.rx_tlv_filter; 2986 rx_tlv_filter->valid = true; 2987 /* configure fp filters if enabled */ 2988 if (config->rx_config.fp_enabled) { 2989 rx_tlv_filter->tlv_filter.enable_fp = 1; 2990 rx_tlv_filter->tlv_filter.fp_mgmt_filter = 2991 config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP]; 2992 rx_tlv_filter->tlv_filter.fp_ctrl_filter = 2993 config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP]; 2994 rx_tlv_filter->tlv_filter.fp_data_filter = 2995 config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP]; 2996 if ((config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP] == 2997 CDP_LITE_MON_FILTER_ALL) && 2998 (config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP] == 2999 CDP_LITE_MON_FILTER_ALL) && 3000 (config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP] == 3001 CDP_LITE_MON_FILTER_ALL)) 3002 config->fp_type_subtype_filter_all = true; 3003 } 3004 3005 /* configure md filters if enabled */ 3006 if (config->rx_config.md_enabled) { 3007 rx_tlv_filter->tlv_filter.enable_md = 1; 3008 rx_tlv_filter->tlv_filter.md_mgmt_filter = 3009 config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_MD]; 3010 rx_tlv_filter->tlv_filter.md_ctrl_filter = 3011 config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_MD]; 3012 rx_tlv_filter->tlv_filter.md_data_filter = 3013 config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_MD]; 3014 } 3015 3016 /* configure mo filters if enabled */ 3017 if (config->rx_config.mo_enabled) { 3018 rx_tlv_filter->tlv_filter.enable_mo = 1; 3019 rx_tlv_filter->tlv_filter.mo_mgmt_filter = 3020 config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_MO]; 3021 rx_tlv_filter->tlv_filter.mo_ctrl_filter = 3022 config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_MO]; 3023 rx_tlv_filter->tlv_filter.mo_data_filter = 3024 config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_MO]; 3025 } 3026 3027 /* configure fpmo filters if enabled */ 3028 if (config->rx_config.fpmo_enabled) { 3029 rx_tlv_filter->tlv_filter.enable_fpmo = 1; 3030 rx_tlv_filter->tlv_filter.fpmo_mgmt_filter = 3031 config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP_MO]; 3032 rx_tlv_filter->tlv_filter.fpmo_ctrl_filter = 3033 config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP_MO]; 3034 rx_tlv_filter->tlv_filter.fpmo_data_filter = 3035 config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP_MO]; 3036 } 3037 3038 mgmt_len = config->rx_config.len[WLAN_FC0_TYPE_MGMT]; 3039 ctrl_len = config->rx_config.len[WLAN_FC0_TYPE_CTRL]; 3040 data_len = config->rx_config.len[WLAN_FC0_TYPE_DATA]; 3041 /* if full len is configured for any of the types, subscribe 3042 * for full dma length else set it to min dma length(fw sets 3043 * full length by default) to avoid unnecessary dma since we 3044 * do not have hw support to control rx pkt tlvs per type. To 3045 * get custom len pkt we make use of rx hdr tlv instead. 3046 */ 3047 if (dp_lite_mon_is_full_len_configured(mgmt_len, 3048 ctrl_len, 3049 data_len)) { 3050 rx_tlv_filter->tlv_filter.packet = 1; 3051 /* get offset size in QWORDS */ 3052 rx_tlv_filter->tlv_filter.rx_pkt_tlv_offset = 3053 DP_GET_NUM_QWORDS(DP_RX_MON_PACKET_OFFSET); 3054 if (mgmt_len == CDP_LITE_MON_LEN_FULL) 3055 rx_tlv_filter->tlv_filter.mgmt_dma_length = 3056 DEFAULT_DMA_LENGTH; 3057 else 3058 rx_tlv_filter->tlv_filter.mgmt_dma_length = 3059 DMA_LENGTH_64B; 3060 3061 if (ctrl_len == CDP_LITE_MON_LEN_FULL) 3062 rx_tlv_filter->tlv_filter.ctrl_dma_length = 3063 DEFAULT_DMA_LENGTH; 3064 else 3065 rx_tlv_filter->tlv_filter.ctrl_dma_length = 3066 DMA_LENGTH_64B; 3067 3068 if (data_len == CDP_LITE_MON_LEN_FULL) 3069 rx_tlv_filter->tlv_filter.data_dma_length = 3070 DEFAULT_DMA_LENGTH; 3071 else 3072 rx_tlv_filter->tlv_filter.data_dma_length = 3073 DMA_LENGTH_64B; 3074 } else { 3075 /* if full len not configured set to min len */ 3076 rx_tlv_filter->tlv_filter.mgmt_dma_length = DMA_LENGTH_64B; 3077 rx_tlv_filter->tlv_filter.ctrl_dma_length = DMA_LENGTH_64B; 3078 rx_tlv_filter->tlv_filter.data_dma_length = DMA_LENGTH_64B; 3079 } 3080 3081 rx_tlv_filter->tlv_filter.packet_header = 1; 3082 /* set rx hdr tlv len, default len is 128B */ 3083 max_custom_len = dp_lite_mon_get_max_custom_len(mgmt_len, ctrl_len, 3084 data_len); 3085 if (max_custom_len == CDP_LITE_MON_LEN_64B) 3086 rx_tlv_filter->tlv_filter.rx_hdr_length = 3087 RX_HDR_DMA_LENGTH_64B; 3088 else if (max_custom_len == CDP_LITE_MON_LEN_128B) 3089 rx_tlv_filter->tlv_filter.rx_hdr_length = 3090 RX_HDR_DMA_LENGTH_128B; 3091 else if (max_custom_len == CDP_LITE_MON_LEN_256B) 3092 rx_tlv_filter->tlv_filter.rx_hdr_length = 3093 RX_HDR_DMA_LENGTH_256B; 3094 3095 if ((config->rx_config.level == CDP_LITE_MON_LEVEL_MSDU) || 3096 dp_lite_mon_is_full_len_configured(mgmt_len, ctrl_len, data_len)) { 3097 rx_tlv_filter->tlv_filter.header_per_msdu = 1; 3098 rx_tlv_filter->tlv_filter.msdu_end = 1; 3099 } 3100 3101 rx_tlv_filter->tlv_filter.ppdu_start = 1; 3102 rx_tlv_filter->tlv_filter.ppdu_end = 1; 3103 rx_tlv_filter->tlv_filter.mpdu_start = 1; 3104 rx_tlv_filter->tlv_filter.mpdu_end = 1; 3105 3106 rx_tlv_filter->tlv_filter.ppdu_end_user_stats = 1; 3107 rx_tlv_filter->tlv_filter.ppdu_end_user_stats_ext = 1; 3108 rx_tlv_filter->tlv_filter.ppdu_end_status_done = 1; 3109 rx_tlv_filter->tlv_filter.ppdu_start_user_info = 1; 3110 3111 dp_mon_filter_show_rx_filter_be(filter_mode, &filter); 3112 be_mon_pdev->filter_be[filter_mode][srng_type] = filter; 3113 } 3114 3115 uint8_t tx_lite_mon_set_len(uint16_t len) 3116 { 3117 switch (len) { 3118 case CDP_LITE_MON_LEN_64B: 3119 return DMA_LENGTH_64B; 3120 case CDP_LITE_MON_LEN_128B: 3121 return DMA_LENGTH_128B; 3122 case CDP_LITE_MON_LEN_256B: 3123 return DMA_LENGTH_256B; 3124 case CDP_LITE_MON_LEN_FULL: 3125 return DEFAULT_DMA_LENGTH; 3126 default: 3127 dp_mon_filter_err("Invalid length %d, Using minimal length of 64B", 3128 len); 3129 return DMA_LENGTH_64B; 3130 } 3131 } 3132 3133 void 3134 dp_mon_filter_reset_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev) 3135 { 3136 struct dp_mon_filter_be filter = {0}; 3137 enum dp_mon_filter_mode filter_mode = 3138 DP_MON_FILTER_LITE_MON_MODE; 3139 enum dp_mon_filter_srng_type srng_type = 3140 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 3141 struct dp_lite_mon_tx_config *config = NULL; 3142 3143 be_mon_pdev->filter_be[filter_mode][srng_type] = filter; 3144 config = be_mon_pdev->lite_mon_tx_config; 3145 if (!config) 3146 return; 3147 config->subtype_filtering = false; 3148 config->sw_peer_filtering = false; 3149 3150 } 3151 3152 void 3153 dp_mon_filter_setup_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev) 3154 { 3155 struct dp_mon_filter_be filter = {0}; 3156 enum dp_mon_filter_mode mode = DP_MON_FILTER_LITE_MON_MODE; 3157 enum dp_mon_filter_srng_type srng_type = 3158 DP_MON_FILTER_SRNG_TYPE_TXMON_DEST; 3159 struct htt_tx_ring_tlv_filter *tx_tlv_filter = &filter.tx_tlv_filter; 3160 struct dp_lite_mon_tx_config *config = NULL; 3161 3162 config = be_mon_pdev->lite_mon_tx_config; 3163 if (!config) 3164 return; 3165 3166 /* tx monitor supports only filter pass mode */ 3167 if (config->tx_config.md_enabled || config->tx_config.mo_enabled || 3168 config->tx_config.fpmo_enabled) { 3169 dp_mon_filter_err("md mo and fpmo are invalid filter configuration for Tx"); 3170 return; 3171 } 3172 3173 /* Enable tx monitor filter */ 3174 filter.tx_valid = true; 3175 tx_tlv_filter->enable = 1; 3176 3177 dp_tx_mon_filter_set_downstream_tlvs(tx_tlv_filter); 3178 dp_tx_mon_filter_set_upstream_tlvs(tx_tlv_filter); 3179 dp_tx_mon_filter_set_word_mask(tx_tlv_filter); 3180 3181 /* configure mgmt filters */ 3182 if (config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP]) { 3183 tx_tlv_filter->mgmt_filter = 1; 3184 tx_tlv_filter->mgmt_dma_length = 3185 tx_lite_mon_set_len(config->tx_config.len[WLAN_FC0_TYPE_MGMT]); 3186 if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) || 3187 (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU)) 3188 tx_tlv_filter->mgmt_mpdu_log = 1; 3189 if (config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP] != 3190 CDP_LITE_MON_FILTER_ALL) 3191 config->subtype_filtering = true; 3192 } 3193 3194 /* configure ctrl filters */ 3195 if (config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP]) { 3196 tx_tlv_filter->ctrl_filter = 1; 3197 tx_tlv_filter->ctrl_dma_length = 3198 tx_lite_mon_set_len(config->tx_config.len[WLAN_FC0_TYPE_CTRL]); 3199 if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) || 3200 (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU)) 3201 tx_tlv_filter->ctrl_mpdu_log = 1; 3202 } 3203 /* Since ctrl frames are generated in host, we need to do subtype 3204 * filtering even though ctrl filters are not enabled 3205 */ 3206 if (config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP] != 3207 CDP_LITE_MON_FILTER_ALL) 3208 config->subtype_filtering = true; 3209 /* configure data filters */ 3210 if (config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP]) { 3211 tx_tlv_filter->data_filter = 1; 3212 tx_tlv_filter->data_dma_length = 3213 tx_lite_mon_set_len(config->tx_config.len[WLAN_FC0_TYPE_DATA]); 3214 if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) || 3215 (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU)) 3216 tx_tlv_filter->data_mpdu_log = 1; 3217 if (config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP] != 3218 CDP_LITE_MON_FILTER_ALL) 3219 config->subtype_filtering = true; 3220 } 3221 3222 dp_mon_filter_show_tx_filter_be(mode, &filter); 3223 be_mon_pdev->filter_be[mode][srng_type] = filter; 3224 } 3225 #endif /* QCA_SUPPORT_LITE_MONITOR */ 3226 3227 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) 3228 /** 3229 * dp_cfr_filter_2_0() - Configure HOST monitor destination ring for CFR 3230 * 3231 * @soc_hdl: Datapath soc handle 3232 * @pdev_id: id of data path pdev handle 3233 * @enable: Enable/Disable CFR 3234 * @filter_val: Flag to select Filter for monitor mode 3235 * @cfr_enable_monitor_mode: Flag to be enabled when scan radio is brought up 3236 * in special vap mode 3237 * 3238 * Return: void 3239 */ 3240 static void dp_cfr_filter_2_0(struct cdp_soc_t *soc_hdl, 3241 uint8_t pdev_id, 3242 bool enable, 3243 struct cdp_monitor_filter *filter_val, 3244 bool cfr_enable_monitor_mode) 3245 { 3246 struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); 3247 struct dp_pdev *pdev = NULL; 3248 struct htt_rx_ring_tlv_filter *htt_tlv_filter; 3249 struct dp_mon_pdev *mon_pdev; 3250 struct dp_mon_filter_be filter = {0}; 3251 enum dp_mon_filter_srng_type srng_type = 3252 DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; 3253 3254 pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 3255 if (!pdev) { 3256 dp_mon_err("pdev is NULL"); 3257 return; 3258 } 3259 3260 mon_pdev = pdev->monitor_pdev; 3261 3262 if (mon_pdev->mvdev) { 3263 if (enable && cfr_enable_monitor_mode) 3264 pdev->cfr_rcc_mode = true; 3265 else 3266 pdev->cfr_rcc_mode = false; 3267 return; 3268 } 3269 3270 soc = pdev->soc; 3271 pdev->cfr_rcc_mode = false; 3272 3273 /* Get default tlv settings */ 3274 htt_tlv_filter = &filter.rx_tlv_filter.tlv_filter; 3275 dp_rx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter); 3276 3277 if (filter.rx_tlv_filter.valid) 3278 htt_tlv_filter->enable = 1; 3279 else 3280 htt_tlv_filter->enable = 0; 3281 3282 dp_mon_info("enable : %d, mode: 0x%x", enable, filter_val->mode); 3283 3284 if (enable) { 3285 pdev->cfr_rcc_mode = true; 3286 htt_tlv_filter->ppdu_start = 1; 3287 htt_tlv_filter->ppdu_end = 1; 3288 htt_tlv_filter->ppdu_end_user_stats = 1; 3289 htt_tlv_filter->ppdu_end_user_stats_ext = 1; 3290 htt_tlv_filter->ppdu_end_status_done = 1; 3291 htt_tlv_filter->mpdu_start = 1; 3292 htt_tlv_filter->offset_valid = false; 3293 3294 htt_tlv_filter->enable_fp = 3295 (filter_val->mode & MON_FILTER_PASS) ? 1 : 0; 3296 htt_tlv_filter->enable_md = 0; 3297 htt_tlv_filter->enable_mo = 3298 (filter_val->mode & MON_FILTER_OTHER) ? 1 : 0; 3299 htt_tlv_filter->fp_mgmt_filter = filter_val->fp_mgmt; 3300 htt_tlv_filter->fp_ctrl_filter = filter_val->fp_ctrl; 3301 htt_tlv_filter->fp_data_filter = filter_val->fp_data; 3302 htt_tlv_filter->mo_mgmt_filter = filter_val->mo_mgmt; 3303 htt_tlv_filter->mo_ctrl_filter = filter_val->mo_ctrl; 3304 htt_tlv_filter->mo_data_filter = filter_val->mo_data; 3305 } 3306 3307 dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type, 3308 &filter.rx_tlv_filter.tlv_filter); 3309 } 3310 3311 void dp_cfr_filter_register_2_0(struct cdp_ops *ops) 3312 { 3313 ops->cfr_ops->txrx_cfr_filter = dp_cfr_filter_2_0; 3314 } 3315 #endif 3316