10c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger/****************************************************************************** 20c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 39003a4aba4b040be265ce8ed51f6fe437d369453Larry Finger * Copyright(c) 2009-2012 Realtek Corporation. 40c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 50c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * This program is free software; you can redistribute it and/or modify it 60c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * under the terms of version 2 of the GNU General Public License as 70c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * published by the Free Software Foundation. 80c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 90c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT 100c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 110c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 120c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * more details. 130c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 140c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * You should have received a copy of the GNU General Public License along with 150c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * this program; if not, write to the Free Software Foundation, Inc., 160c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 170c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 180c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * The full GNU General Public License is included in this distribution in the 190c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * file called LICENSE. 200c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 210c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * Contact Information: 220c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * wlanfae <wlanfae@realtek.com> 230c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 240c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * Hsinchu 300, Taiwan. 250c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 260c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * Larry Finger <Larry.Finger@lwfinger.net> 270c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger * 280c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger *****************************************************************************/ 290c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 300c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger#include "../wifi.h" 315c405b5c3e435fd332058c59ee58eaa1ac9c513aJohn W. Linville#include "reg.h" 325c405b5c3e435fd332058c59ee58eaa1ac9c513aJohn W. Linville#include "def.h" 335c405b5c3e435fd332058c59ee58eaa1ac9c513aJohn W. Linville#include "phy.h" 345c405b5c3e435fd332058c59ee58eaa1ac9c513aJohn W. Linville#include "rf.h" 355c405b5c3e435fd332058c59ee58eaa1ac9c513aJohn W. Linville#include "dm.h" 360c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 37e0b5a5078675f58736787982af811244eeb98081Chaoming_Listatic bool _rtl92ce_phy_rf6052_config_parafile(struct ieee80211_hw *hw); 380c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 39e0b5a5078675f58736787982af811244eeb98081Chaoming_Livoid rtl92ce_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth) 400c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 410c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 420c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 430c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 440c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger switch (bandwidth) { 450c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case HT_CHANNEL_WIDTH_20: 460c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] & 470c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 0xfffff3ff) | 0x0400); 480c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 490c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlphy->rfreg_chnlval[0]); 500c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 510c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case HT_CHANNEL_WIDTH_20_40: 520c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] & 530c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 0xfffff3ff)); 540c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 550c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlphy->rfreg_chnlval[0]); 560c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 570c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger default: 580c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 59f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches "unknown bandwidth: %#X\n", bandwidth); 600c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 610c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 620c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 630c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 641472d3a87586eb7529d1d85f7c888055650b7208Larry Fingervoid rtl92ce_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, 65e0b5a5078675f58736787982af811244eeb98081Chaoming_Li u8 *ppowerlevel) 660c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 670c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 680c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 690c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 700c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 710c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 tx_agc[2] = {0, 0}, tmpval; 720c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger bool turbo_scanoff = false; 730c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 idx1, idx2; 740c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 *ptr; 750c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 760c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlefuse->eeprom_regulatory != 0) 770c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger turbo_scanoff = true; 780c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 79e10542c447abf7c840931ff12f7d0dee976ca2eaMike McCormack if (mac->act_scanning) { 800c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tx_agc[RF90_PATH_A] = 0x3f3f3f3f; 810c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tx_agc[RF90_PATH_B] = 0x3f3f3f3f; 820c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 830c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (turbo_scanoff) { 840c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 850c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tx_agc[idx1] = ppowerlevel[idx1] | 860c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (ppowerlevel[idx1] << 8) | 870c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (ppowerlevel[idx1] << 16) | 880c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (ppowerlevel[idx1] << 24); 890c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 900c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 910c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } else { 920c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 930c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tx_agc[idx1] = ppowerlevel[idx1] | 940c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (ppowerlevel[idx1] << 8) | 950c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (ppowerlevel[idx1] << 16) | 960c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (ppowerlevel[idx1] << 24); 970c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 980c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 990c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlefuse->eeprom_regulatory == 0) { 100da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger tmpval = (rtlphy->mcs_offset[0][6]) + 101da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger (rtlphy->mcs_offset[0][7] << 8); 1020c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tx_agc[RF90_PATH_A] += tmpval; 1030c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 104da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger tmpval = (rtlphy->mcs_offset[0][14]) + 105da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger (rtlphy->mcs_offset[0][15] << 24); 1060c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tx_agc[RF90_PATH_B] += tmpval; 1070c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1080c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1090c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1100c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 1110c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger ptr = (u8 *) (&(tx_agc[idx1])); 1120c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (idx2 = 0; idx2 < 4; idx2++) { 1130c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (*ptr > RF6052_MAX_TX_PWR) 1140c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger *ptr = RF6052_MAX_TX_PWR; 1150c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger ptr++; 1160c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1170c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1180c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1190c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tmpval = tx_agc[RF90_PATH_A] & 0xff; 1200c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval); 1210c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1220c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 1234c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", 1244c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches tmpval, RTXAGC_A_CCK1_MCS32); 1250c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1260c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tmpval = tx_agc[RF90_PATH_A] >> 8; 1270c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 128e0b5a5078675f58736787982af811244eeb98081Chaoming_Li tmpval = tmpval & 0xff00ffff; 1290c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1300c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); 1310c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1320c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 1334c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", 1344c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches tmpval, RTXAGC_B_CCK11_A_CCK2_11); 1350c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1360c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tmpval = tx_agc[RF90_PATH_B] >> 24; 1370c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval); 1380c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1390c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 1404c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", 1414c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches tmpval, RTXAGC_B_CCK11_A_CCK2_11); 1420c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1430c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff; 1440c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval); 1450c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1460c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 1474c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", 1484c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches tmpval, RTXAGC_B_CCK1_55_MCS32); 1490c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 1500c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1510c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Fingerstatic void rtl92c_phy_get_power_base(struct ieee80211_hw *hw, 1520c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 *ppowerlevel, u8 channel, 1530c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 *ofdmbase, u32 *mcsbase) 1540c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 1550c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 1560c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 1570c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1580c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 powerBase0, powerBase1; 1590c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 legacy_pwrdiff, ht20_pwrdiff; 1600c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 i, powerlevel[2]; 1610c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1620c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (i = 0; i < 2; i++) { 1630c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerlevel[i] = ppowerlevel[i]; 1640c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger legacy_pwrdiff = rtlefuse->txpwr_legacyhtdiff[i][channel - 1]; 1650c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase0 = powerlevel[i] + legacy_pwrdiff; 1660c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1670c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase0 = (powerBase0 << 24) | (powerBase0 << 16) | 1680c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (powerBase0 << 8) | powerBase0; 1690c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger *(ofdmbase + i) = powerBase0; 1700c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 1714c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches " [OFDM power base index rf(%c) = 0x%x]\n", 1724c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches i == 0 ? 'A' : 'B', *(ofdmbase + i)); 1730c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1740c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1750c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (i = 0; i < 2; i++) { 1760c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) { 1770c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger ht20_pwrdiff = rtlefuse->txpwr_ht20diff[i][channel - 1]; 1780c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerlevel[i] += ht20_pwrdiff; 1790c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1800c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase1 = powerlevel[i]; 1810c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase1 = (powerBase1 << 24) | 1820c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (powerBase1 << 16) | (powerBase1 << 8) | powerBase1; 1830c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1840c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger *(mcsbase + i) = powerBase1; 1850c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1860c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 1874c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches " [MCS power base index rf(%c) = 0x%x]\n", 1884c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches i == 0 ? 'A' : 'B', *(mcsbase + i)); 1890c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 1900c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 1910c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 1920c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Fingerstatic void _rtl92c_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw, 1930c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 channel, u8 index, 1940c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 *powerBase0, 1950c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 *powerBase1, 1960c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 *p_outwriteval) 1970c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 1980c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 1990c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 2000c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2019f219bd248d417c2144eedafdf2c683ba8baee84Larry Finger u8 i, chnlgroup = 0, pwr_diff_limit[4]; 2020c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 writeVal, customer_limit, rf; 2030c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2040c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (rf = 0; rf < 2; rf++) { 2050c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger switch (rtlefuse->eeprom_regulatory) { 2060c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case 0: 2070c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 0; 2080c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 209da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger writeVal = rtlphy->mcs_offset[chnlgroup][index + 2100c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (rf ? 8 : 0)] 2110c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger + ((index < 2) ? powerBase0[rf] : powerBase1[rf]); 2120c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2130c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 2144c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "RTK better performance, writeVal(%c) = 0x%x\n", 2154c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', writeVal); 2160c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 2170c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case 1: 2180c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 2190c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = ((index < 2) ? powerBase0[rf] : 2200c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase1[rf]); 2210c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2220c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 2234c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "Realtek regulatory, 40MHz, writeVal(%c) = 0x%x\n", 2244c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', writeVal); 2250c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } else { 2260c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->pwrgroup_cnt == 1) 2270c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 0; 2280c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->pwrgroup_cnt >= 3) { 2290c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (channel <= 3) 2300c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 0; 2310c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger else if (channel >= 4 && channel <= 9) 2320c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 1; 2330c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger else if (channel > 9) 2340c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 2; 2350c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->pwrgroup_cnt == 4) 2360c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup++; 2370c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 2380c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 239da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger writeVal = rtlphy->mcs_offset[chnlgroup] 2400c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger [index + (rf ? 8 : 0)] + ((index < 2) ? 2410c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase0[rf] : 2420c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger powerBase1[rf]); 2430c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2440c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 2454c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", 2464c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', writeVal); 2470c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 2480c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 2490c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case 2: 2500c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = 2510c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger ((index < 2) ? powerBase0[rf] : powerBase1[rf]); 2520c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2530c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 2544c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "Better regulatory, writeVal(%c) = 0x%x\n", 2554c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', writeVal); 2560c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 2570c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case 3: 2580c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 0; 2590c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2600c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 2610c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 2624c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "customer's limit, 40MHz rf(%c) = 0x%x\n", 2634c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', 2644c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rtlefuse->pwrgroup_ht40[rf][channel - 2654c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches 1]); 2660c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } else { 2670c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 2684c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "customer's limit, 20MHz rf(%c) = 0x%x\n", 2694c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', 2704c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rtlefuse->pwrgroup_ht20[rf][channel - 2714c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches 1]); 2720c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 2730c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (i = 0; i < 4; i++) { 274da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger pwr_diff_limit[i] = (u8) ((rtlphy->mcs_offset 2750c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger [chnlgroup][index + 2760c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (rf ? 8 : 0)] & (0x7f << (i * 8))) >> 2770c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (i * 8)); 2780c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2790c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->current_chan_bw == 2800c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger HT_CHANNEL_WIDTH_20_40) { 2810c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (pwr_diff_limit[i] > 2820c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlefuse-> 2830c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pwrgroup_ht40[rf][channel - 1]) 2840c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pwr_diff_limit[i] = 2850c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlefuse->pwrgroup_ht40[rf] 2860c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger [channel - 1]; 2870c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } else { 2880c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (pwr_diff_limit[i] > 2890c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlefuse-> 2900c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pwrgroup_ht20[rf][channel - 1]) 2910c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pwr_diff_limit[i] = 2920c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlefuse->pwrgroup_ht20[rf] 2930c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger [channel - 1]; 2940c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 2950c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 2960c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 2970c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger customer_limit = (pwr_diff_limit[3] << 24) | 2980c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (pwr_diff_limit[2] << 16) | 2990c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]); 3000c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3010c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 3024c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "Customer's limit rf(%c) = 0x%x\n", 3034c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', customer_limit); 3040c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3050c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = customer_limit + 3060c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger ((index < 2) ? powerBase0[rf] : powerBase1[rf]); 3070c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3080c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 3094c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "Customer, writeVal rf(%c)= 0x%x\n", 3104c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', writeVal); 3110c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 3120c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger default: 3130c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger chnlgroup = 0; 314da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger writeVal = rtlphy->mcs_offset[chnlgroup] 3150c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger [index + (rf ? 8 : 0)] 3160c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger + ((index < 2) ? powerBase0[rf] : powerBase1[rf]); 3170c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3180c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 3194c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "RTK better performance, writeVal rf(%c) = 0x%x\n", 3204c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches rf == 0 ? 'A' : 'B', writeVal); 3210c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 3220c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 3230c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3240c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlpriv->dm.dynamic_txhighpower_lvl == TXHIGHPWRLEVEL_BT1) 3250c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = writeVal - 0x06060606; 3260c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger else if (rtlpriv->dm.dynamic_txhighpower_lvl == 3270c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger TXHIGHPWRLEVEL_BT2) 3280c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = writeVal - 0x0c0c0c0c; 3290c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger *(p_outwriteval + rf) = writeVal; 3300c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 3310c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 3320c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3330c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Fingerstatic void _rtl92c_write_ofdm_power_reg(struct ieee80211_hw *hw, 3340c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 index, u32 *pValue) 3350c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 3360c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 3370c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 3380c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3390c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u16 regoffset_a[6] = { 3400c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTXAGC_A_RATE18_06, RTXAGC_A_RATE54_24, 3410c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTXAGC_A_MCS03_MCS00, RTXAGC_A_MCS07_MCS04, 3420c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTXAGC_A_MCS11_MCS08, RTXAGC_A_MCS15_MCS12 3430c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger }; 3440c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u16 regoffset_b[6] = { 3450c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTXAGC_B_RATE18_06, RTXAGC_B_RATE54_24, 3460c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTXAGC_B_MCS03_MCS00, RTXAGC_B_MCS07_MCS04, 3470c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12 3480c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger }; 3490c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 i, rf, pwr_val[4]; 3500c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 writeVal; 3510c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u16 regoffset; 3520c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3530c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (rf = 0; rf < 2; rf++) { 3540c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = pValue[rf]; 3550c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (i = 0; i < 4; i++) { 3560c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pwr_val[i] = (u8) ((writeVal & (0x7f << 3570c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (i * 8))) >> (i * 8)); 3580c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3590c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (pwr_val[i] > RF6052_MAX_TX_PWR) 3600c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pwr_val[i] = RF6052_MAX_TX_PWR; 3610c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 3620c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = (pwr_val[3] << 24) | (pwr_val[2] << 16) | 3630c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (pwr_val[1] << 8) | pwr_val[0]; 3640c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3650c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rf == 0) 3660c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset = regoffset_a[index]; 3670c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger else 3680c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset = regoffset_b[index]; 3690c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, regoffset, MASKDWORD, writeVal); 3700c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3710c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 3724c48869f5d6e4ee4a773fd67a01e1b934faa57f8Joe Perches "Set 0x%x = %08x\n", regoffset, writeVal); 3730c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3740c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (((get_rf_type(rtlphy) == RF_2T2R) && 3750c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (regoffset == RTXAGC_A_MCS15_MCS12 || 3760c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset == RTXAGC_B_MCS15_MCS12)) || 3770c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger ((get_rf_type(rtlphy) != RF_2T2R) && 3780c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (regoffset == RTXAGC_A_MCS07_MCS04 || 3790c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset == RTXAGC_B_MCS07_MCS04))) { 3800c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3810c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = pwr_val[3]; 3820c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (regoffset == RTXAGC_A_MCS15_MCS12 || 3830c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset == RTXAGC_A_MCS07_MCS04) 3840c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset = 0xc90; 3850c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (regoffset == RTXAGC_B_MCS15_MCS12 || 3860c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset == RTXAGC_B_MCS07_MCS04) 3870c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger regoffset = 0xc98; 3880c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3890c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (i = 0; i < 3; i++) { 3900c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger writeVal = (writeVal > 6) ? (writeVal - 6) : 0; 3910c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_write_byte(rtlpriv, (u32) (regoffset + i), 3920c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger (u8) writeVal); 3930c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 3940c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 3950c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 3960c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 3970c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 3981472d3a87586eb7529d1d85f7c888055650b7208Larry Fingervoid rtl92ce_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, 3990c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 *ppowerlevel, u8 channel) 4000c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 4010c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u32 writeVal[2], powerBase0[2], powerBase1[2]; 4020c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 index; 4030c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4040c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl92c_phy_get_power_base(hw, ppowerlevel, 4050c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger channel, &powerBase0[0], &powerBase1[0]); 4060c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4070c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (index = 0; index < 6; index++) { 4080c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger _rtl92c_get_txpower_writeval_by_regulatory(hw, 4090c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger channel, index, 4100c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger &powerBase0[0], 4110c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger &powerBase1[0], 4120c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger &writeVal[0]); 4130c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4140c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger _rtl92c_write_ofdm_power_reg(hw, index, &writeVal[0]); 4150c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 4160c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 4170c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4181472d3a87586eb7529d1d85f7c888055650b7208Larry Fingerbool rtl92ce_phy_rf6052_config(struct ieee80211_hw *hw) 4190c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 4200c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 4210c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 4220c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4230c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger if (rtlphy->rf_type == RF_1T1R) 4240c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlphy->num_total_rfpath = 1; 4250c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger else 4260c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtlphy->num_total_rfpath = 2; 4270c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 428e0b5a5078675f58736787982af811244eeb98081Chaoming_Li return _rtl92ce_phy_rf6052_config_parafile(hw); 429e0b5a5078675f58736787982af811244eeb98081Chaoming_Li 4300c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 4310c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 432e0b5a5078675f58736787982af811244eeb98081Chaoming_Listatic bool _rtl92ce_phy_rf6052_config_parafile(struct ieee80211_hw *hw) 4330c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger{ 4340c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 4350c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct rtl_phy *rtlphy = &(rtlpriv->phy); 4369f219bd248d417c2144eedafdf2c683ba8baee84Larry Finger u32 u4_regvalue = 0; 4370c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u8 rfpath; 438e0b5a5078675f58736787982af811244eeb98081Chaoming_Li bool rtstatus = true; 4390c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger struct bb_reg_def *pphyreg; 4400c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4410c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) { 4420c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4430c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger pphyreg = &rtlphy->phyreg_def[rfpath]; 4440c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4450c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger switch (rfpath) { 4460c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_A: 4470c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_C: 4480c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs, 4490c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger BRFSI_RFENV); 4500c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4510c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_B: 4520c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_D: 4530c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs, 4540c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger BRFSI_RFENV << 16); 4550c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4560c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 4570c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4580c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1); 4590c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger udelay(1); 4600c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4610c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1); 4620c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger udelay(1); 4630c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4640c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, pphyreg->rfhssi_para2, 4650c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger B3WIREADDREAALENGTH, 0x0); 4660c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger udelay(1); 4670c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4680c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0); 4690c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger udelay(1); 4700c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4710c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger switch (rfpath) { 4720c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_A: 473e0b5a5078675f58736787982af811244eeb98081Chaoming_Li rtstatus = rtl92c_phy_config_rf_with_headerfile(hw, 474e0b5a5078675f58736787982af811244eeb98081Chaoming_Li (enum radio_path)rfpath); 4750c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4760c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_B: 477e0b5a5078675f58736787982af811244eeb98081Chaoming_Li rtstatus = rtl92c_phy_config_rf_with_headerfile(hw, 478e0b5a5078675f58736787982af811244eeb98081Chaoming_Li (enum radio_path)rfpath); 4790c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4800c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_C: 4810c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4820c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_D: 4830c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4840c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 4850c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 4860c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger switch (rfpath) { 4870c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_A: 4880c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_C: 4890c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfs, 4900c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger BRFSI_RFENV, u4_regvalue); 4910c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4920c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_B: 4930c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger case RF90_PATH_D: 4940c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger rtl_set_bbreg(hw, pphyreg->rfintfs, 4950c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger BRFSI_RFENV << 16, u4_regvalue); 4960c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger break; 4970c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 4980c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 49923677ce3172fcb93522a1df077d21019e73ee1e3Joe Perches if (!rtstatus) { 5000c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 501f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches "Radio[%d] Fail!!\n", rfpath); 5020c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger return false; 5030c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 5040c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 5050c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger } 5060c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger 507f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "<---\n"); 5080c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger return rtstatus; 5090c8173385e549f95cd80c3fff5aab87b4f881d8dLarry Finger} 510