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