Bladeren bron

qcacmn: Add API to fill the Spectral SAMP message

Add a new API target_if_fill_samp_msg, to populate
the Spectral SAMP message and detector level
information, using  pdev_spectral_det_map
and per_session_report_info. Send the SAMP message
to upper layers when completely filled.

Change-Id: If43494fe4a09dbfeb9aea6cb0fa20b406d81e390
CRs-Fixed: 2945282
Jhalak Naik 4 jaren geleden
bovenliggende
commit
399fdd15c0
2 gewijzigde bestanden met toevoegingen van 212 en 1 verwijderingen
  1. 30 0
      target_if/spectral/target_if_spectral.h
  2. 182 1
      target_if/spectral/target_if_spectral_netlink.c

+ 30 - 0
target_if/spectral/target_if_spectral.h

@@ -133,6 +133,7 @@
  */
 #define MAX_NUM_DEST_DETECTOR_INFO    (3)
 #define MAX_DETECTORS_PER_PDEV        (3)
+#define FFT_BIN_SIZE_1BYTE            (1)
 
 #ifdef OPTIMIZED_SAMP_MESSAGE
 /**
@@ -160,6 +161,18 @@ enum spectral_160mhz_report_delivery_state {
 };
 #endif /* OPTIMIZED_SAMP_MESSAGE */
 
+/**
+ * enum spectral_freq_span_id - Spectral frequency span id
+ * @SPECTRAL_FREQ_SPAN_ID_0: Frequency span 0
+ * @SPECTRAL_FREQ_SPAN_ID_1: Frequency span 1
+ * @SPECTRAL_FREQ_SPAN_ID_2: Frequency span 2
+ */
+enum spectral_freq_span_id {
+	SPECTRAL_FREQ_SPAN_ID_0,
+	SPECTRAL_FREQ_SPAN_ID_1,
+	SPECTRAL_FREQ_SPAN_ID_2,
+};
+
 /**
  * enum spectral_detector_id - Spectral detector id
  * @SPECTRAL_DETECTOR_ID_0: Spectral detector 0
@@ -1400,6 +1413,7 @@ uint32_t target_if_get_offset_swar_sec80(uint32_t channel_width);
  */
 void target_if_sptrl_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
 
