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