Ver código fonte

qcacld-3.0: Add host support for db2dbm RSSI changes

Add host support for db2dbm RSSI changes. Firmware
indicates this capability when underlying hardware
has RSSI reporting feature. Based on this capability
host will know if firmware sends SNR or RSSI. If no
capablity is present then host will convert SNR to
rssi using a fixed offset of -96. If capability is
present host will directly use the rssi as it is.

Change-Id: I9058f16c6280d466feb96cf88a8a0d8cd7b02032
CRs-Fixed: 2364023
Yeshwanth Sriram Guntuka 6 anos atrás
pai
commit
14ab04c72f

+ 1 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -14774,7 +14774,7 @@ wlan_hdd_inform_bss_frame(struct hdd_adapter *adapter,
 
 	/* Set all per chain rssi as invalid */
 	for (i = 0; i < WLAN_MGMT_TXRX_HOST_MAX_ANTENNA; i++)
-		bss_data.per_chain_snr[i] = WLAN_INVALID_PER_CHAIN_RSSI;
+		bss_data.per_chain_rssi[i] = WLAN_INVALID_PER_CHAIN_RSSI;
 
 	hdd_debug("BSSID: " MAC_ADDRESS_STR " Channel:%d RSSI:%d TSF %u",
 	       MAC_ADDR_ARRAY(bss_data.mgmt->bssid), bss_data.chan->center_freq,

+ 1 - 1
core/sme/inc/csr_api.h

@@ -1293,7 +1293,7 @@ typedef struct sSirSmeAssocIndToUpperLayerCnf {
 
 typedef struct tagCsrSummaryStatsInfo {
 	uint32_t snr;
-	uint32_t rssi;
+	int8_t rssi;
 	uint32_t retry_cnt[4];
 	uint32_t multiple_retry_cnt[4];
 	uint32_t tx_frm_cnt[4];

+ 3 - 0
core/wma/inc/wma.h

@@ -159,6 +159,8 @@
 
 #define WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME    (4)
 #define WMA_NOISE_FLOOR_DBM_DEFAULT          (-96)
+#define WMA_RSSI_MIN_VALUE                   (-128)
+#define WMA_RSSI_MAX_VALUE                   (127)
 #define WMA_ROAM_RSSI_DIFF_DEFAULT           (5)
 #define WMA_ROAM_DWELL_TIME_ACTIVE_DEFAULT   (100)
 #define WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT  (110)
@@ -229,6 +231,7 @@
 #define WMA_VDEV_SET_KEY_WAKELOCK_TIMEOUT	WAKELOCK_DURATION_RECOMMENDED
 
 #define WMA_TGT_INVALID_SNR (0)
+#define WMA_TGT_IS_VALID_RSSI(x)  ((x) != 0xFF)
 
 #define WMA_TGT_IS_VALID_SNR(x)  ((x) >= 0 && (x) < WMA_TGT_MAX_SNR)
 #define WMA_TGT_IS_INVALID_SNR(x) (!WMA_TGT_IS_VALID_SNR(x))

+ 2 - 0
core/wma/inc/wma_internal.h

@@ -54,6 +54,8 @@
  */
 #define WMA_TGT_NOISE_FLOOR_DBM (-96)
 #define WMA_TGT_MAX_SNR         (WMA_TGT_NOISE_FLOOR_DBM * (-1))
+#define WMA_INVALID_PER_CHAIN_SNR  (0x80)
+#define WMA_INVALID_PER_CHAIN_RSSI (0xFF)
 
 /*
  * Make sure that link monitor and keep alive

+ 13 - 1
core/wma/src/wma_data.c

@@ -2077,6 +2077,12 @@ int wma_ibss_peer_info_event_handler(void *handle, uint8_t *data,
 	WMI_PEER_INFO_EVENTID_param_tlvs *param_tlvs;
 	wmi_peer_info_event_fixed_param *fix_param;
 	uint8_t peer_mac[IEEE80211_ADDR_LEN];
+	tp_wma_handle wma = (tp_wma_handle)handle;
+
+	if (!wma) {
+		WMA_LOGE("Invalid wma");
+		return 0;
+	}
 
 	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 	if (NULL == pdev) {
@@ -2118,7 +2124,13 @@ int wma_ibss_peer_info_event_handler(void *handle, uint8_t *data,
 		qdf_mem_copy(pSmeRsp->mac_addr, peer_mac,
 			sizeof(pSmeRsp->mac_addr));
 		pSmeRsp->mcsIndex = 0;
-		pSmeRsp->rssi = peer_info->rssi + WMA_TGT_NOISE_FLOOR_DBM;
+		if (wmi_service_enabled(wma->wmi_handle,
+					wmi_service_hw_db2dbm_support))
+			pSmeRsp->rssi = peer_info->rssi;
+		else
+			pSmeRsp->rssi = peer_info->rssi +
+						WMA_TGT_NOISE_FLOOR_DBM;
+
 		pSmeRsp->txRate = peer_info->data_rate;
 		pSmeRsp->txRateFlags = 0;
 

+ 13 - 3
core/wma/src/wma_features.c

@@ -5548,11 +5548,12 @@ int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf,
 	struct chain_rssi_result chain_rssi_result;
 	u_int32_t i;
 	u_int8_t macaddr[IEEE80211_ADDR_LEN];
+	tp_wma_handle wma = (tp_wma_handle)handle;
 
 	struct mac_context *pmac = (struct mac_context *)cds_get_context(
 					QDF_MODULE_ID_PE);
-	if (!pmac) {
-		WMA_LOGE(FL("Invalid pmac"));
+	if (!pmac || !wma) {
+		WMA_LOGE(FL("Invalid pmac or wma"));
 		return -EINVAL;
 	}
 
@@ -5588,7 +5589,16 @@ int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf,
 	for (i = 0; i < event->num_chains_valid; i++) {
 		WMA_LOGD(FL("chain_rssi: %d, ant_id: %d"),
 			 event->chain_rssi[i], event->ant_id[i]);
-		chain_rssi_result.chain_rssi[i] += WMA_TGT_NOISE_FLOOR_DBM;
+		if (!wmi_service_enabled(wma->wmi_handle,
+					 wmi_service_hw_db2dbm_support)) {
+			if (chain_rssi_result.chain_rssi[i] !=
+			    WMA_INVALID_PER_CHAIN_SNR)
+				chain_rssi_result.chain_rssi[i] +=
+							WMA_TGT_NOISE_FLOOR_DBM;
+			else
+				chain_rssi_result.chain_rssi[i] =
+						WMA_INVALID_PER_CHAIN_RSSI;
+		}
 	}
 
 	qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id,

+ 11 - 5
core/wma/src/wma_mgmt.c

@@ -477,13 +477,17 @@ int wma_peer_sta_kickout_event_handler(void *handle, uint8_t *event,
 	qdf_mem_copy(del_sta_ctx->bssId, wma->interfaces[vdev_id].addr,
 		     IEEE80211_ADDR_LEN);
 	del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
-	del_sta_ctx->rssi = kickout_event->rssi + WMA_TGT_NOISE_FLOOR_DBM;
+	if (wmi_service_enabled(wma->wmi_handle,
+				wmi_service_hw_db2dbm_support))
+		del_sta_ctx->rssi = kickout_event->rssi;
+	else
+		del_sta_ctx->rssi = kickout_event->rssi +
+					WMA_TGT_NOISE_FLOOR_DBM;
 	wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_KEEP_ALIVE,
 							vdev_id, macaddr);
 	wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, (void *)del_sta_ctx,
 		     0);
-	wma_lost_link_info_handler(wma, vdev_id, kickout_event->rssi +
-						 WMA_TGT_NOISE_FLOOR_DBM);
+	wma_lost_link_info_handler(wma, vdev_id, del_sta_ctx->rssi);
 exit_handler:
 	WMA_LOGD("%s: Exit", __func__);
 	return 0;
@@ -3109,8 +3113,10 @@ void wma_beacon_miss_handler(tp_wma_handle wma, uint32_t vdev_id, int32_t rssi)
 	beacon_miss_ind->bssIdx = vdev_id;
 
 	wma_send_msg(wma, WMA_MISSED_BEACON_IND, (void *)beacon_miss_ind, 0);
-	wma_lost_link_info_handler(wma, vdev_id, rssi +
-						 WMA_TGT_NOISE_FLOOR_DBM);
+	if (!wmi_service_enabled(wma->wmi_handle,
+				 wmi_service_hw_db2dbm_support))
+		rssi += WMA_TGT_NOISE_FLOOR_DBM;
+	wma_lost_link_info_handler(wma, vdev_id, rssi);
 }
 
 /**

+ 100 - 35
core/wma/src/wma_scan_roam.c

@@ -220,9 +220,14 @@ QDF_STATUS wma_roam_scan_mawc_params(tp_wma_handle wma_handle,
 		roam_req->mawc_roam_params.mawc_roam_enabled;
 	params->traffic_load_threshold =
 		roam_req->mawc_roam_params.mawc_roam_traffic_threshold;
-	params->best_ap_rssi_threshold =
-		roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold -
-		WMA_NOISE_FLOOR_DBM_DEFAULT;
+	if (wmi_service_enabled(wma_handle->wmi_handle,
+				wmi_service_hw_db2dbm_support))
+		params->best_ap_rssi_threshold =
+			roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold;
+	else
+		params->best_ap_rssi_threshold =
+			roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold -
+			WMA_NOISE_FLOOR_DBM_DEFAULT;
 	params->rssi_stationary_high_adjust =
 		roam_req->mawc_roam_params.mawc_roam_rssi_high_adjust;
 	params->rssi_stationary_low_adjust =
@@ -435,10 +440,19 @@ QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 	uint32_t hirssi_scan_max_count;
 	uint32_t hirssi_scan_delta;
 	int32_t hirssi_upper_bound;
+	bool db2dbm_enabled;
 
 	/* Send rssi threshold */
 	roam_params = &roam_req->roam_params;
-	rssi_thresh = roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT;
+	db2dbm_enabled = wmi_service_enabled(wma_handle->wmi_handle,
+					     wmi_service_hw_db2dbm_support);
+	if (db2dbm_enabled) {
+		rssi_thresh = roam_req->LookupThreshold;
+	} else {
+		rssi_thresh = roam_req->LookupThreshold -
+					WMA_NOISE_FLOOR_DBM_DEFAULT;
+		rssi_thresh &= 0x000000ff;
+	}
 	rssi_thresh_diff = roam_req->OpportunisticScanThresholdDiff;
 	hirssi_scan_max_count = roam_req->hi_rssi_scan_max_count;
 	hirssi_scan_delta = roam_req->hi_rssi_scan_rssi_delta;
@@ -447,7 +461,7 @@ QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 
 	/* fill in threshold values */
 	params.session_id = roam_req->sessionId;
-	params.rssi_thresh = rssi_thresh & 0x000000ff;
+	params.rssi_thresh = rssi_thresh;
 	params.rssi_thresh_diff = rssi_thresh_diff & 0x000000ff;
 	params.hi_rssi_scan_max_count = hirssi_scan_max_count;
 	params.hi_rssi_scan_rssi_delta = hirssi_scan_delta;
@@ -459,8 +473,14 @@ QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 	params.traffic_threshold =
 			roam_params->traffic_threshold;
 	params.initial_dense_status = roam_params->initial_dense_status;
-	params.bg_scan_bad_rssi_thresh = roam_params->bg_scan_bad_rssi_thresh -
-		WMA_NOISE_FLOOR_DBM_DEFAULT;
+	if (db2dbm_enabled)
+		params.bg_scan_bad_rssi_thresh =
+					   roam_params->bg_scan_bad_rssi_thresh;
+	else
+		params.bg_scan_bad_rssi_thresh =
+					  roam_params->bg_scan_bad_rssi_thresh -
+					  WMA_NOISE_FLOOR_DBM_DEFAULT;
+
 	params.bg_scan_client_bitmap = roam_params->bg_scan_client_bitmap;
 	params.roam_bad_rssi_thresh_offset_2g =
 				roam_params->roam_bad_rssi_thresh_offset_2g;
@@ -474,18 +494,37 @@ QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 	 * Penalty/Boost threshold beyond the noise floor. If that is the case,
 	 * then suppress the penalty/boost threshold to the noise floor.
 	 */
-	if (roam_params->raise_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT)
-		params.penalty_threshold_5g = 0;
-	else
-		params.boost_threshold_5g =
-			(roam_params->raise_rssi_thresh_5g -
-			 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
-	if (roam_params->drop_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT)
-		params.penalty_threshold_5g = 0;
-	else
-		params.penalty_threshold_5g =
-			(roam_params->drop_rssi_thresh_5g -
-			 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
+	if (roam_params->raise_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT) {
+		if (db2dbm_enabled) {
+			params.penalty_threshold_5g = WMA_RSSI_MIN_VALUE;
+			params.boost_threshold_5g = WMA_RSSI_MAX_VALUE;
+		} else {
+			params.penalty_threshold_5g = 0;
+		}
+	} else {
+		if (db2dbm_enabled)
+			params.boost_threshold_5g =
+				roam_params->raise_rssi_thresh_5g;
+		else
+			params.boost_threshold_5g =
+				(roam_params->raise_rssi_thresh_5g -
+				 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
+	}
+	if (roam_params->drop_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT) {
+		if (db2dbm_enabled)
+			params.penalty_threshold_5g = WMA_RSSI_MIN_VALUE;
+		else
+			params.penalty_threshold_5g = 0;
+
+	} else {
+		if (db2dbm_enabled)
+			params.penalty_threshold_5g =
+				  roam_params->drop_rssi_thresh_5g;
+		else
+			params.penalty_threshold_5g =
+				     (roam_params->drop_rssi_thresh_5g -
+				      WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
+	}
 	params.raise_factor_5g = roam_params->raise_factor_5g;
 	params.drop_factor_5g = roam_params->drop_factor_5g;
 	params.max_raise_rssi_5g = roam_params->max_raise_rssi_5g;
@@ -495,22 +534,41 @@ QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 		good_rssi_threshold = WMA_NOISE_FLOOR_DBM_DEFAULT;
 	else
 		good_rssi_threshold = 0;
-	params.good_rssi_threshold =
-	    (good_rssi_threshold - WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
+
+	if (db2dbm_enabled)
+		params.good_rssi_threshold = good_rssi_threshold;
+	else
+		params.good_rssi_threshold = (good_rssi_threshold -
+					      WMA_NOISE_FLOOR_DBM_DEFAULT) &
+					      0x000000ff;
 
 	WMA_LOGD("WMA --> good_rssi_threshold=%d",
 		 params.good_rssi_threshold);
 
 	if (roam_req->early_stop_scan_enable) {
-		params.roam_earlystop_thres_min =
-			roam_req->early_stop_scan_min_threshold -
-			WMA_NOISE_FLOOR_DBM_DEFAULT;
-		params.roam_earlystop_thres_max =
-			roam_req->early_stop_scan_max_threshold -
-			WMA_NOISE_FLOOR_DBM_DEFAULT;
+		if (db2dbm_enabled) {
+			params.roam_earlystop_thres_min =
+				roam_req->early_stop_scan_min_threshold;
+			params.roam_earlystop_thres_max =
+				roam_req->early_stop_scan_max_threshold;
+		} else {
+			params.roam_earlystop_thres_min =
+				roam_req->early_stop_scan_min_threshold -
+				WMA_NOISE_FLOOR_DBM_DEFAULT;
+			params.roam_earlystop_thres_max =
+				roam_req->early_stop_scan_max_threshold -
+				WMA_NOISE_FLOOR_DBM_DEFAULT;
+		}
 	} else {
-		params.roam_earlystop_thres_min = 0;
-		params.roam_earlystop_thres_max = 0;
+		if (db2dbm_enabled) {
+			params.roam_earlystop_thres_min =
+						    WMA_RSSI_MIN_VALUE;
+			params.roam_earlystop_thres_max =
+						    WMA_RSSI_MIN_VALUE;
+		} else {
+			params.roam_earlystop_thres_min = 0;
+			params.roam_earlystop_thres_max = 0;
+		}
 	}
 	params.rssi_thresh_offset_5g =
 		roam_req->rssi_thresh_offset_5g;
@@ -821,9 +879,7 @@ static void wma_roam_scan_fill_ap_profile(tSirRoamOffloadScanReq *roam_req,
 			profile->rsn_mcastcipherset;
 		profile->rssi_threshold = roam_req->RoamRssiDiff;
 		if (roam_req->rssi_abs_thresh)
-			profile->rssi_abs_thresh =
-				roam_req->rssi_abs_thresh -
-						WMA_NOISE_FLOOR_DBM_DEFAULT;
+			profile->rssi_abs_thresh = roam_req->rssi_abs_thresh;
 #ifdef WLAN_FEATURE_11W
 		if (roam_req->ConnectedNetwork.mfp_enabled)
 			profile->flags |= WMI_AP_PROFILE_FLAG_PMF;
@@ -1131,6 +1187,10 @@ static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
 
 	ap_profile.vdev_id = roam_req->sessionId;
 	wma_roam_scan_fill_ap_profile(roam_req, &ap_profile.profile);
+	if (!wmi_service_enabled(wma_handle->wmi_handle,
+				 wmi_service_hw_db2dbm_support))
+		ap_profile.profile.rssi_abs_thresh -=
+						WMA_NOISE_FLOOR_DBM_DEFAULT;
 	ap_profile.param = roam_req->score_params;
 	return wmi_unified_send_roam_scan_offload_ap_cmd(wma_handle->wmi_handle,
 							 &ap_profile);
@@ -2828,9 +2888,10 @@ int wma_rssi_breached_event_handler(void *handle,
 	wmi_rssi_breach_event_fixed_param  *event;
 	struct rssi_breach_event  rssi;
 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
+	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 
-	if (!mac) {
-		WMA_LOGE("%s: Invalid mac context", __func__);
+	if (!mac || !wma) {
+		WMA_LOGE("%s: Invalid mac/wma context", __func__);
 		return -EINVAL;
 	}
 	if (!mac->sme.rssi_threshold_breached_cb) {
@@ -2846,7 +2907,11 @@ int wma_rssi_breached_event_handler(void *handle,
 
 	rssi.request_id = event->request_id;
 	rssi.session_id = event->vdev_id;
-	rssi.curr_rssi = event->rssi + WMA_TGT_NOISE_FLOOR_DBM;
+	if (wmi_service_enabled(wma->wmi_handle,
+				wmi_service_hw_db2dbm_support))
+		rssi.curr_rssi = event->rssi;
+	else
+		rssi.curr_rssi = event->rssi + WMA_TGT_NOISE_FLOOR_DBM;
 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, rssi.curr_bssid.bytes);
 
 	WMA_LOGD("%s: req_id: %u vdev_id: %d curr_rssi: %d", __func__,

+ 28 - 60
core/wma/src/wma_utils.c

@@ -2448,10 +2448,10 @@ static void wma_vdev_stats_lost_link_helper(tp_wma_handle wma,
 					    wmi_vdev_stats *vdev_stats)
 {
 	struct wma_txrx_node *node;
-	int32_t rssi;
+	int8_t rssi;
 	struct wma_target_req *req_msg;
 	static const uint8_t zero_mac[QDF_MAC_ADDR_SIZE] = {0};
-	int32_t bcn_snr, dat_snr;
+	bool db2dbm_enabled;
 
 	if (vdev_stats->vdev_id >= wma->max_bssid) {
 		WMA_LOGE("%s: Invalid vdev_id %hu",
@@ -2459,6 +2459,8 @@ static void wma_vdev_stats_lost_link_helper(tp_wma_handle wma,
 		return;
 	}
 
+	db2dbm_enabled = wlan_psoc_nif_fw_ext_cap_get(wma->psoc,
+						      WLAN_SOC_CEXT_HW_DB2DBM);
 	node = &wma->interfaces[vdev_stats->vdev_id];
 	if (wma_is_vdev_up(vdev_stats->vdev_id) &&
 	    !qdf_mem_cmp(node->bssid, zero_mac, QDF_MAC_ADDR_SIZE)) {
@@ -2469,20 +2471,16 @@ static void wma_vdev_stats_lost_link_helper(tp_wma_handle wma,
 			WMA_LOGD(FL("cannot find DELETE_BSS request message"));
 			return;
 		}
-		bcn_snr = vdev_stats->vdev_snr.bcn_snr;
-		dat_snr = vdev_stats->vdev_snr.dat_snr;
+
 		WMA_LOGD(FL("get vdev id %d, beancon snr %d, data snr %d"),
-			vdev_stats->vdev_id, bcn_snr, dat_snr);
+			vdev_stats->vdev_id, vdev_stats->vdev_snr.bcn_snr,
+			vdev_stats->vdev_snr.dat_snr);
 
-		if (WMA_TGT_IS_VALID_SNR(bcn_snr))
-			rssi = bcn_snr;
-		else if (WMA_TGT_IS_VALID_SNR(dat_snr))
-			rssi = dat_snr;
-		else
-			rssi = WMA_TGT_INVALID_SNR;
+		wlan_util_stats_get_rssi(db2dbm_enabled,
+					 vdev_stats->vdev_snr.bcn_snr,
+					 vdev_stats->vdev_snr.dat_snr,
+					 &rssi);
 
-		/* Get the absolute rssi value from the current rssi value */
-		rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM;
 		wma_lost_link_info_handler(wma, vdev_stats->vdev_id, rssi);
 	}
 }
@@ -2502,11 +2500,12 @@ static void wma_update_vdev_stats(tp_wma_handle wma,
 	uint8_t *stats_buf;
 	struct wma_txrx_node *node;
 	uint8_t i;
-	int32_t rssi = 0;
+	int8_t rssi = 0;
 	QDF_STATUS qdf_status;
 	tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq *) wma->pGetRssiReq;
 	struct scheduler_msg sme_msg = { 0 };
 	int32_t bcn_snr, dat_snr;
+	bool db2dbm_enabled;
 
 	if (vdev_stats->vdev_id >= wma->max_bssid) {
 		WMA_LOGE("%s: Invalid vdev_id %hu",
@@ -2519,6 +2518,8 @@ static void wma_update_vdev_stats(tp_wma_handle wma,
 	WMA_LOGD("vdev id %d beancon snr %d data snr %d",
 		 vdev_stats->vdev_id, bcn_snr, dat_snr);
 
+	db2dbm_enabled = wlan_psoc_nif_fw_ext_cap_get(wma->psoc,
+						      WLAN_SOC_CEXT_HW_DB2DBM);
 	node = &wma->interfaces[vdev_stats->vdev_id];
 	stats_rsp_params = node->stats_rsp;
 	if (stats_rsp_params) {
@@ -2545,38 +2546,17 @@ static void wma_update_vdev_stats(tp_wma_handle wma,
 			summary_stats->rts_succ_cnt = vdev_stats->rts_succ_cnt;
 			summary_stats->rts_fail_cnt = vdev_stats->rts_fail_cnt;
 			/* Update SNR and RSSI in SummaryStats */
-			if (WMA_TGT_IS_VALID_SNR(bcn_snr)) {
-				summary_stats->snr = bcn_snr;
-				summary_stats->rssi =
-					bcn_snr + WMA_TGT_NOISE_FLOOR_DBM;
-			} else if (WMA_TGT_IS_VALID_SNR(dat_snr)) {
-				summary_stats->snr = dat_snr;
-				summary_stats->rssi =
-					dat_snr + WMA_TGT_NOISE_FLOOR_DBM;
-			} else {
-				summary_stats->snr = WMA_TGT_INVALID_SNR;
-				summary_stats->rssi = 0;
-			}
+			wlan_util_stats_get_rssi(db2dbm_enabled,
+						 bcn_snr, dat_snr,
+						 &summary_stats->rssi);
+			summary_stats->snr = summary_stats->rssi -
+							WMA_TGT_NOISE_FLOOR_DBM;
 		}
 	}
 
 	if (pGetRssiReq && pGetRssiReq->sessionId == vdev_stats->vdev_id) {
-		if (WMA_TGT_IS_VALID_SNR(bcn_snr)) {
-			rssi = bcn_snr;
-			rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM;
-		} else if (WMA_TGT_IS_VALID_SNR(dat_snr)) {
-			rssi = dat_snr;
-			rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM;
-		} else {
-			/*
-			 * 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.
-			 */
-			WMA_LOGE("Invalid SNR from firmware");
-		}
+		wlan_util_stats_get_rssi(db2dbm_enabled, bcn_snr, dat_snr,
+					 &rssi);
 
 		WMA_LOGD("Average Rssi = %d, vdev id= %d", rssi,
 			 pGetRssiReq->sessionId);
@@ -2760,31 +2740,19 @@ static void wma_update_per_chain_rssi_stats(tp_wma_handle wma,
 {
 	int i;
 	int32_t bcn_snr, dat_snr;
+	bool db2dbm_enabled;
 
+	db2dbm_enabled = wlan_psoc_nif_fw_ext_cap_get(wma->psoc,
+						      WLAN_SOC_CEXT_HW_DB2DBM);
 	for (i = 0; i < NUM_CHAINS_MAX; i++) {
 		bcn_snr = rssi_stats->rssi_avg_beacon[i];
 		dat_snr = rssi_stats->rssi_avg_data[i];
 		WMA_LOGD("chain %d beacon snr %d data snr %d",
 			i, bcn_snr, dat_snr);
-		if (WMA_TGT_IS_VALID_SNR(bcn_snr))
-			rssi_per_chain_stats->rssi[i] = bcn_snr;
-		else if (WMA_TGT_IS_VALID_SNR(dat_snr))
-			rssi_per_chain_stats->rssi[i] = dat_snr;
-		else
-			/*
-			 * 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 an invalid rssi
-			 * value.
-			 */
-			rssi_per_chain_stats->rssi[i] = WMA_TGT_INVALID_SNR;
 
-		/*
-		 * Get the absolute rssi value from the current rssi value the
-		 * sinr value is hardcoded into 0 in the qcacld-new/CORE stack
-		 */
-		rssi_per_chain_stats->rssi[i] += WMA_TGT_NOISE_FLOOR_DBM;
+		wlan_util_stats_get_rssi(db2dbm_enabled, bcn_snr, dat_snr,
+					 &rssi_per_chain_stats->rssi[i]);
+
 		WMI_MAC_ADDR_TO_CHAR_ARRAY(&(rssi_stats->peer_macaddr),
 			rssi_per_chain_stats->peer_mac_addr);
 	}