ea79d12b835685b47ffe9618bda9b153d80eb81c
[open-ath9k-htc-firmware.git] / target_firmware / wlan / ah.c
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 #include "ah.h"
37 #include "ah_internal.h"
38 #include <asf_bitmap.h>
39
40 extern struct ath_hal *ar5416Attach(a_uint32_t devid,HAL_SOFTC sc, adf_os_device_t dev,
41                                     a_uint32_t flags, HAL_STATUS *status);
42
43 struct ath_hal*
44 ath_hal_attach_tgt(a_uint32_t devid,HAL_SOFTC sc,
45                    adf_os_device_t dev,
46                    a_uint32_t flags, HAL_STATUS *error)
47 {
48         struct ath_hal *ah = AH_NULL;
49
50         devid = AR5416_DEVID_PCIE;
51         ah = ar5416Attach(devid, sc, dev, flags, error);
52
53         return ah;
54 }
55
56 HAL_STATUS
57 ath_hal_getcapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type)
58 {
59         const HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
60         switch (type) {
61         case HAL_CAP_TSF_ADJUST:
62                 return HAL_ENOTSUPP;
63         case HAL_CAP_BSSIDMASK:
64                 return pCap->halBssIdMaskSupport ? HAL_OK : HAL_ENOTSUPP;
65         case HAL_CAP_VEOL:
66                 return pCap->halVEOLSupport ? HAL_OK : HAL_ENOTSUPP;
67         default:
68                 return HAL_EINVAL;
69         }
70 }
71
72 #define CCK_SIFS_TIME        10
73 #define CCK_PREAMBLE_BITS   144
74 #define CCK_PLCP_BITS        48
75
76 #define OFDM_SIFS_TIME        16
77 #define OFDM_PREAMBLE_TIME    20
78 #define OFDM_PLCP_BITS        22
79 #define OFDM_SYMBOL_TIME       4
80
81 #define OFDM_SIFS_TIME_HALF     32
82 #define OFDM_PREAMBLE_TIME_HALF 40
83 #define OFDM_PLCP_BITS_HALF     22
84 #define OFDM_SYMBOL_TIME_HALF   8
85
86 #define OFDM_SIFS_TIME_QUARTER      64
87 #define OFDM_PREAMBLE_TIME_QUARTER  80
88 #define OFDM_PLCP_BITS_QUARTER      22
89 #define OFDM_SYMBOL_TIME_QUARTER    16
90
91 a_uint16_t
92 ath_hal_computetxtime(struct ath_hal *ah,
93                       const HAL_RATE_TABLE *rates, a_uint32_t frameLen, a_uint16_t rateix,
94                       HAL_BOOL shortPreamble)
95 {
96         a_uint32_t bitsPerSymbol, numBits, numSymbols, phyTime, txTime;
97         a_uint32_t kbps;
98
99         kbps = rates->info[rateix].rateKbps;
100
101         /*
102          * index can be invalid duting dynamic Turbo transitions.
103          */
104         if(kbps == 0) return 0;
105         switch (rates->info[rateix].phy) {
106
107         case IEEE80211_T_CCK:
108                 phyTime = CCK_PREAMBLE_BITS + CCK_PLCP_BITS;
109                 if (shortPreamble && rates->info[rateix].shortPreamble)
110                         phyTime >>= 1;
111                 numBits = frameLen << 3;
112                 txTime = phyTime + ((numBits * 1000)/kbps);
113                 /* TODO: make sure the same value of txTime can use in all device */
114                 if (ath_hal_getcapability(ah, HAL_CAP_HT) != HAL_OK)
115                         txTime = txTime + CCK_SIFS_TIME;
116                 break;
117         case IEEE80211_T_OFDM:
118                 /* full rate channel */
119                 bitsPerSymbol   = (kbps * OFDM_SYMBOL_TIME) / 1000;
120                 HALASSERT(bitsPerSymbol != 0);
121
122                 numBits = OFDM_PLCP_BITS + (frameLen << 3);
123                 numSymbols = asf_howmany(numBits, bitsPerSymbol);
124                 txTime = OFDM_PREAMBLE_TIME + (numSymbols * OFDM_SYMBOL_TIME);
125                 /* TODO: make sure the same value of txTime can use in all device */
126                 if (ath_hal_getcapability(ah, HAL_CAP_HT) != HAL_OK)
127                         txTime = txTime + OFDM_SIFS_TIME;
128                 break;
129         default:
130                 txTime = 0;
131                 break;
132         }
133         return txTime;
134 }
135
136 #undef CCK_SIFS_TIME
137 #undef CCK_PREAMBLE_BITS
138 #undef CCK_PLCP_BITS
139
140 #undef OFDM_SIFS_TIME
141 #undef OFDM_PREAMBLE_TIME
142 #undef OFDM_PLCP_BITS
143 #undef OFDM_SYMBOL_TIME
144
145 #ifdef MAGPIE_MERLIN
146 a_uint32_t 
147 ath_hal_get_curmode(struct ath_hal *ah, HAL_CHANNEL_INTERNAL *chan)
148 {
149         if (!chan)
150                 return HAL_MODE_11NG;
151
152         if (IS_CHAN_NA(chan))
153                 return HAL_MODE_11NA; 
154
155         if (IS_CHAN_A(chan))
156                 return HAL_MODE_11A;
157
158         if (IS_CHAN_NG(chan))
159                 return HAL_MODE_11NG;
160
161         if (IS_CHAN_G(chan))
162                 return HAL_MODE_11G;
163
164         if (IS_CHAN_B(chan))
165                 return HAL_MODE_11B;
166
167         HALASSERT(0);
168         return HAL_MODE_11NG;
169 }
170
171 #endif
172
173 HAL_BOOL
174 ath_hal_wait(struct ath_hal *ah, a_uint32_t reg, a_uint32_t mask, a_uint32_t val)
175 {
176 #define AH_TIMEOUT_11N 100000
177 #define AH_TIMEOUT_11G  1000
178
179         a_int32_t i;
180
181         if (ath_hal_getcapability(ah, HAL_CAP_HT) == HAL_OK) {
182                 for (i = 0; i < AH_TIMEOUT_11N; i++) {
183                         if ((OS_REG_READ(ah, reg) & mask) == val)
184                                 return AH_TRUE;
185                         OS_DELAY(10);
186                 }
187         } else {
188                 for (i = 0; i < AH_TIMEOUT_11G; i++) {
189                         if ((OS_REG_READ(ah, reg) & mask) == val)
190                                 return AH_TRUE;
191                         OS_DELAY(10);
192                 }
193         }
194         return AH_FALSE;
195
196 #undef AH_TIMEOUT_11N
197 #undef AH_TIMEOUT_11G
198 }