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.
36 #ifndef _RATECTRL11N_H_
37 #define _RATECTRL11N_H_
39 /* HT 20/40 rates. If 20 bit is enabled then that rate is
40 * used only in 20 mode. If both 20/40 bits are enabled
41 * then that rate can be used for both 20 and 40 mode */
45 #define TRUE_2040 (TRUE_20|TRUE_40)
46 #define TRUE_ALL_11N (TRUE_2040|TRUE)
62 #define WLAN_RC_PHY_DS(_phy) ((_phy == WLAN_RC_PHY_HT_20_DS) \
63 || (_phy == WLAN_RC_PHY_HT_40_DS) \
64 || (_phy == WLAN_RC_PHY_HT_20_DS_HGI) \
65 || (_phy == WLAN_RC_PHY_HT_40_DS_HGI))
66 #define WLAN_RC_PHY_40(_phy) ((_phy == WLAN_RC_PHY_HT_40_SS) \
67 || (_phy == WLAN_RC_PHY_HT_40_DS) \
68 || (_phy == WLAN_RC_PHY_HT_40_SS_HGI) \
69 || (_phy == WLAN_RC_PHY_HT_40_DS_HGI))
70 #define WLAN_RC_PHY_20(_phy) ((_phy == WLAN_RC_PHY_HT_20_SS) \
71 || (_phy == WLAN_RC_PHY_HT_20_DS) \
72 || (_phy == WLAN_RC_PHY_HT_20_SS_HGI) \
73 || (_phy == WLAN_RC_PHY_HT_20_DS_HGI))
74 #define WLAN_RC_PHY_SGI(_phy) ((_phy == WLAN_RC_PHY_HT_20_SS_HGI) \
75 || (_phy == WLAN_RC_PHY_HT_20_DS_HGI) \
76 || (_phy == WLAN_RC_PHY_HT_40_SS_HGI) \
77 || (_phy == WLAN_RC_PHY_HT_40_DS_HGI))
79 #define WLAN_RC_PHY_HT(_phy) (_phy >= WLAN_RC_PHY_HT_20_SS)
81 /* Returns the capflag mode */
83 #define WLAN_RC_CAP_MODE(capflag) (((capflag & WLAN_RC_HT_FLAG)? \
84 (capflag & WLAN_RC_40_FLAG)?TRUE_40:TRUE_20: \
87 /* Return TRUE if flag supports HT20 && client supports HT20 or
88 * return TRUE if flag supports HT40 && client supports HT40.
89 * This is used becos some rates overlap between HT20/HT40.
92 #define WLAN_RC_PHY_HT_VALID(flag, capflag) (((flag & TRUE_20) && !(capflag \
93 & WLAN_RC_40_FLAG)) || ((flag & TRUE_40) && \
94 (capflag & WLAN_RC_40_FLAG)))
96 #define WLAN_RC_DS_FLAG (0x01)
97 #define WLAN_RC_40_FLAG (0x02)
98 #define WLAN_RC_HT40_SGI_FLAG (0x04)
99 #define WLAN_RC_HT_FLAG (0x08)
100 #define WLAN_RC_STBC_FLAG (0x30) /* 2 bits */
101 #define WLAN_RC_STBC_FLAG_S ( 4)
102 #define WLAN_RC_WEP_TKIP_FLAG (0x100)
104 /* Index into the rate table */
105 #define INIT_RATE_MAX_20 23
106 #define INIT_RATE_MAX_40 40
109 * Rate Table structure for various modes - 'b', 'a', 'g', 'xr';
110 * order of fields in info structure is important because hardcoded
111 * structures are initialized within the hal for these
114 #ifndef MAGPIE_MERLIN // K2
115 #define RATE_TABLE_11N_SIZE 54
117 #define RATE_TABLE_11N_SIZE 64
120 #define MAX_SUPPORTED_MCS 128
122 typedef struct regDataLenTable {
124 A_UINT16 frameLenRateIndex[RATE_TABLE_11N_SIZE];
128 A_BOOL valid; /* Valid for use in rate control */
129 A_BOOL validSingleStream;/* Valid for use in rate control for single stream operation */
131 A_BOOL validSTBC; /* Valid for use in rate control for single stream operation */
133 WLAN_PHY phy; /* CCK/OFDM/TURBO/XR */
134 A_UINT32 rateKbps; /* Rate in Kbits per second */
135 A_UINT32 userRateKbps; /* User rate in KBits per second */
136 A_UINT8 rateCode; /* rate that goes into hw descriptors */
137 A_UINT8 shortPreamble; /* Mask for enabling short preamble in rate code for CCK */
138 A_UINT8 dot11Rate; /* Value that goes into supported rates info element of MLME */
139 A_UINT8 controlRate; /* Index of next lower basic rate, used for duration computation */
140 A_RSSI rssiAckValidMin; /* Rate control related information */
141 A_RSSI rssiAckDeltaMin; /* Rate control related information */
142 A_UINT8 baseIndex; /* base rate index */
143 A_UINT8 cw40Index; /* 40cap rate index */
144 A_UINT8 sgiIndex; /* shortgi rate index */
145 A_UINT8 htIndex; /* shortgi rate index */
146 A_UINT8 txChainMask_2ch; /* transmit chain mask */
147 A_UINT8 txChainMask_3ch; /* transmit chain mask */
148 A_UINT32 max4msframelen; /* Maximum frame length(bytes) for 4ms tx duration */
149 A_BOOL uapsdvalid; /* Valid for UAPSD nodes */
154 A_UINT8 probeInterval; /* interval for ratectrl to probe for other rates */
155 A_UINT8 rssiReduceInterval; /* interval for ratectrl to reduce RSSI */
156 A_UINT8 initialRateMax; /* the initial rateMax value used in rcSibUpdate() */
161 * Update the SIB's rate control information
163 * This should be called when the supported rates change
164 * (e.g. SME operation, wireless mode change)
166 * It will determine which rates are valid for use.
168 void rcSibUpdate_11n(struct ath_softc_tgt *,
169 struct ath_node_target *,
172 struct ieee80211_rate *rs);
175 * Determines and returns the new Tx rate index.
177 void rcRateFind_11n(struct ath_softc_tgt *sc,
178 struct ath_node_target *an,
183 struct ath_rc_series series[],
187 * This routine is called by the Tx interrupt service routine to give
188 * the status of previous frames.
190 void rcUpdate_11n(struct ath_softc_tgt *sc,
191 struct ath_node_target *an,
195 struct ath_rc_series rcs[],
200 void ath_tx_status_update_rate(struct ath_softc_tgt *sc,
201 struct ath_rc_series rcs[],
203 WMI_TXSTATUS_EVENT *txs);
205 #endif /* _RATECTRL11N_H_ */