+#ifndef OPTIMIZED_SAMP_MESSAGE
 /**
  * target_if_spectral_create_samp_msg() - Create the spectral samp message
  * @spectral : Pointer to spectral internal structure
@@ -1412,6 +1426,22 @@ void target_if_sptrl_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
 void target_if_spectral_create_samp_msg(
 	struct target_if_spectral *spectral,
 	struct target_if_samp_msg_params *params);
+#endif
+
+#ifdef OPTIMIZED_SAMP_MESSAGE
+/**
+ * target_if_spectral_fill_samp_msg() - Fill the Spectral SAMP message
+ * @spectral : Pointer to spectral internal structure
+ * @params: Spectral SAMP message fields
+ *
+ * Fill the spectral SAMP message fields using params and detector map.
+ *
+ * Return: Success/Failure
+ */
+QDF_STATUS target_if_spectral_fill_samp_msg(
+			struct target_if_spectral *spectral,
+			struct target_if_samp_msg_params *params);
+#endif
 
 /**
  * target_if_spectral_process_phyerr_gen3() - Process phyerror event for gen3

+ 182 - 1
target_if/spectral/target_if_spectral_netlink.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011,2017-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011,2017-2021 The Linux Foundation. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
@@ -27,6 +27,186 @@
 #include <wlan_osif_priv.h>
 #include <reg_services_public_struct.h>
 
+#ifdef OPTIMIZED_SAMP_MESSAGE
+QDF_STATUS
+target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
+				 struct target_if_samp_msg_params *params)
+{
+	struct spectral_samp_msg *spec_samp_msg;
+	struct per_session_det_map *det_map;
+	enum spectral_msg_type msg_type;
+	QDF_STATUS ret;
+	uint16_t dest_det_idx;
+	enum spectral_scan_mode spectral_mode;
+
+	if (!spectral) {
+		spectral_err_rl("Spectral LMAC object is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!params) {
+		spectral_err_rl("SAMP msg params structure is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (params->hw_detector_id > SPECTRAL_DETECTOR_ID_MAX) {
+		spectral_err_rl("Invalid detector ID");
+		return QDF_STATUS_E_FAILURE;
+	}
+	det_map = &spectral->det_map[params->hw_detector_id];
+
+	spectral_mode =
+		spectral->rparams.detid_mode_table[params->hw_detector_id];
+	if (spectral_mode >= SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err_rl("No valid Spectral mode for detector id %u",
+				params->hw_detector_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	ret = target_if_get_spectral_msg_type(spectral_mode,
+					      &msg_type);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		spectral_err_rl("Invalid spectral msg type");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	spec_samp_msg = spectral->nl_cb.get_sbuff(spectral->pdev_obj,
+						  msg_type,
+						  det_map->buf_type);
+	if (!spec_samp_msg) {
+		spectral_err_rl("Spectral SAMP message is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	for (dest_det_idx = 0; dest_det_idx < det_map->num_dest_det_info;
+	     dest_det_idx++) {
+		struct per_session_dest_det_info *map_det_info;
+		struct spectral_fft_bin_len_adj_swar *swar;
+		struct samp_freq_span_info *span_info;
+		struct samp_detector_info *detector_info;
+		uint8_t dest_detector_id;
+		uint8_t span_id;
+		uint8_t *bin_pwr_data;
+		uint32_t *binptr_32;
+		uint16_t *binptr_16;
+		uint16_t pwr_16;
+		size_t pwr_count;
+		uint16_t idx;
+
+		swar = &spectral->len_adj_swar;
+
+		map_det_info = &det_map->dest_det_info[dest_det_idx];
+		span_id = map_det_info->freq_span_id;
+		span_info = &spec_samp_msg->freq_span_info[span_id];
+		span_info->num_detectors++;
+
+		dest_detector_id = map_det_info->det_id;
+		detector_info = &span_info->detector_info[dest_detector_id];
+
+		detector_info->start_frequency = map_det_info->start_freq;
+		detector_info->end_frequency = map_det_info->end_freq;
+		detector_info->start_bin_idx = map_det_info->dest_start_bin_idx;
+		detector_info->end_bin_idx = map_det_info->dest_end_bin_idx;
+
+		detector_info->rssi = params->rssi;
+
+		detector_info->last_raw_timestamp = params->last_raw_timestamp;
+		detector_info->reset_delay = params->reset_delay;
+		detector_info->raw_timestamp = params->raw_timestamp;
+		detector_info->timestamp = params->timestamp;
+		detector_info->timestamp_war_offset = spectral->timestamp_war.
+				timestamp_war_offset[spectral_mode];
+
+		detector_info->max_magnitude = params->max_mag;
+
+		detector_info->noise_floor = params->noise_floor;
+		detector_info->agc_total_gain = params->agc_total_gain;
+		detector_info->gainchange = params->gainchange;
+		detector_info->is_sec80 = map_det_info->is_sec80;
+		/* In 165MHz, Pri80 indication to be set for Span ID 0 only */
+		if (span_id == SPECTRAL_FREQ_SPAN_ID_0)
+			detector_info->pri80ind = params->pri80ind;
+
+		bin_pwr_data = &params->bin_pwr_data
+					[map_det_info->src_start_bin_idx];
+		pwr_count = detector_info->end_bin_idx -
+			    detector_info->start_bin_idx + 1;
+		spec_samp_msg->bin_pwr_count += pwr_count;
+		/*
+		 * To check whether FFT bin values exceed 8 bits, we add a
+		 * check before copying values to samp_data->bin_pwr.
+		 * If it crosses 8 bits, we cap the values to maximum value
+		 * supported by 8 bits ie. 255. This needs to be done as the
+		 * destination array in SAMP message is 8 bits. This is a
+		 * temporary solution till an array of 16 bits is used for
+		 * SAMP message.
+		 */
+		if (swar->fftbin_size_war ==
+				SPECTRAL_FFTBIN_SIZE_WAR_4BYTE_TO_1BYTE) {
+			binptr_32 = (uint32_t *)bin_pwr_data;
+			for (idx = 0; idx < pwr_count; idx++) {
+				/* Read only the first 2 bytes of the DWORD */
+				pwr_16 = *((uint16_t *)binptr_32++);
+				if (qdf_unlikely(pwr_16 > MAX_FFTBIN_VALUE))
+					pwr_16 = MAX_FFTBIN_VALUE;
+				spec_samp_msg->bin_pwr
+					[detector_info->start_bin_idx + idx]
+							= pwr_16;
+			}
+		} else if (swar->fftbin_size_war ==
+				SPECTRAL_FFTBIN_SIZE_WAR_2BYTE_TO_1BYTE) {
+			binptr_16 = (uint16_t *)bin_pwr_data;
+			for (idx = 0; idx < pwr_count; idx++) {
+				pwr_16 = *(binptr_16++);
+				if (qdf_unlikely(pwr_16 > MAX_FFTBIN_VALUE))
+					pwr_16 = MAX_FFTBIN_VALUE;
+				spec_samp_msg->bin_pwr
+					[detector_info->start_bin_idx + idx]
+							= pwr_16;
+			}
+		} else {
+			qdf_mem_copy(&spec_samp_msg->bin_pwr
+				     [detector_info->start_bin_idx],
+				     bin_pwr_data, pwr_count);
+		}
+	}
+
+	if (det_map->send_to_upper_layers) {
+		/* Fill per-report information */
+		struct per_session_report_info *rpt_info;
+		struct target_if_spectral_ops *p_sops;
+
+		p_sops = GET_TARGET_IF_SPECTRAL_OPS(spectral);
+
+		rpt_info = &spectral->report_info[spectral_mode];
+		spec_samp_msg->signature = SPECTRAL_SIGNATURE;
+		p_sops->get_mac_address(spectral, spec_samp_msg->macaddr);
+		spec_samp_msg->spectral_mode = spectral_mode;
+		spec_samp_msg->target_reset_count =
+				spectral->timestamp_war.target_reset_count;
+		spec_samp_msg->operating_bw = rpt_info->operating_bw;
+		spec_samp_msg->pri20_freq = rpt_info->pri20_freq;
+		spec_samp_msg->cfreq1 = rpt_info->cfreq1;
+		spec_samp_msg->cfreq2 = rpt_info->cfreq2;
+		spec_samp_msg->sscan_cfreq1 = rpt_info->sscan_cfreq1;
+		spec_samp_msg->sscan_cfreq2 = rpt_info->sscan_cfreq2;
+		spec_samp_msg->sscan_bw = rpt_info->sscan_bw;
+		spec_samp_msg->fft_width = FFT_BIN_SIZE_1BYTE;
+		spec_samp_msg->num_freq_spans = rpt_info->num_spans;
+
+		if (spectral->send_phy_data(spectral->pdev_obj,
+					    msg_type) == 0)
+			spectral->spectral_sent_msg++;
+		if (spectral->spectral_gen == SPECTRAL_GEN3)
+			reset_160mhz_delivery_state_machine(spectral,
+							    spectral_mode);
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* OPTIMIZED_SAMP_MESSAGE */
+
+#ifndef OPTIMIZED_SAMP_MESSAGE
 void
 target_if_spectral_create_samp_msg(struct target_if_spectral *spectral,
 				   struct target_if_samp_msg_params *params)
@@ -304,3 +484,4 @@ target_if_spectral_create_samp_msg(struct target_if_spectral *spectral,
 				spectral, params->smode,
 				SPECTRAL_DETECTOR_ID_INVALID);
 }
+#endif