common-spectral.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /*
  2. * Copyright (c) 2013 Qualcomm Atheros, Inc.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #ifndef SPECTRAL_H
  17. #define SPECTRAL_H
  18. #include "../spectral_common.h"
  19. /* enum spectral_mode:
  20. *
  21. * @SPECTRAL_DISABLED: spectral mode is disabled
  22. * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with
  23. * something else.
  24. * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples
  25. * is performed manually.
  26. * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels
  27. * during a channel scan.
  28. */
  29. enum spectral_mode {
  30. SPECTRAL_DISABLED = 0,
  31. SPECTRAL_BACKGROUND,
  32. SPECTRAL_MANUAL,
  33. SPECTRAL_CHANSCAN,
  34. };
  35. #define SPECTRAL_SCAN_BITMASK 0x10
  36. /* Radar info packet format, used for DFS and spectral formats. */
  37. struct ath_radar_info {
  38. u8 pulse_length_pri;
  39. u8 pulse_length_ext;
  40. u8 pulse_bw_info;
  41. } __packed;
  42. /* The HT20 spectral data has 4 bytes of additional information at it's end.
  43. *
  44. * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]}
  45. * [7:0]: all bins max_magnitude[9:2]
  46. * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]}
  47. * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
  48. */
  49. struct ath_ht20_mag_info {
  50. u8 all_bins[3];
  51. u8 max_exp;
  52. } __packed;
  53. /* WARNING: don't actually use this struct! MAC may vary the amount of
  54. * data by -1/+2. This struct is for reference only.
  55. */
  56. struct ath_ht20_fft_packet {
  57. u8 data[SPECTRAL_HT20_NUM_BINS];
  58. struct ath_ht20_mag_info mag_info;
  59. struct ath_radar_info radar_info;
  60. } __packed;
  61. #define SPECTRAL_HT20_TOTAL_DATA_LEN (sizeof(struct ath_ht20_fft_packet))
  62. /* Dynamic 20/40 mode:
  63. *
  64. * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]}
  65. * [7:0]: lower bins max_magnitude[9:2]
  66. * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]}
  67. * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]}
  68. * [7:0]: upper bins max_magnitude[9:2]
  69. * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]}
  70. * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
  71. */
  72. struct ath_ht20_40_mag_info {
  73. u8 lower_bins[3];
  74. u8 upper_bins[3];
  75. u8 max_exp;
  76. } __packed;
  77. /* WARNING: don't actually use this struct! MAC may vary the amount of
  78. * data. This struct is for reference only.
  79. */
  80. struct ath_ht20_40_fft_packet {
  81. u8 data[SPECTRAL_HT20_40_NUM_BINS];
  82. struct ath_ht20_40_mag_info mag_info;
  83. struct ath_radar_info radar_info;
  84. } __packed;
  85. struct ath_spec_scan_priv {
  86. struct ath_hw *ah;
  87. /* relay(fs) channel for spectral scan */
  88. struct rchan *rfs_chan_spec_scan;
  89. enum spectral_mode spectral_mode;
  90. struct ath_spec_scan spec_config;
  91. };
  92. #define SPECTRAL_HT20_40_TOTAL_DATA_LEN (sizeof(struct ath_ht20_40_fft_packet))
  93. /* grabs the max magnitude from the all/upper/lower bins */
  94. static inline u16 spectral_max_magnitude(u8 *bins)
  95. {
  96. return (bins[0] & 0xc0) >> 6 |
  97. (bins[1] & 0xff) << 2 |
  98. (bins[2] & 0x03) << 10;
  99. }
  100. /* return the max magnitude from the all/upper/lower bins */
  101. static inline u8 spectral_max_index(u8 *bins)
  102. {
  103. s8 m = (bins[2] & 0xfc) >> 2;
  104. /* TODO: this still doesn't always report the right values ... */
  105. if (m > 32)
  106. m |= 0xe0;
  107. else
  108. m &= ~0xe0;
  109. return m + 29;
  110. }
  111. /* return the bitmap weight from the all/upper/lower bins */
  112. static inline u8 spectral_bitmap_weight(u8 *bins)
  113. {
  114. return bins[0] & 0x3f;
  115. }
  116. void ath9k_cmn_spectral_init_debug(struct ath_spec_scan_priv *spec_priv, struct dentry *debugfs_phy);
  117. void ath9k_cmn_spectral_deinit_debug(struct ath_spec_scan_priv *spec_priv);
  118. void ath9k_cmn_spectral_scan_trigger(struct ath_common *common,
  119. struct ath_spec_scan_priv *spec_priv);
  120. int ath9k_cmn_spectral_scan_config(struct ath_common *common,
  121. struct ath_spec_scan_priv *spec_priv,
  122. enum spectral_mode spectral_mode);
  123. int ath_cmn_process_fft(struct ath_spec_scan_priv *spec_priv, struct ieee80211_hdr *hdr,
  124. struct ath_rx_status *rs, u64 tsf);
  125. #endif /* SPECTRAL_H */