Files
android_kernel_samsung_sm86…/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h
Vignesh Mohan 2b0ff06748 qcacmn: Add support for Bangradar with detector ID
Provide support for bangradar with detector ID as one of the parameters.
Add the parameter as part of the packed arguments to be sent to FW.

Also add APIs for basic sanity check of bangradar params and packing
bangradar params inside an 32 bit unsigned integer.

CRs-Fixed: 2646549
Change-Id: Ie781bc9421b7ac0d407eb01814c9242c7f988884
2020-03-23 23:13:52 -07:00

362 lines
12 KiB
C

/*
* Copyright (c) 2011, 2016-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2010, Atheros Communications Inc.
* All Rights Reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: This file has dfs IOCTL Defines.
*/
#ifndef _DFS_IOCTL_H_
#define _DFS_IOCTL_H_
#define DFS_MUTE_TIME 1
#define DFS_SET_THRESH 2
#define DFS_GET_THRESH 3
#define DFS_GET_USENOL 4
#define DFS_SET_USENOL 5
#define DFS_RADARDETECTS 6
#define DFS_BANGRADAR 7
#define DFS_SHOW_NOL 8
#define DFS_DISABLE_DETECT 9
#define DFS_ENABLE_DETECT 10
#define DFS_DISABLE_FFT 11
#define DFS_ENABLE_FFT 12
#define DFS_SET_DEBUG_LEVEL 13
#define DFS_GET_NOL 14
#define DFS_SET_NOL 15
#define DFS_SET_FALSE_RSSI_THRES 16
#define DFS_SET_PEAK_MAG 17
#define DFS_IGNORE_CAC 18
#define DFS_SET_NOL_TIMEOUT 19
#define DFS_GET_CAC_VALID_TIME 20
#define DFS_SET_CAC_VALID_TIME 21
#define DFS_SHOW_NOLHISTORY 22
#define DFS_SHOW_PRECAC_LISTS 23
#define DFS_RESET_PRECAC_LISTS 24
#define DFS_SET_DISABLE_RADAR_MARKING 25
#define DFS_GET_DISABLE_RADAR_MARKING 26
#define DFS_INJECT_SEQUENCE 27
#define DFS_ALLOW_HW_PULSES 28
#define DFS_SET_PRI_MULTIPILER 29
#define RESTRICTED_80P80_START_CHAN 132
#define RESTRICTED_80P80_END_CHAN 161
/* Check if the given channels are within restricted 80P80 start chan(132) and
* end chan (161).
*/
#define CHAN_WITHIN_RESTRICTED_80P80(chan, cfreq_seg2) \
((((chan) >= RESTRICTED_80P80_START_CHAN) && \
((chan) <= RESTRICTED_80P80_END_CHAN) && \
((cfreq_seg2) >= RESTRICTED_80P80_START_CHAN) && \
((cfreq_seg2) <= RESTRICTED_80P80_END_CHAN)) ? true : false)
/*
* Spectral IOCTLs use DFS_LAST_IOCTL as the base.
* This must always be the last IOCTL in DFS and have
* the highest value.
*/
#define DFS_LAST_IOCTL 29
#ifndef DFS_CHAN_MAX
#define DFS_CHAN_MAX 25
#endif
/**
* struct dfsreq_nolelem - NOL elements.
* @nol_freq: NOL channel frequency.
* @nol_chwidth: NOL channel width.
* @nol_start_ticks: OS ticks when the NOL timer started.
* @nol_timeout_ms: Nol timeout value in msec.
*/
struct dfsreq_nolelem {
uint16_t nol_freq;
uint16_t nol_chwidth;
unsigned long nol_start_ticks;
uint32_t nol_timeout_ms;
};
struct dfsreq_nolinfo {
uint32_t dfs_ch_nchans;
struct dfsreq_nolelem dfs_nol[DFS_CHAN_MAX];
};
/*
* IOCTL parameter types
*/
#define DFS_PARAM_FIRPWR 1
#define DFS_PARAM_RRSSI 2
#define DFS_PARAM_HEIGHT 3
#define DFS_PARAM_PRSSI 4
#define DFS_PARAM_INBAND 5
/* 5413 specific parameters */
#define DFS_PARAM_RELPWR 7
#define DFS_PARAM_RELSTEP 8
#define DFS_PARAM_MAXLEN 9
/**
* struct dfs_ioctl_params - DFS ioctl params.
* @dfs_firpwr: FIR pwr out threshold.
* @dfs_rrssi: Radar rssi thresh.
* @dfs_height: Pulse height thresh.
* @dfs_prssi: Pulse rssi thresh.
* @dfs_inband: Inband thresh.
* @dfs_relpwr: Pulse relative pwr thresh.
* @dfs_relstep: Pulse relative step thresh.
* @dfs_maxlen: Pulse max duration.
*/
struct dfs_ioctl_params {
int32_t dfs_firpwr;
int32_t dfs_rrssi;
int32_t dfs_height;
int32_t dfs_prssi;
int32_t dfs_inband;
int32_t dfs_relpwr;
int32_t dfs_relstep;
int32_t dfs_maxlen;
};
/* Types of Bangradar commands:
* @DFS_BANGRADAR_FOR_ALL_SUBCHANS : Bangradar with no arguments.
* All the subchannels in the current
* channel shall be added.
* @DFS_BANGRADAR_FOR_ALL_SUBCHANS_OF_SEGID : Bangradar with 1 (seg_id) argument
* All subchannels of the specific
* seg_id shall be added.
* @DFS_BANGRADAR_FOR_SPECIFIC_SUBCHANS : Bangradar with all (segment ID,
* is_chirp and frequency offset)
* arguments.
* Only radar infected subchannels
* of the specific seg_id shall be
* added.
*
* (Unless all arguments are given, we cannot determine which specific
* subchannels to simulate the radar on, hence simulate in all subchans).
*/
enum dfs_bangradar_types {
DFS_NO_BANGRADAR = 0,
DFS_BANGRADAR_FOR_ALL_SUBCHANS,
DFS_BANGRADAR_FOR_ALL_SUBCHANS_OF_SEGID,
DFS_BANGRADAR_FOR_SPECIFIC_SUBCHANS,
DFS_INVALID_BANGRADAR_TYPE
};
/**
* struct dfs_bangradar_params - DFS bangradar params.
* @bangradar_type: Type of Bangradar.
* @seg_id: Segment ID information.
* @is_chirp: Chirp radar or not.
* @freq_offset: Frequency offset at which radar was found.
* @detector_id: Detector ID corresponding to primary/agile detectors.
*/
struct dfs_bangradar_params {
enum dfs_bangradar_types bangradar_type;
uint8_t seg_id;
uint8_t is_chirp;
int32_t freq_offset;
uint8_t detector_id;
};
#define DFS_IOCTL_PARAM_NOVAL 65535
#define DFS_IOCTL_PARAM_ENABLE 0x8000
/* Random channel flags */
/* Flag to exclude current operating channels */
#define DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH 0x0001 /* 0000 0000 0000 0001 */
/* Flag to exclude weather channels */
#define DFS_RANDOM_CH_FLAG_NO_WEATHER_CH 0x0002 /* 0000 0000 0000 0010 */
/* Flag to exclude indoor channels */
#define DFS_RANDOM_CH_FLAG_NO_LOWER_5G_CH 0x0004 /* 0000 0000 0000 0100 */
/* Flag to exclude outdoor channels */
#define DFS_RANDOM_CH_FLAG_NO_UPEER_5G_CH 0x0008 /* 0000 0000 0000 1000 */
/* Flag to exclude dfs channels */
#define DFS_RANDOM_CH_FLAG_NO_DFS_CH 0x0010 /* 0000 0000 0001 0000 */
/* Flag to exclude all 5GHz channels */
#define DFS_RANDOM_CH_FLAG_NO_5GHZ_CH 0x0020 /* 0000 0000 0010 0000 */
/* Flag to exclude all 2.4GHz channels */
#define DFS_RANDOM_CH_FLAG_NO_2GHZ_CH 0x0040 /* 0000 0000 0100 0000 */
/* Flag to enable Reduced BW Agile DFS */
#define DFS_RANDOM_CH_FLAG_ENABLE_REDUCED_BW 0x0080 /* 0000 0000 1000 0000 */
/* Flag to exclude Japan W53 channnels */
#define DFS_RANDOM_CH_FLAG_NO_JAPAN_W53_CH 0x0100 /* 0000 0001 0000 0000 */
/* Restricted 80P80 MHz is enabled */
#define DFS_RANDOM_CH_FLAG_RESTRICTED_80P80_ENABLED 0x0200
/* 0000 0010 0000 0000 */
/**
* struct wlan_dfs_caps - DFS capability structure.
* @wlan_dfs_ext_chan_ok: Can radar be detected on the extension chan?
* @wlan_dfs_combined_rssi_ok: Can use combined radar RSSI?
* @wlan_dfs_use_enhancement: This flag is used to indicate if radar
* detection scheme should use enhanced chirping
* detection algorithm. This flag also determines
* if certain radar data should be discarded to
* minimize false detection of radar.
* @wlan_strong_signal_diversiry: Strong Signal fast diversity count.
* @wlan_chip_is_bb_tlv: Chip is BB TLV?
* @wlan_chip_is_over_sampled: Is Over sampled.
* @wlan_chip_is_ht160: IS VHT160?
* @wlan_chip_is_false_detect: Is False detected?
* @wlan_fastdiv_val: Goes with wlan_strong_signal_diversiry: If we
* have fast diversity capability, read off
* Strong Signal fast diversity count set in the
* ini file, and store so we can restore the
* value when radar is disabled.
*/
struct wlan_dfs_caps {
uint32_t wlan_dfs_ext_chan_ok:1,
wlan_dfs_combined_rssi_ok:1,
wlan_dfs_use_enhancement:1,
wlan_strong_signal_diversiry:1,
wlan_chip_is_bb_tlv:1,
wlan_chip_is_over_sampled:1,
wlan_chip_is_ht160:1,
wlan_chip_is_false_detect:1;
uint32_t wlan_fastdiv_val;
};
/**
* struct wlan_dfs_phyerr_param - DFS Phyerr structure.
* @pe_firpwr: FIR pwr out threshold.
* @pe_rrssi: Radar rssi thresh.
* @pe_height: Pulse height thresh.
* @pe_prssi: Pulse rssi thresh.
* @pe_inband: Inband thresh.
* @pe_relpwr: Relative power threshold in 0.5dB steps.
* @pe_relstep: Pulse Relative step threshold in 0.5dB steps.
* @pe_maxlen: Max length of radar sign in 0.8us units.
* @pe_usefir128: Use the average in-band power measured over 128 cycles.
* @pe_blockradar: Enable to block radar check if pkt detect is done via OFDM
* weak signal detect or pkt is detected immediately after tx
* to rx transition.
* @pe_enmaxrssi: Enable to use the max rssi instead of the last rssi during
* fine gain changes for radar detection.
*/
struct wlan_dfs_phyerr_param {
int32_t pe_firpwr;
int32_t pe_rrssi;
int32_t pe_height;
int32_t pe_prssi;
int32_t pe_inband;
uint32_t pe_relpwr;
uint32_t pe_relstep;
uint32_t pe_maxlen;
bool pe_usefir128;
bool pe_blockradar;
bool pe_enmaxrssi;
};
/**
* enum WLAN_DFS_EVENTS - DFS Events that will be sent to userspace
* @WLAN_EV_RADAR_DETECTED: Radar is detected
* @WLAN_EV_CAC_STARTED: CAC timer has started
* @WLAN_EV_CAC_COMPLETED: CAC timer completed
* @WLAN_EV_NOL_STARTED: NOL started
* @WLAN_EV_NOL_FINISHED: NOL Completed
*
* DFS events such as radar detected, CAC started,
* CAC completed, NOL started, NOL finished
*/
enum WLAN_DFS_EVENTS {
WLAN_EV_RADAR_DETECTED,
WLAN_EV_CAC_STARTED,
WLAN_EV_CAC_COMPLETED,
WLAN_EV_NOL_STARTED,
WLAN_EV_NOL_FINISHED,
};
#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(WLAN_DFS_SYNTHETIC_RADAR)
/**
* Structure of Pulse to be injected into the DFS Module
* ******************************************************
* Header
* ======
* ----------|--------------|
* num_pulses| total_len_seq|
* ----------|--------------|
* Buffer Contents per pulse:
* ==========================
* ------|----------|-----------|----------|-----------|---------------|--------
* r_rssi|r_ext_rssi|r_rs_tstamp|r_fulltsf |fft_datalen|total_len_pulse|FFT
* | | | | | |Buffer..
* ------|----------|-----------|----------|-----------|---------------|--------
*/
/**
* struct synthetic_pulse - Radar Pulse Structure to be filled on reading the
* user file.
* @r_rssi: RSSI of the pulse.
* @r_ext_rssi: Extension Channel RSSI.
* @r_rs_tstamp: Timestamp.
* @r_fulltsf: TSF64.
* @fft_datalen: Total len of FFT.
* @total_len_pulse: Total len of the pulse.
* @fft_buf: Pointer to fft data.
*/
struct synthetic_pulse {
uint8_t r_rssi;
uint8_t r_ext_rssi;
uint32_t r_rs_tstamp;
uint64_t r_fulltsf;
uint16_t fft_datalen;
uint16_t total_len_pulse;
unsigned char *fft_buf;
} qdf_packed;
/**
* struct synthetic_seq - Structure to hold an array of pointers to the
* pulse structure.
* @num_pulses: Total num of pulses in the sequence.
* @total_len_seq: Total len of the sequence.
* @pulse: Array of pointers to synthetic_pulse structure.
*/
struct synthetic_seq {
uint8_t num_pulses;
uint32_t total_len_seq;
struct synthetic_pulse *pulse[0];
};
/**
* struct seq_store - Structure to hold an array of pointers to the synthetic
* sequence structure.
* @num_sequence: Total number of "sequence of pulses" in the file.
* @seq_arr: Array of pointers to synthetic_seq structure.
*/
struct seq_store {
uint8_t num_sequence;
struct synthetic_seq *seq_arr[0];
};
#endif /* WLAN_DFS_PARTIAL_OFFLOAD && WLAN_DFS_SYNTHETIC_RADAR */
#endif /* _DFS_IOCTL_H_ */