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