18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/* Copyright(c) 2009-2012  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 "dm.h"
158c2ecf20Sopenharmony_ci#include "fw.h"
168c2ecf20Sopenharmony_ci#include "led.h"
178c2ecf20Sopenharmony_ci#include "hw.h"
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_civoid rtl92se_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
228c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
238c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	switch (variable) {
268c2ecf20Sopenharmony_ci	case HW_VAR_RCR: {
278c2ecf20Sopenharmony_ci			*((u32 *) (val)) = rtlpci->receive_config;
288c2ecf20Sopenharmony_ci			break;
298c2ecf20Sopenharmony_ci		}
308c2ecf20Sopenharmony_ci	case HW_VAR_RF_STATE: {
318c2ecf20Sopenharmony_ci			*((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
328c2ecf20Sopenharmony_ci			break;
338c2ecf20Sopenharmony_ci		}
348c2ecf20Sopenharmony_ci	case HW_VAR_FW_PSMODE_STATUS: {
358c2ecf20Sopenharmony_ci			*((bool *) (val)) = ppsc->fw_current_inpsmode;
368c2ecf20Sopenharmony_ci			break;
378c2ecf20Sopenharmony_ci		}
388c2ecf20Sopenharmony_ci	case HW_VAR_CORRECT_TSF: {
398c2ecf20Sopenharmony_ci			u64 tsf;
408c2ecf20Sopenharmony_ci			u32 *ptsf_low = (u32 *)&tsf;
418c2ecf20Sopenharmony_ci			u32 *ptsf_high = ((u32 *)&tsf) + 1;
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci			*ptsf_high = rtl_read_dword(rtlpriv, (TSFR + 4));
448c2ecf20Sopenharmony_ci			*ptsf_low = rtl_read_dword(rtlpriv, TSFR);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci			*((u64 *) (val)) = tsf;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci			break;
498c2ecf20Sopenharmony_ci		}
508c2ecf20Sopenharmony_ci	case HW_VAR_MRC: {
518c2ecf20Sopenharmony_ci			*((bool *)(val)) = rtlpriv->dm.current_mrc_switch;
528c2ecf20Sopenharmony_ci			break;
538c2ecf20Sopenharmony_ci		}
548c2ecf20Sopenharmony_ci	case HAL_DEF_WOWLAN:
558c2ecf20Sopenharmony_ci		break;
568c2ecf20Sopenharmony_ci	default:
578c2ecf20Sopenharmony_ci		pr_err("switch case %#x not processed\n", variable);
588c2ecf20Sopenharmony_ci		break;
598c2ecf20Sopenharmony_ci	}
608c2ecf20Sopenharmony_ci}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_civoid rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
658c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
668c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
678c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
688c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
698c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	switch (variable) {
728c2ecf20Sopenharmony_ci	case HW_VAR_ETHER_ADDR:{
738c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, IDR0, ((u32 *)(val))[0]);
748c2ecf20Sopenharmony_ci			rtl_write_word(rtlpriv, IDR4, ((u16 *)(val + 4))[0]);
758c2ecf20Sopenharmony_ci			break;
768c2ecf20Sopenharmony_ci		}
778c2ecf20Sopenharmony_ci	case HW_VAR_BASIC_RATE:{
788c2ecf20Sopenharmony_ci			u16 rate_cfg = ((u16 *) val)[0];
798c2ecf20Sopenharmony_ci			u8 rate_index = 0;
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci			if (rtlhal->version == VERSION_8192S_ACUT)
828c2ecf20Sopenharmony_ci				rate_cfg = rate_cfg & 0x150;
838c2ecf20Sopenharmony_ci			else
848c2ecf20Sopenharmony_ci				rate_cfg = rate_cfg & 0x15f;
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci			rate_cfg |= 0x01;
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, RRSR, rate_cfg & 0xff);
898c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, RRSR + 1,
908c2ecf20Sopenharmony_ci				       (rate_cfg >> 8) & 0xff);
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci			while (rate_cfg > 0x1) {
938c2ecf20Sopenharmony_ci				rate_cfg = (rate_cfg >> 1);
948c2ecf20Sopenharmony_ci				rate_index++;
958c2ecf20Sopenharmony_ci			}
968c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, INIRTSMCS_SEL, rate_index);
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci			break;
998c2ecf20Sopenharmony_ci		}
1008c2ecf20Sopenharmony_ci	case HW_VAR_BSSID:{
1018c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, BSSIDR, ((u32 *)(val))[0]);
1028c2ecf20Sopenharmony_ci			rtl_write_word(rtlpriv, BSSIDR + 4,
1038c2ecf20Sopenharmony_ci				       ((u16 *)(val + 4))[0]);
1048c2ecf20Sopenharmony_ci			break;
1058c2ecf20Sopenharmony_ci		}
1068c2ecf20Sopenharmony_ci	case HW_VAR_SIFS:{
1078c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, SIFS_OFDM, val[0]);
1088c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, SIFS_OFDM + 1, val[1]);
1098c2ecf20Sopenharmony_ci			break;
1108c2ecf20Sopenharmony_ci		}
1118c2ecf20Sopenharmony_ci	case HW_VAR_SLOT_TIME:{
1128c2ecf20Sopenharmony_ci			u8 e_aci;
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
1158c2ecf20Sopenharmony_ci				"HW_VAR_SLOT_TIME %x\n", val[0]);
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, SLOT_TIME, val[0]);
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci			for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
1208c2ecf20Sopenharmony_ci				rtlpriv->cfg->ops->set_hw_reg(hw,
1218c2ecf20Sopenharmony_ci						HW_VAR_AC_PARAM,
1228c2ecf20Sopenharmony_ci						(&e_aci));
1238c2ecf20Sopenharmony_ci			}
1248c2ecf20Sopenharmony_ci			break;
1258c2ecf20Sopenharmony_ci		}
1268c2ecf20Sopenharmony_ci	case HW_VAR_ACK_PREAMBLE:{
1278c2ecf20Sopenharmony_ci			u8 reg_tmp;
1288c2ecf20Sopenharmony_ci			u8 short_preamble = (bool) (*val);
1298c2ecf20Sopenharmony_ci			reg_tmp = (mac->cur_40_prime_sc) << 5;
1308c2ecf20Sopenharmony_ci			if (short_preamble)
1318c2ecf20Sopenharmony_ci				reg_tmp |= 0x80;
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, RRSR + 2, reg_tmp);
1348c2ecf20Sopenharmony_ci			break;
1358c2ecf20Sopenharmony_ci		}
1368c2ecf20Sopenharmony_ci	case HW_VAR_AMPDU_MIN_SPACE:{
1378c2ecf20Sopenharmony_ci			u8 min_spacing_to_set;
1388c2ecf20Sopenharmony_ci			u8 sec_min_space;
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci			min_spacing_to_set = *val;
1418c2ecf20Sopenharmony_ci			if (min_spacing_to_set <= 7) {
1428c2ecf20Sopenharmony_ci				if (rtlpriv->sec.pairwise_enc_algorithm ==
1438c2ecf20Sopenharmony_ci				    NO_ENCRYPTION)
1448c2ecf20Sopenharmony_ci					sec_min_space = 0;
1458c2ecf20Sopenharmony_ci				else
1468c2ecf20Sopenharmony_ci					sec_min_space = 1;
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci				if (min_spacing_to_set < sec_min_space)
1498c2ecf20Sopenharmony_ci					min_spacing_to_set = sec_min_space;
1508c2ecf20Sopenharmony_ci				if (min_spacing_to_set > 5)
1518c2ecf20Sopenharmony_ci					min_spacing_to_set = 5;
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci				mac->min_space_cfg =
1548c2ecf20Sopenharmony_ci						((mac->min_space_cfg & 0xf8) |
1558c2ecf20Sopenharmony_ci						min_spacing_to_set);
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci				*val = min_spacing_to_set;
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
1608c2ecf20Sopenharmony_ci					"Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
1618c2ecf20Sopenharmony_ci					mac->min_space_cfg);
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci				rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE,
1648c2ecf20Sopenharmony_ci					       mac->min_space_cfg);
1658c2ecf20Sopenharmony_ci			}
1668c2ecf20Sopenharmony_ci			break;
1678c2ecf20Sopenharmony_ci		}
1688c2ecf20Sopenharmony_ci	case HW_VAR_SHORTGI_DENSITY:{
1698c2ecf20Sopenharmony_ci			u8 density_to_set;
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci			density_to_set = *val;
1728c2ecf20Sopenharmony_ci			mac->min_space_cfg = rtlpriv->rtlhal.minspace_cfg;
1738c2ecf20Sopenharmony_ci			mac->min_space_cfg |= (density_to_set << 3);
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
1768c2ecf20Sopenharmony_ci				"Set HW_VAR_SHORTGI_DENSITY: %#x\n",
1778c2ecf20Sopenharmony_ci				mac->min_space_cfg);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE,
1808c2ecf20Sopenharmony_ci				       mac->min_space_cfg);
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci			break;
1838c2ecf20Sopenharmony_ci		}
1848c2ecf20Sopenharmony_ci	case HW_VAR_AMPDU_FACTOR:{
1858c2ecf20Sopenharmony_ci			u8 factor_toset;
1868c2ecf20Sopenharmony_ci			u8 regtoset;
1878c2ecf20Sopenharmony_ci			u8 factorlevel[18] = {
1888c2ecf20Sopenharmony_ci				2, 4, 4, 7, 7, 13, 13,
1898c2ecf20Sopenharmony_ci				13, 2, 7, 7, 13, 13,
1908c2ecf20Sopenharmony_ci				15, 15, 15, 15, 0};
1918c2ecf20Sopenharmony_ci			u8 index = 0;
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci			factor_toset = *val;
1948c2ecf20Sopenharmony_ci			if (factor_toset <= 3) {
1958c2ecf20Sopenharmony_ci				factor_toset = (1 << (factor_toset + 2));
1968c2ecf20Sopenharmony_ci				if (factor_toset > 0xf)
1978c2ecf20Sopenharmony_ci					factor_toset = 0xf;
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci				for (index = 0; index < 17; index++) {
2008c2ecf20Sopenharmony_ci					if (factorlevel[index] > factor_toset)
2018c2ecf20Sopenharmony_ci						factorlevel[index] =
2028c2ecf20Sopenharmony_ci								 factor_toset;
2038c2ecf20Sopenharmony_ci				}
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci				for (index = 0; index < 8; index++) {
2068c2ecf20Sopenharmony_ci					regtoset = ((factorlevel[index * 2]) |
2078c2ecf20Sopenharmony_ci						    (factorlevel[index *
2088c2ecf20Sopenharmony_ci						    2 + 1] << 4));
2098c2ecf20Sopenharmony_ci					rtl_write_byte(rtlpriv,
2108c2ecf20Sopenharmony_ci						       AGGLEN_LMT_L + index,
2118c2ecf20Sopenharmony_ci						       regtoset);
2128c2ecf20Sopenharmony_ci				}
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci				regtoset = ((factorlevel[16]) |
2158c2ecf20Sopenharmony_ci					    (factorlevel[17] << 4));
2168c2ecf20Sopenharmony_ci				rtl_write_byte(rtlpriv, AGGLEN_LMT_H, regtoset);
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
2198c2ecf20Sopenharmony_ci					"Set HW_VAR_AMPDU_FACTOR: %#x\n",
2208c2ecf20Sopenharmony_ci					factor_toset);
2218c2ecf20Sopenharmony_ci			}
2228c2ecf20Sopenharmony_ci			break;
2238c2ecf20Sopenharmony_ci		}
2248c2ecf20Sopenharmony_ci	case HW_VAR_AC_PARAM:{
2258c2ecf20Sopenharmony_ci			u8 e_aci = *val;
2268c2ecf20Sopenharmony_ci			rtl92s_dm_init_edca_turbo(hw);
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci			if (rtlpci->acm_method != EACMWAY2_SW)
2298c2ecf20Sopenharmony_ci				rtlpriv->cfg->ops->set_hw_reg(hw,
2308c2ecf20Sopenharmony_ci						 HW_VAR_ACM_CTRL,
2318c2ecf20Sopenharmony_ci						 &e_aci);
2328c2ecf20Sopenharmony_ci			break;
2338c2ecf20Sopenharmony_ci		}
2348c2ecf20Sopenharmony_ci	case HW_VAR_ACM_CTRL:{
2358c2ecf20Sopenharmony_ci			u8 e_aci = *val;
2368c2ecf20Sopenharmony_ci			union aci_aifsn *p_aci_aifsn = (union aci_aifsn *)(&(
2378c2ecf20Sopenharmony_ci							mac->ac[0].aifs));
2388c2ecf20Sopenharmony_ci			u8 acm = p_aci_aifsn->f.acm;
2398c2ecf20Sopenharmony_ci			u8 acm_ctrl = rtl_read_byte(rtlpriv, ACMHWCTRL);
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci			acm_ctrl = acm_ctrl | ((rtlpci->acm_method == 2) ?
2428c2ecf20Sopenharmony_ci				   0x0 : 0x1);
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci			if (acm) {
2458c2ecf20Sopenharmony_ci				switch (e_aci) {
2468c2ecf20Sopenharmony_ci				case AC0_BE:
2478c2ecf20Sopenharmony_ci					acm_ctrl |= ACMHW_BEQEN;
2488c2ecf20Sopenharmony_ci					break;
2498c2ecf20Sopenharmony_ci				case AC2_VI:
2508c2ecf20Sopenharmony_ci					acm_ctrl |= ACMHW_VIQEN;
2518c2ecf20Sopenharmony_ci					break;
2528c2ecf20Sopenharmony_ci				case AC3_VO:
2538c2ecf20Sopenharmony_ci					acm_ctrl |= ACMHW_VOQEN;
2548c2ecf20Sopenharmony_ci					break;
2558c2ecf20Sopenharmony_ci				default:
2568c2ecf20Sopenharmony_ci					rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
2578c2ecf20Sopenharmony_ci						"HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
2588c2ecf20Sopenharmony_ci						acm);
2598c2ecf20Sopenharmony_ci					break;
2608c2ecf20Sopenharmony_ci				}
2618c2ecf20Sopenharmony_ci			} else {
2628c2ecf20Sopenharmony_ci				switch (e_aci) {
2638c2ecf20Sopenharmony_ci				case AC0_BE:
2648c2ecf20Sopenharmony_ci					acm_ctrl &= (~ACMHW_BEQEN);
2658c2ecf20Sopenharmony_ci					break;
2668c2ecf20Sopenharmony_ci				case AC2_VI:
2678c2ecf20Sopenharmony_ci					acm_ctrl &= (~ACMHW_VIQEN);
2688c2ecf20Sopenharmony_ci					break;
2698c2ecf20Sopenharmony_ci				case AC3_VO:
2708c2ecf20Sopenharmony_ci					acm_ctrl &= (~ACMHW_VOQEN);
2718c2ecf20Sopenharmony_ci					break;
2728c2ecf20Sopenharmony_ci				default:
2738c2ecf20Sopenharmony_ci					pr_err("switch case %#x not processed\n",
2748c2ecf20Sopenharmony_ci					       e_aci);
2758c2ecf20Sopenharmony_ci					break;
2768c2ecf20Sopenharmony_ci				}
2778c2ecf20Sopenharmony_ci			}
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE,
2808c2ecf20Sopenharmony_ci				"HW_VAR_ACM_CTRL Write 0x%X\n", acm_ctrl);
2818c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, ACMHWCTRL, acm_ctrl);
2828c2ecf20Sopenharmony_ci			break;
2838c2ecf20Sopenharmony_ci		}
2848c2ecf20Sopenharmony_ci	case HW_VAR_RCR:{
2858c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, RCR, ((u32 *) (val))[0]);
2868c2ecf20Sopenharmony_ci			rtlpci->receive_config = ((u32 *) (val))[0];
2878c2ecf20Sopenharmony_ci			break;
2888c2ecf20Sopenharmony_ci		}
2898c2ecf20Sopenharmony_ci	case HW_VAR_RETRY_LIMIT:{
2908c2ecf20Sopenharmony_ci			u8 retry_limit = val[0];
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci			rtl_write_word(rtlpriv, RETRY_LIMIT,
2938c2ecf20Sopenharmony_ci				       retry_limit << RETRY_LIMIT_SHORT_SHIFT |
2948c2ecf20Sopenharmony_ci				       retry_limit << RETRY_LIMIT_LONG_SHIFT);
2958c2ecf20Sopenharmony_ci			break;
2968c2ecf20Sopenharmony_ci		}
2978c2ecf20Sopenharmony_ci	case HW_VAR_DUAL_TSF_RST: {
2988c2ecf20Sopenharmony_ci			break;
2998c2ecf20Sopenharmony_ci		}
3008c2ecf20Sopenharmony_ci	case HW_VAR_EFUSE_BYTES: {
3018c2ecf20Sopenharmony_ci			rtlefuse->efuse_usedbytes = *((u16 *) val);
3028c2ecf20Sopenharmony_ci			break;
3038c2ecf20Sopenharmony_ci		}
3048c2ecf20Sopenharmony_ci	case HW_VAR_EFUSE_USAGE: {
3058c2ecf20Sopenharmony_ci			rtlefuse->efuse_usedpercentage = *val;
3068c2ecf20Sopenharmony_ci			break;
3078c2ecf20Sopenharmony_ci		}
3088c2ecf20Sopenharmony_ci	case HW_VAR_IO_CMD: {
3098c2ecf20Sopenharmony_ci			break;
3108c2ecf20Sopenharmony_ci		}
3118c2ecf20Sopenharmony_ci	case HW_VAR_WPA_CONFIG: {
3128c2ecf20Sopenharmony_ci			rtl_write_byte(rtlpriv, REG_SECR, *val);
3138c2ecf20Sopenharmony_ci			break;
3148c2ecf20Sopenharmony_ci		}
3158c2ecf20Sopenharmony_ci	case HW_VAR_SET_RPWM:{
3168c2ecf20Sopenharmony_ci			break;
3178c2ecf20Sopenharmony_ci		}
3188c2ecf20Sopenharmony_ci	case HW_VAR_H2C_FW_PWRMODE:{
3198c2ecf20Sopenharmony_ci			break;
3208c2ecf20Sopenharmony_ci		}
3218c2ecf20Sopenharmony_ci	case HW_VAR_FW_PSMODE_STATUS: {
3228c2ecf20Sopenharmony_ci			ppsc->fw_current_inpsmode = *((bool *) val);
3238c2ecf20Sopenharmony_ci			break;
3248c2ecf20Sopenharmony_ci		}
3258c2ecf20Sopenharmony_ci	case HW_VAR_H2C_FW_JOINBSSRPT:{
3268c2ecf20Sopenharmony_ci			break;
3278c2ecf20Sopenharmony_ci		}
3288c2ecf20Sopenharmony_ci	case HW_VAR_AID:{
3298c2ecf20Sopenharmony_ci			break;
3308c2ecf20Sopenharmony_ci		}
3318c2ecf20Sopenharmony_ci	case HW_VAR_CORRECT_TSF:{
3328c2ecf20Sopenharmony_ci			break;
3338c2ecf20Sopenharmony_ci		}
3348c2ecf20Sopenharmony_ci	case HW_VAR_MRC: {
3358c2ecf20Sopenharmony_ci			bool bmrc_toset = *((bool *)val);
3368c2ecf20Sopenharmony_ci			u8 u1bdata = 0;
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci			if (bmrc_toset) {
3398c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
3408c2ecf20Sopenharmony_ci					      MASKBYTE0, 0x33);
3418c2ecf20Sopenharmony_ci				u1bdata = (u8)rtl_get_bbreg(hw,
3428c2ecf20Sopenharmony_ci						ROFDM1_TRXPATHENABLE,
3438c2ecf20Sopenharmony_ci						MASKBYTE0);
3448c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE,
3458c2ecf20Sopenharmony_ci					      MASKBYTE0,
3468c2ecf20Sopenharmony_ci					      ((u1bdata & 0xf0) | 0x03));
3478c2ecf20Sopenharmony_ci				u1bdata = (u8)rtl_get_bbreg(hw,
3488c2ecf20Sopenharmony_ci						ROFDM0_TRXPATHENABLE,
3498c2ecf20Sopenharmony_ci						MASKBYTE1);
3508c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
3518c2ecf20Sopenharmony_ci					      MASKBYTE1,
3528c2ecf20Sopenharmony_ci					      (u1bdata | 0x04));
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_ci				/* Update current settings. */
3558c2ecf20Sopenharmony_ci				rtlpriv->dm.current_mrc_switch = bmrc_toset;
3568c2ecf20Sopenharmony_ci			} else {
3578c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
3588c2ecf20Sopenharmony_ci					      MASKBYTE0, 0x13);
3598c2ecf20Sopenharmony_ci				u1bdata = (u8)rtl_get_bbreg(hw,
3608c2ecf20Sopenharmony_ci						 ROFDM1_TRXPATHENABLE,
3618c2ecf20Sopenharmony_ci						 MASKBYTE0);
3628c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE,
3638c2ecf20Sopenharmony_ci					      MASKBYTE0,
3648c2ecf20Sopenharmony_ci					      ((u1bdata & 0xf0) | 0x01));
3658c2ecf20Sopenharmony_ci				u1bdata = (u8)rtl_get_bbreg(hw,
3668c2ecf20Sopenharmony_ci						ROFDM0_TRXPATHENABLE,
3678c2ecf20Sopenharmony_ci						MASKBYTE1);
3688c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
3698c2ecf20Sopenharmony_ci					      MASKBYTE1, (u1bdata & 0xfb));
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci				/* Update current settings. */
3728c2ecf20Sopenharmony_ci				rtlpriv->dm.current_mrc_switch = bmrc_toset;
3738c2ecf20Sopenharmony_ci			}
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci			break;
3768c2ecf20Sopenharmony_ci		}
3778c2ecf20Sopenharmony_ci	case HW_VAR_FW_LPS_ACTION: {
3788c2ecf20Sopenharmony_ci		bool enter_fwlps = *((bool *)val);
3798c2ecf20Sopenharmony_ci		u8 rpwm_val, fw_pwrmode;
3808c2ecf20Sopenharmony_ci		bool fw_current_inps;
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci		if (enter_fwlps) {
3838c2ecf20Sopenharmony_ci			rpwm_val = 0x02;	/* RF off */
3848c2ecf20Sopenharmony_ci			fw_current_inps = true;
3858c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
3868c2ecf20Sopenharmony_ci					HW_VAR_FW_PSMODE_STATUS,
3878c2ecf20Sopenharmony_ci					(u8 *)(&fw_current_inps));
3888c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
3898c2ecf20Sopenharmony_ci					HW_VAR_H2C_FW_PWRMODE,
3908c2ecf20Sopenharmony_ci					&ppsc->fwctrl_psmode);
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
3938c2ecf20Sopenharmony_ci						      &rpwm_val);
3948c2ecf20Sopenharmony_ci		} else {
3958c2ecf20Sopenharmony_ci			rpwm_val = 0x0C;	/* RF on */
3968c2ecf20Sopenharmony_ci			fw_pwrmode = FW_PS_ACTIVE_MODE;
3978c2ecf20Sopenharmony_ci			fw_current_inps = false;
3988c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
3998c2ecf20Sopenharmony_ci						      &rpwm_val);
4008c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
4018c2ecf20Sopenharmony_ci						      &fw_pwrmode);
4028c2ecf20Sopenharmony_ci
4038c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
4048c2ecf20Sopenharmony_ci					HW_VAR_FW_PSMODE_STATUS,
4058c2ecf20Sopenharmony_ci					(u8 *)(&fw_current_inps));
4068c2ecf20Sopenharmony_ci		}
4078c2ecf20Sopenharmony_ci		break; }
4088c2ecf20Sopenharmony_ci	default:
4098c2ecf20Sopenharmony_ci		pr_err("switch case %#x not processed\n", variable);
4108c2ecf20Sopenharmony_ci		break;
4118c2ecf20Sopenharmony_ci	}
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci}
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_civoid rtl92se_enable_hw_security_config(struct ieee80211_hw *hw)
4168c2ecf20Sopenharmony_ci{
4178c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
4188c2ecf20Sopenharmony_ci	u8 sec_reg_value = 0x0;
4198c2ecf20Sopenharmony_ci
4208c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
4218c2ecf20Sopenharmony_ci		"PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
4228c2ecf20Sopenharmony_ci		rtlpriv->sec.pairwise_enc_algorithm,
4238c2ecf20Sopenharmony_ci		rtlpriv->sec.group_enc_algorithm);
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci	if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
4268c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
4278c2ecf20Sopenharmony_ci			"not open hw encryption\n");
4288c2ecf20Sopenharmony_ci		return;
4298c2ecf20Sopenharmony_ci	}
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci	sec_reg_value = SCR_TXENCENABLE | SCR_RXENCENABLE;
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci	if (rtlpriv->sec.use_defaultkey) {
4348c2ecf20Sopenharmony_ci		sec_reg_value |= SCR_TXUSEDK;
4358c2ecf20Sopenharmony_ci		sec_reg_value |= SCR_RXUSEDK;
4368c2ecf20Sopenharmony_ci	}
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SEC, DBG_LOUD, "The SECR-value %x\n",
4398c2ecf20Sopenharmony_ci		sec_reg_value);
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ci}
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_cistatic u8 _rtl92se_halset_sysclk(struct ieee80211_hw *hw, u8 data)
4468c2ecf20Sopenharmony_ci{
4478c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
4488c2ecf20Sopenharmony_ci	u8 waitcount = 100;
4498c2ecf20Sopenharmony_ci	bool bresult = false;
4508c2ecf20Sopenharmony_ci	u8 tmpvalue;
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, SYS_CLKR + 1, data);
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	/* Wait the MAC synchronized. */
4558c2ecf20Sopenharmony_ci	udelay(400);
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_ci	/* Check if it is set ready. */
4588c2ecf20Sopenharmony_ci	tmpvalue = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
4598c2ecf20Sopenharmony_ci	bresult = ((tmpvalue & BIT(7)) == (data & BIT(7)));
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_ci	if ((data & (BIT(6) | BIT(7))) == false) {
4628c2ecf20Sopenharmony_ci		waitcount = 100;
4638c2ecf20Sopenharmony_ci		tmpvalue = 0;
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci		while (1) {
4668c2ecf20Sopenharmony_ci			waitcount--;
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci			tmpvalue = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
4698c2ecf20Sopenharmony_ci			if ((tmpvalue & BIT(6)))
4708c2ecf20Sopenharmony_ci				break;
4718c2ecf20Sopenharmony_ci
4728c2ecf20Sopenharmony_ci			pr_err("wait for BIT(6) return value %x\n", tmpvalue);
4738c2ecf20Sopenharmony_ci			if (waitcount == 0)
4748c2ecf20Sopenharmony_ci				break;
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ci			udelay(10);
4778c2ecf20Sopenharmony_ci		}
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci		if (waitcount == 0)
4808c2ecf20Sopenharmony_ci			bresult = false;
4818c2ecf20Sopenharmony_ci		else
4828c2ecf20Sopenharmony_ci			bresult = true;
4838c2ecf20Sopenharmony_ci	}
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_ci	return bresult;
4868c2ecf20Sopenharmony_ci}
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_civoid rtl8192se_gpiobit3_cfg_inputmode(struct ieee80211_hw *hw)
4898c2ecf20Sopenharmony_ci{
4908c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
4918c2ecf20Sopenharmony_ci	u8 u1tmp;
4928c2ecf20Sopenharmony_ci
4938c2ecf20Sopenharmony_ci	/* The following config GPIO function */
4948c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, MAC_PINMUX_CFG, (GPIOMUX_EN | GPIOSEL_GPIO));
4958c2ecf20Sopenharmony_ci	u1tmp = rtl_read_byte(rtlpriv, GPIO_IO_SEL);
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci	/* config GPIO3 to input */
4988c2ecf20Sopenharmony_ci	u1tmp &= HAL_8192S_HW_GPIO_OFF_MASK;
4998c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, GPIO_IO_SEL, u1tmp);
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_ci}
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_cistatic u8 _rtl92se_rf_onoff_detect(struct ieee80211_hw *hw)
5048c2ecf20Sopenharmony_ci{
5058c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
5068c2ecf20Sopenharmony_ci	u8 u1tmp;
5078c2ecf20Sopenharmony_ci	u8 retval = ERFON;
5088c2ecf20Sopenharmony_ci
5098c2ecf20Sopenharmony_ci	/* The following config GPIO function */
5108c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, MAC_PINMUX_CFG, (GPIOMUX_EN | GPIOSEL_GPIO));
5118c2ecf20Sopenharmony_ci	u1tmp = rtl_read_byte(rtlpriv, GPIO_IO_SEL);
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci	/* config GPIO3 to input */
5148c2ecf20Sopenharmony_ci	u1tmp &= HAL_8192S_HW_GPIO_OFF_MASK;
5158c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, GPIO_IO_SEL, u1tmp);
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ci	/* On some of the platform, driver cannot read correct
5188c2ecf20Sopenharmony_ci	 * value without delay between Write_GPIO_SEL and Read_GPIO_IN */
5198c2ecf20Sopenharmony_ci	mdelay(10);
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci	/* check GPIO3 */
5228c2ecf20Sopenharmony_ci	u1tmp = rtl_read_byte(rtlpriv, GPIO_IN_SE);
5238c2ecf20Sopenharmony_ci	retval = (u1tmp & HAL_8192S_HW_GPIO_OFF_BIT) ? ERFON : ERFOFF;
5248c2ecf20Sopenharmony_ci
5258c2ecf20Sopenharmony_ci	return retval;
5268c2ecf20Sopenharmony_ci}
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_cistatic void _rtl92se_macconfig_before_fwdownload(struct ieee80211_hw *hw)
5298c2ecf20Sopenharmony_ci{
5308c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
5318c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
5328c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci	u8 i;
5358c2ecf20Sopenharmony_ci	u8 tmpu1b;
5368c2ecf20Sopenharmony_ci	u16 tmpu2b;
5378c2ecf20Sopenharmony_ci	u8 pollingcnt = 20;
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci	if (rtlpci->first_init) {
5408c2ecf20Sopenharmony_ci		/* Reset PCIE Digital */
5418c2ecf20Sopenharmony_ci		tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
5428c2ecf20Sopenharmony_ci		tmpu1b &= 0xFE;
5438c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
5448c2ecf20Sopenharmony_ci		udelay(1);
5458c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b | BIT(0));
5468c2ecf20Sopenharmony_ci	}
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci	/* Switch to SW IO control */
5498c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
5508c2ecf20Sopenharmony_ci	if (tmpu1b & BIT(7)) {
5518c2ecf20Sopenharmony_ci		tmpu1b &= ~(BIT(6) | BIT(7));
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_ci		/* Set failed, return to prevent hang. */
5548c2ecf20Sopenharmony_ci		if (!_rtl92se_halset_sysclk(hw, tmpu1b))
5558c2ecf20Sopenharmony_ci			return;
5568c2ecf20Sopenharmony_ci	}
5578c2ecf20Sopenharmony_ci
5588c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL, 0x0);
5598c2ecf20Sopenharmony_ci	udelay(50);
5608c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
5618c2ecf20Sopenharmony_ci	udelay(50);
5628c2ecf20Sopenharmony_ci
5638c2ecf20Sopenharmony_ci	/* Clear FW RPWM for FW control LPS.*/
5648c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, RPWM, 0x0);
5658c2ecf20Sopenharmony_ci
5668c2ecf20Sopenharmony_ci	/* Reset MAC-IO and CPU and Core Digital BIT(10)/11/15 */
5678c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
5688c2ecf20Sopenharmony_ci	tmpu1b &= 0x73;
5698c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
5708c2ecf20Sopenharmony_ci	/* wait for BIT 10/11/15 to pull high automatically!! */
5718c2ecf20Sopenharmony_ci	mdelay(1);
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, CMDR, 0);
5748c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, TCR, 0);
5758c2ecf20Sopenharmony_ci
5768c2ecf20Sopenharmony_ci	/* Data sheet not define 0x562!!! Copy from WMAC!!!!! */
5778c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, 0x562);
5788c2ecf20Sopenharmony_ci	tmpu1b |= 0x08;
5798c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x562, tmpu1b);
5808c2ecf20Sopenharmony_ci	tmpu1b &= ~(BIT(3));
5818c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x562, tmpu1b);
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_ci	/* Enable AFE clock source */
5848c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL);
5858c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_XTAL_CTRL, (tmpu1b | 0x01));
5868c2ecf20Sopenharmony_ci	/* Delay 1.5ms */
5878c2ecf20Sopenharmony_ci	mdelay(2);
5888c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL + 1);
5898c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, (tmpu1b & 0xfb));
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_ci	/* Enable AFE Macro Block's Bandgap */
5928c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
5938c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | BIT(0)));
5948c2ecf20Sopenharmony_ci	mdelay(1);
5958c2ecf20Sopenharmony_ci
5968c2ecf20Sopenharmony_ci	/* Enable AFE Mbias */
5978c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
5988c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | 0x02));
5998c2ecf20Sopenharmony_ci	mdelay(1);
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	/* Enable LDOA15 block	*/
6028c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, LDOA15_CTRL);
6038c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, LDOA15_CTRL, (tmpu1b | BIT(0)));
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci	/* Set Digital Vdd to Retention isolation Path. */
6068c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, REG_SYS_ISO_CTRL);
6078c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_ISO_CTRL, (tmpu2b | BIT(11)));
6088c2ecf20Sopenharmony_ci
6098c2ecf20Sopenharmony_ci	/* For warm reboot NIC disappera bug. */
6108c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
6118c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(13)));
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, 0x68);
6148c2ecf20Sopenharmony_ci
6158c2ecf20Sopenharmony_ci	/* Enable AFE PLL Macro Block */
6168c2ecf20Sopenharmony_ci	/* We need to delay 100u before enabling PLL. */
6178c2ecf20Sopenharmony_ci	udelay(200);
6188c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL);
6198c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) | BIT(4)));
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_ci	/* for divider reset  */
6228c2ecf20Sopenharmony_ci	udelay(100);
6238c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) |
6248c2ecf20Sopenharmony_ci		       BIT(4) | BIT(6)));
6258c2ecf20Sopenharmony_ci	udelay(10);
6268c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) | BIT(4)));
6278c2ecf20Sopenharmony_ci	udelay(10);
6288c2ecf20Sopenharmony_ci
6298c2ecf20Sopenharmony_ci	/* Enable MAC 80MHZ clock  */
6308c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL + 1);
6318c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL + 1, (tmpu1b | BIT(0)));
6328c2ecf20Sopenharmony_ci	mdelay(1);
6338c2ecf20Sopenharmony_ci
6348c2ecf20Sopenharmony_ci	/* Release isolation AFE PLL & MD */
6358c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, 0xA6);
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ci	/* Enable MAC clock */
6388c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
6398c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b | BIT(12) | BIT(11)));
6408c2ecf20Sopenharmony_ci
6418c2ecf20Sopenharmony_ci	/* Enable Core digital and enable IOREG R/W */
6428c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
6438c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11)));
6448c2ecf20Sopenharmony_ci
6458c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
6468c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b & ~(BIT(7)));
6478c2ecf20Sopenharmony_ci
6488c2ecf20Sopenharmony_ci	/* enable REG_EN */
6498c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11) | BIT(15)));
6508c2ecf20Sopenharmony_ci
6518c2ecf20Sopenharmony_ci	/* Switch the control path. */
6528c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
6538c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b & (~BIT(2))));
6548c2ecf20Sopenharmony_ci
6558c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
6568c2ecf20Sopenharmony_ci	tmpu1b = ((tmpu1b | BIT(7)) & (~BIT(6)));
6578c2ecf20Sopenharmony_ci	if (!_rtl92se_halset_sysclk(hw, tmpu1b))
6588c2ecf20Sopenharmony_ci		return; /* Set failed, return to prevent hang. */
6598c2ecf20Sopenharmony_ci
6608c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x07FC);
6618c2ecf20Sopenharmony_ci
6628c2ecf20Sopenharmony_ci	/* MH We must enable the section of code to prevent load IMEM fail. */
6638c2ecf20Sopenharmony_ci	/* Load MAC register from WMAc temporarily We simulate macreg. */
6648c2ecf20Sopenharmony_ci	/* txt HW will provide MAC txt later  */
6658c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x6, 0x30);
6668c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x49, 0xf0);
6678c2ecf20Sopenharmony_ci
6688c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x4b, 0x81);
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0xb5, 0x21);
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0xdc, 0xff);
6738c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0xdd, 0xff);
6748c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0xde, 0xff);
6758c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0xdf, 0xff);
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x11a, 0x00);
6788c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x11b, 0x00);
6798c2ecf20Sopenharmony_ci
6808c2ecf20Sopenharmony_ci	for (i = 0; i < 32; i++)
6818c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, INIMCS_SEL + i, 0x1b);
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x236, 0xff);
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x503, 0x22);
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci	if (ppsc->support_aspm && !ppsc->support_backdoor)
6888c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x560, 0x40);
6898c2ecf20Sopenharmony_ci	else
6908c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x560, 0x00);
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, DBG_PORT, 0x91);
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci	/* Set RX Desc Address */
6958c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, RDQDA, rtlpci->rx_ring[RX_MPDU_QUEUE].dma);
6968c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, RCDA, rtlpci->rx_ring[RX_CMD_QUEUE].dma);
6978c2ecf20Sopenharmony_ci
6988c2ecf20Sopenharmony_ci	/* Set TX Desc Address */
6998c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TBKDA, rtlpci->tx_ring[BK_QUEUE].dma);
7008c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TBEDA, rtlpci->tx_ring[BE_QUEUE].dma);
7018c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TVIDA, rtlpci->tx_ring[VI_QUEUE].dma);
7028c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TVODA, rtlpci->tx_ring[VO_QUEUE].dma);
7038c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TBDA, rtlpci->tx_ring[BEACON_QUEUE].dma);
7048c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TCDA, rtlpci->tx_ring[TXCMD_QUEUE].dma);
7058c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TMDA, rtlpci->tx_ring[MGNT_QUEUE].dma);
7068c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, THPDA, rtlpci->tx_ring[HIGH_QUEUE].dma);
7078c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, HDA, rtlpci->tx_ring[HCCA_QUEUE].dma);
7088c2ecf20Sopenharmony_ci
7098c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x37FC);
7108c2ecf20Sopenharmony_ci
7118c2ecf20Sopenharmony_ci	/* To make sure that TxDMA can ready to download FW. */
7128c2ecf20Sopenharmony_ci	/* We should reset TxDMA if IMEM RPT was not ready. */
7138c2ecf20Sopenharmony_ci	do {
7148c2ecf20Sopenharmony_ci		tmpu1b = rtl_read_byte(rtlpriv, TCR);
7158c2ecf20Sopenharmony_ci		if ((tmpu1b & TXDMA_INIT_VALUE) == TXDMA_INIT_VALUE)
7168c2ecf20Sopenharmony_ci			break;
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_ci		udelay(5);
7198c2ecf20Sopenharmony_ci	} while (pollingcnt--);
7208c2ecf20Sopenharmony_ci
7218c2ecf20Sopenharmony_ci	if (pollingcnt <= 0) {
7228c2ecf20Sopenharmony_ci		pr_err("Polling TXDMA_INIT_VALUE timeout!! Current TCR(%#x)\n",
7238c2ecf20Sopenharmony_ci		       tmpu1b);
7248c2ecf20Sopenharmony_ci		tmpu1b = rtl_read_byte(rtlpriv, CMDR);
7258c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, CMDR, tmpu1b & (~TXDMA_EN));
7268c2ecf20Sopenharmony_ci		udelay(2);
7278c2ecf20Sopenharmony_ci		/* Reset TxDMA */
7288c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, CMDR, tmpu1b | TXDMA_EN);
7298c2ecf20Sopenharmony_ci	}
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_ci	/* After MACIO reset,we must refresh LED state. */
7328c2ecf20Sopenharmony_ci	if ((ppsc->rfoff_reason == RF_CHANGE_BY_IPS) ||
7338c2ecf20Sopenharmony_ci	   (ppsc->rfoff_reason == 0)) {
7348c2ecf20Sopenharmony_ci		struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
7358c2ecf20Sopenharmony_ci		enum rf_pwrstate rfpwr_state_toset;
7368c2ecf20Sopenharmony_ci		rfpwr_state_toset = _rtl92se_rf_onoff_detect(hw);
7378c2ecf20Sopenharmony_ci
7388c2ecf20Sopenharmony_ci		if (rfpwr_state_toset == ERFON)
7398c2ecf20Sopenharmony_ci			rtl92se_sw_led_on(hw, pled0);
7408c2ecf20Sopenharmony_ci	}
7418c2ecf20Sopenharmony_ci}
7428c2ecf20Sopenharmony_ci
7438c2ecf20Sopenharmony_cistatic void _rtl92se_macconfig_after_fwdownload(struct ieee80211_hw *hw)
7448c2ecf20Sopenharmony_ci{
7458c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
7468c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
7478c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
7488c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
7498c2ecf20Sopenharmony_ci	u8 i;
7508c2ecf20Sopenharmony_ci	u16 tmpu2b;
7518c2ecf20Sopenharmony_ci
7528c2ecf20Sopenharmony_ci	/* 1. System Configure Register (Offset: 0x0000 - 0x003F) */
7538c2ecf20Sopenharmony_ci
7548c2ecf20Sopenharmony_ci	/* 2. Command Control Register (Offset: 0x0040 - 0x004F) */
7558c2ecf20Sopenharmony_ci	/* Turn on 0x40 Command register */
7568c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, (BBRSTN | BB_GLB_RSTN |
7578c2ecf20Sopenharmony_ci			SCHEDULE_EN | MACRXEN | MACTXEN | DDMA_EN | FW2HW_EN |
7588c2ecf20Sopenharmony_ci			RXDMA_EN | TXDMA_EN | HCI_RXDMA_EN | HCI_TXDMA_EN));
7598c2ecf20Sopenharmony_ci
7608c2ecf20Sopenharmony_ci	/* Set TCR TX DMA pre 2 FULL enable bit	*/
7618c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TCR, rtl_read_dword(rtlpriv, TCR) |
7628c2ecf20Sopenharmony_ci			TXDMAPRE2FULL);
7638c2ecf20Sopenharmony_ci
7648c2ecf20Sopenharmony_ci	/* Set RCR	*/
7658c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config);
7668c2ecf20Sopenharmony_ci
7678c2ecf20Sopenharmony_ci	/* 3. MACID Setting Register (Offset: 0x0050 - 0x007F) */
7688c2ecf20Sopenharmony_ci
7698c2ecf20Sopenharmony_ci	/* 4. Timing Control Register  (Offset: 0x0080 - 0x009F) */
7708c2ecf20Sopenharmony_ci	/* Set CCK/OFDM SIFS */
7718c2ecf20Sopenharmony_ci	/* CCK SIFS shall always be 10us. */
7728c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SIFS_CCK, 0x0a0a);
7738c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SIFS_OFDM, 0x1010);
7748c2ecf20Sopenharmony_ci
7758c2ecf20Sopenharmony_ci	/* Set AckTimeout */
7768c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, ACK_TIMEOUT, 0x40);
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_ci	/* Beacon related */
7798c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, BCN_INTERVAL, 100);
7808c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, ATIMWND, 2);
7818c2ecf20Sopenharmony_ci
7828c2ecf20Sopenharmony_ci	/* 5. FIFO Control Register (Offset: 0x00A0 - 0x015F) */
7838c2ecf20Sopenharmony_ci	/* 5.1 Initialize Number of Reserved Pages in Firmware Queue */
7848c2ecf20Sopenharmony_ci	/* Firmware allocate now, associate with FW internal setting.!!! */
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci	/* 5.2 Setting TX/RX page size 0/1/2/3/4=64/128/256/512/1024 */
7878c2ecf20Sopenharmony_ci	/* 5.3 Set driver info, we only accept PHY status now. */
7888c2ecf20Sopenharmony_ci	/* 5.4 Set RXDMA arbitration to control RXDMA/MAC/FW R/W for RXFIFO  */
7898c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, RXDMA, rtl_read_byte(rtlpriv, RXDMA) | BIT(6));
7908c2ecf20Sopenharmony_ci
7918c2ecf20Sopenharmony_ci	/* 6. Adaptive Control Register  (Offset: 0x0160 - 0x01CF) */
7928c2ecf20Sopenharmony_ci	/* Set RRSR to all legacy rate and HT rate
7938c2ecf20Sopenharmony_ci	 * CCK rate is supported by default.
7948c2ecf20Sopenharmony_ci	 * CCK rate will be filtered out only when associated
7958c2ecf20Sopenharmony_ci	 * AP does not support it.
7968c2ecf20Sopenharmony_ci	 * Only enable ACK rate to OFDM 24M
7978c2ecf20Sopenharmony_ci	 * Disable RRSR for CCK rate in A-Cut	*/
7988c2ecf20Sopenharmony_ci
7998c2ecf20Sopenharmony_ci	if (rtlhal->version == VERSION_8192S_ACUT)
8008c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RRSR, 0xf0);
8018c2ecf20Sopenharmony_ci	else if (rtlhal->version == VERSION_8192S_BCUT)
8028c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RRSR, 0xff);
8038c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, RRSR + 1, 0x01);
8048c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, RRSR + 2, 0x00);
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_ci	/* A-Cut IC do not support CCK rate. We forbid ARFR to */
8078c2ecf20Sopenharmony_ci	/* fallback to CCK rate */
8088c2ecf20Sopenharmony_ci	for (i = 0; i < 8; i++) {
8098c2ecf20Sopenharmony_ci		/*Disable RRSR for CCK rate in A-Cut */
8108c2ecf20Sopenharmony_ci		if (rtlhal->version == VERSION_8192S_ACUT)
8118c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, ARFR0 + i * 4, 0x1f0ff0f0);
8128c2ecf20Sopenharmony_ci	}
8138c2ecf20Sopenharmony_ci
8148c2ecf20Sopenharmony_ci	/* Different rate use different AMPDU size */
8158c2ecf20Sopenharmony_ci	/* MCS32/ MCS15_SG use max AMPDU size 15*2=30K */
8168c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AGGLEN_LMT_H, 0x0f);
8178c2ecf20Sopenharmony_ci	/* MCS0/1/2/3 use max AMPDU size 4*2=8K */
8188c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, AGGLEN_LMT_L, 0x7442);
8198c2ecf20Sopenharmony_ci	/* MCS4/5 use max AMPDU size 8*2=16K 6/7 use 10*2=20K */
8208c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, AGGLEN_LMT_L + 2, 0xddd7);
8218c2ecf20Sopenharmony_ci	/* MCS8/9 use max AMPDU size 8*2=16K 10/11 use 10*2=20K */
8228c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, AGGLEN_LMT_L + 4, 0xd772);
8238c2ecf20Sopenharmony_ci	/* MCS12/13/14/15 use max AMPDU size 15*2=30K */
8248c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, AGGLEN_LMT_L + 6, 0xfffd);
8258c2ecf20Sopenharmony_ci
8268c2ecf20Sopenharmony_ci	/* Set Data / Response auto rate fallack retry count */
8278c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, DARFRC, 0x04010000);
8288c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, DARFRC + 4, 0x09070605);
8298c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, RARFRC, 0x04010000);
8308c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, RARFRC + 4, 0x09070605);
8318c2ecf20Sopenharmony_ci
8328c2ecf20Sopenharmony_ci	/* 7. EDCA Setting Register (Offset: 0x01D0 - 0x01FF) */
8338c2ecf20Sopenharmony_ci	/* Set all rate to support SG */
8348c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SG_RATE, 0xFFFF);
8358c2ecf20Sopenharmony_ci
8368c2ecf20Sopenharmony_ci	/* 8. WMAC, BA, and CCX related Register (Offset: 0x0200 - 0x023F) */
8378c2ecf20Sopenharmony_ci	/* Set NAV protection length */
8388c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, NAV_PROT_LEN, 0x0080);
8398c2ecf20Sopenharmony_ci	/* CF-END Threshold */
8408c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, CFEND_TH, 0xFF);
8418c2ecf20Sopenharmony_ci	/* Set AMPDU minimum space */
8428c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE, 0x07);
8438c2ecf20Sopenharmony_ci	/* Set TXOP stall control for several queue/HI/BCN/MGT/ */
8448c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, TXOP_STALL_CTRL, 0x00);
8458c2ecf20Sopenharmony_ci
8468c2ecf20Sopenharmony_ci	/* 9. Security Control Register (Offset: 0x0240 - 0x025F) */
8478c2ecf20Sopenharmony_ci	/* 10. Power Save Control Register (Offset: 0x0260 - 0x02DF) */
8488c2ecf20Sopenharmony_ci	/* 11. General Purpose Register (Offset: 0x02E0 - 0x02FF) */
8498c2ecf20Sopenharmony_ci	/* 12. Host Interrupt Status Register (Offset: 0x0300 - 0x030F) */
8508c2ecf20Sopenharmony_ci	/* 13. Test mode and Debug Control Register (Offset: 0x0310 - 0x034F) */
8518c2ecf20Sopenharmony_ci
8528c2ecf20Sopenharmony_ci	/* 14. Set driver info, we only accept PHY status now. */
8538c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, RXDRVINFO_SZ, 4);
8548c2ecf20Sopenharmony_ci
8558c2ecf20Sopenharmony_ci	/* 15. For EEPROM R/W Workaround */
8568c2ecf20Sopenharmony_ci	/* 16. For EFUSE to share REG_SYS_FUNC_EN with EEPROM!!! */
8578c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
8588c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmpu2b | BIT(13));
8598c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_byte(rtlpriv, REG_SYS_ISO_CTRL);
8608c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, tmpu2b & (~BIT(8)));
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_ci	/* 17. For EFUSE */
8638c2ecf20Sopenharmony_ci	/* We may R/W EFUSE in EEPROM mode */
8648c2ecf20Sopenharmony_ci	if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
8658c2ecf20Sopenharmony_ci		u8	tempval;
8668c2ecf20Sopenharmony_ci
8678c2ecf20Sopenharmony_ci		tempval = rtl_read_byte(rtlpriv, REG_SYS_ISO_CTRL + 1);
8688c2ecf20Sopenharmony_ci		tempval &= 0xFE;
8698c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, tempval);
8708c2ecf20Sopenharmony_ci
8718c2ecf20Sopenharmony_ci		/* Change Program timing */
8728c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_EFUSE_CTRL + 3, 0x72);
8738c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "EFUSE CONFIG OK\n");
8748c2ecf20Sopenharmony_ci	}
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "OK\n");
8778c2ecf20Sopenharmony_ci
8788c2ecf20Sopenharmony_ci}
8798c2ecf20Sopenharmony_ci
8808c2ecf20Sopenharmony_cistatic void _rtl92se_hw_configure(struct ieee80211_hw *hw)
8818c2ecf20Sopenharmony_ci{
8828c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
8838c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
8848c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
8858c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
8868c2ecf20Sopenharmony_ci
8878c2ecf20Sopenharmony_ci	u8 reg_bw_opmode = 0;
8888c2ecf20Sopenharmony_ci	u32 reg_rrsr = 0;
8898c2ecf20Sopenharmony_ci	u8 regtmp = 0;
8908c2ecf20Sopenharmony_ci
8918c2ecf20Sopenharmony_ci	reg_bw_opmode = BW_OPMODE_20MHZ;
8928c2ecf20Sopenharmony_ci	reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
8938c2ecf20Sopenharmony_ci
8948c2ecf20Sopenharmony_ci	regtmp = rtl_read_byte(rtlpriv, INIRTSMCS_SEL);
8958c2ecf20Sopenharmony_ci	reg_rrsr = ((reg_rrsr & 0x000fffff) << 8) | regtmp;
8968c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, INIRTSMCS_SEL, reg_rrsr);
8978c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, BW_OPMODE, reg_bw_opmode);
8988c2ecf20Sopenharmony_ci
8998c2ecf20Sopenharmony_ci	/* Set Retry Limit here */
9008c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT,
9018c2ecf20Sopenharmony_ci			(u8 *)(&rtlpci->shortretry_limit));
9028c2ecf20Sopenharmony_ci
9038c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, MLT, 0x8f);
9048c2ecf20Sopenharmony_ci
9058c2ecf20Sopenharmony_ci	/* For Min Spacing configuration. */
9068c2ecf20Sopenharmony_ci	switch (rtlphy->rf_type) {
9078c2ecf20Sopenharmony_ci	case RF_1T2R:
9088c2ecf20Sopenharmony_ci	case RF_1T1R:
9098c2ecf20Sopenharmony_ci		rtlhal->minspace_cfg = (MAX_MSS_DENSITY_1T << 3);
9108c2ecf20Sopenharmony_ci		break;
9118c2ecf20Sopenharmony_ci	case RF_2T2R:
9128c2ecf20Sopenharmony_ci	case RF_2T2R_GREEN:
9138c2ecf20Sopenharmony_ci		rtlhal->minspace_cfg = (MAX_MSS_DENSITY_2T << 3);
9148c2ecf20Sopenharmony_ci		break;
9158c2ecf20Sopenharmony_ci	}
9168c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE, rtlhal->minspace_cfg);
9178c2ecf20Sopenharmony_ci}
9188c2ecf20Sopenharmony_ci
9198c2ecf20Sopenharmony_ciint rtl92se_hw_init(struct ieee80211_hw *hw)
9208c2ecf20Sopenharmony_ci{
9218c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
9228c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
9238c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
9248c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
9258c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
9268c2ecf20Sopenharmony_ci	u8 tmp_byte = 0;
9278c2ecf20Sopenharmony_ci	unsigned long flags;
9288c2ecf20Sopenharmony_ci	bool rtstatus = true;
9298c2ecf20Sopenharmony_ci	u8 tmp_u1b;
9308c2ecf20Sopenharmony_ci	int err = false;
9318c2ecf20Sopenharmony_ci	u8 i;
9328c2ecf20Sopenharmony_ci	int wdcapra_add[] = {
9338c2ecf20Sopenharmony_ci		EDCAPARA_BE, EDCAPARA_BK,
9348c2ecf20Sopenharmony_ci		EDCAPARA_VI, EDCAPARA_VO};
9358c2ecf20Sopenharmony_ci	u8 secr_value = 0x0;
9368c2ecf20Sopenharmony_ci
9378c2ecf20Sopenharmony_ci	rtlpci->being_init_adapter = true;
9388c2ecf20Sopenharmony_ci
9398c2ecf20Sopenharmony_ci	/* As this function can take a very long time (up to 350 ms)
9408c2ecf20Sopenharmony_ci	 * and can be called with irqs disabled, reenable the irqs
9418c2ecf20Sopenharmony_ci	 * to let the other devices continue being serviced.
9428c2ecf20Sopenharmony_ci	 *
9438c2ecf20Sopenharmony_ci	 * It is safe doing so since our own interrupts will only be enabled
9448c2ecf20Sopenharmony_ci	 * in a subsequent step.
9458c2ecf20Sopenharmony_ci	 */
9468c2ecf20Sopenharmony_ci	local_save_flags(flags);
9478c2ecf20Sopenharmony_ci	local_irq_enable();
9488c2ecf20Sopenharmony_ci
9498c2ecf20Sopenharmony_ci	rtlpriv->intf_ops->disable_aspm(hw);
9508c2ecf20Sopenharmony_ci
9518c2ecf20Sopenharmony_ci	/* 1. MAC Initialize */
9528c2ecf20Sopenharmony_ci	/* Before FW download, we have to set some MAC register */
9538c2ecf20Sopenharmony_ci	_rtl92se_macconfig_before_fwdownload(hw);
9548c2ecf20Sopenharmony_ci
9558c2ecf20Sopenharmony_ci	rtlhal->version = (enum version_8192s)((rtl_read_dword(rtlpriv,
9568c2ecf20Sopenharmony_ci			PMC_FSM) >> 16) & 0xF);
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ci	rtl8192se_gpiobit3_cfg_inputmode(hw);
9598c2ecf20Sopenharmony_ci
9608c2ecf20Sopenharmony_ci	/* 2. download firmware */
9618c2ecf20Sopenharmony_ci	rtstatus = rtl92s_download_fw(hw);
9628c2ecf20Sopenharmony_ci	if (!rtstatus) {
9638c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
9648c2ecf20Sopenharmony_ci			"Failed to download FW. Init HW without FW now... Please copy FW into /lib/firmware/rtlwifi\n");
9658c2ecf20Sopenharmony_ci		err = 1;
9668c2ecf20Sopenharmony_ci		goto exit;
9678c2ecf20Sopenharmony_ci	}
9688c2ecf20Sopenharmony_ci
9698c2ecf20Sopenharmony_ci	/* After FW download, we have to reset MAC register */
9708c2ecf20Sopenharmony_ci	_rtl92se_macconfig_after_fwdownload(hw);
9718c2ecf20Sopenharmony_ci
9728c2ecf20Sopenharmony_ci	/*Retrieve default FW Cmd IO map. */
9738c2ecf20Sopenharmony_ci	rtlhal->fwcmd_iomap =	rtl_read_word(rtlpriv, LBUS_MON_ADDR);
9748c2ecf20Sopenharmony_ci	rtlhal->fwcmd_ioparam = rtl_read_dword(rtlpriv, LBUS_ADDR_MASK);
9758c2ecf20Sopenharmony_ci
9768c2ecf20Sopenharmony_ci	/* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */
9778c2ecf20Sopenharmony_ci	if (!rtl92s_phy_mac_config(hw)) {
9788c2ecf20Sopenharmony_ci		pr_err("MAC Config failed\n");
9798c2ecf20Sopenharmony_ci		err = rtstatus;
9808c2ecf20Sopenharmony_ci		goto exit;
9818c2ecf20Sopenharmony_ci	}
9828c2ecf20Sopenharmony_ci
9838c2ecf20Sopenharmony_ci	/* because last function modify RCR, so we update
9848c2ecf20Sopenharmony_ci	 * rcr var here, or TP will unstable for receive_config
9858c2ecf20Sopenharmony_ci	 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
9868c2ecf20Sopenharmony_ci	 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
9878c2ecf20Sopenharmony_ci	 */
9888c2ecf20Sopenharmony_ci	rtlpci->receive_config = rtl_read_dword(rtlpriv, RCR);
9898c2ecf20Sopenharmony_ci	rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
9908c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, RCR, rtlpci->receive_config);
9918c2ecf20Sopenharmony_ci
9928c2ecf20Sopenharmony_ci	/* Make sure BB/RF write OK. We should prevent enter IPS. radio off. */
9938c2ecf20Sopenharmony_ci	/* We must set flag avoid BB/RF config period later!! */
9948c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, CMDR, 0x37FC);
9958c2ecf20Sopenharmony_ci
9968c2ecf20Sopenharmony_ci	/* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */
9978c2ecf20Sopenharmony_ci	if (!rtl92s_phy_bb_config(hw)) {
9988c2ecf20Sopenharmony_ci		pr_err("BB Config failed\n");
9998c2ecf20Sopenharmony_ci		err = rtstatus;
10008c2ecf20Sopenharmony_ci		goto exit;
10018c2ecf20Sopenharmony_ci	}
10028c2ecf20Sopenharmony_ci
10038c2ecf20Sopenharmony_ci	/* 5. Initiailze RF RAIO_A.txt RF RAIO_B.txt */
10048c2ecf20Sopenharmony_ci	/* Before initalizing RF. We can not use FW to do RF-R/W. */
10058c2ecf20Sopenharmony_ci
10068c2ecf20Sopenharmony_ci	rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
10078c2ecf20Sopenharmony_ci
10088c2ecf20Sopenharmony_ci	/* Before RF-R/W we must execute the IO from Scott's suggestion. */
10098c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, 0xDB);
10108c2ecf20Sopenharmony_ci	if (rtlhal->version == VERSION_8192S_ACUT)
10118c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, SPS1_CTRL + 3, 0x07);
10128c2ecf20Sopenharmony_ci	else
10138c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RF_CTRL, 0x07);
10148c2ecf20Sopenharmony_ci
10158c2ecf20Sopenharmony_ci	if (!rtl92s_phy_rf_config(hw)) {
10168c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "RF Config failed\n");
10178c2ecf20Sopenharmony_ci		err = rtstatus;
10188c2ecf20Sopenharmony_ci		goto exit;
10198c2ecf20Sopenharmony_ci	}
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	/* After read predefined TXT, we must set BB/MAC/RF
10228c2ecf20Sopenharmony_ci	 * register as our requirement */
10238c2ecf20Sopenharmony_ci
10248c2ecf20Sopenharmony_ci	rtlphy->rfreg_chnlval[0] = rtl92s_phy_query_rf_reg(hw,
10258c2ecf20Sopenharmony_ci							   (enum radio_path)0,
10268c2ecf20Sopenharmony_ci							   RF_CHNLBW,
10278c2ecf20Sopenharmony_ci							   RFREG_OFFSET_MASK);
10288c2ecf20Sopenharmony_ci	rtlphy->rfreg_chnlval[1] = rtl92s_phy_query_rf_reg(hw,
10298c2ecf20Sopenharmony_ci							   (enum radio_path)1,
10308c2ecf20Sopenharmony_ci							   RF_CHNLBW,
10318c2ecf20Sopenharmony_ci							   RFREG_OFFSET_MASK);
10328c2ecf20Sopenharmony_ci
10338c2ecf20Sopenharmony_ci	/*---- Set CCK and OFDM Block "ON"----*/
10348c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
10358c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
10368c2ecf20Sopenharmony_ci
10378c2ecf20Sopenharmony_ci	/*3 Set Hardware(Do nothing now) */
10388c2ecf20Sopenharmony_ci	_rtl92se_hw_configure(hw);
10398c2ecf20Sopenharmony_ci
10408c2ecf20Sopenharmony_ci	/* Read EEPROM TX power index and PHY_REG_PG.txt to capture correct */
10418c2ecf20Sopenharmony_ci	/* TX power index for different rate set. */
10428c2ecf20Sopenharmony_ci	/* Get original hw reg values */
10438c2ecf20Sopenharmony_ci	rtl92s_phy_get_hw_reg_originalvalue(hw);
10448c2ecf20Sopenharmony_ci	/* Write correct tx power index */
10458c2ecf20Sopenharmony_ci	rtl92s_phy_set_txpower(hw, rtlphy->current_channel);
10468c2ecf20Sopenharmony_ci
10478c2ecf20Sopenharmony_ci	/* We must set MAC address after firmware download. */
10488c2ecf20Sopenharmony_ci	for (i = 0; i < 6; i++)
10498c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, MACIDR0 + i, rtlefuse->dev_addr[i]);
10508c2ecf20Sopenharmony_ci
10518c2ecf20Sopenharmony_ci	/* EEPROM R/W workaround */
10528c2ecf20Sopenharmony_ci	tmp_u1b = rtl_read_byte(rtlpriv, MAC_PINMUX_CFG);
10538c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, MAC_PINMUX_CFG, tmp_u1b & (~BIT(3)));
10548c2ecf20Sopenharmony_ci
10558c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x4d, 0x0);
10568c2ecf20Sopenharmony_ci
10578c2ecf20Sopenharmony_ci	if (hal_get_firmwareversion(rtlpriv) >= 0x49) {
10588c2ecf20Sopenharmony_ci		tmp_byte = rtl_read_byte(rtlpriv, FW_RSVD_PG_CRTL) & (~BIT(4));
10598c2ecf20Sopenharmony_ci		tmp_byte = tmp_byte | BIT(5);
10608c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, FW_RSVD_PG_CRTL, tmp_byte);
10618c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, TXDESC_MSK, 0xFFFFCFFF);
10628c2ecf20Sopenharmony_ci	}
10638c2ecf20Sopenharmony_ci
10648c2ecf20Sopenharmony_ci	/* We enable high power and RA related mechanism after NIC
10658c2ecf20Sopenharmony_ci	 * initialized. */
10668c2ecf20Sopenharmony_ci	if (hal_get_firmwareversion(rtlpriv) >= 0x35) {
10678c2ecf20Sopenharmony_ci		/* Fw v.53 and later. */
10688c2ecf20Sopenharmony_ci		rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_INIT);
10698c2ecf20Sopenharmony_ci	} else if (hal_get_firmwareversion(rtlpriv) == 0x34) {
10708c2ecf20Sopenharmony_ci		/* Fw v.52. */
10718c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, WFM5, FW_RA_INIT);
10728c2ecf20Sopenharmony_ci		rtl92s_phy_chk_fwcmd_iodone(hw);
10738c2ecf20Sopenharmony_ci	} else {
10748c2ecf20Sopenharmony_ci		/* Compatible earlier FW version. */
10758c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, WFM5, FW_RA_RESET);
10768c2ecf20Sopenharmony_ci		rtl92s_phy_chk_fwcmd_iodone(hw);
10778c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, WFM5, FW_RA_ACTIVE);
10788c2ecf20Sopenharmony_ci		rtl92s_phy_chk_fwcmd_iodone(hw);
10798c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, WFM5, FW_RA_REFRESH);
10808c2ecf20Sopenharmony_ci		rtl92s_phy_chk_fwcmd_iodone(hw);
10818c2ecf20Sopenharmony_ci	}
10828c2ecf20Sopenharmony_ci
10838c2ecf20Sopenharmony_ci	/* Add to prevent ASPM bug. */
10848c2ecf20Sopenharmony_ci	/* Always enable hst and NIC clock request. */
10858c2ecf20Sopenharmony_ci	rtl92s_phy_switch_ephy_parameter(hw);
10868c2ecf20Sopenharmony_ci
10878c2ecf20Sopenharmony_ci	/* Security related
10888c2ecf20Sopenharmony_ci	 * 1. Clear all H/W keys.
10898c2ecf20Sopenharmony_ci	 * 2. Enable H/W encryption/decryption. */
10908c2ecf20Sopenharmony_ci	rtl_cam_reset_all_entry(hw);
10918c2ecf20Sopenharmony_ci	secr_value |= SCR_TXENCENABLE;
10928c2ecf20Sopenharmony_ci	secr_value |= SCR_RXENCENABLE;
10938c2ecf20Sopenharmony_ci	secr_value |= SCR_NOSKMC;
10948c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SECR, secr_value);
10958c2ecf20Sopenharmony_ci
10968c2ecf20Sopenharmony_ci	for (i = 0; i < 4; i++)
10978c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, wdcapra_add[i], 0x5e4322);
10988c2ecf20Sopenharmony_ci
10998c2ecf20Sopenharmony_ci	if (rtlphy->rf_type == RF_1T2R) {
11008c2ecf20Sopenharmony_ci		bool mrc2set = true;
11018c2ecf20Sopenharmony_ci		/* Turn on B-Path */
11028c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_MRC, (u8 *)&mrc2set);
11038c2ecf20Sopenharmony_ci	}
11048c2ecf20Sopenharmony_ci
11058c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_ON);
11068c2ecf20Sopenharmony_ci	rtl92s_dm_init(hw);
11078c2ecf20Sopenharmony_ciexit:
11088c2ecf20Sopenharmony_ci	local_irq_restore(flags);
11098c2ecf20Sopenharmony_ci	rtlpci->being_init_adapter = false;
11108c2ecf20Sopenharmony_ci	return err;
11118c2ecf20Sopenharmony_ci}
11128c2ecf20Sopenharmony_ci
11138c2ecf20Sopenharmony_civoid rtl92se_set_mac_addr(struct rtl_io *io, const u8 *addr)
11148c2ecf20Sopenharmony_ci{
11158c2ecf20Sopenharmony_ci	/* This is a stub. */
11168c2ecf20Sopenharmony_ci}
11178c2ecf20Sopenharmony_ci
11188c2ecf20Sopenharmony_civoid rtl92se_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
11198c2ecf20Sopenharmony_ci{
11208c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11218c2ecf20Sopenharmony_ci	u32 reg_rcr;
11228c2ecf20Sopenharmony_ci
11238c2ecf20Sopenharmony_ci	if (rtlpriv->psc.rfpwr_state != ERFON)
11248c2ecf20Sopenharmony_ci		return;
11258c2ecf20Sopenharmony_ci
11268c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
11278c2ecf20Sopenharmony_ci
11288c2ecf20Sopenharmony_ci	if (check_bssid) {
11298c2ecf20Sopenharmony_ci		reg_rcr |= (RCR_CBSSID);
11308c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
11318c2ecf20Sopenharmony_ci	} else if (!check_bssid) {
11328c2ecf20Sopenharmony_ci		reg_rcr &= (~RCR_CBSSID);
11338c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
11348c2ecf20Sopenharmony_ci	}
11358c2ecf20Sopenharmony_ci
11368c2ecf20Sopenharmony_ci}
11378c2ecf20Sopenharmony_ci
11388c2ecf20Sopenharmony_cistatic int _rtl92se_set_media_status(struct ieee80211_hw *hw,
11398c2ecf20Sopenharmony_ci				     enum nl80211_iftype type)
11408c2ecf20Sopenharmony_ci{
11418c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11428c2ecf20Sopenharmony_ci	u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
11438c2ecf20Sopenharmony_ci	u32 temp;
11448c2ecf20Sopenharmony_ci	bt_msr &= ~MSR_LINK_MASK;
11458c2ecf20Sopenharmony_ci
11468c2ecf20Sopenharmony_ci	switch (type) {
11478c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_UNSPECIFIED:
11488c2ecf20Sopenharmony_ci		bt_msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
11498c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
11508c2ecf20Sopenharmony_ci			"Set Network type to NO LINK!\n");
11518c2ecf20Sopenharmony_ci		break;
11528c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_ADHOC:
11538c2ecf20Sopenharmony_ci		bt_msr |= (MSR_LINK_ADHOC << MSR_LINK_SHIFT);
11548c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
11558c2ecf20Sopenharmony_ci			"Set Network type to Ad Hoc!\n");
11568c2ecf20Sopenharmony_ci		break;
11578c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_STATION:
11588c2ecf20Sopenharmony_ci		bt_msr |= (MSR_LINK_MANAGED << MSR_LINK_SHIFT);
11598c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
11608c2ecf20Sopenharmony_ci			"Set Network type to STA!\n");
11618c2ecf20Sopenharmony_ci		break;
11628c2ecf20Sopenharmony_ci	case NL80211_IFTYPE_AP:
11638c2ecf20Sopenharmony_ci		bt_msr |= (MSR_LINK_MASTER << MSR_LINK_SHIFT);
11648c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
11658c2ecf20Sopenharmony_ci			"Set Network type to AP!\n");
11668c2ecf20Sopenharmony_ci		break;
11678c2ecf20Sopenharmony_ci	default:
11688c2ecf20Sopenharmony_ci		pr_err("Network type %d not supported!\n", type);
11698c2ecf20Sopenharmony_ci		return 1;
11708c2ecf20Sopenharmony_ci
11718c2ecf20Sopenharmony_ci	}
11728c2ecf20Sopenharmony_ci
11738c2ecf20Sopenharmony_ci	if (type != NL80211_IFTYPE_AP &&
11748c2ecf20Sopenharmony_ci	    rtlpriv->mac80211.link_state < MAC80211_LINKED)
11758c2ecf20Sopenharmony_ci		bt_msr = rtl_read_byte(rtlpriv, MSR) & ~MSR_LINK_MASK;
11768c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, MSR, bt_msr);
11778c2ecf20Sopenharmony_ci
11788c2ecf20Sopenharmony_ci	temp = rtl_read_dword(rtlpriv, TCR);
11798c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TCR, temp & (~BIT(8)));
11808c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, TCR, temp | BIT(8));
11818c2ecf20Sopenharmony_ci
11828c2ecf20Sopenharmony_ci
11838c2ecf20Sopenharmony_ci	return 0;
11848c2ecf20Sopenharmony_ci}
11858c2ecf20Sopenharmony_ci
11868c2ecf20Sopenharmony_ci/* HW_VAR_MEDIA_STATUS & HW_VAR_CECHK_BSSID */
11878c2ecf20Sopenharmony_ciint rtl92se_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
11888c2ecf20Sopenharmony_ci{
11898c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11908c2ecf20Sopenharmony_ci
11918c2ecf20Sopenharmony_ci	if (_rtl92se_set_media_status(hw, type))
11928c2ecf20Sopenharmony_ci		return -EOPNOTSUPP;
11938c2ecf20Sopenharmony_ci
11948c2ecf20Sopenharmony_ci	if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
11958c2ecf20Sopenharmony_ci		if (type != NL80211_IFTYPE_AP)
11968c2ecf20Sopenharmony_ci			rtl92se_set_check_bssid(hw, true);
11978c2ecf20Sopenharmony_ci	} else {
11988c2ecf20Sopenharmony_ci		rtl92se_set_check_bssid(hw, false);
11998c2ecf20Sopenharmony_ci	}
12008c2ecf20Sopenharmony_ci
12018c2ecf20Sopenharmony_ci	return 0;
12028c2ecf20Sopenharmony_ci}
12038c2ecf20Sopenharmony_ci
12048c2ecf20Sopenharmony_ci/* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
12058c2ecf20Sopenharmony_civoid rtl92se_set_qos(struct ieee80211_hw *hw, int aci)
12068c2ecf20Sopenharmony_ci{
12078c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
12088c2ecf20Sopenharmony_ci	rtl92s_dm_init_edca_turbo(hw);
12098c2ecf20Sopenharmony_ci
12108c2ecf20Sopenharmony_ci	switch (aci) {
12118c2ecf20Sopenharmony_ci	case AC1_BK:
12128c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, EDCAPARA_BK, 0xa44f);
12138c2ecf20Sopenharmony_ci		break;
12148c2ecf20Sopenharmony_ci	case AC0_BE:
12158c2ecf20Sopenharmony_ci		/* rtl_write_dword(rtlpriv, EDCAPARA_BE, u4b_ac_param); */
12168c2ecf20Sopenharmony_ci		break;
12178c2ecf20Sopenharmony_ci	case AC2_VI:
12188c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, EDCAPARA_VI, 0x5e4322);
12198c2ecf20Sopenharmony_ci		break;
12208c2ecf20Sopenharmony_ci	case AC3_VO:
12218c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, EDCAPARA_VO, 0x2f3222);
12228c2ecf20Sopenharmony_ci		break;
12238c2ecf20Sopenharmony_ci	default:
12248c2ecf20Sopenharmony_ci		WARN_ONCE(true, "rtl8192se: invalid aci: %d !\n", aci);
12258c2ecf20Sopenharmony_ci		break;
12268c2ecf20Sopenharmony_ci	}
12278c2ecf20Sopenharmony_ci}
12288c2ecf20Sopenharmony_ci
12298c2ecf20Sopenharmony_civoid rtl92se_enable_interrupt(struct ieee80211_hw *hw)
12308c2ecf20Sopenharmony_ci{
12318c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
12328c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
12338c2ecf20Sopenharmony_ci
12348c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, INTA_MASK, rtlpci->irq_mask[0]);
12358c2ecf20Sopenharmony_ci	/* Support Bit 32-37(Assign as Bit 0-5) interrupt setting now */
12368c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, INTA_MASK + 4, rtlpci->irq_mask[1] & 0x3F);
12378c2ecf20Sopenharmony_ci	rtlpci->irq_enabled = true;
12388c2ecf20Sopenharmony_ci}
12398c2ecf20Sopenharmony_ci
12408c2ecf20Sopenharmony_civoid rtl92se_disable_interrupt(struct ieee80211_hw *hw)
12418c2ecf20Sopenharmony_ci{
12428c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv;
12438c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci;
12448c2ecf20Sopenharmony_ci
12458c2ecf20Sopenharmony_ci	rtlpriv = rtl_priv(hw);
12468c2ecf20Sopenharmony_ci	/* if firmware not available, no interrupts */
12478c2ecf20Sopenharmony_ci	if (!rtlpriv || !rtlpriv->max_fw_size)
12488c2ecf20Sopenharmony_ci		return;
12498c2ecf20Sopenharmony_ci	rtlpci = rtl_pcidev(rtl_pcipriv(hw));
12508c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, INTA_MASK, 0);
12518c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, INTA_MASK + 4, 0);
12528c2ecf20Sopenharmony_ci	rtlpci->irq_enabled = false;
12538c2ecf20Sopenharmony_ci}
12548c2ecf20Sopenharmony_ci
12558c2ecf20Sopenharmony_cistatic u8 _rtl92s_set_sysclk(struct ieee80211_hw *hw, u8 data)
12568c2ecf20Sopenharmony_ci{
12578c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
12588c2ecf20Sopenharmony_ci	u8 waitcnt = 100;
12598c2ecf20Sopenharmony_ci	bool result = false;
12608c2ecf20Sopenharmony_ci	u8 tmp;
12618c2ecf20Sopenharmony_ci
12628c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, SYS_CLKR + 1, data);
12638c2ecf20Sopenharmony_ci
12648c2ecf20Sopenharmony_ci	/* Wait the MAC synchronized. */
12658c2ecf20Sopenharmony_ci	udelay(400);
12668c2ecf20Sopenharmony_ci
12678c2ecf20Sopenharmony_ci	/* Check if it is set ready. */
12688c2ecf20Sopenharmony_ci	tmp = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
12698c2ecf20Sopenharmony_ci	result = ((tmp & BIT(7)) == (data & BIT(7)));
12708c2ecf20Sopenharmony_ci
12718c2ecf20Sopenharmony_ci	if ((data & (BIT(6) | BIT(7))) == false) {
12728c2ecf20Sopenharmony_ci		waitcnt = 100;
12738c2ecf20Sopenharmony_ci		tmp = 0;
12748c2ecf20Sopenharmony_ci
12758c2ecf20Sopenharmony_ci		while (1) {
12768c2ecf20Sopenharmony_ci			waitcnt--;
12778c2ecf20Sopenharmony_ci			tmp = rtl_read_byte(rtlpriv, SYS_CLKR + 1);
12788c2ecf20Sopenharmony_ci
12798c2ecf20Sopenharmony_ci			if ((tmp & BIT(6)))
12808c2ecf20Sopenharmony_ci				break;
12818c2ecf20Sopenharmony_ci
12828c2ecf20Sopenharmony_ci			pr_err("wait for BIT(6) return value %x\n", tmp);
12838c2ecf20Sopenharmony_ci
12848c2ecf20Sopenharmony_ci			if (waitcnt == 0)
12858c2ecf20Sopenharmony_ci				break;
12868c2ecf20Sopenharmony_ci			udelay(10);
12878c2ecf20Sopenharmony_ci		}
12888c2ecf20Sopenharmony_ci
12898c2ecf20Sopenharmony_ci		if (waitcnt == 0)
12908c2ecf20Sopenharmony_ci			result = false;
12918c2ecf20Sopenharmony_ci		else
12928c2ecf20Sopenharmony_ci			result = true;
12938c2ecf20Sopenharmony_ci	}
12948c2ecf20Sopenharmony_ci
12958c2ecf20Sopenharmony_ci	return result;
12968c2ecf20Sopenharmony_ci}
12978c2ecf20Sopenharmony_ci
12988c2ecf20Sopenharmony_cistatic void _rtl92s_phy_set_rfhalt(struct ieee80211_hw *hw)
12998c2ecf20Sopenharmony_ci{
13008c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
13018c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
13028c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
13038c2ecf20Sopenharmony_ci	u8 u1btmp;
13048c2ecf20Sopenharmony_ci
13058c2ecf20Sopenharmony_ci	if (rtlhal->driver_going2unload)
13068c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x560, 0x0);
13078c2ecf20Sopenharmony_ci
13088c2ecf20Sopenharmony_ci	/* Power save for BB/RF */
13098c2ecf20Sopenharmony_ci	u1btmp = rtl_read_byte(rtlpriv, LDOV12D_CTRL);
13108c2ecf20Sopenharmony_ci	u1btmp |= BIT(0);
13118c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, LDOV12D_CTRL, u1btmp);
13128c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, SPS1_CTRL, 0x0);
13138c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, TXPAUSE, 0xFF);
13148c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x57FC);
13158c2ecf20Sopenharmony_ci	udelay(100);
13168c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x77FC);
13178c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, PHY_CCA, 0x0);
13188c2ecf20Sopenharmony_ci	udelay(10);
13198c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x37FC);
13208c2ecf20Sopenharmony_ci	udelay(10);
13218c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x77FC);
13228c2ecf20Sopenharmony_ci	udelay(10);
13238c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x57FC);
13248c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x0000);
13258c2ecf20Sopenharmony_ci
13268c2ecf20Sopenharmony_ci	if (rtlhal->driver_going2unload) {
13278c2ecf20Sopenharmony_ci		u1btmp = rtl_read_byte(rtlpriv, (REG_SYS_FUNC_EN + 1));
13288c2ecf20Sopenharmony_ci		u1btmp &= ~(BIT(0));
13298c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, u1btmp);
13308c2ecf20Sopenharmony_ci	}
13318c2ecf20Sopenharmony_ci
13328c2ecf20Sopenharmony_ci	u1btmp = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
13338c2ecf20Sopenharmony_ci
13348c2ecf20Sopenharmony_ci	/* Add description. After switch control path. register
13358c2ecf20Sopenharmony_ci	 * after page1 will be invisible. We can not do any IO
13368c2ecf20Sopenharmony_ci	 * for register>0x40. After resume&MACIO reset, we need
13378c2ecf20Sopenharmony_ci	 * to remember previous reg content. */
13388c2ecf20Sopenharmony_ci	if (u1btmp & BIT(7)) {
13398c2ecf20Sopenharmony_ci		u1btmp &= ~(BIT(6) | BIT(7));
13408c2ecf20Sopenharmony_ci		if (!_rtl92s_set_sysclk(hw, u1btmp)) {
13418c2ecf20Sopenharmony_ci			pr_err("Switch ctrl path fail\n");
13428c2ecf20Sopenharmony_ci			return;
13438c2ecf20Sopenharmony_ci		}
13448c2ecf20Sopenharmony_ci	}
13458c2ecf20Sopenharmony_ci
13468c2ecf20Sopenharmony_ci	/* Power save for MAC */
13478c2ecf20Sopenharmony_ci	if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS  &&
13488c2ecf20Sopenharmony_ci		!rtlhal->driver_going2unload) {
13498c2ecf20Sopenharmony_ci		/* enable LED function */
13508c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x03, 0xF9);
13518c2ecf20Sopenharmony_ci	/* SW/HW radio off or halt adapter!! For example S3/S4 */
13528c2ecf20Sopenharmony_ci	} else {
13538c2ecf20Sopenharmony_ci		/* LED function disable. Power range is about 8mA now. */
13548c2ecf20Sopenharmony_ci		/* if write 0xF1 disconnect_pci power
13558c2ecf20Sopenharmony_ci		 *	 ifconfig wlan0 down power are both high 35:70 */
13568c2ecf20Sopenharmony_ci		/* if write oxF9 disconnect_pci power
13578c2ecf20Sopenharmony_ci		 * ifconfig wlan0 down power are both low  12:45*/
13588c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x03, 0xF9);
13598c2ecf20Sopenharmony_ci	}
13608c2ecf20Sopenharmony_ci
13618c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, SYS_CLKR + 1, 0x70);
13628c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL + 1, 0x68);
13638c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv,  AFE_PLL_CTRL, 0x00);
13648c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
13658c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_XTAL_CTRL, 0x0E);
13668c2ecf20Sopenharmony_ci	RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
13678c2ecf20Sopenharmony_ci
13688c2ecf20Sopenharmony_ci}
13698c2ecf20Sopenharmony_ci
13708c2ecf20Sopenharmony_cistatic void _rtl92se_gen_refreshledstate(struct ieee80211_hw *hw)
13718c2ecf20Sopenharmony_ci{
13728c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
13738c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
13748c2ecf20Sopenharmony_ci	struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
13758c2ecf20Sopenharmony_ci
13768c2ecf20Sopenharmony_ci	if (rtlpci->up_first_time == 1)
13778c2ecf20Sopenharmony_ci		return;
13788c2ecf20Sopenharmony_ci
13798c2ecf20Sopenharmony_ci	if (rtlpriv->psc.rfoff_reason == RF_CHANGE_BY_IPS)
13808c2ecf20Sopenharmony_ci		rtl92se_sw_led_on(hw, pled0);
13818c2ecf20Sopenharmony_ci	else
13828c2ecf20Sopenharmony_ci		rtl92se_sw_led_off(hw, pled0);
13838c2ecf20Sopenharmony_ci}
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_ci
13868c2ecf20Sopenharmony_cistatic void _rtl92se_power_domain_init(struct ieee80211_hw *hw)
13878c2ecf20Sopenharmony_ci{
13888c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
13898c2ecf20Sopenharmony_ci	u16 tmpu2b;
13908c2ecf20Sopenharmony_ci	u8 tmpu1b;
13918c2ecf20Sopenharmony_ci
13928c2ecf20Sopenharmony_ci	rtlpriv->psc.pwrdomain_protect = true;
13938c2ecf20Sopenharmony_ci
13948c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
13958c2ecf20Sopenharmony_ci	if (tmpu1b & BIT(7)) {
13968c2ecf20Sopenharmony_ci		tmpu1b &= ~(BIT(6) | BIT(7));
13978c2ecf20Sopenharmony_ci		if (!_rtl92s_set_sysclk(hw, tmpu1b)) {
13988c2ecf20Sopenharmony_ci			rtlpriv->psc.pwrdomain_protect = false;
13998c2ecf20Sopenharmony_ci			return;
14008c2ecf20Sopenharmony_ci		}
14018c2ecf20Sopenharmony_ci	}
14028c2ecf20Sopenharmony_ci
14038c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL, 0x0);
14048c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
14058c2ecf20Sopenharmony_ci
14068c2ecf20Sopenharmony_ci	/* Reset MAC-IO and CPU and Core Digital BIT10/11/15 */
14078c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
14088c2ecf20Sopenharmony_ci
14098c2ecf20Sopenharmony_ci	/* If IPS we need to turn LED on. So we not
14108c2ecf20Sopenharmony_ci	 * not disable BIT 3/7 of reg3. */
14118c2ecf20Sopenharmony_ci	if (rtlpriv->psc.rfoff_reason & (RF_CHANGE_BY_IPS | RF_CHANGE_BY_HW))
14128c2ecf20Sopenharmony_ci		tmpu1b &= 0xFB;
14138c2ecf20Sopenharmony_ci	else
14148c2ecf20Sopenharmony_ci		tmpu1b &= 0x73;
14158c2ecf20Sopenharmony_ci
14168c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
14178c2ecf20Sopenharmony_ci	/* wait for BIT 10/11/15 to pull high automatically!! */
14188c2ecf20Sopenharmony_ci	mdelay(1);
14198c2ecf20Sopenharmony_ci
14208c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, CMDR, 0);
14218c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, TCR, 0);
14228c2ecf20Sopenharmony_ci
14238c2ecf20Sopenharmony_ci	/* Data sheet not define 0x562!!! Copy from WMAC!!!!! */
14248c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, 0x562);
14258c2ecf20Sopenharmony_ci	tmpu1b |= 0x08;
14268c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x562, tmpu1b);
14278c2ecf20Sopenharmony_ci	tmpu1b &= ~(BIT(3));
14288c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x562, tmpu1b);
14298c2ecf20Sopenharmony_ci
14308c2ecf20Sopenharmony_ci	/* Enable AFE clock source */
14318c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL);
14328c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_XTAL_CTRL, (tmpu1b | 0x01));
14338c2ecf20Sopenharmony_ci	/* Delay 1.5ms */
14348c2ecf20Sopenharmony_ci	udelay(1500);
14358c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_XTAL_CTRL + 1);
14368c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_XTAL_CTRL + 1, (tmpu1b & 0xfb));
14378c2ecf20Sopenharmony_ci
14388c2ecf20Sopenharmony_ci	/* Enable AFE Macro Block's Bandgap */
14398c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
14408c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | BIT(0)));
14418c2ecf20Sopenharmony_ci	mdelay(1);
14428c2ecf20Sopenharmony_ci
14438c2ecf20Sopenharmony_ci	/* Enable AFE Mbias */
14448c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_MISC);
14458c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_MISC, (tmpu1b | 0x02));
14468c2ecf20Sopenharmony_ci	mdelay(1);
14478c2ecf20Sopenharmony_ci
14488c2ecf20Sopenharmony_ci	/* Enable LDOA15 block */
14498c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, LDOA15_CTRL);
14508c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, LDOA15_CTRL, (tmpu1b | BIT(0)));
14518c2ecf20Sopenharmony_ci
14528c2ecf20Sopenharmony_ci	/* Set Digital Vdd to Retention isolation Path. */
14538c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, REG_SYS_ISO_CTRL);
14548c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_ISO_CTRL, (tmpu2b | BIT(11)));
14558c2ecf20Sopenharmony_ci
14568c2ecf20Sopenharmony_ci
14578c2ecf20Sopenharmony_ci	/* For warm reboot NIC disappera bug. */
14588c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
14598c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(13)));
14608c2ecf20Sopenharmony_ci
14618c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, 0x68);
14628c2ecf20Sopenharmony_ci
14638c2ecf20Sopenharmony_ci	/* Enable AFE PLL Macro Block */
14648c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL);
14658c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL, (tmpu1b | BIT(0) | BIT(4)));
14668c2ecf20Sopenharmony_ci	/* Enable MAC 80MHZ clock */
14678c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL + 1);
14688c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, AFE_PLL_CTRL + 1, (tmpu1b | BIT(0)));
14698c2ecf20Sopenharmony_ci	mdelay(1);
14708c2ecf20Sopenharmony_ci
14718c2ecf20Sopenharmony_ci	/* Release isolation AFE PLL & MD */
14728c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, 0xA6);
14738c2ecf20Sopenharmony_ci
14748c2ecf20Sopenharmony_ci	/* Enable MAC clock */
14758c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
14768c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b | BIT(12) | BIT(11)));
14778c2ecf20Sopenharmony_ci
14788c2ecf20Sopenharmony_ci	/* Enable Core digital and enable IOREG R/W */
14798c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
14808c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11)));
14818c2ecf20Sopenharmony_ci	/* enable REG_EN */
14828c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11) | BIT(15)));
14838c2ecf20Sopenharmony_ci
14848c2ecf20Sopenharmony_ci	/* Switch the control path. */
14858c2ecf20Sopenharmony_ci	tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
14868c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b & (~BIT(2))));
14878c2ecf20Sopenharmony_ci
14888c2ecf20Sopenharmony_ci	tmpu1b = rtl_read_byte(rtlpriv, (SYS_CLKR + 1));
14898c2ecf20Sopenharmony_ci	tmpu1b = ((tmpu1b | BIT(7)) & (~BIT(6)));
14908c2ecf20Sopenharmony_ci	if (!_rtl92s_set_sysclk(hw, tmpu1b)) {
14918c2ecf20Sopenharmony_ci		rtlpriv->psc.pwrdomain_protect = false;
14928c2ecf20Sopenharmony_ci		return;
14938c2ecf20Sopenharmony_ci	}
14948c2ecf20Sopenharmony_ci
14958c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, CMDR, 0x37FC);
14968c2ecf20Sopenharmony_ci
14978c2ecf20Sopenharmony_ci	/* After MACIO reset,we must refresh LED state. */
14988c2ecf20Sopenharmony_ci	_rtl92se_gen_refreshledstate(hw);
14998c2ecf20Sopenharmony_ci
15008c2ecf20Sopenharmony_ci	rtlpriv->psc.pwrdomain_protect = false;
15018c2ecf20Sopenharmony_ci}
15028c2ecf20Sopenharmony_ci
15038c2ecf20Sopenharmony_civoid rtl92se_card_disable(struct ieee80211_hw *hw)
15048c2ecf20Sopenharmony_ci{
15058c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
15068c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
15078c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
15088c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
15098c2ecf20Sopenharmony_ci	enum nl80211_iftype opmode;
15108c2ecf20Sopenharmony_ci	u8 wait = 30;
15118c2ecf20Sopenharmony_ci
15128c2ecf20Sopenharmony_ci	rtlpriv->intf_ops->enable_aspm(hw);
15138c2ecf20Sopenharmony_ci
15148c2ecf20Sopenharmony_ci	if (rtlpci->driver_is_goingto_unload ||
15158c2ecf20Sopenharmony_ci		ppsc->rfoff_reason > RF_CHANGE_BY_PS)
15168c2ecf20Sopenharmony_ci		rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
15178c2ecf20Sopenharmony_ci
15188c2ecf20Sopenharmony_ci	/* we should chnge GPIO to input mode
15198c2ecf20Sopenharmony_ci	 * this will drop away current about 25mA*/
15208c2ecf20Sopenharmony_ci	rtl8192se_gpiobit3_cfg_inputmode(hw);
15218c2ecf20Sopenharmony_ci
15228c2ecf20Sopenharmony_ci	/* this is very important for ips power save */
15238c2ecf20Sopenharmony_ci	while (wait-- >= 10 && rtlpriv->psc.pwrdomain_protect) {
15248c2ecf20Sopenharmony_ci		if (rtlpriv->psc.pwrdomain_protect)
15258c2ecf20Sopenharmony_ci			mdelay(20);
15268c2ecf20Sopenharmony_ci		else
15278c2ecf20Sopenharmony_ci			break;
15288c2ecf20Sopenharmony_ci	}
15298c2ecf20Sopenharmony_ci
15308c2ecf20Sopenharmony_ci	mac->link_state = MAC80211_NOLINK;
15318c2ecf20Sopenharmony_ci	opmode = NL80211_IFTYPE_UNSPECIFIED;
15328c2ecf20Sopenharmony_ci	_rtl92se_set_media_status(hw, opmode);
15338c2ecf20Sopenharmony_ci
15348c2ecf20Sopenharmony_ci	_rtl92s_phy_set_rfhalt(hw);
15358c2ecf20Sopenharmony_ci	udelay(100);
15368c2ecf20Sopenharmony_ci}
15378c2ecf20Sopenharmony_ci
15388c2ecf20Sopenharmony_civoid rtl92se_interrupt_recognized(struct ieee80211_hw *hw,
15398c2ecf20Sopenharmony_ci				  struct rtl_int *intvec)
15408c2ecf20Sopenharmony_ci{
15418c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
15428c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
15438c2ecf20Sopenharmony_ci
15448c2ecf20Sopenharmony_ci	intvec->inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
15458c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, ISR, intvec->inta);
15468c2ecf20Sopenharmony_ci
15478c2ecf20Sopenharmony_ci	intvec->intb = rtl_read_dword(rtlpriv, ISR + 4) & rtlpci->irq_mask[1];
15488c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, ISR + 4, intvec->intb);
15498c2ecf20Sopenharmony_ci}
15508c2ecf20Sopenharmony_ci
15518c2ecf20Sopenharmony_civoid rtl92se_set_beacon_related_registers(struct ieee80211_hw *hw)
15528c2ecf20Sopenharmony_ci{
15538c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
15548c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
15558c2ecf20Sopenharmony_ci	u16 bcntime_cfg = 0;
15568c2ecf20Sopenharmony_ci	u16 bcn_cw = 6, bcn_ifs = 0xf;
15578c2ecf20Sopenharmony_ci	u16 atim_window = 2;
15588c2ecf20Sopenharmony_ci
15598c2ecf20Sopenharmony_ci	/* ATIM Window (in unit of TU). */
15608c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, ATIMWND, atim_window);
15618c2ecf20Sopenharmony_ci
15628c2ecf20Sopenharmony_ci	/* Beacon interval (in unit of TU). */
15638c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, BCN_INTERVAL, mac->beacon_interval);
15648c2ecf20Sopenharmony_ci
15658c2ecf20Sopenharmony_ci	/* DrvErlyInt (in unit of TU). (Time to send
15668c2ecf20Sopenharmony_ci	 * interrupt to notify driver to change
15678c2ecf20Sopenharmony_ci	 * beacon content) */
15688c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, BCN_DRV_EARLY_INT, 10 << 4);
15698c2ecf20Sopenharmony_ci
15708c2ecf20Sopenharmony_ci	/* BcnDMATIM(in unit of us). Indicates the
15718c2ecf20Sopenharmony_ci	 * time before TBTT to perform beacon queue DMA  */
15728c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, BCN_DMATIME, 256);
15738c2ecf20Sopenharmony_ci
15748c2ecf20Sopenharmony_ci	/* Force beacon frame transmission even
15758c2ecf20Sopenharmony_ci	 * after receiving beacon frame from
15768c2ecf20Sopenharmony_ci	 * other ad hoc STA */
15778c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, BCN_ERR_THRESH, 100);
15788c2ecf20Sopenharmony_ci
15798c2ecf20Sopenharmony_ci	/* Beacon Time Configuration */
15808c2ecf20Sopenharmony_ci	if (mac->opmode == NL80211_IFTYPE_ADHOC)
15818c2ecf20Sopenharmony_ci		bcntime_cfg |= (bcn_cw << BCN_TCFG_CW_SHIFT);
15828c2ecf20Sopenharmony_ci
15838c2ecf20Sopenharmony_ci	/* TODO: bcn_ifs may required to be changed on ASIC */
15848c2ecf20Sopenharmony_ci	bcntime_cfg |= bcn_ifs << BCN_TCFG_IFS;
15858c2ecf20Sopenharmony_ci
15868c2ecf20Sopenharmony_ci	/*for beacon changed */
15878c2ecf20Sopenharmony_ci	rtl92s_phy_set_beacon_hwreg(hw, mac->beacon_interval);
15888c2ecf20Sopenharmony_ci}
15898c2ecf20Sopenharmony_ci
15908c2ecf20Sopenharmony_civoid rtl92se_set_beacon_interval(struct ieee80211_hw *hw)
15918c2ecf20Sopenharmony_ci{
15928c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
15938c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
15948c2ecf20Sopenharmony_ci	u16 bcn_interval = mac->beacon_interval;
15958c2ecf20Sopenharmony_ci
15968c2ecf20Sopenharmony_ci	/* Beacon interval (in unit of TU). */
15978c2ecf20Sopenharmony_ci	rtl_write_word(rtlpriv, BCN_INTERVAL, bcn_interval);
15988c2ecf20Sopenharmony_ci	/* 2008.10.24 added by tynli for beacon changed. */
15998c2ecf20Sopenharmony_ci	rtl92s_phy_set_beacon_hwreg(hw, bcn_interval);
16008c2ecf20Sopenharmony_ci}
16018c2ecf20Sopenharmony_ci
16028c2ecf20Sopenharmony_civoid rtl92se_update_interrupt_mask(struct ieee80211_hw *hw,
16038c2ecf20Sopenharmony_ci		u32 add_msr, u32 rm_msr)
16048c2ecf20Sopenharmony_ci{
16058c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16068c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
16078c2ecf20Sopenharmony_ci
16088c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INTR, DBG_LOUD, "add_msr:%x, rm_msr:%x\n",
16098c2ecf20Sopenharmony_ci		add_msr, rm_msr);
16108c2ecf20Sopenharmony_ci
16118c2ecf20Sopenharmony_ci	if (add_msr)
16128c2ecf20Sopenharmony_ci		rtlpci->irq_mask[0] |= add_msr;
16138c2ecf20Sopenharmony_ci
16148c2ecf20Sopenharmony_ci	if (rm_msr)
16158c2ecf20Sopenharmony_ci		rtlpci->irq_mask[0] &= (~rm_msr);
16168c2ecf20Sopenharmony_ci
16178c2ecf20Sopenharmony_ci	rtl92se_disable_interrupt(hw);
16188c2ecf20Sopenharmony_ci	rtl92se_enable_interrupt(hw);
16198c2ecf20Sopenharmony_ci}
16208c2ecf20Sopenharmony_ci
16218c2ecf20Sopenharmony_cistatic void _rtl8192se_get_ic_inferiority(struct ieee80211_hw *hw)
16228c2ecf20Sopenharmony_ci{
16238c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
16248c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
16258c2ecf20Sopenharmony_ci	u8 efuse_id;
16268c2ecf20Sopenharmony_ci
16278c2ecf20Sopenharmony_ci	rtlhal->ic_class = IC_INFERIORITY_A;
16288c2ecf20Sopenharmony_ci
16298c2ecf20Sopenharmony_ci	/* Only retrieving while using EFUSE. */
16308c2ecf20Sopenharmony_ci	if ((rtlefuse->epromtype == EEPROM_BOOT_EFUSE) &&
16318c2ecf20Sopenharmony_ci		!rtlefuse->autoload_failflag) {
16328c2ecf20Sopenharmony_ci		efuse_id = efuse_read_1byte(hw, EFUSE_IC_ID_OFFSET);
16338c2ecf20Sopenharmony_ci
16348c2ecf20Sopenharmony_ci		if (efuse_id == 0xfe)
16358c2ecf20Sopenharmony_ci			rtlhal->ic_class = IC_INFERIORITY_B;
16368c2ecf20Sopenharmony_ci	}
16378c2ecf20Sopenharmony_ci}
16388c2ecf20Sopenharmony_ci
16398c2ecf20Sopenharmony_cistatic void _rtl92se_read_adapter_info(struct ieee80211_hw *hw)
16408c2ecf20Sopenharmony_ci{
16418c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16428c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
16438c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
16448c2ecf20Sopenharmony_ci	struct device *dev = &rtl_pcipriv(hw)->dev.pdev->dev;
16458c2ecf20Sopenharmony_ci	u16 i, usvalue;
16468c2ecf20Sopenharmony_ci	u16	eeprom_id;
16478c2ecf20Sopenharmony_ci	u8 tempval;
16488c2ecf20Sopenharmony_ci	u8 hwinfo[HWSET_MAX_SIZE_92S];
16498c2ecf20Sopenharmony_ci	u8 rf_path, index;
16508c2ecf20Sopenharmony_ci
16518c2ecf20Sopenharmony_ci	switch (rtlefuse->epromtype) {
16528c2ecf20Sopenharmony_ci	case EEPROM_BOOT_EFUSE:
16538c2ecf20Sopenharmony_ci		rtl_efuse_shadow_map_update(hw);
16548c2ecf20Sopenharmony_ci		break;
16558c2ecf20Sopenharmony_ci
16568c2ecf20Sopenharmony_ci	case EEPROM_93C46:
16578c2ecf20Sopenharmony_ci		pr_err("RTL819X Not boot from eeprom, check it !!\n");
16588c2ecf20Sopenharmony_ci		return;
16598c2ecf20Sopenharmony_ci
16608c2ecf20Sopenharmony_ci	default:
16618c2ecf20Sopenharmony_ci		dev_warn(dev, "no efuse data\n");
16628c2ecf20Sopenharmony_ci		return;
16638c2ecf20Sopenharmony_ci	}
16648c2ecf20Sopenharmony_ci
16658c2ecf20Sopenharmony_ci	memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
16668c2ecf20Sopenharmony_ci	       HWSET_MAX_SIZE_92S);
16678c2ecf20Sopenharmony_ci
16688c2ecf20Sopenharmony_ci	RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
16698c2ecf20Sopenharmony_ci		      hwinfo, HWSET_MAX_SIZE_92S);
16708c2ecf20Sopenharmony_ci
16718c2ecf20Sopenharmony_ci	eeprom_id = *((u16 *)&hwinfo[0]);
16728c2ecf20Sopenharmony_ci	if (eeprom_id != RTL8190_EEPROM_ID) {
16738c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
16748c2ecf20Sopenharmony_ci			"EEPROM ID(%#x) is invalid!!\n", eeprom_id);
16758c2ecf20Sopenharmony_ci		rtlefuse->autoload_failflag = true;
16768c2ecf20Sopenharmony_ci	} else {
16778c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
16788c2ecf20Sopenharmony_ci		rtlefuse->autoload_failflag = false;
16798c2ecf20Sopenharmony_ci	}
16808c2ecf20Sopenharmony_ci
16818c2ecf20Sopenharmony_ci	if (rtlefuse->autoload_failflag)
16828c2ecf20Sopenharmony_ci		return;
16838c2ecf20Sopenharmony_ci
16848c2ecf20Sopenharmony_ci	_rtl8192se_get_ic_inferiority(hw);
16858c2ecf20Sopenharmony_ci
16868c2ecf20Sopenharmony_ci	/* Read IC Version && Channel Plan */
16878c2ecf20Sopenharmony_ci	/* VID, DID	 SE	0xA-D */
16888c2ecf20Sopenharmony_ci	rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
16898c2ecf20Sopenharmony_ci	rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
16908c2ecf20Sopenharmony_ci	rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
16918c2ecf20Sopenharmony_ci	rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
16928c2ecf20Sopenharmony_ci	rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];
16938c2ecf20Sopenharmony_ci
16948c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
16958c2ecf20Sopenharmony_ci		"EEPROMId = 0x%4x\n", eeprom_id);
16968c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
16978c2ecf20Sopenharmony_ci		"EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
16988c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
16998c2ecf20Sopenharmony_ci		"EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
17008c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
17018c2ecf20Sopenharmony_ci		"EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
17028c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
17038c2ecf20Sopenharmony_ci		"EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
17048c2ecf20Sopenharmony_ci
17058c2ecf20Sopenharmony_ci	for (i = 0; i < 6; i += 2) {
17068c2ecf20Sopenharmony_ci		usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
17078c2ecf20Sopenharmony_ci		*((u16 *) (&rtlefuse->dev_addr[i])) = usvalue;
17088c2ecf20Sopenharmony_ci	}
17098c2ecf20Sopenharmony_ci
17108c2ecf20Sopenharmony_ci	for (i = 0; i < 6; i++)
17118c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, MACIDR0 + i, rtlefuse->dev_addr[i]);
17128c2ecf20Sopenharmony_ci
17138c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "%pM\n", rtlefuse->dev_addr);
17148c2ecf20Sopenharmony_ci
17158c2ecf20Sopenharmony_ci	/* Get Tx Power Level by Channel */
17168c2ecf20Sopenharmony_ci	/* Read Tx power of Channel 1 ~ 14 from EEPROM. */
17178c2ecf20Sopenharmony_ci	/* 92S suupport RF A & B */
17188c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++) {
17198c2ecf20Sopenharmony_ci		for (i = 0; i < 3; i++) {
17208c2ecf20Sopenharmony_ci			/* Read CCK RF A & B Tx power  */
17218c2ecf20Sopenharmony_ci			rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][i] =
17228c2ecf20Sopenharmony_ci			hwinfo[EEPROM_TXPOWERBASE + rf_path * 3 + i];
17238c2ecf20Sopenharmony_ci
17248c2ecf20Sopenharmony_ci			/* Read OFDM RF A & B Tx power for 1T */
17258c2ecf20Sopenharmony_ci			rtlefuse->eeprom_chnlarea_txpwr_ht40_1s[rf_path][i] =
17268c2ecf20Sopenharmony_ci			hwinfo[EEPROM_TXPOWERBASE + 6 + rf_path * 3 + i];
17278c2ecf20Sopenharmony_ci
17288c2ecf20Sopenharmony_ci			/* Read OFDM RF A & B Tx power for 2T */
17298c2ecf20Sopenharmony_ci			rtlefuse->eprom_chnl_txpwr_ht40_2sdf[rf_path][i]
17308c2ecf20Sopenharmony_ci				 = hwinfo[EEPROM_TXPOWERBASE + 12 +
17318c2ecf20Sopenharmony_ci				   rf_path * 3 + i];
17328c2ecf20Sopenharmony_ci		}
17338c2ecf20Sopenharmony_ci	}
17348c2ecf20Sopenharmony_ci
17358c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++)
17368c2ecf20Sopenharmony_ci		for (i = 0; i < 3; i++)
17378c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
17388c2ecf20Sopenharmony_ci				"RF(%d) EEPROM CCK Area(%d) = 0x%x\n",
17398c2ecf20Sopenharmony_ci				rf_path, i,
17408c2ecf20Sopenharmony_ci				rtlefuse->eeprom_chnlarea_txpwr_cck
17418c2ecf20Sopenharmony_ci				[rf_path][i]);
17428c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++)
17438c2ecf20Sopenharmony_ci		for (i = 0; i < 3; i++)
17448c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
17458c2ecf20Sopenharmony_ci				"RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
17468c2ecf20Sopenharmony_ci				rf_path, i,
17478c2ecf20Sopenharmony_ci				rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
17488c2ecf20Sopenharmony_ci				[rf_path][i]);
17498c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++)
17508c2ecf20Sopenharmony_ci		for (i = 0; i < 3; i++)
17518c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
17528c2ecf20Sopenharmony_ci				"RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
17538c2ecf20Sopenharmony_ci				rf_path, i,
17548c2ecf20Sopenharmony_ci				rtlefuse->eprom_chnl_txpwr_ht40_2sdf
17558c2ecf20Sopenharmony_ci				[rf_path][i]);
17568c2ecf20Sopenharmony_ci
17578c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++) {
17588c2ecf20Sopenharmony_ci
17598c2ecf20Sopenharmony_ci		/* Assign dedicated channel tx power */
17608c2ecf20Sopenharmony_ci		for (i = 0; i < 14; i++)	{
17618c2ecf20Sopenharmony_ci			/* channel 1~3 use the same Tx Power Level. */
17628c2ecf20Sopenharmony_ci			if (i < 3)
17638c2ecf20Sopenharmony_ci				index = 0;
17648c2ecf20Sopenharmony_ci			/* Channel 4-8 */
17658c2ecf20Sopenharmony_ci			else if (i < 8)
17668c2ecf20Sopenharmony_ci				index = 1;
17678c2ecf20Sopenharmony_ci			/* Channel 9-14 */
17688c2ecf20Sopenharmony_ci			else
17698c2ecf20Sopenharmony_ci				index = 2;
17708c2ecf20Sopenharmony_ci
17718c2ecf20Sopenharmony_ci			/* Record A & B CCK /OFDM - 1T/2T Channel area
17728c2ecf20Sopenharmony_ci			 * tx power */
17738c2ecf20Sopenharmony_ci			rtlefuse->txpwrlevel_cck[rf_path][i]  =
17748c2ecf20Sopenharmony_ci				rtlefuse->eeprom_chnlarea_txpwr_cck
17758c2ecf20Sopenharmony_ci							[rf_path][index];
17768c2ecf20Sopenharmony_ci			rtlefuse->txpwrlevel_ht40_1s[rf_path][i]  =
17778c2ecf20Sopenharmony_ci				rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
17788c2ecf20Sopenharmony_ci							[rf_path][index];
17798c2ecf20Sopenharmony_ci			rtlefuse->txpwrlevel_ht40_2s[rf_path][i]  =
17808c2ecf20Sopenharmony_ci				rtlefuse->eprom_chnl_txpwr_ht40_2sdf
17818c2ecf20Sopenharmony_ci							[rf_path][index];
17828c2ecf20Sopenharmony_ci		}
17838c2ecf20Sopenharmony_ci
17848c2ecf20Sopenharmony_ci		for (i = 0; i < 14; i++) {
17858c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
17868c2ecf20Sopenharmony_ci				"RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n",
17878c2ecf20Sopenharmony_ci				rf_path, i,
17888c2ecf20Sopenharmony_ci				rtlefuse->txpwrlevel_cck[rf_path][i],
17898c2ecf20Sopenharmony_ci				rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
17908c2ecf20Sopenharmony_ci				rtlefuse->txpwrlevel_ht40_2s[rf_path][i]);
17918c2ecf20Sopenharmony_ci		}
17928c2ecf20Sopenharmony_ci	}
17938c2ecf20Sopenharmony_ci
17948c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++) {
17958c2ecf20Sopenharmony_ci		for (i = 0; i < 3; i++) {
17968c2ecf20Sopenharmony_ci			/* Read Power diff limit. */
17978c2ecf20Sopenharmony_ci			rtlefuse->eeprom_pwrgroup[rf_path][i] =
17988c2ecf20Sopenharmony_ci				hwinfo[EEPROM_TXPWRGROUP + rf_path * 3 + i];
17998c2ecf20Sopenharmony_ci		}
18008c2ecf20Sopenharmony_ci	}
18018c2ecf20Sopenharmony_ci
18028c2ecf20Sopenharmony_ci	for (rf_path = 0; rf_path < 2; rf_path++) {
18038c2ecf20Sopenharmony_ci		/* Fill Pwr group */
18048c2ecf20Sopenharmony_ci		for (i = 0; i < 14; i++) {
18058c2ecf20Sopenharmony_ci			/* Chanel 1-3 */
18068c2ecf20Sopenharmony_ci			if (i < 3)
18078c2ecf20Sopenharmony_ci				index = 0;
18088c2ecf20Sopenharmony_ci			/* Channel 4-8 */
18098c2ecf20Sopenharmony_ci			else if (i < 8)
18108c2ecf20Sopenharmony_ci				index = 1;
18118c2ecf20Sopenharmony_ci			/* Channel 9-13 */
18128c2ecf20Sopenharmony_ci			else
18138c2ecf20Sopenharmony_ci				index = 2;
18148c2ecf20Sopenharmony_ci
18158c2ecf20Sopenharmony_ci			rtlefuse->pwrgroup_ht20[rf_path][i] =
18168c2ecf20Sopenharmony_ci				(rtlefuse->eeprom_pwrgroup[rf_path][index] &
18178c2ecf20Sopenharmony_ci				0xf);
18188c2ecf20Sopenharmony_ci			rtlefuse->pwrgroup_ht40[rf_path][i] =
18198c2ecf20Sopenharmony_ci				((rtlefuse->eeprom_pwrgroup[rf_path][index] &
18208c2ecf20Sopenharmony_ci				0xf0) >> 4);
18218c2ecf20Sopenharmony_ci
18228c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18238c2ecf20Sopenharmony_ci				"RF-%d pwrgroup_ht20[%d] = 0x%x\n",
18248c2ecf20Sopenharmony_ci				rf_path, i,
18258c2ecf20Sopenharmony_ci				rtlefuse->pwrgroup_ht20[rf_path][i]);
18268c2ecf20Sopenharmony_ci			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18278c2ecf20Sopenharmony_ci				"RF-%d pwrgroup_ht40[%d] = 0x%x\n",
18288c2ecf20Sopenharmony_ci				rf_path, i,
18298c2ecf20Sopenharmony_ci				rtlefuse->pwrgroup_ht40[rf_path][i]);
18308c2ecf20Sopenharmony_ci			}
18318c2ecf20Sopenharmony_ci	}
18328c2ecf20Sopenharmony_ci
18338c2ecf20Sopenharmony_ci	for (i = 0; i < 14; i++) {
18348c2ecf20Sopenharmony_ci		/* Read tx power difference between HT OFDM 20/40 MHZ */
18358c2ecf20Sopenharmony_ci		/* channel 1-3 */
18368c2ecf20Sopenharmony_ci		if (i < 3)
18378c2ecf20Sopenharmony_ci			index = 0;
18388c2ecf20Sopenharmony_ci		/* Channel 4-8 */
18398c2ecf20Sopenharmony_ci		else if (i < 8)
18408c2ecf20Sopenharmony_ci			index = 1;
18418c2ecf20Sopenharmony_ci		/* Channel 9-14 */
18428c2ecf20Sopenharmony_ci		else
18438c2ecf20Sopenharmony_ci			index = 2;
18448c2ecf20Sopenharmony_ci
18458c2ecf20Sopenharmony_ci		tempval = hwinfo[EEPROM_TX_PWR_HT20_DIFF + index] & 0xff;
18468c2ecf20Sopenharmony_ci		rtlefuse->txpwr_ht20diff[RF90_PATH_A][i] = (tempval & 0xF);
18478c2ecf20Sopenharmony_ci		rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] =
18488c2ecf20Sopenharmony_ci						 ((tempval >> 4) & 0xF);
18498c2ecf20Sopenharmony_ci
18508c2ecf20Sopenharmony_ci		/* Read OFDM<->HT tx power diff */
18518c2ecf20Sopenharmony_ci		/* Channel 1-3 */
18528c2ecf20Sopenharmony_ci		if (i < 3)
18538c2ecf20Sopenharmony_ci			index = 0;
18548c2ecf20Sopenharmony_ci		/* Channel 4-8 */
18558c2ecf20Sopenharmony_ci		else if (i < 8)
18568c2ecf20Sopenharmony_ci			index = 0x11;
18578c2ecf20Sopenharmony_ci		/* Channel 9-14 */
18588c2ecf20Sopenharmony_ci		else
18598c2ecf20Sopenharmony_ci			index = 1;
18608c2ecf20Sopenharmony_ci
18618c2ecf20Sopenharmony_ci		tempval = hwinfo[EEPROM_TX_PWR_OFDM_DIFF + index] & 0xff;
18628c2ecf20Sopenharmony_ci		rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i] =
18638c2ecf20Sopenharmony_ci				 (tempval & 0xF);
18648c2ecf20Sopenharmony_ci		rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i] =
18658c2ecf20Sopenharmony_ci				 ((tempval >> 4) & 0xF);
18668c2ecf20Sopenharmony_ci
18678c2ecf20Sopenharmony_ci		tempval = hwinfo[TX_PWR_SAFETY_CHK];
18688c2ecf20Sopenharmony_ci		rtlefuse->txpwr_safetyflag = (tempval & 0x01);
18698c2ecf20Sopenharmony_ci	}
18708c2ecf20Sopenharmony_ci
18718c2ecf20Sopenharmony_ci	rtlefuse->eeprom_regulatory = 0;
18728c2ecf20Sopenharmony_ci	if (rtlefuse->eeprom_version >= 2) {
18738c2ecf20Sopenharmony_ci		/* BIT(0)~2 */
18748c2ecf20Sopenharmony_ci		if (rtlefuse->eeprom_version >= 4)
18758c2ecf20Sopenharmony_ci			rtlefuse->eeprom_regulatory =
18768c2ecf20Sopenharmony_ci				 (hwinfo[EEPROM_REGULATORY] & 0x7);
18778c2ecf20Sopenharmony_ci		else /* BIT(0) */
18788c2ecf20Sopenharmony_ci			rtlefuse->eeprom_regulatory =
18798c2ecf20Sopenharmony_ci				 (hwinfo[EEPROM_REGULATORY] & 0x1);
18808c2ecf20Sopenharmony_ci	}
18818c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18828c2ecf20Sopenharmony_ci		"eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
18838c2ecf20Sopenharmony_ci
18848c2ecf20Sopenharmony_ci	for (i = 0; i < 14; i++)
18858c2ecf20Sopenharmony_ci		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18868c2ecf20Sopenharmony_ci			"RF-A Ht20 to HT40 Diff[%d] = 0x%x\n",
18878c2ecf20Sopenharmony_ci			i, rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);
18888c2ecf20Sopenharmony_ci	for (i = 0; i < 14; i++)
18898c2ecf20Sopenharmony_ci		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18908c2ecf20Sopenharmony_ci			"RF-A Legacy to Ht40 Diff[%d] = 0x%x\n",
18918c2ecf20Sopenharmony_ci			i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);
18928c2ecf20Sopenharmony_ci	for (i = 0; i < 14; i++)
18938c2ecf20Sopenharmony_ci		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18948c2ecf20Sopenharmony_ci			"RF-B Ht20 to HT40 Diff[%d] = 0x%x\n",
18958c2ecf20Sopenharmony_ci			i, rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);
18968c2ecf20Sopenharmony_ci	for (i = 0; i < 14; i++)
18978c2ecf20Sopenharmony_ci		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
18988c2ecf20Sopenharmony_ci			"RF-B Legacy to HT40 Diff[%d] = 0x%x\n",
18998c2ecf20Sopenharmony_ci			i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
19008c2ecf20Sopenharmony_ci
19018c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
19028c2ecf20Sopenharmony_ci		"TxPwrSafetyFlag = %d\n", rtlefuse->txpwr_safetyflag);
19038c2ecf20Sopenharmony_ci
19048c2ecf20Sopenharmony_ci	/* Read RF-indication and Tx Power gain
19058c2ecf20Sopenharmony_ci	 * index diff of legacy to HT OFDM rate. */
19068c2ecf20Sopenharmony_ci	tempval = hwinfo[EEPROM_RFIND_POWERDIFF] & 0xff;
19078c2ecf20Sopenharmony_ci	rtlefuse->eeprom_txpowerdiff = tempval;
19088c2ecf20Sopenharmony_ci	rtlefuse->legacy_ht_txpowerdiff =
19098c2ecf20Sopenharmony_ci		rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][0];
19108c2ecf20Sopenharmony_ci
19118c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
19128c2ecf20Sopenharmony_ci		"TxPowerDiff = %#x\n", rtlefuse->eeprom_txpowerdiff);
19138c2ecf20Sopenharmony_ci
19148c2ecf20Sopenharmony_ci	/* Get TSSI value for each path. */
19158c2ecf20Sopenharmony_ci	usvalue = *(u16 *)&hwinfo[EEPROM_TSSI_A];
19168c2ecf20Sopenharmony_ci	rtlefuse->eeprom_tssi[RF90_PATH_A] = (u8)((usvalue & 0xff00) >> 8);
19178c2ecf20Sopenharmony_ci	usvalue = hwinfo[EEPROM_TSSI_B];
19188c2ecf20Sopenharmony_ci	rtlefuse->eeprom_tssi[RF90_PATH_B] = (u8)(usvalue & 0xff);
19198c2ecf20Sopenharmony_ci
19208c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, "TSSI_A = 0x%x, TSSI_B = 0x%x\n",
19218c2ecf20Sopenharmony_ci		rtlefuse->eeprom_tssi[RF90_PATH_A],
19228c2ecf20Sopenharmony_ci		rtlefuse->eeprom_tssi[RF90_PATH_B]);
19238c2ecf20Sopenharmony_ci
19248c2ecf20Sopenharmony_ci	/* Read antenna tx power offset of B/C/D to A  from EEPROM */
19258c2ecf20Sopenharmony_ci	/* and read ThermalMeter from EEPROM */
19268c2ecf20Sopenharmony_ci	tempval = hwinfo[EEPROM_THERMALMETER];
19278c2ecf20Sopenharmony_ci	rtlefuse->eeprom_thermalmeter = tempval;
19288c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
19298c2ecf20Sopenharmony_ci		"thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
19308c2ecf20Sopenharmony_ci
19318c2ecf20Sopenharmony_ci	/* ThermalMeter, BIT(0)~3 for RFIC1, BIT(4)~7 for RFIC2 */
19328c2ecf20Sopenharmony_ci	rtlefuse->thermalmeter[0] = (rtlefuse->eeprom_thermalmeter & 0x1f);
19338c2ecf20Sopenharmony_ci	rtlefuse->tssi_13dbm = rtlefuse->eeprom_thermalmeter * 100;
19348c2ecf20Sopenharmony_ci
19358c2ecf20Sopenharmony_ci	/* Read CrystalCap from EEPROM */
19368c2ecf20Sopenharmony_ci	tempval = hwinfo[EEPROM_CRYSTALCAP] >> 4;
19378c2ecf20Sopenharmony_ci	rtlefuse->eeprom_crystalcap = tempval;
19388c2ecf20Sopenharmony_ci	/* CrystalCap, BIT(12)~15 */
19398c2ecf20Sopenharmony_ci	rtlefuse->crystalcap = rtlefuse->eeprom_crystalcap;
19408c2ecf20Sopenharmony_ci
19418c2ecf20Sopenharmony_ci	/* Read IC Version && Channel Plan */
19428c2ecf20Sopenharmony_ci	/* Version ID, Channel plan */
19438c2ecf20Sopenharmony_ci	rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];
19448c2ecf20Sopenharmony_ci	rtlefuse->txpwr_fromeprom = true;
19458c2ecf20Sopenharmony_ci	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
19468c2ecf20Sopenharmony_ci		"EEPROM ChannelPlan = 0x%4x\n", rtlefuse->eeprom_channelplan);
19478c2ecf20Sopenharmony_ci
19488c2ecf20Sopenharmony_ci	/* Read Customer ID or Board Type!!! */
19498c2ecf20Sopenharmony_ci	tempval = hwinfo[EEPROM_BOARDTYPE];
19508c2ecf20Sopenharmony_ci	/* Change RF type definition */
19518c2ecf20Sopenharmony_ci	if (tempval == 0)
19528c2ecf20Sopenharmony_ci		rtlphy->rf_type = RF_2T2R;
19538c2ecf20Sopenharmony_ci	else if (tempval == 1)
19548c2ecf20Sopenharmony_ci		rtlphy->rf_type = RF_1T2R;
19558c2ecf20Sopenharmony_ci	else if (tempval == 2)
19568c2ecf20Sopenharmony_ci		rtlphy->rf_type = RF_1T2R;
19578c2ecf20Sopenharmony_ci	else if (tempval == 3)
19588c2ecf20Sopenharmony_ci		rtlphy->rf_type = RF_1T1R;
19598c2ecf20Sopenharmony_ci
19608c2ecf20Sopenharmony_ci	/* 1T2R but 1SS (1x1 receive combining) */
19618c2ecf20Sopenharmony_ci	rtlefuse->b1x1_recvcombine = false;
19628c2ecf20Sopenharmony_ci	if (rtlphy->rf_type == RF_1T2R) {
19638c2ecf20Sopenharmony_ci		tempval = rtl_read_byte(rtlpriv, 0x07);
19648c2ecf20Sopenharmony_ci		if (!(tempval & BIT(0))) {
19658c2ecf20Sopenharmony_ci			rtlefuse->b1x1_recvcombine = true;
19668c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
19678c2ecf20Sopenharmony_ci				"RF_TYPE=1T2R but only 1SS\n");
19688c2ecf20Sopenharmony_ci		}
19698c2ecf20Sopenharmony_ci	}
19708c2ecf20Sopenharmony_ci	rtlefuse->b1ss_support = rtlefuse->b1x1_recvcombine;
19718c2ecf20Sopenharmony_ci	rtlefuse->eeprom_oemid = *&hwinfo[EEPROM_CUSTOMID];
19728c2ecf20Sopenharmony_ci
19738c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROM Customer ID: 0x%2x\n",
19748c2ecf20Sopenharmony_ci		rtlefuse->eeprom_oemid);
19758c2ecf20Sopenharmony_ci
19768c2ecf20Sopenharmony_ci	/* set channel paln to world wide 13 */
19778c2ecf20Sopenharmony_ci	rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
19788c2ecf20Sopenharmony_ci}
19798c2ecf20Sopenharmony_ci
19808c2ecf20Sopenharmony_civoid rtl92se_read_eeprom_info(struct ieee80211_hw *hw)
19818c2ecf20Sopenharmony_ci{
19828c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
19838c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
19848c2ecf20Sopenharmony_ci	u8 tmp_u1b = 0;
19858c2ecf20Sopenharmony_ci
19868c2ecf20Sopenharmony_ci	tmp_u1b = rtl_read_byte(rtlpriv, EPROM_CMD);
19878c2ecf20Sopenharmony_ci
19888c2ecf20Sopenharmony_ci	if (tmp_u1b & BIT(4)) {
19898c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
19908c2ecf20Sopenharmony_ci		rtlefuse->epromtype = EEPROM_93C46;
19918c2ecf20Sopenharmony_ci	} else {
19928c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
19938c2ecf20Sopenharmony_ci		rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
19948c2ecf20Sopenharmony_ci	}
19958c2ecf20Sopenharmony_ci
19968c2ecf20Sopenharmony_ci	if (tmp_u1b & BIT(5)) {
19978c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
19988c2ecf20Sopenharmony_ci		rtlefuse->autoload_failflag = false;
19998c2ecf20Sopenharmony_ci		_rtl92se_read_adapter_info(hw);
20008c2ecf20Sopenharmony_ci	} else {
20018c2ecf20Sopenharmony_ci		pr_err("Autoload ERR!!\n");
20028c2ecf20Sopenharmony_ci		rtlefuse->autoload_failflag = true;
20038c2ecf20Sopenharmony_ci	}
20048c2ecf20Sopenharmony_ci}
20058c2ecf20Sopenharmony_ci
20068c2ecf20Sopenharmony_cistatic void rtl92se_update_hal_rate_table(struct ieee80211_hw *hw,
20078c2ecf20Sopenharmony_ci					  struct ieee80211_sta *sta)
20088c2ecf20Sopenharmony_ci{
20098c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
20108c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
20118c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
20128c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
20138c2ecf20Sopenharmony_ci	u32 ratr_value;
20148c2ecf20Sopenharmony_ci	u8 ratr_index = 0;
20158c2ecf20Sopenharmony_ci	u8 nmode = mac->ht_enable;
20168c2ecf20Sopenharmony_ci	u8 mimo_ps = IEEE80211_SMPS_OFF;
20178c2ecf20Sopenharmony_ci	u16 shortgi_rate = 0;
20188c2ecf20Sopenharmony_ci	u32 tmp_ratr_value = 0;
20198c2ecf20Sopenharmony_ci	u8 curtxbw_40mhz = mac->bw_40;
20208c2ecf20Sopenharmony_ci	u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
20218c2ecf20Sopenharmony_ci				1 : 0;
20228c2ecf20Sopenharmony_ci	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
20238c2ecf20Sopenharmony_ci				1 : 0;
20248c2ecf20Sopenharmony_ci	enum wireless_mode wirelessmode = mac->mode;
20258c2ecf20Sopenharmony_ci
20268c2ecf20Sopenharmony_ci	if (rtlhal->current_bandtype == BAND_ON_5G)
20278c2ecf20Sopenharmony_ci		ratr_value = sta->supp_rates[1] << 4;
20288c2ecf20Sopenharmony_ci	else
20298c2ecf20Sopenharmony_ci		ratr_value = sta->supp_rates[0];
20308c2ecf20Sopenharmony_ci	if (mac->opmode == NL80211_IFTYPE_ADHOC)
20318c2ecf20Sopenharmony_ci		ratr_value = 0xfff;
20328c2ecf20Sopenharmony_ci	ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
20338c2ecf20Sopenharmony_ci			sta->ht_cap.mcs.rx_mask[0] << 12);
20348c2ecf20Sopenharmony_ci	switch (wirelessmode) {
20358c2ecf20Sopenharmony_ci	case WIRELESS_MODE_B:
20368c2ecf20Sopenharmony_ci		ratr_value &= 0x0000000D;
20378c2ecf20Sopenharmony_ci		break;
20388c2ecf20Sopenharmony_ci	case WIRELESS_MODE_G:
20398c2ecf20Sopenharmony_ci		ratr_value &= 0x00000FF5;
20408c2ecf20Sopenharmony_ci		break;
20418c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_24G:
20428c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_5G:
20438c2ecf20Sopenharmony_ci		nmode = 1;
20448c2ecf20Sopenharmony_ci		if (mimo_ps == IEEE80211_SMPS_STATIC) {
20458c2ecf20Sopenharmony_ci			ratr_value &= 0x0007F005;
20468c2ecf20Sopenharmony_ci		} else {
20478c2ecf20Sopenharmony_ci			u32 ratr_mask;
20488c2ecf20Sopenharmony_ci
20498c2ecf20Sopenharmony_ci			if (get_rf_type(rtlphy) == RF_1T2R ||
20508c2ecf20Sopenharmony_ci			    get_rf_type(rtlphy) == RF_1T1R) {
20518c2ecf20Sopenharmony_ci				if (curtxbw_40mhz)
20528c2ecf20Sopenharmony_ci					ratr_mask = 0x000ff015;
20538c2ecf20Sopenharmony_ci				else
20548c2ecf20Sopenharmony_ci					ratr_mask = 0x000ff005;
20558c2ecf20Sopenharmony_ci			} else {
20568c2ecf20Sopenharmony_ci				if (curtxbw_40mhz)
20578c2ecf20Sopenharmony_ci					ratr_mask = 0x0f0ff015;
20588c2ecf20Sopenharmony_ci				else
20598c2ecf20Sopenharmony_ci					ratr_mask = 0x0f0ff005;
20608c2ecf20Sopenharmony_ci			}
20618c2ecf20Sopenharmony_ci
20628c2ecf20Sopenharmony_ci			ratr_value &= ratr_mask;
20638c2ecf20Sopenharmony_ci		}
20648c2ecf20Sopenharmony_ci		break;
20658c2ecf20Sopenharmony_ci	default:
20668c2ecf20Sopenharmony_ci		if (rtlphy->rf_type == RF_1T2R)
20678c2ecf20Sopenharmony_ci			ratr_value &= 0x000ff0ff;
20688c2ecf20Sopenharmony_ci		else
20698c2ecf20Sopenharmony_ci			ratr_value &= 0x0f0ff0ff;
20708c2ecf20Sopenharmony_ci
20718c2ecf20Sopenharmony_ci		break;
20728c2ecf20Sopenharmony_ci	}
20738c2ecf20Sopenharmony_ci
20748c2ecf20Sopenharmony_ci	if (rtlpriv->rtlhal.version >= VERSION_8192S_BCUT)
20758c2ecf20Sopenharmony_ci		ratr_value &= 0x0FFFFFFF;
20768c2ecf20Sopenharmony_ci	else if (rtlpriv->rtlhal.version == VERSION_8192S_ACUT)
20778c2ecf20Sopenharmony_ci		ratr_value &= 0x0FFFFFF0;
20788c2ecf20Sopenharmony_ci
20798c2ecf20Sopenharmony_ci	if (nmode && ((curtxbw_40mhz &&
20808c2ecf20Sopenharmony_ci			 curshortgi_40mhz) || (!curtxbw_40mhz &&
20818c2ecf20Sopenharmony_ci						 curshortgi_20mhz))) {
20828c2ecf20Sopenharmony_ci
20838c2ecf20Sopenharmony_ci		ratr_value |= 0x10000000;
20848c2ecf20Sopenharmony_ci		tmp_ratr_value = (ratr_value >> 12);
20858c2ecf20Sopenharmony_ci
20868c2ecf20Sopenharmony_ci		for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
20878c2ecf20Sopenharmony_ci			if ((1 << shortgi_rate) & tmp_ratr_value)
20888c2ecf20Sopenharmony_ci				break;
20898c2ecf20Sopenharmony_ci		}
20908c2ecf20Sopenharmony_ci
20918c2ecf20Sopenharmony_ci		shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
20928c2ecf20Sopenharmony_ci		    (shortgi_rate << 4) | (shortgi_rate);
20938c2ecf20Sopenharmony_ci
20948c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, SG_RATE, shortgi_rate);
20958c2ecf20Sopenharmony_ci	}
20968c2ecf20Sopenharmony_ci
20978c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, ARFR0 + ratr_index * 4, ratr_value);
20988c2ecf20Sopenharmony_ci	if (ratr_value & 0xfffff000)
20998c2ecf20Sopenharmony_ci		rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_REFRESH_N);
21008c2ecf20Sopenharmony_ci	else
21018c2ecf20Sopenharmony_ci		rtl92s_phy_set_fw_cmd(hw, FW_CMD_RA_REFRESH_BG);
21028c2ecf20Sopenharmony_ci
21038c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n",
21048c2ecf20Sopenharmony_ci		rtl_read_dword(rtlpriv, ARFR0));
21058c2ecf20Sopenharmony_ci}
21068c2ecf20Sopenharmony_ci
21078c2ecf20Sopenharmony_cistatic void rtl92se_update_hal_rate_mask(struct ieee80211_hw *hw,
21088c2ecf20Sopenharmony_ci					 struct ieee80211_sta *sta,
21098c2ecf20Sopenharmony_ci					 u8 rssi_level, bool update_bw)
21108c2ecf20Sopenharmony_ci{
21118c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
21128c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &(rtlpriv->phy);
21138c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
21148c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
21158c2ecf20Sopenharmony_ci	struct rtl_sta_info *sta_entry = NULL;
21168c2ecf20Sopenharmony_ci	u32 ratr_bitmap;
21178c2ecf20Sopenharmony_ci	u8 ratr_index = 0;
21188c2ecf20Sopenharmony_ci	u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
21198c2ecf20Sopenharmony_ci	u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
21208c2ecf20Sopenharmony_ci				1 : 0;
21218c2ecf20Sopenharmony_ci	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
21228c2ecf20Sopenharmony_ci				1 : 0;
21238c2ecf20Sopenharmony_ci	enum wireless_mode wirelessmode = 0;
21248c2ecf20Sopenharmony_ci	bool shortgi = false;
21258c2ecf20Sopenharmony_ci	u32 ratr_value = 0;
21268c2ecf20Sopenharmony_ci	u8 shortgi_rate = 0;
21278c2ecf20Sopenharmony_ci	u32 mask = 0;
21288c2ecf20Sopenharmony_ci	u32 band = 0;
21298c2ecf20Sopenharmony_ci	bool bmulticast = false;
21308c2ecf20Sopenharmony_ci	u8 macid = 0;
21318c2ecf20Sopenharmony_ci	u8 mimo_ps = IEEE80211_SMPS_OFF;
21328c2ecf20Sopenharmony_ci
21338c2ecf20Sopenharmony_ci	sta_entry = (struct rtl_sta_info *) sta->drv_priv;
21348c2ecf20Sopenharmony_ci	wirelessmode = sta_entry->wireless_mode;
21358c2ecf20Sopenharmony_ci	if (mac->opmode == NL80211_IFTYPE_STATION)
21368c2ecf20Sopenharmony_ci		curtxbw_40mhz = mac->bw_40;
21378c2ecf20Sopenharmony_ci	else if (mac->opmode == NL80211_IFTYPE_AP ||
21388c2ecf20Sopenharmony_ci		mac->opmode == NL80211_IFTYPE_ADHOC)
21398c2ecf20Sopenharmony_ci		macid = sta->aid + 1;
21408c2ecf20Sopenharmony_ci
21418c2ecf20Sopenharmony_ci	if (rtlhal->current_bandtype == BAND_ON_5G)
21428c2ecf20Sopenharmony_ci		ratr_bitmap = sta->supp_rates[1] << 4;
21438c2ecf20Sopenharmony_ci	else
21448c2ecf20Sopenharmony_ci		ratr_bitmap = sta->supp_rates[0];
21458c2ecf20Sopenharmony_ci	if (mac->opmode == NL80211_IFTYPE_ADHOC)
21468c2ecf20Sopenharmony_ci		ratr_bitmap = 0xfff;
21478c2ecf20Sopenharmony_ci	ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
21488c2ecf20Sopenharmony_ci			sta->ht_cap.mcs.rx_mask[0] << 12);
21498c2ecf20Sopenharmony_ci	switch (wirelessmode) {
21508c2ecf20Sopenharmony_ci	case WIRELESS_MODE_B:
21518c2ecf20Sopenharmony_ci		band |= WIRELESS_11B;
21528c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_B;
21538c2ecf20Sopenharmony_ci		if (ratr_bitmap & 0x0000000c)
21548c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x0000000d;
21558c2ecf20Sopenharmony_ci		else
21568c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x0000000f;
21578c2ecf20Sopenharmony_ci		break;
21588c2ecf20Sopenharmony_ci	case WIRELESS_MODE_G:
21598c2ecf20Sopenharmony_ci		band |= (WIRELESS_11G | WIRELESS_11B);
21608c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_GB;
21618c2ecf20Sopenharmony_ci
21628c2ecf20Sopenharmony_ci		if (rssi_level == 1)
21638c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x00000f00;
21648c2ecf20Sopenharmony_ci		else if (rssi_level == 2)
21658c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x00000ff0;
21668c2ecf20Sopenharmony_ci		else
21678c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x00000ff5;
21688c2ecf20Sopenharmony_ci		break;
21698c2ecf20Sopenharmony_ci	case WIRELESS_MODE_A:
21708c2ecf20Sopenharmony_ci		band |= WIRELESS_11A;
21718c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_A;
21728c2ecf20Sopenharmony_ci		ratr_bitmap &= 0x00000ff0;
21738c2ecf20Sopenharmony_ci		break;
21748c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_24G:
21758c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_5G:
21768c2ecf20Sopenharmony_ci		band |= (WIRELESS_11N | WIRELESS_11G | WIRELESS_11B);
21778c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_NGB;
21788c2ecf20Sopenharmony_ci
21798c2ecf20Sopenharmony_ci		if (mimo_ps == IEEE80211_SMPS_STATIC) {
21808c2ecf20Sopenharmony_ci			if (rssi_level == 1)
21818c2ecf20Sopenharmony_ci				ratr_bitmap &= 0x00070000;
21828c2ecf20Sopenharmony_ci			else if (rssi_level == 2)
21838c2ecf20Sopenharmony_ci				ratr_bitmap &= 0x0007f000;
21848c2ecf20Sopenharmony_ci			else
21858c2ecf20Sopenharmony_ci				ratr_bitmap &= 0x0007f005;
21868c2ecf20Sopenharmony_ci		} else {
21878c2ecf20Sopenharmony_ci			if (rtlphy->rf_type == RF_1T2R ||
21888c2ecf20Sopenharmony_ci				rtlphy->rf_type == RF_1T1R) {
21898c2ecf20Sopenharmony_ci				if (rssi_level == 1) {
21908c2ecf20Sopenharmony_ci						ratr_bitmap &= 0x000f0000;
21918c2ecf20Sopenharmony_ci				} else if (rssi_level == 3) {
21928c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x000fc000;
21938c2ecf20Sopenharmony_ci				} else if (rssi_level == 5) {
21948c2ecf20Sopenharmony_ci						ratr_bitmap &= 0x000ff000;
21958c2ecf20Sopenharmony_ci				} else {
21968c2ecf20Sopenharmony_ci					if (curtxbw_40mhz)
21978c2ecf20Sopenharmony_ci						ratr_bitmap &= 0x000ff015;
21988c2ecf20Sopenharmony_ci					else
21998c2ecf20Sopenharmony_ci						ratr_bitmap &= 0x000ff005;
22008c2ecf20Sopenharmony_ci				}
22018c2ecf20Sopenharmony_ci			} else {
22028c2ecf20Sopenharmony_ci				if (rssi_level == 1) {
22038c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8f0000;
22048c2ecf20Sopenharmony_ci				} else if (rssi_level == 3) {
22058c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8fc000;
22068c2ecf20Sopenharmony_ci				} else if (rssi_level == 5) {
22078c2ecf20Sopenharmony_ci					ratr_bitmap &= 0x0f8ff000;
22088c2ecf20Sopenharmony_ci				} else {
22098c2ecf20Sopenharmony_ci					if (curtxbw_40mhz)
22108c2ecf20Sopenharmony_ci						ratr_bitmap &= 0x0f8ff015;
22118c2ecf20Sopenharmony_ci					else
22128c2ecf20Sopenharmony_ci						ratr_bitmap &= 0x0f8ff005;
22138c2ecf20Sopenharmony_ci				}
22148c2ecf20Sopenharmony_ci			}
22158c2ecf20Sopenharmony_ci		}
22168c2ecf20Sopenharmony_ci
22178c2ecf20Sopenharmony_ci		if ((curtxbw_40mhz && curshortgi_40mhz) ||
22188c2ecf20Sopenharmony_ci		    (!curtxbw_40mhz && curshortgi_20mhz)) {
22198c2ecf20Sopenharmony_ci			if (macid == 0)
22208c2ecf20Sopenharmony_ci				shortgi = true;
22218c2ecf20Sopenharmony_ci			else if (macid == 1)
22228c2ecf20Sopenharmony_ci				shortgi = false;
22238c2ecf20Sopenharmony_ci		}
22248c2ecf20Sopenharmony_ci		break;
22258c2ecf20Sopenharmony_ci	default:
22268c2ecf20Sopenharmony_ci		band |= (WIRELESS_11N | WIRELESS_11G | WIRELESS_11B);
22278c2ecf20Sopenharmony_ci		ratr_index = RATR_INX_WIRELESS_NGB;
22288c2ecf20Sopenharmony_ci
22298c2ecf20Sopenharmony_ci		if (rtlphy->rf_type == RF_1T2R)
22308c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x000ff0ff;
22318c2ecf20Sopenharmony_ci		else
22328c2ecf20Sopenharmony_ci			ratr_bitmap &= 0x0f8ff0ff;
22338c2ecf20Sopenharmony_ci		break;
22348c2ecf20Sopenharmony_ci	}
22358c2ecf20Sopenharmony_ci	sta_entry->ratr_index = ratr_index;
22368c2ecf20Sopenharmony_ci
22378c2ecf20Sopenharmony_ci	if (rtlpriv->rtlhal.version >= VERSION_8192S_BCUT)
22388c2ecf20Sopenharmony_ci		ratr_bitmap &= 0x0FFFFFFF;
22398c2ecf20Sopenharmony_ci	else if (rtlpriv->rtlhal.version == VERSION_8192S_ACUT)
22408c2ecf20Sopenharmony_ci		ratr_bitmap &= 0x0FFFFFF0;
22418c2ecf20Sopenharmony_ci
22428c2ecf20Sopenharmony_ci	if (shortgi) {
22438c2ecf20Sopenharmony_ci		ratr_bitmap |= 0x10000000;
22448c2ecf20Sopenharmony_ci		/* Get MAX MCS available. */
22458c2ecf20Sopenharmony_ci		ratr_value = (ratr_bitmap >> 12);
22468c2ecf20Sopenharmony_ci		for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
22478c2ecf20Sopenharmony_ci			if ((1 << shortgi_rate) & ratr_value)
22488c2ecf20Sopenharmony_ci				break;
22498c2ecf20Sopenharmony_ci		}
22508c2ecf20Sopenharmony_ci
22518c2ecf20Sopenharmony_ci		shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
22528c2ecf20Sopenharmony_ci			(shortgi_rate << 4) | (shortgi_rate);
22538c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, SG_RATE, shortgi_rate);
22548c2ecf20Sopenharmony_ci	}
22558c2ecf20Sopenharmony_ci
22568c2ecf20Sopenharmony_ci	mask |= (bmulticast ? 1 : 0) << 9 | (macid & 0x1f) << 4 | (band & 0xf);
22578c2ecf20Sopenharmony_ci
22588c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RATR, DBG_TRACE, "mask = %x, bitmap = %x\n",
22598c2ecf20Sopenharmony_ci		mask, ratr_bitmap);
22608c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0x2c4, ratr_bitmap);
22618c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, WFM5, (FW_RA_UPDATE_MASK | (mask << 8)));
22628c2ecf20Sopenharmony_ci
22638c2ecf20Sopenharmony_ci	if (macid != 0)
22648c2ecf20Sopenharmony_ci		sta_entry->ratr_index = ratr_index;
22658c2ecf20Sopenharmony_ci}
22668c2ecf20Sopenharmony_ci
22678c2ecf20Sopenharmony_civoid rtl92se_update_hal_rate_tbl(struct ieee80211_hw *hw,
22688c2ecf20Sopenharmony_ci		struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
22698c2ecf20Sopenharmony_ci{
22708c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
22718c2ecf20Sopenharmony_ci
22728c2ecf20Sopenharmony_ci	if (rtlpriv->dm.useramask)
22738c2ecf20Sopenharmony_ci		rtl92se_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
22748c2ecf20Sopenharmony_ci	else
22758c2ecf20Sopenharmony_ci		rtl92se_update_hal_rate_table(hw, sta);
22768c2ecf20Sopenharmony_ci}
22778c2ecf20Sopenharmony_ci
22788c2ecf20Sopenharmony_civoid rtl92se_update_channel_access_setting(struct ieee80211_hw *hw)
22798c2ecf20Sopenharmony_ci{
22808c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
22818c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
22828c2ecf20Sopenharmony_ci	u16 sifs_timer;
22838c2ecf20Sopenharmony_ci
22848c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
22858c2ecf20Sopenharmony_ci				      &mac->slot_time);
22868c2ecf20Sopenharmony_ci	sifs_timer = 0x0e0e;
22878c2ecf20Sopenharmony_ci	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
22888c2ecf20Sopenharmony_ci
22898c2ecf20Sopenharmony_ci}
22908c2ecf20Sopenharmony_ci
22918c2ecf20Sopenharmony_ci/* this ifunction is for RFKILL, it's different with windows,
22928c2ecf20Sopenharmony_ci * because UI will disable wireless when GPIO Radio Off.
22938c2ecf20Sopenharmony_ci * And here we not check or Disable/Enable ASPM like windows*/
22948c2ecf20Sopenharmony_cibool rtl92se_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
22958c2ecf20Sopenharmony_ci{
22968c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
22978c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
22988c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
22998c2ecf20Sopenharmony_ci	enum rf_pwrstate rfpwr_toset /*, cur_rfstate */;
23008c2ecf20Sopenharmony_ci	unsigned long flag = 0;
23018c2ecf20Sopenharmony_ci	bool actuallyset = false;
23028c2ecf20Sopenharmony_ci	bool turnonbypowerdomain = false;
23038c2ecf20Sopenharmony_ci
23048c2ecf20Sopenharmony_ci	/* just 8191se can check gpio before firstup, 92c/92d have fixed it */
23058c2ecf20Sopenharmony_ci	if ((rtlpci->up_first_time == 1) || (rtlpci->being_init_adapter))
23068c2ecf20Sopenharmony_ci		return false;
23078c2ecf20Sopenharmony_ci
23088c2ecf20Sopenharmony_ci	if (ppsc->swrf_processing)
23098c2ecf20Sopenharmony_ci		return false;
23108c2ecf20Sopenharmony_ci
23118c2ecf20Sopenharmony_ci	spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
23128c2ecf20Sopenharmony_ci	if (ppsc->rfchange_inprogress) {
23138c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
23148c2ecf20Sopenharmony_ci		return false;
23158c2ecf20Sopenharmony_ci	} else {
23168c2ecf20Sopenharmony_ci		ppsc->rfchange_inprogress = true;
23178c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
23188c2ecf20Sopenharmony_ci	}
23198c2ecf20Sopenharmony_ci
23208c2ecf20Sopenharmony_ci	/* cur_rfstate = ppsc->rfpwr_state;*/
23218c2ecf20Sopenharmony_ci
23228c2ecf20Sopenharmony_ci	/* because after _rtl92s_phy_set_rfhalt, all power
23238c2ecf20Sopenharmony_ci	 * closed, so we must open some power for GPIO check,
23248c2ecf20Sopenharmony_ci	 * or we will always check GPIO RFOFF here,
23258c2ecf20Sopenharmony_ci	 * And we should close power after GPIO check */
23268c2ecf20Sopenharmony_ci	if (RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
23278c2ecf20Sopenharmony_ci		_rtl92se_power_domain_init(hw);
23288c2ecf20Sopenharmony_ci		turnonbypowerdomain = true;
23298c2ecf20Sopenharmony_ci	}
23308c2ecf20Sopenharmony_ci
23318c2ecf20Sopenharmony_ci	rfpwr_toset = _rtl92se_rf_onoff_detect(hw);
23328c2ecf20Sopenharmony_ci
23338c2ecf20Sopenharmony_ci	if ((ppsc->hwradiooff) && (rfpwr_toset == ERFON)) {
23348c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
23358c2ecf20Sopenharmony_ci			"RFKILL-HW Radio ON, RF ON\n");
23368c2ecf20Sopenharmony_ci
23378c2ecf20Sopenharmony_ci		rfpwr_toset = ERFON;
23388c2ecf20Sopenharmony_ci		ppsc->hwradiooff = false;
23398c2ecf20Sopenharmony_ci		actuallyset = true;
23408c2ecf20Sopenharmony_ci	} else if ((!ppsc->hwradiooff) && (rfpwr_toset == ERFOFF)) {
23418c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_RF,
23428c2ecf20Sopenharmony_ci			DBG_DMESG, "RFKILL-HW Radio OFF, RF OFF\n");
23438c2ecf20Sopenharmony_ci
23448c2ecf20Sopenharmony_ci		rfpwr_toset = ERFOFF;
23458c2ecf20Sopenharmony_ci		ppsc->hwradiooff = true;
23468c2ecf20Sopenharmony_ci		actuallyset = true;
23478c2ecf20Sopenharmony_ci	}
23488c2ecf20Sopenharmony_ci
23498c2ecf20Sopenharmony_ci	if (actuallyset) {
23508c2ecf20Sopenharmony_ci		spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
23518c2ecf20Sopenharmony_ci		ppsc->rfchange_inprogress = false;
23528c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
23538c2ecf20Sopenharmony_ci
23548c2ecf20Sopenharmony_ci	/* this not include ifconfig wlan0 down case */
23558c2ecf20Sopenharmony_ci	/* } else if (rfpwr_toset == ERFOFF || cur_rfstate == ERFOFF) { */
23568c2ecf20Sopenharmony_ci	} else {
23578c2ecf20Sopenharmony_ci		/* because power_domain_init may be happen when
23588c2ecf20Sopenharmony_ci		 * _rtl92s_phy_set_rfhalt, this will open some powers
23598c2ecf20Sopenharmony_ci		 * and cause current increasing about 40 mA for ips,
23608c2ecf20Sopenharmony_ci		 * rfoff and ifconfig down, so we set
23618c2ecf20Sopenharmony_ci		 * _rtl92s_phy_set_rfhalt again here */
23628c2ecf20Sopenharmony_ci		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC &&
23638c2ecf20Sopenharmony_ci			turnonbypowerdomain) {
23648c2ecf20Sopenharmony_ci			_rtl92s_phy_set_rfhalt(hw);
23658c2ecf20Sopenharmony_ci			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
23668c2ecf20Sopenharmony_ci		}
23678c2ecf20Sopenharmony_ci
23688c2ecf20Sopenharmony_ci		spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
23698c2ecf20Sopenharmony_ci		ppsc->rfchange_inprogress = false;
23708c2ecf20Sopenharmony_ci		spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
23718c2ecf20Sopenharmony_ci	}
23728c2ecf20Sopenharmony_ci
23738c2ecf20Sopenharmony_ci	*valid = 1;
23748c2ecf20Sopenharmony_ci	return !ppsc->hwradiooff;
23758c2ecf20Sopenharmony_ci
23768c2ecf20Sopenharmony_ci}
23778c2ecf20Sopenharmony_ci
23788c2ecf20Sopenharmony_ci/* Is_wepkey just used for WEP used as group & pairwise key
23798c2ecf20Sopenharmony_ci * if pairwise is AES ang group is WEP Is_wepkey == false.*/
23808c2ecf20Sopenharmony_civoid rtl92se_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
23818c2ecf20Sopenharmony_ci	bool is_group, u8 enc_algo, bool is_wepkey, bool clear_all)
23828c2ecf20Sopenharmony_ci{
23838c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
23848c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
23858c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
23868c2ecf20Sopenharmony_ci	u8 *macaddr = p_macaddr;
23878c2ecf20Sopenharmony_ci
23888c2ecf20Sopenharmony_ci	u32 entry_id = 0;
23898c2ecf20Sopenharmony_ci	bool is_pairwise = false;
23908c2ecf20Sopenharmony_ci
23918c2ecf20Sopenharmony_ci	static u8 cam_const_addr[4][6] = {
23928c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
23938c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
23948c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
23958c2ecf20Sopenharmony_ci		{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
23968c2ecf20Sopenharmony_ci	};
23978c2ecf20Sopenharmony_ci	static u8 cam_const_broad[] = {
23988c2ecf20Sopenharmony_ci		0xff, 0xff, 0xff, 0xff, 0xff, 0xff
23998c2ecf20Sopenharmony_ci	};
24008c2ecf20Sopenharmony_ci
24018c2ecf20Sopenharmony_ci	if (clear_all) {
24028c2ecf20Sopenharmony_ci		u8 idx = 0;
24038c2ecf20Sopenharmony_ci		u8 cam_offset = 0;
24048c2ecf20Sopenharmony_ci		u8 clear_number = 5;
24058c2ecf20Sopenharmony_ci
24068c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
24078c2ecf20Sopenharmony_ci
24088c2ecf20Sopenharmony_ci		for (idx = 0; idx < clear_number; idx++) {
24098c2ecf20Sopenharmony_ci			rtl_cam_mark_invalid(hw, cam_offset + idx);
24108c2ecf20Sopenharmony_ci			rtl_cam_empty_entry(hw, cam_offset + idx);
24118c2ecf20Sopenharmony_ci
24128c2ecf20Sopenharmony_ci			if (idx < 5) {
24138c2ecf20Sopenharmony_ci				memset(rtlpriv->sec.key_buf[idx], 0,
24148c2ecf20Sopenharmony_ci				       MAX_KEY_LEN);
24158c2ecf20Sopenharmony_ci				rtlpriv->sec.key_len[idx] = 0;
24168c2ecf20Sopenharmony_ci			}
24178c2ecf20Sopenharmony_ci		}
24188c2ecf20Sopenharmony_ci
24198c2ecf20Sopenharmony_ci	} else {
24208c2ecf20Sopenharmony_ci		switch (enc_algo) {
24218c2ecf20Sopenharmony_ci		case WEP40_ENCRYPTION:
24228c2ecf20Sopenharmony_ci			enc_algo = CAM_WEP40;
24238c2ecf20Sopenharmony_ci			break;
24248c2ecf20Sopenharmony_ci		case WEP104_ENCRYPTION:
24258c2ecf20Sopenharmony_ci			enc_algo = CAM_WEP104;
24268c2ecf20Sopenharmony_ci			break;
24278c2ecf20Sopenharmony_ci		case TKIP_ENCRYPTION:
24288c2ecf20Sopenharmony_ci			enc_algo = CAM_TKIP;
24298c2ecf20Sopenharmony_ci			break;
24308c2ecf20Sopenharmony_ci		case AESCCMP_ENCRYPTION:
24318c2ecf20Sopenharmony_ci			enc_algo = CAM_AES;
24328c2ecf20Sopenharmony_ci			break;
24338c2ecf20Sopenharmony_ci		default:
24348c2ecf20Sopenharmony_ci			pr_err("switch case %#x not processed\n",
24358c2ecf20Sopenharmony_ci			       enc_algo);
24368c2ecf20Sopenharmony_ci			enc_algo = CAM_TKIP;
24378c2ecf20Sopenharmony_ci			break;
24388c2ecf20Sopenharmony_ci		}
24398c2ecf20Sopenharmony_ci
24408c2ecf20Sopenharmony_ci		if (is_wepkey || rtlpriv->sec.use_defaultkey) {
24418c2ecf20Sopenharmony_ci			macaddr = cam_const_addr[key_index];
24428c2ecf20Sopenharmony_ci			entry_id = key_index;
24438c2ecf20Sopenharmony_ci		} else {
24448c2ecf20Sopenharmony_ci			if (is_group) {
24458c2ecf20Sopenharmony_ci				macaddr = cam_const_broad;
24468c2ecf20Sopenharmony_ci				entry_id = key_index;
24478c2ecf20Sopenharmony_ci			} else {
24488c2ecf20Sopenharmony_ci				if (mac->opmode == NL80211_IFTYPE_AP) {
24498c2ecf20Sopenharmony_ci					entry_id = rtl_cam_get_free_entry(hw,
24508c2ecf20Sopenharmony_ci								 p_macaddr);
24518c2ecf20Sopenharmony_ci					if (entry_id >=  TOTAL_CAM_ENTRY) {
24528c2ecf20Sopenharmony_ci						pr_err("Can not find free hw security cam entry\n");
24538c2ecf20Sopenharmony_ci						return;
24548c2ecf20Sopenharmony_ci					}
24558c2ecf20Sopenharmony_ci				} else {
24568c2ecf20Sopenharmony_ci					entry_id = CAM_PAIRWISE_KEY_POSITION;
24578c2ecf20Sopenharmony_ci				}
24588c2ecf20Sopenharmony_ci
24598c2ecf20Sopenharmony_ci				key_index = PAIRWISE_KEYIDX;
24608c2ecf20Sopenharmony_ci				is_pairwise = true;
24618c2ecf20Sopenharmony_ci			}
24628c2ecf20Sopenharmony_ci		}
24638c2ecf20Sopenharmony_ci
24648c2ecf20Sopenharmony_ci		if (rtlpriv->sec.key_len[key_index] == 0) {
24658c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
24668c2ecf20Sopenharmony_ci				"delete one entry, entry_id is %d\n",
24678c2ecf20Sopenharmony_ci				entry_id);
24688c2ecf20Sopenharmony_ci			if (mac->opmode == NL80211_IFTYPE_AP)
24698c2ecf20Sopenharmony_ci				rtl_cam_del_entry(hw, p_macaddr);
24708c2ecf20Sopenharmony_ci			rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
24718c2ecf20Sopenharmony_ci		} else {
24728c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
24738c2ecf20Sopenharmony_ci				"add one entry\n");
24748c2ecf20Sopenharmony_ci			if (is_pairwise) {
24758c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
24768c2ecf20Sopenharmony_ci					"set Pairwise key\n");
24778c2ecf20Sopenharmony_ci
24788c2ecf20Sopenharmony_ci				rtl_cam_add_one_entry(hw, macaddr, key_index,
24798c2ecf20Sopenharmony_ci					entry_id, enc_algo,
24808c2ecf20Sopenharmony_ci					CAM_CONFIG_NO_USEDK,
24818c2ecf20Sopenharmony_ci					rtlpriv->sec.key_buf[key_index]);
24828c2ecf20Sopenharmony_ci			} else {
24838c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
24848c2ecf20Sopenharmony_ci					"set group key\n");
24858c2ecf20Sopenharmony_ci
24868c2ecf20Sopenharmony_ci				if (mac->opmode == NL80211_IFTYPE_ADHOC) {
24878c2ecf20Sopenharmony_ci					rtl_cam_add_one_entry(hw,
24888c2ecf20Sopenharmony_ci						rtlefuse->dev_addr,
24898c2ecf20Sopenharmony_ci						PAIRWISE_KEYIDX,
24908c2ecf20Sopenharmony_ci						CAM_PAIRWISE_KEY_POSITION,
24918c2ecf20Sopenharmony_ci						enc_algo, CAM_CONFIG_NO_USEDK,
24928c2ecf20Sopenharmony_ci						rtlpriv->sec.key_buf[entry_id]);
24938c2ecf20Sopenharmony_ci				}
24948c2ecf20Sopenharmony_ci
24958c2ecf20Sopenharmony_ci				rtl_cam_add_one_entry(hw, macaddr, key_index,
24968c2ecf20Sopenharmony_ci					      entry_id, enc_algo,
24978c2ecf20Sopenharmony_ci					      CAM_CONFIG_NO_USEDK,
24988c2ecf20Sopenharmony_ci					      rtlpriv->sec.key_buf[entry_id]);
24998c2ecf20Sopenharmony_ci			}
25008c2ecf20Sopenharmony_ci
25018c2ecf20Sopenharmony_ci		}
25028c2ecf20Sopenharmony_ci	}
25038c2ecf20Sopenharmony_ci}
25048c2ecf20Sopenharmony_ci
25058c2ecf20Sopenharmony_civoid rtl92se_suspend(struct ieee80211_hw *hw)
25068c2ecf20Sopenharmony_ci{
25078c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
25088c2ecf20Sopenharmony_ci
25098c2ecf20Sopenharmony_ci	rtlpci->up_first_time = true;
25108c2ecf20Sopenharmony_ci}
25118c2ecf20Sopenharmony_ci
25128c2ecf20Sopenharmony_civoid rtl92se_resume(struct ieee80211_hw *hw)
25138c2ecf20Sopenharmony_ci{
25148c2ecf20Sopenharmony_ci	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
25158c2ecf20Sopenharmony_ci	u32 val;
25168c2ecf20Sopenharmony_ci
25178c2ecf20Sopenharmony_ci	pci_read_config_dword(rtlpci->pdev, 0x40, &val);
25188c2ecf20Sopenharmony_ci	if ((val & 0x0000ff00) != 0)
25198c2ecf20Sopenharmony_ci		pci_write_config_dword(rtlpci->pdev, 0x40,
25208c2ecf20Sopenharmony_ci			val & 0xffff00ff);
25218c2ecf20Sopenharmony_ci}
2522