1203930Srpaulo/*
2203930Srpaulo * Copyright (c) 2008-2009 Sam Leffler, Errno Consulting
3203930Srpaulo * Copyright (c) 2008 Atheros Communications, Inc.
4203930Srpaulo *
5203930Srpaulo * Permission to use, copy, modify, and/or distribute this software for any
6203930Srpaulo * purpose with or without fee is hereby granted, provided that the above
7203930Srpaulo * copyright notice and this permission notice appear in all copies.
8203930Srpaulo *
9203930Srpaulo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10203930Srpaulo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11203930Srpaulo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12203930Srpaulo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13203930Srpaulo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14203930Srpaulo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15203930Srpaulo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16203930Srpaulo *
17203930Srpaulo * $FreeBSD$
18203930Srpaulo */
19203930Srpaulo#include "opt_ah.h"
20203930Srpaulo
21203930Srpaulo#include "ah.h"
22203930Srpaulo#include "ah_internal.h"
23203930Srpaulo
24203930Srpaulo#include "ah_eeprom_v14.h"
25203930Srpaulo
26217631Sadrian#include "ar9002/ar9280.h"
27217631Sadrian#include "ar9002/ar9285.h"
28203930Srpaulo#include "ar5416/ar5416reg.h"
29203930Srpaulo#include "ar5416/ar5416phy.h"
30203930Srpaulo
31219605Sadrian/*
32219605Sadrian * The ordering of nfarray is thus:
33219605Sadrian *
34219605Sadrian * nfarray[0]: Chain 0 ctl
35219605Sadrian * nfarray[1]: Chain 1 ctl
36219605Sadrian * nfarray[2]: Chain 2 ctl
37219605Sadrian * nfarray[3]: Chain 0 ext
38219605Sadrian * nfarray[4]: Chain 1 ext
39219605Sadrian * nfarray[5]: Chain 2 ext
40219605Sadrian */
41203930Srpaulostatic void
42203930Srpauloar9285GetNoiseFloor(struct ath_hal *ah, int16_t nfarray[])
43203930Srpaulo{
44203930Srpaulo	int16_t nf;
45203930Srpaulo
46203930Srpaulo	nf = MS(OS_REG_READ(ah, AR_PHY_CCA), AR9280_PHY_MINCCA_PWR);
47203930Srpaulo	if (nf & 0x100)
48203930Srpaulo		nf = 0 - ((nf ^ 0x1ff) + 1);
49203930Srpaulo	HALDEBUG(ah, HAL_DEBUG_NFCAL,
50203930Srpaulo	    "NF calibrated [ctl] [chain 0] is %d\n", nf);
51203930Srpaulo	nfarray[0] = nf;
52203930Srpaulo
53203930Srpaulo
54203930Srpaulo	nf = MS(OS_REG_READ(ah, AR_PHY_EXT_CCA), AR9280_PHY_EXT_MINCCA_PWR);
55203930Srpaulo	if (nf & 0x100)
56203930Srpaulo		nf = 0 - ((nf ^ 0x1ff) + 1);
57203930Srpaulo	HALDEBUG(ah, HAL_DEBUG_NFCAL,
58203930Srpaulo	    "NF calibrated [ext] [chain 0] is %d\n", nf);
59203930Srpaulo	nfarray[3] = nf;
60203930Srpaulo
61219605Sadrian	/* Chain 1 - invalid */
62219605Sadrian	nfarray[1] = 0;
63203930Srpaulo	nfarray[4] = 0;
64219605Sadrian
65219605Sadrian	/* Chain 2 - invalid */
66219605Sadrian	nfarray[2] = 0;
67219605Sadrian	nfarray[5] = 0;
68203930Srpaulo}
69203930Srpaulo
70203930SrpauloHAL_BOOL
71203930Srpauloar9285RfAttach(struct ath_hal *ah, HAL_STATUS *status)
72203930Srpaulo{
73203930Srpaulo	if (ar9280RfAttach(ah, status) == AH_FALSE)
74203930Srpaulo		return AH_FALSE;
75203930Srpaulo
76203930Srpaulo	AH_PRIVATE(ah)->ah_getNoiseFloor = ar9285GetNoiseFloor;
77203930Srpaulo
78203930Srpaulo	return AH_TRUE;
79203930Srpaulo}
80228517Sadrian
81228517Sadrianstatic HAL_BOOL
82228517Sadrianar9285RfProbe(struct ath_hal *ah)
83228517Sadrian{
84228517Sadrian	return (AR_SREV_KITE(ah));
85228517Sadrian}
86228517Sadrian
87228517SadrianAH_RF(RF9285, ar9285RfProbe, ar9285RfAttach);
88