1331722Seadler/*
2220587Sadrian * Copyright (c) 2008-2010 Atheros Communications Inc.
3220587Sadrian * Copyright (c) 2010-2011 Adrian Chadd, Xenion Pty Ltd.
4220587Sadrian *
5220587Sadrian * Redistribution and use in source and binary forms, with or without
6220587Sadrian * modification, are permitted provided that the following conditions
7220587Sadrian * are met:
8220587Sadrian * 1. Redistributions of source code must retain the above copyright
9220587Sadrian *    notice, this list of conditions and the following disclaimer.
10220587Sadrian * 2. Redistributions in binary form must reproduce the above copyright
11220587Sadrian *    notice, this list of conditions and the following disclaimer in the
12220587Sadrian *    documentation and/or other materials provided with the distribution.
13220587Sadrian *
14220587Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15220587Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16220587Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17220587Sadrian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18220587Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19220587Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20220587Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21220587Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22220587Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23220587Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24220587Sadrian * SUCH DAMAGE.
25220587Sadrian *
26220587Sadrian * $FreeBSD$
27220587Sadrian */
28220587Sadrian#include "opt_ah.h"
29220587Sadrian
30220587Sadrian#include "ah.h"
31220587Sadrian#include "ah_internal.h"
32220587Sadrian#include "ah_devid.h"
33220587Sadrian#include "ah_eeprom_v4k.h"
34220587Sadrian
35220587Sadrian#include "ar9002/ar9280.h"
36220587Sadrian#include "ar9002/ar9285.h"
37220587Sadrian#include "ar5416/ar5416reg.h"
38220587Sadrian#include "ar5416/ar5416phy.h"
39220587Sadrian#include "ar9002/ar9285phy.h"
40220587Sadrian#include "ar9002/ar9285_phy.h"
41220587Sadrian
42220587Sadrianvoid
43251643Sadrianar9285_antdiv_comb_conf_get(struct ath_hal *ah, HAL_ANT_COMB_CONFIG *antconf)
44220587Sadrian{
45220587Sadrian	uint32_t regval;
46220587Sadrian
47220587Sadrian	regval = OS_REG_READ(ah, AR_PHY_MULTICHAIN_GAIN_CTL);
48220587Sadrian	antconf->main_lna_conf = (regval & AR_PHY_9285_ANT_DIV_MAIN_LNACONF) >>
49220587Sadrian				  AR_PHY_9285_ANT_DIV_MAIN_LNACONF_S;
50220587Sadrian	antconf->alt_lna_conf = (regval & AR_PHY_9285_ANT_DIV_ALT_LNACONF) >>
51220587Sadrian				 AR_PHY_9285_ANT_DIV_ALT_LNACONF_S;
52220587Sadrian	antconf->fast_div_bias = (regval & AR_PHY_9285_FAST_DIV_BIAS) >>
53220587Sadrian				  AR_PHY_9285_FAST_DIV_BIAS_S;
54251656Sadrian	antconf->antdiv_configgroup = DEFAULT_ANTDIV_CONFIG_GROUP;
55220587Sadrian}
56220587Sadrian
57220587Sadrianvoid
58251643Sadrianar9285_antdiv_comb_conf_set(struct ath_hal *ah, HAL_ANT_COMB_CONFIG *antconf)
59220587Sadrian{
60220587Sadrian	uint32_t regval;
61220587Sadrian
62220587Sadrian	regval = OS_REG_READ(ah, AR_PHY_MULTICHAIN_GAIN_CTL);
63220587Sadrian	regval &= ~(AR_PHY_9285_ANT_DIV_MAIN_LNACONF |
64220587Sadrian		    AR_PHY_9285_ANT_DIV_ALT_LNACONF |
65220587Sadrian		    AR_PHY_9285_FAST_DIV_BIAS);
66220587Sadrian	regval |= ((antconf->main_lna_conf << AR_PHY_9285_ANT_DIV_MAIN_LNACONF_S)
67220587Sadrian		   & AR_PHY_9285_ANT_DIV_MAIN_LNACONF);
68220587Sadrian	regval |= ((antconf->alt_lna_conf << AR_PHY_9285_ANT_DIV_ALT_LNACONF_S)
69220587Sadrian		   & AR_PHY_9285_ANT_DIV_ALT_LNACONF);
70220587Sadrian	regval |= ((antconf->fast_div_bias << AR_PHY_9285_FAST_DIV_BIAS_S)
71220587Sadrian		   & AR_PHY_9285_FAST_DIV_BIAS);
72220587Sadrian
73220587Sadrian	OS_REG_WRITE(ah, AR_PHY_MULTICHAIN_GAIN_CTL, regval);
74220587Sadrian}
75220587Sadrian
76220587Sadrian/*
77221702Sadrian * Check whether combined + fast antenna diversity should be enabled.
78221702Sadrian *
79221702Sadrian * This enables software-driven RX antenna diversity based on RX
80221702Sadrian * RSSI + antenna config packet sampling.
81220587Sadrian */
82221702SadrianHAL_BOOL
83220587Sadrianar9285_check_div_comb(struct ath_hal *ah)
84220587Sadrian{
85220587Sadrian	uint8_t ant_div_ctl1;
86220587Sadrian	HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom;
87220587Sadrian        const MODAL_EEP4K_HEADER *pModal = &ee->ee_base.modalHeader;
88220587Sadrian
89251442Sadrian#if 0
90221702Sadrian	/* For now, simply disable this until it's better debugged. -adrian */
91221702Sadrian	return AH_FALSE;
92251442Sadrian#endif
93221702Sadrian
94220587Sadrian	if (! AR_SREV_KITE(ah))
95221702Sadrian		return AH_FALSE;
96220587Sadrian
97220587Sadrian	if (pModal->version < 3)
98221702Sadrian		return AH_FALSE;
99220587Sadrian
100220587Sadrian	ant_div_ctl1 = pModal->antdiv_ctl1;
101220587Sadrian	if ((ant_div_ctl1 & 0x1) && ((ant_div_ctl1 >> 3) & 0x1))
102221702Sadrian		return AH_TRUE;
103220587Sadrian
104221702Sadrian	return AH_FALSE;
105220587Sadrian}
106