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