cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rf.c (18011B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright(c) 2009-2012  Realtek Corporation.*/
      3
      4#include "../wifi.h"
      5#include "reg.h"
      6#include "def.h"
      7#include "phy.h"
      8#include "rf.h"
      9#include "dm.h"
     10#include "hw.h"
     11
     12void rtl92d_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
     13{
     14	struct rtl_priv *rtlpriv = rtl_priv(hw);
     15	struct rtl_phy *rtlphy = &(rtlpriv->phy);
     16	u8 rfpath;
     17
     18	switch (bandwidth) {
     19	case HT_CHANNEL_WIDTH_20:
     20		for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
     21			rtlphy->rfreg_chnlval[rfpath] = ((rtlphy->rfreg_chnlval
     22					[rfpath] & 0xfffff3ff) | 0x0400);
     23			rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(10) |
     24				      BIT(11), 0x01);
     25
     26			rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
     27				"20M RF 0x18 = 0x%x\n",
     28				rtlphy->rfreg_chnlval[rfpath]);
     29		}
     30
     31		break;
     32	case HT_CHANNEL_WIDTH_20_40:
     33		for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
     34			rtlphy->rfreg_chnlval[rfpath] =
     35			    ((rtlphy->rfreg_chnlval[rfpath] & 0xfffff3ff));
     36			rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(10) | BIT(11),
     37				      0x00);
     38			rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
     39				"40M RF 0x18 = 0x%x\n",
     40				rtlphy->rfreg_chnlval[rfpath]);
     41		}
     42		break;
     43	default:
     44		pr_err("unknown bandwidth: %#X\n", bandwidth);
     45		break;
     46	}
     47}
     48
     49void rtl92d_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
     50				       u8 *ppowerlevel)
     51{
     52	struct rtl_priv *rtlpriv = rtl_priv(hw);
     53	struct rtl_phy *rtlphy = &(rtlpriv->phy);
     54	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
     55	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
     56	u32 tx_agc[2] = {0, 0}, tmpval;
     57	bool turbo_scanoff = false;
     58	u8 idx1, idx2;
     59	u8 *ptr;
     60
     61	if (rtlefuse->eeprom_regulatory != 0)
     62		turbo_scanoff = true;
     63	if (mac->act_scanning) {
     64		tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
     65		tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
     66		if (turbo_scanoff) {
     67			for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
     68				tx_agc[idx1] = ppowerlevel[idx1] |
     69				    (ppowerlevel[idx1] << 8) |
     70				    (ppowerlevel[idx1] << 16) |
     71				    (ppowerlevel[idx1] << 24);
     72			}
     73		}
     74	} else {
     75		for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
     76			tx_agc[idx1] = ppowerlevel[idx1] |
     77			    (ppowerlevel[idx1] << 8) |
     78			    (ppowerlevel[idx1] << 16) |
     79			    (ppowerlevel[idx1] << 24);
     80		}
     81		if (rtlefuse->eeprom_regulatory == 0) {
     82			tmpval = (rtlphy->mcs_offset[0][6]) +
     83			    (rtlphy->mcs_offset[0][7] << 8);
     84			tx_agc[RF90_PATH_A] += tmpval;
     85			tmpval = (rtlphy->mcs_offset[0][14]) +
     86			    (rtlphy->mcs_offset[0][15] << 24);
     87			tx_agc[RF90_PATH_B] += tmpval;
     88		}
     89	}
     90
     91	for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
     92		ptr = (u8 *) (&(tx_agc[idx1]));
     93		for (idx2 = 0; idx2 < 4; idx2++) {
     94			if (*ptr > RF6052_MAX_TX_PWR)
     95				*ptr = RF6052_MAX_TX_PWR;
     96			ptr++;
     97		}
     98	}
     99
    100	tmpval = tx_agc[RF90_PATH_A] & 0xff;
    101	rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval);
    102	RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    103		"CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n",
    104		tmpval, RTXAGC_A_CCK1_MCS32);
    105	tmpval = tx_agc[RF90_PATH_A] >> 8;
    106	rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
    107	RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    108		"CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n",
    109		tmpval, RTXAGC_B_CCK11_A_CCK2_11);
    110	tmpval = tx_agc[RF90_PATH_B] >> 24;
    111	rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval);
    112	RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    113		"CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n",
    114		tmpval, RTXAGC_B_CCK11_A_CCK2_11);
    115	tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
    116	rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
    117	RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    118		"CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n",
    119		tmpval, RTXAGC_B_CCK1_55_MCS32);
    120}
    121
    122static void _rtl92d_phy_get_power_base(struct ieee80211_hw *hw,
    123				       u8 *ppowerlevel, u8 channel,
    124				       u32 *ofdmbase, u32 *mcsbase)
    125{
    126	struct rtl_priv *rtlpriv = rtl_priv(hw);
    127	struct rtl_phy *rtlphy = &(rtlpriv->phy);
    128	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
    129	u32 powerbase0, powerbase1;
    130	u8 legacy_pwrdiff, ht20_pwrdiff;
    131	u8 i, powerlevel[2];
    132
    133	for (i = 0; i < 2; i++) {
    134		powerlevel[i] = ppowerlevel[i];
    135		legacy_pwrdiff = rtlefuse->txpwr_legacyhtdiff[i][channel - 1];
    136		powerbase0 = powerlevel[i] + legacy_pwrdiff;
    137		powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
    138		    (powerbase0 << 8) | powerbase0;
    139		*(ofdmbase + i) = powerbase0;
    140		RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    141			" [OFDM power base index rf(%c) = 0x%x]\n",
    142			i == 0 ? 'A' : 'B', *(ofdmbase + i));
    143	}
    144
    145	for (i = 0; i < 2; i++) {
    146		if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) {
    147			ht20_pwrdiff = rtlefuse->txpwr_ht20diff[i][channel - 1];
    148			powerlevel[i] += ht20_pwrdiff;
    149		}
    150		powerbase1 = powerlevel[i];
    151		powerbase1 = (powerbase1 << 24) | (powerbase1 << 16) |
    152			     (powerbase1 << 8) | powerbase1;
    153		*(mcsbase + i) = powerbase1;
    154		RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    155			" [MCS power base index rf(%c) = 0x%x]\n",
    156			i == 0 ? 'A' : 'B', *(mcsbase + i));
    157	}
    158}
    159
    160static u8 _rtl92d_phy_get_chnlgroup_bypg(u8 chnlindex)
    161{
    162	u8 group;
    163	u8 channel_info[59] = {
    164		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    165		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
    166		60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
    167		114, 116, 118, 120, 122, 124, 126, 128,	130, 132,
    168		134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
    169		161, 163, 165
    170	};
    171
    172	if (channel_info[chnlindex] <= 3)	/* Chanel 1-3 */
    173		group = 0;
    174	else if (channel_info[chnlindex] <= 9)	/* Channel 4-9 */
    175		group = 1;
    176	else if (channel_info[chnlindex] <= 14)	/* Channel 10-14 */
    177		group = 2;
    178	else if (channel_info[chnlindex] <= 64)
    179		group = 6;
    180	else if (channel_info[chnlindex] <= 140)
    181		group = 7;
    182	else
    183		group = 8;
    184	return group;
    185}
    186
    187static void _rtl92d_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
    188						       u8 channel, u8 index,
    189						       u32 *powerbase0,
    190						       u32 *powerbase1,
    191						       u32 *p_outwriteval)
    192{
    193	struct rtl_priv *rtlpriv = rtl_priv(hw);
    194	struct rtl_phy *rtlphy = &(rtlpriv->phy);
    195	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
    196	u8 i, chnlgroup = 0, pwr_diff_limit[4];
    197	u32 writeval = 0, customer_limit, rf;
    198
    199	for (rf = 0; rf < 2; rf++) {
    200		switch (rtlefuse->eeprom_regulatory) {
    201		case 0:
    202			chnlgroup = 0;
    203			writeval = rtlphy->mcs_offset
    204					[chnlgroup][index +
    205					(rf ? 8 : 0)] + ((index < 2) ?
    206					powerbase0[rf] :
    207					powerbase1[rf]);
    208			RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    209				"RTK better performance, writeval(%c) = 0x%x\n",
    210				rf == 0 ? 'A' : 'B', writeval);
    211			break;
    212		case 1:
    213			if (rtlphy->pwrgroup_cnt == 1)
    214				chnlgroup = 0;
    215			if (rtlphy->pwrgroup_cnt >= MAX_PG_GROUP) {
    216				chnlgroup = _rtl92d_phy_get_chnlgroup_bypg(
    217								channel - 1);
    218				if (rtlphy->current_chan_bw ==
    219				    HT_CHANNEL_WIDTH_20)
    220					chnlgroup++;
    221				else
    222					chnlgroup += 4;
    223				writeval = rtlphy->mcs_offset
    224						[chnlgroup][index +
    225						(rf ? 8 : 0)] + ((index < 2) ?
    226						powerbase0[rf] :
    227						powerbase1[rf]);
    228				RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    229					"Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
    230					rf == 0 ? 'A' : 'B', writeval);
    231			}
    232			break;
    233		case 2:
    234			writeval = ((index < 2) ? powerbase0[rf] :
    235				   powerbase1[rf]);
    236			RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    237				"Better regulatory, writeval(%c) = 0x%x\n",
    238				rf == 0 ? 'A' : 'B', writeval);
    239			break;
    240		case 3:
    241			chnlgroup = 0;
    242			if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
    243				RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    244					"customer's limit, 40MHz rf(%c) = 0x%x\n",
    245					rf == 0 ? 'A' : 'B',
    246					rtlefuse->pwrgroup_ht40[rf]
    247					[channel - 1]);
    248			} else {
    249				RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    250					"customer's limit, 20MHz rf(%c) = 0x%x\n",
    251					rf == 0 ? 'A' : 'B',
    252					rtlefuse->pwrgroup_ht20[rf]
    253					[channel - 1]);
    254			}
    255			for (i = 0; i < 4; i++) {
    256				pwr_diff_limit[i] = (u8)((rtlphy->mcs_offset
    257					[chnlgroup][index + (rf ? 8 : 0)] &
    258					(0x7f << (i * 8))) >> (i * 8));
    259				if (rtlphy->current_chan_bw ==
    260				    HT_CHANNEL_WIDTH_20_40) {
    261					if (pwr_diff_limit[i] >
    262					    rtlefuse->pwrgroup_ht40[rf]
    263					   [channel - 1])
    264						pwr_diff_limit[i] =
    265							rtlefuse->pwrgroup_ht40
    266							[rf][channel - 1];
    267				} else {
    268					if (pwr_diff_limit[i] >
    269					    rtlefuse->pwrgroup_ht20[rf][
    270						channel - 1])
    271						pwr_diff_limit[i] =
    272						   rtlefuse->pwrgroup_ht20[rf]
    273						   [channel - 1];
    274				}
    275			}
    276			customer_limit = (pwr_diff_limit[3] << 24) |
    277					 (pwr_diff_limit[2] << 16) |
    278					 (pwr_diff_limit[1] << 8) |
    279					 (pwr_diff_limit[0]);
    280			RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    281				"Customer's limit rf(%c) = 0x%x\n",
    282				rf == 0 ? 'A' : 'B', customer_limit);
    283			writeval = customer_limit + ((index < 2) ?
    284				   powerbase0[rf] : powerbase1[rf]);
    285			RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    286				"Customer, writeval rf(%c)= 0x%x\n",
    287				rf == 0 ? 'A' : 'B', writeval);
    288			break;
    289		default:
    290			chnlgroup = 0;
    291			writeval = rtlphy->mcs_offset[chnlgroup][index +
    292				   (rf ? 8 : 0)] + ((index < 2) ?
    293				   powerbase0[rf] : powerbase1[rf]);
    294			RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    295				"RTK better performance, writeval rf(%c) = 0x%x\n",
    296				rf == 0 ? 'A' : 'B', writeval);
    297			break;
    298		}
    299		*(p_outwriteval + rf) = writeval;
    300	}
    301}
    302
    303static void _rtl92d_write_ofdm_power_reg(struct ieee80211_hw *hw,
    304					 u8 index, u32 *pvalue)
    305{
    306	struct rtl_priv *rtlpriv = rtl_priv(hw);
    307	struct rtl_phy *rtlphy = &(rtlpriv->phy);
    308	static u16 regoffset_a[6] = {
    309		RTXAGC_A_RATE18_06, RTXAGC_A_RATE54_24,
    310		RTXAGC_A_MCS03_MCS00, RTXAGC_A_MCS07_MCS04,
    311		RTXAGC_A_MCS11_MCS08, RTXAGC_A_MCS15_MCS12
    312	};
    313	static u16 regoffset_b[6] = {
    314		RTXAGC_B_RATE18_06, RTXAGC_B_RATE54_24,
    315		RTXAGC_B_MCS03_MCS00, RTXAGC_B_MCS07_MCS04,
    316		RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12
    317	};
    318	u8 i, rf, pwr_val[4];
    319	u32 writeval;
    320	u16 regoffset;
    321
    322	for (rf = 0; rf < 2; rf++) {
    323		writeval = pvalue[rf];
    324		for (i = 0; i < 4; i++) {
    325			pwr_val[i] = (u8) ((writeval & (0x7f <<
    326				     (i * 8))) >> (i * 8));
    327			if (pwr_val[i] > RF6052_MAX_TX_PWR)
    328				pwr_val[i] = RF6052_MAX_TX_PWR;
    329		}
    330		writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) |
    331			   (pwr_val[1] << 8) | pwr_val[0];
    332		if (rf == 0)
    333			regoffset = regoffset_a[index];
    334		else
    335			regoffset = regoffset_b[index];
    336		rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval);
    337		RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
    338			"Set 0x%x = %08x\n", regoffset, writeval);
    339		if (((get_rf_type(rtlphy) == RF_2T2R) &&
    340		    (regoffset == RTXAGC_A_MCS15_MCS12 ||
    341		    regoffset == RTXAGC_B_MCS15_MCS12)) ||
    342		    ((get_rf_type(rtlphy) != RF_2T2R) &&
    343		    (regoffset == RTXAGC_A_MCS07_MCS04 ||
    344		    regoffset == RTXAGC_B_MCS07_MCS04))) {
    345			writeval = pwr_val[3];
    346			if (regoffset == RTXAGC_A_MCS15_MCS12 ||
    347			    regoffset == RTXAGC_A_MCS07_MCS04)
    348				regoffset = 0xc90;
    349			if (regoffset == RTXAGC_B_MCS15_MCS12 ||
    350			    regoffset == RTXAGC_B_MCS07_MCS04)
    351				regoffset = 0xc98;
    352			for (i = 0; i < 3; i++) {
    353				if (i != 2)
    354					writeval = (writeval > 8) ?
    355						   (writeval - 8) : 0;
    356				else
    357					writeval = (writeval > 6) ?
    358						   (writeval - 6) : 0;
    359				rtl_write_byte(rtlpriv, (u32) (regoffset + i),
    360					       (u8) writeval);
    361			}
    362		}
    363	}
    364}
    365
    366void rtl92d_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
    367					u8 *ppowerlevel, u8 channel)
    368{
    369	u32 writeval[2], powerbase0[2], powerbase1[2];
    370	u8 index;
    371
    372	_rtl92d_phy_get_power_base(hw, ppowerlevel, channel,
    373			&powerbase0[0],	&powerbase1[0]);
    374	for (index = 0; index < 6; index++) {
    375		_rtl92d_get_txpower_writeval_by_regulatory(hw,
    376				channel, index,	&powerbase0[0],
    377				&powerbase1[0],	&writeval[0]);
    378		_rtl92d_write_ofdm_power_reg(hw, index, &writeval[0]);
    379	}
    380}
    381
    382bool rtl92d_phy_enable_anotherphy(struct ieee80211_hw *hw, bool bmac0)
    383{
    384	struct rtl_priv *rtlpriv = rtl_priv(hw);
    385	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
    386	u8 u1btmp;
    387	u8 direct = bmac0 ? BIT(3) | BIT(2) : BIT(3);
    388	u8 mac_reg = bmac0 ? REG_MAC1 : REG_MAC0;
    389	u8 mac_on_bit = bmac0 ? MAC1_ON : MAC0_ON;
    390	bool bresult = true; /* true: need to enable BB/RF power */
    391
    392	rtlhal->during_mac0init_radiob = false;
    393	rtlhal->during_mac1init_radioa = false;
    394	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "===>\n");
    395	/* MAC0 Need PHY1 load radio_b.txt . Driver use DBI to write. */
    396	u1btmp = rtl_read_byte(rtlpriv, mac_reg);
    397	if (!(u1btmp & mac_on_bit)) {
    398		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "enable BB & RF\n");
    399		/* Enable BB and RF power */
    400		rtl92de_write_dword_dbi(hw, REG_SYS_ISO_CTRL,
    401			rtl92de_read_dword_dbi(hw, REG_SYS_ISO_CTRL, direct) |
    402				BIT(29) | BIT(16) | BIT(17), direct);
    403	} else {
    404		/* We think if MAC1 is ON,then radio_a.txt
    405		 * and radio_b.txt has been load. */
    406		bresult = false;
    407	}
    408	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<===\n");
    409	return bresult;
    410
    411}
    412
    413void rtl92d_phy_powerdown_anotherphy(struct ieee80211_hw *hw, bool bmac0)
    414{
    415	struct rtl_priv *rtlpriv = rtl_priv(hw);
    416	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
    417	u8 u1btmp;
    418	u8 direct = bmac0 ? BIT(3) | BIT(2) : BIT(3);
    419	u8 mac_reg = bmac0 ? REG_MAC1 : REG_MAC0;
    420	u8 mac_on_bit = bmac0 ? MAC1_ON : MAC0_ON;
    421
    422	rtlhal->during_mac0init_radiob = false;
    423	rtlhal->during_mac1init_radioa = false;
    424	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
    425	/* check MAC0 enable or not again now, if
    426	 * enabled, not power down radio A. */
    427	u1btmp = rtl_read_byte(rtlpriv, mac_reg);
    428	if (!(u1btmp & mac_on_bit)) {
    429		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "power down\n");
    430		/* power down RF radio A according to YuNan's advice. */
    431		rtl92de_write_dword_dbi(hw, RFPGA0_XA_LSSIPARAMETER,
    432					0x00000000, direct);
    433	}
    434	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
    435}
    436
    437bool rtl92d_phy_rf6052_config(struct ieee80211_hw *hw)
    438{
    439	struct rtl_priv *rtlpriv = rtl_priv(hw);
    440	struct rtl_phy *rtlphy = &(rtlpriv->phy);
    441	bool rtstatus = true;
    442	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
    443	u32 u4_regvalue = 0;
    444	u8 rfpath;
    445	struct bb_reg_def *pphyreg;
    446	bool mac1_initradioa_first = false, mac0_initradiob_first = false;
    447	bool need_pwrdown_radioa = false, need_pwrdown_radiob = false;
    448	bool true_bpath = false;
    449
    450	if (rtlphy->rf_type == RF_1T1R)
    451		rtlphy->num_total_rfpath = 1;
    452	else
    453		rtlphy->num_total_rfpath = 2;
    454
    455	/* Single phy mode: use radio_a radio_b config path_A path_B */
    456	/* seperately by MAC0, and MAC1 needn't configure RF; */
    457	/* Dual PHY mode:MAC0 use radio_a config 1st phy path_A, */
    458	/* MAC1 use radio_b config 2nd PHY path_A. */
    459	/* DMDP,MAC0 on G band,MAC1 on A band. */
    460	if (rtlhal->macphymode == DUALMAC_DUALPHY) {
    461		if (rtlhal->current_bandtype == BAND_ON_2_4G &&
    462		    rtlhal->interfaceindex == 0) {
    463			/* MAC0 needs PHY1 load radio_b.txt.
    464			 * Driver use DBI to write. */
    465			if (rtl92d_phy_enable_anotherphy(hw, true)) {
    466				rtlphy->num_total_rfpath = 2;
    467				mac0_initradiob_first = true;
    468			} else {
    469				/* We think if MAC1 is ON,then radio_a.txt and
    470				 * radio_b.txt has been load. */
    471				return rtstatus;
    472			}
    473		} else if (rtlhal->current_bandtype == BAND_ON_5G &&
    474			   rtlhal->interfaceindex == 1) {
    475			/* MAC1 needs PHY0 load radio_a.txt.
    476			 * Driver use DBI to write. */
    477			if (rtl92d_phy_enable_anotherphy(hw, false)) {
    478				rtlphy->num_total_rfpath = 2;
    479				mac1_initradioa_first = true;
    480			} else {
    481				/* We think if MAC0 is ON,then radio_a.txt and
    482				 * radio_b.txt has been load. */
    483				return rtstatus;
    484			}
    485		} else if (rtlhal->interfaceindex == 1) {
    486			/* MAC0 enabled, only init radia B.   */
    487			true_bpath = true;
    488		}
    489	}
    490
    491	for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
    492		/* Mac1 use PHY0 write */
    493		if (mac1_initradioa_first) {
    494			if (rfpath == RF90_PATH_A) {
    495				rtlhal->during_mac1init_radioa = true;
    496				need_pwrdown_radioa = true;
    497			} else if (rfpath == RF90_PATH_B) {
    498				rtlhal->during_mac1init_radioa = false;
    499				mac1_initradioa_first = false;
    500				rfpath = RF90_PATH_A;
    501				true_bpath = true;
    502				rtlphy->num_total_rfpath = 1;
    503			}
    504		} else if (mac0_initradiob_first) {
    505			/* Mac0 use PHY1 write */
    506			if (rfpath == RF90_PATH_A)
    507				rtlhal->during_mac0init_radiob = false;
    508			if (rfpath == RF90_PATH_B) {
    509				rtlhal->during_mac0init_radiob = true;
    510				mac0_initradiob_first = false;
    511				need_pwrdown_radiob = true;
    512				rfpath = RF90_PATH_A;
    513				true_bpath = true;
    514				rtlphy->num_total_rfpath = 1;
    515			}
    516		}
    517		pphyreg = &rtlphy->phyreg_def[rfpath];
    518		switch (rfpath) {
    519		case RF90_PATH_A:
    520		case RF90_PATH_C:
    521			u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
    522						    BRFSI_RFENV);
    523			break;
    524		case RF90_PATH_B:
    525		case RF90_PATH_D:
    526			u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
    527				BRFSI_RFENV << 16);
    528			break;
    529		}
    530		rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
    531		udelay(1);
    532		rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
    533		udelay(1);
    534		/* Set bit number of Address and Data for RF register */
    535		/* Set 1 to 4 bits for 8255 */
    536		rtl_set_bbreg(hw, pphyreg->rfhssi_para2,
    537			      B3WIREADDRESSLENGTH, 0x0);
    538		udelay(1);
    539		/* Set 0 to 12  bits for 8255 */
    540		rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
    541		udelay(1);
    542		switch (rfpath) {
    543		case RF90_PATH_A:
    544			if (true_bpath)
    545				rtstatus = rtl92d_phy_config_rf_with_headerfile(
    546						hw, radiob_txt,
    547						(enum radio_path)rfpath);
    548			else
    549				rtstatus = rtl92d_phy_config_rf_with_headerfile(
    550					     hw, radioa_txt,
    551					     (enum radio_path)rfpath);
    552			break;
    553		case RF90_PATH_B:
    554			rtstatus =
    555			    rtl92d_phy_config_rf_with_headerfile(hw, radiob_txt,
    556						(enum radio_path) rfpath);
    557			break;
    558		case RF90_PATH_C:
    559			break;
    560		case RF90_PATH_D:
    561			break;
    562		}
    563		switch (rfpath) {
    564		case RF90_PATH_A:
    565		case RF90_PATH_C:
    566			rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV,
    567				      u4_regvalue);
    568			break;
    569		case RF90_PATH_B:
    570		case RF90_PATH_D:
    571			rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
    572				      u4_regvalue);
    573			break;
    574		}
    575		if (!rtstatus) {
    576			rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
    577				"Radio[%d] Fail!!\n", rfpath);
    578			goto phy_rf_cfg_fail;
    579		}
    580
    581	}
    582
    583	/* check MAC0 enable or not again, if enabled,
    584	 * not power down radio A. */
    585	/* check MAC1 enable or not again, if enabled,
    586	 * not power down radio B. */
    587	if (need_pwrdown_radioa)
    588		rtl92d_phy_powerdown_anotherphy(hw, false);
    589	else if (need_pwrdown_radiob)
    590		rtl92d_phy_powerdown_anotherphy(hw, true);
    591	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "<---\n");
    592	return rtstatus;
    593
    594phy_rf_cfg_fail:
    595	return rtstatus;
    596}