diff options
| -rw-r--r-- | CORE/CLD_TXRX/TLSHIM/tl_shim.c | 23 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TLSHIM/tl_shim.h | 1 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 44 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 5 |
4 files changed, 59 insertions, 14 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index 1c41e725f9a1..a337e39df84e 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -1365,6 +1365,9 @@ VOS_STATUS WLANTL_RegisterMgmtFrmClient(void *vos_ctx, VOS_STATUS WLANTL_GetRssi(void *vos_ctx, u_int8_t sta_id, v_S7_t *rssi, void *pGetRssiReq) { tp_wma_handle wma_handle; + struct txrx_tl_shim_ctx *tl_shim; + struct tlshim_sta_info *sta_info; + v_S7_t first_rssi; ENTER(); @@ -1374,12 +1377,26 @@ VOS_STATUS WLANTL_GetRssi(void *vos_ctx, u_int8_t sta_id, v_S7_t *rssi, void *pG return VOS_STATUS_E_FAILURE; } + tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx); + if (!tl_shim) { + TLSHIM_LOGE("tl_shim is NULL"); + return VOS_STATUS_E_FAULT; + } + + if (sta_id >= WLAN_MAX_STA_COUNT) { + TLSHIM_LOGE("Invalid sta id :%d", sta_id); + return VOS_STATUS_E_INVAL; + } + + sta_info = &tl_shim->sta_info[sta_id]; + first_rssi = sta_info->first_rssi; + if(VOS_STATUS_SUCCESS != - wma_send_snr_request(wma_handle, pGetRssiReq)) - { + wma_send_snr_request(wma_handle, pGetRssiReq, first_rssi)) { TLSHIM_LOGE("Failed to Trigger wma stats request"); return VOS_STATUS_E_FAILURE; } + /* dont send success, otherwise call back * will released with out values */ return VOS_STATUS_E_BUSY; @@ -1493,6 +1510,7 @@ VOS_STATUS WLANTL_ClearSTAClient(void *vos_ctx, u_int8_t sta_id) adf_os_spin_lock_bh(&tl_shim->sta_info[sta_id].stainfo_lock); tl_shim->sta_info[sta_id].registered = 0; tl_shim->sta_info[sta_id].data_rx = NULL; + tl_shim->sta_info[sta_id].first_rssi = 0; adf_os_spin_unlock_bh(&tl_shim->sta_info[sta_id].stainfo_lock); return VOS_STATUS_SUCCESS; @@ -1536,6 +1554,7 @@ VOS_STATUS WLANTL_RegisterSTAClient(void *vos_ctx, adf_os_spin_lock_bh(&sta_info->stainfo_lock); sta_info->data_rx = rxcb; sta_info->registered = true; + sta_info->first_rssi = rssi; adf_os_spin_unlock_bh(&sta_info->stainfo_lock); param.qos_capable = sta_desc->ucQosEnabled; diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/CORE/CLD_TXRX/TLSHIM/tl_shim.h index 0530a8f61506..292b6f8875fd 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.h +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.h @@ -60,6 +60,7 @@ struct tlshim_sta_info { v_U8_t sessionId; void *adpaterCtxt; #endif /* QCA_LL_TX_FLOW_CT */ + v_S7_t first_rssi; }; struct txrx_tl_shim_ctx { diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 934f97ecd451..af3f6735fcc6 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -1062,21 +1062,40 @@ static void wma_update_vdev_stats(tp_wma_handle wma, if (pGetRssiReq && pGetRssiReq->sessionId == vdev_stats->vdev_id) { - if((vdev_stats->vdev_snr.dat_snr > 0) && - (vdev_stats->vdev_snr.bcn_snr > 0)) - rssi = (vdev_stats->vdev_snr.dat_snr + vdev_stats->vdev_snr.bcn_snr)/2; - else - rssi = vdev_stats->vdev_snr.bcn_snr; + if ((vdev_stats->vdev_snr.bcn_snr == WMA_TGT_INVALID_SNR) && + (vdev_stats->vdev_snr.dat_snr == WMA_TGT_INVALID_SNR)) { + /* + * Firmware sends invalid snr till it sees + * Beacon/Data after connection since after + * vdev up fw resets the snr to invalid. + * In this duartion Host will return the last know + * rssi during connection. + */ + rssi = wma->first_rssi; + } else { + if (((vdev_stats->vdev_snr.dat_snr > 0) && + (vdev_stats->vdev_snr.dat_snr != WMA_TGT_INVALID_SNR)) && + ((vdev_stats->vdev_snr.bcn_snr > 0) && + (vdev_stats->vdev_snr.bcn_snr != WMA_TGT_INVALID_SNR))) { + rssi = (vdev_stats->vdev_snr.dat_snr + + vdev_stats->vdev_snr.bcn_snr)/2; + } else if (vdev_stats->vdev_snr.bcn_snr != WMA_TGT_INVALID_SNR) { + rssi = vdev_stats->vdev_snr.bcn_snr; + } else if (vdev_stats->vdev_snr.dat_snr != WMA_TGT_INVALID_SNR) { + rssi = vdev_stats->vdev_snr.dat_snr; + } + + /* + * Get the absolute rssi value from the current rssi value + * the sinr value is hardcoded into 0 in the core stack + */ + rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM; + } - /* Get the absolute rssi value from the current rssi value - * the sinr value is hardcoded into 0 in the core stack - */ WMA_LOGD("vdev id %d beancon snr %d data snr %d", vdev_stats->vdev_id, vdev_stats->vdev_snr.bcn_snr, vdev_stats->vdev_snr.dat_snr); - - rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM; WMA_LOGD("Average Rssi = %d, vdev id= %d", rssi, pGetRssiReq->sessionId); @@ -4118,7 +4137,8 @@ error: } -VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq) +VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq, + v_S7_t first_rssi) { wmi_buf_t buf; wmi_request_stats_cmd_fixed_param *cmd; @@ -4129,6 +4149,8 @@ VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq) if(NULL != wma_handle->pGetRssiReq) return VOS_STATUS_SUCCESS; + wma_handle->first_rssi = first_rssi; + /* create a copy of csrRssiCallback to send rssi value * after wmi event */ diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index e20dac5c15da..0a1bc56861be 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -570,6 +570,7 @@ typedef struct { u_int8_t powersave_mode; v_BOOL_t ptrn_match_enable_all_vdev; void* pGetRssiReq; + v_S7_t first_rssi; t_thermal_mgmt thermal_mgmt_info; u_int32_t roam_offload_vdev_id; v_BOOL_t roam_offload_enabled; @@ -1240,7 +1241,8 @@ VOS_STATUS wma_trigger_uapsd_params(tp_wma_handle wma_handle, u_int32_t vdev_id, tp_wma_trigger_uapsd_params trigger_uapsd_params); /* added to get average snr for both data and beacon */ -VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq); +VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq, + v_S7_t first_rssi); #ifdef FEATURE_WLAN_SCAN_PNO @@ -1496,4 +1498,5 @@ enum uapsd_up { UAPSD_UP_MAX }; +#define WMA_TGT_INVALID_SNR (-1) #endif |
