diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 129f620899..c8e891fe64 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -1572,12 +1572,14 @@ void dp_rx_word_mask_subscribe_be(struct dp_soc *soc, if (!msg_word || !tlv_filter) return; + /* tlv_filter->enable is set to 1 for monitor rings */ + if (tlv_filter->enable) + return; + /* if word mask is zero, FW will set the default values */ if (!(tlv_filter->rx_mpdu_start_wmask > 0 && tlv_filter->rx_msdu_end_wmask > 0)) { - msg_word += 4; - *msg_word = 0; - goto config_mon; + return; } HTT_RX_RING_SELECTION_CFG_WORD_MASK_COMPACTION_ENABLE_SET(*msg_word, 1); @@ -1596,9 +1598,6 @@ void dp_rx_word_mask_subscribe_be(struct dp_soc *soc, HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_SET( *msg_word, tlv_filter->rx_msdu_end_wmask); -config_mon: - msg_word--; - dp_mon_rx_wmask_subscribe(soc, msg_word, tlv_filter); } #else void dp_rx_word_mask_subscribe_be(struct dp_soc *soc, diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index a6f80d2293..e265d336a9 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1672,21 +1672,31 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, msg_word, (void *)htt_tlv_filter); + dp_mon_rx_wmask_subscribe(soc->dp_soc, msg_word, htt_tlv_filter); + if (mon_drop_th > 0) HTT_RX_RING_SELECTION_CFG_RX_DROP_THRESHOLD_SET(*msg_word, - mon_drop_th); + mon_drop_th); + dp_mon_rx_enable_mpdu_logging(soc->dp_soc, msg_word, htt_tlv_filter); dp_mon_rx_enable_phy_errors(msg_word, htt_tlv_filter); /* word 14*/ msg_word += 3; + /* word 15*/ msg_word++; + /* word 16*/ + msg_word++; + *msg_word = 0; + + dp_mon_rx_enable_pkt_tlv_offset(soc->dp_soc, msg_word, htt_tlv_filter); + #ifdef FW_SUPPORT_NOT_YET - /* word 17*/ - msg_word += 3; + /* word 20 and 21*/ + msg_word += 4; *msg_word = 0; dp_mon_rx_enable_fpmo(soc->dp_soc, msg_word, htt_tlv_filter); diff --git a/dp/wifi3.0/dp_htt.h b/dp/wifi3.0/dp_htt.h index bebef93c30..a8b028351a 100644 --- a/dp/wifi3.0/dp_htt.h +++ b/dp/wifi3.0/dp_htt.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -676,8 +676,9 @@ struct htt_rx_ring_tlv_filter { u_int32_t phy_err_mask; u_int32_t phy_err_mask_cont; #endif -#if defined(QCA_MONITOR_2_0_SUPPORT) || defined(CONFIG_WORD_BASED_TLV) - uint16_t rx_mpdu_start_wmask; +#if defined(QCA_MONITOR_2_0_SUPPORT) || defined(CONFIG_WORD_BASED_TLV) || \ + defined(CONFIG_MON_WORD_BASED_TLV) + uint32_t rx_mpdu_start_wmask; uint16_t rx_mpdu_end_wmask; uint32_t rx_msdu_end_wmask; uint16_t rx_pkt_tlv_offset; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index bf51876530..5e7247c3b3 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -960,6 +960,12 @@ dp_mon_rx_mac_filter_set(struct dp_soc *soc, uint32_t *msg_word, { } +static inline void +dp_mon_rx_enable_pkt_tlv_offset(struct dp_soc *soc, uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ +} + #ifdef WLAN_TELEMETRY_STATS_SUPPORT static inline void dp_monitor_peer_telemetry_stats(struct dp_peer *peer, diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index 2ffa8c1bad..5d91208616 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -1192,6 +1192,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) mon_ops->rx_packet_length_set = NULL; mon_ops->rx_mon_enable = NULL; mon_ops->rx_wmask_subscribe = NULL; + mon_ops->rx_pkt_tlv_offset = NULL; mon_ops->rx_enable_mpdu_logging = NULL; mon_ops->rx_enable_fpmo = NULL; mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach; diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 34dbab002a..05beeae264 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -1427,6 +1427,7 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc) mon_ops->rx_packet_length_set = dp_rx_mon_packet_length_set; mon_ops->rx_mon_enable = dp_rx_mon_enable_set; mon_ops->rx_wmask_subscribe = dp_rx_mon_word_mask_subscribe; + mon_ops->rx_pkt_tlv_offset = dp_rx_mon_pkt_tlv_offset_subscribe; mon_ops->rx_enable_mpdu_logging = dp_rx_mon_enable_mpdu_logging; mon_ops->mon_neighbour_peers_detach = NULL; mon_ops->mon_vdev_set_monitor_mode_buf_rings = diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c index 34612818e9..7f4e1c6483 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c @@ -179,22 +179,67 @@ void dp_rx_mon_word_mask_subscribe(uint32_t *msg_word, struct htt_rx_ring_tlv_filter *tlv_filter) { + if (!msg_word || !tlv_filter) + return; + + if (!tlv_filter->enable) + return; + + HTT_RX_RING_SELECTION_CFG_WORD_MASK_COMPACTION_ENABLE_SET(*msg_word, 1); + + /* word 14 */ + msg_word += 3; + *msg_word = 0; + + HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_SET( + *msg_word, + RX_MON_MPDU_START_WMASK); -#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */ - HTT_RX_RING_SELECTION_CFG_RX_MPDU_END_WORD_MASK_SET(*msg_word, - tlv_filter->rx_mpdu_end_wmask); -#endif /* word 15 */ msg_word++; + *msg_word = 0; + HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_SET( + *msg_word, + RX_MON_MSDU_END_WMASK); /* word 16 */ msg_word++; + /* word 17 */ + msg_word++; + *msg_word = 0; + HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_V2_SET( + *msg_word, + RX_MON_MPDU_START_WMASK); + + /* word 18 */ + msg_word++; + *msg_word = 0; + HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_V2_SET( + *msg_word, + RX_MON_MSDU_END_WMASK); + /* word 19 */ + msg_word++; + *msg_word = 0; + HTT_RX_RING_SELECTION_CFG_RX_PPDU_END_USR_STATS_WORD_MASK_V2_SET( + *msg_word, + RX_MON_PPDU_END_USR_STATS_WMASK); +} + +void +dp_rx_mon_pkt_tlv_offset_subscribe(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ + if (!msg_word || !tlv_filter) + return; + + /* word 16 */ *msg_word = 0; if (tlv_filter->rx_pkt_tlv_offset) { HTT_RX_RING_SELECTION_CFG_ENABLE_RX_PKT_TLV_OFFSET_SET(*msg_word, 1); HTT_RX_RING_SELECTION_CFG_RX_PKT_TLV_OFFSET_SET(*msg_word, tlv_filter->rx_pkt_tlv_offset); } + } void @@ -1505,7 +1550,6 @@ static void dp_mon_filter_set_mon_2_0(struct dp_mon_pdev *mon_pdev, filter->tlv_filter.ctrl_mpdu_log = DP_MON_MSDU_LOGGING; filter->tlv_filter.data_mpdu_log = DP_MON_MSDU_LOGGING; - if (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) { filter->tlv_filter.enable_mo = 1; filter->tlv_filter.mo_mgmt_filter = FILTER_MGMT_ALL; @@ -2465,22 +2509,6 @@ dp_rx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, tlv_filter->data_mpdu_log = src_tlv_filter->data_mpdu_log; - /* - * set mpdu start wmask - */ - if (src_tlv_filter->rx_mpdu_start_wmask && - !tlv_filter->rx_mpdu_start_wmask) - tlv_filter->rx_mpdu_start_wmask = - src_tlv_filter->rx_mpdu_start_wmask; - - /* - * set msdu end wmask - */ - if (src_tlv_filter->rx_msdu_end_wmask && - !tlv_filter->rx_msdu_end_wmask) - tlv_filter->rx_msdu_end_wmask = - src_tlv_filter->rx_msdu_end_wmask; - /* * set hdr tlv length */ diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h index 52f827ef66..e9f5e89471 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h @@ -76,6 +76,15 @@ void dp_rx_mon_word_mask_subscribe(uint32_t *msg_word, struct htt_rx_ring_tlv_filter *tlv_filter); +/** + * dp_rx_mon_pkt_tlv_offset_subscribe () Setup rx monitor packet tlv offset + * @msg_word: msg word + * @htt_tlv_filter: rx ring filter configuration + */ +void +dp_rx_mon_pkt_tlv_offset_subscribe(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter); + /** * dp_rx_mon_enable_mpdu_logging() - Setup rx monitor per packet mpdu logging * @msg_word: msg word diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 27b6339fea..1a8a21ae3d 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -6687,6 +6687,7 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc) mon_ops->rx_hdr_length_set = NULL; mon_ops->rx_packet_length_set = NULL; mon_ops->rx_wmask_subscribe = NULL; + mon_ops->rx_pkt_tlv_offset = NULL; mon_ops->rx_enable_mpdu_logging = NULL; mon_ops->rx_enable_fpmo = NULL; mon_ops->mon_neighbour_peers_detach = NULL; diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index bf3326d457..cc81825a64 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -793,6 +793,8 @@ struct dp_mon_ops { struct htt_rx_ring_tlv_filter *tlv_filter); void (*rx_wmask_subscribe)(uint32_t *msg_word, struct htt_rx_ring_tlv_filter *tlv_filter); + void (*rx_pkt_tlv_offset)(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter); void (*rx_enable_mpdu_logging)(uint32_t *msg_word, struct htt_rx_ring_tlv_filter *tlv_filter); void (*rx_enable_fpmo)(uint32_t *msg_word, @@ -3830,6 +3832,7 @@ void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, } #endif +#if defined(CONFIG_MON_WORD_BASED_TLV) static inline void dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word, struct htt_rx_ring_tlv_filter *tlv_filter) @@ -3851,6 +3854,34 @@ dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word, monitor_ops->rx_wmask_subscribe(msg_word, tlv_filter); } +#else +static inline void +dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ +} +#endif + +static inline void +dp_mon_rx_enable_pkt_tlv_offset(struct dp_soc *soc, uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ + struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_ops *monitor_ops; + + if (!mon_soc) { + dp_mon_debug("mon soc is NULL"); + return; + } + + monitor_ops = mon_soc->mon_ops; + if (!monitor_ops || !monitor_ops->rx_pkt_tlv_offset) { + dp_mon_debug("callback not registered"); + return; + } + + monitor_ops->rx_pkt_tlv_offset(msg_word, tlv_filter); +} static inline void dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word, diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 5f0bd9411b..6f4c17041c 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -104,9 +104,14 @@ defined(QCA_SINGLE_WIFI_3_0) PHYRX_RSSI_LEGACY_PREAMBLE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET #endif +#define RX_MON_MPDU_START_WMASK 0x07F0 +#define RX_MON_MSDU_END_WMASK 0x0AE1 +#define RX_MON_PPDU_END_USR_STATS_WMASK 0xB7E + #ifdef CONFIG_MON_WORD_BASED_TLV #ifndef BIG_ENDIAN_HOST struct rx_mpdu_start_mon_data { + uint32_t peer_meta_data : 32; uint32_t rxpcu_mpdu_filter_in_category : 2, sw_frame_group_id : 7, ndp_frame : 1, @@ -136,6 +141,19 @@ struct rx_mpdu_start_mon_data { encrypted : 1, mpdu_retry : 1, mpdu_sequence_number : 12; + uint32_t key_id_octet : 8, + new_peer_entry : 1, + decrypt_needed : 1, + decap_type : 2, + rx_insert_vlan_c_tag_padding : 1, + rx_insert_vlan_s_tag_padding : 1, + strip_vlan_c_tag_decap : 1, + strip_vlan_s_tag_decap : 1, + pre_delim_count : 12, + ampdu_flag : 1, + bar_frame : 1, + raw_mpdu : 1, + reserved_12 : 1; uint32_t mpdu_length : 14, first_mpdu : 1, mcast_bcast : 1, @@ -160,6 +178,13 @@ struct rx_mpdu_start_mon_data { uint32_t mac_addr_ad1_31_0 : 32; uint32_t mac_addr_ad1_47_32 : 16, mac_addr_ad2_15_0 : 16; + uint32_t mac_addr_ad2_47_16 : 32; + uint32_t mac_addr_ad3_31_0 : 32; + uint32_t mac_addr_ad3_47_32 : 16, + mpdu_sequence_control_field : 16; + uint32_t mac_addr_ad4_31_0 : 32; + uint32_t mac_addr_ad4_47_32 : 16, + mpdu_qos_control_field : 16; }; struct rx_msdu_end_mon_data { @@ -167,33 +192,140 @@ struct rx_msdu_end_mon_data { sw_frame_group_id : 7, reserved_0 : 7, phy_ppdu_id : 16; - uint32_t tcp_udp_chksum : 16, - sa_idx_timeout : 1, - da_idx_timeout : 1, - msdu_limit_error : 1, - flow_idx_timeout : 1, - flow_idx_invalid : 1, - wifi_parser_error : 1, - amsdu_parser_error : 1, - sa_is_valid : 1, - da_is_valid : 1, - da_is_mcbc : 1, - l3_header_padding : 2, - first_msdu : 1, - last_msdu : 1, - tcp_udp_chksum_fail : 1, - ip_chksum_fail : 1; - uint32_t msdu_drop : 1, - reo_destination_indication : 5, + uint32_t ip_hdr_chksum : 16, + reported_mpdu_length : 14, + reserved_1a : 2; + uint32_t sa_sw_peer_id : 16, + sa_idx_timeout : 1, + da_idx_timeout : 1, + to_ds : 1, + tid : 4, + sa_is_valid : 1, + da_is_valid : 1, + da_is_mcbc : 1, + l3_header_padding : 2, + first_msdu : 1, + last_msdu : 1, + fr_ds : 1, + ip_chksum_fail_copy : 1; + uint32_t sa_idx : 16, + da_idx_or_sw_peer_id : 16; + uint32_t msdu_drop : 1, + reo_destination_indication : 5, flow_idx : 20, - reserved_12a : 6; + use_ppe : 1, + mesh_sta : 2, + vlan_ctag_stripped : 1, + vlan_stag_stripped : 1, + fragment_flag : 1; uint32_t fse_metadata : 32; uint32_t cce_metadata : 16, - sa_sw_peer_id : 16; + tcp_udp_chksum : 16; + uint32_t aggregation_count : 8, + flow_aggregation_continuation : 1, + fisa_timeout : 1, + tcp_udp_chksum_fail_copy : 1, + msdu_limit_error : 1, + flow_idx_timeout : 1, + flow_idx_invalid : 1, + cce_match : 1, + amsdu_parser_error : 1, + cumulative_ip_length : 16; + uint32_t msdu_length : 14, + stbc : 1, + ipsec_esp : 1, + l3_offset : 7, + ipsec_ah : 1, + l4_offset : 8; + uint32_t msdu_number : 8, + decap_format : 2, + ipv4_proto : 1, + ipv6_proto : 1, + tcp_proto : 1, + udp_proto : 1, + ip_frag : 1, + tcp_only_ack : 1, + da_is_bcast_mcast : 1, + toeplitz_hash_sel : 2, + ip_fixed_header_valid : 1, + ip_extn_header_valid : 1, + tcp_udp_header_valid : 1, + mesh_control_present : 1, + ldpc : 1, + ip4_protocol_ip6_next_header : 8; + uint32_t user_rssi : 8, + pkt_type : 4, + sgi : 2, + rate_mcs : 4, + receive_bandwidth : 3, + reception_type : 3, + mimo_ss_bitmap : 7, + msdu_done_copy : 1; + uint32_t flow_id_toeplitz : 32; +}; + +struct rx_ppdu_end_user_mon_data { + uint32_t sw_peer_id : 16, + mpdu_cnt_fcs_err : 11, + sw2rxdma0_buf_source_used : 1, + fw2rxdma_pmac0_buf_source_used : 1, + sw2rxdma1_buf_source_used : 1, + sw2rxdma_exception_buf_source_used: 1, + fw2rxdma_pmac1_buf_source_used : 1; + uint32_t mpdu_cnt_fcs_ok : 11, + frame_control_info_valid : 1, + qos_control_info_valid : 1, + ht_control_info_valid : 1, + data_sequence_control_info_valid : 1, + ht_control_info_null_valid : 1, + rxdma2fw_pmac1_ring_used : 1, + rxdma2reo_ring_used : 1, + rxdma2fw_pmac0_ring_used : 1, + rxdma2sw_ring_used : 1, + rxdma_release_ring_used : 1, + ht_control_field_pkt_type : 4, + rxdma2reo_remote0_ring_used : 1, + rxdma2reo_remote1_ring_used : 1, + reserved_3b : 5; + uint32_t ast_index : 16, + frame_control_field : 16; + uint32_t first_data_seq_ctrl : 16, + qos_control_field : 16; + uint32_t ht_control_field : 32; + uint32_t fcs_ok_bitmap_31_0 : 32; + uint32_t fcs_ok_bitmap_63_32 : 32; + uint32_t udp_msdu_count : 16, + tcp_msdu_count : 16; + uint32_t other_msdu_count : 16, + tcp_ack_msdu_count : 16; + uint32_t sw_response_reference_ptr : 32; + uint32_t received_qos_data_tid_bitmap : 16, + received_qos_data_tid_eosp_bitmap : 16; + uint32_t qosctrl_15_8_tid0 : 8, + qosctrl_15_8_tid1 : 8, + qosctrl_15_8_tid2 : 8, + qosctrl_15_8_tid3 : 8; + uint32_t qosctrl_15_8_tid12 : 8, + qosctrl_15_8_tid13 : 8, + qosctrl_15_8_tid14 : 8, + qosctrl_15_8_tid15 : 8; + uint32_t mpdu_ok_byte_count : 25, + ampdu_delim_ok_count_6_0 : 7; + uint32_t ampdu_delim_err_count : 25, + ampdu_delim_ok_count_13_7 : 7; + uint32_t mpdu_err_byte_count : 25, + ampdu_delim_ok_count_20_14 : 7; + uint32_t sw_response_reference_ptr_ext : 32; + uint32_t corrupted_due_to_fifo_delay : 1, + frame_control_info_null_valid : 1, + frame_control_field_null : 16, + retried_mpdu_count : 11, + reserved_23a : 3; }; #else struct rx_mpdu_start_mon_data { - uint32_t phy_ppdu_id : 16; + uint32_t peer_meta_data : 32; + uint32_t phy_ppdu_id : 16, reserved_0a : 2, ast_based_lookup_valid : 1, protocol_version_err : 1, @@ -201,10 +333,10 @@ struct rx_mpdu_start_mon_data { phy_err : 1, ndp_frame : 1, sw_frame_group_id : 7, - rxpcu_mpdu_filter_in_category : 2, - uint32_t sw_peer_id : 16; - ast_index : 16, - uint32_t mpdu_sequence_number : 12; + rxpcu_mpdu_filter_in_category : 2; + uint32_t sw_peer_id : 16, + ast_index : 16; + uint32_t mpdu_sequence_number : 12, mpdu_retry : 1, encrypted : 1, to_ds : 1, @@ -221,7 +353,20 @@ struct rx_mpdu_start_mon_data { mac_addr_ad2_valid : 1, mac_addr_ad1_valid : 1, mpdu_duration_valid : 1, - mpdu_frame_control_valid : 1, + mpdu_frame_control_valid : 1; + uint32_t reserved_12 : 1, + raw_mpdu : 1, + bar_frame : 1, + ampdu_flag : 1, + pre_delim_count : 12, + strip_vlan_s_tag_decap : 1, + strip_vlan_c_tag_decap : 1, + rx_insert_vlan_s_tag_padding : 1, + rx_insert_vlan_c_tag_padding : 1, + decap_type : 2, + decrypt_needed : 1, + new_peer_entry : 1, + key_id_octet : 8; uint32_t reserved_13 : 1; amsdu_present : 1, directed : 1, @@ -241,52 +386,174 @@ struct rx_mpdu_start_mon_data { mcast_bcast : 1, first_mpdu : 1, mpdu_length : 14, - uint32_t mpdu_duration_field : 16; - mpdu_frame_control_field : 16, + uint32_t mpdu_duration_field : 16, + mpdu_frame_control_field : 16; uint32_t mac_addr_ad1_31_0 : 32; - uint32_t mac_addr_ad2_15_0 : 16; - mac_addr_ad1_47_32 : 16, + uint32_t mac_addr_ad2_15_0 : 16, + mac_addr_ad1_47_32 : 16; + uint32_t mac_addr_ad2_47_16 : 32; + uint32_t mac_addr_ad3_31_0 : 32; + uint32_t mpdu_sequence_control_field : 16, + mac_addr_ad3_47_32 : 16; + uint32_t mac_addr_ad4_31_0 : 32; + uint32_t mpdu_qos_control_field : 16, + mac_addr_ad4_47_32 : 16; }; struct rx_msdu_end_mon_data { - uint32_t phy_ppdu_id : 16; + uint32_t phy_ppdu_id : 16, reserved_0 : 7, sw_frame_group_id : 7, - rxpcu_mpdu_filter_in_category : 2, - uint32_t ip_chksum_fail : 1; - tcp_udp_chksum_fail : 1, - last_msdu : 1, - first_msdu : 1, - l3_header_padding : 2, - da_is_mcbc : 1, - da_is_valid : 1, - sa_is_valid : 1, - amsdu_parser_error : 1, - wifi_parser_error : 1, - flow_idx_invalid : 1, - flow_idx_timeout : 1, - msdu_limit_error : 1, - da_idx_timeout : 1, - sa_idx_timeout : 1, - tcp_udp_chksum : 16, - uint32_t reserved_12a : 6; + rxpcu_mpdu_filter_in_category : 2; + uint32_t reserved_1a : 2, + reported_mpdu_length : 14, + ip_hdr_chksum : 16; + uint32_t ip_chksum_fail_copy : 1, + fr_ds : 1, + last_msdu : 1, + first_msdu : 1, + l3_header_padding : 2, + da_is_mcbc : 1, + da_is_valid : 1, + sa_is_valid : 1, + tid : 4, + to_ds : 1, + da_idx_timeout : 1, + sa_idx_timeout : 1, + sa_sw_peer_id : 16; + uint32_t da_idx_or_sw_peer_id : 16, + sa_idx : 16; + uint32_t fragment_flag : 1, + vlan_stag_stripped : 1, + vlan_ctag_stripped : 1, + mesh_sta : 2, + use_ppe : 1, flow_idx : 20, - reo_destination_indication : 5, - msdu_drop : 1, + reo_destination_indication : 5, + msdu_drop : 1; uint32_t fse_metadata : 32; - uint32_t sa_sw_peer_id : 16; - cce_metadata : 16, + uint32_t cce_metadata : 16, + tcp_udp_chksum : 16; + uint32_t cumulative_ip_length : 16, + amsdu_parser_error : 1, + cce_match : 1, + flow_idx_invalid : 1, + flow_idx_timeout : 1, + msdu_limit_error : 1, + tcp_udp_chksum_fail_copy : 1, + fisa_timeout : 1, + flow_aggregation_continuation : 1, + aggregation_count : 8; + uint32_t l4_offset : 8, + ipsec_ah : 1, + l3_offset : 7, + ipsec_esp : 1, + stbc : 1, + msdu_length : 14; + uint32_t ip4_protocol_ip6_next_header : 8, + ldpc : 1, + mesh_control_present : 1, + tcp_udp_header_valid : 1, + ip_extn_header_valid : 1, + ip_fixed_header_valid : 1, + toeplitz_hash_sel : 2, + da_is_bcast_mcast : 1, + tcp_only_ack : 1, + ip_frag : 1, + udp_proto : 1, + tcp_proto : 1, + ipv6_proto : 1, + ipv4_proto : 1, + decap_format : 2, + msdu_number : 8; + uint32_t msdu_done_copy : 1, + mimo_ss_bitmap : 7, + reception_type : 3, + receive_bandwidth : 3, + rate_mcs : 4, + sgi : 2, + pkt_type : 4, + user_rssi : 8; + uint32_t flow_id_toeplitz : 32; +}; + +struct rx_ppdu_end_user_mon_data { + uint32_t fw2rxdma_pmac1_buf_source_used : 1, + sw2rxdma_exception_buf_source_used: 1, + sw2rxdma1_buf_source_used : 1, + fw2rxdma_pmac0_buf_source_used : 1, + sw2rxdma0_buf_source_used : 1, + mpdu_cnt_fcs_err : 11, + sw_peer_id : 16; + uint32_t reserved_3b : 5, + rxdma2reo_remote1_ring_used : 1, + rxdma2reo_remote0_ring_used : 1, + ht_control_field_pkt_type : 4, + rxdma_release_ring_used : 1, + rxdma2sw_ring_used : 1, + rxdma2fw_pmac0_ring_used : 1, + rxdma2reo_ring_used : 1, + rxdma2fw_pmac1_ring_used : 1, + ht_control_info_null_valid : 1, + data_sequence_control_info_valid : 1, + ht_control_info_valid : 1, + qos_control_info_valid : 1, + frame_control_info_valid : 1, + mpdu_cnt_fcs_ok : 11; + uint32_t frame_control_field : 16, + ast_index : 16; + uint32_t qos_control_field : 16, + first_data_seq_ctrl : 16; + uint32_t ht_control_field : 32; + uint32_t fcs_ok_bitmap_31_0 : 32; + uint32_t fcs_ok_bitmap_63_32 : 32; + uint32_t tcp_msdu_count : 16, + udp_msdu_count : 16; + uint32_t tcp_ack_msdu_count : 16, + other_msdu_count : 16; + uint32_t sw_response_reference_ptr : 32; + uint32_t received_qos_data_tid_eosp_bitmap : 16, + received_qos_data_tid_bitmap : 16; + uint32_t qosctrl_15_8_tid3 : 8, + qosctrl_15_8_tid2 : 8, + qosctrl_15_8_tid1 : 8, + qosctrl_15_8_tid0 : 8; + uint32_t qosctrl_15_8_tid15 : 8, + qosctrl_15_8_tid14 : 8, + qosctrl_15_8_tid13 : 8, + qosctrl_15_8_tid12 : 8; + uint32_t ampdu_delim_ok_count_6_0 : 7, + mpdu_ok_byte_count : 25; + uint32_t ampdu_delim_ok_count_13_7 : 7, + ampdu_delim_err_count : 25; + uint32_t ampdu_delim_ok_count_20_14 : 7, + mpdu_err_byte_count : 25; + uint32_t sw_response_reference_ptr_ext : 32; + uint32_t reserved_23a : 3, + retried_mpdu_count : 11, + frame_control_field_null : 16, + frame_control_info_null_valid : 1, + corrupted_due_to_fifo_delay : 1; }; #endif +struct rx_mpdu_start_mon_data_t { + struct rx_mpdu_start_mon_data rx_mpdu_info_details; +}; + +struct rx_msdu_end_mon_data_t { + struct rx_msdu_end_mon_data rx_mpdu_info_details; +}; /* TLV struct for word based Tlv */ -typedef struct rx_mpdu_start_mon_data hal_rx_mon_mpdu_start_t; +typedef struct rx_mpdu_start_mon_data_t hal_rx_mon_mpdu_start_t; typedef struct rx_msdu_end_mon_data hal_rx_mon_msdu_end_t; +typedef struct rx_ppdu_end_user_mon_data hal_rx_mon_ppdu_end_user_t; #else typedef struct rx_mpdu_start hal_rx_mon_mpdu_start_t; typedef struct rx_msdu_end hal_rx_mon_msdu_end_t; +typedef struct rx_ppdu_end_user_stats hal_rx_mon_ppdu_end_user_t; #endif /* @@ -479,45 +746,37 @@ hal_be_get_mon_dest_status(hal_soc_handle_t hal_soc, defined(RX_PPDU_END_USER_STATS_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET) static inline void -hal_rx_handle_mu_ul_info(void *rx_tlv, +hal_rx_handle_mu_ul_info(hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user, struct mon_rx_user_status *mon_rx_user_status) { mon_rx_user_status->mu_ul_user_v0_word0 = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - SW_RESPONSE_REFERENCE_PTR); + rx_ppdu_end_user->sw_response_reference_ptr; mon_rx_user_status->mu_ul_user_v0_word1 = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - SW_RESPONSE_REFERENCE_PTR_EXT); + rx_ppdu_end_user->sw_response_reference_ptr_ext; } #else static inline void -hal_rx_handle_mu_ul_info(void *rx_tlv, +hal_rx_handle_mu_ul_info(hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user, struct mon_rx_user_status *mon_rx_user_status) { } #endif static inline void -hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo, +hal_rx_populate_byte_count(hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user, + void *ppduinfo, struct mon_rx_user_status *mon_rx_user_status) { - uint32_t mpdu_ok_byte_count; - uint32_t mpdu_err_byte_count; - - mpdu_ok_byte_count = HAL_RX_GET_64(rx_tlv, - RX_PPDU_END_USER_STATS, - MPDU_OK_BYTE_COUNT); - mpdu_err_byte_count = HAL_RX_GET_64(rx_tlv, - RX_PPDU_END_USER_STATS, - MPDU_ERR_BYTE_COUNT); - - mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count; - mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count; + mon_rx_user_status->mpdu_ok_byte_count = + rx_ppdu_end_user->mpdu_ok_byte_count; + mon_rx_user_status->mpdu_err_byte_count = + rx_ppdu_end_user->mpdu_err_byte_count; } static inline void -hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id, +hal_rx_populate_mu_user_info(hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user, + void *ppduinfo, uint32_t user_id, struct mon_rx_user_status *mon_rx_user_status) { struct mon_rx_info *mon_rx_info; @@ -576,7 +835,8 @@ hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id, sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0])); mon_rx_user_status->retry_mpdu = ppdu_info->rx_status.mpdu_retry_cnt; - hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status); + hal_rx_populate_byte_count(rx_ppdu_end_user, ppdu_info, + mon_rx_user_status); } #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, \ @@ -613,18 +873,15 @@ hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, #ifdef WLAN_TX_PKT_CAPTURE_ENH static inline void -hal_get_qos_control(void *rx_tlv, +hal_get_qos_control(hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user, struct hal_rx_ppdu_info *ppdu_info) { ppdu_info->rx_info.qos_control_info_valid = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - QOS_CONTROL_INFO_VALID); + rx_ppdu_end_user->qos_control_info_valid; if (ppdu_info->rx_info.qos_control_info_valid) ppdu_info->rx_info.qos_control = - HAL_RX_GET_64(rx_tlv, - RX_PPDU_END_USER_STATS, - QOS_CONTROL_FIELD); + rx_ppdu_end_user->qos_control_field; } static inline void @@ -649,7 +906,7 @@ hal_get_mac_addr1(hal_rx_mon_mpdu_start_t *rx_mpdu_start, } #else static inline void -hal_get_qos_control(void *rx_tlv, +hal_get_qos_control(hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user, struct hal_rx_ppdu_info *ppdu_info) { } @@ -1876,11 +2133,10 @@ hal_rx_parse_receive_user_info(struct hal_soc *hal_soc, uint8_t *tlv, #ifdef QCA_MONITOR_2_0_SUPPORT static inline void hal_rx_status_get_mpdu_retry_cnt(struct hal_rx_ppdu_info *ppdu_info, - void *rx_tlv) + hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user) { ppdu_info->rx_status.mpdu_retry_cnt = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - RETRIED_MPDU_COUNT); + rx_ppdu_end_user->retried_mpdu_count; } static inline void @@ -1912,7 +2168,7 @@ hal_rx_update_ppdu_drop_cnt(uint8_t *rx_tlv, #else static inline void hal_rx_status_get_mpdu_retry_cnt(struct hal_rx_ppdu_info *ppdu_info, - void *rx_tlv) + hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user) { ppdu_info->rx_status.mpdu_retry_cnt = 0; } @@ -2066,15 +2322,14 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo, */ case WIFIRX_PPDU_END_USER_STATS_E: { + hal_rx_mon_ppdu_end_user_t *rx_ppdu_end_user = rx_tlv; unsigned long tid = 0; uint16_t seq = 0; ppdu_info->rx_status.ast_index = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - AST_INDEX); + rx_ppdu_end_user->ast_index; - tid = HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - RECEIVED_QOS_DATA_TID_BITMAP); + tid = rx_ppdu_end_user->received_qos_data_tid_bitmap; ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid) * 8); @@ -2082,45 +2337,39 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->rx_status.tid = HAL_TID_INVALID; ppdu_info->rx_status.tcp_msdu_count = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - TCP_MSDU_COUNT) + - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - TCP_ACK_MSDU_COUNT); + rx_ppdu_end_user->tcp_msdu_count + + rx_ppdu_end_user->tcp_ack_msdu_count; + ppdu_info->rx_status.udp_msdu_count = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - UDP_MSDU_COUNT); + rx_ppdu_end_user->udp_msdu_count; + ppdu_info->rx_status.other_msdu_count = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - OTHER_MSDU_COUNT); - hal_rx_status_get_mpdu_retry_cnt(ppdu_info, rx_tlv); + rx_ppdu_end_user->other_msdu_count; + + hal_rx_status_get_mpdu_retry_cnt(ppdu_info, rx_ppdu_end_user); if (ppdu_info->sw_frame_group_id != HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) { ppdu_info->rx_status.frame_control_info_valid = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - FRAME_CONTROL_INFO_VALID); + rx_ppdu_end_user->frame_control_info_valid; if (ppdu_info->rx_status.frame_control_info_valid) ppdu_info->rx_status.frame_control = - HAL_RX_GET_64(rx_tlv, - RX_PPDU_END_USER_STATS, - FRAME_CONTROL_FIELD); + rx_ppdu_end_user->frame_control_field; - hal_get_qos_control(rx_tlv, ppdu_info); + hal_get_qos_control(rx_ppdu_end_user, ppdu_info); } ppdu_info->rx_status.data_sequence_control_info_valid = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - DATA_SEQUENCE_CONTROL_INFO_VALID); + rx_ppdu_end_user->data_sequence_control_info_valid; + + seq = rx_ppdu_end_user->first_data_seq_ctrl; - seq = HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - FIRST_DATA_SEQ_CTRL); if (ppdu_info->rx_status.data_sequence_control_info_valid) ppdu_info->rx_status.first_data_seq_ctrl = seq; ppdu_info->rx_status.preamble_type = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - HT_CONTROL_FIELD_PKT_TYPE); + rx_ppdu_end_user->ht_control_field_pkt_type; ppdu_info->end_user_stats_cnt++; @@ -2140,11 +2389,9 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo, } ppdu_info->com_info.mpdu_cnt_fcs_ok = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - MPDU_CNT_FCS_OK); + rx_ppdu_end_user->mpdu_cnt_fcs_ok; ppdu_info->com_info.mpdu_cnt_fcs_err = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - MPDU_CNT_FCS_ERR); + rx_ppdu_end_user->mpdu_cnt_fcs_err; if ((ppdu_info->com_info.mpdu_cnt_fcs_ok | ppdu_info->com_info.mpdu_cnt_fcs_err) > 1) ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG; @@ -2153,22 +2400,21 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo, (~IEEE80211_AMPDU_FLAG); ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - FCS_OK_BITMAP_31_0); + rx_ppdu_end_user->fcs_ok_bitmap_31_0; ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] = - HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, - FCS_OK_BITMAP_63_32); + rx_ppdu_end_user->fcs_ok_bitmap_63_32; if (user_id < HAL_MAX_UL_MU_USERS) { mon_rx_user_status = &ppdu_info->rx_user_status[user_id]; - hal_rx_handle_mu_ul_info(rx_tlv, mon_rx_user_status); + hal_rx_handle_mu_ul_info(rx_ppdu_end_user, + mon_rx_user_status); ppdu_info->com_info.num_users++; - hal_rx_populate_mu_user_info(rx_tlv, ppdu_info, + hal_rx_populate_mu_user_info(rx_ppdu_end_user, ppdu_info, user_id, mon_rx_user_status); }