ar9287_olc.c revision 222301
1222301Sadrian/*
2222301Sadrian * Copyright (c) 2011 Adrian Chadd, Xenion Pty Ltd.
3222301Sadrian *
4222301Sadrian * Redistribution and use in source and binary forms, with or without
5222301Sadrian * modification, are permitted provided that the following conditions
6222301Sadrian * are met:
7222301Sadrian * 1. Redistributions of source code must retain the above copyright
8222301Sadrian *    notice, this list of conditions and the following disclaimer.
9222301Sadrian * 2. Redistributions in binary form must reproduce the above copyright
10222301Sadrian *    notice, this list of conditions and the following disclaimer in the
11222301Sadrian *    documentation and/or other materials provided with the distribution.
12222301Sadrian *
13222301Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14222301Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15222301Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16222301Sadrian * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17222301Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18222301Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19222301Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20222301Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21222301Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22222301Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23222301Sadrian * SUCH DAMAGE.
24222301Sadrian *
25222301Sadrian * $FreeBSD: head/sys/dev/ath/ath_hal/ar9002/ar9287_olc.c 222301 2011-05-26 09:15:33Z adrian $
26222301Sadrian */
27222301Sadrian#include "opt_ah.h"
28222301Sadrian
29222301Sadrian#include "ah.h"
30222301Sadrian#include "ah_internal.h"
31222301Sadrian
32222301Sadrian#include "ah_eeprom_v14.h"
33222301Sadrian
34222301Sadrian#include "ar9002/ar9280.h"
35222301Sadrian#include "ar5416/ar5416reg.h"
36222301Sadrian#include "ar5416/ar5416phy.h"
37222301Sadrian#include "ar9002/ar9002phy.h"
38222301Sadrian
39222301Sadrian#include "ar9002/ar9287phy.h"
40222301Sadrian#include "ar9002/ar9287an.h"
41222301Sadrian#include "ar9002/ar9287_olc.h"
42222301Sadrian
43222301Sadrianvoid
44222301Sadrianar9287olcInit(struct ath_hal *ah)
45222301Sadrian{
46222301Sadrian	OS_REG_SET_BIT(ah, AR_PHY_TX_PWRCTRL9,
47222301Sadrian	    AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL);
48222301Sadrian	OS_A_REG_RMW_FIELD(ah, AR9287_AN_TXPC0,
49222301Sadrian	    AR9287_AN_TXPC0_TXPCMODE,
50222301Sadrian	    AR9287_AN_TXPC0_TXPCMODE_TEMPSENSE);
51222301Sadrian	OS_DELAY(100);
52222301Sadrian}
53222301Sadrian
54222301Sadrian/*
55222301Sadrian * Run temperature compensation calibration.
56222301Sadrian *
57222301Sadrian * The TX gain table is adjusted depending upon the difference
58222301Sadrian * between the initial PDADC value and the currently read
59222301Sadrian * average TX power sample value. This value is only valid if
60222301Sadrian * frames have been transmitted, so currPDADC will be 0 if
61222301Sadrian * no frames have yet been transmitted.
62222301Sadrian */
63222301Sadrianvoid
64222301Sadrianar9287olcTemperatureCompensation(struct ath_hal *ah)
65222301Sadrian{
66222301Sadrian	uint32_t rddata;
67222301Sadrian	int32_t delta, currPDADC, slope;
68222301Sadrian
69222301Sadrian	rddata = OS_REG_READ(ah, AR_PHY_TX_PWRCTRL4);
70222301Sadrian	currPDADC = MS(rddata, AR_PHY_TX_PWRCTRL_PD_AVG_OUT);
71222301Sadrian
72222301Sadrian	if (AH5416(ah)->initPDADC == 0 || currPDADC == 0) {
73222301Sadrian		/*
74222301Sadrian		 * Zero value indicates that no frames have been transmitted
75222301Sadrian		 * yet, can't do temperature compensation until frames are
76222301Sadrian		 * transmitted.
77222301Sadrian		 */
78222301Sadrian		return;
79222301Sadrian	} else {
80222301Sadrian		int8_t val;
81222301Sadrian		(void) (ath_hal_eepromGet(ah, AR_EEP_TEMPSENSE_SLOPE, &val));
82222301Sadrian		slope = val;
83222301Sadrian
84222301Sadrian		if (slope == 0) { /* to avoid divide by zero case */
85222301Sadrian			delta = 0;
86222301Sadrian		} else {
87222301Sadrian			delta = ((currPDADC - AH5416(ah)->initPDADC)*4) / slope;
88222301Sadrian		}
89222301Sadrian		OS_REG_RMW_FIELD(ah, AR_PHY_CH0_TX_PWRCTRL11,
90222301Sadrian		    AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP, delta);
91222301Sadrian		OS_REG_RMW_FIELD(ah, AR_PHY_CH1_TX_PWRCTRL11,
92222301Sadrian		    AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP, delta);
93222301Sadrian	}
94222301Sadrian}
95