cachepc-linux

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

rtw8723d.c (85601B)


      1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
      2/* Copyright(c) 2018-2019  Realtek Corporation
      3 */
      4
      5#include <linux/module.h>
      6#include "main.h"
      7#include "coex.h"
      8#include "fw.h"
      9#include "tx.h"
     10#include "rx.h"
     11#include "phy.h"
     12#include "rtw8723d.h"
     13#include "rtw8723d_table.h"
     14#include "mac.h"
     15#include "reg.h"
     16#include "debug.h"
     17
     18static const struct rtw_hw_reg rtw8723d_txagc[] = {
     19	[DESC_RATE1M]	= { .addr = 0xe08, .mask = 0x0000ff00 },
     20	[DESC_RATE2M]	= { .addr = 0x86c, .mask = 0x0000ff00 },
     21	[DESC_RATE5_5M]	= { .addr = 0x86c, .mask = 0x00ff0000 },
     22	[DESC_RATE11M]	= { .addr = 0x86c, .mask = 0xff000000 },
     23	[DESC_RATE6M]	= { .addr = 0xe00, .mask = 0x000000ff },
     24	[DESC_RATE9M]	= { .addr = 0xe00, .mask = 0x0000ff00 },
     25	[DESC_RATE12M]	= { .addr = 0xe00, .mask = 0x00ff0000 },
     26	[DESC_RATE18M]	= { .addr = 0xe00, .mask = 0xff000000 },
     27	[DESC_RATE24M]	= { .addr = 0xe04, .mask = 0x000000ff },
     28	[DESC_RATE36M]	= { .addr = 0xe04, .mask = 0x0000ff00 },
     29	[DESC_RATE48M]	= { .addr = 0xe04, .mask = 0x00ff0000 },
     30	[DESC_RATE54M]	= { .addr = 0xe04, .mask = 0xff000000 },
     31	[DESC_RATEMCS0]	= { .addr = 0xe10, .mask = 0x000000ff },
     32	[DESC_RATEMCS1]	= { .addr = 0xe10, .mask = 0x0000ff00 },
     33	[DESC_RATEMCS2]	= { .addr = 0xe10, .mask = 0x00ff0000 },
     34	[DESC_RATEMCS3]	= { .addr = 0xe10, .mask = 0xff000000 },
     35	[DESC_RATEMCS4]	= { .addr = 0xe14, .mask = 0x000000ff },
     36	[DESC_RATEMCS5]	= { .addr = 0xe14, .mask = 0x0000ff00 },
     37	[DESC_RATEMCS6]	= { .addr = 0xe14, .mask = 0x00ff0000 },
     38	[DESC_RATEMCS7]	= { .addr = 0xe14, .mask = 0xff000000 },
     39};
     40
     41#define WLAN_TXQ_RPT_EN		0x1F
     42#define WLAN_SLOT_TIME		0x09
     43#define WLAN_RL_VAL		0x3030
     44#define WLAN_BAR_VAL		0x0201ffff
     45#define BIT_MASK_TBTT_HOLD	0x00000fff
     46#define BIT_SHIFT_TBTT_HOLD	8
     47#define BIT_MASK_TBTT_SETUP	0x000000ff
     48#define BIT_SHIFT_TBTT_SETUP	0
     49#define BIT_MASK_TBTT_MASK	((BIT_MASK_TBTT_HOLD << BIT_SHIFT_TBTT_HOLD) | \
     50				 (BIT_MASK_TBTT_SETUP << BIT_SHIFT_TBTT_SETUP))
     51#define TBTT_TIME(s, h)((((s) & BIT_MASK_TBTT_SETUP) << BIT_SHIFT_TBTT_SETUP) |\
     52			(((h) & BIT_MASK_TBTT_HOLD) << BIT_SHIFT_TBTT_HOLD))
     53#define WLAN_TBTT_TIME_NORMAL	TBTT_TIME(0x04, 0x80)
     54#define WLAN_TBTT_TIME_STOP_BCN	TBTT_TIME(0x04, 0x64)
     55#define WLAN_PIFS_VAL		0
     56#define WLAN_AGG_BRK_TIME	0x16
     57#define WLAN_NAV_PROT_LEN	0x0040
     58#define WLAN_SPEC_SIFS		0x100a
     59#define WLAN_RX_PKT_LIMIT	0x17
     60#define WLAN_MAX_AGG_NR		0x0A
     61#define WLAN_AMPDU_MAX_TIME	0x1C
     62#define WLAN_ANT_SEL		0x82
     63#define WLAN_LTR_IDLE_LAT	0x90039003
     64#define WLAN_LTR_ACT_LAT	0x883c883c
     65#define WLAN_LTR_CTRL1		0xCB004010
     66#define WLAN_LTR_CTRL2		0x01233425
     67
     68static void rtw8723d_lck(struct rtw_dev *rtwdev)
     69{
     70	u32 lc_cal;
     71	u8 val_ctx, rf_val;
     72	int ret;
     73
     74	val_ctx = rtw_read8(rtwdev, REG_CTX);
     75	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
     76		rtw_write8(rtwdev, REG_CTX, val_ctx & ~BIT_MASK_CTX_TYPE);
     77	else
     78		rtw_write8(rtwdev, REG_TXPAUSE, 0xFF);
     79	lc_cal = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
     80
     81	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal | BIT_LCK);
     82
     83	ret = read_poll_timeout(rtw_read_rf, rf_val, rf_val != 0x1,
     84				10000, 1000000, false,
     85				rtwdev, RF_PATH_A, RF_CFGCH, BIT_LCK);
     86	if (ret)
     87		rtw_warn(rtwdev, "failed to poll LCK status bit\n");
     88
     89	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal);
     90	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
     91		rtw_write8(rtwdev, REG_CTX, val_ctx);
     92	else
     93		rtw_write8(rtwdev, REG_TXPAUSE, 0x00);
     94}
     95
     96static const u32 rtw8723d_ofdm_swing_table[] = {
     97	0x0b40002d, 0x0c000030, 0x0cc00033, 0x0d800036, 0x0e400039, 0x0f00003c,
     98	0x10000040, 0x11000044, 0x12000048, 0x1300004c, 0x14400051, 0x15800056,
     99	0x16c0005b, 0x18000060, 0x19800066, 0x1b00006c, 0x1c800072, 0x1e400079,
    100	0x20000080, 0x22000088, 0x24000090, 0x26000098, 0x288000a2, 0x2ac000ab,
    101	0x2d4000b5, 0x300000c0, 0x32c000cb, 0x35c000d7, 0x390000e4, 0x3c8000f2,
    102	0x40000100, 0x43c0010f, 0x47c0011f, 0x4c000130, 0x50800142, 0x55400155,
    103	0x5a400169, 0x5fc0017f, 0x65400195, 0x6b8001ae, 0x71c001c7, 0x788001e2,
    104	0x7f8001fe,
    105};
    106
    107static const u32 rtw8723d_cck_swing_table[] = {
    108	0x0CD, 0x0D9, 0x0E6, 0x0F3, 0x102, 0x111, 0x121, 0x132, 0x144, 0x158,
    109	0x16C, 0x182, 0x198, 0x1B1, 0x1CA, 0x1E5, 0x202, 0x221, 0x241, 0x263,
    110	0x287, 0x2AE, 0x2D6, 0x301, 0x32F, 0x35F, 0x392, 0x3C9, 0x402, 0x43F,
    111	0x47F, 0x4C3, 0x50C, 0x558, 0x5A9, 0x5FF, 0x65A, 0x6BA, 0x720, 0x78C,
    112	0x7FF,
    113};
    114
    115#define RTW_OFDM_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_ofdm_swing_table)
    116#define RTW_CCK_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_cck_swing_table)
    117
    118static void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)
    119{
    120	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
    121	u8 path;
    122
    123	dm_info->default_ofdm_index = RTW_DEF_OFDM_SWING_INDEX;
    124
    125	for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
    126		ewma_thermal_init(&dm_info->avg_thermal[path]);
    127		dm_info->delta_power_index[path] = 0;
    128	}
    129	dm_info->pwr_trk_triggered = false;
    130	dm_info->pwr_trk_init_trigger = true;
    131	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
    132	dm_info->txagc_remnant_cck = 0;
    133	dm_info->txagc_remnant_ofdm = 0;
    134}
    135
    136static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
    137{
    138	u8 xtal_cap;
    139	u32 val32;
    140
    141	/* power on BB/RF domain */
    142	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN,
    143			BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
    144	rtw_write8_set(rtwdev, REG_RF_CTRL,
    145		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
    146	rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80);
    147
    148	rtw_phy_load_tables(rtwdev);
    149
    150	/* post init after header files config */
    151	rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF);
    152	rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, BIT_HIQ_NO_LMT_EN_ROOT);
    153	rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN);
    154
    155	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
    156	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
    157			 xtal_cap | (xtal_cap << 6));
    158	rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN);
    159	if ((rtwdev->efuse.afe >> 4) == 14) {
    160		rtw_write32_set(rtwdev, REG_AFE_CTRL3, BIT_XTAL_GMP_BIT4);
    161		rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BITS_PLL);
    162		rtw_write32_set(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA1);
    163		rtw_write32_clr(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA0);
    164	}
    165
    166	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
    167	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
    168	rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL);
    169	rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL);
    170	rtw_write8(rtwdev, REG_ATIMWND, 0x2);
    171	rtw_write8(rtwdev, REG_BCN_CTRL,
    172		   BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT);
    173	val32 = rtw_read32(rtwdev, REG_TBTT_PROHIBIT);
    174	val32 &= ~BIT_MASK_TBTT_MASK;
    175	val32 |= WLAN_TBTT_TIME_STOP_BCN;
    176	rtw_write8(rtwdev, REG_TBTT_PROHIBIT, val32);
    177	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL);
    178	rtw_write8(rtwdev, REG_AGGR_BREAK_TIME, WLAN_AGG_BRK_TIME);
    179	rtw_write16(rtwdev, REG_NAV_PROT_LEN, WLAN_NAV_PROT_LEN);
    180	rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS);
    181	rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS);
    182	rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS);
    183	rtw_write8(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
    184	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT);
    185	rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR);
    186	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME);
    187	rtw_write8(rtwdev, REG_LEDCFG2, WLAN_ANT_SEL);
    188
    189	rtw_write32(rtwdev, REG_LTR_IDLE_LATENCY, WLAN_LTR_IDLE_LAT);
    190	rtw_write32(rtwdev, REG_LTR_ACTIVE_LATENCY, WLAN_LTR_ACT_LAT);
    191	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC, WLAN_LTR_CTRL1);
    192	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC + 4, WLAN_LTR_CTRL2);
    193
    194	rtw_phy_init(rtwdev);
    195	rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f;
    196
    197	rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
    198
    199	rtw8723d_lck(rtwdev);
    200
    201	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
    202	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20);
    203
    204	rtw8723d_pwrtrack_init(rtwdev);
    205}
    206
    207static void rtw8723de_efuse_parsing(struct rtw_efuse *efuse,
    208				    struct rtw8723d_efuse *map)
    209{
    210	ether_addr_copy(efuse->addr, map->e.mac_addr);
    211}
    212
    213static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
    214{
    215	struct rtw_efuse *efuse = &rtwdev->efuse;
    216	struct rtw8723d_efuse *map;
    217	int i;
    218
    219	map = (struct rtw8723d_efuse *)log_map;
    220
    221	efuse->rfe_option = 0;
    222	efuse->rf_board_option = map->rf_board_option;
    223	efuse->crystal_cap = map->xtal_k;
    224	efuse->pa_type_2g = map->pa_type;
    225	efuse->lna_type_2g = map->lna_type_2g[0];
    226	efuse->channel_plan = map->channel_plan;
    227	efuse->country_code[0] = map->country_code[0];
    228	efuse->country_code[1] = map->country_code[1];
    229	efuse->bt_setting = map->rf_bt_setting;
    230	efuse->regd = map->rf_board_option & 0x7;
    231	efuse->thermal_meter[0] = map->thermal_meter;
    232	efuse->thermal_meter_k = map->thermal_meter;
    233	efuse->afe = map->afe;
    234
    235	for (i = 0; i < 4; i++)
    236		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
    237
    238	switch (rtw_hci_type(rtwdev)) {
    239	case RTW_HCI_TYPE_PCIE:
    240		rtw8723de_efuse_parsing(efuse, map);
    241		break;
    242	default:
    243		/* unsupported now */
    244		return -ENOTSUPP;
    245	}
    246
    247	return 0;
    248}
    249
    250static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
    251				   struct rtw_rx_pkt_stat *pkt_stat)
    252{
    253	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
    254	s8 min_rx_power = -120;
    255	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
    256
    257	pkt_stat->rx_power[RF_PATH_A] = pwdb - 97;
    258	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
    259	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
    260	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
    261				     min_rx_power);
    262	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
    263}
    264
    265static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
    266				   struct rtw_rx_pkt_stat *pkt_stat)
    267{
    268	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
    269	u8 rxsc, bw;
    270	s8 min_rx_power = -120;
    271	s8 rx_evm;
    272
    273	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
    274		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
    275	else
    276		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
    277
    278	if (GET_PHY_STAT_P1_RF_MODE(phy_status) == 0)
    279		bw = RTW_CHANNEL_WIDTH_20;
    280	else if ((rxsc == 1) || (rxsc == 2))
    281		bw = RTW_CHANNEL_WIDTH_20;
    282	else
    283		bw = RTW_CHANNEL_WIDTH_40;
    284
    285	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
    286	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
    287	pkt_stat->bw = bw;
    288	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
    289				     min_rx_power);
    290	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
    291	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
    292	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
    293
    294	dm_info->curr_rx_rate = pkt_stat->rate;
    295	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
    296	dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1;
    297	dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1;
    298
    299	rx_evm = clamp_t(s8, -pkt_stat->rx_evm[RF_PATH_A] >> 1, 0, 64);
    300	rx_evm &= 0x3F;	/* 64->0: second path of 1SS rate is 64 */
    301	dm_info->rx_evm_dbm[RF_PATH_A] = rx_evm;
    302}
    303
    304static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
    305			     struct rtw_rx_pkt_stat *pkt_stat)
    306{
    307	u8 page;
    308
    309	page = *phy_status & 0xf;
    310
    311	switch (page) {
    312	case 0:
    313		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
    314		break;
    315	case 1:
    316		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
    317		break;
    318	default:
    319		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
    320		return;
    321	}
    322}
    323
    324static void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
    325				   struct rtw_rx_pkt_stat *pkt_stat,
    326				   struct ieee80211_rx_status *rx_status)
    327{
    328	struct ieee80211_hdr *hdr;
    329	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
    330	u8 *phy_status = NULL;
    331
    332	memset(pkt_stat, 0, sizeof(*pkt_stat));
    333
    334	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
    335	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
    336	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
    337	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
    338			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
    339	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
    340	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
    341	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
    342	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
    343	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
    344	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
    345	pkt_stat->ppdu_cnt = 0;
    346	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
    347
    348	/* drv_info_sz is in unit of 8-bytes */
    349	pkt_stat->drv_info_sz *= 8;
    350
    351	/* c2h cmd pkt's rx/phy status is not interested */
    352	if (pkt_stat->is_c2h)
    353		return;
    354
    355	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
    356				       pkt_stat->drv_info_sz);
    357	if (pkt_stat->phy_status) {
    358		phy_status = rx_desc + desc_sz + pkt_stat->shift;
    359		query_phy_status(rtwdev, phy_status, pkt_stat);
    360	}
    361
    362	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
    363}
    364
    365static bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
    366					 u8 channel, u32 thres)
    367{
    368	u32 freq;
    369	bool ret = false;
    370
    371	if (channel == 13)
    372		freq = FREQ_CH13;
    373	else if (channel == 14)
    374		freq = FREQ_CH14;
    375	else
    376		return false;
    377
    378	rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE);
    379	rtw_write32(rtwdev, REG_PSDFN, freq);
    380	rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq);
    381
    382	msleep(30);
    383	if (rtw_read32(rtwdev, REG_PSDRPT) >= thres)
    384		ret = true;
    385
    386	rtw_write32(rtwdev, REG_PSDFN, freq);
    387	rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE);
    388
    389	return ret;
    390}
    391
    392static void rtw8723d_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch)
    393{
    394	if (!notch) {
    395		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f);
    396		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
    397		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
    398		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
    399		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
    400		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
    401		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
    402		return;
    403	}
    404
    405	switch (channel) {
    406	case 13:
    407		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb);
    408		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
    409		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x04000000);
    410		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
    411		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
    412		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
    413		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
    414		break;
    415	case 14:
    416		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5);
    417		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
    418		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
    419		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
    420		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
    421		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00080000);
    422		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
    423		break;
    424	default:
    425		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
    426		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
    427		break;
    428	}
    429}
    430
    431static void rtw8723d_spur_cal(struct rtw_dev *rtwdev, u8 channel)
    432{
    433	bool notch;
    434
    435	if (channel < 13) {
    436		rtw8723d_cfg_notch(rtwdev, channel, false);
    437		return;
    438	}
    439
    440	notch = rtw8723d_check_spur_ov_thres(rtwdev, channel, SPUR_THRES);
    441	rtw8723d_cfg_notch(rtwdev, channel, notch);
    442}
    443
    444static void rtw8723d_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
    445{
    446	u32 rf_cfgch_a, rf_cfgch_b;
    447
    448	rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
    449	rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK);
    450
    451	rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK;
    452	rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK;
    453	rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK);
    454	rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK);
    455
    456	rf_cfgch_a &= ~RFCFGCH_BW_MASK;
    457	switch (bw) {
    458	case RTW_CHANNEL_WIDTH_20:
    459		rf_cfgch_a |= RFCFGCH_BW_20M;
    460		break;
    461	case RTW_CHANNEL_WIDTH_40:
    462		rf_cfgch_a |= RFCFGCH_BW_40M;
    463		break;
    464	default:
    465		break;
    466	}
    467
    468	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a);
    469	rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b);
    470
    471	rtw8723d_spur_cal(rtwdev, channel);
    472}
    473
    474static const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR] = {
    475	[0] = {
    476		{ .len = 4, .reg = 0xA24, .val = 0x64B80C1C },
    477		{ .len = 4, .reg = 0xA28, .val = 0x00008810 },
    478		{ .len = 4, .reg = 0xAAC, .val = 0x01235667 },
    479	},
    480	[1] = {
    481		{ .len = 4, .reg = 0xA24, .val = 0x0000B81C },
    482		{ .len = 4, .reg = 0xA28, .val = 0x00000000 },
    483		{ .len = 4, .reg = 0xAAC, .val = 0x00003667 },
    484	},
    485};
    486
    487static void rtw8723d_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
    488				    u8 primary_ch_idx)
    489{
    490	const struct rtw_backup_info *cck_dfir;
    491	int i;
    492
    493	cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1];
    494
    495	for (i = 0; i < CCK_DFIR_NR; i++, cck_dfir++)
    496		rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val);
    497
    498	switch (bw) {
    499	case RTW_CHANNEL_WIDTH_20:
    500		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
    501		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
    502		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 1);
    503		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_MASK_RXBB_DFIR, 0xa);
    504		break;
    505	case RTW_CHANNEL_WIDTH_40:
    506		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1);
    507		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1);
    508		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 0);
    509		rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND,
    510				 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
    511		break;
    512	default:
    513		break;
    514	}
    515}
    516
    517static void rtw8723d_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
    518				 u8 primary_chan_idx)
    519{
    520	rtw8723d_set_channel_rf(rtwdev, channel, bw);
    521	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
    522	rtw8723d_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
    523}
    524
    525#define BIT_CFENDFORM		BIT(9)
    526#define BIT_WMAC_TCR_ERR0	BIT(12)
    527#define BIT_WMAC_TCR_ERR1	BIT(13)
    528#define BIT_TCR_CFG		(BIT_CFENDFORM | BIT_WMAC_TCR_ERR0 |	       \
    529				 BIT_WMAC_TCR_ERR1)
    530#define WLAN_RX_FILTER0		0xFFFF
    531#define WLAN_RX_FILTER1		0x400
    532#define WLAN_RX_FILTER2		0xFFFF
    533#define WLAN_RCR_CFG		0x700060CE
    534
    535static int rtw8723d_mac_init(struct rtw_dev *rtwdev)
    536{
    537	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
    538	rtw_write32(rtwdev, REG_TCR, BIT_TCR_CFG);
    539
    540	rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
    541	rtw_write16(rtwdev, REG_RXFLTMAP1, WLAN_RX_FILTER1);
    542	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
    543	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
    544
    545	rtw_write32(rtwdev, REG_INT_MIG, 0);
    546	rtw_write32(rtwdev, REG_MCUTST_1, 0x0);
    547
    548	rtw_write8(rtwdev, REG_MISC_CTRL, BIT_DIS_SECOND_CCA);
    549	rtw_write8(rtwdev, REG_2ND_CCA_CTRL, 0);
    550
    551	return 0;
    552}
    553
    554static void rtw8723d_shutdown(struct rtw_dev *rtwdev)
    555{
    556	rtw_write16_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
    557}
    558
    559static void rtw8723d_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
    560{
    561	u8 ldo_pwr;
    562
    563	ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
    564	if (enable) {
    565		ldo_pwr &= ~BIT_MASK_LDO25_VOLTAGE;
    566		ldo_pwr |= (BIT_LDO25_VOLTAGE_V25 << 4) | BIT_LDO25_EN;
    567	} else {
    568		ldo_pwr &= ~BIT_LDO25_EN;
    569	}
    570	rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
    571}
    572
    573static void
    574rtw8723d_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
    575{
    576	struct rtw_hal *hal = &rtwdev->hal;
    577	const struct rtw_hw_reg *txagc;
    578	u8 rate, pwr_index;
    579	int j;
    580
    581	for (j = 0; j < rtw_rate_size[rs]; j++) {
    582		rate = rtw_rate_section[rs][j];
    583		pwr_index = hal->tx_pwr_tbl[path][rate];
    584
    585		if (rate >= ARRAY_SIZE(rtw8723d_txagc)) {
    586			rtw_warn(rtwdev, "rate 0x%x isn't supported\n", rate);
    587			continue;
    588		}
    589		txagc = &rtw8723d_txagc[rate];
    590		if (!txagc->addr) {
    591			rtw_warn(rtwdev, "rate 0x%x isn't defined\n", rate);
    592			continue;
    593		}
    594
    595		rtw_write32_mask(rtwdev, txagc->addr, txagc->mask, pwr_index);
    596	}
    597}
    598
    599static void rtw8723d_set_tx_power_index(struct rtw_dev *rtwdev)
    600{
    601	struct rtw_hal *hal = &rtwdev->hal;
    602	int rs, path;
    603
    604	for (path = 0; path < hal->rf_path_num; path++) {
    605		for (rs = 0; rs <= RTW_RATE_SECTION_HT_1S; rs++)
    606			rtw8723d_set_tx_power_index_by_rate(rtwdev, path, rs);
    607	}
    608}
    609
    610static void rtw8723d_efuse_grant(struct rtw_dev *rtwdev, bool on)
    611{
    612	if (on) {
    613		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
    614
    615		rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
    616		rtw_write16_set(rtwdev, REG_SYS_CLKR, BIT_LOADER_CLK_EN | BIT_ANA8M);
    617	} else {
    618		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
    619	}
    620}
    621
    622static void rtw8723d_false_alarm_statistics(struct rtw_dev *rtwdev)
    623{
    624	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
    625	u32 cck_fa_cnt;
    626	u32 ofdm_fa_cnt;
    627	u32 crc32_cnt;
    628	u32 val32;
    629
    630	/* hold counter */
    631	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 1);
    632	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 1);
    633	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KEEP, 1);
    634	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KEEP, 1);
    635
    636	cck_fa_cnt = rtw_read32_mask(rtwdev, REG_CCK_FA_LSB_11N, MASKBYTE0);
    637	cck_fa_cnt += rtw_read32_mask(rtwdev, REG_CCK_FA_MSB_11N, MASKBYTE3) << 8;
    638
    639	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE1_11N);
    640	ofdm_fa_cnt = u32_get_bits(val32, BIT_MASK_OFDM_FF_CNT);
    641	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_SF_CNT);
    642	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE2_11N);
    643	dm_info->ofdm_cca_cnt = u32_get_bits(val32, BIT_MASK_OFDM_CCA_CNT);
    644	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_PF_CNT);
    645	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE3_11N);
    646	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_RI_CNT);
    647	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_CRC_CNT);
    648	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE4_11N);
    649	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_MNS_CNT);
    650
    651	dm_info->cck_fa_cnt = cck_fa_cnt;
    652	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
    653	dm_info->total_fa_cnt = cck_fa_cnt + ofdm_fa_cnt;
    654
    655	dm_info->cck_err_cnt = rtw_read32(rtwdev, REG_IGI_C_11N);
    656	dm_info->cck_ok_cnt = rtw_read32(rtwdev, REG_IGI_D_11N);
    657	crc32_cnt = rtw_read32(rtwdev, REG_OFDM_CRC32_CNT_11N);
    658	dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_ERR);
    659	dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_OK);
    660	crc32_cnt = rtw_read32(rtwdev, REG_HT_CRC32_CNT_11N);
    661	dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_ERR);
    662	dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_OK);
    663	dm_info->vht_err_cnt = 0;
    664	dm_info->vht_ok_cnt = 0;
    665
    666	val32 = rtw_read32(rtwdev, REG_CCK_CCA_CNT_11N);
    667	dm_info->cck_cca_cnt = (u32_get_bits(val32, BIT_MASK_CCK_FA_MSB) << 8) |
    668			       u32_get_bits(val32, BIT_MASK_CCK_FA_LSB);
    669	dm_info->total_cca_cnt = dm_info->cck_cca_cnt + dm_info->ofdm_cca_cnt;
    670
    671	/* reset counter */
    672	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 1);
    673	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 0);
    674	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 1);
    675	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 0);
    676	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 0);
    677	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 0);
    678	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 0);
    679	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 2);
    680	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 0);
    681	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 2);
    682	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 1);
    683	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 0);
    684}
    685
    686static const u32 iqk_adda_regs[] = {
    687	0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
    688	0xed0, 0xed4, 0xed8, 0xedc, 0xee0, 0xeec
    689};
    690
    691static const u32 iqk_mac8_regs[] = {0x522, 0x550, 0x551};
    692static const u32 iqk_mac32_regs[] = {0x40};
    693
    694static const u32 iqk_bb_regs[] = {
    695	0xc04, 0xc08, 0x874, 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0xa04
    696};
    697
    698#define IQK_ADDA_REG_NUM	ARRAY_SIZE(iqk_adda_regs)
    699#define IQK_MAC8_REG_NUM	ARRAY_SIZE(iqk_mac8_regs)
    700#define IQK_MAC32_REG_NUM	ARRAY_SIZE(iqk_mac32_regs)
    701#define IQK_BB_REG_NUM		ARRAY_SIZE(iqk_bb_regs)
    702
    703struct iqk_backup_regs {
    704	u32 adda[IQK_ADDA_REG_NUM];
    705	u8 mac8[IQK_MAC8_REG_NUM];
    706	u32 mac32[IQK_MAC32_REG_NUM];
    707	u32 bb[IQK_BB_REG_NUM];
    708
    709	u32 lte_path;
    710	u32 lte_gnt;
    711
    712	u32 bb_sel_btg;
    713	u8 btg_sel;
    714
    715	u8 igia;
    716	u8 igib;
    717};
    718
    719static void rtw8723d_iqk_backup_regs(struct rtw_dev *rtwdev,
    720				     struct iqk_backup_regs *backup)
    721{
    722	int i;
    723
    724	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
    725		backup->adda[i] = rtw_read32(rtwdev, iqk_adda_regs[i]);
    726
    727	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
    728		backup->mac8[i] = rtw_read8(rtwdev, iqk_mac8_regs[i]);
    729	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
    730		backup->mac32[i] = rtw_read32(rtwdev, iqk_mac32_regs[i]);
    731
    732	for (i = 0; i < IQK_BB_REG_NUM; i++)
    733		backup->bb[i] = rtw_read32(rtwdev, iqk_bb_regs[i]);
    734
    735	backup->igia = rtw_read32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0);
    736	backup->igib = rtw_read32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0);
    737
    738	backup->bb_sel_btg = rtw_read32(rtwdev, REG_BB_SEL_BTG);
    739}
    740
    741static void rtw8723d_iqk_restore_regs(struct rtw_dev *rtwdev,
    742				      const struct iqk_backup_regs *backup)
    743{
    744	int i;
    745
    746	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
    747		rtw_write32(rtwdev, iqk_adda_regs[i], backup->adda[i]);
    748
    749	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
    750		rtw_write8(rtwdev, iqk_mac8_regs[i], backup->mac8[i]);
    751	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
    752		rtw_write32(rtwdev, iqk_mac32_regs[i], backup->mac32[i]);
    753
    754	for (i = 0; i < IQK_BB_REG_NUM; i++)
    755		rtw_write32(rtwdev, iqk_bb_regs[i], backup->bb[i]);
    756
    757	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
    758	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, backup->igia);
    759
    760	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, 0x50);
    761	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, backup->igib);
    762
    763	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x01008c00);
    764	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x01008c00);
    765}
    766
    767static void rtw8723d_iqk_backup_path_ctrl(struct rtw_dev *rtwdev,
    768					  struct iqk_backup_regs *backup)
    769{
    770	backup->btg_sel = rtw_read8(rtwdev, REG_BTG_SEL);
    771	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] original 0x67 = 0x%x\n",
    772		backup->btg_sel);
    773}
    774
    775static void rtw8723d_iqk_config_path_ctrl(struct rtw_dev *rtwdev)
    776{
    777	rtw_write32_mask(rtwdev, REG_PAD_CTRL1, BIT_BT_BTG_SEL, 0x1);
    778	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] set 0x67 = 0x%x\n",
    779		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
    780}
    781
    782static void rtw8723d_iqk_restore_path_ctrl(struct rtw_dev *rtwdev,
    783					   const struct iqk_backup_regs *backup)
    784{
    785	rtw_write8(rtwdev, REG_BTG_SEL, backup->btg_sel);
    786	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] restore 0x67 = 0x%x\n",
    787		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
    788}
    789
    790static void rtw8723d_iqk_backup_lte_path_gnt(struct rtw_dev *rtwdev,
    791					     struct iqk_backup_regs *backup)
    792{
    793	backup->lte_path = rtw_read32(rtwdev, REG_LTECOEX_PATH_CONTROL);
    794	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0038);
    795	mdelay(1);
    796	backup->lte_gnt = rtw_read32(rtwdev, REG_LTECOEX_READ_DATA);
    797	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] OriginalGNT = 0x%x\n",
    798		backup->lte_gnt);
    799}
    800
    801static void rtw8723d_iqk_config_lte_path_gnt(struct rtw_dev *rtwdev)
    802{
    803	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, 0x0000ff00);
    804	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc0020038);
    805	rtw_write32_mask(rtwdev, REG_LTECOEX_PATH_CONTROL, BIT_LTE_MUX_CTRL_PATH, 0x1);
    806}
    807
    808static void rtw8723d_iqk_restore_lte_path_gnt(struct rtw_dev *rtwdev,
    809					      const struct iqk_backup_regs *bak)
    810{
    811	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, bak->lte_gnt);
    812	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc00f0038);
    813	rtw_write32(rtwdev, REG_LTECOEX_PATH_CONTROL, bak->lte_path);
    814}
    815
    816struct rtw_8723d_iqk_cfg {
    817	const char *name;
    818	u32 val_bb_sel_btg;
    819	u32 reg_lutwe;
    820	u32 val_txiqk_pi;
    821	u32 reg_padlut;
    822	u32 reg_gaintx;
    823	u32 reg_bspad;
    824	u32 val_wlint;
    825	u32 val_wlsel;
    826	u32 val_iqkpts;
    827};
    828
    829static const struct rtw_8723d_iqk_cfg iqk_tx_cfg[PATH_NR] = {
    830	[PATH_S1] = {
    831		.name = "S1",
    832		.val_bb_sel_btg = 0x99000000,
    833		.reg_lutwe = RF_LUTWE,
    834		.val_txiqk_pi = 0x8214019f,
    835		.reg_padlut = RF_LUTDBG,
    836		.reg_gaintx = RF_GAINTX,
    837		.reg_bspad = RF_BSPAD,
    838		.val_wlint = 0xe0d,
    839		.val_wlsel = 0x60d,
    840		.val_iqkpts = 0xfa000000,
    841	},
    842	[PATH_S0] = {
    843		.name = "S0",
    844		.val_bb_sel_btg = 0x99000280,
    845		.reg_lutwe = RF_LUTWE2,
    846		.val_txiqk_pi = 0x8214018a,
    847		.reg_padlut = RF_TXADBG,
    848		.reg_gaintx = RF_TRXIQ,
    849		.reg_bspad = RF_TXATANK,
    850		.val_wlint = 0xe6d,
    851		.val_wlsel = 0x66d,
    852		.val_iqkpts = 0xf9000000,
    853	},
    854};
    855
    856static u8 rtw8723d_iqk_check_tx_failed(struct rtw_dev *rtwdev,
    857				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
    858{
    859	s32 tx_x, tx_y;
    860	u32 tx_fail;
    861
    862	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n",
    863		rtw_read32(rtwdev, REG_IQK_RES_RY));
    864	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n",
    865		rtw_read32(rtwdev, REG_IQK_RES_TX),
    866		rtw_read32(rtwdev, REG_IQK_RES_TY));
    867	rtw_dbg(rtwdev, RTW_DBG_RFK,
    868		"[IQK] 0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
    869		rtw_read32(rtwdev, 0xe90),
    870		rtw_read32(rtwdev, 0xe98));
    871
    872	tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL);
    873	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
    874	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
    875
    876	if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR)
    877		return IQK_TX_OK;
    878
    879	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s TXIQK is failed\n",
    880		iqk_cfg->name);
    881
    882	return 0;
    883}
    884
    885static u8 rtw8723d_iqk_check_rx_failed(struct rtw_dev *rtwdev,
    886				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
    887{
    888	s32 rx_x, rx_y;
    889	u32 rx_fail;
    890
    891	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n",
    892		rtw_read32(rtwdev, REG_IQK_RES_RX),
    893		rtw_read32(rtwdev, REG_IQK_RES_RY));
    894
    895	rtw_dbg(rtwdev, RTW_DBG_RFK,
    896		"[IQK] 0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
    897		rtw_read32(rtwdev, 0xea0),
    898		rtw_read32(rtwdev, 0xea8));
    899
    900	rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL);
    901	rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
    902	rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
    903	rx_y = abs(iqkxy_to_s32(rx_y));
    904
    905	if (!rx_fail && rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER &&
    906	    rx_y < IQK_RX_Y_LMT)
    907		return IQK_RX_OK;
    908
    909	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s RXIQK STEP2 is failed\n",
    910		iqk_cfg->name);
    911
    912	return 0;
    913}
    914
    915static void rtw8723d_iqk_one_shot(struct rtw_dev *rtwdev, bool tx,
    916				  const struct rtw_8723d_iqk_cfg *iqk_cfg)
    917{
    918	u32 pts = (tx ? iqk_cfg->val_iqkpts : 0xf9000000);
    919
    920	/* enter IQK mode */
    921	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
    922	rtw8723d_iqk_config_lte_path_gnt(rtwdev);
    923
    924	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0054);
    925	mdelay(1);
    926	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] GNT_BT @%s %sIQK1 = 0x%x\n",
    927		iqk_cfg->name, tx ? "TX" : "RX",
    928		rtw_read32(rtwdev, REG_LTECOEX_READ_DATA));
    929	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x948 @%s %sIQK1 = 0x%x\n",
    930		iqk_cfg->name, tx ? "TX" : "RX",
    931		rtw_read32(rtwdev, REG_BB_SEL_BTG));
    932
    933	/* One shot, LOK & IQK */
    934	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, pts);
    935	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000);
    936
    937	if (!check_hw_ready(rtwdev, REG_IQK_RES_RY, BIT_IQK_DONE, 1))
    938		rtw_warn(rtwdev, "%s %s IQK isn't done\n", iqk_cfg->name,
    939			 tx ? "TX" : "RX");
    940}
    941
    942static void rtw8723d_iqk_txrx_path_post(struct rtw_dev *rtwdev,
    943					const struct rtw_8723d_iqk_cfg *iqk_cfg,
    944					const struct iqk_backup_regs *backup)
    945{
    946	rtw8723d_iqk_restore_lte_path_gnt(rtwdev, backup);
    947	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg);
    948
    949	/* leave IQK mode */
    950	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
    951	mdelay(1);
    952	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x0);
    953	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, BIT(0), 0x0);
    954	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, BIT(0), 0x0);
    955}
    956
    957static u8 rtw8723d_iqk_tx_path(struct rtw_dev *rtwdev,
    958			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
    959			       const struct iqk_backup_regs *backup)
    960{
    961	u8 status;
    962
    963	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s TXIQK!!\n", iqk_cfg->name);
    964	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s TXIQK = 0x%x\n",
    965		iqk_cfg->name,
    966		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
    967
    968	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
    969	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
    970	mdelay(1);
    971	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
    972	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00004);
    973	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005d);
    974	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xBFFE0);
    975	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
    976
    977	/* IQK setting */
    978	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x08008c0c);
    979	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
    980	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, iqk_cfg->val_txiqk_pi);
    981	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160200);
    982	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
    983	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
    984
    985	/* LOK setting */
    986	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911);
    987
    988	/* PA, PAD setting */
    989	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
    990	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
    991	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x1E0, 0x3);
    992	rtw_write_rf(rtwdev, RF_PATH_A, RF_RXIQGEN, 0x1F, 0xf);
    993
    994	/* LOK setting for 8723D */
    995	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x10, 0x1);
    996	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_bspad, 0x1, 0x1);
    997
    998	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
    999	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
   1000
   1001	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s TXIQK = 0x%x\n",
   1002		iqk_cfg->name,
   1003		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
   1004	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s TXIQK = 0x%x\n",
   1005		iqk_cfg->name,
   1006		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
   1007
   1008	rtw8723d_iqk_one_shot(rtwdev, true, iqk_cfg);
   1009	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
   1010
   1011	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
   1012
   1013	return status;
   1014}
   1015
   1016static u8 rtw8723d_iqk_rx_path(struct rtw_dev *rtwdev,
   1017			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
   1018			       const struct iqk_backup_regs *backup)
   1019{
   1020	u32 tx_x, tx_y;
   1021	u8 status;
   1022
   1023	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK Step1!!\n",
   1024		iqk_cfg->name);
   1025	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK1 = 0x%x\n",
   1026		iqk_cfg->name,
   1027		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
   1028	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
   1029
   1030	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
   1031
   1032	/* IQK setting */
   1033	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
   1034	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
   1035
   1036	/* path IQK setting */
   1037	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
   1038	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
   1039	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
   1040	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
   1041	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82160000);
   1042	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160000);
   1043
   1044	/* LOK setting */
   1045	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911);
   1046
   1047	/* RXIQK mode */
   1048	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
   1049	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00006);
   1050	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
   1051	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xa7ffb);
   1052	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
   1053
   1054	/* PA/PAD=0 */
   1055	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
   1056	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
   1057	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
   1058	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
   1059
   1060	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1@ path %s RXIQK1 = 0x%x\n",
   1061		iqk_cfg->name,
   1062		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
   1063	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2@ path %s RXIQK1 = 0x%x\n",
   1064		iqk_cfg->name,
   1065		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
   1066
   1067	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
   1068	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
   1069
   1070	if (!status)
   1071		goto restore;
   1072
   1073	/* second round */
   1074	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
   1075	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
   1076
   1077	rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y));
   1078	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n",
   1079		rtw_read32(rtwdev, REG_TXIQK_11N),
   1080		BIT_SET_TXIQK_11N(tx_x, tx_y));
   1081
   1082	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK STEP2!!\n",
   1083		iqk_cfg->name);
   1084	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK2 = 0x%x\n",
   1085		iqk_cfg->name,
   1086		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
   1087
   1088	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
   1089	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c);
   1090	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c);
   1091	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
   1092	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
   1093	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82170000);
   1094	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28171400);
   1095
   1096	/* LOK setting */
   1097	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1);
   1098
   1099	/* RXIQK mode */
   1100	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
   1101	mdelay(1);
   1102	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x80000, 0x1);
   1103	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00007);
   1104	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
   1105	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xb3fdb);
   1106	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
   1107
   1108	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s RXIQK2 = 0x%x\n",
   1109		iqk_cfg->name,
   1110		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
   1111	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s RXIQK2 = 0x%x\n",
   1112		iqk_cfg->name,
   1113		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
   1114
   1115	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
   1116	status |= rtw8723d_iqk_check_rx_failed(rtwdev, iqk_cfg);
   1117
   1118restore:
   1119	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
   1120
   1121	return status;
   1122}
   1123
   1124static
   1125void rtw8723d_iqk_fill_s1_matrix(struct rtw_dev *rtwdev, const s32 result[])
   1126{
   1127	s32 oldval_1;
   1128	s32 x, y;
   1129	s32 tx1_a, tx1_a_ext;
   1130	s32 tx1_c, tx1_c_ext;
   1131
   1132	if (result[IQK_S1_TX_X] == 0)
   1133		return;
   1134
   1135	oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
   1136				   BIT_MASK_TXIQ_ELM_D);
   1137
   1138	x = iqkxy_to_s32(result[IQK_S1_TX_X]);
   1139	tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext);
   1140	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
   1141			 BIT_MASK_TXIQ_ELM_A, tx1_a);
   1142	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
   1143			 BIT_MASK_OFDM0_EXT_A, tx1_a_ext);
   1144
   1145	y = iqkxy_to_s32(result[IQK_S1_TX_Y]);
   1146	tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext);
   1147	rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
   1148			 BIT_SET_TXIQ_ELM_C1(tx1_c));
   1149	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
   1150			 BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c));
   1151	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
   1152			 BIT_MASK_OFDM0_EXT_C, tx1_c_ext);
   1153
   1154	rtw_dbg(rtwdev, RTW_DBG_RFK,
   1155		"[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n",
   1156		x, tx1_a, oldval_1);
   1157	rtw_dbg(rtwdev, RTW_DBG_RFK,
   1158		"[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c);
   1159
   1160	if (result[IQK_S1_RX_X] == 0)
   1161		return;
   1162
   1163	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_X,
   1164			 result[IQK_S1_RX_X]);
   1165	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_Y1,
   1166			 BIT_SET_RXIQ_S1_Y1(result[IQK_S1_RX_Y]));
   1167	rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2,
   1168			 BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
   1169}
   1170
   1171static
   1172void rtw8723d_iqk_fill_s0_matrix(struct rtw_dev *rtwdev, const s32 result[])
   1173{
   1174	s32 oldval_0;
   1175	s32 x, y;
   1176	s32 tx0_a, tx0_a_ext;
   1177	s32 tx0_c, tx0_c_ext;
   1178
   1179	if (result[IQK_S0_TX_X] == 0)
   1180		return;
   1181
   1182	oldval_0 = rtw_read32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0);
   1183
   1184	x = iqkxy_to_s32(result[IQK_S0_TX_X]);
   1185	tx0_a = iqk_mult(x, oldval_0, &tx0_a_ext);
   1186
   1187	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, tx0_a);
   1188	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, tx0_a_ext);
   1189
   1190	y = iqkxy_to_s32(result[IQK_S0_TX_Y]);
   1191	tx0_c = iqk_mult(y, oldval_0, &tx0_c_ext);
   1192
   1193	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, tx0_c);
   1194	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, tx0_c_ext);
   1195
   1196	if (result[IQK_S0_RX_X] == 0)
   1197		return;
   1198
   1199	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_X_S0,
   1200			 result[IQK_S0_RX_X]);
   1201	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_Y_S0,
   1202			 result[IQK_S0_RX_Y]);
   1203}
   1204
   1205static void rtw8723d_iqk_path_adda_on(struct rtw_dev *rtwdev)
   1206{
   1207	int i;
   1208
   1209	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
   1210		rtw_write32(rtwdev, iqk_adda_regs[i], 0x03c00016);
   1211}
   1212
   1213static void rtw8723d_iqk_config_mac(struct rtw_dev *rtwdev)
   1214{
   1215	rtw_write8(rtwdev, REG_TXPAUSE, 0xff);
   1216}
   1217
   1218static
   1219void rtw8723d_iqk_rf_standby(struct rtw_dev *rtwdev, enum rtw_rf_path path)
   1220{
   1221	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path-%s standby mode!\n",
   1222		path == RF_PATH_A ? "S1" : "S0");
   1223
   1224	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
   1225	mdelay(1);
   1226	rtw_write_rf(rtwdev, path, RF_MODE, RFREG_MASK, 0x10000);
   1227	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
   1228}
   1229
   1230static
   1231bool rtw8723d_iqk_similarity_cmp(struct rtw_dev *rtwdev, s32 result[][IQK_NR],
   1232				 u8 c1, u8 c2)
   1233{
   1234	u32 i, j, diff;
   1235	u32 bitmap = 0;
   1236	u8 candidate[PATH_NR] = {IQK_ROUND_INVALID, IQK_ROUND_INVALID};
   1237	bool ret = true;
   1238
   1239	s32 tmp1, tmp2;
   1240
   1241	for (i = 0; i < IQK_NR; i++) {
   1242		tmp1 = iqkxy_to_s32(result[c1][i]);
   1243		tmp2 = iqkxy_to_s32(result[c2][i]);
   1244
   1245		diff = abs(tmp1 - tmp2);
   1246
   1247		if (diff <= MAX_TOLERANCE)
   1248			continue;
   1249
   1250		if ((i == IQK_S1_RX_X || i == IQK_S0_RX_X) && !bitmap) {
   1251			if (result[c1][i] + result[c1][i + 1] == 0)
   1252				candidate[i / IQK_SX_NR] = c2;
   1253			else if (result[c2][i] + result[c2][i + 1] == 0)
   1254				candidate[i / IQK_SX_NR] = c1;
   1255			else
   1256				bitmap |= BIT(i);
   1257		} else {
   1258			bitmap |= BIT(i);
   1259		}
   1260	}
   1261
   1262	if (bitmap != 0)
   1263		goto check_sim;
   1264
   1265	for (i = 0; i < PATH_NR; i++) {
   1266		if (candidate[i] == IQK_ROUND_INVALID)
   1267			continue;
   1268
   1269		for (j = i * IQK_SX_NR; j < i * IQK_SX_NR + 2; j++)
   1270			result[IQK_ROUND_HYBRID][j] = result[candidate[i]][j];
   1271		ret = false;
   1272	}
   1273
   1274	return ret;
   1275
   1276check_sim:
   1277	for (i = 0; i < IQK_NR; i++) {
   1278		j = i & ~1;	/* 2 bits are a pair for IQ[X, Y] */
   1279		if (bitmap & GENMASK(j + 1, j))
   1280			continue;
   1281
   1282		result[IQK_ROUND_HYBRID][i] = result[c1][i];
   1283	}
   1284
   1285	return false;
   1286}
   1287
   1288static
   1289void rtw8723d_iqk_precfg_path(struct rtw_dev *rtwdev, enum rtw8723d_path path)
   1290{
   1291	if (path == PATH_S0) {
   1292		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_A);
   1293		rtw8723d_iqk_path_adda_on(rtwdev);
   1294	}
   1295
   1296	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
   1297	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
   1298	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
   1299
   1300	if (path == PATH_S1) {
   1301		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_B);
   1302		rtw8723d_iqk_path_adda_on(rtwdev);
   1303	}
   1304}
   1305
   1306static
   1307void rtw8723d_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t,
   1308			    const struct iqk_backup_regs *backup)
   1309{
   1310	u32 i;
   1311	u8 s1_ok, s0_ok;
   1312
   1313	rtw_dbg(rtwdev, RTW_DBG_RFK,
   1314		"[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t);
   1315
   1316	rtw8723d_iqk_path_adda_on(rtwdev);
   1317	rtw8723d_iqk_config_mac(rtwdev);
   1318	rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf);
   1319	rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05611);
   1320	rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4);
   1321	rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204200);
   1322	rtw8723d_iqk_precfg_path(rtwdev, PATH_S1);
   1323
   1324	for (i = 0; i < PATH_IQK_RETRY; i++) {
   1325		s1_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
   1326		if (s1_ok == IQK_TX_OK) {
   1327			rtw_dbg(rtwdev, RTW_DBG_RFK,
   1328				"[IQK] path S1 Tx IQK Success!!\n");
   1329			result[t][IQK_S1_TX_X] =
   1330			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
   1331			result[t][IQK_S1_TX_Y] =
   1332			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
   1333			break;
   1334		}
   1335
   1336		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Tx IQK Fail!!\n");
   1337		result[t][IQK_S1_TX_X] = 0x100;
   1338		result[t][IQK_S1_TX_Y] = 0x0;
   1339	}
   1340
   1341	for (i = 0; i < PATH_IQK_RETRY; i++) {
   1342		s1_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
   1343		if (s1_ok == (IQK_TX_OK | IQK_RX_OK)) {
   1344			rtw_dbg(rtwdev, RTW_DBG_RFK,
   1345				"[IQK] path S1 Rx IQK Success!!\n");
   1346			result[t][IQK_S1_RX_X] =
   1347			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
   1348			result[t][IQK_S1_RX_Y] =
   1349			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
   1350			break;
   1351		}
   1352
   1353		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Rx IQK Fail!!\n");
   1354		result[t][IQK_S1_RX_X] = 0x100;
   1355		result[t][IQK_S1_RX_Y] = 0x0;
   1356	}
   1357
   1358	if (s1_ok == 0x0)
   1359		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 IQK is failed!!\n");
   1360
   1361	rtw8723d_iqk_precfg_path(rtwdev, PATH_S0);
   1362
   1363	for (i = 0; i < PATH_IQK_RETRY; i++) {
   1364		s0_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
   1365		if (s0_ok == IQK_TX_OK) {
   1366			rtw_dbg(rtwdev, RTW_DBG_RFK,
   1367				"[IQK] path S0 Tx IQK Success!!\n");
   1368			result[t][IQK_S0_TX_X] =
   1369			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
   1370			result[t][IQK_S0_TX_Y] =
   1371			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
   1372			break;
   1373		}
   1374
   1375		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Tx IQK Fail!!\n");
   1376		result[t][IQK_S0_TX_X] = 0x100;
   1377		result[t][IQK_S0_TX_Y] = 0x0;
   1378	}
   1379
   1380	for (i = 0; i < PATH_IQK_RETRY; i++) {
   1381		s0_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
   1382		if (s0_ok == (IQK_TX_OK | IQK_RX_OK)) {
   1383			rtw_dbg(rtwdev, RTW_DBG_RFK,
   1384				"[IQK] path S0 Rx IQK Success!!\n");
   1385
   1386			result[t][IQK_S0_RX_X] =
   1387			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
   1388			result[t][IQK_S0_RX_Y] =
   1389			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
   1390			break;
   1391		}
   1392
   1393		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Rx IQK Fail!!\n");
   1394		result[t][IQK_S0_RX_X] = 0x100;
   1395		result[t][IQK_S0_RX_Y] = 0x0;
   1396	}
   1397
   1398	if (s0_ok == 0x0)
   1399		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 IQK is failed!!\n");
   1400
   1401	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
   1402	mdelay(1);
   1403
   1404	rtw_dbg(rtwdev, RTW_DBG_RFK,
   1405		"[IQK] back to BB mode, load original value!\n");
   1406}
   1407
   1408static void rtw8723d_phy_calibration(struct rtw_dev *rtwdev)
   1409{
   1410	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1411	s32 result[IQK_ROUND_SIZE][IQK_NR];
   1412	struct iqk_backup_regs backup;
   1413	u8 i, j;
   1414	u8 final_candidate = IQK_ROUND_INVALID;
   1415	bool good;
   1416
   1417	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!!!\n");
   1418
   1419	memset(result, 0, sizeof(result));
   1420
   1421	rtw8723d_iqk_backup_path_ctrl(rtwdev, &backup);
   1422	rtw8723d_iqk_backup_lte_path_gnt(rtwdev, &backup);
   1423	rtw8723d_iqk_backup_regs(rtwdev, &backup);
   1424
   1425	for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) {
   1426		rtw8723d_iqk_config_path_ctrl(rtwdev);
   1427		rtw8723d_iqk_config_lte_path_gnt(rtwdev);
   1428
   1429		rtw8723d_iqk_one_round(rtwdev, result, i, &backup);
   1430
   1431		if (i > IQK_ROUND_0)
   1432			rtw8723d_iqk_restore_regs(rtwdev, &backup);
   1433		rtw8723d_iqk_restore_lte_path_gnt(rtwdev, &backup);
   1434		rtw8723d_iqk_restore_path_ctrl(rtwdev, &backup);
   1435
   1436		for (j = IQK_ROUND_0; j < i; j++) {
   1437			good = rtw8723d_iqk_similarity_cmp(rtwdev, result, j, i);
   1438
   1439			if (good) {
   1440				final_candidate = j;
   1441				rtw_dbg(rtwdev, RTW_DBG_RFK,
   1442					"[IQK] cmp %d:%d final_candidate is %x\n",
   1443					j, i, final_candidate);
   1444				goto iqk_done;
   1445			}
   1446		}
   1447	}
   1448
   1449	if (final_candidate == IQK_ROUND_INVALID) {
   1450		s32 reg_tmp = 0;
   1451
   1452		for (i = 0; i < IQK_NR; i++)
   1453			reg_tmp += result[IQK_ROUND_HYBRID][i];
   1454
   1455		if (reg_tmp != 0) {
   1456			final_candidate = IQK_ROUND_HYBRID;
   1457		} else {
   1458			WARN(1, "IQK is failed\n");
   1459			goto out;
   1460		}
   1461	}
   1462
   1463iqk_done:
   1464	rtw8723d_iqk_fill_s1_matrix(rtwdev, result[final_candidate]);
   1465	rtw8723d_iqk_fill_s0_matrix(rtwdev, result[final_candidate]);
   1466
   1467	dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X];
   1468	dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y];
   1469	dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X];
   1470	dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y];
   1471	dm_info->iqk.done = true;
   1472
   1473out:
   1474	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg);
   1475
   1476	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n",
   1477		final_candidate);
   1478
   1479	for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++)
   1480		rtw_dbg(rtwdev, RTW_DBG_RFK,
   1481			"[IQK] Result %u: rege94_s1=%x rege9c_s1=%x regea4_s1=%x regeac_s1=%x rege94_s0=%x rege9c_s0=%x regea4_s0=%x regeac_s0=%x %s\n",
   1482			i,
   1483			result[i][0], result[i][1], result[i][2], result[i][3],
   1484			result[i][4], result[i][5], result[i][6], result[i][7],
   1485			final_candidate == i ? "(final candidate)" : "");
   1486
   1487	rtw_dbg(rtwdev, RTW_DBG_RFK,
   1488		"[IQK]0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n",
   1489		rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE),
   1490		rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N),
   1491		rtw_read32(rtwdev, REG_A_RXIQI),
   1492		rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N));
   1493	rtw_dbg(rtwdev, RTW_DBG_RFK,
   1494		"[IQK]0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n",
   1495		rtw_read32(rtwdev, REG_TXIQ_AB_S0),
   1496		rtw_read32(rtwdev, REG_TXIQ_CD_S0),
   1497		rtw_read32(rtwdev, REG_RXIQ_AB_S0));
   1498
   1499	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] finished\n");
   1500}
   1501
   1502static void rtw8723d_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
   1503{
   1504	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1505	u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13};
   1506	u8 cck_n_rx;
   1507
   1508	rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
   1509		dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
   1510
   1511	if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
   1512		return;
   1513
   1514	cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) &&
   1515		    rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1;
   1516	rtw_dbg(rtwdev, RTW_DBG_PHY,
   1517		"is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n",
   1518		rtw_is_assoc(rtwdev), new_lvl, cck_n_rx,
   1519		dm_info->cck_pd_default + new_lvl * 2,
   1520		pd[new_lvl], dm_info->cck_fa_avg);
   1521
   1522	dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
   1523
   1524	dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
   1525	rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]);
   1526	rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000,
   1527			 dm_info->cck_pd_default + new_lvl * 2);
   1528}
   1529
   1530/* for coex */
   1531static void rtw8723d_coex_cfg_init(struct rtw_dev *rtwdev)
   1532{
   1533	/* enable TBTT nterrupt */
   1534	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
   1535
   1536	/* BT report packet sample rate	 */
   1537	/* 0x790[5:0]=0x5 */
   1538	rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
   1539
   1540	/* enable BT counter statistics */
   1541	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
   1542
   1543	/* enable PTA (3-wire function form BT side) */
   1544	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
   1545	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
   1546
   1547	/* enable PTA (tx/rx signal form WiFi side) */
   1548	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
   1549}
   1550
   1551static void rtw8723d_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
   1552{
   1553}
   1554
   1555static void rtw8723d_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
   1556{
   1557	rtw_write8_mask(rtwdev, REG_LEDCFG2, BIT(6), 0);
   1558	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(0), 0);
   1559	rtw_write8_mask(rtwdev, REG_GPIO_INTM + 2, BIT(4), 0);
   1560	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT(1), 0);
   1561	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(1), 0);
   1562	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT(7), 0);
   1563	rtw_write8_mask(rtwdev, REG_SYS_CLKR + 1, BIT(1), 0);
   1564	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT(3), 0);
   1565}
   1566
   1567static void rtw8723d_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
   1568{
   1569	struct rtw_efuse *efuse = &rtwdev->efuse;
   1570	struct rtw_coex *coex = &rtwdev->coex;
   1571	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
   1572	bool aux = efuse->bt_setting & BIT(6);
   1573
   1574	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
   1575	coex_rfe->ant_switch_polarity = 0;
   1576	coex_rfe->ant_switch_exist = false;
   1577	coex_rfe->ant_switch_with_bt = false;
   1578	coex_rfe->ant_switch_diversity = false;
   1579	coex_rfe->wlg_at_btg = true;
   1580
   1581	/* decide antenna at main or aux */
   1582	if (efuse->share_ant) {
   1583		if (aux)
   1584			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x80);
   1585		else
   1586			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x200);
   1587	} else {
   1588		if (aux)
   1589			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x280);
   1590		else
   1591			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x0);
   1592	}
   1593
   1594	/* disable LTE coex in wifi side */
   1595	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
   1596	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
   1597	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
   1598}
   1599
   1600static void rtw8723d_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
   1601{
   1602	struct rtw_coex *coex = &rtwdev->coex;
   1603	struct rtw_coex_dm *coex_dm = &coex->dm;
   1604	static const u8	wl_tx_power[] = {0xb2, 0x90};
   1605	u8 pwr;
   1606
   1607	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
   1608		return;
   1609
   1610	coex_dm->cur_wl_pwr_lvl = wl_pwr;
   1611
   1612	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
   1613		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
   1614
   1615	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
   1616
   1617	rtw_write8(rtwdev, REG_ANA_PARAM1 + 3, pwr);
   1618}
   1619
   1620static void rtw8723d_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
   1621{
   1622	struct rtw_coex *coex = &rtwdev->coex;
   1623	struct rtw_coex_dm *coex_dm = &coex->dm;
   1624	/* WL Rx Low gain on */
   1625	static const u32 wl_rx_low_gain_on[] = {
   1626		0xec120101, 0xeb130101, 0xce140101, 0xcd150101, 0xcc160101,
   1627		0xcb170101, 0xca180101, 0x8d190101, 0x8c1a0101, 0x8b1b0101,
   1628		0x4f1c0101, 0x4e1d0101, 0x4d1e0101, 0x4c1f0101, 0x0e200101,
   1629		0x0d210101, 0x0c220101, 0x0b230101, 0xcf240001, 0xce250001,
   1630		0xcd260001, 0xcc270001, 0x8f280001
   1631	};
   1632	/* WL Rx Low gain off */
   1633	static const u32 wl_rx_low_gain_off[] = {
   1634		0xec120101, 0xeb130101, 0xea140101, 0xe9150101, 0xe8160101,
   1635		0xe7170101, 0xe6180101, 0xe5190101, 0xe41a0101, 0xe31b0101,
   1636		0xe21c0101, 0xe11d0101, 0xe01e0101, 0x861f0101, 0x85200101,
   1637		0x84210101, 0x83220101, 0x82230101, 0x81240101, 0x80250101,
   1638		0x44260101, 0x43270101, 0x42280101
   1639	};
   1640	u8 i;
   1641
   1642	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
   1643		return;
   1644
   1645	coex_dm->cur_wl_rx_low_gain_en = low_gain;
   1646
   1647	if (coex_dm->cur_wl_rx_low_gain_en) {
   1648		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
   1649			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_on[i]);
   1650	} else {
   1651		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
   1652			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_off[i]);
   1653	}
   1654}
   1655
   1656static u8 rtw8723d_pwrtrack_get_limit_ofdm(struct rtw_dev *rtwdev)
   1657{
   1658	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1659	u8 tx_rate = dm_info->tx_rate;
   1660	u8 limit_ofdm = 30;
   1661
   1662	switch (tx_rate) {
   1663	case DESC_RATE1M...DESC_RATE5_5M:
   1664	case DESC_RATE11M:
   1665		break;
   1666	case DESC_RATE6M...DESC_RATE48M:
   1667		limit_ofdm = 36;
   1668		break;
   1669	case DESC_RATE54M:
   1670		limit_ofdm = 34;
   1671		break;
   1672	case DESC_RATEMCS0...DESC_RATEMCS2:
   1673		limit_ofdm = 38;
   1674		break;
   1675	case DESC_RATEMCS3...DESC_RATEMCS4:
   1676		limit_ofdm = 36;
   1677		break;
   1678	case DESC_RATEMCS5...DESC_RATEMCS7:
   1679		limit_ofdm = 34;
   1680		break;
   1681	default:
   1682		rtw_warn(rtwdev, "pwrtrack unhandled tx_rate 0x%x\n", tx_rate);
   1683		break;
   1684	}
   1685
   1686	return limit_ofdm;
   1687}
   1688
   1689static void rtw8723d_set_iqk_matrix_by_result(struct rtw_dev *rtwdev,
   1690					      u32 ofdm_swing, u8 rf_path)
   1691{
   1692	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1693	s32 ele_A, ele_D, ele_C;
   1694	s32 ele_A_ext, ele_C_ext, ele_D_ext;
   1695	s32 iqk_result_x;
   1696	s32 iqk_result_y;
   1697	s32 value32;
   1698
   1699	switch (rf_path) {
   1700	default:
   1701	case RF_PATH_A:
   1702		iqk_result_x = dm_info->iqk.result.s1_x;
   1703		iqk_result_y = dm_info->iqk.result.s1_y;
   1704		break;
   1705	case RF_PATH_B:
   1706		iqk_result_x = dm_info->iqk.result.s0_x;
   1707		iqk_result_y = dm_info->iqk.result.s0_y;
   1708		break;
   1709	}
   1710
   1711	/* new element D */
   1712	ele_D = OFDM_SWING_D(ofdm_swing);
   1713	iqk_mult(iqk_result_x, ele_D, &ele_D_ext);
   1714	/* new element A */
   1715	iqk_result_x = iqkxy_to_s32(iqk_result_x);
   1716	ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext);
   1717	/* new element C */
   1718	iqk_result_y = iqkxy_to_s32(iqk_result_y);
   1719	ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext);
   1720
   1721	switch (rf_path) {
   1722	case RF_PATH_A:
   1723	default:
   1724		/* write new elements A, C, D, and element B is always 0 */
   1725		value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
   1726		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32);
   1727		value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
   1728		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
   1729				 value32);
   1730		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
   1731		value32 &= ~BIT_MASK_OFDM0_EXTS;
   1732		value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext);
   1733		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
   1734		break;
   1735
   1736	case RF_PATH_B:
   1737		/* write new elements A, C, D, and element B is always 0 */
   1738		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0, ele_D);
   1739		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, ele_C);
   1740		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, ele_A);
   1741
   1742		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0,
   1743				 ele_D_ext);
   1744		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0,
   1745				 ele_A_ext);
   1746		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0,
   1747				 ele_C_ext);
   1748		break;
   1749	}
   1750}
   1751
   1752static void rtw8723d_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index,
   1753				    u8 rf_path)
   1754{
   1755	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1756	s32 value32;
   1757	u32 ofdm_swing;
   1758
   1759	if (ofdm_index >= RTW_OFDM_SWING_TABLE_SIZE)
   1760		ofdm_index = RTW_OFDM_SWING_TABLE_SIZE - 1;
   1761	else if (ofdm_index < 0)
   1762		ofdm_index = 0;
   1763
   1764	ofdm_swing = rtw8723d_ofdm_swing_table[ofdm_index];
   1765
   1766	if (dm_info->iqk.done) {
   1767		rtw8723d_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path);
   1768		return;
   1769	}
   1770
   1771	switch (rf_path) {
   1772	case RF_PATH_A:
   1773	default:
   1774		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing);
   1775		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
   1776				 0x00);
   1777		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
   1778		value32 &= ~BIT_MASK_OFDM0_EXTS;
   1779		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
   1780		break;
   1781
   1782	case RF_PATH_B:
   1783		/* image S1:c80 to S0:Cd0 and Cd4 */
   1784		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0,
   1785				 OFDM_SWING_A(ofdm_swing));
   1786		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_B_S0,
   1787				 OFDM_SWING_B(ofdm_swing));
   1788		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0,
   1789				 OFDM_SWING_C(ofdm_swing));
   1790		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0,
   1791				 OFDM_SWING_D(ofdm_swing));
   1792		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0, 0x0);
   1793		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, 0x0);
   1794		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, 0x0);
   1795		break;
   1796	}
   1797}
   1798
   1799static void rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
   1800					   s8 txagc_idx)
   1801{
   1802	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1803
   1804	dm_info->txagc_remnant_ofdm = txagc_idx;
   1805
   1806	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
   1807	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
   1808}
   1809
   1810static void rtw8723d_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
   1811					  s8 txagc_idx)
   1812{
   1813	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1814
   1815	dm_info->txagc_remnant_cck = txagc_idx;
   1816
   1817	rtw_write32_mask(rtwdev, 0xab4, 0x000007FF,
   1818			 rtw8723d_cck_swing_table[swing_idx]);
   1819}
   1820
   1821static void rtw8723d_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
   1822{
   1823	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1824	struct rtw_hal *hal = &rtwdev->hal;
   1825	u8 limit_ofdm;
   1826	u8 limit_cck = 40;
   1827	s8 final_ofdm_swing_index;
   1828	s8 final_cck_swing_index;
   1829
   1830	limit_ofdm = rtw8723d_pwrtrack_get_limit_ofdm(rtwdev);
   1831
   1832	final_ofdm_swing_index = RTW_DEF_OFDM_SWING_INDEX +
   1833				 dm_info->delta_power_index[path];
   1834	final_cck_swing_index = RTW_DEF_CCK_SWING_INDEX +
   1835				dm_info->delta_power_index[path];
   1836
   1837	if (final_ofdm_swing_index > limit_ofdm)
   1838		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm,
   1839					       final_ofdm_swing_index - limit_ofdm);
   1840	else if (final_ofdm_swing_index < 0)
   1841		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, 0,
   1842					       final_ofdm_swing_index);
   1843	else
   1844		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0);
   1845
   1846	if (final_cck_swing_index > limit_cck)
   1847		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, limit_cck,
   1848					      final_cck_swing_index - limit_cck);
   1849	else if (final_cck_swing_index < 0)
   1850		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, 0,
   1851					      final_cck_swing_index);
   1852	else
   1853		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0);
   1854
   1855	rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
   1856}
   1857
   1858static void rtw8723d_pwrtrack_set_xtal(struct rtw_dev *rtwdev, u8 therm_path,
   1859				       u8 delta)
   1860{
   1861	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1862	const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
   1863	const s8 *pwrtrk_xtal;
   1864	s8 xtal_cap;
   1865
   1866	if (dm_info->thermal_avg[therm_path] >
   1867	    rtwdev->efuse.thermal_meter[therm_path])
   1868		pwrtrk_xtal = tbl->pwrtrk_xtal_p;
   1869	else
   1870		pwrtrk_xtal = tbl->pwrtrk_xtal_n;
   1871
   1872	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
   1873	xtal_cap = clamp_t(s8, xtal_cap + pwrtrk_xtal[delta], 0, 0x3F);
   1874	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
   1875			 xtal_cap | (xtal_cap << 6));
   1876}
   1877
   1878static void rtw8723d_phy_pwrtrack(struct rtw_dev *rtwdev)
   1879{
   1880	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1881	struct rtw_swing_table swing_table;
   1882	u8 thermal_value, delta, path;
   1883	bool do_iqk = false;
   1884
   1885	rtw_phy_config_swing_table(rtwdev, &swing_table);
   1886
   1887	if (rtwdev->efuse.thermal_meter[0] == 0xff)
   1888		return;
   1889
   1890	thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
   1891
   1892	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
   1893
   1894	do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
   1895
   1896	if (do_iqk)
   1897		rtw8723d_lck(rtwdev);
   1898
   1899	if (dm_info->pwr_trk_init_trigger)
   1900		dm_info->pwr_trk_init_trigger = false;
   1901	else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
   1902						   RF_PATH_A))
   1903		goto iqk;
   1904
   1905	delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
   1906
   1907	delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
   1908
   1909	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
   1910		s8 delta_cur, delta_last;
   1911
   1912		delta_last = dm_info->delta_power_index[path];
   1913		delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table,
   1914							path, RF_PATH_A, delta);
   1915		if (delta_last == delta_cur)
   1916			continue;
   1917
   1918		dm_info->delta_power_index[path] = delta_cur;
   1919		rtw8723d_pwrtrack_set(rtwdev, path);
   1920	}
   1921
   1922	rtw8723d_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta);
   1923
   1924iqk:
   1925	if (do_iqk)
   1926		rtw8723d_phy_calibration(rtwdev);
   1927}
   1928
   1929static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
   1930{
   1931	struct rtw_efuse *efuse = &rtwdev->efuse;
   1932	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
   1933
   1934	if (efuse->power_track_type != 0)
   1935		return;
   1936
   1937	if (!dm_info->pwr_trk_triggered) {
   1938		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
   1939			     GENMASK(17, 16), 0x03);
   1940		dm_info->pwr_trk_triggered = true;
   1941		return;
   1942	}
   1943
   1944	rtw8723d_phy_pwrtrack(rtwdev);
   1945	dm_info->pwr_trk_triggered = false;
   1946}
   1947
   1948static struct rtw_chip_ops rtw8723d_ops = {
   1949	.phy_set_param		= rtw8723d_phy_set_param,
   1950	.read_efuse		= rtw8723d_read_efuse,
   1951	.query_rx_desc		= rtw8723d_query_rx_desc,
   1952	.set_channel		= rtw8723d_set_channel,
   1953	.mac_init		= rtw8723d_mac_init,
   1954	.shutdown		= rtw8723d_shutdown,
   1955	.read_rf		= rtw_phy_read_rf_sipi,
   1956	.write_rf		= rtw_phy_write_rf_reg_sipi,
   1957	.set_tx_power_index	= rtw8723d_set_tx_power_index,
   1958	.set_antenna		= NULL,
   1959	.cfg_ldo25		= rtw8723d_cfg_ldo25,
   1960	.efuse_grant		= rtw8723d_efuse_grant,
   1961	.false_alarm_statistics	= rtw8723d_false_alarm_statistics,
   1962	.phy_calibration	= rtw8723d_phy_calibration,
   1963	.cck_pd_set		= rtw8723d_phy_cck_pd_set,
   1964	.pwr_track		= rtw8723d_pwr_track,
   1965	.config_bfee		= NULL,
   1966	.set_gid_table		= NULL,
   1967	.cfg_csi_rate		= NULL,
   1968
   1969	.coex_set_init		= rtw8723d_coex_cfg_init,
   1970	.coex_set_ant_switch	= NULL,
   1971	.coex_set_gnt_fix	= rtw8723d_coex_cfg_gnt_fix,
   1972	.coex_set_gnt_debug	= rtw8723d_coex_cfg_gnt_debug,
   1973	.coex_set_rfe_type	= rtw8723d_coex_cfg_rfe_type,
   1974	.coex_set_wl_tx_power	= rtw8723d_coex_cfg_wl_tx_power,
   1975	.coex_set_wl_rx_gain	= rtw8723d_coex_cfg_wl_rx_gain,
   1976};
   1977
   1978/* Shared-Antenna Coex Table */
   1979static const struct coex_table_para table_sant_8723d[] = {
   1980	{0xffffffff, 0xffffffff}, /* case-0 */
   1981	{0x55555555, 0x55555555},
   1982	{0x66555555, 0x66555555},
   1983	{0xaaaaaaaa, 0xaaaaaaaa},
   1984	{0x5a5a5a5a, 0x5a5a5a5a},
   1985	{0xfafafafa, 0xfafafafa}, /* case-5 */
   1986	{0x6a5a5555, 0xaaaaaaaa},
   1987	{0x6a5a56aa, 0x6a5a56aa},
   1988	{0x6a5a5a5a, 0x6a5a5a5a},
   1989	{0x66555555, 0x5a5a5a5a},
   1990	{0x66555555, 0x6a5a5a5a}, /* case-10 */
   1991	{0x66555555, 0x6a5a5aaa},
   1992	{0x66555555, 0x5a5a5aaa},
   1993	{0x66555555, 0x6aaa5aaa},
   1994	{0x66555555, 0xaaaa5aaa},
   1995	{0x66555555, 0xaaaaaaaa}, /* case-15 */
   1996	{0xffff55ff, 0xfafafafa},
   1997	{0xffff55ff, 0x6afa5afa},
   1998	{0xaaffffaa, 0xfafafafa},
   1999	{0xaa5555aa, 0x5a5a5a5a},
   2000	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
   2001	{0xaa5555aa, 0xaaaaaaaa},
   2002	{0xffffffff, 0x5a5a5a5a},
   2003	{0xffffffff, 0x5a5a5a5a},
   2004	{0xffffffff, 0x55555555},
   2005	{0xffffffff, 0x5a5a5aaa}, /* case-25 */
   2006	{0x55555555, 0x5a5a5a5a},
   2007	{0x55555555, 0xaaaaaaaa},
   2008	{0x55555555, 0x6a5a6a5a},
   2009	{0x66556655, 0x66556655},
   2010	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
   2011	{0xffffffff, 0x5aaa5aaa},
   2012	{0x56555555, 0x5a5a5aaa},
   2013};
   2014
   2015/* Non-Shared-Antenna Coex Table */
   2016static const struct coex_table_para table_nsant_8723d[] = {
   2017	{0xffffffff, 0xffffffff}, /* case-100 */
   2018	{0x55555555, 0x55555555},
   2019	{0x66555555, 0x66555555},
   2020	{0xaaaaaaaa, 0xaaaaaaaa},
   2021	{0x5a5a5a5a, 0x5a5a5a5a},
   2022	{0xfafafafa, 0xfafafafa}, /* case-105 */
   2023	{0x5afa5afa, 0x5afa5afa},
   2024	{0x55555555, 0xfafafafa},
   2025	{0x66555555, 0xfafafafa},
   2026	{0x66555555, 0x5a5a5a5a},
   2027	{0x66555555, 0x6a5a5a5a}, /* case-110 */
   2028	{0x66555555, 0xaaaaaaaa},
   2029	{0xffff55ff, 0xfafafafa},
   2030	{0xffff55ff, 0x5afa5afa},
   2031	{0xffff55ff, 0xaaaaaaaa},
   2032	{0xffff55ff, 0xffff55ff}, /* case-115 */
   2033	{0xaaffffaa, 0x5afa5afa},
   2034	{0xaaffffaa, 0xaaaaaaaa},
   2035	{0xffffffff, 0xfafafafa},
   2036	{0xffffffff, 0x5afa5afa},
   2037	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
   2038	{0x55ff55ff, 0x5afa5afa},
   2039	{0x55ff55ff, 0xaaaaaaaa},
   2040	{0x55ff55ff, 0x55ff55ff}
   2041};
   2042
   2043/* Shared-Antenna TDMA */
   2044static const struct coex_tdma_para tdma_sant_8723d[] = {
   2045	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
   2046	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
   2047	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
   2048	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
   2049	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
   2050	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
   2051	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
   2052	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
   2053	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
   2054	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
   2055	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
   2056	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
   2057	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
   2058	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
   2059	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
   2060	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
   2061	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
   2062	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
   2063	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
   2064	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
   2065	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
   2066	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
   2067	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
   2068	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
   2069	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
   2070	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
   2071	{ {0x51, 0x08, 0x03, 0x10, 0x50} },
   2072	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
   2073};
   2074
   2075/* Non-Shared-Antenna TDMA */
   2076static const struct coex_tdma_para tdma_nsant_8723d[] = {
   2077	{ {0x00, 0x00, 0x00, 0x00, 0x01} }, /* case-100 */
   2078	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
   2079	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
   2080	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
   2081	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
   2082	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
   2083	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
   2084	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
   2085	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
   2086	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
   2087	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
   2088	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
   2089	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
   2090	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
   2091	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
   2092	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
   2093	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
   2094	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
   2095	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
   2096	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
   2097	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
   2098	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
   2099};
   2100
   2101/* rssi in percentage % (dbm = % - 100) */
   2102static const u8 wl_rssi_step_8723d[] = {60, 50, 44, 30};
   2103static const u8 bt_rssi_step_8723d[] = {30, 30, 30, 30};
   2104static const struct coex_5g_afh_map afh_5g_8723d[] = { {0, 0, 0} };
   2105
   2106static const struct rtw_hw_reg btg_reg_8723d = {
   2107	.addr = REG_BTG_SEL, .mask = BIT_MASK_BTG_WL,
   2108};
   2109
   2110/* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
   2111static const struct coex_rf_para rf_para_tx_8723d[] = {
   2112	{0, 0, false, 7},  /* for normal */
   2113	{0, 10, false, 7}, /* for WL-CPT */
   2114	{1, 0, true, 4},
   2115	{1, 2, true, 4},
   2116	{1, 10, true, 4},
   2117	{1, 15, true, 4}
   2118};
   2119
   2120static const struct coex_rf_para rf_para_rx_8723d[] = {
   2121	{0, 0, false, 7},  /* for normal */
   2122	{0, 10, false, 7}, /* for WL-CPT */
   2123	{1, 0, true, 5},
   2124	{1, 2, true, 5},
   2125	{1, 10, true, 5},
   2126	{1, 15, true, 5}
   2127};
   2128
   2129static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8723d[] = {
   2130	{0x0005,
   2131	 RTW_PWR_CUT_ALL_MSK,
   2132	 RTW_PWR_INTF_ALL_MSK,
   2133	 RTW_PWR_ADDR_MAC,
   2134	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(7), 0},
   2135	{0x0086,
   2136	 RTW_PWR_CUT_ALL_MSK,
   2137	 RTW_PWR_INTF_SDIO_MSK,
   2138	 RTW_PWR_ADDR_SDIO,
   2139	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2140	{0x0086,
   2141	 RTW_PWR_CUT_ALL_MSK,
   2142	 RTW_PWR_INTF_SDIO_MSK,
   2143	 RTW_PWR_ADDR_SDIO,
   2144	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
   2145	{0x004A,
   2146	 RTW_PWR_CUT_ALL_MSK,
   2147	 RTW_PWR_INTF_USB_MSK,
   2148	 RTW_PWR_ADDR_MAC,
   2149	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2150	{0x0005,
   2151	 RTW_PWR_CUT_ALL_MSK,
   2152	 RTW_PWR_INTF_ALL_MSK,
   2153	 RTW_PWR_ADDR_MAC,
   2154	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
   2155	{0x0023,
   2156	 RTW_PWR_CUT_ALL_MSK,
   2157	 RTW_PWR_INTF_SDIO_MSK,
   2158	 RTW_PWR_ADDR_MAC,
   2159	 RTW_PWR_CMD_WRITE, BIT(4), 0},
   2160	{0x0301,
   2161	 RTW_PWR_CUT_ALL_MSK,
   2162	 RTW_PWR_INTF_PCI_MSK,
   2163	 RTW_PWR_ADDR_MAC,
   2164	 RTW_PWR_CMD_WRITE, 0xFF, 0},
   2165	{0xFFFF,
   2166	 RTW_PWR_CUT_ALL_MSK,
   2167	 RTW_PWR_INTF_ALL_MSK,
   2168	 0,
   2169	 RTW_PWR_CMD_END, 0, 0},
   2170};
   2171
   2172static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8723d[] = {
   2173	{0x0020,
   2174	 RTW_PWR_CUT_ALL_MSK,
   2175	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
   2176	 RTW_PWR_ADDR_MAC,
   2177	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2178	{0x0001,
   2179	 RTW_PWR_CUT_ALL_MSK,
   2180	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
   2181	 RTW_PWR_ADDR_MAC,
   2182	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
   2183	{0x0000,
   2184	 RTW_PWR_CUT_ALL_MSK,
   2185	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
   2186	 RTW_PWR_ADDR_MAC,
   2187	 RTW_PWR_CMD_WRITE, BIT(5), 0},
   2188	{0x0005,
   2189	 RTW_PWR_CUT_ALL_MSK,
   2190	 RTW_PWR_INTF_ALL_MSK,
   2191	 RTW_PWR_ADDR_MAC,
   2192	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
   2193	{0x0075,
   2194	 RTW_PWR_CUT_ALL_MSK,
   2195	 RTW_PWR_INTF_PCI_MSK,
   2196	 RTW_PWR_ADDR_MAC,
   2197	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2198	{0x0006,
   2199	 RTW_PWR_CUT_ALL_MSK,
   2200	 RTW_PWR_INTF_ALL_MSK,
   2201	 RTW_PWR_ADDR_MAC,
   2202	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
   2203	{0x0075,
   2204	 RTW_PWR_CUT_ALL_MSK,
   2205	 RTW_PWR_INTF_PCI_MSK,
   2206	 RTW_PWR_ADDR_MAC,
   2207	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2208	{0x0006,
   2209	 RTW_PWR_CUT_ALL_MSK,
   2210	 RTW_PWR_INTF_ALL_MSK,
   2211	 RTW_PWR_ADDR_MAC,
   2212	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2213	{0x0005,
   2214	 RTW_PWR_CUT_ALL_MSK,
   2215	 RTW_PWR_INTF_ALL_MSK,
   2216	 RTW_PWR_ADDR_MAC,
   2217	 RTW_PWR_CMD_POLLING, (BIT(1) | BIT(0)), 0},
   2218	{0x0005,
   2219	 RTW_PWR_CUT_ALL_MSK,
   2220	 RTW_PWR_INTF_ALL_MSK,
   2221	 RTW_PWR_ADDR_MAC,
   2222	 RTW_PWR_CMD_WRITE, BIT(7), 0},
   2223	{0x0005,
   2224	 RTW_PWR_CUT_ALL_MSK,
   2225	 RTW_PWR_INTF_ALL_MSK,
   2226	 RTW_PWR_ADDR_MAC,
   2227	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
   2228	{0x0005,
   2229	 RTW_PWR_CUT_ALL_MSK,
   2230	 RTW_PWR_INTF_ALL_MSK,
   2231	 RTW_PWR_ADDR_MAC,
   2232	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2233	{0x0005,
   2234	 RTW_PWR_CUT_ALL_MSK,
   2235	 RTW_PWR_INTF_ALL_MSK,
   2236	 RTW_PWR_ADDR_MAC,
   2237	 RTW_PWR_CMD_POLLING, BIT(0), 0},
   2238	{0x0010,
   2239	 RTW_PWR_CUT_ALL_MSK,
   2240	 RTW_PWR_INTF_ALL_MSK,
   2241	 RTW_PWR_ADDR_MAC,
   2242	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
   2243	{0x0049,
   2244	 RTW_PWR_CUT_ALL_MSK,
   2245	 RTW_PWR_INTF_ALL_MSK,
   2246	 RTW_PWR_ADDR_MAC,
   2247	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
   2248	{0x0063,
   2249	 RTW_PWR_CUT_ALL_MSK,
   2250	 RTW_PWR_INTF_ALL_MSK,
   2251	 RTW_PWR_ADDR_MAC,
   2252	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
   2253	{0x0062,
   2254	 RTW_PWR_CUT_ALL_MSK,
   2255	 RTW_PWR_INTF_ALL_MSK,
   2256	 RTW_PWR_ADDR_MAC,
   2257	 RTW_PWR_CMD_WRITE, BIT(1), 0},
   2258	{0x0058,
   2259	 RTW_PWR_CUT_ALL_MSK,
   2260	 RTW_PWR_INTF_ALL_MSK,
   2261	 RTW_PWR_ADDR_MAC,
   2262	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2263	{0x005A,
   2264	 RTW_PWR_CUT_ALL_MSK,
   2265	 RTW_PWR_INTF_ALL_MSK,
   2266	 RTW_PWR_ADDR_MAC,
   2267	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
   2268	{0x0068,
   2269	 RTW_PWR_CUT_TEST_MSK,
   2270	 RTW_PWR_INTF_ALL_MSK,
   2271	 RTW_PWR_ADDR_MAC,
   2272	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
   2273	{0x0069,
   2274	 RTW_PWR_CUT_ALL_MSK,
   2275	 RTW_PWR_INTF_ALL_MSK,
   2276	 RTW_PWR_ADDR_MAC,
   2277	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
   2278	{0x001f,
   2279	 RTW_PWR_CUT_ALL_MSK,
   2280	 RTW_PWR_INTF_ALL_MSK,
   2281	 RTW_PWR_ADDR_MAC,
   2282	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
   2283	{0x0077,
   2284	 RTW_PWR_CUT_ALL_MSK,
   2285	 RTW_PWR_INTF_ALL_MSK,
   2286	 RTW_PWR_ADDR_MAC,
   2287	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
   2288	{0x001f,
   2289	 RTW_PWR_CUT_ALL_MSK,
   2290	 RTW_PWR_INTF_ALL_MSK,
   2291	 RTW_PWR_ADDR_MAC,
   2292	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
   2293	{0x0077,
   2294	 RTW_PWR_CUT_ALL_MSK,
   2295	 RTW_PWR_INTF_ALL_MSK,
   2296	 RTW_PWR_ADDR_MAC,
   2297	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
   2298	{0xFFFF,
   2299	 RTW_PWR_CUT_ALL_MSK,
   2300	 RTW_PWR_INTF_ALL_MSK,
   2301	 0,
   2302	 RTW_PWR_CMD_END, 0, 0},
   2303};
   2304
   2305static const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
   2306	trans_carddis_to_cardemu_8723d,
   2307	trans_cardemu_to_act_8723d,
   2308	NULL
   2309};
   2310
   2311static const struct rtw_pwr_seq_cmd trans_act_to_lps_8723d[] = {
   2312	{0x0301,
   2313	 RTW_PWR_CUT_ALL_MSK,
   2314	 RTW_PWR_INTF_PCI_MSK,
   2315	 RTW_PWR_ADDR_MAC,
   2316	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
   2317	{0x0522,
   2318	 RTW_PWR_CUT_ALL_MSK,
   2319	 RTW_PWR_INTF_ALL_MSK,
   2320	 RTW_PWR_ADDR_MAC,
   2321	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
   2322	{0x05F8,
   2323	 RTW_PWR_CUT_ALL_MSK,
   2324	 RTW_PWR_INTF_ALL_MSK,
   2325	 RTW_PWR_ADDR_MAC,
   2326	 RTW_PWR_CMD_POLLING, 0xFF, 0},
   2327	{0x05F9,
   2328	 RTW_PWR_CUT_ALL_MSK,
   2329	 RTW_PWR_INTF_ALL_MSK,
   2330	 RTW_PWR_ADDR_MAC,
   2331	 RTW_PWR_CMD_POLLING, 0xFF, 0},
   2332	{0x05FA,
   2333	 RTW_PWR_CUT_ALL_MSK,
   2334	 RTW_PWR_INTF_ALL_MSK,
   2335	 RTW_PWR_ADDR_MAC,
   2336	 RTW_PWR_CMD_POLLING, 0xFF, 0},
   2337	{0x05FB,
   2338	 RTW_PWR_CUT_ALL_MSK,
   2339	 RTW_PWR_INTF_ALL_MSK,
   2340	 RTW_PWR_ADDR_MAC,
   2341	 RTW_PWR_CMD_POLLING, 0xFF, 0},
   2342	{0x0002,
   2343	 RTW_PWR_CUT_ALL_MSK,
   2344	 RTW_PWR_INTF_ALL_MSK,
   2345	 RTW_PWR_ADDR_MAC,
   2346	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2347	{0x0002,
   2348	 RTW_PWR_CUT_ALL_MSK,
   2349	 RTW_PWR_INTF_ALL_MSK,
   2350	 RTW_PWR_ADDR_MAC,
   2351	 RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
   2352	{0x0002,
   2353	 RTW_PWR_CUT_ALL_MSK,
   2354	 RTW_PWR_INTF_ALL_MSK,
   2355	 RTW_PWR_ADDR_MAC,
   2356	 RTW_PWR_CMD_WRITE, BIT(1), 0},
   2357	{0x0100,
   2358	 RTW_PWR_CUT_ALL_MSK,
   2359	 RTW_PWR_INTF_ALL_MSK,
   2360	 RTW_PWR_ADDR_MAC,
   2361	 RTW_PWR_CMD_WRITE, 0xFF, 0x03},
   2362	{0x0101,
   2363	 RTW_PWR_CUT_ALL_MSK,
   2364	 RTW_PWR_INTF_ALL_MSK,
   2365	 RTW_PWR_ADDR_MAC,
   2366	 RTW_PWR_CMD_WRITE, BIT(1), 0},
   2367	{0x0093,
   2368	 RTW_PWR_CUT_ALL_MSK,
   2369	 RTW_PWR_INTF_SDIO_MSK,
   2370	 RTW_PWR_ADDR_MAC,
   2371	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
   2372	{0x0553,
   2373	 RTW_PWR_CUT_ALL_MSK,
   2374	 RTW_PWR_INTF_ALL_MSK,
   2375	 RTW_PWR_ADDR_MAC,
   2376	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
   2377	{0xFFFF,
   2378	 RTW_PWR_CUT_ALL_MSK,
   2379	 RTW_PWR_INTF_ALL_MSK,
   2380	 0,
   2381	 RTW_PWR_CMD_END, 0, 0},
   2382};
   2383
   2384static const struct rtw_pwr_seq_cmd trans_act_to_pre_carddis_8723d[] = {
   2385	{0x0003,
   2386	 RTW_PWR_CUT_ALL_MSK,
   2387	 RTW_PWR_INTF_ALL_MSK,
   2388	 RTW_PWR_ADDR_MAC,
   2389	 RTW_PWR_CMD_WRITE, BIT(2), 0},
   2390	{0x0080,
   2391	 RTW_PWR_CUT_ALL_MSK,
   2392	 RTW_PWR_INTF_ALL_MSK,
   2393	 RTW_PWR_ADDR_MAC,
   2394	 RTW_PWR_CMD_WRITE, 0xFF, 0},
   2395	{0xFFFF,
   2396	 RTW_PWR_CUT_ALL_MSK,
   2397	 RTW_PWR_INTF_ALL_MSK,
   2398	 0,
   2399	 RTW_PWR_CMD_END, 0, 0},
   2400};
   2401
   2402static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8723d[] = {
   2403	{0x0002,
   2404	 RTW_PWR_CUT_ALL_MSK,
   2405	 RTW_PWR_INTF_ALL_MSK,
   2406	 RTW_PWR_ADDR_MAC,
   2407	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2408	{0x0049,
   2409	 RTW_PWR_CUT_ALL_MSK,
   2410	 RTW_PWR_INTF_ALL_MSK,
   2411	 RTW_PWR_ADDR_MAC,
   2412	 RTW_PWR_CMD_WRITE, BIT(1), 0},
   2413	{0x0006,
   2414	 RTW_PWR_CUT_ALL_MSK,
   2415	 RTW_PWR_INTF_ALL_MSK,
   2416	 RTW_PWR_ADDR_MAC,
   2417	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2418	{0x0005,
   2419	 RTW_PWR_CUT_ALL_MSK,
   2420	 RTW_PWR_INTF_ALL_MSK,
   2421	 RTW_PWR_ADDR_MAC,
   2422	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
   2423	{0x0005,
   2424	 RTW_PWR_CUT_ALL_MSK,
   2425	 RTW_PWR_INTF_ALL_MSK,
   2426	 RTW_PWR_ADDR_MAC,
   2427	 RTW_PWR_CMD_POLLING, BIT(1), 0},
   2428	{0x0010,
   2429	 RTW_PWR_CUT_ALL_MSK,
   2430	 RTW_PWR_INTF_ALL_MSK,
   2431	 RTW_PWR_ADDR_MAC,
   2432	 RTW_PWR_CMD_WRITE, BIT(6), 0},
   2433	{0x0000,
   2434	 RTW_PWR_CUT_ALL_MSK,
   2435	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
   2436	 RTW_PWR_ADDR_MAC,
   2437	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
   2438	{0x0020,
   2439	 RTW_PWR_CUT_ALL_MSK,
   2440	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
   2441	 RTW_PWR_ADDR_MAC,
   2442	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2443	{0xFFFF,
   2444	 RTW_PWR_CUT_ALL_MSK,
   2445	 RTW_PWR_INTF_ALL_MSK,
   2446	 0,
   2447	 RTW_PWR_CMD_END, 0, 0},
   2448};
   2449
   2450static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8723d[] = {
   2451	{0x0007,
   2452	 RTW_PWR_CUT_ALL_MSK,
   2453	 RTW_PWR_INTF_SDIO_MSK,
   2454	 RTW_PWR_ADDR_MAC,
   2455	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
   2456	{0x0005,
   2457	 RTW_PWR_CUT_ALL_MSK,
   2458	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
   2459	 RTW_PWR_ADDR_MAC,
   2460	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
   2461	{0x0005,
   2462	 RTW_PWR_CUT_ALL_MSK,
   2463	 RTW_PWR_INTF_PCI_MSK,
   2464	 RTW_PWR_ADDR_MAC,
   2465	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
   2466	{0x0005,
   2467	 RTW_PWR_CUT_ALL_MSK,
   2468	 RTW_PWR_INTF_PCI_MSK,
   2469	 RTW_PWR_ADDR_MAC,
   2470	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},
   2471	{0x004A,
   2472	 RTW_PWR_CUT_ALL_MSK,
   2473	 RTW_PWR_INTF_USB_MSK,
   2474	 RTW_PWR_ADDR_MAC,
   2475	 RTW_PWR_CMD_WRITE, BIT(0), 1},
   2476	{0x0023,
   2477	 RTW_PWR_CUT_ALL_MSK,
   2478	 RTW_PWR_INTF_SDIO_MSK,
   2479	 RTW_PWR_ADDR_MAC,
   2480	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
   2481	{0x0086,
   2482	 RTW_PWR_CUT_ALL_MSK,
   2483	 RTW_PWR_INTF_SDIO_MSK,
   2484	 RTW_PWR_ADDR_SDIO,
   2485	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2486	{0x0086,
   2487	 RTW_PWR_CUT_ALL_MSK,
   2488	 RTW_PWR_INTF_SDIO_MSK,
   2489	 RTW_PWR_ADDR_SDIO,
   2490	 RTW_PWR_CMD_POLLING, BIT(1), 0},
   2491	{0xFFFF,
   2492	 RTW_PWR_CUT_ALL_MSK,
   2493	 RTW_PWR_INTF_ALL_MSK,
   2494	 0,
   2495	 RTW_PWR_CMD_END, 0, 0},
   2496};
   2497
   2498static const struct rtw_pwr_seq_cmd trans_act_to_post_carddis_8723d[] = {
   2499	{0x001D,
   2500	 RTW_PWR_CUT_ALL_MSK,
   2501	 RTW_PWR_INTF_ALL_MSK,
   2502	 RTW_PWR_ADDR_MAC,
   2503	 RTW_PWR_CMD_WRITE, BIT(0), 0},
   2504	{0x001D,
   2505	 RTW_PWR_CUT_ALL_MSK,
   2506	 RTW_PWR_INTF_ALL_MSK,
   2507	 RTW_PWR_ADDR_MAC,
   2508	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
   2509	{0x001C,
   2510	 RTW_PWR_CUT_ALL_MSK,
   2511	 RTW_PWR_INTF_ALL_MSK,
   2512	 RTW_PWR_ADDR_MAC,
   2513	 RTW_PWR_CMD_WRITE, 0xFF, 0x0E},
   2514	{0xFFFF,
   2515	 RTW_PWR_CUT_ALL_MSK,
   2516	 RTW_PWR_INTF_ALL_MSK,
   2517	 0,
   2518	 RTW_PWR_CMD_END, 0, 0},
   2519};
   2520
   2521static const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
   2522	trans_act_to_lps_8723d,
   2523	trans_act_to_pre_carddis_8723d,
   2524	trans_act_to_cardemu_8723d,
   2525	trans_cardemu_to_carddis_8723d,
   2526	trans_act_to_post_carddis_8723d,
   2527	NULL
   2528};
   2529
   2530static const struct rtw_page_table page_table_8723d[] = {
   2531	{12, 2, 2, 0, 1},
   2532	{12, 2, 2, 0, 1},
   2533	{12, 2, 2, 0, 1},
   2534	{12, 2, 2, 0, 1},
   2535	{12, 2, 2, 0, 1},
   2536};
   2537
   2538static const struct rtw_rqpn rqpn_table_8723d[] = {
   2539	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
   2540	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
   2541	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
   2542	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
   2543	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
   2544	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
   2545	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
   2546	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
   2547	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
   2548	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
   2549	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
   2550	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
   2551	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
   2552	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
   2553	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
   2554};
   2555
   2556static const struct rtw_prioq_addrs prioq_addrs_8723d = {
   2557	.prio[RTW_DMA_MAPPING_EXTRA] = {
   2558		.rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
   2559	},
   2560	.prio[RTW_DMA_MAPPING_LOW] = {
   2561		.rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
   2562	},
   2563	.prio[RTW_DMA_MAPPING_NORMAL] = {
   2564		.rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
   2565	},
   2566	.prio[RTW_DMA_MAPPING_HIGH] = {
   2567		.rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
   2568	},
   2569	.wsize = false,
   2570};
   2571
   2572static const struct rtw_intf_phy_para pcie_gen1_param_8723d[] = {
   2573	{0x0008, 0x4a22,
   2574	 RTW_IP_SEL_PHY,
   2575	 RTW_INTF_PHY_CUT_ALL,
   2576	 RTW_INTF_PHY_PLATFORM_ALL},
   2577	{0x0009, 0x1000,
   2578	 RTW_IP_SEL_PHY,
   2579	 ~(RTW_INTF_PHY_CUT_A | RTW_INTF_PHY_CUT_B),
   2580	 RTW_INTF_PHY_PLATFORM_ALL},
   2581	{0xFFFF, 0x0000,
   2582	 RTW_IP_SEL_PHY,
   2583	 RTW_INTF_PHY_CUT_ALL,
   2584	 RTW_INTF_PHY_PLATFORM_ALL},
   2585};
   2586
   2587static const struct rtw_intf_phy_para_table phy_para_table_8723d = {
   2588	.gen1_para	= pcie_gen1_param_8723d,
   2589	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8723d),
   2590};
   2591
   2592static const struct rtw_hw_reg rtw8723d_dig[] = {
   2593	[0] = { .addr = 0xc50, .mask = 0x7f },
   2594	[1] = { .addr = 0xc50, .mask = 0x7f },
   2595};
   2596
   2597static const struct rtw_hw_reg rtw8723d_dig_cck[] = {
   2598	[0] = { .addr = 0xa0c, .mask = 0x3f00 },
   2599};
   2600
   2601static const struct rtw_rf_sipi_addr rtw8723d_rf_sipi_addr[] = {
   2602	[RF_PATH_A] = { .hssi_1 = 0x820, .lssi_read    = 0x8a0,
   2603			.hssi_2 = 0x824, .lssi_read_pi = 0x8b8},
   2604	[RF_PATH_B] = { .hssi_1 = 0x828, .lssi_read    = 0x8a4,
   2605			.hssi_2 = 0x82c, .lssi_read_pi = 0x8bc},
   2606};
   2607
   2608static const struct rtw_ltecoex_addr rtw8723d_ltecoex_addr = {
   2609	.ctrl = REG_LTECOEX_CTRL,
   2610	.wdata = REG_LTECOEX_WRITE_DATA,
   2611	.rdata = REG_LTECOEX_READ_DATA,
   2612};
   2613
   2614static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
   2615	[0] = { .phy_pg_tbl	= &rtw8723d_bb_pg_tbl,
   2616		.txpwr_lmt_tbl	= &rtw8723d_txpwr_lmt_tbl,},
   2617};
   2618
   2619static const u8 rtw8723d_pwrtrk_2gb_n[] = {
   2620	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
   2621	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
   2622};
   2623
   2624static const u8 rtw8723d_pwrtrk_2gb_p[] = {
   2625	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
   2626	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
   2627};
   2628
   2629static const u8 rtw8723d_pwrtrk_2ga_n[] = {
   2630	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
   2631	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
   2632};
   2633
   2634static const u8 rtw8723d_pwrtrk_2ga_p[] = {
   2635	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
   2636	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
   2637};
   2638
   2639static const u8 rtw8723d_pwrtrk_2g_cck_b_n[] = {
   2640	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
   2641	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
   2642};
   2643
   2644static const u8 rtw8723d_pwrtrk_2g_cck_b_p[] = {
   2645	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
   2646	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
   2647};
   2648
   2649static const u8 rtw8723d_pwrtrk_2g_cck_a_n[] = {
   2650	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
   2651	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
   2652};
   2653
   2654static const u8 rtw8723d_pwrtrk_2g_cck_a_p[] = {
   2655	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
   2656	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
   2657};
   2658
   2659static const s8 rtw8723d_pwrtrk_xtal_n[] = {
   2660	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   2661	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
   2662};
   2663
   2664static const s8 rtw8723d_pwrtrk_xtal_p[] = {
   2665	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   2666	0, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16
   2667};
   2668
   2669static const struct rtw_pwr_track_tbl rtw8723d_rtw_pwr_track_tbl = {
   2670	.pwrtrk_2gb_n = rtw8723d_pwrtrk_2gb_n,
   2671	.pwrtrk_2gb_p = rtw8723d_pwrtrk_2gb_p,
   2672	.pwrtrk_2ga_n = rtw8723d_pwrtrk_2ga_n,
   2673	.pwrtrk_2ga_p = rtw8723d_pwrtrk_2ga_p,
   2674	.pwrtrk_2g_cckb_n = rtw8723d_pwrtrk_2g_cck_b_n,
   2675	.pwrtrk_2g_cckb_p = rtw8723d_pwrtrk_2g_cck_b_p,
   2676	.pwrtrk_2g_ccka_n = rtw8723d_pwrtrk_2g_cck_a_n,
   2677	.pwrtrk_2g_ccka_p = rtw8723d_pwrtrk_2g_cck_a_p,
   2678	.pwrtrk_xtal_p = rtw8723d_pwrtrk_xtal_p,
   2679	.pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
   2680};
   2681
   2682static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
   2683	{0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
   2684	{0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
   2685	{0, 0, RTW_REG_DOMAIN_NL},
   2686	{0x964, BIT(1), RTW_REG_DOMAIN_MAC8},
   2687	{0x864, BIT(0), RTW_REG_DOMAIN_MAC8},
   2688	{0xab7, BIT(5), RTW_REG_DOMAIN_MAC8},
   2689	{0xa01, BIT(7), RTW_REG_DOMAIN_MAC8},
   2690	{0, 0, RTW_REG_DOMAIN_NL},
   2691	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
   2692	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
   2693	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
   2694	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
   2695	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
   2696	{0, 0, RTW_REG_DOMAIN_NL},
   2697	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
   2698	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
   2699	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
   2700	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
   2701	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
   2702};
   2703
   2704struct rtw_chip_info rtw8723d_hw_spec = {
   2705	.ops = &rtw8723d_ops,
   2706	.id = RTW_CHIP_TYPE_8723D,
   2707	.fw_name = "rtw88/rtw8723d_fw.bin",
   2708	.wlan_cpu = RTW_WCPU_11N,
   2709	.tx_pkt_desc_sz = 40,
   2710	.tx_buf_desc_sz = 16,
   2711	.rx_pkt_desc_sz = 24,
   2712	.rx_buf_desc_sz = 8,
   2713	.phy_efuse_size = 512,
   2714	.log_efuse_size = 512,
   2715	.ptct_efuse_size = 96 + 1,
   2716	.txff_size = 32768,
   2717	.rxff_size = 16384,
   2718	.txgi_factor = 1,
   2719	.is_pwr_by_rate_dec = true,
   2720	.max_power_index = 0x3f,
   2721	.csi_buf_pg_num = 0,
   2722	.band = RTW_BAND_2G,
   2723	.page_size = 128,
   2724	.dig_min = 0x20,
   2725	.ht_supported = true,
   2726	.vht_supported = false,
   2727	.lps_deep_mode_supported = 0,
   2728	.sys_func_en = 0xFD,
   2729	.pwr_on_seq = card_enable_flow_8723d,
   2730	.pwr_off_seq = card_disable_flow_8723d,
   2731	.page_table = page_table_8723d,
   2732	.rqpn_table = rqpn_table_8723d,
   2733	.prioq_addrs = &prioq_addrs_8723d,
   2734	.intf_table = &phy_para_table_8723d,
   2735	.dig = rtw8723d_dig,
   2736	.dig_cck = rtw8723d_dig_cck,
   2737	.rf_sipi_addr = {0x840, 0x844},
   2738	.rf_sipi_read_addr = rtw8723d_rf_sipi_addr,
   2739	.fix_rf_phy_num = 2,
   2740	.ltecoex_addr = &rtw8723d_ltecoex_addr,
   2741	.mac_tbl = &rtw8723d_mac_tbl,
   2742	.agc_tbl = &rtw8723d_agc_tbl,
   2743	.bb_tbl = &rtw8723d_bb_tbl,
   2744	.rf_tbl = {&rtw8723d_rf_a_tbl},
   2745	.rfe_defs = rtw8723d_rfe_defs,
   2746	.rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
   2747	.rx_ldpc = false,
   2748	.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
   2749	.iqk_threshold = 8,
   2750	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
   2751
   2752	.coex_para_ver = 0x2007022f,
   2753	.bt_desired_ver = 0x2f,
   2754	.scbd_support = true,
   2755	.new_scbd10_def = true,
   2756	.ble_hid_profile_support = false,
   2757	.wl_mimo_ps_support = false,
   2758	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
   2759	.bt_rssi_type = COEX_BTRSSI_RATIO,
   2760	.ant_isolation = 15,
   2761	.rssi_tolerance = 2,
   2762	.wl_rssi_step = wl_rssi_step_8723d,
   2763	.bt_rssi_step = bt_rssi_step_8723d,
   2764	.table_sant_num = ARRAY_SIZE(table_sant_8723d),
   2765	.table_sant = table_sant_8723d,
   2766	.table_nsant_num = ARRAY_SIZE(table_nsant_8723d),
   2767	.table_nsant = table_nsant_8723d,
   2768	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8723d),
   2769	.tdma_sant = tdma_sant_8723d,
   2770	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8723d),
   2771	.tdma_nsant = tdma_nsant_8723d,
   2772	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8723d),
   2773	.wl_rf_para_tx = rf_para_tx_8723d,
   2774	.wl_rf_para_rx = rf_para_rx_8723d,
   2775	.bt_afh_span_bw20 = 0x20,
   2776	.bt_afh_span_bw40 = 0x30,
   2777	.afh_5g_num = ARRAY_SIZE(afh_5g_8723d),
   2778	.afh_5g = afh_5g_8723d,
   2779	.btg_reg = &btg_reg_8723d,
   2780
   2781	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8723d),
   2782	.coex_info_hw_regs = coex_info_hw_regs_8723d,
   2783};
   2784EXPORT_SYMBOL(rtw8723d_hw_spec);
   2785
   2786MODULE_FIRMWARE("rtw88/rtw8723d_fw.bin");
   2787
   2788MODULE_AUTHOR("Realtek Corporation");
   2789MODULE_DESCRIPTION("Realtek 802.11n wireless 8723d driver");
   2790MODULE_LICENSE("Dual BSD/GPL");