1  /*
2   * Copyright (c) 2011, 2017-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  
20  #ifndef _SPECTRAL_IOCTL_H_
21  #define _SPECTRAL_IOCTL_H_
22  #include <wlan_dfs_ioctl.h>
23  
24  #ifndef AH_MAX_CHAINS
25  #define AH_MAX_CHAINS 3
26  #endif
27  
28  /* Compile time Assert */
29  #define SPECTRAL_COMPILE_TIME_ASSERT(assertion_name, predicate) \
30  	typedef char assertion_name[(predicate) ? 1 : -1]
31  
32  /*
33   * ioctl defines
34   */
35  
36  #define SPECTRAL_SET_CONFIG              (DFS_LAST_IOCTL + 1)
37  #define SPECTRAL_GET_CONFIG              (DFS_LAST_IOCTL + 2)
38  #define SPECTRAL_SHOW_INTERFERENCE       (DFS_LAST_IOCTL + 3)
39  #define SPECTRAL_ENABLE_SCAN             (DFS_LAST_IOCTL + 4)
40  #define SPECTRAL_DISABLE_SCAN            (DFS_LAST_IOCTL + 5)
41  #define SPECTRAL_ACTIVATE_SCAN           (DFS_LAST_IOCTL + 6)
42  #define SPECTRAL_STOP_SCAN               (DFS_LAST_IOCTL + 7)
43  #define SPECTRAL_SET_DEBUG_LEVEL         (DFS_LAST_IOCTL + 8)
44  #define SPECTRAL_IS_ACTIVE               (DFS_LAST_IOCTL + 9)
45  #define SPECTRAL_IS_ENABLED              (DFS_LAST_IOCTL + 10)
46  #define SPECTRAL_CLASSIFY_SCAN           (DFS_LAST_IOCTL + 11)
47  #define SPECTRAL_GET_CLASSIFIER_CONFIG   (DFS_LAST_IOCTL + 12)
48  #define SPECTRAL_EACS                    (DFS_LAST_IOCTL + 13)
49  #define SPECTRAL_ACTIVATE_FULL_SCAN      (DFS_LAST_IOCTL + 14)
50  #define SPECTRAL_STOP_FULL_SCAN          (DFS_LAST_IOCTL + 15)
51  #define SPECTRAL_GET_CAPABILITY_INFO     (DFS_LAST_IOCTL + 16)
52  #define SPECTRAL_GET_DIAG_STATS          (DFS_LAST_IOCTL + 17)
53  #define SPECTRAL_GET_CHAN_WIDTH          (DFS_LAST_IOCTL + 18)
54  #define SPECTRAL_GET_CHANINFO            (DFS_LAST_IOCTL + 19)
55  #define SPECTRAL_CLEAR_CHANINFO          (DFS_LAST_IOCTL + 20)
56  #define SPECTRAL_SET_ICM_ACTIVE          (DFS_LAST_IOCTL + 21)
57  #define SPECTRAL_GET_NOMINAL_NOISEFLOOR  (DFS_LAST_IOCTL + 22)
58  #define SPECTRAL_GET_DEBUG_LEVEL         (DFS_LAST_IOCTL + 23)
59  #define SPECTRAL_SET_DMA_DEBUG           (DFS_LAST_IOCTL + 24)
60  
61  /*
62   * Increase spectral sub version if struct spectral_samp_msg updated.
63   */
64  #define SPECTRAL_VERSION     (3)
65  #define SPECTRAL_SUB_VERSION (1)
66  
67  /*
68   * ioctl parameter types
69   */
70  enum spectral_params {
71  	SPECTRAL_PARAM_FFT_PERIOD,
72  	SPECTRAL_PARAM_SCAN_PERIOD,
73  	SPECTRAL_PARAM_FFT_RECAPTURE,
74  	SPECTRAL_PARAM_SCAN_COUNT,
75  	SPECTRAL_PARAM_SHORT_REPORT,
76  	SPECTRAL_PARAM_SPECT_PRI,
77  	SPECTRAL_PARAM_FFT_SIZE,
78  	SPECTRAL_PARAM_GC_ENA,
79  	SPECTRAL_PARAM_RESTART_ENA,
80  	SPECTRAL_PARAM_NOISE_FLOOR_REF,
81  	SPECTRAL_PARAM_INIT_DELAY,
82  	SPECTRAL_PARAM_NB_TONE_THR,
83  	SPECTRAL_PARAM_STR_BIN_THR,
84  	SPECTRAL_PARAM_WB_RPT_MODE,
85  	SPECTRAL_PARAM_RSSI_RPT_MODE,
86  	SPECTRAL_PARAM_RSSI_THR,
87  	SPECTRAL_PARAM_PWR_FORMAT,
88  	SPECTRAL_PARAM_RPT_MODE,
89  	SPECTRAL_PARAM_BIN_SCALE,
90  	SPECTRAL_PARAM_DBM_ADJ,
91  	SPECTRAL_PARAM_CHN_MASK,
92  	SPECTRAL_PARAM_ACTIVE,
93  	SPECTRAL_PARAM_STOP,
94  	SPECTRAL_PARAM_ENABLE,
95  	SPECTRAL_PARAM_FREQUENCY,
96  	SPECTRAL_PARAM_CHAN_FREQUENCY,
97  	SPECTRAL_PARAM_CHAN_WIDTH,
98  	SPECTRAL_PARAM_MAX,
99  };
100  
101  /**
102   * enum spectral_report_mode: Spectral report mode
103   * @SPECTRAL_REPORT_MODE_0: No FFT report (only spectral scan summary report)
104   * @SPECTRAL_REPORT_MODE_1: FFT report header + spectral scan summary report
105   * @SPECTRAL_REPORT_MODE_2: FFt report header + in-band bins per
106   *                          FFT (half of the number of FFT bins), where the
107   *                          FFT input is sampled at two times the channel
108   *                          bandwidth + spectral scan summary report
109   * @SPECTRAL_REPORT_MODE_3: FFT report header + all bins per FFT, where the FFT
110   *                          input is sampled at two times the channel bandwidth
111   *                          + spectral scan summary report
112   * @SPECTRAL_REPORT_MODE_MAX: Max number of report modes
113   */
114  enum spectral_report_mode {
115  	SPECTRAL_REPORT_MODE_0,
116  	SPECTRAL_REPORT_MODE_1,
117  	SPECTRAL_REPORT_MODE_2,
118  	SPECTRAL_REPORT_MODE_3,
119  	SPECTRAL_REPORT_MODE_MAX,
120  };
121  
122  /**
123   * enum spectral_pwr_format: Spectral FFT bin pwr format
124   * @SPECTRAL_PWR_FORMAT_LINEAR: Linear mode
125   * @SPECTRAL_PWR_FORMAT_DBM: dBm mode
126   */
127  enum spectral_pwr_format {
128  	SPECTRAL_PWR_FORMAT_LINEAR = 0,
129  	SPECTRAL_PWR_FORMAT_DBM = 1,
130  };
131  
132  /**
133   * enum spectral_scan_priority: Spectral scan priority
134   * @SPECTRAL_SCAN_PRIORITY_LOW: Low priority Spectral scan
135   * @SPECTRAL_SCAN_PRIORITY_HIGH: High priority Spectral scan
136   */
137  enum spectral_scan_priority {
138  	SPECTRAL_SCAN_PRIORITY_LOW = 0,
139  	SPECTRAL_SCAN_PRIORITY_HIGH = 1,
140  };
141  
142  /**
143   * enum spectral_fft_size : FFT size values
144   * @SPECTRAL_FFT_SIZE_INVALID: Invalid FFT size
145   * @SPECTRAL_FFT_SIZE_1: FFT size 1
146   * @SPECTRAL_FFT_SIZE_2: FFT size 2
147   * @SPECTRAL_FFT_SIZE_3: FFT size 3
148   * @SPECTRAL_FFT_SIZE_4: FFT size 4
149   * @SPECTRAL_FFT_SIZE_5: FFT size 5
150   * @SPECTRAL_FFT_SIZE_6: FFT size 6
151   * @SPECTRAL_FFT_SIZE_7: FFT size 7
152   * @SPECTRAL_FFT_SIZE_8: FFT size 8
153   * @SPECTRAL_FFT_SIZE_9: FFT size 9
154   * @SPECTRAL_FFT_SIZE_10: FFT size 10
155   * @SPECTRAL_FFT_SIZE_MAX: Max number of FFT size
156   */
157  enum spectral_fft_size {
158  	SPECTRAL_FFT_SIZE_INVALID,
159  	SPECTRAL_FFT_SIZE_1,
160  	SPECTRAL_FFT_SIZE_2,
161  	SPECTRAL_FFT_SIZE_3,
162  	SPECTRAL_FFT_SIZE_4,
163  	SPECTRAL_FFT_SIZE_5,
164  	SPECTRAL_FFT_SIZE_6,
165  	SPECTRAL_FFT_SIZE_7,
166  	SPECTRAL_FFT_SIZE_8,
167  	SPECTRAL_FFT_SIZE_9,
168  	SPECTRAL_FFT_SIZE_10,
169  	SPECTRAL_FFT_SIZE_MAX,
170  };
171  
172  /**
173   * enum spectral_scan_mode - Spectral scan mode
174   * @SPECTRAL_SCAN_MODE_NORMAL: Normal mode
175   * @SPECTRAL_SCAN_MODE_AGILE: Agile mode
176   * @SPECTRAL_SCAN_MODE_MAX: Max number of Spectral modes
177   * @SPECTRAL_SCAN_MODE_INVALID: Invalid Spectral mode
178   */
179  enum spectral_scan_mode {
180  	SPECTRAL_SCAN_MODE_NORMAL,
181  	SPECTRAL_SCAN_MODE_AGILE,
182  	SPECTRAL_SCAN_MODE_MAX,
183  	SPECTRAL_SCAN_MODE_INVALID = 0xff,
184  };
185  
186  /**
187   * enum spectral_chan_width - Spectral-specific channel width enum
188   * @SPECTRAL_CH_WIDTH_20MHZ: 20 mhz width
189   * @SPECTRAL_CH_WIDTH_40MHZ: 40 mhz width
190   * @SPECTRAL_CH_WIDTH_80MHZ: 80 mhz width
191   * @SPECTRAL_CH_WIDTH_160MHZ: 160 mhz width
192   * @SPECTRAL_CH_WIDTH_80P80MHZ: 80+80 mhz width
193   * @SPECTRAL_CH_WIDTH_5MHZ: 5 mhz width
194   * @SPECTRAL_CH_WIDTH_10MHZ: 10 mhz width
195   * @SPECTRAL_CH_WIDTH_320MHZ: 320 mhz width
196   * @SPECTRAL_CH_WIDTH_MAX: Max possible width
197   * @SPECTRAL_CH_WIDTH_INVALID: invalid width
198   */
199  enum spectral_chan_width {
200  	SPECTRAL_CH_WIDTH_20MHZ,
201  	SPECTRAL_CH_WIDTH_40MHZ,
202  	SPECTRAL_CH_WIDTH_80MHZ,
203  	SPECTRAL_CH_WIDTH_160MHZ,
204  	SPECTRAL_CH_WIDTH_80P80MHZ,
205  	SPECTRAL_CH_WIDTH_320MHZ,
206  	SPECTRAL_CH_WIDTH_5MHZ,
207  	SPECTRAL_CH_WIDTH_10MHZ,
208  	SPECTRAL_CH_WIDTH_MAX,
209  	SPECTRAL_CH_WIDTH_INVALID,
210  };
211  
212  struct spectral_ioctl_params {
213  	int16_t   spectral_fft_period;
214  	int16_t   pectral_period;
215  	int16_t   spectral_count;
216  	uint16_t spectral_short_report;
217  	uint16_t spectral_pri;
218  };
219  
220  /**
221   * enum spectral_cap_hw_gen - Definitions for the Spectral hardware generation.
222   * This corresponds to definitions in qca_wlan_vendor_spectral_scan_cap_hw_gen.
223   * @SPECTRAL_CAP_HW_GEN_1: Generation 1
224   * @SPECTRAL_CAP_HW_GEN_2: Generation 2
225   * @SPECTRAL_CAP_HW_GEN_3: Generation 3
226   */
227  enum spectral_cap_hw_gen {
228  	SPECTRAL_CAP_HW_GEN_1 = 0,
229  	SPECTRAL_CAP_HW_GEN_2 = 1,
230  	SPECTRAL_CAP_HW_GEN_3 = 2,
231  };
232  
233  /**
234   * struct spectral_config_frequency - Spectral scan frequency
235   * @cfreq1: Center frequency (in MHz) of the span of interest(primary 80 MHz
236   *          span for 80 + 80 agile scan request) or center frequency (in MHz)
237   *          of any WLAN channel in the span of interest.
238   * @cfreq2: Applicable only for Agile Spectral scan request in 80+80 MHz mode.
239   *          For 80+80 mode it represents  the center frequency (in MHz) of the
240   *          secondary 80 MHz span of interest or center frequency (in MHz) of
241   *          any WLAN channel in the secondary 80 MHz span of interest.
242   */
243  struct spectral_config_frequency {
244  	uint32_t cfreq1;
245  	uint32_t cfreq2;
246  };
247  
248  /**
249   * struct spectral_config - spectral config parameters
250   * @ss_fft_period:        Skip interval for FFT reports
251   * @ss_period:            Spectral scan period
252   * @ss_recapture:         Set this to allow FFT recapture if scan period > 52us
253   * @ss_count:             # of reports to return from ss_active
254   * @ss_short_report:      Set to report only 1 set of FFT results
255   * @radar_bin_thresh_sel: Select threshold to classify strong bin for FFT
256   * @ss_spectral_pri:      Priority, and are we doing a noise power cal ?
257   * @ss_fft_size:          Defines the number of FFT data points to compute,
258   *                        defined as a log index num_fft_pts =
259   *                        2^ss_fft_size
260   * @ss_gc_ena:            Set, to enable targeted gain change before
261   *                        starting the spectral scan FFT
262   * @ss_restart_ena:       Set, to enable abort of receive frames when in high
263   *                        priority and a spectral scan is queued
264   * @ss_noise_floor_ref:   Noise floor reference number (signed) for the
265   *                        calculation of bin power (dBm) Though stored as an
266   *                        unsigned this should be treated as a signed 8-bit int.
267   * @ss_init_delay:        Disallow spectral scan triggers after tx/rx packets
268   *                        by setting this delay value to roughly SIFS time
269   *                        period or greater Delay timer count in units of 0.25us
270   * @ss_nb_tone_thr:       Number of strong bins (inclusive) per sub-channel,
271   *                        below which a signal is declared a narrowband tone
272   * @ss_str_bin_thr:       Bin/max_bin ratio threshold over which a bin is
273   *                        declared strong (for spectral scan bandwidth analysis)
274   * @ss_wb_rpt_mode:       Set this bit to report spectral scans as EXT_BLOCKER
275   *                        (phy_error=36), if none of the sub-channels are
276   *                        deemed narrowband
277   * @ss_rssi_rpt_mode:     Set this bit to report spectral scans as EXT_BLOCKER
278   *                        (phy_error=36), if the ADC RSSI is below the
279   *                        threshold ss_rssi_thr
280   * @ss_rssi_thr:          ADC RSSI must be greater than or equal to this
281   *                        threshold (signed Db) to ensure spectral scan
282   *                        reporting with normal phy error codes (please see
283   *                        ss_rssi_rpt_mode above).Though stored as an unsigned
284   *                        value, this should be treated as a signed 8-bit int
285   * @ss_pwr_format:        Format of frequency bin magnitude for spectral scan
286   *                        triggered FFTs 0: linear magnitude
287   *                        1: log magnitude (20*log10(lin_mag), 1/2 dB step size)
288   * @ss_rpt_mode:          Format of per-FFT reports to software for spectral
289   *                        scan triggered FFTs
290   *                        0: No FFT report (only pulse end summary)
291   *                        1: 2-dword summary of metrics for each completed FFT
292   *                        2: 2-dword summary + 1x-oversampled bins(in-band) per
293   *                           FFT
294   *                        3: 2-dword summary + 2x-oversampled bins (all) per FFT
295   * @ss_bin_scale:         Number of LSBs to shift out to scale the FFT bins
296   *                        for spectral scan triggered FFTs
297   * @ss_dbm_adj:           Set (with ss_pwr_format=1), to report bin
298   *                        magnitudes
299   *                        converted to dBm power using the noisefloor
300   *                        calibration results
301   * @ss_chn_mask:          Per chain enable mask to select input ADC for search
302   *                        FFT
303   * @ss_nf_cal:            nf calibrated values for ctl+ext
304   * @ss_nf_pwr:            nf pwr values for ctl+ext
305   * @ss_nf_temp_data:      temperature data taken during nf scan
306   * @ss_frequency:         This specifies the frequency span over which Spectral
307   *                        scan would be carried out. Its value depends on the
308   *                        Spectral scan mode.
309   *                        Normal mode:-
310   *                          Not applicable. Spectral scan would happen in the
311   *                          operating span.
312   *                        Agile mode:-
313   *                          cfreq1 represents the center frequency (in MHz) of
314   *                          the span of interest(primary 80 MHz span for 80 + 80
315   *                          agile scan request) or center frequency (in MHz) of
316   *                          any WLAN channel in the span of interest. cfreq2 is
317   *                          applicable only for Agile Spectral scan request in
318   *                          80+80 MHz mode. For 80+80 mode it represents  the
319   *                          center frequency (in MHz) of the secondary 80 MHz
320   *                          span of interest or center frequency (in MHz) of
321   *                          any WLAN channel in the secondary 80 MHz span of
322   *                          interest.
323   * @ss_bandwidth: Spectral scan bandwidth
324   */
325  struct spectral_config {
326  	uint16_t ss_fft_period;
327  	uint16_t ss_period;
328  	uint16_t ss_recapture;
329  	uint16_t ss_count;
330  	uint16_t ss_short_report;
331  	uint8_t radar_bin_thresh_sel;
332  	uint16_t ss_spectral_pri;
333  	uint16_t ss_fft_size;
334  	uint16_t ss_gc_ena;
335  	uint16_t ss_restart_ena;
336  	uint16_t ss_noise_floor_ref;
337  	uint16_t ss_init_delay;
338  	uint16_t ss_nb_tone_thr;
339  	uint16_t ss_str_bin_thr;
340  	uint16_t ss_wb_rpt_mode;
341  	uint16_t ss_rssi_rpt_mode;
342  	uint16_t ss_rssi_thr;
343  	uint16_t ss_pwr_format;
344  	uint16_t ss_rpt_mode;
345  	uint16_t ss_bin_scale;
346  	uint16_t ss_dbm_adj;
347  	uint16_t ss_chn_mask;
348  	int8_t ss_nf_cal[AH_MAX_CHAINS * 2];
349  	int8_t ss_nf_pwr[AH_MAX_CHAINS * 2];
350  	int32_t ss_nf_temp_data;
351  	struct spectral_config_frequency ss_frequency;
352  	uint16_t ss_bandwidth;
353  };
354  
355  /**
356   * struct spectral_caps - Spectral capabilities structure
357   * @phydiag_cap:         Phydiag capability
358   * @radar_cap:           Radar detection capability
359   * @spectral_cap:        Spectral capability
360   * @advncd_spectral_cap: Advanced spectral capability
361   * @hw_gen: Spectral hw generation as defined in spectral_cap_hw_gen
362   * @is_scaling_params_populated: indicates whether scaling params is populated
363   * @formula_id: formula_id
364   * @low_level_offset: low_level_offset
365   * @high_level_offset: high_level_offset
366   * @rssi_thr: rssi_thr
367   * @default_agc_max_gain: default_agc_max_gain
368   * @agile_spectral_cap: agile Spectral capability for 20/40/80
369   * @agile_spectral_cap_160: agile Spectral capability for 160 MHz
370   * @agile_spectral_cap_80p80: agile Spectral capability for 80p80
371   * @agile_spectral_cap_320: agile Spectral capability for 320 MHz
372   * @num_detectors_20mhz: number of Spectral detectors in 20 MHz
373   * @num_detectors_40mhz: number of Spectral detectors in 40 MHz
374   * @num_detectors_80mhz: number of Spectral detectors in 80 MHz
375   * @num_detectors_160mhz: number of Spectral detectors in 160 MHz
376   * @num_detectors_80p80mhz: number of Spectral detectors in 80p80 MHz
377   * @num_detectors_320mhz: number of Spectral detectors in 320 MHz
378   */
379  struct spectral_caps {
380  	uint8_t phydiag_cap;
381  	uint8_t radar_cap;
382  	uint8_t spectral_cap;
383  	uint8_t advncd_spectral_cap;
384  	uint32_t hw_gen;
385  	bool is_scaling_params_populated;
386  	uint16_t formula_id;
387  	int16_t low_level_offset;
388  	int16_t high_level_offset;
389  	int16_t rssi_thr;
390  	uint8_t default_agc_max_gain;
391  	bool agile_spectral_cap;
392  	bool agile_spectral_cap_160;
393  	bool agile_spectral_cap_80p80;
394  	bool agile_spectral_cap_320;
395  	uint32_t num_detectors_20mhz;
396  	uint32_t num_detectors_40mhz;
397  	uint32_t num_detectors_80mhz;
398  	uint32_t num_detectors_160mhz;
399  	uint32_t num_detectors_80p80mhz;
400  	uint32_t num_detectors_320mhz;
401  };
402  
403  #define SPECTRAL_IOCTL_PARAM_NOVAL (65535)
404  
405  #define MAX_SPECTRAL_CHAINS           (3)
406  #define MAX_NUM_BINS                  (2048)
407  #define MAX_NUM_BINS_PRI80            (1024)
408  #define MAX_NUM_BINS_SEC80            (520)
409  #define MAX_NUM_BINS_5MHZ             (32)
410  /* 5 categories x (lower + upper) bands */
411  #define MAX_INTERF                   10
412  #define SPECTRAL_MAC_ADDR_SIZE        (6)
413  #define MAX_NUM_FREQ_SPANS            (3)
414  #define MAX_NUM_DETECTORS             (2)
415  #define MAX_SPECTRAL_PAYLOAD          (3028)
416  
417  #define SPECTRAL_RECAPTURE_SCAN_PERIOD_THRESHOLD   (52)
418  
419  /**
420   * enum dcs_int_type - Interference type indicated by DCS
421   * @SPECTRAL_DCS_INT_NONE:  No interference
422   * @SPECTRAL_DCS_INT_CW:  CW interference
423   * @SPECTRAL_DCS_INT_WIFI:  WLAN interference
424   */
425  enum dcs_int_type {
426  	SPECTRAL_DCS_INT_NONE,
427  	SPECTRAL_DCS_INT_CW,
428  	SPECTRAL_DCS_INT_WIFI
429  };
430  
431  /**
432   * struct interf_rsp - Interference record
433   * @interf_type:         eINTERF_TYPE giving type of interference
434   * @interf_min_freq:     Minimum frequency in MHz at which interference has been
435   * found
436   * @interf_max_freq:     Maximum frequency in MHz at which interference has been
437   * found
438   * @advncd_spectral_cap: Advanced spectral capability
439   */
440  struct interf_rsp {
441  	uint8_t interf_type;
442  	uint16_t interf_min_freq;
443  	uint16_t interf_max_freq;
444  } __packed;
445  
446  /**
447   * struct interf_src_rsp - List of interference sources
448   * @count: Number of interference records
449   * @interf: Array of interference records
450   */
451  struct interf_src_rsp {
452  	uint16_t count;
453  	struct interf_rsp interf[MAX_INTERF];
454  } __packed;
455  
456  /**
457   * struct spectral_classifier_params - spectral classifier parameters
458   * @spectral_20_40_mode:  Is AP in 20/40 mode?
459   * @spectral_dc_index:    DC index
460   * @spectral_dc_in_mhz:   DC in MHz
461   * @upper_chan_in_mhz:    Upper channel in MHz
462   * @lower_chan_in_mhz:    Lower channel in MHz
463   */
464  struct spectral_classifier_params {
465  	int spectral_20_40_mode;
466  	int spectral_dc_index;
467  	int spectral_dc_in_mhz;
468  	int upper_chan_in_mhz;
469  	int lower_chan_in_mhz;
470  } __packed;
471  
472  #ifdef OPTIMIZED_SAMP_MESSAGE
473  /**
474   * struct samp_edge_extra_bin_info - Spectral edge extra bins Information
475   * For 11ac chipsets prior to AR900B version 2.0, a max of 512 bins are
476   * delivered.  However, there can be additional bins reported for
477   * AR900B version 2.0 and QCA9984 as described next:
478   * AR900B version 2.0: An additional tone is processed on the right
479   * hand side in order to facilitate detection of radar pulses out to
480   * the extreme band-edge of the channel frequency.
481   * Since the HW design processes four tones at a time,
482   * this requires one additional Dword to be added to the
483   * search FFT report.
484   * QCA9984: When spectral_scan_rpt_mode=2, i.e 2-dword summary +
485   * 1x-oversampled bins (in-band) per FFT,
486   * then 8 more bins (4 more on left side and 4 more on right side)
487   * are added.
488   *
489   * @num_bins: Number of edge extra bins
490   * @start_bin_idx: Indicates the start index of extra bins
491   */
492  struct samp_edge_extra_bin_info {
493  	uint16_t num_bins;
494  	uint16_t start_bin_idx;
495  } __packed;
496  
497  /* Compile time assert to check struct size is divisible by 4 Bytes */
498  SPECTRAL_COMPILE_TIME_ASSERT(struct_samp_edge_extra_bin_size_4byte_assertion,
499  			     (sizeof(struct samp_edge_extra_bin_info) % 4)
500  			     == 0);
501  
502  /**
503   * struct samp_detector_info - SAMP per-detector information
504   * A detector here refers to the HW carrying out the Spectral scan, to
505   * detect the presence of interferences.
506   * @start_frequency: Indicates start frequency per-detector (in MHz)
507   * @end_frequency: Indicates last frequency per-detector (in MHz)
508   * @timestamp: Indicates Spectral HW timestamp (usec)
509   * @last_tstamp: Indicates the last time stamp
510   * @last_raw_timestamp: Previous FFT report's raw timestamp. In case of
511   * 160Mhz it will be primary 80 segment's timestamp as both primary & secondary
512   * segment's timestamp are expected to be almost equal.
513   * @timestamp_war_offset: Offset calculated based on reset_delay and
514   * last_raw_timestamp. It will be added to raw_timestamp to get timestamp.
515   * @raw_timestamp: Actual FFT timestamp reported by HW
516   * @reset_delay: Time gap between the last spectral report before reset and the
517   * end of reset. It is provided by FW via direct DMA framework.
518   * @left_edge_bins: Number of extra bins on left band edge
519   * @right_edge_bins: Number of extra bins on right band edge
520   * @start_bin_idx: Indicates the first bin index per-detector
521   * @end_bin_idx: Indicates the last bin index per-detector
522   * @max_index: Indicates the index of max magnitude
523   * @max_magnitude: Indicates the maximum magnitude
524   * @noise_floor: Indicates the current noise floor
525   * @rssi: Indicates RSSI
526   * @agc_total_gain:
527   * @gainchange:
528   * @pri80ind: Indication from hardware that the sample was received on the
529   * primary 80 MHz segment. If this is set for smode = SPECTRAL_SCAN_MODE_AGILE,
530   * it indicates that Spectral scan was carried out on pri80 instead of the
531   * Agile frequency due to a channel switch - Software may choose to ignore
532   * the sample in this case.
533   * @is_sec80: Indicates whether the frequency span corresponds to pri80 or
534   * sec80 (only applicable for 160/80p80 operating_bw for
535   * smode SPECTRAL_SCAN_MODE_NORMAL)
536   * @blanking_status: Indicates whether scan blanking was enabled during this
537   * spectral report capture. This field is applicable only when scan blanking
538   * feature is enabled. When scan blanking feature is disabled, this field
539   * will be set to zero.
540   * @padding_detector_info: padding bytes
541   */
542  struct samp_detector_info {
543  	uint32_t start_frequency;
544  	uint32_t end_frequency;
545  	uint32_t timestamp;
546  	uint32_t last_tstamp;
547  	uint32_t last_raw_timestamp;
548  	uint32_t timestamp_war_offset;
549  	uint32_t raw_timestamp;
550  	uint32_t reset_delay;
551  	struct samp_edge_extra_bin_info left_edge_bins;
552  	struct samp_edge_extra_bin_info right_edge_bins;
553  	uint16_t start_bin_idx;
554  	uint16_t end_bin_idx;
555  	uint16_t max_index;
556  	uint16_t max_magnitude;
557  	int16_t noise_floor;
558  	int8_t rssi;
559  	uint8_t agc_total_gain;
560  	uint8_t gainchange;
561  	uint8_t pri80ind;
562  	uint8_t is_sec80;
563  	uint8_t blanking_status;
564  	/* Padding bits to make struct size multiple of 4 bytes */
565  	uint8_t padding_detector_info[];
566  } __packed;
567  
568  /* Compile time assert to check struct size is divisible by 4 Bytes */
569  SPECTRAL_COMPILE_TIME_ASSERT(struct_samp_detector_info_size_4byte_assertion,
570  			     (sizeof(struct samp_detector_info) % 4) == 0);
571  
572  /**
573   * struct samp_freq_span_info - SAMP per-frequency span information
574   * A frequency span here refers to a contiguous span of frequencies in which
575   * Spectral scan and interference detection is carried out.
576   * @detector_info: Per-detector Spectral information
577   * @num_detectors: Number of detectors per span
578   * @padding_span_info: padding bytes
579   */
580  struct samp_freq_span_info {
581  	struct samp_detector_info detector_info[MAX_NUM_DETECTORS];
582  	uint8_t num_detectors;
583  	/* Padding bits to make struct size multiple of 4 bytes */
584  	uint8_t padding_span_info[3];
585  } __packed;
586  
587  /* Compile time assert to check struct size is divisible by 4 Bytes */
588  SPECTRAL_COMPILE_TIME_ASSERT(struct_samp_freq_span_info_size_4byte_assertion,
589  			     (sizeof(struct samp_freq_span_info) % 4) == 0);
590  
591  /**
592   * struct spectral_samp_msg - Spectral SAMP message
593   * @signature: Validates the SAMP message
594   * @target_reset_count: Indicates the number of times target went through
595   * reset routine after spectral was enabled.
596   * @pri20_freq: Primary 20MHz operating frequency in MHz
597   * @cfreq1: Segment 1 centre frequency in MHz
598   * @cfreq2: For 80p80, indicates segment 2 centre frequency in MHz. For 160MHz,
599   * indicates the center frequency of 160MHz span.
600   * @sscan_cfreq1: Normal/Agile scan Center frequency for Segment 1
601   * based on Spectral Scan mode.
602   * @sscan_cfreq2: Normal/Agile scan Center frequency for Segment 2 in case of
603   * 80p80, and for 160MHz center frequency of the 160MHz span based on Spectral
604   * Scan mode.
605   * @bin_pwr_count: Indicates the number of FFT bins
606   * @freq_span_info: Spectral per-contiguous frequency span information
607   * @spectral_upper_rssi: Indicates RSSI of upper band
608   * @spectral_lower_rssi: Indicates RSSI of lower band
609   * @spectral_chain_ctl_rssi: RSSI for control channel, for all antennas
610   * @spectral_chain_ext_rssi: RSSI for extension channel, for all antennas
611   * @macaddr: Indicates the device interface
612   * @spectral_mode: Spectral scan mode
613   * @operating_bw: Device's operating bandwidth. Values = enum phy_ch_width
614   * @sscan_bw: Normal/Agile Scan BW based on Spectral scan mode.
615   * Values = enum phy_ch_width
616   * @fft_width: Indicates the number of bits representing an FFT bin
617   * @dcs_enabled: Whether DCS is enabled
618   * @int_type: Interference type indicated by DCS. Values = enum dcs_int_type
619   * @num_freq_spans: Number of contiguous frequency spans in operating bandwidth
620   * @bin_pwr: Contains FFT magnitudes
621   */
622  struct spectral_samp_msg {
623  	uint32_t signature;
624  	uint32_t target_reset_count;
625  	uint32_t pri20_freq;
626  	uint32_t cfreq1;
627  	uint32_t cfreq2;
628  	uint32_t sscan_cfreq1;
629  	uint32_t sscan_cfreq2;
630  	uint32_t bin_pwr_count;
631  	struct samp_freq_span_info freq_span_info[MAX_NUM_FREQ_SPANS];
632  	int8_t spectral_lower_rssi;
633  	int8_t spectral_upper_rssi;
634  	int8_t spectral_chain_ctl_rssi[MAX_SPECTRAL_CHAINS];
635  	int8_t spectral_chain_ext_rssi[MAX_SPECTRAL_CHAINS];
636  	uint8_t macaddr[SPECTRAL_MAC_ADDR_SIZE];
637  	uint8_t spectral_mode;
638  	uint8_t operating_bw;
639  	uint8_t sscan_bw;
640  	uint8_t fft_width;
641  	uint8_t dcs_enabled;
642  	uint8_t int_type;
643  	uint8_t num_freq_spans;
644  	uint8_t bin_pwr[];  /*This should be the last item in the structure*/
645  } __packed;
646  
647  #else
648  /**
649   * struct spectral_samp_data - Spectral Analysis Messaging Protocol Data format
650   * @spectral_data_len:        Indicates the bin size
651   * @spectral_data_len_sec80:  Indicates the bin size for secondary 80 segment
652   * @spectral_rssi:            Indicates RSSI
653   * @spectral_rssi_sec80:      Indicates RSSI for secondary 80 segment
654   * @spectral_combined_rssi:   Indicates combined RSSI from all antennas
655   * @spectral_upper_rssi:      Indicates RSSI of upper band
656   * @spectral_lower_rssi:      Indicates RSSI of lower band
657   * @spectral_chain_ctl_rssi:  RSSI for control channel, for all antennas
658   * @spectral_chain_ext_rssi:  RSSI for extension channel, for all antennas
659   * @spectral_max_scale:       Indicates scale factor
660   * @spectral_bwinfo:          Indicates bandwidth info
661   * @spectral_tstamp:          Indicates timestamp
662   * @spectral_max_index:       Indicates the index of max magnitude
663   * @spectral_max_index_sec80: Indicates the index of max magnitude for secondary
664   *                            80 segment
665   * @spectral_max_mag:         Indicates the maximum magnitude
666   * @spectral_max_mag_sec80:   Indicates the maximum magnitude for secondary 80
667   *                            segment
668   * @spectral_max_exp:         Indicates the max exp
669   * @spectral_last_tstamp:     Indicates the last time stamp
670   * @spectral_upper_max_index: Indicates the index of max mag in upper band
671   * @spectral_lower_max_index: Indicates the index of max mag in lower band
672   * @spectral_nb_upper:        Not Used
673   * @spectral_nb_lower:        Not Used
674   * @classifier_params:        Indicates classifier parameters
675   * @bin_pwr_count:            Indicates the number of FFT bins
676   * @lb_edge_extrabins:        Number of extra bins on left band edge
677   * @rb_edge_extrabins:        Number of extra bins on right band edge
678   * @bin_pwr_count_sec80:      Indicates the number of FFT bins in secondary 80
679   *                            segment
680   * @bin_pwr:                  Contains FFT magnitudes
681   * @bin_pwr_sec80:            Contains FFT magnitudes for the secondary 80
682   *                            segment
683   * @interf_list:              List of interference sources
684   * @noise_floor:              Indicates the current noise floor
685   * @noise_floor_sec80:        Indicates the current noise floor for secondary 80
686   *                            segment
687   * @ch_width:                 Channel width 20/40/80/160 MHz
688   * @spectral_agc_total_gain:
689   * @spectral_agc_total_gain_sec80:
690   * @spectral_gainchange:
691   * @spectral_gainchange_sec80:
692   * @spectral_mode:            Spectral scan mode
693   * @spectral_pri80ind:        Indication from hardware that the sample was
694   *                            received on the primary 80 MHz segment. If this
695   *                            is set when smode = SPECTRAL_SCAN_MODE_AGILE, it
696   *                            indicates that Spectral was carried out on pri80
697   *                            instead of the Agile frequency due to a
698   *                            channel switch - Software may choose
699   *                            to ignore the sample in this case.
700   * @spectral_pri80ind_sec80:  Indication from hardware that the sample was
701   *                            received on the primary 80 MHz segment instead of
702   *                            the secondary 80 MHz segment due to a channel
703   *                            switch - Software may choose to ignore the sample
704   *                            if this is set. Applicable only if smode =
705   *                            SPECTRAL_SCAN_MODE_NORMAL and for 160/80+80 MHz
706   *                            Spectral operation.
707   * @last_raw_timestamp:       Previous FFT report's raw timestamp. In case of
708   *                            160Mhz it will be primary 80 segment's timestamp
709   *                            as both primary & secondary segment's timestamp
710   *                            are expected to be almost equal.
711   * @timestamp_war_offset:     Offset calculated based on reset_delay and
712   *                            last_raw_timestamp. It will be added to
713   *                            raw_timestamp to get spectral_tstamp.
714   * @raw_timestamp:            Actual FFT timestamp reported by HW on primary
715   *                            segment.
716   * @raw_timestamp_sec80:      Actual FFT timestamp reported by HW on sec80 MHz
717   *                            segment.
718   * @reset_delay:              Time gap between the last spectral report before
719   *                            reset and the end of reset. It is provided by FW
720   *                            via direct DMA framework.
721   * @target_reset_count:       Indicates the number of times target went through
722   *                            reset routine after spectral was enabled.
723   * @agile_ch_width:
724   * @bin_pwr_count_5mhz:       Indicates the number of FFT bins in the extra
725   *                            5 MHz for 165 MHz/ Restricted 80p80 mode
726   * @bin_pwr_5mhz:             Contains FFT magnitudes corresponding to the extra
727   *                            5 MHz in 165 MHz/ Restricted 80p80 mode
728   */
729  struct spectral_samp_data {
730  	int16_t spectral_data_len;
731  	int16_t spectral_data_len_sec80;
732  	int16_t spectral_rssi;
733  	int16_t spectral_rssi_sec80;
734  	int8_t spectral_combined_rssi;
735  	int8_t spectral_upper_rssi;
736  	int8_t spectral_lower_rssi;
737  	int8_t spectral_chain_ctl_rssi[MAX_SPECTRAL_CHAINS];
738  	int8_t spectral_chain_ext_rssi[MAX_SPECTRAL_CHAINS];
739  	uint8_t spectral_max_scale;
740  	int16_t spectral_bwinfo;
741  	int32_t spectral_tstamp;
742  	int16_t spectral_max_index;
743  	int16_t spectral_max_index_sec80;
744  	int16_t spectral_max_mag;
745  	int16_t spectral_max_mag_sec80;
746  	uint8_t spectral_max_exp;
747  	int32_t spectral_last_tstamp;
748  	int16_t spectral_upper_max_index;
749  	int16_t spectral_lower_max_index;
750  	uint8_t spectral_nb_upper;
751  	uint8_t spectral_nb_lower;
752  	struct spectral_classifier_params classifier_params;
753  	uint16_t bin_pwr_count;
754  	/*
755  	 * For 11ac chipsets prior to AR900B version 2.0, a max of 512 bins are
756  	 * delivered.  However, there can be additional bins reported for
757  	 * AR900B version 2.0 and QCA9984 as described next:
758  	 *
759  	 * AR900B version 2.0: An additional tone is processed on the right
760  	 * hand side in order to facilitate detection of radar pulses out to
761  	 * the extreme band-edge of the channel frequency.
762  	 * Since the HW design processes four tones at a time,
763  	 * this requires one additional Dword to be added to the
764  	 * search FFT report.
765  	 *
766  	 * QCA9984: When spectral_scan_rpt_mode=2, i.e 2-dword summary +
767  	 * 1x-oversampled bins (in-band) per FFT,
768  	 * then 8 more bins (4 more on left side and 4 more on right side)
769  	 * are added.
770  	 */
771  	uint8_t lb_edge_extrabins;
772  	uint8_t rb_edge_extrabins;
773  	uint16_t bin_pwr_count_sec80;
774  	uint8_t bin_pwr[MAX_NUM_BINS_PRI80];
775  	uint8_t bin_pwr_sec80[MAX_NUM_BINS_SEC80];
776  	struct interf_src_rsp interf_list;
777  	int16_t noise_floor;
778  	int16_t noise_floor_sec80;
779  	uint32_t ch_width;
780  	uint8_t spectral_agc_total_gain;
781  	uint8_t spectral_agc_total_gain_sec80;
782  	uint8_t spectral_gainchange;
783  	uint8_t spectral_gainchange_sec80;
784  	enum spectral_scan_mode spectral_mode;
785  	uint8_t spectral_pri80ind;
786  	uint8_t spectral_pri80ind_sec80;
787  	uint32_t last_raw_timestamp;
788  	uint32_t timestamp_war_offset;
789  	uint32_t raw_timestamp;
790  	uint32_t raw_timestamp_sec80;
791  	uint32_t reset_delay;
792  	uint32_t target_reset_count;
793  	uint32_t agile_ch_width;
794  	uint16_t bin_pwr_count_5mhz;
795  	uint8_t bin_pwr_5mhz[MAX_NUM_BINS_5MHZ];
796  } __packed;
797  
798  /**
799   * struct spectral_samp_msg - Spectral SAMP message
800   * @signature:          Validates the SAMP message
801   * @freq:               Operating frequency in MHz
802   * @vhtop_ch_freq_seg1: VHT Segment 1 centre frequency in MHz
803   * @vhtop_ch_freq_seg2: VHT Segment 2 centre frequency in MHz
804   * @agile_freq1:        Center frequency in MHz of the entire span(for 80+80 MHz
805   *                      agile Scan it is primary 80 MHz span) across which
806   *                      Agile Spectral is carried out. Applicable only for Agile
807   *                      Spectral samples.
808   * @agile_freq2:        Center frequency in MHz of the secondary 80 MHz span
809   *                      across which Agile Spectral is carried out. Applicable
810   *                      only for Agile Spectral samples in 80+80 MHz mode.
811   * @freq_loading:       How busy was the channel
812   * @dcs_enabled:        Whether DCS is enabled
813   * @int_type:           Interference type indicated by DCS
814   * @macaddr:            Indicates the device interface
815   * @samp_data:          SAMP Data
816   */
817  struct spectral_samp_msg {
818  	uint32_t signature;
819  	uint16_t freq;
820  	uint16_t vhtop_ch_freq_seg1;
821  	uint16_t vhtop_ch_freq_seg2;
822  	uint16_t agile_freq1;
823  	uint16_t agile_freq2;
824  	uint16_t freq_loading;
825  	uint16_t dcs_enabled;
826  	enum dcs_int_type int_type;
827  	uint8_t macaddr[6];
828  	struct spectral_samp_data samp_data;
829  } __packed;
830  
831  #endif /* OPTIMIZED_SAMP_MESSAGE */
832  #endif
833