summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c23
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.h1
-rw-r--r--CORE/SERVICES/WMA/wma.c44
-rw-r--r--CORE/SERVICES/WMA/wma.h5
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