diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 1b5536b81857..17e0da62e401 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2374,6 +2374,8 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, cache_stainfo->rx_rate = disassoc_comp->rx_rate; cache_stainfo->rx_mc_bc_cnt = disassoc_comp->rx_mc_bc_cnt; + cache_stainfo->rx_retry_cnt = + disassoc_comp->rx_retry_cnt; cache_stainfo->reason_code = disassoc_comp->reason_code; cache_stainfo->disassoc_ts = qdf_system_ticks(); hdd_debug("Cache_stainfo rssi %d txrate %d rxrate %d reason_code %d", diff --git a/core/mac/inc/ani_global.h b/core/mac/inc/ani_global.h index 98bfa8d39e80..f9b5a7b00e07 100644 --- a/core/mac/inc/ani_global.h +++ b/core/mac/inc/ani_global.h @@ -774,6 +774,7 @@ struct mac_context { uint32_t peer_rssi; uint32_t peer_txrate; uint32_t peer_rxrate; + uint32_t rx_retry_cnt; uint32_t rx_mc_bc_cnt; /* 11k Offload Support */ bool is_11k_offload_supported; diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index 11c342128358..676ac49a4378 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -298,6 +298,7 @@ typedef struct sap_StationDisassocCompleteEvent_s { int tx_rate; int rx_rate; uint32_t rx_mc_bc_cnt; + uint32_t rx_retry_cnt; } tSap_StationDisassocCompleteEvent; typedef struct sap_StationSetKeyCompleteEvent_s { diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index af8d2ebd2983..191fc10be90f 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -1622,6 +1622,7 @@ QDF_STATUS sap_signal_hdd_event(struct sap_context *sap_ctx, disassoc_comp->rx_rate = csr_roaminfo->rx_rate; disassoc_comp->tx_rate = csr_roaminfo->tx_rate; disassoc_comp->rx_mc_bc_cnt = csr_roaminfo->rx_mc_bc_cnt; + disassoc_comp->rx_retry_cnt = csr_roaminfo->rx_retry_cnt; disassoc_comp->reason_code = csr_roaminfo->disassoc_reason; break; diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index e10d92de7687..9d69e1c16fb2 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1048,6 +1048,7 @@ struct csr_roam_info { int rx_rate; tSirMacCapabilityInfo capability_info; uint32_t rx_mc_bc_cnt; + uint32_t rx_retry_cnt; #ifdef WLAN_FEATURE_SAE struct sir_sae_info *sae_info; #endif diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 103c3b26e7ec..c039bfed65a4 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -5953,6 +5953,8 @@ static void csr_get_peer_rssi(struct mac_context *mac, uint32_t session_id, QDF_MAC_ADDR_ARRAY(peer_mac.bytes)); if (QDF_IS_STATUS_ERROR(status)) sme_err("stats req failed: %d", status); + + wma_get_rx_retry_cnt(mac, session_id, info.peer_mac_addr); wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); } } @@ -6807,6 +6809,7 @@ static void csr_roam_process_results_default(struct mac_context *mac_ctx, roam_info->tx_rate = mac_ctx->peer_txrate; roam_info->rx_rate = mac_ctx->peer_rxrate; roam_info->rx_mc_bc_cnt = mac_ctx->rx_mc_bc_cnt; + roam_info->rx_retry_cnt = mac_ctx->rx_retry_cnt; csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINED, session_id); @@ -10107,6 +10110,7 @@ csr_roam_send_disconnect_done_indication(struct mac_context *mac_ctx, roam_info->rx_rate = mac_ctx->peer_rxrate; roam_info->disassoc_reason = discon_ind->reason_code; roam_info->rx_mc_bc_cnt = mac_ctx->rx_mc_bc_cnt; + roam_info->rx_retry_cnt = mac_ctx->rx_retry_cnt; vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, vdev_id, WLAN_LEGACY_SME_ID); diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 57a01668d711..67b3dff3ad0c 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -615,6 +615,17 @@ QDF_STATUS u_mac_post_ctrl_msg(void *pSirGlobal, tSirMbMsg *pMb); QDF_STATUS wma_set_idle_ps_config(void *wma_ptr, uint32_t idle_ps); QDF_STATUS wma_get_snr(tAniGetSnrReq *psnr_req); +/** + * wma_get_rx_retry_cnt() - API to get rx retry count from data path + * @mac: pointer to mac context + * @vdev_id: vdev id + * @mac_addr: mac address of the remote station + * + * Return: none + */ +void wma_get_rx_retry_cnt(struct mac_context *mac, uint8_t vdev_id, + uint8_t *mac_addr); + /** * wma_set_wlm_latency_level() - set latency level to FW * @wma_ptr: wma handle diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index ee3128074ddf..4336ec3ac87a 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -69,6 +69,7 @@ #endif #include "wlan_scan_api.h" #include +#include "cdp_txrx_host_stats.h" /** * WMA_SET_VDEV_IE_SOURCE_HOST - Flag to identify the source of VDEV SET IE @@ -237,6 +238,34 @@ QDF_STATUS wma_get_snr(tAniGetSnrReq *psnr_req) return QDF_STATUS_SUCCESS; } +void wma_get_rx_retry_cnt(struct mac_context *mac, uint8_t vdev_id, + uint8_t *mac_addr) +{ + struct cdp_peer_stats *peer_stats; + QDF_STATUS status; + + peer_stats = qdf_mem_malloc(sizeof(*peer_stats)); + if (!peer_stats) { + wma_err("Failed to allocate memory for peer stats"); + return; + } + + status = cdp_host_get_peer_stats(cds_get_context(QDF_MODULE_ID_SOC), + vdev_id, mac_addr, peer_stats); + + if (QDF_IS_STATUS_ERROR(status)) { + wma_err("Failed to get peer stats"); + goto exit; + } + + mac->rx_retry_cnt = peer_stats->rx.rx_retries; + wma_debug("Rx retry count %d, Peer" QDF_MAC_ADDR_STR, mac->rx_retry_cnt, + QDF_MAC_ADDR_ARRAY(mac_addr)); + +exit: + qdf_mem_free(peer_stats); +} + /** * wma_process_link_status_req() - process link status request from UMAC * @wma: wma handle