Ver Fonte

qcacld-3.0: Calculate rx_clear_count in case of wide band scan

In case of wide band scan, FW sends cca_busy_subband_info tlvs
via WMI_CHAN_INFO_EVENTID, which contains value of rx_clear_count
for each 20 MHz freq space.

Fix is to calculate average of rx_clear_count coming via above
tlvs and update same to cp stats component.

Change-Id: Ifec35f2ca256aabd8ef08a5ca52a53dc1c89e297
CRs-Fixed: 3580240
Abhinav Kumar há 1 ano atrás
pai
commit
d9819e03a2
1 ficheiros alterados com 73 adições e 77 exclusões
  1. 73 77
      core/wma/src/wma_features.c

+ 73 - 77
core/wma/src/wma_features.c

@@ -5247,24 +5247,6 @@ wma_update_sacn_channel_info_buf(wmi_unified_t wmi_handle,
 				 uint32_t num_tlvs)
 {
 	uint32_t i;
-	bool is_cca_busy_info;
-
-	buf->tx_frame_count = event->tx_frame_cnt;
-	buf->clock_freq = event->mac_clk_mhz;
-	buf->cmd_flag = event->cmd_flags;
-	buf->freq = event->freq;
-	buf->noise_floor = event->noise_floor;
-	buf->cycle_count = event->cycle_count;
-	buf->rx_clear_count = event->rx_clear_count;
-
-	is_cca_busy_info = wmi_service_enabled(wmi_handle,
-				wmi_service_cca_busy_info_for_each_20mhz);
-
-	if (!is_cca_busy_info || num_tlvs == 0)
-		return;
-
-	wma_debug("is_cca_busy_info: %d, num_tlvs:%d", is_cca_busy_info,
-		  num_tlvs);
 
 	if (cca_info && num_tlvs > 0) {
 		buf->subband_info.num_chan = 0;
@@ -5282,8 +5264,22 @@ wma_update_sacn_channel_info_buf(wmi_unified_t wmi_handle,
 	}
 }
 
-int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
-				uint32_t len)
+static void
+wma_get_scan_rx_clear_count_average(wmi_cca_busy_subband_info *cca_info,
+				    uint32_t num_tlvs, uint32_t *rx_clear_count)
+{
+	uint32_t i, total_rx_clear_count = 0;
+
+	for (i = 0; i < num_tlvs && i < MAX_WIDE_BAND_SCAN_CHAN; i++) {
+		total_rx_clear_count += cca_info->rx_clear_count;
+		cca_info++;
+	}
+
+	*rx_clear_count = total_rx_clear_count / num_tlvs;
+	wma_debug("average rx_clear_count : %d", *rx_clear_count);
+}
+
+int wma_chan_info_event_handler(void *handle, uint8_t *event_buf, uint32_t len)
 {
 	tp_wma_handle wma = (tp_wma_handle)handle;
 	WMI_CHAN_INFO_EVENTID_param_tlvs *param_buf;
@@ -5292,11 +5288,11 @@ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
 	struct mac_context *mac = NULL;
 	struct channel_status *channel_status;
 	bool snr_monitor_enabled;
-	struct wlan_objmgr_vdev *vdev;
-	enum QDF_OPMODE mode;
 	struct scheduler_msg sme_msg = {0};
 	wmi_cca_busy_subband_info *cca_info = NULL;
 	uint32_t num_tlvs = 0;
+	bool is_cca_busy_info;
+	QDF_STATUS qdf_status;
 
 	if (wma && wma->cds_context)
 		mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
@@ -5309,6 +5305,7 @@ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
 		wma_err("Invalid chan info event buffer");
 		return -EINVAL;
 	}
