2 * Copyright (c) 2013 Qualcomm Atheros, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted (subject to the limitations in the
7 * disclaimer below) provided that the following conditions are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
17 * * Neither the name of Qualcomm Atheros nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22 * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include <adf_os_types.h>
40 #include <adf_os_dma.h>
41 #include <adf_os_timer.h>
42 #include <adf_os_lock.h>
43 #include <adf_os_io.h>
44 #include <adf_os_mem.h>
45 #include <adf_os_util.h>
46 #include <adf_os_stdtypes.h>
47 #include <adf_os_defer.h>
48 #include <adf_os_atomic.h>
51 #include <adf_net_types.h>
52 #include <adf_net_wcmd.h>
54 #include <ieee80211_var.h>
56 #include "if_athrate.h"
57 #include "if_athvar.h"
62 typedef int8_t A_RSSI;
63 typedef int32_t A_RSSI32;
64 typedef u_int8_t WLAN_PHY;
67 #define INLINE __inline
71 #define A_MIN(a,b) ((a)<(b)?(a):(b))
75 #define A_MAX(a,b) ((a)>(b)?(a):(b))
79 * Use the hal os glue code to get ms time; we supply
80 * a null arg because we know it's not needed.
82 #define A_MS_TICKGET() OS_GETUPTIME(NULL)
83 #define A_MEM_ZERO(p,s) OS_MEMZERO(p,s)
85 #define WLAN_PHY_OFDM IEEE80211_T_OFDM
86 #define WLAN_PHY_TURBO IEEE80211_T_TURBO
87 #define WLAN_PHY_CCK IEEE80211_T_CCK
88 #define WLAN_PHY_XR (IEEE80211_T_TURBO+1)
99 WLAN_RC_PHY_HT_20_SS_HGI,
100 WLAN_RC_PHY_HT_20_DS_HGI,
101 WLAN_RC_PHY_HT_40_SS_HGI,
102 WLAN_RC_PHY_HT_40_DS_HGI,
106 #define IS_CHAN_TURBO(_c) (((_c)->channelFlags & CHANNEL_TURBO) != 0)
107 #define IS_CHAN_2GHZ(_c) (((_c)->channelFlags & CHANNEL_2GHZ) != 0)
109 #define PKTLOG_RATE_CTL_FIND(_sc, log_data, flags) ath_log_rcfind(_sc, log_data, flags);
110 #define PKTLOG_RATE_CTL_UPDATE(_sc, log_data, flags) ath_log_rcupdate(_sc, log_data, flags);
111 #define ASSERT(condition)
113 #define WIRELESS_MODE_11NA IEEE80211_MODE_11NA
114 #define WIRELESS_MODE_11NG IEEE80211_MODE_11NG
115 #define WIRELESS_MODE_MAX IEEE80211_MODE_MAX
117 #define RX_FLIP_THRESHOLD 3 /* XXX */
120 #define MAX_TX_RATE_TBL 46
121 #define MAX_TX_RATE_PHY 48
123 #define MAX_TX_RATE_TBL 54//46
124 #define MAX_TX_RATE_PHY 56//48
128 * State structures for new rate adaptation code
130 * NOTE: Modifying these structures will impact
131 * the Perl script that parses packet logging data.
132 * See the packet logging module for more information.
134 typedef struct TxRateCrtlState_s {
135 A_UINT8 per; /* recent estimate of packet error rate (%) */
138 typedef struct TxRateCtrl_s {
139 TxRateCtrlState state[MAX_TX_RATE_TBL]; /* state for each rate */
140 A_UINT8 rateTableSize; /* rate table size */
141 A_UINT8 probeRate; /* rate we are probing at */
142 A_UINT32 rssiTime; /* msec timestamp for last ack rssi */
143 A_UINT32 probeTime; /* msec timestamp for last probe */
144 A_UINT8 hwMaxRetryPktCnt; /* num packets since we got HW max retry error */
145 A_UINT8 maxValidRate; /* maximum number of valid rate */
146 A_UINT8 validRateIndex[MAX_TX_RATE_TBL]; /* rc Index is valid for this Sib */
147 A_UINT32 perDownTime; /* msec timstamp for last PER down step */
149 A_UINT8 rateMaxPhy; /* Phy index for the max rate */
152 typedef struct phy_rate_ctrl {
154 A_UINT8 validPhyRateCount[WLAN_RC_PHY_MAX]; /* valid rate count */
155 A_UINT8 validPhyRateIndex[WLAN_RC_PHY_MAX][MAX_TX_RATE_TBL]; /* index */
159 struct atheros_node {
160 TX_RATE_CTRL txRateCtrl; /* rate control state proper */
161 A_UINT32 lastRateKbps; /* last rate in Kb/s */
162 A_UINT8 singleStream :1, /* When TRUE, only single stream Tx possible */
163 stbc :2; /* Rx stbc capability */
167 #define ATH_NODE_ATHEROS(an) (an->an_rcnode)
170 * Rate Table structure for various modes - 'b', 'a', 'g', 'xr';
171 * order of fields in info structure is important because hardcoded
172 * structures are initialized within the hal for these
177 A_UINT8 rateCodeToIndex[RATE_TABLE_SIZE]; /* backward mapping */
179 int valid; /* Valid for use in rate control */
180 WLAN_PHY phy; /* CCK/OFDM/TURBO/XR */
181 A_UINT16 rateKbps; /* Rate in Kbits per second */
182 A_UINT16 userRateKbps; /* User rate in KBits per second */
183 A_UINT8 rateCode; /* rate that goes into hw descriptors */
184 A_UINT8 shortPreamble; /* Mask for enabling short preamble in rate code for CCK */
185 A_UINT8 dot11Rate; /* Value that goes into supported rates info element of MLME */
186 A_UINT8 controlRate; /* Index of next lower basic rate, used for duration computation */
187 A_RSSI rssiAckValidMin; /* Rate control related information */
188 A_RSSI rssiAckDeltaMin; /* Rate control related information */
189 A_UINT16 lpAckDuration; /* long preamble ACK duration */
190 A_UINT16 spAckDuration; /* short preamble ACK duration*/
191 A_UINT32 max4msFrameLen; /* Maximum frame length(bytes) for 4ms tx duration */
193 A_UINT32 word4Retries;
197 A_UINT32 word4Retries;
201 A_UINT32 word4Retries;
205 A_UINT32 word4Retries;
209 A_UINT32 word4Retries;
213 A_UINT32 word4Retries;
216 #ifdef ATH_REMOVE_5G_RATE_TABLE
217 #ifdef ATH_REMOVE_TURBO_RATE_TABLE
218 #ifdef ATH_REMOVE_XR_RATE_TABLE
229 A_UINT32 probeInterval; /* interval for ratectrl to probe for
231 A_UINT32 rssiReduceInterval; /* interval for ratectrl to reduce RSSI */
232 A_UINT8 regularToTurboThresh; /* upperbound on regular (11a or 11g)
233 mode's rate before switching to turbo*/
234 A_UINT8 turboToRegularThresh; /* lowerbound on turbo mode's rate before
235 switching to regular */
236 A_UINT8 pktCountThresh; /* mode switch recommendation criterion:
237 number of consecutive packets sent at
238 rate beyond the rate threshold */
239 A_UINT8 initialRateMax; /* the initial rateMax value used in
241 A_UINT8 numTurboRates; /* number of Turbo rates in the rateTable */
242 A_UINT8 xrToRegularThresh; /* threshold to switch to Normal mode */
245 /* per-device state */
246 struct atheros_softc {
247 struct ath_ratectrl arc;
248 /* phy tables that contain rate control data */
249 void *hwRateTable[WIRELESS_MODE_MAX];
250 A_UINT32 tx_chainmask;
251 A_UINT32 currentTxRateKbps;
252 A_UINT32 currentTxRateIndex;
256 * Update the SIB's rate control information
258 * This should be called when the supported rates change
259 * (e.g. SME operation, wireless mode change)
261 * It will determine which rates are valid for use.
264 rcSibUpdate(struct ath_softc_tgt *sc,
265 struct ath_node_target *an,
267 struct ieee80211_rateset *pRateSet);
270 * This routine is called to initialize the rate control parameters
271 * in the SIB. It is called initially during system initialization
272 * or when a station is associated with the AP.
274 void rcSibInit(struct ath_softc_tgt *, struct ath_node_target *);
277 * Determines and returns the new Tx rate index.
279 A_UINT16 rcRateFind(struct ath_softc_tgt *, struct atheros_node *,
280 A_UINT32 frameLen,const RATE_TABLE *pRateTable);
282 struct fusion_rate_info {
288 void ar5416AttachRateTables(struct atheros_softc *sc);
290 #endif /* _RATECTRL_H_ */