18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/* Copyright(c) 2009-2014  Realtek Corporation.*/
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include "../wifi.h"
58c2ecf20Sopenharmony_ci#include "../efuse.h"
68c2ecf20Sopenharmony_ci#include "../base.h"
78c2ecf20Sopenharmony_ci#include "../regd.h"
88c2ecf20Sopenharmony_ci#include "../cam.h"
98c2ecf20Sopenharmony_ci#include "../ps.h"
108c2ecf20Sopenharmony_ci#include "../pci.h"
118c2ecf20Sopenharmony_ci#include "reg.h"
128c2ecf20Sopenharmony_ci#include "def.h"
138c2ecf20Sopenharmony_ci#include "phy.h"
148c2ecf20Sopenharmony_ci#include "../rtl8723com/phy_common.h"
158c2ecf20Sopenharmony_ci#include "dm.h"
168c2ecf20Sopenharmony_ci#include "../rtl8723com/dm_common.h"
178c2ecf20Sopenharmony_ci#include "fw.h"
188c2ecf20Sopenharmony_ci#include "../rtl8723com/fw_common.h"
198c2ecf20Sopenharmony_ci#include "led.h"
208c2ecf20Sopenharmony_ci#include "hw.h"
218c2ecf20Sopenharmony_ci#include "../pwrseqcmd.h"
228c2ecf20Sopenharmony_ci#include "pwrseq.h"
238c2ecf20Sopenharmony_ci#include "../btcoexist/rtl_btc.h"
248c2ecf20Sopenharmony_ci#include <linux/kernel.h>
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#define LLT_CONFIG	5
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistatic void _rtl8723be_return_beacon_queue_skb(struct ieee80211_hw *hw)
298c2ecf20Sopenharmony_ci{
308c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
318c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
328c2ecf20Sopenharmony_ci	struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
338c2ecf20Sopenharmony_ci	struct sk_buff_head free_list;
348c2ecf20Sopenharmony_ci	unsigned long flags;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	skb_queue_head_init(&free_list);
378c2ecf20Sopenharmony_ci	spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
388c2ecf20Sopenharmony_ci	while (skb_queue_len(&ring->queue)) {
398c2ecf20Sopenharmony_ci		struct rtl_tx_desc *entry = &ring->desc[ring->idx];
408c2ecf20Sopenharmony_ci		struct sk_buff *skb = __skb_dequeue(&ring->queue);
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci		dma_unmap_single(&rtlpci->pdev->dev,
438c2ecf20Sopenharmony_ci				 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
448c2ecf20Sopenharmony_ci						true, HW_DESC_TXBUFF_ADDR),
458c2ecf20Sopenharmony_ci				 skb->len, DMA_TO_DEVICE);
468c2ecf20Sopenharmony_ci		__skb_queue_tail(&free_list, skb);
478c2ecf20Sopenharmony_ci		ring->idx = (ring->idx + 1) % ring->entries;
488c2ecf20Sopenharmony_ci	}
498c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	__skb_queue_purge(&free_list);
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
558c2ecf20Sopenharmony_ci					u8 set_bits, u8 clear_bits)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
588c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	rtlpci->reg_bcn_ctrl_val |= set_bits;
618c2ecf20Sopenharmony_ci	rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
648c2ecf20Sopenharmony_ci}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cistatic void _rtl8723be_stop_tx_beacon(struct ieee80211_hw *hw)
678c2ecf20Sopenharmony_ci{
688c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
698c2ecf20Sopenharmony_ci	u8 tmp1byte;
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
728c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
738c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
748c2ecf20Sopenharmony_ci	tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
758c2ecf20Sopenharmony_ci	tmp1byte &= ~(BIT(0));
768c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
778c2ecf20Sopenharmony_ci}
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistatic void _rtl8723be_resume_tx_beacon(struct ieee80211_hw *hw)
808c2ecf20Sopenharmony_ci{
818c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
828c2ecf20Sopenharmony_ci	u8 tmp1byte;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
858c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
868c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
878c2ecf20Sopenharmony_ci	tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
888c2ecf20Sopenharmony_ci	tmp1byte |= BIT(1);
898c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
908c2ecf20Sopenharmony_ci}
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistatic void _rtl8723be_enable_bcn_sub_func(struct ieee80211_hw *hw)
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(1));
958c2ecf20Sopenharmony_ci}
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic void _rtl8723be_disable_bcn_sub_func(struct ieee80211_hw *hw)
988c2ecf20Sopenharmony_ci{
998c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(1), 0);
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_cistatic void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val,
1038c2ecf20Sopenharmony_ci				       bool b_need_turn_off_ckk)
1048c2ecf20Sopenharmony_ci{
1058c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
1068c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1078c2ecf20Sopenharmony_ci	bool b_support_remote_wake_up;
1088c2ecf20Sopenharmony_ci	u32 count = 0, isr_regaddr, content;
1098c2ecf20Sopenharmony_ci	bool b_schedule_timer = b_need_turn_off_ckk;
1108c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1118c2ecf20Sopenharmony_ci				      (u8 *)(&b_support_remote_wake_up));
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	if (!rtlhal->fw_ready)
1148c2ecf20Sopenharmony_ci		return;
1158c2ecf20Sopenharmony_ci	if (!rtlpriv->psc.fw_current_inpsmode)
1168c2ecf20Sopenharmony_ci		return;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	while (1) {
1198c2ecf20Sopenharmony_ci		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
1208c2ecf20Sopenharmony_ci		if (rtlhal->fw_clk_change_in_progress) {
1218c2ecf20Sopenharmony_ci			while (rtlhal->fw_clk_change_in_progress) {
1228c2ecf20Sopenharmony_ci				spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
1238c2ecf20Sopenharmony_ci				count++;
1248c2ecf20Sopenharmony_ci				udelay(100);
1258c2ecf20Sopenharmony_ci				if (count > 1000)
1268c2ecf20Sopenharmony_ci					return;
1278c2ecf20Sopenharmony_ci				spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
1288c2ecf20Sopenharmony_ci			}
1298c2ecf20Sopenharmony_ci			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
1308c2ecf20Sopenharmony_ci		} else {
1318c2ecf20Sopenharmony_ci			rtlhal->fw_clk_change_in_progress = false;
1328c2ecf20Sopenharmony_ci			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
1338c2ecf20Sopenharmony_ci			break;
1348c2ecf20Sopenharmony_ci		}
1358c2ecf20Sopenharmony_ci	}
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	if (IS_IN_LOW_POWER_STATE(rtlhal->fw_ps_state)) {
1388c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
1398c2ecf20Sopenharmony_ci					      (u8 *)(&rpwm_val));
1408c2ecf20Sopenharmony_ci		if (FW_PS_IS_ACK(rpwm_val)) {
1418c2ecf20Sopenharmony_ci			isr_regaddr = REG_HISR;
1428c2ecf20Sopenharmony_ci			content = rtl_read_dword(rtlpriv, isr_regaddr);
1438c2ecf20Sopenharmony_ci			while (!(content & IMR_CPWM) && (count < 500)) {
1448c2ecf20Sopenharmony_ci				udelay(50);
1458c2ecf20Sopenharmony_ci				count++;
1468c2ecf20Sopenharmony_ci				content = rtl_read_dword(rtlpriv, isr_regaddr);
1478c2ecf20Sopenharmony_ci			}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci			if (content & IMR_CPWM) {
1508c2ecf20Sopenharmony_ci				rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
1518c2ecf20Sopenharmony_ci				rtlhal->fw_ps_state = FW_PS_STATE_RF_ON;
1528c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
1538c2ecf20Sopenharmony_ci					"Receive CPWM INT!!! Set pHalData->FwPSState = %X\n",
1548c2ecf20Sopenharmony_ci					rtlhal->fw_ps_state);
1558c2ecf20Sopenharmony_ci			}
1568c2ecf20Sopenharmony_ci		}
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
1598c2ecf20Sopenharmony_ci		rtlhal->fw_clk_change_in_progress = false;
1608c2ecf20Sopenharmony_ci		spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
1618c2ecf20Sopenharmony_ci		if (b_schedule_timer)
1628c2ecf20Sopenharmony_ci			mod_timer(&rtlpriv->works.fw_clockoff_timer,
1638c2ecf20Sopenharmony_ci				  jiffies + MSECS(10));
1648c2ecf20Sopenharmony_ci	} else  {
1658c2ecf20Sopenharmony_ci		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
1668c2ecf20Sopenharmony_ci		rtlhal->fw_clk_change_in_progress = false;
1678c2ecf20Sopenharmony_ci		spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
1688c2ecf20Sopenharmony_ci	}
1698c2ecf20Sopenharmony_ci}
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_cistatic void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
1728c2ecf20Sopenharmony_ci{
1738c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
1748c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1758c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1768c2ecf20Sopenharmony_ci	struct rtl8192_tx_ring *ring;
1778c2ecf20Sopenharmony_ci	enum rf_pwrstate rtstate;
1788c2ecf20Sopenharmony_ci	bool b_schedule_timer = false;
1798c2ecf20Sopenharmony_ci	u8 queue;
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci	if (!rtlhal->fw_ready)
1828c2ecf20Sopenharmony_ci		return;
1838c2ecf20Sopenharmony_ci	if (!rtlpriv->psc.fw_current_inpsmode)
1848c2ecf20Sopenharmony_ci		return;
1858c2ecf20Sopenharmony_ci	if (!rtlhal->allow_sw_to_change_hwclc)
1868c2ecf20Sopenharmony_ci		return;
1878c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
1888c2ecf20Sopenharmony_ci	if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
1898c2ecf20Sopenharmony_ci		return;
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
1928c2ecf20Sopenharmony_ci		ring = &rtlpci->tx_ring[queue];
1938c2ecf20Sopenharmony_ci		if (skb_queue_len(&ring->queue)) {
1948c2ecf20Sopenharmony_ci			b_schedule_timer = true;
1958c2ecf20Sopenharmony_ci			break;
1968c2ecf20Sopenharmony_ci		}
1978c2ecf20Sopenharmony_ci	}
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci	if (b_schedule_timer) {
2008c2ecf20Sopenharmony_ci		mod_timer(&rtlpriv->works.fw_clockoff_timer,
2018c2ecf20Sopenharmony_ci			  jiffies + MSECS(10));
2028c2ecf20Sopenharmony_ci		return;
2038c2ecf20Sopenharmony_ci	}
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) {
2068c2ecf20Sopenharmony_ci		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
2078c2ecf20Sopenharmony_ci		if (!rtlhal->fw_clk_change_in_progress) {
2088c2ecf20Sopenharmony_ci			rtlhal->fw_clk_change_in_progress = true;
2098c2ecf20Sopenharmony_ci			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
2108c2ecf20Sopenharmony_ci			rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
2118c2ecf20Sopenharmony_ci			rtl_write_word(rtlpriv, REG_HISR, 0x0100);
2128c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
2138c2ecf20Sopenharmony_ci						      (u8 *)(&rpwm_val));
2148c2ecf20Sopenharmony_ci			spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
2158c2ecf20Sopenharmony_ci			rtlhal->fw_clk_change_in_progress = false;
2168c2ecf20Sopenharmony_ci			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
2178c2ecf20Sopenharmony_ci		} else {
2188c2ecf20Sopenharmony_ci			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
2198c2ecf20Sopenharmony_ci			mod_timer(&rtlpriv->works.fw_clockoff_timer,
2208c2ecf20Sopenharmony_ci				  jiffies + MSECS(10));
2218c2ecf20Sopenharmony_ci		}
2228c2ecf20Sopenharmony_ci	}
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci}
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_cistatic void _rtl8723be_set_fw_ps_rf_on(struct ieee80211_hw *hw)
2278c2ecf20Sopenharmony_ci{
2288c2ecf20Sopenharmony_ci	u8 rpwm_val = 0;
2298c2ecf20Sopenharmony_ci	rpwm_val |= (FW_PS_STATE_RF_OFF | FW_PS_ACK);
2308c2ecf20Sopenharmony_ci	_rtl8723be_set_fw_clock_on(hw, rpwm_val, true);
2318c2ecf20Sopenharmony_ci}
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_cistatic void _rtl8723be_fwlps_leave(struct ieee80211_hw *hw)
2348c2ecf20Sopenharmony_ci{
2358c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
2368c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2378c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2388c2ecf20Sopenharmony_ci	bool fw_current_inps = false;
2398c2ecf20Sopenharmony_ci	u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	if (ppsc->low_power_enable) {
2428c2ecf20Sopenharmony_ci		rpwm_val = (FW_PS_STATE_ALL_ON | FW_PS_ACK);/* RF on */
2438c2ecf20Sopenharmony_ci		_rtl8723be_set_fw_clock_on(hw, rpwm_val, false);
2448c2ecf20Sopenharmony_ci		rtlhal->allow_sw_to_change_hwclc = false;
2458c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
2468c2ecf20Sopenharmony_ci					      (u8 *)(&fw_pwrmode));
2478c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
2488c2ecf20Sopenharmony_ci					      (u8 *)(&fw_current_inps));
2498c2ecf20Sopenharmony_ci	} else {
2508c2ecf20Sopenharmony_ci		rpwm_val = FW_PS_STATE_ALL_ON;	/* RF on */
2518c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
2528c2ecf20Sopenharmony_ci					      (u8 *)(&rpwm_val));
2538c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
2548c2ecf20Sopenharmony_ci					      (u8 *)(&fw_pwrmode));
2558c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
2568c2ecf20Sopenharmony_ci					      (u8 *)(&fw_current_inps));
2578c2ecf20Sopenharmony_ci	}
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci}
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_cistatic void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw)
2628c2ecf20Sopenharmony_ci{
2638c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
2648c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2658c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2668c2ecf20Sopenharmony_ci	bool fw_current_inps = true;
2678c2ecf20Sopenharmony_ci	u8 rpwm_val;
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci	if (ppsc->low_power_enable) {
2708c2ecf20Sopenharmony_ci		rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR;	/* RF off */
2718c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
2728c2ecf20Sopenharmony_ci					      (u8 *)(&fw_current_inps));
2738c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
2748c2ecf20Sopenharmony_ci					      (u8 *)(&ppsc->fwctrl_psmode));
2758c2ecf20Sopenharmony_ci		rtlhal->allow_sw_to_change_hwclc = true;
2768c2ecf20Sopenharmony_ci		_rtl8723be_set_fw_clock_off(hw, rpwm_val);
2778c2ecf20Sopenharmony_ci	} else {
2788c2ecf20Sopenharmony_ci		rpwm_val = FW_PS_STATE_RF_OFF;	/* RF off */
2798c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
2808c2ecf20Sopenharmony_ci					      (u8 *)(&fw_current_inps));
2818c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
2828c2ecf20Sopenharmony_ci					      (u8 *)(&ppsc->fwctrl_psmode));
2838c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
2848c2ecf20Sopenharmony_ci					      (u8 *)(&rpwm_val));
2858c2ecf20Sopenharmony_ci	}
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_ci}
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_civoid rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
2908c2ecf20Sopenharmony_ci{
2918c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
2928c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2938c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci	switch (variable) {
2968c2ecf20Sopenharmony_ci	case HW_VAR_RCR:
2978c2ecf20Sopenharmony_ci		*((u32 *)(val)) = rtlpci->receive_config;
2988c2ecf20Sopenharmony_ci		break;
2998c2ecf20Sopenharmony_ci	case HW_VAR_RF_STATE:
3008c2ecf20Sopenharmony_ci		*((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
3018c2ecf20Sopenharmony_ci		break;
3028c2ecf20Sopenharmony_ci	case HW_VAR_FWLPS_RF_ON:{
3038c2ecf20Sopenharmony_ci		enum rf_pwrstate rfstate;
3048c2ecf20Sopenharmony_ci		u32 val_rcr;
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE,
3078c2ecf20Sopenharmony_ci					      (u8 *)(&rfstate));
3088c2ecf20Sopenharmony_ci		if (rfstate == ERFOFF) {
3098c2ecf20Sopenharmony_ci			*((bool *)(val)) = true;
3108c2ecf20Sopenharmony_ci		} else {
3118c2ecf20Sopenharmony_ci			val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
3128c2ecf20Sopenharmony_ci			val_rcr &= 0x00070000;
3138c2ecf20Sopenharmony_ci			if (val_rcr)
3148c2ecf20Sopenharmony_ci				*((bool *)(val)) = false;
3158c2ecf20Sopenharmony_ci			else
3168c2ecf20Sopenharmony_ci				*((bool *)(val)) = true;
3178c2ecf20Sopenharmony_ci		}
3188c2ecf20Sopenharmony_ci		}
3198c2ecf20Sopenharmony_ci		break;
3208c2ecf20Sopenharmony_ci	case HW_VAR_FW_PSMODE_STATUS:
3218c2ecf20Sopenharmony_ci		*((bool *)(val)) = ppsc->fw_current_inpsmode;
3228c2ecf20Sopenharmony_ci		break;
3238c2ecf20Sopenharmony_ci	case HW_VAR_CORRECT_TSF:{
3248c2ecf20Sopenharmony_ci		u64 tsf;
3258c2ecf20Sopenharmony_ci		u32 *ptsf_low = (u32 *)&tsf;
3268c2ecf20Sopenharmony_ci		u32 *ptsf_high = ((u32 *)&tsf) + 1;
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci		*ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
3298c2ecf20Sopenharmony_ci		*ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
3308c2ecf20Sopenharmony_ci
3318c2ecf20Sopenharmony_ci		*((u64 *)(val)) = tsf;
3328c2ecf20Sopenharmony_ci		}
3338c2ecf20Sopenharmony_ci		break;
3348c2ecf20Sopenharmony_ci	case HAL_DEF_WOWLAN:
3358c2ecf20Sopenharmony_ci		break;
3368c2ecf20Sopenharmony_ci	default:
3378c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
3388c2ecf20Sopenharmony_ci			"switch case %#x not processed\n", variable);
3398c2ecf20Sopenharmony_ci		break;
3408c2ecf20Sopenharmony_ci	}
3418c2ecf20Sopenharmony_ci}
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_cistatic void _rtl8723be_download_rsvd_page(struct ieee80211_hw *hw)
3448c2ecf20Sopenharmony_ci{
3458c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
3468c2ecf20Sopenharmony_ci	u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
3478c2ecf20Sopenharmony_ci	u8 count = 0, dlbcn_count = 0;
3488c2ecf20Sopenharmony_ci	bool b_recover = false;
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci	tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
3518c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_CR + 1,
3528c2ecf20Sopenharmony_ci		       (tmp_regcr | BIT(0)));
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
3558c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ci	tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
3588c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6)));
3598c2ecf20Sopenharmony_ci	if (tmp_reg422 & BIT(6))
3608c2ecf20Sopenharmony_ci		b_recover = true;
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci	do {
3638c2ecf20Sopenharmony_ci		bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
3648c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
3658c2ecf20Sopenharmony_ci			       (bcnvalid_reg | BIT(0)));
3668c2ecf20Sopenharmony_ci		_rtl8723be_return_beacon_queue_skb(hw);
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci		rtl8723be_set_fw_rsvdpagepkt(hw, 0);
3698c2ecf20Sopenharmony_ci		bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
3708c2ecf20Sopenharmony_ci		count = 0;
3718c2ecf20Sopenharmony_ci		while (!(bcnvalid_reg & BIT(0)) && count < 20) {
3728c2ecf20Sopenharmony_ci			count++;
3738c2ecf20Sopenharmony_ci			udelay(10);
3748c2ecf20Sopenharmony_ci			bcnvalid_reg = rtl_read_byte(rtlpriv,
3758c2ecf20Sopenharmony_ci						     REG_TDECTRL + 2);
3768c2ecf20Sopenharmony_ci		}
3778c2ecf20Sopenharmony_ci		dlbcn_count++;
3788c2ecf20Sopenharmony_ci	} while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	if (bcnvalid_reg & BIT(0))
3818c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
3848c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	if (b_recover)
3878c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
3908c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
3918c2ecf20Sopenharmony_ci}
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_civoid rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
3948c2ecf20Sopenharmony_ci{
3958c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
3968c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3978c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3988c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3998c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4008c2ecf20Sopenharmony_ci	u8 idx;
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ci	switch (variable) {
4038c2ecf20Sopenharmony_ci	case HW_VAR_ETHER_ADDR:
4048c2ecf20Sopenharmony_ci		for (idx = 0; idx < ETH_ALEN; idx++)
4058c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]);
4068c2ecf20Sopenharmony_ci		break;
4078c2ecf20Sopenharmony_ci	case HW_VAR_BASIC_RATE:{
4088c2ecf20Sopenharmony_ci		u16 b_rate_cfg = ((u16 *)val)[0];
4098c2ecf20Sopenharmony_ci		u8 rate_index = 0;
4108c2ecf20Sopenharmony_ci		b_rate_cfg = b_rate_cfg & 0x15f;
4118c2ecf20Sopenharmony_ci		b_rate_cfg |= 0x01;
4128c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
4138c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff);
4148c2ecf20Sopenharmony_ci		while (b_rate_cfg > 0x1) {
4158c2ecf20Sopenharmony_ci			b_rate_cfg = (b_rate_cfg >> 1);
4168c2ecf20Sopenharmony_ci			rate_index++;
4178c2ecf20Sopenharmony_ci		}
4188c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index);
4198c2ecf20Sopenharmony_ci		}
4208c2ecf20Sopenharmony_ci		break;
4218c2ecf20Sopenharmony_ci	case HW_VAR_BSSID:
4228c2ecf20Sopenharmony_ci		for (idx = 0; idx < ETH_ALEN; idx++)
4238c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]);
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci		break;
4268c2ecf20Sopenharmony_ci	case HW_VAR_SIFS:
4278c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
4288c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
4318c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci		if (!mac->ht_enable)
4348c2ecf20Sopenharmony_ci			rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e);
4358c2ecf20Sopenharmony_ci		else
4368c2ecf20Sopenharmony_ci			rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
4378c2ecf20Sopenharmony_ci				       *((u16 *)val));
4388c2ecf20Sopenharmony_ci		break;
4398c2ecf20Sopenharmony_ci	case HW_VAR_SLOT_TIME:{
4408c2ecf20Sopenharmony_ci		u8 e_aci;
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
4438c2ecf20Sopenharmony_ci			"HW_VAR_SLOT_TIME %x\n", val[0]);
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
4468c2ecf20Sopenharmony_ci
4478c2ecf20Sopenharmony_ci		for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
4488c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
4498c2ecf20Sopenharmony_ci						      (u8 *)(&e_aci));
4508c2ecf20Sopenharmony_ci		}
4518c2ecf20Sopenharmony_ci		}
4528c2ecf20Sopenharmony_ci		break;
4538c2ecf20Sopenharmony_ci	case HW_VAR_ACK_PREAMBLE:{
4548c2ecf20Sopenharmony_ci		u8 reg_tmp;
4558c2ecf20Sopenharmony_ci		u8 short_preamble = (bool)(*(u8 *)val);
4568c2ecf20Sopenharmony_ci		reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL + 2);
4578c2ecf20Sopenharmony_ci		if (short_preamble) {
4588c2ecf20Sopenharmony_ci			reg_tmp |= 0x02;
4598c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
4608c2ecf20Sopenharmony_ci		} else {
4618c2ecf20Sopenharmony_ci			reg_tmp &= 0xFD;
4628c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
4638c2ecf20Sopenharmony_ci		}
4648c2ecf20Sopenharmony_ci		}
4658c2ecf20Sopenharmony_ci		break;
4668c2ecf20Sopenharmony_ci	case HW_VAR_WPA_CONFIG:
4678c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
4688c2ecf20Sopenharmony_ci		break;
4698c2ecf20Sopenharmony_ci	case HW_VAR_AMPDU_MIN_SPACE:{
4708c2ecf20Sopenharmony_ci		u8 min_spacing_to_set;
4718c2ecf20Sopenharmony_ci		u8 sec_min_space;
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci		min_spacing_to_set = *((u8 *)val);
4748c2ecf20Sopenharmony_ci		if (min_spacing_to_set <= 7) {
4758c2ecf20Sopenharmony_ci			sec_min_space = 0;
4768c2ecf20Sopenharmony_ci
4778c2ecf20Sopenharmony_ci			if (min_spacing_to_set < sec_min_space)
4788c2ecf20Sopenharmony_ci				min_spacing_to_set = sec_min_space;
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci			mac->min_space_cfg = ((mac->min_space_cfg & 0xf8) |
4818c2ecf20Sopenharmony_ci					      min_spacing_to_set);
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_ci			*val = min_spacing_to_set;
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
4868c2ecf20Sopenharmony_ci				"Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
4878c2ecf20Sopenharmony_ci				mac->min_space_cfg);
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
4908c2ecf20Sopenharmony_ci				       mac->min_space_cfg);
4918c2ecf20Sopenharmony_ci		}
4928c2ecf20Sopenharmony_ci		}
4938c2ecf20Sopenharmony_ci		break;
4948c2ecf20Sopenharmony_ci	case HW_VAR_SHORTGI_DENSITY:{
4958c2ecf20Sopenharmony_ci		u8 density_to_set;
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci		density_to_set = *((u8 *)val);
4988c2ecf20Sopenharmony_ci		mac->min_space_cfg |= (density_to_set << 3);
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
5018c2ecf20Sopenharmony_ci			"Set HW_VAR_SHORTGI_DENSITY: %#x\n",
5028c2ecf20Sopenharmony_ci			mac->min_space_cfg);
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
5058c2ecf20Sopenharmony_ci			       mac->min_space_cfg);
5068c2ecf20Sopenharmony_ci		}
5078c2ecf20Sopenharmony_ci		break;
5088c2ecf20Sopenharmony_ci	case HW_VAR_AMPDU_FACTOR:{
5098c2ecf20Sopenharmony_ci		u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9};
5108c2ecf20Sopenharmony_ci		u8 factor_toset;
5118c2ecf20Sopenharmony_ci		u8 *p_regtoset = NULL;
5128c2ecf20Sopenharmony_ci		u8 index = 0;
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_ci		p_regtoset = regtoset_normal;
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ci		factor_toset = *((u8 *)val);
5178c2ecf20Sopenharmony_ci		if (factor_toset <= 3) {
5188c2ecf20Sopenharmony_ci			factor_toset = (1 << (factor_toset + 2));
5198c2ecf20Sopenharmony_ci			if (factor_toset > 0xf)
5208c2ecf20Sopenharmony_ci				factor_toset = 0xf;
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_ci			for (index = 0; index < 4; index++) {
5238c2ecf20Sopenharmony_ci				if ((p_regtoset[index] & 0xf0) >
5248c2ecf20Sopenharmony_ci				    (factor_toset << 4))
5258c2ecf20Sopenharmony_ci					p_regtoset[index] =
5268c2ecf20Sopenharmony_ci						(p_regtoset[index] & 0x0f) |
5278c2ecf20Sopenharmony_ci						(factor_toset << 4);
5288c2ecf20Sopenharmony_ci
5298c2ecf20Sopenharmony_ci				if ((p_regtoset[index] & 0x0f) > factor_toset)
5308c2ecf20Sopenharmony_ci					p_regtoset[index] =
5318c2ecf20Sopenharmony_ci						(p_regtoset[index] & 0xf0) |
5328c2ecf20Sopenharmony_ci						(factor_toset);
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci				rtl_write_byte(rtlpriv,
5358c2ecf20Sopenharmony_ci					       (REG_AGGLEN_LMT + index),
5368c2ecf20Sopenharmony_ci					       p_regtoset[index]);
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_ci			}
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
5418c2ecf20Sopenharmony_ci				"Set HW_VAR_AMPDU_FACTOR: %#x\n",
5428c2ecf20Sopenharmony_ci				factor_toset);
5438c2ecf20Sopenharmony_ci		}
5448c2ecf20Sopenharmony_ci		}
5458c2ecf20Sopenharmony_ci		break;
5468c2ecf20Sopenharmony_ci	case HW_VAR_AC_PARAM:{
5478c2ecf20Sopenharmony_ci		u8 e_aci = *((u8 *)val);
5488c2ecf20Sopenharmony_ci		rtl8723_dm_init_edca_turbo(hw);
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_ci		if (rtlpci->acm_method != EACMWAY2_SW)
5518c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL,
5528c2ecf20Sopenharmony_ci						      (u8 *)(&e_aci));
5538c2ecf20Sopenharmony_ci		}
5548c2ecf20Sopenharmony_ci		break;
5558c2ecf20Sopenharmony_ci	case HW_VAR_ACM_CTRL:{
5568c2ecf20Sopenharmony_ci		u8 e_aci = *((u8 *)val);
5578c2ecf20Sopenharmony_ci		union aci_aifsn *p_aci_aifsn =
5588c2ecf20Sopenharmony_ci				(union aci_aifsn *)(&(mac->ac[0].aifs));
5598c2ecf20Sopenharmony_ci		u8 acm = p_aci_aifsn->f.acm;
5608c2ecf20Sopenharmony_ci		u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_ci		acm_ctrl =
5638c2ecf20Sopenharmony_ci		    acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
5648c2ecf20Sopenharmony_ci
5658c2ecf20Sopenharmony_ci		if (acm) {
5668c2ecf20Sopenharmony_ci			switch (e_aci) {
5678c2ecf20Sopenharmony_ci			case AC0_BE:
5688c2ecf20Sopenharmony_ci				acm_ctrl |= ACMHW_BEQEN;
5698c2ecf20Sopenharmony_ci				break;
5708c2ecf20Sopenharmony_ci			case AC2_VI:
5718c2ecf20Sopenharmony_ci				acm_ctrl |= ACMHW_VIQEN;
5728c2ecf20Sopenharmony_ci				break;
5738c2ecf20Sopenharmony_ci			case AC3_VO:
5748c2ecf20Sopenharmony_ci				acm_ctrl |= ACMHW_VOQEN;
5758c2ecf20Sopenharmony_ci				break;
5768c2ecf20Sopenharmony_ci			default:
5778c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
5788c2ecf20Sopenharmony_ci					"HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
5798c2ecf20Sopenharmony_ci					acm);
5808c2ecf20Sopenharmony_ci				break;
5818c2ecf20Sopenharmony_ci			}
5828c2ecf20Sopenharmony_ci		} else {
5838c2ecf20Sopenharmony_ci			switch (e_aci) {
5848c2ecf20Sopenharmony_ci			case AC0_BE:
5858c2ecf20Sopenharmony_ci				acm_ctrl &= (~ACMHW_BEQEN);
5868c2ecf20Sopenharmony_ci				break;
5878c2ecf20Sopenharmony_ci			case AC2_VI:
5888c2ecf20Sopenharmony_ci				acm_ctrl &= (~ACMHW_VIQEN);
5898c2ecf20Sopenharmony_ci				break;
5908c2ecf20Sopenharmony_ci			case AC3_VO:
5918c2ecf20Sopenharmony_ci				acm_ctrl &= (~ACMHW_VOQEN);
5928c2ecf20Sopenharmony_ci				break;
5938c2ecf20Sopenharmony_ci			default:
5948c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
5958c2ecf20Sopenharmony_ci					"switch case %#x not processed\n",
5968c2ecf20Sopenharmony_ci					e_aci);
5978c2ecf20Sopenharmony_ci				break;
5988c2ecf20Sopenharmony_ci			}
5998c2ecf20Sopenharmony_ci		}
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE,
6028c2ecf20Sopenharmony_ci			"SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
6038c2ecf20Sopenharmony_ci			acm_ctrl);
6048c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
6058c2ecf20Sopenharmony_ci		}
6068c2ecf20Sopenharmony_ci		break;
6078c2ecf20Sopenharmony_ci	case HW_VAR_RCR:
6088c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
6098c2ecf20Sopenharmony_ci		rtlpci->receive_config = ((u32 *)(val))[0];
6108c2ecf20Sopenharmony_ci		break;
6118c2ecf20Sopenharmony_ci	case HW_VAR_RETRY_LIMIT:{
6128c2ecf20Sopenharmony_ci		u8 retry_limit = ((u8 *)(val))[0];
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci		rtl_write_word(rtlpriv, REG_RL,
6158c2ecf20Sopenharmony_ci			       retry_limit << RETRY_LIMIT_SHORT_SHIFT |
6168c2ecf20Sopenharmony_ci			       retry_limit << RETRY_LIMIT_LONG_SHIFT);
6178c2ecf20Sopenharmony_ci		}
6188c2ecf20Sopenharmony_ci		break;
6198c2ecf20Sopenharmony_ci	case HW_VAR_DUAL_TSF_RST:
6208c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
6218c2ecf20Sopenharmony_ci		break;
6228c2ecf20Sopenharmony_ci	case HW_VAR_EFUSE_BYTES:
6238c2ecf20Sopenharmony_ci		rtlefuse->efuse_usedbytes = *((u16 *)val);
6248c2ecf20Sopenharmony_ci		break;
6258c2ecf20Sopenharmony_ci	case HW_VAR_EFUSE_USAGE:
6268c2ecf20Sopenharmony_ci		rtlefuse->efuse_usedpercentage = *((u8 *)val);
6278c2ecf20Sopenharmony_ci		break;
6288c2ecf20Sopenharmony_ci	case HW_VAR_IO_CMD:
6298c2ecf20Sopenharmony_ci		rtl8723be_phy_set_io_cmd(hw, (*(enum io_type *)val));
6308c2ecf20Sopenharmony_ci		break;
6318c2ecf20Sopenharmony_ci	case HW_VAR_SET_RPWM:{
6328c2ecf20Sopenharmony_ci		u8 rpwm_val;
6338c2ecf20Sopenharmony_ci
6348c2ecf20Sopenharmony_ci		rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
6358c2ecf20Sopenharmony_ci		udelay(1);
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ci		if (rpwm_val & BIT(7)) {
6388c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val));
6398c2ecf20Sopenharmony_ci		} else {
6408c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
6418c2ecf20Sopenharmony_ci				       ((*(u8 *)val) | BIT(7)));
6428c2ecf20Sopenharmony_ci		}
6438c2ecf20Sopenharmony_ci		}
6448c2ecf20Sopenharmony_ci		break;
6458c2ecf20Sopenharmony_ci	case HW_VAR_H2C_FW_PWRMODE:
6468c2ecf20Sopenharmony_ci		rtl8723be_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
6478c2ecf20Sopenharmony_ci		break;
6488c2ecf20Sopenharmony_ci	case HW_VAR_FW_PSMODE_STATUS:
6498c2ecf20Sopenharmony_ci		ppsc->fw_current_inpsmode = *((bool *)val);
6508c2ecf20Sopenharmony_ci		break;
6518c2ecf20Sopenharmony_ci	case HW_VAR_RESUME_CLK_ON:
6528c2ecf20Sopenharmony_ci		_rtl8723be_set_fw_ps_rf_on(hw);
6538c2ecf20Sopenharmony_ci		break;
6548c2ecf20Sopenharmony_ci	case HW_VAR_FW_LPS_ACTION:{
6558c2ecf20Sopenharmony_ci		bool b_enter_fwlps = *((bool *)val);
6568c2ecf20Sopenharmony_ci
6578c2ecf20Sopenharmony_ci		if (b_enter_fwlps)
6588c2ecf20Sopenharmony_ci			_rtl8723be_fwlps_enter(hw);
6598c2ecf20Sopenharmony_ci		else
6608c2ecf20Sopenharmony_ci			_rtl8723be_fwlps_leave(hw);
6618c2ecf20Sopenharmony_ci		}
6628c2ecf20Sopenharmony_ci		break;
6638c2ecf20Sopenharmony_ci	case HW_VAR_H2C_FW_JOINBSSRPT:{
6648c2ecf20Sopenharmony_ci		u8 mstatus = (*(u8 *)val);
6658c2ecf20Sopenharmony_ci
6668c2ecf20Sopenharmony_ci		if (mstatus == RT_MEDIA_CONNECT) {
6678c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
6688c2ecf20Sopenharmony_ci			_rtl8723be_download_rsvd_page(hw);
6698c2ecf20Sopenharmony_ci		}
6708c2ecf20Sopenharmony_ci		rtl8723be_set_fw_media_status_rpt_cmd(hw, mstatus);
6718c2ecf20Sopenharmony_ci		}
6728c2ecf20Sopenharmony_ci		break;
6738c2ecf20Sopenharmony_ci	case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
6748c2ecf20Sopenharmony_ci		rtl8723be_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
6758c2ecf20Sopenharmony_ci		break;
6768c2ecf20Sopenharmony_ci	case HW_VAR_AID:{
6778c2ecf20Sopenharmony_ci		u16 u2btmp;
6788c2ecf20Sopenharmony_ci		u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
6798c2ecf20Sopenharmony_ci		u2btmp &= 0xC000;
6808c2ecf20Sopenharmony_ci		rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
6818c2ecf20Sopenharmony_ci			       (u2btmp | mac->assoc_id));
6828c2ecf20Sopenharmony_ci		}
6838c2ecf20Sopenharmony_ci		break;
6848c2ecf20Sopenharmony_ci	case HW_VAR_CORRECT_TSF:{
6858c2ecf20Sopenharmony_ci		u8 btype_ibss = ((u8 *)(val))[0];
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci		if (btype_ibss)
6888c2ecf20Sopenharmony_ci			_rtl8723be_stop_tx_beacon(hw);
6898c2ecf20Sopenharmony_ci
6908c2ecf20Sopenharmony_ci		_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, REG_TSFTR,
6938c2ecf20Sopenharmony_ci				(u32) (mac->tsf & 0xffffffff));
6948c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, REG_TSFTR + 4,
6958c2ecf20Sopenharmony_ci				(u32) ((mac->tsf >> 32) & 0xffffffff));
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_ci		_rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
6988c2ecf20Sopenharmony_ci
6998c2ecf20Sopenharmony_ci		if (btype_ibss)
7008c2ecf20Sopenharmony_ci			_rtl8723be_resume_tx_beacon(hw);
7018c2ecf20Sopenharmony_ci		}
7028c2ecf20Sopenharmony_ci		break;
7038c2ecf20Sopenharmony_ci	case HW_VAR_KEEP_ALIVE:{
7048c2ecf20Sopenharmony_ci		u8 array[2];
7058c2ecf20Sopenharmony_ci		array[0] = 0xff;
7068c2ecf20Sopenharmony_ci		array[1] = *((u8 *)val);
7078c2ecf20Sopenharmony_ci		rtl8723be_fill_h2c_cmd(hw, H2C_8723B_KEEP_ALIVE_CTRL, 2, array);
7088c2ecf20Sopenharmony_ci		}
7098c2ecf20Sopenharmony_ci		break;
7108c2ecf20Sopenharmony_ci	default:
7118c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
7128c2ecf20Sopenharmony_ci			"switch case %#x not processed\n", variable);
7138c2ecf20Sopenharmony_ci		break;
7148c2ecf20Sopenharmony_ci	}
7158c2ecf20Sopenharmony_ci}
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_cistatic bool _rtl8723be_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
7188c2ecf20Sopenharmony_ci{
7198c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
7208c2ecf20Sopenharmony_ci	bool status = true;
7218c2ecf20Sopenharmony_ci	long count = 0;
7228c2ecf20Sopenharmony_ci	u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
7238c2ecf20Sopenharmony_ci		    _LLT_OP(_LLT_WRITE_ACCESS);
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
7268c2ecf20Sopenharmony_ci
7278c2ecf20Sopenharmony_ci	do {
7288c2ecf20Sopenharmony_ci		value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
7298c2ecf20Sopenharmony_ci		if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
7308c2ecf20Sopenharmony_ci			break;
7318c2ecf20Sopenharmony_ci
7328c2ecf20Sopenharmony_ci		if (count > POLLING_LLT_THRESHOLD) {
7338c2ecf20Sopenharmony_ci			pr_err("Failed to polling write LLT done at address %d!\n",
7348c2ecf20Sopenharmony_ci			       address);
7358c2ecf20Sopenharmony_ci			status = false;
7368c2ecf20Sopenharmony_ci			break;
7378c2ecf20Sopenharmony_ci		}
7388c2ecf20Sopenharmony_ci	} while (++count);
7398c2ecf20Sopenharmony_ci
7408c2ecf20Sopenharmony_ci	return status;
7418c2ecf20Sopenharmony_ci}
7428c2ecf20Sopenharmony_ci
7438c2ecf20Sopenharmony_cistatic bool _rtl8723be_llt_table_init(struct ieee80211_hw *hw)
7448c2ecf20Sopenharmony_ci{
7458c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
7468c2ecf20Sopenharmony_ci	unsigned short i;
7478c2ecf20Sopenharmony_ci	u8 txpktbuf_bndy;
7488c2ecf20Sopenharmony_ci	u8 maxpage;
7498c2ecf20Sopenharmony_ci	bool status;
7508c2ecf20Sopenharmony_ci
7518c2ecf20Sopenharmony_ci	maxpage = 255;
7528c2ecf20Sopenharmony_ci	txpktbuf_bndy = 245;
7538c2ecf20Sopenharmony_ci
7548c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_TRXFF_BNDY,
7558c2ecf20Sopenharmony_ci			(0x27FF0000 | txpktbuf_bndy));
7568c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
7578c2ecf20Sopenharmony_ci
7588c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
7598c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
7608c2ecf20Sopenharmony_ci
7618c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
7628c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_PBP, 0x31);
7638c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
7648c2ecf20Sopenharmony_ci
7658c2ecf20Sopenharmony_ci	for (i = 0; i < (txpktbuf_bndy - 1); i++) {
7668c2ecf20Sopenharmony_ci		status = _rtl8723be_llt_write(hw, i, i + 1);
7678c2ecf20Sopenharmony_ci		if (!status)
7688c2ecf20Sopenharmony_ci			return status;
7698c2ecf20Sopenharmony_ci	}
7708c2ecf20Sopenharmony_ci
7718c2ecf20Sopenharmony_ci	status = _rtl8723be_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
7728c2ecf20Sopenharmony_ci
7738c2ecf20Sopenharmony_ci	if (!status)
7748c2ecf20Sopenharmony_ci		return status;
7758c2ecf20Sopenharmony_ci
7768c2ecf20Sopenharmony_ci	for (i = txpktbuf_bndy; i < maxpage; i++) {
7778c2ecf20Sopenharmony_ci		status = _rtl8723be_llt_write(hw, i, (i + 1));
7788c2ecf20Sopenharmony_ci		if (!status)
7798c2ecf20Sopenharmony_ci			return status;
7808c2ecf20Sopenharmony_ci	}
7818c2ecf20Sopenharmony_ci
7828c2ecf20Sopenharmony_ci	status = _rtl8723be_llt_write(hw, maxpage, txpktbuf_bndy);
7838c2ecf20Sopenharmony_ci	if (!status)
7848c2ecf20Sopenharmony_ci		return status;
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RQPN, 0x80e40808);
7878c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
7888c2ecf20Sopenharmony_ci
7898c2ecf20Sopenharmony_ci	return true;
7908c2ecf20Sopenharmony_ci}
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_cistatic void _rtl8723be_gen_refresh_led_state(struct ieee80211_hw *hw)
7938c2ecf20Sopenharmony_ci{
7948c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
7958c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
7968c2ecf20Sopenharmony_ci	struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
7978c2ecf20Sopenharmony_ci
7988c2ecf20Sopenharmony_ci	if (rtlpriv->rtlhal.up_first_time)
7998c2ecf20Sopenharmony_ci		return;
8008c2ecf20Sopenharmony_ci
8018c2ecf20Sopenharmony_ci	if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
8028c2ecf20Sopenharmony_ci		rtl8723be_sw_led_on(hw, pled0);
8038c2ecf20Sopenharmony_ci	else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
8048c2ecf20Sopenharmony_ci		rtl8723be_sw_led_on(hw, pled0);
8058c2ecf20Sopenharmony_ci	else
8068c2ecf20Sopenharmony_ci		rtl8723be_sw_led_off(hw, pled0);
8078c2ecf20Sopenharmony_ci}
8088c2ecf20Sopenharmony_ci
8098c2ecf20Sopenharmony_cistatic bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
8108c2ecf20Sopenharmony_ci{
8118c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
8128c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
8138c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
8148c2ecf20Sopenharmony_ci	unsigned char bytetmp;
8158c2ecf20Sopenharmony_ci	unsigned short wordtmp;
8168c2ecf20Sopenharmony_ci
8178c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
8188c2ecf20Sopenharmony_ci
8198c2ecf20Sopenharmony_ci	/*Auto Power Down to CHIP-off State*/
8208c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
8218c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
8228c2ecf20Sopenharmony_ci
8238c2ecf20Sopenharmony_ci	/* HW Power on sequence */
8248c2ecf20Sopenharmony_ci	if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
8258c2ecf20Sopenharmony_ci				      PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
8268c2ecf20Sopenharmony_ci				      RTL8723_NIC_ENABLE_FLOW)) {
8278c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
8288c2ecf20Sopenharmony_ci			"init MAC Fail as power on failure\n");
8298c2ecf20Sopenharmony_ci		return false;
8308c2ecf20Sopenharmony_ci	}
8318c2ecf20Sopenharmony_ci
8328c2ecf20Sopenharmony_ci	if (rtlpriv->cfg->ops->get_btc_status())
8338c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_ops->btc_power_on_setting(rtlpriv);
8348c2ecf20Sopenharmony_ci
8358c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_MULTI_FUNC_CTRL);
8368c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_MULTI_FUNC_CTRL, bytetmp | BIT(3));
8378c2ecf20Sopenharmony_ci
8388c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
8398c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
8408c2ecf20Sopenharmony_ci
8418c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_CR);
8428c2ecf20Sopenharmony_ci	bytetmp = 0xff;
8438c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_CR, bytetmp);
8448c2ecf20Sopenharmony_ci	mdelay(2);
8458c2ecf20Sopenharmony_ci
8468c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_HWSEQ_CTRL);
8478c2ecf20Sopenharmony_ci	bytetmp |= 0x7f;
8488c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
8498c2ecf20Sopenharmony_ci	mdelay(2);
8508c2ecf20Sopenharmony_ci
8518c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
8528c2ecf20Sopenharmony_ci	if (bytetmp & BIT(0)) {
8538c2ecf20Sopenharmony_ci		bytetmp = rtl_read_byte(rtlpriv, 0x7c);
8548c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x7c, bytetmp | BIT(6));
8558c2ecf20Sopenharmony_ci	}
8568c2ecf20Sopenharmony_ci
8578c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
8588c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3));
8598c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
8608c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4)));
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_CR, 0x2ff);
8638c2ecf20Sopenharmony_ci
8648c2ecf20Sopenharmony_ci	if (!rtlhal->mac_func_enable) {
8658c2ecf20Sopenharmony_ci		if (!_rtl8723be_llt_table_init(hw))
8668c2ecf20Sopenharmony_ci			return false;
8678c2ecf20Sopenharmony_ci	}
8688c2ecf20Sopenharmony_ci
8698c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
8708c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
8718c2ecf20Sopenharmony_ci
8728c2ecf20Sopenharmony_ci	/* Enable FW Beamformer Interrupt */
8738c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
8748c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_ci	wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
8778c2ecf20Sopenharmony_ci	wordtmp &= 0xf;
8788c2ecf20Sopenharmony_ci	wordtmp |= 0xF5B1;
8798c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
8808c2ecf20Sopenharmony_ci
8818c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
8828c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
8838c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
8848c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
8858c2ecf20Sopenharmony_ci
8868c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
8878c2ecf20Sopenharmony_ci			((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) &
8888c2ecf20Sopenharmony_ci			DMA_BIT_MASK(32));
8898c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_MGQ_DESA,
8908c2ecf20Sopenharmony_ci			(u64) rtlpci->tx_ring[MGNT_QUEUE].dma &
8918c2ecf20Sopenharmony_ci			DMA_BIT_MASK(32));
8928c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_VOQ_DESA,
8938c2ecf20Sopenharmony_ci			(u64) rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
8948c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_VIQ_DESA,
8958c2ecf20Sopenharmony_ci			(u64) rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
8968c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_BEQ_DESA,
8978c2ecf20Sopenharmony_ci			(u64) rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
8988c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_BKQ_DESA,
8998c2ecf20Sopenharmony_ci			(u64) rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
9008c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HQ_DESA,
9018c2ecf20Sopenharmony_ci			(u64) rtlpci->tx_ring[HIGH_QUEUE].dma &
9028c2ecf20Sopenharmony_ci			DMA_BIT_MASK(32));
9038c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RX_DESA,
9048c2ecf20Sopenharmony_ci			(u64) rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
9058c2ecf20Sopenharmony_ci			DMA_BIT_MASK(32));
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 3);
9088c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, bytetmp | 0x77);
9098c2ecf20Sopenharmony_ci
9108c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
9118c2ecf20Sopenharmony_ci
9128c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
9138c2ecf20Sopenharmony_ci
9148c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
9158c2ecf20Sopenharmony_ci
9168c2ecf20Sopenharmony_ci	/* <20130114, Kordan> The following setting is
9178c2ecf20Sopenharmony_ci	 * only for DPDT and Fixed board type.
9188c2ecf20Sopenharmony_ci	 * TODO:  A better solution is configure it
9198c2ecf20Sopenharmony_ci	 * according EFUSE during the run-time.
9208c2ecf20Sopenharmony_ci	 */
9218c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x64, BIT(20), 0x0);/* 0x66[4]=0 */
9228c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x64, BIT(24), 0x0);/* 0x66[8]=0 */
9238c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x40, BIT(4), 0x0)/* 0x40[4]=0 */;
9248c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x40, BIT(3), 0x1)/* 0x40[3]=1 */;
9258c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x4C, BIT(24) | BIT(23), 0x2)/* 0x4C[24:23]=10 */;
9268c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x944, BIT(1) | BIT(0), 0x3)/* 0x944[1:0]=11 */;
9278c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x930, MASKBYTE0, 0x77)/* 0x930[7:0]=77 */;
9288c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x38, BIT(11), 0x1)/* 0x38[11]=1 */;
9298c2ecf20Sopenharmony_ci
9308c2ecf20Sopenharmony_ci	bytetmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
9318c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, bytetmp & (~BIT(2)));
9328c2ecf20Sopenharmony_ci
9338c2ecf20Sopenharmony_ci	_rtl8723be_gen_refresh_led_state(hw);
9348c2ecf20Sopenharmony_ci	return true;
9358c2ecf20Sopenharmony_ci}
9368c2ecf20Sopenharmony_ci
9378c2ecf20Sopenharmony_cistatic void _rtl8723be_hw_configure(struct ieee80211_hw *hw)
9388c2ecf20Sopenharmony_ci{
9398c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
9408c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9418c2ecf20Sopenharmony_ci	u32 reg_rrsr;
9428c2ecf20Sopenharmony_ci
9438c2ecf20Sopenharmony_ci	reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
9448c2ecf20Sopenharmony_ci	/* Init value for RRSR. */
9458c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
9468c2ecf20Sopenharmony_ci
9478c2ecf20Sopenharmony_ci	/* ARFB table 9 for 11ac 5G 2SS */
9488c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
9498c2ecf20Sopenharmony_ci
9508c2ecf20Sopenharmony_ci	/* ARFB table 10 for 11ac 5G 1SS */
9518c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
9528c2ecf20Sopenharmony_ci
9538c2ecf20Sopenharmony_ci	/* CF-End setting. */
9548c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
9558c2ecf20Sopenharmony_ci
9568c2ecf20Sopenharmony_ci	/* 0x456 = 0x70, sugguested by Zhilin */
9578c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
9588c2ecf20Sopenharmony_ci
9598c2ecf20Sopenharmony_ci	/* Set retry limit */
9608c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_RL, 0x0707);
9618c2ecf20Sopenharmony_ci
9628c2ecf20Sopenharmony_ci	/* Set Data / Response auto rate fallack retry count */
9638c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
9648c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
9658c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
9668c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
9678c2ecf20Sopenharmony_ci
9688c2ecf20Sopenharmony_ci	rtlpci->reg_bcn_ctrl_val = 0x1d;
9698c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
9708c2ecf20Sopenharmony_ci
9718c2ecf20Sopenharmony_ci	/* TBTT prohibit hold time. Suggested by designer TimChen. */
9728c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */
9738c2ecf20Sopenharmony_ci
9748c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
9758c2ecf20Sopenharmony_ci
9768c2ecf20Sopenharmony_ci	/*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
9778c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
9788c2ecf20Sopenharmony_ci
9798c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
9808c2ecf20Sopenharmony_ci
9818c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
9828c2ecf20Sopenharmony_ci
9838c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x1F);
9848c2ecf20Sopenharmony_ci}
9858c2ecf20Sopenharmony_ci
9868c2ecf20Sopenharmony_cistatic u8 _rtl8723be_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
9878c2ecf20Sopenharmony_ci{
9888c2ecf20Sopenharmony_ci	u16 read_addr = addr & 0xfffc;
9898c2ecf20Sopenharmony_ci	u8 ret = 0, tmp = 0, count = 0;
9908c2ecf20Sopenharmony_ci
9918c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
9928c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
9938c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
9948c2ecf20Sopenharmony_ci	count = 0;
9958c2ecf20Sopenharmony_ci	while (tmp && count < 20) {
9968c2ecf20Sopenharmony_ci		udelay(10);
9978c2ecf20Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
9988c2ecf20Sopenharmony_ci		count++;
9998c2ecf20Sopenharmony_ci	}
10008c2ecf20Sopenharmony_ci	if (0 == tmp) {
10018c2ecf20Sopenharmony_ci		read_addr = REG_DBI_RDATA + addr % 4;
10028c2ecf20Sopenharmony_ci		ret = rtl_read_byte(rtlpriv, read_addr);
10038c2ecf20Sopenharmony_ci	}
10048c2ecf20Sopenharmony_ci
10058c2ecf20Sopenharmony_ci	return ret;
10068c2ecf20Sopenharmony_ci}
10078c2ecf20Sopenharmony_ci
10088c2ecf20Sopenharmony_cistatic void _rtl8723be_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
10098c2ecf20Sopenharmony_ci{
10108c2ecf20Sopenharmony_ci	u8 tmp = 0, count = 0;
10118c2ecf20Sopenharmony_ci	u16 write_addr = 0, remainder = addr % 4;
10128c2ecf20Sopenharmony_ci
10138c2ecf20Sopenharmony_ci	/* Write DBI 1Byte Data */
10148c2ecf20Sopenharmony_ci	write_addr = REG_DBI_WDATA + remainder;
10158c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, write_addr, data);
10168c2ecf20Sopenharmony_ci
10178c2ecf20Sopenharmony_ci	/* Write DBI 2Byte Address & Write Enable */
10188c2ecf20Sopenharmony_ci	write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
10198c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr);
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	/* Write DBI Write Flag */
10228c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
10238c2ecf20Sopenharmony_ci
10248c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
10258c2ecf20Sopenharmony_ci	count = 0;
10268c2ecf20Sopenharmony_ci	while (tmp && count < 20) {
10278c2ecf20Sopenharmony_ci		udelay(10);
10288c2ecf20Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
10298c2ecf20Sopenharmony_ci		count++;
10308c2ecf20Sopenharmony_ci	}
10318c2ecf20Sopenharmony_ci}
10328c2ecf20Sopenharmony_ci
10338c2ecf20Sopenharmony_cistatic u16 _rtl8723be_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
10348c2ecf20Sopenharmony_ci{
10358c2ecf20Sopenharmony_ci	u16 ret = 0;
10368c2ecf20Sopenharmony_ci	u8 tmp = 0, count = 0;
10378c2ecf20Sopenharmony_ci
10388c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
10398c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
10408c2ecf20Sopenharmony_ci	count = 0;
10418c2ecf20Sopenharmony_ci	while (tmp && count < 20) {
10428c2ecf20Sopenharmony_ci		udelay(10);
10438c2ecf20Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
10448c2ecf20Sopenharmony_ci		count++;
10458c2ecf20Sopenharmony_ci	}
10468c2ecf20Sopenharmony_ci
10478c2ecf20Sopenharmony_ci	if (0 == tmp)
10488c2ecf20Sopenharmony_ci		ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
10498c2ecf20Sopenharmony_ci
10508c2ecf20Sopenharmony_ci	return ret;
10518c2ecf20Sopenharmony_ci}
10528c2ecf20Sopenharmony_ci
10538c2ecf20Sopenharmony_cistatic void _rtl8723be_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
10548c2ecf20Sopenharmony_ci{
10558c2ecf20Sopenharmony_ci	u8 tmp = 0, count = 0;
10568c2ecf20Sopenharmony_ci
10578c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
10588c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
10598c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
10608c2ecf20Sopenharmony_ci	count = 0;
10618c2ecf20Sopenharmony_ci	while (tmp && count < 20) {
10628c2ecf20Sopenharmony_ci		udelay(10);
10638c2ecf20Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
10648c2ecf20Sopenharmony_ci		count++;
10658c2ecf20Sopenharmony_ci	}
10668c2ecf20Sopenharmony_ci}
10678c2ecf20Sopenharmony_ci
10688c2ecf20Sopenharmony_cistatic void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw)
10698c2ecf20Sopenharmony_ci{
10708c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
10718c2ecf20Sopenharmony_ci	u8 tmp8 = 0;
10728c2ecf20Sopenharmony_ci	u16 tmp16 = 0;
10738c2ecf20Sopenharmony_ci
10748c2ecf20Sopenharmony_ci	/* <Roger_Notes> Overwrite following ePHY parameter for
10758c2ecf20Sopenharmony_ci	 * some platform compatibility issue,
10768c2ecf20Sopenharmony_ci	 * especially when CLKReq is enabled, 2012.11.09.
10778c2ecf20Sopenharmony_ci	 */
10788c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x01);
10798c2ecf20Sopenharmony_ci	if (tmp16 != 0x0663)
10808c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x01, 0x0663);
10818c2ecf20Sopenharmony_ci
10828c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x04);
10838c2ecf20Sopenharmony_ci	if (tmp16 != 0x7544)
10848c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x04, 0x7544);
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x06);
10878c2ecf20Sopenharmony_ci	if (tmp16 != 0xB880)
10888c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x06, 0xB880);
10898c2ecf20Sopenharmony_ci
10908c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x07);
10918c2ecf20Sopenharmony_ci	if (tmp16 != 0x4000)
10928c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x07, 0x4000);
10938c2ecf20Sopenharmony_ci
10948c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x08);
10958c2ecf20Sopenharmony_ci	if (tmp16 != 0x9003)
10968c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x08, 0x9003);
10978c2ecf20Sopenharmony_ci
10988c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x09);
10998c2ecf20Sopenharmony_ci	if (tmp16 != 0x0D03)
11008c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x09, 0x0D03);
11018c2ecf20Sopenharmony_ci
11028c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0A);
11038c2ecf20Sopenharmony_ci	if (tmp16 != 0x4037)
11048c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x0A, 0x4037);
11058c2ecf20Sopenharmony_ci
11068c2ecf20Sopenharmony_ci	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0B);
11078c2ecf20Sopenharmony_ci	if (tmp16 != 0x0070)
11088c2ecf20Sopenharmony_ci		_rtl8723be_mdio_write(rtlpriv, 0x0B, 0x0070);
11098c2ecf20Sopenharmony_ci
11108c2ecf20Sopenharmony_ci	/* Configuration Space offset 0x70f BIT7 is used to control L0S */
11118c2ecf20Sopenharmony_ci	tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x70f);
11128c2ecf20Sopenharmony_ci	_rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7) |
11138c2ecf20Sopenharmony_ci			     ASPM_L1_LATENCY << 3);
11148c2ecf20Sopenharmony_ci
11158c2ecf20Sopenharmony_ci	/* Configuration Space offset 0x719 Bit3 is for L1
11168c2ecf20Sopenharmony_ci	 * BIT4 is for clock request
11178c2ecf20Sopenharmony_ci	 */
11188c2ecf20Sopenharmony_ci	tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x719);
11198c2ecf20Sopenharmony_ci	_rtl8723be_dbi_write(rtlpriv, 0x719, tmp8 | BIT(3) | BIT(4));
11208c2ecf20Sopenharmony_ci}
11218c2ecf20Sopenharmony_ci
11228c2ecf20Sopenharmony_civoid rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw)
11238c2ecf20Sopenharmony_ci{
11248c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11258c2ecf20Sopenharmony_ci	u8 sec_reg_value;
11268c2ecf20Sopenharmony_ci
11278c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
11288c2ecf20Sopenharmony_ci		"PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
11298c2ecf20Sopenharmony_ci		rtlpriv->sec.pairwise_enc_algorithm,
11308c2ecf20Sopenharmony_ci		rtlpriv->sec.group_enc_algorithm);
11318c2ecf20Sopenharmony_ci
11328c2ecf20Sopenharmony_ci	if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
11338c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
11348c2ecf20Sopenharmony_ci			"not open hw encryption\n");
11358c2ecf20Sopenharmony_ci		return;
11368c2ecf20Sopenharmony_ci	}
11378c2ecf20Sopenharmony_ci
11388c2ecf20Sopenharmony_ci	sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
11398c2ecf20Sopenharmony_ci
11408c2ecf20Sopenharmony_ci	if (rtlpriv->sec.use_defaultkey) {
11418c2ecf20Sopenharmony_ci		sec_reg_value |= SCR_TXUSEDK;
11428c2ecf20Sopenharmony_ci		sec_reg_value |= SCR_RXUSEDK;
11438c2ecf20Sopenharmony_ci	}
11448c2ecf20Sopenharmony_ci
11458c2ecf20Sopenharmony_ci	sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
11468c2ecf20Sopenharmony_ci
11478c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
11488c2ecf20Sopenharmony_ci
11498c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
11508c2ecf20Sopenharmony_ci		"The SECR-value %x\n", sec_reg_value);
11518c2ecf20Sopenharmony_ci
11528c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
11538c2ecf20Sopenharmony_ci}
11548c2ecf20Sopenharmony_ci
11558c2ecf20Sopenharmony_cistatic void _rtl8723be_poweroff_adapter(struct ieee80211_hw *hw)
11568c2ecf20Sopenharmony_ci{
11578c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11588c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
11598c2ecf20Sopenharmony_ci	u8 u1b_tmp;
11608c2ecf20Sopenharmony_ci
11618c2ecf20Sopenharmony_ci	rtlhal->mac_func_enable = false;
11628c2ecf20Sopenharmony_ci	/* Combo (PCIe + USB) Card and PCIe-MF Card */
11638c2ecf20Sopenharmony_ci	/* 1. Run LPS WL RFOFF flow */
11648c2ecf20Sopenharmony_ci	rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
11658c2ecf20Sopenharmony_ci				 PWR_INTF_PCI_MSK, RTL8723_NIC_LPS_ENTER_FLOW);
11668c2ecf20Sopenharmony_ci
11678c2ecf20Sopenharmony_ci	/* 2. 0x1F[7:0] = 0 */
11688c2ecf20Sopenharmony_ci	/* turn off RF */
11698c2ecf20Sopenharmony_ci	/* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
11708c2ecf20Sopenharmony_ci	if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
11718c2ecf20Sopenharmony_ci	    rtlhal->fw_ready) {
11728c2ecf20Sopenharmony_ci		rtl8723be_firmware_selfreset(hw);
11738c2ecf20Sopenharmony_ci	}
11748c2ecf20Sopenharmony_ci
11758c2ecf20Sopenharmony_ci	/* Reset MCU. Suggested by Filen. */
11768c2ecf20Sopenharmony_ci	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
11778c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
11788c2ecf20Sopenharmony_ci
11798c2ecf20Sopenharmony_ci	/* g.	MCUFWDL 0x80[1:0]=0	 */
11808c2ecf20Sopenharmony_ci	/* reset MCU ready status */
11818c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
11828c2ecf20Sopenharmony_ci
11838c2ecf20Sopenharmony_ci	/* HW card disable configuration. */
11848c2ecf20Sopenharmony_ci	rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
11858c2ecf20Sopenharmony_ci				 PWR_INTF_PCI_MSK, RTL8723_NIC_DISABLE_FLOW);
11868c2ecf20Sopenharmony_ci
11878c2ecf20Sopenharmony_ci	/* Reset MCU IO Wrapper */
11888c2ecf20Sopenharmony_ci	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
11898c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
11908c2ecf20Sopenharmony_ci	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
11918c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
11928c2ecf20Sopenharmony_ci
11938c2ecf20Sopenharmony_ci	/* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
11948c2ecf20Sopenharmony_ci	/* lock ISO/CLK/Power control register */
11958c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
11968c2ecf20Sopenharmony_ci}
11978c2ecf20Sopenharmony_ci
11988c2ecf20Sopenharmony_cistatic bool _rtl8723be_check_pcie_dma_hang(struct rtl_priv *rtlpriv)
11998c2ecf20Sopenharmony_ci{
12008c2ecf20Sopenharmony_ci	u8 tmp;
12018c2ecf20Sopenharmony_ci
12028c2ecf20Sopenharmony_ci	/* write reg 0x350 Bit[26]=1. Enable debug port. */
12038c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
12048c2ecf20Sopenharmony_ci	if (!(tmp & BIT(2))) {
12058c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
12068c2ecf20Sopenharmony_ci		mdelay(100); /* Suggested by DD Justin_tsai. */
12078c2ecf20Sopenharmony_ci	}
12088c2ecf20Sopenharmony_ci
12098c2ecf20Sopenharmony_ci	/* read reg 0x350 Bit[25] if 1 : RX hang
12108c2ecf20Sopenharmony_ci	 * read reg 0x350 Bit[24] if 1 : TX hang
12118c2ecf20Sopenharmony_ci	 */
12128c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
12138c2ecf20Sopenharmony_ci	if ((tmp & BIT(0)) || (tmp & BIT(1))) {
12148c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
12158c2ecf20Sopenharmony_ci			"CheckPcieDMAHang8723BE(): true!!\n");
12168c2ecf20Sopenharmony_ci		return true;
12178c2ecf20Sopenharmony_ci	}
12188c2ecf20Sopenharmony_ci	return false;
12198c2ecf20Sopenharmony_ci}
12208c2ecf20Sopenharmony_ci
12218c2ecf20Sopenharmony_cistatic void _rtl8723be_reset_pcie_interface_dma(struct rtl_priv *rtlpriv,
12228c2ecf20Sopenharmony_ci						bool mac_power_on)
12238c2ecf20Sopenharmony_ci{
12248c2ecf20Sopenharmony_ci	u8 tmp;
12258c2ecf20Sopenharmony_ci	bool release_mac_rx_pause;
12268c2ecf20Sopenharmony_ci	u8 backup_pcie_dma_pause;
12278c2ecf20Sopenharmony_ci
12288c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
12298c2ecf20Sopenharmony_ci		"ResetPcieInterfaceDMA8723BE()\n");
12308c2ecf20Sopenharmony_ci
12318c2ecf20Sopenharmony_ci	/* Revise Note: Follow the document "PCIe RX DMA Hang Reset Flow_v03"
12328c2ecf20Sopenharmony_ci	 * released by SD1 Alan.
12338c2ecf20Sopenharmony_ci	 * 2013.05.07, by tynli.
12348c2ecf20Sopenharmony_ci	 */
12358c2ecf20Sopenharmony_ci
12368c2ecf20Sopenharmony_ci	/* 1. disable register write lock
12378c2ecf20Sopenharmony_ci	 *	write 0x1C bit[1:0] = 2'h0
12388c2ecf20Sopenharmony_ci	 *	write 0xCC bit[2] = 1'b1
12398c2ecf20Sopenharmony_ci	 */
12408c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
12418c2ecf20Sopenharmony_ci	tmp &= ~(BIT(1) | BIT(0));
12428c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
12438c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
12448c2ecf20Sopenharmony_ci	tmp |= BIT(2);
12458c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
12468c2ecf20Sopenharmony_ci
12478c2ecf20Sopenharmony_ci	/* 2. Check and pause TRX DMA
12488c2ecf20Sopenharmony_ci	 *	write 0x284 bit[18] = 1'b1
12498c2ecf20Sopenharmony_ci	 *	write 0x301 = 0xFF
12508c2ecf20Sopenharmony_ci	 */
12518c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
12528c2ecf20Sopenharmony_ci	if (tmp & BIT(2)) {
12538c2ecf20Sopenharmony_ci		/* Already pause before the function for another purpose. */
12548c2ecf20Sopenharmony_ci		release_mac_rx_pause = false;
12558c2ecf20Sopenharmony_ci	} else {
12568c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
12578c2ecf20Sopenharmony_ci		release_mac_rx_pause = true;
12588c2ecf20Sopenharmony_ci	}
12598c2ecf20Sopenharmony_ci
12608c2ecf20Sopenharmony_ci	backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
12618c2ecf20Sopenharmony_ci	if (backup_pcie_dma_pause != 0xFF)
12628c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
12638c2ecf20Sopenharmony_ci
12648c2ecf20Sopenharmony_ci	if (mac_power_on) {
12658c2ecf20Sopenharmony_ci		/* 3. reset TRX function
12668c2ecf20Sopenharmony_ci		 *	write 0x100 = 0x00
12678c2ecf20Sopenharmony_ci		 */
12688c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_CR, 0);
12698c2ecf20Sopenharmony_ci	}
12708c2ecf20Sopenharmony_ci
12718c2ecf20Sopenharmony_ci	/* 4. Reset PCIe DMA
12728c2ecf20Sopenharmony_ci	 *	write 0x003 bit[0] = 0
12738c2ecf20Sopenharmony_ci	 */
12748c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
12758c2ecf20Sopenharmony_ci	tmp &= ~(BIT(0));
12768c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
12778c2ecf20Sopenharmony_ci
12788c2ecf20Sopenharmony_ci	/* 5. Enable PCIe DMA
12798c2ecf20Sopenharmony_ci	 *	write 0x003 bit[0] = 1
12808c2ecf20Sopenharmony_ci	 */
12818c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
12828c2ecf20Sopenharmony_ci	tmp |= BIT(0);
12838c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
12848c2ecf20Sopenharmony_ci
12858c2ecf20Sopenharmony_ci	if (mac_power_on) {
12868c2ecf20Sopenharmony_ci		/* 6. enable TRX function
12878c2ecf20Sopenharmony_ci		 *	write 0x100 = 0xFF
12888c2ecf20Sopenharmony_ci		 */
12898c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_CR, 0xFF);
12908c2ecf20Sopenharmony_ci
12918c2ecf20Sopenharmony_ci		/* We should init LLT & RQPN and
12928c2ecf20Sopenharmony_ci		 * prepare Tx/Rx descrptor address later
12938c2ecf20Sopenharmony_ci		 * because MAC function is reset.
12948c2ecf20Sopenharmony_ci		 */
12958c2ecf20Sopenharmony_ci	}
12968c2ecf20Sopenharmony_ci
12978c2ecf20Sopenharmony_ci	/* 7. Restore PCIe autoload down bit
12988c2ecf20Sopenharmony_ci	 *	write 0xF8 bit[17] = 1'b1
12998c2ecf20Sopenharmony_ci	 */
13008c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
13018c2ecf20Sopenharmony_ci	tmp |= BIT(1);
13028c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
13038c2ecf20Sopenharmony_ci
13048c2ecf20Sopenharmony_ci	/* In MAC power on state, BB and RF maybe in ON state,
13058c2ecf20Sopenharmony_ci	 * if we release TRx DMA here
13068c2ecf20Sopenharmony_ci	 * it will cause packets to be started to Tx/Rx,
13078c2ecf20Sopenharmony_ci	 * so we release Tx/Rx DMA later.
13088c2ecf20Sopenharmony_ci	 */
13098c2ecf20Sopenharmony_ci	if (!mac_power_on) {
13108c2ecf20Sopenharmony_ci		/* 8. release TRX DMA
13118c2ecf20Sopenharmony_ci		 *	write 0x284 bit[18] = 1'b0
13128c2ecf20Sopenharmony_ci		 *	write 0x301 = 0x00
13138c2ecf20Sopenharmony_ci		 */
13148c2ecf20Sopenharmony_ci		if (release_mac_rx_pause) {
13158c2ecf20Sopenharmony_ci			tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
13168c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
13178c2ecf20Sopenharmony_ci				       (tmp & (~BIT(2))));
13188c2ecf20Sopenharmony_ci		}
13198c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
13208c2ecf20Sopenharmony_ci			       backup_pcie_dma_pause);
13218c2ecf20Sopenharmony_ci	}
13228c2ecf20Sopenharmony_ci
13238c2ecf20Sopenharmony_ci	/* 9. lock system register
13248c2ecf20Sopenharmony_ci	 *	write 0xCC bit[2] = 1'b0
13258c2ecf20Sopenharmony_ci	 */
13268c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
13278c2ecf20Sopenharmony_ci	tmp &= ~(BIT(2));
13288c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
13298c2ecf20Sopenharmony_ci}
13308c2ecf20Sopenharmony_ci
13318c2ecf20Sopenharmony_ciint rtl8723be_hw_init(struct ieee80211_hw *hw)
13328c2ecf20Sopenharmony_ci{
13338c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
13348c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
13358c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
13368c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
13378c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
13388c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
13398c2ecf20Sopenharmony_ci	bool rtstatus = true;
13408c2ecf20Sopenharmony_ci	int err;
13418c2ecf20Sopenharmony_ci	u8 tmp_u1b;
13428c2ecf20Sopenharmony_ci	unsigned long flags;
13438c2ecf20Sopenharmony_ci
13448c2ecf20Sopenharmony_ci	/* reenable interrupts to not interfere with other devices */
13458c2ecf20Sopenharmony_ci	local_save_flags(flags);
13468c2ecf20Sopenharmony_ci	local_irq_enable();
13478c2ecf20Sopenharmony_ci
13488c2ecf20Sopenharmony_ci	rtlhal->fw_ready = false;
13498c2ecf20Sopenharmony_ci	rtlpriv->rtlhal.being_init_adapter = true;
13508c2ecf20Sopenharmony_ci	rtlpriv->intf_ops->disable_aspm(hw);
13518c2ecf20Sopenharmony_ci
13528c2ecf20Sopenharmony_ci	tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
13538c2ecf20Sopenharmony_ci	if (tmp_u1b != 0 && tmp_u1b != 0xea) {
13548c2ecf20Sopenharmony_ci		rtlhal->mac_func_enable = true;
13558c2ecf20Sopenharmony_ci	} else {
13568c2ecf20Sopenharmony_ci		rtlhal->mac_func_enable = false;
13578c2ecf20Sopenharmony_ci		rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON;
13588c2ecf20Sopenharmony_ci	}
13598c2ecf20Sopenharmony_ci
13608c2ecf20Sopenharmony_ci	if (_rtl8723be_check_pcie_dma_hang(rtlpriv)) {
13618c2ecf20Sopenharmony_ci		_rtl8723be_reset_pcie_interface_dma(rtlpriv,
13628c2ecf20Sopenharmony_ci						    rtlhal->mac_func_enable);
13638c2ecf20Sopenharmony_ci		rtlhal->mac_func_enable = false;
13648c2ecf20Sopenharmony_ci	}
13658c2ecf20Sopenharmony_ci	if (rtlhal->mac_func_enable) {
13668c2ecf20Sopenharmony_ci		_rtl8723be_poweroff_adapter(hw);
13678c2ecf20Sopenharmony_ci		rtlhal->mac_func_enable = false;
13688c2ecf20Sopenharmony_ci	}
13698c2ecf20Sopenharmony_ci	rtstatus = _rtl8723be_init_mac(hw);
13708c2ecf20Sopenharmony_ci	if (!rtstatus) {
13718c2ecf20Sopenharmony_ci		pr_err("Init MAC failed\n");
13728c2ecf20Sopenharmony_ci		err = 1;
13738c2ecf20Sopenharmony_ci		goto exit;
13748c2ecf20Sopenharmony_ci	}
13758c2ecf20Sopenharmony_ci
13768c2ecf20Sopenharmony_ci	tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
13778c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b & 0x7F);
13788c2ecf20Sopenharmony_ci
13798c2ecf20Sopenharmony_ci	err = rtl8723_download_fw(hw, true, FW_8723B_POLLING_TIMEOUT_COUNT);
13808c2ecf20Sopenharmony_ci	if (err) {
13818c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
13828c2ecf20Sopenharmony_ci			"Failed to download FW. Init HW without FW now..\n");
13838c2ecf20Sopenharmony_ci		err = 1;
13848c2ecf20Sopenharmony_ci		goto exit;
13858c2ecf20Sopenharmony_ci	}
13868c2ecf20Sopenharmony_ci	rtlhal->fw_ready = true;
13878c2ecf20Sopenharmony_ci
13888c2ecf20Sopenharmony_ci	rtlhal->last_hmeboxnum = 0;
13898c2ecf20Sopenharmony_ci	rtl8723be_phy_mac_config(hw);
13908c2ecf20Sopenharmony_ci	/* because last function modify RCR, so we update
13918c2ecf20Sopenharmony_ci	 * rcr var here, or TP will unstable for receive_config
13928c2ecf20Sopenharmony_ci	 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx
13938c2ecf20Sopenharmony_ci	 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
13948c2ecf20Sopenharmony_ci	 */
13958c2ecf20Sopenharmony_ci	rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
13968c2ecf20Sopenharmony_ci	rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
13978c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
13988c2ecf20Sopenharmony_ci
13998c2ecf20Sopenharmony_ci	rtl8723be_phy_bb_config(hw);
14008c2ecf20Sopenharmony_ci	rtl8723be_phy_rf_config(hw);
14018c2ecf20Sopenharmony_ci
14028c2ecf20Sopenharmony_ci	rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
14038c2ecf20Sopenharmony_ci						 RF_CHNLBW, RFREG_OFFSET_MASK);
14048c2ecf20Sopenharmony_ci	rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, (enum radio_path)1,
14058c2ecf20Sopenharmony_ci						 RF_CHNLBW, RFREG_OFFSET_MASK);
14068c2ecf20Sopenharmony_ci	rtlphy->rfreg_chnlval[0] &= 0xFFF03FF;
14078c2ecf20Sopenharmony_ci	rtlphy->rfreg_chnlval[0] |= (BIT(10) | BIT(11));
14088c2ecf20Sopenharmony_ci
14098c2ecf20Sopenharmony_ci	_rtl8723be_hw_configure(hw);
14108c2ecf20Sopenharmony_ci	rtlhal->mac_func_enable = true;
14118c2ecf20Sopenharmony_ci	rtl_cam_reset_all_entry(hw);
14128c2ecf20Sopenharmony_ci	rtl8723be_enable_hw_security_config(hw);
14138c2ecf20Sopenharmony_ci
14148c2ecf20Sopenharmony_ci	ppsc->rfpwr_state = ERFON;
14158c2ecf20Sopenharmony_ci
14168c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
14178c2ecf20Sopenharmony_ci	_rtl8723be_enable_aspm_back_door(hw);
14188c2ecf20Sopenharmony_ci	rtlpriv->intf_ops->enable_aspm(hw);
14198c2ecf20Sopenharmony_ci
14208c2ecf20Sopenharmony_ci	rtl8723be_bt_hw_init(hw);
14218c2ecf20Sopenharmony_ci
14228c2ecf20Sopenharmony_ci	if (ppsc->rfpwr_state == ERFON) {
14238c2ecf20Sopenharmony_ci		rtl8723be_phy_set_rfpath_switch(hw, 1);
14248c2ecf20Sopenharmony_ci		/* when use 1ant NIC, iqk will disturb BT music
14258c2ecf20Sopenharmony_ci		 * root cause is not clear now, is something
14268c2ecf20Sopenharmony_ci		 * related with 'mdelay' and Reg[0x948]
14278c2ecf20Sopenharmony_ci		 */
14288c2ecf20Sopenharmony_ci		if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2 ||
14298c2ecf20Sopenharmony_ci		    !rtlpriv->cfg->ops->get_btc_status()) {
14308c2ecf20Sopenharmony_ci			rtl8723be_phy_iq_calibrate(hw,
14318c2ecf20Sopenharmony_ci						   (rtlphy->iqk_initialized ?
14328c2ecf20Sopenharmony_ci						    true : false));
14338c2ecf20Sopenharmony_ci			rtlphy->iqk_initialized = true;
14348c2ecf20Sopenharmony_ci		}
14358c2ecf20Sopenharmony_ci		rtl8723be_dm_check_txpower_tracking(hw);
14368c2ecf20Sopenharmony_ci		rtl8723be_phy_lc_calibrate(hw);
14378c2ecf20Sopenharmony_ci	}
14388c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128));
14398c2ecf20Sopenharmony_ci
14408c2ecf20Sopenharmony_ci	/* Release Rx DMA. */
14418c2ecf20Sopenharmony_ci	tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
14428c2ecf20Sopenharmony_ci	if (tmp_u1b & BIT(2)) {
14438c2ecf20Sopenharmony_ci		/* Release Rx DMA if needed */
14448c2ecf20Sopenharmony_ci		tmp_u1b &= (~BIT(2));
14458c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
14468c2ecf20Sopenharmony_ci	}
14478c2ecf20Sopenharmony_ci	/* Release Tx/Rx PCIE DMA. */
14488c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
14498c2ecf20Sopenharmony_ci
14508c2ecf20Sopenharmony_ci	rtl8723be_dm_init(hw);
14518c2ecf20Sopenharmony_ciexit:
14528c2ecf20Sopenharmony_ci	local_irq_restore(flags);
14538c2ecf20Sopenharmony_ci	rtlpriv->rtlhal.being_init_adapter = false;
14548c2ecf20Sopenharmony_ci	return err;
14558c2ecf20Sopenharmony_ci}
14568c2ecf20Sopenharmony_ci
14578c2ecf20Sopenharmony_cistatic enum version_8723e _rtl8723be_read_chip_version(struct ieee80211_hw *hw)
14588c2ecf20Sopenharmony_ci{
14598c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
14608c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
14618c2ecf20Sopenharmony_ci	enum version_8723e version = VERSION_UNKNOWN;
14628c2ecf20Sopenharmony_ci	u32 value32;
14638c2ecf20Sopenharmony_ci
14648c2ecf20Sopenharmony_ci	value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
14658c2ecf20Sopenharmony_ci	if ((value32 & (CHIP_8723B)) != CHIP_8723B)
14668c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "unknown chip version\n");
14678c2ecf20Sopenharmony_ci	else
14688c2ecf20Sopenharmony_ci		version = (enum version_8723e)CHIP_8723B;
14698c2ecf20Sopenharmony_ci
14708c2ecf20Sopenharmony_ci	rtlphy->rf_type = RF_1T1R;
14718c2ecf20Sopenharmony_ci
14728c2ecf20Sopenharmony_ci	/* treat rtl8723be chip as  MP version in default */
14738c2ecf20Sopenharmony_ci	version = (enum version_8723e)(version | NORMAL_CHIP);
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_ci	value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
14768c2ecf20Sopenharmony_ci	/* cut version */
14778c2ecf20Sopenharmony_ci	version |= (enum version_8723e)(value32 & CHIP_VER_RTL_MASK);
14788c2ecf20Sopenharmony_ci	/* Manufacture */
14798c2ecf20Sopenharmony_ci	if (((value32 & EXT_VENDOR_ID) >> 18) == 0x01)
14808c2ecf20Sopenharmony_ci		version = (enum version_8723e)(version | CHIP_VENDOR_SMIC);
14818c2ecf20Sopenharmony_ci
14828c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
14838c2ecf20Sopenharmony_ci		"Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
14848c2ecf20Sopenharmony_ci		"RF_2T2R" : "RF_1T1R");
14858c2ecf20Sopenharmony_ci
14868c2ecf20Sopenharmony_ci	return version;
14878c2ecf20Sopenharmony_ci}
14888c2ecf20Sopenharmony_ci
14898c2ecf20Sopenharmony_cistatic int _rtl8723be_set_media_status(struct ieee80211_hw *hw,
14908c2ecf20Sopenharmony_ci				       enum nl80211_iftype type)
14918c2ecf20Sopenharmony_ci{
14928c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
14938c2ecf20Sopenharmony_ci	u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
14948c2ecf20Sopenharmony_ci	enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
14958c2ecf20Sopenharmony_ci	u8 mode = MSR_NOLINK;
14968c2ecf20Sopenharmony_ci
14978c2ecf20Sopenharmony_ci	switch (type) {
14988c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_UNSPECIFIED:
14998c2ecf20Sopenharmony_ci		mode = MSR_NOLINK;
15008c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
15018c2ecf20Sopenharmony_ci			"Set Network type to NO LINK!\n");
15028c2ecf20Sopenharmony_ci		break;
15038c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_ADHOC:
15048c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_MESH_POINT:
15058c2ecf20Sopenharmony_ci		mode = MSR_ADHOC;
15068c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
15078c2ecf20Sopenharmony_ci			"Set Network type to Ad Hoc!\n");
15088c2ecf20Sopenharmony_ci		break;
15098c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_STATION:
15108c2ecf20Sopenharmony_ci		mode = MSR_INFRA;
15118c2ecf20Sopenharmony_ci		ledaction = LED_CTL_LINK;
15128c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
15138c2ecf20Sopenharmony_ci			"Set Network type to STA!\n");
15148c2ecf20Sopenharmony_ci		break;
15158c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_AP:
15168c2ecf20Sopenharmony_ci		mode = MSR_AP;
15178c2ecf20Sopenharmony_ci		ledaction = LED_CTL_LINK;
15188c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
15198c2ecf20Sopenharmony_ci			"Set Network type to AP!\n");
15208c2ecf20Sopenharmony_ci		break;
15218c2ecf20Sopenharmony_ci	default:
15228c2ecf20Sopenharmony_ci		pr_err("Network type %d not support!\n", type);
15238c2ecf20Sopenharmony_ci		return 1;
15248c2ecf20Sopenharmony_ci	}
15258c2ecf20Sopenharmony_ci
15268c2ecf20Sopenharmony_ci	/* MSR_INFRA == Link in infrastructure network;
15278c2ecf20Sopenharmony_ci	 * MSR_ADHOC == Link in ad hoc network;
15288c2ecf20Sopenharmony_ci	 * Therefore, check link state is necessary.
15298c2ecf20Sopenharmony_ci	 *
15308c2ecf20Sopenharmony_ci	 * MSR_AP == AP mode; link state is not cared here.
15318c2ecf20Sopenharmony_ci	 */
15328c2ecf20Sopenharmony_ci	if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
15338c2ecf20Sopenharmony_ci		mode = MSR_NOLINK;
15348c2ecf20Sopenharmony_ci		ledaction = LED_CTL_NO_LINK;
15358c2ecf20Sopenharmony_ci	}
15368c2ecf20Sopenharmony_ci
15378c2ecf20Sopenharmony_ci	if (mode == MSR_NOLINK || mode == MSR_INFRA) {
15388c2ecf20Sopenharmony_ci		_rtl8723be_stop_tx_beacon(hw);
15398c2ecf20Sopenharmony_ci		_rtl8723be_enable_bcn_sub_func(hw);
15408c2ecf20Sopenharmony_ci	} else if (mode == MSR_ADHOC || mode == MSR_AP) {
15418c2ecf20Sopenharmony_ci		_rtl8723be_resume_tx_beacon(hw);
15428c2ecf20Sopenharmony_ci		_rtl8723be_disable_bcn_sub_func(hw);
15438c2ecf20Sopenharmony_ci	} else {
15448c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
15458c2ecf20Sopenharmony_ci			"Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
15468c2ecf20Sopenharmony_ci			mode);
15478c2ecf20Sopenharmony_ci	}
15488c2ecf20Sopenharmony_ci
15498c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
15508c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->led_control(hw, ledaction);
15518c2ecf20Sopenharmony_ci	if (mode == MSR_AP)
15528c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
15538c2ecf20Sopenharmony_ci	else
15548c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
15558c2ecf20Sopenharmony_ci	return 0;
15568c2ecf20Sopenharmony_ci}
15578c2ecf20Sopenharmony_ci
15588c2ecf20Sopenharmony_civoid rtl8723be_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
15598c2ecf20Sopenharmony_ci{
15608c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
15618c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
15628c2ecf20Sopenharmony_ci	u32 reg_rcr = rtlpci->receive_config;
15638c2ecf20Sopenharmony_ci
15648c2ecf20Sopenharmony_ci	if (rtlpriv->psc.rfpwr_state != ERFON)
15658c2ecf20Sopenharmony_ci		return;
15668c2ecf20Sopenharmony_ci
15678c2ecf20Sopenharmony_ci	if (check_bssid) {
15688c2ecf20Sopenharmony_ci		reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
15698c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
15708c2ecf20Sopenharmony_ci					      (u8 *)(&reg_rcr));
15718c2ecf20Sopenharmony_ci		_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
15728c2ecf20Sopenharmony_ci	} else if (!check_bssid) {
15738c2ecf20Sopenharmony_ci		reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
15748c2ecf20Sopenharmony_ci		_rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
15758c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
15768c2ecf20Sopenharmony_ci					      (u8 *)(&reg_rcr));
15778c2ecf20Sopenharmony_ci	}
15788c2ecf20Sopenharmony_ci
15798c2ecf20Sopenharmony_ci}
15808c2ecf20Sopenharmony_ci
15818c2ecf20Sopenharmony_ciint rtl8723be_set_network_type(struct ieee80211_hw *hw,
15828c2ecf20Sopenharmony_ci			       enum nl80211_iftype type)
15838c2ecf20Sopenharmony_ci{
15848c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
15858c2ecf20Sopenharmony_ci
15868c2ecf20Sopenharmony_ci	if (_rtl8723be_set_media_status(hw, type))
15878c2ecf20Sopenharmony_ci		return -EOPNOTSUPP;
15888c2ecf20Sopenharmony_ci
15898c2ecf20Sopenharmony_ci	if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
15908c2ecf20Sopenharmony_ci		if (type != NL80211_IFTYPE_AP)
15918c2ecf20Sopenharmony_ci			rtl8723be_set_check_bssid(hw, true);
15928c2ecf20Sopenharmony_ci	} else {
15938c2ecf20Sopenharmony_ci		rtl8723be_set_check_bssid(hw, false);
15948c2ecf20Sopenharmony_ci	}
15958c2ecf20Sopenharmony_ci
15968c2ecf20Sopenharmony_ci	return 0;
15978c2ecf20Sopenharmony_ci}
15988c2ecf20Sopenharmony_ci
15998c2ecf20Sopenharmony_ci/* don't set REG_EDCA_BE_PARAM here
16008c2ecf20Sopenharmony_ci * because mac80211 will send pkt when scan
16018c2ecf20Sopenharmony_ci */
16028c2ecf20Sopenharmony_civoid rtl8723be_set_qos(struct ieee80211_hw *hw, int aci)
16038c2ecf20Sopenharmony_ci{
16048c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16058c2ecf20Sopenharmony_ci
16068c2ecf20Sopenharmony_ci	rtl8723_dm_init_edca_turbo(hw);
16078c2ecf20Sopenharmony_ci	switch (aci) {
16088c2ecf20Sopenharmony_ci	case AC1_BK:
16098c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
16108c2ecf20Sopenharmony_ci		break;
16118c2ecf20Sopenharmony_ci	case AC0_BE:
16128c2ecf20Sopenharmony_ci		break;
16138c2ecf20Sopenharmony_ci	case AC2_VI:
16148c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
16158c2ecf20Sopenharmony_ci		break;
16168c2ecf20Sopenharmony_ci	case AC3_VO:
16178c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
16188c2ecf20Sopenharmony_ci		break;
16198c2ecf20Sopenharmony_ci	default:
16208c2ecf20Sopenharmony_ci		WARN_ONCE(true, "rtl8723be: invalid aci: %d !\n", aci);
16218c2ecf20Sopenharmony_ci		break;
16228c2ecf20Sopenharmony_ci	}
16238c2ecf20Sopenharmony_ci}
16248c2ecf20Sopenharmony_ci
16258c2ecf20Sopenharmony_civoid rtl8723be_enable_interrupt(struct ieee80211_hw *hw)
16268c2ecf20Sopenharmony_ci{
16278c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16288c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
16298c2ecf20Sopenharmony_ci
16308c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
16318c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
16328c2ecf20Sopenharmony_ci	rtlpci->irq_enabled = true;
16338c2ecf20Sopenharmony_ci
16348c2ecf20Sopenharmony_ci	/*enable system interrupt*/
16358c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
16368c2ecf20Sopenharmony_ci}
16378c2ecf20Sopenharmony_ci
16388c2ecf20Sopenharmony_civoid rtl8723be_disable_interrupt(struct ieee80211_hw *hw)
16398c2ecf20Sopenharmony_ci{
16408c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16418c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
16428c2ecf20Sopenharmony_ci
16438c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
16448c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
16458c2ecf20Sopenharmony_ci	rtlpci->irq_enabled = false;
16468c2ecf20Sopenharmony_ci	/*synchronize_irq(rtlpci->pdev->irq);*/
16478c2ecf20Sopenharmony_ci}
16488c2ecf20Sopenharmony_ci
16498c2ecf20Sopenharmony_civoid rtl8723be_card_disable(struct ieee80211_hw *hw)
16508c2ecf20Sopenharmony_ci{
16518c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16528c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
16538c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
16548c2ecf20Sopenharmony_ci	enum nl80211_iftype opmode;
16558c2ecf20Sopenharmony_ci
16568c2ecf20Sopenharmony_ci	mac->link_state = MAC80211_NOLINK;
16578c2ecf20Sopenharmony_ci	opmode = NL80211_IFTYPE_UNSPECIFIED;
16588c2ecf20Sopenharmony_ci	_rtl8723be_set_media_status(hw, opmode);
16598c2ecf20Sopenharmony_ci	if (rtlpriv->rtlhal.driver_is_goingto_unload ||
16608c2ecf20Sopenharmony_ci	    ppsc->rfoff_reason > RF_CHANGE_BY_PS)
16618c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
16628c2ecf20Sopenharmony_ci	RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
16638c2ecf20Sopenharmony_ci	_rtl8723be_poweroff_adapter(hw);
16648c2ecf20Sopenharmony_ci
16658c2ecf20Sopenharmony_ci	/* after power off we should do iqk again */
16668c2ecf20Sopenharmony_ci	if (!rtlpriv->cfg->ops->get_btc_status())
16678c2ecf20Sopenharmony_ci		rtlpriv->phy.iqk_initialized = false;
16688c2ecf20Sopenharmony_ci}
16698c2ecf20Sopenharmony_ci
16708c2ecf20Sopenharmony_civoid rtl8723be_interrupt_recognized(struct ieee80211_hw *hw,
16718c2ecf20Sopenharmony_ci				    struct rtl_int *intvec)
16728c2ecf20Sopenharmony_ci{
16738c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16748c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
16758c2ecf20Sopenharmony_ci
16768c2ecf20Sopenharmony_ci	intvec->inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
16778c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, ISR, intvec->inta);
16788c2ecf20Sopenharmony_ci
16798c2ecf20Sopenharmony_ci	intvec->intb = rtl_read_dword(rtlpriv, REG_HISRE) &
16808c2ecf20Sopenharmony_ci				      rtlpci->irq_mask[1];
16818c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, REG_HISRE, intvec->intb);
16828c2ecf20Sopenharmony_ci}
16838c2ecf20Sopenharmony_ci
16848c2ecf20Sopenharmony_civoid rtl8723be_set_beacon_related_registers(struct ieee80211_hw *hw)
16858c2ecf20Sopenharmony_ci{
16868c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16878c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
16888c2ecf20Sopenharmony_ci	u16 bcn_interval, atim_window;
16898c2ecf20Sopenharmony_ci
16908c2ecf20Sopenharmony_ci	bcn_interval = mac->beacon_interval;
16918c2ecf20Sopenharmony_ci	atim_window = 2;	/*FIX MERGE */
16928c2ecf20Sopenharmony_ci	rtl8723be_disable_interrupt(hw);
16938c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
16948c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
16958c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
16968c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
16978c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
16988c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x606, 0x30);
16998c2ecf20Sopenharmony_ci	rtl8723be_enable_interrupt(hw);
17008c2ecf20Sopenharmony_ci}
17018c2ecf20Sopenharmony_ci
17028c2ecf20Sopenharmony_civoid rtl8723be_set_beacon_interval(struct ieee80211_hw *hw)
17038c2ecf20Sopenharmony_ci{
17048c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
17058c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
17068c2ecf20Sopenharmony_ci	u16 bcn_interval = mac->beacon_interval;
17078c2ecf20Sopenharmony_ci
17088c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_BEACON, DBG_DMESG,
17098c2ecf20Sopenharmony_ci		"beacon_interval:%d\n", bcn_interval);
17108c2ecf20Sopenharmony_ci	rtl8723be_disable_interrupt(hw);
17118c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
17128c2ecf20Sopenharmony_ci	rtl8723be_enable_interrupt(hw);
17138c2ecf20Sopenharmony_ci}
17148c2ecf20Sopenharmony_ci
17158c2ecf20Sopenharmony_civoid rtl8723be_update_interrupt_mask(struct ieee80211_hw *hw,
17168c2ecf20Sopenharmony_ci				   u32 add_msr, u32 rm_msr)
17178c2ecf20Sopenharmony_ci{
17188c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
17198c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
17208c2ecf20Sopenharmony_ci
17218c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INTR, DBG_LOUD,
17228c2ecf20Sopenharmony_ci		"add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
17238c2ecf20Sopenharmony_ci
17248c2ecf20Sopenharmony_ci	if (add_msr)
17258c2ecf20Sopenharmony_ci		rtlpci->irq_mask[0] |= add_msr;
17268c2ecf20Sopenharmony_ci	if (rm_msr)
17278c2ecf20Sopenharmony_ci		rtlpci->irq_mask[0] &= (~rm_msr);
17288c2ecf20Sopenharmony_ci	rtl8723be_disable_interrupt(hw);
17298c2ecf20Sopenharmony_ci	rtl8723be_enable_interrupt(hw);
17308c2ecf20Sopenharmony_ci}
17318c2ecf20Sopenharmony_ci
17328c2ecf20Sopenharmony_cistatic u8 _rtl8723be_get_chnl_group(u8 chnl)
17338c2ecf20Sopenharmony_ci{
17348c2ecf20Sopenharmony_ci	u8 group;
17358c2ecf20Sopenharmony_ci
17368c2ecf20Sopenharmony_ci	if (chnl < 3)
17378c2ecf20Sopenharmony_ci		group = 0;
17388c2ecf20Sopenharmony_ci	else if (chnl < 9)
17398c2ecf20Sopenharmony_ci		group = 1;
17408c2ecf20Sopenharmony_ci	else
17418c2ecf20Sopenharmony_ci		group = 2;
17428c2ecf20Sopenharmony_ci	return group;
17438c2ecf20Sopenharmony_ci}
17448c2ecf20Sopenharmony_ci
17458c2ecf20Sopenharmony_cistatic void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
17468c2ecf20Sopenharmony_ci					struct txpower_info_2g *pw2g,
17478c2ecf20Sopenharmony_ci					struct txpower_info_5g *pw5g,
17488c2ecf20Sopenharmony_ci					bool autoload_fail, u8 *hwinfo)
17498c2ecf20Sopenharmony_ci{
17508c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
17518c2ecf20Sopenharmony_ci	u32 path, addr = EEPROM_TX_PWR_INX, group, cnt = 0;
17528c2ecf20Sopenharmony_ci
17538c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
17548c2ecf20Sopenharmony_ci		"hal_ReadPowerValueFromPROM8723BE(): PROMContent[0x%x]=0x%x\n",
17558c2ecf20Sopenharmony_ci		(addr + 1), hwinfo[addr + 1]);
17568c2ecf20Sopenharmony_ci	if (0xFF == hwinfo[addr + 1])  /*YJ,add,120316*/
17578c2ecf20Sopenharmony_ci		autoload_fail = true;
17588c2ecf20Sopenharmony_ci
17598c2ecf20Sopenharmony_ci	if (autoload_fail) {
17608c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
17618c2ecf20Sopenharmony_ci			"auto load fail : Use Default value!\n");
17628c2ecf20Sopenharmony_ci		for (path = 0; path < MAX_RF_PATH; path++) {
17638c2ecf20Sopenharmony_ci			/* 2.4G default value */
17648c2ecf20Sopenharmony_ci			for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
17658c2ecf20Sopenharmony_ci				pw2g->index_cck_base[path][group] = 0x2D;
17668c2ecf20Sopenharmony_ci				pw2g->index_bw40_base[path][group] = 0x2D;
17678c2ecf20Sopenharmony_ci			}
17688c2ecf20Sopenharmony_ci			for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
17698c2ecf20Sopenharmony_ci				if (cnt == 0) {
17708c2ecf20Sopenharmony_ci					pw2g->bw20_diff[path][0] = 0x02;
17718c2ecf20Sopenharmony_ci					pw2g->ofdm_diff[path][0] = 0x04;
17728c2ecf20Sopenharmony_ci				} else {
17738c2ecf20Sopenharmony_ci					pw2g->bw20_diff[path][cnt] = 0xFE;
17748c2ecf20Sopenharmony_ci					pw2g->bw40_diff[path][cnt] = 0xFE;
17758c2ecf20Sopenharmony_ci					pw2g->cck_diff[path][cnt] = 0xFE;
17768c2ecf20Sopenharmony_ci					pw2g->ofdm_diff[path][cnt] = 0xFE;
17778c2ecf20Sopenharmony_ci				}
17788c2ecf20Sopenharmony_ci			}
17798c2ecf20Sopenharmony_ci		}
17808c2ecf20Sopenharmony_ci		return;
17818c2ecf20Sopenharmony_ci	}
17828c2ecf20Sopenharmony_ci
17838c2ecf20Sopenharmony_ci	for (path = 0; path < MAX_RF_PATH; path++) {
17848c2ecf20Sopenharmony_ci		/*2.4G default value*/
17858c2ecf20Sopenharmony_ci		for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
17868c2ecf20Sopenharmony_ci			pw2g->index_cck_base[path][group] = hwinfo[addr++];
17878c2ecf20Sopenharmony_ci			if (pw2g->index_cck_base[path][group] == 0xFF)
17888c2ecf20Sopenharmony_ci				pw2g->index_cck_base[path][group] = 0x2D;
17898c2ecf20Sopenharmony_ci
17908c2ecf20Sopenharmony_ci		}
17918c2ecf20Sopenharmony_ci		for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) {
17928c2ecf20Sopenharmony_ci			pw2g->index_bw40_base[path][group] = hwinfo[addr++];
17938c2ecf20Sopenharmony_ci			if (pw2g->index_bw40_base[path][group] == 0xFF)
17948c2ecf20Sopenharmony_ci				pw2g->index_bw40_base[path][group] = 0x2D;
17958c2ecf20Sopenharmony_ci		}
17968c2ecf20Sopenharmony_ci		for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
17978c2ecf20Sopenharmony_ci			if (cnt == 0) {
17988c2ecf20Sopenharmony_ci				pw2g->bw40_diff[path][cnt] = 0;
17998c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
18008c2ecf20Sopenharmony_ci					pw2g->bw20_diff[path][cnt] = 0x02;
18018c2ecf20Sopenharmony_ci				} else {
18028c2ecf20Sopenharmony_ci					pw2g->bw20_diff[path][cnt] =
18038c2ecf20Sopenharmony_ci						(hwinfo[addr] & 0xf0) >> 4;
18048c2ecf20Sopenharmony_ci					/*bit sign number to 8 bit sign number*/
18058c2ecf20Sopenharmony_ci					if (pw2g->bw20_diff[path][cnt] & BIT(3))
18068c2ecf20Sopenharmony_ci						pw2g->bw20_diff[path][cnt] |=
18078c2ecf20Sopenharmony_ci									  0xF0;
18088c2ecf20Sopenharmony_ci				}
18098c2ecf20Sopenharmony_ci
18108c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
18118c2ecf20Sopenharmony_ci					pw2g->ofdm_diff[path][cnt] = 0x04;
18128c2ecf20Sopenharmony_ci				} else {
18138c2ecf20Sopenharmony_ci					pw2g->ofdm_diff[path][cnt] =
18148c2ecf20Sopenharmony_ci							(hwinfo[addr] & 0x0f);
18158c2ecf20Sopenharmony_ci					/*bit sign number to 8 bit sign number*/
18168c2ecf20Sopenharmony_ci					if (pw2g->ofdm_diff[path][cnt] & BIT(3))
18178c2ecf20Sopenharmony_ci						pw2g->ofdm_diff[path][cnt] |=
18188c2ecf20Sopenharmony_ci									  0xF0;
18198c2ecf20Sopenharmony_ci				}
18208c2ecf20Sopenharmony_ci				pw2g->cck_diff[path][cnt] = 0;
18218c2ecf20Sopenharmony_ci				addr++;
18228c2ecf20Sopenharmony_ci			} else {
18238c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
18248c2ecf20Sopenharmony_ci					pw2g->bw40_diff[path][cnt] = 0xFE;
18258c2ecf20Sopenharmony_ci				} else {
18268c2ecf20Sopenharmony_ci					pw2g->bw40_diff[path][cnt] =
18278c2ecf20Sopenharmony_ci						(hwinfo[addr] & 0xf0) >> 4;
18288c2ecf20Sopenharmony_ci					if (pw2g->bw40_diff[path][cnt] & BIT(3))
18298c2ecf20Sopenharmony_ci						pw2g->bw40_diff[path][cnt] |=
18308c2ecf20Sopenharmony_ci									  0xF0;
18318c2ecf20Sopenharmony_ci				}
18328c2ecf20Sopenharmony_ci
18338c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
18348c2ecf20Sopenharmony_ci					pw2g->bw20_diff[path][cnt] = 0xFE;
18358c2ecf20Sopenharmony_ci				} else {
18368c2ecf20Sopenharmony_ci					pw2g->bw20_diff[path][cnt] =
18378c2ecf20Sopenharmony_ci							(hwinfo[addr] & 0x0f);
18388c2ecf20Sopenharmony_ci					if (pw2g->bw20_diff[path][cnt] & BIT(3))
18398c2ecf20Sopenharmony_ci						pw2g->bw20_diff[path][cnt] |=
18408c2ecf20Sopenharmony_ci									  0xF0;
18418c2ecf20Sopenharmony_ci				}
18428c2ecf20Sopenharmony_ci				addr++;
18438c2ecf20Sopenharmony_ci
18448c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
18458c2ecf20Sopenharmony_ci					pw2g->ofdm_diff[path][cnt] = 0xFE;
18468c2ecf20Sopenharmony_ci				} else {
18478c2ecf20Sopenharmony_ci					pw2g->ofdm_diff[path][cnt] =
18488c2ecf20Sopenharmony_ci						(hwinfo[addr] & 0xf0) >> 4;
18498c2ecf20Sopenharmony_ci					if (pw2g->ofdm_diff[path][cnt] & BIT(3))
18508c2ecf20Sopenharmony_ci						pw2g->ofdm_diff[path][cnt] |=
18518c2ecf20Sopenharmony_ci									  0xF0;
18528c2ecf20Sopenharmony_ci				}
18538c2ecf20Sopenharmony_ci
18548c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF)
18558c2ecf20Sopenharmony_ci					pw2g->cck_diff[path][cnt] = 0xFE;
18568c2ecf20Sopenharmony_ci				else {
18578c2ecf20Sopenharmony_ci					pw2g->cck_diff[path][cnt] =
18588c2ecf20Sopenharmony_ci							(hwinfo[addr] & 0x0f);
18598c2ecf20Sopenharmony_ci					if (pw2g->cck_diff[path][cnt] & BIT(3))
18608c2ecf20Sopenharmony_ci						pw2g->cck_diff[path][cnt] |=
18618c2ecf20Sopenharmony_ci									 0xF0;
18628c2ecf20Sopenharmony_ci				}
18638c2ecf20Sopenharmony_ci				addr++;
18648c2ecf20Sopenharmony_ci			}
18658c2ecf20Sopenharmony_ci		}
18668c2ecf20Sopenharmony_ci
18678c2ecf20Sopenharmony_ci		/*5G default value*/
18688c2ecf20Sopenharmony_ci		for (group = 0; group < MAX_CHNL_GROUP_5G; group++) {
18698c2ecf20Sopenharmony_ci			pw5g->index_bw40_base[path][group] = hwinfo[addr++];
18708c2ecf20Sopenharmony_ci			if (pw5g->index_bw40_base[path][group] == 0xFF)
18718c2ecf20Sopenharmony_ci				pw5g->index_bw40_base[path][group] = 0xFE;
18728c2ecf20Sopenharmony_ci		}
18738c2ecf20Sopenharmony_ci
18748c2ecf20Sopenharmony_ci		for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
18758c2ecf20Sopenharmony_ci			if (cnt == 0) {
18768c2ecf20Sopenharmony_ci				pw5g->bw40_diff[path][cnt] = 0;
18778c2ecf20Sopenharmony_ci
18788c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
18798c2ecf20Sopenharmony_ci					pw5g->bw20_diff[path][cnt] = 0;
18808c2ecf20Sopenharmony_ci				} else {
18818c2ecf20Sopenharmony_ci					pw5g->bw20_diff[path][0] =
18828c2ecf20Sopenharmony_ci						(hwinfo[addr] & 0xf0) >> 4;
18838c2ecf20Sopenharmony_ci					if (pw5g->bw20_diff[path][cnt] & BIT(3))
18848c2ecf20Sopenharmony_ci						pw5g->bw20_diff[path][cnt] |=
18858c2ecf20Sopenharmony_ci									  0xF0;
18868c2ecf20Sopenharmony_ci				}
18878c2ecf20Sopenharmony_ci
18888c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF)
18898c2ecf20Sopenharmony_ci					pw5g->ofdm_diff[path][cnt] = 0x04;
18908c2ecf20Sopenharmony_ci				else {
18918c2ecf20Sopenharmony_ci					pw5g->ofdm_diff[path][0] =
18928c2ecf20Sopenharmony_ci							(hwinfo[addr] & 0x0f);
18938c2ecf20Sopenharmony_ci					if (pw5g->ofdm_diff[path][cnt] & BIT(3))
18948c2ecf20Sopenharmony_ci						pw5g->ofdm_diff[path][cnt] |=
18958c2ecf20Sopenharmony_ci									  0xF0;
18968c2ecf20Sopenharmony_ci				}
18978c2ecf20Sopenharmony_ci				addr++;
18988c2ecf20Sopenharmony_ci			} else {
18998c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
19008c2ecf20Sopenharmony_ci					pw5g->bw40_diff[path][cnt] = 0xFE;
19018c2ecf20Sopenharmony_ci				} else {
19028c2ecf20Sopenharmony_ci					pw5g->bw40_diff[path][cnt] =
19038c2ecf20Sopenharmony_ci						(hwinfo[addr] & 0xf0) >> 4;
19048c2ecf20Sopenharmony_ci					if (pw5g->bw40_diff[path][cnt] & BIT(3))
19058c2ecf20Sopenharmony_ci						pw5g->bw40_diff[path][cnt] |= 0xF0;
19068c2ecf20Sopenharmony_ci				}
19078c2ecf20Sopenharmony_ci
19088c2ecf20Sopenharmony_ci				if (hwinfo[addr] == 0xFF) {
19098c2ecf20Sopenharmony_ci					pw5g->bw20_diff[path][cnt] = 0xFE;
19108c2ecf20Sopenharmony_ci				} else {
19118c2ecf20Sopenharmony_ci					pw5g->bw20_diff[path][cnt] =
19128c2ecf20Sopenharmony_ci							(hwinfo[addr] & 0x0f);
19138c2ecf20Sopenharmony_ci					if (pw5g->bw20_diff[path][cnt] & BIT(3))
19148c2ecf20Sopenharmony_ci						pw5g->bw20_diff[path][cnt] |= 0xF0;
19158c2ecf20Sopenharmony_ci				}
19168c2ecf20Sopenharmony_ci				addr++;
19178c2ecf20Sopenharmony_ci			}
19188c2ecf20Sopenharmony_ci		}
19198c2ecf20Sopenharmony_ci
19208c2ecf20Sopenharmony_ci		if (hwinfo[addr] == 0xFF) {
19218c2ecf20Sopenharmony_ci			pw5g->ofdm_diff[path][1] = 0xFE;
19228c2ecf20Sopenharmony_ci			pw5g->ofdm_diff[path][2] = 0xFE;
19238c2ecf20Sopenharmony_ci		} else {
19248c2ecf20Sopenharmony_ci			pw5g->ofdm_diff[path][1] = (hwinfo[addr] & 0xf0) >> 4;
19258c2ecf20Sopenharmony_ci			pw5g->ofdm_diff[path][2] = (hwinfo[addr] & 0x0f);
19268c2ecf20Sopenharmony_ci		}
19278c2ecf20Sopenharmony_ci		addr++;
19288c2ecf20Sopenharmony_ci
19298c2ecf20Sopenharmony_ci		if (hwinfo[addr] == 0xFF)
19308c2ecf20Sopenharmony_ci			pw5g->ofdm_diff[path][3] = 0xFE;
19318c2ecf20Sopenharmony_ci		else
19328c2ecf20Sopenharmony_ci			pw5g->ofdm_diff[path][3] = (hwinfo[addr] & 0x0f);
19338c2ecf20Sopenharmony_ci		addr++;
19348c2ecf20Sopenharmony_ci
19358c2ecf20Sopenharmony_ci		for (cnt = 1; cnt < MAX_TX_COUNT; cnt++) {
19368c2ecf20Sopenharmony_ci			if (pw5g->ofdm_diff[path][cnt] == 0xFF)
19378c2ecf20Sopenharmony_ci				pw5g->ofdm_diff[path][cnt] = 0xFE;
19388c2ecf20Sopenharmony_ci			else if (pw5g->ofdm_diff[path][cnt] & BIT(3))
19398c2ecf20Sopenharmony_ci				pw5g->ofdm_diff[path][cnt] |= 0xF0;
19408c2ecf20Sopenharmony_ci		}
19418c2ecf20Sopenharmony_ci	}
19428c2ecf20Sopenharmony_ci}
19438c2ecf20Sopenharmony_ci
19448c2ecf20Sopenharmony_cistatic void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
19458c2ecf20Sopenharmony_ci						   bool autoload_fail,
19468c2ecf20Sopenharmony_ci						   u8 *hwinfo)
19478c2ecf20Sopenharmony_ci{
19488c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
19498c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
19508c2ecf20Sopenharmony_ci	struct txpower_info_2g pw2g;
19518c2ecf20Sopenharmony_ci	struct txpower_info_5g pw5g;
19528c2ecf20Sopenharmony_ci	u8 rf_path, index;
19538c2ecf20Sopenharmony_ci	u8 i;
19548c2ecf20Sopenharmony_ci
19558c2ecf20Sopenharmony_ci	_rtl8723be_read_power_value_fromprom(hw, &pw2g, &pw5g, autoload_fail,
19568c2ecf20Sopenharmony_ci					     hwinfo);
19578c2ecf20Sopenharmony_ci
19588c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++) {
19598c2ecf20Sopenharmony_ci		for (i = 0; i < 14; i++) {
19608c2ecf20Sopenharmony_ci			index = _rtl8723be_get_chnl_group(i+1);
19618c2ecf20Sopenharmony_ci
19628c2ecf20Sopenharmony_ci			rtlefuse->txpwrlevel_cck[rf_path][i] =
19638c2ecf20Sopenharmony_ci					pw2g.index_cck_base[rf_path][index];
19648c2ecf20Sopenharmony_ci			rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
19658c2ecf20Sopenharmony_ci					pw2g.index_bw40_base[rf_path][index];
19668c2ecf20Sopenharmony_ci		}
19678c2ecf20Sopenharmony_ci		for (i = 0; i < MAX_TX_COUNT; i++) {
19688c2ecf20Sopenharmony_ci			rtlefuse->txpwr_ht20diff[rf_path][i] =
19698c2ecf20Sopenharmony_ci						pw2g.bw20_diff[rf_path][i];
19708c2ecf20Sopenharmony_ci			rtlefuse->txpwr_ht40diff[rf_path][i] =
19718c2ecf20Sopenharmony_ci						pw2g.bw40_diff[rf_path][i];
19728c2ecf20Sopenharmony_ci			rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
19738c2ecf20Sopenharmony_ci						pw2g.ofdm_diff[rf_path][i];
19748c2ecf20Sopenharmony_ci		}
19758c2ecf20Sopenharmony_ci
19768c2ecf20Sopenharmony_ci		for (i = 0; i < 14; i++) {
19778c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
19788c2ecf20Sopenharmony_ci				"RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
19798c2ecf20Sopenharmony_ci				rf_path, i,
19808c2ecf20Sopenharmony_ci				rtlefuse->txpwrlevel_cck[rf_path][i],
19818c2ecf20Sopenharmony_ci				rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
19828c2ecf20Sopenharmony_ci		}
19838c2ecf20Sopenharmony_ci	}
19848c2ecf20Sopenharmony_ci
19858c2ecf20Sopenharmony_ci	if (!autoload_fail)
19868c2ecf20Sopenharmony_ci		rtlefuse->eeprom_thermalmeter =
19878c2ecf20Sopenharmony_ci					hwinfo[EEPROM_THERMAL_METER_88E];
19888c2ecf20Sopenharmony_ci	else
19898c2ecf20Sopenharmony_ci		rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
19908c2ecf20Sopenharmony_ci
19918c2ecf20Sopenharmony_ci	if (rtlefuse->eeprom_thermalmeter == 0xff || autoload_fail) {
19928c2ecf20Sopenharmony_ci		rtlefuse->apk_thermalmeterignore = true;
19938c2ecf20Sopenharmony_ci		rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
19948c2ecf20Sopenharmony_ci	}
19958c2ecf20Sopenharmony_ci
19968c2ecf20Sopenharmony_ci	rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
19978c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
19988c2ecf20Sopenharmony_ci		"thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
19998c2ecf20Sopenharmony_ci
20008c2ecf20Sopenharmony_ci	if (!autoload_fail) {
20018c2ecf20Sopenharmony_ci		rtlefuse->eeprom_regulatory =
20028c2ecf20Sopenharmony_ci			hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/
20038c2ecf20Sopenharmony_ci		if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
20048c2ecf20Sopenharmony_ci			rtlefuse->eeprom_regulatory = 0;
20058c2ecf20Sopenharmony_ci	} else {
20068c2ecf20Sopenharmony_ci		rtlefuse->eeprom_regulatory = 0;
20078c2ecf20Sopenharmony_ci	}
20088c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
20098c2ecf20Sopenharmony_ci		"eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
20108c2ecf20Sopenharmony_ci}
20118c2ecf20Sopenharmony_ci
20128c2ecf20Sopenharmony_cistatic u8 _rtl8723be_read_package_type(struct ieee80211_hw *hw)
20138c2ecf20Sopenharmony_ci{
20148c2ecf20Sopenharmony_ci	u8 package_type;
20158c2ecf20Sopenharmony_ci	u8 value;
20168c2ecf20Sopenharmony_ci
20178c2ecf20Sopenharmony_ci	efuse_power_switch(hw, false, true);
20188c2ecf20Sopenharmony_ci	if (!efuse_one_byte_read(hw, 0x1FB, &value))
20198c2ecf20Sopenharmony_ci		value = 0;
20208c2ecf20Sopenharmony_ci	efuse_power_switch(hw, false, false);
20218c2ecf20Sopenharmony_ci
20228c2ecf20Sopenharmony_ci	switch (value & 0x7) {
20238c2ecf20Sopenharmony_ci	case 0x4:
20248c2ecf20Sopenharmony_ci		package_type = PACKAGE_TFBGA79;
20258c2ecf20Sopenharmony_ci		break;
20268c2ecf20Sopenharmony_ci	case 0x5:
20278c2ecf20Sopenharmony_ci		package_type = PACKAGE_TFBGA90;
20288c2ecf20Sopenharmony_ci		break;
20298c2ecf20Sopenharmony_ci	case 0x6:
20308c2ecf20Sopenharmony_ci		package_type = PACKAGE_QFN68;
20318c2ecf20Sopenharmony_ci		break;
20328c2ecf20Sopenharmony_ci	case 0x7:
20338c2ecf20Sopenharmony_ci		package_type = PACKAGE_TFBGA80;
20348c2ecf20Sopenharmony_ci		break;
20358c2ecf20Sopenharmony_ci	default:
20368c2ecf20Sopenharmony_ci		package_type = PACKAGE_DEFAULT;
20378c2ecf20Sopenharmony_ci		break;
20388c2ecf20Sopenharmony_ci	}
20398c2ecf20Sopenharmony_ci
20408c2ecf20Sopenharmony_ci	return package_type;
20418c2ecf20Sopenharmony_ci}
20428c2ecf20Sopenharmony_ci
20438c2ecf20Sopenharmony_cistatic void _rtl8723be_read_adapter_info(struct ieee80211_hw *hw,
20448c2ecf20Sopenharmony_ci					 bool pseudo_test)
20458c2ecf20Sopenharmony_ci{
20468c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
20478c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
20488c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
20498c2ecf20Sopenharmony_ci	int params[] = {RTL8723BE_EEPROM_ID, EEPROM_VID, EEPROM_DID,
20508c2ecf20Sopenharmony_ci			EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR,
20518c2ecf20Sopenharmony_ci			EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
20528c2ecf20Sopenharmony_ci			COUNTRY_CODE_WORLD_WIDE_13};
20538c2ecf20Sopenharmony_ci	u8 *hwinfo;
20548c2ecf20Sopenharmony_ci	int i;
20558c2ecf20Sopenharmony_ci	bool is_toshiba_smid1 = false;
20568c2ecf20Sopenharmony_ci	bool is_toshiba_smid2 = false;
20578c2ecf20Sopenharmony_ci	bool is_samsung_smid = false;
20588c2ecf20Sopenharmony_ci	bool is_lenovo_smid = false;
20598c2ecf20Sopenharmony_ci	u16 toshiba_smid1[] = {
20608c2ecf20Sopenharmony_ci		0x6151, 0x6152, 0x6154, 0x6155, 0x6177, 0x6178, 0x6179, 0x6180,
20618c2ecf20Sopenharmony_ci		0x7151, 0x7152, 0x7154, 0x7155, 0x7177, 0x7178, 0x7179, 0x7180,
20628c2ecf20Sopenharmony_ci		0x8151, 0x8152, 0x8154, 0x8155, 0x8181, 0x8182, 0x8184, 0x8185,
20638c2ecf20Sopenharmony_ci		0x9151, 0x9152, 0x9154, 0x9155, 0x9181, 0x9182, 0x9184, 0x9185
20648c2ecf20Sopenharmony_ci	};
20658c2ecf20Sopenharmony_ci	u16 toshiba_smid2[] = {
20668c2ecf20Sopenharmony_ci		0x6181, 0x6184, 0x6185, 0x7181, 0x7182, 0x7184, 0x7185, 0x8181,
20678c2ecf20Sopenharmony_ci		0x8182, 0x8184, 0x8185, 0x9181, 0x9182, 0x9184, 0x9185
20688c2ecf20Sopenharmony_ci	};
20698c2ecf20Sopenharmony_ci	u16 samsung_smid[] = {
20708c2ecf20Sopenharmony_ci		0x6191, 0x6192, 0x6193, 0x7191, 0x7192, 0x7193, 0x8191, 0x8192,
20718c2ecf20Sopenharmony_ci		0x8193, 0x9191, 0x9192, 0x9193
20728c2ecf20Sopenharmony_ci	};
20738c2ecf20Sopenharmony_ci	u16 lenovo_smid[] = {
20748c2ecf20Sopenharmony_ci		0x8195, 0x9195, 0x7194, 0x8200, 0x8201, 0x8202, 0x9199, 0x9200
20758c2ecf20Sopenharmony_ci	};
20768c2ecf20Sopenharmony_ci
20778c2ecf20Sopenharmony_ci	if (pseudo_test) {
20788c2ecf20Sopenharmony_ci		/* needs to be added */
20798c2ecf20Sopenharmony_ci		return;
20808c2ecf20Sopenharmony_ci	}
20818c2ecf20Sopenharmony_ci
20828c2ecf20Sopenharmony_ci	hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL);
20838c2ecf20Sopenharmony_ci	if (!hwinfo)
20848c2ecf20Sopenharmony_ci		return;
20858c2ecf20Sopenharmony_ci
20868c2ecf20Sopenharmony_ci	if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params))
20878c2ecf20Sopenharmony_ci		goto exit;
20888c2ecf20Sopenharmony_ci
20898c2ecf20Sopenharmony_ci	/*parse xtal*/
20908c2ecf20Sopenharmony_ci	rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8723BE];
20918c2ecf20Sopenharmony_ci	if (rtlefuse->crystalcap == 0xFF)
20928c2ecf20Sopenharmony_ci		rtlefuse->crystalcap = 0x20;
20938c2ecf20Sopenharmony_ci
20948c2ecf20Sopenharmony_ci	_rtl8723be_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
20958c2ecf20Sopenharmony_ci					       hwinfo);
20968c2ecf20Sopenharmony_ci
20978c2ecf20Sopenharmony_ci	rtl8723be_read_bt_coexist_info_from_hwpg(hw,
20988c2ecf20Sopenharmony_ci						 rtlefuse->autoload_failflag,
20998c2ecf20Sopenharmony_ci						 hwinfo);
21008c2ecf20Sopenharmony_ci
21018c2ecf20Sopenharmony_ci	if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
21028c2ecf20Sopenharmony_ci		rtlefuse->board_type |= BIT(2); /* ODM_BOARD_BT */
21038c2ecf20Sopenharmony_ci
21048c2ecf20Sopenharmony_ci	rtlhal->board_type = rtlefuse->board_type;
21058c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
21068c2ecf20Sopenharmony_ci		"board_type = 0x%x\n", rtlefuse->board_type);
21078c2ecf20Sopenharmony_ci
21088c2ecf20Sopenharmony_ci	rtlhal->package_type = _rtl8723be_read_package_type(hw);
21098c2ecf20Sopenharmony_ci
21108c2ecf20Sopenharmony_ci	/* set channel plan from efuse */
21118c2ecf20Sopenharmony_ci	rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
21128c2ecf20Sopenharmony_ci
21138c2ecf20Sopenharmony_ci	if (rtlhal->oem_id == RT_CID_DEFAULT) {
21148c2ecf20Sopenharmony_ci		/* Does this one have a Toshiba SMID from group 1? */
21158c2ecf20Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(toshiba_smid1); i++) {
21168c2ecf20Sopenharmony_ci			if (rtlefuse->eeprom_smid == toshiba_smid1[i]) {
21178c2ecf20Sopenharmony_ci				is_toshiba_smid1 = true;
21188c2ecf20Sopenharmony_ci				break;
21198c2ecf20Sopenharmony_ci			}
21208c2ecf20Sopenharmony_ci		}
21218c2ecf20Sopenharmony_ci		/* Does this one have a Toshiba SMID from group 2? */
21228c2ecf20Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(toshiba_smid2); i++) {
21238c2ecf20Sopenharmony_ci			if (rtlefuse->eeprom_smid == toshiba_smid2[i]) {
21248c2ecf20Sopenharmony_ci				is_toshiba_smid2 = true;
21258c2ecf20Sopenharmony_ci				break;
21268c2ecf20Sopenharmony_ci			}
21278c2ecf20Sopenharmony_ci		}
21288c2ecf20Sopenharmony_ci		/* Does this one have a Samsung SMID? */
21298c2ecf20Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(samsung_smid); i++) {
21308c2ecf20Sopenharmony_ci			if (rtlefuse->eeprom_smid == samsung_smid[i]) {
21318c2ecf20Sopenharmony_ci				is_samsung_smid = true;
21328c2ecf20Sopenharmony_ci				break;
21338c2ecf20Sopenharmony_ci			}
21348c2ecf20Sopenharmony_ci		}
21358c2ecf20Sopenharmony_ci		/* Does this one have a Lenovo SMID? */
21368c2ecf20Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(lenovo_smid); i++) {
21378c2ecf20Sopenharmony_ci			if (rtlefuse->eeprom_smid == lenovo_smid[i]) {
21388c2ecf20Sopenharmony_ci				is_lenovo_smid = true;
21398c2ecf20Sopenharmony_ci				break;
21408c2ecf20Sopenharmony_ci			}
21418c2ecf20Sopenharmony_ci		}
21428c2ecf20Sopenharmony_ci		switch (rtlefuse->eeprom_oemid) {
21438c2ecf20Sopenharmony_ci		case EEPROM_CID_DEFAULT:
21448c2ecf20Sopenharmony_ci			if (rtlefuse->eeprom_did == 0x8176) {
21458c2ecf20Sopenharmony_ci				if (rtlefuse->eeprom_svid == 0x10EC &&
21468c2ecf20Sopenharmony_ci				    is_toshiba_smid1) {
21478c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_TOSHIBA;
21488c2ecf20Sopenharmony_ci				} else if (rtlefuse->eeprom_svid == 0x1025) {
21498c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_ACER;
21508c2ecf20Sopenharmony_ci				} else if (rtlefuse->eeprom_svid == 0x10EC &&
21518c2ecf20Sopenharmony_ci					   is_samsung_smid) {
21528c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_SAMSUNG;
21538c2ecf20Sopenharmony_ci				} else if (rtlefuse->eeprom_svid == 0x10EC &&
21548c2ecf20Sopenharmony_ci					   is_lenovo_smid) {
21558c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_LENOVO;
21568c2ecf20Sopenharmony_ci				} else if ((rtlefuse->eeprom_svid == 0x10EC &&
21578c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x8197) ||
21588c2ecf20Sopenharmony_ci					   (rtlefuse->eeprom_svid == 0x10EC &&
21598c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x9196)) {
21608c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_CLEVO;
21618c2ecf20Sopenharmony_ci				} else if ((rtlefuse->eeprom_svid == 0x1028 &&
21628c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x8194) ||
21638c2ecf20Sopenharmony_ci					   (rtlefuse->eeprom_svid == 0x1028 &&
21648c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x8198) ||
21658c2ecf20Sopenharmony_ci					   (rtlefuse->eeprom_svid == 0x1028 &&
21668c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x9197) ||
21678c2ecf20Sopenharmony_ci					   (rtlefuse->eeprom_svid == 0x1028 &&
21688c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x9198)) {
21698c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_DELL;
21708c2ecf20Sopenharmony_ci				} else if ((rtlefuse->eeprom_svid == 0x103C &&
21718c2ecf20Sopenharmony_ci					    rtlefuse->eeprom_smid == 0x1629)) {
21728c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_HP;
21738c2ecf20Sopenharmony_ci				} else if ((rtlefuse->eeprom_svid == 0x1A32 &&
21748c2ecf20Sopenharmony_ci					   rtlefuse->eeprom_smid == 0x2315)) {
21758c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_QMI;
21768c2ecf20Sopenharmony_ci				} else if ((rtlefuse->eeprom_svid == 0x10EC &&
21778c2ecf20Sopenharmony_ci					   rtlefuse->eeprom_smid == 0x8203)) {
21788c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_PRONETS;
21798c2ecf20Sopenharmony_ci				} else if ((rtlefuse->eeprom_svid == 0x1043 &&
21808c2ecf20Sopenharmony_ci					   rtlefuse->eeprom_smid == 0x84B5)) {
21818c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_EDIMAX_ASUS;
21828c2ecf20Sopenharmony_ci				} else {
21838c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_DEFAULT;
21848c2ecf20Sopenharmony_ci				}
21858c2ecf20Sopenharmony_ci			} else if (rtlefuse->eeprom_did == 0x8178) {
21868c2ecf20Sopenharmony_ci				if (rtlefuse->eeprom_svid == 0x10EC &&
21878c2ecf20Sopenharmony_ci				    is_toshiba_smid2)
21888c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_TOSHIBA;
21898c2ecf20Sopenharmony_ci				else if (rtlefuse->eeprom_svid == 0x1025)
21908c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_ACER;
21918c2ecf20Sopenharmony_ci				else if ((rtlefuse->eeprom_svid == 0x10EC &&
21928c2ecf20Sopenharmony_ci					  rtlefuse->eeprom_smid == 0x8186))
21938c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_819X_PRONETS;
21948c2ecf20Sopenharmony_ci				else if ((rtlefuse->eeprom_svid == 0x1043 &&
21958c2ecf20Sopenharmony_ci					  rtlefuse->eeprom_smid == 0x84B6))
21968c2ecf20Sopenharmony_ci					rtlhal->oem_id =
21978c2ecf20Sopenharmony_ci							RT_CID_819X_EDIMAX_ASUS;
21988c2ecf20Sopenharmony_ci				else
21998c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_DEFAULT;
22008c2ecf20Sopenharmony_ci			} else {
22018c2ecf20Sopenharmony_ci					rtlhal->oem_id = RT_CID_DEFAULT;
22028c2ecf20Sopenharmony_ci			}
22038c2ecf20Sopenharmony_ci			break;
22048c2ecf20Sopenharmony_ci		case EEPROM_CID_TOSHIBA:
22058c2ecf20Sopenharmony_ci			rtlhal->oem_id = RT_CID_TOSHIBA;
22068c2ecf20Sopenharmony_ci			break;
22078c2ecf20Sopenharmony_ci		case EEPROM_CID_CCX:
22088c2ecf20Sopenharmony_ci			rtlhal->oem_id = RT_CID_CCX;
22098c2ecf20Sopenharmony_ci			break;
22108c2ecf20Sopenharmony_ci		case EEPROM_CID_QMI:
22118c2ecf20Sopenharmony_ci			rtlhal->oem_id = RT_CID_819X_QMI;
22128c2ecf20Sopenharmony_ci			break;
22138c2ecf20Sopenharmony_ci		case EEPROM_CID_WHQL:
22148c2ecf20Sopenharmony_ci			break;
22158c2ecf20Sopenharmony_ci		default:
22168c2ecf20Sopenharmony_ci			rtlhal->oem_id = RT_CID_DEFAULT;
22178c2ecf20Sopenharmony_ci			break;
22188c2ecf20Sopenharmony_ci		}
22198c2ecf20Sopenharmony_ci	}
22208c2ecf20Sopenharmony_ciexit:
22218c2ecf20Sopenharmony_ci	kfree(hwinfo);
22228c2ecf20Sopenharmony_ci}
22238c2ecf20Sopenharmony_ci
22248c2ecf20Sopenharmony_cistatic void _rtl8723be_hal_customized_behavior(struct ieee80211_hw *hw)
22258c2ecf20Sopenharmony_ci{
22268c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
22278c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
22288c2ecf20Sopenharmony_ci
22298c2ecf20Sopenharmony_ci	rtlpriv->ledctl.led_opendrain = true;
22308c2ecf20Sopenharmony_ci	switch (rtlhal->oem_id) {
22318c2ecf20Sopenharmony_ci	case RT_CID_819X_HP:
22328c2ecf20Sopenharmony_ci		rtlpriv->ledctl.led_opendrain = true;
22338c2ecf20Sopenharmony_ci		break;
22348c2ecf20Sopenharmony_ci	case RT_CID_819X_LENOVO:
22358c2ecf20Sopenharmony_ci	case RT_CID_DEFAULT:
22368c2ecf20Sopenharmony_ci	case RT_CID_TOSHIBA:
22378c2ecf20Sopenharmony_ci	case RT_CID_CCX:
22388c2ecf20Sopenharmony_ci	case RT_CID_819X_ACER:
22398c2ecf20Sopenharmony_ci	case RT_CID_WHQL:
22408c2ecf20Sopenharmony_ci	default:
22418c2ecf20Sopenharmony_ci		break;
22428c2ecf20Sopenharmony_ci	}
22438c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
22448c2ecf20Sopenharmony_ci		"RT Customized ID: 0x%02X\n", rtlhal->oem_id);
22458c2ecf20Sopenharmony_ci}
22468c2ecf20Sopenharmony_ci
22478c2ecf20Sopenharmony_civoid rtl8723be_read_eeprom_info(struct ieee80211_hw *hw)
22488c2ecf20Sopenharmony_ci{
22498c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
22508c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
22518c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
22528c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
22538c2ecf20Sopenharmony_ci	u8 tmp_u1b;
22548c2ecf20Sopenharmony_ci
22558c2ecf20Sopenharmony_ci	rtlhal->version = _rtl8723be_read_chip_version(hw);
22568c2ecf20Sopenharmony_ci	if (get_rf_type(rtlphy) == RF_1T1R)
22578c2ecf20Sopenharmony_ci		rtlpriv->dm.rfpath_rxenable[0] = true;
22588c2ecf20Sopenharmony_ci	else
22598c2ecf20Sopenharmony_ci		rtlpriv->dm.rfpath_rxenable[0] =
22608c2ecf20Sopenharmony_ci		    rtlpriv->dm.rfpath_rxenable[1] = true;
22618c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
22628c2ecf20Sopenharmony_ci		rtlhal->version);
22638c2ecf20Sopenharmony_ci	tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
22648c2ecf20Sopenharmony_ci	if (tmp_u1b & BIT(4)) {
22658c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
22668c2ecf20Sopenharmony_ci		rtlefuse->epromtype = EEPROM_93C46;
22678c2ecf20Sopenharmony_ci	} else {
22688c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
22698c2ecf20Sopenharmony_ci		rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
22708c2ecf20Sopenharmony_ci	}
22718c2ecf20Sopenharmony_ci	if (tmp_u1b & BIT(5)) {
22728c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
22738c2ecf20Sopenharmony_ci		rtlefuse->autoload_failflag = false;
22748c2ecf20Sopenharmony_ci		_rtl8723be_read_adapter_info(hw, false);
22758c2ecf20Sopenharmony_ci	} else {
22768c2ecf20Sopenharmony_ci		pr_err("Autoload ERR!!\n");
22778c2ecf20Sopenharmony_ci	}
22788c2ecf20Sopenharmony_ci	_rtl8723be_hal_customized_behavior(hw);
22798c2ecf20Sopenharmony_ci}
22808c2ecf20Sopenharmony_ci
22818c2ecf20Sopenharmony_cistatic u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw,
22828c2ecf20Sopenharmony_ci					  u8 rate_index)
22838c2ecf20Sopenharmony_ci{
22848c2ecf20Sopenharmony_ci	u8 ret = 0;
22858c2ecf20Sopenharmony_ci	switch (rate_index) {
22868c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_NGB:
22878c2ecf20Sopenharmony_ci		ret = 1;
22888c2ecf20Sopenharmony_ci		break;
22898c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_N:
22908c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_NG:
22918c2ecf20Sopenharmony_ci		ret = 5;
22928c2ecf20Sopenharmony_ci		break;
22938c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_NB:
22948c2ecf20Sopenharmony_ci		ret = 3;
22958c2ecf20Sopenharmony_ci		break;
22968c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_GB:
22978c2ecf20Sopenharmony_ci		ret = 6;
22988c2ecf20Sopenharmony_ci		break;
22998c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_G:
23008c2ecf20Sopenharmony_ci		ret = 7;
23018c2ecf20Sopenharmony_ci		break;
23028c2ecf20Sopenharmony_ci	case RATR_INX_WIRELESS_B:
23038c2ecf20Sopenharmony_ci		ret = 8;
23048c2ecf20Sopenharmony_ci		break;
23058c2ecf20Sopenharmony_ci	default:
23068c2ecf20Sopenharmony_ci		ret = 0;
23078c2ecf20Sopenharmony_ci		break;
23088c2ecf20Sopenharmony_ci	}
23098c2ecf20Sopenharmony_ci	return ret;
23108c2ecf20Sopenharmony_ci}
23118c2ecf20Sopenharmony_ci
23128c2ecf20Sopenharmony_cistatic void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
23138c2ecf20Sopenharmony_ci					   struct ieee80211_sta *sta,
23148c2ecf20Sopenharmony_ci					   u8 rssi_level, bool update_bw)
23158c2ecf20Sopenharmony_ci{
23168c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
23178c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
23188c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
23198c2ecf20Sopenharmony_ci	struct rtl_sta_info *sta_entry = NULL;
23208c2ecf20Sopenharmony_ci	u32 ratr_bitmap;
23218c2ecf20Sopenharmony_ci	u8 ratr_index;
23228c2ecf20Sopenharmony_ci	u8 curtxbw_40mhz = (sta->ht_cap.cap &
23238c2ecf20Sopenharmony_ci			      IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
23248c2ecf20Sopenharmony_ci	u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
23258c2ecf20Sopenharmony_ci				1 : 0;
23268c2ecf20Sopenharmony_ci	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
23278c2ecf20Sopenharmony_ci				1 : 0;
23288c2ecf20Sopenharmony_ci	enum wireless_mode wirelessmode = 0;
23298c2ecf20Sopenharmony_ci	bool shortgi = false;
23308c2ecf20Sopenharmony_ci	u8 rate_mask[7];
23318c2ecf20Sopenharmony_ci	u8 macid = 0;
23328c2ecf20Sopenharmony_ci
23338c2ecf20Sopenharmony_ci	sta_entry = (struct rtl_sta_info *)sta->drv_priv;
23348c2ecf20Sopenharmony_ci	wirelessmode = sta_entry->wireless_mode;
23358c2ecf20Sopenharmony_ci	if (mac->opmode == NL80211_IFTYPE_STATION ||
23368c2ecf20Sopenharmony_ci	    mac->opmode == NL80211_IFTYPE_MESH_POINT)
23378c2ecf20Sopenharmony_ci		curtxbw_40mhz = mac->bw_40;
23388c2ecf20Sopenharmony_ci	else if (mac->opmode == NL80211_IFTYPE_AP ||
23398c2ecf20Sopenharmony_ci		 mac->opmode == NL80211_IFTYPE_ADHOC)
23408c2ecf20Sopenharmony_ci		macid = sta->aid + 1;
23418c2ecf20Sopenharmony_ci
23428c2ecf20Sopenharmony_ci	ratr_bitmap = sta->supp_rates[0];
23438c2ecf20Sopenharmony_ci
23448c2ecf20Sopenharmony_ci	if (mac->opmode == NL80211_IFTYPE_ADHOC)
23458c2ecf20Sopenharmony_ci		ratr_bitmap = 0xfff;
23468c2ecf20Sopenharmony_ci
23478c2ecf20Sopenharmony_ci	ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
23488c2ecf20Sopenharmony_ci			sta->ht_cap.mcs.rx_mask[0] << 12);
23498c2ecf20Sopenharmony_ci	switch (wirelessmode) {
23508c2ecf20Sopenharmony_ci	case WIRELESS_MODE_B:
23518c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_B;
23528c2ecf20Sopenharmony_ci		if (ratr_bitmap & 0x0000000c)
23538c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x0000000d;
23548c2ecf20Sopenharmony_ci		else
23558c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x0000000f;
23568c2ecf20Sopenharmony_ci		break;
23578c2ecf20Sopenharmony_ci	case WIRELESS_MODE_G:
23588c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_GB;
23598c2ecf20Sopenharmony_ci
23608c2ecf20Sopenharmony_ci		if (rssi_level == 1)
23618c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x00000f00;
23628c2ecf20Sopenharmony_ci		else if (rssi_level == 2)
23638c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x00000ff0;
23648c2ecf20Sopenharmony_ci		else
23658c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x00000ff5;
23668c2ecf20Sopenharmony_ci		break;
23678c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_24G:
23688c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_5G:
23698c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_NGB;
23708c2ecf20Sopenharmony_ci		if (rtlphy->rf_type == RF_1T1R) {
23718c2ecf20Sopenharmony_ci			if (curtxbw_40mhz) {
23728c2ecf20Sopenharmony_ci				if (rssi_level == 1)
23738c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000f0000;
23748c2ecf20Sopenharmony_ci				else if (rssi_level == 2)
23758c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000ff000;
23768c2ecf20Sopenharmony_ci				else
23778c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000ff015;
23788c2ecf20Sopenharmony_ci			} else {
23798c2ecf20Sopenharmony_ci				if (rssi_level == 1)
23808c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000f0000;
23818c2ecf20Sopenharmony_ci				else if (rssi_level == 2)
23828c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000ff000;
23838c2ecf20Sopenharmony_ci				else
23848c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000ff005;
23858c2ecf20Sopenharmony_ci			}
23868c2ecf20Sopenharmony_ci		} else {
23878c2ecf20Sopenharmony_ci			if (curtxbw_40mhz) {
23888c2ecf20Sopenharmony_ci				if (rssi_level == 1)
23898c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8f0000;
23908c2ecf20Sopenharmony_ci				else if (rssi_level == 2)
23918c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8ff000;
23928c2ecf20Sopenharmony_ci				else
23938c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8ff015;
23948c2ecf20Sopenharmony_ci			} else {
23958c2ecf20Sopenharmony_ci				if (rssi_level == 1)
23968c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8f0000;
23978c2ecf20Sopenharmony_ci				else if (rssi_level == 2)
23988c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8ff000;
23998c2ecf20Sopenharmony_ci				else
24008c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8ff005;
24018c2ecf20Sopenharmony_ci			}
24028c2ecf20Sopenharmony_ci		}
24038c2ecf20Sopenharmony_ci		if ((curtxbw_40mhz && curshortgi_40mhz) ||
24048c2ecf20Sopenharmony_ci		    (!curtxbw_40mhz && curshortgi_20mhz)) {
24058c2ecf20Sopenharmony_ci			if (macid == 0)
24068c2ecf20Sopenharmony_ci				shortgi = true;
24078c2ecf20Sopenharmony_ci			else if (macid == 1)
24088c2ecf20Sopenharmony_ci				shortgi = false;
24098c2ecf20Sopenharmony_ci		}
24108c2ecf20Sopenharmony_ci		break;
24118c2ecf20Sopenharmony_ci	default:
24128c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_NGB;
24138c2ecf20Sopenharmony_ci
24148c2ecf20Sopenharmony_ci		if (rtlphy->rf_type == RF_1T2R)
24158c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x000ff0ff;
24168c2ecf20Sopenharmony_ci		else
24178c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x0f0ff0ff;
24188c2ecf20Sopenharmony_ci		break;
24198c2ecf20Sopenharmony_ci	}
24208c2ecf20Sopenharmony_ci
24218c2ecf20Sopenharmony_ci	sta_entry->ratr_index = ratr_index;
24228c2ecf20Sopenharmony_ci
24238c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
24248c2ecf20Sopenharmony_ci		"ratr_bitmap :%x\n", ratr_bitmap);
24258c2ecf20Sopenharmony_ci	*(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
24268c2ecf20Sopenharmony_ci				       (ratr_index << 28);
24278c2ecf20Sopenharmony_ci	rate_mask[0] = macid;
24288c2ecf20Sopenharmony_ci	rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) |
24298c2ecf20Sopenharmony_ci						      (shortgi ? 0x80 : 0x00);
24308c2ecf20Sopenharmony_ci	rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3);
24318c2ecf20Sopenharmony_ci
24328c2ecf20Sopenharmony_ci	rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
24338c2ecf20Sopenharmony_ci	rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
24348c2ecf20Sopenharmony_ci	rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
24358c2ecf20Sopenharmony_ci	rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
24368c2ecf20Sopenharmony_ci
24378c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
24388c2ecf20Sopenharmony_ci		"Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
24398c2ecf20Sopenharmony_ci		ratr_index, ratr_bitmap,
24408c2ecf20Sopenharmony_ci		rate_mask[0], rate_mask[1],
24418c2ecf20Sopenharmony_ci		rate_mask[2], rate_mask[3],
24428c2ecf20Sopenharmony_ci		rate_mask[4], rate_mask[5],
24438c2ecf20Sopenharmony_ci		rate_mask[6]);
24448c2ecf20Sopenharmony_ci	rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RA_MASK, 7, rate_mask);
24458c2ecf20Sopenharmony_ci	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
24468c2ecf20Sopenharmony_ci}
24478c2ecf20Sopenharmony_ci
24488c2ecf20Sopenharmony_civoid rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
24498c2ecf20Sopenharmony_ci				   struct ieee80211_sta *sta,
24508c2ecf20Sopenharmony_ci				   u8 rssi_level, bool update_bw)
24518c2ecf20Sopenharmony_ci{
24528c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
24538c2ecf20Sopenharmony_ci	if (rtlpriv->dm.useramask)
24548c2ecf20Sopenharmony_ci		rtl8723be_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
24558c2ecf20Sopenharmony_ci}
24568c2ecf20Sopenharmony_ci
24578c2ecf20Sopenharmony_civoid rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw)
24588c2ecf20Sopenharmony_ci{
24598c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
24608c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
24618c2ecf20Sopenharmony_ci	u16 sifs_timer;
24628c2ecf20Sopenharmony_ci
24638c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);
24648c2ecf20Sopenharmony_ci	if (!mac->ht_enable)
24658c2ecf20Sopenharmony_ci		sifs_timer = 0x0a0a;
24668c2ecf20Sopenharmony_ci	else
24678c2ecf20Sopenharmony_ci		sifs_timer = 0x0e0e;
24688c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
24698c2ecf20Sopenharmony_ci}
24708c2ecf20Sopenharmony_ci
24718c2ecf20Sopenharmony_cibool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
24728c2ecf20Sopenharmony_ci{
24738c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
24748c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
24758c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
24768c2ecf20Sopenharmony_ci	enum rf_pwrstate e_rfpowerstate_toset;
24778c2ecf20Sopenharmony_ci	u8 u1tmp;
24788c2ecf20Sopenharmony_ci	bool b_actuallyset = false;
24798c2ecf20Sopenharmony_ci
24808c2ecf20Sopenharmony_ci	if (rtlpriv->rtlhal.being_init_adapter)
24818c2ecf20Sopenharmony_ci		return false;
24828c2ecf20Sopenharmony_ci
24838c2ecf20Sopenharmony_ci	if (ppsc->swrf_processing)
24848c2ecf20Sopenharmony_ci		return false;
24858c2ecf20Sopenharmony_ci
24868c2ecf20Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_ps_lock);
24878c2ecf20Sopenharmony_ci	if (ppsc->rfchange_inprogress) {
24888c2ecf20Sopenharmony_ci		spin_unlock(&rtlpriv->locks.rf_ps_lock);
24898c2ecf20Sopenharmony_ci		return false;
24908c2ecf20Sopenharmony_ci	} else {
24918c2ecf20Sopenharmony_ci		ppsc->rfchange_inprogress = true;
24928c2ecf20Sopenharmony_ci		spin_unlock(&rtlpriv->locks.rf_ps_lock);
24938c2ecf20Sopenharmony_ci	}
24948c2ecf20Sopenharmony_ci
24958c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
24968c2ecf20Sopenharmony_ci		       rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2) & ~(BIT(1)));
24978c2ecf20Sopenharmony_ci
24988c2ecf20Sopenharmony_ci	u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
24998c2ecf20Sopenharmony_ci
25008c2ecf20Sopenharmony_ci	if (rtlphy->polarity_ctl)
25018c2ecf20Sopenharmony_ci		e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
25028c2ecf20Sopenharmony_ci	else
25038c2ecf20Sopenharmony_ci		e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
25048c2ecf20Sopenharmony_ci
25058c2ecf20Sopenharmony_ci	if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
25068c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
25078c2ecf20Sopenharmony_ci			"GPIOChangeRF  - HW Radio ON, RF ON\n");
25088c2ecf20Sopenharmony_ci
25098c2ecf20Sopenharmony_ci		e_rfpowerstate_toset = ERFON;
25108c2ecf20Sopenharmony_ci		ppsc->hwradiooff = false;
25118c2ecf20Sopenharmony_ci		b_actuallyset = true;
25128c2ecf20Sopenharmony_ci	} else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
25138c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
25148c2ecf20Sopenharmony_ci			"GPIOChangeRF  - HW Radio OFF, RF OFF\n");
25158c2ecf20Sopenharmony_ci
25168c2ecf20Sopenharmony_ci		e_rfpowerstate_toset = ERFOFF;
25178c2ecf20Sopenharmony_ci		ppsc->hwradiooff = true;
25188c2ecf20Sopenharmony_ci		b_actuallyset = true;
25198c2ecf20Sopenharmony_ci	}
25208c2ecf20Sopenharmony_ci
25218c2ecf20Sopenharmony_ci	if (b_actuallyset) {
25228c2ecf20Sopenharmony_ci		spin_lock(&rtlpriv->locks.rf_ps_lock);
25238c2ecf20Sopenharmony_ci		ppsc->rfchange_inprogress = false;
25248c2ecf20Sopenharmony_ci		spin_unlock(&rtlpriv->locks.rf_ps_lock);
25258c2ecf20Sopenharmony_ci	} else {
25268c2ecf20Sopenharmony_ci		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
25278c2ecf20Sopenharmony_ci			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
25288c2ecf20Sopenharmony_ci
25298c2ecf20Sopenharmony_ci		spin_lock(&rtlpriv->locks.rf_ps_lock);
25308c2ecf20Sopenharmony_ci		ppsc->rfchange_inprogress = false;
25318c2ecf20Sopenharmony_ci		spin_unlock(&rtlpriv->locks.rf_ps_lock);
25328c2ecf20Sopenharmony_ci	}
25338c2ecf20Sopenharmony_ci
25348c2ecf20Sopenharmony_ci	*valid = 1;
25358c2ecf20Sopenharmony_ci	return !ppsc->hwradiooff;
25368c2ecf20Sopenharmony_ci
25378c2ecf20Sopenharmony_ci}
25388c2ecf20Sopenharmony_ci
25398c2ecf20Sopenharmony_civoid rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
25408c2ecf20Sopenharmony_ci		       u8 *p_macaddr, bool is_group, u8 enc_algo,
25418c2ecf20Sopenharmony_ci		       bool is_wepkey, bool clear_all)
25428c2ecf20Sopenharmony_ci{
25438c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
25448c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
25458c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
25468c2ecf20Sopenharmony_ci	u8 *macaddr = p_macaddr;
25478c2ecf20Sopenharmony_ci	u32 entry_id = 0;
25488c2ecf20Sopenharmony_ci	bool is_pairwise = false;
25498c2ecf20Sopenharmony_ci
25508c2ecf20Sopenharmony_ci	static u8 cam_const_addr[4][6] = {
25518c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
25528c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
25538c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
25548c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
25558c2ecf20Sopenharmony_ci	};
25568c2ecf20Sopenharmony_ci	static u8 cam_const_broad[] = {
25578c2ecf20Sopenharmony_ci		0xff, 0xff, 0xff, 0xff, 0xff, 0xff
25588c2ecf20Sopenharmony_ci	};
25598c2ecf20Sopenharmony_ci
25608c2ecf20Sopenharmony_ci	if (clear_all) {
25618c2ecf20Sopenharmony_ci		u8 idx = 0;
25628c2ecf20Sopenharmony_ci		u8 cam_offset = 0;
25638c2ecf20Sopenharmony_ci		u8 clear_number = 5;
25648c2ecf20Sopenharmony_ci
25658c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
25668c2ecf20Sopenharmony_ci
25678c2ecf20Sopenharmony_ci		for (idx = 0; idx < clear_number; idx++) {
25688c2ecf20Sopenharmony_ci			rtl_cam_mark_invalid(hw, cam_offset + idx);
25698c2ecf20Sopenharmony_ci			rtl_cam_empty_entry(hw, cam_offset + idx);
25708c2ecf20Sopenharmony_ci
25718c2ecf20Sopenharmony_ci			if (idx < 5) {
25728c2ecf20Sopenharmony_ci				memset(rtlpriv->sec.key_buf[idx], 0,
25738c2ecf20Sopenharmony_ci				       MAX_KEY_LEN);
25748c2ecf20Sopenharmony_ci				rtlpriv->sec.key_len[idx] = 0;
25758c2ecf20Sopenharmony_ci			}
25768c2ecf20Sopenharmony_ci		}
25778c2ecf20Sopenharmony_ci
25788c2ecf20Sopenharmony_ci	} else {
25798c2ecf20Sopenharmony_ci		switch (enc_algo) {
25808c2ecf20Sopenharmony_ci		case WEP40_ENCRYPTION:
25818c2ecf20Sopenharmony_ci			enc_algo = CAM_WEP40;
25828c2ecf20Sopenharmony_ci			break;
25838c2ecf20Sopenharmony_ci		case WEP104_ENCRYPTION:
25848c2ecf20Sopenharmony_ci			enc_algo = CAM_WEP104;
25858c2ecf20Sopenharmony_ci			break;
25868c2ecf20Sopenharmony_ci		case TKIP_ENCRYPTION:
25878c2ecf20Sopenharmony_ci			enc_algo = CAM_TKIP;
25888c2ecf20Sopenharmony_ci			break;
25898c2ecf20Sopenharmony_ci		case AESCCMP_ENCRYPTION:
25908c2ecf20Sopenharmony_ci			enc_algo = CAM_AES;
25918c2ecf20Sopenharmony_ci			break;
25928c2ecf20Sopenharmony_ci		default:
25938c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
25948c2ecf20Sopenharmony_ci				"switch case %#x not processed\n", enc_algo);
25958c2ecf20Sopenharmony_ci			enc_algo = CAM_TKIP;
25968c2ecf20Sopenharmony_ci			break;
25978c2ecf20Sopenharmony_ci		}
25988c2ecf20Sopenharmony_ci
25998c2ecf20Sopenharmony_ci		if (is_wepkey || rtlpriv->sec.use_defaultkey) {
26008c2ecf20Sopenharmony_ci			macaddr = cam_const_addr[key_index];
26018c2ecf20Sopenharmony_ci			entry_id = key_index;
26028c2ecf20Sopenharmony_ci		} else {
26038c2ecf20Sopenharmony_ci			if (is_group) {
26048c2ecf20Sopenharmony_ci				macaddr = cam_const_broad;
26058c2ecf20Sopenharmony_ci				entry_id = key_index;
26068c2ecf20Sopenharmony_ci			} else {
26078c2ecf20Sopenharmony_ci				if (mac->opmode == NL80211_IFTYPE_AP) {
26088c2ecf20Sopenharmony_ci					entry_id = rtl_cam_get_free_entry(hw,
26098c2ecf20Sopenharmony_ci								p_macaddr);
26108c2ecf20Sopenharmony_ci					if (entry_id >=  TOTAL_CAM_ENTRY) {
26118c2ecf20Sopenharmony_ci						pr_err("Can not find free hw security cam entry\n");
26128c2ecf20Sopenharmony_ci						return;
26138c2ecf20Sopenharmony_ci					}
26148c2ecf20Sopenharmony_ci				} else {
26158c2ecf20Sopenharmony_ci					entry_id = CAM_PAIRWISE_KEY_POSITION;
26168c2ecf20Sopenharmony_ci				}
26178c2ecf20Sopenharmony_ci
26188c2ecf20Sopenharmony_ci				key_index = PAIRWISE_KEYIDX;
26198c2ecf20Sopenharmony_ci				is_pairwise = true;
26208c2ecf20Sopenharmony_ci			}
26218c2ecf20Sopenharmony_ci		}
26228c2ecf20Sopenharmony_ci
26238c2ecf20Sopenharmony_ci		if (rtlpriv->sec.key_len[key_index] == 0) {
26248c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
26258c2ecf20Sopenharmony_ci				"delete one entry, entry_id is %d\n",
26268c2ecf20Sopenharmony_ci				entry_id);
26278c2ecf20Sopenharmony_ci			if (mac->opmode == NL80211_IFTYPE_AP)
26288c2ecf20Sopenharmony_ci				rtl_cam_del_entry(hw, p_macaddr);
26298c2ecf20Sopenharmony_ci			rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
26308c2ecf20Sopenharmony_ci		} else {
26318c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
26328c2ecf20Sopenharmony_ci				"add one entry\n");
26338c2ecf20Sopenharmony_ci			if (is_pairwise) {
26348c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
26358c2ecf20Sopenharmony_ci					"set Pairwise key\n");
26368c2ecf20Sopenharmony_ci
26378c2ecf20Sopenharmony_ci				rtl_cam_add_one_entry(hw, macaddr, key_index,
26388c2ecf20Sopenharmony_ci					       entry_id, enc_algo,
26398c2ecf20Sopenharmony_ci					       CAM_CONFIG_NO_USEDK,
26408c2ecf20Sopenharmony_ci					       rtlpriv->sec.key_buf[key_index]);
26418c2ecf20Sopenharmony_ci			} else {
26428c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
26438c2ecf20Sopenharmony_ci					"set group key\n");
26448c2ecf20Sopenharmony_ci
26458c2ecf20Sopenharmony_ci				if (mac->opmode == NL80211_IFTYPE_ADHOC) {
26468c2ecf20Sopenharmony_ci					rtl_cam_add_one_entry(hw,
26478c2ecf20Sopenharmony_ci						rtlefuse->dev_addr,
26488c2ecf20Sopenharmony_ci						PAIRWISE_KEYIDX,
26498c2ecf20Sopenharmony_ci						CAM_PAIRWISE_KEY_POSITION,
26508c2ecf20Sopenharmony_ci						enc_algo,
26518c2ecf20Sopenharmony_ci						CAM_CONFIG_NO_USEDK,
26528c2ecf20Sopenharmony_ci						rtlpriv->sec.key_buf
26538c2ecf20Sopenharmony_ci						[entry_id]);
26548c2ecf20Sopenharmony_ci				}
26558c2ecf20Sopenharmony_ci
26568c2ecf20Sopenharmony_ci				rtl_cam_add_one_entry(hw, macaddr, key_index,
26578c2ecf20Sopenharmony_ci						entry_id, enc_algo,
26588c2ecf20Sopenharmony_ci						CAM_CONFIG_NO_USEDK,
26598c2ecf20Sopenharmony_ci						rtlpriv->sec.key_buf[entry_id]);
26608c2ecf20Sopenharmony_ci			}
26618c2ecf20Sopenharmony_ci		}
26628c2ecf20Sopenharmony_ci	}
26638c2ecf20Sopenharmony_ci}
26648c2ecf20Sopenharmony_ci
26658c2ecf20Sopenharmony_civoid rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
26668c2ecf20Sopenharmony_ci					      bool auto_load_fail, u8 *hwinfo)
26678c2ecf20Sopenharmony_ci{
26688c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
26698c2ecf20Sopenharmony_ci	struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params;
26708c2ecf20Sopenharmony_ci	u8 value;
26718c2ecf20Sopenharmony_ci	u32 tmpu_32;
26728c2ecf20Sopenharmony_ci
26738c2ecf20Sopenharmony_ci	if (!auto_load_fail) {
26748c2ecf20Sopenharmony_ci		tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
26758c2ecf20Sopenharmony_ci		if (tmpu_32 & BIT(18))
26768c2ecf20Sopenharmony_ci			rtlpriv->btcoexist.btc_info.btcoexist = 1;
26778c2ecf20Sopenharmony_ci		else
26788c2ecf20Sopenharmony_ci			rtlpriv->btcoexist.btc_info.btcoexist = 0;
26798c2ecf20Sopenharmony_ci		value = hwinfo[EEPROM_RF_BT_SETTING_8723B];
26808c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
26818c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
26828c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.single_ant_path =
26838c2ecf20Sopenharmony_ci			 (value & 0x40 ? ANT_AUX : ANT_MAIN);	/*0xc3[6]*/
26848c2ecf20Sopenharmony_ci	} else {
26858c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.btcoexist = 0;
26868c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
26878c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
26888c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.single_ant_path = ANT_MAIN;
26898c2ecf20Sopenharmony_ci	}
26908c2ecf20Sopenharmony_ci
26918c2ecf20Sopenharmony_ci	/* override ant_num / ant_path */
26928c2ecf20Sopenharmony_ci	if (mod_params->ant_sel) {
26938c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.ant_num =
26948c2ecf20Sopenharmony_ci			(mod_params->ant_sel == 1 ? ANT_X1 : ANT_X2);
26958c2ecf20Sopenharmony_ci
26968c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_info.single_ant_path =
26978c2ecf20Sopenharmony_ci			(mod_params->ant_sel == 1 ? ANT_AUX : ANT_MAIN);
26988c2ecf20Sopenharmony_ci	}
26998c2ecf20Sopenharmony_ci}
27008c2ecf20Sopenharmony_ci
27018c2ecf20Sopenharmony_civoid rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
27028c2ecf20Sopenharmony_ci{
27038c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
27048c2ecf20Sopenharmony_ci
27058c2ecf20Sopenharmony_ci	/* 0:Low, 1:High, 2:From Efuse. */
27068c2ecf20Sopenharmony_ci	rtlpriv->btcoexist.reg_bt_iso = 2;
27078c2ecf20Sopenharmony_ci	/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
27088c2ecf20Sopenharmony_ci	rtlpriv->btcoexist.reg_bt_sco = 3;
27098c2ecf20Sopenharmony_ci	/* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
27108c2ecf20Sopenharmony_ci	rtlpriv->btcoexist.reg_bt_sco = 0;
27118c2ecf20Sopenharmony_ci}
27128c2ecf20Sopenharmony_ci
27138c2ecf20Sopenharmony_civoid rtl8723be_bt_hw_init(struct ieee80211_hw *hw)
27148c2ecf20Sopenharmony_ci{
27158c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
27168c2ecf20Sopenharmony_ci
27178c2ecf20Sopenharmony_ci	if (rtlpriv->cfg->ops->get_btc_status())
27188c2ecf20Sopenharmony_ci		rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
27198c2ecf20Sopenharmony_ci
27208c2ecf20Sopenharmony_ci}
27218c2ecf20Sopenharmony_ci
27228c2ecf20Sopenharmony_civoid rtl8723be_suspend(struct ieee80211_hw *hw)
27238c2ecf20Sopenharmony_ci{
27248c2ecf20Sopenharmony_ci}
27258c2ecf20Sopenharmony_ci
27268c2ecf20Sopenharmony_civoid rtl8723be_resume(struct ieee80211_hw *hw)
27278c2ecf20Sopenharmony_ci{
27288c2ecf20Sopenharmony_ci}
2729