diff --git a/target_if/spectral/target_if_spectral.h b/target_if/spectral/target_if_spectral.h index b7a0666657..cb7bc3a7d6 100644 --- a/target_if/spectral/target_if_spectral.h +++ b/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 diff --git a/target_if/spectral/target_if_spectral_netlink.c b/target_if/spectral/target_if_spectral_netlink.c index 1c575181de..ee6e594d96 100644 --- a/target_if/spectral/target_if_spectral_netlink.c +++ b/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 #include +#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 = ¶ms->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