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