xref: /wlan-dirver/qca-wifi-host-cmn/dp/cmn_dp_api/dp_ratetable.h (revision 503663c6daafffe652fa360bde17243568cd6d2a)
1 /*
2  * Copyright (c) 2016-2019 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 SUPPORT_11AX 1
38 #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
39 #define VHT_EXTRA_MCS_SUPPORT
40 #define CONFIG_160MHZ_SUPPORT 1
41 #define NUM_HT_MCS 8
42 #define NUM_VHT_MCS 12
43 
44 #define NUM_HE_MCS 12
45 
46 #define NUM_SPATIAL_STREAM 4
47 #define NUM_SPATIAL_STREAMS 8
48 #define WHAL_160MHZ_SUPPORT 1
49 #define MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ 4
50 #define RT_GET_RT(_rt)		    ((const struct DP_CMN_RATE_TABLE *)(_rt))
51 #define RT_GET_INFO(_rt, _index)	    RT_GET_RT(_rt)->info[(_index)]
52 #define RT_GET_RAW_KBPS(_rt, _index) \
53 	(RT_GET_INFO(_rt, (_index)).ratekbps)
54 #define RT_GET_SGI_KBPS(_rt, _index) \
55 	(RT_GET_INFO(_rt, (_index)).ratekbpssgi)
56 
57 #define HW_RATECODE_CCK_SHORT_PREAM_MASK  0x4
58 #define RT_INVALID_INDEX (0xff)
59 /* pow2 to optimize out * and / */
60 #define DP_ATH_RATE_EP_MULTIPLIER     BIT(7)
61 #define DP_ATH_EP_MUL(a, b)	      ((a) * (b))
62 #define DP_ATH_RATE_LPF_LEN	      10	  /* Low pass filter length
63 						   * for averaging rates
64 						   */
65 #define DUMMY_MARKER	  0
66 #define DP_ATH_RATE_IN(c)  (DP_ATH_EP_MUL((c), DP_ATH_RATE_EP_MULTIPLIER))
67 
68 static inline int dp_ath_rate_lpf(uint64_t _d, int _e)
69 {
70 	_e = DP_ATH_RATE_IN((_e));
71 	return (((_d) != DUMMY_MARKER) ? ((((_d) << 3) + (_e) - (_d)) >> 3) :
72 			(_e));
73 }
74 
75 static inline int dp_ath_rate_out(uint64_t _i)
76 {
77 	int _mul = DP_ATH_RATE_EP_MULTIPLIER;
78 
79 	return (((_i) != DUMMY_MARKER) ?
80 			((((_i) % (_mul)) >= ((_mul) / 2)) ?
81 			((_i) + ((_mul) - 1)) / (_mul) : (_i) / (_mul)) :
82 				DUMMY_MARKER);
83 }
84 
85 #define RXDESC_GET_DATA_LEN(rx_desc) \
86 	(txrx_pdev->htt_pdev->ar_rx_ops->msdu_desc_msdu_length(rx_desc))
87 #define ASSEMBLE_HW_RATECODE(_rate, _nss, _pream)     \
88 	(((_pream) << 6) | ((_nss) << 4) | (_rate))
89 #define GET_HW_RATECODE_PREAM(_rcode)     (((_rcode) >> 6) & 0x3)
90 #define GET_HW_RATECODE_NSS(_rcode)       (((_rcode) >> 4) & 0x3)
91 #define GET_HW_RATECODE_RATE(_rcode)      (((_rcode) >> 0) & 0xF)
92 
93 #define VHT_INVALID_MCS    (0xFF)  /* Certain MCSs are not valid in VHT mode */
94 #define VHT_INVALID_BCC_RATE  0
95 #define NUM_HT_SPATIAL_STREAM 4
96 
97 #define NUM_HT_RIX_PER_BW (NUM_HT_MCS * NUM_HT_SPATIAL_STREAM)
98 #define NUM_VHT_RIX_PER_BW (NUM_VHT_MCS * NUM_SPATIAL_STREAMS)
99 #define NUM_HE_RIX_PER_BW (NUM_HE_MCS * NUM_SPATIAL_STREAMS)
100 
101 #define NUM_VHT_RIX_FOR_160MHZ (NUM_VHT_MCS * \
102 		MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
103 #define NUM_HE_RIX_FOR_160MHZ (NUM_HE_MCS * \
104 		MAX_SPATIAL_STREAMS_SUPPORTED_AT_160MHZ)
105 
106 #define CCK_RATE_TABLE_INDEX 0
107 #define CCK_RATE_11M_INDEX 0
108 #define CCK_FALLBACK_MIN_RATE 0x3 /** 1 Mbps */
109 #define CCK_FALLBACK_MAX_RATE 0x2 /** 2 Mbps */
110 
111 #define OFDM_RATE_TABLE_INDEX 4
112 #define OFDMA_RATE_54M_INDEX 8
113 
114 #define HT_20_RATE_TABLE_INDEX 12
115 #define HT_40_RATE_TABLE_INDEX (HT_20_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
116 
117 #define VHT_20_RATE_TABLE_INDEX (HT_40_RATE_TABLE_INDEX + NUM_HT_RIX_PER_BW)
118 #define VHT_40_RATE_TABLE_INDEX (VHT_20_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
119 #define VHT_80_RATE_TABLE_INDEX (VHT_40_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
120 
121 #define VHT_160_RATE_TABLE_INDEX (VHT_80_RATE_TABLE_INDEX + NUM_VHT_RIX_PER_BW)
122 #define VHT_LAST_RIX_PLUS_ONE (VHT_160_RATE_TABLE_INDEX + \
123 		NUM_VHT_RIX_FOR_160MHZ)
124 
125 #define HE_20_RATE_TABLE_INDEX VHT_LAST_RIX_PLUS_ONE
126 #define HE_40_RATE_TABLE_INDEX (HE_20_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
127 #define HE_80_RATE_TABLE_INDEX (HE_40_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
128 
129 #define HE_160_RATE_TABLE_INDEX (HE_80_RATE_TABLE_INDEX + NUM_HE_RIX_PER_BW)
130 #define DP_RATE_TABLE_SIZE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ)
131 
132 /* The following would span more than one octet
133  * when 160MHz BW defined for VHT
134  * Also it's important to maintain the ordering of
135  * this enum else it would break other rate adapation functions.
136  */
137 enum DP_CMN_MODULATION_TYPE {
138 	   DP_CMN_MOD_IEEE80211_T_DS,   /* direct sequence spread spectrum */
139 	   DP_CMN_MOD_IEEE80211_T_OFDM, /* frequency division multiplexing */
140 	   DP_CMN_MOD_IEEE80211_T_HT_20,
141 	   DP_CMN_MOD_IEEE80211_T_HT_40,
142 	   DP_CMN_MOD_IEEE80211_T_VHT_20,
143 	   DP_CMN_MOD_IEEE80211_T_VHT_40,
144 	   DP_CMN_MOD_IEEE80211_T_VHT_80,
145 	   DP_CMN_MOD_IEEE80211_T_VHT_160,
146 	   DP_CMN_MOD_IEEE80211_T_HE_20, /* 11AX support enabled */
147 	   DP_CMN_MOD_IEEE80211_T_HE_40,
148 	   DP_CMN_MOD_IEEE80211_T_HE_80,
149 	   DP_CMN_MOD_IEEE80211_T_HE_160,
150 	   DP_CMN_MOD_IEEE80211_T_MAX_PHY
151 };
152 
153 /* more common nomenclature */
154 #define DP_CMN_MOD_IEEE80211_T_CCK DP_CMN_MOD_IEEE80211_T_DS
155 
156 enum HW_RATECODE_PREAM_TYPE {
157 	HW_RATECODE_PREAM_OFDM,
158 	HW_RATECODE_PREAM_CCK,
159 	HW_RATECODE_PREAM_HT,
160 	HW_RATECODE_PREAM_VHT,
161 };
162 
163 enum DP_CMN_MODULATION_TYPE dp_getmodulation(
164 		uint16_t pream_type,
165 		uint8_t width);
166 
167 uint32_t
168 dp_getrateindex(uint32_t gi, uint16_t mcs, uint8_t nss, uint8_t preamble,
169 		uint8_t bw, uint32_t *rix, uint16_t *ratecode);
170 
171 int dp_rate_idx_to_kbps(uint8_t rate_idx, uint8_t gintval);
172 
173 #endif /*_DP_RATES_H_*/
174