blob: 9209aad0515e294b3caad6c4984c40642bdba6d4 [file] [log] [blame]
Jerry Chuang8fc85982009-11-03 07:17:11 -02001/*++
2Copyright-c Realtek Semiconductor Corp. All rights reserved.
3
4Module Name:
5 r8192U_dm.c
6
7Abstract:
8 HW dynamic mechanism.
9
10Major Change History:
Sebastian Hahn35997ff2012-12-05 21:40:18 +010011 When Who What
Jerry Chuang8fc85982009-11-03 07:17:11 -020012 ---------- --------------- -------------------------------
13 2008-05-14 amy create version 0 porting from windows code.
14
15--*/
16#include "r8192U.h"
17#include "r8192U_dm.h"
18#include "r8192U_hw.h"
19#include "r819xU_phy.h"
20#include "r819xU_phyreg.h"
21#include "r8190_rtl8256.h"
22#include "r819xU_cmdpkt.h"
23/*---------------------------Define Local Constant---------------------------*/
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000024/* Indicate different AP vendor for IOT issue. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +000025static u32 edca_setting_DL[HT_IOT_PEER_MAX] = {
26 0x5e4322, 0x5e4322, 0x5e4322, 0x604322, 0x00a44f, 0x5ea44f
27};
28static u32 edca_setting_UL[HT_IOT_PEER_MAX] = {
29 0x5e4322, 0x00a44f, 0x5e4322, 0x604322, 0x5ea44f, 0x5ea44f
30};
Jerry Chuang8fc85982009-11-03 07:17:11 -020031
32#define RTK_UL_EDCA 0xa44f
33#define RTK_DL_EDCA 0x5e4322
34/*---------------------------Define Local Constant---------------------------*/
35
36
37/*------------------------Define global variable-----------------------------*/
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000038/* Debug variable ? */
Cristina Opriceana70dada12015-03-16 21:55:15 +020039struct dig dm_digtable;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000040/* Store current software write register content for MAC PHY. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +000041u8 dm_shadow[16][256] = { {0} };
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000042/* For Dynamic Rx Path Selection by Signal Strength */
Cristina Opriceana3962d2a2015-03-16 21:56:13 +020043struct dynamic_rx_path_sel DM_RxPathSelTable;
Cristina Opriceana70dada12015-03-16 21:55:15 +020044
Jerry Chuang8fc85982009-11-03 07:17:11 -020045/*------------------------Define global variable-----------------------------*/
46
47
48/*------------------------Define local variable------------------------------*/
49/*------------------------Define local variable------------------------------*/
50
51
52/*--------------------Define export function prototype-----------------------*/
Jerry Chuang8fc85982009-11-03 07:17:11 -020053extern void dm_check_fsync(struct net_device *dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -020054
55/*--------------------Define export function prototype-----------------------*/
56
57
58/*---------------------Define local function prototype-----------------------*/
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000059/* DM --> Rate Adaptive */
Jerry Chuang8fc85982009-11-03 07:17:11 -020060static void dm_check_rate_adaptive(struct net_device *dev);
61
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000062/* DM --> Bandwidth switch */
Jerry Chuang8fc85982009-11-03 07:17:11 -020063static void dm_init_bandwidth_autoswitch(struct net_device *dev);
Xenia Ragiadakou00096312013-05-14 03:07:28 +030064static void dm_bandwidth_autoswitch(struct net_device *dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -020065
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000066/* DM --> TX power control */
67/*static void dm_initialize_txpower_tracking(struct net_device *dev);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -020068
69static void dm_check_txpower_tracking(struct net_device *dev);
70
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000071/*static void dm_txpower_reset_recovery(struct net_device *dev);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -020072
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000073/* DM --> Dynamic Init Gain by RSSI */
Jerry Chuang8fc85982009-11-03 07:17:11 -020074static void dm_dig_init(struct net_device *dev);
75static void dm_ctrl_initgain_byrssi(struct net_device *dev);
76static void dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev);
Xenia Ragiadakou00096312013-05-14 03:07:28 +030077static void dm_ctrl_initgain_byrssi_by_driverrssi(struct net_device *dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -020078static void dm_ctrl_initgain_byrssi_by_fwfalse_alarm(struct net_device *dev);
79static void dm_initial_gain(struct net_device *dev);
80static void dm_pd_th(struct net_device *dev);
81static void dm_cs_ratio(struct net_device *dev);
82
83static void dm_init_ctstoself(struct net_device *dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000084/* DM --> EDCA turbo mode control */
Jerry Chuang8fc85982009-11-03 07:17:11 -020085static void dm_check_edca_turbo(struct net_device *dev);
86
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000087/*static void dm_gpio_change_rf(struct net_device *dev);*/
88/* DM --> Check PBC */
Jerry Chuang8fc85982009-11-03 07:17:11 -020089static void dm_check_pbc_gpio(struct net_device *dev);
90
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000091/* DM --> Check current RX RF path state */
Jerry Chuang8fc85982009-11-03 07:17:11 -020092static void dm_check_rx_path_selection(struct net_device *dev);
Sebastian Hahn35997ff2012-12-05 21:40:18 +010093static void dm_init_rxpath_selection(struct net_device *dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -020094static void dm_rxpath_sel_byrssi(struct net_device *dev);
95
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +000096/* DM --> Fsync for broadcom ap */
Jerry Chuang8fc85982009-11-03 07:17:11 -020097static void dm_init_fsync(struct net_device *dev);
98static void dm_deInit_fsync(struct net_device *dev);
99
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000100/* Added by vivi, 20080522 */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200101static void dm_check_txrateandretrycount(struct net_device *dev);
102
103/*---------------------Define local function prototype-----------------------*/
104
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000105/*---------------------Define of Tx Power Control For Near/Far Range --------*/ /*Add by Jacken 2008/02/18 */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200106static void dm_init_dynamic_txpower(struct net_device *dev);
107static void dm_dynamic_txpower(struct net_device *dev);
108
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000109/* DM --> For rate adaptive and DIG, we must send RSSI to firmware */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200110static void dm_send_rssi_tofw(struct net_device *dev);
111static void dm_ctstoself(struct net_device *dev);
112/*---------------------------Define function prototype------------------------*/
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000113/*
114 * ================================================================================
115 * HW Dynamic mechanism interface.
116 * ================================================================================
117 *
118 *
119 * Description:
120 * Prepare SW resource for HW dynamic mechanism.
121 *
122 * Assumption:
Carlos E. Garcia69e98df2015-04-24 09:40:42 -0400123 * This function is only invoked at driver initialization once.
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000124 */
Ana Reybf316432014-03-19 11:54:53 +0100125void init_hal_dm(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200126{
127 struct r8192_priv *priv = ieee80211_priv(dev);
128
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000129 /* Undecorated Smoothed Signal Strength, it can utilized to dynamic mechanism. */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200130 priv->undecorated_smoothed_pwdb = -1;
131
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000132 /* Initial TX Power Control for near/far range , add by amy 2008/05/15, porting from windows code. */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200133 dm_init_dynamic_txpower(dev);
134 init_rate_adaptive(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000135 /*dm_initialize_txpower_tracking(dev);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200136 dm_dig_init(dev);
137 dm_init_edca_turbo(dev);
138 dm_init_bandwidth_autoswitch(dev);
139 dm_init_fsync(dev);
140 dm_init_rxpath_selection(dev);
141 dm_init_ctstoself(dev);
142
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000143} /* InitHalDm */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200144
Himangi Saraogic541fa82014-03-17 04:07:56 +0530145void deinit_hal_dm(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200146{
Jerry Chuang8fc85982009-11-03 07:17:11 -0200147 dm_deInit_fsync(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200148}
149
Jerry Chuang8fc85982009-11-03 07:17:11 -0200150#ifdef USB_RX_AGGREGATION_SUPPORT
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000151void dm_CheckRxAggregation(struct net_device *dev)
152{
Bhumika Goyalefdcb352016-09-18 17:56:24 +0530153 struct r8192_priv *priv = ieee80211_priv(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200154 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +0100155 static unsigned long lastTxOkCnt;
156 static unsigned long lastRxOkCnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200157 unsigned long curTxOkCnt = 0;
158 unsigned long curRxOkCnt = 0;
159
160/*
161 if (pHalData->bForcedUsbRxAggr) {
162 if (pHalData->ForcedUsbRxAggrInfo == 0) {
163 if (pHalData->bCurrentRxAggrEnable) {
164 Adapter->HalFunc.HalUsbRxAggrHandler(Adapter, FALSE);
165 }
166 } else {
167 if (!pHalData->bCurrentRxAggrEnable || (pHalData->ForcedUsbRxAggrInfo != pHalData->LastUsbRxAggrInfoSetting)) {
168 Adapter->HalFunc.HalUsbRxAggrHandler(Adapter, TRUE);
169 }
170 }
171 return;
172 }
173
174*/
175 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
176 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
177
Rui Miguel Silva2930d0b92014-04-28 12:12:54 +0100178 if ((curTxOkCnt + curRxOkCnt) < 15000000)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200179 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200180
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000181 if (curTxOkCnt > 4*curRxOkCnt) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200182 if (priv->bCurrentRxAggrEnable) {
183 write_nic_dword(dev, 0x1a8, 0);
184 priv->bCurrentRxAggrEnable = false;
185 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000186 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200187 if (!priv->bCurrentRxAggrEnable && !pHTInfo->bCurrentRT2RTAggregation) {
188 u32 ulValue;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000189
Jerry Chuang8fc85982009-11-03 07:17:11 -0200190 ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
191 (pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
192 /*
193 * If usb rx firmware aggregation is enabled,
194 * when anyone of three threshold conditions above is reached,
195 * firmware will send aggregated packet to driver.
196 */
197 write_nic_dword(dev, 0x1a8, ulValue);
198 priv->bCurrentRxAggrEnable = true;
199 }
200 }
201
202 lastTxOkCnt = priv->stats.txbytesunicast;
203 lastRxOkCnt = priv->stats.rxbytesunicast;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000204} /* dm_CheckEdcaTurbo */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200205#endif
206
Ana Reybf316432014-03-19 11:54:53 +0100207void hal_dm_watchdog(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200208{
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000209 /*struct r8192_priv *priv = ieee80211_priv(dev);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200210
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000211 /*static u8 previous_bssid[6] ={0};*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200212
213 /*Add by amy 2008/05/15 ,porting from windows code.*/
214 dm_check_rate_adaptive(dev);
215 dm_dynamic_txpower(dev);
216 dm_check_txrateandretrycount(dev);
217 dm_check_txpower_tracking(dev);
218 dm_ctrl_initgain_byrssi(dev);
219 dm_check_edca_turbo(dev);
220 dm_bandwidth_autoswitch(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200221 dm_check_rx_path_selection(dev);
222 dm_check_fsync(dev);
223
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000224 /* Add by amy 2008-05-15 porting from windows code. */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200225 dm_check_pbc_gpio(dev);
226 dm_send_rssi_tofw(dev);
227 dm_ctstoself(dev);
228#ifdef USB_RX_AGGREGATION_SUPPORT
229 dm_CheckRxAggregation(dev);
230#endif
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000231} /* HalDmWatchDog */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200232
Jerry Chuang8fc85982009-11-03 07:17:11 -0200233/*
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000234 * Decide Rate Adaptive Set according to distance (signal strength)
235 * 01/11/2008 MHC Modify input arguments and RATR table level.
236 * 01/16/2008 MHC RF_Type is assigned in ReadAdapterInfo(). We must call
237 * the function after making sure RF_Type.
238 */
Himangi Saraogic541fa82014-03-17 04:07:56 +0530239void init_rate_adaptive(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200240{
Jerry Chuang8fc85982009-11-03 07:17:11 -0200241 struct r8192_priv *priv = ieee80211_priv(dev);
242 prate_adaptive pra = (prate_adaptive)&priv->rate_adaptive;
243
244 pra->ratr_state = DM_RATR_STA_MAX;
245 pra->high2low_rssi_thresh_for_ra = RateAdaptiveTH_High;
246 pra->low2high_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M+5;
247 pra->low2high_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M+5;
248
249 pra->high_rssi_thresh_for_ra = RateAdaptiveTH_High+5;
250 pra->low_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M;
251 pra->low_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M;
252
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000253 if (priv->CustomerID == RT_CID_819x_Netcore)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200254 pra->ping_rssi_enable = 1;
255 else
256 pra->ping_rssi_enable = 0;
257 pra->ping_rssi_thresh_for_ra = 15;
258
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000259 if (priv->rf_type == RF_2T4R) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000260 /*
261 * 07/10/08 MH Modify for RA smooth scheme.
262 * 2008/01/11 MH Modify 2T RATR table for different RSSI. 080515 porting by amy from windows code.
263 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100264 pra->upper_rssi_threshold_ratr = 0x8f0f0000;
265 pra->middle_rssi_threshold_ratr = 0x8f0ff000;
266 pra->low_rssi_threshold_ratr = 0x8f0ff001;
267 pra->low_rssi_threshold_ratr_40M = 0x8f0ff005;
268 pra->low_rssi_threshold_ratr_20M = 0x8f0ff001;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000269 pra->ping_rssi_ratr = 0x0000000d;/* cosa add for test */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000270 } else if (priv->rf_type == RF_1T2R) {
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100271 pra->upper_rssi_threshold_ratr = 0x000f0000;
272 pra->middle_rssi_threshold_ratr = 0x000ff000;
273 pra->low_rssi_threshold_ratr = 0x000ff001;
274 pra->low_rssi_threshold_ratr_40M = 0x000ff005;
275 pra->low_rssi_threshold_ratr_20M = 0x000ff001;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000276 pra->ping_rssi_ratr = 0x0000000d;/* cosa add for test */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200277 }
278
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000279} /* InitRateAdaptive */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200280
Jerry Chuang8fc85982009-11-03 07:17:11 -0200281/*-----------------------------------------------------------------------------
282 * Function: dm_check_rate_adaptive()
283 *
284 * Overview:
285 *
286 * Input: NONE
287 *
288 * Output: NONE
289 *
290 * Return: NONE
291 *
292 * Revised History:
293 * When Who Remark
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100294 * 05/26/08 amy Create version 0 porting from windows code.
Jerry Chuang8fc85982009-11-03 07:17:11 -0200295 *
296 *---------------------------------------------------------------------------*/
Xenia Ragiadakou999d5942013-05-09 01:48:52 +0300297static void dm_check_rate_adaptive(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200298{
299 struct r8192_priv *priv = ieee80211_priv(dev);
300 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
301 prate_adaptive pra = (prate_adaptive)&priv->rate_adaptive;
302 u32 currentRATR, targetRATR = 0;
303 u32 LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
304 bool bshort_gi_enabled = false;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +0100305 static u8 ping_rssi_state;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200306
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000307 if (!priv->up) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200308 RT_TRACE(COMP_RATE, "<---- dm_check_rate_adaptive(): driver is going to unload\n");
309 return;
310 }
311
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000312 if (pra->rate_adaptive_disabled) /* this variable is set by ioctl. */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200313 return;
314
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000315 /* TODO: Only 11n mode is implemented currently, */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000316 if (!(priv->ieee80211->mode == WIRELESS_MODE_N_24G ||
317 priv->ieee80211->mode == WIRELESS_MODE_N_5G))
318 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200319
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000320 if (priv->ieee80211->state == IEEE80211_LINKED) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000321 /*RT_TRACE(COMP_RATE, "dm_CheckRateAdaptive(): \t");*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200322
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000323 /* Check whether Short GI is enabled */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200324 bshort_gi_enabled = (pHTInfo->bCurTxBW40MHz && pHTInfo->bCurShortGI40MHz) ||
325 (!pHTInfo->bCurTxBW40MHz && pHTInfo->bCurShortGI20MHz);
326
Jerry Chuang8fc85982009-11-03 07:17:11 -0200327 pra->upper_rssi_threshold_ratr =
Anish Bhatt56b31522015-10-12 21:02:36 -0700328 (pra->upper_rssi_threshold_ratr & (~BIT(31))) |
329 ((bshort_gi_enabled) ? BIT(31) : 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200330
331 pra->middle_rssi_threshold_ratr =
Anish Bhatt56b31522015-10-12 21:02:36 -0700332 (pra->middle_rssi_threshold_ratr & (~BIT(31))) |
333 ((bshort_gi_enabled) ? BIT(31) : 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200334
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000335 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200336 pra->low_rssi_threshold_ratr =
Anish Bhatt56b31522015-10-12 21:02:36 -0700337 (pra->low_rssi_threshold_ratr_40M & (~BIT(31))) |
338 ((bshort_gi_enabled) ? BIT(31) : 0);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000339 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200340 pra->low_rssi_threshold_ratr =
Anish Bhatt56b31522015-10-12 21:02:36 -0700341 (pra->low_rssi_threshold_ratr_20M & (~BIT(31))) |
342 ((bshort_gi_enabled) ? BIT(31) : 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200343 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000344 /* cosa add for test */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200345 pra->ping_rssi_ratr =
Anish Bhatt56b31522015-10-12 21:02:36 -0700346 (pra->ping_rssi_ratr & (~BIT(31))) |
347 ((bshort_gi_enabled) ? BIT(31) : 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200348
349 /* 2007/10/08 MH We support RA smooth scheme now. When it is the first
350 time to link with AP. We will not change upper/lower threshold. If
351 STA stay in high or low level, we must change two different threshold
352 to prevent jumping frequently. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000353 if (pra->ratr_state == DM_RATR_STA_HIGH) {
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100354 HighRSSIThreshForRA = pra->high2low_rssi_thresh_for_ra;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000355 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
Jerry Chuang8fc85982009-11-03 07:17:11 -0200356 (pra->low_rssi_thresh_for_ra40M):(pra->low_rssi_thresh_for_ra20M);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000357 } else if (pra->ratr_state == DM_RATR_STA_LOW) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200358 HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000359 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
Jerry Chuang8fc85982009-11-03 07:17:11 -0200360 (pra->low2high_rssi_thresh_for_ra40M):(pra->low2high_rssi_thresh_for_ra20M);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000361 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200362 HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000363 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
Jerry Chuang8fc85982009-11-03 07:17:11 -0200364 (pra->low_rssi_thresh_for_ra40M):(pra->low_rssi_thresh_for_ra20M);
365 }
366
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000367 /*DbgPrint("[DM] THresh H/L=%d/%d\n\r", RATR.HighRSSIThreshForRA, RATR.LowRSSIThreshForRA);*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000368 if (priv->undecorated_smoothed_pwdb >= (long)HighRSSIThreshForRA) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000369 /*DbgPrint("[DM] RSSI=%d STA=HIGH\n\r", pHalData->UndecoratedSmoothedPWDB);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200370 pra->ratr_state = DM_RATR_STA_HIGH;
371 targetRATR = pra->upper_rssi_threshold_ratr;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000372 } else if (priv->undecorated_smoothed_pwdb >= (long)LowRSSIThreshForRA) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000373 /*DbgPrint("[DM] RSSI=%d STA=Middle\n\r", pHalData->UndecoratedSmoothedPWDB);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200374 pra->ratr_state = DM_RATR_STA_MIDDLE;
375 targetRATR = pra->middle_rssi_threshold_ratr;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000376 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000377 /*DbgPrint("[DM] RSSI=%d STA=LOW\n\r", pHalData->UndecoratedSmoothedPWDB);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200378 pra->ratr_state = DM_RATR_STA_LOW;
379 targetRATR = pra->low_rssi_threshold_ratr;
380 }
381
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000382 /* cosa add for test */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000383 if (pra->ping_rssi_enable) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000384 /*pHalData->UndecoratedSmoothedPWDB = 19;*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000385 if (priv->undecorated_smoothed_pwdb < (long)(pra->ping_rssi_thresh_for_ra+5)) {
386 if ((priv->undecorated_smoothed_pwdb < (long)pra->ping_rssi_thresh_for_ra) ||
387 ping_rssi_state) {
388 /*DbgPrint("TestRSSI = %d, set RATR to 0x%x\n", pHalData->UndecoratedSmoothedPWDB, pRA->TestRSSIRATR);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200389 pra->ratr_state = DM_RATR_STA_LOW;
390 targetRATR = pra->ping_rssi_ratr;
391 ping_rssi_state = 1;
392 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000393 /*else
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000394 DbgPrint("TestRSSI is between the range.\n");*/
395 } else {
396 /*DbgPrint("TestRSSI Recover to 0x%x\n", targetRATR);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200397 ping_rssi_state = 0;
398 }
399 }
400
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000401 /*
402 * 2008.04.01
403 * For RTL819X, if pairwisekey = wep/tkip, we support only MCS0~7.
404 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000405 if (priv->ieee80211->GetHalfNmodeSupportByAPsHandler(dev))
406 targetRATR &= 0xf00fffff;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200407
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000408 /* Check whether updating of RATR0 is required */
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +0300409 read_nic_dword(dev, RATR0, &currentRATR);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000410 if (targetRATR != currentRATR) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200411 u32 ratr_value;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000412
Jerry Chuang8fc85982009-11-03 07:17:11 -0200413 ratr_value = targetRATR;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000414 RT_TRACE(COMP_RATE, "currentRATR = %x, targetRATR = %x\n", currentRATR, targetRATR);
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000415 if (priv->rf_type == RF_1T2R)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200416 ratr_value &= ~(RATE_ALL_OFDM_2SS);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200417 write_nic_dword(dev, RATR0, ratr_value);
418 write_nic_byte(dev, UFWP, 1);
419
420 pra->last_ratr = targetRATR;
421 }
422
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000423 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200424 pra->ratr_state = DM_RATR_STA_MAX;
425 }
426
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000427} /* dm_CheckRateAdaptive */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200428
Xenia Ragiadakou999d5942013-05-09 01:48:52 +0300429static void dm_init_bandwidth_autoswitch(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200430{
431 struct r8192_priv *priv = ieee80211_priv(dev);
432
433 priv->ieee80211->bandwidth_auto_switch.threshold_20Mhzto40Mhz = BW_AUTO_SWITCH_LOW_HIGH;
434 priv->ieee80211->bandwidth_auto_switch.threshold_40Mhzto20Mhz = BW_AUTO_SWITCH_HIGH_LOW;
435 priv->ieee80211->bandwidth_auto_switch.bforced_tx20Mhz = false;
436 priv->ieee80211->bandwidth_auto_switch.bautoswitch_enable = false;
437
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000438} /* dm_init_bandwidth_autoswitch */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200439
Xenia Ragiadakou999d5942013-05-09 01:48:52 +0300440static void dm_bandwidth_autoswitch(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200441{
442 struct r8192_priv *priv = ieee80211_priv(dev);
443
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000444 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 || !priv->ieee80211->bandwidth_auto_switch.bautoswitch_enable)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200445 return;
Luis de Bethencourtf9bd5492015-07-20 18:35:42 +0200446 if (!priv->ieee80211->bandwidth_auto_switch.bforced_tx20Mhz) { /* If send packets in 40 Mhz in 20/40 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000447 if (priv->undecorated_smoothed_pwdb <= priv->ieee80211->bandwidth_auto_switch.threshold_40Mhzto20Mhz)
Karthik Nayak2fd8fea2014-12-18 14:50:11 +0530448 priv->ieee80211->bandwidth_auto_switch.bforced_tx20Mhz = true;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000449 } else { /* in force send packets in 20 Mhz in 20/40 */
450 if (priv->undecorated_smoothed_pwdb >= priv->ieee80211->bandwidth_auto_switch.threshold_20Mhzto40Mhz)
Karthik Nayak2fd8fea2014-12-18 14:50:11 +0530451 priv->ieee80211->bandwidth_auto_switch.bforced_tx20Mhz = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200452 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000453} /* dm_BandwidthAutoSwitch */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200454
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000455/* OFDM default at 0db, index=6. */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200456static u32 OFDMSwingTable[OFDM_Table_Length] = {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000457 0x7f8001fe, /* 0, +6db */
458 0x71c001c7, /* 1, +5db */
459 0x65400195, /* 2, +4db */
460 0x5a400169, /* 3, +3db */
461 0x50800142, /* 4, +2db */
462 0x47c0011f, /* 5, +1db */
463 0x40000100, /* 6, +0db ===> default, upper for higher temperature, lower for low temperature */
464 0x390000e4, /* 7, -1db */
465 0x32c000cb, /* 8, -2db */
466 0x2d4000b5, /* 9, -3db */
467 0x288000a2, /* 10, -4db */
468 0x24000090, /* 11, -5db */
469 0x20000080, /* 12, -6db */
470 0x1c800072, /* 13, -7db */
471 0x19800066, /* 14, -8db */
472 0x26c0005b, /* 15, -9db */
473 0x24400051, /* 16, -10db */
474 0x12000048, /* 17, -11db */
475 0x10000040 /* 18, -12db */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200476};
477
478static u8 CCKSwingTable_Ch1_Ch13[CCK_Table_length][8] = {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000479 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0db ===> CCK40M default */
480 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 1, -1db */
481 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 2, -2db */
482 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 3, -3db */
483 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 4, -4db */
484 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 5, -5db */
485 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 6, -6db ===> CCK20M default */
486 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 7, -7db */
487 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 8, -8db */
488 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 9, -9db */
489 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 10, -10db */
490 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01} /* 11, -11db */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200491};
492
493static u8 CCKSwingTable_Ch14[CCK_Table_length][8] = {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000494 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0db ===> CCK40M default */
495 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 1, -1db */
496 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 2, -2db */
497 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 3, -3db */
498 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 4, -4db */
499 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 5, -5db */
500 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 6, -6db ===> CCK20M default */
501 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 7, -7db */
502 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 8, -8db */
503 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 9, -9db */
504 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 10, -10db */
505 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00} /* 11, -11db */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200506};
507
Xenia Ragiadakou999d5942013-05-09 01:48:52 +0300508static void dm_TXPowerTrackingCallback_TSSI(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200509{
510 struct r8192_priv *priv = ieee80211_priv(dev);
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100511 bool bHighpowerstate, viviflag = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200512 DCMD_TXCMD_T tx_cmd;
513 u8 powerlevelOFDM24G;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000514 int i = 0, j = 0, k = 0;
515 u8 RF_Type, tmp_report[5] = {0, 0, 0, 0, 0};
Jerry Chuang8fc85982009-11-03 07:17:11 -0200516 u32 Value;
517 u8 Pwr_Flag;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000518 u16 Avg_TSSI_Meas, TSSI_13dBm, Avg_TSSI_Meas_from_driver = 0;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000519 /*RT_STATUS rtStatus = RT_STATUS_SUCCESS;*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200520 bool rtStatus = true;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000521 u32 delta = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200522
523 write_nic_byte(dev, 0x1ba, 0);
524
525 priv->ieee80211->bdynamic_txpower_enable = false;
526 bHighpowerstate = priv->bDynamicTxHighPower;
527
528 powerlevelOFDM24G = (u8)(priv->Pwr_Track>>24);
529 RF_Type = priv->rf_type;
530 Value = (RF_Type<<8) | powerlevelOFDM24G;
531
532 RT_TRACE(COMP_POWER_TRACKING, "powerlevelOFDM24G = %x\n", powerlevelOFDM24G);
533
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000534 for (j = 0; j <= 30; j++) { /* fill tx_cmd */
535 tx_cmd.Op = TXCMD_SET_TX_PWR_TRACKING;
536 tx_cmd.Length = 4;
537 tx_cmd.Value = Value;
538 rtStatus = SendTxCommandPacket(dev, &tx_cmd, 12);
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000539 if (rtStatus == RT_STATUS_FAILURE)
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000540 RT_TRACE(COMP_POWER_TRACKING, "Set configuration with tx cmd queue fail!\n");
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000541 mdelay(1);
542 /*DbgPrint("hi, vivi, strange\n");*/
543 for (i = 0; i <= 30; i++) {
544 read_nic_byte(dev, 0x1ba, &Pwr_Flag);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200545
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000546 if (Pwr_Flag == 0) {
547 mdelay(1);
548 continue;
549 }
550 read_nic_word(dev, 0x13c, &Avg_TSSI_Meas);
551 if (Avg_TSSI_Meas == 0) {
552 write_nic_byte(dev, 0x1ba, 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200553 break;
554 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000555
556 for (k = 0; k < 5; k++) {
557 if (k != 4)
558 read_nic_byte(dev, 0x134+k, &tmp_report[k]);
559 else
560 read_nic_byte(dev, 0x13e, &tmp_report[k]);
561 RT_TRACE(COMP_POWER_TRACKING, "TSSI_report_value = %d\n", tmp_report[k]);
562 }
563
564 /* check if the report value is right */
565 for (k = 0; k < 5; k++) {
566 if (tmp_report[k] <= 20) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100567 viviflag = true;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000568 break;
569 }
570 }
Harisangam Sharvaric40753b2015-06-11 12:38:13 +0000571 if (viviflag) {
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000572 write_nic_byte(dev, 0x1ba, 0);
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100573 viviflag = false;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000574 RT_TRACE(COMP_POWER_TRACKING, "we filtered the data\n");
575 for (k = 0; k < 5; k++)
576 tmp_report[k] = 0;
577 break;
578 }
579
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000580 for (k = 0; k < 5; k++)
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000581 Avg_TSSI_Meas_from_driver += tmp_report[k];
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000582
583 Avg_TSSI_Meas_from_driver = Avg_TSSI_Meas_from_driver*100/5;
584 RT_TRACE(COMP_POWER_TRACKING, "Avg_TSSI_Meas_from_driver = %d\n", Avg_TSSI_Meas_from_driver);
585 TSSI_13dBm = priv->TSSI_13dBm;
586 RT_TRACE(COMP_POWER_TRACKING, "TSSI_13dBm = %d\n", TSSI_13dBm);
587
588 /*if (abs(Avg_TSSI_Meas_from_driver - TSSI_13dBm) <= E_FOR_TX_POWER_TRACK)*/
589 /* For MacOS-compatible */
590 if (Avg_TSSI_Meas_from_driver > TSSI_13dBm)
591 delta = Avg_TSSI_Meas_from_driver - TSSI_13dBm;
592 else
593 delta = TSSI_13dBm - Avg_TSSI_Meas_from_driver;
594
595 if (delta <= E_FOR_TX_POWER_TRACK) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100596 priv->ieee80211->bdynamic_txpower_enable = true;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000597 write_nic_byte(dev, 0x1ba, 0);
598 RT_TRACE(COMP_POWER_TRACKING, "tx power track is done\n");
599 RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex = %d\n", priv->rfa_txpowertrackingindex);
600 RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real = %d\n", priv->rfa_txpowertrackingindex_real);
601 RT_TRACE(COMP_POWER_TRACKING, "priv->cck_present_attentuation_difference = %d\n", priv->cck_present_attentuation_difference);
602 RT_TRACE(COMP_POWER_TRACKING, "priv->cck_present_attentuation = %d\n", priv->cck_present_attentuation);
603 return;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000604 }
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000605 if (Avg_TSSI_Meas_from_driver < TSSI_13dBm - E_FOR_TX_POWER_TRACK) {
606 if (priv->rfa_txpowertrackingindex > 0) {
607 priv->rfa_txpowertrackingindex--;
608 if (priv->rfa_txpowertrackingindex_real > 4) {
609 priv->rfa_txpowertrackingindex_real--;
610 rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex_real].txbbgain_value);
611 }
612 }
613 } else {
614 if (priv->rfa_txpowertrackingindex < 36) {
615 priv->rfa_txpowertrackingindex++;
616 priv->rfa_txpowertrackingindex_real++;
617 rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex_real].txbbgain_value);
618
619 }
620 }
621 priv->cck_present_attentuation_difference
622 = priv->rfa_txpowertrackingindex - priv->rfa_txpowertracking_default;
623
624 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
625 priv->cck_present_attentuation
626 = priv->cck_present_attentuation_20Mdefault + priv->cck_present_attentuation_difference;
627 else
628 priv->cck_present_attentuation
629 = priv->cck_present_attentuation_40Mdefault + priv->cck_present_attentuation_difference;
630
631 if (priv->cck_present_attentuation > -1 && priv->cck_present_attentuation < 23) {
632 if (priv->ieee80211->current_network.channel == 14 && !priv->bcck_in_ch14) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100633 priv->bcck_in_ch14 = true;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000634 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
635 } else if (priv->ieee80211->current_network.channel != 14 && priv->bcck_in_ch14) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100636 priv->bcck_in_ch14 = false;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000637 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
638 } else
639 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
640 }
641 RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex = %d\n", priv->rfa_txpowertrackingindex);
642 RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real = %d\n", priv->rfa_txpowertrackingindex_real);
643 RT_TRACE(COMP_POWER_TRACKING, "priv->cck_present_attentuation_difference = %d\n", priv->cck_present_attentuation_difference);
644 RT_TRACE(COMP_POWER_TRACKING, "priv->cck_present_attentuation = %d\n", priv->cck_present_attentuation);
645
646 if (priv->cck_present_attentuation_difference <= -12 || priv->cck_present_attentuation_difference >= 24) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100647 priv->ieee80211->bdynamic_txpower_enable = true;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +0000648 write_nic_byte(dev, 0x1ba, 0);
649 RT_TRACE(COMP_POWER_TRACKING, "tx power track--->limited\n");
650 return;
651 }
652
Jerry Chuang8fc85982009-11-03 07:17:11 -0200653 write_nic_byte(dev, 0x1ba, 0);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000654 Avg_TSSI_Meas_from_driver = 0;
655 for (k = 0; k < 5; k++)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200656 tmp_report[k] = 0;
657 break;
658 }
Jerry Chuang8fc85982009-11-03 07:17:11 -0200659 }
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100660 priv->ieee80211->bdynamic_txpower_enable = true;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000661 write_nic_byte(dev, 0x1ba, 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200662}
663
Xenia Ragiadakou999d5942013-05-09 01:48:52 +0300664static void dm_TXPowerTrackingCallback_ThermalMeter(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200665{
666#define ThermalMeterVal 9
667 struct r8192_priv *priv = ieee80211_priv(dev);
668 u32 tmpRegA, TempCCk;
669 u8 tmpOFDMindex, tmpCCKindex, tmpCCK20Mindex, tmpCCK40Mindex, tmpval;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000670 int i = 0, CCKSwingNeedUpdate = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200671
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000672 if (!priv->btxpower_trackingInit) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000673 /* Query OFDM default setting */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000674 tmpRegA = rtl8192_QueryBBReg(dev, rOFDM0_XATxIQImbalance, bMaskDWord);
675 for (i = 0; i < OFDM_Table_Length; i++) { /* find the index */
676 if (tmpRegA == OFDMSwingTable[i]) {
677 priv->OFDM_index = (u8)i;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200678 RT_TRACE(COMP_POWER_TRACKING, "Initial reg0x%x = 0x%x, OFDM_index=0x%x\n",
679 rOFDM0_XATxIQImbalance, tmpRegA, priv->OFDM_index);
680 }
681 }
682
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000683 /* Query CCK default setting From 0xa22 */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200684 TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000685 for (i = 0; i < CCK_Table_length; i++) {
686 if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0]) {
687 priv->CCK_index = (u8) i;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200688 RT_TRACE(COMP_POWER_TRACKING, "Initial reg0x%x = 0x%x, CCK_index=0x%x\n",
689 rCCK0_TxFilter1, TempCCk, priv->CCK_index);
690 break;
691 }
692 }
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100693 priv->btxpower_trackingInit = true;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000694 /*pHalData->TXPowercount = 0;*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200695 return;
696 }
697
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000698 /*
699 * ==========================
700 * this is only for test, should be masked
701 * ==========================
702 */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200703
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000704 /* read and filter out unreasonable value */
705 tmpRegA = rtl8192_phy_QueryRFReg(dev, RF90_PATH_A, 0x12, 0x078); /* 0x12: RF Reg[10:7] */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000706 RT_TRACE(COMP_POWER_TRACKING, "Readback ThermalMeterA = %d\n", tmpRegA);
707 if (tmpRegA < 3 || tmpRegA > 13)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200708 return;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000709 if (tmpRegA >= 12) /* if over 12, TP will be bad when high temperature */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200710 tmpRegA = 12;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000711 RT_TRACE(COMP_POWER_TRACKING, "Valid ThermalMeterA = %d\n", tmpRegA);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000712 priv->ThermalMeter[0] = ThermalMeterVal; /* We use fixed value by Bryant's suggestion */
713 priv->ThermalMeter[1] = ThermalMeterVal; /* We use fixed value by Bryant's suggestion */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200714
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000715 /* Get current RF-A temperature index */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000716 if (priv->ThermalMeter[0] >= (u8)tmpRegA) { /* lower temperature */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200717 tmpOFDMindex = tmpCCK20Mindex = 6+(priv->ThermalMeter[0]-(u8)tmpRegA);
718 tmpCCK40Mindex = tmpCCK20Mindex - 6;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000719 if (tmpOFDMindex >= OFDM_Table_Length)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200720 tmpOFDMindex = OFDM_Table_Length-1;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000721 if (tmpCCK20Mindex >= CCK_Table_length)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200722 tmpCCK20Mindex = CCK_Table_length-1;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000723 if (tmpCCK40Mindex >= CCK_Table_length)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200724 tmpCCK40Mindex = CCK_Table_length-1;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000725 } else {
Haneen Mohammed2060f312015-03-13 20:50:52 +0300726 tmpval = (u8)tmpRegA - priv->ThermalMeter[0];
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000727
728 if (tmpval >= 6) /* higher temperature */
729 tmpOFDMindex = tmpCCK20Mindex = 0; /* max to +6dB */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200730 else
731 tmpOFDMindex = tmpCCK20Mindex = 6 - tmpval;
732 tmpCCK40Mindex = 0;
733 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000734 /*DbgPrint("%ddb, tmpOFDMindex = %d, tmpCCK20Mindex = %d, tmpCCK40Mindex = %d",
735 ((u1Byte)tmpRegA - pHalData->ThermalMeter[0]),
736 tmpOFDMindex, tmpCCK20Mindex, tmpCCK40Mindex);*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000737 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) /* 40M */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200738 tmpCCKindex = tmpCCK40Mindex;
739 else
740 tmpCCKindex = tmpCCK20Mindex;
741
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000742 if (priv->ieee80211->current_network.channel == 14 && !priv->bcck_in_ch14) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100743 priv->bcck_in_ch14 = true;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200744 CCKSwingNeedUpdate = 1;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000745 } else if (priv->ieee80211->current_network.channel != 14 && priv->bcck_in_ch14) {
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +0100746 priv->bcck_in_ch14 = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200747 CCKSwingNeedUpdate = 1;
748 }
749
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000750 if (priv->CCK_index != tmpCCKindex) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200751 priv->CCK_index = tmpCCKindex;
752 CCKSwingNeedUpdate = 1;
753 }
754
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000755 if (CCKSwingNeedUpdate) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000756 /*DbgPrint("Update CCK Swing, CCK_index = %d\n", pHalData->CCK_index);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -0200757 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
758 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000759 if (priv->OFDM_index != tmpOFDMindex) {
Jerry Chuang8fc85982009-11-03 07:17:11 -0200760 priv->OFDM_index = tmpOFDMindex;
761 rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[priv->OFDM_index]);
762 RT_TRACE(COMP_POWER_TRACKING, "Update OFDMSwing[%d] = 0x%x\n",
763 priv->OFDM_index, OFDMSwingTable[priv->OFDM_index]);
764 }
765 priv->txpower_count = 0;
766}
767
Ana Reybf316432014-03-19 11:54:53 +0100768void dm_txpower_trackingcallback(struct work_struct *work)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200769{
Geliang Tanga5959f32015-12-28 23:43:38 +0800770 struct delayed_work *dwork = to_delayed_work(work);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000771 struct r8192_priv *priv = container_of(dwork, struct r8192_priv, txpower_tracking_wq);
772 struct net_device *dev = priv->ieee80211->dev;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200773
Harisangam Sharvaric40753b2015-06-11 12:38:13 +0000774 if (priv->bDcut)
Jerry Chuang8fc85982009-11-03 07:17:11 -0200775 dm_TXPowerTrackingCallback_TSSI(dev);
776 else
777 dm_TXPowerTrackingCallback_ThermalMeter(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -0200778}
779
Jerry Chuang8fc85982009-11-03 07:17:11 -0200780static void dm_InitializeTXPowerTracking_TSSI(struct net_device *dev)
781{
Jerry Chuang8fc85982009-11-03 07:17:11 -0200782 struct r8192_priv *priv = ieee80211_priv(dev);
783
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000784 /* Initial the Tx BB index and mapping value */
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100785 priv->txbbgain_table[0].txbb_iq_amplifygain = 12;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000786 priv->txbbgain_table[0].txbbgain_value = 0x7f8001fe;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100787 priv->txbbgain_table[1].txbb_iq_amplifygain = 11;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000788 priv->txbbgain_table[1].txbbgain_value = 0x788001e2;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100789 priv->txbbgain_table[2].txbb_iq_amplifygain = 10;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000790 priv->txbbgain_table[2].txbbgain_value = 0x71c001c7;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100791 priv->txbbgain_table[3].txbb_iq_amplifygain = 9;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000792 priv->txbbgain_table[3].txbbgain_value = 0x6b8001ae;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100793 priv->txbbgain_table[4].txbb_iq_amplifygain = 8;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000794 priv->txbbgain_table[4].txbbgain_value = 0x65400195;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100795 priv->txbbgain_table[5].txbb_iq_amplifygain = 7;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000796 priv->txbbgain_table[5].txbbgain_value = 0x5fc0017f;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100797 priv->txbbgain_table[6].txbb_iq_amplifygain = 6;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000798 priv->txbbgain_table[6].txbbgain_value = 0x5a400169;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100799 priv->txbbgain_table[7].txbb_iq_amplifygain = 5;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000800 priv->txbbgain_table[7].txbbgain_value = 0x55400155;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100801 priv->txbbgain_table[8].txbb_iq_amplifygain = 4;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000802 priv->txbbgain_table[8].txbbgain_value = 0x50800142;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100803 priv->txbbgain_table[9].txbb_iq_amplifygain = 3;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000804 priv->txbbgain_table[9].txbbgain_value = 0x4c000130;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100805 priv->txbbgain_table[10].txbb_iq_amplifygain = 2;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000806 priv->txbbgain_table[10].txbbgain_value = 0x47c0011f;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100807 priv->txbbgain_table[11].txbb_iq_amplifygain = 1;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000808 priv->txbbgain_table[11].txbbgain_value = 0x43c0010f;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100809 priv->txbbgain_table[12].txbb_iq_amplifygain = 0;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000810 priv->txbbgain_table[12].txbbgain_value = 0x40000100;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100811 priv->txbbgain_table[13].txbb_iq_amplifygain = -1;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000812 priv->txbbgain_table[13].txbbgain_value = 0x3c8000f2;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100813 priv->txbbgain_table[14].txbb_iq_amplifygain = -2;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000814 priv->txbbgain_table[14].txbbgain_value = 0x390000e4;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100815 priv->txbbgain_table[15].txbb_iq_amplifygain = -3;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000816 priv->txbbgain_table[15].txbbgain_value = 0x35c000d7;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100817 priv->txbbgain_table[16].txbb_iq_amplifygain = -4;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000818 priv->txbbgain_table[16].txbbgain_value = 0x32c000cb;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100819 priv->txbbgain_table[17].txbb_iq_amplifygain = -5;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000820 priv->txbbgain_table[17].txbbgain_value = 0x300000c0;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100821 priv->txbbgain_table[18].txbb_iq_amplifygain = -6;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000822 priv->txbbgain_table[18].txbbgain_value = 0x2d4000b5;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100823 priv->txbbgain_table[19].txbb_iq_amplifygain = -7;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000824 priv->txbbgain_table[19].txbbgain_value = 0x2ac000ab;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100825 priv->txbbgain_table[20].txbb_iq_amplifygain = -8;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000826 priv->txbbgain_table[20].txbbgain_value = 0x288000a2;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100827 priv->txbbgain_table[21].txbb_iq_amplifygain = -9;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000828 priv->txbbgain_table[21].txbbgain_value = 0x26000098;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100829 priv->txbbgain_table[22].txbb_iq_amplifygain = -10;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000830 priv->txbbgain_table[22].txbbgain_value = 0x24000090;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100831 priv->txbbgain_table[23].txbb_iq_amplifygain = -11;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000832 priv->txbbgain_table[23].txbbgain_value = 0x22000088;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100833 priv->txbbgain_table[24].txbb_iq_amplifygain = -12;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000834 priv->txbbgain_table[24].txbbgain_value = 0x20000080;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100835 priv->txbbgain_table[25].txbb_iq_amplifygain = -13;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000836 priv->txbbgain_table[25].txbbgain_value = 0x1a00006c;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100837 priv->txbbgain_table[26].txbb_iq_amplifygain = -14;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000838 priv->txbbgain_table[26].txbbgain_value = 0x1c800072;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100839 priv->txbbgain_table[27].txbb_iq_amplifygain = -15;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000840 priv->txbbgain_table[27].txbbgain_value = 0x18000060;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100841 priv->txbbgain_table[28].txbb_iq_amplifygain = -16;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000842 priv->txbbgain_table[28].txbbgain_value = 0x19800066;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100843 priv->txbbgain_table[29].txbb_iq_amplifygain = -17;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000844 priv->txbbgain_table[29].txbbgain_value = 0x15800056;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100845 priv->txbbgain_table[30].txbb_iq_amplifygain = -18;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000846 priv->txbbgain_table[30].txbbgain_value = 0x26c0005b;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100847 priv->txbbgain_table[31].txbb_iq_amplifygain = -19;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000848 priv->txbbgain_table[31].txbbgain_value = 0x14400051;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100849 priv->txbbgain_table[32].txbb_iq_amplifygain = -20;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000850 priv->txbbgain_table[32].txbbgain_value = 0x24400051;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100851 priv->txbbgain_table[33].txbb_iq_amplifygain = -21;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000852 priv->txbbgain_table[33].txbbgain_value = 0x1300004c;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100853 priv->txbbgain_table[34].txbb_iq_amplifygain = -22;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000854 priv->txbbgain_table[34].txbbgain_value = 0x12000048;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100855 priv->txbbgain_table[35].txbb_iq_amplifygain = -23;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000856 priv->txbbgain_table[35].txbbgain_value = 0x11000044;
Sebastian Hahn35997ff2012-12-05 21:40:18 +0100857 priv->txbbgain_table[36].txbb_iq_amplifygain = -24;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +0000858 priv->txbbgain_table[36].txbbgain_value = 0x10000040;
Jerry Chuang8fc85982009-11-03 07:17:11 -0200859
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +0000860 /*
861 * ccktxbb_valuearray[0] is 0xA22 [1] is 0xA24 ...[7] is 0xA29
862 * This Table is for CH1~CH13
863 */
Jerry Chuang8fc85982009-11-03 07:17:11 -0200864 priv->cck_txbbgain_table[0].ccktxbb_valuearray[0] = 0x36;
865 priv->cck_txbbgain_table[0].ccktxbb_valuearray[1] = 0x35;
866 priv->cck_txbbgain_table[0].ccktxbb_valuearray[2] = 0x2e;
867 priv->cck_txbbgain_table[0].ccktxbb_valuearray[3] = 0x25;
868 priv->cck_txbbgain_table[0].ccktxbb_valuearray[4] = 0x1c;
869 priv->cck_txbbgain_table[0].ccktxbb_valuearray[5] = 0x12;
870 priv->cck_txbbgain_table[0].ccktxbb_valuearray[6] = 0x09;
871 priv->cck_txbbgain_table[0].ccktxbb_valuearray[7] = 0x04;
872
873 priv->cck_txbbgain_table[1].ccktxbb_valuearray[0] = 0x33;
874 priv->cck_txbbgain_table[1].ccktxbb_valuearray[1] = 0x32;
875 priv->cck_txbbgain_table[1].ccktxbb_valuearray[2] = 0x2b;
876 priv->cck_txbbgain_table[1].ccktxbb_valuearray[3] = 0x23;
877 priv->cck_txbbgain_table[1].ccktxbb_valuearray[4] = 0x1a;
878 priv->cck_txbbgain_table[1].ccktxbb_valuearray[5] = 0x11;
879 priv->cck_txbbgain_table[1].ccktxbb_valuearray[6] = 0x08;
880 priv->cck_txbbgain_table[1].ccktxbb_valuearray[7] = 0x04;
881
882 priv->cck_txbbgain_table[2].ccktxbb_valuearray[0] = 0x30;
883 priv->cck_txbbgain_table[2].ccktxbb_valuearray[1] = 0x2f;
884 priv->cck_txbbgain_table[2].ccktxbb_valuearray[2] = 0x29;
885 priv->cck_txbbgain_table[2].ccktxbb_valuearray[3] = 0x21;
886 priv->cck_txbbgain_table[2].ccktxbb_valuearray[4] = 0x19;
887 priv->cck_txbbgain_table[2].ccktxbb_valuearray[5] = 0x10;
888 priv->cck_txbbgain_table[2].ccktxbb_valuearray[6] = 0x08;
889 priv->cck_txbbgain_table[2].ccktxbb_valuearray[7] = 0x03;
890
891 priv->cck_txbbgain_table[3].ccktxbb_valuearray[0] = 0x2d;
892 priv->cck_txbbgain_table[3].ccktxbb_valuearray[1] = 0x2d;
893 priv->cck_txbbgain_table[3].ccktxbb_valuearray[2] = 0x27;
894 priv->cck_txbbgain_table[3].ccktxbb_valuearray[3] = 0x1f;
895 priv->cck_txbbgain_table[3].ccktxbb_valuearray[4] = 0x18;
896 priv->cck_txbbgain_table[3].ccktxbb_valuearray[5] = 0x0f;
897 priv->cck_txbbgain_table[3].ccktxbb_valuearray[6] = 0x08;
898 priv->cck_txbbgain_table[3].ccktxbb_valuearray[7] = 0x03;
899
900 priv->cck_txbbgain_table[4].ccktxbb_valuearray[0] = 0x2b;
901 priv->cck_txbbgain_table[4].ccktxbb_valuearray[1] = 0x2a;
902 priv->cck_txbbgain_table[4].ccktxbb_valuearray[2] = 0x25;
903 priv->cck_txbbgain_table[4].ccktxbb_valuearray[3] = 0x1e;
904 priv->cck_txbbgain_table[4].ccktxbb_valuearray[4] = 0x16;
905 priv->cck_txbbgain_table[4].ccktxbb_valuearray[5] = 0x0e;
906 priv->cck_txbbgain_table[4].ccktxbb_valuearray[6] = 0x07;
907 priv->cck_txbbgain_table[4].ccktxbb_valuearray[7] = 0x03;
908
909 priv->cck_txbbgain_table[5].ccktxbb_valuearray[0] = 0x28;
910 priv->cck_txbbgain_table[5].ccktxbb_valuearray[1] = 0x28;
911 priv->cck_txbbgain_table[5].ccktxbb_valuearray[2] = 0x22;
912 priv->cck_txbbgain_table[5].ccktxbb_valuearray[3] = 0x1c;
913 priv->cck_txbbgain_table[5].ccktxbb_valuearray[4] = 0x15;
914 priv->cck_txbbgain_table[5].ccktxbb_valuearray[5] = 0x0d;
915 priv->cck_txbbgain_table[5].ccktxbb_valuearray[6] = 0x07;
916 priv->cck_txbbgain_table[5].ccktxbb_valuearray[7] = 0x03;
917
918 priv->cck_txbbgain_table[6].ccktxbb_valuearray[0] = 0x26;
919 priv->cck_txbbgain_table[6].ccktxbb_valuearray[1] = 0x25;
920 priv->cck_txbbgain_table[6].ccktxbb_valuearray[2] = 0x21;
921 priv->cck_txbbgain_table[6].ccktxbb_valuearray[3] = 0x1b;
922 priv->cck_txbbgain_table[6].ccktxbb_valuearray[4] = 0x14;
923 priv->cck_txbbgain_table[6].ccktxbb_valuearray[5] = 0x0d;
924 priv->cck_txbbgain_table[6].ccktxbb_valuearray[6] = 0x06;
925 priv->cck_txbbgain_table[6].ccktxbb_valuearray[7] = 0x03;
926
927 priv->cck_txbbgain_table[7].ccktxbb_valuearray[0] = 0x24;
928 priv->cck_txbbgain_table[7].ccktxbb_valuearray[1] = 0x23;
929 priv->cck_txbbgain_table[7].ccktxbb_valuearray[2] = 0x1f;
930 priv->cck_txbbgain_table[7].ccktxbb_valuearray[3] = 0x19;
931 priv->cck_txbbgain_table[7].ccktxbb_valuearray[4] = 0x13;
932 priv->cck_txbbgain_table[7].ccktxbb_valuearray[5] = 0x0c;
933 priv->cck_txbbgain_table[7].ccktxbb_valuearray[6] = 0x06;
934 priv->cck_txbbgain_table[7].ccktxbb_valuearray[7] = 0x03;
935
936 priv->cck_txbbgain_table[8].ccktxbb_valuearray[0] = 0x22;
937 priv->cck_txbbgain_table[8].ccktxbb_valuearray[1] = 0x21;
938 priv->cck_txbbgain_table[8].ccktxbb_valuearray[2] = 0x1d;
939 priv->cck_txbbgain_table[8].ccktxbb_valuearray[3] = 0x18;
940 priv->cck_txbbgain_table[8].ccktxbb_valuearray[4] = 0x11;
941 priv->cck_txbbgain_table[8].ccktxbb_valuearray[5] = 0x0b;
942 priv->cck_txbbgain_table[8].ccktxbb_valuearray[6] = 0x06;
943 priv->cck_txbbgain_table[8].ccktxbb_valuearray[7] = 0x02;
944
945 priv->cck_txbbgain_table[9].ccktxbb_valuearray[0] = 0x20;
946 priv->cck_txbbgain_table[9].ccktxbb_valuearray[1] = 0x20;
947 priv->cck_txbbgain_table[9].ccktxbb_valuearray[2] = 0x1b;
948 priv->cck_txbbgain_table[9].ccktxbb_valuearray[3] = 0x16;
949 priv->cck_txbbgain_table[9].ccktxbb_valuearray[4] = 0x11;
950 priv->cck_txbbgain_table[9].ccktxbb_valuearray[5] = 0x08;
951 priv->cck_txbbgain_table[9].ccktxbb_valuearray[6] = 0x05;
952 priv->cck_txbbgain_table[9].ccktxbb_valuearray[7] = 0x02;
953
954 priv->cck_txbbgain_table[10].ccktxbb_valuearray[0] = 0x1f;
955 priv->cck_txbbgain_table[10].ccktxbb_valuearray[1] = 0x1e;
956 priv->cck_txbbgain_table[10].ccktxbb_valuearray[2] = 0x1a;
957 priv->cck_txbbgain_table[10].ccktxbb_valuearray[3] = 0x15;
958 priv->cck_txbbgain_table[10].ccktxbb_valuearray[4] = 0x10;
959 priv->cck_txbbgain_table[10].ccktxbb_valuearray[5] = 0x0a;
960 priv->cck_txbbgain_table[10].ccktxbb_valuearray[6] = 0x05;
961 priv->cck_txbbgain_table[10].ccktxbb_valuearray[7] = 0x02;
962
963 priv->cck_txbbgain_table[11].ccktxbb_valuearray[0] = 0x1d;
964 priv->cck_txbbgain_table[11].ccktxbb_valuearray[1] = 0x1c;
965 priv->cck_txbbgain_table[11].ccktxbb_valuearray[2] = 0x18;
966 priv->cck_txbbgain_table[11].ccktxbb_valuearray[3] = 0x14;
967 priv->cck_txbbgain_table[11].ccktxbb_valuearray[4] = 0x0f;
968 priv->cck_txbbgain_table[11].ccktxbb_valuearray[5] = 0x0a;
969 priv->cck_txbbgain_table[11].ccktxbb_valuearray[6] = 0x05;
970 priv->cck_txbbgain_table[11].ccktxbb_valuearray[7] = 0x02;
971
972 priv->cck_txbbgain_table[12].ccktxbb_valuearray[0] = 0x1b;
973 priv->cck_txbbgain_table[12].ccktxbb_valuearray[1] = 0x1a;
974 priv->cck_txbbgain_table[12].ccktxbb_valuearray[2] = 0x17;
975 priv->cck_txbbgain_table[12].ccktxbb_valuearray[3] = 0x13;
976 priv->cck_txbbgain_table[12].ccktxbb_valuearray[4] = 0x0e;
977 priv->cck_txbbgain_table[12].ccktxbb_valuearray[5] = 0x09;
978 priv->cck_txbbgain_table[12].ccktxbb_valuearray[6] = 0x04;
979 priv->cck_txbbgain_table[12].ccktxbb_valuearray[7] = 0x02;
980
981 priv->cck_txbbgain_table[13].ccktxbb_valuearray[0] = 0x1a;
982 priv->cck_txbbgain_table[13].ccktxbb_valuearray[1] = 0x19;
983 priv->cck_txbbgain_table[13].ccktxbb_valuearray[2] = 0x16;
984 priv->cck_txbbgain_table[13].ccktxbb_valuearray[3] = 0x12;
985 priv->cck_txbbgain_table[13].ccktxbb_valuearray[4] = 0x0d;
986 priv->cck_txbbgain_table[13].ccktxbb_valuearray[5] = 0x09;
987 priv->cck_txbbgain_table[13].ccktxbb_valuearray[6] = 0x04;
988 priv->cck_txbbgain_table[13].ccktxbb_valuearray[7] = 0x02;
989
990 priv->cck_txbbgain_table[14].ccktxbb_valuearray[0] = 0x18;
991 priv->cck_txbbgain_table[14].ccktxbb_valuearray[1] = 0x17;
992 priv->cck_txbbgain_table[14].ccktxbb_valuearray[2] = 0x15;
993 priv->cck_txbbgain_table[14].ccktxbb_valuearray[3] = 0x11;
994 priv->cck_txbbgain_table[14].ccktxbb_valuearray[4] = 0x0c;
995 priv->cck_txbbgain_table[14].ccktxbb_valuearray[5] = 0x08;
996 priv->cck_txbbgain_table[14].ccktxbb_valuearray[6] = 0x04;
997 priv->cck_txbbgain_table[14].ccktxbb_valuearray[7] = 0x02;
998
999 priv->cck_txbbgain_table[15].ccktxbb_valuearray[0] = 0x17;
1000 priv->cck_txbbgain_table[15].ccktxbb_valuearray[1] = 0x16;
1001 priv->cck_txbbgain_table[15].ccktxbb_valuearray[2] = 0x13;
1002 priv->cck_txbbgain_table[15].ccktxbb_valuearray[3] = 0x10;
1003 priv->cck_txbbgain_table[15].ccktxbb_valuearray[4] = 0x0c;
1004 priv->cck_txbbgain_table[15].ccktxbb_valuearray[5] = 0x08;
1005 priv->cck_txbbgain_table[15].ccktxbb_valuearray[6] = 0x04;
1006 priv->cck_txbbgain_table[15].ccktxbb_valuearray[7] = 0x02;
1007
1008 priv->cck_txbbgain_table[16].ccktxbb_valuearray[0] = 0x16;
1009 priv->cck_txbbgain_table[16].ccktxbb_valuearray[1] = 0x15;
1010 priv->cck_txbbgain_table[16].ccktxbb_valuearray[2] = 0x12;
1011 priv->cck_txbbgain_table[16].ccktxbb_valuearray[3] = 0x0f;
1012 priv->cck_txbbgain_table[16].ccktxbb_valuearray[4] = 0x0b;
1013 priv->cck_txbbgain_table[16].ccktxbb_valuearray[5] = 0x07;
1014 priv->cck_txbbgain_table[16].ccktxbb_valuearray[6] = 0x04;
1015 priv->cck_txbbgain_table[16].ccktxbb_valuearray[7] = 0x01;
1016
1017 priv->cck_txbbgain_table[17].ccktxbb_valuearray[0] = 0x14;
1018 priv->cck_txbbgain_table[17].ccktxbb_valuearray[1] = 0x14;
1019 priv->cck_txbbgain_table[17].ccktxbb_valuearray[2] = 0x11;
1020 priv->cck_txbbgain_table[17].ccktxbb_valuearray[3] = 0x0e;
1021 priv->cck_txbbgain_table[17].ccktxbb_valuearray[4] = 0x0b;
1022 priv->cck_txbbgain_table[17].ccktxbb_valuearray[5] = 0x07;
1023 priv->cck_txbbgain_table[17].ccktxbb_valuearray[6] = 0x03;
1024 priv->cck_txbbgain_table[17].ccktxbb_valuearray[7] = 0x02;
1025
1026 priv->cck_txbbgain_table[18].ccktxbb_valuearray[0] = 0x13;
1027 priv->cck_txbbgain_table[18].ccktxbb_valuearray[1] = 0x13;
1028 priv->cck_txbbgain_table[18].ccktxbb_valuearray[2] = 0x10;
1029 priv->cck_txbbgain_table[18].ccktxbb_valuearray[3] = 0x0d;
1030 priv->cck_txbbgain_table[18].ccktxbb_valuearray[4] = 0x0a;
1031 priv->cck_txbbgain_table[18].ccktxbb_valuearray[5] = 0x06;
1032 priv->cck_txbbgain_table[18].ccktxbb_valuearray[6] = 0x03;
1033 priv->cck_txbbgain_table[18].ccktxbb_valuearray[7] = 0x01;
1034
1035 priv->cck_txbbgain_table[19].ccktxbb_valuearray[0] = 0x12;
1036 priv->cck_txbbgain_table[19].ccktxbb_valuearray[1] = 0x12;
1037 priv->cck_txbbgain_table[19].ccktxbb_valuearray[2] = 0x0f;
1038 priv->cck_txbbgain_table[19].ccktxbb_valuearray[3] = 0x0c;
1039 priv->cck_txbbgain_table[19].ccktxbb_valuearray[4] = 0x09;
1040 priv->cck_txbbgain_table[19].ccktxbb_valuearray[5] = 0x06;
1041 priv->cck_txbbgain_table[19].ccktxbb_valuearray[6] = 0x03;
1042 priv->cck_txbbgain_table[19].ccktxbb_valuearray[7] = 0x01;
1043
1044 priv->cck_txbbgain_table[20].ccktxbb_valuearray[0] = 0x11;
1045 priv->cck_txbbgain_table[20].ccktxbb_valuearray[1] = 0x11;
1046 priv->cck_txbbgain_table[20].ccktxbb_valuearray[2] = 0x0f;
1047 priv->cck_txbbgain_table[20].ccktxbb_valuearray[3] = 0x0c;
1048 priv->cck_txbbgain_table[20].ccktxbb_valuearray[4] = 0x09;
1049 priv->cck_txbbgain_table[20].ccktxbb_valuearray[5] = 0x06;
1050 priv->cck_txbbgain_table[20].ccktxbb_valuearray[6] = 0x03;
1051 priv->cck_txbbgain_table[20].ccktxbb_valuearray[7] = 0x01;
1052
1053 priv->cck_txbbgain_table[21].ccktxbb_valuearray[0] = 0x10;
1054 priv->cck_txbbgain_table[21].ccktxbb_valuearray[1] = 0x10;
1055 priv->cck_txbbgain_table[21].ccktxbb_valuearray[2] = 0x0e;
1056 priv->cck_txbbgain_table[21].ccktxbb_valuearray[3] = 0x0b;
1057 priv->cck_txbbgain_table[21].ccktxbb_valuearray[4] = 0x08;
1058 priv->cck_txbbgain_table[21].ccktxbb_valuearray[5] = 0x05;
1059 priv->cck_txbbgain_table[21].ccktxbb_valuearray[6] = 0x03;
1060 priv->cck_txbbgain_table[21].ccktxbb_valuearray[7] = 0x01;
1061
1062 priv->cck_txbbgain_table[22].ccktxbb_valuearray[0] = 0x0f;
1063 priv->cck_txbbgain_table[22].ccktxbb_valuearray[1] = 0x0f;
1064 priv->cck_txbbgain_table[22].ccktxbb_valuearray[2] = 0x0d;
1065 priv->cck_txbbgain_table[22].ccktxbb_valuearray[3] = 0x0b;
1066 priv->cck_txbbgain_table[22].ccktxbb_valuearray[4] = 0x08;
1067 priv->cck_txbbgain_table[22].ccktxbb_valuearray[5] = 0x05;
1068 priv->cck_txbbgain_table[22].ccktxbb_valuearray[6] = 0x03;
1069 priv->cck_txbbgain_table[22].ccktxbb_valuearray[7] = 0x01;
1070
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001071 /*
1072 * ccktxbb_valuearray[0] is 0xA22 [1] is 0xA24 ...[7] is 0xA29
1073 * This Table is for CH14
1074 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001075 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[0] = 0x36;
1076 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[1] = 0x35;
1077 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[2] = 0x2e;
1078 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[3] = 0x1b;
1079 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[4] = 0x00;
1080 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[5] = 0x00;
1081 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[6] = 0x00;
1082 priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[7] = 0x00;
1083
1084 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[0] = 0x33;
1085 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[1] = 0x32;
1086 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[2] = 0x2b;
1087 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[3] = 0x19;
1088 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[4] = 0x00;
1089 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[5] = 0x00;
1090 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[6] = 0x00;
1091 priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[7] = 0x00;
1092
1093 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[0] = 0x30;
1094 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[1] = 0x2f;
1095 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[2] = 0x29;
1096 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[3] = 0x18;
1097 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[4] = 0x00;
1098 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[5] = 0x00;
1099 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[6] = 0x00;
1100 priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[7] = 0x00;
1101
1102 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[0] = 0x2d;
1103 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[1] = 0x2d;
1104 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[2] = 0x27;
1105 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[3] = 0x17;
1106 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[4] = 0x00;
1107 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[5] = 0x00;
1108 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[6] = 0x00;
1109 priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[7] = 0x00;
1110
1111 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[0] = 0x2b;
1112 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[1] = 0x2a;
1113 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[2] = 0x25;
1114 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[3] = 0x15;
1115 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[4] = 0x00;
1116 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[5] = 0x00;
1117 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[6] = 0x00;
1118 priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[7] = 0x00;
1119
1120 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[0] = 0x28;
1121 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[1] = 0x28;
1122 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[2] = 0x22;
1123 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[3] = 0x14;
1124 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[4] = 0x00;
1125 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[5] = 0x00;
1126 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[6] = 0x00;
1127 priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[7] = 0x00;
1128
1129 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[0] = 0x26;
1130 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[1] = 0x25;
1131 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[2] = 0x21;
1132 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[3] = 0x13;
1133 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[4] = 0x00;
1134 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[5] = 0x00;
1135 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[6] = 0x00;
1136 priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[7] = 0x00;
1137
1138 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[0] = 0x24;
1139 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[1] = 0x23;
1140 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[2] = 0x1f;
1141 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[3] = 0x12;
1142 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[4] = 0x00;
1143 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[5] = 0x00;
1144 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[6] = 0x00;
1145 priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[7] = 0x00;
1146
1147 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[0] = 0x22;
1148 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[1] = 0x21;
1149 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[2] = 0x1d;
1150 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[3] = 0x11;
1151 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[4] = 0x00;
1152 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[5] = 0x00;
1153 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[6] = 0x00;
1154 priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[7] = 0x00;
1155
1156 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[0] = 0x20;
1157 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[1] = 0x20;
1158 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[2] = 0x1b;
1159 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[3] = 0x10;
1160 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[4] = 0x00;
1161 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[5] = 0x00;
1162 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[6] = 0x00;
1163 priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[7] = 0x00;
1164
1165 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[0] = 0x1f;
1166 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[1] = 0x1e;
1167 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[2] = 0x1a;
1168 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[3] = 0x0f;
1169 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[4] = 0x00;
1170 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[5] = 0x00;
1171 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[6] = 0x00;
1172 priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[7] = 0x00;
1173
1174 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[0] = 0x1d;
1175 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[1] = 0x1c;
1176 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[2] = 0x18;
1177 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[3] = 0x0e;
1178 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[4] = 0x00;
1179 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[5] = 0x00;
1180 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[6] = 0x00;
1181 priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[7] = 0x00;
1182
1183 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[0] = 0x1b;
1184 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[1] = 0x1a;
1185 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[2] = 0x17;
1186 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[3] = 0x0e;
1187 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[4] = 0x00;
1188 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[5] = 0x00;
1189 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[6] = 0x00;
1190 priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[7] = 0x00;
1191
1192 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[0] = 0x1a;
1193 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[1] = 0x19;
1194 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[2] = 0x16;
1195 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[3] = 0x0d;
1196 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[4] = 0x00;
1197 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[5] = 0x00;
1198 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[6] = 0x00;
1199 priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[7] = 0x00;
1200
1201 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[0] = 0x18;
1202 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[1] = 0x17;
1203 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[2] = 0x15;
1204 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[3] = 0x0c;
1205 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[4] = 0x00;
1206 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[5] = 0x00;
1207 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[6] = 0x00;
1208 priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[7] = 0x00;
1209
1210 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[0] = 0x17;
1211 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[1] = 0x16;
1212 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[2] = 0x13;
1213 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[3] = 0x0b;
1214 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[4] = 0x00;
1215 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[5] = 0x00;
1216 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[6] = 0x00;
1217 priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[7] = 0x00;
1218
1219 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[0] = 0x16;
1220 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[1] = 0x15;
1221 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[2] = 0x12;
1222 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[3] = 0x0b;
1223 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[4] = 0x00;
1224 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[5] = 0x00;
1225 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[6] = 0x00;
1226 priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[7] = 0x00;
1227
1228 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[0] = 0x14;
1229 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[1] = 0x14;
1230 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[2] = 0x11;
1231 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[3] = 0x0a;
1232 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[4] = 0x00;
1233 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[5] = 0x00;
1234 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[6] = 0x00;
1235 priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[7] = 0x00;
1236
1237 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[0] = 0x13;
1238 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[1] = 0x13;
1239 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[2] = 0x10;
1240 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[3] = 0x0a;
1241 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[4] = 0x00;
1242 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[5] = 0x00;
1243 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[6] = 0x00;
1244 priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[7] = 0x00;
1245
1246 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[0] = 0x12;
1247 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[1] = 0x12;
1248 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[2] = 0x0f;
1249 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[3] = 0x09;
1250 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[4] = 0x00;
1251 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[5] = 0x00;
1252 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[6] = 0x00;
1253 priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[7] = 0x00;
1254
1255 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[0] = 0x11;
1256 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[1] = 0x11;
1257 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[2] = 0x0f;
1258 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[3] = 0x09;
1259 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[4] = 0x00;
1260 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[5] = 0x00;
1261 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[6] = 0x00;
1262 priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[7] = 0x00;
1263
1264 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[0] = 0x10;
1265 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[1] = 0x10;
1266 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[2] = 0x0e;
1267 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[3] = 0x08;
1268 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[4] = 0x00;
1269 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[5] = 0x00;
1270 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[6] = 0x00;
1271 priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[7] = 0x00;
1272
1273 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[0] = 0x0f;
1274 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[1] = 0x0f;
1275 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[2] = 0x0d;
1276 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[3] = 0x08;
1277 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[4] = 0x00;
1278 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[5] = 0x00;
1279 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[6] = 0x00;
1280 priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[7] = 0x00;
1281
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01001282 priv->btxpower_tracking = true;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001283 priv->txpower_count = 0;
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01001284 priv->btxpower_trackingInit = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001285
1286}
1287
1288static void dm_InitializeTXPowerTracking_ThermalMeter(struct net_device *dev)
1289{
1290 struct r8192_priv *priv = ieee80211_priv(dev);
1291
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001292 /*
1293 * Tx Power tracking by Thermal Meter requires Firmware R/W 3-wire. This mechanism
1294 * can be enabled only when Firmware R/W 3-wire is enabled. Otherwise, frequent r/w
1295 * 3-wire by driver causes RF to go into a wrong state.
1296 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001297 if (priv->ieee80211->FwRWRF)
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01001298 priv->btxpower_tracking = true;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001299 else
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01001300 priv->btxpower_tracking = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001301 priv->txpower_count = 0;
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01001302 priv->btxpower_trackingInit = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001303}
1304
Jerry Chuang8fc85982009-11-03 07:17:11 -02001305void dm_initialize_txpower_tracking(struct net_device *dev)
1306{
1307 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001308
Harisangam Sharvaric40753b2015-06-11 12:38:13 +00001309 if (priv->bDcut)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001310 dm_InitializeTXPowerTracking_TSSI(dev);
1311 else
1312 dm_InitializeTXPowerTracking_ThermalMeter(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001313} /* dm_InitializeTXPowerTracking */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001314
Jerry Chuang8fc85982009-11-03 07:17:11 -02001315static void dm_CheckTXPowerTracking_TSSI(struct net_device *dev)
1316{
1317 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01001318 static u32 tx_power_track_counter;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001319
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001320 if (!priv->btxpower_tracking)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001321 return;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001322 if ((tx_power_track_counter % 30 == 0) && (tx_power_track_counter != 0))
1323 queue_delayed_work(priv->priv_wq, &priv->txpower_tracking_wq, 0);
1324 tx_power_track_counter++;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001325}
1326
Jerry Chuang8fc85982009-11-03 07:17:11 -02001327static void dm_CheckTXPowerTracking_ThermalMeter(struct net_device *dev)
1328{
1329 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01001330 static u8 TM_Trigger;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001331 /*DbgPrint("dm_CheckTXPowerTracking()\n");*/
1332 if (!priv->btxpower_tracking)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001333 return;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001334 if (priv->txpower_count <= 2) {
1335 priv->txpower_count++;
1336 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001337 }
1338
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001339 if (!TM_Trigger) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001340 /*
1341 * Attention!! You have to write all 12bits of data to RF, or it may cause RF to crash
1342 * actually write reg0x02 bit1=0, then bit1=1.
1343 * DbgPrint("Trigger ThermalMeter, write RF reg0x2 = 0x4d to 0x4f\n");
1344 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001345 rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1346 rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1347 rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1348 rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1349 TM_Trigger = 1;
1350 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001351 }
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001352 /*DbgPrint("Schedule TxPowerTrackingWorkItem\n");*/
1353 queue_delayed_work(priv->priv_wq, &priv->txpower_tracking_wq, 0);
1354 TM_Trigger = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001355}
1356
Jerry Chuang8fc85982009-11-03 07:17:11 -02001357static void dm_check_txpower_tracking(struct net_device *dev)
1358{
1359 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001360 /*static u32 tx_power_track_counter = 0;*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001361
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001362#ifdef RTL8190P
Jerry Chuang8fc85982009-11-03 07:17:11 -02001363 dm_CheckTXPowerTracking_TSSI(dev);
1364#else
Harisangam Sharvaric40753b2015-06-11 12:38:13 +00001365 if (priv->bDcut)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001366 dm_CheckTXPowerTracking_TSSI(dev);
1367 else
1368 dm_CheckTXPowerTracking_ThermalMeter(dev);
1369#endif
1370
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001371} /* dm_CheckTXPowerTracking */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001372
Jerry Chuang8fc85982009-11-03 07:17:11 -02001373static void dm_CCKTxPowerAdjust_TSSI(struct net_device *dev, bool bInCH14)
1374{
1375 u32 TempVal;
1376 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001377
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001378 /* Write 0xa22 0xa23 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001379 TempVal = 0;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001380 if (!bInCH14) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001381 /* Write 0xa22 0xa23 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001382 TempVal = priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[0] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001383 (priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[1]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001384
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001385 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001386 /* Write 0xa24 ~ 0xa27 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001387 TempVal = priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[2] +
Jerry Chuang8fc85982009-11-03 07:17:11 -02001388 (priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[3]<<8) +
Xenia Ragiadakou00096312013-05-14 03:07:28 +03001389 (priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[4]<<16)+
Jerry Chuang8fc85982009-11-03 07:17:11 -02001390 (priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[5]<<24);
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001391 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001392 /* Write 0xa28 0xa29 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001393 TempVal = priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[6] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001394 (priv->cck_txbbgain_table[priv->cck_present_attentuation].ccktxbb_valuearray[7]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001395
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001396 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001397 } else {
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001398 TempVal = priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[0] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001399 (priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[1]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001400
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001401 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001402 /* Write 0xa24 ~ 0xa27 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001403 TempVal = priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[2] +
Jerry Chuang8fc85982009-11-03 07:17:11 -02001404 (priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[3]<<8) +
Xenia Ragiadakou00096312013-05-14 03:07:28 +03001405 (priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[4]<<16)+
Jerry Chuang8fc85982009-11-03 07:17:11 -02001406 (priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[5]<<24);
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001407 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001408 /* Write 0xa28 0xa29 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001409 TempVal = priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[6] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001410 (priv->cck_txbbgain_ch14_table[priv->cck_present_attentuation].ccktxbb_valuearray[7]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001411
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001412 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001413 }
Jerry Chuang8fc85982009-11-03 07:17:11 -02001414}
1415
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001416static void dm_CCKTxPowerAdjust_ThermalMeter(struct net_device *dev, bool bInCH14)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001417{
1418 u32 TempVal;
1419 struct r8192_priv *priv = ieee80211_priv(dev);
1420
1421 TempVal = 0;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001422 if (!bInCH14) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001423 /* Write 0xa22 0xa23 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001424 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][0] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001425 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][1]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001426 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1427 RT_TRACE(COMP_POWER_TRACKING, "CCK not chnl 14, reg 0x%x = 0x%x\n",
1428 rCCK0_TxFilter1, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001429 /* Write 0xa24 ~ 0xa27 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001430 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][2] +
Jerry Chuang8fc85982009-11-03 07:17:11 -02001431 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][3]<<8) +
Xenia Ragiadakou00096312013-05-14 03:07:28 +03001432 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][4]<<16)+
Jerry Chuang8fc85982009-11-03 07:17:11 -02001433 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][5]<<24);
1434 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1435 RT_TRACE(COMP_POWER_TRACKING, "CCK not chnl 14, reg 0x%x = 0x%x\n",
1436 rCCK0_TxFilter2, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001437 /* Write 0xa28 0xa29 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001438 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][6] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001439 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][7]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001440
1441 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1442 RT_TRACE(COMP_POWER_TRACKING, "CCK not chnl 14, reg 0x%x = 0x%x\n",
1443 rCCK0_DebugPort, TempVal);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001444 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001445 /*priv->CCKTxPowerAdjustCntNotCh14++; cosa add for debug.*/
1446 /* Write 0xa22 0xa23 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001447 TempVal = CCKSwingTable_Ch14[priv->CCK_index][0] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001448 (CCKSwingTable_Ch14[priv->CCK_index][1]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001449
1450 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1451 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1452 rCCK0_TxFilter1, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001453 /* Write 0xa24 ~ 0xa27 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001454 TempVal = CCKSwingTable_Ch14[priv->CCK_index][2] +
Jerry Chuang8fc85982009-11-03 07:17:11 -02001455 (CCKSwingTable_Ch14[priv->CCK_index][3]<<8) +
Xenia Ragiadakou00096312013-05-14 03:07:28 +03001456 (CCKSwingTable_Ch14[priv->CCK_index][4]<<16)+
Jerry Chuang8fc85982009-11-03 07:17:11 -02001457 (CCKSwingTable_Ch14[priv->CCK_index][5]<<24);
1458 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1459 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1460 rCCK0_TxFilter2, TempVal);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001461 /* Write 0xa28 0xa29 */
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001462 TempVal = CCKSwingTable_Ch14[priv->CCK_index][6] +
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001463 (CCKSwingTable_Ch14[priv->CCK_index][7]<<8);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001464
1465 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001466 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
Jerry Chuang8fc85982009-11-03 07:17:11 -02001467 rCCK0_DebugPort, TempVal);
1468 }
1469}
1470
Ana Reybf316432014-03-19 11:54:53 +01001471void dm_cck_txpower_adjust(struct net_device *dev, bool binch14)
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001472{ /* dm_CCKTxPowerAdjust */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001473 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001474
Harisangam Sharvaric40753b2015-06-11 12:38:13 +00001475 if (priv->bDcut)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001476 dm_CCKTxPowerAdjust_TSSI(dev, binch14);
1477 else
1478 dm_CCKTxPowerAdjust_ThermalMeter(dev, binch14);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001479}
1480
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001481#ifndef RTL8192U
Jerry Chuang8fc85982009-11-03 07:17:11 -02001482static void dm_txpower_reset_recovery(
1483 struct net_device *dev
1484)
1485{
1486 struct r8192_priv *priv = ieee80211_priv(dev);
1487
1488 RT_TRACE(COMP_POWER_TRACKING, "Start Reset Recovery ==>\n");
1489 rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex].txbbgain_value);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001490 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc80 is %08x\n", priv->txbbgain_table[priv->rfa_txpowertrackingindex].txbbgain_value);
1491 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in RFA_txPowerTrackingIndex is %x\n", priv->rfa_txpowertrackingindex);
1492 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery : RF A I/Q Amplify Gain is %ld\n", priv->txbbgain_table[priv->rfa_txpowertrackingindex].txbb_iq_amplifygain);
1493 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: CCK Attenuation is %d dB\n", priv->cck_present_attentuation);
Greg Donald0b4ef0a2014-08-24 04:57:36 -05001494 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001495
1496 rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfc_txpowertrackingindex].txbbgain_value);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001497 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc90 is %08x\n", priv->txbbgain_table[priv->rfc_txpowertrackingindex].txbbgain_value);
1498 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in RFC_txPowerTrackingIndex is %x\n", priv->rfc_txpowertrackingindex);
1499 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery : RF C I/Q Amplify Gain is %ld\n", priv->txbbgain_table[priv->rfc_txpowertrackingindex].txbb_iq_amplifygain);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001500
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001501} /* dm_TXPowerResetRecovery */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001502
Ana Reybf316432014-03-19 11:54:53 +01001503void dm_restore_dynamic_mechanism_state(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001504{
1505 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001506 u32 reg_ratr = priv->rate_adaptive.last_ratr;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001507
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001508 if (!priv->up) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001509 RT_TRACE(COMP_RATE, "<---- dm_restore_dynamic_mechanism_state(): driver is going to unload\n");
1510 return;
1511 }
1512
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001513 /* Restore previous state for rate adaptive */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001514 if (priv->rate_adaptive.rate_adaptive_disabled)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001515 return;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001516 /* TODO: Only 11n mode is implemented currently, */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001517 if (!(priv->ieee80211->mode == WIRELESS_MODE_N_24G ||
1518 priv->ieee80211->mode == WIRELESS_MODE_N_5G))
1519 return;
1520
Jerry Chuang8fc85982009-11-03 07:17:11 -02001521 {
1522 /* 2007/11/15 MH Copy from 8190PCI. */
1523 u32 ratr_value;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001524
Jerry Chuang8fc85982009-11-03 07:17:11 -02001525 ratr_value = reg_ratr;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001526 if (priv->rf_type == RF_1T2R) { /* 1T2R, Spatial Stream 2 should be disabled */
Xenia Ragiadakou33c2aa12013-05-13 23:36:39 +03001527 ratr_value &= ~(RATE_ALL_OFDM_2SS);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001528 /*DbgPrint("HW_VAR_TATR_0 from 0x%x ==> 0x%x\n", ((pu4Byte)(val))[0], ratr_value);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001529 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001530 /*DbgPrint("set HW_VAR_TATR_0 = 0x%x\n", ratr_value);*/
1531 /*cosa PlatformEFIOWrite4Byte(Adapter, RATR0, ((pu4Byte)(val))[0]);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001532 write_nic_dword(dev, RATR0, ratr_value);
1533 write_nic_byte(dev, UFWP, 1);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001534 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001535 /* Restore TX Power Tracking Index */
Rui Miguel Silva2930d0b92014-04-28 12:12:54 +01001536 if (priv->btxpower_trackingInit && priv->btxpower_tracking)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001537 dm_txpower_reset_recovery(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001538
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001539 /* Restore BB Initial Gain */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001540 dm_bb_initialgain_restore(dev);
1541
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001542} /* DM_RestoreDynamicMechanismState */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001543
1544static void dm_bb_initialgain_restore(struct net_device *dev)
1545{
1546 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001547 u32 bit_mask = 0x7f; /* Bit0~ Bit6 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001548
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001549 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001550 return;
1551
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001552 /* Disable Initial Gain */
1553 /*PHY_SetBBReg(Adapter, UFWP, bMaskLWord, 0x800);*/
1554 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); /* Only clear byte 1 and rewrite. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001555 rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, bit_mask, (u32)priv->initgain_backup.xaagccore1);
1556 rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, bit_mask, (u32)priv->initgain_backup.xbagccore1);
1557 rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, bit_mask, (u32)priv->initgain_backup.xcagccore1);
1558 rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, bit_mask, (u32)priv->initgain_backup.xdagccore1);
1559 bit_mask = bMaskByte2;
1560 rtl8192_setBBreg(dev, rCCK0_CCA, bit_mask, (u32)priv->initgain_backup.cca);
1561
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001562 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc50 is %x\n", priv->initgain_backup.xaagccore1);
1563 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc58 is %x\n", priv->initgain_backup.xbagccore1);
1564 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc60 is %x\n", priv->initgain_backup.xcagccore1);
1565 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc68 is %x\n", priv->initgain_backup.xdagccore1);
1566 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xa0a is %x\n", priv->initgain_backup.cca);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001567 /* Enable Initial Gain */
1568 /*PHY_SetBBReg(Adapter, UFWP, bMaskLWord, 0x100);*/
1569 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1); /* Only clear byte 1 and rewrite. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001570
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001571} /* dm_BBInitialGainRestore */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001572
Ana Reybf316432014-03-19 11:54:53 +01001573void dm_backup_dynamic_mechanism_state(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001574{
1575 struct r8192_priv *priv = ieee80211_priv(dev);
1576
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001577 /* Fsync to avoid reset */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001578 priv->bswitch_fsync = false;
1579 priv->bfsync_processing = false;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001580 /* Backup BB InitialGain */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001581 dm_bb_initialgain_backup(dev);
1582
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001583} /* DM_BackupDynamicMechanismState */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001584
Jerry Chuang8fc85982009-11-03 07:17:11 -02001585static void dm_bb_initialgain_backup(struct net_device *dev)
1586{
1587 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001588 u32 bit_mask = bMaskByte0; /* Bit0~ Bit6 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001589
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001590 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001591 return;
1592
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001593 /*PHY_SetBBReg(Adapter, UFWP, bMaskLWord, 0x800);*/
1594 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); /* Only clear byte 1 and rewrite. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001595 priv->initgain_backup.xaagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, bit_mask);
1596 priv->initgain_backup.xbagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, bit_mask);
1597 priv->initgain_backup.xcagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, bit_mask);
1598 priv->initgain_backup.xdagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, bit_mask);
1599 bit_mask = bMaskByte2;
1600 priv->initgain_backup.cca = (u8)rtl8192_QueryBBReg(dev, rCCK0_CCA, bit_mask);
1601
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001602 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc50 is %x\n", priv->initgain_backup.xaagccore1);
1603 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc58 is %x\n", priv->initgain_backup.xbagccore1);
1604 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc60 is %x\n", priv->initgain_backup.xcagccore1);
1605 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc68 is %x\n", priv->initgain_backup.xdagccore1);
1606 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xa0a is %x\n", priv->initgain_backup.cca);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001607
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001608} /* dm_BBInitialGainBakcup */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001609
1610#endif
1611/*-----------------------------------------------------------------------------
1612 * Function: dm_change_dynamic_initgain_thresh()
1613 *
1614 * Overview:
1615 *
1616 * Input: NONE
1617 *
1618 * Output: NONE
1619 *
1620 * Return: NONE
1621 *
1622 * Revised History:
1623 * When Who Remark
1624 * 05/29/2008 amy Create Version 0 porting from windows code.
1625 *
1626 *---------------------------------------------------------------------------*/
Ana Reybf316432014-03-19 11:54:53 +01001627
1628void dm_change_dynamic_initgain_thresh(struct net_device *dev, u32 dm_type,
1629 u32 dm_value)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001630{
Bhumika Goyalf5914092016-02-16 15:26:05 +05301631 switch (dm_type) {
1632 case DIG_TYPE_THRESH_HIGH:
Jerry Chuang8fc85982009-11-03 07:17:11 -02001633 dm_digtable.rssi_high_thresh = dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301634 break;
1635
1636 case DIG_TYPE_THRESH_LOW:
Jerry Chuang8fc85982009-11-03 07:17:11 -02001637 dm_digtable.rssi_low_thresh = dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301638 break;
1639
1640 case DIG_TYPE_THRESH_HIGHPWR_HIGH:
Jerry Chuang8fc85982009-11-03 07:17:11 -02001641 dm_digtable.rssi_high_power_highthresh = dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301642 break;
1643
1644 case DIG_TYPE_THRESH_HIGHPWR_LOW:
Vaishali Thakkarc5c15ef2015-03-03 13:09:23 +05301645 dm_digtable.rssi_high_power_lowthresh = dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301646 break;
1647
1648 case DIG_TYPE_ENABLE:
Jerry Chuang8fc85982009-11-03 07:17:11 -02001649 dm_digtable.dig_state = DM_STA_DIG_MAX;
1650 dm_digtable.dig_enable_flag = true;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301651 break;
1652
1653 case DIG_TYPE_DISABLE:
Jerry Chuang8fc85982009-11-03 07:17:11 -02001654 dm_digtable.dig_state = DM_STA_DIG_MAX;
1655 dm_digtable.dig_enable_flag = false;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301656 break;
1657
1658 case DIG_TYPE_DBG_MODE:
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001659 if (dm_value >= DM_DBG_MAX)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001660 dm_value = DM_DBG_OFF;
1661 dm_digtable.dbg_mode = (u8)dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301662 break;
1663
1664 case DIG_TYPE_RSSI:
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001665 if (dm_value > 100)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001666 dm_value = 30;
1667 dm_digtable.rssi_val = (long)dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301668 break;
1669
1670 case DIG_TYPE_ALGORITHM:
Jerry Chuang8fc85982009-11-03 07:17:11 -02001671 if (dm_value >= DIG_ALGO_MAX)
1672 dm_value = DIG_ALGO_BY_FALSE_ALARM;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001673 if (dm_digtable.dig_algorithm != (u8)dm_value)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001674 dm_digtable.dig_algorithm_switch = 1;
1675 dm_digtable.dig_algorithm = (u8)dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301676 break;
1677
1678 case DIG_TYPE_BACKOFF:
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001679 if (dm_value > 30)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001680 dm_value = 30;
1681 dm_digtable.backoff_val = (u8)dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301682 break;
1683
1684 case DIG_TYPE_RX_GAIN_MIN:
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001685 if (dm_value == 0)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001686 dm_value = 0x1;
1687 dm_digtable.rx_gain_range_min = (u8)dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301688 break;
1689
1690 case DIG_TYPE_RX_GAIN_MAX:
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001691 if (dm_value > 0x50)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001692 dm_value = 0x50;
1693 dm_digtable.rx_gain_range_max = (u8)dm_value;
Bhumika Goyalf5914092016-02-16 15:26:05 +05301694 break;
1695
1696 default:
1697 break;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001698 }
Bhumika Goyalf5914092016-02-16 15:26:05 +05301699
Jerry Chuang8fc85982009-11-03 07:17:11 -02001700} /* DM_ChangeDynamicInitGainThresh */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001701
Jerry Chuang8fc85982009-11-03 07:17:11 -02001702/*-----------------------------------------------------------------------------
1703 * Function: dm_dig_init()
1704 *
1705 * Overview: Set DIG scheme init value.
1706 *
1707 * Input: NONE
1708 *
1709 * Output: NONE
1710 *
1711 * Return: NONE
1712 *
1713 * Revised History:
1714 * When Who Remark
1715 * 05/15/2008 amy Create Version 0 porting from windows code.
1716 *
1717 *---------------------------------------------------------------------------*/
1718static void dm_dig_init(struct net_device *dev)
1719{
1720 struct r8192_priv *priv = ieee80211_priv(dev);
1721 /* 2007/10/05 MH Disable DIG scheme now. Not tested. */
1722 dm_digtable.dig_enable_flag = true;
1723 dm_digtable.dig_algorithm = DIG_ALGO_BY_RSSI;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001724 dm_digtable.dbg_mode = DM_DBG_OFF; /* off=by real rssi value, on=by DM_DigTable.Rssi_val for new dig */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001725 dm_digtable.dig_algorithm_switch = 0;
1726
Justin P. Mattock589b3d02012-04-30 07:41:36 -07001727 /* 2007/10/04 MH Define init gain threshold. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001728 dm_digtable.dig_state = DM_STA_DIG_MAX;
1729 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1730 dm_digtable.initialgain_lowerbound_state = false;
1731
Sebastian Hahn35997ff2012-12-05 21:40:18 +01001732 dm_digtable.rssi_low_thresh = DM_DIG_THRESH_LOW;
1733 dm_digtable.rssi_high_thresh = DM_DIG_THRESH_HIGH;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001734
1735 dm_digtable.rssi_high_power_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
1736 dm_digtable.rssi_high_power_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
1737
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001738 dm_digtable.rssi_val = 50; /* for new dig debug rssi value */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001739 dm_digtable.backoff_val = DM_DIG_BACKOFF;
1740 dm_digtable.rx_gain_range_max = DM_DIG_MAX;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001741 if (priv->CustomerID == RT_CID_819x_Netcore)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001742 dm_digtable.rx_gain_range_min = DM_DIG_MIN_Netcore;
1743 else
1744 dm_digtable.rx_gain_range_min = DM_DIG_MIN;
1745
1746} /* dm_dig_init */
1747
Jerry Chuang8fc85982009-11-03 07:17:11 -02001748/*-----------------------------------------------------------------------------
1749 * Function: dm_ctrl_initgain_byrssi()
1750 *
1751 * Overview: Driver must monitor RSSI and notify firmware to change initial
1752 * gain according to different threshold. BB team provide the
1753 * suggested solution.
1754 *
1755 * Input: struct net_device *dev
1756 *
1757 * Output: NONE
1758 *
1759 * Return: NONE
1760 *
1761 * Revised History:
1762 * When Who Remark
1763 * 05/27/2008 amy Create Version 0 porting from windows code.
1764 *---------------------------------------------------------------------------*/
1765static void dm_ctrl_initgain_byrssi(struct net_device *dev)
1766{
Luis de Bethencourtf9bd5492015-07-20 18:35:42 +02001767 if (!dm_digtable.dig_enable_flag)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001768 return;
1769
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001770 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001771 dm_ctrl_initgain_byrssi_by_fwfalse_alarm(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001772 else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001773 dm_ctrl_initgain_byrssi_by_driverrssi(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001774 /* ; */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001775 else
1776 return;
1777}
1778
Jerry Chuang8fc85982009-11-03 07:17:11 -02001779static void dm_ctrl_initgain_byrssi_by_driverrssi(
1780 struct net_device *dev)
1781{
1782 struct r8192_priv *priv = ieee80211_priv(dev);
1783 u8 i;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01001784 static u8 fw_dig;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001785
Luis de Bethencourtf9bd5492015-07-20 18:35:42 +02001786 if (!dm_digtable.dig_enable_flag)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001787 return;
1788
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001789 /*DbgPrint("Dig by Sw Rssi\n");*/
1790 if (dm_digtable.dig_algorithm_switch) /* if switched algorithm, we have to disable FW Dig. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001791 fw_dig = 0;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001792
1793 if (fw_dig <= 3) { /* execute several times to make sure the FW Dig is disabled */
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001794 /* FW DIG Off */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001795 for (i = 0; i < 3; i++)
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001796 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); /* Only clear byte 1 and rewrite. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001797 fw_dig++;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001798 dm_digtable.dig_state = DM_STA_DIG_OFF; /* fw dig off. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001799 }
1800
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001801 if (priv->ieee80211->state == IEEE80211_LINKED)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001802 dm_digtable.cur_connect_state = DIG_CONNECT;
1803 else
1804 dm_digtable.cur_connect_state = DIG_DISCONNECT;
1805
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001806 /*DbgPrint("DM_DigTable.PreConnectState = %d, DM_DigTable.CurConnectState = %d\n",
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001807 DM_DigTable.PreConnectState, DM_DigTable.CurConnectState);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001808
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001809 if (dm_digtable.dbg_mode == DM_DBG_OFF)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001810 dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001811 /*DbgPrint("DM_DigTable.Rssi_val = %d\n", DM_DigTable.Rssi_val);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001812 dm_initial_gain(dev);
1813 dm_pd_th(dev);
1814 dm_cs_ratio(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001815 if (dm_digtable.dig_algorithm_switch)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001816 dm_digtable.dig_algorithm_switch = 0;
1817 dm_digtable.pre_connect_state = dm_digtable.cur_connect_state;
1818
1819} /* dm_CtrlInitGainByRssi */
1820
1821static void dm_ctrl_initgain_byrssi_by_fwfalse_alarm(
1822 struct net_device *dev)
1823{
1824 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01001825 static u32 reset_cnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001826 u8 i;
1827
Luis de Bethencourtf9bd5492015-07-20 18:35:42 +02001828 if (!dm_digtable.dig_enable_flag)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001829 return;
1830
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001831 if (dm_digtable.dig_algorithm_switch) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001832 dm_digtable.dig_state = DM_STA_DIG_MAX;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001833 /* Fw DIG On. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001834 for (i = 0; i < 3; i++)
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001835 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1); /* Only clear byte 1 and rewrite.*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001836 dm_digtable.dig_algorithm_switch = 0;
1837 }
1838
1839 if (priv->ieee80211->state != IEEE80211_LINKED)
1840 return;
1841
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001842 /* For smooth, we can not change DIG state. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001843 if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_low_thresh) &&
1844 (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_thresh))
Jerry Chuang8fc85982009-11-03 07:17:11 -02001845 return;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001846
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001847 /*DbgPrint("Dig by Fw False Alarm\n");*/
1848 /*if (DM_DigTable.Dig_State == DM_STA_DIG_OFF)*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001849 /*DbgPrint("DIG Check\n\r RSSI=%d LOW=%d HIGH=%d STATE=%d",
1850 pHalData->UndecoratedSmoothedPWDB, DM_DigTable.RssiLowThresh,
1851 DM_DigTable.RssiHighThresh, DM_DigTable.Dig_State);*/
Justin P. Mattock589b3d02012-04-30 07:41:36 -07001852 /* 1. When RSSI decrease, We have to judge if it is smaller than a threshold
Justin P. Mattock8ef3a7e2012-04-30 14:39:21 -07001853 and then execute the step below. */
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001854 if (priv->undecorated_smoothed_pwdb <= dm_digtable.rssi_low_thresh) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001855 /* 2008/02/05 MH When we execute silent reset, the DIG PHY parameters
1856 will be reset to init value. We must prevent the condition. */
1857 if (dm_digtable.dig_state == DM_STA_DIG_OFF &&
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001858 (priv->reset_count == reset_cnt)) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001859 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001860 }
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001861 reset_cnt = priv->reset_count;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001862
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001863 /* If DIG is off, DIG high power state must reset. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001864 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1865 dm_digtable.dig_state = DM_STA_DIG_OFF;
1866
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001867 /* 1.1 DIG Off. */
1868 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); /* Only clear byte 1 and rewrite. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001869
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001870 /* 1.2 Set initial gain. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001871 write_nic_byte(dev, rOFDM0_XAAGCCore1, 0x17);
1872 write_nic_byte(dev, rOFDM0_XBAGCCore1, 0x17);
1873 write_nic_byte(dev, rOFDM0_XCAGCCore1, 0x17);
1874 write_nic_byte(dev, rOFDM0_XDAGCCore1, 0x17);
1875
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001876 /* 1.3 Lower PD_TH for OFDM. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001877 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001878 /*
1879 * 2008/01/11 MH 40MHZ 90/92 register are not the same.
1880 * 2008/02/05 MH SD3-Jerry 92U/92E PD_TH are the same.
1881 */
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03001882 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x00);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001883 /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
1884 write_nic_byte(pAdapter, rOFDM0_RxDetector1, 0x40);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001885 else if (pAdapter->HardwareType == HARDWARE_TYPE_RTL8192E)
1886 else
1887 PlatformEFIOWrite1Byte(pAdapter, rOFDM0_RxDetector1, 0x40);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001888 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001889 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02001890 write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
1891
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001892 /* 1.4 Lower CS ratio for CCK. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001893 write_nic_byte(dev, 0xa0a, 0x08);
1894
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001895 /* 1.5 Higher EDCCA. */
1896 /*PlatformEFIOWrite4Byte(pAdapter, rOFDM0_ECCAThreshold, 0x325);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001897 return;
1898
1899 }
1900
Justin P. Mattock589b3d02012-04-30 07:41:36 -07001901 /* 2. When RSSI increase, We have to judge if it is larger than a threshold
Justin P. Mattock8ef3a7e2012-04-30 14:39:21 -07001902 and then execute the step below. */
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001903 if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001904 u8 reset_flag = 0;
1905
1906 if (dm_digtable.dig_state == DM_STA_DIG_ON &&
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001907 (priv->reset_count == reset_cnt)) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001908 dm_ctrl_initgain_byrssi_highpwr(dev);
1909 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001910 }
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00001911 if (priv->reset_count != reset_cnt)
1912 reset_flag = 1;
1913
1914 reset_cnt = priv->reset_count;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001915
1916 dm_digtable.dig_state = DM_STA_DIG_ON;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001917 /*DbgPrint("DIG ON\n\r");*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001918
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001919 /*
1920 * 2.1 Set initial gain.
1921 * 2008/02/26 MH SD3-Jerry suggest to prevent dirty environment.
1922 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001923 if (reset_flag == 1) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001924 write_nic_byte(dev, rOFDM0_XAAGCCore1, 0x2c);
1925 write_nic_byte(dev, rOFDM0_XBAGCCore1, 0x2c);
1926 write_nic_byte(dev, rOFDM0_XCAGCCore1, 0x2c);
1927 write_nic_byte(dev, rOFDM0_XDAGCCore1, 0x2c);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001928 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02001929 write_nic_byte(dev, rOFDM0_XAAGCCore1, 0x20);
1930 write_nic_byte(dev, rOFDM0_XBAGCCore1, 0x20);
1931 write_nic_byte(dev, rOFDM0_XCAGCCore1, 0x20);
1932 write_nic_byte(dev, rOFDM0_XDAGCCore1, 0x20);
1933 }
1934
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001935 /* 2.2 Higher PD_TH for OFDM. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001936 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001937 /*
1938 * 2008/01/11 MH 40MHZ 90/92 register are not the same.
1939 * 2008/02/05 MH SD3-Jerry 92U/92E PD_TH are the same.
1940 */
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03001941 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x20);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001942 /*
1943 else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
1944 write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001945 else if (pAdapter->HardwareType == HARDWARE_TYPE_RTL8192E)
1946 else
1947 PlatformEFIOWrite1Byte(pAdapter, rOFDM0_RxDetector1, 0x42);
Jerry Chuang8fc85982009-11-03 07:17:11 -02001948 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00001949 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02001950 write_nic_byte(dev, rOFDM0_RxDetector1, 0x44);
1951
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001952 /* 2.3 Higher CS ratio for CCK. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001953 write_nic_byte(dev, 0xa0a, 0xcd);
1954
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001955 /*
1956 * 2.4 Lower EDCCA.
1957 * 2008/01/11 MH 90/92 series are the same.
1958 */
1959 /*PlatformEFIOWrite4Byte(pAdapter, rOFDM0_ECCAThreshold, 0x346);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02001960
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001961 /* 2.5 DIG On. */
1962 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1); /* Only clear byte 1 and rewrite. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001963
1964 }
1965
1966 dm_ctrl_initgain_byrssi_highpwr(dev);
1967
1968} /* dm_CtrlInitGainByRssi */
1969
Jerry Chuang8fc85982009-11-03 07:17:11 -02001970/*-----------------------------------------------------------------------------
1971 * Function: dm_ctrl_initgain_byrssi_highpwr()
1972 *
1973 * Overview:
1974 *
1975 * Input: NONE
1976 *
1977 * Output: NONE
1978 *
1979 * Return: NONE
1980 *
1981 * Revised History:
1982 * When Who Remark
1983 * 05/28/2008 amy Create Version 0 porting from windows code.
1984 *
1985 *---------------------------------------------------------------------------*/
1986static void dm_ctrl_initgain_byrssi_highpwr(
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03001987 struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02001988{
1989 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01001990 static u32 reset_cnt_highpwr;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001991
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001992 /* For smooth, we can not change high power DIG state in the range. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02001993 if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_high_power_lowthresh) &&
1994 (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_power_highthresh))
Jerry Chuang8fc85982009-11-03 07:17:11 -02001995 return;
Jerry Chuang8fc85982009-11-03 07:17:11 -02001996
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00001997 /*
1998 * 3. When RSSI >75% or <70%, it is a high power issue. We have to judge if
1999 * it is larger than a threshold and then execute the step below.
2000 *
2001 * 2008/02/05 MH SD3-Jerry Modify PD_TH for high power issue.
2002 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002003 if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_power_highthresh) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002004 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_ON &&
2005 (priv->reset_count == reset_cnt_highpwr))
2006 return;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00002007 dm_digtable.dig_highpwr_state = DM_STA_DIG_ON;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002008
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002009 /* 3.1 Higher PD_TH for OFDM for high power state. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002010 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002011 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x10);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002012
2013 /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
2014 write_nic_byte(dev, rOFDM0_RxDetector1, 0x41);
2015 */
2016
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002017 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02002018 write_nic_byte(dev, rOFDM0_RxDetector1, 0x43);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002019 } else {
2020 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_OFF &&
Jerry Chuang8fc85982009-11-03 07:17:11 -02002021 (priv->reset_count == reset_cnt_highpwr))
2022 return;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00002023 dm_digtable.dig_highpwr_state = DM_STA_DIG_OFF;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002024
2025 if (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_power_lowthresh &&
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002026 priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002027 /* 3.2 Recover PD_TH for OFDM for normal power region. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002028 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002029 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x20);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002030 /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
2031 write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
2032 */
2033
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002034 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02002035 write_nic_byte(dev, rOFDM0_RxDetector1, 0x44);
2036 }
2037 }
2038
2039 reset_cnt_highpwr = priv->reset_count;
2040
2041} /* dm_CtrlInitGainByRssiHighPwr */
2042
Jerry Chuang8fc85982009-11-03 07:17:11 -02002043static void dm_initial_gain(
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002044 struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002045{
2046 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002047 u8 initial_gain = 0;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002048 static u8 initialized, force_write;
2049 static u32 reset_cnt;
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002050 u8 tmp;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002051
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002052 if (dm_digtable.dig_algorithm_switch) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002053 initialized = 0;
2054 reset_cnt = 0;
2055 }
2056
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002057 if (dm_digtable.pre_connect_state == dm_digtable.cur_connect_state) {
2058 if (dm_digtable.cur_connect_state == DIG_CONNECT) {
2059 if ((dm_digtable.rssi_val+10-dm_digtable.backoff_val) > dm_digtable.rx_gain_range_max)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002060 dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_max;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002061 else if ((dm_digtable.rssi_val+10-dm_digtable.backoff_val) < dm_digtable.rx_gain_range_min)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002062 dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_min;
2063 else
2064 dm_digtable.cur_ig_value = dm_digtable.rssi_val+10-dm_digtable.backoff_val;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002065 } else { /* current state is disconnected */
2066 if (dm_digtable.cur_ig_value == 0)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002067 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
2068 else
2069 dm_digtable.cur_ig_value = dm_digtable.pre_ig_value;
2070 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002071 } else { /* disconnected -> connected or connected -> disconnected */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002072 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
2073 dm_digtable.pre_ig_value = 0;
2074 }
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002075 /*DbgPrint("DM_DigTable.CurIGValue = 0x%x, DM_DigTable.PreIGValue = 0x%x\n", DM_DigTable.CurIGValue, DM_DigTable.PreIGValue);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002076
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002077 /* if silent reset happened, we should rewrite the values back */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002078 if (priv->reset_count != reset_cnt) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002079 force_write = 1;
2080 reset_cnt = priv->reset_count;
2081 }
2082
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002083 read_nic_byte(dev, rOFDM0_XAAGCCore1, &tmp);
2084 if (dm_digtable.pre_ig_value != tmp)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002085 force_write = 1;
2086
2087 {
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002088 if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value)
2089 || !initialized || force_write) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002090 initial_gain = (u8)dm_digtable.cur_ig_value;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002091 /*DbgPrint("Write initial gain = 0x%x\n", initial_gain);*/
2092 /* Set initial gain. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002093 write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
2094 write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
2095 write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
2096 write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
2097 dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
2098 initialized = 1;
2099 force_write = 0;
2100 }
2101 }
2102}
2103
2104static void dm_pd_th(
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002105 struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002106{
2107 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002108 static u8 initialized, force_write;
2109 static u32 reset_cnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002110
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002111 if (dm_digtable.dig_algorithm_switch) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002112 initialized = 0;
2113 reset_cnt = 0;
2114 }
2115
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002116 if (dm_digtable.pre_connect_state == dm_digtable.cur_connect_state) {
2117 if (dm_digtable.cur_connect_state == DIG_CONNECT) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002118 if (dm_digtable.rssi_val >= dm_digtable.rssi_high_power_highthresh)
2119 dm_digtable.curpd_thstate = DIG_PD_AT_HIGH_POWER;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00002120 else if (dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002121 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
2122 else if ((dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh) &&
2123 (dm_digtable.rssi_val < dm_digtable.rssi_high_power_lowthresh))
2124 dm_digtable.curpd_thstate = DIG_PD_AT_NORMAL_POWER;
2125 else
2126 dm_digtable.curpd_thstate = dm_digtable.prepd_thstate;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002127 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002128 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
2129 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002130 } else { /* disconnected -> connected or connected -> disconnected */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002131 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
2132 }
2133
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002134 /* if silent reset happened, we should rewrite the values back */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002135 if (priv->reset_count != reset_cnt) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002136 force_write = 1;
2137 reset_cnt = priv->reset_count;
2138 }
2139
2140 {
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002141 if ((dm_digtable.prepd_thstate != dm_digtable.curpd_thstate) ||
2142 (initialized <= 3) || force_write) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002143 /*DbgPrint("Write PD_TH state = %d\n", DM_DigTable.CurPD_THState);*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002144 if (dm_digtable.curpd_thstate == DIG_PD_AT_LOW_POWER) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002145 /* Lower PD_TH for OFDM. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002146 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002147 /*
2148 * 2008/01/11 MH 40MHZ 90/92 register are not the same.
2149 * 2008/02/05 MH SD3-Jerry 92U/92E PD_TH are the same.
2150 */
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002151 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x00);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002152 /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
2153 write_nic_byte(dev, rOFDM0_RxDetector1, 0x40);
2154 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002155 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02002156 write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002157 } else if (dm_digtable.curpd_thstate == DIG_PD_AT_NORMAL_POWER) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002158 /* Higher PD_TH for OFDM. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002159 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002160 /*
2161 * 2008/01/11 MH 40MHZ 90/92 register are not the same.
2162 * 2008/02/05 MH SD3-Jerry 92U/92E PD_TH are the same.
2163 */
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002164 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x20);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002165 /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
2166 write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
2167 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002168 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02002169 write_nic_byte(dev, rOFDM0_RxDetector1, 0x44);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002170 } else if (dm_digtable.curpd_thstate == DIG_PD_AT_HIGH_POWER) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002171 /* Higher PD_TH for OFDM for high power state. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002172 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002173 write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x10);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002174 /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
2175 write_nic_byte(dev, rOFDM0_RxDetector1, 0x41);
2176 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002177 } else
Jerry Chuang8fc85982009-11-03 07:17:11 -02002178 write_nic_byte(dev, rOFDM0_RxDetector1, 0x43);
2179 }
2180 dm_digtable.prepd_thstate = dm_digtable.curpd_thstate;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002181 if (initialized <= 3)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002182 initialized++;
2183 force_write = 0;
2184 }
2185 }
2186}
2187
2188static void dm_cs_ratio(
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002189 struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002190{
2191 struct r8192_priv *priv = ieee80211_priv(dev);
Greg Donald0b4ef0a2014-08-24 04:57:36 -05002192 static u8 initialized, force_write;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002193 static u32 reset_cnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002194
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002195 if (dm_digtable.dig_algorithm_switch) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002196 initialized = 0;
2197 reset_cnt = 0;
2198 }
2199
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002200 if (dm_digtable.pre_connect_state == dm_digtable.cur_connect_state) {
2201 if (dm_digtable.cur_connect_state == DIG_CONNECT) {
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00002202 if (dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002203 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00002204 else if (dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002205 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_HIGHER;
2206 else
2207 dm_digtable.curcs_ratio_state = dm_digtable.precs_ratio_state;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002208 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002209 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
2210 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002211 } else /* disconnected -> connected or connected -> disconnected */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002212 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002213
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002214 /* if silent reset happened, we should rewrite the values back */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002215 if (priv->reset_count != reset_cnt) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002216 force_write = 1;
2217 reset_cnt = priv->reset_count;
2218 }
2219
Jerry Chuang8fc85982009-11-03 07:17:11 -02002220 {
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002221 if ((dm_digtable.precs_ratio_state != dm_digtable.curcs_ratio_state) ||
2222 !initialized || force_write) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002223 /*DbgPrint("Write CS_ratio state = %d\n", DM_DigTable.CurCS_ratioState);*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002224 if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_LOWER) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002225 /* Lower CS ratio for CCK. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002226 write_nic_byte(dev, 0xa0a, 0x08);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002227 } else if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_HIGHER) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002228 /* Higher CS ratio for CCK. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002229 write_nic_byte(dev, 0xa0a, 0xcd);
2230 }
2231 dm_digtable.precs_ratio_state = dm_digtable.curcs_ratio_state;
2232 initialized = 1;
2233 force_write = 0;
2234 }
2235 }
2236}
2237
Himangi Saraogic541fa82014-03-17 04:07:56 +05302238void dm_init_edca_turbo(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002239{
2240 struct r8192_priv *priv = ieee80211_priv(dev);
2241
2242 priv->bcurrent_turbo_EDCA = false;
2243 priv->ieee80211->bis_any_nonbepkts = false;
2244 priv->bis_cur_rdlstate = false;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002245} /* dm_init_edca_turbo */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002246
Jerry Chuang8fc85982009-11-03 07:17:11 -02002247static void dm_check_edca_turbo(
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002248 struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002249{
2250 struct r8192_priv *priv = ieee80211_priv(dev);
2251 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002252 /*PSTA_QOS pStaQos = pMgntInfo->pStaQos;*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002253
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002254 /* Keep past Tx/Rx packet count for RT-to-RT EDCA turbo. */
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002255 static unsigned long lastTxOkCnt;
2256 static unsigned long lastRxOkCnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002257 unsigned long curTxOkCnt = 0;
2258 unsigned long curRxOkCnt = 0;
2259
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002260 /*
2261 * Do not be Turbo if it's under WiFi config and Qos Enabled, because the EDCA parameters
2262 * should follow the settings from QAP. By Bruce, 2007-12-07.
2263 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002264 if (priv->ieee80211->state != IEEE80211_LINKED)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002265 goto dm_CheckEdcaTurbo_EXIT;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002266 /* We do not turn on EDCA turbo mode for some AP that has IOT issue */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002267 if (priv->ieee80211->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002268 goto dm_CheckEdcaTurbo_EXIT;
2269
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002270 /*printk("========>%s():bis_any_nonbepkts is %d\n", __func__, priv->bis_any_nonbepkts);*/
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002271 /* Check the status for current condition. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002272 if (!priv->ieee80211->bis_any_nonbepkts) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002273 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
2274 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002275 /* For RT-AP, we needs to turn it on when Rx>Tx */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002276 if (curRxOkCnt > 4*curTxOkCnt) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002277 /*printk("%s():curRxOkCnt > 4*curTxOkCnt\n");*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002278 if (!priv->bis_cur_rdlstate || !priv->bcurrent_turbo_EDCA) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002279 write_nic_dword(dev, EDCAPARA_BE, edca_setting_DL[pHTInfo->IOTPeer]);
2280 priv->bis_cur_rdlstate = true;
2281 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002282 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002283 /*printk("%s():curRxOkCnt < 4*curTxOkCnt\n");*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002284 if (priv->bis_cur_rdlstate || !priv->bcurrent_turbo_EDCA) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002285 write_nic_dword(dev, EDCAPARA_BE, edca_setting_UL[pHTInfo->IOTPeer]);
2286 priv->bis_cur_rdlstate = false;
2287 }
2288
2289 }
2290
2291 priv->bcurrent_turbo_EDCA = true;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002292 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002293 /*
2294 * Turn Off EDCA turbo here.
2295 * Restore original EDCA according to the declaration of AP.
2296 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002297 if (priv->bcurrent_turbo_EDCA) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002298 {
2299 u8 u1bAIFS;
2300 u32 u4bAcParam;
2301 struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
2302 u8 mode = priv->ieee80211->mode;
2303
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002304 /* For Each time updating EDCA parameter, reset EDCA turbo mode status. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002305 dm_init_edca_turbo(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002306 u1bAIFS = qos_parameters->aifs[0] * ((mode&(IEEE_G|IEEE_N_24G)) ? 9 : 20) + aSifsTime;
Haneen Mohammed2060f312015-03-13 20:50:52 +03002307 u4bAcParam = (((u32)(qos_parameters->tx_op_limit[0])) << AC_PARAM_TXOP_LIMIT_OFFSET)|
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002308 (((u32)(qos_parameters->cw_max[0])) << AC_PARAM_ECW_MAX_OFFSET)|
2309 (((u32)(qos_parameters->cw_min[0])) << AC_PARAM_ECW_MIN_OFFSET)|
Haneen Mohammed2060f312015-03-13 20:50:52 +03002310 ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002311 /*write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002312 write_nic_dword(dev, EDCAPARA_BE, u4bAcParam);
2313
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002314 /*
2315 * Check ACM bit.
2316 * If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
2317 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002318 {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002319 /* TODO: Modified this part and try to set acm control in only 1 IO processing!! */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002320
2321 PACI_AIFSN pAciAifsn = (PACI_AIFSN)&(qos_parameters->aifs[0]);
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002322 u8 AcmCtrl;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002323
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002324 read_nic_byte(dev, AcmHwCtrl, &AcmCtrl);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002325
2326 if (pAciAifsn->f.ACM) { /* ACM bit is 1. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002327 AcmCtrl |= AcmHw_BeqEn;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002328 } else { /* ACM bit is 0. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002329 AcmCtrl &= (~AcmHw_BeqEn);
2330 }
2331
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002332 RT_TRACE(COMP_QOS, "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
Xenia Ragiadakou00096312013-05-14 03:07:28 +03002333 write_nic_byte(dev, AcmHwCtrl, AcmCtrl);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002334 }
2335 }
2336 priv->bcurrent_turbo_EDCA = false;
2337 }
2338 }
2339
Jerry Chuang8fc85982009-11-03 07:17:11 -02002340dm_CheckEdcaTurbo_EXIT:
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002341 /* Set variables for next time. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002342 priv->ieee80211->bis_any_nonbepkts = false;
2343 lastTxOkCnt = priv->stats.txbytesunicast;
2344 lastRxOkCnt = priv->stats.rxbytesunicast;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002345} /* dm_CheckEdcaTurbo */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002346
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002347static void dm_init_ctstoself(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002348{
Bhumika Goyalefdcb352016-09-18 17:56:24 +05302349 struct r8192_priv *priv = ieee80211_priv(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002350
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01002351 priv->ieee80211->bCTSToSelfEnable = true;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002352 priv->ieee80211->CTSToSelfTH = CTSToSelfTHVal;
2353}
2354
2355static void dm_ctstoself(struct net_device *dev)
2356{
Bhumika Goyalefdcb352016-09-18 17:56:24 +05302357 struct r8192_priv *priv = ieee80211_priv(dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002358 PRT_HIGH_THROUGHPUT pHTInfo = priv->ieee80211->pHTInfo;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002359 static unsigned long lastTxOkCnt;
2360 static unsigned long lastRxOkCnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002361 unsigned long curTxOkCnt = 0;
2362 unsigned long curRxOkCnt = 0;
2363
Ksenija Stanojevic4b2faf82015-02-28 00:14:34 +01002364 if (priv->ieee80211->bCTSToSelfEnable != true) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002365 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
2366 return;
2367 }
2368 /*
2369 1. Uplink
2370 2. Linksys350/Linksys300N
2371 3. <50 disable, >55 enable
2372 */
2373
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002374 if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002375 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
2376 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002377 if (curRxOkCnt > 4*curTxOkCnt) { /* downlink, disable CTS to self */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002378 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002379 /*DbgPrint("dm_CTSToSelf() ==> CTS to self disabled -- downlink\n");*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002380 } else { /* uplink */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002381 pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002382 }
2383
2384 lastTxOkCnt = priv->stats.txbytesunicast;
2385 lastRxOkCnt = priv->stats.rxbytesunicast;
2386 }
2387}
2388
Jerry Chuang8fc85982009-11-03 07:17:11 -02002389/*-----------------------------------------------------------------------------
2390 * Function: dm_check_pbc_gpio()
2391 *
2392 * Overview: Check if PBC button is pressed.
2393 *
2394 * Input: NONE
2395 *
2396 * Output: NONE
2397 *
2398 * Return: NONE
2399 *
2400 * Revised History:
2401 * When Who Remark
Sebastian Hahn35997ff2012-12-05 21:40:18 +01002402 * 05/28/2008 amy Create Version 0 porting from windows code.
Jerry Chuang8fc85982009-11-03 07:17:11 -02002403 *
2404 *---------------------------------------------------------------------------*/
2405static void dm_check_pbc_gpio(struct net_device *dev)
2406{
Jerry Chuang8fc85982009-11-03 07:17:11 -02002407 struct r8192_priv *priv = ieee80211_priv(dev);
2408 u8 tmp1byte;
2409
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002410 read_nic_byte(dev, GPI, &tmp1byte);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002411 if (tmp1byte == 0xff)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002412 return;
2413
Anish Bhatt56b31522015-10-12 21:02:36 -07002414 if (tmp1byte & BIT(6) || tmp1byte & BIT(0)) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002415 /*
2416 * Here we only set bPbcPressed to TRUE
2417 * After trigger PBC, the variable will be set to FALSE
2418 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002419 RT_TRACE(COMP_IO, "CheckPbcGPIO - PBC is pressed\n");
2420 priv->bpbc_pressed = true;
2421 }
Jerry Chuang8fc85982009-11-03 07:17:11 -02002422
2423}
2424
Jerry Chuang8fc85982009-11-03 07:17:11 -02002425/*-----------------------------------------------------------------------------
2426 * Function: DM_RFPathCheckWorkItemCallBack()
2427 *
2428 * Overview: Check if Current RF RX path is enabled
2429 *
2430 * Input: NONE
2431 *
2432 * Output: NONE
2433 *
2434 * Return: NONE
2435 *
2436 * Revised History:
2437 * When Who Remark
2438 * 01/30/2008 MHC Create Version 0.
2439 *
2440 *---------------------------------------------------------------------------*/
Ana Reybf316432014-03-19 11:54:53 +01002441void dm_rf_pathcheck_workitemcallback(struct work_struct *work)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002442{
Geliang Tanga5959f32015-12-28 23:43:38 +08002443 struct delayed_work *dwork = to_delayed_work(work);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002444 struct r8192_priv *priv = container_of(dwork, struct r8192_priv, rfpath_check_wq);
2445 struct net_device *dev = priv->ieee80211->dev;
2446 /*bool bactually_set = false;*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002447 u8 rfpath = 0, i;
2448
Jerry Chuang8fc85982009-11-03 07:17:11 -02002449 /* 2008/01/30 MH After discussing with SD3 Jerry, 0xc04/0xd04 register will
2450 always be the same. We only read 0xc04 now. */
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002451 read_nic_byte(dev, 0xc04, &rfpath);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002452
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002453 /* Check Bit 0-3, it means if RF A-D is enabled. */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002454 for (i = 0; i < RF90_PATH_MAX; i++) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002455 if (rfpath & (0x01<<i))
Cristina Opriceana19cd2292015-03-04 12:37:28 +02002456 priv->brfpath_rxenable[i] = true;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002457 else
Cristina Opriceana19cd2292015-03-04 12:37:28 +02002458 priv->brfpath_rxenable[i] = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002459 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002460 if (!DM_RxPathSelTable.Enable)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002461 return;
2462
2463 dm_rxpath_sel_byrssi(dev);
2464} /* DM_RFPathCheckWorkItemCallBack */
2465
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002466static void dm_init_rxpath_selection(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002467{
2468 u8 i;
2469 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002470
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002471 DM_RxPathSelTable.Enable = 1; /* default enabled */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002472 DM_RxPathSelTable.SS_TH_low = RxPathSelection_SS_TH_low;
2473 DM_RxPathSelTable.diff_TH = RxPathSelection_diff_TH;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002474 if (priv->CustomerID == RT_CID_819x_Netcore)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002475 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
2476 else
2477 DM_RxPathSelTable.cck_method = CCK_Rx_Version_1;
2478 DM_RxPathSelTable.DbgMode = DM_DBG_OFF;
2479 DM_RxPathSelTable.disabledRF = 0;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002480 for (i = 0; i < 4; i++) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002481 DM_RxPathSelTable.rf_rssi[i] = 50;
2482 DM_RxPathSelTable.cck_pwdb_sta[i] = -64;
2483 DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
2484 }
2485}
2486
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03002487static void dm_rxpath_sel_byrssi(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002488{
2489 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002490 u8 i, max_rssi_index = 0, min_rssi_index = 0, sec_rssi_index = 0, rf_num = 0;
2491 u8 tmp_max_rssi = 0, tmp_min_rssi = 0, tmp_sec_rssi = 0;
2492 u8 cck_default_Rx = 0x2; /* RF-C */
2493 u8 cck_optional_Rx = 0x3; /* RF-D */
2494 long tmp_cck_max_pwdb = 0, tmp_cck_min_pwdb = 0, tmp_cck_sec_pwdb = 0;
2495 u8 cck_rx_ver2_max_index = 0, cck_rx_ver2_min_index = 0, cck_rx_ver2_sec_index = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002496 u8 cur_rf_rssi;
2497 long cur_cck_pwdb;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002498 static u8 disabled_rf_cnt, cck_Rx_Path_initialized;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002499 u8 update_cck_rx_path;
2500
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002501 if (priv->rf_type != RF_2T4R)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002502 return;
2503
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002504 if (!cck_Rx_Path_initialized) {
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002505 read_nic_byte(dev, 0xa07, &DM_RxPathSelTable.cck_Rx_path);
2506 DM_RxPathSelTable.cck_Rx_path &= 0xf;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002507 cck_Rx_Path_initialized = 1;
2508 }
2509
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03002510 read_nic_byte(dev, 0xc04, &DM_RxPathSelTable.disabledRF);
2511 DM_RxPathSelTable.disabledRF = ~DM_RxPathSelTable.disabledRF & 0xf;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002512
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002513 if (priv->ieee80211->mode == WIRELESS_MODE_B) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002514 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2; /* pure B mode, fixed cck version2 */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002515 /*DbgPrint("Pure B mode, use cck rx version2\n");*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002516 }
2517
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002518 /* decide max/sec/min rssi index */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002519 for (i = 0; i < RF90_PATH_MAX; i++) {
2520 if (!DM_RxPathSelTable.DbgMode)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002521 DM_RxPathSelTable.rf_rssi[i] = priv->stats.rx_rssi_percentage[i];
2522
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002523 if (priv->brfpath_rxenable[i]) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002524 rf_num++;
2525 cur_rf_rssi = DM_RxPathSelTable.rf_rssi[i];
2526
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002527 if (rf_num == 1) { /* find first enabled rf path and the rssi values */
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002528 /* initialize, set all rssi index to the same one */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002529 max_rssi_index = min_rssi_index = sec_rssi_index = i;
2530 tmp_max_rssi = tmp_min_rssi = tmp_sec_rssi = cur_rf_rssi;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002531 } else if (rf_num == 2) { /* we pick up the max index first, and let sec and min to be the same one */
2532 if (cur_rf_rssi >= tmp_max_rssi) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002533 tmp_max_rssi = cur_rf_rssi;
2534 max_rssi_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002535 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002536 tmp_sec_rssi = tmp_min_rssi = cur_rf_rssi;
2537 sec_rssi_index = min_rssi_index = i;
2538 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002539 } else {
2540 if (cur_rf_rssi > tmp_max_rssi) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002541 tmp_sec_rssi = tmp_max_rssi;
2542 sec_rssi_index = max_rssi_index;
2543 tmp_max_rssi = cur_rf_rssi;
2544 max_rssi_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002545 } else if (cur_rf_rssi == tmp_max_rssi) { /* let sec and min point to the different index */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002546 tmp_sec_rssi = cur_rf_rssi;
2547 sec_rssi_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002548 } else if ((cur_rf_rssi < tmp_max_rssi) && (cur_rf_rssi > tmp_sec_rssi)) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002549 tmp_sec_rssi = cur_rf_rssi;
2550 sec_rssi_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002551 } else if (cur_rf_rssi == tmp_sec_rssi) {
2552 if (tmp_sec_rssi == tmp_min_rssi) {
2553 /* let sec and min point to the different index */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002554 tmp_sec_rssi = cur_rf_rssi;
2555 sec_rssi_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002556 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002557 /* This case we don't need to set any index */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002558 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002559 } else if ((cur_rf_rssi < tmp_sec_rssi) && (cur_rf_rssi > tmp_min_rssi)) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002560 /* This case we don't need to set any index */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002561 } else if (cur_rf_rssi == tmp_min_rssi) {
2562 if (tmp_sec_rssi == tmp_min_rssi) {
2563 /* let sec and min point to the different index */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002564 tmp_min_rssi = cur_rf_rssi;
2565 min_rssi_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002566 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002567 /* This case we don't need to set any index */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002568 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002569 } else if (cur_rf_rssi < tmp_min_rssi) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002570 tmp_min_rssi = cur_rf_rssi;
2571 min_rssi_index = i;
2572 }
2573 }
2574 }
2575 }
2576
2577 rf_num = 0;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002578 /* decide max/sec/min cck pwdb index */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002579 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
2580 for (i = 0; i < RF90_PATH_MAX; i++) {
2581 if (priv->brfpath_rxenable[i]) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002582 rf_num++;
2583 cur_cck_pwdb = DM_RxPathSelTable.cck_pwdb_sta[i];
2584
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002585 if (rf_num == 1) { /* find first enabled rf path and the rssi values */
2586 /* initialize, set all rssi index to the same one */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002587 cck_rx_ver2_max_index = cck_rx_ver2_min_index = cck_rx_ver2_sec_index = i;
2588 tmp_cck_max_pwdb = tmp_cck_min_pwdb = tmp_cck_sec_pwdb = cur_cck_pwdb;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002589 } else if (rf_num == 2) { /* we pick up the max index first, and let sec and min to be the same one */
2590 if (cur_cck_pwdb >= tmp_cck_max_pwdb) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002591 tmp_cck_max_pwdb = cur_cck_pwdb;
2592 cck_rx_ver2_max_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002593 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002594 tmp_cck_sec_pwdb = tmp_cck_min_pwdb = cur_cck_pwdb;
2595 cck_rx_ver2_sec_index = cck_rx_ver2_min_index = i;
2596 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002597 } else {
2598 if (cur_cck_pwdb > tmp_cck_max_pwdb) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002599 tmp_cck_sec_pwdb = tmp_cck_max_pwdb;
2600 cck_rx_ver2_sec_index = cck_rx_ver2_max_index;
2601 tmp_cck_max_pwdb = cur_cck_pwdb;
2602 cck_rx_ver2_max_index = i;
Lorenzo Stoakesf0e0f8c2015-01-24 15:45:24 +00002603 } else if (cur_cck_pwdb == tmp_cck_max_pwdb) {
2604 /* let sec and min point to the different index */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002605 tmp_cck_sec_pwdb = cur_cck_pwdb;
2606 cck_rx_ver2_sec_index = i;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002607 } else if ((cur_cck_pwdb < tmp_cck_max_pwdb) && (cur_cck_pwdb > tmp_cck_sec_pwdb)) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002608 tmp_cck_sec_pwdb = cur_cck_pwdb;
2609 cck_rx_ver2_sec_index = i;
Lorenzo Stoakesf0e0f8c2015-01-24 15:45:24 +00002610 } else if (cur_cck_pwdb == tmp_cck_sec_pwdb && tmp_cck_sec_pwdb == tmp_cck_min_pwdb) {
2611 /* let sec and min point to the different index */
2612 tmp_cck_sec_pwdb = cur_cck_pwdb;
2613 cck_rx_ver2_sec_index = i;
2614 /* otherwise we don't need to set any index */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002615 } else if ((cur_cck_pwdb < tmp_cck_sec_pwdb) && (cur_cck_pwdb > tmp_cck_min_pwdb)) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002616 /* This case we don't need to set any index */
Lorenzo Stoakesf0e0f8c2015-01-24 15:45:24 +00002617 } else if (cur_cck_pwdb == tmp_cck_min_pwdb && tmp_cck_sec_pwdb == tmp_cck_min_pwdb) {
2618 /* let sec and min point to the different index */
2619 tmp_cck_min_pwdb = cur_cck_pwdb;
2620 cck_rx_ver2_min_index = i;
2621 /* otherwise we don't need to set any index */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002622 } else if (cur_cck_pwdb < tmp_cck_min_pwdb) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002623 tmp_cck_min_pwdb = cur_cck_pwdb;
2624 cck_rx_ver2_min_index = i;
2625 }
2626 }
2627
2628 }
2629 }
2630 }
2631
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002632 /*
2633 * Set CCK Rx path
2634 * reg0xA07[3:2]=cck default rx path, reg0xa07[1:0]=cck optional rx path.
2635 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002636 update_cck_rx_path = 0;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002637 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002638 cck_default_Rx = cck_rx_ver2_max_index;
2639 cck_optional_Rx = cck_rx_ver2_sec_index;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002640 if (tmp_cck_max_pwdb != -64)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002641 update_cck_rx_path = 1;
2642 }
2643
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002644 if (tmp_min_rssi < DM_RxPathSelTable.SS_TH_low && disabled_rf_cnt < 2) {
2645 if ((tmp_max_rssi - tmp_min_rssi) >= DM_RxPathSelTable.diff_TH) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002646 /* record the enabled rssi threshold */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002647 DM_RxPathSelTable.rf_enable_rssi_th[min_rssi_index] = tmp_max_rssi+5;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002648 /* disable the BB Rx path, OFDM */
2649 rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x1<<min_rssi_index, 0x0); /* 0xc04[3:0] */
2650 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x1<<min_rssi_index, 0x0); /* 0xd04[3:0] */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002651 disabled_rf_cnt++;
2652 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002653 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_1) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002654 cck_default_Rx = max_rssi_index;
2655 cck_optional_Rx = sec_rssi_index;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002656 if (tmp_max_rssi)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002657 update_cck_rx_path = 1;
2658 }
2659 }
2660
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002661 if (update_cck_rx_path) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002662 DM_RxPathSelTable.cck_Rx_path = (cck_default_Rx<<2)|(cck_optional_Rx);
2663 rtl8192_setBBreg(dev, rCCK0_AFESetting, 0x0f000000, DM_RxPathSelTable.cck_Rx_path);
2664 }
2665
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002666 if (DM_RxPathSelTable.disabledRF) {
2667 for (i = 0; i < 4; i++) {
2668 if ((DM_RxPathSelTable.disabledRF>>i) & 0x1) { /* disabled rf */
2669 if (tmp_max_rssi >= DM_RxPathSelTable.rf_enable_rssi_th[i]) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002670 /* enable the BB Rx path */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002671 /*DbgPrint("RF-%d is enabled.\n", 0x1<<i);*/
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002672 rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x1<<i, 0x1); /* 0xc04[3:0] */
2673 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x1<<i, 0x1); /* 0xd04[3:0] */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002674 DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
2675 disabled_rf_cnt--;
2676 }
2677 }
2678 }
2679 }
2680}
2681
2682/*-----------------------------------------------------------------------------
2683 * Function: dm_check_rx_path_selection()
2684 *
2685 * Overview: Call a workitem to check current RXRF path and Rx Path selection by RSSI.
2686 *
2687 * Input: NONE
2688 *
2689 * Output: NONE
2690 *
2691 * Return: NONE
2692 *
2693 * Revised History:
2694 * When Who Remark
2695 * 05/28/2008 amy Create Version 0 porting from windows code.
2696 *
2697 *---------------------------------------------------------------------------*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002698static void dm_check_rx_path_selection(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002699{
2700 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002701
2702 queue_delayed_work(priv->priv_wq, &priv->rfpath_check_wq, 0);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002703} /* dm_CheckRxRFPath */
2704
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002705static void dm_init_fsync(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002706{
2707 struct r8192_priv *priv = ieee80211_priv(dev);
2708
2709 priv->ieee80211->fsync_time_interval = 500;
2710 priv->ieee80211->fsync_rate_bitmap = 0x0f000800;
2711 priv->ieee80211->fsync_rssi_threshold = 30;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002712 priv->ieee80211->bfsync_enable = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002713 priv->ieee80211->fsync_multiple_timeinterval = 3;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002714 priv->ieee80211->fsync_firstdiff_ratethreshold = 100;
2715 priv->ieee80211->fsync_seconddiff_ratethreshold = 200;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002716 priv->ieee80211->fsync_state = Default_Fsync;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002717 priv->framesyncMonitor = 1; /* current default 0xc38 monitor on */
Somya Anandacc65392015-03-11 17:02:16 +05302718 setup_timer(&priv->fsync_timer, dm_fsync_timer_callback,
2719 (unsigned long)dev);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002720}
2721
Jerry Chuang8fc85982009-11-03 07:17:11 -02002722static void dm_deInit_fsync(struct net_device *dev)
2723{
2724 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002725
Jerry Chuang8fc85982009-11-03 07:17:11 -02002726 del_timer_sync(&priv->fsync_timer);
2727}
2728
Himangi Saraogic541fa82014-03-17 04:07:56 +05302729void dm_fsync_timer_callback(unsigned long data)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002730{
2731 struct net_device *dev = (struct net_device *)data;
2732 struct r8192_priv *priv = ieee80211_priv((struct net_device *)data);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002733 u32 rate_index, rate_count = 0, rate_count_diff = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002734 bool bSwitchFromCountDiff = false;
2735 bool bDoubleTimeInterval = false;
2736
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002737 if (priv->ieee80211->state == IEEE80211_LINKED &&
Jerry Chuang8fc85982009-11-03 07:17:11 -02002738 priv->ieee80211->bfsync_enable &&
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002739 (priv->ieee80211->pHTInfo->IOTAction & HT_IOT_ACT_CDD_FSYNC)) {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002740 /* Count rate 54, MCS [7], [12, 13, 14, 15] */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002741 u32 rate_bitmap;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002742
2743 for (rate_index = 0; rate_index <= 27; rate_index++) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002744 rate_bitmap = 1 << rate_index;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002745 if (priv->ieee80211->fsync_rate_bitmap & rate_bitmap)
2746 rate_count += priv->stats.received_rate_histogram[1][rate_index];
Jerry Chuang8fc85982009-11-03 07:17:11 -02002747 }
2748
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002749 if (rate_count < priv->rate_record)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002750 rate_count_diff = 0xffffffff - rate_count + priv->rate_record;
2751 else
2752 rate_count_diff = rate_count - priv->rate_record;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002753 if (rate_count_diff < priv->rateCountDiffRecord) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002754 u32 DiffNum = priv->rateCountDiffRecord - rate_count_diff;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002755 /* Continue count */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002756 if (DiffNum >= priv->ieee80211->fsync_seconddiff_ratethreshold)
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002757 priv->ContinueDiffCount++;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002758 else
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002759 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002760
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002761 /* Continue count over */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002762 if (priv->ContinueDiffCount >= 2) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002763 bSwitchFromCountDiff = true;
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002764 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002765 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002766 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002767 /* Stop the continued count */
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002768 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002769 }
2770
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002771 /* If Count diff <= FsyncRateCountThreshold */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002772 if (rate_count_diff <= priv->ieee80211->fsync_firstdiff_ratethreshold) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002773 bSwitchFromCountDiff = true;
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002774 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002775 }
2776 priv->rate_record = rate_count;
2777 priv->rateCountDiffRecord = rate_count_diff;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002778 RT_TRACE(COMP_HALDM, "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n", priv->rate_record, rate_count, rate_count_diff, priv->bswitch_fsync);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002779 /* if we never receive those mcs rate and rssi > 30 % then switch fsyn */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002780 if (priv->undecorated_smoothed_pwdb > priv->ieee80211->fsync_rssi_threshold && bSwitchFromCountDiff) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002781 bDoubleTimeInterval = true;
2782 priv->bswitch_fsync = !priv->bswitch_fsync;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002783 if (priv->bswitch_fsync) {
Greg Donald0b4ef0a2014-08-24 04:57:36 -05002784 write_nic_byte(dev, 0xC36, 0x1c);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002785 write_nic_byte(dev, 0xC3e, 0x90);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002786 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002787 write_nic_byte(dev, 0xC36, 0x5c);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002788 write_nic_byte(dev, 0xC3e, 0x96);
2789 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002790 } else if (priv->undecorated_smoothed_pwdb <= priv->ieee80211->fsync_rssi_threshold) {
2791 if (priv->bswitch_fsync) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002792 priv->bswitch_fsync = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002793 write_nic_byte(dev, 0xC36, 0x5c);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002794 write_nic_byte(dev, 0xC3e, 0x96);
2795 }
2796 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002797 if (bDoubleTimeInterval) {
2798 if (timer_pending(&priv->fsync_timer))
Jerry Chuang8fc85982009-11-03 07:17:11 -02002799 del_timer_sync(&priv->fsync_timer);
Amitoj Kaur Chawlae6be66f2016-02-13 10:04:16 +05302800 priv->fsync_timer.expires = jiffies +
2801 msecs_to_jiffies(priv->ieee80211->fsync_time_interval*priv->ieee80211->fsync_multiple_timeinterval);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002802 add_timer(&priv->fsync_timer);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002803 } else {
2804 if (timer_pending(&priv->fsync_timer))
Jerry Chuang8fc85982009-11-03 07:17:11 -02002805 del_timer_sync(&priv->fsync_timer);
Amitoj Kaur Chawlae6be66f2016-02-13 10:04:16 +05302806 priv->fsync_timer.expires = jiffies +
2807 msecs_to_jiffies(priv->ieee80211->fsync_time_interval);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002808 add_timer(&priv->fsync_timer);
2809 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002810 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002811 /* Let Register return to default value; */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002812 if (priv->bswitch_fsync) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002813 priv->bswitch_fsync = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002814 write_nic_byte(dev, 0xC36, 0x5c);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002815 write_nic_byte(dev, 0xC3e, 0x96);
2816 }
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002817 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002818 write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c52cd);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002819 }
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002820 RT_TRACE(COMP_HALDM, "ContinueDiffCount %d\n", priv->ContinueDiffCount);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002821 RT_TRACE(COMP_HALDM, "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n", priv->rate_record, rate_count, rate_count_diff, priv->bswitch_fsync);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002822}
2823
2824static void dm_StartHWFsync(struct net_device *dev)
2825{
Joe Perchesf8628a42014-05-23 22:13:20 -07002826 RT_TRACE(COMP_HALDM, "%s\n", __func__);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002827 write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c12cf);
2828 write_nic_byte(dev, 0xc3b, 0x41);
2829}
2830
2831static void dm_EndSWFsync(struct net_device *dev)
2832{
2833 struct r8192_priv *priv = ieee80211_priv(dev);
2834
Joe Perchesf8628a42014-05-23 22:13:20 -07002835 RT_TRACE(COMP_HALDM, "%s\n", __func__);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002836 del_timer_sync(&(priv->fsync_timer));
2837
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002838 /* Let Register return to default value; */
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002839 if (priv->bswitch_fsync) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002840 priv->bswitch_fsync = false;
2841
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002842 write_nic_byte(dev, 0xC36, 0x5c);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002843
2844 write_nic_byte(dev, 0xC3e, 0x96);
2845 }
2846
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002847 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002848 write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c52cd);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002849
2850}
2851
2852static void dm_StartSWFsync(struct net_device *dev)
2853{
2854 struct r8192_priv *priv = ieee80211_priv(dev);
Sebastian Hahn35997ff2012-12-05 21:40:18 +01002855 u32 rateIndex;
2856 u32 rateBitmap;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002857
Greg Donald0b4ef0a2014-08-24 04:57:36 -05002858 RT_TRACE(COMP_HALDM, "%s\n", __func__);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002859 /* Initial rate record to zero, start to record. */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002860 priv->rate_record = 0;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002861 /* Initialize continue diff count to zero, start to record. */
Justin P. Mattock4c234eb2012-05-01 08:34:14 -07002862 priv->ContinueDiffCount = 0;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002863 priv->rateCountDiffRecord = 0;
2864 priv->bswitch_fsync = false;
2865
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002866 if (priv->ieee80211->mode == WIRELESS_MODE_N_24G) {
2867 priv->ieee80211->fsync_firstdiff_ratethreshold = 600;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002868 priv->ieee80211->fsync_seconddiff_ratethreshold = 0xffff;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002869 } else {
2870 priv->ieee80211->fsync_firstdiff_ratethreshold = 200;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002871 priv->ieee80211->fsync_seconddiff_ratethreshold = 200;
2872 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002873 for (rateIndex = 0; rateIndex <= 27; rateIndex++) {
2874 rateBitmap = 1 << rateIndex;
2875 if (priv->ieee80211->fsync_rate_bitmap & rateBitmap)
Jerry Chuang8fc85982009-11-03 07:17:11 -02002876 priv->rate_record += priv->stats.received_rate_histogram[1][rateIndex];
2877 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002878 if (timer_pending(&priv->fsync_timer))
Jerry Chuang8fc85982009-11-03 07:17:11 -02002879 del_timer_sync(&priv->fsync_timer);
Amitoj Kaur Chawlae6be66f2016-02-13 10:04:16 +05302880 priv->fsync_timer.expires = jiffies +
2881 msecs_to_jiffies(priv->ieee80211->fsync_time_interval);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002882 add_timer(&priv->fsync_timer);
2883
Jerry Chuang8fc85982009-11-03 07:17:11 -02002884 write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c12cd);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002885
2886}
2887
2888static void dm_EndHWFsync(struct net_device *dev)
2889{
Greg Donald0b4ef0a2014-08-24 04:57:36 -05002890 RT_TRACE(COMP_HALDM, "%s\n", __func__);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002891 write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c52cd);
2892 write_nic_byte(dev, 0xc3b, 0x49);
2893
2894}
2895
2896void dm_check_fsync(struct net_device *dev)
2897{
2898#define RegC38_Default 0
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002899#define RegC38_NonFsync_Other_AP 1
2900#define RegC38_Fsync_AP_BCM 2
Jerry Chuang8fc85982009-11-03 07:17:11 -02002901 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00002902 /*u32 framesyncC34;*/
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002903 static u8 reg_c38_State = RegC38_Default;
Sebastian Hahnde13a3d2012-12-05 21:40:23 +01002904 static u32 reset_cnt;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002905
2906 RT_TRACE(COMP_HALDM, "RSSI %d TimeInterval %d MultipleTimeInterval %d\n", priv->ieee80211->fsync_rssi_threshold, priv->ieee80211->fsync_time_interval, priv->ieee80211->fsync_multiple_timeinterval);
2907 RT_TRACE(COMP_HALDM, "RateBitmap 0x%x FirstDiffRateThreshold %d SecondDiffRateThreshold %d\n", priv->ieee80211->fsync_rate_bitmap, priv->ieee80211->fsync_firstdiff_ratethreshold, priv->ieee80211->fsync_seconddiff_ratethreshold);
2908
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002909 if (priv->ieee80211->state == IEEE80211_LINKED &&
2910 (priv->ieee80211->pHTInfo->IOTAction & HT_IOT_ACT_CDD_FSYNC)) {
2911 if (priv->ieee80211->bfsync_enable == 0) {
2912 switch (priv->ieee80211->fsync_state) {
2913 case Default_Fsync:
2914 dm_StartHWFsync(dev);
2915 priv->ieee80211->fsync_state = HW_Fsync;
2916 break;
2917 case SW_Fsync:
2918 dm_EndSWFsync(dev);
2919 dm_StartHWFsync(dev);
2920 priv->ieee80211->fsync_state = HW_Fsync;
2921 break;
2922 case HW_Fsync:
2923 default:
2924 break;
2925 }
2926 } else {
2927 switch (priv->ieee80211->fsync_state) {
2928 case Default_Fsync:
2929 dm_StartSWFsync(dev);
2930 priv->ieee80211->fsync_state = SW_Fsync;
2931 break;
2932 case HW_Fsync:
2933 dm_EndHWFsync(dev);
2934 dm_StartSWFsync(dev);
2935 priv->ieee80211->fsync_state = SW_Fsync;
2936 break;
2937 case SW_Fsync:
2938 default:
2939 break;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002940 }
2941 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002942 if (priv->framesyncMonitor) {
2943 if (reg_c38_State != RegC38_Fsync_AP_BCM) {
2944 /* For broadcom AP we write different default value */
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002945 write_nic_byte(dev, rOFDM0_RxDetector3, 0x95);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002946
2947 reg_c38_State = RegC38_Fsync_AP_BCM;
2948 }
2949 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002950 } else {
2951 switch (priv->ieee80211->fsync_state) {
2952 case HW_Fsync:
2953 dm_EndHWFsync(dev);
2954 priv->ieee80211->fsync_state = Default_Fsync;
2955 break;
2956 case SW_Fsync:
2957 dm_EndSWFsync(dev);
2958 priv->ieee80211->fsync_state = Default_Fsync;
2959 break;
2960 case Default_Fsync:
2961 default:
2962 break;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002963 }
2964
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002965 if (priv->framesyncMonitor) {
2966 if (priv->ieee80211->state == IEEE80211_LINKED) {
2967 if (priv->undecorated_smoothed_pwdb <= RegC38_TH) {
2968 if (reg_c38_State != RegC38_NonFsync_Other_AP) {
Xenia Ragiadakou91e39f02013-09-21 23:42:32 +03002969 write_nic_byte(dev, rOFDM0_RxDetector3, 0x90);
Jerry Chuang8fc85982009-11-03 07:17:11 -02002970
2971 reg_c38_State = RegC38_NonFsync_Other_AP;
Jerry Chuang8fc85982009-11-03 07:17:11 -02002972 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002973 } else if (priv->undecorated_smoothed_pwdb >= (RegC38_TH+5)) {
2974 if (reg_c38_State) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002975 write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
2976 reg_c38_State = RegC38_Default;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002977 /*DbgPrint("Fsync is idle, rssi>=40, write 0xc38 = 0x%x\n", pHalData->framesync);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002978 }
2979 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002980 } else {
2981 if (reg_c38_State) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002982 write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
2983 reg_c38_State = RegC38_Default;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002984 /*DbgPrint("Fsync is idle, not connected, write 0xc38 = 0x%x\n", pHalData->framesync);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002985 }
2986 }
2987 }
2988 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002989 if (priv->framesyncMonitor) {
2990 if (priv->reset_count != reset_cnt) { /* After silent reset, the reg_c38_State will be returned to default value */
Jerry Chuang8fc85982009-11-03 07:17:11 -02002991 write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
2992 reg_c38_State = RegC38_Default;
2993 reset_cnt = priv->reset_count;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002994 /*DbgPrint("reg_c38_State = 0 for silent reset.\n");*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02002995 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00002996 } else {
2997 if (reg_c38_State) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02002998 write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
2999 reg_c38_State = RegC38_Default;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003000 /*DbgPrint("framesync no monitor, write 0xc38 = 0x%x\n", pHalData->framesync);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02003001 }
3002 }
3003}
3004
Jerry Chuang8fc85982009-11-03 07:17:11 -02003005/*-----------------------------------------------------------------------------
3006 * Function: dm_shadow_init()
3007 *
3008 * Overview: Store all NIC MAC/BB register content.
3009 *
3010 * Input: NONE
3011 *
3012 * Output: NONE
3013 *
3014 * Return: NONE
3015 *
3016 * Revised History:
3017 * When Who Remark
3018 * 05/29/2008 amy Create Version 0 porting from windows code.
3019 *
3020 *---------------------------------------------------------------------------*/
Himangi Saraogic541fa82014-03-17 04:07:56 +05303021void dm_shadow_init(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02003022{
3023 u8 page;
3024 u16 offset;
3025
3026 for (page = 0; page < 5; page++)
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003027 for (offset = 0; offset < 256; offset++) {
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03003028 read_nic_byte(dev, offset+page*256, &dm_shadow[page][offset]);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003029 /*DbgPrint("P-%d/O-%02x=%02x\r\n", page, offset, DM_Shadow[page][offset]);*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02003030 }
3031
3032 for (page = 8; page < 11; page++)
3033 for (offset = 0; offset < 256; offset++)
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03003034 read_nic_byte(dev, offset+page*256, &dm_shadow[page][offset]);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003035
3036 for (page = 12; page < 15; page++)
3037 for (offset = 0; offset < 256; offset++)
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03003038 read_nic_byte(dev, offset+page*256, &dm_shadow[page][offset]);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003039
3040} /* dm_shadow_init */
3041
3042/*---------------------------Define function prototype------------------------*/
3043/*-----------------------------------------------------------------------------
3044 * Function: DM_DynamicTxPower()
3045 *
3046 * Overview: Detect Signal strength to control TX Registry
Mauro Carvalho Chehabe4063222009-11-03 07:42:46 -02003047 Tx Power Control For Near/Far Range
Jerry Chuang8fc85982009-11-03 07:17:11 -02003048 *
3049 * Input: NONE
3050 *
3051 * Output: NONE
3052 *
3053 * Return: NONE
3054 *
3055 * Revised History:
3056 * When Who Remark
3057 * 03/06/2008 Jacken Create Version 0.
3058 *
3059 *---------------------------------------------------------------------------*/
3060static void dm_init_dynamic_txpower(struct net_device *dev)
3061{
3062 struct r8192_priv *priv = ieee80211_priv(dev);
3063
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003064 /* Initial TX Power Control for near/far range , add by amy 2008/05/15, porting from windows code. */
3065 priv->ieee80211->bdynamic_txpower_enable = true; /* Default to enable Tx Power Control */
Jerry Chuang8fc85982009-11-03 07:17:11 -02003066 priv->bLastDTPFlag_High = false;
3067 priv->bLastDTPFlag_Low = false;
3068 priv->bDynamicTxHighPower = false;
3069 priv->bDynamicTxLowPower = false;
3070}
3071
3072static void dm_dynamic_txpower(struct net_device *dev)
3073{
3074 struct r8192_priv *priv = ieee80211_priv(dev);
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003075 unsigned int txhipower_threshhold = 0;
3076 unsigned int txlowpower_threshold = 0;
3077
3078 if (priv->ieee80211->bdynamic_txpower_enable != true) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02003079 priv->bDynamicTxHighPower = false;
3080 priv->bDynamicTxLowPower = false;
3081 return;
3082 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003083 /*printk("priv->ieee80211->current_network.unknown_cap_exist is %d , priv->ieee80211->current_network.broadcom_cap_exist is %d\n", priv->ieee80211->current_network.unknown_cap_exist, priv->ieee80211->current_network.broadcom_cap_exist);*/
3084 if ((priv->ieee80211->current_network.atheros_cap_exist) && (priv->ieee80211->mode == IEEE_G)) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02003085 txhipower_threshhold = TX_POWER_ATHEROAP_THRESH_HIGH;
3086 txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003087 } else {
Jerry Chuang8fc85982009-11-03 07:17:11 -02003088 txhipower_threshhold = TX_POWER_NEAR_FIELD_THRESH_HIGH;
3089 txlowpower_threshold = TX_POWER_NEAR_FIELD_THRESH_LOW;
3090 }
3091
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003092 /*printk("=======>%s(): txhipower_threshhold is %d, txlowpower_threshold is %d\n", __func__, txhipower_threshhold, txlowpower_threshold);*/
3093 RT_TRACE(COMP_TXAGC, "priv->undecorated_smoothed_pwdb = %ld\n", priv->undecorated_smoothed_pwdb);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003094
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003095 if (priv->ieee80211->state == IEEE80211_LINKED) {
3096 if (priv->undecorated_smoothed_pwdb >= txhipower_threshhold) {
Jerry Chuang8fc85982009-11-03 07:17:11 -02003097 priv->bDynamicTxHighPower = true;
3098 priv->bDynamicTxLowPower = false;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003099 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003100 /* high power state check */
Harisangam Sharvaric40753b2015-06-11 12:38:13 +00003101 if (priv->undecorated_smoothed_pwdb < txlowpower_threshold && priv->bDynamicTxHighPower)
Jerry Chuang8fc85982009-11-03 07:17:11 -02003102 priv->bDynamicTxHighPower = false;
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003103
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003104 /* low power state check */
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00003105 if (priv->undecorated_smoothed_pwdb < 35)
Jerry Chuang8fc85982009-11-03 07:17:11 -02003106 priv->bDynamicTxLowPower = true;
Lorenzo Stoakes16da7802015-01-24 15:45:23 +00003107 else if (priv->undecorated_smoothed_pwdb >= 40)
Jerry Chuang8fc85982009-11-03 07:17:11 -02003108 priv->bDynamicTxLowPower = false;
Jerry Chuang8fc85982009-11-03 07:17:11 -02003109 }
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003110 } else {
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003111 /*pHalData->bTXPowerCtrlforNearFarRange = !pHalData->bTXPowerCtrlforNearFarRange;*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02003112 priv->bDynamicTxHighPower = false;
3113 priv->bDynamicTxLowPower = false;
3114 }
3115
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003116 if ((priv->bDynamicTxHighPower != priv->bLastDTPFlag_High) ||
3117 (priv->bDynamicTxLowPower != priv->bLastDTPFlag_Low)) {
3118 RT_TRACE(COMP_TXAGC, "SetTxPowerLevel8190() channel = %d\n", priv->ieee80211->current_network.channel);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003119
3120#if defined(RTL8190P) || defined(RTL8192E)
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003121 SetTxPowerLevel8190(Adapter, pHalData->CurrentChannel);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003122#endif
3123
Lorenzo Stoakes04d695d2015-01-24 15:45:22 +00003124 rtl8192_phy_setTxPower(dev, priv->ieee80211->current_network.channel);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003125 /*pHalData->bStartTxCtrlByTPCNFR = FALSE; Clear th flag of Set TX Power from Sitesurvey*/
Jerry Chuang8fc85982009-11-03 07:17:11 -02003126 }
3127 priv->bLastDTPFlag_High = priv->bDynamicTxHighPower;
3128 priv->bLastDTPFlag_Low = priv->bDynamicTxLowPower;
3129
3130} /* dm_dynamic_txpower */
3131
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003132/* added by vivi, for read tx rate and retrycount */
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03003133static void dm_check_txrateandretrycount(struct net_device *dev)
Jerry Chuang8fc85982009-11-03 07:17:11 -02003134{
3135 struct r8192_priv *priv = ieee80211_priv(dev);
Xenia Ragiadakou999d5942013-05-09 01:48:52 +03003136 struct ieee80211_device *ieee = priv->ieee80211;
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003137 /* for 11n tx rate */
3138 /*priv->stats.CurrentShowTxate = read_nic_byte(dev, Current_Tx_Rate_Reg);*/
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03003139 read_nic_byte(dev, Current_Tx_Rate_Reg, &ieee->softmac_stats.CurrentShowTxate);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003140 /*printk("=============>tx_rate_reg:%x\n", ieee->softmac_stats.CurrentShowTxate);*/
3141 /* for initial tx rate */
3142 /*priv->stats.last_packet_rate = read_nic_byte(dev, Initial_Tx_Rate_Reg);*/
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03003143 read_nic_byte(dev, Initial_Tx_Rate_Reg, &ieee->softmac_stats.last_packet_rate);
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003144 /* for tx tx retry count */
3145 /*priv->stats.txretrycount = read_nic_dword(dev, Tx_Retry_Count_Reg);*/
Xenia Ragiadakoub3d42bf2013-06-06 16:40:51 +03003146 read_nic_dword(dev, Tx_Retry_Count_Reg, &ieee->softmac_stats.txretrycount);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003147}
3148
3149static void dm_send_rssi_tofw(struct net_device *dev)
3150{
Jerry Chuang8fc85982009-11-03 07:17:11 -02003151 struct r8192_priv *priv = ieee80211_priv(dev);
3152
Lorenzo Stoakese1da1d52015-01-24 15:45:21 +00003153 /*
3154 * If we test chariot, we should stop the TX command ?
3155 * Because 92E will always silent reset when we send tx command. We use register
3156 * 0x1e0(byte) to notify driver.
3157 */
Jerry Chuang8fc85982009-11-03 07:17:11 -02003158 write_nic_byte(dev, DRIVER_RSSI, (u8)priv->undecorated_smoothed_pwdb);
Jerry Chuang8fc85982009-11-03 07:17:11 -02003159}
3160
3161/*---------------------------Define function prototype------------------------*/