162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright(c) 2009-2012  Realtek Corporation.*/
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "../wifi.h"
562306a36Sopenharmony_ci#include "../pci.h"
662306a36Sopenharmony_ci#include "../ps.h"
762306a36Sopenharmony_ci#include "../core.h"
862306a36Sopenharmony_ci#include "reg.h"
962306a36Sopenharmony_ci#include "def.h"
1062306a36Sopenharmony_ci#include "hw.h"
1162306a36Sopenharmony_ci#include "phy.h"
1262306a36Sopenharmony_ci#include "../rtl8192c/phy_common.h"
1362306a36Sopenharmony_ci#include "rf.h"
1462306a36Sopenharmony_ci#include "dm.h"
1562306a36Sopenharmony_ci#include "../rtl8192c/dm_common.h"
1662306a36Sopenharmony_ci#include "../rtl8192c/fw_common.h"
1762306a36Sopenharmony_ci#include "table.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciu32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
2262306a36Sopenharmony_ci			    enum radio_path rfpath, u32 regaddr, u32 bitmask)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
2562306a36Sopenharmony_ci	u32 original_value, readback_value, bitshift;
2662306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
2962306a36Sopenharmony_ci		"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
3062306a36Sopenharmony_ci		regaddr, rfpath, bitmask);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_lock);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (rtlphy->rf_mode != RF_OP_BY_FW) {
3562306a36Sopenharmony_ci		original_value = _rtl92c_phy_rf_serial_read(hw,
3662306a36Sopenharmony_ci							    rfpath, regaddr);
3762306a36Sopenharmony_ci	} else {
3862306a36Sopenharmony_ci		original_value = _rtl92c_phy_fw_rf_serial_read(hw,
3962306a36Sopenharmony_ci							       rfpath, regaddr);
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	bitshift = calculate_bit_shift(bitmask);
4362306a36Sopenharmony_ci	readback_value = (original_value & bitmask) >> bitshift;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_lock);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
4862306a36Sopenharmony_ci		"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
4962306a36Sopenharmony_ci		regaddr, rfpath, bitmask, original_value);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	return readback_value;
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cibool rtl92c_phy_mac_config(struct ieee80211_hw *hw)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
5762306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
5862306a36Sopenharmony_ci	bool is92c = IS_92C_SERIAL(rtlhal->version);
5962306a36Sopenharmony_ci	bool rtstatus = _rtl92c_phy_config_mac_with_headerfile(hw);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	if (is92c)
6262306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x14, 0x71);
6362306a36Sopenharmony_ci	else
6462306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x04CA, 0x0A);
6562306a36Sopenharmony_ci	return rtstatus;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cibool rtl92c_phy_bb_config(struct ieee80211_hw *hw)
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	bool rtstatus = true;
7162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
7262306a36Sopenharmony_ci	u16 regval;
7362306a36Sopenharmony_ci	u32 regvaldw;
7462306a36Sopenharmony_ci	u8 reg_hwparafile = 1;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	_rtl92c_phy_init_bb_rf_register_definition(hw);
7762306a36Sopenharmony_ci	regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
7862306a36Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
7962306a36Sopenharmony_ci		       regval | BIT(13) | BIT(0) | BIT(1));
8062306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
8162306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
8262306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
8362306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
8462306a36Sopenharmony_ci		       FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
8562306a36Sopenharmony_ci		       FEN_BB_GLB_RSTN | FEN_BBRSTB);
8662306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
8762306a36Sopenharmony_ci	regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
8862306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
8962306a36Sopenharmony_ci	if (reg_hwparafile == 1)
9062306a36Sopenharmony_ci		rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw);
9162306a36Sopenharmony_ci	return rtstatus;
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_civoid rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
9562306a36Sopenharmony_ci			    enum radio_path rfpath,
9662306a36Sopenharmony_ci			    u32 regaddr, u32 bitmask, u32 data)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
9962306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
10062306a36Sopenharmony_ci	u32 original_value, bitshift;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
10362306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
10462306a36Sopenharmony_ci		regaddr, bitmask, data, rfpath);
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_lock);
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	if (rtlphy->rf_mode != RF_OP_BY_FW) {
10962306a36Sopenharmony_ci		if (bitmask != RFREG_OFFSET_MASK) {
11062306a36Sopenharmony_ci			original_value = _rtl92c_phy_rf_serial_read(hw,
11162306a36Sopenharmony_ci								    rfpath,
11262306a36Sopenharmony_ci								    regaddr);
11362306a36Sopenharmony_ci			bitshift = calculate_bit_shift(bitmask);
11462306a36Sopenharmony_ci			data =
11562306a36Sopenharmony_ci			    ((original_value & (~bitmask)) |
11662306a36Sopenharmony_ci			     (data << bitshift));
11762306a36Sopenharmony_ci		}
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci		_rtl92c_phy_rf_serial_write(hw, rfpath, regaddr, data);
12062306a36Sopenharmony_ci	} else {
12162306a36Sopenharmony_ci		if (bitmask != RFREG_OFFSET_MASK) {
12262306a36Sopenharmony_ci			original_value = _rtl92c_phy_fw_rf_serial_read(hw,
12362306a36Sopenharmony_ci								       rfpath,
12462306a36Sopenharmony_ci								       regaddr);
12562306a36Sopenharmony_ci			bitshift = calculate_bit_shift(bitmask);
12662306a36Sopenharmony_ci			data =
12762306a36Sopenharmony_ci			    ((original_value & (~bitmask)) |
12862306a36Sopenharmony_ci			     (data << bitshift));
12962306a36Sopenharmony_ci		}
13062306a36Sopenharmony_ci		_rtl92c_phy_fw_rf_serial_write(hw, rfpath, regaddr, data);
13162306a36Sopenharmony_ci	}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_lock);
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
13662306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
13762306a36Sopenharmony_ci		regaddr, bitmask, data, rfpath);
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistatic bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
14362306a36Sopenharmony_ci	u32 i;
14462306a36Sopenharmony_ci	u32 arraylength;
14562306a36Sopenharmony_ci	u32 *ptrarray;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
14862306a36Sopenharmony_ci	arraylength = MAC_2T_ARRAYLENGTH;
14962306a36Sopenharmony_ci	ptrarray = RTL8192CEMAC_2T_ARRAY;
15062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Img:RTL8192CEMAC_2T_ARRAY\n");
15162306a36Sopenharmony_ci	for (i = 0; i < arraylength; i = i + 2)
15262306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
15362306a36Sopenharmony_ci	return true;
15462306a36Sopenharmony_ci}
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_cibool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
15762306a36Sopenharmony_ci					    u8 configtype)
15862306a36Sopenharmony_ci{
15962306a36Sopenharmony_ci	int i;
16062306a36Sopenharmony_ci	u32 *phy_regarray_table;
16162306a36Sopenharmony_ci	u32 *agctab_array_table;
16262306a36Sopenharmony_ci	u16 phy_reg_arraylen, agctab_arraylen;
16362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16462306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	if (IS_92C_SERIAL(rtlhal->version)) {
16762306a36Sopenharmony_ci		agctab_arraylen = AGCTAB_2TARRAYLENGTH;
16862306a36Sopenharmony_ci		agctab_array_table = RTL8192CEAGCTAB_2TARRAY;
16962306a36Sopenharmony_ci		phy_reg_arraylen = PHY_REG_2TARRAY_LENGTH;
17062306a36Sopenharmony_ci		phy_regarray_table = RTL8192CEPHY_REG_2TARRAY;
17162306a36Sopenharmony_ci	} else {
17262306a36Sopenharmony_ci		agctab_arraylen = AGCTAB_1TARRAYLENGTH;
17362306a36Sopenharmony_ci		agctab_array_table = RTL8192CEAGCTAB_1TARRAY;
17462306a36Sopenharmony_ci		phy_reg_arraylen = PHY_REG_1TARRAY_LENGTH;
17562306a36Sopenharmony_ci		phy_regarray_table = RTL8192CEPHY_REG_1TARRAY;
17662306a36Sopenharmony_ci	}
17762306a36Sopenharmony_ci	if (configtype == BASEBAND_CONFIG_PHY_REG) {
17862306a36Sopenharmony_ci		for (i = 0; i < phy_reg_arraylen; i = i + 2) {
17962306a36Sopenharmony_ci			rtl_addr_delay(phy_regarray_table[i]);
18062306a36Sopenharmony_ci			rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
18162306a36Sopenharmony_ci				      phy_regarray_table[i + 1]);
18262306a36Sopenharmony_ci			udelay(1);
18362306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
18462306a36Sopenharmony_ci				"The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
18562306a36Sopenharmony_ci				phy_regarray_table[i],
18662306a36Sopenharmony_ci				phy_regarray_table[i + 1]);
18762306a36Sopenharmony_ci		}
18862306a36Sopenharmony_ci	} else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
18962306a36Sopenharmony_ci		for (i = 0; i < agctab_arraylen; i = i + 2) {
19062306a36Sopenharmony_ci			rtl_set_bbreg(hw, agctab_array_table[i], MASKDWORD,
19162306a36Sopenharmony_ci				      agctab_array_table[i + 1]);
19262306a36Sopenharmony_ci			udelay(1);
19362306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
19462306a36Sopenharmony_ci				"The agctab_array_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
19562306a36Sopenharmony_ci				agctab_array_table[i],
19662306a36Sopenharmony_ci				agctab_array_table[i + 1]);
19762306a36Sopenharmony_ci		}
19862306a36Sopenharmony_ci	}
19962306a36Sopenharmony_ci	return true;
20062306a36Sopenharmony_ci}
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cibool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
20362306a36Sopenharmony_ci					      u8 configtype)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
20662306a36Sopenharmony_ci	int i;
20762306a36Sopenharmony_ci	u32 *phy_regarray_table_pg;
20862306a36Sopenharmony_ci	u16 phy_regarray_pg_len;
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	phy_regarray_pg_len = PHY_REG_ARRAY_PGLENGTH;
21162306a36Sopenharmony_ci	phy_regarray_table_pg = RTL8192CEPHY_REG_ARRAY_PG;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	if (configtype == BASEBAND_CONFIG_PHY_REG) {
21462306a36Sopenharmony_ci		for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
21562306a36Sopenharmony_ci			rtl_addr_delay(phy_regarray_table_pg[i]);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci			_rtl92c_store_pwrindex_diffrate_offset(hw,
21862306a36Sopenharmony_ci					       phy_regarray_table_pg[i],
21962306a36Sopenharmony_ci					       phy_regarray_table_pg[i + 1],
22062306a36Sopenharmony_ci					       phy_regarray_table_pg[i + 2]);
22162306a36Sopenharmony_ci		}
22262306a36Sopenharmony_ci	} else {
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
22562306a36Sopenharmony_ci			"configtype != BaseBand_Config_PHY_REG\n");
22662306a36Sopenharmony_ci	}
22762306a36Sopenharmony_ci	return true;
22862306a36Sopenharmony_ci}
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_cibool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
23162306a36Sopenharmony_ci					  enum radio_path rfpath)
23262306a36Sopenharmony_ci{
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	int i;
23562306a36Sopenharmony_ci	u32 *radioa_array_table;
23662306a36Sopenharmony_ci	u32 *radiob_array_table;
23762306a36Sopenharmony_ci	u16 radioa_arraylen, radiob_arraylen;
23862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
23962306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	if (IS_92C_SERIAL(rtlhal->version)) {
24262306a36Sopenharmony_ci		radioa_arraylen = RADIOA_2TARRAYLENGTH;
24362306a36Sopenharmony_ci		radioa_array_table = RTL8192CERADIOA_2TARRAY;
24462306a36Sopenharmony_ci		radiob_arraylen = RADIOB_2TARRAYLENGTH;
24562306a36Sopenharmony_ci		radiob_array_table = RTL8192CE_RADIOB_2TARRAY;
24662306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
24762306a36Sopenharmony_ci			"Radio_A:RTL8192CERADIOA_2TARRAY\n");
24862306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
24962306a36Sopenharmony_ci			"Radio_B:RTL8192CE_RADIOB_2TARRAY\n");
25062306a36Sopenharmony_ci	} else {
25162306a36Sopenharmony_ci		radioa_arraylen = RADIOA_1TARRAYLENGTH;
25262306a36Sopenharmony_ci		radioa_array_table = RTL8192CE_RADIOA_1TARRAY;
25362306a36Sopenharmony_ci		radiob_arraylen = RADIOB_1TARRAYLENGTH;
25462306a36Sopenharmony_ci		radiob_array_table = RTL8192CE_RADIOB_1TARRAY;
25562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
25662306a36Sopenharmony_ci			"Radio_A:RTL8192CE_RADIOA_1TARRAY\n");
25762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
25862306a36Sopenharmony_ci			"Radio_B:RTL8192CE_RADIOB_1TARRAY\n");
25962306a36Sopenharmony_ci	}
26062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
26162306a36Sopenharmony_ci	switch (rfpath) {
26262306a36Sopenharmony_ci	case RF90_PATH_A:
26362306a36Sopenharmony_ci		for (i = 0; i < radioa_arraylen; i = i + 2) {
26462306a36Sopenharmony_ci			rtl_rfreg_delay(hw, rfpath, radioa_array_table[i],
26562306a36Sopenharmony_ci					RFREG_OFFSET_MASK,
26662306a36Sopenharmony_ci					radioa_array_table[i + 1]);
26762306a36Sopenharmony_ci		}
26862306a36Sopenharmony_ci		break;
26962306a36Sopenharmony_ci	case RF90_PATH_B:
27062306a36Sopenharmony_ci		for (i = 0; i < radiob_arraylen; i = i + 2) {
27162306a36Sopenharmony_ci			rtl_rfreg_delay(hw, rfpath, radiob_array_table[i],
27262306a36Sopenharmony_ci					RFREG_OFFSET_MASK,
27362306a36Sopenharmony_ci					radiob_array_table[i + 1]);
27462306a36Sopenharmony_ci		}
27562306a36Sopenharmony_ci		break;
27662306a36Sopenharmony_ci	case RF90_PATH_C:
27762306a36Sopenharmony_ci	case RF90_PATH_D:
27862306a36Sopenharmony_ci		pr_info("Incorrect rfpath %#x\n", rfpath);
27962306a36Sopenharmony_ci		break;
28062306a36Sopenharmony_ci	default:
28162306a36Sopenharmony_ci		pr_info("switch case %#x not processed\n", rfpath);
28262306a36Sopenharmony_ci		break;
28362306a36Sopenharmony_ci	}
28462306a36Sopenharmony_ci	return true;
28562306a36Sopenharmony_ci}
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_civoid rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
28862306a36Sopenharmony_ci{
28962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
29062306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
29162306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
29262306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
29362306a36Sopenharmony_ci	u8 reg_bw_opmode;
29462306a36Sopenharmony_ci	u8 reg_prsr_rsc;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
29762306a36Sopenharmony_ci		rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
29862306a36Sopenharmony_ci		"20MHz" : "40MHz");
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	if (is_hal_stop(rtlhal)) {
30162306a36Sopenharmony_ci		rtlphy->set_bwmode_inprogress = false;
30262306a36Sopenharmony_ci		return;
30362306a36Sopenharmony_ci	}
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
30662306a36Sopenharmony_ci	reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	switch (rtlphy->current_chan_bw) {
30962306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20:
31062306a36Sopenharmony_ci		reg_bw_opmode |= BW_OPMODE_20MHZ;
31162306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
31262306a36Sopenharmony_ci		break;
31362306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20_40:
31462306a36Sopenharmony_ci		reg_bw_opmode &= ~BW_OPMODE_20MHZ;
31562306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
31662306a36Sopenharmony_ci		reg_prsr_rsc =
31762306a36Sopenharmony_ci		    (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5);
31862306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
31962306a36Sopenharmony_ci		break;
32062306a36Sopenharmony_ci	default:
32162306a36Sopenharmony_ci		pr_info("unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
32262306a36Sopenharmony_ci		break;
32362306a36Sopenharmony_ci	}
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	switch (rtlphy->current_chan_bw) {
32662306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20:
32762306a36Sopenharmony_ci		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
32862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
32962306a36Sopenharmony_ci		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);
33062306a36Sopenharmony_ci		break;
33162306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20_40:
33262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
33362306a36Sopenharmony_ci		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
33662306a36Sopenharmony_ci			      (mac->cur_40_prime_sc >> 1));
33762306a36Sopenharmony_ci		rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
33862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
34162306a36Sopenharmony_ci			      (mac->cur_40_prime_sc ==
34262306a36Sopenharmony_ci			       HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
34362306a36Sopenharmony_ci		break;
34462306a36Sopenharmony_ci	default:
34562306a36Sopenharmony_ci		pr_err("unknown bandwidth: %#X\n",
34662306a36Sopenharmony_ci		       rtlphy->current_chan_bw);
34762306a36Sopenharmony_ci		break;
34862306a36Sopenharmony_ci	}
34962306a36Sopenharmony_ci	rtl92ce_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
35062306a36Sopenharmony_ci	rtlphy->set_bwmode_inprogress = false;
35162306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
35262306a36Sopenharmony_ci}
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_civoid _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
35562306a36Sopenharmony_ci{
35662306a36Sopenharmony_ci	u8 tmpreg;
35762306a36Sopenharmony_ci	u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
35862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	tmpreg = rtl_read_byte(rtlpriv, 0xd03);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci	if ((tmpreg & 0x70) != 0)
36362306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
36462306a36Sopenharmony_ci	else
36562306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci	if ((tmpreg & 0x70) != 0) {
36862306a36Sopenharmony_ci		rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci		if (is2t)
37162306a36Sopenharmony_ci			rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
37262306a36Sopenharmony_ci						  MASK12BITS);
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
37562306a36Sopenharmony_ci			      (rf_a_mode & 0x8FFFF) | 0x10000);
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci		if (is2t)
37862306a36Sopenharmony_ci			rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
37962306a36Sopenharmony_ci				      (rf_b_mode & 0x8FFFF) | 0x10000);
38062306a36Sopenharmony_ci	}
38162306a36Sopenharmony_ci	lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	mdelay(100);
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	if ((tmpreg & 0x70) != 0) {
38862306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, 0xd03, tmpreg);
38962306a36Sopenharmony_ci		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci		if (is2t)
39262306a36Sopenharmony_ci			rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
39362306a36Sopenharmony_ci				      rf_b_mode);
39462306a36Sopenharmony_ci	} else {
39562306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
39662306a36Sopenharmony_ci	}
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cistatic bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
40062306a36Sopenharmony_ci					    enum rf_pwrstate rfpwr_state)
40162306a36Sopenharmony_ci{
40262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
40362306a36Sopenharmony_ci	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
40462306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
40562306a36Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
40662306a36Sopenharmony_ci	bool bresult = true;
40762306a36Sopenharmony_ci	u8 i, queue_id;
40862306a36Sopenharmony_ci	struct rtl8192_tx_ring *ring = NULL;
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	switch (rfpwr_state) {
41162306a36Sopenharmony_ci	case ERFON:{
41262306a36Sopenharmony_ci			if ((ppsc->rfpwr_state == ERFOFF) &&
41362306a36Sopenharmony_ci			    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
41462306a36Sopenharmony_ci				bool rtstatus;
41562306a36Sopenharmony_ci				u32 initializecount = 0;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci				do {
41862306a36Sopenharmony_ci					initializecount++;
41962306a36Sopenharmony_ci					rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
42062306a36Sopenharmony_ci						"IPS Set eRf nic enable\n");
42162306a36Sopenharmony_ci					rtstatus = rtl_ps_enable_nic(hw);
42262306a36Sopenharmony_ci				} while (!rtstatus && (initializecount < 10));
42362306a36Sopenharmony_ci				RT_CLEAR_PS_LEVEL(ppsc,
42462306a36Sopenharmony_ci						  RT_RF_OFF_LEVL_HALT_NIC);
42562306a36Sopenharmony_ci			} else {
42662306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
42762306a36Sopenharmony_ci					"Set ERFON slept:%d ms\n",
42862306a36Sopenharmony_ci					jiffies_to_msecs(jiffies -
42962306a36Sopenharmony_ci						 ppsc->last_sleep_jiffies));
43062306a36Sopenharmony_ci				ppsc->last_awake_jiffies = jiffies;
43162306a36Sopenharmony_ci				rtl92ce_phy_set_rf_on(hw);
43262306a36Sopenharmony_ci			}
43362306a36Sopenharmony_ci			if (mac->link_state == MAC80211_LINKED) {
43462306a36Sopenharmony_ci				rtlpriv->cfg->ops->led_control(hw,
43562306a36Sopenharmony_ci							       LED_CTL_LINK);
43662306a36Sopenharmony_ci			} else {
43762306a36Sopenharmony_ci				rtlpriv->cfg->ops->led_control(hw,
43862306a36Sopenharmony_ci							       LED_CTL_NO_LINK);
43962306a36Sopenharmony_ci			}
44062306a36Sopenharmony_ci			break;
44162306a36Sopenharmony_ci		}
44262306a36Sopenharmony_ci	case ERFOFF:{
44362306a36Sopenharmony_ci			if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
44462306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
44562306a36Sopenharmony_ci					"IPS Set eRf nic disable\n");
44662306a36Sopenharmony_ci				rtl_ps_disable_nic(hw);
44762306a36Sopenharmony_ci				RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
44862306a36Sopenharmony_ci			} else {
44962306a36Sopenharmony_ci				if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
45062306a36Sopenharmony_ci					rtlpriv->cfg->ops->led_control(hw,
45162306a36Sopenharmony_ci							       LED_CTL_NO_LINK);
45262306a36Sopenharmony_ci				} else {
45362306a36Sopenharmony_ci					rtlpriv->cfg->ops->led_control(hw,
45462306a36Sopenharmony_ci							     LED_CTL_POWER_OFF);
45562306a36Sopenharmony_ci				}
45662306a36Sopenharmony_ci			}
45762306a36Sopenharmony_ci			break;
45862306a36Sopenharmony_ci		}
45962306a36Sopenharmony_ci	case ERFSLEEP:{
46062306a36Sopenharmony_ci			if (ppsc->rfpwr_state == ERFOFF)
46162306a36Sopenharmony_ci				break;
46262306a36Sopenharmony_ci			for (queue_id = 0, i = 0;
46362306a36Sopenharmony_ci			     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
46462306a36Sopenharmony_ci				ring = &pcipriv->dev.tx_ring[queue_id];
46562306a36Sopenharmony_ci				if (queue_id == BEACON_QUEUE ||
46662306a36Sopenharmony_ci				    skb_queue_len(&ring->queue) == 0) {
46762306a36Sopenharmony_ci					queue_id++;
46862306a36Sopenharmony_ci					continue;
46962306a36Sopenharmony_ci				} else {
47062306a36Sopenharmony_ci					rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
47162306a36Sopenharmony_ci						"eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
47262306a36Sopenharmony_ci						i + 1, queue_id,
47362306a36Sopenharmony_ci						skb_queue_len(&ring->queue));
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci					udelay(10);
47662306a36Sopenharmony_ci					i++;
47762306a36Sopenharmony_ci				}
47862306a36Sopenharmony_ci				if (i >= MAX_DOZE_WAITING_TIMES_9x) {
47962306a36Sopenharmony_ci					rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
48062306a36Sopenharmony_ci						"ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
48162306a36Sopenharmony_ci						MAX_DOZE_WAITING_TIMES_9x,
48262306a36Sopenharmony_ci						queue_id,
48362306a36Sopenharmony_ci						skb_queue_len(&ring->queue));
48462306a36Sopenharmony_ci					break;
48562306a36Sopenharmony_ci				}
48662306a36Sopenharmony_ci			}
48762306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
48862306a36Sopenharmony_ci				"Set ERFSLEEP awaked:%d ms\n",
48962306a36Sopenharmony_ci				jiffies_to_msecs(jiffies -
49062306a36Sopenharmony_ci						 ppsc->last_awake_jiffies));
49162306a36Sopenharmony_ci			ppsc->last_sleep_jiffies = jiffies;
49262306a36Sopenharmony_ci			_rtl92c_phy_set_rf_sleep(hw);
49362306a36Sopenharmony_ci			break;
49462306a36Sopenharmony_ci		}
49562306a36Sopenharmony_ci	default:
49662306a36Sopenharmony_ci		pr_err("switch case %#x not processed\n",
49762306a36Sopenharmony_ci		       rfpwr_state);
49862306a36Sopenharmony_ci		bresult = false;
49962306a36Sopenharmony_ci		break;
50062306a36Sopenharmony_ci	}
50162306a36Sopenharmony_ci	if (bresult)
50262306a36Sopenharmony_ci		ppsc->rfpwr_state = rfpwr_state;
50362306a36Sopenharmony_ci	return bresult;
50462306a36Sopenharmony_ci}
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_cibool rtl92c_phy_set_rf_power_state(struct ieee80211_hw *hw,
50762306a36Sopenharmony_ci				   enum rf_pwrstate rfpwr_state)
50862306a36Sopenharmony_ci{
50962306a36Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci	bool bresult = false;
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	if (rfpwr_state == ppsc->rfpwr_state)
51462306a36Sopenharmony_ci		return bresult;
51562306a36Sopenharmony_ci	bresult = _rtl92ce_phy_set_rf_power_state(hw, rfpwr_state);
51662306a36Sopenharmony_ci	return bresult;
51762306a36Sopenharmony_ci}
518