1*dd1de374Slin wang - Sun Microsystems - Beijing China /*
2*dd1de374Slin wang - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3*dd1de374Slin wang - Sun Microsystems - Beijing China * Use is subject to license terms.
4*dd1de374Slin wang - Sun Microsystems - Beijing China */
5*dd1de374Slin wang - Sun Microsystems - Beijing China
6*dd1de374Slin wang - Sun Microsystems - Beijing China /*
7*dd1de374Slin wang - Sun Microsystems - Beijing China * Copyright (c) 2008 Atheros Communications Inc.
8*dd1de374Slin wang - Sun Microsystems - Beijing China *
9*dd1de374Slin wang - Sun Microsystems - Beijing China * Permission to use, copy, modify, and/or distribute this software for any
10*dd1de374Slin wang - Sun Microsystems - Beijing China * purpose with or without fee is hereby granted, provided that the above
11*dd1de374Slin wang - Sun Microsystems - Beijing China * copyright notice and this permission notice appear in all copies.
12*dd1de374Slin wang - Sun Microsystems - Beijing China *
13*dd1de374Slin wang - Sun Microsystems - Beijing China * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14*dd1de374Slin wang - Sun Microsystems - Beijing China * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15*dd1de374Slin wang - Sun Microsystems - Beijing China * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16*dd1de374Slin wang - Sun Microsystems - Beijing China * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17*dd1de374Slin wang - Sun Microsystems - Beijing China * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18*dd1de374Slin wang - Sun Microsystems - Beijing China * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19*dd1de374Slin wang - Sun Microsystems - Beijing China * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20*dd1de374Slin wang - Sun Microsystems - Beijing China */
21*dd1de374Slin wang - Sun Microsystems - Beijing China
22*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_core.h"
23*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_hw.h"
24*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_reg.h"
25*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_phy.h"
26*dd1de374Slin wang - Sun Microsystems - Beijing China
27*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */
28*dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_write_regs(struct ath_hal * ah,uint32_t modesIndex,uint32_t freqIndex,int regWrites)29*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_write_regs(struct ath_hal *ah, uint32_t modesIndex, uint32_t freqIndex,
30*dd1de374Slin wang - Sun Microsystems - Beijing China int regWrites)
31*dd1de374Slin wang - Sun Microsystems - Beijing China {
32*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah);
33*dd1de374Slin wang - Sun Microsystems - Beijing China
34*dd1de374Slin wang - Sun Microsystems - Beijing China /* LINTED: E_CONSTANT_CONDITION */
35*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_ARRAY(&ahp->ah_iniBB_RfGain, freqIndex, regWrites);
36*dd1de374Slin wang - Sun Microsystems - Beijing China }
37*dd1de374Slin wang - Sun Microsystems - Beijing China
38*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t
ath9k_hw_set_channel(struct ath_hal * ah,struct ath9k_channel * chan)39*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set_channel(struct ath_hal *ah, struct ath9k_channel *chan)
40*dd1de374Slin wang - Sun Microsystems - Beijing China {
41*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t channelSel = 0;
42*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t bModeSynth = 0;
43*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t aModeRefSel = 0;
44*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t reg32 = 0;
45*dd1de374Slin wang - Sun Microsystems - Beijing China uint16_t freq;
46*dd1de374Slin wang - Sun Microsystems - Beijing China struct chan_centers centers;
47*dd1de374Slin wang - Sun Microsystems - Beijing China
48*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_get_channel_centers(ah, chan, ¢ers);
49*dd1de374Slin wang - Sun Microsystems - Beijing China freq = centers.synth_center;
50*dd1de374Slin wang - Sun Microsystems - Beijing China
51*dd1de374Slin wang - Sun Microsystems - Beijing China if (freq < 4800) {
52*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t txctl;
53*dd1de374Slin wang - Sun Microsystems - Beijing China
54*dd1de374Slin wang - Sun Microsystems - Beijing China if (((freq - 2192) % 5) == 0) {
55*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = ((freq - 672) * 2 - 3040) / 10;
56*dd1de374Slin wang - Sun Microsystems - Beijing China bModeSynth = 0;
57*dd1de374Slin wang - Sun Microsystems - Beijing China } else if (((freq - 2224) % 5) == 0) {
58*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = ((freq - 704) * 2 - 3040) / 10;
59*dd1de374Slin wang - Sun Microsystems - Beijing China bModeSynth = 1;
60*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
61*dd1de374Slin wang - Sun Microsystems - Beijing China arn_problem("%s: invalid channel %u MHz\n",
62*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, freq);
63*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE);
64*dd1de374Slin wang - Sun Microsystems - Beijing China }
65*dd1de374Slin wang - Sun Microsystems - Beijing China
66*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = (channelSel << 2) & 0xff;
67*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = ath9k_hw_reverse_bits(channelSel, 8);
68*dd1de374Slin wang - Sun Microsystems - Beijing China
69*dd1de374Slin wang - Sun Microsystems - Beijing China txctl = REG_READ(ah, AR_PHY_CCK_TX_CTRL);
70*dd1de374Slin wang - Sun Microsystems - Beijing China if (freq == 2484) {
71*dd1de374Slin wang - Sun Microsystems - Beijing China
72*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_CCK_TX_CTRL,
73*dd1de374Slin wang - Sun Microsystems - Beijing China txctl | AR_PHY_CCK_TX_CTRL_JAPAN);
74*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
75*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_CCK_TX_CTRL,
76*dd1de374Slin wang - Sun Microsystems - Beijing China txctl & ~AR_PHY_CCK_TX_CTRL_JAPAN);
77*dd1de374Slin wang - Sun Microsystems - Beijing China }
78*dd1de374Slin wang - Sun Microsystems - Beijing China
79*dd1de374Slin wang - Sun Microsystems - Beijing China } else if ((freq % 20) == 0 && freq >= 5120) {
80*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel =
81*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_reverse_bits(((freq - 4800) / 20 << 2), 8);
82*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = ath9k_hw_reverse_bits(1, 2);
83*dd1de374Slin wang - Sun Microsystems - Beijing China } else if ((freq % 10) == 0) {
84*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel =
85*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_reverse_bits(((freq - 4800) / 10 << 1), 8);
86*dd1de374Slin wang - Sun Microsystems - Beijing China if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah))
87*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = ath9k_hw_reverse_bits(2, 2);
88*dd1de374Slin wang - Sun Microsystems - Beijing China else
89*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = ath9k_hw_reverse_bits(1, 2);
90*dd1de374Slin wang - Sun Microsystems - Beijing China } else if ((freq % 5) == 0) {
91*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = ath9k_hw_reverse_bits((freq - 4800) / 5, 8);
92*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = ath9k_hw_reverse_bits(1, 2);
93*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
94*dd1de374Slin wang - Sun Microsystems - Beijing China arn_problem("%s: invalid channel %u MHz\n", __func__, freq);
95*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE);
96*dd1de374Slin wang - Sun Microsystems - Beijing China }
97*dd1de374Slin wang - Sun Microsystems - Beijing China
98*dd1de374Slin wang - Sun Microsystems - Beijing China reg32 =
99*dd1de374Slin wang - Sun Microsystems - Beijing China (channelSel << 8) | (aModeRefSel << 2) | (bModeSynth << 1) |
100*dd1de374Slin wang - Sun Microsystems - Beijing China (1 << 5) | 0x1;
101*dd1de374Slin wang - Sun Microsystems - Beijing China
102*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY(0x37), reg32);
103*dd1de374Slin wang - Sun Microsystems - Beijing China
104*dd1de374Slin wang - Sun Microsystems - Beijing China ah->ah_curchan = chan;
105*dd1de374Slin wang - Sun Microsystems - Beijing China
106*dd1de374Slin wang - Sun Microsystems - Beijing China AH5416(ah)->ah_curchanRadIndex = -1;
107*dd1de374Slin wang - Sun Microsystems - Beijing China
108*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE);
109*dd1de374Slin wang - Sun Microsystems - Beijing China }
110*dd1de374Slin wang - Sun Microsystems - Beijing China
111*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t
ath9k_hw_ar9280_set_channel(struct ath_hal * ah,struct ath9k_channel * chan)112*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ar9280_set_channel(struct ath_hal *ah,
113*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_channel *chan)
114*dd1de374Slin wang - Sun Microsystems - Beijing China {
115*dd1de374Slin wang - Sun Microsystems - Beijing China uint16_t bMode, fracMode, aModeRefSel = 0;
116*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t freq, ndiv, channelSel = 0, channelFrac = 0, reg32 = 0;
117*dd1de374Slin wang - Sun Microsystems - Beijing China struct chan_centers centers;
118*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t refDivA = 24;
119*dd1de374Slin wang - Sun Microsystems - Beijing China
120*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_get_channel_centers(ah, chan, ¢ers);
121*dd1de374Slin wang - Sun Microsystems - Beijing China freq = centers.synth_center;
122*dd1de374Slin wang - Sun Microsystems - Beijing China
123*dd1de374Slin wang - Sun Microsystems - Beijing China reg32 = REG_READ(ah, AR_PHY_SYNTH_CONTROL);
124*dd1de374Slin wang - Sun Microsystems - Beijing China reg32 &= 0xc0000000;
125*dd1de374Slin wang - Sun Microsystems - Beijing China
126*dd1de374Slin wang - Sun Microsystems - Beijing China if (freq < 4800) {
127*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t txctl;
128*dd1de374Slin wang - Sun Microsystems - Beijing China
129*dd1de374Slin wang - Sun Microsystems - Beijing China bMode = 1;
130*dd1de374Slin wang - Sun Microsystems - Beijing China fracMode = 1;
131*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = 0;
132*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = (freq * 0x10000) / 15;
133*dd1de374Slin wang - Sun Microsystems - Beijing China
134*dd1de374Slin wang - Sun Microsystems - Beijing China txctl = REG_READ(ah, AR_PHY_CCK_TX_CTRL);
135*dd1de374Slin wang - Sun Microsystems - Beijing China if (freq == 2484) {
136*dd1de374Slin wang - Sun Microsystems - Beijing China
137*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_CCK_TX_CTRL,
138*dd1de374Slin wang - Sun Microsystems - Beijing China txctl | AR_PHY_CCK_TX_CTRL_JAPAN);
139*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
140*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_CCK_TX_CTRL,
141*dd1de374Slin wang - Sun Microsystems - Beijing China txctl & ~AR_PHY_CCK_TX_CTRL_JAPAN);
142*dd1de374Slin wang - Sun Microsystems - Beijing China }
143*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
144*dd1de374Slin wang - Sun Microsystems - Beijing China bMode = 0;
145*dd1de374Slin wang - Sun Microsystems - Beijing China fracMode = 0;
146*dd1de374Slin wang - Sun Microsystems - Beijing China
147*dd1de374Slin wang - Sun Microsystems - Beijing China if ((freq % 20) == 0) {
148*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = 3;
149*dd1de374Slin wang - Sun Microsystems - Beijing China } else if ((freq % 10) == 0) {
150*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = 2;
151*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
152*dd1de374Slin wang - Sun Microsystems - Beijing China aModeRefSel = 0;
153*dd1de374Slin wang - Sun Microsystems - Beijing China
154*dd1de374Slin wang - Sun Microsystems - Beijing China fracMode = 1;
155*dd1de374Slin wang - Sun Microsystems - Beijing China refDivA = 1;
156*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = (freq * 0x8000) / 15;
157*dd1de374Slin wang - Sun Microsystems - Beijing China
158*dd1de374Slin wang - Sun Microsystems - Beijing China REG_RMW_FIELD(ah, AR_AN_SYNTH9,
159*dd1de374Slin wang - Sun Microsystems - Beijing China AR_AN_SYNTH9_REFDIVA, refDivA);
160*dd1de374Slin wang - Sun Microsystems - Beijing China }
161*dd1de374Slin wang - Sun Microsystems - Beijing China if (!fracMode) {
162*dd1de374Slin wang - Sun Microsystems - Beijing China ndiv = (freq * (refDivA >> aModeRefSel)) / 60;
163*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = ndiv & 0x1ff;
164*dd1de374Slin wang - Sun Microsystems - Beijing China channelFrac = (ndiv & 0xfffffe00) * 2;
165*dd1de374Slin wang - Sun Microsystems - Beijing China channelSel = (channelSel << 17) | channelFrac;
166*dd1de374Slin wang - Sun Microsystems - Beijing China }
167*dd1de374Slin wang - Sun Microsystems - Beijing China }
168*dd1de374Slin wang - Sun Microsystems - Beijing China
169*dd1de374Slin wang - Sun Microsystems - Beijing China reg32 = reg32 |
170*dd1de374Slin wang - Sun Microsystems - Beijing China (bMode << 29) |
171*dd1de374Slin wang - Sun Microsystems - Beijing China (fracMode << 28) | (aModeRefSel << 26) | (channelSel);
172*dd1de374Slin wang - Sun Microsystems - Beijing China
173*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_SYNTH_CONTROL, reg32);
174*dd1de374Slin wang - Sun Microsystems - Beijing China
175*dd1de374Slin wang - Sun Microsystems - Beijing China ah->ah_curchan = chan;
176*dd1de374Slin wang - Sun Microsystems - Beijing China
177*dd1de374Slin wang - Sun Microsystems - Beijing China AH5416(ah)->ah_curchanRadIndex = -1;
178*dd1de374Slin wang - Sun Microsystems - Beijing China
179*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE);
180*dd1de374Slin wang - Sun Microsystems - Beijing China }
181*dd1de374Slin wang - Sun Microsystems - Beijing China
182*dd1de374Slin wang - Sun Microsystems - Beijing China static void
ath9k_phy_modify_rx_buffer(uint32_t * rfBuf,uint32_t reg32,uint32_t numBits,uint32_t firstBit,uint32_t column)183*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(uint32_t *rfBuf, uint32_t reg32,
184*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t numBits, uint32_t firstBit, uint32_t column)
185*dd1de374Slin wang - Sun Microsystems - Beijing China {
186*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t tmp32, mask, arrayEntry, lastBit;
187*dd1de374Slin wang - Sun Microsystems - Beijing China int32_t bitPosition, bitsLeft;
188*dd1de374Slin wang - Sun Microsystems - Beijing China
189*dd1de374Slin wang - Sun Microsystems - Beijing China tmp32 = ath9k_hw_reverse_bits(reg32, numBits);
190*dd1de374Slin wang - Sun Microsystems - Beijing China arrayEntry = (firstBit - 1) / 8;
191*dd1de374Slin wang - Sun Microsystems - Beijing China bitPosition = (firstBit - 1) % 8;
192*dd1de374Slin wang - Sun Microsystems - Beijing China bitsLeft = numBits;
193*dd1de374Slin wang - Sun Microsystems - Beijing China while (bitsLeft > 0) {
194*dd1de374Slin wang - Sun Microsystems - Beijing China lastBit = (bitPosition + bitsLeft > 8) ?
195*dd1de374Slin wang - Sun Microsystems - Beijing China 8 : bitPosition + bitsLeft;
196*dd1de374Slin wang - Sun Microsystems - Beijing China mask = (((1 << lastBit) - 1) ^ ((1 << bitPosition) - 1)) <<
197*dd1de374Slin wang - Sun Microsystems - Beijing China (column * 8);
198*dd1de374Slin wang - Sun Microsystems - Beijing China rfBuf[arrayEntry] &= ~mask;
199*dd1de374Slin wang - Sun Microsystems - Beijing China rfBuf[arrayEntry] |= ((tmp32 << bitPosition) <<
200*dd1de374Slin wang - Sun Microsystems - Beijing China (column * 8)) & mask;
201*dd1de374Slin wang - Sun Microsystems - Beijing China bitsLeft -= 8 - bitPosition;
202*dd1de374Slin wang - Sun Microsystems - Beijing China tmp32 = tmp32 >> (8 - bitPosition);
203*dd1de374Slin wang - Sun Microsystems - Beijing China bitPosition = 0;
204*dd1de374Slin wang - Sun Microsystems - Beijing China arrayEntry++;
205*dd1de374Slin wang - Sun Microsystems - Beijing China }
206*dd1de374Slin wang - Sun Microsystems - Beijing China }
207*dd1de374Slin wang - Sun Microsystems - Beijing China
208*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t
ath9k_hw_set_rf_regs(struct ath_hal * ah,struct ath9k_channel * chan,uint16_t modesIndex)209*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set_rf_regs(struct ath_hal *ah, struct ath9k_channel *chan,
210*dd1de374Slin wang - Sun Microsystems - Beijing China uint16_t modesIndex)
211*dd1de374Slin wang - Sun Microsystems - Beijing China {
212*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah);
213*dd1de374Slin wang - Sun Microsystems - Beijing China
214*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t eepMinorRev;
215*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t ob5GHz = 0, db5GHz = 0;
216*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t ob2GHz = 0, db2GHz = 0;
217*dd1de374Slin wang - Sun Microsystems - Beijing China /* LINTED E_FUNC_SET_NOT_USED */
218*dd1de374Slin wang - Sun Microsystems - Beijing China int regWrites = 0;
219*dd1de374Slin wang - Sun Microsystems - Beijing China
220*dd1de374Slin wang - Sun Microsystems - Beijing China if (AR_SREV_9280_10_OR_LATER(ah))
221*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE);
222*dd1de374Slin wang - Sun Microsystems - Beijing China
223*dd1de374Slin wang - Sun Microsystems - Beijing China eepMinorRev = ath9k_hw_get_eeprom(ah, EEP_MINOR_REV);
224*dd1de374Slin wang - Sun Microsystems - Beijing China
225*dd1de374Slin wang - Sun Microsystems - Beijing China RF_BANK_SETUP(ahp->ah_analogBank0Data, &ahp->ah_iniBank0, 1);
226*dd1de374Slin wang - Sun Microsystems - Beijing China
227*dd1de374Slin wang - Sun Microsystems - Beijing China RF_BANK_SETUP(ahp->ah_analogBank1Data, &ahp->ah_iniBank1, 1);
228*dd1de374Slin wang - Sun Microsystems - Beijing China
229*dd1de374Slin wang - Sun Microsystems - Beijing China RF_BANK_SETUP(ahp->ah_analogBank2Data, &ahp->ah_iniBank2, 1);
230*dd1de374Slin wang - Sun Microsystems - Beijing China
231*dd1de374Slin wang - Sun Microsystems - Beijing China RF_BANK_SETUP(ahp->ah_analogBank3Data, &ahp->ah_iniBank3,
232*dd1de374Slin wang - Sun Microsystems - Beijing China modesIndex);
233*dd1de374Slin wang - Sun Microsystems - Beijing China {
234*dd1de374Slin wang - Sun Microsystems - Beijing China int i;
235*dd1de374Slin wang - Sun Microsystems - Beijing China for (i = 0; i < ahp->ah_iniBank6TPC.ia_rows; i++) {
236*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6Data[i] =
237*dd1de374Slin wang - Sun Microsystems - Beijing China INI_RA(&ahp->ah_iniBank6TPC, i, modesIndex);
238*dd1de374Slin wang - Sun Microsystems - Beijing China }
239*dd1de374Slin wang - Sun Microsystems - Beijing China }
240*dd1de374Slin wang - Sun Microsystems - Beijing China
241*dd1de374Slin wang - Sun Microsystems - Beijing China if (eepMinorRev >= 2) {
242*dd1de374Slin wang - Sun Microsystems - Beijing China if (IS_CHAN_2GHZ(chan)) {
243*dd1de374Slin wang - Sun Microsystems - Beijing China ob2GHz = ath9k_hw_get_eeprom(ah, EEP_OB_2);
244*dd1de374Slin wang - Sun Microsystems - Beijing China db2GHz = ath9k_hw_get_eeprom(ah, EEP_DB_2);
245*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(ahp->ah_analogBank6Data,
246*dd1de374Slin wang - Sun Microsystems - Beijing China ob2GHz, 3, 197, 0);
247*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(ahp->ah_analogBank6Data,
248*dd1de374Slin wang - Sun Microsystems - Beijing China db2GHz, 3, 194, 0);
249*dd1de374Slin wang - Sun Microsystems - Beijing China } else {
250*dd1de374Slin wang - Sun Microsystems - Beijing China ob5GHz = ath9k_hw_get_eeprom(ah, EEP_OB_5);
251*dd1de374Slin wang - Sun Microsystems - Beijing China db5GHz = ath9k_hw_get_eeprom(ah, EEP_DB_5);
252*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(ahp->ah_analogBank6Data,
253*dd1de374Slin wang - Sun Microsystems - Beijing China ob5GHz, 3, 203, 0);
254*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(ahp->ah_analogBank6Data,
255*dd1de374Slin wang - Sun Microsystems - Beijing China db5GHz, 3, 200, 0);
256*dd1de374Slin wang - Sun Microsystems - Beijing China }
257*dd1de374Slin wang - Sun Microsystems - Beijing China }
258*dd1de374Slin wang - Sun Microsystems - Beijing China
259*dd1de374Slin wang - Sun Microsystems - Beijing China RF_BANK_SETUP(ahp->ah_analogBank7Data, &ahp->ah_iniBank7, 1);
260*dd1de374Slin wang - Sun Microsystems - Beijing China
261*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank0, ahp->ah_analogBank0Data,
262*dd1de374Slin wang - Sun Microsystems - Beijing China regWrites);
263*dd1de374Slin wang - Sun Microsystems - Beijing China
264*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank1, ahp->ah_analogBank1Data,
265*dd1de374Slin wang - Sun Microsystems - Beijing China regWrites);
266*dd1de374Slin wang - Sun Microsystems - Beijing China
267*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank2, ahp->ah_analogBank2Data,
268*dd1de374Slin wang - Sun Microsystems - Beijing China regWrites);
269*dd1de374Slin wang - Sun Microsystems - Beijing China
270*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank3, ahp->ah_analogBank3Data,
271*dd1de374Slin wang - Sun Microsystems - Beijing China regWrites);
272*dd1de374Slin wang - Sun Microsystems - Beijing China
273*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank6TPC, ahp->ah_analogBank6Data,
274*dd1de374Slin wang - Sun Microsystems - Beijing China regWrites);
275*dd1de374Slin wang - Sun Microsystems - Beijing China
276*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank7, ahp->ah_analogBank7Data,
277*dd1de374Slin wang - Sun Microsystems - Beijing China regWrites);
278*dd1de374Slin wang - Sun Microsystems - Beijing China
279*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE);
280*dd1de374Slin wang - Sun Microsystems - Beijing China }
281*dd1de374Slin wang - Sun Microsystems - Beijing China
282*dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_rfdetach(struct ath_hal * ah)283*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_rfdetach(struct ath_hal *ah)
284*dd1de374Slin wang - Sun Microsystems - Beijing China {
285*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah);
286*dd1de374Slin wang - Sun Microsystems - Beijing China
287*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank0Data != NULL) {
288*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank0Data,
289*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank0.ia_rows));
290*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank0Data = NULL;
291*dd1de374Slin wang - Sun Microsystems - Beijing China }
292*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank1Data != NULL) {
293*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank1Data,
294*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank1.ia_rows));
295*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank1Data = NULL;
296*dd1de374Slin wang - Sun Microsystems - Beijing China }
297*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank2Data != NULL) {
298*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank2Data,
299*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank2.ia_rows));
300*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank2Data = NULL;
301*dd1de374Slin wang - Sun Microsystems - Beijing China }
302*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank3Data != NULL) {
303*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank3Data,
304*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank3.ia_rows));
305*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank3Data = NULL;
306*dd1de374Slin wang - Sun Microsystems - Beijing China }
307*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank6Data != NULL) {
308*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank6Data,
309*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank6.ia_rows));
310*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6Data = NULL;
311*dd1de374Slin wang - Sun Microsystems - Beijing China }
312*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank6TPCData != NULL) {
313*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank6TPCData,
314*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank6TPC.ia_rows));
315*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6TPCData = NULL;
316*dd1de374Slin wang - Sun Microsystems - Beijing China }
317*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank7Data != NULL) {
318*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_analogBank7Data,
319*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank7.ia_rows));
320*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank7Data = NULL;
321*dd1de374Slin wang - Sun Microsystems - Beijing China }
322*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_addac5416_21 != NULL) {
323*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_addac5416_21,
324*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniAddac.ia_rows *
325*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniAddac.ia_columns));
326*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_addac5416_21 = NULL;
327*dd1de374Slin wang - Sun Microsystems - Beijing China }
328*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_bank6Temp != NULL) {
329*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_free(ahp->ah_bank6Temp,
330*dd1de374Slin wang - Sun Microsystems - Beijing China (sizeof (uint32_t) * ahp->ah_iniBank6.ia_rows));
331*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_bank6Temp = NULL;
332*dd1de374Slin wang - Sun Microsystems - Beijing China }
333*dd1de374Slin wang - Sun Microsystems - Beijing China }
334*dd1de374Slin wang - Sun Microsystems - Beijing China
335*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t
ath9k_hw_init_rf(struct ath_hal * ah,int * status)336*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_init_rf(struct ath_hal *ah, int *status)
337*dd1de374Slin wang - Sun Microsystems - Beijing China {
338*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah);
339*dd1de374Slin wang - Sun Microsystems - Beijing China
340*dd1de374Slin wang - Sun Microsystems - Beijing China if (!AR_SREV_9280_10_OR_LATER(ah)) {
341*dd1de374Slin wang - Sun Microsystems - Beijing China
342*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank0Data =
343*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
344*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank0.ia_rows), KM_SLEEP);
345*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank1Data =
346*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
347*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank1.ia_rows), KM_SLEEP);
348*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank2Data =
349*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
350*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank2.ia_rows), KM_SLEEP);
351*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank3Data =
352*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
353*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank3.ia_rows), KM_SLEEP);
354*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6Data =
355*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
356*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank6.ia_rows), KM_SLEEP);
357*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6TPCData =
358*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
359*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank6TPC.ia_rows), KM_SLEEP);
360*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank7Data =
361*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
362*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank7.ia_rows), KM_SLEEP);
363*dd1de374Slin wang - Sun Microsystems - Beijing China
364*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_analogBank0Data == NULL ||
365*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank1Data == NULL ||
366*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank2Data == NULL ||
367*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank3Data == NULL ||
368*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6Data == NULL ||
369*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank6TPCData == NULL ||
370*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_analogBank7Data == NULL) {
371*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: ath9k_hw_init_rf(): "
372*dd1de374Slin wang - Sun Microsystems - Beijing China "cannot allocate RF banks\n"));
373*dd1de374Slin wang - Sun Microsystems - Beijing China *status = ENOMEM;
374*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE);
375*dd1de374Slin wang - Sun Microsystems - Beijing China }
376*dd1de374Slin wang - Sun Microsystems - Beijing China
377*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_addac5416_21 =
378*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
379*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniAddac.ia_rows *
380*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniAddac.ia_columns), KM_SLEEP);
381*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_addac5416_21 == NULL) {
382*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: ath9k_hw_init_rf(): "
383*dd1de374Slin wang - Sun Microsystems - Beijing China "cannot allocate ah_addac5416_21\n"));
384*dd1de374Slin wang - Sun Microsystems - Beijing China *status = ENOMEM;
385*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE);
386*dd1de374Slin wang - Sun Microsystems - Beijing China }
387*dd1de374Slin wang - Sun Microsystems - Beijing China
388*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_bank6Temp =
389*dd1de374Slin wang - Sun Microsystems - Beijing China kmem_zalloc((sizeof (uint32_t) *
390*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_iniBank6.ia_rows), KM_SLEEP);
391*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_bank6Temp == NULL) {
392*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: ath9k_hw_init_rf(): "
393*dd1de374Slin wang - Sun Microsystems - Beijing China "cannot allocate ah_bank6Temp\n"));
394*dd1de374Slin wang - Sun Microsystems - Beijing China *status = ENOMEM;
395*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE);
396*dd1de374Slin wang - Sun Microsystems - Beijing China }
397*dd1de374Slin wang - Sun Microsystems - Beijing China }
398*dd1de374Slin wang - Sun Microsystems - Beijing China
399*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE);
400*dd1de374Slin wang - Sun Microsystems - Beijing China }
401*dd1de374Slin wang - Sun Microsystems - Beijing China
402*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */
403*dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_decrease_chain_power(struct ath_hal * ah,struct ath9k_channel * chan)404*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_decrease_chain_power(struct ath_hal *ah, struct ath9k_channel *chan)
405*dd1de374Slin wang - Sun Microsystems - Beijing China {
406*dd1de374Slin wang - Sun Microsystems - Beijing China /* LINTED E_FUNC_SET_NOT_USED */
407*dd1de374Slin wang - Sun Microsystems - Beijing China int i, regWrites = 0;
408*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah);
409*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t bank6SelMask;
410*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t *bank6Temp = ahp->ah_bank6Temp;
411*dd1de374Slin wang - Sun Microsystems - Beijing China
412*dd1de374Slin wang - Sun Microsystems - Beijing China switch (ahp->ah_diversityControl) {
413*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_ANT_FIXED_A:
414*dd1de374Slin wang - Sun Microsystems - Beijing China bank6SelMask =
415*dd1de374Slin wang - Sun Microsystems - Beijing China (ahp-> ah_antennaSwitchSwap & ANTSWAP_AB) ? REDUCE_CHAIN_0 :
416*dd1de374Slin wang - Sun Microsystems - Beijing China REDUCE_CHAIN_1;
417*dd1de374Slin wang - Sun Microsystems - Beijing China break;
418*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_ANT_FIXED_B:
419*dd1de374Slin wang - Sun Microsystems - Beijing China bank6SelMask =
420*dd1de374Slin wang - Sun Microsystems - Beijing China (ahp-> ah_antennaSwitchSwap & ANTSWAP_AB) ? REDUCE_CHAIN_1 :
421*dd1de374Slin wang - Sun Microsystems - Beijing China REDUCE_CHAIN_0;
422*dd1de374Slin wang - Sun Microsystems - Beijing China break;
423*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_ANT_VARIABLE:
424*dd1de374Slin wang - Sun Microsystems - Beijing China default:
425*dd1de374Slin wang - Sun Microsystems - Beijing China return;
426*dd1de374Slin wang - Sun Microsystems - Beijing China }
427*dd1de374Slin wang - Sun Microsystems - Beijing China
428*dd1de374Slin wang - Sun Microsystems - Beijing China for (i = 0; i < ahp->ah_iniBank6.ia_rows; i++)
429*dd1de374Slin wang - Sun Microsystems - Beijing China bank6Temp[i] = ahp->ah_analogBank6Data[i];
430*dd1de374Slin wang - Sun Microsystems - Beijing China
431*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_BASE + 0xD8, bank6SelMask);
432*dd1de374Slin wang - Sun Microsystems - Beijing China
433*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 189, 0);
434*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 190, 0);
435*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 191, 0);
436*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 192, 0);
437*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 193, 0);
438*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 222, 0);
439*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 245, 0);
440*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 246, 0);
441*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_phy_modify_rx_buffer(bank6Temp, 1, 1, 247, 0);
442*dd1de374Slin wang - Sun Microsystems - Beijing China
443*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE_RF_ARRAY(&ahp->ah_iniBank6, bank6Temp, regWrites);
444*dd1de374Slin wang - Sun Microsystems - Beijing China
445*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_PHY_BASE + 0xD8, 0x00000053);
446*dd1de374Slin wang - Sun Microsystems - Beijing China #ifdef ALTER_SWITCH
447*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, PHY_SWITCH_CHAIN_0,
448*dd1de374Slin wang - Sun Microsystems - Beijing China (REG_READ(ah, PHY_SWITCH_CHAIN_0) & ~0x38)
449*dd1de374Slin wang - Sun Microsystems - Beijing China | ((REG_READ(ah, PHY_SWITCH_CHAIN_0) >> 3) & 0x38));
450*dd1de374Slin wang - Sun Microsystems - Beijing China #endif
451*dd1de374Slin wang - Sun Microsystems - Beijing China }
452