162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright(c) 2009-2013  Realtek Corporation.*/
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "../wifi.h"
562306a36Sopenharmony_ci#include "../base.h"
662306a36Sopenharmony_ci#include "../pci.h"
762306a36Sopenharmony_ci#include "../core.h"
862306a36Sopenharmony_ci#include "reg.h"
962306a36Sopenharmony_ci#include "def.h"
1062306a36Sopenharmony_ci#include "phy.h"
1162306a36Sopenharmony_ci#include "dm.h"
1262306a36Sopenharmony_ci#include "fw.h"
1362306a36Sopenharmony_ci#include "trx.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic const u32 ofdmswing_table[OFDM_TABLE_SIZE] = {
1662306a36Sopenharmony_ci	0x7f8001fe,		/* 0, +6.0dB */
1762306a36Sopenharmony_ci	0x788001e2,		/* 1, +5.5dB */
1862306a36Sopenharmony_ci	0x71c001c7,		/* 2, +5.0dB */
1962306a36Sopenharmony_ci	0x6b8001ae,		/* 3, +4.5dB */
2062306a36Sopenharmony_ci	0x65400195,		/* 4, +4.0dB */
2162306a36Sopenharmony_ci	0x5fc0017f,		/* 5, +3.5dB */
2262306a36Sopenharmony_ci	0x5a400169,		/* 6, +3.0dB */
2362306a36Sopenharmony_ci	0x55400155,		/* 7, +2.5dB */
2462306a36Sopenharmony_ci	0x50800142,		/* 8, +2.0dB */
2562306a36Sopenharmony_ci	0x4c000130,		/* 9, +1.5dB */
2662306a36Sopenharmony_ci	0x47c0011f,		/* 10, +1.0dB */
2762306a36Sopenharmony_ci	0x43c0010f,		/* 11, +0.5dB */
2862306a36Sopenharmony_ci	0x40000100,		/* 12, +0dB */
2962306a36Sopenharmony_ci	0x3c8000f2,		/* 13, -0.5dB */
3062306a36Sopenharmony_ci	0x390000e4,		/* 14, -1.0dB */
3162306a36Sopenharmony_ci	0x35c000d7,		/* 15, -1.5dB */
3262306a36Sopenharmony_ci	0x32c000cb,		/* 16, -2.0dB */
3362306a36Sopenharmony_ci	0x300000c0,		/* 17, -2.5dB */
3462306a36Sopenharmony_ci	0x2d4000b5,		/* 18, -3.0dB */
3562306a36Sopenharmony_ci	0x2ac000ab,		/* 19, -3.5dB */
3662306a36Sopenharmony_ci	0x288000a2,		/* 20, -4.0dB */
3762306a36Sopenharmony_ci	0x26000098,		/* 21, -4.5dB */
3862306a36Sopenharmony_ci	0x24000090,		/* 22, -5.0dB */
3962306a36Sopenharmony_ci	0x22000088,		/* 23, -5.5dB */
4062306a36Sopenharmony_ci	0x20000080,		/* 24, -6.0dB */
4162306a36Sopenharmony_ci	0x1e400079,		/* 25, -6.5dB */
4262306a36Sopenharmony_ci	0x1c800072,		/* 26, -7.0dB */
4362306a36Sopenharmony_ci	0x1b00006c,		/* 27. -7.5dB */
4462306a36Sopenharmony_ci	0x19800066,		/* 28, -8.0dB */
4562306a36Sopenharmony_ci	0x18000060,		/* 29, -8.5dB */
4662306a36Sopenharmony_ci	0x16c0005b,		/* 30, -9.0dB */
4762306a36Sopenharmony_ci	0x15800056,		/* 31, -9.5dB */
4862306a36Sopenharmony_ci	0x14400051,		/* 32, -10.0dB */
4962306a36Sopenharmony_ci	0x1300004c,		/* 33, -10.5dB */
5062306a36Sopenharmony_ci	0x12000048,		/* 34, -11.0dB */
5162306a36Sopenharmony_ci	0x11000044,		/* 35, -11.5dB */
5262306a36Sopenharmony_ci	0x10000040,		/* 36, -12.0dB */
5362306a36Sopenharmony_ci	0x0f00003c,		/* 37, -12.5dB */
5462306a36Sopenharmony_ci	0x0e400039,		/* 38, -13.0dB */
5562306a36Sopenharmony_ci	0x0d800036,		/* 39, -13.5dB */
5662306a36Sopenharmony_ci	0x0cc00033,		/* 40, -14.0dB */
5762306a36Sopenharmony_ci	0x0c000030,		/* 41, -14.5dB */
5862306a36Sopenharmony_ci	0x0b40002d,		/* 42, -15.0dB */
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic const u8 cck_tbl_ch1_13[CCK_TABLE_SIZE][8] = {
6262306a36Sopenharmony_ci	{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},	/* 0, +0dB */
6362306a36Sopenharmony_ci	{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},	/* 1, -0.5dB */
6462306a36Sopenharmony_ci	{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},	/* 2, -1.0dB */
6562306a36Sopenharmony_ci	{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},	/* 3, -1.5dB */
6662306a36Sopenharmony_ci	{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},	/* 4, -2.0dB */
6762306a36Sopenharmony_ci	{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},	/* 5, -2.5dB */
6862306a36Sopenharmony_ci	{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},	/* 6, -3.0dB */
6962306a36Sopenharmony_ci	{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},	/* 7, -3.5dB */
7062306a36Sopenharmony_ci	{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},	/* 8, -4.0dB */
7162306a36Sopenharmony_ci	{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},	/* 9, -4.5dB */
7262306a36Sopenharmony_ci	{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},	/* 10, -5.0dB */
7362306a36Sopenharmony_ci	{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},	/* 11, -5.5dB */
7462306a36Sopenharmony_ci	{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},	/* 12, -6.0dB */
7562306a36Sopenharmony_ci	{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},	/* 13, -6.5dB */
7662306a36Sopenharmony_ci	{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},	/* 14, -7.0dB */
7762306a36Sopenharmony_ci	{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},	/* 15, -7.5dB */
7862306a36Sopenharmony_ci	{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},	/* 16, -8.0dB */
7962306a36Sopenharmony_ci	{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},	/* 17, -8.5dB */
8062306a36Sopenharmony_ci	{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},	/* 18, -9.0dB */
8162306a36Sopenharmony_ci	{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},	/* 19, -9.5dB */
8262306a36Sopenharmony_ci	{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},	/* 20, -10.0dB*/
8362306a36Sopenharmony_ci	{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},	/* 21, -10.5dB*/
8462306a36Sopenharmony_ci	{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},	/* 22, -11.0dB*/
8562306a36Sopenharmony_ci	{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},	/* 23, -11.5dB*/
8662306a36Sopenharmony_ci	{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},	/* 24, -12.0dB*/
8762306a36Sopenharmony_ci	{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},	/* 25, -12.5dB*/
8862306a36Sopenharmony_ci	{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},	/* 26, -13.0dB*/
8962306a36Sopenharmony_ci	{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},	/* 27, -13.5dB*/
9062306a36Sopenharmony_ci	{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},	/* 28, -14.0dB*/
9162306a36Sopenharmony_ci	{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},	/* 29, -14.5dB*/
9262306a36Sopenharmony_ci	{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},	/* 30, -15.0dB*/
9362306a36Sopenharmony_ci	{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},	/* 31, -15.5dB*/
9462306a36Sopenharmony_ci	{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}	/* 32, -16.0dB*/
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic const u8 cck_tbl_ch14[CCK_TABLE_SIZE][8] = {
9862306a36Sopenharmony_ci	{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},	/* 0, +0dB */
9962306a36Sopenharmony_ci	{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},	/* 1, -0.5dB */
10062306a36Sopenharmony_ci	{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},	/* 2, -1.0dB */
10162306a36Sopenharmony_ci	{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},	/* 3, -1.5dB */
10262306a36Sopenharmony_ci	{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},	/* 4, -2.0dB */
10362306a36Sopenharmony_ci	{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},	/* 5, -2.5dB */
10462306a36Sopenharmony_ci	{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},	/* 6, -3.0dB */
10562306a36Sopenharmony_ci	{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},	/* 7, -3.5dB */
10662306a36Sopenharmony_ci	{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},	/* 8, -4.0dB */
10762306a36Sopenharmony_ci	{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},	/* 9, -4.5dB */
10862306a36Sopenharmony_ci	{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},	/* 10, -5.0dB */
10962306a36Sopenharmony_ci	{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},	/* 11, -5.5dB */
11062306a36Sopenharmony_ci	{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},	/* 12, -6.0dB */
11162306a36Sopenharmony_ci	{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},	/* 13, -6.5dB */
11262306a36Sopenharmony_ci	{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},	/* 14, -7.0dB */
11362306a36Sopenharmony_ci	{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},	/* 15, -7.5dB */
11462306a36Sopenharmony_ci	{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},	/* 16, -8.0dB */
11562306a36Sopenharmony_ci	{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},	/* 17, -8.5dB */
11662306a36Sopenharmony_ci	{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},	/* 18, -9.0dB */
11762306a36Sopenharmony_ci	{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},	/* 19, -9.5dB */
11862306a36Sopenharmony_ci	{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},	/* 20, -10.0dB*/
11962306a36Sopenharmony_ci	{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},	/* 21, -10.5dB*/
12062306a36Sopenharmony_ci	{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},	/* 22, -11.0dB*/
12162306a36Sopenharmony_ci	{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},	/* 23, -11.5dB*/
12262306a36Sopenharmony_ci	{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},	/* 24, -12.0dB*/
12362306a36Sopenharmony_ci	{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},	/* 25, -12.5dB*/
12462306a36Sopenharmony_ci	{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},	/* 26, -13.0dB*/
12562306a36Sopenharmony_ci	{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},	/* 27, -13.5dB*/
12662306a36Sopenharmony_ci	{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},	/* 28, -14.0dB*/
12762306a36Sopenharmony_ci	{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},	/* 29, -14.5dB*/
12862306a36Sopenharmony_ci	{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},	/* 30, -15.0dB*/
12962306a36Sopenharmony_ci	{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},	/* 31, -15.5dB*/
13062306a36Sopenharmony_ci	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}	/* 32, -16.0dB*/
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci#define	CAL_SWING_OFF(_off, _dir, _size, _del)				\
13462306a36Sopenharmony_ci	do {								\
13562306a36Sopenharmony_ci		for (_off = 0; _off < _size; _off++) {			\
13662306a36Sopenharmony_ci			if (_del < thermal_threshold[_dir][_off]) {	\
13762306a36Sopenharmony_ci				if (_off != 0)				\
13862306a36Sopenharmony_ci					_off--;				\
13962306a36Sopenharmony_ci				break;					\
14062306a36Sopenharmony_ci			}						\
14162306a36Sopenharmony_ci		}							\
14262306a36Sopenharmony_ci		if (_off >= _size)					\
14362306a36Sopenharmony_ci			_off = _size - 1;				\
14462306a36Sopenharmony_ci	} while (0)
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
14762306a36Sopenharmony_ci				  u8 ofdm_index, u8 rfpath,
14862306a36Sopenharmony_ci				  long iqk_result_x, long iqk_result_y)
14962306a36Sopenharmony_ci{
15062306a36Sopenharmony_ci	long ele_a = 0, ele_d, ele_c = 0, value32;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	ele_d = (ofdmswing_table[ofdm_index] & 0xFFC00000)>>22;
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	if (iqk_result_x != 0) {
15562306a36Sopenharmony_ci		if ((iqk_result_x & 0x00000200) != 0)
15662306a36Sopenharmony_ci			iqk_result_x = iqk_result_x | 0xFFFFFC00;
15762306a36Sopenharmony_ci		ele_a = ((iqk_result_x * ele_d)>>8)&0x000003FF;
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci		if ((iqk_result_y & 0x00000200) != 0)
16062306a36Sopenharmony_ci			iqk_result_y = iqk_result_y | 0xFFFFFC00;
16162306a36Sopenharmony_ci		ele_c = ((iqk_result_y * ele_d)>>8)&0x000003FF;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci		switch (rfpath) {
16462306a36Sopenharmony_ci		case RF90_PATH_A:
16562306a36Sopenharmony_ci			value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
16662306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
16762306a36Sopenharmony_ci				      MASKDWORD, value32);
16862306a36Sopenharmony_ci			value32 = (ele_c & 0x000003C0) >> 6;
16962306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
17062306a36Sopenharmony_ci				      value32);
17162306a36Sopenharmony_ci			value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
17262306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
17362306a36Sopenharmony_ci				      value32);
17462306a36Sopenharmony_ci			break;
17562306a36Sopenharmony_ci		case RF90_PATH_B:
17662306a36Sopenharmony_ci			value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
17762306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
17862306a36Sopenharmony_ci				      value32);
17962306a36Sopenharmony_ci			value32 = (ele_c & 0x000003C0) >> 6;
18062306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, value32);
18162306a36Sopenharmony_ci			value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
18262306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
18362306a36Sopenharmony_ci				      value32);
18462306a36Sopenharmony_ci			break;
18562306a36Sopenharmony_ci		default:
18662306a36Sopenharmony_ci			break;
18762306a36Sopenharmony_ci		}
18862306a36Sopenharmony_ci	} else {
18962306a36Sopenharmony_ci		switch (rfpath) {
19062306a36Sopenharmony_ci		case RF90_PATH_A:
19162306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
19262306a36Sopenharmony_ci				      MASKDWORD, ofdmswing_table[ofdm_index]);
19362306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XCTXAFE,
19462306a36Sopenharmony_ci				      MASKH4BITS, 0x00);
19562306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
19662306a36Sopenharmony_ci				      BIT(24), 0x00);
19762306a36Sopenharmony_ci			break;
19862306a36Sopenharmony_ci		case RF90_PATH_B:
19962306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
20062306a36Sopenharmony_ci				      MASKDWORD, ofdmswing_table[ofdm_index]);
20162306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
20262306a36Sopenharmony_ci				      MASKH4BITS, 0x00);
20362306a36Sopenharmony_ci			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
20462306a36Sopenharmony_ci				      BIT(28), 0x00);
20562306a36Sopenharmony_ci			break;
20662306a36Sopenharmony_ci		default:
20762306a36Sopenharmony_ci			break;
20862306a36Sopenharmony_ci		}
20962306a36Sopenharmony_ci	}
21062306a36Sopenharmony_ci}
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_civoid rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
21362306a36Sopenharmony_ci	u8 type, u8 *pdirection, u32 *poutwrite_val)
21462306a36Sopenharmony_ci{
21562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
21662306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
21762306a36Sopenharmony_ci	u8 pwr_val = 0;
21862306a36Sopenharmony_ci	u8 cck_base = rtldm->swing_idx_cck_base;
21962306a36Sopenharmony_ci	u8 cck_val = rtldm->swing_idx_cck;
22062306a36Sopenharmony_ci	u8 ofdm_base = rtldm->swing_idx_ofdm_base[0];
22162306a36Sopenharmony_ci	u8 ofdm_val = rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A];
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	if (type == 0) {
22462306a36Sopenharmony_ci		if (ofdm_val <= ofdm_base) {
22562306a36Sopenharmony_ci			*pdirection = 1;
22662306a36Sopenharmony_ci			pwr_val = ofdm_base - ofdm_val;
22762306a36Sopenharmony_ci		} else {
22862306a36Sopenharmony_ci			*pdirection = 2;
22962306a36Sopenharmony_ci			pwr_val = ofdm_base - ofdm_val;
23062306a36Sopenharmony_ci		}
23162306a36Sopenharmony_ci	} else if (type == 1) {
23262306a36Sopenharmony_ci		if (cck_val <= cck_base) {
23362306a36Sopenharmony_ci			*pdirection = 1;
23462306a36Sopenharmony_ci			pwr_val = cck_base - cck_val;
23562306a36Sopenharmony_ci		} else {
23662306a36Sopenharmony_ci			*pdirection = 2;
23762306a36Sopenharmony_ci			pwr_val = cck_val - cck_base;
23862306a36Sopenharmony_ci		}
23962306a36Sopenharmony_ci	}
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	if (pwr_val >= TXPWRTRACK_MAX_IDX && (*pdirection == 1))
24262306a36Sopenharmony_ci		pwr_val = TXPWRTRACK_MAX_IDX;
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	*poutwrite_val = pwr_val | (pwr_val << 8) | (pwr_val << 16) |
24562306a36Sopenharmony_ci			 (pwr_val << 24);
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic void dm_tx_pwr_track_set_pwr(struct ieee80211_hw *hw,
24962306a36Sopenharmony_ci				    enum pwr_track_control_method method,
25062306a36Sopenharmony_ci				    u8 rfpath, u8 channel_mapped_index)
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
25362306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
25462306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	if (method == TXAGC) {
25762306a36Sopenharmony_ci		if (rtldm->swing_flag_ofdm ||
25862306a36Sopenharmony_ci		    rtldm->swing_flag_cck) {
25962306a36Sopenharmony_ci			rtl88e_phy_set_txpower_level(hw,
26062306a36Sopenharmony_ci						     rtlphy->current_channel);
26162306a36Sopenharmony_ci			rtldm->swing_flag_ofdm = false;
26262306a36Sopenharmony_ci			rtldm->swing_flag_cck = false;
26362306a36Sopenharmony_ci		}
26462306a36Sopenharmony_ci	} else if (method == BBSWING) {
26562306a36Sopenharmony_ci		if (!rtldm->cck_inch14) {
26662306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa22,
26762306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][0]);
26862306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa23,
26962306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][1]);
27062306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa24,
27162306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][2]);
27262306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa25,
27362306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][3]);
27462306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa26,
27562306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][4]);
27662306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa27,
27762306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][5]);
27862306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa28,
27962306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][6]);
28062306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa29,
28162306a36Sopenharmony_ci				       cck_tbl_ch1_13[rtldm->swing_idx_cck][7]);
28262306a36Sopenharmony_ci		} else {
28362306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa22,
28462306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][0]);
28562306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa23,
28662306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][1]);
28762306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa24,
28862306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][2]);
28962306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa25,
29062306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][3]);
29162306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa26,
29262306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][4]);
29362306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa27,
29462306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][5]);
29562306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa28,
29662306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][6]);
29762306a36Sopenharmony_ci			rtl_write_byte(rtlpriv, 0xa29,
29862306a36Sopenharmony_ci				       cck_tbl_ch14[rtldm->swing_idx_cck][7]);
29962306a36Sopenharmony_ci		}
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci		if (rfpath == RF90_PATH_A) {
30262306a36Sopenharmony_ci			rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
30362306a36Sopenharmony_ci					      rfpath, rtlphy->iqk_matrix
30462306a36Sopenharmony_ci					      [channel_mapped_index].
30562306a36Sopenharmony_ci					      value[0][0],
30662306a36Sopenharmony_ci					      rtlphy->iqk_matrix
30762306a36Sopenharmony_ci					      [channel_mapped_index].
30862306a36Sopenharmony_ci					      value[0][1]);
30962306a36Sopenharmony_ci		} else if (rfpath == RF90_PATH_B) {
31062306a36Sopenharmony_ci			rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
31162306a36Sopenharmony_ci					      rfpath, rtlphy->iqk_matrix
31262306a36Sopenharmony_ci					      [channel_mapped_index].
31362306a36Sopenharmony_ci					      value[0][4],
31462306a36Sopenharmony_ci					      rtlphy->iqk_matrix
31562306a36Sopenharmony_ci					      [channel_mapped_index].
31662306a36Sopenharmony_ci					      value[0][5]);
31762306a36Sopenharmony_ci		}
31862306a36Sopenharmony_ci	} else {
31962306a36Sopenharmony_ci		return;
32062306a36Sopenharmony_ci	}
32162306a36Sopenharmony_ci}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic u8 rtl88e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
32462306a36Sopenharmony_ci{
32562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
32662306a36Sopenharmony_ci	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
32762306a36Sopenharmony_ci	long rssi_val_min = 0;
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	if ((dm_dig->curmultista_cstate == DIG_MULTISTA_CONNECT) &&
33062306a36Sopenharmony_ci	    (dm_dig->cur_sta_cstate == DIG_STA_CONNECT)) {
33162306a36Sopenharmony_ci		if (rtlpriv->dm.entry_min_undec_sm_pwdb != 0)
33262306a36Sopenharmony_ci			rssi_val_min =
33362306a36Sopenharmony_ci			    (rtlpriv->dm.entry_min_undec_sm_pwdb >
33462306a36Sopenharmony_ci			     rtlpriv->dm.undec_sm_pwdb) ?
33562306a36Sopenharmony_ci			    rtlpriv->dm.undec_sm_pwdb :
33662306a36Sopenharmony_ci			    rtlpriv->dm.entry_min_undec_sm_pwdb;
33762306a36Sopenharmony_ci		else
33862306a36Sopenharmony_ci			rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
33962306a36Sopenharmony_ci	} else if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT ||
34062306a36Sopenharmony_ci		   dm_dig->cur_sta_cstate == DIG_STA_BEFORE_CONNECT) {
34162306a36Sopenharmony_ci		rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
34262306a36Sopenharmony_ci	} else if (dm_dig->curmultista_cstate ==
34362306a36Sopenharmony_ci		DIG_MULTISTA_CONNECT) {
34462306a36Sopenharmony_ci		rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
34562306a36Sopenharmony_ci	}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	return (u8)rssi_val_min;
34862306a36Sopenharmony_ci}
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistatic void rtl88e_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
35162306a36Sopenharmony_ci{
35262306a36Sopenharmony_ci	u32 ret_value;
35362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
35462306a36Sopenharmony_ci	struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 1);
35762306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 1);
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD);
36062306a36Sopenharmony_ci	falsealm_cnt->cnt_fast_fsync_fail = (ret_value&0xffff);
36162306a36Sopenharmony_ci	falsealm_cnt->cnt_sb_search_fail = ((ret_value&0xffff0000)>>16);
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER1, MASKDWORD);
36462306a36Sopenharmony_ci	falsealm_cnt->cnt_ofdm_cca = (ret_value&0xffff);
36562306a36Sopenharmony_ci	falsealm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER2, MASKDWORD);
36862306a36Sopenharmony_ci	falsealm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
36962306a36Sopenharmony_ci	falsealm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
37262306a36Sopenharmony_ci	falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
37362306a36Sopenharmony_ci	falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
37462306a36Sopenharmony_ci		falsealm_cnt->cnt_rate_illegal +
37562306a36Sopenharmony_ci		falsealm_cnt->cnt_crc8_fail +
37662306a36Sopenharmony_ci		falsealm_cnt->cnt_mcs_fail +
37762306a36Sopenharmony_ci		falsealm_cnt->cnt_fast_fsync_fail +
37862306a36Sopenharmony_ci		falsealm_cnt->cnt_sb_search_fail;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, REG_SC_CNT, MASKDWORD);
38162306a36Sopenharmony_ci	falsealm_cnt->cnt_bw_lsc = (ret_value & 0xffff);
38262306a36Sopenharmony_ci	falsealm_cnt->cnt_bw_usc = ((ret_value & 0xffff0000) >> 16);
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(12), 1);
38562306a36Sopenharmony_ci	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
38862306a36Sopenharmony_ci	falsealm_cnt->cnt_cck_fail = ret_value;
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERUPPER, MASKBYTE3);
39162306a36Sopenharmony_ci	falsealm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	ret_value = rtl_get_bbreg(hw, RCCK0_CCA_CNT, MASKDWORD);
39462306a36Sopenharmony_ci	falsealm_cnt->cnt_cck_cca = ((ret_value & 0xff) << 8) |
39562306a36Sopenharmony_ci		((ret_value&0xFF00)>>8);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci	falsealm_cnt->cnt_all = (falsealm_cnt->cnt_fast_fsync_fail +
39862306a36Sopenharmony_ci				falsealm_cnt->cnt_sb_search_fail +
39962306a36Sopenharmony_ci				falsealm_cnt->cnt_parity_fail +
40062306a36Sopenharmony_ci				falsealm_cnt->cnt_rate_illegal +
40162306a36Sopenharmony_ci				falsealm_cnt->cnt_crc8_fail +
40262306a36Sopenharmony_ci				falsealm_cnt->cnt_mcs_fail +
40362306a36Sopenharmony_ci				falsealm_cnt->cnt_cck_fail);
40462306a36Sopenharmony_ci	falsealm_cnt->cnt_cca_all = falsealm_cnt->cnt_ofdm_cca +
40562306a36Sopenharmony_ci		falsealm_cnt->cnt_cck_cca;
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 1);
40862306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 0);
40962306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(27), 1);
41062306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(27), 0);
41162306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 0);
41262306a36Sopenharmony_ci	rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 0);
41362306a36Sopenharmony_ci	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(13)|BIT(12), 0);
41462306a36Sopenharmony_ci	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(13)|BIT(12), 2);
41562306a36Sopenharmony_ci	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 0);
41662306a36Sopenharmony_ci	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 2);
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_DIG, DBG_TRACE,
41962306a36Sopenharmony_ci		"cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
42062306a36Sopenharmony_ci		falsealm_cnt->cnt_parity_fail,
42162306a36Sopenharmony_ci		falsealm_cnt->cnt_rate_illegal,
42262306a36Sopenharmony_ci		falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_DIG, DBG_TRACE,
42562306a36Sopenharmony_ci		"cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
42662306a36Sopenharmony_ci		falsealm_cnt->cnt_ofdm_fail,
42762306a36Sopenharmony_ci		falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
42862306a36Sopenharmony_ci}
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_cistatic void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
43162306a36Sopenharmony_ci{
43262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
43362306a36Sopenharmony_ci	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
43462306a36Sopenharmony_ci	u8 cur_cck_cca_thresh;
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci	if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
43762306a36Sopenharmony_ci		dm_dig->rssi_val_min = rtl88e_dm_initial_gain_min_pwdb(hw);
43862306a36Sopenharmony_ci		if (dm_dig->rssi_val_min > 25) {
43962306a36Sopenharmony_ci			cur_cck_cca_thresh = 0xcd;
44062306a36Sopenharmony_ci		} else if ((dm_dig->rssi_val_min <= 25) &&
44162306a36Sopenharmony_ci			   (dm_dig->rssi_val_min > 10)) {
44262306a36Sopenharmony_ci			cur_cck_cca_thresh = 0x83;
44362306a36Sopenharmony_ci		} else {
44462306a36Sopenharmony_ci			if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
44562306a36Sopenharmony_ci				cur_cck_cca_thresh = 0x83;
44662306a36Sopenharmony_ci			else
44762306a36Sopenharmony_ci				cur_cck_cca_thresh = 0x40;
44862306a36Sopenharmony_ci		}
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	} else {
45162306a36Sopenharmony_ci		if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
45262306a36Sopenharmony_ci			cur_cck_cca_thresh = 0x83;
45362306a36Sopenharmony_ci		else
45462306a36Sopenharmony_ci			cur_cck_cca_thresh = 0x40;
45562306a36Sopenharmony_ci	}
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci	if (dm_dig->cur_cck_cca_thres != cur_cck_cca_thresh)
45862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, cur_cck_cca_thresh);
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci	dm_dig->cur_cck_cca_thres = cur_cck_cca_thresh;
46162306a36Sopenharmony_ci	dm_dig->pre_cck_cca_thres = dm_dig->cur_cck_cca_thres;
46262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_DIG, DBG_TRACE,
46362306a36Sopenharmony_ci		"CCK cca thresh hold =%x\n", dm_dig->cur_cck_cca_thres);
46462306a36Sopenharmony_ci}
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_cistatic void rtl88e_dm_dig(struct ieee80211_hw *hw)
46762306a36Sopenharmony_ci{
46862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
46962306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
47062306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
47162306a36Sopenharmony_ci	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
47262306a36Sopenharmony_ci	u8 dig_dynamic_min, dig_maxofmin;
47362306a36Sopenharmony_ci	bool bfirstconnect;
47462306a36Sopenharmony_ci	u8 dm_dig_max, dm_dig_min;
47562306a36Sopenharmony_ci	u8 current_igi = dm_dig->cur_igvalue;
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci	if (!rtlpriv->dm.dm_initialgain_enable)
47862306a36Sopenharmony_ci		return;
47962306a36Sopenharmony_ci	if (!dm_dig->dig_enable_flag)
48062306a36Sopenharmony_ci		return;
48162306a36Sopenharmony_ci	if (mac->act_scanning)
48262306a36Sopenharmony_ci		return;
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	if (mac->link_state >= MAC80211_LINKED)
48562306a36Sopenharmony_ci		dm_dig->cur_sta_cstate = DIG_STA_CONNECT;
48662306a36Sopenharmony_ci	else
48762306a36Sopenharmony_ci		dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
48862306a36Sopenharmony_ci	if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
48962306a36Sopenharmony_ci	    rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
49062306a36Sopenharmony_ci		dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	dm_dig_max = DM_DIG_MAX;
49362306a36Sopenharmony_ci	dm_dig_min = DM_DIG_MIN;
49462306a36Sopenharmony_ci	dig_maxofmin = DM_DIG_MAX_AP;
49562306a36Sopenharmony_ci	dig_dynamic_min = dm_dig->dig_min_0;
49662306a36Sopenharmony_ci	bfirstconnect = ((mac->link_state >= MAC80211_LINKED) ? true : false) &&
49762306a36Sopenharmony_ci			 !dm_dig->media_connect_0;
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci	dm_dig->rssi_val_min =
50062306a36Sopenharmony_ci		rtl88e_dm_initial_gain_min_pwdb(hw);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	if (mac->link_state >= MAC80211_LINKED) {
50362306a36Sopenharmony_ci		if ((dm_dig->rssi_val_min + 20) > dm_dig_max)
50462306a36Sopenharmony_ci			dm_dig->rx_gain_max = dm_dig_max;
50562306a36Sopenharmony_ci		else if ((dm_dig->rssi_val_min + 20) < dm_dig_min)
50662306a36Sopenharmony_ci			dm_dig->rx_gain_max = dm_dig_min;
50762306a36Sopenharmony_ci		else
50862306a36Sopenharmony_ci			dm_dig->rx_gain_max = dm_dig->rssi_val_min + 20;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci		if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
51162306a36Sopenharmony_ci			dig_dynamic_min  = dm_dig->antdiv_rssi_max;
51262306a36Sopenharmony_ci		} else {
51362306a36Sopenharmony_ci			if (dm_dig->rssi_val_min < dm_dig_min)
51462306a36Sopenharmony_ci				dig_dynamic_min = dm_dig_min;
51562306a36Sopenharmony_ci			else if (dm_dig->rssi_val_min < dig_maxofmin)
51662306a36Sopenharmony_ci				dig_dynamic_min = dig_maxofmin;
51762306a36Sopenharmony_ci			else
51862306a36Sopenharmony_ci				dig_dynamic_min = dm_dig->rssi_val_min;
51962306a36Sopenharmony_ci		}
52062306a36Sopenharmony_ci	} else {
52162306a36Sopenharmony_ci		dm_dig->rx_gain_max = dm_dig_max;
52262306a36Sopenharmony_ci		dig_dynamic_min = dm_dig_min;
52362306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
52462306a36Sopenharmony_ci	}
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci	if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
52762306a36Sopenharmony_ci		dm_dig->large_fa_hit++;
52862306a36Sopenharmony_ci		if (dm_dig->forbidden_igi < current_igi) {
52962306a36Sopenharmony_ci			dm_dig->forbidden_igi = current_igi;
53062306a36Sopenharmony_ci			dm_dig->large_fa_hit = 1;
53162306a36Sopenharmony_ci		}
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci		if (dm_dig->large_fa_hit >= 3) {
53462306a36Sopenharmony_ci			if ((dm_dig->forbidden_igi + 1) >
53562306a36Sopenharmony_ci				dm_dig->rx_gain_max)
53662306a36Sopenharmony_ci				dm_dig->rx_gain_min =
53762306a36Sopenharmony_ci					dm_dig->rx_gain_max;
53862306a36Sopenharmony_ci			else
53962306a36Sopenharmony_ci				dm_dig->rx_gain_min =
54062306a36Sopenharmony_ci					dm_dig->forbidden_igi + 1;
54162306a36Sopenharmony_ci			dm_dig->recover_cnt = 3600;
54262306a36Sopenharmony_ci		}
54362306a36Sopenharmony_ci	} else {
54462306a36Sopenharmony_ci		if (dm_dig->recover_cnt != 0) {
54562306a36Sopenharmony_ci			dm_dig->recover_cnt--;
54662306a36Sopenharmony_ci		} else {
54762306a36Sopenharmony_ci			if (dm_dig->large_fa_hit == 0) {
54862306a36Sopenharmony_ci				if ((dm_dig->forbidden_igi - 1) <
54962306a36Sopenharmony_ci				    dig_dynamic_min) {
55062306a36Sopenharmony_ci					dm_dig->forbidden_igi = dig_dynamic_min;
55162306a36Sopenharmony_ci					dm_dig->rx_gain_min = dig_dynamic_min;
55262306a36Sopenharmony_ci				} else {
55362306a36Sopenharmony_ci					dm_dig->forbidden_igi--;
55462306a36Sopenharmony_ci					dm_dig->rx_gain_min =
55562306a36Sopenharmony_ci						dm_dig->forbidden_igi + 1;
55662306a36Sopenharmony_ci				}
55762306a36Sopenharmony_ci			} else if (dm_dig->large_fa_hit == 3) {
55862306a36Sopenharmony_ci				dm_dig->large_fa_hit = 0;
55962306a36Sopenharmony_ci			}
56062306a36Sopenharmony_ci		}
56162306a36Sopenharmony_ci	}
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci	if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
56462306a36Sopenharmony_ci		if (bfirstconnect) {
56562306a36Sopenharmony_ci			current_igi = dm_dig->rssi_val_min;
56662306a36Sopenharmony_ci		} else {
56762306a36Sopenharmony_ci			if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH2)
56862306a36Sopenharmony_ci				current_igi += 2;
56962306a36Sopenharmony_ci			else if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH1)
57062306a36Sopenharmony_ci				current_igi++;
57162306a36Sopenharmony_ci			else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
57262306a36Sopenharmony_ci				current_igi--;
57362306a36Sopenharmony_ci		}
57462306a36Sopenharmony_ci	} else {
57562306a36Sopenharmony_ci		if (rtlpriv->falsealm_cnt.cnt_all > 10000)
57662306a36Sopenharmony_ci			current_igi += 2;
57762306a36Sopenharmony_ci		else if (rtlpriv->falsealm_cnt.cnt_all > 8000)
57862306a36Sopenharmony_ci			current_igi++;
57962306a36Sopenharmony_ci		else if (rtlpriv->falsealm_cnt.cnt_all < 500)
58062306a36Sopenharmony_ci			current_igi--;
58162306a36Sopenharmony_ci	}
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	if (current_igi > DM_DIG_FA_UPPER)
58462306a36Sopenharmony_ci		current_igi = DM_DIG_FA_UPPER;
58562306a36Sopenharmony_ci	else if (current_igi < DM_DIG_FA_LOWER)
58662306a36Sopenharmony_ci		current_igi = DM_DIG_FA_LOWER;
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci	if (rtlpriv->falsealm_cnt.cnt_all > 10000)
58962306a36Sopenharmony_ci		current_igi = DM_DIG_FA_UPPER;
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci	dm_dig->cur_igvalue = current_igi;
59262306a36Sopenharmony_ci	rtl88e_dm_write_dig(hw);
59362306a36Sopenharmony_ci	dm_dig->media_connect_0 =
59462306a36Sopenharmony_ci		((mac->link_state >= MAC80211_LINKED) ? true : false);
59562306a36Sopenharmony_ci	dm_dig->dig_min_0 = dig_dynamic_min;
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci	rtl88e_dm_cck_packet_detection_thresh(hw);
59862306a36Sopenharmony_ci}
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_cistatic void rtl88e_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
60162306a36Sopenharmony_ci{
60262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci	rtlpriv->dm.dynamic_txpower_enable = false;
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
60762306a36Sopenharmony_ci	rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
60862306a36Sopenharmony_ci}
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_cistatic void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
61162306a36Sopenharmony_ci{
61262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
61362306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
61462306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
61562306a36Sopenharmony_ci	long undec_sm_pwdb;
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci	if (!rtlpriv->dm.dynamic_txpower_enable)
61862306a36Sopenharmony_ci		return;
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) {
62162306a36Sopenharmony_ci		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
62262306a36Sopenharmony_ci		return;
62362306a36Sopenharmony_ci	}
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci	if ((mac->link_state < MAC80211_LINKED) &&
62662306a36Sopenharmony_ci	    (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
62762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
62862306a36Sopenharmony_ci			"Not connected to any\n");
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci		rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
63362306a36Sopenharmony_ci		return;
63462306a36Sopenharmony_ci	}
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci	if (mac->link_state >= MAC80211_LINKED) {
63762306a36Sopenharmony_ci		if (mac->opmode == NL80211_IFTYPE_ADHOC) {
63862306a36Sopenharmony_ci			undec_sm_pwdb =
63962306a36Sopenharmony_ci			    rtlpriv->dm.entry_min_undec_sm_pwdb;
64062306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
64162306a36Sopenharmony_ci				"AP Client PWDB = 0x%lx\n",
64262306a36Sopenharmony_ci				undec_sm_pwdb);
64362306a36Sopenharmony_ci		} else {
64462306a36Sopenharmony_ci			undec_sm_pwdb =
64562306a36Sopenharmony_ci			    rtlpriv->dm.undec_sm_pwdb;
64662306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
64762306a36Sopenharmony_ci				"STA Default Port PWDB = 0x%lx\n",
64862306a36Sopenharmony_ci				undec_sm_pwdb);
64962306a36Sopenharmony_ci		}
65062306a36Sopenharmony_ci	} else {
65162306a36Sopenharmony_ci		undec_sm_pwdb =
65262306a36Sopenharmony_ci		    rtlpriv->dm.entry_min_undec_sm_pwdb;
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
65562306a36Sopenharmony_ci			"AP Ext Port PWDB = 0x%lx\n",
65662306a36Sopenharmony_ci			undec_sm_pwdb);
65762306a36Sopenharmony_ci	}
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
66062306a36Sopenharmony_ci		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
66162306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
66262306a36Sopenharmony_ci			"TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x0)\n");
66362306a36Sopenharmony_ci	} else if ((undec_sm_pwdb <
66462306a36Sopenharmony_ci		    (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
66562306a36Sopenharmony_ci		   (undec_sm_pwdb >=
66662306a36Sopenharmony_ci		    TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
66762306a36Sopenharmony_ci		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
66862306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
66962306a36Sopenharmony_ci			"TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x10)\n");
67062306a36Sopenharmony_ci	} else if (undec_sm_pwdb <
67162306a36Sopenharmony_ci		   (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
67262306a36Sopenharmony_ci		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
67362306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
67462306a36Sopenharmony_ci			"TXHIGHPWRLEVEL_NORMAL\n");
67562306a36Sopenharmony_ci	}
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	if ((rtlpriv->dm.dynamic_txhighpower_lvl !=
67862306a36Sopenharmony_ci		rtlpriv->dm.last_dtp_lvl)) {
67962306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
68062306a36Sopenharmony_ci			"PHY_SetTxPowerLevel8192S() Channel = %d\n",
68162306a36Sopenharmony_ci			  rtlphy->current_channel);
68262306a36Sopenharmony_ci		rtl88e_phy_set_txpower_level(hw, rtlphy->current_channel);
68362306a36Sopenharmony_ci	}
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
68662306a36Sopenharmony_ci}
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_civoid rtl88e_dm_write_dig(struct ieee80211_hw *hw)
68962306a36Sopenharmony_ci{
69062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
69162306a36Sopenharmony_ci	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
69462306a36Sopenharmony_ci		"cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
69562306a36Sopenharmony_ci		 dm_dig->cur_igvalue, dm_dig->pre_igvalue,
69662306a36Sopenharmony_ci		 dm_dig->back_val);
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci	if (dm_dig->cur_igvalue > 0x3f)
69962306a36Sopenharmony_ci		dm_dig->cur_igvalue = 0x3f;
70062306a36Sopenharmony_ci	if (dm_dig->pre_igvalue != dm_dig->cur_igvalue) {
70162306a36Sopenharmony_ci		rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
70262306a36Sopenharmony_ci			      dm_dig->cur_igvalue);
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci		dm_dig->pre_igvalue = dm_dig->cur_igvalue;
70562306a36Sopenharmony_ci	}
70662306a36Sopenharmony_ci}
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_cistatic void rtl88e_dm_pwdb_monitor(struct ieee80211_hw *hw)
70962306a36Sopenharmony_ci{
71062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
71162306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
71262306a36Sopenharmony_ci	struct rtl_sta_info *drv_priv;
71362306a36Sopenharmony_ci	static u64 last_record_txok_cnt;
71462306a36Sopenharmony_ci	static u64 last_record_rxok_cnt;
71562306a36Sopenharmony_ci	long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci	if (rtlhal->oem_id == RT_CID_819X_HP) {
71862306a36Sopenharmony_ci		u64 cur_txok_cnt = 0;
71962306a36Sopenharmony_ci		u64 cur_rxok_cnt = 0;
72062306a36Sopenharmony_ci		cur_txok_cnt = rtlpriv->stats.txbytesunicast -
72162306a36Sopenharmony_ci			last_record_txok_cnt;
72262306a36Sopenharmony_ci		cur_rxok_cnt = rtlpriv->stats.rxbytesunicast -
72362306a36Sopenharmony_ci			last_record_rxok_cnt;
72462306a36Sopenharmony_ci		last_record_txok_cnt = cur_txok_cnt;
72562306a36Sopenharmony_ci		last_record_rxok_cnt = cur_rxok_cnt;
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci		if (cur_rxok_cnt > (cur_txok_cnt * 6))
72862306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, REG_ARFR0, 0x8f015);
72962306a36Sopenharmony_ci		else
73062306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, REG_ARFR0, 0xff015);
73162306a36Sopenharmony_ci	}
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	/* AP & ADHOC & MESH */
73462306a36Sopenharmony_ci	spin_lock_bh(&rtlpriv->locks.entry_list_lock);
73562306a36Sopenharmony_ci	list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
73662306a36Sopenharmony_ci		if (drv_priv->rssi_stat.undec_sm_pwdb <
73762306a36Sopenharmony_ci			tmp_entry_min_pwdb)
73862306a36Sopenharmony_ci			tmp_entry_min_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
73962306a36Sopenharmony_ci		if (drv_priv->rssi_stat.undec_sm_pwdb >
74062306a36Sopenharmony_ci			tmp_entry_max_pwdb)
74162306a36Sopenharmony_ci			tmp_entry_max_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
74262306a36Sopenharmony_ci	}
74362306a36Sopenharmony_ci	spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	/* If associated entry is found */
74662306a36Sopenharmony_ci	if (tmp_entry_max_pwdb != 0) {
74762306a36Sopenharmony_ci		rtlpriv->dm.entry_max_undec_sm_pwdb = tmp_entry_max_pwdb;
74862306a36Sopenharmony_ci		RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMaxPWDB = 0x%lx(%ld)\n",
74962306a36Sopenharmony_ci			tmp_entry_max_pwdb, tmp_entry_max_pwdb);
75062306a36Sopenharmony_ci	} else {
75162306a36Sopenharmony_ci		rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
75262306a36Sopenharmony_ci	}
75362306a36Sopenharmony_ci	/* If associated entry is found */
75462306a36Sopenharmony_ci	if (tmp_entry_min_pwdb != 0xff) {
75562306a36Sopenharmony_ci		rtlpriv->dm.entry_min_undec_sm_pwdb = tmp_entry_min_pwdb;
75662306a36Sopenharmony_ci		RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMinPWDB = 0x%lx(%ld)\n",
75762306a36Sopenharmony_ci					tmp_entry_min_pwdb, tmp_entry_min_pwdb);
75862306a36Sopenharmony_ci	} else {
75962306a36Sopenharmony_ci		rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
76062306a36Sopenharmony_ci	}
76162306a36Sopenharmony_ci	/* Indicate Rx signal strength to FW. */
76262306a36Sopenharmony_ci	if (!rtlpriv->dm.useramask)
76362306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb);
76462306a36Sopenharmony_ci}
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_civoid rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw)
76762306a36Sopenharmony_ci{
76862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	rtlpriv->dm.current_turbo_edca = false;
77162306a36Sopenharmony_ci	rtlpriv->dm.is_any_nonbepkts = false;
77262306a36Sopenharmony_ci	rtlpriv->dm.is_cur_rdlstate = false;
77362306a36Sopenharmony_ci}
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_cistatic void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
77662306a36Sopenharmony_ci{
77762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
77862306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
77962306a36Sopenharmony_ci	static u64 last_txok_cnt;
78062306a36Sopenharmony_ci	static u64 last_rxok_cnt;
78162306a36Sopenharmony_ci	static u32 last_bt_edca_ul;
78262306a36Sopenharmony_ci	static u32 last_bt_edca_dl;
78362306a36Sopenharmony_ci	u64 cur_txok_cnt = 0;
78462306a36Sopenharmony_ci	u64 cur_rxok_cnt = 0;
78562306a36Sopenharmony_ci	u32 edca_be_ul = 0x5ea42b;
78662306a36Sopenharmony_ci	u32 edca_be_dl = 0x5ea42b;
78762306a36Sopenharmony_ci	bool bt_change_edca = false;
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci	if ((last_bt_edca_ul != rtlpriv->btcoexist.bt_edca_ul) ||
79062306a36Sopenharmony_ci	    (last_bt_edca_dl != rtlpriv->btcoexist.bt_edca_dl)) {
79162306a36Sopenharmony_ci		rtlpriv->dm.current_turbo_edca = false;
79262306a36Sopenharmony_ci		last_bt_edca_ul = rtlpriv->btcoexist.bt_edca_ul;
79362306a36Sopenharmony_ci		last_bt_edca_dl = rtlpriv->btcoexist.bt_edca_dl;
79462306a36Sopenharmony_ci	}
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_ci	if (rtlpriv->btcoexist.bt_edca_ul != 0) {
79762306a36Sopenharmony_ci		edca_be_ul = rtlpriv->btcoexist.bt_edca_ul;
79862306a36Sopenharmony_ci		bt_change_edca = true;
79962306a36Sopenharmony_ci	}
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci	if (rtlpriv->btcoexist.bt_edca_dl != 0) {
80262306a36Sopenharmony_ci		edca_be_dl = rtlpriv->btcoexist.bt_edca_dl;
80362306a36Sopenharmony_ci		bt_change_edca = true;
80462306a36Sopenharmony_ci	}
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci	if (mac->link_state != MAC80211_LINKED) {
80762306a36Sopenharmony_ci		rtlpriv->dm.current_turbo_edca = false;
80862306a36Sopenharmony_ci		return;
80962306a36Sopenharmony_ci	}
81062306a36Sopenharmony_ci	if ((bt_change_edca) ||
81162306a36Sopenharmony_ci	    ((!rtlpriv->dm.is_any_nonbepkts) &&
81262306a36Sopenharmony_ci	     (!rtlpriv->dm.disable_framebursting))) {
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_ci		cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
81562306a36Sopenharmony_ci		cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci		if (cur_rxok_cnt > 4 * cur_txok_cnt) {
81862306a36Sopenharmony_ci			if (!rtlpriv->dm.is_cur_rdlstate ||
81962306a36Sopenharmony_ci			    !rtlpriv->dm.current_turbo_edca) {
82062306a36Sopenharmony_ci				rtl_write_dword(rtlpriv,
82162306a36Sopenharmony_ci						REG_EDCA_BE_PARAM,
82262306a36Sopenharmony_ci						edca_be_dl);
82362306a36Sopenharmony_ci				rtlpriv->dm.is_cur_rdlstate = true;
82462306a36Sopenharmony_ci			}
82562306a36Sopenharmony_ci		} else {
82662306a36Sopenharmony_ci			if (rtlpriv->dm.is_cur_rdlstate ||
82762306a36Sopenharmony_ci			    !rtlpriv->dm.current_turbo_edca) {
82862306a36Sopenharmony_ci				rtl_write_dword(rtlpriv,
82962306a36Sopenharmony_ci						REG_EDCA_BE_PARAM,
83062306a36Sopenharmony_ci						edca_be_ul);
83162306a36Sopenharmony_ci				rtlpriv->dm.is_cur_rdlstate = false;
83262306a36Sopenharmony_ci			}
83362306a36Sopenharmony_ci		}
83462306a36Sopenharmony_ci		rtlpriv->dm.current_turbo_edca = true;
83562306a36Sopenharmony_ci	} else {
83662306a36Sopenharmony_ci		if (rtlpriv->dm.current_turbo_edca) {
83762306a36Sopenharmony_ci			u8 tmp = AC0_BE;
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
84062306a36Sopenharmony_ci						      HW_VAR_AC_PARAM,
84162306a36Sopenharmony_ci						      &tmp);
84262306a36Sopenharmony_ci			rtlpriv->dm.current_turbo_edca = false;
84362306a36Sopenharmony_ci		}
84462306a36Sopenharmony_ci	}
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci	rtlpriv->dm.is_any_nonbepkts = false;
84762306a36Sopenharmony_ci	last_txok_cnt = rtlpriv->stats.txbytesunicast;
84862306a36Sopenharmony_ci	last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
84962306a36Sopenharmony_ci}
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_cistatic void dm_txpower_track_cb_therm(struct ieee80211_hw *hw)
85262306a36Sopenharmony_ci{
85362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
85462306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
85562306a36Sopenharmony_ci	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
85662306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
85762306a36Sopenharmony_ci	u8 thermalvalue = 0, delta, delta_lck, delta_iqk, offset;
85862306a36Sopenharmony_ci	u8 thermalvalue_avg_count = 0;
85962306a36Sopenharmony_ci	u32 thermalvalue_avg = 0;
86062306a36Sopenharmony_ci	long  ele_d, temp_cck;
86162306a36Sopenharmony_ci	s8 ofdm_index[2], cck_index = 0,
86262306a36Sopenharmony_ci		ofdm_index_old[2] = {0, 0}, cck_index_old = 0;
86362306a36Sopenharmony_ci	int i = 0;
86462306a36Sopenharmony_ci	/*bool is2t = false;*/
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci	u8 ofdm_min_index = 6, rf = 1;
86762306a36Sopenharmony_ci	/*u8 index_for_channel;*/
86862306a36Sopenharmony_ci	enum _power_dec_inc {power_dec, power_inc};
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ci	/*0.1 the following TWO tables decide the
87162306a36Sopenharmony_ci	 *final index of OFDM/CCK swing table
87262306a36Sopenharmony_ci	 */
87362306a36Sopenharmony_ci	static const s8 delta_swing_table_idx[2][15]  = {
87462306a36Sopenharmony_ci		{0, 0, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11},
87562306a36Sopenharmony_ci		{0, 0, -1, -2, -3, -4, -4, -4, -4, -5, -7, -8, -9, -9, -10}
87662306a36Sopenharmony_ci	};
87762306a36Sopenharmony_ci	static const u8 thermal_threshold[2][15] = {
87862306a36Sopenharmony_ci		{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27},
87962306a36Sopenharmony_ci		{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 25, 25}
88062306a36Sopenharmony_ci	};
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_ci	/*Initilization (7 steps in total) */
88362306a36Sopenharmony_ci	rtlpriv->dm.txpower_trackinginit = true;
88462306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
88562306a36Sopenharmony_ci		"%s\n", __func__);
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci	thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER,
88862306a36Sopenharmony_ci					 0xfc00);
88962306a36Sopenharmony_ci	if (!thermalvalue)
89062306a36Sopenharmony_ci		return;
89162306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
89262306a36Sopenharmony_ci		"Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
89362306a36Sopenharmony_ci		thermalvalue, rtlpriv->dm.thermalvalue,
89462306a36Sopenharmony_ci		rtlefuse->eeprom_thermalmeter);
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	/*1. Query OFDM Default Setting: Path A*/
89762306a36Sopenharmony_ci	ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD) &
89862306a36Sopenharmony_ci			      MASKOFDM_D;
89962306a36Sopenharmony_ci	for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
90062306a36Sopenharmony_ci		if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
90162306a36Sopenharmony_ci			ofdm_index_old[0] = (u8)i;
90262306a36Sopenharmony_ci			rtldm->swing_idx_ofdm_base[RF90_PATH_A] = (u8)i;
90362306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
90462306a36Sopenharmony_ci				"Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index = 0x%x\n",
90562306a36Sopenharmony_ci				 ROFDM0_XATXIQIMBALANCE,
90662306a36Sopenharmony_ci				 ele_d, ofdm_index_old[0]);
90762306a36Sopenharmony_ci			break;
90862306a36Sopenharmony_ci		}
90962306a36Sopenharmony_ci	}
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	/*2.Query CCK default setting From 0xa24*/
91262306a36Sopenharmony_ci	temp_cck = rtl_get_bbreg(hw, RCCK0_TXFILTER2, MASKDWORD) & MASKCCK;
91362306a36Sopenharmony_ci	for (i = 0; i < CCK_TABLE_LENGTH; i++) {
91462306a36Sopenharmony_ci		if (rtlpriv->dm.cck_inch14) {
91562306a36Sopenharmony_ci			if (memcmp(&temp_cck, &cck_tbl_ch14[i][2], 4) == 0) {
91662306a36Sopenharmony_ci				cck_index_old = (u8)i;
91762306a36Sopenharmony_ci				rtldm->swing_idx_cck_base = (u8)i;
91862306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_POWER_TRACKING,
91962306a36Sopenharmony_ci					DBG_LOUD,
92062306a36Sopenharmony_ci					"Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch 14 %d\n",
92162306a36Sopenharmony_ci					RCCK0_TXFILTER2, temp_cck,
92262306a36Sopenharmony_ci					cck_index_old,
92362306a36Sopenharmony_ci					rtlpriv->dm.cck_inch14);
92462306a36Sopenharmony_ci				break;
92562306a36Sopenharmony_ci			}
92662306a36Sopenharmony_ci		} else {
92762306a36Sopenharmony_ci			if (memcmp(&temp_cck, &cck_tbl_ch1_13[i][2], 4) == 0) {
92862306a36Sopenharmony_ci				cck_index_old = (u8)i;
92962306a36Sopenharmony_ci				rtldm->swing_idx_cck_base = (u8)i;
93062306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_POWER_TRACKING,
93162306a36Sopenharmony_ci					DBG_LOUD,
93262306a36Sopenharmony_ci					"Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
93362306a36Sopenharmony_ci					RCCK0_TXFILTER2, temp_cck,
93462306a36Sopenharmony_ci					cck_index_old,
93562306a36Sopenharmony_ci					rtlpriv->dm.cck_inch14);
93662306a36Sopenharmony_ci				break;
93762306a36Sopenharmony_ci			}
93862306a36Sopenharmony_ci		}
93962306a36Sopenharmony_ci	}
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_ci	/*3 Initialize ThermalValues of RFCalibrateInfo*/
94262306a36Sopenharmony_ci	if (!rtldm->thermalvalue) {
94362306a36Sopenharmony_ci		rtlpriv->dm.thermalvalue = rtlefuse->eeprom_thermalmeter;
94462306a36Sopenharmony_ci		rtlpriv->dm.thermalvalue_lck = thermalvalue;
94562306a36Sopenharmony_ci		rtlpriv->dm.thermalvalue_iqk = thermalvalue;
94662306a36Sopenharmony_ci		for (i = 0; i < rf; i++)
94762306a36Sopenharmony_ci			rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
94862306a36Sopenharmony_ci		rtlpriv->dm.cck_index = cck_index_old;
94962306a36Sopenharmony_ci	}
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci	/*4 Calculate average thermal meter*/
95262306a36Sopenharmony_ci	rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermalvalue;
95362306a36Sopenharmony_ci	rtldm->thermalvalue_avg_index++;
95462306a36Sopenharmony_ci	if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_88E)
95562306a36Sopenharmony_ci		rtldm->thermalvalue_avg_index = 0;
95662306a36Sopenharmony_ci
95762306a36Sopenharmony_ci	for (i = 0; i < AVG_THERMAL_NUM_88E; i++) {
95862306a36Sopenharmony_ci		if (rtldm->thermalvalue_avg[i]) {
95962306a36Sopenharmony_ci			thermalvalue_avg += rtldm->thermalvalue_avg[i];
96062306a36Sopenharmony_ci			thermalvalue_avg_count++;
96162306a36Sopenharmony_ci		}
96262306a36Sopenharmony_ci	}
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci	if (thermalvalue_avg_count)
96562306a36Sopenharmony_ci		thermalvalue = (u8)(thermalvalue_avg / thermalvalue_avg_count);
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci	/* 5 Calculate delta, delta_LCK, delta_IQK.*/
96862306a36Sopenharmony_ci	if (rtlhal->reloadtxpowerindex) {
96962306a36Sopenharmony_ci		delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
97062306a36Sopenharmony_ci		    (thermalvalue - rtlefuse->eeprom_thermalmeter) :
97162306a36Sopenharmony_ci		    (rtlefuse->eeprom_thermalmeter - thermalvalue);
97262306a36Sopenharmony_ci		rtlhal->reloadtxpowerindex = false;
97362306a36Sopenharmony_ci		rtlpriv->dm.done_txpower = false;
97462306a36Sopenharmony_ci	} else if (rtlpriv->dm.done_txpower) {
97562306a36Sopenharmony_ci		delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
97662306a36Sopenharmony_ci		    (thermalvalue - rtlpriv->dm.thermalvalue) :
97762306a36Sopenharmony_ci		    (rtlpriv->dm.thermalvalue - thermalvalue);
97862306a36Sopenharmony_ci	} else {
97962306a36Sopenharmony_ci		delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
98062306a36Sopenharmony_ci		    (thermalvalue - rtlefuse->eeprom_thermalmeter) :
98162306a36Sopenharmony_ci		    (rtlefuse->eeprom_thermalmeter - thermalvalue);
98262306a36Sopenharmony_ci	}
98362306a36Sopenharmony_ci	delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
98462306a36Sopenharmony_ci	    (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
98562306a36Sopenharmony_ci	    (rtlpriv->dm.thermalvalue_lck - thermalvalue);
98662306a36Sopenharmony_ci	delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
98762306a36Sopenharmony_ci	    (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
98862306a36Sopenharmony_ci	    (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
99162306a36Sopenharmony_ci		"Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
99262306a36Sopenharmony_ci		thermalvalue, rtlpriv->dm.thermalvalue,
99362306a36Sopenharmony_ci		rtlefuse->eeprom_thermalmeter, delta, delta_lck,
99462306a36Sopenharmony_ci		delta_iqk);
99562306a36Sopenharmony_ci	/* 6 If necessary, do LCK.*/
99662306a36Sopenharmony_ci	if (delta_lck >= 8) {
99762306a36Sopenharmony_ci		rtlpriv->dm.thermalvalue_lck = thermalvalue;
99862306a36Sopenharmony_ci		rtl88e_phy_lc_calibrate(hw);
99962306a36Sopenharmony_ci	}
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci	/* 7 If necessary, move the index of
100262306a36Sopenharmony_ci	 * swing table to adjust Tx power.
100362306a36Sopenharmony_ci	 */
100462306a36Sopenharmony_ci	if (delta > 0 && rtlpriv->dm.txpower_track_control) {
100562306a36Sopenharmony_ci		delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
100662306a36Sopenharmony_ci		    (thermalvalue - rtlefuse->eeprom_thermalmeter) :
100762306a36Sopenharmony_ci		    (rtlefuse->eeprom_thermalmeter - thermalvalue);
100862306a36Sopenharmony_ci
100962306a36Sopenharmony_ci		/* 7.1 Get the final CCK_index and OFDM_index for each
101062306a36Sopenharmony_ci		 * swing table.
101162306a36Sopenharmony_ci		 */
101262306a36Sopenharmony_ci		if (thermalvalue > rtlefuse->eeprom_thermalmeter) {
101362306a36Sopenharmony_ci			CAL_SWING_OFF(offset, power_inc, INDEX_MAPPING_NUM,
101462306a36Sopenharmony_ci				      delta);
101562306a36Sopenharmony_ci			for (i = 0; i < rf; i++)
101662306a36Sopenharmony_ci				ofdm_index[i] =
101762306a36Sopenharmony_ci				  rtldm->ofdm_index[i] +
101862306a36Sopenharmony_ci				  delta_swing_table_idx[power_inc][offset];
101962306a36Sopenharmony_ci			cck_index = rtldm->cck_index +
102062306a36Sopenharmony_ci				delta_swing_table_idx[power_inc][offset];
102162306a36Sopenharmony_ci		} else {
102262306a36Sopenharmony_ci			CAL_SWING_OFF(offset, power_dec, INDEX_MAPPING_NUM,
102362306a36Sopenharmony_ci				      delta);
102462306a36Sopenharmony_ci			for (i = 0; i < rf; i++)
102562306a36Sopenharmony_ci				ofdm_index[i] =
102662306a36Sopenharmony_ci				  rtldm->ofdm_index[i] +
102762306a36Sopenharmony_ci				  delta_swing_table_idx[power_dec][offset];
102862306a36Sopenharmony_ci			cck_index = rtldm->cck_index +
102962306a36Sopenharmony_ci				delta_swing_table_idx[power_dec][offset];
103062306a36Sopenharmony_ci		}
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci		/* 7.2 Handle boundary conditions of index.*/
103362306a36Sopenharmony_ci		for (i = 0; i < rf; i++) {
103462306a36Sopenharmony_ci			if (ofdm_index[i] > OFDM_TABLE_SIZE-1)
103562306a36Sopenharmony_ci				ofdm_index[i] = OFDM_TABLE_SIZE-1;
103662306a36Sopenharmony_ci			else if (rtldm->ofdm_index[i] < ofdm_min_index)
103762306a36Sopenharmony_ci				ofdm_index[i] = ofdm_min_index;
103862306a36Sopenharmony_ci		}
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci		if (cck_index > CCK_TABLE_SIZE-1)
104162306a36Sopenharmony_ci			cck_index = CCK_TABLE_SIZE-1;
104262306a36Sopenharmony_ci		else if (cck_index < 0)
104362306a36Sopenharmony_ci			cck_index = 0;
104462306a36Sopenharmony_ci
104562306a36Sopenharmony_ci		/*7.3Configure the Swing Table to adjust Tx Power.*/
104662306a36Sopenharmony_ci		if (rtlpriv->dm.txpower_track_control) {
104762306a36Sopenharmony_ci			rtldm->done_txpower = true;
104862306a36Sopenharmony_ci			rtldm->swing_idx_ofdm[RF90_PATH_A] =
104962306a36Sopenharmony_ci				(u8)ofdm_index[RF90_PATH_A];
105062306a36Sopenharmony_ci			rtldm->swing_idx_cck = cck_index;
105162306a36Sopenharmony_ci			if (rtldm->swing_idx_ofdm_cur !=
105262306a36Sopenharmony_ci			    rtldm->swing_idx_ofdm[0]) {
105362306a36Sopenharmony_ci				rtldm->swing_idx_ofdm_cur =
105462306a36Sopenharmony_ci					 rtldm->swing_idx_ofdm[0];
105562306a36Sopenharmony_ci				rtldm->swing_flag_ofdm = true;
105662306a36Sopenharmony_ci			}
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ci			if (rtldm->swing_idx_cck_cur != rtldm->swing_idx_cck) {
105962306a36Sopenharmony_ci				rtldm->swing_idx_cck_cur = rtldm->swing_idx_cck;
106062306a36Sopenharmony_ci				rtldm->swing_flag_cck = true;
106162306a36Sopenharmony_ci			}
106262306a36Sopenharmony_ci
106362306a36Sopenharmony_ci			dm_tx_pwr_track_set_pwr(hw, TXAGC, 0, 0);
106462306a36Sopenharmony_ci		}
106562306a36Sopenharmony_ci	}
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci	if (delta_iqk >= 8) {
106862306a36Sopenharmony_ci		rtlpriv->dm.thermalvalue_iqk = thermalvalue;
106962306a36Sopenharmony_ci		rtl88e_phy_iq_calibrate(hw, false);
107062306a36Sopenharmony_ci	}
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci	if (rtldm->txpower_track_control)
107362306a36Sopenharmony_ci		rtldm->thermalvalue = thermalvalue;
107462306a36Sopenharmony_ci	rtldm->txpowercount = 0;
107562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "end\n");
107662306a36Sopenharmony_ci}
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_cistatic void rtl88e_dm_init_txpower_tracking(struct ieee80211_hw *hw)
107962306a36Sopenharmony_ci{
108062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci	rtlpriv->dm.txpower_tracking = true;
108362306a36Sopenharmony_ci	rtlpriv->dm.txpower_trackinginit = false;
108462306a36Sopenharmony_ci	rtlpriv->dm.txpowercount = 0;
108562306a36Sopenharmony_ci	rtlpriv->dm.txpower_track_control = true;
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci	rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A] = 12;
108862306a36Sopenharmony_ci	rtlpriv->dm.swing_idx_ofdm_cur = 12;
108962306a36Sopenharmony_ci	rtlpriv->dm.swing_flag_ofdm = false;
109062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
109162306a36Sopenharmony_ci		"rtlpriv->dm.txpower_tracking = %d\n",
109262306a36Sopenharmony_ci		rtlpriv->dm.txpower_tracking);
109362306a36Sopenharmony_ci}
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_civoid rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw)
109662306a36Sopenharmony_ci{
109762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
109862306a36Sopenharmony_ci
109962306a36Sopenharmony_ci	if (!rtlpriv->dm.txpower_tracking)
110062306a36Sopenharmony_ci		return;
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_ci	if (!rtlpriv->dm.tm_trigger) {
110362306a36Sopenharmony_ci		rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, BIT(17)|BIT(16),
110462306a36Sopenharmony_ci			      0x03);
110562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
110662306a36Sopenharmony_ci			"Trigger 88E Thermal Meter!!\n");
110762306a36Sopenharmony_ci		rtlpriv->dm.tm_trigger = 1;
110862306a36Sopenharmony_ci		return;
110962306a36Sopenharmony_ci	} else {
111062306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
111162306a36Sopenharmony_ci			"Schedule TxPowerTracking !!\n");
111262306a36Sopenharmony_ci		dm_txpower_track_cb_therm(hw);
111362306a36Sopenharmony_ci		rtlpriv->dm.tm_trigger = 0;
111462306a36Sopenharmony_ci	}
111562306a36Sopenharmony_ci}
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_civoid rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
111862306a36Sopenharmony_ci{
111962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
112062306a36Sopenharmony_ci	struct rate_adaptive *p_ra = &rtlpriv->ra;
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_ci	p_ra->ratr_state = DM_RATR_STA_INIT;
112362306a36Sopenharmony_ci	p_ra->pre_ratr_state = DM_RATR_STA_INIT;
112462306a36Sopenharmony_ci
112562306a36Sopenharmony_ci	if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
112662306a36Sopenharmony_ci		rtlpriv->dm.useramask = true;
112762306a36Sopenharmony_ci	else
112862306a36Sopenharmony_ci		rtlpriv->dm.useramask = false;
112962306a36Sopenharmony_ci}
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_cistatic void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
113262306a36Sopenharmony_ci{
113362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
113462306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
113562306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
113662306a36Sopenharmony_ci	struct rate_adaptive *p_ra = &rtlpriv->ra;
113762306a36Sopenharmony_ci	u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
113862306a36Sopenharmony_ci	struct ieee80211_sta *sta = NULL;
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_ci	if (is_hal_stop(rtlhal)) {
114162306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_RATE, DBG_LOUD,
114262306a36Sopenharmony_ci			"driver is going to unload\n");
114362306a36Sopenharmony_ci		return;
114462306a36Sopenharmony_ci	}
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	if (!rtlpriv->dm.useramask) {
114762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_RATE, DBG_LOUD,
114862306a36Sopenharmony_ci			"driver does not control rate adaptive mask\n");
114962306a36Sopenharmony_ci		return;
115062306a36Sopenharmony_ci	}
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_ci	if (mac->link_state == MAC80211_LINKED &&
115362306a36Sopenharmony_ci	    mac->opmode == NL80211_IFTYPE_STATION) {
115462306a36Sopenharmony_ci		switch (p_ra->pre_ratr_state) {
115562306a36Sopenharmony_ci		case DM_RATR_STA_HIGH:
115662306a36Sopenharmony_ci			high_rssithresh_for_ra = 50;
115762306a36Sopenharmony_ci			low_rssithresh_for_ra = 20;
115862306a36Sopenharmony_ci			break;
115962306a36Sopenharmony_ci		case DM_RATR_STA_MIDDLE:
116062306a36Sopenharmony_ci			high_rssithresh_for_ra = 55;
116162306a36Sopenharmony_ci			low_rssithresh_for_ra = 20;
116262306a36Sopenharmony_ci			break;
116362306a36Sopenharmony_ci		case DM_RATR_STA_LOW:
116462306a36Sopenharmony_ci			high_rssithresh_for_ra = 50;
116562306a36Sopenharmony_ci			low_rssithresh_for_ra = 25;
116662306a36Sopenharmony_ci			break;
116762306a36Sopenharmony_ci		default:
116862306a36Sopenharmony_ci			high_rssithresh_for_ra = 50;
116962306a36Sopenharmony_ci			low_rssithresh_for_ra = 20;
117062306a36Sopenharmony_ci			break;
117162306a36Sopenharmony_ci		}
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_ci		if (rtlpriv->dm.undec_sm_pwdb >
117462306a36Sopenharmony_ci		    (long)high_rssithresh_for_ra)
117562306a36Sopenharmony_ci			p_ra->ratr_state = DM_RATR_STA_HIGH;
117662306a36Sopenharmony_ci		else if (rtlpriv->dm.undec_sm_pwdb >
117762306a36Sopenharmony_ci			 (long)low_rssithresh_for_ra)
117862306a36Sopenharmony_ci			p_ra->ratr_state = DM_RATR_STA_MIDDLE;
117962306a36Sopenharmony_ci		else
118062306a36Sopenharmony_ci			p_ra->ratr_state = DM_RATR_STA_LOW;
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ci		if (p_ra->pre_ratr_state != p_ra->ratr_state) {
118362306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RATE, DBG_LOUD,
118462306a36Sopenharmony_ci				"RSSI = %ld\n",
118562306a36Sopenharmony_ci				rtlpriv->dm.undec_sm_pwdb);
118662306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RATE, DBG_LOUD,
118762306a36Sopenharmony_ci				"RSSI_LEVEL = %d\n", p_ra->ratr_state);
118862306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RATE, DBG_LOUD,
118962306a36Sopenharmony_ci				"PreState = %d, CurState = %d\n",
119062306a36Sopenharmony_ci				p_ra->pre_ratr_state, p_ra->ratr_state);
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci			rcu_read_lock();
119362306a36Sopenharmony_ci			sta = rtl_find_sta(hw, mac->bssid);
119462306a36Sopenharmony_ci			if (sta)
119562306a36Sopenharmony_ci				rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
119662306a36Sopenharmony_ci							p_ra->ratr_state,
119762306a36Sopenharmony_ci								   true);
119862306a36Sopenharmony_ci			rcu_read_unlock();
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_ci			p_ra->pre_ratr_state = p_ra->ratr_state;
120162306a36Sopenharmony_ci		}
120262306a36Sopenharmony_ci	}
120362306a36Sopenharmony_ci}
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_cistatic void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
120662306a36Sopenharmony_ci{
120762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
120862306a36Sopenharmony_ci	struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_ci	dm_pstable->pre_ccastate = CCA_MAX;
121162306a36Sopenharmony_ci	dm_pstable->cur_ccasate = CCA_MAX;
121262306a36Sopenharmony_ci	dm_pstable->pre_rfstate = RF_MAX;
121362306a36Sopenharmony_ci	dm_pstable->cur_rfstate = RF_MAX;
121462306a36Sopenharmony_ci	dm_pstable->rssi_val_min = 0;
121562306a36Sopenharmony_ci}
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_cistatic void rtl88e_dm_update_rx_idle_ant(struct ieee80211_hw *hw,
121862306a36Sopenharmony_ci					 u8 ant)
121962306a36Sopenharmony_ci{
122062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
122162306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
122262306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
122362306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
122462306a36Sopenharmony_ci	u32 default_ant, optional_ant;
122562306a36Sopenharmony_ci
122662306a36Sopenharmony_ci	if (pfat_table->rx_idle_ant != ant) {
122762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
122862306a36Sopenharmony_ci			"need to update rx idle ant\n");
122962306a36Sopenharmony_ci		if (ant == MAIN_ANT) {
123062306a36Sopenharmony_ci			default_ant =
123162306a36Sopenharmony_ci			  (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
123262306a36Sopenharmony_ci			  MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
123362306a36Sopenharmony_ci			optional_ant =
123462306a36Sopenharmony_ci			  (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
123562306a36Sopenharmony_ci			  AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
123662306a36Sopenharmony_ci		} else {
123762306a36Sopenharmony_ci			default_ant =
123862306a36Sopenharmony_ci			   (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
123962306a36Sopenharmony_ci			   AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
124062306a36Sopenharmony_ci			optional_ant =
124162306a36Sopenharmony_ci			   (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
124262306a36Sopenharmony_ci			   MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
124362306a36Sopenharmony_ci		}
124462306a36Sopenharmony_ci
124562306a36Sopenharmony_ci		if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
124662306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
124762306a36Sopenharmony_ci				      BIT(5) | BIT(4) | BIT(3), default_ant);
124862306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
124962306a36Sopenharmony_ci				      BIT(8) | BIT(7) | BIT(6), optional_ant);
125062306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_ANTSEL_CTRL_11N,
125162306a36Sopenharmony_ci				      BIT(14) | BIT(13) | BIT(12),
125262306a36Sopenharmony_ci				      default_ant);
125362306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_RESP_TX_11N,
125462306a36Sopenharmony_ci				      BIT(6) | BIT(7), default_ant);
125562306a36Sopenharmony_ci		} else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
125662306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
125762306a36Sopenharmony_ci				      BIT(5) | BIT(4) | BIT(3), default_ant);
125862306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
125962306a36Sopenharmony_ci				      BIT(8) | BIT(7) | BIT(6), optional_ant);
126062306a36Sopenharmony_ci		}
126162306a36Sopenharmony_ci	}
126262306a36Sopenharmony_ci	pfat_table->rx_idle_ant = ant;
126362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "RxIdleAnt %s\n",
126462306a36Sopenharmony_ci		(ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
126562306a36Sopenharmony_ci}
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_cistatic void rtl88e_dm_update_tx_ant(struct ieee80211_hw *hw,
126862306a36Sopenharmony_ci				    u8 ant, u32 mac_id)
126962306a36Sopenharmony_ci{
127062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
127162306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
127262306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
127362306a36Sopenharmony_ci	u8 target_ant;
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	if (ant == MAIN_ANT)
127662306a36Sopenharmony_ci		target_ant = MAIN_ANT_CG_TRX;
127762306a36Sopenharmony_ci	else
127862306a36Sopenharmony_ci		target_ant = AUX_ANT_CG_TRX;
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_ci	pfat_table->antsel_a[mac_id] = target_ant & BIT(0);
128162306a36Sopenharmony_ci	pfat_table->antsel_b[mac_id] = (target_ant & BIT(1)) >> 1;
128262306a36Sopenharmony_ci	pfat_table->antsel_c[mac_id] = (target_ant & BIT(2)) >> 2;
128362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "txfrominfo target ant %s\n",
128462306a36Sopenharmony_ci		(ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
128562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "antsel_tr_mux = 3'b%d%d%d\n",
128662306a36Sopenharmony_ci		pfat_table->antsel_c[mac_id],
128762306a36Sopenharmony_ci		pfat_table->antsel_b[mac_id],
128862306a36Sopenharmony_ci		pfat_table->antsel_a[mac_id]);
128962306a36Sopenharmony_ci}
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_cistatic void rtl88e_dm_rx_hw_antena_div_init(struct ieee80211_hw *hw)
129262306a36Sopenharmony_ci{
129362306a36Sopenharmony_ci	u32  value32;
129462306a36Sopenharmony_ci
129562306a36Sopenharmony_ci	/*MAC Setting*/
129662306a36Sopenharmony_ci	value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
129762306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
129862306a36Sopenharmony_ci		      MASKDWORD, value32 | (BIT(23) | BIT(25)));
129962306a36Sopenharmony_ci	/*Pin Setting*/
130062306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
130162306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
130262306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 1);
130362306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
130462306a36Sopenharmony_ci	/*OFDM Setting*/
130562306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
130662306a36Sopenharmony_ci	/*CCK Setting*/
130762306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
130862306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
130962306a36Sopenharmony_ci	rtl88e_dm_update_rx_idle_ant(hw, MAIN_ANT);
131062306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKLWORD, 0x0201);
131162306a36Sopenharmony_ci}
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_cistatic void rtl88e_dm_trx_hw_antenna_div_init(struct ieee80211_hw *hw)
131462306a36Sopenharmony_ci{
131562306a36Sopenharmony_ci	u32  value32;
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ci	/*MAC Setting*/
131862306a36Sopenharmony_ci	value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
131962306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD,
132062306a36Sopenharmony_ci		      value32 | (BIT(23) | BIT(25)));
132162306a36Sopenharmony_ci	/*Pin Setting*/
132262306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
132362306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
132462306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 0);
132562306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
132662306a36Sopenharmony_ci	/*OFDM Setting*/
132762306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
132862306a36Sopenharmony_ci	/*CCK Setting*/
132962306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
133062306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
133162306a36Sopenharmony_ci	/*TX Setting*/
133262306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 0);
133362306a36Sopenharmony_ci	rtl88e_dm_update_rx_idle_ant(hw, MAIN_ANT);
133462306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKLWORD, 0x0201);
133562306a36Sopenharmony_ci}
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_cistatic void rtl88e_dm_fast_training_init(struct ieee80211_hw *hw)
133862306a36Sopenharmony_ci{
133962306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
134062306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
134162306a36Sopenharmony_ci	u32 ant_combination = 2;
134262306a36Sopenharmony_ci	u32 value32, i;
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci	for (i = 0; i < 6; i++) {
134562306a36Sopenharmony_ci		pfat_table->bssid[i] = 0;
134662306a36Sopenharmony_ci		pfat_table->ant_sum[i] = 0;
134762306a36Sopenharmony_ci		pfat_table->ant_cnt[i] = 0;
134862306a36Sopenharmony_ci		pfat_table->ant_ave[i] = 0;
134962306a36Sopenharmony_ci	}
135062306a36Sopenharmony_ci	pfat_table->train_idx = 0;
135162306a36Sopenharmony_ci	pfat_table->fat_state = FAT_NORMAL_STATE;
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci	/*MAC Setting*/
135462306a36Sopenharmony_ci	value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
135562306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
135662306a36Sopenharmony_ci		      MASKDWORD, value32 | (BIT(23) | BIT(25)));
135762306a36Sopenharmony_ci	value32 = rtl_get_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N, MASKDWORD);
135862306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
135962306a36Sopenharmony_ci		      MASKDWORD, value32 | (BIT(16) | BIT(17)));
136062306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
136162306a36Sopenharmony_ci		      MASKLWORD, 0);
136262306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
136362306a36Sopenharmony_ci		      MASKDWORD, 0);
136462306a36Sopenharmony_ci
136562306a36Sopenharmony_ci	/*Pin Setting*/
136662306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
136762306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
136862306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 0);
136962306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci	/*OFDM Setting*/
137262306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
137362306a36Sopenharmony_ci	/*antenna mapping table*/
137462306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE0, 1);
137562306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE1, 2);
137662306a36Sopenharmony_ci
137762306a36Sopenharmony_ci	/*TX Setting*/
137862306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 1);
137962306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
138062306a36Sopenharmony_ci		      BIT(5) | BIT(4) | BIT(3), 0);
138162306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
138262306a36Sopenharmony_ci		      BIT(8) | BIT(7) | BIT(6), 1);
138362306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
138462306a36Sopenharmony_ci		      BIT(2) | BIT(1) | BIT(0), (ant_combination - 1));
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci	rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
138762306a36Sopenharmony_ci}
138862306a36Sopenharmony_ci
138962306a36Sopenharmony_cistatic void rtl88e_dm_antenna_div_init(struct ieee80211_hw *hw)
139062306a36Sopenharmony_ci{
139162306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci	if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
139462306a36Sopenharmony_ci		rtl88e_dm_rx_hw_antena_div_init(hw);
139562306a36Sopenharmony_ci	else if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
139662306a36Sopenharmony_ci		rtl88e_dm_trx_hw_antenna_div_init(hw);
139762306a36Sopenharmony_ci	else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
139862306a36Sopenharmony_ci		rtl88e_dm_fast_training_init(hw);
139962306a36Sopenharmony_ci
140062306a36Sopenharmony_ci}
140162306a36Sopenharmony_ci
140262306a36Sopenharmony_civoid rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
140362306a36Sopenharmony_ci				     u8 *pdesc, u32 mac_id)
140462306a36Sopenharmony_ci{
140562306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
140662306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
140762306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
140862306a36Sopenharmony_ci	__le32 *pdesc32 = (__le32 *)pdesc;
140962306a36Sopenharmony_ci
141062306a36Sopenharmony_ci	if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
141162306a36Sopenharmony_ci	    (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)) {
141262306a36Sopenharmony_ci		set_tx_desc_antsel_a(pdesc32, pfat_table->antsel_a[mac_id]);
141362306a36Sopenharmony_ci		set_tx_desc_antsel_b(pdesc32, pfat_table->antsel_b[mac_id]);
141462306a36Sopenharmony_ci		set_tx_desc_antsel_c(pdesc32, pfat_table->antsel_c[mac_id]);
141562306a36Sopenharmony_ci	}
141662306a36Sopenharmony_ci}
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_civoid rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
141962306a36Sopenharmony_ci				  u8 antsel_tr_mux, u32 mac_id,
142062306a36Sopenharmony_ci				  u32 rx_pwdb_all)
142162306a36Sopenharmony_ci{
142262306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
142362306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
142462306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
142762306a36Sopenharmony_ci		if (antsel_tr_mux == MAIN_ANT_CG_TRX) {
142862306a36Sopenharmony_ci			pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
142962306a36Sopenharmony_ci			pfat_table->main_ant_cnt[mac_id]++;
143062306a36Sopenharmony_ci		} else {
143162306a36Sopenharmony_ci			pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
143262306a36Sopenharmony_ci			pfat_table->aux_ant_cnt[mac_id]++;
143362306a36Sopenharmony_ci		}
143462306a36Sopenharmony_ci	} else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
143562306a36Sopenharmony_ci		if (antsel_tr_mux == MAIN_ANT_CGCS_RX) {
143662306a36Sopenharmony_ci			pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
143762306a36Sopenharmony_ci			pfat_table->main_ant_cnt[mac_id]++;
143862306a36Sopenharmony_ci		} else {
143962306a36Sopenharmony_ci			pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
144062306a36Sopenharmony_ci			pfat_table->aux_ant_cnt[mac_id]++;
144162306a36Sopenharmony_ci		}
144262306a36Sopenharmony_ci	}
144362306a36Sopenharmony_ci}
144462306a36Sopenharmony_ci
144562306a36Sopenharmony_cistatic void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw)
144662306a36Sopenharmony_ci{
144762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
144862306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
144962306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
145062306a36Sopenharmony_ci	struct rtl_sta_info *drv_priv;
145162306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
145262306a36Sopenharmony_ci	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
145362306a36Sopenharmony_ci	u32 i, min_rssi = 0xff, ant_div_max_rssi = 0;
145462306a36Sopenharmony_ci	u32 max_rssi = 0, local_min_rssi, local_max_rssi;
145562306a36Sopenharmony_ci	u32 main_rssi, aux_rssi;
145662306a36Sopenharmony_ci	u8 rx_idle_ant = 0, target_ant = 7;
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	/*for sta its self*/
145962306a36Sopenharmony_ci	i = 0;
146062306a36Sopenharmony_ci	main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
146162306a36Sopenharmony_ci		(pfat_table->main_ant_sum[i] / pfat_table->main_ant_cnt[i]) : 0;
146262306a36Sopenharmony_ci	aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
146362306a36Sopenharmony_ci		(pfat_table->aux_ant_sum[i] / pfat_table->aux_ant_cnt[i]) : 0;
146462306a36Sopenharmony_ci	target_ant = (main_rssi == aux_rssi) ?
146562306a36Sopenharmony_ci		pfat_table->rx_idle_ant : ((main_rssi >= aux_rssi) ?
146662306a36Sopenharmony_ci		MAIN_ANT : AUX_ANT);
146762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
146862306a36Sopenharmony_ci		"main_ant_sum %d main_ant_cnt %d\n",
146962306a36Sopenharmony_ci		pfat_table->main_ant_sum[i],
147062306a36Sopenharmony_ci		pfat_table->main_ant_cnt[i]);
147162306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
147262306a36Sopenharmony_ci		"aux_ant_sum %d aux_ant_cnt %d\n",
147362306a36Sopenharmony_ci		pfat_table->aux_ant_sum[i], pfat_table->aux_ant_cnt[i]);
147462306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "main_rssi %d aux_rssi%d\n",
147562306a36Sopenharmony_ci		main_rssi, aux_rssi);
147662306a36Sopenharmony_ci	local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;
147762306a36Sopenharmony_ci	if ((local_max_rssi > ant_div_max_rssi) && (local_max_rssi < 40))
147862306a36Sopenharmony_ci		ant_div_max_rssi = local_max_rssi;
147962306a36Sopenharmony_ci	if (local_max_rssi > max_rssi)
148062306a36Sopenharmony_ci		max_rssi = local_max_rssi;
148162306a36Sopenharmony_ci
148262306a36Sopenharmony_ci	if ((pfat_table->rx_idle_ant == MAIN_ANT) && (main_rssi == 0))
148362306a36Sopenharmony_ci		main_rssi = aux_rssi;
148462306a36Sopenharmony_ci	else if ((pfat_table->rx_idle_ant == AUX_ANT) && (aux_rssi == 0))
148562306a36Sopenharmony_ci		aux_rssi = main_rssi;
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_ci	local_min_rssi = (main_rssi > aux_rssi) ? aux_rssi : main_rssi;
148862306a36Sopenharmony_ci	if (local_min_rssi < min_rssi) {
148962306a36Sopenharmony_ci		min_rssi = local_min_rssi;
149062306a36Sopenharmony_ci		rx_idle_ant = target_ant;
149162306a36Sopenharmony_ci	}
149262306a36Sopenharmony_ci	if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
149362306a36Sopenharmony_ci		rtl88e_dm_update_tx_ant(hw, target_ant, i);
149462306a36Sopenharmony_ci
149562306a36Sopenharmony_ci	if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
149662306a36Sopenharmony_ci	    rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) {
149762306a36Sopenharmony_ci		spin_lock_bh(&rtlpriv->locks.entry_list_lock);
149862306a36Sopenharmony_ci		list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
149962306a36Sopenharmony_ci			i++;
150062306a36Sopenharmony_ci			main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
150162306a36Sopenharmony_ci				(pfat_table->main_ant_sum[i] /
150262306a36Sopenharmony_ci				pfat_table->main_ant_cnt[i]) : 0;
150362306a36Sopenharmony_ci			aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
150462306a36Sopenharmony_ci				(pfat_table->aux_ant_sum[i] /
150562306a36Sopenharmony_ci				pfat_table->aux_ant_cnt[i]) : 0;
150662306a36Sopenharmony_ci			target_ant = (main_rssi == aux_rssi) ?
150762306a36Sopenharmony_ci				pfat_table->rx_idle_ant : ((main_rssi >=
150862306a36Sopenharmony_ci				aux_rssi) ? MAIN_ANT : AUX_ANT);
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_ci			local_max_rssi = (main_rssi > aux_rssi) ?
151162306a36Sopenharmony_ci					 main_rssi : aux_rssi;
151262306a36Sopenharmony_ci			if ((local_max_rssi > ant_div_max_rssi) &&
151362306a36Sopenharmony_ci			    (local_max_rssi < 40))
151462306a36Sopenharmony_ci				ant_div_max_rssi = local_max_rssi;
151562306a36Sopenharmony_ci			if (local_max_rssi > max_rssi)
151662306a36Sopenharmony_ci				max_rssi = local_max_rssi;
151762306a36Sopenharmony_ci
151862306a36Sopenharmony_ci			if ((pfat_table->rx_idle_ant == MAIN_ANT) &&
151962306a36Sopenharmony_ci			    (main_rssi == 0))
152062306a36Sopenharmony_ci				main_rssi = aux_rssi;
152162306a36Sopenharmony_ci			else if ((pfat_table->rx_idle_ant == AUX_ANT) &&
152262306a36Sopenharmony_ci				 (aux_rssi == 0))
152362306a36Sopenharmony_ci				aux_rssi = main_rssi;
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_ci			local_min_rssi = (main_rssi > aux_rssi) ?
152662306a36Sopenharmony_ci				aux_rssi : main_rssi;
152762306a36Sopenharmony_ci			if (local_min_rssi < min_rssi) {
152862306a36Sopenharmony_ci				min_rssi = local_min_rssi;
152962306a36Sopenharmony_ci				rx_idle_ant = target_ant;
153062306a36Sopenharmony_ci			}
153162306a36Sopenharmony_ci			if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
153262306a36Sopenharmony_ci				rtl88e_dm_update_tx_ant(hw, target_ant, i);
153362306a36Sopenharmony_ci		}
153462306a36Sopenharmony_ci		spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
153562306a36Sopenharmony_ci	}
153662306a36Sopenharmony_ci
153762306a36Sopenharmony_ci	for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
153862306a36Sopenharmony_ci		pfat_table->main_ant_sum[i] = 0;
153962306a36Sopenharmony_ci		pfat_table->aux_ant_sum[i] = 0;
154062306a36Sopenharmony_ci		pfat_table->main_ant_cnt[i] = 0;
154162306a36Sopenharmony_ci		pfat_table->aux_ant_cnt[i] = 0;
154262306a36Sopenharmony_ci	}
154362306a36Sopenharmony_ci
154462306a36Sopenharmony_ci	rtl88e_dm_update_rx_idle_ant(hw, rx_idle_ant);
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci	dm_dig->antdiv_rssi_max = ant_div_max_rssi;
154762306a36Sopenharmony_ci	dm_dig->rssi_max = max_rssi;
154862306a36Sopenharmony_ci}
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_cistatic void rtl88e_set_next_mac_address_target(struct ieee80211_hw *hw)
155162306a36Sopenharmony_ci{
155262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
155362306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
155462306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
155562306a36Sopenharmony_ci	struct rtl_sta_info *drv_priv;
155662306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
155762306a36Sopenharmony_ci	u32 value32, i, j = 0;
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci	if (mac->link_state >= MAC80211_LINKED) {
156062306a36Sopenharmony_ci		for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
156162306a36Sopenharmony_ci			if ((pfat_table->train_idx + 1) == ASSOCIATE_ENTRY_NUM)
156262306a36Sopenharmony_ci				pfat_table->train_idx = 0;
156362306a36Sopenharmony_ci			else
156462306a36Sopenharmony_ci				pfat_table->train_idx++;
156562306a36Sopenharmony_ci
156662306a36Sopenharmony_ci			if (pfat_table->train_idx == 0) {
156762306a36Sopenharmony_ci				value32 = (mac->mac_addr[5] << 8) |
156862306a36Sopenharmony_ci					  mac->mac_addr[4];
156962306a36Sopenharmony_ci				rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
157062306a36Sopenharmony_ci					      MASKLWORD, value32);
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ci				value32 = (mac->mac_addr[3] << 24) |
157362306a36Sopenharmony_ci					  (mac->mac_addr[2] << 16) |
157462306a36Sopenharmony_ci					  (mac->mac_addr[1] << 8) |
157562306a36Sopenharmony_ci					  mac->mac_addr[0];
157662306a36Sopenharmony_ci				rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
157762306a36Sopenharmony_ci					      MASKDWORD, value32);
157862306a36Sopenharmony_ci				break;
157962306a36Sopenharmony_ci			}
158062306a36Sopenharmony_ci
158162306a36Sopenharmony_ci			if (rtlpriv->mac80211.opmode !=
158262306a36Sopenharmony_ci			    NL80211_IFTYPE_STATION) {
158362306a36Sopenharmony_ci				spin_lock_bh(&rtlpriv->locks.entry_list_lock);
158462306a36Sopenharmony_ci				list_for_each_entry(drv_priv,
158562306a36Sopenharmony_ci						    &rtlpriv->entry_list, list) {
158662306a36Sopenharmony_ci					j++;
158762306a36Sopenharmony_ci					if (j != pfat_table->train_idx)
158862306a36Sopenharmony_ci						continue;
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_ci					value32 = (drv_priv->mac_addr[5] << 8) |
159162306a36Sopenharmony_ci						  drv_priv->mac_addr[4];
159262306a36Sopenharmony_ci					rtl_set_bbreg(hw,
159362306a36Sopenharmony_ci						      DM_REG_ANT_TRAIN_PARA2_11N,
159462306a36Sopenharmony_ci						      MASKLWORD, value32);
159562306a36Sopenharmony_ci
159662306a36Sopenharmony_ci					value32 = (drv_priv->mac_addr[3] << 24) |
159762306a36Sopenharmony_ci						  (drv_priv->mac_addr[2] << 16) |
159862306a36Sopenharmony_ci						  (drv_priv->mac_addr[1] << 8) |
159962306a36Sopenharmony_ci						  drv_priv->mac_addr[0];
160062306a36Sopenharmony_ci					rtl_set_bbreg(hw,
160162306a36Sopenharmony_ci						      DM_REG_ANT_TRAIN_PARA1_11N,
160262306a36Sopenharmony_ci						      MASKDWORD, value32);
160362306a36Sopenharmony_ci					break;
160462306a36Sopenharmony_ci				}
160562306a36Sopenharmony_ci				spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
160662306a36Sopenharmony_ci				/*find entry, break*/
160762306a36Sopenharmony_ci				if (j == pfat_table->train_idx)
160862306a36Sopenharmony_ci					break;
160962306a36Sopenharmony_ci			}
161062306a36Sopenharmony_ci		}
161162306a36Sopenharmony_ci	}
161262306a36Sopenharmony_ci}
161362306a36Sopenharmony_ci
161462306a36Sopenharmony_cistatic void rtl88e_dm_fast_ant_training(struct ieee80211_hw *hw)
161562306a36Sopenharmony_ci{
161662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
161762306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
161862306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
161962306a36Sopenharmony_ci	u32 i, max_rssi = 0;
162062306a36Sopenharmony_ci	u8 target_ant = 2;
162162306a36Sopenharmony_ci	bool bpkt_filter_match = false;
162262306a36Sopenharmony_ci
162362306a36Sopenharmony_ci	if (pfat_table->fat_state == FAT_TRAINING_STATE) {
162462306a36Sopenharmony_ci		for (i = 0; i < 7; i++) {
162562306a36Sopenharmony_ci			if (pfat_table->ant_cnt[i] == 0) {
162662306a36Sopenharmony_ci				pfat_table->ant_ave[i] = 0;
162762306a36Sopenharmony_ci			} else {
162862306a36Sopenharmony_ci				pfat_table->ant_ave[i] =
162962306a36Sopenharmony_ci					pfat_table->ant_sum[i] /
163062306a36Sopenharmony_ci					pfat_table->ant_cnt[i];
163162306a36Sopenharmony_ci				bpkt_filter_match = true;
163262306a36Sopenharmony_ci			}
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_ci			if (pfat_table->ant_ave[i] > max_rssi) {
163562306a36Sopenharmony_ci				max_rssi = pfat_table->ant_ave[i];
163662306a36Sopenharmony_ci				target_ant = (u8) i;
163762306a36Sopenharmony_ci			}
163862306a36Sopenharmony_ci		}
163962306a36Sopenharmony_ci
164062306a36Sopenharmony_ci		if (!bpkt_filter_match) {
164162306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N,
164262306a36Sopenharmony_ci				      BIT(16), 0);
164362306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
164462306a36Sopenharmony_ci		} else {
164562306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N,
164662306a36Sopenharmony_ci				      BIT(16), 0);
164762306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) |
164862306a36Sopenharmony_ci				      BIT(7) | BIT(6), target_ant);
164962306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
165062306a36Sopenharmony_ci				      BIT(21), 1);
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci			pfat_table->antsel_a[pfat_table->train_idx] =
165362306a36Sopenharmony_ci				target_ant & BIT(0);
165462306a36Sopenharmony_ci			pfat_table->antsel_b[pfat_table->train_idx] =
165562306a36Sopenharmony_ci				(target_ant & BIT(1)) >> 1;
165662306a36Sopenharmony_ci			pfat_table->antsel_c[pfat_table->train_idx] =
165762306a36Sopenharmony_ci				(target_ant & BIT(2)) >> 2;
165862306a36Sopenharmony_ci
165962306a36Sopenharmony_ci			if (target_ant == 0)
166062306a36Sopenharmony_ci				rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
166162306a36Sopenharmony_ci		}
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_ci		for (i = 0; i < 7; i++) {
166462306a36Sopenharmony_ci			pfat_table->ant_sum[i] = 0;
166562306a36Sopenharmony_ci			pfat_table->ant_cnt[i] = 0;
166662306a36Sopenharmony_ci		}
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_ci		pfat_table->fat_state = FAT_NORMAL_STATE;
166962306a36Sopenharmony_ci		return;
167062306a36Sopenharmony_ci	}
167162306a36Sopenharmony_ci
167262306a36Sopenharmony_ci	if (pfat_table->fat_state == FAT_NORMAL_STATE) {
167362306a36Sopenharmony_ci		rtl88e_set_next_mac_address_target(hw);
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_ci		pfat_table->fat_state = FAT_TRAINING_STATE;
167662306a36Sopenharmony_ci		rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N, BIT(16), 1);
167762306a36Sopenharmony_ci		rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
167862306a36Sopenharmony_ci
167962306a36Sopenharmony_ci		mod_timer(&rtlpriv->works.fast_antenna_training_timer,
168062306a36Sopenharmony_ci			  jiffies + MSECS(RTL_WATCH_DOG_TIME));
168162306a36Sopenharmony_ci	}
168262306a36Sopenharmony_ci}
168362306a36Sopenharmony_ci
168462306a36Sopenharmony_civoid rtl88e_dm_fast_antenna_training_callback(struct timer_list *t)
168562306a36Sopenharmony_ci{
168662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv =
168762306a36Sopenharmony_ci		from_timer(rtlpriv, t, works.fast_antenna_training_timer);
168862306a36Sopenharmony_ci	struct ieee80211_hw *hw = rtlpriv->hw;
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	rtl88e_dm_fast_ant_training(hw);
169162306a36Sopenharmony_ci}
169262306a36Sopenharmony_ci
169362306a36Sopenharmony_cistatic void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
169462306a36Sopenharmony_ci{
169562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
169662306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
169762306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
169862306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
169962306a36Sopenharmony_ci	struct fast_ant_training *pfat_table = &rtldm->fat_table;
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_ci	if (mac->link_state < MAC80211_LINKED) {
170262306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "No Link\n");
170362306a36Sopenharmony_ci		if (pfat_table->becomelinked) {
170462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
170562306a36Sopenharmony_ci				"need to turn off HW AntDiv\n");
170662306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
170762306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA1_11N,
170862306a36Sopenharmony_ci				      BIT(15), 0);
170962306a36Sopenharmony_ci			if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
171062306a36Sopenharmony_ci				rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
171162306a36Sopenharmony_ci					      BIT(21), 0);
171262306a36Sopenharmony_ci			pfat_table->becomelinked =
171362306a36Sopenharmony_ci				(mac->link_state == MAC80211_LINKED) ?
171462306a36Sopenharmony_ci				true : false;
171562306a36Sopenharmony_ci		}
171662306a36Sopenharmony_ci		return;
171762306a36Sopenharmony_ci	} else {
171862306a36Sopenharmony_ci		if (!pfat_table->becomelinked) {
171962306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
172062306a36Sopenharmony_ci				"Need to turn on HW AntDiv\n");
172162306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
172262306a36Sopenharmony_ci			rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA1_11N,
172362306a36Sopenharmony_ci				      BIT(15), 1);
172462306a36Sopenharmony_ci			if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
172562306a36Sopenharmony_ci				rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
172662306a36Sopenharmony_ci					      BIT(21), 1);
172762306a36Sopenharmony_ci			pfat_table->becomelinked =
172862306a36Sopenharmony_ci				(mac->link_state >= MAC80211_LINKED) ?
172962306a36Sopenharmony_ci				true : false;
173062306a36Sopenharmony_ci		}
173162306a36Sopenharmony_ci	}
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_ci	if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
173462306a36Sopenharmony_ci	    (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV))
173562306a36Sopenharmony_ci		rtl88e_dm_hw_ant_div(hw);
173662306a36Sopenharmony_ci	else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
173762306a36Sopenharmony_ci		rtl88e_dm_fast_ant_training(hw);
173862306a36Sopenharmony_ci}
173962306a36Sopenharmony_ci
174062306a36Sopenharmony_civoid rtl88e_dm_init(struct ieee80211_hw *hw)
174162306a36Sopenharmony_ci{
174262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
174362306a36Sopenharmony_ci	u32 cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
174462306a36Sopenharmony_ci
174562306a36Sopenharmony_ci	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
174662306a36Sopenharmony_ci	rtl_dm_diginit(hw, cur_igvalue);
174762306a36Sopenharmony_ci	rtl88e_dm_init_dynamic_txpower(hw);
174862306a36Sopenharmony_ci	rtl88e_dm_init_edca_turbo(hw);
174962306a36Sopenharmony_ci	rtl88e_dm_init_rate_adaptive_mask(hw);
175062306a36Sopenharmony_ci	rtl88e_dm_init_txpower_tracking(hw);
175162306a36Sopenharmony_ci	rtl92c_dm_init_dynamic_bb_powersaving(hw);
175262306a36Sopenharmony_ci	rtl88e_dm_antenna_div_init(hw);
175362306a36Sopenharmony_ci}
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_civoid rtl88e_dm_watchdog(struct ieee80211_hw *hw)
175662306a36Sopenharmony_ci{
175762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
175862306a36Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
175962306a36Sopenharmony_ci	bool fw_current_inpsmode = false;
176062306a36Sopenharmony_ci	bool fw_ps_awake = true;
176162306a36Sopenharmony_ci
176262306a36Sopenharmony_ci	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
176362306a36Sopenharmony_ci				      (u8 *)(&fw_current_inpsmode));
176462306a36Sopenharmony_ci	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
176562306a36Sopenharmony_ci				      (u8 *)(&fw_ps_awake));
176662306a36Sopenharmony_ci	if (ppsc->p2p_ps_info.p2p_ps_mode)
176762306a36Sopenharmony_ci		fw_ps_awake = false;
176862306a36Sopenharmony_ci
176962306a36Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_ps_lock);
177062306a36Sopenharmony_ci	if ((ppsc->rfpwr_state == ERFON) &&
177162306a36Sopenharmony_ci	    ((!fw_current_inpsmode) && fw_ps_awake) &&
177262306a36Sopenharmony_ci	    (!ppsc->rfchange_inprogress)) {
177362306a36Sopenharmony_ci		rtl88e_dm_pwdb_monitor(hw);
177462306a36Sopenharmony_ci		rtl88e_dm_dig(hw);
177562306a36Sopenharmony_ci		rtl88e_dm_false_alarm_counter_statistics(hw);
177662306a36Sopenharmony_ci		rtl92c_dm_dynamic_txpower(hw);
177762306a36Sopenharmony_ci		rtl88e_dm_check_txpower_tracking(hw);
177862306a36Sopenharmony_ci		rtl88e_dm_refresh_rate_adaptive_mask(hw);
177962306a36Sopenharmony_ci		rtl88e_dm_check_edca_turbo(hw);
178062306a36Sopenharmony_ci		rtl88e_dm_antenna_diversity(hw);
178162306a36Sopenharmony_ci	}
178262306a36Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_ps_lock);
178362306a36Sopenharmony_ci}
1784