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