dp_ratetable.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2022 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. #ifndef _DP_RATES_H_
  20. #define _DP_RATES_H_
  21. #define CMN_DP_ASSERT(__bool)
  22. /*
  23. *Band Width Types
  24. */
  25. enum CMN_BW_TYPES {
  26. CMN_BW_20MHZ,
  27. CMN_BW_40MHZ,
  28. CMN_BW_80MHZ,
  29. CMN_BW_160MHZ,
  30. CMN_BW_80_80MHZ,
  31. #ifdef WLAN_FEATURE_11BE
  32. CMN_BW_320MHZ,
  33. #endif
  34. CMN_BW_CNT,
  35. CMN_BW_IDLE = 0xFF, /*default BW state */
  36. };
  37. /*
  38. * Modes Types
  39. */
  40. enum CMN_MODE_TYPES {
  41. CMN_IEEE80211_MODE_INVALID = 0,
  42. CMN_IEEE80211_MODE_A,
  43. CMN_IEEE80211_MODE_B,
  44. CMN_IEEE80211_MODE_G,
  45. CMN_IEEE80211_MODE_TURBO,
  46. CMN_IEEE80211_MODE_NA,
  47. CMN_IEEE80211_MODE_NG,
  48. CMN_IEEE80211_MODE_N,
  49. CMN_IEEE80211_MODE_AC,
  50. CMN_IEEE80211_MODE_AXA,
  51. CMN_IEEE80211_MODE_AXG,
  52. CMN_IEEE80211_MODE_AX,
  53. #ifdef WLAN_FEATURE_11BE
  54. CMN_IEEE80211_MODE_BEA,
  55. CMN_IEEE80211_MODE_BEG,
  56. #endif
  57. CMN_IEEE80211_MODE_MAX
  58. };
  59. #define NUM_SPATIAL_STREAMS 8
  60. #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
  61. #define VHT_EXTRA_MCS_SUPPORT
  62. #define CONFIG_160MHZ_SUPPORT 1
  63. #define NUM_HT_MCS 8
  64. #define NUM_VHT_MCS 12
  65. #define NUM_HE_MCS 14
  66. #ifdef WLAN_FEATURE_11BE
  67. #define NUM_EHT_MCS 16
  68. #endif
  69. #define NUM_SPATIAL_STREAM 4
  70. #define NUM_SPATIAL_STREAMS 8
  71. #define WHAL_160MHZ_SUPPORT 1
  72. #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
  73. #define RT_GET_RT(_rt) ((const struct DP_CMN_RATE_TABLE *)(_rt))
  74. #define RT_GET_INFO(_rt, _index) RT_GET_RT(_rt)->info[(_index)]
  75. #define RT_GET_RAW_KBPS(_rt, _index) \
  76. (RT_GET_INFO(_rt, (_index)).ratekbps)
  77. #define RT_GET_SGI_KBPS(_rt, _index) \
  78. (RT_GET_INFO(_rt, (_index)).ratekbpssgi)
  79. #define HW_RATECODE_CCK_SHORT_PREAM_MASK 0x4
  80. #define RT_INVALID_INDEX (0xff)
  81. /* pow2 to optimize out * and / */
  82. #define DP_ATH_RATE_EP_MULTIPLIER BIT(7)
  83. #define DP_ATH_EP_MUL(a, b) ((a) * (b))
  84. #define DP_ATH_RATE_LPF_LEN 10 /* Low pass filter length
  85. * for averaging rates
  86. */
  87. #define DUMMY_MARKER 0
  88. #define DP_ATH_RATE_IN(c) (DP_ATH_EP_MUL((c), DP_ATH_RATE_EP_MULTIPLIER))
  89. static inline int dp_ath_rate_lpf(uint64_t _d, int _e)
  90. {
  91. _e = DP_ATH_RATE_IN((_e));
  92. return (((_d) != DUMMY_MARKER) ? ((((_d) << 3) + (_e) - (_d)) >> 3) :
  93. (_e));
  94. }
  95. static inline int dp_ath_rate_out(uint64_t _i)
  96. {
  97. int _mul = DP_ATH_RATE_EP_MULTIPLIER;
  98. return (((_i) != DUMMY_MARKER) ?
  99. ((((_i) % (_mul)) >= ((_mul) / 2)) ?
  100. ((_i) + ((_mul) - 1)) / (_mul) : (_i) / (_mul)) :
  101. DUMMY_MARKER);
  102. }
  103. #define RXDESC_GET_DATA_LEN(rx_desc) \
  104. (txrx_pdev->htt_pdev->ar_rx_ops->msdu_desc_msdu_length(rx_desc))
  105. #define ASSEMBLE_HW_RATECODE(_rate, _nss, _pream) \
  106. (((_pream) << 6) | ((_nss) << 4) | (_rate))
  107. #define GET_HW_RATECODE_PREAM(_rcode) (((_rcode) >> 6) & 0x3)
  108. #define GET_HW_RATECODE_NSS(_rcode) (((_rcode) >> 4) & 0x3)
  109. #define GET_HW_RATECODE_RATE(_rcode) (((_rcode) >> 0) & 0xF)
  110. #define VHT_INVALID_MCS (0xFF) /* Certain MCSs are not valid in VHT mode */
  111. #define VHT_INVALID_BCC_RATE 0
  112. #define NUM_HT_SPATIAL_STREAM 4
  113. #define NUM_HT_RIX_PER_BW (NUM_HT_MCS * NUM_HT_SPATIAL_STREAM)
  114. #define NUM_VHT_RIX_PER_BW (NUM_VHT_MCS * NUM_SPATIAL_STREAMS)
  115. #define NUM_HE_RIX_PER_BW (NUM_HE_MCS * NUM_SPATIAL_STREAMS)
  116. #define NUM_VHT_RIX_FOR_160MHZ (NUM_VHT_MCS * \
  117. MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
  118. #define NUM_HE_RIX_FOR_160MHZ (NUM_HE_MCS * \
  119. MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
  120. #define CCK_RATE_TABLE_INDEX 0
  121. #define CCK_RATE_TABLE_END_INDEX 3
  122. #define CCK_RATE_11M_INDEX 0
  123. #define CCK_FALLBACK_MIN_RATE 0x3 /** 1 Mbps */
  124. #define CCK_FALLBACK_MAX_RATE 0x2 /** 2 Mbps */
  125. #define OFDM_RATE_TABLE_INDEX 4
  126. #define OFDMA_RATE_54M_INDEX 8
  127. #define OFDMA_RATE_TABLE_END_INDEX 11
  128. #define HT_20_RATE_TABLE_INDEX 12
  129. #define HT_40_RATE_TABLE_INDEX (HT_20_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
  130. #define VHT_20_RATE_TABLE_INDEX (HT_40_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
  131. #define VHT_40_RATE_TABLE_INDEX (VHT_20_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
  132. #define VHT_80_RATE_TABLE_INDEX (VHT_40_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
  133. #define VHT_160_RATE_TABLE_INDEX (VHT_80_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
  134. #define VHT_LAST_RIX_PLUS_ONE (VHT_160_RATE_TABLE_INDEX + \
  135. NUM_VHT_RIX_FOR_160MHZ)
  136. #define HE_20_RATE_TABLE_INDEX VHT_LAST_RIX_PLUS_ONE
  137. #define HE_40_RATE_TABLE_INDEX (HE_20_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
  138. #define HE_80_RATE_TABLE_INDEX (HE_40_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
  139. #define HE_160_RATE_TABLE_INDEX (HE_80_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
  140. #define HE_LAST_RIX_PLUS_ONE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
  141. #ifdef WLAN_FEATURE_11BE
  142. #define NUM_EHT_RIX_PER_BW (NUM_EHT_MCS * NUM_SPATIAL_STREAMS)
  143. #define EHT_20_RATE_TABLE_INDEX HE_LAST_RIX_PLUS_ONE
  144. #define EHT_40_RATE_TABLE_INDEX (EHT_20_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  145. #define EHT_60_RATE_TABLE_INDEX (EHT_40_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  146. #define EHT_80_RATE_TABLE_INDEX (EHT_60_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  147. #define EHT_120_RATE_TABLE_INDEX (EHT_80_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  148. #define EHT_140_RATE_TABLE_INDEX (EHT_120_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  149. #define EHT_160_RATE_TABLE_INDEX (EHT_140_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  150. #define EHT_200_RATE_TABLE_INDEX (EHT_160_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  151. #define EHT_240_RATE_TABLE_INDEX (EHT_200_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  152. #define EHT_280_RATE_TABLE_INDEX (EHT_240_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  153. #define EHT_320_RATE_TABLE_INDEX (EHT_280_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  154. #define EHT_LAST_RIX_PLUS_ONE (EHT_320_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
  155. #endif
  156. #ifdef WLAN_FEATURE_11BE
  157. #define DP_RATE_TABLE_SIZE EHT_LAST_RIX_PLUS_ONE
  158. #else
  159. #define DP_RATE_TABLE_SIZE HE_LAST_RIX_PLUS_ONE
  160. #endif
  161. /* The following would span more than one octet
  162. * when 160MHz BW defined for VHT
  163. * Also it's important to maintain the ordering of
  164. * this enum else it would break other rate adapation functions.
  165. */
  166. enum DP_CMN_MODULATION_TYPE {
  167. DP_CMN_MOD_IEEE80211_T_DS, /* direct sequence spread spectrum */
  168. DP_CMN_MOD_IEEE80211_T_OFDM, /* frequency division multiplexing */
  169. DP_CMN_MOD_IEEE80211_T_HT_20,
  170. DP_CMN_MOD_IEEE80211_T_HT_40,
  171. DP_CMN_MOD_IEEE80211_T_VHT_20,
  172. DP_CMN_MOD_IEEE80211_T_VHT_40,
  173. DP_CMN_MOD_IEEE80211_T_VHT_80,
  174. DP_CMN_MOD_IEEE80211_T_VHT_160,
  175. DP_CMN_MOD_IEEE80211_T_HE_20, /* 11AX support enabled */
  176. DP_CMN_MOD_IEEE80211_T_HE_40,
  177. DP_CMN_MOD_IEEE80211_T_HE_80,
  178. DP_CMN_MOD_IEEE80211_T_HE_160,
  179. #ifdef WLAN_FEATURE_11BE
  180. DP_CMN_MOD_IEEE80211_T_EHT_20,
  181. DP_CMN_MOD_IEEE80211_T_EHT_40,
  182. DP_CMN_MOD_IEEE80211_T_EHT_60,
  183. DP_CMN_MOD_IEEE80211_T_EHT_80,
  184. DP_CMN_MOD_IEEE80211_T_EHT_120,
  185. DP_CMN_MOD_IEEE80211_T_EHT_140,
  186. DP_CMN_MOD_IEEE80211_T_EHT_160,
  187. DP_CMN_MOD_IEEE80211_T_EHT_200,
  188. DP_CMN_MOD_IEEE80211_T_EHT_240,
  189. DP_CMN_MOD_IEEE80211_T_EHT_280,
  190. DP_CMN_MOD_IEEE80211_T_EHT_320,
  191. #endif
  192. DP_CMN_MOD_IEEE80211_T_MAX_PHY
  193. };
  194. /* more common nomenclature */
  195. #define DP_CMN_MOD_IEEE80211_T_CCK DP_CMN_MOD_IEEE80211_T_DS
  196. enum HW_RATECODE_PREAM_TYPE {
  197. HW_RATECODE_PREAM_OFDM,
  198. HW_RATECODE_PREAM_CCK,
  199. HW_RATECODE_PREAM_HT,
  200. HW_RATECODE_PREAM_VHT,
  201. HW_RATECODE_PREAM_HE,
  202. #ifdef WLAN_FEATURE_11BE
  203. HW_RATECODE_PREAM_EHT,
  204. #endif
  205. };
  206. #ifdef WLAN_FEATURE_11BE
  207. enum BW_TYPES_FP {
  208. BW_20MHZ_F = 0,
  209. BW_40MHZ_F,
  210. BW_60MHZ_P,
  211. BW_80MHZ_F,
  212. BW_120MHZ_P,
  213. BW_140MHZ_P,
  214. BW_160MHZ_F,
  215. BW_200MHZ_P,
  216. BW_240MHZ_P,
  217. BW_280MHZ_P,
  218. BW_320MHZ_F,
  219. BW_FP_CNT,
  220. BW_FP_LAST = BW_320MHZ_F,
  221. };
  222. #endif
  223. enum PUNCTURED_MODES {
  224. NO_PUNCTURE,
  225. #ifdef WLAN_FEATURE_11BE
  226. PUNCTURED_20MHZ,
  227. PUNCTURED_40MHZ,
  228. PUNCTURED_80MHZ,
  229. PUNCTURED_120MHZ,
  230. PUNCTURED_MODE_CNT,
  231. #endif
  232. };
  233. enum DP_CMN_MODULATION_TYPE dp_getmodulation(uint16_t pream_type,
  234. uint8_t width,
  235. uint8_t punc_mode);
  236. uint32_t
  237. dp_getrateindex(uint32_t gi, uint16_t mcs, uint8_t nss, uint8_t preamble,
  238. uint8_t bw, uint8_t punc_bw, uint32_t *rix, uint16_t *ratecode);
  239. int dp_rate_idx_to_kbps(uint8_t rate_idx, uint8_t gintval);
  240. #if ALL_POSSIBLE_RATES_SUPPORTED
  241. int dp_get_supported_rates(int mode, int shortgi, int **rates);
  242. #else
  243. int dp_get_supported_rates(int mode, int shortgi, int nss,
  244. int ch_width, int **rates);
  245. #endif
  246. #endif /*_DP_RATES_H_*/