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