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