diff options
| author | Ganesh Babu Kumaravel <kganesh@qti.qualcomm.com> | 2014-03-19 16:16:52 +0530 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-03-20 10:05:37 -0700 |
| commit | 8f82e89ded70bbe4ee617149cf350f9a3cb1155d (patch) | |
| tree | ae556afffbd50520611d834634c3721e97a36a79 | |
| parent | b5a5cc8576dba22ecddf69af3eb9791f7f0e82cc (diff) | |
qcacld: fix for low rssi during connection
Firmware resets the snr to 0 after recieving vdev up command
i.e after connection. Firmware returns invalid snr till it sees
beacon or data from the reference AP.
This results in Host passing low rssi just after connection to
userspace. So consider the last known rssi if firmware returns
invalid snr.
CRs-Fixed: 635058
Change-Id: Ie182b97d1c758919f0154bb60ed2a00a8c8d528f
| -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 |
