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