ath9k_htc: Update to upstream's commit d19607454d656cb14d8c16dfbf161eebb542e8fe dated...
[linux-libre-firmware.git] / ath9k_htc / target_firmware / wlan / ratectrl11n.h
1 /*
2  * Copyright (c) 2013 Qualcomm Atheros, Inc.
3  * All rights reserved.
4  *
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:
8  *
9  *  * Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
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
15  *    distribution.
16  *
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.
20  *
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.
34  */
35
36 #ifndef _RATECTRL11N_H_
37 #define _RATECTRL11N_H_
38
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 */
42
43 #define TRUE_20         0x2
44 #define TRUE_40         0x4
45 #define TRUE_2040       (TRUE_20|TRUE_40)
46 #define TRUE_ALL_11N    (TRUE_2040|TRUE)
47
48 enum {
49         WLAN_RC_DS  = 0x01,
50         WLAN_RC_40  = 0x02,
51         WLAN_RC_SGI = 0x04,
52         WLAN_RC_HT  = 0x08,
53 };
54
55 typedef enum {
56         WLAN_RC_LEGACY      = 0,
57         WLAN_RC_HT_LNPHY    = 1,
58         WLAN_RC_HT_PLPHY    = 2,
59         WLAN_RC_MAX         = 3
60 } WLAN_RC_VERS;
61
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))
78
79 #define WLAN_RC_PHY_HT(_phy)    (_phy >= WLAN_RC_PHY_HT_20_SS)
80
81 /* Returns the capflag mode */
82
83 #define WLAN_RC_CAP_MODE(capflag) (((capflag & WLAN_RC_HT_FLAG)?        \
84                                     (capflag & WLAN_RC_40_FLAG)?TRUE_40:TRUE_20: \
85                                     TRUE))
86
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.
90  */
91
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)))
95
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)
103
104 /* Index into the rate table */
105 #define INIT_RATE_MAX_20        23
106 #define INIT_RATE_MAX_40        40
107
108 /*
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
112  */
113
114 #ifndef MAGPIE_MERLIN // K2
115 #define RATE_TABLE_11N_SIZE             54
116 #else
117 #define RATE_TABLE_11N_SIZE             64
118 #endif
119
120 #define MAX_SUPPORTED_MCS           128
121
122 typedef struct regDataLenTable {
123         A_UINT8     numEntries;
124         A_UINT16    frameLenRateIndex[RATE_TABLE_11N_SIZE];
125 } REG_DATALEN_TABLE;
126
127 typedef struct {
128         A_BOOL    valid;            /* Valid for use in rate control */
129         A_BOOL    validSingleStream;/* Valid for use in rate control for single stream operation */
130 #ifdef MAGPIE_MERLIN
131         A_BOOL    validSTBC;        /* Valid for use in rate control for single stream operation */
132 #endif
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 */
150 } rc11n_info_t;
151
152 typedef struct {
153         A_UINT8          rateCount;
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() */
157         rc11n_info_t     info[];
158 } RATE_TABLE_11N;
159
160 /*
161  * Determines and returns the new Tx rate index.
162  */
163 void rcRateFind_11n(struct ath_softc_tgt *sc,
164                     struct ath_node_target *an,
165                     int numTries,
166                     int numRates,
167                     int stepDnInc,
168                     unsigned int rcflag,
169                     struct ath_rc_series series[],
170                     int *isProbe);
171
172 /*
173  * This routine is called by the Tx interrupt service routine to give
174  * the status of previous frames.
175  */
176 void rcUpdate_11n(struct ath_softc_tgt *sc,
177                   struct ath_node_target *an,
178                   A_UINT8 curTxAnt,
179                   int finalTSIdx,
180                   int Xretries,
181                   struct ath_rc_series rcs[],
182                   int nFrames,
183                   int nBad,
184                   int sh_lo_retry);
185
186 #endif /* _RATECTRL11N_H_ */