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