xref: /illumos-gate/usr/src/uts/common/io/arn/arn_ani.c (revision fd7c5980)
1dd1de374Slin wang - Sun Microsystems - Beijing China /*
2dd1de374Slin wang - Sun Microsystems - Beijing China  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
3dd1de374Slin wang - Sun Microsystems - Beijing China  * Use is subject to license terms.
4dd1de374Slin wang - Sun Microsystems - Beijing China  */
5dd1de374Slin wang - Sun Microsystems - Beijing China 
6dd1de374Slin wang - Sun Microsystems - Beijing China /*
7dd1de374Slin wang - Sun Microsystems - Beijing China  * Copyright (c) 2008 Atheros Communications Inc.
8dd1de374Slin wang - Sun Microsystems - Beijing China  *
9dd1de374Slin wang - Sun Microsystems - Beijing China  * Permission to use, copy, modify, and/or distribute this software for any
10dd1de374Slin wang - Sun Microsystems - Beijing China  * purpose with or without fee is hereby granted, provided that the above
11dd1de374Slin wang - Sun Microsystems - Beijing China  * copyright notice and this permission notice appear in all copies.
12dd1de374Slin wang - Sun Microsystems - Beijing China  *
13dd1de374Slin wang - Sun Microsystems - Beijing China  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14dd1de374Slin wang - Sun Microsystems - Beijing China  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15dd1de374Slin wang - Sun Microsystems - Beijing China  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16dd1de374Slin wang - Sun Microsystems - Beijing China  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17dd1de374Slin wang - Sun Microsystems - Beijing China  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18dd1de374Slin wang - Sun Microsystems - Beijing China  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19dd1de374Slin wang - Sun Microsystems - Beijing China  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20dd1de374Slin wang - Sun Microsystems - Beijing China  */
21dd1de374Slin wang - Sun Microsystems - Beijing China 
22dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_core.h"
23dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_hw.h"
24dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_reg.h"
25dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_phy.h"
26dd1de374Slin wang - Sun Microsystems - Beijing China 
27dd1de374Slin wang - Sun Microsystems - Beijing China static int
ath9k_hw_get_ani_channel_idx(struct ath_hal * ah,struct ath9k_channel * chan)28dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_get_ani_channel_idx(struct ath_hal *ah, struct ath9k_channel *chan)
29dd1de374Slin wang - Sun Microsystems - Beijing China {
30dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
31dd1de374Slin wang - Sun Microsystems - Beijing China 	int i;
32dd1de374Slin wang - Sun Microsystems - Beijing China 
33dd1de374Slin wang - Sun Microsystems - Beijing China 	for (i = 0; i < ARRAY_SIZE(ahp->ah_ani); i++) {
34dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ahp->ah_ani[i].c.channel == chan->channel)
35dd1de374Slin wang - Sun Microsystems - Beijing China 			return (i);
36dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ahp->ah_ani[i].c.channel == 0) {
37dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_ani[i].c.channel = chan->channel;
38dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_ani[i].c.channelFlags = chan->channelFlags;
39dd1de374Slin wang - Sun Microsystems - Beijing China 			return (i);
40dd1de374Slin wang - Sun Microsystems - Beijing China 		}
41dd1de374Slin wang - Sun Microsystems - Beijing China 	}
42dd1de374Slin wang - Sun Microsystems - Beijing China 
43dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: ath9k_hw_get_ani_channel_idx(): "
44dd1de374Slin wang - Sun Microsystems - Beijing China 	    "No more channel states left. Using channel 0\n"));
45dd1de374Slin wang - Sun Microsystems - Beijing China 
46dd1de374Slin wang - Sun Microsystems - Beijing China 	return (0);
47dd1de374Slin wang - Sun Microsystems - Beijing China }
48dd1de374Slin wang - Sun Microsystems - Beijing China 
49dd1de374Slin wang - Sun Microsystems - Beijing China static boolean_t
ath9k_hw_ani_control(struct ath_hal * ah,enum ath9k_ani_cmd cmd,int param)50dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_control(struct ath_hal *ah, enum ath9k_ani_cmd cmd, int param)
51dd1de374Slin wang - Sun Microsystems - Beijing China {
52dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
53dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState = ahp->ah_curani;
54dd1de374Slin wang - Sun Microsystems - Beijing China 
55dd1de374Slin wang - Sun Microsystems - Beijing China 	switch (cmd & ahp->ah_ani_function) {
56dd1de374Slin wang - Sun Microsystems - Beijing China 	case ATH9K_ANI_NOISE_IMMUNITY_LEVEL: {
57dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t level = param;
58dd1de374Slin wang - Sun Microsystems - Beijing China 
59dd1de374Slin wang - Sun Microsystems - Beijing China 		if (level >= ARRAY_SIZE(ahp->ah_totalSizeDesired)) {
60dd1de374Slin wang - Sun Microsystems - Beijing China 			ARN_DBG((ARN_DBG_ANI, "arn: "
61dd1de374Slin wang - Sun Microsystems - Beijing China 			    "ah->ah_sc, ATH_DBG_ANI",
62dd1de374Slin wang - Sun Microsystems - Beijing China 			    "%s: level out of range (%u > %u)\n",
63dd1de374Slin wang - Sun Microsystems - Beijing China 			    __func__, level,
64dd1de374Slin wang - Sun Microsystems - Beijing China 			    (unsigned)ARRAY_SIZE(ahp->ah_totalSizeDesired)));
65dd1de374Slin wang - Sun Microsystems - Beijing China 
66dd1de374Slin wang - Sun Microsystems - Beijing China 			return (B_FALSE);
67dd1de374Slin wang - Sun Microsystems - Beijing China 		}
68dd1de374Slin wang - Sun Microsystems - Beijing China 
69dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ,
70dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_DESIRED_SZ_TOT_DES,
71dd1de374Slin wang - Sun Microsystems - Beijing China 		    ahp->ah_totalSizeDesired[level]);
72dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1,
73dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_AGC_CTL1_COARSE_LOW,
74dd1de374Slin wang - Sun Microsystems - Beijing China 		    ahp->ah_coarseLow[level]);
75dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1,
76dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_AGC_CTL1_COARSE_HIGH,
77dd1de374Slin wang - Sun Microsystems - Beijing China 		    ahp->ah_coarseHigh[level]);
78dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
79dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_FIND_SIG_FIRPWR,
80dd1de374Slin wang - Sun Microsystems - Beijing China 		    ahp->ah_firpwr[level]);
81dd1de374Slin wang - Sun Microsystems - Beijing China 
82dd1de374Slin wang - Sun Microsystems - Beijing China 		if (level > aniState->noiseImmunityLevel)
83dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_stats.ast_ani_niup++;
84dd1de374Slin wang - Sun Microsystems - Beijing China 		else if (level < aniState->noiseImmunityLevel)
85dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_stats.ast_ani_nidown++;
86dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->noiseImmunityLevel = (uint8_t)level; /* LINT */
87dd1de374Slin wang - Sun Microsystems - Beijing China 		break;
88dd1de374Slin wang - Sun Microsystems - Beijing China 	}
89dd1de374Slin wang - Sun Microsystems - Beijing China 	case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION: {
90dd1de374Slin wang - Sun Microsystems - Beijing China 		const int m1ThreshLow[] = { 127, 50 };
91dd1de374Slin wang - Sun Microsystems - Beijing China 		const int m2ThreshLow[] = { 127, 40 };
92dd1de374Slin wang - Sun Microsystems - Beijing China 		const int m1Thresh[] = { 127, 0x4d };
93dd1de374Slin wang - Sun Microsystems - Beijing China 		const int m2Thresh[] = { 127, 0x40 };
94dd1de374Slin wang - Sun Microsystems - Beijing China 		const int m2CountThr[] = { 31, 16 };
95dd1de374Slin wang - Sun Microsystems - Beijing China 		const int m2CountThrLow[] = { 63, 48 };
96dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t on = param ? 1 : 0;
97dd1de374Slin wang - Sun Microsystems - Beijing China 
98dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
99dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_LOW_M1_THRESH_LOW,
100dd1de374Slin wang - Sun Microsystems - Beijing China 		    m1ThreshLow[on]);
101dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
102dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_LOW_M2_THRESH_LOW,
103dd1de374Slin wang - Sun Microsystems - Beijing China 		    m2ThreshLow[on]);
104dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR,
105dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_M1_THRESH,
106dd1de374Slin wang - Sun Microsystems - Beijing China 		    m1Thresh[on]);
107dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR,
108dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_M2_THRESH,
109dd1de374Slin wang - Sun Microsystems - Beijing China 		    m2Thresh[on]);
110dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR,
111dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_M2COUNT_THR,
112dd1de374Slin wang - Sun Microsystems - Beijing China 		    m2CountThr[on]);
113dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
114dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW,
115dd1de374Slin wang - Sun Microsystems - Beijing China 		    m2CountThrLow[on]);
116dd1de374Slin wang - Sun Microsystems - Beijing China 
117dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
118dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_EXT_M1_THRESH_LOW,
119dd1de374Slin wang - Sun Microsystems - Beijing China 		    m1ThreshLow[on]);
120dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
121dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_EXT_M2_THRESH_LOW,
122dd1de374Slin wang - Sun Microsystems - Beijing China 		    m2ThreshLow[on]);
123dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
124dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_EXT_M1_THRESH,
125dd1de374Slin wang - Sun Microsystems - Beijing China 		    m1Thresh[on]);
126dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
127dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_SFCORR_EXT_M2_THRESH,
128dd1de374Slin wang - Sun Microsystems - Beijing China 		    m2Thresh[on]);
129dd1de374Slin wang - Sun Microsystems - Beijing China 
130dd1de374Slin wang - Sun Microsystems - Beijing China 		if (on)
131dd1de374Slin wang - Sun Microsystems - Beijing China 			REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
132dd1de374Slin wang - Sun Microsystems - Beijing China 			    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
133dd1de374Slin wang - Sun Microsystems - Beijing China 		else
134dd1de374Slin wang - Sun Microsystems - Beijing China 			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,
135dd1de374Slin wang - Sun Microsystems - Beijing China 			    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
136dd1de374Slin wang - Sun Microsystems - Beijing China 
137*fd7c5980SRichard Lowe 		if ((!on) != aniState->ofdmWeakSigDetectOff) {
138dd1de374Slin wang - Sun Microsystems - Beijing China 			if (on)
139dd1de374Slin wang - Sun Microsystems - Beijing China 				ahp->ah_stats.ast_ani_ofdmon++;
140dd1de374Slin wang - Sun Microsystems - Beijing China 			else
141dd1de374Slin wang - Sun Microsystems - Beijing China 				ahp->ah_stats.ast_ani_ofdmoff++;
142dd1de374Slin wang - Sun Microsystems - Beijing China 			aniState->ofdmWeakSigDetectOff = !on;
143dd1de374Slin wang - Sun Microsystems - Beijing China 		}
144dd1de374Slin wang - Sun Microsystems - Beijing China 		break;
145dd1de374Slin wang - Sun Microsystems - Beijing China 	}
146dd1de374Slin wang - Sun Microsystems - Beijing China 	case ATH9K_ANI_CCK_WEAK_SIGNAL_THR: {
147dd1de374Slin wang - Sun Microsystems - Beijing China 		const int weakSigThrCck[] = { 8, 6 };
148dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t high = param ? 1 : 0;
149dd1de374Slin wang - Sun Microsystems - Beijing China 
150dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT,
151dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK,
152dd1de374Slin wang - Sun Microsystems - Beijing China 		    weakSigThrCck[high]);
153dd1de374Slin wang - Sun Microsystems - Beijing China 		if (high != aniState->cckWeakSigThreshold) {
154dd1de374Slin wang - Sun Microsystems - Beijing China 			if (high)
155dd1de374Slin wang - Sun Microsystems - Beijing China 				ahp->ah_stats.ast_ani_cckhigh++;
156dd1de374Slin wang - Sun Microsystems - Beijing China 			else
157dd1de374Slin wang - Sun Microsystems - Beijing China 				ahp->ah_stats.ast_ani_ccklow++;
158dd1de374Slin wang - Sun Microsystems - Beijing China 			/* LINT */
159dd1de374Slin wang - Sun Microsystems - Beijing China 			aniState->cckWeakSigThreshold = (uint8_t)high;
160dd1de374Slin wang - Sun Microsystems - Beijing China 		}
161dd1de374Slin wang - Sun Microsystems - Beijing China 		break;
162dd1de374Slin wang - Sun Microsystems - Beijing China 	}
163dd1de374Slin wang - Sun Microsystems - Beijing China 	case ATH9K_ANI_FIRSTEP_LEVEL: {
164dd1de374Slin wang - Sun Microsystems - Beijing China 		const int firstep[] = { 0, 4, 8 };
165dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t level = param;
166dd1de374Slin wang - Sun Microsystems - Beijing China 
167dd1de374Slin wang - Sun Microsystems - Beijing China 		if (level >= ARRAY_SIZE(firstep)) {
168dd1de374Slin wang - Sun Microsystems - Beijing China 			ARN_DBG((ARN_DBG_ANI, "arn: "
169dd1de374Slin wang - Sun Microsystems - Beijing China 			    "%s: level out of range (%u > %u)\n",
170dd1de374Slin wang - Sun Microsystems - Beijing China 			    __func__, level,
171dd1de374Slin wang - Sun Microsystems - Beijing China 			    (unsigned)ARRAY_SIZE(firstep)));
172dd1de374Slin wang - Sun Microsystems - Beijing China 
173dd1de374Slin wang - Sun Microsystems - Beijing China 			return (B_FALSE);
174dd1de374Slin wang - Sun Microsystems - Beijing China 		}
175dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
176dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_FIND_SIG_FIRSTEP, firstep[level]);
177dd1de374Slin wang - Sun Microsystems - Beijing China 		if (level > aniState->firstepLevel)
178dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_stats.ast_ani_stepup++;
179dd1de374Slin wang - Sun Microsystems - Beijing China 		else if (level < aniState->firstepLevel)
180dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_stats.ast_ani_stepdown++;
181dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->firstepLevel = (uint8_t)level; /* LINT */
182dd1de374Slin wang - Sun Microsystems - Beijing China 		break;
183dd1de374Slin wang - Sun Microsystems - Beijing China 	}
184dd1de374Slin wang - Sun Microsystems - Beijing China 	case ATH9K_ANI_SPUR_IMMUNITY_LEVEL: {
185dd1de374Slin wang - Sun Microsystems - Beijing China 		const int cycpwrThr1[] =
186dd1de374Slin wang - Sun Microsystems - Beijing China 			{ 2, 4, 6, 8, 10, 12, 14, 16 };
187dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t level = param;
188dd1de374Slin wang - Sun Microsystems - Beijing China 
189dd1de374Slin wang - Sun Microsystems - Beijing China 		if (level >= ARRAY_SIZE(cycpwrThr1)) {
190dd1de374Slin wang - Sun Microsystems - Beijing China 			ARN_DBG((ARN_DBG_ANI, "arn: "
191dd1de374Slin wang - Sun Microsystems - Beijing China 			    "%s: level out of range (%u > %u)\n",
192dd1de374Slin wang - Sun Microsystems - Beijing China 			    __func__, level,
193dd1de374Slin wang - Sun Microsystems - Beijing China 			    (unsigned)ARRAY_SIZE(cycpwrThr1)));
194dd1de374Slin wang - Sun Microsystems - Beijing China 
195dd1de374Slin wang - Sun Microsystems - Beijing China 			return (B_FALSE);
196dd1de374Slin wang - Sun Microsystems - Beijing China 		}
197dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_RMW_FIELD(ah, AR_PHY_TIMING5,
198dd1de374Slin wang - Sun Microsystems - Beijing China 		    AR_PHY_TIMING5_CYCPWR_THR1, cycpwrThr1[level]);
199dd1de374Slin wang - Sun Microsystems - Beijing China 		if (level > aniState->spurImmunityLevel)
200dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_stats.ast_ani_spurup++;
201dd1de374Slin wang - Sun Microsystems - Beijing China 		else if (level < aniState->spurImmunityLevel)
202dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_stats.ast_ani_spurdown++;
203dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->spurImmunityLevel = (uint8_t)level; /* LINT */
204dd1de374Slin wang - Sun Microsystems - Beijing China 		break;
205dd1de374Slin wang - Sun Microsystems - Beijing China 	}
206dd1de374Slin wang - Sun Microsystems - Beijing China 	case ATH9K_ANI_PRESENT:
207dd1de374Slin wang - Sun Microsystems - Beijing China 		break;
208dd1de374Slin wang - Sun Microsystems - Beijing China 	default:
209dd1de374Slin wang - Sun Microsystems - Beijing China 		ARN_DBG((ARN_DBG_ANI, "arn: "
210dd1de374Slin wang - Sun Microsystems - Beijing China 		    "%s: invalid cmd %u\n", __func__, cmd));
211dd1de374Slin wang - Sun Microsystems - Beijing China 		return (B_FALSE);
212dd1de374Slin wang - Sun Microsystems - Beijing China 	}
213dd1de374Slin wang - Sun Microsystems - Beijing China 
214dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: "
215dd1de374Slin wang - Sun Microsystems - Beijing China 	    "%s: ANI parameters:\n", __func__));
216dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: "
217dd1de374Slin wang - Sun Microsystems - Beijing China 	    "noiseImmunityLevel=%d, spurImmunityLevel=%d, "
218dd1de374Slin wang - Sun Microsystems - Beijing China 	    "ofdmWeakSigDetectOff=%d\n",
219dd1de374Slin wang - Sun Microsystems - Beijing China 	    aniState->noiseImmunityLevel, aniState->spurImmunityLevel,
220dd1de374Slin wang - Sun Microsystems - Beijing China 	    !aniState->ofdmWeakSigDetectOff));
221dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: "
222dd1de374Slin wang - Sun Microsystems - Beijing China 	    "cckWeakSigThreshold=%d, "
223dd1de374Slin wang - Sun Microsystems - Beijing China 	    "firstepLevel=%d, listenTime=%d\n",
224dd1de374Slin wang - Sun Microsystems - Beijing China 	    aniState->cckWeakSigThreshold, aniState->firstepLevel,
225dd1de374Slin wang - Sun Microsystems - Beijing China 	    aniState->listenTime));
226dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: "
227dd1de374Slin wang - Sun Microsystems - Beijing China 	    "cycleCount=%d, ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n",
228dd1de374Slin wang - Sun Microsystems - Beijing China 	    aniState->cycleCount, aniState->ofdmPhyErrCount,
229dd1de374Slin wang - Sun Microsystems - Beijing China 	    aniState->cckPhyErrCount));
230dd1de374Slin wang - Sun Microsystems - Beijing China 
231dd1de374Slin wang - Sun Microsystems - Beijing China 	return (B_TRUE);
232dd1de374Slin wang - Sun Microsystems - Beijing China }
233dd1de374Slin wang - Sun Microsystems - Beijing China 
234dd1de374Slin wang - Sun Microsystems - Beijing China static void
ath9k_hw_update_mibstats(struct ath_hal * ah,struct ath9k_mib_stats * stats)235dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_update_mibstats(struct ath_hal *ah, struct ath9k_mib_stats *stats)
236dd1de374Slin wang - Sun Microsystems - Beijing China {
237dd1de374Slin wang - Sun Microsystems - Beijing China 	stats->ackrcv_bad += REG_READ(ah, AR_ACK_FAIL);
238dd1de374Slin wang - Sun Microsystems - Beijing China 	stats->rts_bad += REG_READ(ah, AR_RTS_FAIL);
239dd1de374Slin wang - Sun Microsystems - Beijing China 	stats->fcs_bad += REG_READ(ah, AR_FCS_FAIL);
240dd1de374Slin wang - Sun Microsystems - Beijing China 	stats->rts_good += REG_READ(ah, AR_RTS_OK);
241dd1de374Slin wang - Sun Microsystems - Beijing China 	stats->beacons += REG_READ(ah, AR_BEACON_CNT);
242dd1de374Slin wang - Sun Microsystems - Beijing China }
243dd1de374Slin wang - Sun Microsystems - Beijing China 
244dd1de374Slin wang - Sun Microsystems - Beijing China static void
ath9k_ani_restart(struct ath_hal * ah)245dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_ani_restart(struct ath_hal *ah)
246dd1de374Slin wang - Sun Microsystems - Beijing China {
247dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
248dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
249dd1de374Slin wang - Sun Microsystems - Beijing China 
250dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!DO_ANI(ah))
251dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
252dd1de374Slin wang - Sun Microsystems - Beijing China 
253dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = ahp->ah_curani;
254dd1de374Slin wang - Sun Microsystems - Beijing China 
255dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->listenTime = 0;
256dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ahp->ah_hasHwPhyCounters) {
257dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->ofdmTrigHigh > AR_PHY_COUNTMAX) {
258dd1de374Slin wang - Sun Microsystems - Beijing China 			aniState->ofdmPhyErrBase = 0;
259dd1de374Slin wang - Sun Microsystems - Beijing China 			ARN_DBG((ARN_DBG_ANI, "arn: "
260dd1de374Slin wang - Sun Microsystems - Beijing China 			    "OFDM Trigger is too high for hw counters\n"));
261dd1de374Slin wang - Sun Microsystems - Beijing China 		} else {
262dd1de374Slin wang - Sun Microsystems - Beijing China 			aniState->ofdmPhyErrBase =
263dd1de374Slin wang - Sun Microsystems - Beijing China 			    AR_PHY_COUNTMAX - aniState->ofdmTrigHigh;
264dd1de374Slin wang - Sun Microsystems - Beijing China 		}
265dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->cckTrigHigh > AR_PHY_COUNTMAX) {
266dd1de374Slin wang - Sun Microsystems - Beijing China 			aniState->cckPhyErrBase = 0;
267dd1de374Slin wang - Sun Microsystems - Beijing China 			ARN_DBG((ARN_DBG_ANI, "arn: "
268dd1de374Slin wang - Sun Microsystems - Beijing China 			    "CCK Trigger is too high for hw counters\n"));
269dd1de374Slin wang - Sun Microsystems - Beijing China 		} else {
270dd1de374Slin wang - Sun Microsystems - Beijing China 			aniState->cckPhyErrBase =
271dd1de374Slin wang - Sun Microsystems - Beijing China 			    AR_PHY_COUNTMAX - aniState->cckTrigHigh;
272dd1de374Slin wang - Sun Microsystems - Beijing China 		}
273dd1de374Slin wang - Sun Microsystems - Beijing China 
274dd1de374Slin wang - Sun Microsystems - Beijing China 		ARN_DBG((ARN_DBG_ANI, "arn: "
275dd1de374Slin wang - Sun Microsystems - Beijing China 		    "%s: Writing ofdmbase=%u   cckbase=%u\n",
276dd1de374Slin wang - Sun Microsystems - Beijing China 		    __func__, aniState->ofdmPhyErrBase,
277dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->cckPhyErrBase));
278dd1de374Slin wang - Sun Microsystems - Beijing China 
279dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase);
280dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase);
281dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
282dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
283dd1de374Slin wang - Sun Microsystems - Beijing China 
284dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_hw_update_mibstats(ah, &ahp->ah_mibStats);
285dd1de374Slin wang - Sun Microsystems - Beijing China 	}
286dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->ofdmPhyErrCount = 0;
287dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->cckPhyErrCount = 0;
288dd1de374Slin wang - Sun Microsystems - Beijing China }
289dd1de374Slin wang - Sun Microsystems - Beijing China 
290dd1de374Slin wang - Sun Microsystems - Beijing China static void
ath9k_hw_ani_ofdm_err_trigger(struct ath_hal * ah)291dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_ofdm_err_trigger(struct ath_hal *ah)
292dd1de374Slin wang - Sun Microsystems - Beijing China {
293dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
294dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath9k_channel *chan = ah->ah_curchan;
295dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
296dd1de374Slin wang - Sun Microsystems - Beijing China 	enum wireless_mode mode;
297dd1de374Slin wang - Sun Microsystems - Beijing China 	int32_t rssi;
298dd1de374Slin wang - Sun Microsystems - Beijing China 
299dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!DO_ANI(ah))
300dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
301dd1de374Slin wang - Sun Microsystems - Beijing China 
302dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = ahp->ah_curani;
303dd1de374Slin wang - Sun Microsystems - Beijing China 
304dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) {
305dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
306dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->noiseImmunityLevel + 1)) {
307dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
308dd1de374Slin wang - Sun Microsystems - Beijing China 		}
309dd1de374Slin wang - Sun Microsystems - Beijing China 	}
310dd1de374Slin wang - Sun Microsystems - Beijing China 
311dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->spurImmunityLevel < HAL_SPUR_IMMUNE_MAX) {
312dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL,
313dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->spurImmunityLevel + 1)) {
314dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
315dd1de374Slin wang - Sun Microsystems - Beijing China 		}
316dd1de374Slin wang - Sun Microsystems - Beijing China 	}
317dd1de374Slin wang - Sun Microsystems - Beijing China 
318dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ah->ah_opmode == ATH9K_M_HOSTAP) {
319dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) {
320dd1de374Slin wang - Sun Microsystems - Beijing China 			(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
321dd1de374Slin wang - Sun Microsystems - Beijing China 			    aniState->firstepLevel + 1);
322dd1de374Slin wang - Sun Microsystems - Beijing China 		}
323dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
324dd1de374Slin wang - Sun Microsystems - Beijing China 	}
325dd1de374Slin wang - Sun Microsystems - Beijing China 	rssi = BEACON_RSSI(ahp);
326dd1de374Slin wang - Sun Microsystems - Beijing China 	if (rssi > aniState->rssiThrHigh) {
327dd1de374Slin wang - Sun Microsystems - Beijing China 		if (!aniState->ofdmWeakSigDetectOff) {
328dd1de374Slin wang - Sun Microsystems - Beijing China 			if (ath9k_hw_ani_control(ah,
329dd1de374Slin wang - Sun Microsystems - Beijing China 			    ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
330dd1de374Slin wang - Sun Microsystems - Beijing China 			    B_FALSE)) {
331dd1de374Slin wang - Sun Microsystems - Beijing China 				(void) ath9k_hw_ani_control(ah,
332dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0);
333dd1de374Slin wang - Sun Microsystems - Beijing China 				return;
334dd1de374Slin wang - Sun Microsystems - Beijing China 			}
335dd1de374Slin wang - Sun Microsystems - Beijing China 		}
336dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) {
337dd1de374Slin wang - Sun Microsystems - Beijing China 			(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
338dd1de374Slin wang - Sun Microsystems - Beijing China 			    aniState->firstepLevel + 1);
339dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
340dd1de374Slin wang - Sun Microsystems - Beijing China 		}
341dd1de374Slin wang - Sun Microsystems - Beijing China 	} else if (rssi > aniState->rssiThrLow) {
342dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->ofdmWeakSigDetectOff)
343dd1de374Slin wang - Sun Microsystems - Beijing China 			(void) ath9k_hw_ani_control(ah,
344dd1de374Slin wang - Sun Microsystems - Beijing China 			    ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
345dd1de374Slin wang - Sun Microsystems - Beijing China 			    B_TRUE);
346dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX)
347dd1de374Slin wang - Sun Microsystems - Beijing China 			(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
348dd1de374Slin wang - Sun Microsystems - Beijing China 			    aniState->firstepLevel + 1);
349dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
350dd1de374Slin wang - Sun Microsystems - Beijing China 	} else {
351dd1de374Slin wang - Sun Microsystems - Beijing China 		mode = ath9k_hw_chan2wmode(ah, chan);
352dd1de374Slin wang - Sun Microsystems - Beijing China 		if (mode == ATH9K_MODE_11G || mode == ATH9K_MODE_11B) {
353dd1de374Slin wang - Sun Microsystems - Beijing China 			if (!aniState->ofdmWeakSigDetectOff)
354dd1de374Slin wang - Sun Microsystems - Beijing China 				(void) ath9k_hw_ani_control(ah,
355dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
356dd1de374Slin wang - Sun Microsystems - Beijing China 				    B_FALSE);
357dd1de374Slin wang - Sun Microsystems - Beijing China 			if (aniState->firstepLevel > 0)
358dd1de374Slin wang - Sun Microsystems - Beijing China 				(void) ath9k_hw_ani_control(ah,
359dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_FIRSTEP_LEVEL, 0);
360dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
361dd1de374Slin wang - Sun Microsystems - Beijing China 		}
362dd1de374Slin wang - Sun Microsystems - Beijing China 	}
363dd1de374Slin wang - Sun Microsystems - Beijing China }
364dd1de374Slin wang - Sun Microsystems - Beijing China 
365dd1de374Slin wang - Sun Microsystems - Beijing China static void
ath9k_hw_ani_cck_err_trigger(struct ath_hal * ah)366dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_cck_err_trigger(struct ath_hal *ah)
367dd1de374Slin wang - Sun Microsystems - Beijing China {
368dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
369dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath9k_channel *chan = ah->ah_curchan;
370dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
371dd1de374Slin wang - Sun Microsystems - Beijing China 	enum wireless_mode mode;
372dd1de374Slin wang - Sun Microsystems - Beijing China 	int32_t rssi;
373dd1de374Slin wang - Sun Microsystems - Beijing China 
374dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!DO_ANI(ah))
375dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
376dd1de374Slin wang - Sun Microsystems - Beijing China 
377dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = ahp->ah_curani;
378dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) {
379dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
380dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->noiseImmunityLevel + 1)) {
381dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
382dd1de374Slin wang - Sun Microsystems - Beijing China 		}
383dd1de374Slin wang - Sun Microsystems - Beijing China 	}
384dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ah->ah_opmode == ATH9K_M_HOSTAP) {
385dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) {
386dd1de374Slin wang - Sun Microsystems - Beijing China 			(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
387dd1de374Slin wang - Sun Microsystems - Beijing China 			    aniState->firstepLevel + 1);
388dd1de374Slin wang - Sun Microsystems - Beijing China 		}
389dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
390dd1de374Slin wang - Sun Microsystems - Beijing China 	}
391dd1de374Slin wang - Sun Microsystems - Beijing China 	rssi = BEACON_RSSI(ahp);
392dd1de374Slin wang - Sun Microsystems - Beijing China 	if (rssi > aniState->rssiThrLow) {
393dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX)
394dd1de374Slin wang - Sun Microsystems - Beijing China 			(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
395dd1de374Slin wang - Sun Microsystems - Beijing China 			    aniState->firstepLevel + 1);
396dd1de374Slin wang - Sun Microsystems - Beijing China 	} else {
397dd1de374Slin wang - Sun Microsystems - Beijing China 		mode = ath9k_hw_chan2wmode(ah, chan);
398dd1de374Slin wang - Sun Microsystems - Beijing China 		if (mode == ATH9K_MODE_11G || mode == ATH9K_MODE_11B) {
399dd1de374Slin wang - Sun Microsystems - Beijing China 			if (aniState->firstepLevel > 0)
400dd1de374Slin wang - Sun Microsystems - Beijing China 				(void) ath9k_hw_ani_control(ah,
401dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_FIRSTEP_LEVEL, 0);
402dd1de374Slin wang - Sun Microsystems - Beijing China 		}
403dd1de374Slin wang - Sun Microsystems - Beijing China 	}
404dd1de374Slin wang - Sun Microsystems - Beijing China }
405dd1de374Slin wang - Sun Microsystems - Beijing China 
406dd1de374Slin wang - Sun Microsystems - Beijing China static void
ath9k_hw_ani_lower_immunity(struct ath_hal * ah)407dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_lower_immunity(struct ath_hal *ah)
408dd1de374Slin wang - Sun Microsystems - Beijing China {
409dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
410dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
411dd1de374Slin wang - Sun Microsystems - Beijing China 	int32_t rssi;
412dd1de374Slin wang - Sun Microsystems - Beijing China 
413dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = ahp->ah_curani;
414dd1de374Slin wang - Sun Microsystems - Beijing China 
415dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ah->ah_opmode == ATH9K_M_HOSTAP) {
416dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->firstepLevel > 0) {
417dd1de374Slin wang - Sun Microsystems - Beijing China 			if (ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
418dd1de374Slin wang - Sun Microsystems - Beijing China 			    aniState->firstepLevel - 1))
419dd1de374Slin wang - Sun Microsystems - Beijing China 				return;
420dd1de374Slin wang - Sun Microsystems - Beijing China 		}
421dd1de374Slin wang - Sun Microsystems - Beijing China 	} else {
422dd1de374Slin wang - Sun Microsystems - Beijing China 		rssi = BEACON_RSSI(ahp);
423dd1de374Slin wang - Sun Microsystems - Beijing China 		if (rssi > aniState->rssiThrHigh) {
424dd1de374Slin wang - Sun Microsystems - Beijing China 			/* XXX: Handle me */
425dd1de374Slin wang - Sun Microsystems - Beijing China 			ARN_DBG((ARN_DBG_ANI, "arn: ath9k_ani_reset():\n"));
426dd1de374Slin wang - Sun Microsystems - Beijing China 		} else if (rssi > aniState->rssiThrLow) {
427dd1de374Slin wang - Sun Microsystems - Beijing China 			if (aniState->ofdmWeakSigDetectOff) {
428dd1de374Slin wang - Sun Microsystems - Beijing China 				if (ath9k_hw_ani_control(ah,
429dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
430dd1de374Slin wang - Sun Microsystems - Beijing China 				    B_TRUE) == B_TRUE)
431dd1de374Slin wang - Sun Microsystems - Beijing China 					return;
432dd1de374Slin wang - Sun Microsystems - Beijing China 			}
433dd1de374Slin wang - Sun Microsystems - Beijing China 			if (aniState->firstepLevel > 0) {
434dd1de374Slin wang - Sun Microsystems - Beijing China 				if (ath9k_hw_ani_control(ah,
435dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_FIRSTEP_LEVEL,
436dd1de374Slin wang - Sun Microsystems - Beijing China 				    aniState->firstepLevel - 1) == B_TRUE)
437dd1de374Slin wang - Sun Microsystems - Beijing China 					return;
438dd1de374Slin wang - Sun Microsystems - Beijing China 			}
439dd1de374Slin wang - Sun Microsystems - Beijing China 		} else {
440dd1de374Slin wang - Sun Microsystems - Beijing China 			if (aniState->firstepLevel > 0) {
441dd1de374Slin wang - Sun Microsystems - Beijing China 				if (ath9k_hw_ani_control(ah,
442dd1de374Slin wang - Sun Microsystems - Beijing China 				    ATH9K_ANI_FIRSTEP_LEVEL,
443dd1de374Slin wang - Sun Microsystems - Beijing China 				    aniState->firstepLevel - 1) == B_TRUE)
444dd1de374Slin wang - Sun Microsystems - Beijing China 					return;
445dd1de374Slin wang - Sun Microsystems - Beijing China 			}
446dd1de374Slin wang - Sun Microsystems - Beijing China 		}
447dd1de374Slin wang - Sun Microsystems - Beijing China 	}
448dd1de374Slin wang - Sun Microsystems - Beijing China 
449dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->spurImmunityLevel > 0) {
450dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL,
451dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->spurImmunityLevel - 1))
452dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
453dd1de374Slin wang - Sun Microsystems - Beijing China 	}
454dd1de374Slin wang - Sun Microsystems - Beijing China 
455dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->noiseImmunityLevel > 0) {
456dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
457dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->noiseImmunityLevel - 1);
458dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
459dd1de374Slin wang - Sun Microsystems - Beijing China 	}
460dd1de374Slin wang - Sun Microsystems - Beijing China }
461dd1de374Slin wang - Sun Microsystems - Beijing China 
462dd1de374Slin wang - Sun Microsystems - Beijing China static int32_t
ath9k_hw_ani_get_listen_time(struct ath_hal * ah)463dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_get_listen_time(struct ath_hal *ah)
464dd1de374Slin wang - Sun Microsystems - Beijing China {
465dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
466dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
467dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t txFrameCount, rxFrameCount, cycleCount;
468dd1de374Slin wang - Sun Microsystems - Beijing China 	int32_t listenTime;
469dd1de374Slin wang - Sun Microsystems - Beijing China 
470dd1de374Slin wang - Sun Microsystems - Beijing China 	txFrameCount = REG_READ(ah, AR_TFCNT);
471dd1de374Slin wang - Sun Microsystems - Beijing China 	rxFrameCount = REG_READ(ah, AR_RFCNT);
472dd1de374Slin wang - Sun Microsystems - Beijing China 	cycleCount = REG_READ(ah, AR_CCCNT);
473dd1de374Slin wang - Sun Microsystems - Beijing China 
474dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = ahp->ah_curani;
475dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->cycleCount == 0 || aniState->cycleCount > cycleCount) {
476dd1de374Slin wang - Sun Microsystems - Beijing China 
477dd1de374Slin wang - Sun Microsystems - Beijing China 		listenTime = 0;
478dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_lzero++;
479dd1de374Slin wang - Sun Microsystems - Beijing China 	} else {
480dd1de374Slin wang - Sun Microsystems - Beijing China 		int32_t ccdelta = cycleCount - aniState->cycleCount;
481dd1de374Slin wang - Sun Microsystems - Beijing China 		int32_t rfdelta = rxFrameCount - aniState->rxFrameCount;
482dd1de374Slin wang - Sun Microsystems - Beijing China 		int32_t tfdelta = txFrameCount - aniState->txFrameCount;
483dd1de374Slin wang - Sun Microsystems - Beijing China 		listenTime = (ccdelta - rfdelta - tfdelta) / 44000;
484dd1de374Slin wang - Sun Microsystems - Beijing China 	}
485dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->cycleCount = cycleCount;
486dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->txFrameCount = txFrameCount;
487dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->rxFrameCount = rxFrameCount;
488dd1de374Slin wang - Sun Microsystems - Beijing China 
489dd1de374Slin wang - Sun Microsystems - Beijing China 	return (listenTime);
490dd1de374Slin wang - Sun Microsystems - Beijing China }
491dd1de374Slin wang - Sun Microsystems - Beijing China 
492dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_ani_reset(struct ath_hal * ah)493dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_ani_reset(struct ath_hal *ah)
494dd1de374Slin wang - Sun Microsystems - Beijing China {
495dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
496dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
497dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath9k_channel *chan = ah->ah_curchan;
498dd1de374Slin wang - Sun Microsystems - Beijing China 	int index;
499dd1de374Slin wang - Sun Microsystems - Beijing China 
500dd1de374Slin wang - Sun Microsystems - Beijing China 	/* For Lint Reasons */
501dd1de374Slin wang - Sun Microsystems - Beijing China 	boolean_t ANI_USE_OFDM_WEAK_SIG = ATH9K_ANI_USE_OFDM_WEAK_SIG;
502dd1de374Slin wang - Sun Microsystems - Beijing China 
503dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!DO_ANI(ah))
504dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
505dd1de374Slin wang - Sun Microsystems - Beijing China 
506dd1de374Slin wang - Sun Microsystems - Beijing China 	index = ath9k_hw_get_ani_channel_idx(ah, chan);
507dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = &ahp->ah_ani[index];
508dd1de374Slin wang - Sun Microsystems - Beijing China 	ahp->ah_curani = aniState;
509dd1de374Slin wang - Sun Microsystems - Beijing China 
510dd1de374Slin wang - Sun Microsystems - Beijing China 	if (DO_ANI(ah) && ah->ah_opmode != ATH9K_M_STA &&
511dd1de374Slin wang - Sun Microsystems - Beijing China 	    ah->ah_opmode != ATH9K_M_IBSS) {
512dd1de374Slin wang - Sun Microsystems - Beijing China 		ARN_DBG((ARN_DBG_ANI, "arn: ath9k_ani_reset(): "
513dd1de374Slin wang - Sun Microsystems - Beijing China 		    "Reset ANI state opmode %u\n", ah->ah_opmode));
514dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_reset++;
515dd1de374Slin wang - Sun Microsystems - Beijing China 
516dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah,
517dd1de374Slin wang - Sun Microsystems - Beijing China 		    ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0);
518dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah,
519dd1de374Slin wang - Sun Microsystems - Beijing China 		    ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0);
520dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0);
521dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control
522dd1de374Slin wang - Sun Microsystems - Beijing China 		    (ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
523dd1de374Slin wang - Sun Microsystems - Beijing China 		    !ANI_USE_OFDM_WEAK_SIG /* !ATH9K_ANI_USE_OFDM_WEAK_SIG */);
524dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR,
525dd1de374Slin wang - Sun Microsystems - Beijing China 		    ATH9K_ANI_CCK_WEAK_SIG_THR);
526dd1de374Slin wang - Sun Microsystems - Beijing China 
527dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) |
528dd1de374Slin wang - Sun Microsystems - Beijing China 		    ATH9K_RX_FILTER_PHYERR);
529dd1de374Slin wang - Sun Microsystems - Beijing China 
530dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ah->ah_opmode == ATH9K_M_HOSTAP) {
531dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_curani->ofdmTrigHigh =
532dd1de374Slin wang - Sun Microsystems - Beijing China 			    ah->ah_config.ofdm_trig_high;
533dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_curani->ofdmTrigLow =
534dd1de374Slin wang - Sun Microsystems - Beijing China 			    ah->ah_config.ofdm_trig_low;
535dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_curani->cckTrigHigh =
536dd1de374Slin wang - Sun Microsystems - Beijing China 			    ah->ah_config.cck_trig_high;
537dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_curani->cckTrigLow =
538dd1de374Slin wang - Sun Microsystems - Beijing China 			    ah->ah_config.cck_trig_low;
539dd1de374Slin wang - Sun Microsystems - Beijing China 		}
540dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_ani_restart(ah);
541dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
542dd1de374Slin wang - Sun Microsystems - Beijing China 	}
543dd1de374Slin wang - Sun Microsystems - Beijing China 
544dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->noiseImmunityLevel != 0)
545dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
546dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->noiseImmunityLevel);
547dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->spurImmunityLevel != 0)
548dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL,
549dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->spurImmunityLevel);
550dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->ofdmWeakSigDetectOff)
551dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control
552dd1de374Slin wang - Sun Microsystems - Beijing China 		    (ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
553dd1de374Slin wang - Sun Microsystems - Beijing China 		    !aniState->ofdmWeakSigDetectOff);
554dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->cckWeakSigThreshold)
555dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR,
556dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->cckWeakSigThreshold);
557dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->firstepLevel != 0)
558dd1de374Slin wang - Sun Microsystems - Beijing China 		(void) ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
559dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->firstepLevel);
560dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ahp->ah_hasHwPhyCounters) {
561dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) &
562dd1de374Slin wang - Sun Microsystems - Beijing China 		    ~ATH9K_RX_FILTER_PHYERR);
563dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_ani_restart(ah);
564dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
565dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
566dd1de374Slin wang - Sun Microsystems - Beijing China 
567dd1de374Slin wang - Sun Microsystems - Beijing China 	} else {
568dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_ani_restart(ah);
569dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) |
570dd1de374Slin wang - Sun Microsystems - Beijing China 		    ATH9K_RX_FILTER_PHYERR);
571dd1de374Slin wang - Sun Microsystems - Beijing China 	}
572dd1de374Slin wang - Sun Microsystems - Beijing China }
573dd1de374Slin wang - Sun Microsystems - Beijing China 
574dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */
575dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_ani_monitor(struct ath_hal * ah,const struct ath9k_node_stats * stats,struct ath9k_channel * chan)576dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_monitor(struct ath_hal *ah, const struct ath9k_node_stats *stats,
577dd1de374Slin wang - Sun Microsystems - Beijing China     struct ath9k_channel *chan)
578dd1de374Slin wang - Sun Microsystems - Beijing China {
579dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
580dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ar5416AniState *aniState;
581dd1de374Slin wang - Sun Microsystems - Beijing China 	int32_t listenTime;
582dd1de374Slin wang - Sun Microsystems - Beijing China 
583dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState = ahp->ah_curani;
584dd1de374Slin wang - Sun Microsystems - Beijing China 	ahp->ah_stats.ast_nodestats = *stats;
585dd1de374Slin wang - Sun Microsystems - Beijing China 
586dd1de374Slin wang - Sun Microsystems - Beijing China 	listenTime = ath9k_hw_ani_get_listen_time(ah);
587dd1de374Slin wang - Sun Microsystems - Beijing China 	if (listenTime < 0) {
588dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_lneg++;
589dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_ani_restart(ah);
590dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
591dd1de374Slin wang - Sun Microsystems - Beijing China 	}
592dd1de374Slin wang - Sun Microsystems - Beijing China 
593dd1de374Slin wang - Sun Microsystems - Beijing China 	aniState->listenTime += listenTime;
594dd1de374Slin wang - Sun Microsystems - Beijing China 
595dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ahp->ah_hasHwPhyCounters) {
596dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t phyCnt1, phyCnt2;
597dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t ofdmPhyErrCnt, cckPhyErrCnt;
598dd1de374Slin wang - Sun Microsystems - Beijing China 
599dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_hw_update_mibstats(ah, &ahp->ah_mibStats);
600dd1de374Slin wang - Sun Microsystems - Beijing China 
601dd1de374Slin wang - Sun Microsystems - Beijing China 		phyCnt1 = REG_READ(ah, AR_PHY_ERR_1);
602dd1de374Slin wang - Sun Microsystems - Beijing China 		phyCnt2 = REG_READ(ah, AR_PHY_ERR_2);
603dd1de374Slin wang - Sun Microsystems - Beijing China 
604dd1de374Slin wang - Sun Microsystems - Beijing China 		if (phyCnt1 < aniState->ofdmPhyErrBase ||
605dd1de374Slin wang - Sun Microsystems - Beijing China 		    phyCnt2 < aniState->cckPhyErrBase) {
606dd1de374Slin wang - Sun Microsystems - Beijing China 			if (phyCnt1 < aniState->ofdmPhyErrBase) {
607dd1de374Slin wang - Sun Microsystems - Beijing China 				ARN_DBG((ARN_DBG_ANI, "arn: "
608dd1de374Slin wang - Sun Microsystems - Beijing China 				    "%s: phyCnt1 0x%x, resetting "
609dd1de374Slin wang - Sun Microsystems - Beijing China 				    "counter value to 0x%x\n",
610dd1de374Slin wang - Sun Microsystems - Beijing China 				    __func__, phyCnt1,
611dd1de374Slin wang - Sun Microsystems - Beijing China 				    aniState->ofdmPhyErrBase));
612dd1de374Slin wang - Sun Microsystems - Beijing China 				REG_WRITE(ah, AR_PHY_ERR_1,
613dd1de374Slin wang - Sun Microsystems - Beijing China 				    aniState->ofdmPhyErrBase);
614dd1de374Slin wang - Sun Microsystems - Beijing China 				REG_WRITE(ah, AR_PHY_ERR_MASK_1,
615dd1de374Slin wang - Sun Microsystems - Beijing China 				    AR_PHY_ERR_OFDM_TIMING);
616dd1de374Slin wang - Sun Microsystems - Beijing China 			}
617dd1de374Slin wang - Sun Microsystems - Beijing China 			if (phyCnt2 < aniState->cckPhyErrBase) {
618dd1de374Slin wang - Sun Microsystems - Beijing China 				ARN_DBG((ARN_DBG_ANI, "arn: "
619dd1de374Slin wang - Sun Microsystems - Beijing China 				    "%s: phyCnt2 0x%x, resetting "
620dd1de374Slin wang - Sun Microsystems - Beijing China 				    "counter value to 0x%x\n",
621dd1de374Slin wang - Sun Microsystems - Beijing China 				    __func__, phyCnt2,
622dd1de374Slin wang - Sun Microsystems - Beijing China 				    aniState->cckPhyErrBase));
623dd1de374Slin wang - Sun Microsystems - Beijing China 				REG_WRITE(ah, AR_PHY_ERR_2,
624dd1de374Slin wang - Sun Microsystems - Beijing China 				    aniState->cckPhyErrBase);
625dd1de374Slin wang - Sun Microsystems - Beijing China 				REG_WRITE(ah, AR_PHY_ERR_MASK_2,
626dd1de374Slin wang - Sun Microsystems - Beijing China 				    AR_PHY_ERR_CCK_TIMING);
627dd1de374Slin wang - Sun Microsystems - Beijing China 			}
628dd1de374Slin wang - Sun Microsystems - Beijing China 			return;
629dd1de374Slin wang - Sun Microsystems - Beijing China 		}
630dd1de374Slin wang - Sun Microsystems - Beijing China 
631dd1de374Slin wang - Sun Microsystems - Beijing China 		ofdmPhyErrCnt = phyCnt1 - aniState->ofdmPhyErrBase;
632dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_ofdmerrs +=
633dd1de374Slin wang - Sun Microsystems - Beijing China 		    ofdmPhyErrCnt - aniState->ofdmPhyErrCount;
634dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->ofdmPhyErrCount = ofdmPhyErrCnt;
635dd1de374Slin wang - Sun Microsystems - Beijing China 
636dd1de374Slin wang - Sun Microsystems - Beijing China 		cckPhyErrCnt = phyCnt2 - aniState->cckPhyErrBase;
637dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_cckerrs +=
638dd1de374Slin wang - Sun Microsystems - Beijing China 		    cckPhyErrCnt - aniState->cckPhyErrCount;
639dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->cckPhyErrCount = cckPhyErrCnt;
640dd1de374Slin wang - Sun Microsystems - Beijing China 	}
641dd1de374Slin wang - Sun Microsystems - Beijing China 
642dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!DO_ANI(ah))
643dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
644dd1de374Slin wang - Sun Microsystems - Beijing China 
645dd1de374Slin wang - Sun Microsystems - Beijing China 	if (aniState->listenTime > 5 * ahp->ah_aniPeriod) {
646dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->ofdmPhyErrCount <= aniState->listenTime *
647dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->ofdmTrigLow / 1000 &&
648dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->cckPhyErrCount <= aniState->listenTime *
649dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->cckTrigLow / 1000)
650dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_hw_ani_lower_immunity(ah);
651dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_ani_restart(ah);
652dd1de374Slin wang - Sun Microsystems - Beijing China 	} else if (aniState->listenTime > ahp->ah_aniPeriod) {
653dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->ofdmPhyErrCount > aniState->listenTime *
654dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->ofdmTrigHigh / 1000) {
655dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_hw_ani_ofdm_err_trigger(ah);
656dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_ani_restart(ah);
657dd1de374Slin wang - Sun Microsystems - Beijing China 		} else if (aniState->cckPhyErrCount >
658dd1de374Slin wang - Sun Microsystems - Beijing China 		    aniState->listenTime * aniState->cckTrigHigh / 1000) {
659dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_hw_ani_cck_err_trigger(ah);
660dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_ani_restart(ah);
661dd1de374Slin wang - Sun Microsystems - Beijing China 		}
662dd1de374Slin wang - Sun Microsystems - Beijing China 	}
663dd1de374Slin wang - Sun Microsystems - Beijing China }
664dd1de374Slin wang - Sun Microsystems - Beijing China 
665dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t
ath9k_hw_phycounters(struct ath_hal * ah)666dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_phycounters(struct ath_hal *ah)
667dd1de374Slin wang - Sun Microsystems - Beijing China {
668dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
669dd1de374Slin wang - Sun Microsystems - Beijing China 
670dd1de374Slin wang - Sun Microsystems - Beijing China 	return (ahp->ah_hasHwPhyCounters ? B_TRUE : B_FALSE);
671dd1de374Slin wang - Sun Microsystems - Beijing China }
672dd1de374Slin wang - Sun Microsystems - Beijing China 
673dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_enable_mib_counters(struct ath_hal * ah)674dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_enable_mib_counters(struct ath_hal *ah)
675dd1de374Slin wang - Sun Microsystems - Beijing China {
676dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
677dd1de374Slin wang - Sun Microsystems - Beijing China 
678dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: ath9k_enable_mib_counters(): "
679dd1de374Slin wang - Sun Microsystems - Beijing China 	    "Enable MIB counters\n"));
680dd1de374Slin wang - Sun Microsystems - Beijing China 
681dd1de374Slin wang - Sun Microsystems - Beijing China 	ath9k_hw_update_mibstats(ah, &ahp->ah_mibStats);
682dd1de374Slin wang - Sun Microsystems - Beijing China 
683dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_FILT_OFDM, 0);
684dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_FILT_CCK, 0);
685dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_MIBC,
686dd1de374Slin wang - Sun Microsystems - Beijing China 	    ~(AR_MIBC_COW | AR_MIBC_FMC | AR_MIBC_CMC | AR_MIBC_MCS) & 0x0f);
687dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
688dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
689dd1de374Slin wang - Sun Microsystems - Beijing China }
690dd1de374Slin wang - Sun Microsystems - Beijing China 
691dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_disable_mib_counters(struct ath_hal * ah)692dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_disable_mib_counters(struct ath_hal *ah)
693dd1de374Slin wang - Sun Microsystems - Beijing China {
694dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
695dd1de374Slin wang - Sun Microsystems - Beijing China 
696dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI,
697dd1de374Slin wang - Sun Microsystems - Beijing China 	    "arn: ath9k_hw_disable_mib_counters(): "
698dd1de374Slin wang - Sun Microsystems - Beijing China 	    "Disable MIB counters\n"));
699dd1de374Slin wang - Sun Microsystems - Beijing China 
700dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_MIBC, AR_MIBC_FMC | AR_MIBC_CMC);
701dd1de374Slin wang - Sun Microsystems - Beijing China 
702dd1de374Slin wang - Sun Microsystems - Beijing China 	ath9k_hw_update_mibstats(ah, &ahp->ah_mibStats);
703dd1de374Slin wang - Sun Microsystems - Beijing China 
704dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_FILT_OFDM, 0);
705dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_FILT_CCK, 0);
706dd1de374Slin wang - Sun Microsystems - Beijing China }
707dd1de374Slin wang - Sun Microsystems - Beijing China 
708dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t
ath9k_hw_GetMibCycleCountsPct(struct ath_hal * ah,uint32_t * rxc_pcnt,uint32_t * rxf_pcnt,uint32_t * txf_pcnt)709dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_GetMibCycleCountsPct(struct ath_hal *ah, uint32_t *rxc_pcnt,
710dd1de374Slin wang - Sun Microsystems - Beijing China     uint32_t *rxf_pcnt, uint32_t *txf_pcnt)
711dd1de374Slin wang - Sun Microsystems - Beijing China {
712dd1de374Slin wang - Sun Microsystems - Beijing China 	static uint32_t cycles, rx_clear, rx_frame, tx_frame;
713dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t good = 1;
714dd1de374Slin wang - Sun Microsystems - Beijing China 
715dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t rc = REG_READ(ah, AR_RCCNT);
716dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t rf = REG_READ(ah, AR_RFCNT);
717dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t tf = REG_READ(ah, AR_TFCNT);
718dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t cc = REG_READ(ah, AR_CCCNT);
719dd1de374Slin wang - Sun Microsystems - Beijing China 
720dd1de374Slin wang - Sun Microsystems - Beijing China 	if (cycles == 0 || cycles > cc) {
721dd1de374Slin wang - Sun Microsystems - Beijing China 		ARN_DBG((ARN_DBG_CHANNEL,
722dd1de374Slin wang - Sun Microsystems - Beijing China 		    "arn: ath9k_hw_GetMibCycleCountsPct(): "
723dd1de374Slin wang - Sun Microsystems - Beijing China 		    "cycle counter wrap. ExtBusy = 0\n"));
724dd1de374Slin wang - Sun Microsystems - Beijing China 		good = 0;
725dd1de374Slin wang - Sun Microsystems - Beijing China 	} else {
726dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t cc_d = cc - cycles;
727dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t rc_d = rc - rx_clear;
728dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t rf_d = rf - rx_frame;
729dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t tf_d = tf - tx_frame;
730dd1de374Slin wang - Sun Microsystems - Beijing China 
731dd1de374Slin wang - Sun Microsystems - Beijing China 		if (cc_d != 0) {
732dd1de374Slin wang - Sun Microsystems - Beijing China 			*rxc_pcnt = rc_d * 100 / cc_d;
733dd1de374Slin wang - Sun Microsystems - Beijing China 			*rxf_pcnt = rf_d * 100 / cc_d;
734dd1de374Slin wang - Sun Microsystems - Beijing China 			*txf_pcnt = tf_d * 100 / cc_d;
735dd1de374Slin wang - Sun Microsystems - Beijing China 		} else {
736dd1de374Slin wang - Sun Microsystems - Beijing China 			good = 0;
737dd1de374Slin wang - Sun Microsystems - Beijing China 		}
738dd1de374Slin wang - Sun Microsystems - Beijing China 	}
739dd1de374Slin wang - Sun Microsystems - Beijing China 
740dd1de374Slin wang - Sun Microsystems - Beijing China 	cycles = cc;
741dd1de374Slin wang - Sun Microsystems - Beijing China 	rx_frame = rf;
742dd1de374Slin wang - Sun Microsystems - Beijing China 	rx_clear = rc;
743dd1de374Slin wang - Sun Microsystems - Beijing China 	tx_frame = tf;
744dd1de374Slin wang - Sun Microsystems - Beijing China 
745dd1de374Slin wang - Sun Microsystems - Beijing China 	return (good);
746dd1de374Slin wang - Sun Microsystems - Beijing China }
747dd1de374Slin wang - Sun Microsystems - Beijing China 
748dd1de374Slin wang - Sun Microsystems - Beijing China /*
749dd1de374Slin wang - Sun Microsystems - Beijing China  * Process a MIB interrupt.  We may potentially be invoked because
750dd1de374Slin wang - Sun Microsystems - Beijing China  * any of the MIB counters overflow/trigger so don't assume we're
751dd1de374Slin wang - Sun Microsystems - Beijing China  * here because a PHY error counter triggered.
752dd1de374Slin wang - Sun Microsystems - Beijing China  */
753dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_procmibevent(struct ath_hal * ah,const struct ath9k_node_stats * stats)754dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_procmibevent(struct ath_hal *ah,
755dd1de374Slin wang - Sun Microsystems - Beijing China     const struct ath9k_node_stats *stats)
756dd1de374Slin wang - Sun Microsystems - Beijing China {
757dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
758dd1de374Slin wang - Sun Microsystems - Beijing China 	uint32_t phyCnt1, phyCnt2;
759dd1de374Slin wang - Sun Microsystems - Beijing China 
760dd1de374Slin wang - Sun Microsystems - Beijing China 	/* Reset these counters regardless */
761dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_FILT_OFDM, 0);
762dd1de374Slin wang - Sun Microsystems - Beijing China 	REG_WRITE(ah, AR_FILT_CCK, 0);
763dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!(REG_READ(ah, AR_SLP_MIB_CTRL) & AR_SLP_MIB_PENDING))
764dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_SLP_MIB_CTRL, AR_SLP_MIB_CLEAR);
765dd1de374Slin wang - Sun Microsystems - Beijing China 
766dd1de374Slin wang - Sun Microsystems - Beijing China 	/* Clear the mib counters and save them in the stats */
767dd1de374Slin wang - Sun Microsystems - Beijing China 	ath9k_hw_update_mibstats(ah, &ahp->ah_mibStats);
768dd1de374Slin wang - Sun Microsystems - Beijing China 	ahp->ah_stats.ast_nodestats = *stats;
769dd1de374Slin wang - Sun Microsystems - Beijing China 
770dd1de374Slin wang - Sun Microsystems - Beijing China 	if (!DO_ANI(ah))
771dd1de374Slin wang - Sun Microsystems - Beijing China 		return;
772dd1de374Slin wang - Sun Microsystems - Beijing China 
773dd1de374Slin wang - Sun Microsystems - Beijing China 	/* NB: these are not reset-on-read */
774dd1de374Slin wang - Sun Microsystems - Beijing China 	phyCnt1 = REG_READ(ah, AR_PHY_ERR_1);
775dd1de374Slin wang - Sun Microsystems - Beijing China 	phyCnt2 = REG_READ(ah, AR_PHY_ERR_2);
776dd1de374Slin wang - Sun Microsystems - Beijing China 	if (((phyCnt1 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK) ||
777dd1de374Slin wang - Sun Microsystems - Beijing China 	    ((phyCnt2 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK)) {
778dd1de374Slin wang - Sun Microsystems - Beijing China 		struct ar5416AniState *aniState = ahp->ah_curani;
779dd1de374Slin wang - Sun Microsystems - Beijing China 		uint32_t ofdmPhyErrCnt, cckPhyErrCnt;
780dd1de374Slin wang - Sun Microsystems - Beijing China 
781dd1de374Slin wang - Sun Microsystems - Beijing China 		/* NB: only use ast_ani_*errs with AH_PRIVATE_DIAG */
782dd1de374Slin wang - Sun Microsystems - Beijing China 		ofdmPhyErrCnt = phyCnt1 - aniState->ofdmPhyErrBase;
783dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_ofdmerrs +=
784dd1de374Slin wang - Sun Microsystems - Beijing China 		    ofdmPhyErrCnt - aniState->ofdmPhyErrCount;
785dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->ofdmPhyErrCount = ofdmPhyErrCnt;
786dd1de374Slin wang - Sun Microsystems - Beijing China 
787dd1de374Slin wang - Sun Microsystems - Beijing China 		cckPhyErrCnt = phyCnt2 - aniState->cckPhyErrBase;
788dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_stats.ast_ani_cckerrs +=
789dd1de374Slin wang - Sun Microsystems - Beijing China 		    cckPhyErrCnt - aniState->cckPhyErrCount;
790dd1de374Slin wang - Sun Microsystems - Beijing China 		aniState->cckPhyErrCount = cckPhyErrCnt;
791dd1de374Slin wang - Sun Microsystems - Beijing China 
792dd1de374Slin wang - Sun Microsystems - Beijing China 		/*
793dd1de374Slin wang - Sun Microsystems - Beijing China 		 * NB: figure out which counter triggered.  If both
794dd1de374Slin wang - Sun Microsystems - Beijing China 		 * trigger we'll only deal with one as the processing
795dd1de374Slin wang - Sun Microsystems - Beijing China 		 * clobbers the error counter so the trigger threshold
796dd1de374Slin wang - Sun Microsystems - Beijing China 		 * check will never be true.
797dd1de374Slin wang - Sun Microsystems - Beijing China 		 */
798dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->ofdmPhyErrCount > aniState->ofdmTrigHigh)
799dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_hw_ani_ofdm_err_trigger(ah);
800dd1de374Slin wang - Sun Microsystems - Beijing China 		if (aniState->cckPhyErrCount > aniState->cckTrigHigh)
801dd1de374Slin wang - Sun Microsystems - Beijing China 			ath9k_hw_ani_cck_err_trigger(ah);
802dd1de374Slin wang - Sun Microsystems - Beijing China 		/* NB: always restart to insure the h/w counters are reset */
803dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_ani_restart(ah);
804dd1de374Slin wang - Sun Microsystems - Beijing China 	}
805dd1de374Slin wang - Sun Microsystems - Beijing China }
806dd1de374Slin wang - Sun Microsystems - Beijing China 
807dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_ani_setup(struct ath_hal * ah)808dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_setup(struct ath_hal *ah)
809dd1de374Slin wang - Sun Microsystems - Beijing China {
810dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
811dd1de374Slin wang - Sun Microsystems - Beijing China 	int i;
812dd1de374Slin wang - Sun Microsystems - Beijing China 
813dd1de374Slin wang - Sun Microsystems - Beijing China 	const int totalSizeDesired[] = { -55, -55, -55, -55, -62 };
814dd1de374Slin wang - Sun Microsystems - Beijing China 	const int coarseHigh[] = { -14, -14, -14, -14, -12 };
815dd1de374Slin wang - Sun Microsystems - Beijing China 	const int coarseLow[] = { -64, -64, -64, -64, -70 };
816dd1de374Slin wang - Sun Microsystems - Beijing China 	const int firpwr[] = { -78, -78, -78, -78, -80 };
817dd1de374Slin wang - Sun Microsystems - Beijing China 
818dd1de374Slin wang - Sun Microsystems - Beijing China 	for (i = 0; i < 5; i++) {
819dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_totalSizeDesired[i] = totalSizeDesired[i];
820dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_coarseHigh[i] = coarseHigh[i];
821dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_coarseLow[i] = coarseLow[i];
822dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_firpwr[i] = firpwr[i];
823dd1de374Slin wang - Sun Microsystems - Beijing China 	}
824dd1de374Slin wang - Sun Microsystems - Beijing China }
825dd1de374Slin wang - Sun Microsystems - Beijing China 
826dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_ani_attach(struct ath_hal * ah)827dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_attach(struct ath_hal *ah)
828dd1de374Slin wang - Sun Microsystems - Beijing China {
829dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
830dd1de374Slin wang - Sun Microsystems - Beijing China 	int i;
831dd1de374Slin wang - Sun Microsystems - Beijing China 
832dd1de374Slin wang - Sun Microsystems - Beijing China 	/* For Lint Reasons */
833dd1de374Slin wang - Sun Microsystems - Beijing China 	boolean_t ANI_USE_OFDM_WEAK_SIG = ATH9K_ANI_USE_OFDM_WEAK_SIG;
834dd1de374Slin wang - Sun Microsystems - Beijing China 
835dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: ath9k_hw_ani_attach(): "
836dd1de374Slin wang - Sun Microsystems - Beijing China 	    "Attach ANI\n"));
837dd1de374Slin wang - Sun Microsystems - Beijing China 
838dd1de374Slin wang - Sun Microsystems - Beijing China 	ahp->ah_hasHwPhyCounters = 1;
839dd1de374Slin wang - Sun Microsystems - Beijing China 
840dd1de374Slin wang - Sun Microsystems - Beijing China 	(void) memset(ahp->ah_ani, 0, sizeof (ahp->ah_ani));
841dd1de374Slin wang - Sun Microsystems - Beijing China 	for (i = 0; i < ARRAY_SIZE(ahp->ah_ani); i++) {
842dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].ofdmTrigHigh = ATH9K_ANI_OFDM_TRIG_HIGH;
843dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].ofdmTrigLow = ATH9K_ANI_OFDM_TRIG_LOW;
844dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].cckTrigHigh = ATH9K_ANI_CCK_TRIG_HIGH;
845dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].cckTrigLow = ATH9K_ANI_CCK_TRIG_LOW;
846dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH;
847dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].rssiThrLow = ATH9K_ANI_RSSI_THR_LOW;
848dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].ofdmWeakSigDetectOff =
849dd1de374Slin wang - Sun Microsystems - Beijing China 		    !ANI_USE_OFDM_WEAK_SIG /* !ATH9K_ANI_USE_OFDM_WEAK_SIG */;
850dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].cckWeakSigThreshold =
851dd1de374Slin wang - Sun Microsystems - Beijing China 		    ATH9K_ANI_CCK_WEAK_SIG_THR;
852dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL;
853dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_ani[i].firstepLevel = ATH9K_ANI_FIRSTEP_LVL;
854dd1de374Slin wang - Sun Microsystems - Beijing China 		if (ahp->ah_hasHwPhyCounters) {
855dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_ani[i].ofdmPhyErrBase =
856dd1de374Slin wang - Sun Microsystems - Beijing China 			    AR_PHY_COUNTMAX - ATH9K_ANI_OFDM_TRIG_HIGH;
857dd1de374Slin wang - Sun Microsystems - Beijing China 			ahp->ah_ani[i].cckPhyErrBase =
858dd1de374Slin wang - Sun Microsystems - Beijing China 			    AR_PHY_COUNTMAX - ATH9K_ANI_CCK_TRIG_HIGH;
859dd1de374Slin wang - Sun Microsystems - Beijing China 		}
860dd1de374Slin wang - Sun Microsystems - Beijing China 	}
861dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ahp->ah_hasHwPhyCounters) {
862dd1de374Slin wang - Sun Microsystems - Beijing China 		ARN_DBG((ARN_DBG_ANI, "arn: ath9k_hw_ani_attach(): "
863dd1de374Slin wang - Sun Microsystems - Beijing China 		    "Setting OfdmErrBase = 0x%08x\n",
864dd1de374Slin wang - Sun Microsystems - Beijing China 		    ahp->ah_ani[0].ofdmPhyErrBase));
865dd1de374Slin wang - Sun Microsystems - Beijing China 		ARN_DBG((ARN_DBG_ANI, "arn: ath9k_hw_ani_attach(): "
866dd1de374Slin wang - Sun Microsystems - Beijing China 		    "Setting cckErrBase = 0x%08x\n",
867dd1de374Slin wang - Sun Microsystems - Beijing China 		    ahp->ah_ani[0].cckPhyErrBase));
868dd1de374Slin wang - Sun Microsystems - Beijing China 
869dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_1, ahp->ah_ani[0].ofdmPhyErrBase);
870dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_2, ahp->ah_ani[0].cckPhyErrBase);
871dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_enable_mib_counters(ah);
872dd1de374Slin wang - Sun Microsystems - Beijing China 	}
873dd1de374Slin wang - Sun Microsystems - Beijing China 	ahp->ah_aniPeriod = ATH9K_ANI_PERIOD;
874dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ah->ah_config.enable_ani)
875dd1de374Slin wang - Sun Microsystems - Beijing China 		ahp->ah_procPhyErr |= HAL_PROCESS_ANI;
876dd1de374Slin wang - Sun Microsystems - Beijing China }
877dd1de374Slin wang - Sun Microsystems - Beijing China 
878dd1de374Slin wang - Sun Microsystems - Beijing China void
ath9k_hw_ani_detach(struct ath_hal * ah)879dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_ani_detach(struct ath_hal *ah)
880dd1de374Slin wang - Sun Microsystems - Beijing China {
881dd1de374Slin wang - Sun Microsystems - Beijing China 	struct ath_hal_5416 *ahp = AH5416(ah);
882dd1de374Slin wang - Sun Microsystems - Beijing China 
883dd1de374Slin wang - Sun Microsystems - Beijing China 	ARN_DBG((ARN_DBG_ANI, "arn: ath9k_hw_ani_detach(): "
884dd1de374Slin wang - Sun Microsystems - Beijing China 	    "Detach ANI\n"));
885dd1de374Slin wang - Sun Microsystems - Beijing China 
886dd1de374Slin wang - Sun Microsystems - Beijing China 	if (ahp->ah_hasHwPhyCounters) {
887dd1de374Slin wang - Sun Microsystems - Beijing China 		ath9k_hw_disable_mib_counters(ah);
888dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_1, 0);
889dd1de374Slin wang - Sun Microsystems - Beijing China 		REG_WRITE(ah, AR_PHY_ERR_2, 0);
890dd1de374Slin wang - Sun Microsystems - Beijing China 	}
891dd1de374Slin wang - Sun Microsystems - Beijing China }
892