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
Este commit está contenido en:
Jhalak Naik
2021-04-22 23:30:50 +05:30
cometido por Madan Koyyalamudi
padre 7dfea024c8
commit 399fdd15c0
Se han modificado 2 ficheros con 212 adiciones y 1 borrados

Ver fichero

@@ -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

Ver fichero

@@ -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