wlan_spectral_public_structs.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /*
  2. * Copyright (c) 2011,2017-2019 The Linux Foundation. All rights reserved.
  3. *
  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. #include <qdf_types.h>
  20. #include "wlan_dfs_ioctl.h"
  21. #include <spectral_ioctl.h>
  22. #ifndef __KERNEL__
  23. #include <math.h>
  24. #endif /* __KERNEL__ */
  25. #ifndef _WLAN_SPECTRAL_PUBLIC_STRUCTS_H_
  26. #define _WLAN_SPECTRAL_PUBLIC_STRUCTS_H_
  27. #ifndef AH_MAX_CHAINS
  28. #define AH_MAX_CHAINS 3
  29. #endif
  30. #define MAX_NUM_CHANNELS 255
  31. #define SPECTRAL_PHYERR_PARAM_NOVAL 65535
  32. #ifdef SPECTRAL_USE_EMU_DEFAULTS
  33. /* Use defaults from emulation */
  34. #define SPECTRAL_SCAN_ACTIVE_DEFAULT (0x0)
  35. #define SPECTRAL_SCAN_ENABLE_DEFAULT (0x0)
  36. #define SPECTRAL_SCAN_COUNT_DEFAULT (0x0)
  37. #define SPECTRAL_SCAN_PERIOD_DEFAULT (250)
  38. #define SPECTRAL_SCAN_PRIORITY_DEFAULT (0x1)
  39. #define SPECTRAL_SCAN_FFT_SIZE_DEFAULT (0x7)
  40. #define SPECTRAL_SCAN_GC_ENA_DEFAULT (0x1)
  41. #define SPECTRAL_SCAN_RESTART_ENA_DEFAULT (0x0)
  42. #define SPECTRAL_SCAN_NOISE_FLOOR_REF_DEFAULT (0xa0)
  43. #define SPECTRAL_SCAN_INIT_DELAY_DEFAULT (0x50)
  44. #define SPECTRAL_SCAN_NB_TONE_THR_DEFAULT (0xc)
  45. #define SPECTRAL_SCAN_STR_BIN_THR_DEFAULT (0x7)
  46. #define SPECTRAL_SCAN_WB_RPT_MODE_DEFAULT (0x0)
  47. #define SPECTRAL_SCAN_RSSI_RPT_MODE_DEFAULT (0x1)
  48. #define SPECTRAL_SCAN_RSSI_THR_DEFAULT (0xf)
  49. #define SPECTRAL_SCAN_PWR_FORMAT_DEFAULT (0x1)
  50. #define SPECTRAL_SCAN_RPT_MODE_DEFAULT (0x2)
  51. #define SPECTRAL_SCAN_BIN_SCALE_DEFAULT (0x1)
  52. #define SPECTRAL_SCAN_DBM_ADJ_DEFAULT (0x0)
  53. #define SPECTRAL_SCAN_CHN_MASK_DEFAULT (0x1)
  54. #else
  55. /*
  56. * Static default values for spectral state and configuration.
  57. * These definitions should be treated as temporary. Ideally,
  58. * we should get the defaults from firmware - this will be discussed.
  59. *
  60. * Use defaults from Spectral Hardware Micro-Architecture
  61. * document (v1.0)
  62. */
  63. #define SPECTRAL_SCAN_ACTIVE_DEFAULT (0)
  64. #define SPECTRAL_SCAN_ENABLE_DEFAULT (0)
  65. #define SPECTRAL_SCAN_COUNT_DEFAULT (0)
  66. #define SPECTRAL_SCAN_PERIOD_GEN_I_DEFAULT (35)
  67. #define SPECTRAL_SCAN_PERIOD_GEN_II_DEFAULT (35)
  68. #define SPECTRAL_SCAN_PERIOD_GEN_III_DEFAULT (224)
  69. #define SPECTRAL_SCAN_PRIORITY_DEFAULT (1)
  70. #define SPECTRAL_SCAN_FFT_SIZE_DEFAULT (7)
  71. #define SPECTRAL_SCAN_GC_ENA_DEFAULT (1)
  72. #define SPECTRAL_SCAN_RESTART_ENA_DEFAULT (0)
  73. #define SPECTRAL_SCAN_NOISE_FLOOR_REF_DEFAULT (-96)
  74. #define SPECTRAL_SCAN_INIT_DELAY_DEFAULT (80)
  75. #define SPECTRAL_SCAN_NB_TONE_THR_DEFAULT (12)
  76. #define SPECTRAL_SCAN_STR_BIN_THR_DEFAULT (8)
  77. #define SPECTRAL_SCAN_WB_RPT_MODE_DEFAULT (0)
  78. #define SPECTRAL_SCAN_RSSI_RPT_MODE_DEFAULT (0)
  79. #define SPECTRAL_SCAN_RSSI_THR_DEFAULT (0xf0)
  80. #define SPECTRAL_SCAN_PWR_FORMAT_DEFAULT (0)
  81. #define SPECTRAL_SCAN_RPT_MODE_DEFAULT (2)
  82. #define SPECTRAL_SCAN_BIN_SCALE_DEFAULT (1)
  83. #define SPECTRAL_SCAN_DBM_ADJ_DEFAULT (1)
  84. #define SPECTRAL_SCAN_CHN_MASK_DEFAULT (1)
  85. #define SPECTRAL_SCAN_FREQUENCY_DEFAULT (0)
  86. #endif /* SPECTRAL_USE_EMU_DEFAULTS */
  87. /* The below two definitions apply only to pre-11ac chipsets */
  88. #define SPECTRAL_SCAN_SHORT_REPORT_DEFAULT (1)
  89. #define SPECTRAL_SCAN_FFT_PERIOD_DEFAULT (1)
  90. /*
  91. * Definitions to help in scaling of gen3 linear format Spectral bins to values
  92. * similar to those from gen2 chipsets.
  93. */
  94. /*
  95. * Max gain for QCA9984. Since this chipset is a prime representative of gen2
  96. * chipsets, it is chosen for this value.
  97. */
  98. #define SPECTRAL_QCA9984_MAX_GAIN (78)
  99. /* Temporary section for hard-coded values. These need to come from FW. */
  100. /* Max gain for IPQ8074 */
  101. #define SPECTRAL_IPQ8074_DEFAULT_MAX_GAIN_HARDCODE (62)
  102. /*
  103. * Section for values needing tuning per customer platform. These too may need
  104. * to come from FW. To be considered as hard-coded for now.
  105. */
  106. /*
  107. * If customers have a different gain line up than QCA reference designs for
  108. * IPQ8074 and/or QCA9984, they may have to tune the low level threshold and
  109. * the RSSI threshold.
  110. */
  111. #define SPECTRAL_SCALING_LOW_LEVEL_OFFSET (7)
  112. #define SPECTRAL_SCALING_RSSI_THRESH (5)
  113. /*
  114. * If customers set the AGC backoff differently, they may have to tune the high
  115. * level threshold.
  116. */
  117. #define SPECTRAL_SCALING_HIGH_LEVEL_OFFSET (5)
  118. /* End of section for values needing fine tuning. */
  119. /* End of temporary section for hard-coded values */
  120. /**
  121. * enum spectral_msg_buf_type - Spectral message buffer type
  122. * @SPECTRAL_MSG_BUF_NEW: Allocate new buffer
  123. * @SPECTRAL_MSG_BUF_SAVED: Reuse last buffer, used for secondary segment report
  124. * in case of 160 MHz.
  125. */
  126. enum spectral_msg_buf_type {
  127. SPECTRAL_MSG_BUF_NEW,
  128. SPECTRAL_MSG_BUF_SAVED,
  129. SPECTRAL_MSG_BUF_TYPE_MAX,
  130. };
  131. /**
  132. * enum spectral_msg_type - Spectral SAMP message type
  133. * @SPECTRAL_MSG_NORMAL_MODE: Normal mode Spectral SAMP message
  134. * @SPECTRAL_MSG_AGILE_MODE: Agile mode Spectral SAMP message
  135. * @SPECTRAL_MSG_INTERFERENCE_NOTIFICATION: Interference notification to
  136. * external auto channel selection
  137. * entity
  138. * @SPECTRAL_MSG_TYPE_MAX: Spectral SAMP message type max
  139. */
  140. enum spectral_msg_type {
  141. SPECTRAL_MSG_NORMAL_MODE,
  142. SPECTRAL_MSG_AGILE_MODE,
  143. SPECTRAL_MSG_INTERFERENCE_NOTIFICATION,
  144. SPECTRAL_MSG_TYPE_MAX,
  145. };
  146. /**
  147. * enum wlan_cfg80211_spectral_vendorcmd_handler_idx - Indices to cfg80211
  148. * spectral vendor command handlers
  149. * @SPECTRAL_SCAN_START_HANDLER_IDX: Index to SPECTRAL_SCAN_START handler
  150. * @SPECTRAL_SCAN_STOP_HANDLER_IDX: Index to SPECTRAL_SCAN_STOP handler
  151. * @SPECTRAL_SCAN_GET_CONFIG_HANDLER_IDX: Index to SPECTRAL_SCAN_GET_CONFIG
  152. * handler
  153. * @SPECTRAL_SCAN_GET_DIAG_STATS_HANDLER_IDX: Index to
  154. * SPECTRAL_SCAN_GET_DIAG_STATS handler
  155. * @SPECTRAL_SCAN_GET_CAP_HANDLER_IDX: Index to SPECTRAL_SCAN_GET_CAP handler
  156. * @SPECTRAL_SCAN_GET_STATUS_HANDLER_IDX: Index to SPECTRAL_SCAN_GET_STATUS
  157. * handler
  158. * @SPECTRAL_SCAN_VENDOR_CMD_HANDLER_MAX: Number of cfg80211 spectral
  159. * vendor command handlers supported
  160. */
  161. enum wlan_cfg80211_spectral_vendorcmd_handler_idx {
  162. SPECTRAL_SCAN_START_HANDLER_IDX,
  163. SPECTRAL_SCAN_STOP_HANDLER_IDX,
  164. SPECTRAL_SCAN_GET_CONFIG_HANDLER_IDX,
  165. SPECTRAL_SCAN_GET_DIAG_STATS_HANDLER_IDX,
  166. SPECTRAL_SCAN_GET_CAP_HANDLER_IDX,
  167. SPECTRAL_SCAN_GET_STATUS_HANDLER_IDX,
  168. SPECTRAL_SCAN_VENDOR_CMD_HANDLER_MAX,
  169. };
  170. /**
  171. * enum spectral_debug - Spectral debug level
  172. * @DEBUG_SPECTRAL: Minimal SPECTRAL debug
  173. * @DEBUG_SPECTRAL1: Normal SPECTRAL debug
  174. * @DEBUG_SPECTRAL2: Maximal SPECTRAL debug
  175. * @DEBUG_SPECTRAL3: Matched filterID display
  176. * @DEBUG_SPECTRAL4: One time dump of FFT report
  177. */
  178. enum spectral_debug {
  179. DEBUG_SPECTRAL = 0x00000100,
  180. DEBUG_SPECTRAL1 = 0x00000200,
  181. DEBUG_SPECTRAL2 = 0x00000400,
  182. DEBUG_SPECTRAL3 = 0x00000800,
  183. DEBUG_SPECTRAL4 = 0x00001000,
  184. };
  185. /**
  186. * enum spectral_capability_type - Spectral capability type
  187. * @SPECTRAL_CAP_PHYDIAG: Phydiag capability
  188. * @SPECTRAL_CAP_RADAR: Radar detection capability
  189. * @SPECTRAL_CAP_SPECTRAL_SCAN: Spectral capability
  190. * @SPECTRAL_CAP_ADVNCD_SPECTRAL_SCAN: Advanced spectral capability
  191. */
  192. enum spectral_capability_type {
  193. SPECTRAL_CAP_PHYDIAG,
  194. SPECTRAL_CAP_RADAR,
  195. SPECTRAL_CAP_SPECTRAL_SCAN,
  196. SPECTRAL_CAP_ADVNCD_SPECTRAL_SCAN,
  197. };
  198. /**
  199. * enum spectral_cp_error_code - Spectral control path response code
  200. * @SPECTRAL_SCAN_RESP_ERR_INVALID: Invalid error identifier
  201. * @SPECTRAL_SCAN_RESP_ERR_PARAM_UNSUPPORTED: parameter unsupported
  202. * @SPECTRAL_SCAN_RESP_ERR_MODE_UNSUPPORTED: mode unsupported
  203. * @SPECTRAL_SCAN_RESP_ERR_PARAM_INVALID_VALUE: invalid parameter value
  204. * @SPECTRAL_SCAN_RESP_ERR_PARAM_NOT_INITIALIZED: parameter uninitialized
  205. */
  206. enum spectral_cp_error_code {
  207. SPECTRAL_SCAN_ERR_INVALID,
  208. SPECTRAL_SCAN_ERR_PARAM_UNSUPPORTED,
  209. SPECTRAL_SCAN_ERR_MODE_UNSUPPORTED,
  210. SPECTRAL_SCAN_ERR_PARAM_INVALID_VALUE,
  211. SPECTRAL_SCAN_ERR_PARAM_NOT_INITIALIZED,
  212. };
  213. /**
  214. * struct spectral_chan_stats - channel status info
  215. * @cycle_count: Cycle count
  216. * @channel_load: Channel load
  217. * @per: Period
  218. * @noisefloor: Noise floor
  219. * @comp_usablity: Computed usability
  220. * @maxregpower: Maximum allowed regulatory power
  221. * @comp_usablity_sec80: Computed usability of secondary 80 Mhz
  222. * @maxregpower_sec80: Max regulatory power of secondary 80 Mhz
  223. */
  224. struct spectral_chan_stats {
  225. int cycle_count;
  226. int channel_load;
  227. int per;
  228. int noisefloor;
  229. uint16_t comp_usablity;
  230. int8_t maxregpower;
  231. uint16_t comp_usablity_sec80;
  232. int8_t maxregpower_sec80;
  233. };
  234. /**
  235. * struct spectral_diag_stats - spectral diag stats
  236. * @spectral_mismatch: Spectral TLV signature mismatches
  237. * @spectral_sec80_sfft_insufflen: Insufficient length when parsing for
  238. * Secondary 80 Search FFT report
  239. * @spectral_no_sec80_sfft: Secondary 80 Search FFT report
  240. * TLV not found
  241. * @spectral_vhtseg1id_mismatch: VHT Operation Segment 1 ID
  242. * mismatches in Search FFT report
  243. * @spectral_vhtseg2id_mismatch: VHT Operation Segment 2 ID
  244. * mismatches in Search FFT report
  245. * @spectral_invalid_detector_id: Invalid detector id
  246. */
  247. struct spectral_diag_stats {
  248. uint64_t spectral_mismatch;
  249. uint64_t spectral_sec80_sfft_insufflen;
  250. uint64_t spectral_no_sec80_sfft;
  251. uint64_t spectral_vhtseg1id_mismatch;
  252. uint64_t spectral_vhtseg2id_mismatch;
  253. uint64_t spectral_invalid_detector_id;
  254. };
  255. /**
  256. * struct spectral_scan_state - State of spectral scan
  257. * @is_active: Is spectral scan active
  258. * @is_enabled: Is spectral scan enabled
  259. */
  260. struct spectral_scan_state {
  261. uint8_t is_active;
  262. uint8_t is_enabled;
  263. };
  264. /* Forward declarations */
  265. struct wlan_objmgr_pdev;
  266. /**
  267. * struct spectral_nl_cb - Spectral Netlink callbacks
  268. * @get_sbuff: Get the socket buffer to send the data to the application
  269. * @send_nl_bcast: Send data to the application using netlink broadcast
  270. * @send_nl_unicast: Send data to the application using netlink unicast
  271. * @free_sbuff: Free the socket buffer for a particular message type
  272. */
  273. struct spectral_nl_cb {
  274. void *(*get_sbuff)(struct wlan_objmgr_pdev *pdev,
  275. enum spectral_msg_type smsg_type,
  276. enum spectral_msg_buf_type buf_type);
  277. int (*send_nl_bcast)(struct wlan_objmgr_pdev *pdev,
  278. enum spectral_msg_type smsg_type);
  279. int (*send_nl_unicast)(struct wlan_objmgr_pdev *pdev,
  280. enum spectral_msg_type smsg_type);
  281. void (*free_sbuff)(struct wlan_objmgr_pdev *pdev,
  282. enum spectral_msg_type smsg_type);
  283. };
  284. /**
  285. * struct spectral_scan_config_request - Config request
  286. * @sscan_config: Spectral parameters
  287. * @sscan_err_code: Spectral scan error code
  288. */
  289. struct spectral_scan_config_request {
  290. struct spectral_config sscan_config;
  291. enum spectral_cp_error_code sscan_err_code;
  292. };
  293. /**
  294. * struct spectral_scan_action_request - Action request
  295. * @sscan_err_code: Spectral scan error code
  296. */
  297. struct spectral_scan_action_request {
  298. enum spectral_cp_error_code sscan_err_code;
  299. };
  300. /**
  301. * struct spectral_scan_get_caps_request - Get caps request
  302. * @sscan_caps: Spectral capabilities
  303. * @sscan_err_code: Spectral scan error code
  304. */
  305. struct spectral_scan_get_caps_request {
  306. struct spectral_caps sscan_caps;
  307. enum spectral_cp_error_code sscan_err_code;
  308. };
  309. /**
  310. * struct spectral_scan_get_diag_request - Get diag request
  311. * @sscan_diag: Spectral diag stats
  312. * @sscan_err_code: Spectral scan error code
  313. */
  314. struct spectral_scan_get_diag_request {
  315. struct spectral_diag_stats sscan_diag;
  316. enum spectral_cp_error_code sscan_err_code;
  317. };
  318. /**
  319. * struct spectral_scan_get_chan_width_request - Get channel width request
  320. * @chan_width: Channel width
  321. * @sscan_err_code: Spectral scan error code
  322. */
  323. struct spectral_scan_get_chan_width_request {
  324. uint32_t chan_width;
  325. enum spectral_cp_error_code sscan_err_code;
  326. };
  327. /**
  328. * struct spectral_scan_get_status_request - Get status request
  329. * @is_active: is Spectral scan active
  330. * @is_enabled: is Spectral scan enabled
  331. * @sscan_err_code: Spectral scan error code
  332. */
  333. struct spectral_scan_get_status_request {
  334. bool is_active;
  335. bool is_enabled;
  336. enum spectral_cp_error_code sscan_err_code;
  337. };
  338. /**
  339. * struct spectral_scan_debug_request - Get/set debug level request
  340. * @spectral_dbg_level: Spectral debug level
  341. * @sscan_err_code: Spectral scan error code
  342. */
  343. struct spectral_scan_debug_request {
  344. uint32_t spectral_dbg_level;
  345. enum spectral_cp_error_code sscan_err_code;
  346. };
  347. /**
  348. * struct spectral_cp_request - Spectral control path request
  349. * Creating request and extracting response has to
  350. * be atomic.
  351. * @ss_mode: Spectral scan mode
  352. * @req_id: Request identifier
  353. */
  354. struct spectral_cp_request {
  355. enum spectral_scan_mode ss_mode;
  356. uint8_t req_id;
  357. union {
  358. struct spectral_scan_config_request config_req;
  359. struct spectral_scan_action_request action_req;
  360. struct spectral_scan_get_caps_request caps_req;
  361. struct spectral_scan_get_diag_request diag_req;
  362. struct spectral_scan_get_chan_width_request chan_width_req;
  363. struct spectral_scan_get_status_request status_req;
  364. struct spectral_scan_debug_request debug_req;
  365. };
  366. };
  367. #ifndef __KERNEL__
  368. static inline int16_t
  369. spectral_pwfactor_max(int16_t pwfactor1,
  370. int16_t pwfactor2)
  371. {
  372. return ((pwfactor1 > pwfactor2) ? pwfactor1 : pwfactor2);
  373. }
  374. /**
  375. * get_spectral_scale_rssi_corr() - Compute RSSI correction factor for scaling
  376. * @agc_total_gain_db: AGC total gain in dB steps
  377. * @gen3_defmaxgain: Default max gain value of the gen III chipset
  378. * @gen2_maxgain: Max gain value used by the reference gen II chipset
  379. * @lowlevel_offset: Low level offset for scaling
  380. * @inband_pwr: In band power in dB steps
  381. * @rssi_thr: RSSI threshold for scaling
  382. *
  383. * Helper function to compute RSSI correction factor for Gen III linear format
  384. * Spectral scaling. It is the responsibility of the caller to ensure that
  385. * correct values are passed.
  386. *
  387. * Return: RSSI correction factor
  388. */
  389. static inline int16_t
  390. get_spectral_scale_rssi_corr(u_int8_t agc_total_gain_db,
  391. u_int8_t gen3_defmaxgain, u_int8_t gen2_maxgain,
  392. int16_t lowlevel_offset, int16_t inband_pwr,
  393. int16_t rssi_thr)
  394. {
  395. return ((agc_total_gain_db < gen3_defmaxgain) ?
  396. (gen2_maxgain - gen3_defmaxgain + lowlevel_offset) :
  397. spectral_pwfactor_max((inband_pwr - rssi_thr), 0));
  398. }
  399. /**
  400. * spectral_scale_linear_to_gen2() - Scale linear bin value to gen II equivalent
  401. * @gen3_binmag: Captured FFT bin value from the Spectral Search FFT report
  402. * generated by the Gen III chipset
  403. * @gen2_maxgain: Max gain value used by the reference gen II chipset
  404. * @gen3_defmaxgain: Default max gain value of the gen III chipset
  405. * @lowlevel_offset: Low level offset for scaling
  406. * @inband_pwr: In band power in dB steps
  407. * @rssi_thr: RSSI threshold for scaling
  408. * @agc_total_gain_db: AGC total gain in dB steps
  409. * @highlevel_offset: High level offset for scaling
  410. * @gen2_bin_scale: Bin scale value used on reference gen II chipset
  411. * @gen3_bin_scale: Bin scale value used on gen III chipset
  412. *
  413. * Helper function to scale a given gen III linear format bin value into an
  414. * approximately equivalent gen II value. The scaled value can possibly be
  415. * higher than 8 bits. If the caller is incapable of handling values larger
  416. * than 8 bits, the caller can saturate the value at 255. This function does not
  417. * carry out this saturation for the sake of flexibility so that callers
  418. * interested in the larger values can avail of this. Also note it is the
  419. * responsibility of the caller to ensure that correct values are passed.
  420. *
  421. * Return: Scaled bin value
  422. */
  423. static inline u_int32_t
  424. spectral_scale_linear_to_gen2(u_int8_t gen3_binmag,
  425. u_int8_t gen2_maxgain, u_int8_t gen3_defmaxgain,
  426. int16_t lowlevel_offset, int16_t inband_pwr,
  427. int16_t rssi_thr, u_int8_t agc_total_gain_db,
  428. int16_t highlevel_offset, u_int8_t gen2_bin_scale,
  429. u_int8_t gen3_bin_scale)
  430. {
  431. return (gen3_binmag *
  432. sqrt(pow(10, (((double)spectral_pwfactor_max(gen2_maxgain -
  433. gen3_defmaxgain + lowlevel_offset -
  434. get_spectral_scale_rssi_corr(agc_total_gain_db,
  435. gen3_defmaxgain,
  436. gen2_maxgain,
  437. lowlevel_offset,
  438. inband_pwr,
  439. rssi_thr),
  440. (agc_total_gain_db < gen3_defmaxgain) *
  441. highlevel_offset)) / 10))) *
  442. pow(2, (gen3_bin_scale - gen2_bin_scale)));
  443. }
  444. #endif /* __KERNEL__ */
  445. #endif /* _WLAN_SPECTRAL_PUBLIC_STRUCTS_H_ */