18c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger/******************************************************************************
28c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
3fc6168563aeb26cbc9a9ba9dd168cfdabc6f3778Larry Finger * Copyright(c) 2009-2012  Realtek Corporation.
48c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
58c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * This program is free software; you can redistribute it and/or modify it
68c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * under the terms of version 2 of the GNU General Public License as
78c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * published by the Free Software Foundation.
88c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
98c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * more details.
138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * You should have received a copy of the GNU General Public License along with
158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * this program; if not, write to the Free Software Foundation, Inc.,
168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * The full GNU General Public License is included in this distribution in the
198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * file called LICENSE.
208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * Contact Information:
228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * wlanfae <wlanfae@realtek.com>
238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * Hsinchu 300, Taiwan.
258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger * Larry Finger <Larry.Finger@lwfinger.net>
278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *
288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger *****************************************************************************/
298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
30ee40fa0656a730491765545ff7550f3c1ceb0fbcPaul Gortmaker#include <linux/export.h>
311472d3a87586eb7529d1d85f7c888055650b7208Larry Finger#include "dm_common.h"
32beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#include "phy_common.h"
33beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#include "../pci.h"
34beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#include "../base.h"
351472d3a87586eb7529d1d85f7c888055650b7208Larry Finger
36beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define BT_RSSI_STATE_NORMAL_POWER	BIT_OFFSET_LEN_MASK_32(0, 1)
37beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define BT_RSSI_STATE_AMDPU_OFF		BIT_OFFSET_LEN_MASK_32(1, 1)
38beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define BT_RSSI_STATE_SPECIAL_LOW	BIT_OFFSET_LEN_MASK_32(2, 1)
39beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define BT_RSSI_STATE_BG_EDCA_LOW	BIT_OFFSET_LEN_MASK_32(3, 1)
40beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define BT_RSSI_STATE_TXPOWER_LOW	BIT_OFFSET_LEN_MASK_32(4, 1)
41beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
42beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define RTLPRIV			(struct rtl_priv *)
43beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li#define GET_UNDECORATED_AVERAGE_RSSI(_priv)	\
44beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	((RTLPRIV(_priv))->mac80211.opmode == \
45beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			     NL80211_IFTYPE_ADHOC) ?	\
46da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	((RTLPRIV(_priv))->dm.entry_min_undec_sm_pwdb) : \
47da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	((RTLPRIV(_priv))->dm.undec_sm_pwdb)
48beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic const u32 ofdmswing_table[OFDM_TABLE_SIZE] = {
508c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x7f8001fe,
518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x788001e2,
528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x71c001c7,
538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x6b8001ae,
548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x65400195,
558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x5fc0017f,
568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x5a400169,
578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x55400155,
588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x50800142,
598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x4c000130,
608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x47c0011f,
618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x43c0010f,
628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x40000100,
638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x3c8000f2,
648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x390000e4,
658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x35c000d7,
668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x32c000cb,
678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x300000c0,
688c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x2d4000b5,
698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x2ac000ab,
708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x288000a2,
718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x26000098,
728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x24000090,
738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x22000088,
748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x20000080,
758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x1e400079,
768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x1c800072,
778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x1b00006c,
788c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x19800066,
798c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x18000060,
808c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x16c0005b,
818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x15800056,
828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x14400051,
838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x1300004c,
848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x12000048,
858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x11000044,
868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	0x10000040,
878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger};
888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic const u8 cckswing_table_ch1ch13[CCK_TABLE_SIZE][8] = {
908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},
928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},
948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},
968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},
988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},
1008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
1018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},
1028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
1038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},
1048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
1058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},
1068c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
1078c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},
1088c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
1098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
1108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
1118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},
1128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},
1138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},
1148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},
1158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},
1168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},
1178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},
1188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},
1198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},
1208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},
1218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},
1228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}
1238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger};
1248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
1268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
1278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},
1288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
1298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},
1308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
1318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},
1328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
1338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},
1348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
1358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},
1368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
1378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},
1388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
1398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},
1408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
1418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},
1428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
1438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},
1448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
1458c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
1468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
1478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},
1488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},
1498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
1508c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
1518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},
1528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
1538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
1548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
1558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
1568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
1578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
1588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
1598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger};
1608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
16197204e93f01868eeba6ae5c4f3270f32905bb418Larry Fingerstatic u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
16297204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
16397204e93f01868eeba6ae5c4f3270f32905bb418Larry Fingervoid dm_restorepowerindex(struct ieee80211_hw *hw)
16497204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger{
16597204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
16697204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	u8	index;
16797204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
16897204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	for (index = 0; index < 6; index++)
16997204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger		rtl_write_byte(rtlpriv, power_index_reg[index],
17097204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger			       rtlpriv->dm.powerindex_backup[index]);
17197204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger}
17297204e93f01868eeba6ae5c4f3270f32905bb418Larry FingerEXPORT_SYMBOL_GPL(dm_restorepowerindex);
17397204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
17497204e93f01868eeba6ae5c4f3270f32905bb418Larry Fingervoid dm_writepowerindex(struct ieee80211_hw *hw, u8 value)
17597204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger{
17697204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
17797204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	u8 index;
17897204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
17997204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	for (index = 0; index < 6; index++)
18097204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger		rtl_write_byte(rtlpriv, power_index_reg[index], value);
18197204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger}
18297204e93f01868eeba6ae5c4f3270f32905bb418Larry FingerEXPORT_SYMBOL_GPL(dm_writepowerindex);
18397204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
18497204e93f01868eeba6ae5c4f3270f32905bb418Larry Fingervoid dm_savepowerindex(struct ieee80211_hw *hw)
18597204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger{
18697204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
18797204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	u8 index;
18897204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	u8 tmp;
18997204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
19097204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	for (index = 0; index < 6; index++) {
19197204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger		tmp = rtl_read_byte(rtlpriv, power_index_reg[index]);
19297204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger		rtlpriv->dm.powerindex_backup[index] = tmp;
19397204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger	}
19497204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger}
19597204e93f01868eeba6ae5c4f3270f32905bb418Larry FingerEXPORT_SYMBOL_GPL(dm_savepowerindex);
19697204e93f01868eeba6ae5c4f3270f32905bb418Larry Finger
1978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_diginit(struct ieee80211_hw *hw)
1988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
19940332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
20040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
20140332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger
20240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->dig_enable_flag = true;
20340332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
20440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->cur_igvalue = 0x20;
20540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->pre_igvalue = 0x0;
206da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
207da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->presta_cstate = DIG_STA_DISCONNECT;
208da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
20940332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
21040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
21140332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
21240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
213e6deaf810cc4b6437d55179660776e131ac059dfLarry Finger	dm_digtable->rx_gain_max = DM_DIG_MAX;
214e6deaf810cc4b6437d55179660776e131ac059dfLarry Finger	dm_digtable->rx_gain_min = DM_DIG_MIN;
215da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
216da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
217da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
21840332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
219796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LowRssi;
220796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
221796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->forbidden_igi = DM_DIG_MIN;
222796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->large_fa_hit = 0;
223796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->recover_cnt = 0;
224796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->dig_dynamic_min  = 0x25;
2258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
2268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
2288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
2298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
23040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	long rssi_val_min = 0;
2328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
233da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if ((dm_digtable->curmultista_cstate == DIG_MULTISTA_CONNECT) &&
234da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	    (dm_digtable->cursta_cstate == DIG_STA_CONNECT)) {
235da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		if (rtlpriv->dm.entry_min_undec_sm_pwdb != 0)
2368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rssi_val_min =
237da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			    (rtlpriv->dm.entry_min_undec_sm_pwdb >
238da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			     rtlpriv->dm.undec_sm_pwdb) ?
239da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			    rtlpriv->dm.undec_sm_pwdb :
240da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			    rtlpriv->dm.entry_min_undec_sm_pwdb;
2418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		else
242da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
243da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	} else if (dm_digtable->cursta_cstate == DIG_STA_CONNECT ||
244da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		   dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT) {
245da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
246da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	} else if (dm_digtable->curmultista_cstate == DIG_MULTISTA_CONNECT) {
247da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
2488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
2498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
250796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (rssi_val_min > 100)
251796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rssi_val_min = 100;
252796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	return (u8)rssi_val_min;
2538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
2548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
2568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
2578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	u32 ret_value;
2588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
2598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt);
2608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER1, MASKDWORD);
2628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
2638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER2, MASKDWORD);
2658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
2668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
2678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2688c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
2698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
270796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
271796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	 ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD);
272796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	falsealm_cnt->cnt_fast_fsync_fail = (ret_value & 0xffff);
273796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	falsealm_cnt->cnt_sb_search_fail = ((ret_value & 0xffff0000) >> 16);
274796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
2758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
276796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      falsealm_cnt->cnt_rate_illegal +
277796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      falsealm_cnt->cnt_crc8_fail +
278796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      falsealm_cnt->cnt_mcs_fail +
279796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      falsealm_cnt->cnt_fast_fsync_fail +
280796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      falsealm_cnt->cnt_sb_search_fail;
2818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
2838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
2848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_cck_fail = ret_value;
2858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERUPPER, MASKBYTE3);
2878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;
2888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	falsealm_cnt->cnt_all = (falsealm_cnt->cnt_parity_fail +
2898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				 falsealm_cnt->cnt_rate_illegal +
2908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				 falsealm_cnt->cnt_crc8_fail +
2918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				 falsealm_cnt->cnt_mcs_fail +
2928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				 falsealm_cnt->cnt_cck_fail);
2938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl_set_bbreg(hw, ROFDM1_LSTF, 0x08000000, 1);
2958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl_set_bbreg(hw, ROFDM1_LSTF, 0x08000000, 0);
2968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 0);
2978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 2);
2988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
2998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
300f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
301f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 falsealm_cnt->cnt_parity_fail,
302f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 falsealm_cnt->cnt_rate_illegal,
303f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
3048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
3058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
306f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
307f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 falsealm_cnt->cnt_ofdm_fail,
308f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
3098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
3108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
3118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw)
3128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
3138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
31440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
31540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	u8 value_igi = dm_digtable->cur_igvalue;
3168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
3178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
3188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		value_igi--;
3198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH1)
3208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		value_igi += 0;
3218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH2)
3228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		value_igi++;
3238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else if (rtlpriv->falsealm_cnt.cnt_all >= DM_DIG_FA_TH2)
3248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		value_igi += 2;
325796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
3268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (value_igi > DM_DIG_FA_UPPER)
3278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		value_igi = DM_DIG_FA_UPPER;
3288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else if (value_igi < DM_DIG_FA_LOWER)
3298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		value_igi = DM_DIG_FA_LOWER;
330796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
3318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (rtlpriv->falsealm_cnt.cnt_all > 10000)
332796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		value_igi = DM_DIG_FA_UPPER;
3338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
33440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	dm_digtable->cur_igvalue = value_igi;
3358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_write_dig(hw);
3368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
3378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
3388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw)
3398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
3408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
341da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	struct dig_t *digtable = &rtlpriv->dm_digtable;
342796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	u32 isbt;
343796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
344796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	/* modify DIG lower bound, deal with abnorally large false alarm */
345796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
346796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		digtable->large_fa_hit++;
347796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (digtable->forbidden_igi < digtable->cur_igvalue) {
348796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->forbidden_igi = digtable->cur_igvalue;
349796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->large_fa_hit = 1;
350796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		}
3518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
352796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (digtable->large_fa_hit >= 3) {
353796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			if ((digtable->forbidden_igi + 1) >
354796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			    digtable->rx_gain_max)
355796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				digtable->rx_gain_min = digtable->rx_gain_max;
356796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			else
357796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				digtable->rx_gain_min = (digtable->forbidden_igi + 1);
358796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->recover_cnt = 3600; /* 3600=2hr */
359796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		}
360796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	} else {
361796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		/* Recovery mechanism for IGI lower bound */
362796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (digtable->recover_cnt != 0) {
363796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->recover_cnt--;
364796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		} else {
365796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			if (digtable->large_fa_hit == 0) {
366796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				if ((digtable->forbidden_igi-1) < DM_DIG_MIN) {
367796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->forbidden_igi = DM_DIG_MIN;
368796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->rx_gain_min = DM_DIG_MIN;
369796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				} else {
370796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->forbidden_igi--;
371796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->rx_gain_min = digtable->forbidden_igi + 1;
372796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				}
373796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			} else if (digtable->large_fa_hit == 3) {
374796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				digtable->large_fa_hit = 0;
375796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			}
376796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		}
377796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	}
378796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (rtlpriv->falsealm_cnt.cnt_all < 250) {
379796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		isbt = rtl_read_byte(rtlpriv, 0x4fd) & 0x01;
380796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
381796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (!isbt) {
382796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			if (rtlpriv->falsealm_cnt.cnt_all >
383796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			    digtable->fa_lowthresh) {
384796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				if ((digtable->back_val - 2) <
385796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				   digtable->back_range_min)
386796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->back_val = digtable->back_range_min;
387796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				else
388796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->back_val -= 2;
389796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			} else if (rtlpriv->falsealm_cnt.cnt_all <
390796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				   digtable->fa_lowthresh) {
391796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				if ((digtable->back_val + 2) >
392796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				    digtable->back_range_max)
393796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->back_val = digtable->back_range_max;
394796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				else
395796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger					digtable->back_val += 2;
396796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			}
397796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		} else {
398796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
399796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		}
400796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	} else {
401796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		/* Adjust initial gain by false alarm */
402796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (rtlpriv->falsealm_cnt.cnt_all > 1000)
403796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->cur_igvalue = digtable->pre_igvalue + 2;
404796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		else if (rtlpriv->falsealm_cnt.cnt_all > 750)
405796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->cur_igvalue = digtable->pre_igvalue + 1;
406796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		else if (rtlpriv->falsealm_cnt.cnt_all < 500)
407796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			digtable->cur_igvalue = digtable->pre_igvalue - 1;
4088c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
4098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
410796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	/* Check initial gain by upper/lower bound */
411796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (digtable->cur_igvalue > digtable->rx_gain_max)
412e6deaf810cc4b6437d55179660776e131ac059dfLarry Finger		digtable->cur_igvalue = digtable->rx_gain_max;
4138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
414796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (digtable->cur_igvalue < digtable->rx_gain_min)
415796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		digtable->cur_igvalue = digtable->rx_gain_min;
4168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
4178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_write_dig(hw);
4188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
4198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
4208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
4218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
4222b8359f85b81dfe02a631e570582290859191756Chaoming_Li	static u8 initialized; /* initialized to false */
4238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
42440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
4258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
426da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	long rssi_strength = rtlpriv->dm.entry_min_undec_sm_pwdb;
4277ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	bool multi_sta = false;
4288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
4298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (mac->opmode == NL80211_IFTYPE_ADHOC)
4307ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger		multi_sta = true;
4318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
43223677ce3172fcb93522a1df077d21019e73ee1e3Joe Perches	if (!multi_sta ||
433796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	    dm_digtable->cursta_cstate == DIG_STA_DISCONNECT) {
4342b8359f85b81dfe02a631e570582290859191756Chaoming_Li		initialized = false;
43540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
4368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
4372b8359f85b81dfe02a631e570582290859191756Chaoming_Li	} else if (initialized == false) {
4382b8359f85b81dfe02a631e570582290859191756Chaoming_Li		initialized = true;
43940332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
44040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->cur_igvalue = 0x20;
4418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_write_dig(hw);
4428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
4438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
444da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (dm_digtable->curmultista_cstate == DIG_MULTISTA_CONNECT) {
44540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		if ((rssi_strength < dm_digtable->rssi_lowthresh) &&
44640332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		    (dm_digtable->dig_ext_port_stage != DIG_EXT_PORT_STAGE_1)) {
4478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
44840332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			if (dm_digtable->dig_ext_port_stage ==
4498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			    DIG_EXT_PORT_STAGE_2) {
45040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger				dm_digtable->cur_igvalue = 0x20;
4518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl92c_dm_write_dig(hw);
4528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
4538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
45440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_1;
45540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		} else if (rssi_strength > dm_digtable->rssi_highthresh) {
45640332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_2;
4578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl92c_dm_ctrl_initgain_by_fa(hw);
4588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
45940332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	} else if (dm_digtable->dig_ext_port_stage != DIG_EXT_PORT_STAGE_0) {
46040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
46140332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->cur_igvalue = 0x20;
4628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_write_dig(hw);
4638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
4648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
4658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
466da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		 "curmultista_cstate = %x dig_ext_port_stage %x\n",
467da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		 dm_digtable->curmultista_cstate,
46840332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		 dm_digtable->dig_ext_port_stage);
4698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
4708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
4718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw)
4728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
4738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
47440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
4758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
4768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
477da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		 "presta_cstate = %x, cursta_cstate = %x\n",
478da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		 dm_digtable->presta_cstate, dm_digtable->cursta_cstate);
479da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate ||
480da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	    dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT ||
481da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	    dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
4828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
483da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) {
48440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			dm_digtable->rssi_val_min =
4858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			    rtl92c_dm_initial_gain_min_pwdb(hw);
486796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			if (dm_digtable->rssi_val_min > 100)
487796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				dm_digtable->rssi_val_min = 100;
4888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl92c_dm_ctrl_initgain_by_rssi(hw);
4898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
4908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	} else {
49140332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->rssi_val_min = 0;
49240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
493da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
49440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->cur_igvalue = 0x20;
49540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->pre_igvalue = 0;
4968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_write_dig(hw);
4978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
4988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
4998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
5018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
5028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
50340332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
5048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
505da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
50640332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw);
507796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (dm_digtable->rssi_val_min > 100)
508796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			dm_digtable->rssi_val_min = 100;
5098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
51040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
51140332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			if (dm_digtable->rssi_val_min <= 25)
51240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger				dm_digtable->cur_cck_pd_state =
5138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    CCK_PD_STAGE_LowRssi;
5148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			else
51540332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger				dm_digtable->cur_cck_pd_state =
5168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    CCK_PD_STAGE_HighRssi;
5178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		} else {
51840332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			if (dm_digtable->rssi_val_min <= 20)
51940332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger				dm_digtable->cur_cck_pd_state =
5208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    CCK_PD_STAGE_LowRssi;
5218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			else
52240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger				dm_digtable->cur_cck_pd_state =
5238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    CCK_PD_STAGE_HighRssi;
5248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
5258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	} else {
52640332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
5278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
5288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
52940332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) {
530796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if ((dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) ||
531796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		    (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_MAX))
532796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0x83);
533796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		else
5348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0xcd);
5358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
53640332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->pre_cck_pd_state = dm_digtable->cur_cck_pd_state;
5378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
5388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
5398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
5418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
54240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
54340332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
5448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
5458c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
546e10542c447abf7c840931ff12f7d0dee976ca2eaMike McCormack	if (mac->act_scanning)
5478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
5488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
549beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (mac->link_state >= MAC80211_LINKED)
550da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		dm_digtable->cursta_cstate = DIG_STA_CONNECT;
5518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else
552da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
5538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
554796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
555796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
5568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_initial_gain_sta(hw);
5578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_initial_gain_multi_sta(hw);
5588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_cck_packet_detection_thresh(hw);
5598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
560da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	dm_digtable->presta_cstate = dm_digtable->cursta_cstate;
5618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
5638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_dig(struct ieee80211_hw *hw)
5658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
5668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
5678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5687ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	if (rtlpriv->dm.dm_initialgain_enable == false)
5698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
5707f3dbb563658f6f24ba52ba336f652d9f9b5fca4Larry Finger	if (!(rtlpriv->dm.dm_flag & DYNAMIC_FUNC_DIG))
5718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
5728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_ctrl_initgain_by_twoport(hw);
5748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
5758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
5778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
5788c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
5798c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
580796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (rtlpriv->rtlhal.interface == INTF_USB &&
581796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	    rtlpriv->rtlhal.board_type & 0x1) {
582796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		dm_savepowerindex(hw);
583796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.dynamic_txpower_enable = true;
584796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	} else {
585796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.dynamic_txpower_enable = false;
586796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	}
5878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
5888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
5898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
5908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_write_dig(struct ieee80211_hw *hw)
5928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
5938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
59440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
5958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
5968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
597da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, back_val = %d\n",
59840332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
599da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		 dm_digtable->back_val);
6008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
601796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (rtlpriv->rtlhal.interface == INTF_USB &&
602796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	    !dm_digtable->dig_enable_flag) {
603796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		dm_digtable->pre_igvalue = 0x17;
604796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		return;
605796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	}
606796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	dm_digtable->cur_igvalue -= 1;
607796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (dm_digtable->cur_igvalue < DM_DIG_MIN)
608796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		dm_digtable->cur_igvalue = DM_DIG_MIN;
609a9b89e2567c743483e6354f64d7a7e3a8c101e9eJingjun Wu
61040332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger	if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) {
6118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
61240332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			      dm_digtable->cur_igvalue);
6138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f,
61440332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger			      dm_digtable->cur_igvalue);
6158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
61640332e5fd3fff3cb4ab3ceb173033dcfab4d48d5Larry Finger		dm_digtable->pre_igvalue = dm_digtable->cur_igvalue;
6178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
618796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	RT_TRACE(rtlpriv, COMP_DIG, DBG_WARNING,
619796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		 "dig values 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
620796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
621796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		 dm_digtable->rssi_val_min, dm_digtable->back_val,
622796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		 dm_digtable->rx_gain_max, dm_digtable->rx_gain_min,
623796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		 dm_digtable->large_fa_hit, dm_digtable->forbidden_igi);
6248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
6251472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_write_dig);
6268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
6278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_pwdb_monitor(struct ieee80211_hw *hw)
6288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
629796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
630796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
631796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	long tmpentry_max_pwdb = 0, tmpentry_min_pwdb = 0xff;
632796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
633796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (mac->link_state != MAC80211_LINKED)
634796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		return;
635796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
636796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (mac->opmode == NL80211_IFTYPE_ADHOC ||
637796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	    mac->opmode == NL80211_IFTYPE_AP) {
638796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		/* TODO: Handle ADHOC and AP Mode */
639796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	}
640796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
641796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (tmpentry_max_pwdb != 0)
642796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.entry_max_undec_sm_pwdb = tmpentry_max_pwdb;
643796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	else
644796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
645796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
646796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (tmpentry_min_pwdb != 0xff)
647796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.entry_min_undec_sm_pwdb = tmpentry_min_pwdb;
648796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	else
649796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
650796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
651796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger/* TODO:
652796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger *	if (mac->opmode == NL80211_IFTYPE_STATION) {
653796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger *		if (rtlpriv->rtlhal.fw_ready) {
654796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger *			u32 param = (u32)(rtlpriv->dm.undec_sm_pwdb << 16);
655796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger *			rtl8192c_set_rssi_cmd(hw, param);
656796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger *		}
657796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger *	}
658796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger */
6598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
6608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
6618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_init_edca_turbo(struct ieee80211_hw *hw)
6628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
6638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
6647ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	rtlpriv->dm.current_turbo_edca = false;
6657ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	rtlpriv->dm.is_any_nonbepkts = false;
6667ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	rtlpriv->dm.is_cur_rdlstate = false;
6678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
6681472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_init_edca_turbo);
6698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
6708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw)
6718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
6728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
673beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
6748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
675beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
6768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	static u64 last_txok_cnt;
6778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	static u64 last_rxok_cnt;
678beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	static u32 last_bt_edca_ul;
679beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	static u32 last_bt_edca_dl;
680beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u64 cur_txok_cnt = 0;
681beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u64 cur_rxok_cnt = 0;
6828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	u32 edca_be_ul = 0x5ea42b;
6838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	u32 edca_be_dl = 0x5ea42b;
684beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bool bt_change_edca = false;
6858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
686beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((last_bt_edca_ul != rtlpcipriv->bt_coexist.bt_edca_ul) ||
687beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	    (last_bt_edca_dl != rtlpcipriv->bt_coexist.bt_edca_dl)) {
688beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->dm.current_turbo_edca = false;
689beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		last_bt_edca_ul = rtlpcipriv->bt_coexist.bt_edca_ul;
690beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		last_bt_edca_dl = rtlpcipriv->bt_coexist.bt_edca_dl;
691beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
692beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
693beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_edca_ul != 0) {
694beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_ul;
695beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		bt_change_edca = true;
696beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
697beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
698beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_edca_dl != 0) {
699beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_dl;
700beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		bt_change_edca = true;
701beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
7028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (mac->link_state != MAC80211_LINKED) {
7047ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger		rtlpriv->dm.current_turbo_edca = false;
7058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
7068c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
7078c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
708beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((!mac->ht_enable) && (!rtlpcipriv->bt_coexist.bt_coexistence)) {
7098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (!(edca_be_ul & 0xffff0000))
7108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			edca_be_ul |= 0x005e0000;
7118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (!(edca_be_dl & 0xffff0000))
7138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			edca_be_dl |= 0x005e0000;
7148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
7158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
716beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((bt_change_edca) || ((!rtlpriv->dm.is_any_nonbepkts) &&
717beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	     (!rtlpriv->dm.disable_framebursting))) {
718beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
7198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
7208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
721beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
7228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (cur_rxok_cnt > 4 * cur_txok_cnt) {
7237ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			if (!rtlpriv->dm.is_cur_rdlstate ||
7247ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			    !rtlpriv->dm.current_turbo_edca) {
7258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_dword(rtlpriv,
7268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						REG_EDCA_BE_PARAM,
7278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						edca_be_dl);
7287ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger				rtlpriv->dm.is_cur_rdlstate = true;
7298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
7308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		} else {
7317ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			if (rtlpriv->dm.is_cur_rdlstate ||
7327ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			    !rtlpriv->dm.current_turbo_edca) {
7338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_dword(rtlpriv,
7348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						REG_EDCA_BE_PARAM,
7358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						edca_be_ul);
7367ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger				rtlpriv->dm.is_cur_rdlstate = false;
7378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
7388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
7397ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger		rtlpriv->dm.current_turbo_edca = true;
7408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	} else {
7417ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger		if (rtlpriv->dm.current_turbo_edca) {
7428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			u8 tmp = AC0_BE;
7432c208890c6d4e16076c6664137703ec813e8fa6cJoe Perches			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
7442c208890c6d4e16076c6664137703ec813e8fa6cJoe Perches						      &tmp);
7457ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			rtlpriv->dm.current_turbo_edca = false;
7468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
7478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
7488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7497ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	rtlpriv->dm.is_any_nonbepkts = false;
7508c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	last_txok_cnt = rtlpriv->stats.txbytesunicast;
7518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
7528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
7538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
7558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger							     *hw)
7568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
7578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
7588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
7598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_phy *rtlphy = &(rtlpriv->phy);
7608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
7618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	u8 thermalvalue, delta, delta_lck, delta_iqk;
7628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	long ele_a, ele_d, temp_cck, val_x, value32;
763beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	long val_y, ele_c = 0;
7647c8f0db0d024efda38976fc2acf7743f458e1d96Han Shen	u8 ofdm_index[2], ofdm_index_old[2] = {0, 0}, cck_index_old = 0;
7658a8e31cc22739d1a5780591c008940292edcde87Larry Finger	s8 cck_index = 0;
7668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	int i;
7678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	bool is2t = IS_92C_SERIAL(rtlhal->version);
768d0df71dcd99935f58012d38b7287312935c44fbdLarry Finger	s8 txpwr_level[3] = {0, 0, 0};
7698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	u8 ofdm_min_index = 6, rf;
7708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7713dad618b7b929010f05b179bbc4d56e3d5956083Chaoming_Li	rtlpriv->dm.txpower_trackinginit = true;
7728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
773f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 "rtl92c_dm_txpower_tracking_callback_thermalmeter\n");
7748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	thermalvalue = (u8) rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0x1f);
7768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
778f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
779f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 thermalvalue, rtlpriv->dm.thermalvalue,
780f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 rtlefuse->eeprom_thermalmeter);
7818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_phy_ap_calibrate(hw, (thermalvalue -
7838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				     rtlefuse->eeprom_thermalmeter));
7848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (is2t)
7858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rf = 2;
7868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else
7878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rf = 1;
7888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (thermalvalue) {
7908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
7918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				      MASKDWORD) & MASKOFDM_D;
7928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
7948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
7958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				ofdm_index_old[0] = (u8) i;
7968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
7978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
798f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
7998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					 ROFDM0_XATXIQIMBALANCE,
800f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 ele_d, ofdm_index_old[0]);
8018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				break;
8028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
8038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
8048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (is2t) {
8068c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			ele_d = rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
8078c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      MASKDWORD) & MASKOFDM_D;
8088c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
8108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (ele_d == (ofdmswing_table[i] &
8118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    MASKOFDM_D)) {
8127c8f0db0d024efda38976fc2acf7743f458e1d96Han Shen					ofdm_index_old[1] = (u8) i;
8138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
814f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 DBG_LOUD,
815f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 "Initial pathB ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
816f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 ROFDM0_XBTXIQIMBALANCE, ele_d,
817f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 ofdm_index_old[1]);
8188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					break;
8198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				}
8208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
8218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
8228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		temp_cck =
8248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    rtl_get_bbreg(hw, RCCK0_TXFILTER2, MASKDWORD) & MASKCCK;
8258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		for (i = 0; i < CCK_TABLE_LENGTH; i++) {
8277ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			if (rtlpriv->dm.cck_inch14) {
8288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (memcmp((void *)&temp_cck,
8298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   (void *)&cckswing_table_ch14[i][2],
8308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   4) == 0) {
8318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					cck_index_old = (u8) i;
8328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
8348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						 DBG_LOUD,
835f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 "Initial reg0x%x = 0x%lx, cck_index=0x%x, ch 14 %d\n",
836f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 RCCK0_TXFILTER2, temp_cck,
837f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 cck_index_old,
838f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 rtlpriv->dm.cck_inch14);
8398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					break;
8408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				}
8418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
8428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (memcmp((void *)&temp_cck,
8438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   (void *)
8448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   &cckswing_table_ch1ch13[i][2],
8458c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   4) == 0) {
8468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					cck_index_old = (u8) i;
8478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
8498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						 DBG_LOUD,
850f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 "Initial reg0x%x = 0x%lx, cck_index=0x%x, ch14 %d\n",
851f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 RCCK0_TXFILTER2, temp_cck,
852f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 cck_index_old,
853f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches						 rtlpriv->dm.cck_inch14);
8548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					break;
8558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				}
8568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
8578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
8588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (!rtlpriv->dm.thermalvalue) {
8608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.thermalvalue =
8618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			    rtlefuse->eeprom_thermalmeter;
8628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.thermalvalue_lck = thermalvalue;
8638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.thermalvalue_iqk = thermalvalue;
8648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			for (i = 0; i < rf; i++)
8658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
8668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.cck_index = cck_index_old;
8678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
868796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		/* Handle USB High PA boards */
8698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
8718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    (thermalvalue - rtlpriv->dm.thermalvalue) :
8728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    (rtlpriv->dm.thermalvalue - thermalvalue);
8738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
8758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
8768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    (rtlpriv->dm.thermalvalue_lck - thermalvalue);
8778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8788c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
8798c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
8808c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		    (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
8818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
883f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "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",
8848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			 thermalvalue, rtlpriv->dm.thermalvalue,
8858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			 rtlefuse->eeprom_thermalmeter, delta, delta_lck,
886f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 delta_iqk);
8878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (delta_lck > 1) {
8898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.thermalvalue_lck = thermalvalue;
8908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl92c_phy_lc_calibrate(hw);
8918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
8928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
8938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (delta > 0 && rtlpriv->dm.txpower_track_control) {
8948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (thermalvalue > rtlpriv->dm.thermalvalue) {
8958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				for (i = 0; i < rf; i++)
8968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtlpriv->dm.ofdm_index[i] -= delta;
8978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtlpriv->dm.cck_index -= delta;
8988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
8998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				for (i = 0; i < rf; i++)
9008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtlpriv->dm.ofdm_index[i] += delta;
9018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtlpriv->dm.cck_index += delta;
9028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
9038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (is2t) {
9058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
906f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 "temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, cck_index=0x%x\n",
907f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 rtlpriv->dm.ofdm_index[0],
908f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 rtlpriv->dm.ofdm_index[1],
909f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 rtlpriv->dm.cck_index);
9108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
9118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
912f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 "temp OFDM_A_index=0x%x, cck_index=0x%x\n",
913f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 rtlpriv->dm.ofdm_index[0],
914f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 rtlpriv->dm.cck_index);
9158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
9168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (thermalvalue > rtlefuse->eeprom_thermalmeter) {
9188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				for (i = 0; i < rf; i++)
9198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ofdm_index[i] =
9208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    rtlpriv->dm.ofdm_index[i]
9218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    + 1;
9228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				cck_index = rtlpriv->dm.cck_index + 1;
9238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
9248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				for (i = 0; i < rf; i++)
9258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ofdm_index[i] =
9268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    rtlpriv->dm.ofdm_index[i];
9278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				cck_index = rtlpriv->dm.cck_index;
9288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
9298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			for (i = 0; i < rf; i++) {
9318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (txpwr_level[i] >= 0 &&
9328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    txpwr_level[i] <= 26) {
9338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					if (thermalvalue >
9348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    rtlefuse->eeprom_thermalmeter) {
9358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						if (delta < 5)
9368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger							ofdm_index[i] -= 1;
9378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						else
9398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger							ofdm_index[i] -= 2;
9408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					} else if (delta > 5 && thermalvalue <
9418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						   rtlefuse->
9428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						   eeprom_thermalmeter) {
9438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						ofdm_index[i] += 1;
9448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					}
9458c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				} else if (txpwr_level[i] >= 27 &&
9468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   txpwr_level[i] <= 32
9478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   && thermalvalue >
9488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   rtlefuse->eeprom_thermalmeter) {
9498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					if (delta < 5)
9508c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						ofdm_index[i] -= 1;
9518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					else
9538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						ofdm_index[i] -= 2;
9548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				} else if (txpwr_level[i] >= 32 &&
9558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   txpwr_level[i] <= 38 &&
9568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   thermalvalue >
9578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   rtlefuse->eeprom_thermalmeter
9588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   && delta > 5) {
9598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ofdm_index[i] -= 1;
9608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				}
9618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
9628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (txpwr_level[i] >= 0 && txpwr_level[i] <= 26) {
9648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (thermalvalue >
9658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    rtlefuse->eeprom_thermalmeter) {
9668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					if (delta < 5)
9678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						cck_index -= 1;
9688c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					else
9708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						cck_index -= 2;
9718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				} else if (delta > 5 && thermalvalue <
9728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					   rtlefuse->eeprom_thermalmeter) {
9738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					cck_index += 1;
9748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				}
9758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else if (txpwr_level[i] >= 27 &&
9768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				   txpwr_level[i] <= 32 &&
9778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				   thermalvalue >
9788c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				   rtlefuse->eeprom_thermalmeter) {
9798c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (delta < 5)
9808c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					cck_index -= 1;
9818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				else
9838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					cck_index -= 2;
9848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else if (txpwr_level[i] >= 32 &&
9858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				   txpwr_level[i] <= 38 &&
9868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				   thermalvalue > rtlefuse->eeprom_thermalmeter
9878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				   && delta > 5) {
9888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				cck_index -= 1;
9898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
9908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			for (i = 0; i < rf; i++) {
9928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (ofdm_index[i] > OFDM_TABLE_SIZE - 1)
9938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ofdm_index[i] = OFDM_TABLE_SIZE - 1;
9948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				else if (ofdm_index[i] < ofdm_min_index)
9968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ofdm_index[i] = ofdm_min_index;
9978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
9988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
9998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (cck_index > CCK_TABLE_SIZE - 1)
10008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				cck_index = CCK_TABLE_SIZE - 1;
10018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			else if (cck_index < 0)
10028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				cck_index = 0;
10038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (is2t) {
10058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1006f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 "new OFDM_A_index=0x%x, OFDM_B_index=0x%x, cck_index=0x%x\n",
1007f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 ofdm_index[0], ofdm_index[1],
1008f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 cck_index);
10098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
10108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1011f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 "new OFDM_A_index=0x%x, cck_index=0x%x\n",
1012f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches					 ofdm_index[0], cck_index);
10138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
10148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
10158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (rtlpriv->dm.txpower_track_control && delta != 0) {
10178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			ele_d =
10188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			    (ofdmswing_table[ofdm_index[0]] & 0xFFC00000) >> 22;
10198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			val_x = rtlphy->reg_e94;
10208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			val_y = rtlphy->reg_e9c;
10218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (val_x != 0) {
10238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if ((val_x & 0x00000200) != 0)
10248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					val_x = val_x | 0xFFFFFC00;
10258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				ele_a = ((val_x * ele_d) >> 8) & 0x000003FF;
10268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if ((val_y & 0x00000200) != 0)
10288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					val_y = val_y | 0xFFFFFC00;
10298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				ele_c = ((val_y * ele_d) >> 8) & 0x000003FF;
10308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				value32 = (ele_d << 22) |
10328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				    ((ele_c & 0x3F) << 16) | ele_a;
10338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
10358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      MASKDWORD, value32);
10368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				value32 = (ele_c & 0x000003C0) >> 6;
10388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
10398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      value32);
10408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				value32 = ((val_x * ele_d) >> 7) & 0x01;
10428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
10438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      BIT(31), value32);
10448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10458c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				value32 = ((val_y * ele_d) >> 7) & 0x01;
10468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
10478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      BIT(29), value32);
10488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
10498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
10508c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      MASKDWORD,
10518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      ofdmswing_table[ofdm_index[0]]);
10528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
10548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      0x00);
10558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
10568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					      BIT(31) | BIT(29), 0x00);
10578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
10588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
10597ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger			if (!rtlpriv->dm.cck_inch14) {
10608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa22,
10618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [0]);
10638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa23,
10648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [1]);
10668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa24,
10678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10688c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [2]);
10698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa25,
10708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [3]);
10728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa26,
10738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [4]);
10758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa27,
10768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [5]);
10788c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa28,
10798c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10808c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [6]);
10818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa29,
10828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch1ch13[cck_index]
10838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [7]);
10848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
10858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa22,
10868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
10878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [0]);
10888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa23,
10898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
10908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [1]);
10918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa24,
10928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
10938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [2]);
10948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa25,
10958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
10968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [3]);
10978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa26,
10988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
10998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [4]);
11008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa27,
11018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
11028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [5]);
11038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa28,
11048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
11058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [6]);
11068c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				rtl_write_byte(rtlpriv, 0xa29,
11078c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       cckswing_table_ch14[cck_index]
11088c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					       [7]);
11098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
11108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			if (is2t) {
11128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				ele_d = (ofdmswing_table[ofdm_index[1]] &
11138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					 0xFFC00000) >> 22;
11148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11158c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				val_x = rtlphy->reg_eb4;
11168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				val_y = rtlphy->reg_ebc;
11178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				if (val_x != 0) {
11198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					if ((val_x & 0x00000200) != 0)
11208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						val_x = val_x | 0xFFFFFC00;
11218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ele_a = ((val_x * ele_d) >> 8) &
11228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    0x000003FF;
11238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					if ((val_y & 0x00000200) != 0)
11258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						val_y = val_y | 0xFFFFFC00;
11268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					ele_c = ((val_y * ele_d) >> 8) &
11278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    0x00003FF;
11288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					value32 = (ele_d << 22) |
11308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					    ((ele_c & 0x3F) << 16) | ele_a;
11318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw,
11328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      ROFDM0_XBTXIQIMBALANCE,
11338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      MASKDWORD, value32);
11348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					value32 = (ele_c & 0x000003C0) >> 6;
11368c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
11378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      MASKH4BITS, value32);
11388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					value32 = ((val_x * ele_d) >> 7) & 0x01;
11408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
11418c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      BIT(27), value32);
11428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					value32 = ((val_y * ele_d) >> 7) & 0x01;
11448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
11458c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      BIT(25), value32);
11468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				} else {
11478c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw,
11488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      ROFDM0_XBTXIQIMBALANCE,
11498c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      MASKDWORD,
11508c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      ofdmswing_table[ofdm_index
11518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger								      [1]]);
11528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
11538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      MASKH4BITS, 0x00);
11548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger					rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
11558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						      BIT(27) | BIT(25), 0x00);
11568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				}
11578c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11588c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
11598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
11608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11618c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (delta_iqk > 3) {
11628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.thermalvalue_iqk = thermalvalue;
11638c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl92c_phy_iq_calibrate(hw, false);
11648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
11658c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (rtlpriv->dm.txpower_track_control)
11678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtlpriv->dm.thermalvalue = thermalvalue;
11688c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
11698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1170f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "<===\n");
11718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
11738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_initialize_txpower_tracking_thermalmeter(
11758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						struct ieee80211_hw *hw)
11768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
11778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
11788c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11797ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	rtlpriv->dm.txpower_tracking = true;
11803dad618b7b929010f05b179bbc4d56e3d5956083Chaoming_Li	rtlpriv->dm.txpower_trackinginit = false;
11818c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1183f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 "pMgntInfo->txpower_tracking = %d\n",
1184f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		 rtlpriv->dm.txpower_tracking);
11858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
11868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
11888c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
11898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_initialize_txpower_tracking_thermalmeter(hw);
11908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
11918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_txpower_tracking_directcall(struct ieee80211_hw *hw)
11938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
11948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_txpower_tracking_callback_thermalmeter(hw);
11958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
11968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
11978c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_check_txpower_tracking_thermal_meter(
11988c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger						struct ieee80211_hw *hw)
11998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
12008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
12018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	static u8 tm_trigger;
12028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12037ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	if (!rtlpriv->dm.txpower_tracking)
12048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
12058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12068c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (!tm_trigger) {
12078c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, RFREG_OFFSET_MASK,
12088c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			      0x60);
12098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1210f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "Trigger 92S Thermal Meter!!\n");
12118c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		tm_trigger = 1;
12128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		return;
12138c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	} else {
12148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1215f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "Schedule TxPowerTracking direct call!!\n");
12168c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_txpower_tracking_directcall(hw);
12178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		tm_trigger = 0;
12188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
12198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
12208c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_check_txpower_tracking(struct ieee80211_hw *hw)
12228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
12238c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_check_txpower_tracking_thermal_meter(hw);
12248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
12251472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_check_txpower_tracking);
12268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
12288c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
12298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
12308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rate_adaptive *p_ra = &(rtlpriv->ra);
12318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12328c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	p_ra->ratr_state = DM_RATR_STA_INIT;
12338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	p_ra->pre_ratr_state = DM_RATR_STA_INIT;
12348c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12358c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
12367ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger		rtlpriv->dm.useramask = true;
12378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	else
12387ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger		rtlpriv->dm.useramask = false;
12398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
12411472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_init_rate_adaptive_mask);
12428c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
12448c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
1245d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
1246d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1247d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger
1248d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	dm_pstable->pre_ccastate = CCA_MAX;
1249d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	dm_pstable->cur_ccasate = CCA_MAX;
1250d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	dm_pstable->pre_rfstate = RF_MAX;
1251d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	dm_pstable->cur_rfstate = RF_MAX;
1252d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	dm_pstable->rssi_val_min = 0;
12538c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
12548c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal)
12568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
1257d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
1258d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
12598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1260796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	if (!rtlpriv->reg_init) {
1261796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->reg_874 = (rtl_get_bbreg(hw,
1262796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger						  RFPGA0_XCD_RFINTERFACESW,
1263796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger						  MASKDWORD) & 0x1CC000) >> 14;
12648c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1265796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1,
1266796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				    MASKDWORD) & BIT(3)) >> 3;
12678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1268796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL,
1269796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				    MASKDWORD) & 0xFF000000) >> 24;
12708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1271796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) &
1272796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				    0xF000) >> 12;
12738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1274796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->reg_init = true;
12758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
12768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
12778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (!bforce_in_normal) {
1278d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger		if (dm_pstable->rssi_val_min != 0) {
1279d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger			if (dm_pstable->pre_rfstate == RF_NORMAL) {
1280d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger				if (dm_pstable->rssi_val_min >= 30)
1281d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger					dm_pstable->cur_rfstate = RF_SAVE;
12828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				else
1283d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger					dm_pstable->cur_rfstate = RF_NORMAL;
12848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			} else {
1285d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger				if (dm_pstable->rssi_val_min <= 25)
1286d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger					dm_pstable->cur_rfstate = RF_NORMAL;
12878c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				else
1288d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger					dm_pstable->cur_rfstate = RF_SAVE;
12898c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			}
12908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		} else {
1291d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger			dm_pstable->cur_rfstate = RF_MAX;
12928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
12938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	} else {
1294d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger		dm_pstable->cur_rfstate = RF_NORMAL;
12958c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
12968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1297d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	if (dm_pstable->pre_rfstate != dm_pstable->cur_rfstate) {
1298d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger		if (dm_pstable->cur_rfstate == RF_SAVE) {
12998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
13008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				      0x1C0000, 0x2);
13018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3), 0);
13028c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL,
13038c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				      0xFF000000, 0x63);
13048c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
13058c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger				      0xC000, 0x2);
13068c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, 0xa74, 0xF000, 0x3);
13078c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, 0x818, BIT(28), 0x0);
13088c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, 0x818, BIT(28), 0x1);
13098c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		} else {
13108c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
1311796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      0x1CC000, rtlpriv->reg_874);
13128c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3),
1313796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      rtlpriv->reg_c70);
13148c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000,
1315796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger				      rtlpriv->reg_85c);
1316796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			rtl_set_bbreg(hw, 0xa74, 0xF000, rtlpriv->reg_a74);
13178c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			rtl_set_bbreg(hw, 0x818, BIT(28), 0x0);
13188c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
13198c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1320d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger		dm_pstable->pre_rfstate = dm_pstable->cur_rfstate;
13218c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
13228c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
13231472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_rf_saving);
13248c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
13258c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingerstatic void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw)
13268c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
13278c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
1328d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger	struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
13298c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
13308c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
13318c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1332796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	/* Determine the minimum RSSI */
13338c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (((mac->link_state == MAC80211_NOLINK)) &&
1334da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	    (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
1335d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger		dm_pstable->rssi_val_min = 0;
1336f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches		RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, "Not connected to any\n");
13378c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
13388c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
13398c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (mac->link_state == MAC80211_LINKED) {
13408c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		if (mac->opmode == NL80211_IFTYPE_ADHOC) {
1341d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger			dm_pstable->rssi_val_min =
1342da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			    rtlpriv->dm.entry_min_undec_sm_pwdb;
13438c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
1344f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches				 "AP Client PWDB = 0x%lx\n",
1345d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger				 dm_pstable->rssi_val_min);
13468c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		} else {
1347da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			dm_pstable->rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
13488c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger			RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
1349f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches				 "STA Default Port PWDB = 0x%lx\n",
1350d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger				 dm_pstable->rssi_val_min);
13518c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		}
13528c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	} else {
1353d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger		dm_pstable->rssi_val_min =
1354da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		    rtlpriv->dm.entry_min_undec_sm_pwdb;
13558c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
13568c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
1357f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "AP Ext Port PWDB = 0x%lx\n",
1358d10dc6d1b7655ce1208499d443ca2054ae2d43feLarry Finger			 dm_pstable->rssi_val_min);
13598c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
13608c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1361796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	/* Power Saving for 92C */
13628c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	if (IS_92C_SERIAL(rtlhal->version))
1363beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		;/* rtl92c_dm_1r_cca(hw); */
1364beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	else
1365beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl92c_dm_rf_saving(hw, false);
13668c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
13678c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
13688c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_init(struct ieee80211_hw *hw)
13698c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
13708c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
13718c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
13728c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
1373796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.dm_flag = DYNAMIC_FUNC_DISABLE | DYNAMIC_FUNC_DIG;
1374796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.undec_sm_pwdb = -1;
1375796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.undec_sm_cck = -1;
1376796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.dm_initialgain_enable = true;
13778c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_diginit(hw);
1378796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
1379796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.dm_flag |= HAL_DM_HIPWR_DISABLE;
13808c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_init_dynamic_txpower(hw);
1381796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
13828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_init_edca_turbo(hw);
13838c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_init_rate_adaptive_mask(hw);
1384796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.dm_flag |= DYNAMIC_FUNC_SS;
13858c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_initialize_txpower_tracking(hw);
13868c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtl92c_dm_init_dynamic_bb_powersaving(hw);
1387796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger
1388796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.ofdm_pkt_cnt = 0;
1389796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger	rtlpriv->dm.dm_rssi_sel = RSSI_DEFAULT;
13908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
13911472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_init);
13928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
1393beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Livoid rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
1394beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1395beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1396beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1397beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1398da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	long undec_sm_pwdb;
1399beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1400beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (!rtlpriv->dm.dynamic_txpower_enable)
1401beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return;
1402beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1403beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) {
1404beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
1405beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return;
1406beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1407beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1408beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((mac->link_state < MAC80211_LINKED) &&
1409da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	    (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
1410beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
1411f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "Not connected to any\n");
1412beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1413beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
1414beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1415beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
1416beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return;
1417beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1418beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1419beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (mac->link_state >= MAC80211_LINKED) {
1420beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (mac->opmode == NL80211_IFTYPE_ADHOC) {
1421da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb;
1422beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1423f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches				 "AP Client PWDB = 0x%lx\n",
1424da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger				 undec_sm_pwdb);
1425beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		} else {
1426da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
1427beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1428f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches				 "STA Default Port PWDB = 0x%lx\n",
1429da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger				 undec_sm_pwdb);
1430beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1431beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1432da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb;
1433beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1434beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1435f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "AP Ext Port PWDB = 0x%lx\n",
1436da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			 undec_sm_pwdb);
1437beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1438beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1439da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
1440796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL2;
1441beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1442f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
1443da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	} else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
1444da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		   (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
1445beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1446beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
1447beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1448f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
1449da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	} else if (undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
1450beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
1451beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1452f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "TXHIGHPWRLEVEL_NORMAL\n");
1453beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1454beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1455beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
1456beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1457f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
1458f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches			 rtlphy->current_channel);
1459beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
1460796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		if (rtlpriv->dm.dynamic_txhighpower_lvl ==
1461796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		    TXHIGHPWRLEVEL_NORMAL)
1462796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			dm_restorepowerindex(hw);
1463796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
1464796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			 TXHIGHPWRLEVEL_LEVEL1)
1465796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			dm_writepowerindex(hw, 0x14);
1466796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger		else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
1467796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			 TXHIGHPWRLEVEL_LEVEL2)
1468796e453436b183057e2d7d9b2bcff88d0bf53ba7Larry Finger			dm_writepowerindex(hw, 0x10);
1469beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1470beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
1471beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
1472beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
14738c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Fingervoid rtl92c_dm_watchdog(struct ieee80211_hw *hw)
14748c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger{
14758c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_priv *rtlpriv = rtl_priv(hw);
14768c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
14777ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	bool fw_current_inpsmode = false;
14787ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	bool fw_ps_awake = true;
14798c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
14808c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
14817ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger				      (u8 *) (&fw_current_inpsmode));
14828c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
14837ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger				      (u8 *) (&fw_ps_awake));
14848c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger
14853a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger	if (ppsc->p2p_ps_info.p2p_ps_mode)
14863a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger		fw_ps_awake = false;
14873a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger
14887ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger	if ((ppsc->rfpwr_state == ERFON) && ((!fw_current_inpsmode) &&
14897ea4724036ed17ec811cb8082af7760f04484ef7Larry Finger					     fw_ps_awake)
14908c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	    && (!ppsc->rfchange_inprogress)) {
14918c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_pwdb_monitor(hw);
14928c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_dig(hw);
14938c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_false_alarm_counter_statistics(hw);
14948c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_dynamic_bb_powersaving(hw);
1495beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl92c_dm_dynamic_txpower(hw);
14968c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_check_txpower_tracking(hw);
14973a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger		/* rtl92c_dm_refresh_rate_adaptive_mask(hw); */
1498beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl92c_dm_bt_coexist(hw);
14998c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger		rtl92c_dm_check_edca_turbo(hw);
15008c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger	}
15018c96fcf7212bd58f28cf7e96b13b1e2161637f3bLarry Finger}
15021472d3a87586eb7529d1d85f7c888055650b7208Larry FingerEXPORT_SYMBOL(rtl92c_dm_watchdog);
1503beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
15042b8359f85b81dfe02a631e570582290859191756Chaoming_Liu8 rtl92c_bt_rssi_state_change(struct ieee80211_hw *hw)
1505beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1506beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1507beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1508da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	long undec_sm_pwdb;
1509beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u8 curr_bt_rssi_state = 0x00;
1510beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1511beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1512da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		undec_sm_pwdb = GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
1513beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1514da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger		if (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)
1515da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			undec_sm_pwdb = 100;
1516beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		else
1517da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger			undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb;
1518beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1519beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1520beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	/* Check RSSI to determine HighPower/NormalPower state for
1521beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	 * BT coexistence. */
1522da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (undec_sm_pwdb >= 67)
1523beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state &= (~BT_RSSI_STATE_NORMAL_POWER);
1524da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	else if (undec_sm_pwdb < 62)
1525beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state |= BT_RSSI_STATE_NORMAL_POWER;
1526beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1527beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	/* Check RSSI to determine AMPDU setting for BT coexistence. */
1528da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (undec_sm_pwdb >= 40)
1529beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state &= (~BT_RSSI_STATE_AMDPU_OFF);
1530da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	else if (undec_sm_pwdb <= 32)
1531beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state |= BT_RSSI_STATE_AMDPU_OFF;
1532beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1533beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	/* Marked RSSI state. It will be used to determine BT coexistence
1534beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	 * setting later. */
1535da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (undec_sm_pwdb < 35)
1536beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state |=  BT_RSSI_STATE_SPECIAL_LOW;
1537beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	else
1538beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state &= (~BT_RSSI_STATE_SPECIAL_LOW);
1539beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1540beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	/* Check BT state related to BT_Idle in B/G mode. */
1541da17fcffb1dff98463640d1deaeafbc6a7e73a41Larry Finger	if (undec_sm_pwdb < 15)
1542beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state |=  BT_RSSI_STATE_BG_EDCA_LOW;
1543beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	else
1544beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		curr_bt_rssi_state &= (~BT_RSSI_STATE_BG_EDCA_LOW);
1545beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1546beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (curr_bt_rssi_state != rtlpcipriv->bt_coexist.bt_rssi_state) {
1547beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_rssi_state = curr_bt_rssi_state;
1548beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return true;
1549beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1550beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return false;
1551beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1552beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
15532b8359f85b81dfe02a631e570582290859191756Chaoming_LiEXPORT_SYMBOL(rtl92c_bt_rssi_state_change);
1554beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1555beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Listatic bool rtl92c_bt_state_change(struct ieee80211_hw *hw)
1556beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1557beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1558beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1559beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1560beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u32 polling, ratio_tx, ratio_pri;
1561beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u32 bt_tx, bt_pri;
1562beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u8 bt_state;
1563beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	u8 cur_service_type;
1564beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1565beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpriv->mac80211.link_state < MAC80211_LINKED)
1566beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return false;
1567beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1568beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bt_state = rtl_read_byte(rtlpriv, 0x4fd);
1569beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bt_tx = rtl_read_dword(rtlpriv, 0x488);
1570beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bt_tx = bt_tx & 0x00ffffff;
1571beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bt_pri = rtl_read_dword(rtlpriv, 0x48c);
1572beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bt_pri = bt_pri & 0x00ffffff;
1573beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	polling = rtl_read_dword(rtlpriv, 0x490);
1574beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1575beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (bt_tx == 0xffffffff && bt_pri == 0xffffffff &&
1576beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	    polling == 0xffffffff && bt_state == 0xff)
1577beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return false;
1578beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1579beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bt_state &= BIT_OFFSET_LEN_MASK_32(0, 1);
1580beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (bt_state != rtlpcipriv->bt_coexist.bt_cur_state) {
1581beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_cur_state = bt_state;
1582beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1583beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (rtlpcipriv->bt_coexist.reg_bt_sco == 3) {
1584beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpcipriv->bt_coexist.bt_service = BT_IDLE;
1585beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1586beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			bt_state = bt_state |
1587beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			  ((rtlpcipriv->bt_coexist.bt_ant_isolation == 1) ?
1588beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			  0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
1589beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			  BIT_OFFSET_LEN_MASK_32(2, 1);
1590beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtl_write_byte(rtlpriv, 0x4fd, bt_state);
1591beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1592beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		return true;
1593beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1594beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1595beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	ratio_tx = bt_tx * 1000 / polling;
1596beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	ratio_pri = bt_pri * 1000 / polling;
1597beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	rtlpcipriv->bt_coexist.ratio_tx = ratio_tx;
1598beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	rtlpcipriv->bt_coexist.ratio_pri = ratio_pri;
1599beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1600beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (bt_state && rtlpcipriv->bt_coexist.reg_bt_sco == 3) {
1601beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1602beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if ((ratio_tx < 30)  && (ratio_pri < 30))
1603beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			cur_service_type = BT_IDLE;
1604beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		else if ((ratio_pri > 110) && (ratio_pri < 250))
1605beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			cur_service_type = BT_SCO;
1606beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		else if ((ratio_tx >= 200) && (ratio_pri >= 200))
1607beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			cur_service_type = BT_BUSY;
1608beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		else if ((ratio_tx >= 350) && (ratio_tx < 500))
1609beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			cur_service_type = BT_OTHERBUSY;
1610beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		else if (ratio_tx >= 500)
1611beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			cur_service_type = BT_PAN;
1612beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		else
1613beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			cur_service_type = BT_OTHER_ACTION;
1614beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1615beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (cur_service_type != rtlpcipriv->bt_coexist.bt_service) {
1616beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpcipriv->bt_coexist.bt_service = cur_service_type;
1617beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			bt_state = bt_state |
1618beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			   ((rtlpcipriv->bt_coexist.bt_ant_isolation == 1) ?
1619beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			   0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
1620beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			   ((rtlpcipriv->bt_coexist.bt_service != BT_IDLE) ?
1621beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			   0 : BIT_OFFSET_LEN_MASK_32(2, 1));
1622beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1623beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			/* Add interrupt migration when bt is not ini
1624beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			 * idle state (no traffic). */
1625beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			if (rtlpcipriv->bt_coexist.bt_service != BT_IDLE) {
1626beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtl_write_word(rtlpriv, 0x504, 0x0ccc);
1627beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtl_write_byte(rtlpriv, 0x506, 0x54);
1628beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtl_write_byte(rtlpriv, 0x507, 0x54);
1629beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			} else {
1630beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtl_write_byte(rtlpriv, 0x506, 0x00);
1631beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtl_write_byte(rtlpriv, 0x507, 0x00);
1632beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			}
1633beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1634beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtl_write_byte(rtlpriv, 0x4fd, bt_state);
1635beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			return true;
1636beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1637beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1638beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1639beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	return false;
1640beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1641beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
1642beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1643beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Listatic bool rtl92c_bt_wifi_connect_change(struct ieee80211_hw *hw)
1644beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1645beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1646beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	static bool media_connect;
1647beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1648beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1649beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		media_connect = false;
1650beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1651beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (!media_connect) {
1652beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			media_connect = true;
1653beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			return true;
1654beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1655beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		media_connect = true;
1656beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1657beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1658beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	return false;
1659beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
1660beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1661beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Listatic void rtl92c_bt_set_normal(struct ieee80211_hw *hw)
1662beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1663beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1664beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1665beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1666beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1667beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_service == BT_OTHERBUSY) {
1668beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_ul = 0x5ea72b;
1669beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_dl = 0x5ea72b;
1670beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else if (rtlpcipriv->bt_coexist.bt_service == BT_BUSY) {
1671beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_ul = 0x5eb82f;
1672beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_dl = 0x5eb82f;
1673beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else if (rtlpcipriv->bt_coexist.bt_service == BT_SCO) {
1674beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (rtlpcipriv->bt_coexist.ratio_tx > 160) {
1675beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpcipriv->bt_coexist.bt_edca_ul = 0x5ea72f;
1676beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpcipriv->bt_coexist.bt_edca_dl = 0x5ea72f;
1677beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		} else {
1678beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpcipriv->bt_coexist.bt_edca_ul = 0x5ea32b;
1679beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpcipriv->bt_coexist.bt_edca_dl = 0x5ea42b;
1680beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1681beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1682beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_ul = 0;
1683beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_dl = 0;
1684beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1685beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1686beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((rtlpcipriv->bt_coexist.bt_service != BT_IDLE) &&
1687beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	     (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
1688beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	     (rtlpriv->mac80211.mode == (WIRELESS_MODE_G | WIRELESS_MODE_B))) &&
1689beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	     (rtlpcipriv->bt_coexist.bt_rssi_state &
1690beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	     BT_RSSI_STATE_BG_EDCA_LOW)) {
1691beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_ul = 0x5eb82b;
1692beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_dl = 0x5eb82b;
1693beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1694beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
1695beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
16963a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Fingerstatic void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw, u8 tmp1byte)
1697beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1698beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1699beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1700beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1701beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1702beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	/* Only enable HW BT coexist when BT in "Busy" state. */
1703beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpriv->mac80211.vendor == PEER_CISCO &&
1704beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	    rtlpcipriv->bt_coexist.bt_service == BT_OTHER_ACTION) {
1705beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
1706beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1707beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if ((rtlpcipriv->bt_coexist.bt_service == BT_BUSY) &&
1708beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		    (rtlpcipriv->bt_coexist.bt_rssi_state &
1709beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		     BT_RSSI_STATE_NORMAL_POWER)) {
1710beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
1711beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		} else if ((rtlpcipriv->bt_coexist.bt_service ==
1712beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			    BT_OTHER_ACTION) && (rtlpriv->mac80211.mode <
1713beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			    WIRELESS_MODE_N_24G) &&
1714beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			    (rtlpcipriv->bt_coexist.bt_rssi_state &
1715beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			    BT_RSSI_STATE_SPECIAL_LOW)) {
1716beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
1717beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		} else if (rtlpcipriv->bt_coexist.bt_service == BT_PAN) {
17183a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte);
1719beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		} else {
17203a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte);
1721beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1722beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1723beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1724beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_service == BT_PAN)
1725beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, 0x10100);
1726beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	else
1727beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, 0x0);
1728beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1729beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_rssi_state &
1730beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	    BT_RSSI_STATE_NORMAL_POWER) {
1731beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl92c_bt_set_normal(hw);
1732beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1733beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_ul = 0;
1734beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_dl = 0;
1735beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1736beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1737beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_service != BT_IDLE) {
1738beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->cfg->ops->set_rfreg(hw,
1739beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				 RF90_PATH_A,
1740beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				 0x1e,
1741beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				 0xf0, 0xf);
1742beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
1743beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->cfg->ops->set_rfreg(hw,
1744beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		     RF90_PATH_A, 0x1e, 0xf0,
1745beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		     rtlpcipriv->bt_coexist.bt_rfreg_origin_1e);
1746beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1747beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1748beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (!rtlpriv->dm.dynamic_txpower_enable) {
1749beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (rtlpcipriv->bt_coexist.bt_service != BT_IDLE) {
1750beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			if (rtlpcipriv->bt_coexist.bt_rssi_state &
1751beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				BT_RSSI_STATE_TXPOWER_LOW) {
1752beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtlpriv->dm.dynamic_txhighpower_lvl =
1753beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li							TXHIGHPWRLEVEL_BT2;
1754beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			} else {
1755beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtlpriv->dm.dynamic_txhighpower_lvl =
1756beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li					TXHIGHPWRLEVEL_BT1;
1757beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			}
1758beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		} else {
1759beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpriv->dm.dynamic_txhighpower_lvl =
1760beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				TXHIGHPWRLEVEL_NORMAL;
1761beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		}
1762beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtl92c_phy_set_txpower_level(hw,
1763beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtlpriv->phy.current_channel);
1764beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1765beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
1766beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1767beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Listatic void rtl92c_check_bt_change(struct ieee80211_hw *hw)
1768beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1769beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_priv *rtlpriv = rtl_priv(hw);
1770beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
17713a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
17723a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger	u8 tmp1byte = 0;
1773beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
17749f087a924427c01190b205f0051be00808c99828Larry Finger	if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version) &&
17753a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger	    rtlpcipriv->bt_coexist.bt_coexistence)
17763a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger		tmp1byte |= BIT(5);
1777beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if (rtlpcipriv->bt_coexist.bt_cur_state) {
1778beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (rtlpcipriv->bt_coexist.bt_ant_isolation)
17793a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger			rtl92c_bt_ant_isolation(hw, tmp1byte);
1780beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	} else {
17813a16b41240aa893b2c397ea3bd07d86e95e7694bLarry Finger		rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte);
1782beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpriv->cfg->ops->set_rfreg(hw, RF90_PATH_A, 0x1e, 0xf0,
1783beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li				rtlpcipriv->bt_coexist.bt_rfreg_origin_1e);
1784beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1785beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_ul = 0;
1786beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rtlpcipriv->bt_coexist.bt_edca_dl = 0;
1787beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1788beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
1789beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1790beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Livoid rtl92c_dm_bt_coexist(struct ieee80211_hw *hw)
1791beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li{
1792beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1793beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1794beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bool wifi_connect_change;
1795beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bool bt_state_change;
1796beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	bool rssi_state_change;
1797beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1798beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	if ((rtlpcipriv->bt_coexist.bt_coexistence) &&
1799beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	     (rtlpcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4)) {
1800beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1801beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		wifi_connect_change = rtl92c_bt_wifi_connect_change(hw);
1802beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		bt_state_change = rtl92c_bt_state_change(hw);
1803beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		rssi_state_change = rtl92c_bt_rssi_state_change(hw);
1804beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li
1805beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li		if (wifi_connect_change || bt_state_change || rssi_state_change)
1806beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li			rtl92c_check_bt_change(hw);
1807beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li	}
1808beb5bc4020436ee50bd50e82c5a64eb087f0e3b3Chaoming_Li}
18092b8359f85b81dfe02a631e570582290859191756Chaoming_LiEXPORT_SYMBOL(rtl92c_dm_bt_coexist);
1810