aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2012-04-26 15:03:48 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-04-26 15:03:48 -0400
commitd9b8ae6bd8c3304569a25079fcdbebaa28a48ee4 (patch)
tree9ce3e4eb355685f970dd7333a0a935109aff0583 /drivers/net/wireless/rtlwifi
parent872f24dbc604ef585ea7eec73020dcdfaffd1956 (diff)
parent94c514fe240fc0dd02187b78facefde8b6744634 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Conflicts: drivers/net/wireless/iwlwifi/iwl-testmode.c
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c290
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h35
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/dm.h35
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/dm.c185
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/dm.h51
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/phy.c7
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/dm.c156
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/dm.h44
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/phy.c7
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h63
11 files changed, 401 insertions, 473 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
index 1208b753f62f..f7f48c7ac854 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
@@ -33,9 +33,6 @@
33#include "../pci.h" 33#include "../pci.h"
34#include "../base.h" 34#include "../base.h"
35 35
36struct dig_t dm_digtable;
37static struct ps_t dm_pstable;
38
39#define BT_RSSI_STATE_NORMAL_POWER BIT_OFFSET_LEN_MASK_32(0, 1) 36#define BT_RSSI_STATE_NORMAL_POWER BIT_OFFSET_LEN_MASK_32(0, 1)
40#define BT_RSSI_STATE_AMDPU_OFF BIT_OFFSET_LEN_MASK_32(1, 1) 37#define BT_RSSI_STATE_AMDPU_OFF BIT_OFFSET_LEN_MASK_32(1, 1)
41#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1) 38#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
@@ -163,33 +160,37 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
163 160
164static void rtl92c_dm_diginit(struct ieee80211_hw *hw) 161static void rtl92c_dm_diginit(struct ieee80211_hw *hw)
165{ 162{
166 dm_digtable.dig_enable_flag = true; 163 struct rtl_priv *rtlpriv = rtl_priv(hw);
167 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 164 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
168 dm_digtable.cur_igvalue = 0x20; 165
169 dm_digtable.pre_igvalue = 0x0; 166 dm_digtable->dig_enable_flag = true;
170 dm_digtable.cursta_connectctate = DIG_STA_DISCONNECT; 167 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
171 dm_digtable.presta_connectstate = DIG_STA_DISCONNECT; 168 dm_digtable->cur_igvalue = 0x20;
172 dm_digtable.curmultista_connectstate = DIG_MULTISTA_DISCONNECT; 169 dm_digtable->pre_igvalue = 0x0;
173 dm_digtable.rssi_lowthresh = DM_DIG_THRESH_LOW; 170 dm_digtable->cursta_connectctate = DIG_STA_DISCONNECT;
174 dm_digtable.rssi_highthresh = DM_DIG_THRESH_HIGH; 171 dm_digtable->presta_connectstate = DIG_STA_DISCONNECT;
175 dm_digtable.fa_lowthresh = DM_FALSEALARM_THRESH_LOW; 172 dm_digtable->curmultista_connectstate = DIG_MULTISTA_DISCONNECT;
176 dm_digtable.fa_highthresh = DM_FALSEALARM_THRESH_HIGH; 173 dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
177 dm_digtable.rx_gain_range_max = DM_DIG_MAX; 174 dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
178 dm_digtable.rx_gain_range_min = DM_DIG_MIN; 175 dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
179 dm_digtable.backoff_val = DM_DIG_BACKOFF_DEFAULT; 176 dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
180 dm_digtable.backoff_val_range_max = DM_DIG_BACKOFF_MAX; 177 dm_digtable->rx_gain_range_max = DM_DIG_MAX;
181 dm_digtable.backoff_val_range_min = DM_DIG_BACKOFF_MIN; 178 dm_digtable->rx_gain_range_min = DM_DIG_MIN;
182 dm_digtable.pre_cck_pd_state = CCK_PD_STAGE_MAX; 179 dm_digtable->backoff_val = DM_DIG_BACKOFF_DEFAULT;
183 dm_digtable.cur_cck_pd_state = CCK_PD_STAGE_MAX; 180 dm_digtable->backoff_val_range_max = DM_DIG_BACKOFF_MAX;
181 dm_digtable->backoff_val_range_min = DM_DIG_BACKOFF_MIN;
182 dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
183 dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
184} 184}
185 185
186static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw) 186static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
187{ 187{
188 struct rtl_priv *rtlpriv = rtl_priv(hw); 188 struct rtl_priv *rtlpriv = rtl_priv(hw);
189 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
189 long rssi_val_min = 0; 190 long rssi_val_min = 0;
190 191
191 if ((dm_digtable.curmultista_connectstate == DIG_MULTISTA_CONNECT) && 192 if ((dm_digtable->curmultista_connectstate == DIG_MULTISTA_CONNECT) &&
192 (dm_digtable.cursta_connectctate == DIG_STA_CONNECT)) { 193 (dm_digtable->cursta_connectctate == DIG_STA_CONNECT)) {
193 if (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb != 0) 194 if (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb != 0)
194 rssi_val_min = 195 rssi_val_min =
195 (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb > 196 (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb >
@@ -198,10 +199,10 @@ static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
198 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb; 199 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
199 else 200 else
200 rssi_val_min = rtlpriv->dm.undecorated_smoothed_pwdb; 201 rssi_val_min = rtlpriv->dm.undecorated_smoothed_pwdb;
201 } else if (dm_digtable.cursta_connectctate == DIG_STA_CONNECT || 202 } else if (dm_digtable->cursta_connectctate == DIG_STA_CONNECT ||
202 dm_digtable.cursta_connectctate == DIG_STA_BEFORE_CONNECT) { 203 dm_digtable->cursta_connectctate == DIG_STA_BEFORE_CONNECT) {
203 rssi_val_min = rtlpriv->dm.undecorated_smoothed_pwdb; 204 rssi_val_min = rtlpriv->dm.undecorated_smoothed_pwdb;
204 } else if (dm_digtable.curmultista_connectstate == 205 } else if (dm_digtable->curmultista_connectstate ==
205 DIG_MULTISTA_CONNECT) { 206 DIG_MULTISTA_CONNECT) {
206 rssi_val_min = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb; 207 rssi_val_min = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
207 } 208 }
@@ -260,7 +261,8 @@ static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
260static void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw) 261static void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw)
261{ 262{
262 struct rtl_priv *rtlpriv = rtl_priv(hw); 263 struct rtl_priv *rtlpriv = rtl_priv(hw);
263 u8 value_igi = dm_digtable.cur_igvalue; 264 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
265 u8 value_igi = dm_digtable->cur_igvalue;
264 266
265 if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0) 267 if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
266 value_igi--; 268 value_igi--;
@@ -277,43 +279,44 @@ static void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw)
277 if (rtlpriv->falsealm_cnt.cnt_all > 10000) 279 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
278 value_igi = 0x32; 280 value_igi = 0x32;
279 281
280 dm_digtable.cur_igvalue = value_igi; 282 dm_digtable->cur_igvalue = value_igi;
281 rtl92c_dm_write_dig(hw); 283 rtl92c_dm_write_dig(hw);
282} 284}
283 285
284static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw) 286static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw)
285{ 287{
286 struct rtl_priv *rtlpriv = rtl_priv(hw); 288 struct rtl_priv *rtlpriv = rtl_priv(hw);
289 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
287 290
288 if (rtlpriv->falsealm_cnt.cnt_all > dm_digtable.fa_highthresh) { 291 if (rtlpriv->falsealm_cnt.cnt_all > dm_digtable->fa_highthresh) {
289 if ((dm_digtable.backoff_val - 2) < 292 if ((dm_digtable->backoff_val - 2) <
290 dm_digtable.backoff_val_range_min) 293 dm_digtable->backoff_val_range_min)
291 dm_digtable.backoff_val = 294 dm_digtable->backoff_val =
292 dm_digtable.backoff_val_range_min; 295 dm_digtable->backoff_val_range_min;
293 else 296 else
294 dm_digtable.backoff_val -= 2; 297 dm_digtable->backoff_val -= 2;
295 } else if (rtlpriv->falsealm_cnt.cnt_all < dm_digtable.fa_lowthresh) { 298 } else if (rtlpriv->falsealm_cnt.cnt_all < dm_digtable->fa_lowthresh) {
296 if ((dm_digtable.backoff_val + 2) > 299 if ((dm_digtable->backoff_val + 2) >
297 dm_digtable.backoff_val_range_max) 300 dm_digtable->backoff_val_range_max)
298 dm_digtable.backoff_val = 301 dm_digtable->backoff_val =
299 dm_digtable.backoff_val_range_max; 302 dm_digtable->backoff_val_range_max;
300 else 303 else
301 dm_digtable.backoff_val += 2; 304 dm_digtable->backoff_val += 2;
302 } 305 }
303 306
304 if ((dm_digtable.rssi_val_min + 10 - dm_digtable.backoff_val) > 307 if ((dm_digtable->rssi_val_min + 10 - dm_digtable->backoff_val) >
305 dm_digtable.rx_gain_range_max) 308 dm_digtable->rx_gain_range_max)
306 dm_digtable.cur_igvalue = dm_digtable.rx_gain_range_max; 309 dm_digtable->cur_igvalue = dm_digtable->rx_gain_range_max;
307 else if ((dm_digtable.rssi_val_min + 10 - 310 else if ((dm_digtable->rssi_val_min + 10 -
308 dm_digtable.backoff_val) < dm_digtable.rx_gain_range_min) 311 dm_digtable->backoff_val) < dm_digtable->rx_gain_range_min)
309 dm_digtable.cur_igvalue = dm_digtable.rx_gain_range_min; 312 dm_digtable->cur_igvalue = dm_digtable->rx_gain_range_min;
310 else 313 else
311 dm_digtable.cur_igvalue = dm_digtable.rssi_val_min + 10 - 314 dm_digtable->cur_igvalue = dm_digtable->rssi_val_min + 10 -
312 dm_digtable.backoff_val; 315 dm_digtable->backoff_val;
313 316
314 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 317 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
315 "rssi_val_min = %x backoff_val %x\n", 318 "rssi_val_min = %x backoff_val %x\n",
316 dm_digtable.rssi_val_min, dm_digtable.backoff_val); 319 dm_digtable->rssi_val_min, dm_digtable->backoff_val);
317 320
318 rtl92c_dm_write_dig(hw); 321 rtl92c_dm_write_dig(hw);
319} 322}
@@ -322,6 +325,7 @@ static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
322{ 325{
323 static u8 initialized; /* initialized to false */ 326 static u8 initialized; /* initialized to false */
324 struct rtl_priv *rtlpriv = rtl_priv(hw); 327 struct rtl_priv *rtlpriv = rtl_priv(hw);
328 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
325 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 329 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
326 long rssi_strength = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb; 330 long rssi_strength = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
327 bool multi_sta = false; 331 bool multi_sta = false;
@@ -330,68 +334,69 @@ static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
330 multi_sta = true; 334 multi_sta = true;
331 335
332 if (!multi_sta || 336 if (!multi_sta ||
333 dm_digtable.cursta_connectctate != DIG_STA_DISCONNECT) { 337 dm_digtable->cursta_connectctate != DIG_STA_DISCONNECT) {
334 initialized = false; 338 initialized = false;
335 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 339 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
336 return; 340 return;
337 } else if (initialized == false) { 341 } else if (initialized == false) {
338 initialized = true; 342 initialized = true;
339 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_0; 343 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
340 dm_digtable.cur_igvalue = 0x20; 344 dm_digtable->cur_igvalue = 0x20;
341 rtl92c_dm_write_dig(hw); 345 rtl92c_dm_write_dig(hw);
342 } 346 }
343 347
344 if (dm_digtable.curmultista_connectstate == DIG_MULTISTA_CONNECT) { 348 if (dm_digtable->curmultista_connectstate == DIG_MULTISTA_CONNECT) {
345 if ((rssi_strength < dm_digtable.rssi_lowthresh) && 349 if ((rssi_strength < dm_digtable->rssi_lowthresh) &&
346 (dm_digtable.dig_ext_port_stage != DIG_EXT_PORT_STAGE_1)) { 350 (dm_digtable->dig_ext_port_stage != DIG_EXT_PORT_STAGE_1)) {
347 351
348 if (dm_digtable.dig_ext_port_stage == 352 if (dm_digtable->dig_ext_port_stage ==
349 DIG_EXT_PORT_STAGE_2) { 353 DIG_EXT_PORT_STAGE_2) {
350 dm_digtable.cur_igvalue = 0x20; 354 dm_digtable->cur_igvalue = 0x20;
351 rtl92c_dm_write_dig(hw); 355 rtl92c_dm_write_dig(hw);
352 } 356 }
353 357
354 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_1; 358 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_1;
355 } else if (rssi_strength > dm_digtable.rssi_highthresh) { 359 } else if (rssi_strength > dm_digtable->rssi_highthresh) {
356 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_2; 360 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_2;
357 rtl92c_dm_ctrl_initgain_by_fa(hw); 361 rtl92c_dm_ctrl_initgain_by_fa(hw);
358 } 362 }
359 } else if (dm_digtable.dig_ext_port_stage != DIG_EXT_PORT_STAGE_0) { 363 } else if (dm_digtable->dig_ext_port_stage != DIG_EXT_PORT_STAGE_0) {
360 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_0; 364 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
361 dm_digtable.cur_igvalue = 0x20; 365 dm_digtable->cur_igvalue = 0x20;
362 rtl92c_dm_write_dig(hw); 366 rtl92c_dm_write_dig(hw);
363 } 367 }
364 368
365 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 369 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
366 "curmultista_connectstate = %x dig_ext_port_stage %x\n", 370 "curmultista_connectstate = %x dig_ext_port_stage %x\n",
367 dm_digtable.curmultista_connectstate, 371 dm_digtable->curmultista_connectstate,
368 dm_digtable.dig_ext_port_stage); 372 dm_digtable->dig_ext_port_stage);
369} 373}
370 374
371static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw) 375static void rtl92c_dm_initial_gain_sta(struct ieee80211_hw *hw)
372{ 376{
373 struct rtl_priv *rtlpriv = rtl_priv(hw); 377 struct rtl_priv *rtlpriv = rtl_priv(hw);
378 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
374 379
375 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 380 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
376 "presta_connectstate = %x, cursta_connectctate = %x\n", 381 "presta_connectstate = %x, cursta_connectctate = %x\n",
377 dm_digtable.presta_connectstate, 382 dm_digtable->presta_connectstate,
378 dm_digtable.cursta_connectctate); 383 dm_digtable->cursta_connectctate);
379 384
380 if (dm_digtable.presta_connectstate == dm_digtable.cursta_connectctate 385 if (dm_digtable->presta_connectstate == dm_digtable->cursta_connectctate
381 || dm_digtable.cursta_connectctate == DIG_STA_BEFORE_CONNECT 386 || dm_digtable->cursta_connectctate == DIG_STA_BEFORE_CONNECT
382 || dm_digtable.cursta_connectctate == DIG_STA_CONNECT) { 387 || dm_digtable->cursta_connectctate == DIG_STA_CONNECT) {
383 388
384 if (dm_digtable.cursta_connectctate != DIG_STA_DISCONNECT) { 389 if (dm_digtable->cursta_connectctate != DIG_STA_DISCONNECT) {
385 dm_digtable.rssi_val_min = 390 dm_digtable->rssi_val_min =
386 rtl92c_dm_initial_gain_min_pwdb(hw); 391 rtl92c_dm_initial_gain_min_pwdb(hw);
387 rtl92c_dm_ctrl_initgain_by_rssi(hw); 392 rtl92c_dm_ctrl_initgain_by_rssi(hw);
388 } 393 }
389 } else { 394 } else {
390 dm_digtable.rssi_val_min = 0; 395 dm_digtable->rssi_val_min = 0;
391 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 396 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
392 dm_digtable.backoff_val = DM_DIG_BACKOFF_DEFAULT; 397 dm_digtable->backoff_val = DM_DIG_BACKOFF_DEFAULT;
393 dm_digtable.cur_igvalue = 0x20; 398 dm_digtable->cur_igvalue = 0x20;
394 dm_digtable.pre_igvalue = 0; 399 dm_digtable->pre_igvalue = 0;
395 rtl92c_dm_write_dig(hw); 400 rtl92c_dm_write_dig(hw);
396 } 401 }
397} 402}
@@ -400,40 +405,41 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
400{ 405{
401 struct rtl_priv *rtlpriv = rtl_priv(hw); 406 struct rtl_priv *rtlpriv = rtl_priv(hw);
402 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 407 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
408 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
403 409
404 if (dm_digtable.cursta_connectctate == DIG_STA_CONNECT) { 410 if (dm_digtable->cursta_connectctate == DIG_STA_CONNECT) {
405 dm_digtable.rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw); 411 dm_digtable->rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw);
406 412
407 if (dm_digtable.pre_cck_pd_state == CCK_PD_STAGE_LowRssi) { 413 if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
408 if (dm_digtable.rssi_val_min <= 25) 414 if (dm_digtable->rssi_val_min <= 25)
409 dm_digtable.cur_cck_pd_state = 415 dm_digtable->cur_cck_pd_state =
410 CCK_PD_STAGE_LowRssi; 416 CCK_PD_STAGE_LowRssi;
411 else 417 else
412 dm_digtable.cur_cck_pd_state = 418 dm_digtable->cur_cck_pd_state =
413 CCK_PD_STAGE_HighRssi; 419 CCK_PD_STAGE_HighRssi;
414 } else { 420 } else {
415 if (dm_digtable.rssi_val_min <= 20) 421 if (dm_digtable->rssi_val_min <= 20)
416 dm_digtable.cur_cck_pd_state = 422 dm_digtable->cur_cck_pd_state =
417 CCK_PD_STAGE_LowRssi; 423 CCK_PD_STAGE_LowRssi;
418 else 424 else
419 dm_digtable.cur_cck_pd_state = 425 dm_digtable->cur_cck_pd_state =
420 CCK_PD_STAGE_HighRssi; 426 CCK_PD_STAGE_HighRssi;
421 } 427 }
422 } else { 428 } else {
423 dm_digtable.cur_cck_pd_state = CCK_PD_STAGE_MAX; 429 dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
424 } 430 }
425 431
426 if (dm_digtable.pre_cck_pd_state != dm_digtable.cur_cck_pd_state) { 432 if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) {
427 if (dm_digtable.cur_cck_pd_state == CCK_PD_STAGE_LowRssi) { 433 if (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) {
428 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 800) 434 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 800)
429 dm_digtable.cur_cck_fa_state = 435 dm_digtable->cur_cck_fa_state =
430 CCK_FA_STAGE_High; 436 CCK_FA_STAGE_High;
431 else 437 else
432 dm_digtable.cur_cck_fa_state = CCK_FA_STAGE_Low; 438 dm_digtable->cur_cck_fa_state = CCK_FA_STAGE_Low;
433 439
434 if (dm_digtable.pre_cck_fa_state != 440 if (dm_digtable->pre_cck_fa_state !=
435 dm_digtable.cur_cck_fa_state) { 441 dm_digtable->cur_cck_fa_state) {
436 if (dm_digtable.cur_cck_fa_state == 442 if (dm_digtable->cur_cck_fa_state ==
437 CCK_FA_STAGE_Low) 443 CCK_FA_STAGE_Low)
438 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 444 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2,
439 0x83); 445 0x83);
@@ -441,8 +447,8 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
441 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 447 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2,
442 0xcd); 448 0xcd);
443 449
444 dm_digtable.pre_cck_fa_state = 450 dm_digtable->pre_cck_fa_state =
445 dm_digtable.cur_cck_fa_state; 451 dm_digtable->cur_cck_fa_state;
446 } 452 }
447 453
448 rtl_set_bbreg(hw, RCCK0_SYSTEM, MASKBYTE1, 0x40); 454 rtl_set_bbreg(hw, RCCK0_SYSTEM, MASKBYTE1, 0x40);
@@ -458,11 +464,11 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
458 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 464 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT,
459 MASKBYTE2, 0xd3); 465 MASKBYTE2, 0xd3);
460 } 466 }
461 dm_digtable.pre_cck_pd_state = dm_digtable.cur_cck_pd_state; 467 dm_digtable->pre_cck_pd_state = dm_digtable->cur_cck_pd_state;
462 } 468 }
463 469
464 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "CCKPDStage=%x\n", 470 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "CCKPDStage=%x\n",
465 dm_digtable.cur_cck_pd_state); 471 dm_digtable->cur_cck_pd_state);
466 472
467 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "is92C=%x\n", 473 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "is92C=%x\n",
468 IS_92C_SERIAL(rtlhal->version)); 474 IS_92C_SERIAL(rtlhal->version));
@@ -470,31 +476,34 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
470 476
471static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) 477static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
472{ 478{
479 struct rtl_priv *rtlpriv = rtl_priv(hw);
480 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
473 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 481 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
474 482
475 if (mac->act_scanning) 483 if (mac->act_scanning)
476 return; 484 return;
477 485
478 if (mac->link_state >= MAC80211_LINKED) 486 if (mac->link_state >= MAC80211_LINKED)
479 dm_digtable.cursta_connectctate = DIG_STA_CONNECT; 487 dm_digtable->cursta_connectctate = DIG_STA_CONNECT;
480 else 488 else
481 dm_digtable.cursta_connectctate = DIG_STA_DISCONNECT; 489 dm_digtable->cursta_connectctate = DIG_STA_DISCONNECT;
482 490
483 rtl92c_dm_initial_gain_sta(hw); 491 rtl92c_dm_initial_gain_sta(hw);
484 rtl92c_dm_initial_gain_multi_sta(hw); 492 rtl92c_dm_initial_gain_multi_sta(hw);
485 rtl92c_dm_cck_packet_detection_thresh(hw); 493 rtl92c_dm_cck_packet_detection_thresh(hw);
486 494
487 dm_digtable.presta_connectstate = dm_digtable.cursta_connectctate; 495 dm_digtable->presta_connectstate = dm_digtable->cursta_connectctate;
488 496
489} 497}
490 498
491static void rtl92c_dm_dig(struct ieee80211_hw *hw) 499static void rtl92c_dm_dig(struct ieee80211_hw *hw)
492{ 500{
493 struct rtl_priv *rtlpriv = rtl_priv(hw); 501 struct rtl_priv *rtlpriv = rtl_priv(hw);
502 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
494 503
495 if (rtlpriv->dm.dm_initialgain_enable == false) 504 if (rtlpriv->dm.dm_initialgain_enable == false)
496 return; 505 return;
497 if (dm_digtable.dig_enable_flag == false) 506 if (dm_digtable->dig_enable_flag == false)
498 return; 507 return;
499 508
500 rtl92c_dm_ctrl_initgain_by_twoport(hw); 509 rtl92c_dm_ctrl_initgain_by_twoport(hw);
@@ -514,23 +523,24 @@ static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
514void rtl92c_dm_write_dig(struct ieee80211_hw *hw) 523void rtl92c_dm_write_dig(struct ieee80211_hw *hw)
515{ 524{
516 struct rtl_priv *rtlpriv = rtl_priv(hw); 525 struct rtl_priv *rtlpriv = rtl_priv(hw);
526 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
517 527
518 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 528 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
519 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n", 529 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
520 dm_digtable.cur_igvalue, dm_digtable.pre_igvalue, 530 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
521 dm_digtable.backoff_val); 531 dm_digtable->backoff_val);
522 532
523 dm_digtable.cur_igvalue += 2; 533 dm_digtable->cur_igvalue += 2;
524 if (dm_digtable.cur_igvalue > 0x3f) 534 if (dm_digtable->cur_igvalue > 0x3f)
525 dm_digtable.cur_igvalue = 0x3f; 535 dm_digtable->cur_igvalue = 0x3f;
526 536
527 if (dm_digtable.pre_igvalue != dm_digtable.cur_igvalue) { 537 if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) {
528 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, 538 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
529 dm_digtable.cur_igvalue); 539 dm_digtable->cur_igvalue);
530 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f, 540 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f,
531 dm_digtable.cur_igvalue); 541 dm_digtable->cur_igvalue);
532 542
533 dm_digtable.pre_igvalue = dm_digtable.cur_igvalue; 543 dm_digtable->pre_igvalue = dm_digtable->cur_igvalue;
534 } 544 }
535} 545}
536EXPORT_SYMBOL(rtl92c_dm_write_dig); 546EXPORT_SYMBOL(rtl92c_dm_write_dig);
@@ -1223,15 +1233,20 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1223 1233
1224static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw) 1234static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1225{ 1235{
1226 dm_pstable.pre_ccastate = CCA_MAX; 1236 struct rtl_priv *rtlpriv = rtl_priv(hw);
1227 dm_pstable.cur_ccasate = CCA_MAX; 1237 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1228 dm_pstable.pre_rfstate = RF_MAX; 1238
1229 dm_pstable.cur_rfstate = RF_MAX; 1239 dm_pstable->pre_ccastate = CCA_MAX;
1230 dm_pstable.rssi_val_min = 0; 1240 dm_pstable->cur_ccasate = CCA_MAX;
1241 dm_pstable->pre_rfstate = RF_MAX;
1242 dm_pstable->cur_rfstate = RF_MAX;
1243 dm_pstable->rssi_val_min = 0;
1231} 1244}
1232 1245
1233void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal) 1246void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal)
1234{ 1247{
1248 struct rtl_priv *rtlpriv = rtl_priv(hw);
1249 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1235 static u8 initialize; 1250 static u8 initialize;
1236 static u32 reg_874, reg_c70, reg_85c, reg_a74; 1251 static u32 reg_874, reg_c70, reg_85c, reg_a74;
1237 1252
@@ -1251,27 +1266,27 @@ void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal)
1251 } 1266 }
1252 1267
1253 if (!bforce_in_normal) { 1268 if (!bforce_in_normal) {
1254 if (dm_pstable.rssi_val_min != 0) { 1269 if (dm_pstable->rssi_val_min != 0) {
1255 if (dm_pstable.pre_rfstate == RF_NORMAL) { 1270 if (dm_pstable->pre_rfstate == RF_NORMAL) {
1256 if (dm_pstable.rssi_val_min >= 30) 1271 if (dm_pstable->rssi_val_min >= 30)
1257 dm_pstable.cur_rfstate = RF_SAVE; 1272 dm_pstable->cur_rfstate = RF_SAVE;
1258 else 1273 else
1259 dm_pstable.cur_rfstate = RF_NORMAL; 1274 dm_pstable->cur_rfstate = RF_NORMAL;
1260 } else { 1275 } else {
1261 if (dm_pstable.rssi_val_min <= 25) 1276 if (dm_pstable->rssi_val_min <= 25)
1262 dm_pstable.cur_rfstate = RF_NORMAL; 1277 dm_pstable->cur_rfstate = RF_NORMAL;
1263 else 1278 else
1264 dm_pstable.cur_rfstate = RF_SAVE; 1279 dm_pstable->cur_rfstate = RF_SAVE;
1265 } 1280 }
1266 } else { 1281 } else {
1267 dm_pstable.cur_rfstate = RF_MAX; 1282 dm_pstable->cur_rfstate = RF_MAX;
1268 } 1283 }
1269 } else { 1284 } else {
1270 dm_pstable.cur_rfstate = RF_NORMAL; 1285 dm_pstable->cur_rfstate = RF_NORMAL;
1271 } 1286 }
1272 1287
1273 if (dm_pstable.pre_rfstate != dm_pstable.cur_rfstate) { 1288 if (dm_pstable->pre_rfstate != dm_pstable->cur_rfstate) {
1274 if (dm_pstable.cur_rfstate == RF_SAVE) { 1289 if (dm_pstable->cur_rfstate == RF_SAVE) {
1275 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, 1290 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
1276 0x1C0000, 0x2); 1291 0x1C0000, 0x2);
1277 rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3), 0); 1292 rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3), 0);
@@ -1293,7 +1308,7 @@ void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal)
1293 rtl_set_bbreg(hw, 0x818, BIT(28), 0x0); 1308 rtl_set_bbreg(hw, 0x818, BIT(28), 0x0);
1294 } 1309 }
1295 1310
1296 dm_pstable.pre_rfstate = dm_pstable.cur_rfstate; 1311 dm_pstable->pre_rfstate = dm_pstable->cur_rfstate;
1297 } 1312 }
1298} 1313}
1299EXPORT_SYMBOL(rtl92c_dm_rf_saving); 1314EXPORT_SYMBOL(rtl92c_dm_rf_saving);
@@ -1301,36 +1316,37 @@ EXPORT_SYMBOL(rtl92c_dm_rf_saving);
1301static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw) 1316static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1302{ 1317{
1303 struct rtl_priv *rtlpriv = rtl_priv(hw); 1318 struct rtl_priv *rtlpriv = rtl_priv(hw);
1319 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1304 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1320 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1305 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1321 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1306 1322
1307 if (((mac->link_state == MAC80211_NOLINK)) && 1323 if (((mac->link_state == MAC80211_NOLINK)) &&
1308 (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) { 1324 (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
1309 dm_pstable.rssi_val_min = 0; 1325 dm_pstable->rssi_val_min = 0;
1310 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, "Not connected to any\n"); 1326 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, "Not connected to any\n");
1311 } 1327 }
1312 1328
1313 if (mac->link_state == MAC80211_LINKED) { 1329 if (mac->link_state == MAC80211_LINKED) {
1314 if (mac->opmode == NL80211_IFTYPE_ADHOC) { 1330 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
1315 dm_pstable.rssi_val_min = 1331 dm_pstable->rssi_val_min =
1316 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb; 1332 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
1317 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, 1333 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
1318 "AP Client PWDB = 0x%lx\n", 1334 "AP Client PWDB = 0x%lx\n",
1319 dm_pstable.rssi_val_min); 1335 dm_pstable->rssi_val_min);
1320 } else { 1336 } else {
1321 dm_pstable.rssi_val_min = 1337 dm_pstable->rssi_val_min =
1322 rtlpriv->dm.undecorated_smoothed_pwdb; 1338 rtlpriv->dm.undecorated_smoothed_pwdb;
1323 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, 1339 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
1324 "STA Default Port PWDB = 0x%lx\n", 1340 "STA Default Port PWDB = 0x%lx\n",
1325 dm_pstable.rssi_val_min); 1341 dm_pstable->rssi_val_min);
1326 } 1342 }
1327 } else { 1343 } else {
1328 dm_pstable.rssi_val_min = 1344 dm_pstable->rssi_val_min =
1329 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb; 1345 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
1330 1346
1331 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, 1347 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
1332 "AP Ext Port PWDB = 0x%lx\n", 1348 "AP Ext Port PWDB = 0x%lx\n",
1333 dm_pstable.rssi_val_min); 1349 dm_pstable->rssi_val_min);
1334 } 1350 }
1335 1351
1336 if (IS_92C_SERIAL(rtlhal->version)) 1352 if (IS_92C_SERIAL(rtlhal->version))
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
index 2178e3761883..518e208c0180 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
@@ -91,40 +91,6 @@
91#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 91#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
92#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 92#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
93 93
94struct ps_t {
95 u8 pre_ccastate;
96 u8 cur_ccasate;
97 u8 pre_rfstate;
98 u8 cur_rfstate;
99 long rssi_val_min;
100};
101
102struct dig_t {
103 u8 dig_enable_flag;
104 u8 dig_ext_port_stage;
105 u32 rssi_lowthresh;
106 u32 rssi_highthresh;
107 u32 fa_lowthresh;
108 u32 fa_highthresh;
109 u8 cursta_connectctate;
110 u8 presta_connectstate;
111 u8 curmultista_connectstate;
112 u8 pre_igvalue;
113 u8 cur_igvalue;
114 char backoff_val;
115 char backoff_val_range_max;
116 char backoff_val_range_min;
117 u8 rx_gain_range_max;
118 u8 rx_gain_range_min;
119 u8 rssi_val_min;
120 u8 pre_cck_pd_state;
121 u8 cur_cck_pd_state;
122 u8 pre_cck_fa_state;
123 u8 cur_cck_fa_state;
124 u8 pre_ccastate;
125 u8 cur_ccasate;
126};
127
128struct swat_t { 94struct swat_t {
129 u8 failure_cnt; 95 u8 failure_cnt;
130 u8 try_flag; 96 u8 try_flag;
@@ -189,7 +155,6 @@ enum dm_dig_connect_e {
189 DIG_CONNECT_MAX 155 DIG_CONNECT_MAX
190}; 156};
191 157
192extern struct dig_t dm_digtable;
193void rtl92c_dm_init(struct ieee80211_hw *hw); 158void rtl92c_dm_init(struct ieee80211_hw *hw);
194void rtl92c_dm_watchdog(struct ieee80211_hw *hw); 159void rtl92c_dm_watchdog(struct ieee80211_hw *hw);
195void rtl92c_dm_write_dig(struct ieee80211_hw *hw); 160void rtl92c_dm_write_dig(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
index 4c016241f340..cdcad7d9f15e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
@@ -1881,6 +1881,7 @@ void rtl92c_phy_set_io(struct ieee80211_hw *hw)
1881{ 1881{
1882 struct rtl_priv *rtlpriv = rtl_priv(hw); 1882 struct rtl_priv *rtlpriv = rtl_priv(hw);
1883 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1883 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1884 struct dig_t dm_digtable = rtlpriv->dm_digtable;
1884 1885
1885 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1886 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1886 "--->Cmd(%#x), set_io_inprogress(%d)\n", 1887 "--->Cmd(%#x), set_io_inprogress(%d)\n",
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
index 26747fa86005..d4a3d032c7bf 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
@@ -86,40 +86,6 @@
86#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 86#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
87#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 87#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
88 88
89struct ps_t {
90 u8 pre_ccastate;
91 u8 cur_ccasate;
92 u8 pre_rfstate;
93 u8 cur_rfstate;
94 long rssi_val_min;
95};
96
97struct dig_t {
98 u8 dig_enable_flag;
99 u8 dig_ext_port_stage;
100 u32 rssi_lowthresh;
101 u32 rssi_highthresh;
102 u32 fa_lowthresh;
103 u32 fa_highthresh;
104 u8 cursta_connectctate;
105 u8 presta_connectstate;
106 u8 curmultista_connectstate;
107 u8 pre_igvalue;
108 u8 cur_igvalue;
109 char backoff_val;
110 char backoff_val_range_max;
111 char backoff_val_range_min;
112 u8 rx_gain_range_max;
113 u8 rx_gain_range_min;
114 u8 rssi_val_min;
115 u8 pre_cck_pd_state;
116 u8 cur_cck_pd_state;
117 u8 pre_cck_fa_state;
118 u8 cur_cck_fa_state;
119 u8 pre_ccastate;
120 u8 cur_ccasate;
121};
122
123struct swat_t { 89struct swat_t {
124 u8 failure_cnt; 90 u8 failure_cnt;
125 u8 try_flag; 91 u8 try_flag;
@@ -184,7 +150,6 @@ enum dm_dig_connect_e {
184 DIG_CONNECT_MAX 150 DIG_CONNECT_MAX
185}; 151};
186 152
187extern struct dig_t dm_digtable;
188void rtl92c_dm_init(struct ieee80211_hw *hw); 153void rtl92c_dm_init(struct ieee80211_hw *hw);
189void rtl92c_dm_watchdog(struct ieee80211_hw *hw); 154void rtl92c_dm_watchdog(struct ieee80211_hw *hw);
190void rtl92c_dm_write_dig(struct ieee80211_hw *hw); 155void rtl92c_dm_write_dig(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/dm.c b/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
index 4737018c9daa..a7d63a84551a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
@@ -37,8 +37,6 @@
37 37
38#define UNDEC_SM_PWDB entry_min_undecoratedsmoothed_pwdb 38#define UNDEC_SM_PWDB entry_min_undecoratedsmoothed_pwdb
39 39
40struct dig_t de_digtable;
41
42static const u32 ofdmswing_table[OFDM_TABLE_SIZE_92D] = { 40static const u32 ofdmswing_table[OFDM_TABLE_SIZE_92D] = {
43 0x7f8001fe, /* 0, +6.0dB */ 41 0x7f8001fe, /* 0, +6.0dB */
44 0x788001e2, /* 1, +5.5dB */ 42 0x788001e2, /* 1, +5.5dB */
@@ -159,27 +157,30 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
159 157
160static void rtl92d_dm_diginit(struct ieee80211_hw *hw) 158static void rtl92d_dm_diginit(struct ieee80211_hw *hw)
161{ 159{
162 de_digtable.dig_enable_flag = true; 160 struct rtl_priv *rtlpriv = rtl_priv(hw);
163 de_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 161 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
164 de_digtable.cur_igvalue = 0x20; 162
165 de_digtable.pre_igvalue = 0x0; 163 de_digtable->dig_enable_flag = true;
166 de_digtable.cursta_connectctate = DIG_STA_DISCONNECT; 164 de_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
167 de_digtable.presta_connectstate = DIG_STA_DISCONNECT; 165 de_digtable->cur_igvalue = 0x20;
168 de_digtable.curmultista_connectstate = DIG_MULTISTA_DISCONNECT; 166 de_digtable->pre_igvalue = 0x0;
169 de_digtable.rssi_lowthresh = DM_DIG_THRESH_LOW; 167 de_digtable->cursta_connectctate = DIG_STA_DISCONNECT;
170 de_digtable.rssi_highthresh = DM_DIG_THRESH_HIGH; 168 de_digtable->presta_connectstate = DIG_STA_DISCONNECT;
171 de_digtable.fa_lowthresh = DM_FALSEALARM_THRESH_LOW; 169 de_digtable->curmultista_connectstate = DIG_MULTISTA_DISCONNECT;
172 de_digtable.fa_highthresh = DM_FALSEALARM_THRESH_HIGH; 170 de_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
173 de_digtable.rx_gain_range_max = DM_DIG_FA_UPPER; 171 de_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
174 de_digtable.rx_gain_range_min = DM_DIG_FA_LOWER; 172 de_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
175 de_digtable.backoff_val = DM_DIG_BACKOFF_DEFAULT; 173 de_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
176 de_digtable.backoff_val_range_max = DM_DIG_BACKOFF_MAX; 174 de_digtable->rx_gain_range_max = DM_DIG_FA_UPPER;
177 de_digtable.backoff_val_range_min = DM_DIG_BACKOFF_MIN; 175 de_digtable->rx_gain_range_min = DM_DIG_FA_LOWER;
178 de_digtable.pre_cck_pd_state = CCK_PD_STAGE_LOWRSSI; 176 de_digtable->backoff_val = DM_DIG_BACKOFF_DEFAULT;
179 de_digtable.cur_cck_pd_state = CCK_PD_STAGE_MAX; 177 de_digtable->backoff_val_range_max = DM_DIG_BACKOFF_MAX;
180 de_digtable.large_fa_hit = 0; 178 de_digtable->backoff_val_range_min = DM_DIG_BACKOFF_MIN;
181 de_digtable.recover_cnt = 0; 179 de_digtable->pre_cck_pd_state = CCK_PD_STAGE_LOWRSSI;
182 de_digtable.forbidden_igi = DM_DIG_FA_LOWER; 180 de_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
181 de_digtable->large_fa_hit = 0;
182 de_digtable->recover_cnt = 0;
183 de_digtable->forbidden_igi = DM_DIG_FA_LOWER;
183} 184}
184 185
185static void rtl92d_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) 186static void rtl92d_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
@@ -266,68 +267,70 @@ static void rtl92d_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
266static void rtl92d_dm_find_minimum_rssi(struct ieee80211_hw *hw) 267static void rtl92d_dm_find_minimum_rssi(struct ieee80211_hw *hw)
267{ 268{
268 struct rtl_priv *rtlpriv = rtl_priv(hw); 269 struct rtl_priv *rtlpriv = rtl_priv(hw);
270 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
269 struct rtl_mac *mac = rtl_mac(rtlpriv); 271 struct rtl_mac *mac = rtl_mac(rtlpriv);
270 272
271 /* Determine the minimum RSSI */ 273 /* Determine the minimum RSSI */
272 if ((mac->link_state < MAC80211_LINKED) && 274 if ((mac->link_state < MAC80211_LINKED) &&
273 (rtlpriv->dm.UNDEC_SM_PWDB == 0)) { 275 (rtlpriv->dm.UNDEC_SM_PWDB == 0)) {
274 de_digtable.min_undecorated_pwdb_for_dm = 0; 276 de_digtable->min_undecorated_pwdb_for_dm = 0;
275 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 277 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
276 "Not connected to any\n"); 278 "Not connected to any\n");
277 } 279 }
278 if (mac->link_state >= MAC80211_LINKED) { 280 if (mac->link_state >= MAC80211_LINKED) {
279 if (mac->opmode == NL80211_IFTYPE_AP || 281 if (mac->opmode == NL80211_IFTYPE_AP ||
280 mac->opmode == NL80211_IFTYPE_ADHOC) { 282 mac->opmode == NL80211_IFTYPE_ADHOC) {
281 de_digtable.min_undecorated_pwdb_for_dm = 283 de_digtable->min_undecorated_pwdb_for_dm =
282 rtlpriv->dm.UNDEC_SM_PWDB; 284 rtlpriv->dm.UNDEC_SM_PWDB;
283 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 285 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
284 "AP Client PWDB = 0x%lx\n", 286 "AP Client PWDB = 0x%lx\n",
285 rtlpriv->dm.UNDEC_SM_PWDB); 287 rtlpriv->dm.UNDEC_SM_PWDB);
286 } else { 288 } else {
287 de_digtable.min_undecorated_pwdb_for_dm = 289 de_digtable->min_undecorated_pwdb_for_dm =
288 rtlpriv->dm.undecorated_smoothed_pwdb; 290 rtlpriv->dm.undecorated_smoothed_pwdb;
289 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 291 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
290 "STA Default Port PWDB = 0x%x\n", 292 "STA Default Port PWDB = 0x%x\n",
291 de_digtable.min_undecorated_pwdb_for_dm); 293 de_digtable->min_undecorated_pwdb_for_dm);
292 } 294 }
293 } else { 295 } else {
294 de_digtable.min_undecorated_pwdb_for_dm = 296 de_digtable->min_undecorated_pwdb_for_dm =
295 rtlpriv->dm.UNDEC_SM_PWDB; 297 rtlpriv->dm.UNDEC_SM_PWDB;
296 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 298 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
297 "AP Ext Port or disconnect PWDB = 0x%x\n", 299 "AP Ext Port or disconnect PWDB = 0x%x\n",
298 de_digtable.min_undecorated_pwdb_for_dm); 300 de_digtable->min_undecorated_pwdb_for_dm);
299 } 301 }
300 302
301 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n", 303 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n",
302 de_digtable.min_undecorated_pwdb_for_dm); 304 de_digtable->min_undecorated_pwdb_for_dm);
303} 305}
304 306
305static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) 307static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
306{ 308{
307 struct rtl_priv *rtlpriv = rtl_priv(hw); 309 struct rtl_priv *rtlpriv = rtl_priv(hw);
310 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
308 unsigned long flag = 0; 311 unsigned long flag = 0;
309 312
310 if (de_digtable.cursta_connectctate == DIG_STA_CONNECT) { 313 if (de_digtable->cursta_connectctate == DIG_STA_CONNECT) {
311 if (de_digtable.pre_cck_pd_state == CCK_PD_STAGE_LOWRSSI) { 314 if (de_digtable->pre_cck_pd_state == CCK_PD_STAGE_LOWRSSI) {
312 if (de_digtable.min_undecorated_pwdb_for_dm <= 25) 315 if (de_digtable->min_undecorated_pwdb_for_dm <= 25)
313 de_digtable.cur_cck_pd_state = 316 de_digtable->cur_cck_pd_state =
314 CCK_PD_STAGE_LOWRSSI; 317 CCK_PD_STAGE_LOWRSSI;
315 else 318 else
316 de_digtable.cur_cck_pd_state = 319 de_digtable->cur_cck_pd_state =
317 CCK_PD_STAGE_HIGHRSSI; 320 CCK_PD_STAGE_HIGHRSSI;
318 } else { 321 } else {
319 if (de_digtable.min_undecorated_pwdb_for_dm <= 20) 322 if (de_digtable->min_undecorated_pwdb_for_dm <= 20)
320 de_digtable.cur_cck_pd_state = 323 de_digtable->cur_cck_pd_state =
321 CCK_PD_STAGE_LOWRSSI; 324 CCK_PD_STAGE_LOWRSSI;
322 else 325 else
323 de_digtable.cur_cck_pd_state = 326 de_digtable->cur_cck_pd_state =
324 CCK_PD_STAGE_HIGHRSSI; 327 CCK_PD_STAGE_HIGHRSSI;
325 } 328 }
326 } else { 329 } else {
327 de_digtable.cur_cck_pd_state = CCK_PD_STAGE_LOWRSSI; 330 de_digtable->cur_cck_pd_state = CCK_PD_STAGE_LOWRSSI;
328 } 331 }
329 if (de_digtable.pre_cck_pd_state != de_digtable.cur_cck_pd_state) { 332 if (de_digtable->pre_cck_pd_state != de_digtable->cur_cck_pd_state) {
330 if (de_digtable.cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI) { 333 if (de_digtable->cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI) {
331 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag); 334 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
332 rtl_set_bbreg(hw, RCCK0_CCA, BMASKBYTE2, 0x83); 335 rtl_set_bbreg(hw, RCCK0_CCA, BMASKBYTE2, 0x83);
333 rtl92d_release_cckandrw_pagea_ctl(hw, &flag); 336 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
@@ -336,13 +339,13 @@ static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
336 rtl_set_bbreg(hw, RCCK0_CCA, BMASKBYTE2, 0xcd); 339 rtl_set_bbreg(hw, RCCK0_CCA, BMASKBYTE2, 0xcd);
337 rtl92d_release_cckandrw_pagea_ctl(hw, &flag); 340 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
338 } 341 }
339 de_digtable.pre_cck_pd_state = de_digtable.cur_cck_pd_state; 342 de_digtable->pre_cck_pd_state = de_digtable->cur_cck_pd_state;
340 } 343 }
341 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CurSTAConnectState=%s\n", 344 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CurSTAConnectState=%s\n",
342 de_digtable.cursta_connectctate == DIG_STA_CONNECT ? 345 de_digtable->cursta_connectctate == DIG_STA_CONNECT ?
343 "DIG_STA_CONNECT " : "DIG_STA_DISCONNECT"); 346 "DIG_STA_CONNECT " : "DIG_STA_DISCONNECT");
344 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CCKPDStage=%s\n", 347 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CCKPDStage=%s\n",
345 de_digtable.cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI ? 348 de_digtable->cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI ?
346 "Low RSSI " : "High RSSI "); 349 "Low RSSI " : "High RSSI ");
347 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "is92d single phy =%x\n", 350 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "is92d single phy =%x\n",
348 IS_92D_SINGLEPHY(rtlpriv->rtlhal.version)); 351 IS_92D_SINGLEPHY(rtlpriv->rtlhal.version));
@@ -352,37 +355,40 @@ static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
352void rtl92d_dm_write_dig(struct ieee80211_hw *hw) 355void rtl92d_dm_write_dig(struct ieee80211_hw *hw)
353{ 356{
354 struct rtl_priv *rtlpriv = rtl_priv(hw); 357 struct rtl_priv *rtlpriv = rtl_priv(hw);
358 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
355 359
356 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 360 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
357 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n", 361 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
358 de_digtable.cur_igvalue, de_digtable.pre_igvalue, 362 de_digtable->cur_igvalue, de_digtable->pre_igvalue,
359 de_digtable.backoff_val); 363 de_digtable->backoff_val);
360 if (de_digtable.dig_enable_flag == false) { 364 if (de_digtable->dig_enable_flag == false) {
361 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "DIG is disabled\n"); 365 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "DIG is disabled\n");
362 de_digtable.pre_igvalue = 0x17; 366 de_digtable->pre_igvalue = 0x17;
363 return; 367 return;
364 } 368 }
365 if (de_digtable.pre_igvalue != de_digtable.cur_igvalue) { 369 if (de_digtable->pre_igvalue != de_digtable->cur_igvalue) {
366 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, 370 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
367 de_digtable.cur_igvalue); 371 de_digtable->cur_igvalue);
368 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f, 372 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f,
369 de_digtable.cur_igvalue); 373 de_digtable->cur_igvalue);
370 de_digtable.pre_igvalue = de_digtable.cur_igvalue; 374 de_digtable->pre_igvalue = de_digtable->cur_igvalue;
371 } 375 }
372} 376}
373 377
374static void rtl92d_early_mode_enabled(struct rtl_priv *rtlpriv) 378static void rtl92d_early_mode_enabled(struct rtl_priv *rtlpriv)
375{ 379{
380 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
381
376 if ((rtlpriv->mac80211.link_state >= MAC80211_LINKED) && 382 if ((rtlpriv->mac80211.link_state >= MAC80211_LINKED) &&
377 (rtlpriv->mac80211.vendor == PEER_CISCO)) { 383 (rtlpriv->mac80211.vendor == PEER_CISCO)) {
378 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "IOT_PEER = CISCO\n"); 384 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "IOT_PEER = CISCO\n");
379 if (de_digtable.last_min_undecorated_pwdb_for_dm >= 50 385 if (de_digtable->last_min_undecorated_pwdb_for_dm >= 50
380 && de_digtable.min_undecorated_pwdb_for_dm < 50) { 386 && de_digtable->min_undecorated_pwdb_for_dm < 50) {
381 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x00); 387 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x00);
382 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 388 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
383 "Early Mode Off\n"); 389 "Early Mode Off\n");
384 } else if (de_digtable.last_min_undecorated_pwdb_for_dm <= 55 && 390 } else if (de_digtable->last_min_undecorated_pwdb_for_dm <= 55 &&
385 de_digtable.min_undecorated_pwdb_for_dm > 55) { 391 de_digtable->min_undecorated_pwdb_for_dm > 55) {
386 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f); 392 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f);
387 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 393 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
388 "Early Mode On\n"); 394 "Early Mode On\n");
@@ -396,14 +402,15 @@ static void rtl92d_early_mode_enabled(struct rtl_priv *rtlpriv)
396static void rtl92d_dm_dig(struct ieee80211_hw *hw) 402static void rtl92d_dm_dig(struct ieee80211_hw *hw)
397{ 403{
398 struct rtl_priv *rtlpriv = rtl_priv(hw); 404 struct rtl_priv *rtlpriv = rtl_priv(hw);
399 u8 value_igi = de_digtable.cur_igvalue; 405 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
406 u8 value_igi = de_digtable->cur_igvalue;
400 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt); 407 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt);
401 408
402 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "==>\n"); 409 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "==>\n");
403 if (rtlpriv->rtlhal.earlymode_enable) { 410 if (rtlpriv->rtlhal.earlymode_enable) {
404 rtl92d_early_mode_enabled(rtlpriv); 411 rtl92d_early_mode_enabled(rtlpriv);
405 de_digtable.last_min_undecorated_pwdb_for_dm = 412 de_digtable->last_min_undecorated_pwdb_for_dm =
406 de_digtable.min_undecorated_pwdb_for_dm; 413 de_digtable->min_undecorated_pwdb_for_dm;
407 } 414 }
408 if (!rtlpriv->dm.dm_initialgain_enable) 415 if (!rtlpriv->dm.dm_initialgain_enable)
409 return; 416 return;
@@ -421,9 +428,9 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
421 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "progress\n"); 428 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "progress\n");
422 /* Decide the current status and if modify initial gain or not */ 429 /* Decide the current status and if modify initial gain or not */
423 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) 430 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
424 de_digtable.cursta_connectctate = DIG_STA_CONNECT; 431 de_digtable->cursta_connectctate = DIG_STA_CONNECT;
425 else 432 else
426 de_digtable.cursta_connectctate = DIG_STA_DISCONNECT; 433 de_digtable->cursta_connectctate = DIG_STA_DISCONNECT;
427 434
428 /* adjust initial gain according to false alarm counter */ 435 /* adjust initial gain according to false alarm counter */
429 if (falsealm_cnt->cnt_all < DM_DIG_FA_TH0) 436 if (falsealm_cnt->cnt_all < DM_DIG_FA_TH0)
@@ -436,64 +443,64 @@ static void rtl92d_dm_dig(struct ieee80211_hw *hw)
436 value_igi += 2; 443 value_igi += 2;
437 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 444 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
438 "dm_DIG() Before: large_fa_hit=%d, forbidden_igi=%x\n", 445 "dm_DIG() Before: large_fa_hit=%d, forbidden_igi=%x\n",
439 de_digtable.large_fa_hit, de_digtable.forbidden_igi); 446 de_digtable->large_fa_hit, de_digtable->forbidden_igi);
440 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 447 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
441 "dm_DIG() Before: Recover_cnt=%d, rx_gain_range_min=%x\n", 448 "dm_DIG() Before: Recover_cnt=%d, rx_gain_range_min=%x\n",
442 de_digtable.recover_cnt, de_digtable.rx_gain_range_min); 449 de_digtable->recover_cnt, de_digtable->rx_gain_range_min);
443 450
444 /* deal with abnorally large false alarm */ 451 /* deal with abnorally large false alarm */
445 if (falsealm_cnt->cnt_all > 10000) { 452 if (falsealm_cnt->cnt_all > 10000) {
446 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 453 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
447 "dm_DIG(): Abnormally false alarm case\n"); 454 "dm_DIG(): Abnormally false alarm case\n");
448 455
449 de_digtable.large_fa_hit++; 456 de_digtable->large_fa_hit++;
450 if (de_digtable.forbidden_igi < de_digtable.cur_igvalue) { 457 if (de_digtable->forbidden_igi < de_digtable->cur_igvalue) {
451 de_digtable.forbidden_igi = de_digtable.cur_igvalue; 458 de_digtable->forbidden_igi = de_digtable->cur_igvalue;
452 de_digtable.large_fa_hit = 1; 459 de_digtable->large_fa_hit = 1;
453 } 460 }
454 if (de_digtable.large_fa_hit >= 3) { 461 if (de_digtable->large_fa_hit >= 3) {
455 if ((de_digtable.forbidden_igi + 1) > DM_DIG_MAX) 462 if ((de_digtable->forbidden_igi + 1) > DM_DIG_MAX)
456 de_digtable.rx_gain_range_min = DM_DIG_MAX; 463 de_digtable->rx_gain_range_min = DM_DIG_MAX;
457 else 464 else
458 de_digtable.rx_gain_range_min = 465 de_digtable->rx_gain_range_min =
459 (de_digtable.forbidden_igi + 1); 466 (de_digtable->forbidden_igi + 1);
460 de_digtable.recover_cnt = 3600; /* 3600=2hr */ 467 de_digtable->recover_cnt = 3600; /* 3600=2hr */
461 } 468 }
462 } else { 469 } else {
463 /* Recovery mechanism for IGI lower bound */ 470 /* Recovery mechanism for IGI lower bound */
464 if (de_digtable.recover_cnt != 0) { 471 if (de_digtable->recover_cnt != 0) {
465 de_digtable.recover_cnt--; 472 de_digtable->recover_cnt--;
466 } else { 473 } else {
467 if (de_digtable.large_fa_hit == 0) { 474 if (de_digtable->large_fa_hit == 0) {
468 if ((de_digtable.forbidden_igi - 1) < 475 if ((de_digtable->forbidden_igi - 1) <
469 DM_DIG_FA_LOWER) { 476 DM_DIG_FA_LOWER) {
470 de_digtable.forbidden_igi = 477 de_digtable->forbidden_igi =
471 DM_DIG_FA_LOWER; 478 DM_DIG_FA_LOWER;
472 de_digtable.rx_gain_range_min = 479 de_digtable->rx_gain_range_min =
473 DM_DIG_FA_LOWER; 480 DM_DIG_FA_LOWER;
474 481
475 } else { 482 } else {
476 de_digtable.forbidden_igi--; 483 de_digtable->forbidden_igi--;
477 de_digtable.rx_gain_range_min = 484 de_digtable->rx_gain_range_min =
478 (de_digtable.forbidden_igi + 1); 485 (de_digtable->forbidden_igi + 1);
479 } 486 }
480 } else if (de_digtable.large_fa_hit == 3) { 487 } else if (de_digtable->large_fa_hit == 3) {
481 de_digtable.large_fa_hit = 0; 488 de_digtable->large_fa_hit = 0;
482 } 489 }
483 } 490 }
484 } 491 }
485 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 492 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
486 "dm_DIG() After: large_fa_hit=%d, forbidden_igi=%x\n", 493 "dm_DIG() After: large_fa_hit=%d, forbidden_igi=%x\n",
487 de_digtable.large_fa_hit, de_digtable.forbidden_igi); 494 de_digtable->large_fa_hit, de_digtable->forbidden_igi);
488 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 495 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
489 "dm_DIG() After: recover_cnt=%d, rx_gain_range_min=%x\n", 496 "dm_DIG() After: recover_cnt=%d, rx_gain_range_min=%x\n",
490 de_digtable.recover_cnt, de_digtable.rx_gain_range_min); 497 de_digtable->recover_cnt, de_digtable->rx_gain_range_min);
491 498
492 if (value_igi > DM_DIG_MAX) 499 if (value_igi > DM_DIG_MAX)
493 value_igi = DM_DIG_MAX; 500 value_igi = DM_DIG_MAX;
494 else if (value_igi < de_digtable.rx_gain_range_min) 501 else if (value_igi < de_digtable->rx_gain_range_min)
495 value_igi = de_digtable.rx_gain_range_min; 502 value_igi = de_digtable->rx_gain_range_min;
496 de_digtable.cur_igvalue = value_igi; 503 de_digtable->cur_igvalue = value_igi;
497 rtl92d_dm_write_dig(hw); 504 rtl92d_dm_write_dig(hw);
498 if (rtlpriv->rtlhal.current_bandtype != BAND_ON_5G) 505 if (rtlpriv->rtlhal.current_bandtype != BAND_ON_5G)
499 rtl92d_dm_cck_packet_detection_thresh(hw); 506 rtl92d_dm_cck_packet_detection_thresh(hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/dm.h b/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
index 91030ec8ac3e..3fea0c11c24a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
@@ -87,55 +87,6 @@
87#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 87#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
88#define INDEX_MAPPING_NUM 13 88#define INDEX_MAPPING_NUM 13
89 89
90struct ps_t {
91 u8 pre_ccastate;
92 u8 cur_ccasate;
93
94 u8 pre_rfstate;
95 u8 cur_rfstate;
96
97 long rssi_val_min;
98};
99
100struct dig_t {
101 u8 dig_enable_flag;
102 u8 dig_ext_port_stage;
103
104 u32 rssi_lowthresh;
105 u32 rssi_highthresh;
106
107 u32 fa_lowthresh;
108 u32 fa_highthresh;
109
110 u8 cursta_connectctate;
111 u8 presta_connectstate;
112 u8 curmultista_connectstate;
113
114 u8 pre_igvalue;
115 u8 cur_igvalue;
116
117 char backoff_val;
118 char backoff_val_range_max;
119 char backoff_val_range_min;
120 u8 rx_gain_range_max;
121 u8 rx_gain_range_min;
122 u8 min_undecorated_pwdb_for_dm;
123 long last_min_undecorated_pwdb_for_dm;
124
125 u8 pre_cck_pd_state;
126 u8 cur_cck_pd_state;
127
128 u8 pre_cck_fa_state;
129 u8 cur_cck_fa_state;
130
131 u8 pre_ccastate;
132 u8 cur_ccasate;
133
134 u8 large_fa_hit;
135 u8 forbidden_igi;
136 u32 recover_cnt;
137};
138
139struct swat { 90struct swat {
140 u8 failure_cnt; 91 u8 failure_cnt;
141 u8 try_flag; 92 u8 try_flag;
@@ -200,8 +151,6 @@ enum dm_dig_connect {
200 DIG_CONNECT_MAX 151 DIG_CONNECT_MAX
201}; 152};
202 153
203extern struct dig_t de_digtable;
204
205void rtl92d_dm_init(struct ieee80211_hw *hw); 154void rtl92d_dm_init(struct ieee80211_hw *hw);
206void rtl92d_dm_watchdog(struct ieee80211_hw *hw); 155void rtl92d_dm_watchdog(struct ieee80211_hw *hw);
207void rtl92d_dm_init_edca_turbo(struct ieee80211_hw *hw); 156void rtl92d_dm_init_edca_turbo(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
index 28fc5fb8057b..18380a7829f1 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
@@ -3064,6 +3064,7 @@ u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
3064static void rtl92d_phy_set_io(struct ieee80211_hw *hw) 3064static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
3065{ 3065{
3066 struct rtl_priv *rtlpriv = rtl_priv(hw); 3066 struct rtl_priv *rtlpriv = rtl_priv(hw);
3067 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
3067 struct rtl_phy *rtlphy = &(rtlpriv->phy); 3068 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3068 3069
3069 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 3070 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
@@ -3071,13 +3072,13 @@ static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
3071 rtlphy->current_io_type, rtlphy->set_io_inprogress); 3072 rtlphy->current_io_type, rtlphy->set_io_inprogress);
3072 switch (rtlphy->current_io_type) { 3073 switch (rtlphy->current_io_type) {
3073 case IO_CMD_RESUME_DM_BY_SCAN: 3074 case IO_CMD_RESUME_DM_BY_SCAN:
3074 de_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1; 3075 de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
3075 rtl92d_dm_write_dig(hw); 3076 rtl92d_dm_write_dig(hw);
3076 rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel); 3077 rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
3077 break; 3078 break;
3078 case IO_CMD_PAUSE_DM_BY_SCAN: 3079 case IO_CMD_PAUSE_DM_BY_SCAN:
3079 rtlphy->initgain_backup.xaagccore1 = de_digtable.cur_igvalue; 3080 rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
3080 de_digtable.cur_igvalue = 0x37; 3081 de_digtable->cur_igvalue = 0x37;
3081 rtl92d_dm_write_dig(hw); 3082 rtl92d_dm_write_dig(hw);
3082 break; 3083 break;
3083 default: 3084 default:
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.c b/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
index fbabae17259e..2e1158026fb7 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
@@ -35,7 +35,6 @@
35#include "dm.h" 35#include "dm.h"
36#include "fw.h" 36#include "fw.h"
37 37
38struct dig_t digtable;
39static const u32 edca_setting_dl[PEER_MAX] = { 38static const u32 edca_setting_dl[PEER_MAX] = {
40 0xa44f, /* 0 UNKNOWN */ 39 0xa44f, /* 0 UNKNOWN */
41 0x5ea44f, /* 1 REALTEK_90 */ 40 0x5ea44f, /* 1 REALTEK_90 */
@@ -421,62 +420,64 @@ static void _rtl92s_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
421static void rtl92s_backoff_enable_flag(struct ieee80211_hw *hw) 420static void rtl92s_backoff_enable_flag(struct ieee80211_hw *hw)
422{ 421{
423 struct rtl_priv *rtlpriv = rtl_priv(hw); 422 struct rtl_priv *rtlpriv = rtl_priv(hw);
423 struct dig_t *digtable = &rtlpriv->dm_digtable;
424 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt); 424 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt);
425 425
426 if (falsealm_cnt->cnt_all > digtable.fa_highthresh) { 426 if (falsealm_cnt->cnt_all > digtable->fa_highthresh) {
427 if ((digtable.backoff_val - 6) < 427 if ((digtable->backoff_val - 6) <
428 digtable.backoffval_range_min) 428 digtable->backoffval_range_min)
429 digtable.backoff_val = digtable.backoffval_range_min; 429 digtable->backoff_val = digtable->backoffval_range_min;
430 else 430 else
431 digtable.backoff_val -= 6; 431 digtable->backoff_val -= 6;
432 } else if (falsealm_cnt->cnt_all < digtable.fa_lowthresh) { 432 } else if (falsealm_cnt->cnt_all < digtable->fa_lowthresh) {
433 if ((digtable.backoff_val + 6) > 433 if ((digtable->backoff_val + 6) >
434 digtable.backoffval_range_max) 434 digtable->backoffval_range_max)
435 digtable.backoff_val = 435 digtable->backoff_val =
436 digtable.backoffval_range_max; 436 digtable->backoffval_range_max;
437 else 437 else
438 digtable.backoff_val += 6; 438 digtable->backoff_val += 6;
439 } 439 }
440} 440}
441 441
442static void _rtl92s_dm_initial_gain_sta_beforeconnect(struct ieee80211_hw *hw) 442static void _rtl92s_dm_initial_gain_sta_beforeconnect(struct ieee80211_hw *hw)
443{ 443{
444 struct rtl_priv *rtlpriv = rtl_priv(hw); 444 struct rtl_priv *rtlpriv = rtl_priv(hw);
445 struct dig_t *digtable = &rtlpriv->dm_digtable;
445 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt); 446 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt);
446 static u8 initialized, force_write; 447 static u8 initialized, force_write;
447 u8 initial_gain = 0; 448 u8 initial_gain = 0;
448 449
449 if ((digtable.pre_sta_connectstate == digtable.cur_sta_connectstate) || 450 if ((digtable->pre_sta_connectstate == digtable->cur_sta_connectstate) ||
450 (digtable.cur_sta_connectstate == DIG_STA_BEFORE_CONNECT)) { 451 (digtable->cur_sta_connectstate == DIG_STA_BEFORE_CONNECT)) {
451 if (digtable.cur_sta_connectstate == DIG_STA_BEFORE_CONNECT) { 452 if (digtable->cur_sta_connectstate == DIG_STA_BEFORE_CONNECT) {
452 if (rtlpriv->psc.rfpwr_state != ERFON) 453 if (rtlpriv->psc.rfpwr_state != ERFON)
453 return; 454 return;
454 455
455 if (digtable.backoff_enable_flag) 456 if (digtable->backoff_enable_flag)
456 rtl92s_backoff_enable_flag(hw); 457 rtl92s_backoff_enable_flag(hw);
457 else 458 else
458 digtable.backoff_val = DM_DIG_BACKOFF; 459 digtable->backoff_val = DM_DIG_BACKOFF;
459 460
460 if ((digtable.rssi_val + 10 - digtable.backoff_val) > 461 if ((digtable->rssi_val + 10 - digtable->backoff_val) >
461 digtable.rx_gain_range_max) 462 digtable->rx_gain_range_max)
462 digtable.cur_igvalue = 463 digtable->cur_igvalue =
463 digtable.rx_gain_range_max; 464 digtable->rx_gain_range_max;
464 else if ((digtable.rssi_val + 10 - digtable.backoff_val) 465 else if ((digtable->rssi_val + 10 - digtable->backoff_val)
465 < digtable.rx_gain_range_min) 466 < digtable->rx_gain_range_min)
466 digtable.cur_igvalue = 467 digtable->cur_igvalue =
467 digtable.rx_gain_range_min; 468 digtable->rx_gain_range_min;
468 else 469 else
469 digtable.cur_igvalue = digtable.rssi_val + 10 - 470 digtable->cur_igvalue = digtable->rssi_val + 10 -
470 digtable.backoff_val; 471 digtable->backoff_val;
471 472
472 if (falsealm_cnt->cnt_all > 10000) 473 if (falsealm_cnt->cnt_all > 10000)
473 digtable.cur_igvalue = 474 digtable->cur_igvalue =
474 (digtable.cur_igvalue > 0x33) ? 475 (digtable->cur_igvalue > 0x33) ?
475 digtable.cur_igvalue : 0x33; 476 digtable->cur_igvalue : 0x33;
476 477
477 if (falsealm_cnt->cnt_all > 16000) 478 if (falsealm_cnt->cnt_all > 16000)
478 digtable.cur_igvalue = 479 digtable->cur_igvalue =
479 digtable.rx_gain_range_max; 480 digtable->rx_gain_range_max;
480 /* connected -> connected or disconnected -> disconnected */ 481 /* connected -> connected or disconnected -> disconnected */
481 } else { 482 } else {
482 /* Firmware control DIG, do nothing in driver dm */ 483 /* Firmware control DIG, do nothing in driver dm */
@@ -486,31 +487,31 @@ static void _rtl92s_dm_initial_gain_sta_beforeconnect(struct ieee80211_hw *hw)
486 * disconnected or beforeconnect->(dis)connected */ 487 * disconnected or beforeconnect->(dis)connected */
487 } else { 488 } else {
488 /* Enable FW DIG */ 489 /* Enable FW DIG */
489 digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 490 digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
490 rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_ENABLE); 491 rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_ENABLE);
491 492
492 digtable.backoff_val = DM_DIG_BACKOFF; 493 digtable->backoff_val = DM_DIG_BACKOFF;
493 digtable.cur_igvalue = rtlpriv->phy.default_initialgain[0]; 494 digtable->cur_igvalue = rtlpriv->phy.default_initialgain[0];
494 digtable.pre_igvalue = 0; 495 digtable->pre_igvalue = 0;
495 return; 496 return;
496 } 497 }
497 498
498 /* Forced writing to prevent from fw-dig overwriting. */ 499 /* Forced writing to prevent from fw-dig overwriting. */
499 if (digtable.pre_igvalue != rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 500 if (digtable->pre_igvalue != rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1,
500 MASKBYTE0)) 501 MASKBYTE0))
501 force_write = 1; 502 force_write = 1;
502 503
503 if ((digtable.pre_igvalue != digtable.cur_igvalue) || 504 if ((digtable->pre_igvalue != digtable->cur_igvalue) ||
504 !initialized || force_write) { 505 !initialized || force_write) {
505 /* Disable FW DIG */ 506 /* Disable FW DIG */
506 rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_DISABLE); 507 rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_DISABLE);
507 508
508 initial_gain = (u8)digtable.cur_igvalue; 509 initial_gain = (u8)digtable->cur_igvalue;
509 510
510 /* Set initial gain. */ 511 /* Set initial gain. */
511 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0, initial_gain); 512 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0, initial_gain);
512 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0, initial_gain); 513 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0, initial_gain);
513 digtable.pre_igvalue = digtable.cur_igvalue; 514 digtable->pre_igvalue = digtable->cur_igvalue;
514 initialized = 1; 515 initialized = 1;
515 force_write = 0; 516 force_write = 0;
516 } 517 }
@@ -519,6 +520,7 @@ static void _rtl92s_dm_initial_gain_sta_beforeconnect(struct ieee80211_hw *hw)
519static void _rtl92s_dm_ctrl_initgain_bytwoport(struct ieee80211_hw *hw) 520static void _rtl92s_dm_ctrl_initgain_bytwoport(struct ieee80211_hw *hw)
520{ 521{
521 struct rtl_priv *rtlpriv = rtl_priv(hw); 522 struct rtl_priv *rtlpriv = rtl_priv(hw);
523 struct dig_t *digtable = &rtlpriv->dm_digtable;
522 524
523 if (rtlpriv->mac80211.act_scanning) 525 if (rtlpriv->mac80211.act_scanning)
524 return; 526 return;
@@ -526,17 +528,17 @@ static void _rtl92s_dm_ctrl_initgain_bytwoport(struct ieee80211_hw *hw)
526 /* Decide the current status and if modify initial gain or not */ 528 /* Decide the current status and if modify initial gain or not */
527 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED || 529 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED ||
528 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) 530 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
529 digtable.cur_sta_connectstate = DIG_STA_CONNECT; 531 digtable->cur_sta_connectstate = DIG_STA_CONNECT;
530 else 532 else
531 digtable.cur_sta_connectstate = DIG_STA_DISCONNECT; 533 digtable->cur_sta_connectstate = DIG_STA_DISCONNECT;
532 534
533 digtable.rssi_val = rtlpriv->dm.undecorated_smoothed_pwdb; 535 digtable->rssi_val = rtlpriv->dm.undecorated_smoothed_pwdb;
534 536
535 /* Change dig mode to rssi */ 537 /* Change dig mode to rssi */
536 if (digtable.cur_sta_connectstate != DIG_STA_DISCONNECT) { 538 if (digtable->cur_sta_connectstate != DIG_STA_DISCONNECT) {
537 if (digtable.dig_twoport_algorithm == 539 if (digtable->dig_twoport_algorithm ==
538 DIG_TWO_PORT_ALGO_FALSE_ALARM) { 540 DIG_TWO_PORT_ALGO_FALSE_ALARM) {
539 digtable.dig_twoport_algorithm = DIG_TWO_PORT_ALGO_RSSI; 541 digtable->dig_twoport_algorithm = DIG_TWO_PORT_ALGO_RSSI;
540 rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_MODE_SS); 542 rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_MODE_SS);
541 } 543 }
542 } 544 }
@@ -544,13 +546,14 @@ static void _rtl92s_dm_ctrl_initgain_bytwoport(struct ieee80211_hw *hw)
544 _rtl92s_dm_false_alarm_counter_statistics(hw); 546 _rtl92s_dm_false_alarm_counter_statistics(hw);
545 _rtl92s_dm_initial_gain_sta_beforeconnect(hw); 547 _rtl92s_dm_initial_gain_sta_beforeconnect(hw);
546 548
547 digtable.pre_sta_connectstate = digtable.cur_sta_connectstate; 549 digtable->pre_sta_connectstate = digtable->cur_sta_connectstate;
548} 550}
549 551
550static void _rtl92s_dm_ctrl_initgain_byrssi(struct ieee80211_hw *hw) 552static void _rtl92s_dm_ctrl_initgain_byrssi(struct ieee80211_hw *hw)
551{ 553{
552 struct rtl_priv *rtlpriv = rtl_priv(hw); 554 struct rtl_priv *rtlpriv = rtl_priv(hw);
553 struct rtl_phy *rtlphy = &(rtlpriv->phy); 555 struct rtl_phy *rtlphy = &(rtlpriv->phy);
556 struct dig_t *digtable = &rtlpriv->dm_digtable;
554 557
555 /* 2T2R TP issue */ 558 /* 2T2R TP issue */
556 if (rtlphy->rf_type == RF_2T2R) 559 if (rtlphy->rf_type == RF_2T2R)
@@ -559,7 +562,7 @@ static void _rtl92s_dm_ctrl_initgain_byrssi(struct ieee80211_hw *hw)
559 if (!rtlpriv->dm.dm_initialgain_enable) 562 if (!rtlpriv->dm.dm_initialgain_enable)
560 return; 563 return;
561 564
562 if (digtable.dig_enable_flag == false) 565 if (digtable->dig_enable_flag == false)
563 return; 566 return;
564 567
565 _rtl92s_dm_ctrl_initgain_bytwoport(hw); 568 _rtl92s_dm_ctrl_initgain_bytwoport(hw);
@@ -639,51 +642,52 @@ static void _rtl92s_dm_dynamic_txpower(struct ieee80211_hw *hw)
639static void _rtl92s_dm_init_dig(struct ieee80211_hw *hw) 642static void _rtl92s_dm_init_dig(struct ieee80211_hw *hw)
640{ 643{
641 struct rtl_priv *rtlpriv = rtl_priv(hw); 644 struct rtl_priv *rtlpriv = rtl_priv(hw);
645 struct dig_t *digtable = &rtlpriv->dm_digtable;
642 646
643 /* Disable DIG scheme now.*/ 647 /* Disable DIG scheme now.*/
644 digtable.dig_enable_flag = true; 648 digtable->dig_enable_flag = true;
645 digtable.backoff_enable_flag = true; 649 digtable->backoff_enable_flag = true;
646 650
647 if ((rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER) && 651 if ((rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER) &&
648 (hal_get_firmwareversion(rtlpriv) >= 0x3c)) 652 (hal_get_firmwareversion(rtlpriv) >= 0x3c))
649 digtable.dig_algorithm = DIG_ALGO_BY_TOW_PORT; 653 digtable->dig_algorithm = DIG_ALGO_BY_TOW_PORT;
650 else 654 else
651 digtable.dig_algorithm = 655 digtable->dig_algorithm =
652 DIG_ALGO_BEFORE_CONNECT_BY_RSSI_AND_ALARM; 656 DIG_ALGO_BEFORE_CONNECT_BY_RSSI_AND_ALARM;
653 657
654 digtable.dig_twoport_algorithm = DIG_TWO_PORT_ALGO_RSSI; 658 digtable->dig_twoport_algorithm = DIG_TWO_PORT_ALGO_RSSI;
655 digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 659 digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
656 /* off=by real rssi value, on=by digtable.rssi_val for new dig */ 660 /* off=by real rssi value, on=by digtable->rssi_val for new dig */
657 digtable.dig_dbgmode = DM_DBG_OFF; 661 digtable->dig_dbgmode = DM_DBG_OFF;
658 digtable.dig_slgorithm_switch = 0; 662 digtable->dig_slgorithm_switch = 0;
659 663
660 /* 2007/10/04 MH Define init gain threshol. */ 664 /* 2007/10/04 MH Define init gain threshol. */
661 digtable.dig_state = DM_STA_DIG_MAX; 665 digtable->dig_state = DM_STA_DIG_MAX;
662 digtable.dig_highpwrstate = DM_STA_DIG_MAX; 666 digtable->dig_highpwrstate = DM_STA_DIG_MAX;
663 667
664 digtable.cur_sta_connectstate = DIG_STA_DISCONNECT; 668 digtable->cur_sta_connectstate = DIG_STA_DISCONNECT;
665 digtable.pre_sta_connectstate = DIG_STA_DISCONNECT; 669 digtable->pre_sta_connectstate = DIG_STA_DISCONNECT;
666 digtable.cur_ap_connectstate = DIG_AP_DISCONNECT; 670 digtable->cur_ap_connectstate = DIG_AP_DISCONNECT;
667 digtable.pre_ap_connectstate = DIG_AP_DISCONNECT; 671 digtable->pre_ap_connectstate = DIG_AP_DISCONNECT;
668 672
669 digtable.rssi_lowthresh = DM_DIG_THRESH_LOW; 673 digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
670 digtable.rssi_highthresh = DM_DIG_THRESH_HIGH; 674 digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
671 675
672 digtable.fa_lowthresh = DM_FALSEALARM_THRESH_LOW; 676 digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
673 digtable.fa_highthresh = DM_FALSEALARM_THRESH_HIGH; 677 digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
674 678
675 digtable.rssi_highpower_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW; 679 digtable->rssi_highpower_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
676 digtable.rssi_highpower_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH; 680 digtable->rssi_highpower_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
677 681
678 /* for dig debug rssi value */ 682 /* for dig debug rssi value */
679 digtable.rssi_val = 50; 683 digtable->rssi_val = 50;
680 digtable.backoff_val = DM_DIG_BACKOFF; 684 digtable->backoff_val = DM_DIG_BACKOFF;
681 digtable.rx_gain_range_max = DM_DIG_MAX; 685 digtable->rx_gain_range_max = DM_DIG_MAX;
682 686
683 digtable.rx_gain_range_min = DM_DIG_MIN; 687 digtable->rx_gain_range_min = DM_DIG_MIN;
684 688
685 digtable.backoffval_range_max = DM_DIG_BACKOFF_MAX; 689 digtable->backoffval_range_max = DM_DIG_BACKOFF_MAX;
686 digtable.backoffval_range_min = DM_DIG_BACKOFF_MIN; 690 digtable->backoffval_range_min = DM_DIG_BACKOFF_MIN;
687} 691}
688 692
689static void _rtl92s_dm_init_dynamic_txpower(struct ieee80211_hw *hw) 693static void _rtl92s_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
index e1b19a641765..2e9052c8fe4b 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
@@ -29,48 +29,6 @@
29#ifndef __RTL_92S_DM_H__ 29#ifndef __RTL_92S_DM_H__
30#define __RTL_92S_DM_H__ 30#define __RTL_92S_DM_H__
31 31
32struct dig_t {
33 u8 dig_enable_flag;
34 u8 dig_algorithm;
35 u8 dig_twoport_algorithm;
36 u8 dig_ext_port_stage;
37 u8 dig_dbgmode;
38 u8 dig_slgorithm_switch;
39
40 long rssi_lowthresh;
41 long rssi_highthresh;
42
43 u32 fa_lowthresh;
44 u32 fa_highthresh;
45
46 long rssi_highpower_lowthresh;
47 long rssi_highpower_highthresh;
48
49 u8 dig_state;
50 u8 dig_highpwrstate;
51 u8 cur_sta_connectstate;
52 u8 pre_sta_connectstate;
53 u8 cur_ap_connectstate;
54 u8 pre_ap_connectstate;
55
56 u8 cur_pd_thstate;
57 u8 pre_pd_thstate;
58 u8 cur_cs_ratiostate;
59 u8 pre_cs_ratiostate;
60
61 u32 pre_igvalue;
62 u32 cur_igvalue;
63
64 u8 backoff_enable_flag;
65 char backoff_val;
66 char backoffval_range_max;
67 char backoffval_range_min;
68 u8 rx_gain_range_max;
69 u8 rx_gain_range_min;
70
71 long rssi_val;
72};
73
74enum dm_dig_alg { 32enum dm_dig_alg {
75 DIG_ALGO_BY_FALSE_ALARM = 0, 33 DIG_ALGO_BY_FALSE_ALARM = 0,
76 DIG_ALGO_BY_RSSI = 1, 34 DIG_ALGO_BY_RSSI = 1,
@@ -154,8 +112,6 @@ enum dm_ratr_sta {
154#define DM_DIG_BACKOFF_MAX 12 112#define DM_DIG_BACKOFF_MAX 12
155#define DM_DIG_BACKOFF_MIN -4 113#define DM_DIG_BACKOFF_MIN -4
156 114
157extern struct dig_t digtable;
158
159void rtl92s_dm_watchdog(struct ieee80211_hw *hw); 115void rtl92s_dm_watchdog(struct ieee80211_hw *hw);
160void rtl92s_dm_init(struct ieee80211_hw *hw); 116void rtl92s_dm_init(struct ieee80211_hw *hw);
161void rtl92s_dm_init_edca_turbo(struct ieee80211_hw *hw); 117void rtl92s_dm_init_edca_turbo(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
index 4a499928e4c6..8d7099bc472c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
@@ -1450,6 +1450,7 @@ static void _rtl92s_phy_set_fwcmd_io(struct ieee80211_hw *hw)
1450bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio) 1450bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
1451{ 1451{
1452 struct rtl_priv *rtlpriv = rtl_priv(hw); 1452 struct rtl_priv *rtlpriv = rtl_priv(hw);
1453 struct dig_t *digtable = &rtlpriv->dm_digtable;
1453 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1454 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1454 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1455 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1455 u32 fw_param = FW_CMD_IO_PARA_QUERY(rtlpriv); 1456 u32 fw_param = FW_CMD_IO_PARA_QUERY(rtlpriv);
@@ -1588,16 +1589,16 @@ bool rtl92s_phy_set_fw_cmd(struct ieee80211_hw *hw, enum fwcmd_iotype fw_cmdio)
1588 FW_SS_CTL); 1589 FW_SS_CTL);
1589 1590
1590 if (rtlpriv->dm.dm_flag & HAL_DM_DIG_DISABLE || 1591 if (rtlpriv->dm.dm_flag & HAL_DM_DIG_DISABLE ||
1591 !digtable.dig_enable_flag) 1592 !digtable->dig_enable_flag)
1592 fw_cmdmap &= ~FW_DIG_ENABLE_CTL; 1593 fw_cmdmap &= ~FW_DIG_ENABLE_CTL;
1593 1594
1594 if ((rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) || 1595 if ((rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) ||
1595 rtlpriv->dm.dynamic_txpower_enable) 1596 rtlpriv->dm.dynamic_txpower_enable)
1596 fw_cmdmap &= ~FW_HIGH_PWR_ENABLE_CTL; 1597 fw_cmdmap &= ~FW_HIGH_PWR_ENABLE_CTL;
1597 1598
1598 if ((digtable.dig_ext_port_stage == 1599 if ((digtable->dig_ext_port_stage ==
1599 DIG_EXT_PORT_STAGE_0) || 1600 DIG_EXT_PORT_STAGE_0) ||
1600 (digtable.dig_ext_port_stage == 1601 (digtable->dig_ext_port_stage ==
1601 DIG_EXT_PORT_STAGE_1)) 1602 DIG_EXT_PORT_STAGE_1))
1602 fw_cmdmap &= ~FW_DIG_ENABLE_CTL; 1603 fw_cmdmap &= ~FW_DIG_ENABLE_CTL;
1603 1604
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 521398803099..bd816aef26dc 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -1592,6 +1592,65 @@ struct rtl_debug {
1592 char proc_name[20]; 1592 char proc_name[20];
1593}; 1593};
1594 1594
1595struct ps_t {
1596 u8 pre_ccastate;
1597 u8 cur_ccasate;
1598 u8 pre_rfstate;
1599 u8 cur_rfstate;
1600 long rssi_val_min;
1601};
1602
1603struct dig_t {
1604 u32 rssi_lowthresh;
1605 u32 rssi_highthresh;
1606 u32 fa_lowthresh;
1607 u32 fa_highthresh;
1608 long last_min_undecorated_pwdb_for_dm;
1609 long rssi_highpower_lowthresh;
1610 long rssi_highpower_highthresh;
1611 u32 recover_cnt;
1612 u32 pre_igvalue;
1613 u32 cur_igvalue;
1614 long rssi_val;
1615 u8 dig_enable_flag;
1616 u8 dig_ext_port_stage;
1617 u8 dig_algorithm;
1618 u8 dig_twoport_algorithm;
1619 u8 dig_dbgmode;
1620 u8 dig_slgorithm_switch;
1621 u8 cursta_connectctate;
1622 u8 presta_connectstate;
1623 u8 curmultista_connectstate;
1624 char backoff_val;
1625 char backoff_val_range_max;
1626 char backoff_val_range_min;
1627 u8 rx_gain_range_max;
1628 u8 rx_gain_range_min;
1629 u8 min_undecorated_pwdb_for_dm;
1630 u8 rssi_val_min;
1631 u8 pre_cck_pd_state;
1632 u8 cur_cck_pd_state;
1633 u8 pre_cck_fa_state;
1634 u8 cur_cck_fa_state;
1635 u8 pre_ccastate;
1636 u8 cur_ccasate;
1637 u8 large_fa_hit;
1638 u8 forbidden_igi;
1639 u8 dig_state;
1640 u8 dig_highpwrstate;
1641 u8 cur_sta_connectstate;
1642 u8 pre_sta_connectstate;
1643 u8 cur_ap_connectstate;
1644 u8 pre_ap_connectstate;
1645 u8 cur_pd_thstate;
1646 u8 pre_pd_thstate;
1647 u8 cur_cs_ratiostate;
1648 u8 pre_cs_ratiostate;
1649 u8 backoff_enable_flag;
1650 char backoffval_range_max;
1651 char backoffval_range_min;
1652};
1653
1595struct rtl_priv { 1654struct rtl_priv {
1596 struct completion firmware_loading_complete; 1655 struct completion firmware_loading_complete;
1597 struct rtl_locks locks; 1656 struct rtl_locks locks;
@@ -1629,6 +1688,10 @@ struct rtl_priv {
1629 interface or hardware */ 1688 interface or hardware */
1630 unsigned long status; 1689 unsigned long status;
1631 1690
1691 /* tables for dm */
1692 struct dig_t dm_digtable;
1693 struct ps_t dm_pstable;
1694
1632 /* data buffer pointer for USB reads */ 1695 /* data buffer pointer for USB reads */
1633 __le32 *usb_data; 1696 __le32 *usb_data;
1634 int usb_data_index; 1697 int usb_data_index;