ath - Reimport fresh from FreeBSD 01-Jan-2014 for re-port
[dragonfly.git] / sys / contrib / dev / ath / ath_hal / ar9300 / ar9300_tx99_tgt.c
1 /*
2  * Copyright (c) 2013 Qualcomm Atheros, Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10  * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14  * PERFORMANCE OF THIS SOFTWARE.
15  */
16 /*
17  *  Copyright (c) 2010 Atheros Communications Inc.
18  *
19  * Permission to use, copy, modify, and/or distribute this software for any
20  * purpose with or without fee is hereby granted, provided that the above
21  * copyright notice and this permission notice appear in all copies.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
24  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
26  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
27  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
28  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30  */
31
32 #include "ah.h"
33 #include "ah_internal.h"
34 #include "ar9300phy.h"
35 #include "ar9300reg.h"
36 #include "ar9300eep.h"
37
38 #ifdef ATH_TX99_DIAG
39 void 
40 ar9300_tx99_tgt_channel_pwr_update(struct ath_hal *ah, HAL_CHANNEL *c, u_int32_t txpower)
41 {
42 #define PWR_MAS(_r, _s)     (((_r) & 0x3f) << (_s))
43     static int16_t pPwrArray[ar9300_rate_size] = { 0 };
44     int32_t i;
45     //u_int8_t ht40PowerIncForPdadc = 2;
46     
47     for (i = 0; i < ar9300_rate_size; i++)
48         pPwrArray[i] = txpower;
49
50     OS_REG_WRITE(ah, AR_PHY_TX_FORCED_GAIN, 0);
51
52     /* Write the OFDM power per rate set */
53     /* 6 (LSB), 9, 12, 18 (MSB) */
54     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(1),
55         PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_6_24], 24)
56           | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_6_24], 16)
57           | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_6_24],  8)
58           | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_6_24],  0)
59     );
60     /* 24 (LSB), 36, 48, 54 (MSB) */
61     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(2),
62         PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_54], 24)
63           | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_48], 16)
64           | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_36],  8)
65           | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_6_24],  0)
66     );
67
68         /* Write the CCK power per rate set */
69     /* 1L (LSB), reserved, 2L, 2S (MSB) */  
70         OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(3),
71             PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 24)
72                   | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_1L_5L],  16)
73 //                | PWR_MAS(txPowerTimes2,  8) /* this is reserved for Osprey */
74                   | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_1L_5L],   0)
75         );
76     /* 5.5L (LSB), 5.5S, 11L, 11S (MSB) */
77         OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(4),
78             PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_11S], 24)
79                   | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_11L], 16)
80                   | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_5S],  8)
81                   | PWR_MAS(pPwrArray[ALL_TARGET_LEGACY_1L_5L],  0)
82         );
83
84     /* Write the HT20 power per rate set */
85     /* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */
86     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(5),
87         PWR_MAS(pPwrArray[ALL_TARGET_HT20_5], 24)
88           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_4],  16)
89           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_1_3_9_11_17_19],  8)
90           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_0_8_16],   0)
91     );
92     
93     /* 6 (LSB), 7, 12, 13 (MSB) */
94     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(6),
95         PWR_MAS(pPwrArray[ALL_TARGET_HT20_13], 24)
96           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_12],  16)
97           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_7],  8)
98           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_6],   0)
99     );
100
101     /* 14 (LSB), 15, 20, 21 */
102     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(10),
103         PWR_MAS(pPwrArray[ALL_TARGET_HT20_21], 24)
104           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_20],  16)
105           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_15],  8)
106           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_14],   0)
107     );
108
109     /* Mixed HT20 and HT40 rates */
110     /* HT20 22 (LSB), HT20 23, HT40 22, HT40 23 (MSB) */
111     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(11),
112         PWR_MAS(pPwrArray[ALL_TARGET_HT40_23], 24)
113           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_22],  16)
114           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_23],  8)
115           | PWR_MAS(pPwrArray[ALL_TARGET_HT20_22],   0)
116     );
117     
118     /* Write the HT40 power per rate set */
119     // correct PAR difference between HT40 and HT20/LEGACY
120     /* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */
121     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(7),
122         PWR_MAS(pPwrArray[ALL_TARGET_HT40_5], 24)
123           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_4],  16)
124           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_1_3_9_11_17_19],  8)
125           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_0_8_16],   0)
126     );
127
128     /* 6 (LSB), 7, 12, 13 (MSB) */
129     OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(8),
130         PWR_MAS(pPwrArray[ALL_TARGET_HT40_13], 24)
131           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_12],  16)
132           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_7], 8)
133           | PWR_MAS(pPwrArray[ALL_TARGET_HT40_6], 0)
134     );
135
136     /* 14 (LSB), 15, 20, 21 */
137         OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE(12),
138             PWR_MAS(pPwrArray[ALL_TARGET_HT40_21], 24)
139               | PWR_MAS(pPwrArray[ALL_TARGET_HT40_20],  16)
140               | PWR_MAS(pPwrArray[ALL_TARGET_HT40_15],  8)
141               | PWR_MAS(pPwrArray[ALL_TARGET_HT40_14],   0)
142         );  
143 #undef PWR_MAS
144 }
145
146 void
147 ar9300_tx99_tgt_chainmsk_setup(struct ath_hal *ah, int tx_chainmask)
148 {
149     if (tx_chainmask == 0x5) {
150         OS_REG_WRITE(ah, AR_PHY_ANALOG_SWAP, OS_REG_READ(ah, AR_PHY_ANALOG_SWAP) | AR_PHY_SWAP_ALT_CHAIN);
151     }
152     OS_REG_WRITE(ah, AR_PHY_RX_CHAINMASK, tx_chainmask);
153     OS_REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, tx_chainmask);
154
155     OS_REG_WRITE(ah, AR_SELFGEN_MASK, tx_chainmask);
156     if (tx_chainmask == 0x5) {
157         OS_REG_WRITE(ah, AR_PHY_ANALOG_SWAP, OS_REG_READ(ah, AR_PHY_ANALOG_SWAP) | AR_PHY_SWAP_ALT_CHAIN);
158     }
159 }
160
161 void
162 ar9300_tx99_tgt_set_single_carrier(struct ath_hal *ah, int tx_chain_mask, int chtype)
163 {
164     OS_REG_WRITE(ah, AR_PHY_TST_DAC_CONST, OS_REG_READ(ah, AR_PHY_TST_DAC_CONST) | (0x7ff<<11) | 0x7ff);
165     OS_REG_WRITE(ah, AR_PHY_TEST_CTL_STATUS, OS_REG_READ(ah, AR_PHY_TEST_CTL_STATUS) | (1<<7) | (1<<1));
166     OS_REG_WRITE(ah, AR_PHY_ADDAC_PARA_CTL, (OS_REG_READ(ah, AR_PHY_ADDAC_PARA_CTL) | (1<<31) | (1<<15)) & ~(1<<13));
167
168     /* 11G mode */
169     if (!chtype)
170     {
171         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX2, OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX2)
172                                                     | (0x1 << 3) | (0x1 << 2));
173         if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
174             OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP)
175                                                         & ~(0x1 << 4)); 
176             OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP2, (OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP2)
177                                                         | (0x1 << 26)  | (0x7 << 24)) 
178                                                         & ~(0x1 << 22));
179         } else {
180             OS_REG_WRITE(ah, AR_HORNET_CH0_TOP, OS_REG_READ(ah, AR_HORNET_CH0_TOP)
181                                                         & ~(0x1 << 4)); 
182             OS_REG_WRITE(ah, AR_HORNET_CH0_TOP2, (OS_REG_READ(ah, AR_HORNET_CH0_TOP2)
183                                                         | (0x1 << 26)  | (0x7 << 24)) 
184                                                         & ~(0x1 << 22));
185         }                                                    
186         
187         /* chain zero */
188         if((tx_chain_mask & 0x01) == 0x01) {
189                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX1, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX1)
190                                                           | (0x1 << 31) | (0x5 << 15) 
191                                                           | (0x3 << 9)) & ~(0x1 << 27) 
192                                                           & ~(0x1 << 12));
193                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX2)
194                                                           | (0x1 << 12) | (0x1 << 10) 
195                                                           | (0x1 << 9)  | (0x1 << 8)  
196                                                           | (0x1 << 7)) & ~(0x1 << 11));                                      
197                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX3, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX3)
198                                                           | (0x1 << 29) | (0x1 << 25) 
199                                                           | (0x1 << 23) | (0x1 << 19) 
200                                                           | (0x1 << 10) | (0x1 << 9)  
201                                                           | (0x1 << 8)  | (0x1 << 3))
202                                                           & ~(0x1 << 28)& ~(0x1 << 24)
203                                                           & ~(0x1 << 22)& ~(0x1 << 7));
204                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TXRF1, (OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF1)
205                                                           | (0x1 << 23))& ~(0x1 << 21));
206                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_BB1, OS_REG_READ(ah, AR_PHY_65NM_CH0_BB1)
207                                                           | (0x1 << 12) | (0x1 << 10)
208                                                           | (0x1 << 9)  | (0x1 << 8)
209                                                           | (0x1 << 6)  | (0x1 << 5)
210                                                           | (0x1 << 4)  | (0x1 << 3)
211                                                           | (0x1 << 2));                                                          
212             OS_REG_WRITE(ah, AR_PHY_65NM_CH0_BB2, OS_REG_READ(ah, AR_PHY_65NM_CH0_BB2)
213                                                           | (0x1 << 31));                                                 
214         }
215         if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
216             /* chain one */
217                 if ((tx_chain_mask & 0x02) == 0x02 ) {
218                     OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX1, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX1)
219                                                               | (0x1 << 31) | (0x5 << 15) 
220                                                               | (0x3 << 9)) & ~(0x1 << 27) 
221                                                               & ~(0x1 << 12));
222                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX2)
223                                                               | (0x1 << 12) | (0x1 << 10) 
224                                                               | (0x1 << 9)  | (0x1 << 8)  
225                                                               | (0x1 << 7)) & ~(0x1 << 11));
226                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX3, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX3)
227                                                               | (0x1 << 29) | (0x1 << 25) 
228                                                               | (0x1 << 23) | (0x1 << 19) 
229                                                               | (0x1 << 10) | (0x1 << 9)  
230                                                               | (0x1 << 8)  | (0x1 << 3))
231                                                               & ~(0x1 << 28)& ~(0x1 << 24)
232                                                               & ~(0x1 << 22)& ~(0x1 << 7));
233                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_TXRF1, (OS_REG_READ(ah, AR_PHY_65NM_CH1_TXRF1)
234                                                               | (0x1 << 23))& ~(0x1 << 21));
235                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_BB1, OS_REG_READ(ah, AR_PHY_65NM_CH1_BB1)
236                                                               | (0x1 << 12) | (0x1 << 10)
237                                                               | (0x1 << 9)  | (0x1 << 8)
238                                                               | (0x1 << 6)  | (0x1 << 5)
239                                                               | (0x1 << 4)  | (0x1 << 3)
240                                                               | (0x1 << 2));                                            
241                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_BB2, OS_REG_READ(ah, AR_PHY_65NM_CH1_BB2)
242                                                               | (0x1 << 31));   
243                 }
244         }
245         if (AR_SREV_OSPREY(ah)) {
246                 /* chain two */
247                 if ((tx_chain_mask & 0x04) == 0x04 ) {
248                     OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX1, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX1)
249                                                               | (0x1 << 31) | (0x5 << 15) 
250                                                               | (0x3 << 9)) & ~(0x1 << 27)
251                                                               & ~(0x1 << 12));
252                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX2)
253                                                               | (0x1 << 12) | (0x1 << 10) 
254                                                               | (0x1 << 9)  | (0x1 << 8)  
255                                                               | (0x1 << 7)) & ~(0x1 << 11));
256                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX3, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX3)
257                                                               | (0x1 << 29) | (0x1 << 25) 
258                                                               | (0x1 << 23) | (0x1 << 19) 
259                                                               | (0x1 << 10) | (0x1 << 9)  
260                                                               | (0x1 << 8)  | (0x1 << 3)) 
261                                                               & ~(0x1 << 28)& ~(0x1 << 24) 
262                                                               & ~(0x1 << 22)& ~(0x1 << 7));
263                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_TXRF1, (OS_REG_READ(ah, AR_PHY_65NM_CH2_TXRF1)
264                                                               | (0x1 << 23))& ~(0x1 << 21));
265                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_BB1, OS_REG_READ(ah, AR_PHY_65NM_CH2_BB1)
266                                                               | (0x1 << 12) | (0x1 << 10)
267                                                               | (0x1 << 9)  | (0x1 << 8)
268                                                               | (0x1 << 6)  | (0x1 << 5)
269                                                               | (0x1 << 4)  | (0x1 << 3)
270                                                               | (0x1 << 2));                                            
271                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_BB2, OS_REG_READ(ah, AR_PHY_65NM_CH2_BB2)
272                                                               | (0x1 << 31));   
273                 }
274         }
275         
276         OS_REG_WRITE(ah, AR_PHY_SWITCH_COM_2, 0x11111);
277         OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, 0x111);      
278     }
279     else
280     {
281         /* chain zero */
282         if((tx_chain_mask & 0x01) == 0x01) {
283             OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX1, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX1)
284                                                               | (0x1 << 31) | (0x1 << 27)
285                                                           | (0x3 << 23) | (0x1 << 19)
286                                                           | (0x1 << 15) | (0x3 << 9))
287                                                           & ~(0x1 << 12));
288                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX2)
289                                                           | (0x1 << 12) | (0x1 << 10) 
290                                                           | (0x1 << 9)  | (0x1 << 8)  
291                                                           | (0x1 << 7)  | (0x1 << 3)  
292                                                           | (0x1 << 2)  | (0x1 << 1)) 
293                                                           & ~(0x1 << 11)& ~(0x1 << 0));
294             OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX3, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX3)
295                                                                       | (0x1 << 29) | (0x1 << 25) 
296                                                           | (0x1 << 23) | (0x1 << 19) 
297                                                           | (0x1 << 10) | (0x1 << 9)  
298                                                           | (0x1 << 8)  | (0x1 << 3))
299                                                           & ~(0x1 << 28)& ~(0x1 << 24)
300                                                           & ~(0x1 << 22)& ~(0x1 << 7));
301                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TXRF1, (OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF1)
302                                                                       | (0x1 << 23))& ~(0x1 << 21));
303                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TXRF2, OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF2)
304                                                           | (0x3 << 3)  | (0x3 << 0));
305                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TXRF3, (OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF3)
306                                                           | (0x3 << 29) | (0x3 << 26)
307                                                           | (0x2 << 23) | (0x2 << 20)
308                                                           | (0x2 << 17))& ~(0x1 << 14));
309                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_BB1, OS_REG_READ(ah, AR_PHY_65NM_CH0_BB1)
310                                                                       | (0x1 << 12) | (0x1 << 10)
311                                                           | (0x1 << 9)  | (0x1 << 8)
312                                                           | (0x1 << 6)  | (0x1 << 5)
313                                                           | (0x1 << 4)  | (0x1 << 3)
314                                                           | (0x1 << 2));
315                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_BB2, OS_REG_READ(ah, AR_PHY_65NM_CH0_BB2)
316                                                           | (0x1 << 31));
317                         if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
318                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP)
319                                                                       & ~(0x1 << 4));
320                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP2, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP2)
321                                                                   | (0x1 << 26) | (0x7 << 24)
322                                                                   | (0x3 << 22));
323             } else {
324                         OS_REG_WRITE(ah, AR_HORNET_CH0_TOP, OS_REG_READ(ah, AR_HORNET_CH0_TOP)
325                                                                       & ~(0x1 << 4));
326                         OS_REG_WRITE(ah, AR_HORNET_CH0_TOP2, OS_REG_READ(ah, AR_HORNET_CH0_TOP2)
327                                                                   | (0x1 << 26) | (0x7 << 24)
328                                                                   | (0x3 << 22));
329                     }                                                    
330                                     
331             if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
332                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX2)
333                                                                       | (0x1 << 3)  | (0x1 << 2)
334                                                               | (0x1 << 1)) & ~(0x1 << 0));
335                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX3, OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX3)
336                                                                       | (0x1 << 19) | (0x1 << 3));
337                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_TXRF1, OS_REG_READ(ah, AR_PHY_65NM_CH1_TXRF1)
338                                                                       | (0x1 << 23));
339                         }
340                         if (AR_SREV_OSPREY(ah)) {               
341                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX2)
342                                                                       | (0x1 << 3)  | (0x1 << 2)
343                                                               | (0x1 << 1)) & ~(0x1 << 0));
344                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX3, OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX3)
345                                                                       | (0x1 << 19) | (0x1 << 3));
346                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_TXRF1, OS_REG_READ(ah, AR_PHY_65NM_CH2_TXRF1)
347                                                                       | (0x1 << 23));
348             }
349         }
350         if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
351             /* chain one */
352                 if ((tx_chain_mask & 0x02) == 0x02 ) {
353                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX2)
354                                                               | (0x1 << 3)  | (0x1 << 2)
355                                                               | (0x1 << 1)) & ~(0x1 << 0));
356                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX3, OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX3)
357                                                                       | (0x1 << 19) | (0x1 << 3));
358                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TXRF1, OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF1)
359                                                                       | (0x1 << 23));
360                         if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
361                                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP)
362                                                                   & ~(0x1 << 4));
363                                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP2, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP2)
364                                                                           | (0x1 << 26) | (0x7 << 24)
365                                                                           | (0x3 << 22));
366                 } else {
367                                 OS_REG_WRITE(ah, AR_HORNET_CH0_TOP, OS_REG_READ(ah, AR_HORNET_CH0_TOP)
368                                                                   & ~(0x1 << 4));
369                                 OS_REG_WRITE(ah, AR_HORNET_CH0_TOP2, OS_REG_READ(ah, AR_HORNET_CH0_TOP2)
370                                                                           | (0x1 << 26) | (0x7 << 24)
371                                                                           | (0x3 << 22));
372                 }
373                 
374                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX1, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX1)
375                                                                       | (0x1 << 31) | (0x1 << 27)
376                                                               | (0x3 << 23) | (0x1 << 19)
377                                                               | (0x1 << 15) | (0x3 << 9)) 
378                                                               & ~(0x1 << 12));
379                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX2)
380                                                               | (0x1 << 12) | (0x1 << 10) 
381                                                               | (0x1 << 9)  | (0x1 << 8)  
382                                                               | (0x1 << 7)  | (0x1 << 3)  
383                                                               | (0x1 << 2)  | (0x1 << 1))  
384                                                               & ~(0x1 << 11)& ~(0x1 << 0));
385                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX3, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX3)
386                                                                       | (0x1 << 29) | (0x1 << 25) 
387                                                               | (0x1 << 23) | (0x1 << 19) 
388                                                               | (0x1 << 10) | (0x1 << 9)  
389                                                               | (0x1 << 8)  | (0x1 << 3))
390                                                               & ~(0x1 << 28)& ~(0x1 << 24)
391                                                               & ~(0x1 << 22)& ~(0x1 << 7));
392                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_TXRF1, (OS_REG_READ(ah, AR_PHY_65NM_CH1_TXRF1)
393                                                                       | (0x1 << 23))& ~(0x1 << 21));
394                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_TXRF2, OS_REG_READ(ah, AR_PHY_65NM_CH1_TXRF2)
395                                                               | (0x3 << 3)  | (0x3 << 0));
396                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_TXRF3, (OS_REG_READ(ah, AR_PHY_65NM_CH1_TXRF3)
397                                                               | (0x3 << 29) | (0x3 << 26)
398                                                               | (0x2 << 23) | (0x2 << 20)
399                                                               | (0x2 << 17))& ~(0x1 << 14));
400                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_BB1, OS_REG_READ(ah, AR_PHY_65NM_CH1_BB1)
401                                                                       | (0x1 << 12) | (0x1 << 10)
402                                                               | (0x1 << 9)  | (0x1 << 8)
403                                                               | (0x1 << 6)  | (0x1 << 5)
404                                                               | (0x1 << 4)  | (0x1 << 3)
405                                                               | (0x1 << 2));
406                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_BB2, OS_REG_READ(ah, AR_PHY_65NM_CH1_BB2)
407                                                               | (0x1 << 31));
408                         
409                         if (AR_SREV_OSPREY(ah)) {
410                     OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX2)
411                                                                               | (0x1 << 3)  | (0x1 << 2)
412                                                                   | (0x1 << 1)) & ~(0x1 << 0));
413                                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX3, OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX3)
414                                                                               | (0x1 << 19) | (0x1 << 3));
415                                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_TXRF1, OS_REG_READ(ah, AR_PHY_65NM_CH2_TXRF1)
416                                                                               | (0x1 << 23));
417                     }
418                 }
419         }
420         if (AR_SREV_OSPREY(ah)) {
421                 /* chain two */
422                 if ((tx_chain_mask & 0x04) == 0x04 ) {
423                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX2)
424                                                               | (0x1 << 3)  | (0x1 << 2)
425                                                               | (0x1 << 1)) & ~(0x1 << 0));
426                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_RXTX3, OS_REG_READ(ah, AR_PHY_65NM_CH0_RXTX3)
427                                                                       | (0x1 << 19) | (0x1 << 3));
428                         OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TXRF1, OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF1)
429                                                                       | (0x1 << 23));
430                         if (AR_SREV_OSPREY(ah) || AR_SREV_WASP(ah)) {
431                                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP)
432                                                                               & ~(0x1 << 4));
433                                 OS_REG_WRITE(ah, AR_PHY_65NM_CH0_TOP2, OS_REG_READ(ah, AR_PHY_65NM_CH0_TOP2)
434                                                                           | (0x1 << 26) | (0x7 << 24)
435                                                                           | (0x3 << 22));
436                     } else {
437                                 OS_REG_WRITE(ah, AR_HORNET_CH0_TOP, OS_REG_READ(ah, AR_HORNET_CH0_TOP)
438                                                                               & ~(0x1 << 4));
439                                 OS_REG_WRITE(ah, AR_HORNET_CH0_TOP2, OS_REG_READ(ah, AR_HORNET_CH0_TOP2)
440                                                                           | (0x1 << 26) | (0x7 << 24)
441                                                                           | (0x3 << 22));
442                     }
443                     
444                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX2)
445                                                                       | (0x1 << 3)  | (0x1 << 2)
446                                                               | (0x1 << 1)) & ~(0x1 << 0));
447                         OS_REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX3, OS_REG_READ(ah, AR_PHY_65NM_CH1_RXTX3)
448                                                                       | (0x1 << 19) | (0x1 << 3));
449                 OS_REG_WRITE(ah, AR_PHY_65NM_CH1_TXRF1, OS_REG_READ(ah, AR_PHY_65NM_CH1_TXRF1)
450                                                                       | (0x1 << 23));
451                         
452                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX1, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX1)
453                                                                       | (0x1 << 31) | (0x1 << 27)
454                                                               | (0x3 << 23) | (0x1 << 19)
455                                                               | (0x1 << 15) | (0x3 << 9)) 
456                                                               & ~(0x1 << 12));
457                 OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX2, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX2)
458                                                               | (0x1 << 12) | (0x1 << 10) 
459                                                               | (0x1 << 9)  | (0x1 << 8)  
460                                                               | (0x1 << 7)  | (0x1 << 3)  
461                                                               | (0x1 << 2)  | (0x1 << 1))  
462                                                               & ~(0x1 << 11)& ~(0x1 << 0));
463                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_RXTX3, (OS_REG_READ(ah, AR_PHY_65NM_CH2_RXTX3)
464                                                                       | (0x1 << 29) | (0x1 << 25) 
465                                                               | (0x1 << 23) | (0x1 << 19) 
466                                                               | (0x1 << 10) | (0x1 << 9)  
467                                                               | (0x1 << 8)  | (0x1 << 3))
468                                                               & ~(0x1 << 28)& ~(0x1 << 24)
469                                                               & ~(0x1 << 22)& ~(0x1 << 7));
470                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_TXRF1, (OS_REG_READ(ah, AR_PHY_65NM_CH2_TXRF1)
471                                                                       | (0x1 << 23))& ~(0x1 << 21));
472                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_TXRF2, OS_REG_READ(ah, AR_PHY_65NM_CH2_TXRF2)
473                                                               | (0x3 << 3)  | (0x3 << 0));
474                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_TXRF3, (OS_REG_READ(ah, AR_PHY_65NM_CH2_TXRF3)
475                                                               | (0x3 << 29) | (0x3 << 26)
476                                                               | (0x2 << 23) | (0x2 << 20)
477                                                               | (0x2 << 17))& ~(0x1 << 14));
478                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_BB1, OS_REG_READ(ah, AR_PHY_65NM_CH2_BB1)
479                                                                       | (0x1 << 12) | (0x1 << 10)
480                                                               | (0x1 << 9)  | (0x1 << 8)
481                                                               | (0x1 << 6)  | (0x1 << 5)
482                                                               | (0x1 << 4)  | (0x1 << 3)
483                                                               | (0x1 << 2));
484                         OS_REG_WRITE(ah, AR_PHY_65NM_CH2_BB2, OS_REG_READ(ah, AR_PHY_65NM_CH2_BB2)
485                                                               | (0x1 << 31));
486                 }
487                 }
488         
489         OS_REG_WRITE(ah, AR_PHY_SWITCH_COM_2, 0x22222);
490         OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, 0x222);
491     }
492 }
493
494 void 
495 ar9300_tx99_tgt_start(struct ath_hal *ah, u_int8_t data)
496 {
497     a_uint32_t val;
498     a_uint32_t qnum = (a_uint32_t)data;
499
500     /* Disable AGC to A2 */
501     OS_REG_WRITE(ah, AR_PHY_TEST, (OS_REG_READ(ah, AR_PHY_TEST) | PHY_AGC_CLR) );
502     OS_REG_WRITE(ah, 0x9864, OS_REG_READ(ah, 0x9864) | 0x7f000);
503     OS_REG_WRITE(ah, 0x9924, OS_REG_READ(ah, 0x9924) | 0x7f00fe);
504     OS_REG_WRITE(ah, AR_DIAG_SW, OS_REG_READ(ah, AR_DIAG_SW) &~ AR_DIAG_RX_DIS);
505     //OS_REG_WRITE(ah, AR_DIAG_SW, OS_REG_READ(ah, AR_DIAG_SW) | (AR_DIAG_FORCE_RX_CLEAR+AR_DIAG_IGNORE_VIRT_CS));
506     OS_REG_WRITE(ah, AR_CR, AR_CR_RXD);     // set receive disable
507     //set CW_MIN and CW_MAX both to 0, AIFS=2
508     OS_REG_WRITE(ah, AR_DLCL_IFS(qnum), 0);
509     OS_REG_WRITE(ah, AR_D_GBL_IFS_SIFS, 20); //50 OK
510     OS_REG_WRITE(ah, AR_D_GBL_IFS_EIFS, 20);
511     OS_REG_WRITE(ah, AR_TIME_OUT, 0x00000400); //200 ok for HT20, 400 ok for HT40 
512     OS_REG_WRITE(ah, AR_DRETRY_LIMIT(qnum), 0xffffffff);
513     
514     /* set QCU modes to early termination */
515     val = OS_REG_READ(ah, AR_QMISC(qnum));
516     OS_REG_WRITE(ah, AR_QMISC(qnum), val | AR_Q_MISC_DCU_EARLY_TERM_REQ);
517 }
518
519 void 
520 ar9300_tx99_tgt_stop(struct ath_hal *ah)
521 {
522     OS_REG_WRITE(ah, AR_PHY_TEST, OS_REG_READ(ah, AR_PHY_TEST) &~ PHY_AGC_CLR);
523     OS_REG_WRITE(ah, AR_DIAG_SW, OS_REG_READ(ah, AR_DIAG_SW) &~ (AR_DIAG_FORCE_RX_CLEAR | AR_DIAG_IGNORE_VIRT_CS));
524 }
525 #endif