1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 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 
dp_ath_rate_lpf(uint64_t _d,int _e)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 
dp_ath_rate_out(uint64_t _i)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 #define INVALID_RATE_ERR -1
173 #define NUM_LEGACY_MCS 1
174 
175 /*
176  * The order of the rate types are jumbled below since the current code
177  * implementation is mapped in such way already.
178  *
179  * @DP_HT_RATE: HT Ratetype
180  * @DP_VHT_RATE: VHT Ratetype
181  * @DP_11B_CCK_RATE: 11B CCK Ratetype
182  * @DP_11A_OFDM_RATE: 11A OFDM Ratetype
183  * @DP_11G_CCK_OFDM_RATE: 11G CCK + OFDM Ratetype
184  * @DP_HE_RATE: HE Ratetype
185  */
186 enum DP_CMN_RATE_TYPE {
187 	DP_HT_RATE = 2,
188 	DP_VHT_RATE,
189 	DP_11B_CCK_RATE,
190 	DP_11A_OFDM_RATE,
191 	DP_11G_CCK_OFDM_RATE,
192 	DP_HE_RATE
193 };
194 
195 #define DP_RATEKBPS_SGI(i) (dp_11abgnratetable.info[i].ratekbpssgi)
196 #define DP_RATEKBPS(i) (dp_11abgnratetable.info[i].ratekbps)
197 #define RATE_ROUNDOUT(rate) (((rate) / 1000) * 1000)
198 
199 /* The following would span more than one octet
200  * when 160MHz BW defined for VHT
201  * Also it's important to maintain the ordering of
202  * this enum else it would break other rate adaptation functions.
203  */
204 enum DP_CMN_MODULATION_TYPE {
205 	   DP_CMN_MOD_IEEE80211_T_DS,   /* direct sequence spread spectrum */
206 	   DP_CMN_MOD_IEEE80211_T_OFDM, /* frequency division multiplexing */
207 	   DP_CMN_MOD_IEEE80211_T_HT_20,
208 	   DP_CMN_MOD_IEEE80211_T_HT_40,
209 	   DP_CMN_MOD_IEEE80211_T_VHT_20,
210 	   DP_CMN_MOD_IEEE80211_T_VHT_40,
211 	   DP_CMN_MOD_IEEE80211_T_VHT_80,
212 	   DP_CMN_MOD_IEEE80211_T_VHT_160,
213 	   DP_CMN_MOD_IEEE80211_T_HE_20, /* 11AX support enabled */
214 	   DP_CMN_MOD_IEEE80211_T_HE_40,
215 	   DP_CMN_MOD_IEEE80211_T_HE_80,
216 	   DP_CMN_MOD_IEEE80211_T_HE_160,
217 #ifdef WLAN_FEATURE_11BE
218 	   DP_CMN_MOD_IEEE80211_T_EHT_20,
219 	   DP_CMN_MOD_IEEE80211_T_EHT_40,
220 	   DP_CMN_MOD_IEEE80211_T_EHT_60,
221 	   DP_CMN_MOD_IEEE80211_T_EHT_80,
222 	   DP_CMN_MOD_IEEE80211_T_EHT_120,
223 	   DP_CMN_MOD_IEEE80211_T_EHT_140,
224 	   DP_CMN_MOD_IEEE80211_T_EHT_160,
225 	   DP_CMN_MOD_IEEE80211_T_EHT_200,
226 	   DP_CMN_MOD_IEEE80211_T_EHT_240,
227 	   DP_CMN_MOD_IEEE80211_T_EHT_280,
228 	   DP_CMN_MOD_IEEE80211_T_EHT_320,
229 #endif
230 	   DP_CMN_MOD_IEEE80211_T_MAX_PHY
231 };
232 
233 /* more common nomenclature */
234 #define DP_CMN_MOD_IEEE80211_T_CCK DP_CMN_MOD_IEEE80211_T_DS
235 
236 enum HW_RATECODE_PREAM_TYPE {
237 	HW_RATECODE_PREAM_OFDM,
238 	HW_RATECODE_PREAM_CCK,
239 	HW_RATECODE_PREAM_HT,
240 	HW_RATECODE_PREAM_VHT,
241 	HW_RATECODE_PREAM_HE,
242 #ifdef WLAN_FEATURE_11BE
243 	HW_RATECODE_PREAM_EHT,
244 #endif
245 };
246 
247 #ifdef WLAN_FEATURE_11BE
248 enum BW_TYPES_FP {
249 	BW_20MHZ_F = 0,
250 	BW_40MHZ_F,
251 	BW_60MHZ_P,
252 	BW_80MHZ_F,
253 	BW_120MHZ_P,
254 	BW_140MHZ_P,
255 	BW_160MHZ_F,
256 	BW_200MHZ_P,
257 	BW_240MHZ_P,
258 	BW_280MHZ_P,
259 	BW_320MHZ_F,
260 	BW_FP_CNT,
261 	BW_FP_LAST = BW_320MHZ_F,
262 };
263 #endif
264 
265 enum DP_CMN_MODULATION_TYPE dp_getmodulation(uint16_t pream_type,
266 					     uint8_t width,
267 					     uint8_t punc_mode);
268 
269 uint32_t
270 dp_getrateindex(uint32_t gi, uint16_t mcs, uint8_t nss, uint8_t preamble,
271 		uint8_t bw, uint8_t punc_bw, uint32_t *rix, uint16_t *ratecode);
272 
273 int dp_rate_idx_to_kbps(uint8_t rate_idx, uint8_t gintval);
274 
275 #if ALL_POSSIBLE_RATES_SUPPORTED
276 int dp_get_supported_rates(int mode, int shortgi, int **rates);
277 int dp_get_kbps_to_mcs(int kbps_rate, int shortgi, int htflag);
278 #else
279 int dp_get_supported_rates(int mode, int shortgi, int nss,
280 			   int ch_width, int **rates);
281 int dp_get_kbps_to_mcs(int kbps_rate, int shortgi, int htflag,
282 		       int nss, int ch_width);
283 #endif
284 
285 #endif /*_DP_RATES_H_*/
286