xref: /wlan-driver/qca-wifi-host-cmn/dp/cmn_dp_api/dp_ratetable.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef _DP_RATES_H_
21*5113495bSYour Name #define _DP_RATES_H_
22*5113495bSYour Name 
23*5113495bSYour Name #define CMN_DP_ASSERT(__bool)
24*5113495bSYour Name 
25*5113495bSYour Name /*
26*5113495bSYour Name  * Modes Types
27*5113495bSYour Name  */
28*5113495bSYour Name enum CMN_MODE_TYPES {
29*5113495bSYour Name 	CMN_IEEE80211_MODE_INVALID = 0,
30*5113495bSYour Name 	CMN_IEEE80211_MODE_A,
31*5113495bSYour Name 	CMN_IEEE80211_MODE_B,
32*5113495bSYour Name 	CMN_IEEE80211_MODE_G,
33*5113495bSYour Name 	CMN_IEEE80211_MODE_TURBO,
34*5113495bSYour Name 	CMN_IEEE80211_MODE_NA,
35*5113495bSYour Name 	CMN_IEEE80211_MODE_NG,
36*5113495bSYour Name 	CMN_IEEE80211_MODE_N,
37*5113495bSYour Name 	CMN_IEEE80211_MODE_AC,
38*5113495bSYour Name 	CMN_IEEE80211_MODE_AXA,
39*5113495bSYour Name 	CMN_IEEE80211_MODE_AXG,
40*5113495bSYour Name 	CMN_IEEE80211_MODE_AX,
41*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
42*5113495bSYour Name 	CMN_IEEE80211_MODE_BEA,
43*5113495bSYour Name 	CMN_IEEE80211_MODE_BEG,
44*5113495bSYour Name #endif
45*5113495bSYour Name 	CMN_IEEE80211_MODE_MAX
46*5113495bSYour Name };
47*5113495bSYour Name 
48*5113495bSYour Name #define NUM_SPATIAL_STREAMS 8
49*5113495bSYour Name #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
50*5113495bSYour Name #define VHT_EXTRA_MCS_SUPPORT
51*5113495bSYour Name #define CONFIG_160MHZ_SUPPORT 1
52*5113495bSYour Name #define NUM_HT_MCS 8
53*5113495bSYour Name #define NUM_VHT_MCS 12
54*5113495bSYour Name 
55*5113495bSYour Name #define NUM_HE_MCS 14
56*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
57*5113495bSYour Name #define NUM_EHT_MCS 16
58*5113495bSYour Name #endif
59*5113495bSYour Name 
60*5113495bSYour Name #define NUM_SPATIAL_STREAM 4
61*5113495bSYour Name #define NUM_SPATIAL_STREAMS 8
62*5113495bSYour Name #define WHAL_160MHZ_SUPPORT 1
63*5113495bSYour Name #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
64*5113495bSYour Name #define RT_GET_RT(_rt)		    ((const struct DP_CMN_RATE_TABLE *)(_rt))
65*5113495bSYour Name #define RT_GET_INFO(_rt, _index)	    RT_GET_RT(_rt)->info[(_index)]
66*5113495bSYour Name #define RT_GET_RAW_KBPS(_rt, _index) \
67*5113495bSYour Name 	(RT_GET_INFO(_rt, (_index)).ratekbps)
68*5113495bSYour Name #define RT_GET_SGI_KBPS(_rt, _index) \
69*5113495bSYour Name 	(RT_GET_INFO(_rt, (_index)).ratekbpssgi)
70*5113495bSYour Name 
71*5113495bSYour Name #define HW_RATECODE_CCK_SHORT_PREAM_MASK  0x4
72*5113495bSYour Name #define RT_INVALID_INDEX (0xff)
73*5113495bSYour Name /* pow2 to optimize out * and / */
74*5113495bSYour Name #define DP_ATH_RATE_EP_MULTIPLIER     BIT(7)
75*5113495bSYour Name #define DP_ATH_EP_MUL(a, b)	      ((a) * (b))
76*5113495bSYour Name #define DP_ATH_RATE_LPF_LEN	      10	  /* Low pass filter length
77*5113495bSYour Name 						   * for averaging rates
78*5113495bSYour Name 						   */
79*5113495bSYour Name #define DUMMY_MARKER	  0
80*5113495bSYour Name #define DP_ATH_RATE_IN(c)  (DP_ATH_EP_MUL((c), DP_ATH_RATE_EP_MULTIPLIER))
81*5113495bSYour Name 
dp_ath_rate_lpf(uint64_t _d,int _e)82*5113495bSYour Name static inline int dp_ath_rate_lpf(uint64_t _d, int _e)
83*5113495bSYour Name {
84*5113495bSYour Name 	_e = DP_ATH_RATE_IN((_e));
85*5113495bSYour Name 	return (((_d) != DUMMY_MARKER) ? ((((_d) << 3) + (_e) - (_d)) >> 3) :
86*5113495bSYour Name 			(_e));
87*5113495bSYour Name }
88*5113495bSYour Name 
dp_ath_rate_out(uint64_t _i)89*5113495bSYour Name static inline int dp_ath_rate_out(uint64_t _i)
90*5113495bSYour Name {
91*5113495bSYour Name 	int _mul = DP_ATH_RATE_EP_MULTIPLIER;
92*5113495bSYour Name 
93*5113495bSYour Name 	return (((_i) != DUMMY_MARKER) ?
94*5113495bSYour Name 			((((_i) % (_mul)) >= ((_mul) / 2)) ?
95*5113495bSYour Name 			((_i) + ((_mul) - 1)) / (_mul) : (_i) / (_mul)) :
96*5113495bSYour Name 				DUMMY_MARKER);
97*5113495bSYour Name }
98*5113495bSYour Name 
99*5113495bSYour Name #define RXDESC_GET_DATA_LEN(rx_desc) \
100*5113495bSYour Name 	(txrx_pdev->htt_pdev->ar_rx_ops->msdu_desc_msdu_length(rx_desc))
101*5113495bSYour Name #define ASSEMBLE_HW_RATECODE(_rate, _nss, _pream)     \
102*5113495bSYour Name 	(((_pream) << 6) | ((_nss) << 4) | (_rate))
103*5113495bSYour Name #define GET_HW_RATECODE_PREAM(_rcode)     (((_rcode) >> 6) & 0x3)
104*5113495bSYour Name #define GET_HW_RATECODE_NSS(_rcode)       (((_rcode) >> 4) & 0x3)
105*5113495bSYour Name #define GET_HW_RATECODE_RATE(_rcode)      (((_rcode) >> 0) & 0xF)
106*5113495bSYour Name 
107*5113495bSYour Name #define VHT_INVALID_MCS    (0xFF)  /* Certain MCSs are not valid in VHT mode */
108*5113495bSYour Name #define VHT_INVALID_BCC_RATE  0
109*5113495bSYour Name #define NUM_HT_SPATIAL_STREAM 4
110*5113495bSYour Name 
111*5113495bSYour Name #define NUM_HT_RIX_PER_BW (NUM_HT_MCS * NUM_HT_SPATIAL_STREAM)
112*5113495bSYour Name #define NUM_VHT_RIX_PER_BW (NUM_VHT_MCS * NUM_SPATIAL_STREAMS)
113*5113495bSYour Name #define NUM_HE_RIX_PER_BW (NUM_HE_MCS * NUM_SPATIAL_STREAMS)
114*5113495bSYour Name 
115*5113495bSYour Name #define NUM_VHT_RIX_FOR_160MHZ (NUM_VHT_MCS * \
116*5113495bSYour Name 		MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
117*5113495bSYour Name #define NUM_HE_RIX_FOR_160MHZ (NUM_HE_MCS * \
118*5113495bSYour Name 		MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
119*5113495bSYour Name 
120*5113495bSYour Name #define CCK_RATE_TABLE_INDEX 0
121*5113495bSYour Name #define CCK_RATE_TABLE_END_INDEX 3
122*5113495bSYour Name #define CCK_RATE_11M_INDEX 0
123*5113495bSYour Name #define CCK_FALLBACK_MIN_RATE 0x3 /** 1 Mbps */
124*5113495bSYour Name #define CCK_FALLBACK_MAX_RATE 0x2 /** 2 Mbps */
125*5113495bSYour Name 
126*5113495bSYour Name #define OFDM_RATE_TABLE_INDEX 4
127*5113495bSYour Name #define OFDMA_RATE_54M_INDEX 8
128*5113495bSYour Name #define OFDMA_RATE_TABLE_END_INDEX 11
129*5113495bSYour Name 
130*5113495bSYour Name #define HT_20_RATE_TABLE_INDEX 12
131*5113495bSYour Name #define HT_40_RATE_TABLE_INDEX (HT_20_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
132*5113495bSYour Name 
133*5113495bSYour Name #define VHT_20_RATE_TABLE_INDEX (HT_40_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
134*5113495bSYour Name #define VHT_40_RATE_TABLE_INDEX (VHT_20_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
135*5113495bSYour Name #define VHT_80_RATE_TABLE_INDEX (VHT_40_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
136*5113495bSYour Name 
137*5113495bSYour Name #define VHT_160_RATE_TABLE_INDEX (VHT_80_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
138*5113495bSYour Name #define VHT_LAST_RIX_PLUS_ONE (VHT_160_RATE_TABLE_INDEX + \
139*5113495bSYour Name 		NUM_VHT_RIX_FOR_160MHZ)
140*5113495bSYour Name 
141*5113495bSYour Name #define HE_20_RATE_TABLE_INDEX VHT_LAST_RIX_PLUS_ONE
142*5113495bSYour Name #define HE_40_RATE_TABLE_INDEX (HE_20_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
143*5113495bSYour Name #define HE_80_RATE_TABLE_INDEX (HE_40_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
144*5113495bSYour Name 
145*5113495bSYour Name #define HE_160_RATE_TABLE_INDEX (HE_80_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
146*5113495bSYour Name #define HE_LAST_RIX_PLUS_ONE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
147*5113495bSYour Name 
148*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
149*5113495bSYour Name #define NUM_EHT_SPATIAL_STREAM 4
150*5113495bSYour Name #define NUM_EHT_RIX_PER_BW (NUM_EHT_MCS * NUM_EHT_SPATIAL_STREAM)
151*5113495bSYour Name 
152*5113495bSYour Name #define EHT_20_RATE_TABLE_INDEX HE_LAST_RIX_PLUS_ONE
153*5113495bSYour Name #define EHT_40_RATE_TABLE_INDEX (EHT_20_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
154*5113495bSYour Name #define EHT_60_RATE_TABLE_INDEX (EHT_40_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
155*5113495bSYour Name #define EHT_80_RATE_TABLE_INDEX (EHT_60_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
156*5113495bSYour Name #define EHT_120_RATE_TABLE_INDEX (EHT_80_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
157*5113495bSYour Name #define EHT_140_RATE_TABLE_INDEX (EHT_120_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
158*5113495bSYour Name #define EHT_160_RATE_TABLE_INDEX (EHT_140_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
159*5113495bSYour Name #define EHT_200_RATE_TABLE_INDEX (EHT_160_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
160*5113495bSYour Name #define EHT_240_RATE_TABLE_INDEX (EHT_200_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
161*5113495bSYour Name #define EHT_280_RATE_TABLE_INDEX (EHT_240_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
162*5113495bSYour Name #define EHT_320_RATE_TABLE_INDEX (EHT_280_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
163*5113495bSYour Name #define EHT_LAST_RIX_PLUS_ONE (EHT_320_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW)
164*5113495bSYour Name #endif
165*5113495bSYour Name 
166*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
167*5113495bSYour Name #define DP_RATE_TABLE_SIZE EHT_LAST_RIX_PLUS_ONE
168*5113495bSYour Name #else
169*5113495bSYour Name #define DP_RATE_TABLE_SIZE HE_LAST_RIX_PLUS_ONE
170*5113495bSYour Name #endif
171*5113495bSYour Name 
172*5113495bSYour Name #define INVALID_RATE_ERR -1
173*5113495bSYour Name #define NUM_LEGACY_MCS 1
174*5113495bSYour Name 
175*5113495bSYour Name /*
176*5113495bSYour Name  * The order of the rate types are jumbled below since the current code
177*5113495bSYour Name  * implementation is mapped in such way already.
178*5113495bSYour Name  *
179*5113495bSYour Name  * @DP_HT_RATE: HT Ratetype
180*5113495bSYour Name  * @DP_VHT_RATE: VHT Ratetype
181*5113495bSYour Name  * @DP_11B_CCK_RATE: 11B CCK Ratetype
182*5113495bSYour Name  * @DP_11A_OFDM_RATE: 11A OFDM Ratetype
183*5113495bSYour Name  * @DP_11G_CCK_OFDM_RATE: 11G CCK + OFDM Ratetype
184*5113495bSYour Name  * @DP_HE_RATE: HE Ratetype
185*5113495bSYour Name  */
186*5113495bSYour Name enum DP_CMN_RATE_TYPE {
187*5113495bSYour Name 	DP_HT_RATE = 2,
188*5113495bSYour Name 	DP_VHT_RATE,
189*5113495bSYour Name 	DP_11B_CCK_RATE,
190*5113495bSYour Name 	DP_11A_OFDM_RATE,
191*5113495bSYour Name 	DP_11G_CCK_OFDM_RATE,
192*5113495bSYour Name 	DP_HE_RATE
193*5113495bSYour Name };
194*5113495bSYour Name 
195*5113495bSYour Name #define DP_RATEKBPS_SGI(i) (dp_11abgnratetable.info[i].ratekbpssgi)
196*5113495bSYour Name #define DP_RATEKBPS(i) (dp_11abgnratetable.info[i].ratekbps)
197*5113495bSYour Name #define RATE_ROUNDOUT(rate) (((rate) / 1000) * 1000)
198*5113495bSYour Name 
199*5113495bSYour Name /* The following would span more than one octet
200*5113495bSYour Name  * when 160MHz BW defined for VHT
201*5113495bSYour Name  * Also it's important to maintain the ordering of
202*5113495bSYour Name  * this enum else it would break other rate adaptation functions.
203*5113495bSYour Name  */
204*5113495bSYour Name enum DP_CMN_MODULATION_TYPE {
205*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_DS,   /* direct sequence spread spectrum */
206*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_OFDM, /* frequency division multiplexing */
207*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_HT_20,
208*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_HT_40,
209*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_VHT_20,
210*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_VHT_40,
211*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_VHT_80,
212*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_VHT_160,
213*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_HE_20, /* 11AX support enabled */
214*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_HE_40,
215*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_HE_80,
216*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_HE_160,
217*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
218*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_20,
219*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_40,
220*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_60,
221*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_80,
222*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_120,
223*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_140,
224*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_160,
225*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_200,
226*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_240,
227*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_280,
228*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_EHT_320,
229*5113495bSYour Name #endif
230*5113495bSYour Name 	   DP_CMN_MOD_IEEE80211_T_MAX_PHY
231*5113495bSYour Name };
232*5113495bSYour Name 
233*5113495bSYour Name /* more common nomenclature */
234*5113495bSYour Name #define DP_CMN_MOD_IEEE80211_T_CCK DP_CMN_MOD_IEEE80211_T_DS
235*5113495bSYour Name 
236*5113495bSYour Name enum HW_RATECODE_PREAM_TYPE {
237*5113495bSYour Name 	HW_RATECODE_PREAM_OFDM,
238*5113495bSYour Name 	HW_RATECODE_PREAM_CCK,
239*5113495bSYour Name 	HW_RATECODE_PREAM_HT,
240*5113495bSYour Name 	HW_RATECODE_PREAM_VHT,
241*5113495bSYour Name 	HW_RATECODE_PREAM_HE,
242*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
243*5113495bSYour Name 	HW_RATECODE_PREAM_EHT,
244*5113495bSYour Name #endif
245*5113495bSYour Name };
246*5113495bSYour Name 
247*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
248*5113495bSYour Name enum BW_TYPES_FP {
249*5113495bSYour Name 	BW_20MHZ_F = 0,
250*5113495bSYour Name 	BW_40MHZ_F,
251*5113495bSYour Name 	BW_60MHZ_P,
252*5113495bSYour Name 	BW_80MHZ_F,
253*5113495bSYour Name 	BW_120MHZ_P,
254*5113495bSYour Name 	BW_140MHZ_P,
255*5113495bSYour Name 	BW_160MHZ_F,
256*5113495bSYour Name 	BW_200MHZ_P,
257*5113495bSYour Name 	BW_240MHZ_P,
258*5113495bSYour Name 	BW_280MHZ_P,
259*5113495bSYour Name 	BW_320MHZ_F,
260*5113495bSYour Name 	BW_FP_CNT,
261*5113495bSYour Name 	BW_FP_LAST = BW_320MHZ_F,
262*5113495bSYour Name };
263*5113495bSYour Name #endif
264*5113495bSYour Name 
265*5113495bSYour Name enum DP_CMN_MODULATION_TYPE dp_getmodulation(uint16_t pream_type,
266*5113495bSYour Name 					     uint8_t width,
267*5113495bSYour Name 					     uint8_t punc_mode);
268*5113495bSYour Name 
269*5113495bSYour Name uint32_t
270*5113495bSYour Name dp_getrateindex(uint32_t gi, uint16_t mcs, uint8_t nss, uint8_t preamble,
271*5113495bSYour Name 		uint8_t bw, uint8_t punc_bw, uint32_t *rix, uint16_t *ratecode);
272*5113495bSYour Name 
273*5113495bSYour Name int dp_rate_idx_to_kbps(uint8_t rate_idx, uint8_t gintval);
274*5113495bSYour Name 
275*5113495bSYour Name #if ALL_POSSIBLE_RATES_SUPPORTED
276*5113495bSYour Name int dp_get_supported_rates(int mode, int shortgi, int **rates);
277*5113495bSYour Name int dp_get_kbps_to_mcs(int kbps_rate, int shortgi, int htflag);
278*5113495bSYour Name #else
279*5113495bSYour Name int dp_get_supported_rates(int mode, int shortgi, int nss,
280*5113495bSYour Name 			   int ch_width, int **rates);
281*5113495bSYour Name int dp_get_kbps_to_mcs(int kbps_rate, int shortgi, int htflag,
282*5113495bSYour Name 		       int nss, int ch_width);
283*5113495bSYour Name #endif
284*5113495bSYour Name 
285*5113495bSYour Name #endif /*_DP_RATES_H_*/
286