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