xref: /wlan-dirver/qca-wifi-host-cmn/dp/cmn_dp_api/dp_ratetable.h (revision 45a38684b07295822dc8eba39e293408f203eec8)
1 /*
2  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _DP_RATES_H_
20 #define _DP_RATES_H_
21 
22 #define CMN_DP_ASSERT(__bool)
23 
24 /*
25  *Band Width Types
26  */
27 enum CMN_BW_TYPES {
28 	CMN_BW_20MHZ,
29 	CMN_BW_40MHZ,
30 	CMN_BW_80MHZ,
31 	CMN_BW_160MHZ,
32 	CMN_BW_CNT,
33 	CMN_BW_IDLE = 0xFF, /*default BW state */
34 };
35 
36 #define NUM_SPATIAL_STREAMS 8
37 #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
38 #define VHT_EXTRA_MCS_SUPPORT
39 #define CONFIG_160MHZ_SUPPORT 1
40 #define NUM_HT_MCS 8
41 #define NUM_VHT_MCS 12
42 
43 #define NUM_HE_MCS 12
44 
45 #define NUM_SPATIAL_STREAM 4
46 #define NUM_SPATIAL_STREAMS 8
47 #define WHAL_160MHZ_SUPPORT 1
48 #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
49 #define RT_GET_RT(_rt)		    ((const struct DP_CMN_RATE_TABLE *)(_rt))
50 #define RT_GET_INFO(_rt, _index)	    RT_GET_RT(_rt)->info[(_index)]
51 #define RT_GET_RAW_KBPS(_rt, _index) \
52 	(RT_GET_INFO(_rt, (_index)).ratekbps)
53 #define RT_GET_SGI_KBPS(_rt, _index) \
54 	(RT_GET_INFO(_rt, (_index)).ratekbpssgi)
55 
56 #define HW_RATECODE_CCK_SHORT_PREAM_MASK  0x4
57 #define RT_INVALID_INDEX (0xff)
58 /* pow2 to optimize out * and / */
59 #define DP_ATH_RATE_EP_MULTIPLIER     BIT(7)
60 #define DP_ATH_EP_MUL(a, b)	      ((a) * (b))
61 #define DP_ATH_RATE_LPF_LEN	      10	  /* Low pass filter length
62 						   * for averaging rates
63 						   */
64 #define DUMMY_MARKER	  0
65 #define DP_ATH_RATE_IN(c)  (DP_ATH_EP_MUL((c), DP_ATH_RATE_EP_MULTIPLIER))
66 
67 static inline int dp_ath_rate_lpf(uint64_t _d, int _e)
68 {
69 	_e = DP_ATH_RATE_IN((_e));
70 	return (((_d) != DUMMY_MARKER) ? ((((_d) << 3) + (_e) - (_d)) >> 3) :
71 			(_e));
72 }
73 
74 static inline int dp_ath_rate_out(uint64_t _i)
75 {
76 	int _mul = DP_ATH_RATE_EP_MULTIPLIER;
77 
78 	return (((_i) != DUMMY_MARKER) ?
79 			((((_i) % (_mul)) >= ((_mul) / 2)) ?
80 			((_i) + ((_mul) - 1)) / (_mul) : (_i) / (_mul)) :
81 				DUMMY_MARKER);
82 }
83 
84 #define RXDESC_GET_DATA_LEN(rx_desc) \
85 	(txrx_pdev->htt_pdev->ar_rx_ops->msdu_desc_msdu_length(rx_desc))
86 #define ASSEMBLE_HW_RATECODE(_rate, _nss, _pream)     \
87 	(((_pream) << 6) | ((_nss) << 4) | (_rate))
88 #define GET_HW_RATECODE_PREAM(_rcode)     (((_rcode) >> 6) & 0x3)
89 #define GET_HW_RATECODE_NSS(_rcode)       (((_rcode) >> 4) & 0x3)
90 #define GET_HW_RATECODE_RATE(_rcode)      (((_rcode) >> 0) & 0xF)
91 
92 #define VHT_INVALID_MCS    (0xFF)  /* Certain MCSs are not valid in VHT mode */
93 #define VHT_INVALID_BCC_RATE  0
94 #define NUM_HT_SPATIAL_STREAM 4
95 
96 #define NUM_HT_RIX_PER_BW (NUM_HT_MCS * NUM_HT_SPATIAL_STREAM)
97 #define NUM_VHT_RIX_PER_BW (NUM_VHT_MCS * NUM_SPATIAL_STREAMS)
98 #define NUM_HE_RIX_PER_BW (NUM_HE_MCS * NUM_SPATIAL_STREAMS)
99 
100 #define NUM_VHT_RIX_FOR_160MHZ (NUM_VHT_MCS * \
101 		MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
102 #define NUM_HE_RIX_FOR_160MHZ (NUM_HE_MCS * \
103 		MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
104 
105 #define CCK_RATE_TABLE_INDEX 0
106 #define CCK_RATE_11M_INDEX 0
107 #define CCK_FALLBACK_MIN_RATE 0x3 /** 1 Mbps */
108 #define CCK_FALLBACK_MAX_RATE 0x2 /** 2 Mbps */
109 
110 #define OFDM_RATE_TABLE_INDEX 4
111 #define OFDMA_RATE_54M_INDEX 8
112 
113 #define HT_20_RATE_TABLE_INDEX 12
114 #define HT_40_RATE_TABLE_INDEX (HT_20_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
115 
116 #define VHT_20_RATE_TABLE_INDEX (HT_40_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
117 #define VHT_40_RATE_TABLE_INDEX (VHT_20_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
118 #define VHT_80_RATE_TABLE_INDEX (VHT_40_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
119 
120 #define VHT_160_RATE_TABLE_INDEX (VHT_80_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
121 #define VHT_LAST_RIX_PLUS_ONE (VHT_160_RATE_TABLE_INDEX + \
122 		NUM_VHT_RIX_FOR_160MHZ)
123 
124 #define HE_20_RATE_TABLE_INDEX VHT_LAST_RIX_PLUS_ONE
125 #define HE_40_RATE_TABLE_INDEX (HE_20_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
126 #define HE_80_RATE_TABLE_INDEX (HE_40_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
127 
128 #define HE_160_RATE_TABLE_INDEX (HE_80_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
129 #define DP_RATE_TABLE_SIZE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
130 
131 /* The following would span more than one octet
132  * when 160MHz BW defined for VHT
133  * Also it's important to maintain the ordering of
134  * this enum else it would break other rate adapation functions.
135  */
136 enum DP_CMN_MODULATION_TYPE {
137 	   DP_CMN_MOD_IEEE80211_T_DS,   /* direct sequence spread spectrum */
138 	   DP_CMN_MOD_IEEE80211_T_OFDM, /* frequency division multiplexing */
139 	   DP_CMN_MOD_IEEE80211_T_HT_20,
140 	   DP_CMN_MOD_IEEE80211_T_HT_40,
141 	   DP_CMN_MOD_IEEE80211_T_VHT_20,
142 	   DP_CMN_MOD_IEEE80211_T_VHT_40,
143 	   DP_CMN_MOD_IEEE80211_T_VHT_80,
144 	   DP_CMN_MOD_IEEE80211_T_VHT_160,
145 	   DP_CMN_MOD_IEEE80211_T_HE_20, /* 11AX support enabled */
146 	   DP_CMN_MOD_IEEE80211_T_HE_40,
147 	   DP_CMN_MOD_IEEE80211_T_HE_80,
148 	   DP_CMN_MOD_IEEE80211_T_HE_160,
149 	   DP_CMN_MOD_IEEE80211_T_MAX_PHY
150 };
151 
152 /* more common nomenclature */
153 #define DP_CMN_MOD_IEEE80211_T_CCK DP_CMN_MOD_IEEE80211_T_DS
154 
155 enum HW_RATECODE_PREAM_TYPE {
156 	HW_RATECODE_PREAM_OFDM,
157 	HW_RATECODE_PREAM_CCK,
158 	HW_RATECODE_PREAM_HT,
159 	HW_RATECODE_PREAM_VHT,
160 };
161 
162 enum DP_CMN_MODULATION_TYPE dp_getmodulation(
163 		uint16_t pream_type,
164 		uint8_t width);
165 
166 uint32_t
167 dp_getrateindex(uint32_t gi, uint16_t mcs, uint8_t nss, uint8_t preamble,
168 		uint8_t bw, uint32_t *rix, uint16_t *ratecode);
169 
170 int dp_rate_idx_to_kbps(uint8_t rate_idx, uint8_t gintval);
171 
172 #endif /*_DP_RATES_H_*/
173