dp_ratetable.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #ifndef _DP_RATES_H_
  19. #define _DP_RATES_H_
  20. #define CMN_DP_ASSERT(__bool)
  21. /*
  22. *Band Width Types
  23. */
  24. enum CMN_BW_TYPES {
  25. CMN_BW_20MHZ,
  26. CMN_BW_40MHZ,
  27. CMN_BW_80MHZ,
  28. CMN_BW_160MHZ,
  29. CMN_BW_CNT,
  30. CMN_BW_IDLE = 0xFF, /*default BW state */
  31. };
  32. #define NUM_SPATIAL_STREAMS 8
  33. #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
  34. #define VHT_EXTRA_MCS_SUPPORT
  35. #define CONFIG_160MHZ_SUPPORT 1
  36. #define NUM_HT_MCS 8
  37. #define NUM_VHT_MCS 12
  38. #define NUM_HE_MCS 14
  39. #define NUM_SPATIAL_STREAM 4
  40. #define NUM_SPATIAL_STREAMS 8
  41. #define WHAL_160MHZ_SUPPORT 1
  42. #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
  43. #define RT_GET_RT(_rt) ((const struct DP_CMN_RATE_TABLE *)(_rt))
  44. #define RT_GET_INFO(_rt, _index) RT_GET_RT(_rt)->info[(_index)]
  45. #define RT_GET_RAW_KBPS(_rt, _index) \
  46. (RT_GET_INFO(_rt, (_index)).ratekbps)
  47. #define RT_GET_SGI_KBPS(_rt, _index) \
  48. (RT_GET_INFO(_rt, (_index)).ratekbpssgi)
  49. #define HW_RATECODE_CCK_SHORT_PREAM_MASK 0x4
  50. #define RT_INVALID_INDEX (0xff)
  51. /* pow2 to optimize out * and / */
  52. #define DP_ATH_RATE_EP_MULTIPLIER BIT(7)
  53. #define DP_ATH_EP_MUL(a, b) ((a) * (b))
  54. #define DP_ATH_RATE_LPF_LEN 10 /* Low pass filter length
  55. * for averaging rates
  56. */
  57. #define DUMMY_MARKER 0
  58. #define DP_ATH_RATE_IN(c) (DP_ATH_EP_MUL((c), DP_ATH_RATE_EP_MULTIPLIER))
  59. static inline int dp_ath_rate_lpf(uint64_t _d, int _e)
  60. {
  61. _e = DP_ATH_RATE_IN((_e));
  62. return (((_d) != DUMMY_MARKER) ? ((((_d) << 3) + (_e) - (_d)) >> 3) :
  63. (_e));
  64. }
  65. static inline int dp_ath_rate_out(uint64_t _i)
  66. {
  67. int _mul = DP_ATH_RATE_EP_MULTIPLIER;
  68. return (((_i) != DUMMY_MARKER) ?
  69. ((((_i) % (_mul)) >= ((_mul) / 2)) ?
  70. ((_i) + ((_mul) - 1)) / (_mul) : (_i) / (_mul)) :
  71. DUMMY_MARKER);
  72. }
  73. #define RXDESC_GET_DATA_LEN(rx_desc) \
  74. (txrx_pdev->htt_pdev->ar_rx_ops->msdu_desc_msdu_length(rx_desc))
  75. #define ASSEMBLE_HW_RATECODE(_rate, _nss, _pream) \
  76. (((_pream) << 6) | ((_nss) << 4) | (_rate))
  77. #define GET_HW_RATECODE_PREAM(_rcode) (((_rcode) >> 6) & 0x3)
  78. #define GET_HW_RATECODE_NSS(_rcode) (((_rcode) >> 4) & 0x3)
  79. #define GET_HW_RATECODE_RATE(_rcode) (((_rcode) >> 0) & 0xF)
  80. #define VHT_INVALID_MCS (0xFF) /* Certain MCSs are not valid in VHT mode */
  81. #define VHT_INVALID_BCC_RATE 0
  82. #define NUM_HT_SPATIAL_STREAM 4
  83. #define NUM_HT_RIX_PER_BW (NUM_HT_MCS * NUM_HT_SPATIAL_STREAM)
  84. #define NUM_VHT_RIX_PER_BW (NUM_VHT_MCS * NUM_SPATIAL_STREAMS)
  85. #define NUM_HE_RIX_PER_BW (NUM_HE_MCS * NUM_SPATIAL_STREAMS)
  86. #define NUM_VHT_RIX_FOR_160MHZ (NUM_VHT_MCS * \
  87. MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
  88. #define NUM_HE_RIX_FOR_160MHZ (NUM_HE_MCS * \
  89. MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
  90. #define CCK_RATE_TABLE_INDEX 0
  91. #define CCK_RATE_11M_INDEX 0
  92. #define CCK_FALLBACK_MIN_RATE 0x3 /** 1 Mbps */
  93. #define CCK_FALLBACK_MAX_RATE 0x2 /** 2 Mbps */
  94. #define OFDM_RATE_TABLE_INDEX 4
  95. #define OFDMA_RATE_54M_INDEX 8
  96. #define HT_20_RATE_TABLE_INDEX 12
  97. #define HT_40_RATE_TABLE_INDEX (HT_20_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
  98. #define VHT_20_RATE_TABLE_INDEX (HT_40_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
  99. #define VHT_40_RATE_TABLE_INDEX (VHT_20_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
  100. #define VHT_80_RATE_TABLE_INDEX (VHT_40_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
  101. #define VHT_160_RATE_TABLE_INDEX (VHT_80_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
  102. #define VHT_LAST_RIX_PLUS_ONE (VHT_160_RATE_TABLE_INDEX + \
  103. NUM_VHT_RIX_FOR_160MHZ)
  104. #define HE_20_RATE_TABLE_INDEX VHT_LAST_RIX_PLUS_ONE
  105. #define HE_40_RATE_TABLE_INDEX (HE_20_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
  106. #define HE_80_RATE_TABLE_INDEX (HE_40_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
  107. #define HE_160_RATE_TABLE_INDEX (HE_80_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
  108. #define DP_RATE_TABLE_SIZE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
  109. /* The following would span more than one octet
  110. * when 160MHz BW defined for VHT
  111. * Also it's important to maintain the ordering of
  112. * this enum else it would break other rate adapation functions.
  113. */
  114. enum DP_CMN_MODULATION_TYPE {
  115. DP_CMN_MOD_IEEE80211_T_DS, /* direct sequence spread spectrum */
  116. DP_CMN_MOD_IEEE80211_T_OFDM, /* frequency division multiplexing */
  117. DP_CMN_MOD_IEEE80211_T_HT_20,
  118. DP_CMN_MOD_IEEE80211_T_HT_40,
  119. DP_CMN_MOD_IEEE80211_T_VHT_20,
  120. DP_CMN_MOD_IEEE80211_T_VHT_40,
  121. DP_CMN_MOD_IEEE80211_T_VHT_80,
  122. DP_CMN_MOD_IEEE80211_T_VHT_160,
  123. DP_CMN_MOD_IEEE80211_T_HE_20, /* 11AX support enabled */
  124. DP_CMN_MOD_IEEE80211_T_HE_40,
  125. DP_CMN_MOD_IEEE80211_T_HE_80,
  126. DP_CMN_MOD_IEEE80211_T_HE_160,
  127. DP_CMN_MOD_IEEE80211_T_MAX_PHY
  128. };
  129. /* more common nomenclature */
  130. #define DP_CMN_MOD_IEEE80211_T_CCK DP_CMN_MOD_IEEE80211_T_DS
  131. enum HW_RATECODE_PREAM_TYPE {
  132. HW_RATECODE_PREAM_OFDM,
  133. HW_RATECODE_PREAM_CCK,
  134. HW_RATECODE_PREAM_HT,
  135. HW_RATECODE_PREAM_VHT,
  136. HW_RATECODE_PREAM_HE,
  137. };
  138. enum DP_CMN_MODULATION_TYPE dp_getmodulation(
  139. uint16_t pream_type,
  140. uint8_t width);
  141. uint32_t
  142. dp_getrateindex(uint32_t gi, uint16_t mcs, uint8_t nss, uint8_t preamble,
  143. uint8_t bw, uint32_t *rix, uint16_t *ratecode);
  144. int dp_rate_idx_to_kbps(uint8_t rate_idx, uint8_t gintval);
  145. #endif /*_DP_RATES_H_*/