diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index aa811ef782..583b9dff2c 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -2039,17 +2039,19 @@ struct cdp_tx_completion_msdu { * @other_msdu_count: Number of MSDUs other than UDP and TCP MSDUs in PPDU * @frame_control: frame control field * @frame_control_info_valid: frame_control valid + * @qos_control: qos control field + * @qos_control_info_valid: qos_control valid * @data_sequence_control_info_valid: data_sequence_control_info valid * @first_data_seq_ctrl: Sequence control field of first data frame * @preamble: preamble * @ht_flag: ht flag * @vht_flag: vht flag * @he_re: he_re (range extension) + * @mac_addr: Peer MAC Address * @mpdu_cnt_fcs_ok: Number of MPDUs in PPDU with fcs ok * @mpdu_cnt_fcs_err: Number of MPDUs in PPDU with fcs err * @mpdu_fcs_ok_bitmap - MPDU with fcs ok bitmap * @retried - number of retries - * @mac_addr: Peer MAC Address */ struct cdp_rx_stats_ppdu_user { uint16_t peer_id; @@ -2070,19 +2072,21 @@ struct cdp_rx_stats_ppdu_user { uint16_t other_msdu_count; uint16_t frame_control; uint8_t frame_control_info_valid; + uint16_t qos_control; + uint8_t qos_control_info_valid; uint8_t data_sequence_control_info_valid; uint16_t first_data_seq_ctrl; uint32_t preamble_type; uint16_t ht_flags; uint16_t vht_flags; uint16_t he_flags; + uint8_t mac_addr[QDF_MAC_ADDR_SIZE]; uint32_t mpdu_cnt_fcs_ok; uint32_t mpdu_cnt_fcs_err; uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS]; uint32_t mpdu_ok_byte_count; uint32_t mpdu_err_byte_count; uint32_t retries; - uint8_t mac_addr[QDF_MAC_ADDR_SIZE]; }; /** diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 366f095bee..69ba88279a 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -360,6 +360,7 @@ enum WDI_EVENT { WDI_EVENT_FLUSH_RATE_STATS_REQ, WDI_EVENT_RX_MPDU, WDI_EVENT_HMWDS_AST_ADD_STATUS, + WDI_EVENT_PEER_QOS_STATS, /* End of new event items */ WDI_EVENT_LAST }; @@ -1317,6 +1318,23 @@ struct cdp_interface_peer_stats { uint32_t ack_rssi; }; +/* struct cdp_interface_peer_qos_stats - interface structure for peer qos stats + * @peer_mac: peer mac address + * @frame_control: frame control field + * @qos_control: qos control field + * @frame_control_info_valid: frame_control valid + * @qos_control_info_valid: qos_control valid + * @vdev_id : vdev_id for the peer + */ +struct cdp_interface_peer_qos_stats { + uint8_t peer_mac[QDF_MAC_ADDR_SIZE]; + uint16_t frame_control; + uint16_t qos_control; + uint8_t frame_control_info_valid; + uint8_t qos_control_info_valid; + uint8_t vdev_id; +}; + /* Tx completions per interrupt */ struct cdp_hist_tx_comp { uint32_t pkts_1; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 9807ad435f..38867a86b6 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1646,6 +1646,8 @@ dp_hif_update_pipe_callback(struct dp_soc *dp_soc, QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer); +QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, + struct cdp_rx_stats_ppdu_user *ppdu_user); #else static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id, wdi_event_subscribe *event_cb_sub_handle, @@ -1708,6 +1710,11 @@ static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, return QDF_STATUS_SUCCESS; } +QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, + struct cdp_rx_stats_ppdu_user *ppdu_user) +{ + return QDF_STATUS_SUCCESS; +} #endif /* CONFIG_WIN */ #ifdef VDEV_PEER_PROTOCOL_COUNT diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 44f12191e1..d1feea3728 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -200,6 +200,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, uint32_t ast_index; int i; struct mon_rx_user_status *rx_user_status; + struct mon_rx_user_info *rx_user_info; struct cdp_rx_stats_ppdu_user *rx_stats_peruser; int ru_size; bool is_data = false; @@ -211,6 +212,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, return; rx_user_status = &ppdu_info->rx_user_status[i]; + rx_user_info = &ppdu_info->rx_user_info[i]; rx_stats_peruser = &cdp_rx_ppdu->user[i]; ast_index = rx_user_status->ast_index; @@ -240,6 +242,10 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, rx_stats_peruser->frame_control = rx_user_status->frame_control; + rx_stats_peruser->qos_control_info_valid = + rx_user_info->qos_control_info_valid; + rx_stats_peruser->qos_control = + rx_user_info->qos_control; rx_stats_peruser->tcp_msdu_count = rx_user_status->tcp_msdu_count; rx_stats_peruser->udp_msdu_count = @@ -696,6 +702,7 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, dp_peer_stats_notify(pdev, peer); DP_STATS_UPD(peer, rx.last_rssi, ppdu->rssi); + dp_peer_qos_stats_notify(pdev, ppdu_user); if (peer == pdev->invalid_peer) continue; diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index f18723a684..18472349fa 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -4394,6 +4394,33 @@ QDF_STATUS dp_peer_stats_notify(struct dp_pdev *dp_pdev, struct dp_peer *peer) return QDF_STATUS_SUCCESS; } + +QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, + struct cdp_rx_stats_ppdu_user *ppdu_user) +{ + struct cdp_interface_peer_qos_stats qos_stats_intf; + + if (ppdu_user->peer_id == HTT_INVALID_PEER) { + qdf_err("Invalid peer id"); + return QDF_STATUS_E_FAILURE; + } + qdf_mem_zero(&qos_stats_intf, sizeof(qos_stats_intf)); + + qdf_mem_copy(qos_stats_intf.peer_mac, ppdu_user->mac_addr, + QDF_MAC_ADDR_SIZE); + qos_stats_intf.frame_control = ppdu_user->frame_control; + qos_stats_intf.frame_control_info_valid = + ppdu_user->frame_control_info_valid; + qos_stats_intf.qos_control = ppdu_user->qos_control; + qos_stats_intf.qos_control_info_valid = + ppdu_user->qos_control_info_valid; + qos_stats_intf.vdev_id = ppdu_user->vdev_id; + dp_wdi_event_handler(WDI_EVENT_PEER_QOS_STATS, dp_pdev->soc, + (void *)&qos_stats_intf, 0, + WDI_NO_VAL, dp_pdev->pdev_id); + + return QDF_STATUS_SUCCESS; +} #endif #ifdef QCA_ENH_V3_STATS_SUPPORT diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index 689d5ef69a..8b5acd4461 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -270,12 +270,20 @@ hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo, #endif static inline void -hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, +hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id, struct mon_rx_user_status *mon_rx_user_status) { + struct mon_rx_info *mon_rx_info; + struct mon_rx_user_info *mon_rx_user_info; struct hal_rx_ppdu_info *ppdu_info = (struct hal_rx_ppdu_info *)ppduinfo; + mon_rx_info = &ppdu_info->rx_info; + mon_rx_user_info = &ppdu_info->rx_user_info[user_id]; + mon_rx_user_info->qos_control_info_valid = + mon_rx_info->qos_control_info_valid; + mon_rx_user_info->qos_control = mon_rx_info->qos_control; + mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index; mon_rx_user_status->tid = ppdu_info->rx_status.tid; mon_rx_user_status->tcp_msdu_count = @@ -310,30 +318,6 @@ hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status); } -#ifdef WLAN_TX_PKT_CAPTURE_ENH -static inline void -hal_rx_populate_tx_capture_user_info(void *ppduinfo, - uint32_t user_id) -{ - struct hal_rx_ppdu_info *ppdu_info; - struct mon_rx_info *mon_rx_info; - struct mon_rx_user_info *mon_rx_user_info; - - ppdu_info = (struct hal_rx_ppdu_info *)ppduinfo; - mon_rx_info = &ppdu_info->rx_info; - mon_rx_user_info = &ppdu_info->rx_user_info[user_id]; - mon_rx_user_info->qos_control_info_valid = - mon_rx_info->qos_control_info_valid; - mon_rx_user_info->qos_control = mon_rx_info->qos_control; -} -#else -static inline void -hal_rx_populate_tx_capture_user_info(void *ppduinfo, - uint32_t user_id) -{ -} -#endif - #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \ ppdu_info, rssi_info_tlv) \ { \ @@ -740,11 +724,9 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->com_info.num_users++; hal_rx_populate_mu_user_info(rx_tlv, ppdu_info, + user_id, mon_rx_user_status); - hal_rx_populate_tx_capture_user_info(ppdu_info, - user_id); - } break; }