+
 	event = param_buf->fixed_param;
 	if (!event) {
 		wma_err("Invalid fixed param");
@@ -5322,69 +5319,68 @@ int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
 	if (event->cmd_flags == WMI_CHAN_INFO_END_RESP)
 		return 0;
 
+	cca_info = param_buf->cca_busy_subband_info;
+	num_tlvs  = param_buf->num_cca_busy_subband_info;
+	is_cca_busy_info = wmi_service_enabled(wma->wmi_handle,
+				wmi_service_cca_busy_info_for_each_20mhz);
+
 	snr_monitor_enabled = wlan_scan_is_snr_monitor_enabled(mac->psoc);
 	if (snr_monitor_enabled && mac->chan_info_cb) {
-		cca_info = param_buf->cca_busy_subband_info;
-		num_tlvs  = param_buf->num_cca_busy_subband_info;
-		wma_update_sacn_channel_info_buf(wma->wmi_handle, event,
-						 &buf, cca_info, num_tlvs);
+		buf.tx_frame_count = event->tx_frame_cnt;
+		buf.clock_freq = event->mac_clk_mhz;
+		buf.cmd_flag = event->cmd_flags;
+		buf.freq = event->freq;
+		buf.noise_floor = event->noise_floor;
+		buf.cycle_count = event->cycle_count;
+		buf.rx_clear_count = event->rx_clear_count;
+		/* wide band scan case */
+		if (is_cca_busy_info && num_tlvs)
+			wma_update_sacn_channel_info_buf(wma->wmi_handle,
+							 event, &buf,
+							 cca_info, num_tlvs);
 		mac->chan_info_cb(&buf);
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, event->vdev_id,
-						    WLAN_LEGACY_WMA_ID);
-
-	if (!vdev) {
-		wma_err("vdev not found for vdev %d", event->vdev_id);
-		return -EINVAL;
-	}
-	mode = wlan_vdev_mlme_get_opmode(vdev);
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
+	channel_status = qdf_mem_malloc(sizeof(*channel_status));
+	if (!channel_status)
+		return -ENOMEM;
 
-	if ((mac->sap.acs_with_more_param && mode == QDF_SAP_MODE) ||
-	    sap_is_acs_scan_optimize_enable()) {
-		channel_status = qdf_mem_malloc(sizeof(*channel_status));
-		if (!channel_status)
-			return -ENOMEM;
+	channel_status->channel_freq = event->freq;
+	channel_status->noise_floor = event->noise_floor;
 
-		wma_debug("freq %d nf %d rxcnt %u cyccnt %u tx_r %d tx_t %d",
-			  event->freq, event->noise_floor,
-			  event->rx_clear_count, event->cycle_count,
-			  event->chan_tx_pwr_range, event->chan_tx_pwr_tp);
-
-		channel_status->channel_freq = event->freq;
-		channel_status->noise_floor = event->noise_floor;
-		channel_status->rx_clear_count =
-			 event->rx_clear_count;
-		channel_status->cycle_count = event->cycle_count;
-		channel_status->chan_tx_pwr_range =
-			 event->chan_tx_pwr_range;
-		channel_status->chan_tx_pwr_throughput =
-			 event->chan_tx_pwr_tp;
-		channel_status->rx_frame_count =
-			 event->rx_frame_count;
-		channel_status->bss_rx_cycle_count =
-			event->my_bss_rx_cycle_count;
-		channel_status->rx_11b_mode_data_duration =
+	if (is_cca_busy_info && num_tlvs)
+		wma_get_scan_rx_clear_count_average(cca_info, num_tlvs,
+					&channel_status->rx_clear_count);
+	else
+		channel_status->rx_clear_count = event->rx_clear_count;
+
+	channel_status->cycle_count = event->cycle_count;
+	channel_status->chan_tx_pwr_range = event->chan_tx_pwr_range;
+	channel_status->chan_tx_pwr_throughput = event->chan_tx_pwr_tp;
+	channel_status->rx_frame_count = event->rx_frame_count;
+	channel_status->bss_rx_cycle_count = event->my_bss_rx_cycle_count;
+	channel_status->rx_11b_mode_data_duration =
 			event->rx_11b_mode_data_duration;
-		channel_status->tx_frame_count = event->tx_frame_cnt;
-		channel_status->mac_clk_mhz = event->mac_clk_mhz;
-		channel_status->channel_id =
-			cds_freq_to_chan(event->freq);
-		channel_status->cmd_flags =
-			event->cmd_flags;
-
-		sme_msg.type = eWNI_SME_CHAN_INFO_EVENT;
-		sme_msg.bodyptr = channel_status;
-		sme_msg.bodyval = event->vdev_id;
-
-		if (QDF_STATUS_SUCCESS !=
-			scheduler_post_message(QDF_MODULE_ID_WMA,
-					       QDF_MODULE_ID_SME,
-					       QDF_MODULE_ID_SME, &sme_msg))
-			qdf_mem_free(channel_status);
-
-	}
+	channel_status->tx_frame_count = event->tx_frame_cnt;
+	channel_status->mac_clk_mhz = event->mac_clk_mhz;
+	channel_status->channel_id = cds_freq_to_chan(event->freq);
+	channel_status->cmd_flags = event->cmd_flags;
+
+	wma_debug("freq %d, nf %d, rcc %u, ch_rcc:%u, cc %u, tx_r %d, tx_t %d, chan_id:%d, flags:%d, cap: %d, num_tlvs:%d",
+		  event->freq, event->noise_floor,
+		  event->rx_clear_count, channel_status->rx_clear_count,
+		  event->cycle_count, event->chan_tx_pwr_range,
+		  event->chan_tx_pwr_tp, channel_status->channel_id,
+		  channel_status->cmd_flags, is_cca_busy_info, num_tlvs);
+
+	sme_msg.type = eWNI_SME_CHAN_INFO_EVENT;
+	sme_msg.bodyptr = channel_status;
+	sme_msg.bodyval = event->vdev_id;
+	qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
+					    QDF_MODULE_ID_SME,
+					    QDF_MODULE_ID_SME, &sme_msg);
+	if (QDF_IS_STATUS_ERROR(qdf_status))
+		qdf_mem_free(channel_status);
 
 	return 0;
 }