Error Trace
[Home]
Bug # 114
Show/hide error trace Error trace
/*Is true unsafe:*/ /*Number of usage points:2*/ /*Number of usages :2*/ /*Two examples:*/ /*_____________________*/ /*spin_lock(char *"_rf_ps_lock_of_rtl_locks")[1]*/ { return ; } { /*_____________________*/ 566 unsigned char ldvarg18; 567 unsigned int ldvarg11; 568 _Bool ldvarg51; 569 unsigned char ldvarg32; 570 unsigned int ldvarg7; 571 unsigned int ldvarg23; 572 u32 *ldvarg43; 573 enum nl80211_iftype ldvarg42; 574 enum radio_path ldvarg12; 575 u8 *ldvarg56; 576 unsigned int ldvarg50; 577 unsigned char ldvarg46; 578 struct ieee80211_rx_status *ldvarg1; 579 _Bool ldvarg37; 580 unsigned int ldvarg53; 581 unsigned char ldvarg29; 582 u32 *ldvarg44; 583 unsigned int ldvarg24; 584 unsigned int ldvarg35; 585 u8 *ldvarg0; 586 u8 *ldvarg38; 587 unsigned char ldvarg5; 588 _Bool ldvarg33; 589 enum rf_pwrstate ldvarg16; 590 unsigned int ldvarg6; 591 u8 *ldvarg48; 592 unsigned short ldvarg4; 593 unsigned char ldvarg14; 594 u8 *ldvarg34; 595 struct ieee80211_hdr *ldvarg28; 596 struct rtl_stats *ldvarg2; 597 _Bool ldvarg47; 598 unsigned char ldvarg39; 599 _Bool ldvarg20; 600 struct ieee80211_tx_info *ldvarg31; 601 enum led_ctl_mode ldvarg41; 602 unsigned char ldvarg3; 603 _Bool ldvarg49; 604 unsigned char ldvarg57; 605 enum radio_path ldvarg8; 606 unsigned int ldvarg13; 607 unsigned int ldvarg55; 608 unsigned int ldvarg36; 609 unsigned int ldvarg10; 610 u8 *ldvarg40; 611 struct rtl_stats ldvarg9; 612 _Bool ldvarg45; 613 u8 *ldvarg26; 614 struct rtl_tcb_desc *ldvarg27; 615 enum nl80211_channel_type ldvarg15; 616 u8 *ldvarg30; 617 _Bool ldvarg21; 618 unsigned int ldvarg54; 619 u8 *ldvarg17; 620 u8 *ldvarg25; 621 u8 *ldvarg22; 622 int ldvarg19; 623 unsigned char ldvarg52; 624 const struct pci_device_id *ldvarg58; 625 int tmp; 626 int tmp___0; 627 int tmp___1; 628 int tmp___2; 629 int tmp___3; 565 ldv_initialize() { /* Function call is skipped due to function is undefined */} 627 ldv_state_variable_6 = 0; 629 ldv_state_variable_3 = 1; 630 ldv_state_variable_7 = 0; 634 ldv_state_variable_2 = 1; 638 ldv_state_variable_1 = 1; 640 ldv_state_variable_4 = 1; 641 ref_cnt = 0; 642 ldv_state_variable_0 = 1; 643 ldv_state_variable_5 = 0; 644 ldv_58533:; 645 tmp = __VERIFIER_nondet_int() { /* Function call is skipped due to function is undefined */} 645 switch (tmp); 888 tmp___1 = __VERIFIER_nondet_int() { /* Function call is skipped due to function is undefined */} 888 switch (tmp___1); { 2288 struct rtl_priv *rtlpriv; 2289 struct rtl_ps_ctl *ppsc; 2290 enum rf_pwrstate e_rfpowerstate_toset; 2291 enum rf_pwrstate cur_rfstate; 2292 unsigned int u4tmp; 2293 _Bool b_actuallyset; 2294 int tmp; 2295 int tmp___0; 2296 long tmp___1; 2297 int tmp___2; 2298 int tmp___3; 2299 long tmp___4; 2288 struct rtl_priv *__CPAchecker_TMP_0 = (struct rtl_priv *)(hw->priv); 2288 rtlpriv = __CPAchecker_TMP_0; 2289 struct rtl_priv *__CPAchecker_TMP_1 = (struct rtl_priv *)(hw->priv); 2289 ppsc = &(__CPAchecker_TMP_1->psc); 2292 b_actuallyset = 0; 2297 int __CPAchecker_TMP_2 = (int)(ppsc->swrf_processing); { /*Change states for locks spin_lock(char *"_rf_ps_lock_of_rtl_locks")*/ 629 ldv_spin_lock(lock, (char *)"_rf_ps_lock_of_rtl_locks") { /* Function call is skipped due to function is undefined */} } 2301 int __CPAchecker_TMP_3 = (int)(ppsc->rfchange_inprogress); 2305 ppsc->rfchange_inprogress = 1; 2306 ldv_spin_unlock_204(&(rtlpriv->locks.rf_ps_lock)) { /* Function call is skipped due to function is undefined */} return ;; } return ;; }/*Without locks*/ { return ; } { 566 unsigned char ldvarg18; 567 unsigned int ldvarg11; 568 _Bool ldvarg51; 569 unsigned char ldvarg32; 570 unsigned int ldvarg7; 571 unsigned int ldvarg23; 572 u32 *ldvarg43; 573 enum nl80211_iftype ldvarg42; 574 enum radio_path ldvarg12; 575 u8 *ldvarg56; 576 unsigned int ldvarg50; 577 unsigned char ldvarg46; 578 struct ieee80211_rx_status *ldvarg1; 579 _Bool ldvarg37; 580 unsigned int ldvarg53; 581 unsigned char ldvarg29; 582 u32 *ldvarg44; 583 unsigned int ldvarg24; 584 unsigned int ldvarg35; 585 u8 *ldvarg0; 586 u8 *ldvarg38; 587 unsigned char ldvarg5; 588 _Bool ldvarg33; 589 enum rf_pwrstate ldvarg16; 590 unsigned int ldvarg6; 591 u8 *ldvarg48; 592 unsigned short ldvarg4; 593 unsigned char ldvarg14; 594 u8 *ldvarg34; 595 struct ieee80211_hdr *ldvarg28; 596 struct rtl_stats *ldvarg2; 597 _Bool ldvarg47; 598 unsigned char ldvarg39; 599 _Bool ldvarg20; 600 struct ieee80211_tx_info *ldvarg31; 601 enum led_ctl_mode ldvarg41; 602 unsigned char ldvarg3; 603 _Bool ldvarg49; 604 unsigned char ldvarg57; 605 enum radio_path ldvarg8; 606 unsigned int ldvarg13; 607 unsigned int ldvarg55; 608 unsigned int ldvarg36; 609 unsigned int ldvarg10; 610 u8 *ldvarg40; 611 struct rtl_stats ldvarg9; 612 _Bool ldvarg45; 613 u8 *ldvarg26; 614 struct rtl_tcb_desc *ldvarg27; 615 enum nl80211_channel_type ldvarg15; 616 u8 *ldvarg30; 617 _Bool ldvarg21; 618 unsigned int ldvarg54; 619 u8 *ldvarg17; 620 u8 *ldvarg25; 621 u8 *ldvarg22; 622 int ldvarg19; 623 unsigned char ldvarg52; 624 const struct pci_device_id *ldvarg58; 625 int tmp; 626 int tmp___0; 627 int tmp___1; 628 int tmp___2; 629 int tmp___3; 565 ldv_initialize() { /* Function call is skipped due to function is undefined */} 627 ldv_state_variable_6 = 0; 629 ldv_state_variable_3 = 1; 630 ldv_state_variable_7 = 0; 634 ldv_state_variable_2 = 1; 638 ldv_state_variable_1 = 1; 640 ldv_state_variable_4 = 1; 641 ref_cnt = 0; 642 ldv_state_variable_0 = 1; 643 ldv_state_variable_5 = 0; 644 ldv_58533:; 645 tmp = __VERIFIER_nondet_int() { /* Function call is skipped due to function is undefined */} 645 switch (tmp); 888 tmp___1 = __VERIFIER_nondet_int() { /* Function call is skipped due to function is undefined */} 888 switch (tmp___1); { 1781 struct rtl_priv *rtlpriv; 1782 struct rtl_ps_ctl *ppsc; 1783 _Bool fw_current_inpsmode; 1784 _Bool fw_ps_awake; 1781 struct rtl_priv *__CPAchecker_TMP_0 = (struct rtl_priv *)(hw->priv); 1781 rtlpriv = __CPAchecker_TMP_0; 1782 struct rtl_priv *__CPAchecker_TMP_1 = (struct rtl_priv *)(hw->priv); 1782 ppsc = &(__CPAchecker_TMP_1->psc); 1783 fw_current_inpsmode = 0; 1784 fw_ps_awake = 1; 1786 (*(rtlpriv->cfg->ops->get_hw_reg))(hw, 65, (u8 *)(&fw_current_inpsmode)); 1788 (*(rtlpriv->cfg->ops->get_hw_reg))(hw, 86, (u8 *)(&fw_ps_awake)); 1793 unsigned int __CPAchecker_TMP_2 = (unsigned int)(ppsc->rfpwr_state); return ;; } return ;; } | Source code 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../base.h"
28 #include "../pci.h"
29 #include "../core.h"
30 #include "reg.h"
31 #include "def.h"
32 #include "phy.h"
33 #include "dm.h"
34 #include "fw.h"
35 #include "trx.h"
36
37 static const u32 ofdmswing_table[OFDM_TABLE_SIZE] = {
38 0x7f8001fe, /* 0, +6.0dB */
39 0x788001e2, /* 1, +5.5dB */
40 0x71c001c7, /* 2, +5.0dB */
41 0x6b8001ae, /* 3, +4.5dB */
42 0x65400195, /* 4, +4.0dB */
43 0x5fc0017f, /* 5, +3.5dB */
44 0x5a400169, /* 6, +3.0dB */
45 0x55400155, /* 7, +2.5dB */
46 0x50800142, /* 8, +2.0dB */
47 0x4c000130, /* 9, +1.5dB */
48 0x47c0011f, /* 10, +1.0dB */
49 0x43c0010f, /* 11, +0.5dB */
50 0x40000100, /* 12, +0dB */
51 0x3c8000f2, /* 13, -0.5dB */
52 0x390000e4, /* 14, -1.0dB */
53 0x35c000d7, /* 15, -1.5dB */
54 0x32c000cb, /* 16, -2.0dB */
55 0x300000c0, /* 17, -2.5dB */
56 0x2d4000b5, /* 18, -3.0dB */
57 0x2ac000ab, /* 19, -3.5dB */
58 0x288000a2, /* 20, -4.0dB */
59 0x26000098, /* 21, -4.5dB */
60 0x24000090, /* 22, -5.0dB */
61 0x22000088, /* 23, -5.5dB */
62 0x20000080, /* 24, -6.0dB */
63 0x1e400079, /* 25, -6.5dB */
64 0x1c800072, /* 26, -7.0dB */
65 0x1b00006c, /* 27. -7.5dB */
66 0x19800066, /* 28, -8.0dB */
67 0x18000060, /* 29, -8.5dB */
68 0x16c0005b, /* 30, -9.0dB */
69 0x15800056, /* 31, -9.5dB */
70 0x14400051, /* 32, -10.0dB */
71 0x1300004c, /* 33, -10.5dB */
72 0x12000048, /* 34, -11.0dB */
73 0x11000044, /* 35, -11.5dB */
74 0x10000040, /* 36, -12.0dB */
75 0x0f00003c, /* 37, -12.5dB */
76 0x0e400039, /* 38, -13.0dB */
77 0x0d800036, /* 39, -13.5dB */
78 0x0cc00033, /* 40, -14.0dB */
79 0x0c000030, /* 41, -14.5dB */
80 0x0b40002d, /* 42, -15.0dB */
81 };
82
83 static const u8 cck_tbl_ch1_13[CCK_TABLE_SIZE][8] = {
84 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0dB */
85 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 1, -0.5dB */
86 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 2, -1.0dB */
87 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 3, -1.5dB */
88 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 4, -2.0dB */
89 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 5, -2.5dB */
90 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 6, -3.0dB */
91 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 7, -3.5dB */
92 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 8, -4.0dB */
93 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 9, -4.5dB */
94 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 10, -5.0dB */
95 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 11, -5.5dB */
96 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 12, -6.0dB */
97 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 13, -6.5dB */
98 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 14, -7.0dB */
99 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 15, -7.5dB */
100 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
101 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 17, -8.5dB */
102 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 18, -9.0dB */
103 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 19, -9.5dB */
104 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 20, -10.0dB*/
105 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 21, -10.5dB*/
106 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 22, -11.0dB*/
107 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 23, -11.5dB*/
108 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 24, -12.0dB*/
109 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 25, -12.5dB*/
110 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 26, -13.0dB*/
111 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 27, -13.5dB*/
112 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 28, -14.0dB*/
113 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 29, -14.5dB*/
114 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 30, -15.0dB*/
115 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 31, -15.5dB*/
116 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} /* 32, -16.0dB*/
117 };
118
119 static const u8 cck_tbl_ch14[CCK_TABLE_SIZE][8] = {
120 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0dB */
121 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 1, -0.5dB */
122 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 2, -1.0dB */
123 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 3, -1.5dB */
124 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 4, -2.0dB */
125 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 5, -2.5dB */
126 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 6, -3.0dB */
127 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 7, -3.5dB */
128 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 8, -4.0dB */
129 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 9, -4.5dB */
130 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 10, -5.0dB */
131 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 11, -5.5dB */
132 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 12, -6.0dB */
133 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 13, -6.5dB */
134 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 14, -7.0dB */
135 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 15, -7.5dB */
136 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
137 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 17, -8.5dB */
138 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 18, -9.0dB */
139 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 19, -9.5dB */
140 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 20, -10.0dB*/
141 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 21, -10.5dB*/
142 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 22, -11.0dB*/
143 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 23, -11.5dB*/
144 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 24, -12.0dB*/
145 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 25, -12.5dB*/
146 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 26, -13.0dB*/
147 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 27, -13.5dB*/
148 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 28, -14.0dB*/
149 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 29, -14.5dB*/
150 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 30, -15.0dB*/
151 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 31, -15.5dB*/
152 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} /* 32, -16.0dB*/
153 };
154
155 #define CAL_SWING_OFF(_off, _dir, _size, _del) \
156 do { \
157 for (_off = 0; _off < _size; _off++) { \
158 if (_del < thermal_threshold[_dir][_off]) { \
159 if (_off != 0) \
160 _off--; \
161 break; \
162 } \
163 } \
164 if (_off >= _size) \
165 _off = _size - 1; \
166 } while (0)
167
168 static void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
169 u8 ofdm_index, u8 rfpath,
170 long iqk_result_x, long iqk_result_y)
171 {
172 long ele_a = 0, ele_d, ele_c = 0, value32;
173
174 ele_d = (ofdmswing_table[ofdm_index] & 0xFFC00000)>>22;
175
176 if (iqk_result_x != 0) {
177 if ((iqk_result_x & 0x00000200) != 0)
178 iqk_result_x = iqk_result_x | 0xFFFFFC00;
179 ele_a = ((iqk_result_x * ele_d)>>8)&0x000003FF;
180
181 if ((iqk_result_y & 0x00000200) != 0)
182 iqk_result_y = iqk_result_y | 0xFFFFFC00;
183 ele_c = ((iqk_result_y * ele_d)>>8)&0x000003FF;
184
185 switch (rfpath) {
186 case RF90_PATH_A:
187 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
188 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
189 MASKDWORD, value32);
190 value32 = (ele_c & 0x000003C0) >> 6;
191 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
192 value32);
193 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
194 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
195 value32);
196 break;
197 case RF90_PATH_B:
198 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
199 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
200 value32);
201 value32 = (ele_c & 0x000003C0) >> 6;
202 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, value32);
203 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
204 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
205 value32);
206 break;
207 default:
208 break;
209 }
210 } else {
211 switch (rfpath) {
212 case RF90_PATH_A:
213 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
214 MASKDWORD, ofdmswing_table[ofdm_index]);
215 rtl_set_bbreg(hw, ROFDM0_XCTXAFE,
216 MASKH4BITS, 0x00);
217 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
218 BIT(24), 0x00);
219 break;
220 case RF90_PATH_B:
221 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
222 MASKDWORD, ofdmswing_table[ofdm_index]);
223 rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
224 MASKH4BITS, 0x00);
225 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
226 BIT(28), 0x00);
227 break;
228 default:
229 break;
230 }
231 }
232 }
233
234 void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
235 u8 type, u8 *pdirection, u32 *poutwrite_val)
236 {
237 struct rtl_priv *rtlpriv = rtl_priv(hw);
238 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
239 u8 pwr_val = 0;
240 u8 cck_base = rtldm->swing_idx_cck_base;
241 u8 cck_val = rtldm->swing_idx_cck;
242 u8 ofdm_base = rtldm->swing_idx_ofdm_base[0];
243 u8 ofdm_val = rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A];
244
245 if (type == 0) {
246 if (ofdm_val <= ofdm_base) {
247 *pdirection = 1;
248 pwr_val = ofdm_base - ofdm_val;
249 } else {
250 *pdirection = 2;
251 pwr_val = ofdm_base - ofdm_val;
252 }
253 } else if (type == 1) {
254 if (cck_val <= cck_base) {
255 *pdirection = 1;
256 pwr_val = cck_base - cck_val;
257 } else {
258 *pdirection = 2;
259 pwr_val = cck_val - cck_base;
260 }
261 }
262
263 if (pwr_val >= TXPWRTRACK_MAX_IDX && (*pdirection == 1))
264 pwr_val = TXPWRTRACK_MAX_IDX;
265
266 *poutwrite_val = pwr_val | (pwr_val << 8) | (pwr_val << 16) |
267 (pwr_val << 24);
268 }
269
270 static void dm_tx_pwr_track_set_pwr(struct ieee80211_hw *hw,
271 enum pwr_track_control_method method,
272 u8 rfpath, u8 channel_mapped_index)
273 {
274 struct rtl_priv *rtlpriv = rtl_priv(hw);
275 struct rtl_phy *rtlphy = &rtlpriv->phy;
276 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
277
278 if (method == TXAGC) {
279 if (rtldm->swing_flag_ofdm ||
280 rtldm->swing_flag_cck) {
281 rtl88e_phy_set_txpower_level(hw,
282 rtlphy->current_channel);
283 rtldm->swing_flag_ofdm = false;
284 rtldm->swing_flag_cck = false;
285 }
286 } else if (method == BBSWING) {
287 if (!rtldm->cck_inch14) {
288 rtl_write_byte(rtlpriv, 0xa22,
289 cck_tbl_ch1_13[rtldm->swing_idx_cck][0]);
290 rtl_write_byte(rtlpriv, 0xa23,
291 cck_tbl_ch1_13[rtldm->swing_idx_cck][1]);
292 rtl_write_byte(rtlpriv, 0xa24,
293 cck_tbl_ch1_13[rtldm->swing_idx_cck][2]);
294 rtl_write_byte(rtlpriv, 0xa25,
295 cck_tbl_ch1_13[rtldm->swing_idx_cck][3]);
296 rtl_write_byte(rtlpriv, 0xa26,
297 cck_tbl_ch1_13[rtldm->swing_idx_cck][4]);
298 rtl_write_byte(rtlpriv, 0xa27,
299 cck_tbl_ch1_13[rtldm->swing_idx_cck][5]);
300 rtl_write_byte(rtlpriv, 0xa28,
301 cck_tbl_ch1_13[rtldm->swing_idx_cck][6]);
302 rtl_write_byte(rtlpriv, 0xa29,
303 cck_tbl_ch1_13[rtldm->swing_idx_cck][7]);
304 } else {
305 rtl_write_byte(rtlpriv, 0xa22,
306 cck_tbl_ch14[rtldm->swing_idx_cck][0]);
307 rtl_write_byte(rtlpriv, 0xa23,
308 cck_tbl_ch14[rtldm->swing_idx_cck][1]);
309 rtl_write_byte(rtlpriv, 0xa24,
310 cck_tbl_ch14[rtldm->swing_idx_cck][2]);
311 rtl_write_byte(rtlpriv, 0xa25,
312 cck_tbl_ch14[rtldm->swing_idx_cck][3]);
313 rtl_write_byte(rtlpriv, 0xa26,
314 cck_tbl_ch14[rtldm->swing_idx_cck][4]);
315 rtl_write_byte(rtlpriv, 0xa27,
316 cck_tbl_ch14[rtldm->swing_idx_cck][5]);
317 rtl_write_byte(rtlpriv, 0xa28,
318 cck_tbl_ch14[rtldm->swing_idx_cck][6]);
319 rtl_write_byte(rtlpriv, 0xa29,
320 cck_tbl_ch14[rtldm->swing_idx_cck][7]);
321 }
322
323 if (rfpath == RF90_PATH_A) {
324 rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
325 rfpath, rtlphy->iqk_matrix
326 [channel_mapped_index].
327 value[0][0],
328 rtlphy->iqk_matrix
329 [channel_mapped_index].
330 value[0][1]);
331 } else if (rfpath == RF90_PATH_B) {
332 rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
333 rfpath, rtlphy->iqk_matrix
334 [channel_mapped_index].
335 value[0][4],
336 rtlphy->iqk_matrix
337 [channel_mapped_index].
338 value[0][5]);
339 }
340 } else {
341 return;
342 }
343 }
344
345 static u8 rtl88e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
346 {
347 struct rtl_priv *rtlpriv = rtl_priv(hw);
348 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
349 long rssi_val_min = 0;
350
351 if ((dm_dig->curmultista_cstate == DIG_MULTISTA_CONNECT) &&
352 (dm_dig->cur_sta_cstate == DIG_STA_CONNECT)) {
353 if (rtlpriv->dm.entry_min_undec_sm_pwdb != 0)
354 rssi_val_min =
355 (rtlpriv->dm.entry_min_undec_sm_pwdb >
356 rtlpriv->dm.undec_sm_pwdb) ?
357 rtlpriv->dm.undec_sm_pwdb :
358 rtlpriv->dm.entry_min_undec_sm_pwdb;
359 else
360 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
361 } else if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT ||
362 dm_dig->cur_sta_cstate == DIG_STA_BEFORE_CONNECT) {
363 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
364 } else if (dm_dig->curmultista_cstate ==
365 DIG_MULTISTA_CONNECT) {
366 rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
367 }
368
369 return (u8)rssi_val_min;
370 }
371
372 static void rtl88e_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
373 {
374 u32 ret_value;
375 struct rtl_priv *rtlpriv = rtl_priv(hw);
376 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
377
378 rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 1);
379 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 1);
380
381 ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD);
382 falsealm_cnt->cnt_fast_fsync_fail = (ret_value&0xffff);
383 falsealm_cnt->cnt_sb_search_fail = ((ret_value&0xffff0000)>>16);
384
385 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER1, MASKDWORD);
386 falsealm_cnt->cnt_ofdm_cca = (ret_value&0xffff);
387 falsealm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
388
389 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER2, MASKDWORD);
390 falsealm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
391 falsealm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
392
393 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
394 falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
395 falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
396 falsealm_cnt->cnt_rate_illegal +
397 falsealm_cnt->cnt_crc8_fail +
398 falsealm_cnt->cnt_mcs_fail +
399 falsealm_cnt->cnt_fast_fsync_fail +
400 falsealm_cnt->cnt_sb_search_fail;
401
402 ret_value = rtl_get_bbreg(hw, REG_SC_CNT, MASKDWORD);
403 falsealm_cnt->cnt_bw_lsc = (ret_value & 0xffff);
404 falsealm_cnt->cnt_bw_usc = ((ret_value & 0xffff0000) >> 16);
405
406 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(12), 1);
407 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
408
409 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
410 falsealm_cnt->cnt_cck_fail = ret_value;
411
412 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERUPPER, MASKBYTE3);
413 falsealm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;
414
415 ret_value = rtl_get_bbreg(hw, RCCK0_CCA_CNT, MASKDWORD);
416 falsealm_cnt->cnt_cck_cca = ((ret_value & 0xff) << 8) |
417 ((ret_value&0xFF00)>>8);
418
419 falsealm_cnt->cnt_all = (falsealm_cnt->cnt_fast_fsync_fail +
420 falsealm_cnt->cnt_sb_search_fail +
421 falsealm_cnt->cnt_parity_fail +
422 falsealm_cnt->cnt_rate_illegal +
423 falsealm_cnt->cnt_crc8_fail +
424 falsealm_cnt->cnt_mcs_fail +
425 falsealm_cnt->cnt_cck_fail);
426 falsealm_cnt->cnt_cca_all = falsealm_cnt->cnt_ofdm_cca +
427 falsealm_cnt->cnt_cck_cca;
428
429 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 1);
430 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 0);
431 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(27), 1);
432 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(27), 0);
433 rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 0);
434 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 0);
435 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(13)|BIT(12), 0);
436 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(13)|BIT(12), 2);
437 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 0);
438 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 2);
439
440 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
441 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
442 falsealm_cnt->cnt_parity_fail,
443 falsealm_cnt->cnt_rate_illegal,
444 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
445
446 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
447 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
448 falsealm_cnt->cnt_ofdm_fail,
449 falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
450 }
451
452 static void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
453 {
454 struct rtl_priv *rtlpriv = rtl_priv(hw);
455 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
456 u8 cur_cck_cca_thresh;
457
458 if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
459 dm_dig->rssi_val_min = rtl88e_dm_initial_gain_min_pwdb(hw);
460 if (dm_dig->rssi_val_min > 25) {
461 cur_cck_cca_thresh = 0xcd;
462 } else if ((dm_dig->rssi_val_min <= 25) &&
463 (dm_dig->rssi_val_min > 10)) {
464 cur_cck_cca_thresh = 0x83;
465 } else {
466 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
467 cur_cck_cca_thresh = 0x83;
468 else
469 cur_cck_cca_thresh = 0x40;
470 }
471
472 } else {
473 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
474 cur_cck_cca_thresh = 0x83;
475 else
476 cur_cck_cca_thresh = 0x40;
477 }
478
479 if (dm_dig->cur_cck_cca_thres != cur_cck_cca_thresh)
480 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, cur_cck_cca_thresh);
481
482 dm_dig->cur_cck_cca_thres = cur_cck_cca_thresh;
483 dm_dig->pre_cck_cca_thres = dm_dig->cur_cck_cca_thres;
484 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
485 "CCK cca thresh hold =%x\n", dm_dig->cur_cck_cca_thres);
486 }
487
488 static void rtl88e_dm_dig(struct ieee80211_hw *hw)
489 {
490 struct rtl_priv *rtlpriv = rtl_priv(hw);
491 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
492 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
493 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
494 u8 dig_dynamic_min, dig_maxofmin;
495 bool bfirstconnect;
496 u8 dm_dig_max, dm_dig_min;
497 u8 current_igi = dm_dig->cur_igvalue;
498
499 if (rtlpriv->dm.dm_initialgain_enable == false)
500 return;
501 if (dm_dig->dig_enable_flag == false)
502 return;
503 if (mac->act_scanning == true)
504 return;
505
506 if (mac->link_state >= MAC80211_LINKED)
507 dm_dig->cur_sta_cstate = DIG_STA_CONNECT;
508 else
509 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
510 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
511 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
512 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
513
514 dm_dig_max = DM_DIG_MAX;
515 dm_dig_min = DM_DIG_MIN;
516 dig_maxofmin = DM_DIG_MAX_AP;
517 dig_dynamic_min = dm_dig->dig_min_0;
518 bfirstconnect = ((mac->link_state >= MAC80211_LINKED) ? true : false) &&
519 !dm_dig->media_connect_0;
520
521 dm_dig->rssi_val_min =
522 rtl88e_dm_initial_gain_min_pwdb(hw);
523
524 if (mac->link_state >= MAC80211_LINKED) {
525 if ((dm_dig->rssi_val_min + 20) > dm_dig_max)
526 dm_dig->rx_gain_max = dm_dig_max;
527 else if ((dm_dig->rssi_val_min + 20) < dm_dig_min)
528 dm_dig->rx_gain_max = dm_dig_min;
529 else
530 dm_dig->rx_gain_max = dm_dig->rssi_val_min + 20;
531
532 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
533 dig_dynamic_min = dm_dig->antdiv_rssi_max;
534 } else {
535 if (dm_dig->rssi_val_min < dm_dig_min)
536 dig_dynamic_min = dm_dig_min;
537 else if (dm_dig->rssi_val_min < dig_maxofmin)
538 dig_dynamic_min = dig_maxofmin;
539 else
540 dig_dynamic_min = dm_dig->rssi_val_min;
541 }
542 } else {
543 dm_dig->rx_gain_max = dm_dig_max;
544 dig_dynamic_min = dm_dig_min;
545 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
546 }
547
548 if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
549 dm_dig->large_fa_hit++;
550 if (dm_dig->forbidden_igi < current_igi) {
551 dm_dig->forbidden_igi = current_igi;
552 dm_dig->large_fa_hit = 1;
553 }
554
555 if (dm_dig->large_fa_hit >= 3) {
556 if ((dm_dig->forbidden_igi + 1) >
557 dm_dig->rx_gain_max)
558 dm_dig->rx_gain_min =
559 dm_dig->rx_gain_max;
560 else
561 dm_dig->rx_gain_min =
562 dm_dig->forbidden_igi + 1;
563 dm_dig->recover_cnt = 3600;
564 }
565 } else {
566 if (dm_dig->recover_cnt != 0) {
567 dm_dig->recover_cnt--;
568 } else {
569 if (dm_dig->large_fa_hit == 0) {
570 if ((dm_dig->forbidden_igi - 1) <
571 dig_dynamic_min) {
572 dm_dig->forbidden_igi = dig_dynamic_min;
573 dm_dig->rx_gain_min = dig_dynamic_min;
574 } else {
575 dm_dig->forbidden_igi--;
576 dm_dig->rx_gain_min =
577 dm_dig->forbidden_igi + 1;
578 }
579 } else if (dm_dig->large_fa_hit == 3) {
580 dm_dig->large_fa_hit = 0;
581 }
582 }
583 }
584
585 if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
586 if (bfirstconnect) {
587 current_igi = dm_dig->rssi_val_min;
588 } else {
589 if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH2)
590 current_igi += 2;
591 else if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH1)
592 current_igi++;
593 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
594 current_igi--;
595 }
596 } else {
597 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
598 current_igi += 2;
599 else if (rtlpriv->falsealm_cnt.cnt_all > 8000)
600 current_igi++;
601 else if (rtlpriv->falsealm_cnt.cnt_all < 500)
602 current_igi--;
603 }
604
605 if (current_igi > DM_DIG_FA_UPPER)
606 current_igi = DM_DIG_FA_UPPER;
607 else if (current_igi < DM_DIG_FA_LOWER)
608 current_igi = DM_DIG_FA_LOWER;
609
610 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
611 current_igi = DM_DIG_FA_UPPER;
612
613 dm_dig->cur_igvalue = current_igi;
614 rtl88e_dm_write_dig(hw);
615 dm_dig->media_connect_0 =
616 ((mac->link_state >= MAC80211_LINKED) ? true : false);
617 dm_dig->dig_min_0 = dig_dynamic_min;
618
619 rtl88e_dm_cck_packet_detection_thresh(hw);
620 }
621
622 static void rtl88e_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
623 {
624 struct rtl_priv *rtlpriv = rtl_priv(hw);
625
626 rtlpriv->dm.dynamic_txpower_enable = false;
627
628 rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
629 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
630 }
631
632 static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
633 {
634 struct rtl_priv *rtlpriv = rtl_priv(hw);
635 struct rtl_phy *rtlphy = &rtlpriv->phy;
636 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
637 long undec_sm_pwdb;
638
639 if (!rtlpriv->dm.dynamic_txpower_enable)
640 return;
641
642 if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) {
643 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
644 return;
645 }
646
647 if ((mac->link_state < MAC80211_LINKED) &&
648 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
649 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
650 "Not connected to any\n");
651
652 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
653
654 rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
655 return;
656 }
657
658 if (mac->link_state >= MAC80211_LINKED) {
659 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
660 undec_sm_pwdb =
661 rtlpriv->dm.entry_min_undec_sm_pwdb;
662 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
663 "AP Client PWDB = 0x%lx\n",
664 undec_sm_pwdb);
665 } else {
666 undec_sm_pwdb =
667 rtlpriv->dm.undec_sm_pwdb;
668 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
669 "STA Default Port PWDB = 0x%lx\n",
670 undec_sm_pwdb);
671 }
672 } else {
673 undec_sm_pwdb =
674 rtlpriv->dm.entry_min_undec_sm_pwdb;
675
676 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
677 "AP Ext Port PWDB = 0x%lx\n",
678 undec_sm_pwdb);
679 }
680
681 if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
682 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
683 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
684 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x0)\n");
685 } else if ((undec_sm_pwdb <
686 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
687 (undec_sm_pwdb >=
688 TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
689 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
690 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
691 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x10)\n");
692 } else if (undec_sm_pwdb <
693 (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
694 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
695 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
696 "TXHIGHPWRLEVEL_NORMAL\n");
697 }
698
699 if ((rtlpriv->dm.dynamic_txhighpower_lvl !=
700 rtlpriv->dm.last_dtp_lvl)) {
701 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
702 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
703 rtlphy->current_channel);
704 rtl88e_phy_set_txpower_level(hw, rtlphy->current_channel);
705 }
706
707 rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
708 }
709
710 void rtl88e_dm_write_dig(struct ieee80211_hw *hw)
711 {
712 struct rtl_priv *rtlpriv = rtl_priv(hw);
713 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
714
715 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
716 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
717 dm_dig->cur_igvalue, dm_dig->pre_igvalue,
718 dm_dig->back_val);
719
720 if (dm_dig->cur_igvalue > 0x3f)
721 dm_dig->cur_igvalue = 0x3f;
722 if (dm_dig->pre_igvalue != dm_dig->cur_igvalue) {
723 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
724 dm_dig->cur_igvalue);
725
726 dm_dig->pre_igvalue = dm_dig->cur_igvalue;
727 }
728 }
729
730 static void rtl88e_dm_pwdb_monitor(struct ieee80211_hw *hw)
731 {
732 struct rtl_priv *rtlpriv = rtl_priv(hw);
733 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
734 struct rtl_sta_info *drv_priv;
735 static u64 last_record_txok_cnt;
736 static u64 last_record_rxok_cnt;
737 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
738
739 if (rtlhal->oem_id == RT_CID_819X_HP) {
740 u64 cur_txok_cnt = 0;
741 u64 cur_rxok_cnt = 0;
742 cur_txok_cnt = rtlpriv->stats.txbytesunicast -
743 last_record_txok_cnt;
744 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast -
745 last_record_rxok_cnt;
746 last_record_txok_cnt = cur_txok_cnt;
747 last_record_rxok_cnt = cur_rxok_cnt;
748
749 if (cur_rxok_cnt > (cur_txok_cnt * 6))
750 rtl_write_dword(rtlpriv, REG_ARFR0, 0x8f015);
751 else
752 rtl_write_dword(rtlpriv, REG_ARFR0, 0xff015);
753 }
754
755 /* AP & ADHOC & MESH */
756 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
757 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
758 if (drv_priv->rssi_stat.undec_sm_pwdb <
759 tmp_entry_min_pwdb)
760 tmp_entry_min_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
761 if (drv_priv->rssi_stat.undec_sm_pwdb >
762 tmp_entry_max_pwdb)
763 tmp_entry_max_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
764 }
765 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
766
767 /* If associated entry is found */
768 if (tmp_entry_max_pwdb != 0) {
769 rtlpriv->dm.entry_max_undec_sm_pwdb = tmp_entry_max_pwdb;
770 RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMaxPWDB = 0x%lx(%ld)\n",
771 tmp_entry_max_pwdb, tmp_entry_max_pwdb);
772 } else {
773 rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
774 }
775 /* If associated entry is found */
776 if (tmp_entry_min_pwdb != 0xff) {
777 rtlpriv->dm.entry_min_undec_sm_pwdb = tmp_entry_min_pwdb;
778 RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMinPWDB = 0x%lx(%ld)\n",
779 tmp_entry_min_pwdb, tmp_entry_min_pwdb);
780 } else {
781 rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
782 }
783 /* Indicate Rx signal strength to FW. */
784 if (rtlpriv->dm.useramask) {
785 u8 h2c_parameter[3] = { 0 };
786
787 h2c_parameter[2] = (u8)(rtlpriv->dm.undec_sm_pwdb & 0xFF);
788 h2c_parameter[0] = 0x20;
789 } else {
790 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb);
791 }
792 }
793
794 void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw)
795 {
796 struct rtl_priv *rtlpriv = rtl_priv(hw);
797
798 rtlpriv->dm.current_turbo_edca = false;
799 rtlpriv->dm.is_any_nonbepkts = false;
800 rtlpriv->dm.is_cur_rdlstate = false;
801 }
802
803 static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
804 {
805 struct rtl_priv *rtlpriv = rtl_priv(hw);
806 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
807 static u64 last_txok_cnt;
808 static u64 last_rxok_cnt;
809 static u32 last_bt_edca_ul;
810 static u32 last_bt_edca_dl;
811 u64 cur_txok_cnt = 0;
812 u64 cur_rxok_cnt = 0;
813 u32 edca_be_ul = 0x5ea42b;
814 u32 edca_be_dl = 0x5ea42b;
815 bool bt_change_edca = false;
816
817 if ((last_bt_edca_ul != rtlpriv->btcoexist.bt_edca_ul) ||
818 (last_bt_edca_dl != rtlpriv->btcoexist.bt_edca_dl)) {
819 rtlpriv->dm.current_turbo_edca = false;
820 last_bt_edca_ul = rtlpriv->btcoexist.bt_edca_ul;
821 last_bt_edca_dl = rtlpriv->btcoexist.bt_edca_dl;
822 }
823
824 if (rtlpriv->btcoexist.bt_edca_ul != 0) {
825 edca_be_ul = rtlpriv->btcoexist.bt_edca_ul;
826 bt_change_edca = true;
827 }
828
829 if (rtlpriv->btcoexist.bt_edca_dl != 0) {
830 edca_be_ul = rtlpriv->btcoexist.bt_edca_dl;
831 bt_change_edca = true;
832 }
833
834 if (mac->link_state != MAC80211_LINKED) {
835 rtlpriv->dm.current_turbo_edca = false;
836 return;
837 }
838 if ((bt_change_edca) ||
839 ((!rtlpriv->dm.is_any_nonbepkts) &&
840 (!rtlpriv->dm.disable_framebursting))) {
841
842 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
843 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
844
845 if (cur_rxok_cnt > 4 * cur_txok_cnt) {
846 if (!rtlpriv->dm.is_cur_rdlstate ||
847 !rtlpriv->dm.current_turbo_edca) {
848 rtl_write_dword(rtlpriv,
849 REG_EDCA_BE_PARAM,
850 edca_be_dl);
851 rtlpriv->dm.is_cur_rdlstate = true;
852 }
853 } else {
854 if (rtlpriv->dm.is_cur_rdlstate ||
855 !rtlpriv->dm.current_turbo_edca) {
856 rtl_write_dword(rtlpriv,
857 REG_EDCA_BE_PARAM,
858 edca_be_ul);
859 rtlpriv->dm.is_cur_rdlstate = false;
860 }
861 }
862 rtlpriv->dm.current_turbo_edca = true;
863 } else {
864 if (rtlpriv->dm.current_turbo_edca) {
865 u8 tmp = AC0_BE;
866
867 rtlpriv->cfg->ops->set_hw_reg(hw,
868 HW_VAR_AC_PARAM,
869 &tmp);
870 rtlpriv->dm.current_turbo_edca = false;
871 }
872 }
873
874 rtlpriv->dm.is_any_nonbepkts = false;
875 last_txok_cnt = rtlpriv->stats.txbytesunicast;
876 last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
877 }
878
879 static void dm_txpower_track_cb_therm(struct ieee80211_hw *hw)
880 {
881 struct rtl_priv *rtlpriv = rtl_priv(hw);
882 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
883 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
884 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
885 u8 thermalvalue = 0, delta, delta_lck, delta_iqk, offset;
886 u8 thermalvalue_avg_count = 0;
887 u32 thermalvalue_avg = 0;
888 long ele_d, temp_cck;
889 char ofdm_index[2], cck_index = 0,
890 ofdm_index_old[2] = {0, 0}, cck_index_old = 0;
891 int i = 0;
892 /*bool is2t = false;*/
893
894 u8 ofdm_min_index = 6, rf = 1;
895 /*u8 index_for_channel;*/
896 enum _power_dec_inc {power_dec, power_inc};
897
898 /*0.1 the following TWO tables decide the
899 *final index of OFDM/CCK swing table
900 */
901 char delta_swing_table_idx[2][15] = {
902 {0, 0, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11},
903 {0, 0, -1, -2, -3, -4, -4, -4, -4, -5, -7, -8, -9, -9, -10}
904 };
905 u8 thermal_threshold[2][15] = {
906 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27},
907 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 25, 25}
908 };
909
910 /*Initilization (7 steps in total) */
911 rtlpriv->dm.txpower_trackinginit = true;
912 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
913 "dm_txpower_track_cb_therm\n");
914
915 thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER,
916 0xfc00);
917 if (!thermalvalue)
918 return;
919 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
920 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
921 thermalvalue, rtlpriv->dm.thermalvalue,
922 rtlefuse->eeprom_thermalmeter);
923
924 /*1. Query OFDM Default Setting: Path A*/
925 ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD) &
926 MASKOFDM_D;
927 for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
928 if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
929 ofdm_index_old[0] = (u8)i;
930 rtldm->swing_idx_ofdm_base[RF90_PATH_A] = (u8)i;
931 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
932 "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index = 0x%x\n",
933 ROFDM0_XATXIQIMBALANCE,
934 ele_d, ofdm_index_old[0]);
935 break;
936 }
937 }
938
939 /*2.Query CCK default setting From 0xa24*/
940 temp_cck = rtl_get_bbreg(hw, RCCK0_TXFILTER2, MASKDWORD) & MASKCCK;
941 for (i = 0; i < CCK_TABLE_LENGTH; i++) {
942 if (rtlpriv->dm.cck_inch14) {
943 if (memcmp(&temp_cck, &cck_tbl_ch14[i][2], 4) == 0) {
944 cck_index_old = (u8)i;
945 rtldm->swing_idx_cck_base = (u8)i;
946 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
947 DBG_LOUD,
948 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch 14 %d\n",
949 RCCK0_TXFILTER2, temp_cck,
950 cck_index_old,
951 rtlpriv->dm.cck_inch14);
952 break;
953 }
954 } else {
955 if (memcmp(&temp_cck, &cck_tbl_ch1_13[i][2], 4) == 0) {
956 cck_index_old = (u8)i;
957 rtldm->swing_idx_cck_base = (u8)i;
958 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
959 DBG_LOUD,
960 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
961 RCCK0_TXFILTER2, temp_cck,
962 cck_index_old,
963 rtlpriv->dm.cck_inch14);
964 break;
965 }
966 }
967 }
968
969 /*3 Initialize ThermalValues of RFCalibrateInfo*/
970 if (!rtldm->thermalvalue) {
971 rtlpriv->dm.thermalvalue = rtlefuse->eeprom_thermalmeter;
972 rtlpriv->dm.thermalvalue_lck = thermalvalue;
973 rtlpriv->dm.thermalvalue_iqk = thermalvalue;
974 for (i = 0; i < rf; i++)
975 rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
976 rtlpriv->dm.cck_index = cck_index_old;
977 }
978
979 /*4 Calculate average thermal meter*/
980 rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermalvalue;
981 rtldm->thermalvalue_avg_index++;
982 if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_88E)
983 rtldm->thermalvalue_avg_index = 0;
984
985 for (i = 0; i < AVG_THERMAL_NUM_88E; i++) {
986 if (rtldm->thermalvalue_avg[i]) {
987 thermalvalue_avg += rtldm->thermalvalue_avg[i];
988 thermalvalue_avg_count++;
989 }
990 }
991
992 if (thermalvalue_avg_count)
993 thermalvalue = (u8)(thermalvalue_avg / thermalvalue_avg_count);
994
995 /* 5 Calculate delta, delta_LCK, delta_IQK.*/
996 if (rtlhal->reloadtxpowerindex) {
997 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
998 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
999 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1000 rtlhal->reloadtxpowerindex = false;
1001 rtlpriv->dm.done_txpower = false;
1002 } else if (rtlpriv->dm.done_txpower) {
1003 delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
1004 (thermalvalue - rtlpriv->dm.thermalvalue) :
1005 (rtlpriv->dm.thermalvalue - thermalvalue);
1006 } else {
1007 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1008 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1009 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1010 }
1011 delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
1012 (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
1013 (rtlpriv->dm.thermalvalue_lck - thermalvalue);
1014 delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
1015 (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
1016 (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
1017
1018 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1019 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
1020 thermalvalue, rtlpriv->dm.thermalvalue,
1021 rtlefuse->eeprom_thermalmeter, delta, delta_lck,
1022 delta_iqk);
1023 /* 6 If necessary, do LCK.*/
1024 if (delta_lck >= 8) {
1025 rtlpriv->dm.thermalvalue_lck = thermalvalue;
1026 rtl88e_phy_lc_calibrate(hw);
1027 }
1028
1029 /* 7 If necessary, move the index of
1030 * swing table to adjust Tx power.
1031 */
1032 if (delta > 0 && rtlpriv->dm.txpower_track_control) {
1033 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1034 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1035 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1036
1037 /* 7.1 Get the final CCK_index and OFDM_index for each
1038 * swing table.
1039 */
1040 if (thermalvalue > rtlefuse->eeprom_thermalmeter) {
1041 CAL_SWING_OFF(offset, power_inc, INDEX_MAPPING_NUM,
1042 delta);
1043 for (i = 0; i < rf; i++)
1044 ofdm_index[i] =
1045 rtldm->ofdm_index[i] +
1046 delta_swing_table_idx[power_inc][offset];
1047 cck_index = rtldm->cck_index +
1048 delta_swing_table_idx[power_inc][offset];
1049 } else {
1050 CAL_SWING_OFF(offset, power_dec, INDEX_MAPPING_NUM,
1051 delta);
1052 for (i = 0; i < rf; i++)
1053 ofdm_index[i] =
1054 rtldm->ofdm_index[i] +
1055 delta_swing_table_idx[power_dec][offset];
1056 cck_index = rtldm->cck_index +
1057 delta_swing_table_idx[power_dec][offset];
1058 }
1059
1060 /* 7.2 Handle boundary conditions of index.*/
1061 for (i = 0; i < rf; i++) {
1062 if (ofdm_index[i] > OFDM_TABLE_SIZE-1)
1063 ofdm_index[i] = OFDM_TABLE_SIZE-1;
1064 else if (rtldm->ofdm_index[i] < ofdm_min_index)
1065 ofdm_index[i] = ofdm_min_index;
1066 }
1067
1068 if (cck_index > CCK_TABLE_SIZE-1)
1069 cck_index = CCK_TABLE_SIZE-1;
1070 else if (cck_index < 0)
1071 cck_index = 0;
1072
1073 /*7.3Configure the Swing Table to adjust Tx Power.*/
1074 if (rtlpriv->dm.txpower_track_control) {
1075 rtldm->done_txpower = true;
1076 rtldm->swing_idx_ofdm[RF90_PATH_A] =
1077 (u8)ofdm_index[RF90_PATH_A];
1078 rtldm->swing_idx_cck = cck_index;
1079 if (rtldm->swing_idx_ofdm_cur !=
1080 rtldm->swing_idx_ofdm[0]) {
1081 rtldm->swing_idx_ofdm_cur =
1082 rtldm->swing_idx_ofdm[0];
1083 rtldm->swing_flag_ofdm = true;
1084 }
1085
1086 if (rtldm->swing_idx_cck_cur != rtldm->swing_idx_cck) {
1087 rtldm->swing_idx_cck_cur = rtldm->swing_idx_cck;
1088 rtldm->swing_flag_cck = true;
1089 }
1090
1091 dm_tx_pwr_track_set_pwr(hw, TXAGC, 0, 0);
1092 }
1093 }
1094
1095 if (delta_iqk >= 8) {
1096 rtlpriv->dm.thermalvalue_iqk = thermalvalue;
1097 rtl88e_phy_iq_calibrate(hw, false);
1098 }
1099
1100 if (rtldm->txpower_track_control)
1101 rtldm->thermalvalue = thermalvalue;
1102 rtldm->txpowercount = 0;
1103 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "end\n");
1104 }
1105
1106 static void rtl88e_dm_init_txpower_tracking(struct ieee80211_hw *hw)
1107 {
1108 struct rtl_priv *rtlpriv = rtl_priv(hw);
1109
1110 rtlpriv->dm.txpower_tracking = true;
1111 rtlpriv->dm.txpower_trackinginit = false;
1112 rtlpriv->dm.txpowercount = 0;
1113 rtlpriv->dm.txpower_track_control = true;
1114
1115 rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A] = 12;
1116 rtlpriv->dm.swing_idx_ofdm_cur = 12;
1117 rtlpriv->dm.swing_flag_ofdm = false;
1118 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1119 "rtlpriv->dm.txpower_tracking = %d\n",
1120 rtlpriv->dm.txpower_tracking);
1121 }
1122
1123 void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw)
1124 {
1125 struct rtl_priv *rtlpriv = rtl_priv(hw);
1126
1127 if (!rtlpriv->dm.txpower_tracking)
1128 return;
1129
1130 if (!rtlpriv->dm.tm_trigger) {
1131 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, BIT(17)|BIT(16),
1132 0x03);
1133 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1134 "Trigger 88E Thermal Meter!!\n");
1135 rtlpriv->dm.tm_trigger = 1;
1136 return;
1137 } else {
1138 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1139 "Schedule TxPowerTracking !!\n");
1140 dm_txpower_track_cb_therm(hw);
1141 rtlpriv->dm.tm_trigger = 0;
1142 }
1143 }
1144
1145 void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
1146 {
1147 struct rtl_priv *rtlpriv = rtl_priv(hw);
1148 struct rate_adaptive *p_ra = &rtlpriv->ra;
1149
1150 p_ra->ratr_state = DM_RATR_STA_INIT;
1151 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
1152
1153 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
1154 rtlpriv->dm.useramask = true;
1155 else
1156 rtlpriv->dm.useramask = false;
1157 }
1158
1159 static void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1160 {
1161 struct rtl_priv *rtlpriv = rtl_priv(hw);
1162 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1163 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1164 struct rate_adaptive *p_ra = &rtlpriv->ra;
1165 u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
1166 struct ieee80211_sta *sta = NULL;
1167
1168 if (is_hal_stop(rtlhal)) {
1169 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1170 "driver is going to unload\n");
1171 return;
1172 }
1173
1174 if (!rtlpriv->dm.useramask) {
1175 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1176 "driver does not control rate adaptive mask\n");
1177 return;
1178 }
1179
1180 if (mac->link_state == MAC80211_LINKED &&
1181 mac->opmode == NL80211_IFTYPE_STATION) {
1182 switch (p_ra->pre_ratr_state) {
1183 case DM_RATR_STA_HIGH:
1184 high_rssithresh_for_ra = 50;
1185 low_rssithresh_for_ra = 20;
1186 break;
1187 case DM_RATR_STA_MIDDLE:
1188 high_rssithresh_for_ra = 55;
1189 low_rssithresh_for_ra = 20;
1190 break;
1191 case DM_RATR_STA_LOW:
1192 high_rssithresh_for_ra = 50;
1193 low_rssithresh_for_ra = 25;
1194 break;
1195 default:
1196 high_rssithresh_for_ra = 50;
1197 low_rssithresh_for_ra = 20;
1198 break;
1199 }
1200
1201 if (rtlpriv->dm.undec_sm_pwdb >
1202 (long)high_rssithresh_for_ra)
1203 p_ra->ratr_state = DM_RATR_STA_HIGH;
1204 else if (rtlpriv->dm.undec_sm_pwdb >
1205 (long)low_rssithresh_for_ra)
1206 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
1207 else
1208 p_ra->ratr_state = DM_RATR_STA_LOW;
1209
1210 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
1211 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1212 "RSSI = %ld\n",
1213 rtlpriv->dm.undec_sm_pwdb);
1214 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1215 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
1216 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1217 "PreState = %d, CurState = %d\n",
1218 p_ra->pre_ratr_state, p_ra->ratr_state);
1219
1220 rcu_read_lock();
1221 sta = rtl_find_sta(hw, mac->bssid);
1222 if (sta)
1223 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
1224 p_ra->ratr_state);
1225 rcu_read_unlock();
1226
1227 p_ra->pre_ratr_state = p_ra->ratr_state;
1228 }
1229 }
1230 }
1231
1232 static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1233 {
1234 struct rtl_priv *rtlpriv = rtl_priv(hw);
1235 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1236
1237 dm_pstable->pre_ccastate = CCA_MAX;
1238 dm_pstable->cur_ccasate = CCA_MAX;
1239 dm_pstable->pre_rfstate = RF_MAX;
1240 dm_pstable->cur_rfstate = RF_MAX;
1241 dm_pstable->rssi_val_min = 0;
1242 }
1243
1244 static void rtl88e_dm_update_rx_idle_ant(struct ieee80211_hw *hw,
1245 u8 ant)
1246 {
1247 struct rtl_priv *rtlpriv = rtl_priv(hw);
1248 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1249 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1250 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1251 u32 default_ant, optional_ant;
1252
1253 if (pfat_table->rx_idle_ant != ant) {
1254 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1255 "need to update rx idle ant\n");
1256 if (ant == MAIN_ANT) {
1257 default_ant =
1258 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1259 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
1260 optional_ant =
1261 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1262 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
1263 } else {
1264 default_ant =
1265 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1266 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
1267 optional_ant =
1268 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1269 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
1270 }
1271
1272 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
1273 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1274 BIT(5) | BIT(4) | BIT(3), default_ant);
1275 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1276 BIT(8) | BIT(7) | BIT(6), optional_ant);
1277 rtl_set_bbreg(hw, DM_REG_ANTSEL_CTRL_11N,
1278 BIT(14) | BIT(13) | BIT(12),
1279 default_ant);
1280 rtl_set_bbreg(hw, DM_REG_RESP_TX_11N,
1281 BIT(6) | BIT(7), default_ant);
1282 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
1283 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1284 BIT(5) | BIT(4) | BIT(3), default_ant);
1285 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1286 BIT(8) | BIT(7) | BIT(6), optional_ant);
1287 }
1288 }
1289 pfat_table->rx_idle_ant = ant;
1290 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RxIdleAnt %s\n",
1291 (ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
1292 }
1293
1294 static void rtl88e_dm_update_tx_ant(struct ieee80211_hw *hw,
1295 u8 ant, u32 mac_id)
1296 {
1297 struct rtl_priv *rtlpriv = rtl_priv(hw);
1298 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1299 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1300 u8 target_ant;
1301
1302 if (ant == MAIN_ANT)
1303 target_ant = MAIN_ANT_CG_TRX;
1304 else
1305 target_ant = AUX_ANT_CG_TRX;
1306
1307 pfat_table->antsel_a[mac_id] = target_ant & BIT(0);
1308 pfat_table->antsel_b[mac_id] = (target_ant & BIT(1)) >> 1;
1309 pfat_table->antsel_c[mac_id] = (target_ant & BIT(2)) >> 2;
1310 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "txfrominfo target ant %s\n",
1311 (ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
1312 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "antsel_tr_mux = 3'b%d%d%d\n",
1313 pfat_table->antsel_c[mac_id],
1314 pfat_table->antsel_b[mac_id],
1315 pfat_table->antsel_a[mac_id]);
1316 }
1317
1318 static void rtl88e_dm_rx_hw_antena_div_init(struct ieee80211_hw *hw)
1319 {
1320 u32 value32;
1321
1322 /*MAC Setting*/
1323 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1324 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
1325 MASKDWORD, value32 | (BIT(23) | BIT(25)));
1326 /*Pin Setting*/
1327 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1328 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1329 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 1);
1330 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
1331 /*OFDM Setting*/
1332 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1333 /*CCK Setting*/
1334 rtl_set_bbreg(hw, DM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
1335 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
1336 rtl88e_dm_update_rx_idle_ant(hw, MAIN_ANT);
1337 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKLWORD, 0x0201);
1338 }
1339
1340 static void rtl88e_dm_trx_hw_antenna_div_init(struct ieee80211_hw *hw)
1341 {
1342 u32 value32;
1343
1344 /*MAC Setting*/
1345 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1346 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD,
1347 value32 | (BIT(23) | BIT(25)));
1348 /*Pin Setting*/
1349 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1350 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1351 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 0);
1352 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
1353 /*OFDM Setting*/
1354 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1355 /*CCK Setting*/
1356 rtl_set_bbreg(hw, DM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
1357 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
1358 /*TX Setting*/
1359 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 0);
1360 rtl88e_dm_update_rx_idle_ant(hw, MAIN_ANT);
1361 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKLWORD, 0x0201);
1362 }
1363
1364 static void rtl88e_dm_fast_training_init(struct ieee80211_hw *hw)
1365 {
1366 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1367 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1368 u32 ant_combination = 2;
1369 u32 value32, i;
1370
1371 for (i = 0; i < 6; i++) {
1372 pfat_table->bssid[i] = 0;
1373 pfat_table->ant_sum[i] = 0;
1374 pfat_table->ant_cnt[i] = 0;
1375 pfat_table->ant_ave[i] = 0;
1376 }
1377 pfat_table->train_idx = 0;
1378 pfat_table->fat_state = FAT_NORMAL_STATE;
1379
1380 /*MAC Setting*/
1381 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1382 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
1383 MASKDWORD, value32 | (BIT(23) | BIT(25)));
1384 value32 = rtl_get_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N, MASKDWORD);
1385 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1386 MASKDWORD, value32 | (BIT(16) | BIT(17)));
1387 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1388 MASKLWORD, 0);
1389 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
1390 MASKDWORD, 0);
1391
1392 /*Pin Setting*/
1393 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1394 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1395 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 0);
1396 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
1397
1398 /*OFDM Setting*/
1399 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1400 /*antenna mapping table*/
1401 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE0, 1);
1402 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE1, 2);
1403
1404 /*TX Setting*/
1405 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 1);
1406 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1407 BIT(5) | BIT(4) | BIT(3), 0);
1408 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1409 BIT(8) | BIT(7) | BIT(6), 1);
1410 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1411 BIT(2) | BIT(1) | BIT(0), (ant_combination - 1));
1412
1413 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1414 }
1415
1416 static void rtl88e_dm_antenna_div_init(struct ieee80211_hw *hw)
1417 {
1418 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1419
1420 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1421 rtl88e_dm_rx_hw_antena_div_init(hw);
1422 else if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1423 rtl88e_dm_trx_hw_antenna_div_init(hw);
1424 else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
1425 rtl88e_dm_fast_training_init(hw);
1426
1427 }
1428
1429 void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
1430 u8 *pdesc, u32 mac_id)
1431 {
1432 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1433 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1434 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1435
1436 if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
1437 (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)) {
1438 SET_TX_DESC_ANTSEL_A(pdesc, pfat_table->antsel_a[mac_id]);
1439 SET_TX_DESC_ANTSEL_B(pdesc, pfat_table->antsel_b[mac_id]);
1440 SET_TX_DESC_ANTSEL_C(pdesc, pfat_table->antsel_c[mac_id]);
1441 }
1442 }
1443
1444 void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
1445 u8 antsel_tr_mux, u32 mac_id,
1446 u32 rx_pwdb_all)
1447 {
1448 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1449 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1450 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1451
1452 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
1453 if (antsel_tr_mux == MAIN_ANT_CG_TRX) {
1454 pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
1455 pfat_table->main_ant_cnt[mac_id]++;
1456 } else {
1457 pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
1458 pfat_table->aux_ant_cnt[mac_id]++;
1459 }
1460 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
1461 if (antsel_tr_mux == MAIN_ANT_CGCS_RX) {
1462 pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
1463 pfat_table->main_ant_cnt[mac_id]++;
1464 } else {
1465 pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
1466 pfat_table->aux_ant_cnt[mac_id]++;
1467 }
1468 }
1469 }
1470
1471 static void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw)
1472 {
1473 struct rtl_priv *rtlpriv = rtl_priv(hw);
1474 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1475 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1476 struct rtl_sta_info *drv_priv;
1477 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1478 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
1479 u32 i, min_rssi = 0xff, ant_div_max_rssi = 0;
1480 u32 max_rssi = 0, local_min_rssi, local_max_rssi;
1481 u32 main_rssi, aux_rssi;
1482 u8 rx_idle_ant = 0, target_ant = 7;
1483
1484 /*for sta its self*/
1485 i = 0;
1486 main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
1487 (pfat_table->main_ant_sum[i] / pfat_table->main_ant_cnt[i]) : 0;
1488 aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
1489 (pfat_table->aux_ant_sum[i] / pfat_table->aux_ant_cnt[i]) : 0;
1490 target_ant = (main_rssi == aux_rssi) ?
1491 pfat_table->rx_idle_ant : ((main_rssi >= aux_rssi) ?
1492 MAIN_ANT : AUX_ANT);
1493 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1494 "main_ant_sum %d main_ant_cnt %d\n",
1495 pfat_table->main_ant_sum[i],
1496 pfat_table->main_ant_cnt[i]);
1497 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1498 "aux_ant_sum %d aux_ant_cnt %d\n",
1499 pfat_table->aux_ant_sum[i], pfat_table->aux_ant_cnt[i]);
1500 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "main_rssi %d aux_rssi%d\n",
1501 main_rssi, aux_rssi);
1502 local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;
1503 if ((local_max_rssi > ant_div_max_rssi) && (local_max_rssi < 40))
1504 ant_div_max_rssi = local_max_rssi;
1505 if (local_max_rssi > max_rssi)
1506 max_rssi = local_max_rssi;
1507
1508 if ((pfat_table->rx_idle_ant == MAIN_ANT) && (main_rssi == 0))
1509 main_rssi = aux_rssi;
1510 else if ((pfat_table->rx_idle_ant == AUX_ANT) && (aux_rssi == 0))
1511 aux_rssi = main_rssi;
1512
1513 local_min_rssi = (main_rssi > aux_rssi) ? aux_rssi : main_rssi;
1514 if (local_min_rssi < min_rssi) {
1515 min_rssi = local_min_rssi;
1516 rx_idle_ant = target_ant;
1517 }
1518 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1519 rtl88e_dm_update_tx_ant(hw, target_ant, i);
1520
1521 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
1522 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) {
1523 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1524 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
1525 i++;
1526 main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
1527 (pfat_table->main_ant_sum[i] /
1528 pfat_table->main_ant_cnt[i]) : 0;
1529 aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
1530 (pfat_table->aux_ant_sum[i] /
1531 pfat_table->aux_ant_cnt[i]) : 0;
1532 target_ant = (main_rssi == aux_rssi) ?
1533 pfat_table->rx_idle_ant : ((main_rssi >=
1534 aux_rssi) ? MAIN_ANT : AUX_ANT);
1535
1536 local_max_rssi = (main_rssi > aux_rssi) ?
1537 main_rssi : aux_rssi;
1538 if ((local_max_rssi > ant_div_max_rssi) &&
1539 (local_max_rssi < 40))
1540 ant_div_max_rssi = local_max_rssi;
1541 if (local_max_rssi > max_rssi)
1542 max_rssi = local_max_rssi;
1543
1544 if ((pfat_table->rx_idle_ant == MAIN_ANT) &&
1545 (main_rssi == 0))
1546 main_rssi = aux_rssi;
1547 else if ((pfat_table->rx_idle_ant == AUX_ANT) &&
1548 (aux_rssi == 0))
1549 aux_rssi = main_rssi;
1550
1551 local_min_rssi = (main_rssi > aux_rssi) ?
1552 aux_rssi : main_rssi;
1553 if (local_min_rssi < min_rssi) {
1554 min_rssi = local_min_rssi;
1555 rx_idle_ant = target_ant;
1556 }
1557 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1558 rtl88e_dm_update_tx_ant(hw, target_ant, i);
1559 }
1560 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1561 }
1562
1563 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
1564 pfat_table->main_ant_sum[i] = 0;
1565 pfat_table->aux_ant_sum[i] = 0;
1566 pfat_table->main_ant_cnt[i] = 0;
1567 pfat_table->aux_ant_cnt[i] = 0;
1568 }
1569
1570 rtl88e_dm_update_rx_idle_ant(hw, rx_idle_ant);
1571
1572 dm_dig->antdiv_rssi_max = ant_div_max_rssi;
1573 dm_dig->rssi_max = max_rssi;
1574 }
1575
1576 static void rtl88e_set_next_mac_address_target(struct ieee80211_hw *hw)
1577 {
1578 struct rtl_priv *rtlpriv = rtl_priv(hw);
1579 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1580 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1581 struct rtl_sta_info *drv_priv;
1582 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1583 u32 value32, i, j = 0;
1584
1585 if (mac->link_state >= MAC80211_LINKED) {
1586 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
1587 if ((pfat_table->train_idx + 1) == ASSOCIATE_ENTRY_NUM)
1588 pfat_table->train_idx = 0;
1589 else
1590 pfat_table->train_idx++;
1591
1592 if (pfat_table->train_idx == 0) {
1593 value32 = (mac->mac_addr[5] << 8) |
1594 mac->mac_addr[4];
1595 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1596 MASKLWORD, value32);
1597
1598 value32 = (mac->mac_addr[3] << 24) |
1599 (mac->mac_addr[2] << 16) |
1600 (mac->mac_addr[1] << 8) |
1601 mac->mac_addr[0];
1602 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
1603 MASKDWORD, value32);
1604 break;
1605 }
1606
1607 if (rtlpriv->mac80211.opmode !=
1608 NL80211_IFTYPE_STATION) {
1609 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1610 list_for_each_entry(drv_priv,
1611 &rtlpriv->entry_list, list) {
1612 j++;
1613 if (j != pfat_table->train_idx)
1614 continue;
1615
1616 value32 = (drv_priv->mac_addr[5] << 8) |
1617 drv_priv->mac_addr[4];
1618 rtl_set_bbreg(hw,
1619 DM_REG_ANT_TRAIN_PARA2_11N,
1620 MASKLWORD, value32);
1621
1622 value32 = (drv_priv->mac_addr[3] << 24) |
1623 (drv_priv->mac_addr[2] << 16) |
1624 (drv_priv->mac_addr[1] << 8) |
1625 drv_priv->mac_addr[0];
1626 rtl_set_bbreg(hw,
1627 DM_REG_ANT_TRAIN_PARA1_11N,
1628 MASKDWORD, value32);
1629 break;
1630 }
1631 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1632 /*find entry, break*/
1633 if (j == pfat_table->train_idx)
1634 break;
1635 }
1636 }
1637 }
1638 }
1639
1640 static void rtl88e_dm_fast_ant_training(struct ieee80211_hw *hw)
1641 {
1642 struct rtl_priv *rtlpriv = rtl_priv(hw);
1643 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1644 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1645 u32 i, max_rssi = 0;
1646 u8 target_ant = 2;
1647 bool bpkt_filter_match = false;
1648
1649 if (pfat_table->fat_state == FAT_TRAINING_STATE) {
1650 for (i = 0; i < 7; i++) {
1651 if (pfat_table->ant_cnt[i] == 0) {
1652 pfat_table->ant_ave[i] = 0;
1653 } else {
1654 pfat_table->ant_ave[i] =
1655 pfat_table->ant_sum[i] /
1656 pfat_table->ant_cnt[i];
1657 bpkt_filter_match = true;
1658 }
1659
1660 if (pfat_table->ant_ave[i] > max_rssi) {
1661 max_rssi = pfat_table->ant_ave[i];
1662 target_ant = (u8) i;
1663 }
1664 }
1665
1666 if (bpkt_filter_match == false) {
1667 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N,
1668 BIT(16), 0);
1669 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1670 } else {
1671 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N,
1672 BIT(16), 0);
1673 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) |
1674 BIT(7) | BIT(6), target_ant);
1675 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1676 BIT(21), 1);
1677
1678 pfat_table->antsel_a[pfat_table->train_idx] =
1679 target_ant & BIT(0);
1680 pfat_table->antsel_b[pfat_table->train_idx] =
1681 (target_ant & BIT(1)) >> 1;
1682 pfat_table->antsel_c[pfat_table->train_idx] =
1683 (target_ant & BIT(2)) >> 2;
1684
1685 if (target_ant == 0)
1686 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1687 }
1688
1689 for (i = 0; i < 7; i++) {
1690 pfat_table->ant_sum[i] = 0;
1691 pfat_table->ant_cnt[i] = 0;
1692 }
1693
1694 pfat_table->fat_state = FAT_NORMAL_STATE;
1695 return;
1696 }
1697
1698 if (pfat_table->fat_state == FAT_NORMAL_STATE) {
1699 rtl88e_set_next_mac_address_target(hw);
1700
1701 pfat_table->fat_state = FAT_TRAINING_STATE;
1702 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N, BIT(16), 1);
1703 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1704
1705 mod_timer(&rtlpriv->works.fast_antenna_training_timer,
1706 jiffies + MSECS(RTL_WATCH_DOG_TIME));
1707 }
1708 }
1709
1710 void rtl88e_dm_fast_antenna_training_callback(unsigned long data)
1711 {
1712 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
1713
1714 rtl88e_dm_fast_ant_training(hw);
1715 }
1716
1717 static void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
1718 {
1719 struct rtl_priv *rtlpriv = rtl_priv(hw);
1720 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1721 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1722 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1723 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1724
1725 if (mac->link_state < MAC80211_LINKED) {
1726 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "No Link\n");
1727 if (pfat_table->becomelinked) {
1728 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1729 "need to turn off HW AntDiv\n");
1730 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1731 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA1_11N,
1732 BIT(15), 0);
1733 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1734 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1735 BIT(21), 0);
1736 pfat_table->becomelinked =
1737 (mac->link_state == MAC80211_LINKED) ?
1738 true : false;
1739 }
1740 return;
1741 } else {
1742 if (!pfat_table->becomelinked) {
1743 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1744 "Need to turn on HW AntDiv\n");
1745 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1746 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA1_11N,
1747 BIT(15), 1);
1748 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1749 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1750 BIT(21), 1);
1751 pfat_table->becomelinked =
1752 (mac->link_state >= MAC80211_LINKED) ?
1753 true : false;
1754 }
1755 }
1756
1757 if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
1758 (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV))
1759 rtl88e_dm_hw_ant_div(hw);
1760 else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
1761 rtl88e_dm_fast_ant_training(hw);
1762 }
1763
1764 void rtl88e_dm_init(struct ieee80211_hw *hw)
1765 {
1766 struct rtl_priv *rtlpriv = rtl_priv(hw);
1767 u32 cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
1768
1769 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
1770 rtl_dm_diginit(hw, cur_igvalue);
1771 rtl88e_dm_init_dynamic_txpower(hw);
1772 rtl88e_dm_init_edca_turbo(hw);
1773 rtl88e_dm_init_rate_adaptive_mask(hw);
1774 rtl88e_dm_init_txpower_tracking(hw);
1775 rtl92c_dm_init_dynamic_bb_powersaving(hw);
1776 rtl88e_dm_antenna_div_init(hw);
1777 }
1778
1779 void rtl88e_dm_watchdog(struct ieee80211_hw *hw)
1780 {
1781 struct rtl_priv *rtlpriv = rtl_priv(hw);
1782 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1783 bool fw_current_inpsmode = false;
1784 bool fw_ps_awake = true;
1785
1786 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
1787 (u8 *)(&fw_current_inpsmode));
1788 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
1789 (u8 *)(&fw_ps_awake));
1790 if (ppsc->p2p_ps_info.p2p_ps_mode)
1791 fw_ps_awake = false;
1792
1793 if ((ppsc->rfpwr_state == ERFON) &&
1794 ((!fw_current_inpsmode) && fw_ps_awake) &&
1795 (!ppsc->rfchange_inprogress)) {
1796 rtl88e_dm_pwdb_monitor(hw);
1797 rtl88e_dm_dig(hw);
1798 rtl88e_dm_false_alarm_counter_statistics(hw);
1799 rtl92c_dm_dynamic_txpower(hw);
1800 rtl88e_dm_check_txpower_tracking(hw);
1801 rtl88e_dm_refresh_rate_adaptive_mask(hw);
1802 rtl88e_dm_check_edca_turbo(hw);
1803 rtl88e_dm_antenna_diversity(hw);
1804 }
1805 } 1
2 #include <linux/kernel.h>
3 #include <linux/mutex.h>
4 #include <linux/spinlock.h>
5 #include <linux/errno.h>
6 #include <verifier/rcv.h>
7 #include <linux/list.h>
8
9 /* mutexes */
10 extern int mutex_lock_interruptible(struct mutex *lock);
11 extern int mutex_lock_killable(struct mutex *lock);
12 extern void mutex_lock(struct mutex *lock);
13
14 /* mutex model functions */
15 extern void ldv_mutex_lock(struct mutex *lock, char *sign);
16 extern int ldv_mutex_is_locked(struct mutex *lock, char *sign);
17 extern void ldv_mutex_unlock(struct mutex *lock, char *sign);
18
19
20 /* Spin locks */
21 extern void __ldv_spin_lock(spinlock_t *lock);
22 extern void __ldv_spin_unlock(spinlock_t *lock);
23 extern int __ldv_spin_trylock(spinlock_t *lock);
24 extern void __ldv_spin_unlock_wait(spinlock_t *lock);
25 extern void __ldv_spin_can_lock(spinlock_t *lock);
26 extern int __ldv_atomic_dec_and_lock(spinlock_t *lock);
27
28 /* spin model functions */
29 extern void ldv_spin_lock(spinlock_t *lock, char *sign);
30 extern void ldv_spin_unlock(spinlock_t *lock, char *sign);
31 extern int ldv_spin_is_locked(spinlock_t *lock, char *sign);
32
33 /* Support for list binder functions */
34 static inline struct list_head *ldv_list_get_first(struct list_head *head) {
35 return head->next;
36 }
37
38 static inline int ldv_list_is_stop(struct list_head *pos, struct list_head *head) {
39 return pos==head;
40 }
41
42 static inline struct list_head *ldv_list_get_next(struct list_head *pos) {
43 return pos->next;
44 }
45
46 #include <linux/mutex.h>
47 #include <linux/slab.h>
48 #include <verifier/rcv.h>
49 #include <linux/timer.h>
50 #include <linux/gfp.h>
51 extern struct timer_list * ldv_timer_list_4;
52 extern int ldv_timer_1_3;
53 extern int pci_counter;
54 extern struct timer_list * ldv_timer_list_2_0;
55 extern struct timer_list * ldv_timer_list_3;
56 extern int ldv_timer_2_1;
57 extern int ldv_state_variable_0;
58 extern int ldv_state_variable_5;
59 extern int ldv_timer_state_3 = 0;
60 extern int ldv_timer_2_2;
61 extern int ldv_timer_2_3;
62 extern int ldv_timer_1_0;
63 extern struct pci_dev *rtl88ee_driver_group1;
64 extern int ldv_timer_state_4 = 0;
65 extern int ref_cnt;
66 extern int ldv_state_variable_1;
67 extern int ldv_state_variable_7;
68 extern struct timer_list * ldv_timer_list_1_3;
69 extern struct sk_buff *rtl8188ee_hal_ops_group0;
70 extern struct timer_list * ldv_timer_list_1_1;
71 extern struct timer_list * ldv_timer_list_2_1;
72 extern struct ieee80211_hw *rtl8188ee_hal_ops_group1;
73 extern struct timer_list * ldv_timer_list_1_0;
74 extern int ldv_state_variable_6;
75 extern int ldv_timer_1_2;
76 extern int ldv_timer_2_0;
77 extern struct ieee80211_sta *rtl8188ee_hal_ops_group2;
78 extern int ldv_timer_1_1;
79 extern int ldv_state_variable_2;
80 extern struct timer_list * ldv_timer_list_1_2;
81 extern int LDV_IN_INTERRUPT = 1;
82 extern struct device *rtlwifi_pm_ops_group1;
83 extern struct mutex fs_mutex;
84 extern int ldv_state_variable_3;
85 extern struct timer_list * ldv_timer_list_2_3;
86 extern struct mutex ar_mutex;
87 extern struct timer_list * ldv_timer_list_2_2;
88 extern int ldv_state_variable_4;
89 extern void ldv_pci_driver_5(void);
90 extern void choose_timer_2(void);
91 extern int reg_timer_2(struct timer_list * timer, void (*function)(unsigned long), unsigned long data);
92 extern void activate_pending_timer_2(struct timer_list * timer, unsigned long data, int pending_flag);
93 extern void choose_timer_3(struct timer_list * timer);
94 extern void activate_pending_timer_4(struct timer_list * timer, unsigned long data, int pending_flag);
95 extern void activate_pending_timer_1(struct timer_list * timer, unsigned long data, int pending_flag);
96 extern void choose_timer_4(struct timer_list * timer);
97 extern void timer_init_2(void);
98 extern void timer_init_1(void);
99 extern void disable_suitable_timer_3(struct timer_list * timer);
100 extern void disable_suitable_timer_4(struct timer_list * timer);
101 extern void ldv_dev_pm_ops_6(void);
102 extern int reg_timer_1(struct timer_list * timer, void (*function)(unsigned long), unsigned long data);
103 extern int reg_timer_4(struct timer_list * timer);
104 extern void disable_suitable_timer_2(struct timer_list * timer);
105 extern void disable_suitable_timer_1(struct timer_list * timer);
106 extern void activate_suitable_timer_1(struct timer_list * timer, unsigned long data);
107 extern void activate_pending_timer_3(struct timer_list * timer, unsigned long data, int pending_flag);
108 extern int evil_hack_fs_lock(void);
109 extern int __VERIFIER_nondet_int(void);
110 extern int reg_timer_3(struct timer_list * timer);
111 extern void ldv_initialyze_rtl_hal_ops_7(void);
112 extern void choose_timer_1(void);
113 extern void ldv_timer_1(int state, struct timer_list * timer);
114 extern void activate_suitable_timer_2(struct timer_list * timer, unsigned long data);
115 extern int evil_hack_ar_lock(void);
116 extern void ldv_timer_2(int state, struct timer_list * timer);
117 #line 1 "/work/ldvuser/andrianov/work/current--X--drivers/net/wireless/--X--defaultlinux-4.5-rc7--X--races--X--cpachecker/linux-4.5-rc7/csd_deg_dscv/376/dscv_tempdir/dscv/ri/races/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c"
118 /******************************************************************************
119 *
120 * Copyright(c) 2009-2013 Realtek Corporation.
121 *
122 * This program is free software; you can redistribute it and/or modify it
123 * under the terms of version 2 of the GNU General Public License as
124 * published by the Free Software Foundation.
125 *
126 * This program is distributed in the hope that it will be useful, but WITHOUT
127 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
128 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
129 * more details.
130 *
131 * The full GNU General Public License is included in this distribution in the
132 * file called LICENSE.
133 *
134 * Contact Information:
135 * wlanfae <wlanfae@realtek.com>
136 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
137 * Hsinchu 300, Taiwan.
138 *
139 * Larry Finger <Larry.Finger@lwfinger.net>
140 *
141 *****************************************************************************/
142
143 #include "../wifi.h"
144 #include "../base.h"
145 #include "../pci.h"
146 #include "../core.h"
147 #include "reg.h"
148 #include "def.h"
149 #include "phy.h"
150 #include "dm.h"
151 #include "fw.h"
152 #include "trx.h"
153
154 static const u32 ofdmswing_table[OFDM_TABLE_SIZE] = {
155 0x7f8001fe, /* 0, +6.0dB */
156 0x788001e2, /* 1, +5.5dB */
157 0x71c001c7, /* 2, +5.0dB */
158 0x6b8001ae, /* 3, +4.5dB */
159 0x65400195, /* 4, +4.0dB */
160 0x5fc0017f, /* 5, +3.5dB */
161 0x5a400169, /* 6, +3.0dB */
162 0x55400155, /* 7, +2.5dB */
163 0x50800142, /* 8, +2.0dB */
164 0x4c000130, /* 9, +1.5dB */
165 0x47c0011f, /* 10, +1.0dB */
166 0x43c0010f, /* 11, +0.5dB */
167 0x40000100, /* 12, +0dB */
168 0x3c8000f2, /* 13, -0.5dB */
169 0x390000e4, /* 14, -1.0dB */
170 0x35c000d7, /* 15, -1.5dB */
171 0x32c000cb, /* 16, -2.0dB */
172 0x300000c0, /* 17, -2.5dB */
173 0x2d4000b5, /* 18, -3.0dB */
174 0x2ac000ab, /* 19, -3.5dB */
175 0x288000a2, /* 20, -4.0dB */
176 0x26000098, /* 21, -4.5dB */
177 0x24000090, /* 22, -5.0dB */
178 0x22000088, /* 23, -5.5dB */
179 0x20000080, /* 24, -6.0dB */
180 0x1e400079, /* 25, -6.5dB */
181 0x1c800072, /* 26, -7.0dB */
182 0x1b00006c, /* 27. -7.5dB */
183 0x19800066, /* 28, -8.0dB */
184 0x18000060, /* 29, -8.5dB */
185 0x16c0005b, /* 30, -9.0dB */
186 0x15800056, /* 31, -9.5dB */
187 0x14400051, /* 32, -10.0dB */
188 0x1300004c, /* 33, -10.5dB */
189 0x12000048, /* 34, -11.0dB */
190 0x11000044, /* 35, -11.5dB */
191 0x10000040, /* 36, -12.0dB */
192 0x0f00003c, /* 37, -12.5dB */
193 0x0e400039, /* 38, -13.0dB */
194 0x0d800036, /* 39, -13.5dB */
195 0x0cc00033, /* 40, -14.0dB */
196 0x0c000030, /* 41, -14.5dB */
197 0x0b40002d, /* 42, -15.0dB */
198 };
199
200 static const u8 cck_tbl_ch1_13[CCK_TABLE_SIZE][8] = {
201 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0dB */
202 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 1, -0.5dB */
203 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 2, -1.0dB */
204 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 3, -1.5dB */
205 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 4, -2.0dB */
206 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 5, -2.5dB */
207 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 6, -3.0dB */
208 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 7, -3.5dB */
209 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 8, -4.0dB */
210 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 9, -4.5dB */
211 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 10, -5.0dB */
212 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 11, -5.5dB */
213 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 12, -6.0dB */
214 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 13, -6.5dB */
215 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 14, -7.0dB */
216 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 15, -7.5dB */
217 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
218 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 17, -8.5dB */
219 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 18, -9.0dB */
220 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 19, -9.5dB */
221 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 20, -10.0dB*/
222 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 21, -10.5dB*/
223 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 22, -11.0dB*/
224 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 23, -11.5dB*/
225 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 24, -12.0dB*/
226 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 25, -12.5dB*/
227 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 26, -13.0dB*/
228 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 27, -13.5dB*/
229 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 28, -14.0dB*/
230 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 29, -14.5dB*/
231 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 30, -15.0dB*/
232 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 31, -15.5dB*/
233 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} /* 32, -16.0dB*/
234 };
235
236 static const u8 cck_tbl_ch14[CCK_TABLE_SIZE][8] = {
237 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0dB */
238 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 1, -0.5dB */
239 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 2, -1.0dB */
240 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 3, -1.5dB */
241 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 4, -2.0dB */
242 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 5, -2.5dB */
243 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 6, -3.0dB */
244 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 7, -3.5dB */
245 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 8, -4.0dB */
246 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 9, -4.5dB */
247 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 10, -5.0dB */
248 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 11, -5.5dB */
249 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 12, -6.0dB */
250 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 13, -6.5dB */
251 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 14, -7.0dB */
252 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 15, -7.5dB */
253 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
254 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 17, -8.5dB */
255 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 18, -9.0dB */
256 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 19, -9.5dB */
257 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 20, -10.0dB*/
258 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 21, -10.5dB*/
259 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 22, -11.0dB*/
260 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 23, -11.5dB*/
261 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 24, -12.0dB*/
262 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 25, -12.5dB*/
263 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 26, -13.0dB*/
264 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 27, -13.5dB*/
265 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 28, -14.0dB*/
266 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 29, -14.5dB*/
267 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 30, -15.0dB*/
268 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 31, -15.5dB*/
269 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} /* 32, -16.0dB*/
270 };
271
272 #define CAL_SWING_OFF(_off, _dir, _size, _del) \
273 do { \
274 for (_off = 0; _off < _size; _off++) { \
275 if (_del < thermal_threshold[_dir][_off]) { \
276 if (_off != 0) \
277 _off--; \
278 break; \
279 } \
280 } \
281 if (_off >= _size) \
282 _off = _size - 1; \
283 } while (0)
284
285 static void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
286 u8 ofdm_index, u8 rfpath,
287 long iqk_result_x, long iqk_result_y)
288 {
289 long ele_a = 0, ele_d, ele_c = 0, value32;
290
291 ele_d = (ofdmswing_table[ofdm_index] & 0xFFC00000)>>22;
292
293 if (iqk_result_x != 0) {
294 if ((iqk_result_x & 0x00000200) != 0)
295 iqk_result_x = iqk_result_x | 0xFFFFFC00;
296 ele_a = ((iqk_result_x * ele_d)>>8)&0x000003FF;
297
298 if ((iqk_result_y & 0x00000200) != 0)
299 iqk_result_y = iqk_result_y | 0xFFFFFC00;
300 ele_c = ((iqk_result_y * ele_d)>>8)&0x000003FF;
301
302 switch (rfpath) {
303 case RF90_PATH_A:
304 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
305 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
306 MASKDWORD, value32);
307 value32 = (ele_c & 0x000003C0) >> 6;
308 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
309 value32);
310 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
311 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
312 value32);
313 break;
314 case RF90_PATH_B:
315 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
316 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
317 value32);
318 value32 = (ele_c & 0x000003C0) >> 6;
319 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, value32);
320 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
321 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
322 value32);
323 break;
324 default:
325 break;
326 }
327 } else {
328 switch (rfpath) {
329 case RF90_PATH_A:
330 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
331 MASKDWORD, ofdmswing_table[ofdm_index]);
332 rtl_set_bbreg(hw, ROFDM0_XCTXAFE,
333 MASKH4BITS, 0x00);
334 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
335 BIT(24), 0x00);
336 break;
337 case RF90_PATH_B:
338 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
339 MASKDWORD, ofdmswing_table[ofdm_index]);
340 rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
341 MASKH4BITS, 0x00);
342 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
343 BIT(28), 0x00);
344 break;
345 default:
346 break;
347 }
348 }
349 }
350
351 void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
352 u8 type, u8 *pdirection, u32 *poutwrite_val)
353 {
354 struct rtl_priv *rtlpriv = rtl_priv(hw);
355 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
356 u8 pwr_val = 0;
357 u8 cck_base = rtldm->swing_idx_cck_base;
358 u8 cck_val = rtldm->swing_idx_cck;
359 u8 ofdm_base = rtldm->swing_idx_ofdm_base[0];
360 u8 ofdm_val = rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A];
361
362 if (type == 0) {
363 if (ofdm_val <= ofdm_base) {
364 *pdirection = 1;
365 pwr_val = ofdm_base - ofdm_val;
366 } else {
367 *pdirection = 2;
368 pwr_val = ofdm_base - ofdm_val;
369 }
370 } else if (type == 1) {
371 if (cck_val <= cck_base) {
372 *pdirection = 1;
373 pwr_val = cck_base - cck_val;
374 } else {
375 *pdirection = 2;
376 pwr_val = cck_val - cck_base;
377 }
378 }
379
380 if (pwr_val >= TXPWRTRACK_MAX_IDX && (*pdirection == 1))
381 pwr_val = TXPWRTRACK_MAX_IDX;
382
383 *poutwrite_val = pwr_val | (pwr_val << 8) | (pwr_val << 16) |
384 (pwr_val << 24);
385 }
386
387 static void dm_tx_pwr_track_set_pwr(struct ieee80211_hw *hw,
388 enum pwr_track_control_method method,
389 u8 rfpath, u8 channel_mapped_index)
390 {
391 struct rtl_priv *rtlpriv = rtl_priv(hw);
392 struct rtl_phy *rtlphy = &rtlpriv->phy;
393 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
394
395 if (method == TXAGC) {
396 if (rtldm->swing_flag_ofdm ||
397 rtldm->swing_flag_cck) {
398 rtl88e_phy_set_txpower_level(hw,
399 rtlphy->current_channel);
400 rtldm->swing_flag_ofdm = false;
401 rtldm->swing_flag_cck = false;
402 }
403 } else if (method == BBSWING) {
404 if (!rtldm->cck_inch14) {
405 rtl_write_byte(rtlpriv, 0xa22,
406 cck_tbl_ch1_13[rtldm->swing_idx_cck][0]);
407 rtl_write_byte(rtlpriv, 0xa23,
408 cck_tbl_ch1_13[rtldm->swing_idx_cck][1]);
409 rtl_write_byte(rtlpriv, 0xa24,
410 cck_tbl_ch1_13[rtldm->swing_idx_cck][2]);
411 rtl_write_byte(rtlpriv, 0xa25,
412 cck_tbl_ch1_13[rtldm->swing_idx_cck][3]);
413 rtl_write_byte(rtlpriv, 0xa26,
414 cck_tbl_ch1_13[rtldm->swing_idx_cck][4]);
415 rtl_write_byte(rtlpriv, 0xa27,
416 cck_tbl_ch1_13[rtldm->swing_idx_cck][5]);
417 rtl_write_byte(rtlpriv, 0xa28,
418 cck_tbl_ch1_13[rtldm->swing_idx_cck][6]);
419 rtl_write_byte(rtlpriv, 0xa29,
420 cck_tbl_ch1_13[rtldm->swing_idx_cck][7]);
421 } else {
422 rtl_write_byte(rtlpriv, 0xa22,
423 cck_tbl_ch14[rtldm->swing_idx_cck][0]);
424 rtl_write_byte(rtlpriv, 0xa23,
425 cck_tbl_ch14[rtldm->swing_idx_cck][1]);
426 rtl_write_byte(rtlpriv, 0xa24,
427 cck_tbl_ch14[rtldm->swing_idx_cck][2]);
428 rtl_write_byte(rtlpriv, 0xa25,
429 cck_tbl_ch14[rtldm->swing_idx_cck][3]);
430 rtl_write_byte(rtlpriv, 0xa26,
431 cck_tbl_ch14[rtldm->swing_idx_cck][4]);
432 rtl_write_byte(rtlpriv, 0xa27,
433 cck_tbl_ch14[rtldm->swing_idx_cck][5]);
434 rtl_write_byte(rtlpriv, 0xa28,
435 cck_tbl_ch14[rtldm->swing_idx_cck][6]);
436 rtl_write_byte(rtlpriv, 0xa29,
437 cck_tbl_ch14[rtldm->swing_idx_cck][7]);
438 }
439
440 if (rfpath == RF90_PATH_A) {
441 rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
442 rfpath, rtlphy->iqk_matrix
443 [channel_mapped_index].
444 value[0][0],
445 rtlphy->iqk_matrix
446 [channel_mapped_index].
447 value[0][1]);
448 } else if (rfpath == RF90_PATH_B) {
449 rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
450 rfpath, rtlphy->iqk_matrix
451 [channel_mapped_index].
452 value[0][4],
453 rtlphy->iqk_matrix
454 [channel_mapped_index].
455 value[0][5]);
456 }
457 } else {
458 return;
459 }
460 }
461
462 static u8 rtl88e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
463 {
464 struct rtl_priv *rtlpriv = rtl_priv(hw);
465 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
466 long rssi_val_min = 0;
467
468 if ((dm_dig->curmultista_cstate == DIG_MULTISTA_CONNECT) &&
469 (dm_dig->cur_sta_cstate == DIG_STA_CONNECT)) {
470 if (rtlpriv->dm.entry_min_undec_sm_pwdb != 0)
471 rssi_val_min =
472 (rtlpriv->dm.entry_min_undec_sm_pwdb >
473 rtlpriv->dm.undec_sm_pwdb) ?
474 rtlpriv->dm.undec_sm_pwdb :
475 rtlpriv->dm.entry_min_undec_sm_pwdb;
476 else
477 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
478 } else if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT ||
479 dm_dig->cur_sta_cstate == DIG_STA_BEFORE_CONNECT) {
480 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
481 } else if (dm_dig->curmultista_cstate ==
482 DIG_MULTISTA_CONNECT) {
483 rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
484 }
485
486 return (u8)rssi_val_min;
487 }
488
489 static void rtl88e_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
490 {
491 u32 ret_value;
492 struct rtl_priv *rtlpriv = rtl_priv(hw);
493 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
494
495 rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 1);
496 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 1);
497
498 ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD);
499 falsealm_cnt->cnt_fast_fsync_fail = (ret_value&0xffff);
500 falsealm_cnt->cnt_sb_search_fail = ((ret_value&0xffff0000)>>16);
501
502 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER1, MASKDWORD);
503 falsealm_cnt->cnt_ofdm_cca = (ret_value&0xffff);
504 falsealm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
505
506 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER2, MASKDWORD);
507 falsealm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
508 falsealm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
509
510 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
511 falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
512 falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
513 falsealm_cnt->cnt_rate_illegal +
514 falsealm_cnt->cnt_crc8_fail +
515 falsealm_cnt->cnt_mcs_fail +
516 falsealm_cnt->cnt_fast_fsync_fail +
517 falsealm_cnt->cnt_sb_search_fail;
518
519 ret_value = rtl_get_bbreg(hw, REG_SC_CNT, MASKDWORD);
520 falsealm_cnt->cnt_bw_lsc = (ret_value & 0xffff);
521 falsealm_cnt->cnt_bw_usc = ((ret_value & 0xffff0000) >> 16);
522
523 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(12), 1);
524 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
525
526 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
527 falsealm_cnt->cnt_cck_fail = ret_value;
528
529 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERUPPER, MASKBYTE3);
530 falsealm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;
531
532 ret_value = rtl_get_bbreg(hw, RCCK0_CCA_CNT, MASKDWORD);
533 falsealm_cnt->cnt_cck_cca = ((ret_value & 0xff) << 8) |
534 ((ret_value&0xFF00)>>8);
535
536 falsealm_cnt->cnt_all = (falsealm_cnt->cnt_fast_fsync_fail +
537 falsealm_cnt->cnt_sb_search_fail +
538 falsealm_cnt->cnt_parity_fail +
539 falsealm_cnt->cnt_rate_illegal +
540 falsealm_cnt->cnt_crc8_fail +
541 falsealm_cnt->cnt_mcs_fail +
542 falsealm_cnt->cnt_cck_fail);
543 falsealm_cnt->cnt_cca_all = falsealm_cnt->cnt_ofdm_cca +
544 falsealm_cnt->cnt_cck_cca;
545
546 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 1);
547 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 0);
548 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(27), 1);
549 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(27), 0);
550 rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 0);
551 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 0);
552 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(13)|BIT(12), 0);
553 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(13)|BIT(12), 2);
554 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 0);
555 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 2);
556
557 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
558 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
559 falsealm_cnt->cnt_parity_fail,
560 falsealm_cnt->cnt_rate_illegal,
561 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
562
563 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
564 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
565 falsealm_cnt->cnt_ofdm_fail,
566 falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
567 }
568
569 static void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
570 {
571 struct rtl_priv *rtlpriv = rtl_priv(hw);
572 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
573 u8 cur_cck_cca_thresh;
574
575 if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
576 dm_dig->rssi_val_min = rtl88e_dm_initial_gain_min_pwdb(hw);
577 if (dm_dig->rssi_val_min > 25) {
578 cur_cck_cca_thresh = 0xcd;
579 } else if ((dm_dig->rssi_val_min <= 25) &&
580 (dm_dig->rssi_val_min > 10)) {
581 cur_cck_cca_thresh = 0x83;
582 } else {
583 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
584 cur_cck_cca_thresh = 0x83;
585 else
586 cur_cck_cca_thresh = 0x40;
587 }
588
589 } else {
590 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
591 cur_cck_cca_thresh = 0x83;
592 else
593 cur_cck_cca_thresh = 0x40;
594 }
595
596 if (dm_dig->cur_cck_cca_thres != cur_cck_cca_thresh)
597 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, cur_cck_cca_thresh);
598
599 dm_dig->cur_cck_cca_thres = cur_cck_cca_thresh;
600 dm_dig->pre_cck_cca_thres = dm_dig->cur_cck_cca_thres;
601 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
602 "CCK cca thresh hold =%x\n", dm_dig->cur_cck_cca_thres);
603 }
604
605 static void rtl88e_dm_dig(struct ieee80211_hw *hw)
606 {
607 struct rtl_priv *rtlpriv = rtl_priv(hw);
608 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
609 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
610 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
611 u8 dig_dynamic_min, dig_maxofmin;
612 bool bfirstconnect;
613 u8 dm_dig_max, dm_dig_min;
614 u8 current_igi = dm_dig->cur_igvalue;
615
616 if (rtlpriv->dm.dm_initialgain_enable == false)
617 return;
618 if (dm_dig->dig_enable_flag == false)
619 return;
620 if (mac->act_scanning == true)
621 return;
622
623 if (mac->link_state >= MAC80211_LINKED)
624 dm_dig->cur_sta_cstate = DIG_STA_CONNECT;
625 else
626 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
627 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
628 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
629 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
630
631 dm_dig_max = DM_DIG_MAX;
632 dm_dig_min = DM_DIG_MIN;
633 dig_maxofmin = DM_DIG_MAX_AP;
634 dig_dynamic_min = dm_dig->dig_min_0;
635 bfirstconnect = ((mac->link_state >= MAC80211_LINKED) ? true : false) &&
636 !dm_dig->media_connect_0;
637
638 dm_dig->rssi_val_min =
639 rtl88e_dm_initial_gain_min_pwdb(hw);
640
641 if (mac->link_state >= MAC80211_LINKED) {
642 if ((dm_dig->rssi_val_min + 20) > dm_dig_max)
643 dm_dig->rx_gain_max = dm_dig_max;
644 else if ((dm_dig->rssi_val_min + 20) < dm_dig_min)
645 dm_dig->rx_gain_max = dm_dig_min;
646 else
647 dm_dig->rx_gain_max = dm_dig->rssi_val_min + 20;
648
649 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
650 dig_dynamic_min = dm_dig->antdiv_rssi_max;
651 } else {
652 if (dm_dig->rssi_val_min < dm_dig_min)
653 dig_dynamic_min = dm_dig_min;
654 else if (dm_dig->rssi_val_min < dig_maxofmin)
655 dig_dynamic_min = dig_maxofmin;
656 else
657 dig_dynamic_min = dm_dig->rssi_val_min;
658 }
659 } else {
660 dm_dig->rx_gain_max = dm_dig_max;
661 dig_dynamic_min = dm_dig_min;
662 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
663 }
664
665 if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
666 dm_dig->large_fa_hit++;
667 if (dm_dig->forbidden_igi < current_igi) {
668 dm_dig->forbidden_igi = current_igi;
669 dm_dig->large_fa_hit = 1;
670 }
671
672 if (dm_dig->large_fa_hit >= 3) {
673 if ((dm_dig->forbidden_igi + 1) >
674 dm_dig->rx_gain_max)
675 dm_dig->rx_gain_min =
676 dm_dig->rx_gain_max;
677 else
678 dm_dig->rx_gain_min =
679 dm_dig->forbidden_igi + 1;
680 dm_dig->recover_cnt = 3600;
681 }
682 } else {
683 if (dm_dig->recover_cnt != 0) {
684 dm_dig->recover_cnt--;
685 } else {
686 if (dm_dig->large_fa_hit == 0) {
687 if ((dm_dig->forbidden_igi - 1) <
688 dig_dynamic_min) {
689 dm_dig->forbidden_igi = dig_dynamic_min;
690 dm_dig->rx_gain_min = dig_dynamic_min;
691 } else {
692 dm_dig->forbidden_igi--;
693 dm_dig->rx_gain_min =
694 dm_dig->forbidden_igi + 1;
695 }
696 } else if (dm_dig->large_fa_hit == 3) {
697 dm_dig->large_fa_hit = 0;
698 }
699 }
700 }
701
702 if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
703 if (bfirstconnect) {
704 current_igi = dm_dig->rssi_val_min;
705 } else {
706 if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH2)
707 current_igi += 2;
708 else if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH1)
709 current_igi++;
710 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
711 current_igi--;
712 }
713 } else {
714 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
715 current_igi += 2;
716 else if (rtlpriv->falsealm_cnt.cnt_all > 8000)
717 current_igi++;
718 else if (rtlpriv->falsealm_cnt.cnt_all < 500)
719 current_igi--;
720 }
721
722 if (current_igi > DM_DIG_FA_UPPER)
723 current_igi = DM_DIG_FA_UPPER;
724 else if (current_igi < DM_DIG_FA_LOWER)
725 current_igi = DM_DIG_FA_LOWER;
726
727 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
728 current_igi = DM_DIG_FA_UPPER;
729
730 dm_dig->cur_igvalue = current_igi;
731 rtl88e_dm_write_dig(hw);
732 dm_dig->media_connect_0 =
733 ((mac->link_state >= MAC80211_LINKED) ? true : false);
734 dm_dig->dig_min_0 = dig_dynamic_min;
735
736 rtl88e_dm_cck_packet_detection_thresh(hw);
737 }
738
739 static void rtl88e_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
740 {
741 struct rtl_priv *rtlpriv = rtl_priv(hw);
742
743 rtlpriv->dm.dynamic_txpower_enable = false;
744
745 rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
746 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
747 }
748
749 static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
750 {
751 struct rtl_priv *rtlpriv = rtl_priv(hw);
752 struct rtl_phy *rtlphy = &rtlpriv->phy;
753 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
754 long undec_sm_pwdb;
755
756 if (!rtlpriv->dm.dynamic_txpower_enable)
757 return;
758
759 if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) {
760 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
761 return;
762 }
763
764 if ((mac->link_state < MAC80211_LINKED) &&
765 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
766 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
767 "Not connected to any\n");
768
769 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
770
771 rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
772 return;
773 }
774
775 if (mac->link_state >= MAC80211_LINKED) {
776 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
777 undec_sm_pwdb =
778 rtlpriv->dm.entry_min_undec_sm_pwdb;
779 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
780 "AP Client PWDB = 0x%lx\n",
781 undec_sm_pwdb);
782 } else {
783 undec_sm_pwdb =
784 rtlpriv->dm.undec_sm_pwdb;
785 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
786 "STA Default Port PWDB = 0x%lx\n",
787 undec_sm_pwdb);
788 }
789 } else {
790 undec_sm_pwdb =
791 rtlpriv->dm.entry_min_undec_sm_pwdb;
792
793 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
794 "AP Ext Port PWDB = 0x%lx\n",
795 undec_sm_pwdb);
796 }
797
798 if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
799 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
800 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
801 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x0)\n");
802 } else if ((undec_sm_pwdb <
803 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
804 (undec_sm_pwdb >=
805 TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
806 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
807 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
808 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x10)\n");
809 } else if (undec_sm_pwdb <
810 (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
811 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
812 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
813 "TXHIGHPWRLEVEL_NORMAL\n");
814 }
815
816 if ((rtlpriv->dm.dynamic_txhighpower_lvl !=
817 rtlpriv->dm.last_dtp_lvl)) {
818 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
819 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
820 rtlphy->current_channel);
821 rtl88e_phy_set_txpower_level(hw, rtlphy->current_channel);
822 }
823
824 rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
825 }
826
827 void rtl88e_dm_write_dig(struct ieee80211_hw *hw)
828 {
829 struct rtl_priv *rtlpriv = rtl_priv(hw);
830 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
831
832 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
833 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
834 dm_dig->cur_igvalue, dm_dig->pre_igvalue,
835 dm_dig->back_val);
836
837 if (dm_dig->cur_igvalue > 0x3f)
838 dm_dig->cur_igvalue = 0x3f;
839 if (dm_dig->pre_igvalue != dm_dig->cur_igvalue) {
840 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
841 dm_dig->cur_igvalue);
842
843 dm_dig->pre_igvalue = dm_dig->cur_igvalue;
844 }
845 }
846
847 static void rtl88e_dm_pwdb_monitor(struct ieee80211_hw *hw)
848 {
849 struct rtl_priv *rtlpriv = rtl_priv(hw);
850 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
851 struct rtl_sta_info *drv_priv;
852 static u64 last_record_txok_cnt;
853 static u64 last_record_rxok_cnt;
854 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
855
856 if (rtlhal->oem_id == RT_CID_819X_HP) {
857 u64 cur_txok_cnt = 0;
858 u64 cur_rxok_cnt = 0;
859 cur_txok_cnt = rtlpriv->stats.txbytesunicast -
860 last_record_txok_cnt;
861 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast -
862 last_record_rxok_cnt;
863 last_record_txok_cnt = cur_txok_cnt;
864 last_record_rxok_cnt = cur_rxok_cnt;
865
866 if (cur_rxok_cnt > (cur_txok_cnt * 6))
867 rtl_write_dword(rtlpriv, REG_ARFR0, 0x8f015);
868 else
869 rtl_write_dword(rtlpriv, REG_ARFR0, 0xff015);
870 }
871
872 /* AP & ADHOC & MESH */
873 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
874 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
875 if (drv_priv->rssi_stat.undec_sm_pwdb <
876 tmp_entry_min_pwdb)
877 tmp_entry_min_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
878 if (drv_priv->rssi_stat.undec_sm_pwdb >
879 tmp_entry_max_pwdb)
880 tmp_entry_max_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
881 }
882 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
883
884 /* If associated entry is found */
885 if (tmp_entry_max_pwdb != 0) {
886 rtlpriv->dm.entry_max_undec_sm_pwdb = tmp_entry_max_pwdb;
887 RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMaxPWDB = 0x%lx(%ld)\n",
888 tmp_entry_max_pwdb, tmp_entry_max_pwdb);
889 } else {
890 rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
891 }
892 /* If associated entry is found */
893 if (tmp_entry_min_pwdb != 0xff) {
894 rtlpriv->dm.entry_min_undec_sm_pwdb = tmp_entry_min_pwdb;
895 RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMinPWDB = 0x%lx(%ld)\n",
896 tmp_entry_min_pwdb, tmp_entry_min_pwdb);
897 } else {
898 rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
899 }
900 /* Indicate Rx signal strength to FW. */
901 if (rtlpriv->dm.useramask) {
902 u8 h2c_parameter[3] = { 0 };
903
904 h2c_parameter[2] = (u8)(rtlpriv->dm.undec_sm_pwdb & 0xFF);
905 h2c_parameter[0] = 0x20;
906 } else {
907 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb);
908 }
909 }
910
911 void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw)
912 {
913 struct rtl_priv *rtlpriv = rtl_priv(hw);
914
915 rtlpriv->dm.current_turbo_edca = false;
916 rtlpriv->dm.is_any_nonbepkts = false;
917 rtlpriv->dm.is_cur_rdlstate = false;
918 }
919
920 static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
921 {
922 struct rtl_priv *rtlpriv = rtl_priv(hw);
923 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
924 static u64 last_txok_cnt;
925 static u64 last_rxok_cnt;
926 static u32 last_bt_edca_ul;
927 static u32 last_bt_edca_dl;
928 u64 cur_txok_cnt = 0;
929 u64 cur_rxok_cnt = 0;
930 u32 edca_be_ul = 0x5ea42b;
931 u32 edca_be_dl = 0x5ea42b;
932 bool bt_change_edca = false;
933
934 if ((last_bt_edca_ul != rtlpriv->btcoexist.bt_edca_ul) ||
935 (last_bt_edca_dl != rtlpriv->btcoexist.bt_edca_dl)) {
936 rtlpriv->dm.current_turbo_edca = false;
937 last_bt_edca_ul = rtlpriv->btcoexist.bt_edca_ul;
938 last_bt_edca_dl = rtlpriv->btcoexist.bt_edca_dl;
939 }
940
941 if (rtlpriv->btcoexist.bt_edca_ul != 0) {
942 edca_be_ul = rtlpriv->btcoexist.bt_edca_ul;
943 bt_change_edca = true;
944 }
945
946 if (rtlpriv->btcoexist.bt_edca_dl != 0) {
947 edca_be_ul = rtlpriv->btcoexist.bt_edca_dl;
948 bt_change_edca = true;
949 }
950
951 if (mac->link_state != MAC80211_LINKED) {
952 rtlpriv->dm.current_turbo_edca = false;
953 return;
954 }
955 if ((bt_change_edca) ||
956 ((!rtlpriv->dm.is_any_nonbepkts) &&
957 (!rtlpriv->dm.disable_framebursting))) {
958
959 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
960 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
961
962 if (cur_rxok_cnt > 4 * cur_txok_cnt) {
963 if (!rtlpriv->dm.is_cur_rdlstate ||
964 !rtlpriv->dm.current_turbo_edca) {
965 rtl_write_dword(rtlpriv,
966 REG_EDCA_BE_PARAM,
967 edca_be_dl);
968 rtlpriv->dm.is_cur_rdlstate = true;
969 }
970 } else {
971 if (rtlpriv->dm.is_cur_rdlstate ||
972 !rtlpriv->dm.current_turbo_edca) {
973 rtl_write_dword(rtlpriv,
974 REG_EDCA_BE_PARAM,
975 edca_be_ul);
976 rtlpriv->dm.is_cur_rdlstate = false;
977 }
978 }
979 rtlpriv->dm.current_turbo_edca = true;
980 } else {
981 if (rtlpriv->dm.current_turbo_edca) {
982 u8 tmp = AC0_BE;
983
984 rtlpriv->cfg->ops->set_hw_reg(hw,
985 HW_VAR_AC_PARAM,
986 &tmp);
987 rtlpriv->dm.current_turbo_edca = false;
988 }
989 }
990
991 rtlpriv->dm.is_any_nonbepkts = false;
992 last_txok_cnt = rtlpriv->stats.txbytesunicast;
993 last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
994 }
995
996 static void dm_txpower_track_cb_therm(struct ieee80211_hw *hw)
997 {
998 struct rtl_priv *rtlpriv = rtl_priv(hw);
999 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1000 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1001 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1002 u8 thermalvalue = 0, delta, delta_lck, delta_iqk, offset;
1003 u8 thermalvalue_avg_count = 0;
1004 u32 thermalvalue_avg = 0;
1005 long ele_d, temp_cck;
1006 char ofdm_index[2], cck_index = 0,
1007 ofdm_index_old[2] = {0, 0}, cck_index_old = 0;
1008 int i = 0;
1009 /*bool is2t = false;*/
1010
1011 u8 ofdm_min_index = 6, rf = 1;
1012 /*u8 index_for_channel;*/
1013 enum _power_dec_inc {power_dec, power_inc};
1014
1015 /*0.1 the following TWO tables decide the
1016 *final index of OFDM/CCK swing table
1017 */
1018 char delta_swing_table_idx[2][15] = {
1019 {0, 0, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11},
1020 {0, 0, -1, -2, -3, -4, -4, -4, -4, -5, -7, -8, -9, -9, -10}
1021 };
1022 u8 thermal_threshold[2][15] = {
1023 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27},
1024 {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 25, 25}
1025 };
1026
1027 /*Initilization (7 steps in total) */
1028 rtlpriv->dm.txpower_trackinginit = true;
1029 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1030 "dm_txpower_track_cb_therm\n");
1031
1032 thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER,
1033 0xfc00);
1034 if (!thermalvalue)
1035 return;
1036 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1037 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
1038 thermalvalue, rtlpriv->dm.thermalvalue,
1039 rtlefuse->eeprom_thermalmeter);
1040
1041 /*1. Query OFDM Default Setting: Path A*/
1042 ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD) &
1043 MASKOFDM_D;
1044 for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
1045 if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
1046 ofdm_index_old[0] = (u8)i;
1047 rtldm->swing_idx_ofdm_base[RF90_PATH_A] = (u8)i;
1048 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1049 "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index = 0x%x\n",
1050 ROFDM0_XATXIQIMBALANCE,
1051 ele_d, ofdm_index_old[0]);
1052 break;
1053 }
1054 }
1055
1056 /*2.Query CCK default setting From 0xa24*/
1057 temp_cck = rtl_get_bbreg(hw, RCCK0_TXFILTER2, MASKDWORD) & MASKCCK;
1058 for (i = 0; i < CCK_TABLE_LENGTH; i++) {
1059 if (rtlpriv->dm.cck_inch14) {
1060 if (memcmp(&temp_cck, &cck_tbl_ch14[i][2], 4) == 0) {
1061 cck_index_old = (u8)i;
1062 rtldm->swing_idx_cck_base = (u8)i;
1063 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
1064 DBG_LOUD,
1065 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch 14 %d\n",
1066 RCCK0_TXFILTER2, temp_cck,
1067 cck_index_old,
1068 rtlpriv->dm.cck_inch14);
1069 break;
1070 }
1071 } else {
1072 if (memcmp(&temp_cck, &cck_tbl_ch1_13[i][2], 4) == 0) {
1073 cck_index_old = (u8)i;
1074 rtldm->swing_idx_cck_base = (u8)i;
1075 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
1076 DBG_LOUD,
1077 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
1078 RCCK0_TXFILTER2, temp_cck,
1079 cck_index_old,
1080 rtlpriv->dm.cck_inch14);
1081 break;
1082 }
1083 }
1084 }
1085
1086 /*3 Initialize ThermalValues of RFCalibrateInfo*/
1087 if (!rtldm->thermalvalue) {
1088 rtlpriv->dm.thermalvalue = rtlefuse->eeprom_thermalmeter;
1089 rtlpriv->dm.thermalvalue_lck = thermalvalue;
1090 rtlpriv->dm.thermalvalue_iqk = thermalvalue;
1091 for (i = 0; i < rf; i++)
1092 rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
1093 rtlpriv->dm.cck_index = cck_index_old;
1094 }
1095
1096 /*4 Calculate average thermal meter*/
1097 rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermalvalue;
1098 rtldm->thermalvalue_avg_index++;
1099 if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_88E)
1100 rtldm->thermalvalue_avg_index = 0;
1101
1102 for (i = 0; i < AVG_THERMAL_NUM_88E; i++) {
1103 if (rtldm->thermalvalue_avg[i]) {
1104 thermalvalue_avg += rtldm->thermalvalue_avg[i];
1105 thermalvalue_avg_count++;
1106 }
1107 }
1108
1109 if (thermalvalue_avg_count)
1110 thermalvalue = (u8)(thermalvalue_avg / thermalvalue_avg_count);
1111
1112 /* 5 Calculate delta, delta_LCK, delta_IQK.*/
1113 if (rtlhal->reloadtxpowerindex) {
1114 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1115 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1116 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1117 rtlhal->reloadtxpowerindex = false;
1118 rtlpriv->dm.done_txpower = false;
1119 } else if (rtlpriv->dm.done_txpower) {
1120 delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
1121 (thermalvalue - rtlpriv->dm.thermalvalue) :
1122 (rtlpriv->dm.thermalvalue - thermalvalue);
1123 } else {
1124 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1125 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1126 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1127 }
1128 delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
1129 (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
1130 (rtlpriv->dm.thermalvalue_lck - thermalvalue);
1131 delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
1132 (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
1133 (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
1134
1135 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1136 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
1137 thermalvalue, rtlpriv->dm.thermalvalue,
1138 rtlefuse->eeprom_thermalmeter, delta, delta_lck,
1139 delta_iqk);
1140 /* 6 If necessary, do LCK.*/
1141 if (delta_lck >= 8) {
1142 rtlpriv->dm.thermalvalue_lck = thermalvalue;
1143 rtl88e_phy_lc_calibrate(hw);
1144 }
1145
1146 /* 7 If necessary, move the index of
1147 * swing table to adjust Tx power.
1148 */
1149 if (delta > 0 && rtlpriv->dm.txpower_track_control) {
1150 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1151 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1152 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1153
1154 /* 7.1 Get the final CCK_index and OFDM_index for each
1155 * swing table.
1156 */
1157 if (thermalvalue > rtlefuse->eeprom_thermalmeter) {
1158 CAL_SWING_OFF(offset, power_inc, INDEX_MAPPING_NUM,
1159 delta);
1160 for (i = 0; i < rf; i++)
1161 ofdm_index[i] =
1162 rtldm->ofdm_index[i] +
1163 delta_swing_table_idx[power_inc][offset];
1164 cck_index = rtldm->cck_index +
1165 delta_swing_table_idx[power_inc][offset];
1166 } else {
1167 CAL_SWING_OFF(offset, power_dec, INDEX_MAPPING_NUM,
1168 delta);
1169 for (i = 0; i < rf; i++)
1170 ofdm_index[i] =
1171 rtldm->ofdm_index[i] +
1172 delta_swing_table_idx[power_dec][offset];
1173 cck_index = rtldm->cck_index +
1174 delta_swing_table_idx[power_dec][offset];
1175 }
1176
1177 /* 7.2 Handle boundary conditions of index.*/
1178 for (i = 0; i < rf; i++) {
1179 if (ofdm_index[i] > OFDM_TABLE_SIZE-1)
1180 ofdm_index[i] = OFDM_TABLE_SIZE-1;
1181 else if (rtldm->ofdm_index[i] < ofdm_min_index)
1182 ofdm_index[i] = ofdm_min_index;
1183 }
1184
1185 if (cck_index > CCK_TABLE_SIZE-1)
1186 cck_index = CCK_TABLE_SIZE-1;
1187 else if (cck_index < 0)
1188 cck_index = 0;
1189
1190 /*7.3Configure the Swing Table to adjust Tx Power.*/
1191 if (rtlpriv->dm.txpower_track_control) {
1192 rtldm->done_txpower = true;
1193 rtldm->swing_idx_ofdm[RF90_PATH_A] =
1194 (u8)ofdm_index[RF90_PATH_A];
1195 rtldm->swing_idx_cck = cck_index;
1196 if (rtldm->swing_idx_ofdm_cur !=
1197 rtldm->swing_idx_ofdm[0]) {
1198 rtldm->swing_idx_ofdm_cur =
1199 rtldm->swing_idx_ofdm[0];
1200 rtldm->swing_flag_ofdm = true;
1201 }
1202
1203 if (rtldm->swing_idx_cck_cur != rtldm->swing_idx_cck) {
1204 rtldm->swing_idx_cck_cur = rtldm->swing_idx_cck;
1205 rtldm->swing_flag_cck = true;
1206 }
1207
1208 dm_tx_pwr_track_set_pwr(hw, TXAGC, 0, 0);
1209 }
1210 }
1211
1212 if (delta_iqk >= 8) {
1213 rtlpriv->dm.thermalvalue_iqk = thermalvalue;
1214 rtl88e_phy_iq_calibrate(hw, false);
1215 }
1216
1217 if (rtldm->txpower_track_control)
1218 rtldm->thermalvalue = thermalvalue;
1219 rtldm->txpowercount = 0;
1220 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "end\n");
1221 }
1222
1223 static void rtl88e_dm_init_txpower_tracking(struct ieee80211_hw *hw)
1224 {
1225 struct rtl_priv *rtlpriv = rtl_priv(hw);
1226
1227 rtlpriv->dm.txpower_tracking = true;
1228 rtlpriv->dm.txpower_trackinginit = false;
1229 rtlpriv->dm.txpowercount = 0;
1230 rtlpriv->dm.txpower_track_control = true;
1231
1232 rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A] = 12;
1233 rtlpriv->dm.swing_idx_ofdm_cur = 12;
1234 rtlpriv->dm.swing_flag_ofdm = false;
1235 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1236 "rtlpriv->dm.txpower_tracking = %d\n",
1237 rtlpriv->dm.txpower_tracking);
1238 }
1239
1240 void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw)
1241 {
1242 struct rtl_priv *rtlpriv = rtl_priv(hw);
1243
1244 if (!rtlpriv->dm.txpower_tracking)
1245 return;
1246
1247 if (!rtlpriv->dm.tm_trigger) {
1248 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, BIT(17)|BIT(16),
1249 0x03);
1250 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1251 "Trigger 88E Thermal Meter!!\n");
1252 rtlpriv->dm.tm_trigger = 1;
1253 return;
1254 } else {
1255 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1256 "Schedule TxPowerTracking !!\n");
1257 dm_txpower_track_cb_therm(hw);
1258 rtlpriv->dm.tm_trigger = 0;
1259 }
1260 }
1261
1262 void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
1263 {
1264 struct rtl_priv *rtlpriv = rtl_priv(hw);
1265 struct rate_adaptive *p_ra = &rtlpriv->ra;
1266
1267 p_ra->ratr_state = DM_RATR_STA_INIT;
1268 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
1269
1270 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
1271 rtlpriv->dm.useramask = true;
1272 else
1273 rtlpriv->dm.useramask = false;
1274 }
1275
1276 static void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1277 {
1278 struct rtl_priv *rtlpriv = rtl_priv(hw);
1279 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1280 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1281 struct rate_adaptive *p_ra = &rtlpriv->ra;
1282 u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
1283 struct ieee80211_sta *sta = NULL;
1284
1285 if (is_hal_stop(rtlhal)) {
1286 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1287 "driver is going to unload\n");
1288 return;
1289 }
1290
1291 if (!rtlpriv->dm.useramask) {
1292 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1293 "driver does not control rate adaptive mask\n");
1294 return;
1295 }
1296
1297 if (mac->link_state == MAC80211_LINKED &&
1298 mac->opmode == NL80211_IFTYPE_STATION) {
1299 switch (p_ra->pre_ratr_state) {
1300 case DM_RATR_STA_HIGH:
1301 high_rssithresh_for_ra = 50;
1302 low_rssithresh_for_ra = 20;
1303 break;
1304 case DM_RATR_STA_MIDDLE:
1305 high_rssithresh_for_ra = 55;
1306 low_rssithresh_for_ra = 20;
1307 break;
1308 case DM_RATR_STA_LOW:
1309 high_rssithresh_for_ra = 50;
1310 low_rssithresh_for_ra = 25;
1311 break;
1312 default:
1313 high_rssithresh_for_ra = 50;
1314 low_rssithresh_for_ra = 20;
1315 break;
1316 }
1317
1318 if (rtlpriv->dm.undec_sm_pwdb >
1319 (long)high_rssithresh_for_ra)
1320 p_ra->ratr_state = DM_RATR_STA_HIGH;
1321 else if (rtlpriv->dm.undec_sm_pwdb >
1322 (long)low_rssithresh_for_ra)
1323 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
1324 else
1325 p_ra->ratr_state = DM_RATR_STA_LOW;
1326
1327 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
1328 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1329 "RSSI = %ld\n",
1330 rtlpriv->dm.undec_sm_pwdb);
1331 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1332 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
1333 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1334 "PreState = %d, CurState = %d\n",
1335 p_ra->pre_ratr_state, p_ra->ratr_state);
1336
1337 rcu_read_lock();
1338 sta = rtl_find_sta(hw, mac->bssid);
1339 if (sta)
1340 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
1341 p_ra->ratr_state);
1342 rcu_read_unlock();
1343
1344 p_ra->pre_ratr_state = p_ra->ratr_state;
1345 }
1346 }
1347 }
1348
1349 static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1350 {
1351 struct rtl_priv *rtlpriv = rtl_priv(hw);
1352 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1353
1354 dm_pstable->pre_ccastate = CCA_MAX;
1355 dm_pstable->cur_ccasate = CCA_MAX;
1356 dm_pstable->pre_rfstate = RF_MAX;
1357 dm_pstable->cur_rfstate = RF_MAX;
1358 dm_pstable->rssi_val_min = 0;
1359 }
1360
1361 static void rtl88e_dm_update_rx_idle_ant(struct ieee80211_hw *hw,
1362 u8 ant)
1363 {
1364 struct rtl_priv *rtlpriv = rtl_priv(hw);
1365 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1366 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1367 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1368 u32 default_ant, optional_ant;
1369
1370 if (pfat_table->rx_idle_ant != ant) {
1371 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1372 "need to update rx idle ant\n");
1373 if (ant == MAIN_ANT) {
1374 default_ant =
1375 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1376 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
1377 optional_ant =
1378 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1379 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
1380 } else {
1381 default_ant =
1382 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1383 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
1384 optional_ant =
1385 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1386 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
1387 }
1388
1389 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
1390 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1391 BIT(5) | BIT(4) | BIT(3), default_ant);
1392 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1393 BIT(8) | BIT(7) | BIT(6), optional_ant);
1394 rtl_set_bbreg(hw, DM_REG_ANTSEL_CTRL_11N,
1395 BIT(14) | BIT(13) | BIT(12),
1396 default_ant);
1397 rtl_set_bbreg(hw, DM_REG_RESP_TX_11N,
1398 BIT(6) | BIT(7), default_ant);
1399 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
1400 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1401 BIT(5) | BIT(4) | BIT(3), default_ant);
1402 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1403 BIT(8) | BIT(7) | BIT(6), optional_ant);
1404 }
1405 }
1406 pfat_table->rx_idle_ant = ant;
1407 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RxIdleAnt %s\n",
1408 (ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
1409 }
1410
1411 static void rtl88e_dm_update_tx_ant(struct ieee80211_hw *hw,
1412 u8 ant, u32 mac_id)
1413 {
1414 struct rtl_priv *rtlpriv = rtl_priv(hw);
1415 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1416 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1417 u8 target_ant;
1418
1419 if (ant == MAIN_ANT)
1420 target_ant = MAIN_ANT_CG_TRX;
1421 else
1422 target_ant = AUX_ANT_CG_TRX;
1423
1424 pfat_table->antsel_a[mac_id] = target_ant & BIT(0);
1425 pfat_table->antsel_b[mac_id] = (target_ant & BIT(1)) >> 1;
1426 pfat_table->antsel_c[mac_id] = (target_ant & BIT(2)) >> 2;
1427 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "txfrominfo target ant %s\n",
1428 (ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
1429 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "antsel_tr_mux = 3'b%d%d%d\n",
1430 pfat_table->antsel_c[mac_id],
1431 pfat_table->antsel_b[mac_id],
1432 pfat_table->antsel_a[mac_id]);
1433 }
1434
1435 static void rtl88e_dm_rx_hw_antena_div_init(struct ieee80211_hw *hw)
1436 {
1437 u32 value32;
1438
1439 /*MAC Setting*/
1440 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1441 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
1442 MASKDWORD, value32 | (BIT(23) | BIT(25)));
1443 /*Pin Setting*/
1444 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1445 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1446 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 1);
1447 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
1448 /*OFDM Setting*/
1449 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1450 /*CCK Setting*/
1451 rtl_set_bbreg(hw, DM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
1452 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
1453 rtl88e_dm_update_rx_idle_ant(hw, MAIN_ANT);
1454 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKLWORD, 0x0201);
1455 }
1456
1457 static void rtl88e_dm_trx_hw_antenna_div_init(struct ieee80211_hw *hw)
1458 {
1459 u32 value32;
1460
1461 /*MAC Setting*/
1462 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1463 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD,
1464 value32 | (BIT(23) | BIT(25)));
1465 /*Pin Setting*/
1466 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1467 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1468 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 0);
1469 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
1470 /*OFDM Setting*/
1471 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1472 /*CCK Setting*/
1473 rtl_set_bbreg(hw, DM_REG_BB_PWR_SAV4_11N, BIT(7), 1);
1474 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1);
1475 /*TX Setting*/
1476 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 0);
1477 rtl88e_dm_update_rx_idle_ant(hw, MAIN_ANT);
1478 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKLWORD, 0x0201);
1479 }
1480
1481 static void rtl88e_dm_fast_training_init(struct ieee80211_hw *hw)
1482 {
1483 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1484 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1485 u32 ant_combination = 2;
1486 u32 value32, i;
1487
1488 for (i = 0; i < 6; i++) {
1489 pfat_table->bssid[i] = 0;
1490 pfat_table->ant_sum[i] = 0;
1491 pfat_table->ant_cnt[i] = 0;
1492 pfat_table->ant_ave[i] = 0;
1493 }
1494 pfat_table->train_idx = 0;
1495 pfat_table->fat_state = FAT_NORMAL_STATE;
1496
1497 /*MAC Setting*/
1498 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1499 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
1500 MASKDWORD, value32 | (BIT(23) | BIT(25)));
1501 value32 = rtl_get_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N, MASKDWORD);
1502 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1503 MASKDWORD, value32 | (BIT(16) | BIT(17)));
1504 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1505 MASKLWORD, 0);
1506 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
1507 MASKDWORD, 0);
1508
1509 /*Pin Setting*/
1510 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1511 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
1512 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(22), 0);
1513 rtl_set_bbreg(hw, DM_REG_LNA_SWITCH_11N, BIT(31), 1);
1514
1515 /*OFDM Setting*/
1516 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1517 /*antenna mapping table*/
1518 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE0, 1);
1519 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE1, 2);
1520
1521 /*TX Setting*/
1522 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 1);
1523 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1524 BIT(5) | BIT(4) | BIT(3), 0);
1525 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1526 BIT(8) | BIT(7) | BIT(6), 1);
1527 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1528 BIT(2) | BIT(1) | BIT(0), (ant_combination - 1));
1529
1530 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1531 }
1532
1533 static void rtl88e_dm_antenna_div_init(struct ieee80211_hw *hw)
1534 {
1535 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1536
1537 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1538 rtl88e_dm_rx_hw_antena_div_init(hw);
1539 else if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1540 rtl88e_dm_trx_hw_antenna_div_init(hw);
1541 else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
1542 rtl88e_dm_fast_training_init(hw);
1543
1544 }
1545
1546 void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
1547 u8 *pdesc, u32 mac_id)
1548 {
1549 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1550 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1551 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1552
1553 if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
1554 (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)) {
1555 SET_TX_DESC_ANTSEL_A(pdesc, pfat_table->antsel_a[mac_id]);
1556 SET_TX_DESC_ANTSEL_B(pdesc, pfat_table->antsel_b[mac_id]);
1557 SET_TX_DESC_ANTSEL_C(pdesc, pfat_table->antsel_c[mac_id]);
1558 }
1559 }
1560
1561 void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
1562 u8 antsel_tr_mux, u32 mac_id,
1563 u32 rx_pwdb_all)
1564 {
1565 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1566 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1567 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1568
1569 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
1570 if (antsel_tr_mux == MAIN_ANT_CG_TRX) {
1571 pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
1572 pfat_table->main_ant_cnt[mac_id]++;
1573 } else {
1574 pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
1575 pfat_table->aux_ant_cnt[mac_id]++;
1576 }
1577 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
1578 if (antsel_tr_mux == MAIN_ANT_CGCS_RX) {
1579 pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
1580 pfat_table->main_ant_cnt[mac_id]++;
1581 } else {
1582 pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
1583 pfat_table->aux_ant_cnt[mac_id]++;
1584 }
1585 }
1586 }
1587
1588 static void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw)
1589 {
1590 struct rtl_priv *rtlpriv = rtl_priv(hw);
1591 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1592 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1593 struct rtl_sta_info *drv_priv;
1594 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1595 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
1596 u32 i, min_rssi = 0xff, ant_div_max_rssi = 0;
1597 u32 max_rssi = 0, local_min_rssi, local_max_rssi;
1598 u32 main_rssi, aux_rssi;
1599 u8 rx_idle_ant = 0, target_ant = 7;
1600
1601 /*for sta its self*/
1602 i = 0;
1603 main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
1604 (pfat_table->main_ant_sum[i] / pfat_table->main_ant_cnt[i]) : 0;
1605 aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
1606 (pfat_table->aux_ant_sum[i] / pfat_table->aux_ant_cnt[i]) : 0;
1607 target_ant = (main_rssi == aux_rssi) ?
1608 pfat_table->rx_idle_ant : ((main_rssi >= aux_rssi) ?
1609 MAIN_ANT : AUX_ANT);
1610 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1611 "main_ant_sum %d main_ant_cnt %d\n",
1612 pfat_table->main_ant_sum[i],
1613 pfat_table->main_ant_cnt[i]);
1614 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1615 "aux_ant_sum %d aux_ant_cnt %d\n",
1616 pfat_table->aux_ant_sum[i], pfat_table->aux_ant_cnt[i]);
1617 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "main_rssi %d aux_rssi%d\n",
1618 main_rssi, aux_rssi);
1619 local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;
1620 if ((local_max_rssi > ant_div_max_rssi) && (local_max_rssi < 40))
1621 ant_div_max_rssi = local_max_rssi;
1622 if (local_max_rssi > max_rssi)
1623 max_rssi = local_max_rssi;
1624
1625 if ((pfat_table->rx_idle_ant == MAIN_ANT) && (main_rssi == 0))
1626 main_rssi = aux_rssi;
1627 else if ((pfat_table->rx_idle_ant == AUX_ANT) && (aux_rssi == 0))
1628 aux_rssi = main_rssi;
1629
1630 local_min_rssi = (main_rssi > aux_rssi) ? aux_rssi : main_rssi;
1631 if (local_min_rssi < min_rssi) {
1632 min_rssi = local_min_rssi;
1633 rx_idle_ant = target_ant;
1634 }
1635 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1636 rtl88e_dm_update_tx_ant(hw, target_ant, i);
1637
1638 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
1639 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) {
1640 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1641 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
1642 i++;
1643 main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
1644 (pfat_table->main_ant_sum[i] /
1645 pfat_table->main_ant_cnt[i]) : 0;
1646 aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
1647 (pfat_table->aux_ant_sum[i] /
1648 pfat_table->aux_ant_cnt[i]) : 0;
1649 target_ant = (main_rssi == aux_rssi) ?
1650 pfat_table->rx_idle_ant : ((main_rssi >=
1651 aux_rssi) ? MAIN_ANT : AUX_ANT);
1652
1653 local_max_rssi = (main_rssi > aux_rssi) ?
1654 main_rssi : aux_rssi;
1655 if ((local_max_rssi > ant_div_max_rssi) &&
1656 (local_max_rssi < 40))
1657 ant_div_max_rssi = local_max_rssi;
1658 if (local_max_rssi > max_rssi)
1659 max_rssi = local_max_rssi;
1660
1661 if ((pfat_table->rx_idle_ant == MAIN_ANT) &&
1662 (main_rssi == 0))
1663 main_rssi = aux_rssi;
1664 else if ((pfat_table->rx_idle_ant == AUX_ANT) &&
1665 (aux_rssi == 0))
1666 aux_rssi = main_rssi;
1667
1668 local_min_rssi = (main_rssi > aux_rssi) ?
1669 aux_rssi : main_rssi;
1670 if (local_min_rssi < min_rssi) {
1671 min_rssi = local_min_rssi;
1672 rx_idle_ant = target_ant;
1673 }
1674 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1675 rtl88e_dm_update_tx_ant(hw, target_ant, i);
1676 }
1677 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1678 }
1679
1680 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
1681 pfat_table->main_ant_sum[i] = 0;
1682 pfat_table->aux_ant_sum[i] = 0;
1683 pfat_table->main_ant_cnt[i] = 0;
1684 pfat_table->aux_ant_cnt[i] = 0;
1685 }
1686
1687 rtl88e_dm_update_rx_idle_ant(hw, rx_idle_ant);
1688
1689 dm_dig->antdiv_rssi_max = ant_div_max_rssi;
1690 dm_dig->rssi_max = max_rssi;
1691 }
1692
1693 static void rtl88e_set_next_mac_address_target(struct ieee80211_hw *hw)
1694 {
1695 struct rtl_priv *rtlpriv = rtl_priv(hw);
1696 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1697 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1698 struct rtl_sta_info *drv_priv;
1699 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1700 u32 value32, i, j = 0;
1701
1702 if (mac->link_state >= MAC80211_LINKED) {
1703 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
1704 if ((pfat_table->train_idx + 1) == ASSOCIATE_ENTRY_NUM)
1705 pfat_table->train_idx = 0;
1706 else
1707 pfat_table->train_idx++;
1708
1709 if (pfat_table->train_idx == 0) {
1710 value32 = (mac->mac_addr[5] << 8) |
1711 mac->mac_addr[4];
1712 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1713 MASKLWORD, value32);
1714
1715 value32 = (mac->mac_addr[3] << 24) |
1716 (mac->mac_addr[2] << 16) |
1717 (mac->mac_addr[1] << 8) |
1718 mac->mac_addr[0];
1719 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
1720 MASKDWORD, value32);
1721 break;
1722 }
1723
1724 if (rtlpriv->mac80211.opmode !=
1725 NL80211_IFTYPE_STATION) {
1726 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1727 list_for_each_entry(drv_priv,
1728 &rtlpriv->entry_list, list) {
1729 j++;
1730 if (j != pfat_table->train_idx)
1731 continue;
1732
1733 value32 = (drv_priv->mac_addr[5] << 8) |
1734 drv_priv->mac_addr[4];
1735 rtl_set_bbreg(hw,
1736 DM_REG_ANT_TRAIN_PARA2_11N,
1737 MASKLWORD, value32);
1738
1739 value32 = (drv_priv->mac_addr[3] << 24) |
1740 (drv_priv->mac_addr[2] << 16) |
1741 (drv_priv->mac_addr[1] << 8) |
1742 drv_priv->mac_addr[0];
1743 rtl_set_bbreg(hw,
1744 DM_REG_ANT_TRAIN_PARA1_11N,
1745 MASKDWORD, value32);
1746 break;
1747 }
1748 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1749 /*find entry, break*/
1750 if (j == pfat_table->train_idx)
1751 break;
1752 }
1753 }
1754 }
1755 }
1756
1757 static void rtl88e_dm_fast_ant_training(struct ieee80211_hw *hw)
1758 {
1759 struct rtl_priv *rtlpriv = rtl_priv(hw);
1760 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1761 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1762 u32 i, max_rssi = 0;
1763 u8 target_ant = 2;
1764 bool bpkt_filter_match = false;
1765
1766 if (pfat_table->fat_state == FAT_TRAINING_STATE) {
1767 for (i = 0; i < 7; i++) {
1768 if (pfat_table->ant_cnt[i] == 0) {
1769 pfat_table->ant_ave[i] = 0;
1770 } else {
1771 pfat_table->ant_ave[i] =
1772 pfat_table->ant_sum[i] /
1773 pfat_table->ant_cnt[i];
1774 bpkt_filter_match = true;
1775 }
1776
1777 if (pfat_table->ant_ave[i] > max_rssi) {
1778 max_rssi = pfat_table->ant_ave[i];
1779 target_ant = (u8) i;
1780 }
1781 }
1782
1783 if (bpkt_filter_match == false) {
1784 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N,
1785 BIT(16), 0);
1786 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1787 } else {
1788 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N,
1789 BIT(16), 0);
1790 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) |
1791 BIT(7) | BIT(6), target_ant);
1792 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1793 BIT(21), 1);
1794
1795 pfat_table->antsel_a[pfat_table->train_idx] =
1796 target_ant & BIT(0);
1797 pfat_table->antsel_b[pfat_table->train_idx] =
1798 (target_ant & BIT(1)) >> 1;
1799 pfat_table->antsel_c[pfat_table->train_idx] =
1800 (target_ant & BIT(2)) >> 2;
1801
1802 if (target_ant == 0)
1803 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1804 }
1805
1806 for (i = 0; i < 7; i++) {
1807 pfat_table->ant_sum[i] = 0;
1808 pfat_table->ant_cnt[i] = 0;
1809 }
1810
1811 pfat_table->fat_state = FAT_NORMAL_STATE;
1812 return;
1813 }
1814
1815 if (pfat_table->fat_state == FAT_NORMAL_STATE) {
1816 rtl88e_set_next_mac_address_target(hw);
1817
1818 pfat_table->fat_state = FAT_TRAINING_STATE;
1819 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N, BIT(16), 1);
1820 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1821
1822 mod_timer(&rtlpriv->works.fast_antenna_training_timer,
1823 jiffies + MSECS(RTL_WATCH_DOG_TIME));
1824 }
1825 }
1826
1827 void rtl88e_dm_fast_antenna_training_callback(unsigned long data)
1828 {
1829 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
1830
1831 rtl88e_dm_fast_ant_training(hw);
1832 }
1833
1834 static void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
1835 {
1836 struct rtl_priv *rtlpriv = rtl_priv(hw);
1837 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1838 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1839 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1840 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1841
1842 if (mac->link_state < MAC80211_LINKED) {
1843 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "No Link\n");
1844 if (pfat_table->becomelinked) {
1845 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1846 "need to turn off HW AntDiv\n");
1847 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1848 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA1_11N,
1849 BIT(15), 0);
1850 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1851 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1852 BIT(21), 0);
1853 pfat_table->becomelinked =
1854 (mac->link_state == MAC80211_LINKED) ?
1855 true : false;
1856 }
1857 return;
1858 } else {
1859 if (!pfat_table->becomelinked) {
1860 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1861 "Need to turn on HW AntDiv\n");
1862 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1863 rtl_set_bbreg(hw, DM_REG_CCK_ANTDIV_PARA1_11N,
1864 BIT(15), 1);
1865 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1866 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1867 BIT(21), 1);
1868 pfat_table->becomelinked =
1869 (mac->link_state >= MAC80211_LINKED) ?
1870 true : false;
1871 }
1872 }
1873
1874 if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
1875 (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV))
1876 rtl88e_dm_hw_ant_div(hw);
1877 else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
1878 rtl88e_dm_fast_ant_training(hw);
1879 }
1880
1881 void rtl88e_dm_init(struct ieee80211_hw *hw)
1882 {
1883 struct rtl_priv *rtlpriv = rtl_priv(hw);
1884 u32 cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
1885
1886 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
1887 rtl_dm_diginit(hw, cur_igvalue);
1888 rtl88e_dm_init_dynamic_txpower(hw);
1889 rtl88e_dm_init_edca_turbo(hw);
1890 rtl88e_dm_init_rate_adaptive_mask(hw);
1891 rtl88e_dm_init_txpower_tracking(hw);
1892 rtl92c_dm_init_dynamic_bb_powersaving(hw);
1893 rtl88e_dm_antenna_div_init(hw);
1894 }
1895
1896 void rtl88e_dm_watchdog(struct ieee80211_hw *hw)
1897 {
1898 struct rtl_priv *rtlpriv = rtl_priv(hw);
1899 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1900 bool fw_current_inpsmode = false;
1901 bool fw_ps_awake = true;
1902
1903 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
1904 (u8 *)(&fw_current_inpsmode));
1905 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
1906 (u8 *)(&fw_ps_awake));
1907 if (ppsc->p2p_ps_info.p2p_ps_mode)
1908 fw_ps_awake = false;
1909
1910 if ((ppsc->rfpwr_state == ERFON) &&
1911 ((!fw_current_inpsmode) && fw_ps_awake) &&
1912 (!ppsc->rfchange_inprogress)) {
1913 rtl88e_dm_pwdb_monitor(hw);
1914 rtl88e_dm_dig(hw);
1915 rtl88e_dm_false_alarm_counter_statistics(hw);
1916 rtl92c_dm_dynamic_txpower(hw);
1917 rtl88e_dm_check_txpower_tracking(hw);
1918 rtl88e_dm_refresh_rate_adaptive_mask(hw);
1919 rtl88e_dm_check_edca_turbo(hw);
1920 rtl88e_dm_antenna_diversity(hw);
1921 }
1922 }
1923
1924 #line 117 "/work/ldvuser/andrianov/work/current--X--drivers/net/wireless/--X--defaultlinux-4.5-rc7--X--races--X--cpachecker/linux-4.5-rc7/csd_deg_dscv/376/dscv_tempdir/dscv/ri/races/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.o.c.prepared" 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../pci.h"
28 #include "../base.h"
29 #include "../core.h"
30 #include "reg.h"
31 #include "def.h"
32 #include "fw.h"
33
34 static void _rtl88e_enable_fw_download(struct ieee80211_hw *hw, bool enable)
35 {
36 struct rtl_priv *rtlpriv = rtl_priv(hw);
37 u8 tmp;
38
39 if (enable) {
40 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
41 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp | 0x04);
42
43 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
44 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp | 0x01);
45
46 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
47 rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
48 } else {
49 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
50 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
51
52 rtl_write_byte(rtlpriv, REG_MCUFWDL + 1, 0x00);
53 }
54 }
55
56 static void _rtl88e_fw_block_write(struct ieee80211_hw *hw,
57 const u8 *buffer, u32 size)
58 {
59 struct rtl_priv *rtlpriv = rtl_priv(hw);
60 u32 blocksize = sizeof(u32);
61 u8 *bufferptr = (u8 *)buffer;
62 u32 *pu4BytePtr = (u32 *)buffer;
63 u32 i, offset, blockcount, remainsize;
64
65 blockcount = size / blocksize;
66 remainsize = size % blocksize;
67
68 for (i = 0; i < blockcount; i++) {
69 offset = i * blocksize;
70 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
71 *(pu4BytePtr + i));
72 }
73
74 if (remainsize) {
75 offset = blockcount * blocksize;
76 bufferptr += offset;
77 for (i = 0; i < remainsize; i++) {
78 rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS +
79 offset + i), *(bufferptr + i));
80 }
81 }
82 }
83
84 static void _rtl88e_fw_page_write(struct ieee80211_hw *hw,
85 u32 page, const u8 *buffer, u32 size)
86 {
87 struct rtl_priv *rtlpriv = rtl_priv(hw);
88 u8 value8;
89 u8 u8page = (u8) (page & 0x07);
90
91 value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page;
92
93 rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8);
94 _rtl88e_fw_block_write(hw, buffer, size);
95 }
96
97 static void _rtl88e_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
98 {
99 u32 fwlen = *pfwlen;
100 u8 remain = (u8) (fwlen % 4);
101
102 remain = (remain == 0) ? 0 : (4 - remain);
103
104 while (remain > 0) {
105 pfwbuf[fwlen] = 0;
106 fwlen++;
107 remain--;
108 }
109
110 *pfwlen = fwlen;
111 }
112
113 static void _rtl88e_write_fw(struct ieee80211_hw *hw,
114 enum version_8188e version, u8 *buffer, u32 size)
115 {
116 struct rtl_priv *rtlpriv = rtl_priv(hw);
117 u8 *bufferptr = (u8 *)buffer;
118 u32 pagenums, remainsize;
119 u32 page, offset;
120
121 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
122
123 _rtl88e_fill_dummy(bufferptr, &size);
124
125 pagenums = size / FW_8192C_PAGE_SIZE;
126 remainsize = size % FW_8192C_PAGE_SIZE;
127
128 if (pagenums > 8) {
129 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
130 "Page numbers should not greater then 8\n");
131 }
132
133 for (page = 0; page < pagenums; page++) {
134 offset = page * FW_8192C_PAGE_SIZE;
135 _rtl88e_fw_page_write(hw, page, (bufferptr + offset),
136 FW_8192C_PAGE_SIZE);
137 }
138
139 if (remainsize) {
140 offset = pagenums * FW_8192C_PAGE_SIZE;
141 page = pagenums;
142 _rtl88e_fw_page_write(hw, page, (bufferptr + offset),
143 remainsize);
144 }
145 }
146
147 static int _rtl88e_fw_free_to_go(struct ieee80211_hw *hw)
148 {
149 struct rtl_priv *rtlpriv = rtl_priv(hw);
150 int err = -EIO;
151 u32 counter = 0;
152 u32 value32;
153
154 do {
155 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
156 } while ((counter++ < FW_8192C_POLLING_TIMEOUT_COUNT) &&
157 (!(value32 & FWDL_CHKSUM_RPT)));
158
159 if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) {
160 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
161 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
162 value32);
163 goto exit;
164 }
165
166 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
167 "Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32);
168
169 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
170 value32 |= MCUFWDL_RDY;
171 value32 &= ~WINTINI_RDY;
172 rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
173
174 rtl88e_firmware_selfreset(hw);
175 counter = 0;
176
177 do {
178 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
179 if (value32 & WINTINI_RDY) {
180 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
181 "Polling FW ready success!! REG_MCUFWDL:0x%08x.\n",
182 value32);
183 err = 0;
184 goto exit;
185 }
186
187 udelay(FW_8192C_POLLING_DELAY);
188
189 } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT);
190
191 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
192 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", value32);
193
194 exit:
195 return err;
196 }
197
198 int rtl88e_download_fw(struct ieee80211_hw *hw,
199 bool buse_wake_on_wlan_fw)
200 {
201 struct rtl_priv *rtlpriv = rtl_priv(hw);
202 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
203 struct rtlwifi_firmware_header *pfwheader;
204 u8 *pfwdata;
205 u32 fwsize;
206 int err;
207 enum version_8188e version = rtlhal->version;
208
209 if (!rtlhal->pfirmware)
210 return 1;
211
212 pfwheader = (struct rtlwifi_firmware_header *)rtlhal->pfirmware;
213 pfwdata = rtlhal->pfirmware;
214 fwsize = rtlhal->fwsize;
215 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
216 "normal Firmware SIZE %d\n", fwsize);
217
218 if (IS_FW_HEADER_EXIST(pfwheader)) {
219 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
220 "Firmware Version(%d), Signature(%#x), Size(%d)\n",
221 pfwheader->version, pfwheader->signature,
222 (int)sizeof(struct rtlwifi_firmware_header));
223
224 pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header);
225 fwsize = fwsize - sizeof(struct rtlwifi_firmware_header);
226 }
227
228 if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
229 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0);
230 rtl88e_firmware_selfreset(hw);
231 }
232 _rtl88e_enable_fw_download(hw, true);
233 _rtl88e_write_fw(hw, version, pfwdata, fwsize);
234 _rtl88e_enable_fw_download(hw, false);
235
236 err = _rtl88e_fw_free_to_go(hw);
237 if (err) {
238 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
239 "Firmware is not ready to run!\n");
240 } else {
241 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
242 "Firmware is ready to run!\n");
243 }
244
245 return 0;
246 }
247
248 static bool _rtl88e_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum)
249 {
250 struct rtl_priv *rtlpriv = rtl_priv(hw);
251 u8 val_hmetfr;
252
253 val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
254 if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
255 return true;
256 return false;
257 }
258
259 static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
260 u8 element_id, u32 cmd_len,
261 u8 *cmd_b)
262 {
263 struct rtl_priv *rtlpriv = rtl_priv(hw);
264 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
265 u8 boxnum;
266 u16 box_reg = 0, box_extreg = 0;
267 u8 u1b_tmp;
268 bool isfw_read = false;
269 u8 buf_index = 0;
270 bool write_sucess = false;
271 u8 wait_h2c_limmit = 100;
272 u8 wait_writeh2c_limit = 100;
273 u8 boxcontent[4], boxextcontent[4];
274 u32 h2c_waitcounter = 0;
275 unsigned long flag;
276 u8 idx;
277
278 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
279
280 while (true) {
281 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
282 if (rtlhal->h2c_setinprogress) {
283 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
284 "H2C set in progress! Wait to set..element_id(%d).\n",
285 element_id);
286
287 while (rtlhal->h2c_setinprogress) {
288 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
289 flag);
290 h2c_waitcounter++;
291 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
292 "Wait 100 us (%d times)...\n",
293 h2c_waitcounter);
294 udelay(100);
295
296 if (h2c_waitcounter > 1000)
297 return;
298 spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
299 flag);
300 }
301 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
302 } else {
303 rtlhal->h2c_setinprogress = true;
304 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
305 break;
306 }
307 }
308
309 while (!write_sucess) {
310 wait_writeh2c_limit--;
311 if (wait_writeh2c_limit == 0) {
312 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
313 "Write H2C fail because no trigger for FW INT!\n");
314 break;
315 }
316
317 boxnum = rtlhal->last_hmeboxnum;
318 switch (boxnum) {
319 case 0:
320 box_reg = REG_HMEBOX_0;
321 box_extreg = REG_HMEBOX_EXT_0;
322 break;
323 case 1:
324 box_reg = REG_HMEBOX_1;
325 box_extreg = REG_HMEBOX_EXT_1;
326 break;
327 case 2:
328 box_reg = REG_HMEBOX_2;
329 box_extreg = REG_HMEBOX_EXT_2;
330 break;
331 case 3:
332 box_reg = REG_HMEBOX_3;
333 box_extreg = REG_HMEBOX_EXT_3;
334 break;
335 default:
336 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
337 "switch case not process\n");
338 break;
339 }
340 isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
341 while (!isfw_read) {
342 wait_h2c_limmit--;
343 if (wait_h2c_limmit == 0) {
344 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
345 "Waiting too long for FW read clear HMEBox(%d)!\n",
346 boxnum);
347 break;
348 }
349
350 udelay(10);
351
352 isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
353 u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
354 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
355 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
356 boxnum, u1b_tmp);
357 }
358
359 if (!isfw_read) {
360 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
361 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
362 boxnum);
363 break;
364 }
365
366 memset(boxcontent, 0, sizeof(boxcontent));
367 memset(boxextcontent, 0, sizeof(boxextcontent));
368 boxcontent[0] = element_id;
369 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
370 "Write element_id box_reg(%4x) = %2x\n",
371 box_reg, element_id);
372
373 switch (cmd_len) {
374 case 1:
375 case 2:
376 case 3:
377 /*boxcontent[0] &= ~(BIT(7));*/
378 memcpy((u8 *)(boxcontent) + 1,
379 cmd_b + buf_index, cmd_len);
380
381 for (idx = 0; idx < 4; idx++) {
382 rtl_write_byte(rtlpriv, box_reg + idx,
383 boxcontent[idx]);
384 }
385 break;
386 case 4:
387 case 5:
388 case 6:
389 case 7:
390 /*boxcontent[0] |= (BIT(7));*/
391 memcpy((u8 *)(boxextcontent),
392 cmd_b + buf_index+3, cmd_len-3);
393 memcpy((u8 *)(boxcontent) + 1,
394 cmd_b + buf_index, 3);
395
396 for (idx = 0; idx < 2; idx++) {
397 rtl_write_byte(rtlpriv, box_extreg + idx,
398 boxextcontent[idx]);
399 }
400
401 for (idx = 0; idx < 4; idx++) {
402 rtl_write_byte(rtlpriv, box_reg + idx,
403 boxcontent[idx]);
404 }
405 break;
406 default:
407 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
408 "switch case not process\n");
409 break;
410 }
411
412 write_sucess = true;
413
414 rtlhal->last_hmeboxnum = boxnum + 1;
415 if (rtlhal->last_hmeboxnum == 4)
416 rtlhal->last_hmeboxnum = 0;
417
418 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
419 "pHalData->last_hmeboxnum = %d\n",
420 rtlhal->last_hmeboxnum);
421 }
422
423 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
424 rtlhal->h2c_setinprogress = false;
425 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
426
427 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
428 }
429
430 void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw,
431 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
432 {
433 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
434 u32 tmp_cmdbuf[2];
435
436 if (!rtlhal->fw_ready) {
437 RT_ASSERT(false,
438 "return H2C cmd because of Fw download fail!!!\n");
439 return;
440 }
441
442 memset(tmp_cmdbuf, 0, 8);
443 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
444 _rtl88e_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
445
446 return;
447 }
448
449 void rtl88e_firmware_selfreset(struct ieee80211_hw *hw)
450 {
451 u8 u1b_tmp;
452 struct rtl_priv *rtlpriv = rtl_priv(hw);
453
454 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
455 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
456 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
457 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
458 "8051Reset88E(): 8051 reset success\n");
459
460 }
461
462 void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
463 {
464 struct rtl_priv *rtlpriv = rtl_priv(hw);
465 u8 u1_h2c_set_pwrmode[H2C_88E_PWEMODE_LENGTH] = { 0 };
466 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
467 u8 rlbm, power_state = 0;
468 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
469
470 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
471 rlbm = 0;/*YJ, temp, 120316. FW now not support RLBM=2.*/
472 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
473 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
474 (rtlpriv->mac80211.p2p) ? ppsc->smart_ps : 1);
475 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
476 ppsc->reg_max_lps_awakeintvl);
477 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
478 if (mode == FW_PS_ACTIVE_MODE)
479 power_state |= FW_PWR_STATE_ACTIVE;
480 else
481 power_state |= FW_PWR_STATE_RF_OFF;
482
483 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
484
485 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
486 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
487 u1_h2c_set_pwrmode, H2C_88E_PWEMODE_LENGTH);
488 rtl88e_fill_h2c_cmd(hw, H2C_88E_SETPWRMODE,
489 H2C_88E_PWEMODE_LENGTH, u1_h2c_set_pwrmode);
490 }
491
492 void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
493 {
494 u8 u1_joinbssrpt_parm[1] = { 0 };
495
496 SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus);
497
498 rtl88e_fill_h2c_cmd(hw, H2C_88E_JOINBSSRPT, 1, u1_joinbssrpt_parm);
499 }
500
501 void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
502 u8 ap_offload_enable)
503 {
504 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
505 u8 u1_apoffload_parm[H2C_88E_AP_OFFLOAD_LENGTH] = { 0 };
506
507 SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
508 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
509 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
510
511 rtl88e_fill_h2c_cmd(hw, H2C_88E_AP_OFFLOAD,
512 H2C_88E_AP_OFFLOAD_LENGTH, u1_apoffload_parm);
513
514 }
515
516 #define BEACON_PG 0 /* ->1 */
517 #define PSPOLL_PG 2
518 #define NULL_PG 3
519 #define PROBERSP_PG 4 /* ->5 */
520
521 #define TOTAL_RESERVED_PKT_LEN 768
522
523 static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
524 /* page 0 beacon */
525 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
526 0xFF, 0xFF, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
527 0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x50, 0x08,
528 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
529 0x64, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x6C, 0x69,
530 0x6E, 0x6B, 0x73, 0x79, 0x73, 0x5F, 0x77, 0x6C,
531 0x61, 0x6E, 0x01, 0x04, 0x82, 0x84, 0x8B, 0x96,
532 0x03, 0x01, 0x01, 0x06, 0x02, 0x00, 0x00, 0x2A,
533 0x01, 0x00, 0x32, 0x08, 0x24, 0x30, 0x48, 0x6C,
534 0x0C, 0x12, 0x18, 0x60, 0x2D, 0x1A, 0x6C, 0x18,
535 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
538 0x3D, 0x00, 0xDD, 0x06, 0x00, 0xE0, 0x4C, 0x02,
539 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541
542 /* page 1 beacon */
543 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
546 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
547 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
548 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
549 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
551 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
555 0x10, 0x00, 0x20, 0x8C, 0x00, 0x12, 0x10, 0x00,
556 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
557 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559
560 /* page 2 ps-poll */
561 0xA4, 0x10, 0x01, 0xC0, 0x00, 0x40, 0x10, 0x10,
562 0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
570 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
571 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573 0x18, 0x00, 0x20, 0x8C, 0x00, 0x12, 0x00, 0x00,
574 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
575 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
576 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577
578 /* page 3 null */
579 0x48, 0x01, 0x00, 0x00, 0x00, 0x40, 0x10, 0x10,
580 0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
581 0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00,
582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
583 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
584 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
589 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
590 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
591 0x72, 0x00, 0x20, 0x8C, 0x00, 0x12, 0x00, 0x00,
592 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
593 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595
596 /* page 4 probe_resp */
597 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x10,
598 0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
599 0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00,
600 0x9E, 0x46, 0x15, 0x32, 0x27, 0xF2, 0x2D, 0x00,
601 0x64, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x6C, 0x69,
602 0x6E, 0x6B, 0x73, 0x79, 0x73, 0x5F, 0x77, 0x6C,
603 0x61, 0x6E, 0x01, 0x04, 0x82, 0x84, 0x8B, 0x96,
604 0x03, 0x01, 0x01, 0x06, 0x02, 0x00, 0x00, 0x2A,
605 0x01, 0x00, 0x32, 0x08, 0x24, 0x30, 0x48, 0x6C,
606 0x0C, 0x12, 0x18, 0x60, 0x2D, 0x1A, 0x6C, 0x18,
607 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610 0x3D, 0x00, 0xDD, 0x06, 0x00, 0xE0, 0x4C, 0x02,
611 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613
614 /* page 5 probe_resp */
615 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
616 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
623 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
626 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
627 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
631 };
632
633 void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
634 {
635 struct rtl_priv *rtlpriv = rtl_priv(hw);
636 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
637 struct sk_buff *skb = NULL;
638 u32 totalpacketlen;
639 bool rtstatus;
640 u8 u1rsvdpageloc[5] = { 0 };
641 bool b_dlok = false;
642 u8 *beacon;
643 u8 *p_pspoll;
644 u8 *nullfunc;
645 u8 *p_probersp;
646
647 /*---------------------------------------------------------
648 * (1) beacon
649 *---------------------------------------------------------
650 */
651 beacon = &reserved_page_packet[BEACON_PG * 128];
652 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
653 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
654
655 /*-------------------------------------------------------
656 * (2) ps-poll
657 *--------------------------------------------------------
658 */
659 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
660 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
661 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
662 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
663
664 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
665
666 /*--------------------------------------------------------
667 * (3) null data
668 *---------------------------------------------------------
669 */
670 nullfunc = &reserved_page_packet[NULL_PG * 128];
671 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
672 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
673 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
674
675 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
676
677 /*---------------------------------------------------------
678 * (4) probe response
679 *----------------------------------------------------------
680 */
681 p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
682 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
683 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
684 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);
685
686 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1rsvdpageloc, PROBERSP_PG);
687
688 totalpacketlen = TOTAL_RESERVED_PKT_LEN;
689
690 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
691 "rtl88e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
692 &reserved_page_packet[0], totalpacketlen);
693 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
694 "rtl88e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
695 u1rsvdpageloc, 3);
696
697 skb = dev_alloc_skb(totalpacketlen);
698 memcpy(skb_put(skb, totalpacketlen),
699 &reserved_page_packet, totalpacketlen);
700
701 rtstatus = rtl_cmd_send_packet(hw, skb);
702
703 if (rtstatus)
704 b_dlok = true;
705
706 if (b_dlok) {
707 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
708 "Set RSVD page location to Fw.\n");
709 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
710 "H2C_RSVDPAGE:\n", u1rsvdpageloc, 3);
711 rtl88e_fill_h2c_cmd(hw, H2C_88E_RSVDPAGE,
712 sizeof(u1rsvdpageloc), u1rsvdpageloc);
713 } else
714 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
715 "Set RSVD page location to Fw FAIL!!!!!!.\n");
716 }
717
718 /*Should check FW support p2p or not.*/
719 static void rtl88e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
720 {
721 u8 u1_ctwindow_period[1] = { ctwindow};
722
723 rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
724
725 }
726
727 void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
728 {
729 struct rtl_priv *rtlpriv = rtl_priv(hw);
730 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
731 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
732 struct rtl_p2p_ps_info *p2pinfo = &(rtlps->p2p_ps_info);
733 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
734 u8 i;
735 u16 ctwindow;
736 u32 start_time, tsf_low;
737
738 switch (p2p_ps_state) {
739 case P2P_PS_DISABLE:
740 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
741 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
742 break;
743 case P2P_PS_ENABLE:
744 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
745 /* update CTWindow value. */
746 if (p2pinfo->ctwindow > 0) {
747 p2p_ps_offload->ctwindow_en = 1;
748 ctwindow = p2pinfo->ctwindow;
749 rtl88e_set_p2p_ctw_period_cmd(hw, ctwindow);
750 }
751
752 /* hw only support 2 set of NoA */
753 for (i = 0 ; i < p2pinfo->noa_num; i++) {
754 /* To control the register setting for which NOA*/
755 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
756 if (i == 0)
757 p2p_ps_offload->noa0_en = 1;
758 else
759 p2p_ps_offload->noa1_en = 1;
760
761 /* config P2P NoA Descriptor Register */
762 rtl_write_dword(rtlpriv, 0x5E0,
763 p2pinfo->noa_duration[i]);
764 rtl_write_dword(rtlpriv, 0x5E4,
765 p2pinfo->noa_interval[i]);
766
767 /*Get Current TSF value */
768 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
769
770 start_time = p2pinfo->noa_start_time[i];
771 if (p2pinfo->noa_count_type[i] != 1) {
772 while (start_time <= (tsf_low+(50*1024))) {
773 start_time += p2pinfo->noa_interval[i];
774 if (p2pinfo->noa_count_type[i] != 255)
775 p2pinfo->noa_count_type[i]--;
776 }
777 }
778 rtl_write_dword(rtlpriv, 0x5E8, start_time);
779 rtl_write_dword(rtlpriv, 0x5EC,
780 p2pinfo->noa_count_type[i]);
781 }
782
783 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
784 /* rst p2p circuit */
785 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
786
787 p2p_ps_offload->offload_en = 1;
788
789 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
790 p2p_ps_offload->role = 1;
791 p2p_ps_offload->allstasleep = -1;
792 } else {
793 p2p_ps_offload->role = 0;
794 }
795
796 p2p_ps_offload->discovery = 0;
797 }
798 break;
799 case P2P_PS_SCAN:
800 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
801 p2p_ps_offload->discovery = 1;
802 break;
803 case P2P_PS_SCAN_DONE:
804 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
805 p2p_ps_offload->discovery = 0;
806 p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
807 break;
808 default:
809 break;
810 }
811
812 rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_OFFLOAD, 1,
813 (u8 *)p2p_ps_offload);
814
815 } 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../efuse.h"
28 #include "../base.h"
29 #include "../regd.h"
30 #include "../cam.h"
31 #include "../ps.h"
32 #include "../pci.h"
33 #include "../pwrseqcmd.h"
34 #include "reg.h"
35 #include "def.h"
36 #include "phy.h"
37 #include "dm.h"
38 #include "fw.h"
39 #include "led.h"
40 #include "hw.h"
41 #include "pwrseq.h"
42
43 #define LLT_CONFIG 5
44
45 static void _rtl88ee_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
46 u8 set_bits, u8 clear_bits)
47 {
48 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
49 struct rtl_priv *rtlpriv = rtl_priv(hw);
50
51 rtlpci->reg_bcn_ctrl_val |= set_bits;
52 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
53
54 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
55 }
56
57 static void _rtl88ee_stop_tx_beacon(struct ieee80211_hw *hw)
58 {
59 struct rtl_priv *rtlpriv = rtl_priv(hw);
60 u8 tmp1byte;
61
62 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
63 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
64 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
65 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
66 tmp1byte &= ~(BIT(0));
67 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
68 }
69
70 static void _rtl88ee_resume_tx_beacon(struct ieee80211_hw *hw)
71 {
72 struct rtl_priv *rtlpriv = rtl_priv(hw);
73 u8 tmp1byte;
74
75 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
76 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
77 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
78 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
79 tmp1byte |= BIT(0);
80 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
81 }
82
83 static void _rtl88ee_enable_bcn_sub_func(struct ieee80211_hw *hw)
84 {
85 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(1));
86 }
87
88 static void _rtl88ee_return_beacon_queue_skb(struct ieee80211_hw *hw)
89 {
90 struct rtl_priv *rtlpriv = rtl_priv(hw);
91 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
92 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
93 unsigned long flags;
94
95 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
96 while (skb_queue_len(&ring->queue)) {
97 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
98 struct sk_buff *skb = __skb_dequeue(&ring->queue);
99
100 pci_unmap_single(rtlpci->pdev,
101 rtlpriv->cfg->ops->get_desc(
102 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
103 skb->len, PCI_DMA_TODEVICE);
104 kfree_skb(skb);
105 ring->idx = (ring->idx + 1) % ring->entries;
106 }
107 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
108 }
109
110 static void _rtl88ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
111 {
112 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(1), 0);
113 }
114
115 static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw,
116 u8 rpwm_val, bool b_need_turn_off_ckk)
117 {
118 struct rtl_priv *rtlpriv = rtl_priv(hw);
119 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
120 bool b_support_remote_wake_up;
121 u32 count = 0, isr_regaddr, content;
122 bool schedule_timer = b_need_turn_off_ckk;
123 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
124 (u8 *)(&b_support_remote_wake_up));
125
126 if (!rtlhal->fw_ready)
127 return;
128 if (!rtlpriv->psc.fw_current_inpsmode)
129 return;
130
131 while (1) {
132 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
133 if (rtlhal->fw_clk_change_in_progress) {
134 while (rtlhal->fw_clk_change_in_progress) {
135 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
136 count++;
137 udelay(100);
138 if (count > 1000)
139 return;
140 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
141 }
142 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
143 } else {
144 rtlhal->fw_clk_change_in_progress = false;
145 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
146 break;
147 }
148 }
149
150 if (IS_IN_LOW_POWER_STATE_88E(rtlhal->fw_ps_state)) {
151 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);
152 if (FW_PS_IS_ACK(rpwm_val)) {
153 isr_regaddr = REG_HISR;
154 content = rtl_read_dword(rtlpriv, isr_regaddr);
155 while (!(content & IMR_CPWM) && (count < 500)) {
156 udelay(50);
157 count++;
158 content = rtl_read_dword(rtlpriv, isr_regaddr);
159 }
160
161 if (content & IMR_CPWM) {
162 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
163 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_88E;
164 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
165 "Receive CPWM INT!!! Set pHalData->FwPSState = %X\n",
166 rtlhal->fw_ps_state);
167 }
168 }
169
170 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
171 rtlhal->fw_clk_change_in_progress = false;
172 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
173 if (schedule_timer) {
174 mod_timer(&rtlpriv->works.fw_clockoff_timer,
175 jiffies + MSECS(10));
176 }
177
178 } else {
179 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
180 rtlhal->fw_clk_change_in_progress = false;
181 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
182 }
183 }
184
185 static void _rtl88ee_set_fw_clock_off(struct ieee80211_hw *hw,
186 u8 rpwm_val)
187 {
188 struct rtl_priv *rtlpriv = rtl_priv(hw);
189 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
190 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
191 struct rtl8192_tx_ring *ring;
192 enum rf_pwrstate rtstate;
193 bool schedule_timer = false;
194 u8 queue;
195
196 if (!rtlhal->fw_ready)
197 return;
198 if (!rtlpriv->psc.fw_current_inpsmode)
199 return;
200 if (!rtlhal->allow_sw_to_change_hwclc)
201 return;
202 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
203 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
204 return;
205
206 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
207 ring = &rtlpci->tx_ring[queue];
208 if (skb_queue_len(&ring->queue)) {
209 schedule_timer = true;
210 break;
211 }
212 }
213
214 if (schedule_timer) {
215 mod_timer(&rtlpriv->works.fw_clockoff_timer,
216 jiffies + MSECS(10));
217 return;
218 }
219
220 if (FW_PS_STATE(rtlhal->fw_ps_state) !=
221 FW_PS_STATE_RF_OFF_LOW_PWR_88E) {
222 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
223 if (!rtlhal->fw_clk_change_in_progress) {
224 rtlhal->fw_clk_change_in_progress = true;
225 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
226 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
227 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
228 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
229 &rpwm_val);
230 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
231 rtlhal->fw_clk_change_in_progress = false;
232 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
233 } else {
234 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
235 mod_timer(&rtlpriv->works.fw_clockoff_timer,
236 jiffies + MSECS(10));
237 }
238 }
239 }
240
241 static void _rtl88ee_set_fw_ps_rf_on(struct ieee80211_hw *hw)
242 {
243 u8 rpwm_val = 0;
244
245 rpwm_val |= (FW_PS_STATE_RF_OFF_88E | FW_PS_ACK);
246 _rtl88ee_set_fw_clock_on(hw, rpwm_val, true);
247 }
248
249 static void _rtl88ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw)
250 {
251 u8 rpwm_val = 0;
252 rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR_88E;
253 _rtl88ee_set_fw_clock_off(hw, rpwm_val);
254 }
255 void rtl88ee_fw_clk_off_timer_callback(unsigned long data)
256 {
257 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
258
259 _rtl88ee_set_fw_ps_rf_off_low_power(hw);
260 }
261
262 static void _rtl88ee_fwlps_leave(struct ieee80211_hw *hw)
263 {
264 struct rtl_priv *rtlpriv = rtl_priv(hw);
265 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
266 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
267 bool fw_current_inps = false;
268 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
269
270 if (ppsc->low_power_enable) {
271 rpwm_val = (FW_PS_STATE_ALL_ON_88E|FW_PS_ACK);/* RF on */
272 _rtl88ee_set_fw_clock_on(hw, rpwm_val, false);
273 rtlhal->allow_sw_to_change_hwclc = false;
274 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
275 &fw_pwrmode);
276 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
277 (u8 *)(&fw_current_inps));
278 } else {
279 rpwm_val = FW_PS_STATE_ALL_ON_88E; /* RF on */
280 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);
281 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
282 &fw_pwrmode);
283 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
284 (u8 *)(&fw_current_inps));
285 }
286 }
287
288 static void _rtl88ee_fwlps_enter(struct ieee80211_hw *hw)
289 {
290 struct rtl_priv *rtlpriv = rtl_priv(hw);
291 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
292 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
293 bool fw_current_inps = true;
294 u8 rpwm_val;
295
296 if (ppsc->low_power_enable) {
297 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_88E; /* RF off */
298 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
299 (u8 *)(&fw_current_inps));
300 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
301 &ppsc->fwctrl_psmode);
302 rtlhal->allow_sw_to_change_hwclc = true;
303 _rtl88ee_set_fw_clock_off(hw, rpwm_val);
304 } else {
305 rpwm_val = FW_PS_STATE_RF_OFF_88E; /* RF off */
306 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
307 (u8 *)(&fw_current_inps));
308 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
309 &ppsc->fwctrl_psmode);
310 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);
311 }
312 }
313
314 void rtl88ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
315 {
316 struct rtl_priv *rtlpriv = rtl_priv(hw);
317 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
318 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
319
320 switch (variable) {
321 case HW_VAR_RCR:
322 *((u32 *)(val)) = rtlpci->receive_config;
323 break;
324 case HW_VAR_RF_STATE:
325 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
326 break;
327 case HW_VAR_FWLPS_RF_ON:{
328 enum rf_pwrstate rfstate;
329 u32 val_rcr;
330
331 rtlpriv->cfg->ops->get_hw_reg(hw,
332 HW_VAR_RF_STATE,
333 (u8 *)(&rfstate));
334 if (rfstate == ERFOFF) {
335 *((bool *)(val)) = true;
336 } else {
337 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
338 val_rcr &= 0x00070000;
339 if (val_rcr)
340 *((bool *)(val)) = false;
341 else
342 *((bool *)(val)) = true;
343 }
344 break; }
345 case HW_VAR_FW_PSMODE_STATUS:
346 *((bool *)(val)) = ppsc->fw_current_inpsmode;
347 break;
348 case HW_VAR_CORRECT_TSF:{
349 u64 tsf;
350 u32 *ptsf_low = (u32 *)&tsf;
351 u32 *ptsf_high = ((u32 *)&tsf) + 1;
352
353 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
354 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
355
356 *((u64 *)(val)) = tsf;
357 break; }
358 default:
359 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
360 "switch case not process %x\n", variable);
361 break;
362 }
363 }
364
365 void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
366 {
367 struct rtl_priv *rtlpriv = rtl_priv(hw);
368 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
369 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
370 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
371 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
372 u8 idx;
373
374 switch (variable) {
375 case HW_VAR_ETHER_ADDR:
376 for (idx = 0; idx < ETH_ALEN; idx++) {
377 rtl_write_byte(rtlpriv, (REG_MACID + idx),
378 val[idx]);
379 }
380 break;
381 case HW_VAR_BASIC_RATE:{
382 u16 b_rate_cfg = ((u16 *)val)[0];
383 u8 rate_index = 0;
384 b_rate_cfg = b_rate_cfg & 0x15f;
385 b_rate_cfg |= 0x01;
386 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
387 rtl_write_byte(rtlpriv, REG_RRSR + 1,
388 (b_rate_cfg >> 8) & 0xff);
389 while (b_rate_cfg > 0x1) {
390 b_rate_cfg = (b_rate_cfg >> 1);
391 rate_index++;
392 }
393 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL,
394 rate_index);
395 break;
396 }
397 case HW_VAR_BSSID:
398 for (idx = 0; idx < ETH_ALEN; idx++) {
399 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
400 val[idx]);
401 }
402 break;
403 case HW_VAR_SIFS:
404 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
405 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
406
407 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
408 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
409
410 if (!mac->ht_enable)
411 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
412 0x0e0e);
413 else
414 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
415 *((u16 *)val));
416 break;
417 case HW_VAR_SLOT_TIME:{
418 u8 e_aci;
419
420 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
421 "HW_VAR_SLOT_TIME %x\n", val[0]);
422
423 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
424
425 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
426 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
427 &e_aci);
428 }
429 break;
430 }
431 case HW_VAR_ACK_PREAMBLE:{
432 u8 reg_tmp;
433 u8 short_preamble = (bool)*val;
434 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
435 if (short_preamble) {
436 reg_tmp |= 0x02;
437 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL +
438 2, reg_tmp);
439 } else {
440 reg_tmp |= 0xFD;
441 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL +
442 2, reg_tmp);
443 }
444 break; }
445 case HW_VAR_WPA_CONFIG:
446 rtl_write_byte(rtlpriv, REG_SECCFG, *val);
447 break;
448 case HW_VAR_AMPDU_MIN_SPACE:{
449 u8 min_spacing_to_set;
450 u8 sec_min_space;
451
452 min_spacing_to_set = *val;
453 if (min_spacing_to_set <= 7) {
454 sec_min_space = 0;
455
456 if (min_spacing_to_set < sec_min_space)
457 min_spacing_to_set = sec_min_space;
458
459 mac->min_space_cfg = ((mac->min_space_cfg &
460 0xf8) |
461 min_spacing_to_set);
462
463 *val = min_spacing_to_set;
464
465 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
466 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
467 mac->min_space_cfg);
468
469 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
470 mac->min_space_cfg);
471 }
472 break; }
473 case HW_VAR_SHORTGI_DENSITY:{
474 u8 density_to_set;
475
476 density_to_set = *val;
477 mac->min_space_cfg |= (density_to_set << 3);
478
479 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
480 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
481 mac->min_space_cfg);
482
483 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
484 mac->min_space_cfg);
485 break;
486 }
487 case HW_VAR_AMPDU_FACTOR:{
488 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 };
489 u8 factor_toset;
490 u8 *p_regtoset = NULL;
491 u8 index = 0;
492
493 p_regtoset = regtoset_normal;
494
495 factor_toset = *val;
496 if (factor_toset <= 3) {
497 factor_toset = (1 << (factor_toset + 2));
498 if (factor_toset > 0xf)
499 factor_toset = 0xf;
500
501 for (index = 0; index < 4; index++) {
502 if ((p_regtoset[index] & 0xf0) >
503 (factor_toset << 4))
504 p_regtoset[index] =
505 (p_regtoset[index] & 0x0f) |
506 (factor_toset << 4);
507
508 if ((p_regtoset[index] & 0x0f) >
509 factor_toset)
510 p_regtoset[index] =
511 (p_regtoset[index] & 0xf0) |
512 (factor_toset);
513
514 rtl_write_byte(rtlpriv,
515 (REG_AGGLEN_LMT + index),
516 p_regtoset[index]);
517
518 }
519
520 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
521 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
522 factor_toset);
523 }
524 break; }
525 case HW_VAR_AC_PARAM:{
526 u8 e_aci = *val;
527 rtl88e_dm_init_edca_turbo(hw);
528
529 if (rtlpci->acm_method != EACMWAY2_SW)
530 rtlpriv->cfg->ops->set_hw_reg(hw,
531 HW_VAR_ACM_CTRL,
532 &e_aci);
533 break; }
534 case HW_VAR_ACM_CTRL:{
535 u8 e_aci = *val;
536 union aci_aifsn *p_aci_aifsn =
537 (union aci_aifsn *)(&(mac->ac[0].aifs));
538 u8 acm = p_aci_aifsn->f.acm;
539 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
540
541 acm_ctrl = acm_ctrl |
542 ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
543
544 if (acm) {
545 switch (e_aci) {
546 case AC0_BE:
547 acm_ctrl |= ACMHW_BEQEN;
548 break;
549 case AC2_VI:
550 acm_ctrl |= ACMHW_VIQEN;
551 break;
552 case AC3_VO:
553 acm_ctrl |= ACMHW_VOQEN;
554 break;
555 default:
556 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
557 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
558 acm);
559 break;
560 }
561 } else {
562 switch (e_aci) {
563 case AC0_BE:
564 acm_ctrl &= (~ACMHW_BEQEN);
565 break;
566 case AC2_VI:
567 acm_ctrl &= (~ACMHW_VIQEN);
568 break;
569 case AC3_VO:
570 acm_ctrl &= (~ACMHW_VOQEN);
571 break;
572 default:
573 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
574 "switch case not process\n");
575 break;
576 }
577 }
578
579 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
580 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
581 acm_ctrl);
582 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
583 break; }
584 case HW_VAR_RCR:
585 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
586 rtlpci->receive_config = ((u32 *)(val))[0];
587 break;
588 case HW_VAR_RETRY_LIMIT:{
589 u8 retry_limit = *val;
590
591 rtl_write_word(rtlpriv, REG_RL,
592 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
593 retry_limit << RETRY_LIMIT_LONG_SHIFT);
594 break; }
595 case HW_VAR_DUAL_TSF_RST:
596 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
597 break;
598 case HW_VAR_EFUSE_BYTES:
599 rtlefuse->efuse_usedbytes = *((u16 *)val);
600 break;
601 case HW_VAR_EFUSE_USAGE:
602 rtlefuse->efuse_usedpercentage = *val;
603 break;
604 case HW_VAR_IO_CMD:
605 rtl88e_phy_set_io_cmd(hw, (*(enum io_type *)val));
606 break;
607 case HW_VAR_SET_RPWM:{
608 u8 rpwm_val;
609
610 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
611 udelay(1);
612
613 if (rpwm_val & BIT(7)) {
614 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val);
615 } else {
616 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val | BIT(7));
617 }
618 break; }
619 case HW_VAR_H2C_FW_PWRMODE:
620 rtl88e_set_fw_pwrmode_cmd(hw, *val);
621 break;
622 case HW_VAR_FW_PSMODE_STATUS:
623 ppsc->fw_current_inpsmode = *((bool *)val);
624 break;
625 case HW_VAR_RESUME_CLK_ON:
626 _rtl88ee_set_fw_ps_rf_on(hw);
627 break;
628 case HW_VAR_FW_LPS_ACTION:{
629 bool enter_fwlps = *((bool *)val);
630
631 if (enter_fwlps)
632 _rtl88ee_fwlps_enter(hw);
633 else
634 _rtl88ee_fwlps_leave(hw);
635
636 break; }
637 case HW_VAR_H2C_FW_JOINBSSRPT:{
638 u8 mstatus = *val;
639 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
640 u8 count = 0, dlbcn_count = 0;
641 bool b_recover = false;
642
643 if (mstatus == RT_MEDIA_CONNECT) {
644 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
645 NULL);
646
647 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
648 rtl_write_byte(rtlpriv, REG_CR + 1,
649 (tmp_regcr | BIT(0)));
650
651 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
652 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
653
654 tmp_reg422 =
655 rtl_read_byte(rtlpriv,
656 REG_FWHW_TXQ_CTRL + 2);
657 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
658 tmp_reg422 & (~BIT(6)));
659 if (tmp_reg422 & BIT(6))
660 b_recover = true;
661
662 do {
663 bcnvalid_reg = rtl_read_byte(rtlpriv,
664 REG_TDECTRL+2);
665 rtl_write_byte(rtlpriv, REG_TDECTRL+2,
666 (bcnvalid_reg | BIT(0)));
667 _rtl88ee_return_beacon_queue_skb(hw);
668
669 rtl88e_set_fw_rsvdpagepkt(hw, 0);
670 bcnvalid_reg = rtl_read_byte(rtlpriv,
671 REG_TDECTRL+2);
672 count = 0;
673 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
674 count++;
675 udelay(10);
676 bcnvalid_reg =
677 rtl_read_byte(rtlpriv, REG_TDECTRL+2);
678 }
679 dlbcn_count++;
680 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
681
682 if (bcnvalid_reg & BIT(0))
683 rtl_write_byte(rtlpriv, REG_TDECTRL+2, BIT(0));
684
685 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
686 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
687
688 if (b_recover) {
689 rtl_write_byte(rtlpriv,
690 REG_FWHW_TXQ_CTRL + 2,
691 tmp_reg422);
692 }
693
694 rtl_write_byte(rtlpriv, REG_CR + 1,
695 (tmp_regcr & ~(BIT(0))));
696 }
697 rtl88e_set_fw_joinbss_report_cmd(hw, (*(u8 *)val));
698 break; }
699 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
700 rtl88e_set_p2p_ps_offload_cmd(hw, *val);
701 break;
702 case HW_VAR_AID:{
703 u16 u2btmp;
704
705 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
706 u2btmp &= 0xC000;
707 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
708 mac->assoc_id));
709 break; }
710 case HW_VAR_CORRECT_TSF:{
711 u8 btype_ibss = *val;
712
713 if (btype_ibss)
714 _rtl88ee_stop_tx_beacon(hw);
715
716 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
717
718 rtl_write_dword(rtlpriv, REG_TSFTR,
719 (u32)(mac->tsf & 0xffffffff));
720 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
721 (u32)((mac->tsf >> 32) & 0xffffffff));
722
723 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
724
725 if (btype_ibss)
726 _rtl88ee_resume_tx_beacon(hw);
727 break; }
728 case HW_VAR_KEEP_ALIVE: {
729 u8 array[2];
730
731 array[0] = 0xff;
732 array[1] = *((u8 *)val);
733 rtl88e_fill_h2c_cmd(hw, H2C_88E_KEEP_ALIVE_CTRL,
734 2, array);
735 break; }
736 default:
737 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
738 "switch case not process %x\n", variable);
739 break;
740 }
741 }
742
743 static bool _rtl88ee_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
744 {
745 struct rtl_priv *rtlpriv = rtl_priv(hw);
746 bool status = true;
747 long count = 0;
748 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
749 _LLT_OP(_LLT_WRITE_ACCESS);
750
751 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
752
753 do {
754 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
755 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
756 break;
757
758 if (count > POLLING_LLT_THRESHOLD) {
759 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
760 "Failed to polling write LLT done at address %d!\n",
761 address);
762 status = false;
763 break;
764 }
765 } while (++count);
766
767 return status;
768 }
769
770 static bool _rtl88ee_llt_table_init(struct ieee80211_hw *hw)
771 {
772 struct rtl_priv *rtlpriv = rtl_priv(hw);
773 unsigned short i;
774 u8 txpktbuf_bndy;
775 u8 maxpage;
776 bool status;
777
778 maxpage = 0xAF;
779 txpktbuf_bndy = 0xAB;
780
781 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x01);
782 rtl_write_dword(rtlpriv, REG_RQPN, 0x80730d29);
783
784 /*0x2600 MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) */
785 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, (0x25FF0000 | txpktbuf_bndy));
786 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
787
788 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
789 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
790
791 rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
792 rtl_write_byte(rtlpriv, REG_PBP, 0x11);
793 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
794
795 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
796 status = _rtl88ee_llt_write(hw, i, i + 1);
797 if (true != status)
798 return status;
799 }
800
801 status = _rtl88ee_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
802 if (true != status)
803 return status;
804
805 for (i = txpktbuf_bndy; i < maxpage; i++) {
806 status = _rtl88ee_llt_write(hw, i, (i + 1));
807 if (true != status)
808 return status;
809 }
810
811 status = _rtl88ee_llt_write(hw, maxpage, txpktbuf_bndy);
812 if (true != status)
813 return status;
814
815 return true;
816 }
817
818 static void _rtl88ee_gen_refresh_led_state(struct ieee80211_hw *hw)
819 {
820 struct rtl_priv *rtlpriv = rtl_priv(hw);
821 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
822 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
823 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0);
824
825 if (rtlpriv->rtlhal.up_first_time)
826 return;
827
828 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
829 rtl88ee_sw_led_on(hw, pLed0);
830 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
831 rtl88ee_sw_led_on(hw, pLed0);
832 else
833 rtl88ee_sw_led_off(hw, pLed0);
834 }
835
836 static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
837 {
838 struct rtl_priv *rtlpriv = rtl_priv(hw);
839 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
840 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
841
842 u8 bytetmp;
843 u16 wordtmp;
844
845 /*Disable XTAL OUTPUT for power saving. YJ,add,111206. */
846 bytetmp = rtl_read_byte(rtlpriv, REG_XCK_OUT_CTRL) & (~BIT(0));
847 rtl_write_byte(rtlpriv, REG_XCK_OUT_CTRL, bytetmp);
848 /*Auto Power Down to CHIP-off State*/
849 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
850 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
851
852 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
853 /* HW Power on sequence */
854 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
855 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
856 RTL8188EE_NIC_ENABLE_FLOW)) {
857 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
858 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n");
859 return false;
860 }
861
862 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
863 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
864
865 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG+2);
866 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+2, bytetmp|BIT(2));
867
868 bytetmp = rtl_read_byte(rtlpriv, REG_WATCH_DOG+1);
869 rtl_write_byte(rtlpriv, REG_WATCH_DOG+1, bytetmp|BIT(7));
870
871 bytetmp = rtl_read_byte(rtlpriv, REG_AFE_XTAL_CTRL_EXT+1);
872 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL_EXT+1, bytetmp|BIT(1));
873
874 bytetmp = rtl_read_byte(rtlpriv, REG_TX_RPT_CTRL);
875 rtl_write_byte(rtlpriv, REG_TX_RPT_CTRL, bytetmp|BIT(1)|BIT(0));
876 rtl_write_byte(rtlpriv, REG_TX_RPT_CTRL+1, 2);
877 rtl_write_word(rtlpriv, REG_TX_RPT_TIME, 0xcdf0);
878
879 /*Add for wake up online*/
880 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
881
882 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp|BIT(3));
883 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG+1);
884 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG+1, (bytetmp & (~BIT(4))));
885 rtl_write_byte(rtlpriv, 0x367, 0x80);
886
887 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
888 rtl_write_byte(rtlpriv, REG_CR+1, 0x06);
889 rtl_write_byte(rtlpriv, MSR, 0x00);
890
891 if (!rtlhal->mac_func_enable) {
892 if (_rtl88ee_llt_table_init(hw) == false) {
893 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
894 "LLT table init fail\n");
895 return false;
896 }
897 }
898 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
899 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
900
901 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
902 wordtmp &= 0xf;
903 wordtmp |= 0xE771;
904 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
905
906 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
907 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xffff);
908 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
909
910 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
911 ((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) &
912 DMA_BIT_MASK(32));
913 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
914 (u64) rtlpci->tx_ring[MGNT_QUEUE].dma &
915 DMA_BIT_MASK(32));
916 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
917 (u64) rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
918 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
919 (u64) rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
920 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
921 (u64) rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
922 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
923 (u64) rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
924 rtl_write_dword(rtlpriv, REG_HQ_DESA,
925 (u64) rtlpci->tx_ring[HIGH_QUEUE].dma &
926 DMA_BIT_MASK(32));
927 rtl_write_dword(rtlpriv, REG_RX_DESA,
928 (u64) rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
929 DMA_BIT_MASK(32));
930
931 /* if we want to support 64 bit DMA, we should set it here,
932 * but now we do not support 64 bit DMA
933 */
934 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
935
936 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
937 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+1, 0);/*Enable RX DMA */
938
939 if (rtlhal->earlymode_enable) {/*Early mode enable*/
940 bytetmp = rtl_read_byte(rtlpriv, REG_EARLY_MODE_CONTROL);
941 bytetmp |= 0x1f;
942 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, bytetmp);
943 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL+3, 0x81);
944 }
945 _rtl88ee_gen_refresh_led_state(hw);
946 return true;
947 }
948
949 static void _rtl88ee_hw_configure(struct ieee80211_hw *hw)
950 {
951 struct rtl_priv *rtlpriv = rtl_priv(hw);
952 u8 reg_bw_opmode;
953 u32 reg_ratr, reg_prsr;
954
955 reg_bw_opmode = BW_OPMODE_20MHZ;
956 reg_ratr = RATE_ALL_CCK | RATE_ALL_OFDM_AG |
957 RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
958 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
959
960 rtl_write_dword(rtlpriv, REG_RRSR, reg_prsr);
961 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, 0xFF);
962 }
963
964 static void _rtl88ee_enable_aspm_back_door(struct ieee80211_hw *hw)
965 {
966 struct rtl_priv *rtlpriv = rtl_priv(hw);
967 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
968 u8 tmp1byte = 0;
969 u32 tmp4byte = 0, count = 0;
970
971 rtl_write_word(rtlpriv, 0x354, 0x8104);
972 rtl_write_word(rtlpriv, 0x358, 0x24);
973
974 rtl_write_word(rtlpriv, 0x350, 0x70c);
975 rtl_write_byte(rtlpriv, 0x352, 0x2);
976 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
977 count = 0;
978 while (tmp1byte && count < 20) {
979 udelay(10);
980 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
981 count++;
982 }
983 if (0 == tmp1byte) {
984 tmp4byte = rtl_read_dword(rtlpriv, 0x34c);
985 rtl_write_dword(rtlpriv, 0x348, tmp4byte|BIT(31));
986 rtl_write_word(rtlpriv, 0x350, 0xf70c);
987 rtl_write_byte(rtlpriv, 0x352, 0x1);
988 }
989
990 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
991 count = 0;
992 while (tmp1byte && count < 20) {
993 udelay(10);
994 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
995 count++;
996 }
997
998 rtl_write_word(rtlpriv, 0x350, 0x718);
999 rtl_write_byte(rtlpriv, 0x352, 0x2);
1000 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1001 count = 0;
1002 while (tmp1byte && count < 20) {
1003 udelay(10);
1004 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1005 count++;
1006 }
1007
1008 if (ppsc->support_backdoor || (0 == tmp1byte)) {
1009 tmp4byte = rtl_read_dword(rtlpriv, 0x34c);
1010 rtl_write_dword(rtlpriv, 0x348, tmp4byte|BIT(11)|BIT(12));
1011 rtl_write_word(rtlpriv, 0x350, 0xf718);
1012 rtl_write_byte(rtlpriv, 0x352, 0x1);
1013 }
1014
1015 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1016 count = 0;
1017 while (tmp1byte && count < 20) {
1018 udelay(10);
1019 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1020 count++;
1021 }
1022 }
1023
1024 void rtl88ee_enable_hw_security_config(struct ieee80211_hw *hw)
1025 {
1026 struct rtl_priv *rtlpriv = rtl_priv(hw);
1027 u8 sec_reg_value;
1028
1029 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1030 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1031 rtlpriv->sec.pairwise_enc_algorithm,
1032 rtlpriv->sec.group_enc_algorithm);
1033
1034 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1035 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1036 "not open hw encryption\n");
1037 return;
1038 }
1039
1040 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1041
1042 if (rtlpriv->sec.use_defaultkey) {
1043 sec_reg_value |= SCR_TXUSEDK;
1044 sec_reg_value |= SCR_RXUSEDK;
1045 }
1046
1047 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1048
1049 rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
1050
1051 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1052 "The SECR-value %x\n", sec_reg_value);
1053
1054 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1055 }
1056
1057 int rtl88ee_hw_init(struct ieee80211_hw *hw)
1058 {
1059 struct rtl_priv *rtlpriv = rtl_priv(hw);
1060 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1061 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1062 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1063 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1064 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1065 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1066 bool rtstatus = true;
1067 int err = 0;
1068 u8 tmp_u1b, u1byte;
1069 unsigned long flags;
1070
1071 rtlpriv->rtlhal.being_init_adapter = true;
1072 /* As this function can take a very long time (up to 350 ms)
1073 * and can be called with irqs disabled, reenable the irqs
1074 * to let the other devices continue being serviced.
1075 *
1076 * It is safe doing so since our own interrupts will only be enabled
1077 * in a subsequent step.
1078 */
1079 local_save_flags(flags);
1080 local_irq_enable();
1081 rtlhal->fw_ready = false;
1082
1083 rtlpriv->intf_ops->disable_aspm(hw);
1084
1085 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR+1);
1086 u1byte = rtl_read_byte(rtlpriv, REG_CR);
1087 if ((tmp_u1b & BIT(3)) && (u1byte != 0 && u1byte != 0xEA)) {
1088 rtlhal->mac_func_enable = true;
1089 } else {
1090 rtlhal->mac_func_enable = false;
1091 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_88E;
1092 }
1093
1094 rtstatus = _rtl88ee_init_mac(hw);
1095 if (rtstatus != true) {
1096 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1097 err = 1;
1098 goto exit;
1099 }
1100
1101 err = rtl88e_download_fw(hw, false);
1102 if (err) {
1103 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1104 "Failed to download FW. Init HW without FW now..\n");
1105 err = 1;
1106 goto exit;
1107 }
1108 rtlhal->fw_ready = true;
1109 /*fw related variable initialize */
1110 rtlhal->last_hmeboxnum = 0;
1111 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_88E;
1112 rtlhal->fw_clk_change_in_progress = false;
1113 rtlhal->allow_sw_to_change_hwclc = false;
1114 ppsc->fw_current_inpsmode = false;
1115
1116 rtl88e_phy_mac_config(hw);
1117 /* because last function modify RCR, so we update
1118 * rcr var here, or TP will unstable for receive_config
1119 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1120 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1121 */
1122 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1123 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1124
1125 rtl88e_phy_bb_config(hw);
1126 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1127 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1128
1129 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
1130 rtl88e_phy_rf_config(hw);
1131
1132 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
1133 RF_CHNLBW, RFREG_OFFSET_MASK);
1134 rtlphy->rfreg_chnlval[0] = rtlphy->rfreg_chnlval[0] & 0xfff00fff;
1135
1136 _rtl88ee_hw_configure(hw);
1137 rtl_cam_reset_all_entry(hw);
1138 rtl88ee_enable_hw_security_config(hw);
1139
1140 rtlhal->mac_func_enable = true;
1141 ppsc->rfpwr_state = ERFON;
1142
1143 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1144 _rtl88ee_enable_aspm_back_door(hw);
1145 rtlpriv->intf_ops->enable_aspm(hw);
1146
1147 if (ppsc->rfpwr_state == ERFON) {
1148 if ((rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) ||
1149 ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) &&
1150 (rtlhal->oem_id == RT_CID_819X_HP))) {
1151 rtl88e_phy_set_rfpath_switch(hw, true);
1152 rtlpriv->dm.fat_table.rx_idle_ant = MAIN_ANT;
1153 } else {
1154 rtl88e_phy_set_rfpath_switch(hw, false);
1155 rtlpriv->dm.fat_table.rx_idle_ant = AUX_ANT;
1156 }
1157 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rx idle ant %s\n",
1158 (rtlpriv->dm.fat_table.rx_idle_ant == MAIN_ANT) ?
1159 ("MAIN_ANT") : ("AUX_ANT"));
1160
1161 if (rtlphy->iqk_initialized) {
1162 rtl88e_phy_iq_calibrate(hw, true);
1163 } else {
1164 rtl88e_phy_iq_calibrate(hw, false);
1165 rtlphy->iqk_initialized = true;
1166 }
1167
1168 rtl88e_dm_check_txpower_tracking(hw);
1169 rtl88e_phy_lc_calibrate(hw);
1170 }
1171
1172 tmp_u1b = efuse_read_1byte(hw, 0x1FA);
1173 if (!(tmp_u1b & BIT(0))) {
1174 rtl_set_rfreg(hw, RF90_PATH_A, 0x15, 0x0F, 0x05);
1175 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "PA BIAS path A\n");
1176 }
1177
1178 if (!(tmp_u1b & BIT(4))) {
1179 tmp_u1b = rtl_read_byte(rtlpriv, 0x16);
1180 tmp_u1b &= 0x0F;
1181 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x80);
1182 udelay(10);
1183 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x90);
1184 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "under 1.5V\n");
1185 }
1186 rtl_write_byte(rtlpriv, REG_NAV_CTRL+2, ((30000+127)/128));
1187 rtl88e_dm_init(hw);
1188 exit:
1189 local_irq_restore(flags);
1190 rtlpriv->rtlhal.being_init_adapter = false;
1191 return err;
1192 }
1193
1194 static enum version_8188e _rtl88ee_read_chip_version(struct ieee80211_hw *hw)
1195 {
1196 struct rtl_priv *rtlpriv = rtl_priv(hw);
1197 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1198 enum version_8188e version = VERSION_UNKNOWN;
1199 u32 value32;
1200
1201 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
1202 if (value32 & TRP_VAUX_EN) {
1203 version = (enum version_8188e) VERSION_TEST_CHIP_88E;
1204 } else {
1205 version = NORMAL_CHIP;
1206 version = version | ((value32 & TYPE_ID) ? RF_TYPE_2T2R : 0);
1207 version = version | ((value32 & VENDOR_ID) ?
1208 CHIP_VENDOR_UMC : 0);
1209 }
1210
1211 rtlphy->rf_type = RF_1T1R;
1212 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1213 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1214 "RF_2T2R" : "RF_1T1R");
1215
1216 return version;
1217 }
1218
1219 static int _rtl88ee_set_media_status(struct ieee80211_hw *hw,
1220 enum nl80211_iftype type)
1221 {
1222 struct rtl_priv *rtlpriv = rtl_priv(hw);
1223 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1224 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1225 u8 mode = MSR_NOLINK;
1226
1227 switch (type) {
1228 case NL80211_IFTYPE_UNSPECIFIED:
1229 mode = MSR_NOLINK;
1230 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1231 "Set Network type to NO LINK!\n");
1232 break;
1233 case NL80211_IFTYPE_ADHOC:
1234 case NL80211_IFTYPE_MESH_POINT:
1235 mode = MSR_ADHOC;
1236 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1237 "Set Network type to Ad Hoc!\n");
1238 break;
1239 case NL80211_IFTYPE_STATION:
1240 mode = MSR_INFRA;
1241 ledaction = LED_CTL_LINK;
1242 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1243 "Set Network type to STA!\n");
1244 break;
1245 case NL80211_IFTYPE_AP:
1246 mode = MSR_AP;
1247 ledaction = LED_CTL_LINK;
1248 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1249 "Set Network type to AP!\n");
1250 break;
1251 default:
1252 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1253 "Network type %d not support!\n", type);
1254 return 1;
1255 break;
1256 }
1257
1258 /* MSR_INFRA == Link in infrastructure network;
1259 * MSR_ADHOC == Link in ad hoc network;
1260 * Therefore, check link state is necessary.
1261 *
1262 * MSR_AP == AP mode; link state is not cared here.
1263 */
1264 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1265 mode = MSR_NOLINK;
1266 ledaction = LED_CTL_NO_LINK;
1267 }
1268
1269 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1270 _rtl88ee_stop_tx_beacon(hw);
1271 _rtl88ee_enable_bcn_sub_func(hw);
1272 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1273 _rtl88ee_resume_tx_beacon(hw);
1274 _rtl88ee_disable_bcn_sub_func(hw);
1275 } else {
1276 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1277 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1278 mode);
1279 }
1280
1281 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1282 rtlpriv->cfg->ops->led_control(hw, ledaction);
1283 if (mode == MSR_AP)
1284 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1285 else
1286 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1287 return 0;
1288 }
1289
1290 void rtl88ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1291 {
1292 struct rtl_priv *rtlpriv = rtl_priv(hw);
1293 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1294 u32 reg_rcr = rtlpci->receive_config;
1295
1296 if (rtlpriv->psc.rfpwr_state != ERFON)
1297 return;
1298
1299 if (check_bssid == true) {
1300 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1301 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1302 (u8 *)(®_rcr));
1303 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
1304 } else if (check_bssid == false) {
1305 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1306 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
1307 rtlpriv->cfg->ops->set_hw_reg(hw,
1308 HW_VAR_RCR, (u8 *)(®_rcr));
1309 }
1310
1311 }
1312
1313 int rtl88ee_set_network_type(struct ieee80211_hw *hw,
1314 enum nl80211_iftype type)
1315 {
1316 struct rtl_priv *rtlpriv = rtl_priv(hw);
1317
1318 if (_rtl88ee_set_media_status(hw, type))
1319 return -EOPNOTSUPP;
1320
1321 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1322 if (type != NL80211_IFTYPE_AP &&
1323 type != NL80211_IFTYPE_MESH_POINT)
1324 rtl88ee_set_check_bssid(hw, true);
1325 } else {
1326 rtl88ee_set_check_bssid(hw, false);
1327 }
1328
1329 return 0;
1330 }
1331
1332 /* don't set REG_EDCA_BE_PARAM here
1333 * because mac80211 will send pkt when scan
1334 */
1335 void rtl88ee_set_qos(struct ieee80211_hw *hw, int aci)
1336 {
1337 struct rtl_priv *rtlpriv = rtl_priv(hw);
1338 rtl88e_dm_init_edca_turbo(hw);
1339 switch (aci) {
1340 case AC1_BK:
1341 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1342 break;
1343 case AC0_BE:
1344 break;
1345 case AC2_VI:
1346 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1347 break;
1348 case AC3_VO:
1349 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1350 break;
1351 default:
1352 RT_ASSERT(false, "invalid aci: %d !\n", aci);
1353 break;
1354 }
1355 }
1356
1357 void rtl88ee_enable_interrupt(struct ieee80211_hw *hw)
1358 {
1359 struct rtl_priv *rtlpriv = rtl_priv(hw);
1360 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1361
1362 rtl_write_dword(rtlpriv, REG_HIMR,
1363 rtlpci->irq_mask[0] & 0xFFFFFFFF);
1364 rtl_write_dword(rtlpriv, REG_HIMRE,
1365 rtlpci->irq_mask[1] & 0xFFFFFFFF);
1366 rtlpci->irq_enabled = true;
1367 /* there are some C2H CMDs have been sent
1368 * before system interrupt is enabled, e.g., C2H, CPWM.
1369 * So we need to clear all C2H events that FW has notified,
1370 * otherwise FW won't schedule any commands anymore.
1371 */
1372 rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0);
1373 /*enable system interrupt*/
1374 rtl_write_dword(rtlpriv, REG_HSIMR,
1375 rtlpci->sys_irq_mask & 0xFFFFFFFF);
1376 }
1377
1378 void rtl88ee_disable_interrupt(struct ieee80211_hw *hw)
1379 {
1380 struct rtl_priv *rtlpriv = rtl_priv(hw);
1381 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1382
1383 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1384 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1385 rtlpci->irq_enabled = false;
1386 /*synchronize_irq(rtlpci->pdev->irq);*/
1387 }
1388
1389 static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)
1390 {
1391 struct rtl_priv *rtlpriv = rtl_priv(hw);
1392 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1393 u8 u1b_tmp;
1394 u32 count = 0;
1395 rtlhal->mac_func_enable = false;
1396 rtlpriv->intf_ops->enable_aspm(hw);
1397
1398 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "POWER OFF adapter\n");
1399 u1b_tmp = rtl_read_byte(rtlpriv, REG_TX_RPT_CTRL);
1400 rtl_write_byte(rtlpriv, REG_TX_RPT_CTRL, u1b_tmp & (~BIT(1)));
1401
1402 u1b_tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1403 while (!(u1b_tmp & BIT(1)) && (count++ < 100)) {
1404 udelay(10);
1405 u1b_tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1406 count++;
1407 }
1408 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+1, 0xFF);
1409
1410 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1411 PWR_INTF_PCI_MSK,
1412 RTL8188EE_NIC_LPS_ENTER_FLOW);
1413
1414 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1415
1416 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && rtlhal->fw_ready)
1417 rtl88e_firmware_selfreset(hw);
1418
1419 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1420 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1421 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1422
1423 u1b_tmp = rtl_read_byte(rtlpriv, REG_32K_CTRL);
1424 rtl_write_byte(rtlpriv, REG_32K_CTRL, (u1b_tmp & (~BIT(0))));
1425
1426 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1427 PWR_INTF_PCI_MSK, RTL8188EE_NIC_DISABLE_FLOW);
1428
1429 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
1430 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
1431 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
1432 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
1433
1434 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0E);
1435
1436 u1b_tmp = rtl_read_byte(rtlpriv, GPIO_IN);
1437 rtl_write_byte(rtlpriv, GPIO_OUT, u1b_tmp);
1438 rtl_write_byte(rtlpriv, GPIO_IO_SEL, 0x7F);
1439
1440 u1b_tmp = rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL);
1441 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL, (u1b_tmp << 4) | u1b_tmp);
1442 u1b_tmp = rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL+1);
1443 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL+1, u1b_tmp | 0x0F);
1444
1445 rtl_write_dword(rtlpriv, REG_GPIO_IO_SEL_2+2, 0x00080808);
1446 }
1447
1448 void rtl88ee_card_disable(struct ieee80211_hw *hw)
1449 {
1450 struct rtl_priv *rtlpriv = rtl_priv(hw);
1451 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1452 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1453 enum nl80211_iftype opmode;
1454
1455 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RTL8188ee card disable\n");
1456
1457 mac->link_state = MAC80211_NOLINK;
1458 opmode = NL80211_IFTYPE_UNSPECIFIED;
1459
1460 _rtl88ee_set_media_status(hw, opmode);
1461
1462 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1463 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1464 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1465
1466 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1467 _rtl88ee_poweroff_adapter(hw);
1468
1469 /* after power off we should do iqk again */
1470 rtlpriv->phy.iqk_initialized = false;
1471 }
1472
1473 void rtl88ee_interrupt_recognized(struct ieee80211_hw *hw,
1474 u32 *p_inta, u32 *p_intb)
1475 {
1476 struct rtl_priv *rtlpriv = rtl_priv(hw);
1477 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1478
1479 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1480 rtl_write_dword(rtlpriv, ISR, *p_inta);
1481
1482 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
1483 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
1484
1485 }
1486
1487 void rtl88ee_set_beacon_related_registers(struct ieee80211_hw *hw)
1488 {
1489 struct rtl_priv *rtlpriv = rtl_priv(hw);
1490 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1491 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1492 u16 bcn_interval, atim_window;
1493
1494 bcn_interval = mac->beacon_interval;
1495 atim_window = 2; /*FIX MERGE */
1496 rtl88ee_disable_interrupt(hw);
1497 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1498 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1499 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1500 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1501 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1502 rtl_write_byte(rtlpriv, 0x606, 0x30);
1503 rtlpci->reg_bcn_ctrl_val |= BIT(3);
1504 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
1505 /*rtl88ee_enable_interrupt(hw);*/
1506 }
1507
1508 void rtl88ee_set_beacon_interval(struct ieee80211_hw *hw)
1509 {
1510 struct rtl_priv *rtlpriv = rtl_priv(hw);
1511 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1512 u16 bcn_interval = mac->beacon_interval;
1513
1514 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
1515 "beacon_interval:%d\n", bcn_interval);
1516 /*rtl88ee_disable_interrupt(hw);*/
1517 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1518 /*rtl88ee_enable_interrupt(hw);*/
1519 }
1520
1521 void rtl88ee_update_interrupt_mask(struct ieee80211_hw *hw,
1522 u32 add_msr, u32 rm_msr)
1523 {
1524 struct rtl_priv *rtlpriv = rtl_priv(hw);
1525 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1526
1527 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
1528 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1529
1530 if (add_msr)
1531 rtlpci->irq_mask[0] |= add_msr;
1532 if (rm_msr)
1533 rtlpci->irq_mask[0] &= (~rm_msr);
1534 rtl88ee_disable_interrupt(hw);
1535 rtl88ee_enable_interrupt(hw);
1536 }
1537
1538 static u8 _rtl88e_get_chnl_group(u8 chnl)
1539 {
1540 u8 group = 0;
1541
1542 if (chnl < 3)
1543 group = 0;
1544 else if (chnl < 6)
1545 group = 1;
1546 else if (chnl < 9)
1547 group = 2;
1548 else if (chnl < 12)
1549 group = 3;
1550 else if (chnl < 14)
1551 group = 4;
1552 else if (chnl == 14)
1553 group = 5;
1554
1555 return group;
1556 }
1557
1558 static void set_24g_base(struct txpower_info_2g *pwrinfo24g, u32 rfpath)
1559 {
1560 int group, txcnt;
1561
1562 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1563 pwrinfo24g->index_cck_base[rfpath][group] = 0x2D;
1564 pwrinfo24g->index_bw40_base[rfpath][group] = 0x2D;
1565 }
1566 for (txcnt = 0; txcnt < MAX_TX_COUNT; txcnt++) {
1567 if (txcnt == 0) {
1568 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
1569 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
1570 } else {
1571 pwrinfo24g->bw20_diff[rfpath][txcnt] = 0xFE;
1572 pwrinfo24g->bw40_diff[rfpath][txcnt] = 0xFE;
1573 pwrinfo24g->cck_diff[rfpath][txcnt] = 0xFE;
1574 pwrinfo24g->ofdm_diff[rfpath][txcnt] = 0xFE;
1575 }
1576 }
1577 }
1578
1579 static void read_power_value_fromprom(struct ieee80211_hw *hw,
1580 struct txpower_info_2g *pwrinfo24g,
1581 struct txpower_info_5g *pwrinfo5g,
1582 bool autoload_fail, u8 *hwinfo)
1583 {
1584 struct rtl_priv *rtlpriv = rtl_priv(hw);
1585 u32 rfpath, eeaddr = EEPROM_TX_PWR_INX, group, txcnt = 0;
1586
1587 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1588 "hal_ReadPowerValueFromPROM88E():PROMContent[0x%x]=0x%x\n",
1589 (eeaddr+1), hwinfo[eeaddr+1]);
1590 if (0xFF == hwinfo[eeaddr+1]) /*YJ,add,120316*/
1591 autoload_fail = true;
1592
1593 if (autoload_fail) {
1594 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1595 "auto load fail : Use Default value!\n");
1596 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
1597 /* 2.4G default value */
1598 set_24g_base(pwrinfo24g, rfpath);
1599 }
1600 return;
1601 }
1602
1603 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
1604 /*2.4G default value*/
1605 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1606 pwrinfo24g->index_cck_base[rfpath][group] =
1607 hwinfo[eeaddr++];
1608 if (pwrinfo24g->index_cck_base[rfpath][group] == 0xFF)
1609 pwrinfo24g->index_cck_base[rfpath][group] =
1610 0x2D;
1611 }
1612 for (group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++) {
1613 pwrinfo24g->index_bw40_base[rfpath][group] =
1614 hwinfo[eeaddr++];
1615 if (pwrinfo24g->index_bw40_base[rfpath][group] == 0xFF)
1616 pwrinfo24g->index_bw40_base[rfpath][group] =
1617 0x2D;
1618 }
1619 pwrinfo24g->bw40_diff[rfpath][0] = 0;
1620 if (hwinfo[eeaddr] == 0xFF) {
1621 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
1622 } else {
1623 pwrinfo24g->bw20_diff[rfpath][0] =
1624 (hwinfo[eeaddr]&0xf0)>>4;
1625 /*bit sign number to 8 bit sign number*/
1626 if (pwrinfo24g->bw20_diff[rfpath][0] & BIT(3))
1627 pwrinfo24g->bw20_diff[rfpath][0] |= 0xF0;
1628 }
1629
1630 if (hwinfo[eeaddr] == 0xFF) {
1631 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
1632 } else {
1633 pwrinfo24g->ofdm_diff[rfpath][0] =
1634 (hwinfo[eeaddr]&0x0f);
1635 /*bit sign number to 8 bit sign number*/
1636 if (pwrinfo24g->ofdm_diff[rfpath][0] & BIT(3))
1637 pwrinfo24g->ofdm_diff[rfpath][0] |= 0xF0;
1638 }
1639 pwrinfo24g->cck_diff[rfpath][0] = 0;
1640 eeaddr++;
1641 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1642 if (hwinfo[eeaddr] == 0xFF) {
1643 pwrinfo24g->bw40_diff[rfpath][txcnt] = 0xFE;
1644 } else {
1645 pwrinfo24g->bw40_diff[rfpath][txcnt] =
1646 (hwinfo[eeaddr]&0xf0)>>4;
1647 if (pwrinfo24g->bw40_diff[rfpath][txcnt] &
1648 BIT(3))
1649 pwrinfo24g->bw40_diff[rfpath][txcnt] |=
1650 0xF0;
1651 }
1652
1653 if (hwinfo[eeaddr] == 0xFF) {
1654 pwrinfo24g->bw20_diff[rfpath][txcnt] =
1655 0xFE;
1656 } else {
1657 pwrinfo24g->bw20_diff[rfpath][txcnt] =
1658 (hwinfo[eeaddr]&0x0f);
1659 if (pwrinfo24g->bw20_diff[rfpath][txcnt] &
1660 BIT(3))
1661 pwrinfo24g->bw20_diff[rfpath][txcnt] |=
1662 0xF0;
1663 }
1664 eeaddr++;
1665
1666 if (hwinfo[eeaddr] == 0xFF) {
1667 pwrinfo24g->ofdm_diff[rfpath][txcnt] = 0xFE;
1668 } else {
1669 pwrinfo24g->ofdm_diff[rfpath][txcnt] =
1670 (hwinfo[eeaddr]&0xf0)>>4;
1671 if (pwrinfo24g->ofdm_diff[rfpath][txcnt] &
1672 BIT(3))
1673 pwrinfo24g->ofdm_diff[rfpath][txcnt] |=
1674 0xF0;
1675 }
1676
1677 if (hwinfo[eeaddr] == 0xFF) {
1678 pwrinfo24g->cck_diff[rfpath][txcnt] = 0xFE;
1679 } else {
1680 pwrinfo24g->cck_diff[rfpath][txcnt] =
1681 (hwinfo[eeaddr]&0x0f);
1682 if (pwrinfo24g->cck_diff[rfpath][txcnt] &
1683 BIT(3))
1684 pwrinfo24g->cck_diff[rfpath][txcnt] |=
1685 0xF0;
1686 }
1687 eeaddr++;
1688 }
1689
1690 /*5G default value*/
1691 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
1692 pwrinfo5g->index_bw40_base[rfpath][group] =
1693 hwinfo[eeaddr++];
1694 if (pwrinfo5g->index_bw40_base[rfpath][group] == 0xFF)
1695 pwrinfo5g->index_bw40_base[rfpath][group] =
1696 0xFE;
1697 }
1698
1699 pwrinfo5g->bw40_diff[rfpath][0] = 0;
1700
1701 if (hwinfo[eeaddr] == 0xFF) {
1702 pwrinfo5g->bw20_diff[rfpath][0] = 0;
1703 } else {
1704 pwrinfo5g->bw20_diff[rfpath][0] =
1705 (hwinfo[eeaddr]&0xf0)>>4;
1706 if (pwrinfo5g->bw20_diff[rfpath][0] & BIT(3))
1707 pwrinfo5g->bw20_diff[rfpath][0] |= 0xF0;
1708 }
1709
1710 if (hwinfo[eeaddr] == 0xFF) {
1711 pwrinfo5g->ofdm_diff[rfpath][0] = 0x04;
1712 } else {
1713 pwrinfo5g->ofdm_diff[rfpath][0] = (hwinfo[eeaddr]&0x0f);
1714 if (pwrinfo5g->ofdm_diff[rfpath][0] & BIT(3))
1715 pwrinfo5g->ofdm_diff[rfpath][0] |= 0xF0;
1716 }
1717 eeaddr++;
1718 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1719 if (hwinfo[eeaddr] == 0xFF) {
1720 pwrinfo5g->bw40_diff[rfpath][txcnt] = 0xFE;
1721 } else {
1722 pwrinfo5g->bw40_diff[rfpath][txcnt] =
1723 (hwinfo[eeaddr]&0xf0)>>4;
1724 if (pwrinfo5g->bw40_diff[rfpath][txcnt] &
1725 BIT(3))
1726 pwrinfo5g->bw40_diff[rfpath][txcnt] |=
1727 0xF0;
1728 }
1729
1730 if (hwinfo[eeaddr] == 0xFF) {
1731 pwrinfo5g->bw20_diff[rfpath][txcnt] = 0xFE;
1732 } else {
1733 pwrinfo5g->bw20_diff[rfpath][txcnt] =
1734 (hwinfo[eeaddr]&0x0f);
1735 if (pwrinfo5g->bw20_diff[rfpath][txcnt] &
1736 BIT(3))
1737 pwrinfo5g->bw20_diff[rfpath][txcnt] |=
1738 0xF0;
1739 }
1740 eeaddr++;
1741 }
1742
1743 if (hwinfo[eeaddr] == 0xFF) {
1744 pwrinfo5g->ofdm_diff[rfpath][1] = 0xFE;
1745 pwrinfo5g->ofdm_diff[rfpath][2] = 0xFE;
1746 } else {
1747 pwrinfo5g->ofdm_diff[rfpath][1] =
1748 (hwinfo[eeaddr]&0xf0)>>4;
1749 pwrinfo5g->ofdm_diff[rfpath][2] =
1750 (hwinfo[eeaddr]&0x0f);
1751 }
1752 eeaddr++;
1753
1754 if (hwinfo[eeaddr] == 0xFF)
1755 pwrinfo5g->ofdm_diff[rfpath][3] = 0xFE;
1756 else
1757 pwrinfo5g->ofdm_diff[rfpath][3] = (hwinfo[eeaddr]&0x0f);
1758 eeaddr++;
1759
1760 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1761 if (pwrinfo5g->ofdm_diff[rfpath][txcnt] == 0xFF)
1762 pwrinfo5g->ofdm_diff[rfpath][txcnt] = 0xFE;
1763 else if (pwrinfo5g->ofdm_diff[rfpath][txcnt] & BIT(3))
1764 pwrinfo5g->ofdm_diff[rfpath][txcnt] |= 0xF0;
1765 }
1766 }
1767 }
1768
1769 static void _rtl88ee_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1770 bool autoload_fail,
1771 u8 *hwinfo)
1772 {
1773 struct rtl_priv *rtlpriv = rtl_priv(hw);
1774 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1775 struct txpower_info_2g pwrinfo24g;
1776 struct txpower_info_5g pwrinfo5g;
1777 u8 rf_path, index;
1778 u8 i;
1779
1780 read_power_value_fromprom(hw, &pwrinfo24g,
1781 &pwrinfo5g, autoload_fail, hwinfo);
1782
1783 for (rf_path = 0; rf_path < 2; rf_path++) {
1784 for (i = 0; i < 14; i++) {
1785 index = _rtl88e_get_chnl_group(i+1);
1786
1787 rtlefuse->txpwrlevel_cck[rf_path][i] =
1788 pwrinfo24g.index_cck_base[rf_path][index];
1789 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1790 pwrinfo24g.index_bw40_base[rf_path][index];
1791 rtlefuse->txpwr_ht20diff[rf_path][i] =
1792 pwrinfo24g.bw20_diff[rf_path][0];
1793 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
1794 pwrinfo24g.ofdm_diff[rf_path][0];
1795 }
1796
1797 for (i = 0; i < 14; i++) {
1798 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1799 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
1800 rf_path, i,
1801 rtlefuse->txpwrlevel_cck[rf_path][i],
1802 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
1803 }
1804 }
1805
1806 if (!autoload_fail)
1807 rtlefuse->eeprom_thermalmeter =
1808 hwinfo[EEPROM_THERMAL_METER_88E];
1809 else
1810 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1811
1812 if (rtlefuse->eeprom_thermalmeter == 0xff || autoload_fail) {
1813 rtlefuse->apk_thermalmeterignore = true;
1814 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1815 }
1816
1817 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
1818 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1819 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1820
1821 if (!autoload_fail) {
1822 rtlefuse->eeprom_regulatory =
1823 hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/
1824 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
1825 rtlefuse->eeprom_regulatory = 0;
1826 } else {
1827 rtlefuse->eeprom_regulatory = 0;
1828 }
1829 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1830 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
1831 }
1832
1833 static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1834 {
1835 struct rtl_priv *rtlpriv = rtl_priv(hw);
1836 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1837 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1838 u16 i, usvalue;
1839 u8 hwinfo[HWSET_MAX_SIZE];
1840 u16 eeprom_id;
1841
1842 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
1843 rtl_efuse_shadow_map_update(hw);
1844
1845 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
1846 HWSET_MAX_SIZE);
1847 } else if (rtlefuse->epromtype == EEPROM_93C46) {
1848 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1849 "RTL819X Not boot from eeprom, check it !!");
1850 return;
1851 } else {
1852 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1853 "boot from neither eeprom nor efuse, check it !!");
1854 return;
1855 }
1856
1857 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
1858 hwinfo, HWSET_MAX_SIZE);
1859
1860 eeprom_id = *((u16 *)&hwinfo[0]);
1861 if (eeprom_id != RTL8188E_EEPROM_ID) {
1862 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1863 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
1864 rtlefuse->autoload_failflag = true;
1865 } else {
1866 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
1867 rtlefuse->autoload_failflag = false;
1868 }
1869
1870 if (rtlefuse->autoload_failflag == true)
1871 return;
1872 /*VID DID SVID SDID*/
1873 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
1874 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
1875 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
1876 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
1877 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1878 "EEPROMId = 0x%4x\n", eeprom_id);
1879 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1880 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
1881 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1882 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
1883 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1884 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
1885 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1886 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
1887 /*customer ID*/
1888 rtlefuse->eeprom_oemid = hwinfo[EEPROM_CUSTOMER_ID];
1889 if (rtlefuse->eeprom_oemid == 0xFF)
1890 rtlefuse->eeprom_oemid = 0;
1891
1892 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1893 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
1894 /*EEPROM version*/
1895 rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];
1896 /*mac address*/
1897 for (i = 0; i < 6; i += 2) {
1898 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
1899 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
1900 }
1901
1902 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1903 "dev_addr: %pM\n", rtlefuse->dev_addr);
1904 /*channel plan */
1905 rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];
1906 /* set channel plan from efuse */
1907 rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
1908 /*tx power*/
1909 _rtl88ee_read_txpower_info_from_hwpg(hw,
1910 rtlefuse->autoload_failflag,
1911 hwinfo);
1912 rtlefuse->txpwr_fromeprom = true;
1913
1914 rtl8188ee_read_bt_coexist_info_from_hwpg(hw,
1915 rtlefuse->autoload_failflag,
1916 hwinfo);
1917
1918 /*board type*/
1919 rtlefuse->board_type =
1920 ((hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0xE0) >> 5);
1921 rtlhal->board_type = rtlefuse->board_type;
1922 /*Wake on wlan*/
1923 rtlefuse->wowlan_enable =
1924 ((hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & 0x40) >> 6);
1925 /*parse xtal*/
1926 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_88E];
1927 if (hwinfo[EEPROM_XTAL_88E])
1928 rtlefuse->crystalcap = 0x20;
1929 /*antenna diversity*/
1930 rtlefuse->antenna_div_cfg =
1931 (hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x18) >> 3;
1932 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
1933 rtlefuse->antenna_div_cfg = 0;
1934 if (rtlpriv->btcoexist.eeprom_bt_coexist != 0 &&
1935 rtlpriv->btcoexist.eeprom_bt_ant_num == ANT_X1)
1936 rtlefuse->antenna_div_cfg = 0;
1937
1938 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
1939 if (rtlefuse->antenna_div_type == 0xFF)
1940 rtlefuse->antenna_div_type = 0x01;
1941 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV ||
1942 rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1943 rtlefuse->antenna_div_cfg = 1;
1944
1945 if (rtlhal->oem_id == RT_CID_DEFAULT) {
1946 switch (rtlefuse->eeprom_oemid) {
1947 case EEPROM_CID_DEFAULT:
1948 if (rtlefuse->eeprom_did == 0x8179) {
1949 if (rtlefuse->eeprom_svid == 0x1025) {
1950 rtlhal->oem_id = RT_CID_819X_ACER;
1951 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
1952 rtlefuse->eeprom_smid == 0x0179) ||
1953 (rtlefuse->eeprom_svid == 0x17AA &&
1954 rtlefuse->eeprom_smid == 0x0179)) {
1955 rtlhal->oem_id = RT_CID_819X_LENOVO;
1956 } else if (rtlefuse->eeprom_svid == 0x103c &&
1957 rtlefuse->eeprom_smid == 0x197d) {
1958 rtlhal->oem_id = RT_CID_819X_HP;
1959 } else {
1960 rtlhal->oem_id = RT_CID_DEFAULT;
1961 }
1962 } else {
1963 rtlhal->oem_id = RT_CID_DEFAULT;
1964 }
1965 break;
1966 case EEPROM_CID_TOSHIBA:
1967 rtlhal->oem_id = RT_CID_TOSHIBA;
1968 break;
1969 case EEPROM_CID_QMI:
1970 rtlhal->oem_id = RT_CID_819X_QMI;
1971 break;
1972 case EEPROM_CID_WHQL:
1973 default:
1974 rtlhal->oem_id = RT_CID_DEFAULT;
1975 break;
1976
1977 }
1978 }
1979 }
1980
1981 static void _rtl88ee_hal_customized_behavior(struct ieee80211_hw *hw)
1982 {
1983 struct rtl_priv *rtlpriv = rtl_priv(hw);
1984 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
1985 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1986
1987 pcipriv->ledctl.led_opendrain = true;
1988
1989 switch (rtlhal->oem_id) {
1990 case RT_CID_819X_HP:
1991 pcipriv->ledctl.led_opendrain = true;
1992 break;
1993 case RT_CID_819X_LENOVO:
1994 case RT_CID_DEFAULT:
1995 case RT_CID_TOSHIBA:
1996 case RT_CID_CCX:
1997 case RT_CID_819X_ACER:
1998 case RT_CID_WHQL:
1999 default:
2000 break;
2001 }
2002 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2003 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2004 }
2005
2006 void rtl88ee_read_eeprom_info(struct ieee80211_hw *hw)
2007 {
2008 struct rtl_priv *rtlpriv = rtl_priv(hw);
2009 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2010 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2011 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2012 u8 tmp_u1b;
2013
2014 rtlhal->version = _rtl88ee_read_chip_version(hw);
2015 if (get_rf_type(rtlphy) == RF_1T1R)
2016 rtlpriv->dm.rfpath_rxenable[0] = true;
2017 else
2018 rtlpriv->dm.rfpath_rxenable[0] =
2019 rtlpriv->dm.rfpath_rxenable[1] = true;
2020 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2021 rtlhal->version);
2022 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2023 if (tmp_u1b & BIT(4)) {
2024 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2025 rtlefuse->epromtype = EEPROM_93C46;
2026 } else {
2027 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2028 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2029 }
2030 if (tmp_u1b & BIT(5)) {
2031 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2032 rtlefuse->autoload_failflag = false;
2033 _rtl88ee_read_adapter_info(hw);
2034 } else {
2035 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
2036 }
2037 _rtl88ee_hal_customized_behavior(hw);
2038 }
2039
2040 static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
2041 struct ieee80211_sta *sta)
2042 {
2043 struct rtl_priv *rtlpriv = rtl_priv(hw);
2044 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2045 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2046 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2047 u32 ratr_value;
2048 u8 ratr_index = 0;
2049 u8 b_nmode = mac->ht_enable;
2050 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2051 u16 shortgi_rate;
2052 u32 tmp_ratr_value;
2053 u8 curtxbw_40mhz = mac->bw_40;
2054 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2055 1 : 0;
2056 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2057 1 : 0;
2058 enum wireless_mode wirelessmode = mac->mode;
2059 u32 ratr_mask;
2060
2061 if (rtlhal->current_bandtype == BAND_ON_5G)
2062 ratr_value = sta->supp_rates[1] << 4;
2063 else
2064 ratr_value = sta->supp_rates[0];
2065 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2066 ratr_value = 0xfff;
2067 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2068 sta->ht_cap.mcs.rx_mask[0] << 12);
2069 switch (wirelessmode) {
2070 case WIRELESS_MODE_B:
2071 if (ratr_value & 0x0000000c)
2072 ratr_value &= 0x0000000d;
2073 else
2074 ratr_value &= 0x0000000f;
2075 break;
2076 case WIRELESS_MODE_G:
2077 ratr_value &= 0x00000FF5;
2078 break;
2079 case WIRELESS_MODE_N_24G:
2080 case WIRELESS_MODE_N_5G:
2081 b_nmode = 1;
2082 if (get_rf_type(rtlphy) == RF_1T2R ||
2083 get_rf_type(rtlphy) == RF_1T1R)
2084 ratr_mask = 0x000ff005;
2085 else
2086 ratr_mask = 0x0f0ff005;
2087
2088 ratr_value &= ratr_mask;
2089 break;
2090 default:
2091 if (rtlphy->rf_type == RF_1T2R)
2092 ratr_value &= 0x000ff0ff;
2093 else
2094 ratr_value &= 0x0f0ff0ff;
2095
2096 break;
2097 }
2098
2099 if ((rtlpriv->btcoexist.bt_coexistence) &&
2100 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
2101 (rtlpriv->btcoexist.bt_cur_state) &&
2102 (rtlpriv->btcoexist.bt_ant_isolation) &&
2103 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
2104 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
2105 ratr_value &= 0x0fffcfc0;
2106 else
2107 ratr_value &= 0x0FFFFFFF;
2108
2109 if (b_nmode &&
2110 ((curtxbw_40mhz && curshortgi_40mhz) ||
2111 (!curtxbw_40mhz && curshortgi_20mhz))) {
2112 ratr_value |= 0x10000000;
2113 tmp_ratr_value = (ratr_value >> 12);
2114
2115 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
2116 if ((1 << shortgi_rate) & tmp_ratr_value)
2117 break;
2118 }
2119
2120 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
2121 (shortgi_rate << 4) | (shortgi_rate);
2122 }
2123
2124 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
2125
2126 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2127 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
2128 }
2129
2130 static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2131 struct ieee80211_sta *sta, u8 rssi_level)
2132 {
2133 struct rtl_priv *rtlpriv = rtl_priv(hw);
2134 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2135 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2136 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2137 struct rtl_sta_info *sta_entry = NULL;
2138 u32 ratr_bitmap;
2139 u8 ratr_index;
2140 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2141 ? 1 : 0;
2142 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2143 1 : 0;
2144 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2145 1 : 0;
2146 enum wireless_mode wirelessmode = 0;
2147 bool b_shortgi = false;
2148 u8 rate_mask[5];
2149 u8 macid = 0;
2150 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2151
2152 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2153 wirelessmode = sta_entry->wireless_mode;
2154 if (mac->opmode == NL80211_IFTYPE_STATION ||
2155 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2156 curtxbw_40mhz = mac->bw_40;
2157 else if (mac->opmode == NL80211_IFTYPE_AP ||
2158 mac->opmode == NL80211_IFTYPE_ADHOC)
2159 macid = sta->aid + 1;
2160
2161 if (rtlhal->current_bandtype == BAND_ON_5G)
2162 ratr_bitmap = sta->supp_rates[1] << 4;
2163 else
2164 ratr_bitmap = sta->supp_rates[0];
2165 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2166 ratr_bitmap = 0xfff;
2167 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2168 sta->ht_cap.mcs.rx_mask[0] << 12);
2169 switch (wirelessmode) {
2170 case WIRELESS_MODE_B:
2171 ratr_index = RATR_INX_WIRELESS_B;
2172 if (ratr_bitmap & 0x0000000c)
2173 ratr_bitmap &= 0x0000000d;
2174 else
2175 ratr_bitmap &= 0x0000000f;
2176 break;
2177 case WIRELESS_MODE_G:
2178 ratr_index = RATR_INX_WIRELESS_GB;
2179
2180 if (rssi_level == 1)
2181 ratr_bitmap &= 0x00000f00;
2182 else if (rssi_level == 2)
2183 ratr_bitmap &= 0x00000ff0;
2184 else
2185 ratr_bitmap &= 0x00000ff5;
2186 break;
2187 case WIRELESS_MODE_N_24G:
2188 case WIRELESS_MODE_N_5G:
2189 ratr_index = RATR_INX_WIRELESS_NGB;
2190 if (rtlphy->rf_type == RF_1T2R ||
2191 rtlphy->rf_type == RF_1T1R) {
2192 if (curtxbw_40mhz) {
2193 if (rssi_level == 1)
2194 ratr_bitmap &= 0x000f0000;
2195 else if (rssi_level == 2)
2196 ratr_bitmap &= 0x000ff000;
2197 else
2198 ratr_bitmap &= 0x000ff015;
2199 } else {
2200 if (rssi_level == 1)
2201 ratr_bitmap &= 0x000f0000;
2202 else if (rssi_level == 2)
2203 ratr_bitmap &= 0x000ff000;
2204 else
2205 ratr_bitmap &= 0x000ff005;
2206 }
2207 } else {
2208 if (curtxbw_40mhz) {
2209 if (rssi_level == 1)
2210 ratr_bitmap &= 0x0f8f0000;
2211 else if (rssi_level == 2)
2212 ratr_bitmap &= 0x0f8ff000;
2213 else
2214 ratr_bitmap &= 0x0f8ff015;
2215 } else {
2216 if (rssi_level == 1)
2217 ratr_bitmap &= 0x0f8f0000;
2218 else if (rssi_level == 2)
2219 ratr_bitmap &= 0x0f8ff000;
2220 else
2221 ratr_bitmap &= 0x0f8ff005;
2222 }
2223 }
2224 /*}*/
2225
2226 if ((curtxbw_40mhz && curshortgi_40mhz) ||
2227 (!curtxbw_40mhz && curshortgi_20mhz)) {
2228
2229 if (macid == 0)
2230 b_shortgi = true;
2231 else if (macid == 1)
2232 b_shortgi = false;
2233 }
2234 break;
2235 default:
2236 ratr_index = RATR_INX_WIRELESS_NGB;
2237
2238 if (rtlphy->rf_type == RF_1T2R)
2239 ratr_bitmap &= 0x000ff0ff;
2240 else
2241 ratr_bitmap &= 0x0f0ff0ff;
2242 break;
2243 }
2244 sta_entry->ratr_index = ratr_index;
2245
2246 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2247 "ratr_bitmap :%x\n", ratr_bitmap);
2248 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2249 (ratr_index << 28);
2250 rate_mask[4] = macid | (b_shortgi ? 0x20 : 0x00) | 0x80;
2251 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2252 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n",
2253 ratr_index, ratr_bitmap,
2254 rate_mask[0], rate_mask[1],
2255 rate_mask[2], rate_mask[3],
2256 rate_mask[4]);
2257 rtl88e_fill_h2c_cmd(hw, H2C_88E_RA_MASK, 5, rate_mask);
2258 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
2259 }
2260
2261 void rtl88ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
2262 struct ieee80211_sta *sta, u8 rssi_level)
2263 {
2264 struct rtl_priv *rtlpriv = rtl_priv(hw);
2265
2266 if (rtlpriv->dm.useramask)
2267 rtl88ee_update_hal_rate_mask(hw, sta, rssi_level);
2268 else
2269 rtl88ee_update_hal_rate_table(hw, sta);
2270 }
2271
2272 void rtl88ee_update_channel_access_setting(struct ieee80211_hw *hw)
2273 {
2274 struct rtl_priv *rtlpriv = rtl_priv(hw);
2275 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2276 u16 sifs_timer;
2277
2278 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);
2279 if (!mac->ht_enable)
2280 sifs_timer = 0x0a0a;
2281 else
2282 sifs_timer = 0x0e0e;
2283 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2284 }
2285
2286 bool rtl88ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2287 {
2288 struct rtl_priv *rtlpriv = rtl_priv(hw);
2289 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2290 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
2291 u32 u4tmp;
2292 bool b_actuallyset = false;
2293
2294 if (rtlpriv->rtlhal.being_init_adapter)
2295 return false;
2296
2297 if (ppsc->swrf_processing)
2298 return false;
2299
2300 spin_lock(&rtlpriv->locks.rf_ps_lock);
2301 if (ppsc->rfchange_inprogress) {
2302 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2303 return false;
2304 } else {
2305 ppsc->rfchange_inprogress = true;
2306 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2307 }
2308
2309 cur_rfstate = ppsc->rfpwr_state;
2310
2311 u4tmp = rtl_read_dword(rtlpriv, REG_GPIO_OUTPUT);
2312 e_rfpowerstate_toset = (u4tmp & BIT(31)) ? ERFON : ERFOFF;
2313
2314 if (ppsc->hwradiooff && (e_rfpowerstate_toset == ERFON)) {
2315 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2316 "GPIOChangeRF - HW Radio ON, RF ON\n");
2317
2318 e_rfpowerstate_toset = ERFON;
2319 ppsc->hwradiooff = false;
2320 b_actuallyset = true;
2321 } else if ((!ppsc->hwradiooff) &&
2322 (e_rfpowerstate_toset == ERFOFF)) {
2323 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2324 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
2325
2326 e_rfpowerstate_toset = ERFOFF;
2327 ppsc->hwradiooff = true;
2328 b_actuallyset = true;
2329 }
2330
2331 if (b_actuallyset) {
2332 spin_lock(&rtlpriv->locks.rf_ps_lock);
2333 ppsc->rfchange_inprogress = false;
2334 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2335 } else {
2336 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
2337 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2338
2339 spin_lock(&rtlpriv->locks.rf_ps_lock);
2340 ppsc->rfchange_inprogress = false;
2341 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2342 }
2343
2344 *valid = 1;
2345 return !ppsc->hwradiooff;
2346
2347 }
2348
2349 void rtl88ee_set_key(struct ieee80211_hw *hw, u32 key_index,
2350 u8 *p_macaddr, bool is_group, u8 enc_algo,
2351 bool is_wepkey, bool clear_all)
2352 {
2353 struct rtl_priv *rtlpriv = rtl_priv(hw);
2354 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2355 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2356 u8 *macaddr = p_macaddr;
2357 u32 entry_id = 0;
2358 bool is_pairwise = false;
2359 static u8 cam_const_addr[4][6] = {
2360 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2361 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2362 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2363 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2364 };
2365 static u8 cam_const_broad[] = {
2366 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2367 };
2368
2369 if (clear_all) {
2370 u8 idx = 0;
2371 u8 cam_offset = 0;
2372 u8 clear_number = 5;
2373
2374 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2375
2376 for (idx = 0; idx < clear_number; idx++) {
2377 rtl_cam_mark_invalid(hw, cam_offset + idx);
2378 rtl_cam_empty_entry(hw, cam_offset + idx);
2379
2380 if (idx < 5) {
2381 memset(rtlpriv->sec.key_buf[idx], 0,
2382 MAX_KEY_LEN);
2383 rtlpriv->sec.key_len[idx] = 0;
2384 }
2385 }
2386
2387 } else {
2388 switch (enc_algo) {
2389 case WEP40_ENCRYPTION:
2390 enc_algo = CAM_WEP40;
2391 break;
2392 case WEP104_ENCRYPTION:
2393 enc_algo = CAM_WEP104;
2394 break;
2395 case TKIP_ENCRYPTION:
2396 enc_algo = CAM_TKIP;
2397 break;
2398 case AESCCMP_ENCRYPTION:
2399 enc_algo = CAM_AES;
2400 break;
2401 default:
2402 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2403 "switch case not process\n");
2404 enc_algo = CAM_TKIP;
2405 break;
2406 }
2407
2408 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2409 macaddr = cam_const_addr[key_index];
2410 entry_id = key_index;
2411 } else {
2412 if (is_group) {
2413 macaddr = cam_const_broad;
2414 entry_id = key_index;
2415 } else {
2416 if (mac->opmode == NL80211_IFTYPE_AP ||
2417 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
2418 entry_id =
2419 rtl_cam_get_free_entry(hw, p_macaddr);
2420 if (entry_id >= TOTAL_CAM_ENTRY) {
2421 RT_TRACE(rtlpriv, COMP_SEC,
2422 DBG_EMERG,
2423 "Can not find free hw security cam entry\n");
2424 return;
2425 }
2426 } else {
2427 entry_id = CAM_PAIRWISE_KEY_POSITION;
2428 }
2429 key_index = PAIRWISE_KEYIDX;
2430 is_pairwise = true;
2431 }
2432 }
2433
2434 if (rtlpriv->sec.key_len[key_index] == 0) {
2435 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2436 "delete one entry, entry_id is %d\n",
2437 entry_id);
2438 if (mac->opmode == NL80211_IFTYPE_AP ||
2439 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2440 rtl_cam_del_entry(hw, p_macaddr);
2441 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2442 } else {
2443 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2444 "add one entry\n");
2445 if (is_pairwise) {
2446 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2447 "set Pairwise key\n");
2448
2449 rtl_cam_add_one_entry(hw, macaddr, key_index,
2450 entry_id, enc_algo,
2451 CAM_CONFIG_NO_USEDK,
2452 rtlpriv->sec.key_buf[key_index]);
2453 } else {
2454 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2455 "set group key\n");
2456
2457 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2458 rtl_cam_add_one_entry(hw,
2459 rtlefuse->dev_addr,
2460 PAIRWISE_KEYIDX,
2461 CAM_PAIRWISE_KEY_POSITION,
2462 enc_algo,
2463 CAM_CONFIG_NO_USEDK,
2464 rtlpriv->sec.key_buf
2465 [entry_id]);
2466 }
2467
2468 rtl_cam_add_one_entry(hw, macaddr, key_index,
2469 entry_id, enc_algo,
2470 CAM_CONFIG_NO_USEDK,
2471 rtlpriv->sec.key_buf[entry_id]);
2472 }
2473
2474 }
2475 }
2476 }
2477
2478 static void rtl8188ee_bt_var_init(struct ieee80211_hw *hw)
2479 {
2480 struct rtl_priv *rtlpriv = rtl_priv(hw);
2481
2482 rtlpriv->btcoexist.bt_coexistence =
2483 rtlpriv->btcoexist.eeprom_bt_coexist;
2484 rtlpriv->btcoexist.bt_ant_num = rtlpriv->btcoexist.eeprom_bt_ant_num;
2485 rtlpriv->btcoexist.bt_coexist_type = rtlpriv->btcoexist.eeprom_bt_type;
2486
2487 if (rtlpriv->btcoexist.reg_bt_iso == 2)
2488 rtlpriv->btcoexist.bt_ant_isolation =
2489 rtlpriv->btcoexist.eeprom_bt_ant_isol;
2490 else
2491 rtlpriv->btcoexist.bt_ant_isolation =
2492 rtlpriv->btcoexist.reg_bt_iso;
2493
2494 rtlpriv->btcoexist.bt_radio_shared_type =
2495 rtlpriv->btcoexist.eeprom_bt_radio_shared;
2496
2497 if (rtlpriv->btcoexist.bt_coexistence) {
2498 if (rtlpriv->btcoexist.reg_bt_sco == 1)
2499 rtlpriv->btcoexist.bt_service = BT_OTHER_ACTION;
2500 else if (rtlpriv->btcoexist.reg_bt_sco == 2)
2501 rtlpriv->btcoexist.bt_service = BT_SCO;
2502 else if (rtlpriv->btcoexist.reg_bt_sco == 4)
2503 rtlpriv->btcoexist.bt_service = BT_BUSY;
2504 else if (rtlpriv->btcoexist.reg_bt_sco == 5)
2505 rtlpriv->btcoexist.bt_service = BT_OTHERBUSY;
2506 else
2507 rtlpriv->btcoexist.bt_service = BT_IDLE;
2508
2509 rtlpriv->btcoexist.bt_edca_ul = 0;
2510 rtlpriv->btcoexist.bt_edca_dl = 0;
2511 rtlpriv->btcoexist.bt_rssi_state = 0xff;
2512 }
2513 }
2514
2515 void rtl8188ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2516 bool auto_load_fail, u8 *hwinfo)
2517 {
2518 struct rtl_priv *rtlpriv = rtl_priv(hw);
2519 u8 value;
2520
2521 if (!auto_load_fail) {
2522 rtlpriv->btcoexist.eeprom_bt_coexist =
2523 ((hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & 0xe0) >> 5);
2524 if (hwinfo[EEPROM_RF_FEATURE_OPTION_88E] == 0xFF)
2525 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2526 value = hwinfo[EEPROM_RF_BT_SETTING_88E];
2527 rtlpriv->btcoexist.eeprom_bt_type = ((value & 0xe) >> 1);
2528 rtlpriv->btcoexist.eeprom_bt_ant_num = (value & 0x1);
2529 rtlpriv->btcoexist.eeprom_bt_ant_isol = ((value & 0x10) >> 4);
2530 rtlpriv->btcoexist.eeprom_bt_radio_shared =
2531 ((value & 0x20) >> 5);
2532 } else {
2533 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2534 rtlpriv->btcoexist.eeprom_bt_type = BT_2WIRE;
2535 rtlpriv->btcoexist.eeprom_bt_ant_num = ANT_X2;
2536 rtlpriv->btcoexist.eeprom_bt_ant_isol = 0;
2537 rtlpriv->btcoexist.eeprom_bt_radio_shared = BT_RADIO_SHARED;
2538 }
2539
2540 rtl8188ee_bt_var_init(hw);
2541 }
2542
2543 void rtl8188ee_bt_reg_init(struct ieee80211_hw *hw)
2544 {
2545 struct rtl_priv *rtlpriv = rtl_priv(hw);
2546
2547 /* 0:Low, 1:High, 2:From Efuse. */
2548 rtlpriv->btcoexist.reg_bt_iso = 2;
2549 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2550 rtlpriv->btcoexist.reg_bt_sco = 3;
2551 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2552 rtlpriv->btcoexist.reg_bt_sco = 0;
2553 }
2554
2555 void rtl8188ee_bt_hw_init(struct ieee80211_hw *hw)
2556 {
2557 struct rtl_priv *rtlpriv = rtl_priv(hw);
2558 struct rtl_phy *rtlphy = &rtlpriv->phy;
2559 u8 u1_tmp;
2560
2561 if (rtlpriv->btcoexist.bt_coexistence &&
2562 ((rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) ||
2563 rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC8)) {
2564 if (rtlpriv->btcoexist.bt_ant_isolation)
2565 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
2566
2567 u1_tmp = rtl_read_byte(rtlpriv, 0x4fd) &
2568 BIT_OFFSET_LEN_MASK_32(0, 1);
2569 u1_tmp = u1_tmp |
2570 ((rtlpriv->btcoexist.bt_ant_isolation == 1) ?
2571 0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
2572 ((rtlpriv->btcoexist.bt_service == BT_SCO) ?
2573 0 : BIT_OFFSET_LEN_MASK_32(2, 1));
2574 rtl_write_byte(rtlpriv, 0x4fd, u1_tmp);
2575
2576 rtl_write_dword(rtlpriv, REG_BT_COEX_TABLE+4, 0xaaaa9aaa);
2577 rtl_write_dword(rtlpriv, REG_BT_COEX_TABLE+8, 0xffbd0040);
2578 rtl_write_dword(rtlpriv, REG_BT_COEX_TABLE+0xc, 0x40000010);
2579
2580 /* Config to 1T1R. */
2581 if (rtlphy->rf_type == RF_1T1R) {
2582 u1_tmp = rtl_read_byte(rtlpriv, ROFDM0_TRXPATHENABLE);
2583 u1_tmp &= ~(BIT_OFFSET_LEN_MASK_32(1, 1));
2584 rtl_write_byte(rtlpriv, ROFDM0_TRXPATHENABLE, u1_tmp);
2585
2586 u1_tmp = rtl_read_byte(rtlpriv, ROFDM1_TRXPATHENABLE);
2587 u1_tmp &= ~(BIT_OFFSET_LEN_MASK_32(1, 1));
2588 rtl_write_byte(rtlpriv, ROFDM1_TRXPATHENABLE, u1_tmp);
2589 }
2590 }
2591 }
2592
2593 void rtl88ee_suspend(struct ieee80211_hw *hw)
2594 {
2595 }
2596
2597 void rtl88ee_resume(struct ieee80211_hw *hw)
2598 {
2599 } 1
2 #include <linux/kernel.h>
3 #include <linux/mutex.h>
4 #include <linux/spinlock.h>
5 #include <linux/errno.h>
6 #include <verifier/rcv.h>
7 #include <linux/list.h>
8
9 /* mutexes */
10 extern int mutex_lock_interruptible(struct mutex *lock);
11 extern int mutex_lock_killable(struct mutex *lock);
12 extern void mutex_lock(struct mutex *lock);
13
14 /* mutex model functions */
15 extern void ldv_mutex_lock(struct mutex *lock, char *sign);
16 extern int ldv_mutex_is_locked(struct mutex *lock, char *sign);
17 extern void ldv_mutex_unlock(struct mutex *lock, char *sign);
18
19
20 /* Spin locks */
21 extern void __ldv_spin_lock(spinlock_t *lock);
22 extern void __ldv_spin_unlock(spinlock_t *lock);
23 extern int __ldv_spin_trylock(spinlock_t *lock);
24 extern void __ldv_spin_unlock_wait(spinlock_t *lock);
25 extern void __ldv_spin_can_lock(spinlock_t *lock);
26 extern int __ldv_atomic_dec_and_lock(spinlock_t *lock);
27
28 /* spin model functions */
29 extern void ldv_spin_lock(spinlock_t *lock, char *sign);
30 extern void ldv_spin_unlock(spinlock_t *lock, char *sign);
31 extern int ldv_spin_is_locked(spinlock_t *lock, char *sign);
32
33 /* Support for list binder functions */
34 static inline struct list_head *ldv_list_get_first(struct list_head *head) {
35 return head->next;
36 }
37
38 static inline int ldv_list_is_stop(struct list_head *pos, struct list_head *head) {
39 return pos==head;
40 }
41
42 static inline struct list_head *ldv_list_get_next(struct list_head *pos) {
43 return pos->next;
44 }
45
46 #include <linux/mutex.h>
47 #include <linux/slab.h>
48 #include <verifier/rcv.h>
49 #include <linux/timer.h>
50 #include <linux/gfp.h>
51 extern struct timer_list * ldv_timer_list_4;
52 extern int ldv_timer_1_3;
53 extern int pci_counter;
54 extern struct timer_list * ldv_timer_list_2_0;
55 extern struct timer_list * ldv_timer_list_3;
56 extern int ldv_timer_2_1;
57 extern int ldv_state_variable_0;
58 extern int ldv_state_variable_5;
59 extern int ldv_timer_state_3 = 0;
60 extern int ldv_timer_2_2;
61 extern int ldv_timer_2_3;
62 extern int ldv_timer_1_0;
63 extern struct pci_dev *rtl88ee_driver_group1;
64 extern int ldv_timer_state_4 = 0;
65 extern int ref_cnt;
66 extern int ldv_state_variable_1;
67 extern int ldv_state_variable_7;
68 extern struct timer_list * ldv_timer_list_1_3;
69 extern struct sk_buff *rtl8188ee_hal_ops_group0;
70 extern struct timer_list * ldv_timer_list_1_1;
71 extern struct timer_list * ldv_timer_list_2_1;
72 extern struct ieee80211_hw *rtl8188ee_hal_ops_group1;
73 extern struct timer_list * ldv_timer_list_1_0;
74 extern int ldv_state_variable_6;
75 extern int ldv_timer_1_2;
76 extern int ldv_timer_2_0;
77 extern struct ieee80211_sta *rtl8188ee_hal_ops_group2;
78 extern int ldv_timer_1_1;
79 extern int ldv_state_variable_2;
80 extern struct timer_list * ldv_timer_list_1_2;
81 extern int LDV_IN_INTERRUPT = 1;
82 extern struct device *rtlwifi_pm_ops_group1;
83 extern struct mutex fs_mutex;
84 extern int ldv_state_variable_3;
85 extern struct timer_list * ldv_timer_list_2_3;
86 extern struct mutex ar_mutex;
87 extern struct timer_list * ldv_timer_list_2_2;
88 extern int ldv_state_variable_4;
89 extern void ldv_pci_driver_5(void);
90 extern void choose_timer_2(void);
91 extern int reg_timer_2(struct timer_list * timer, void (*function)(unsigned long), unsigned long data);
92 extern void activate_pending_timer_2(struct timer_list * timer, unsigned long data, int pending_flag);
93 extern void choose_timer_3(struct timer_list * timer);
94 extern void activate_pending_timer_4(struct timer_list * timer, unsigned long data, int pending_flag);
95 extern void activate_pending_timer_1(struct timer_list * timer, unsigned long data, int pending_flag);
96 extern void choose_timer_4(struct timer_list * timer);
97 extern void timer_init_2(void);
98 extern void timer_init_1(void);
99 extern void disable_suitable_timer_3(struct timer_list * timer);
100 extern void disable_suitable_timer_4(struct timer_list * timer);
101 extern void ldv_dev_pm_ops_6(void);
102 extern int reg_timer_1(struct timer_list * timer, void (*function)(unsigned long), unsigned long data);
103 extern int reg_timer_4(struct timer_list * timer);
104 extern void disable_suitable_timer_2(struct timer_list * timer);
105 extern void disable_suitable_timer_1(struct timer_list * timer);
106 extern void activate_suitable_timer_1(struct timer_list * timer, unsigned long data);
107 extern void activate_pending_timer_3(struct timer_list * timer, unsigned long data, int pending_flag);
108 extern int evil_hack_fs_lock(void);
109 extern int __VERIFIER_nondet_int(void);
110 extern int reg_timer_3(struct timer_list * timer);
111 extern void ldv_initialyze_rtl_hal_ops_7(void);
112 extern void choose_timer_1(void);
113 extern void ldv_timer_1(int state, struct timer_list * timer);
114 extern void activate_suitable_timer_2(struct timer_list * timer, unsigned long data);
115 extern int evil_hack_ar_lock(void);
116 extern void ldv_timer_2(int state, struct timer_list * timer);
117 #line 1 "/work/ldvuser/andrianov/work/current--X--drivers/net/wireless/--X--defaultlinux-4.5-rc7--X--races--X--cpachecker/linux-4.5-rc7/csd_deg_dscv/376/dscv_tempdir/dscv/ri/races/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c"
118 /******************************************************************************
119 *
120 * Copyright(c) 2009-2013 Realtek Corporation.
121 *
122 * This program is free software; you can redistribute it and/or modify it
123 * under the terms of version 2 of the GNU General Public License as
124 * published by the Free Software Foundation.
125 *
126 * This program is distributed in the hope that it will be useful, but WITHOUT
127 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
128 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
129 * more details.
130 *
131 * The full GNU General Public License is included in this distribution in the
132 * file called LICENSE.
133 *
134 * Contact Information:
135 * wlanfae <wlanfae@realtek.com>
136 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
137 * Hsinchu 300, Taiwan.
138 *
139 * Larry Finger <Larry.Finger@lwfinger.net>
140 *
141 *****************************************************************************/
142
143 #include "../wifi.h"
144 #include "../efuse.h"
145 #include "../base.h"
146 #include "../regd.h"
147 #include "../cam.h"
148 #include "../ps.h"
149 #include "../pci.h"
150 #include "../pwrseqcmd.h"
151 #include "reg.h"
152 #include "def.h"
153 #include "phy.h"
154 #include "dm.h"
155 #include "fw.h"
156 #include "led.h"
157 #include "hw.h"
158 #include "pwrseq.h"
159
160 #define LLT_CONFIG 5
161
162 static void _rtl88ee_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
163 u8 set_bits, u8 clear_bits)
164 {
165 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
166 struct rtl_priv *rtlpriv = rtl_priv(hw);
167
168 rtlpci->reg_bcn_ctrl_val |= set_bits;
169 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
170
171 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
172 }
173
174 static void _rtl88ee_stop_tx_beacon(struct ieee80211_hw *hw)
175 {
176 struct rtl_priv *rtlpriv = rtl_priv(hw);
177 u8 tmp1byte;
178
179 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
180 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
181 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
182 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
183 tmp1byte &= ~(BIT(0));
184 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
185 }
186
187 static void _rtl88ee_resume_tx_beacon(struct ieee80211_hw *hw)
188 {
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 u8 tmp1byte;
191
192 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
193 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
194 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
195 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
196 tmp1byte |= BIT(0);
197 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
198 }
199
200 static void _rtl88ee_enable_bcn_sub_func(struct ieee80211_hw *hw)
201 {
202 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(1));
203 }
204
205 static void _rtl88ee_return_beacon_queue_skb(struct ieee80211_hw *hw)
206 {
207 struct rtl_priv *rtlpriv = rtl_priv(hw);
208 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
209 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
210 unsigned long flags;
211
212 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
213 while (skb_queue_len(&ring->queue)) {
214 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
215 struct sk_buff *skb = __skb_dequeue(&ring->queue);
216
217 pci_unmap_single(rtlpci->pdev,
218 rtlpriv->cfg->ops->get_desc(
219 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
220 skb->len, PCI_DMA_TODEVICE);
221 kfree_skb(skb);
222 ring->idx = (ring->idx + 1) % ring->entries;
223 }
224 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
225 }
226
227 static void _rtl88ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
228 {
229 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(1), 0);
230 }
231
232 static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw,
233 u8 rpwm_val, bool b_need_turn_off_ckk)
234 {
235 struct rtl_priv *rtlpriv = rtl_priv(hw);
236 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
237 bool b_support_remote_wake_up;
238 u32 count = 0, isr_regaddr, content;
239 bool schedule_timer = b_need_turn_off_ckk;
240 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
241 (u8 *)(&b_support_remote_wake_up));
242
243 if (!rtlhal->fw_ready)
244 return;
245 if (!rtlpriv->psc.fw_current_inpsmode)
246 return;
247
248 while (1) {
249 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
250 if (rtlhal->fw_clk_change_in_progress) {
251 while (rtlhal->fw_clk_change_in_progress) {
252 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
253 count++;
254 udelay(100);
255 if (count > 1000)
256 return;
257 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
258 }
259 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
260 } else {
261 rtlhal->fw_clk_change_in_progress = false;
262 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
263 break;
264 }
265 }
266
267 if (IS_IN_LOW_POWER_STATE_88E(rtlhal->fw_ps_state)) {
268 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);
269 if (FW_PS_IS_ACK(rpwm_val)) {
270 isr_regaddr = REG_HISR;
271 content = rtl_read_dword(rtlpriv, isr_regaddr);
272 while (!(content & IMR_CPWM) && (count < 500)) {
273 udelay(50);
274 count++;
275 content = rtl_read_dword(rtlpriv, isr_regaddr);
276 }
277
278 if (content & IMR_CPWM) {
279 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
280 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_88E;
281 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
282 "Receive CPWM INT!!! Set pHalData->FwPSState = %X\n",
283 rtlhal->fw_ps_state);
284 }
285 }
286
287 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
288 rtlhal->fw_clk_change_in_progress = false;
289 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
290 if (schedule_timer) {
291 mod_timer(&rtlpriv->works.fw_clockoff_timer,
292 jiffies + MSECS(10));
293 }
294
295 } else {
296 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
297 rtlhal->fw_clk_change_in_progress = false;
298 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
299 }
300 }
301
302 static void _rtl88ee_set_fw_clock_off(struct ieee80211_hw *hw,
303 u8 rpwm_val)
304 {
305 struct rtl_priv *rtlpriv = rtl_priv(hw);
306 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
307 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
308 struct rtl8192_tx_ring *ring;
309 enum rf_pwrstate rtstate;
310 bool schedule_timer = false;
311 u8 queue;
312
313 if (!rtlhal->fw_ready)
314 return;
315 if (!rtlpriv->psc.fw_current_inpsmode)
316 return;
317 if (!rtlhal->allow_sw_to_change_hwclc)
318 return;
319 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
320 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
321 return;
322
323 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
324 ring = &rtlpci->tx_ring[queue];
325 if (skb_queue_len(&ring->queue)) {
326 schedule_timer = true;
327 break;
328 }
329 }
330
331 if (schedule_timer) {
332 mod_timer(&rtlpriv->works.fw_clockoff_timer,
333 jiffies + MSECS(10));
334 return;
335 }
336
337 if (FW_PS_STATE(rtlhal->fw_ps_state) !=
338 FW_PS_STATE_RF_OFF_LOW_PWR_88E) {
339 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
340 if (!rtlhal->fw_clk_change_in_progress) {
341 rtlhal->fw_clk_change_in_progress = true;
342 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
343 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
344 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
345 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
346 &rpwm_val);
347 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
348 rtlhal->fw_clk_change_in_progress = false;
349 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
350 } else {
351 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
352 mod_timer(&rtlpriv->works.fw_clockoff_timer,
353 jiffies + MSECS(10));
354 }
355 }
356 }
357
358 static void _rtl88ee_set_fw_ps_rf_on(struct ieee80211_hw *hw)
359 {
360 u8 rpwm_val = 0;
361
362 rpwm_val |= (FW_PS_STATE_RF_OFF_88E | FW_PS_ACK);
363 _rtl88ee_set_fw_clock_on(hw, rpwm_val, true);
364 }
365
366 static void _rtl88ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw)
367 {
368 u8 rpwm_val = 0;
369 rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR_88E;
370 _rtl88ee_set_fw_clock_off(hw, rpwm_val);
371 }
372 void rtl88ee_fw_clk_off_timer_callback(unsigned long data)
373 {
374 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
375
376 _rtl88ee_set_fw_ps_rf_off_low_power(hw);
377 }
378
379 static void _rtl88ee_fwlps_leave(struct ieee80211_hw *hw)
380 {
381 struct rtl_priv *rtlpriv = rtl_priv(hw);
382 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
383 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
384 bool fw_current_inps = false;
385 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
386
387 if (ppsc->low_power_enable) {
388 rpwm_val = (FW_PS_STATE_ALL_ON_88E|FW_PS_ACK);/* RF on */
389 _rtl88ee_set_fw_clock_on(hw, rpwm_val, false);
390 rtlhal->allow_sw_to_change_hwclc = false;
391 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
392 &fw_pwrmode);
393 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
394 (u8 *)(&fw_current_inps));
395 } else {
396 rpwm_val = FW_PS_STATE_ALL_ON_88E; /* RF on */
397 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);
398 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
399 &fw_pwrmode);
400 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
401 (u8 *)(&fw_current_inps));
402 }
403 }
404
405 static void _rtl88ee_fwlps_enter(struct ieee80211_hw *hw)
406 {
407 struct rtl_priv *rtlpriv = rtl_priv(hw);
408 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
409 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
410 bool fw_current_inps = true;
411 u8 rpwm_val;
412
413 if (ppsc->low_power_enable) {
414 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_88E; /* RF off */
415 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
416 (u8 *)(&fw_current_inps));
417 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
418 &ppsc->fwctrl_psmode);
419 rtlhal->allow_sw_to_change_hwclc = true;
420 _rtl88ee_set_fw_clock_off(hw, rpwm_val);
421 } else {
422 rpwm_val = FW_PS_STATE_RF_OFF_88E; /* RF off */
423 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
424 (u8 *)(&fw_current_inps));
425 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
426 &ppsc->fwctrl_psmode);
427 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val);
428 }
429 }
430
431 void rtl88ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
432 {
433 struct rtl_priv *rtlpriv = rtl_priv(hw);
434 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
435 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
436
437 switch (variable) {
438 case HW_VAR_RCR:
439 *((u32 *)(val)) = rtlpci->receive_config;
440 break;
441 case HW_VAR_RF_STATE:
442 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
443 break;
444 case HW_VAR_FWLPS_RF_ON:{
445 enum rf_pwrstate rfstate;
446 u32 val_rcr;
447
448 rtlpriv->cfg->ops->get_hw_reg(hw,
449 HW_VAR_RF_STATE,
450 (u8 *)(&rfstate));
451 if (rfstate == ERFOFF) {
452 *((bool *)(val)) = true;
453 } else {
454 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
455 val_rcr &= 0x00070000;
456 if (val_rcr)
457 *((bool *)(val)) = false;
458 else
459 *((bool *)(val)) = true;
460 }
461 break; }
462 case HW_VAR_FW_PSMODE_STATUS:
463 *((bool *)(val)) = ppsc->fw_current_inpsmode;
464 break;
465 case HW_VAR_CORRECT_TSF:{
466 u64 tsf;
467 u32 *ptsf_low = (u32 *)&tsf;
468 u32 *ptsf_high = ((u32 *)&tsf) + 1;
469
470 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
471 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
472
473 *((u64 *)(val)) = tsf;
474 break; }
475 default:
476 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
477 "switch case not process %x\n", variable);
478 break;
479 }
480 }
481
482 void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
483 {
484 struct rtl_priv *rtlpriv = rtl_priv(hw);
485 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
486 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
487 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
488 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
489 u8 idx;
490
491 switch (variable) {
492 case HW_VAR_ETHER_ADDR:
493 for (idx = 0; idx < ETH_ALEN; idx++) {
494 rtl_write_byte(rtlpriv, (REG_MACID + idx),
495 val[idx]);
496 }
497 break;
498 case HW_VAR_BASIC_RATE:{
499 u16 b_rate_cfg = ((u16 *)val)[0];
500 u8 rate_index = 0;
501 b_rate_cfg = b_rate_cfg & 0x15f;
502 b_rate_cfg |= 0x01;
503 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
504 rtl_write_byte(rtlpriv, REG_RRSR + 1,
505 (b_rate_cfg >> 8) & 0xff);
506 while (b_rate_cfg > 0x1) {
507 b_rate_cfg = (b_rate_cfg >> 1);
508 rate_index++;
509 }
510 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL,
511 rate_index);
512 break;
513 }
514 case HW_VAR_BSSID:
515 for (idx = 0; idx < ETH_ALEN; idx++) {
516 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
517 val[idx]);
518 }
519 break;
520 case HW_VAR_SIFS:
521 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
522 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
523
524 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
525 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
526
527 if (!mac->ht_enable)
528 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
529 0x0e0e);
530 else
531 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
532 *((u16 *)val));
533 break;
534 case HW_VAR_SLOT_TIME:{
535 u8 e_aci;
536
537 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
538 "HW_VAR_SLOT_TIME %x\n", val[0]);
539
540 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
541
542 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
543 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
544 &e_aci);
545 }
546 break;
547 }
548 case HW_VAR_ACK_PREAMBLE:{
549 u8 reg_tmp;
550 u8 short_preamble = (bool)*val;
551 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
552 if (short_preamble) {
553 reg_tmp |= 0x02;
554 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL +
555 2, reg_tmp);
556 } else {
557 reg_tmp |= 0xFD;
558 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL +
559 2, reg_tmp);
560 }
561 break; }
562 case HW_VAR_WPA_CONFIG:
563 rtl_write_byte(rtlpriv, REG_SECCFG, *val);
564 break;
565 case HW_VAR_AMPDU_MIN_SPACE:{
566 u8 min_spacing_to_set;
567 u8 sec_min_space;
568
569 min_spacing_to_set = *val;
570 if (min_spacing_to_set <= 7) {
571 sec_min_space = 0;
572
573 if (min_spacing_to_set < sec_min_space)
574 min_spacing_to_set = sec_min_space;
575
576 mac->min_space_cfg = ((mac->min_space_cfg &
577 0xf8) |
578 min_spacing_to_set);
579
580 *val = min_spacing_to_set;
581
582 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
583 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
584 mac->min_space_cfg);
585
586 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
587 mac->min_space_cfg);
588 }
589 break; }
590 case HW_VAR_SHORTGI_DENSITY:{
591 u8 density_to_set;
592
593 density_to_set = *val;
594 mac->min_space_cfg |= (density_to_set << 3);
595
596 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
597 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
598 mac->min_space_cfg);
599
600 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
601 mac->min_space_cfg);
602 break;
603 }
604 case HW_VAR_AMPDU_FACTOR:{
605 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 };
606 u8 factor_toset;
607 u8 *p_regtoset = NULL;
608 u8 index = 0;
609
610 p_regtoset = regtoset_normal;
611
612 factor_toset = *val;
613 if (factor_toset <= 3) {
614 factor_toset = (1 << (factor_toset + 2));
615 if (factor_toset > 0xf)
616 factor_toset = 0xf;
617
618 for (index = 0; index < 4; index++) {
619 if ((p_regtoset[index] & 0xf0) >
620 (factor_toset << 4))
621 p_regtoset[index] =
622 (p_regtoset[index] & 0x0f) |
623 (factor_toset << 4);
624
625 if ((p_regtoset[index] & 0x0f) >
626 factor_toset)
627 p_regtoset[index] =
628 (p_regtoset[index] & 0xf0) |
629 (factor_toset);
630
631 rtl_write_byte(rtlpriv,
632 (REG_AGGLEN_LMT + index),
633 p_regtoset[index]);
634
635 }
636
637 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
638 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
639 factor_toset);
640 }
641 break; }
642 case HW_VAR_AC_PARAM:{
643 u8 e_aci = *val;
644 rtl88e_dm_init_edca_turbo(hw);
645
646 if (rtlpci->acm_method != EACMWAY2_SW)
647 rtlpriv->cfg->ops->set_hw_reg(hw,
648 HW_VAR_ACM_CTRL,
649 &e_aci);
650 break; }
651 case HW_VAR_ACM_CTRL:{
652 u8 e_aci = *val;
653 union aci_aifsn *p_aci_aifsn =
654 (union aci_aifsn *)(&(mac->ac[0].aifs));
655 u8 acm = p_aci_aifsn->f.acm;
656 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
657
658 acm_ctrl = acm_ctrl |
659 ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
660
661 if (acm) {
662 switch (e_aci) {
663 case AC0_BE:
664 acm_ctrl |= ACMHW_BEQEN;
665 break;
666 case AC2_VI:
667 acm_ctrl |= ACMHW_VIQEN;
668 break;
669 case AC3_VO:
670 acm_ctrl |= ACMHW_VOQEN;
671 break;
672 default:
673 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
674 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
675 acm);
676 break;
677 }
678 } else {
679 switch (e_aci) {
680 case AC0_BE:
681 acm_ctrl &= (~ACMHW_BEQEN);
682 break;
683 case AC2_VI:
684 acm_ctrl &= (~ACMHW_VIQEN);
685 break;
686 case AC3_VO:
687 acm_ctrl &= (~ACMHW_VOQEN);
688 break;
689 default:
690 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
691 "switch case not process\n");
692 break;
693 }
694 }
695
696 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
697 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
698 acm_ctrl);
699 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
700 break; }
701 case HW_VAR_RCR:
702 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
703 rtlpci->receive_config = ((u32 *)(val))[0];
704 break;
705 case HW_VAR_RETRY_LIMIT:{
706 u8 retry_limit = *val;
707
708 rtl_write_word(rtlpriv, REG_RL,
709 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
710 retry_limit << RETRY_LIMIT_LONG_SHIFT);
711 break; }
712 case HW_VAR_DUAL_TSF_RST:
713 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
714 break;
715 case HW_VAR_EFUSE_BYTES:
716 rtlefuse->efuse_usedbytes = *((u16 *)val);
717 break;
718 case HW_VAR_EFUSE_USAGE:
719 rtlefuse->efuse_usedpercentage = *val;
720 break;
721 case HW_VAR_IO_CMD:
722 rtl88e_phy_set_io_cmd(hw, (*(enum io_type *)val));
723 break;
724 case HW_VAR_SET_RPWM:{
725 u8 rpwm_val;
726
727 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
728 udelay(1);
729
730 if (rpwm_val & BIT(7)) {
731 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val);
732 } else {
733 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val | BIT(7));
734 }
735 break; }
736 case HW_VAR_H2C_FW_PWRMODE:
737 rtl88e_set_fw_pwrmode_cmd(hw, *val);
738 break;
739 case HW_VAR_FW_PSMODE_STATUS:
740 ppsc->fw_current_inpsmode = *((bool *)val);
741 break;
742 case HW_VAR_RESUME_CLK_ON:
743 _rtl88ee_set_fw_ps_rf_on(hw);
744 break;
745 case HW_VAR_FW_LPS_ACTION:{
746 bool enter_fwlps = *((bool *)val);
747
748 if (enter_fwlps)
749 _rtl88ee_fwlps_enter(hw);
750 else
751 _rtl88ee_fwlps_leave(hw);
752
753 break; }
754 case HW_VAR_H2C_FW_JOINBSSRPT:{
755 u8 mstatus = *val;
756 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
757 u8 count = 0, dlbcn_count = 0;
758 bool b_recover = false;
759
760 if (mstatus == RT_MEDIA_CONNECT) {
761 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
762 NULL);
763
764 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
765 rtl_write_byte(rtlpriv, REG_CR + 1,
766 (tmp_regcr | BIT(0)));
767
768 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
769 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
770
771 tmp_reg422 =
772 rtl_read_byte(rtlpriv,
773 REG_FWHW_TXQ_CTRL + 2);
774 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
775 tmp_reg422 & (~BIT(6)));
776 if (tmp_reg422 & BIT(6))
777 b_recover = true;
778
779 do {
780 bcnvalid_reg = rtl_read_byte(rtlpriv,
781 REG_TDECTRL+2);
782 rtl_write_byte(rtlpriv, REG_TDECTRL+2,
783 (bcnvalid_reg | BIT(0)));
784 _rtl88ee_return_beacon_queue_skb(hw);
785
786 rtl88e_set_fw_rsvdpagepkt(hw, 0);
787 bcnvalid_reg = rtl_read_byte(rtlpriv,
788 REG_TDECTRL+2);
789 count = 0;
790 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
791 count++;
792 udelay(10);
793 bcnvalid_reg =
794 rtl_read_byte(rtlpriv, REG_TDECTRL+2);
795 }
796 dlbcn_count++;
797 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
798
799 if (bcnvalid_reg & BIT(0))
800 rtl_write_byte(rtlpriv, REG_TDECTRL+2, BIT(0));
801
802 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
803 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
804
805 if (b_recover) {
806 rtl_write_byte(rtlpriv,
807 REG_FWHW_TXQ_CTRL + 2,
808 tmp_reg422);
809 }
810
811 rtl_write_byte(rtlpriv, REG_CR + 1,
812 (tmp_regcr & ~(BIT(0))));
813 }
814 rtl88e_set_fw_joinbss_report_cmd(hw, (*(u8 *)val));
815 break; }
816 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
817 rtl88e_set_p2p_ps_offload_cmd(hw, *val);
818 break;
819 case HW_VAR_AID:{
820 u16 u2btmp;
821
822 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
823 u2btmp &= 0xC000;
824 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
825 mac->assoc_id));
826 break; }
827 case HW_VAR_CORRECT_TSF:{
828 u8 btype_ibss = *val;
829
830 if (btype_ibss)
831 _rtl88ee_stop_tx_beacon(hw);
832
833 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
834
835 rtl_write_dword(rtlpriv, REG_TSFTR,
836 (u32)(mac->tsf & 0xffffffff));
837 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
838 (u32)((mac->tsf >> 32) & 0xffffffff));
839
840 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
841
842 if (btype_ibss)
843 _rtl88ee_resume_tx_beacon(hw);
844 break; }
845 case HW_VAR_KEEP_ALIVE: {
846 u8 array[2];
847
848 array[0] = 0xff;
849 array[1] = *((u8 *)val);
850 rtl88e_fill_h2c_cmd(hw, H2C_88E_KEEP_ALIVE_CTRL,
851 2, array);
852 break; }
853 default:
854 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
855 "switch case not process %x\n", variable);
856 break;
857 }
858 }
859
860 static bool _rtl88ee_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
861 {
862 struct rtl_priv *rtlpriv = rtl_priv(hw);
863 bool status = true;
864 long count = 0;
865 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
866 _LLT_OP(_LLT_WRITE_ACCESS);
867
868 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
869
870 do {
871 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
872 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
873 break;
874
875 if (count > POLLING_LLT_THRESHOLD) {
876 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
877 "Failed to polling write LLT done at address %d!\n",
878 address);
879 status = false;
880 break;
881 }
882 } while (++count);
883
884 return status;
885 }
886
887 static bool _rtl88ee_llt_table_init(struct ieee80211_hw *hw)
888 {
889 struct rtl_priv *rtlpriv = rtl_priv(hw);
890 unsigned short i;
891 u8 txpktbuf_bndy;
892 u8 maxpage;
893 bool status;
894
895 maxpage = 0xAF;
896 txpktbuf_bndy = 0xAB;
897
898 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x01);
899 rtl_write_dword(rtlpriv, REG_RQPN, 0x80730d29);
900
901 /*0x2600 MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) */
902 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, (0x25FF0000 | txpktbuf_bndy));
903 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
904
905 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
906 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
907
908 rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
909 rtl_write_byte(rtlpriv, REG_PBP, 0x11);
910 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
911
912 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
913 status = _rtl88ee_llt_write(hw, i, i + 1);
914 if (true != status)
915 return status;
916 }
917
918 status = _rtl88ee_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
919 if (true != status)
920 return status;
921
922 for (i = txpktbuf_bndy; i < maxpage; i++) {
923 status = _rtl88ee_llt_write(hw, i, (i + 1));
924 if (true != status)
925 return status;
926 }
927
928 status = _rtl88ee_llt_write(hw, maxpage, txpktbuf_bndy);
929 if (true != status)
930 return status;
931
932 return true;
933 }
934
935 static void _rtl88ee_gen_refresh_led_state(struct ieee80211_hw *hw)
936 {
937 struct rtl_priv *rtlpriv = rtl_priv(hw);
938 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
939 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
940 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0);
941
942 if (rtlpriv->rtlhal.up_first_time)
943 return;
944
945 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
946 rtl88ee_sw_led_on(hw, pLed0);
947 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
948 rtl88ee_sw_led_on(hw, pLed0);
949 else
950 rtl88ee_sw_led_off(hw, pLed0);
951 }
952
953 static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
954 {
955 struct rtl_priv *rtlpriv = rtl_priv(hw);
956 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
957 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
958
959 u8 bytetmp;
960 u16 wordtmp;
961
962 /*Disable XTAL OUTPUT for power saving. YJ,add,111206. */
963 bytetmp = rtl_read_byte(rtlpriv, REG_XCK_OUT_CTRL) & (~BIT(0));
964 rtl_write_byte(rtlpriv, REG_XCK_OUT_CTRL, bytetmp);
965 /*Auto Power Down to CHIP-off State*/
966 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
967 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
968
969 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
970 /* HW Power on sequence */
971 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
972 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
973 RTL8188EE_NIC_ENABLE_FLOW)) {
974 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
975 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n");
976 return false;
977 }
978
979 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
980 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
981
982 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG+2);
983 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+2, bytetmp|BIT(2));
984
985 bytetmp = rtl_read_byte(rtlpriv, REG_WATCH_DOG+1);
986 rtl_write_byte(rtlpriv, REG_WATCH_DOG+1, bytetmp|BIT(7));
987
988 bytetmp = rtl_read_byte(rtlpriv, REG_AFE_XTAL_CTRL_EXT+1);
989 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL_EXT+1, bytetmp|BIT(1));
990
991 bytetmp = rtl_read_byte(rtlpriv, REG_TX_RPT_CTRL);
992 rtl_write_byte(rtlpriv, REG_TX_RPT_CTRL, bytetmp|BIT(1)|BIT(0));
993 rtl_write_byte(rtlpriv, REG_TX_RPT_CTRL+1, 2);
994 rtl_write_word(rtlpriv, REG_TX_RPT_TIME, 0xcdf0);
995
996 /*Add for wake up online*/
997 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
998
999 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp|BIT(3));
1000 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG+1);
1001 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG+1, (bytetmp & (~BIT(4))));
1002 rtl_write_byte(rtlpriv, 0x367, 0x80);
1003
1004 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
1005 rtl_write_byte(rtlpriv, REG_CR+1, 0x06);
1006 rtl_write_byte(rtlpriv, MSR, 0x00);
1007
1008 if (!rtlhal->mac_func_enable) {
1009 if (_rtl88ee_llt_table_init(hw) == false) {
1010 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1011 "LLT table init fail\n");
1012 return false;
1013 }
1014 }
1015 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
1016 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
1017
1018 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
1019 wordtmp &= 0xf;
1020 wordtmp |= 0xE771;
1021 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
1022
1023 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1024 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xffff);
1025 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
1026
1027 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1028 ((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) &
1029 DMA_BIT_MASK(32));
1030 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1031 (u64) rtlpci->tx_ring[MGNT_QUEUE].dma &
1032 DMA_BIT_MASK(32));
1033 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1034 (u64) rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1035 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1036 (u64) rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1037 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1038 (u64) rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1039 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1040 (u64) rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1041 rtl_write_dword(rtlpriv, REG_HQ_DESA,
1042 (u64) rtlpci->tx_ring[HIGH_QUEUE].dma &
1043 DMA_BIT_MASK(32));
1044 rtl_write_dword(rtlpriv, REG_RX_DESA,
1045 (u64) rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
1046 DMA_BIT_MASK(32));
1047
1048 /* if we want to support 64 bit DMA, we should set it here,
1049 * but now we do not support 64 bit DMA
1050 */
1051 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
1052
1053 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
1054 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+1, 0);/*Enable RX DMA */
1055
1056 if (rtlhal->earlymode_enable) {/*Early mode enable*/
1057 bytetmp = rtl_read_byte(rtlpriv, REG_EARLY_MODE_CONTROL);
1058 bytetmp |= 0x1f;
1059 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, bytetmp);
1060 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL+3, 0x81);
1061 }
1062 _rtl88ee_gen_refresh_led_state(hw);
1063 return true;
1064 }
1065
1066 static void _rtl88ee_hw_configure(struct ieee80211_hw *hw)
1067 {
1068 struct rtl_priv *rtlpriv = rtl_priv(hw);
1069 u8 reg_bw_opmode;
1070 u32 reg_ratr, reg_prsr;
1071
1072 reg_bw_opmode = BW_OPMODE_20MHZ;
1073 reg_ratr = RATE_ALL_CCK | RATE_ALL_OFDM_AG |
1074 RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
1075 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
1076
1077 rtl_write_dword(rtlpriv, REG_RRSR, reg_prsr);
1078 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, 0xFF);
1079 }
1080
1081 static void _rtl88ee_enable_aspm_back_door(struct ieee80211_hw *hw)
1082 {
1083 struct rtl_priv *rtlpriv = rtl_priv(hw);
1084 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1085 u8 tmp1byte = 0;
1086 u32 tmp4byte = 0, count = 0;
1087
1088 rtl_write_word(rtlpriv, 0x354, 0x8104);
1089 rtl_write_word(rtlpriv, 0x358, 0x24);
1090
1091 rtl_write_word(rtlpriv, 0x350, 0x70c);
1092 rtl_write_byte(rtlpriv, 0x352, 0x2);
1093 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1094 count = 0;
1095 while (tmp1byte && count < 20) {
1096 udelay(10);
1097 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1098 count++;
1099 }
1100 if (0 == tmp1byte) {
1101 tmp4byte = rtl_read_dword(rtlpriv, 0x34c);
1102 rtl_write_dword(rtlpriv, 0x348, tmp4byte|BIT(31));
1103 rtl_write_word(rtlpriv, 0x350, 0xf70c);
1104 rtl_write_byte(rtlpriv, 0x352, 0x1);
1105 }
1106
1107 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1108 count = 0;
1109 while (tmp1byte && count < 20) {
1110 udelay(10);
1111 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1112 count++;
1113 }
1114
1115 rtl_write_word(rtlpriv, 0x350, 0x718);
1116 rtl_write_byte(rtlpriv, 0x352, 0x2);
1117 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1118 count = 0;
1119 while (tmp1byte && count < 20) {
1120 udelay(10);
1121 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1122 count++;
1123 }
1124
1125 if (ppsc->support_backdoor || (0 == tmp1byte)) {
1126 tmp4byte = rtl_read_dword(rtlpriv, 0x34c);
1127 rtl_write_dword(rtlpriv, 0x348, tmp4byte|BIT(11)|BIT(12));
1128 rtl_write_word(rtlpriv, 0x350, 0xf718);
1129 rtl_write_byte(rtlpriv, 0x352, 0x1);
1130 }
1131
1132 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1133 count = 0;
1134 while (tmp1byte && count < 20) {
1135 udelay(10);
1136 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
1137 count++;
1138 }
1139 }
1140
1141 void rtl88ee_enable_hw_security_config(struct ieee80211_hw *hw)
1142 {
1143 struct rtl_priv *rtlpriv = rtl_priv(hw);
1144 u8 sec_reg_value;
1145
1146 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1147 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1148 rtlpriv->sec.pairwise_enc_algorithm,
1149 rtlpriv->sec.group_enc_algorithm);
1150
1151 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1152 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1153 "not open hw encryption\n");
1154 return;
1155 }
1156
1157 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1158
1159 if (rtlpriv->sec.use_defaultkey) {
1160 sec_reg_value |= SCR_TXUSEDK;
1161 sec_reg_value |= SCR_RXUSEDK;
1162 }
1163
1164 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1165
1166 rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
1167
1168 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1169 "The SECR-value %x\n", sec_reg_value);
1170
1171 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1172 }
1173
1174 int rtl88ee_hw_init(struct ieee80211_hw *hw)
1175 {
1176 struct rtl_priv *rtlpriv = rtl_priv(hw);
1177 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1178 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1179 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1180 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1181 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1182 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1183 bool rtstatus = true;
1184 int err = 0;
1185 u8 tmp_u1b, u1byte;
1186 unsigned long flags;
1187
1188 rtlpriv->rtlhal.being_init_adapter = true;
1189 /* As this function can take a very long time (up to 350 ms)
1190 * and can be called with irqs disabled, reenable the irqs
1191 * to let the other devices continue being serviced.
1192 *
1193 * It is safe doing so since our own interrupts will only be enabled
1194 * in a subsequent step.
1195 */
1196 local_save_flags(flags);
1197 local_irq_enable();
1198 rtlhal->fw_ready = false;
1199
1200 rtlpriv->intf_ops->disable_aspm(hw);
1201
1202 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR+1);
1203 u1byte = rtl_read_byte(rtlpriv, REG_CR);
1204 if ((tmp_u1b & BIT(3)) && (u1byte != 0 && u1byte != 0xEA)) {
1205 rtlhal->mac_func_enable = true;
1206 } else {
1207 rtlhal->mac_func_enable = false;
1208 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_88E;
1209 }
1210
1211 rtstatus = _rtl88ee_init_mac(hw);
1212 if (rtstatus != true) {
1213 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1214 err = 1;
1215 goto exit;
1216 }
1217
1218 err = rtl88e_download_fw(hw, false);
1219 if (err) {
1220 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1221 "Failed to download FW. Init HW without FW now..\n");
1222 err = 1;
1223 goto exit;
1224 }
1225 rtlhal->fw_ready = true;
1226 /*fw related variable initialize */
1227 rtlhal->last_hmeboxnum = 0;
1228 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_88E;
1229 rtlhal->fw_clk_change_in_progress = false;
1230 rtlhal->allow_sw_to_change_hwclc = false;
1231 ppsc->fw_current_inpsmode = false;
1232
1233 rtl88e_phy_mac_config(hw);
1234 /* because last function modify RCR, so we update
1235 * rcr var here, or TP will unstable for receive_config
1236 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1237 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1238 */
1239 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1240 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1241
1242 rtl88e_phy_bb_config(hw);
1243 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1244 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1245
1246 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
1247 rtl88e_phy_rf_config(hw);
1248
1249 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
1250 RF_CHNLBW, RFREG_OFFSET_MASK);
1251 rtlphy->rfreg_chnlval[0] = rtlphy->rfreg_chnlval[0] & 0xfff00fff;
1252
1253 _rtl88ee_hw_configure(hw);
1254 rtl_cam_reset_all_entry(hw);
1255 rtl88ee_enable_hw_security_config(hw);
1256
1257 rtlhal->mac_func_enable = true;
1258 ppsc->rfpwr_state = ERFON;
1259
1260 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1261 _rtl88ee_enable_aspm_back_door(hw);
1262 rtlpriv->intf_ops->enable_aspm(hw);
1263
1264 if (ppsc->rfpwr_state == ERFON) {
1265 if ((rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) ||
1266 ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) &&
1267 (rtlhal->oem_id == RT_CID_819X_HP))) {
1268 rtl88e_phy_set_rfpath_switch(hw, true);
1269 rtlpriv->dm.fat_table.rx_idle_ant = MAIN_ANT;
1270 } else {
1271 rtl88e_phy_set_rfpath_switch(hw, false);
1272 rtlpriv->dm.fat_table.rx_idle_ant = AUX_ANT;
1273 }
1274 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rx idle ant %s\n",
1275 (rtlpriv->dm.fat_table.rx_idle_ant == MAIN_ANT) ?
1276 ("MAIN_ANT") : ("AUX_ANT"));
1277
1278 if (rtlphy->iqk_initialized) {
1279 rtl88e_phy_iq_calibrate(hw, true);
1280 } else {
1281 rtl88e_phy_iq_calibrate(hw, false);
1282 rtlphy->iqk_initialized = true;
1283 }
1284
1285 rtl88e_dm_check_txpower_tracking(hw);
1286 rtl88e_phy_lc_calibrate(hw);
1287 }
1288
1289 tmp_u1b = efuse_read_1byte(hw, 0x1FA);
1290 if (!(tmp_u1b & BIT(0))) {
1291 rtl_set_rfreg(hw, RF90_PATH_A, 0x15, 0x0F, 0x05);
1292 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "PA BIAS path A\n");
1293 }
1294
1295 if (!(tmp_u1b & BIT(4))) {
1296 tmp_u1b = rtl_read_byte(rtlpriv, 0x16);
1297 tmp_u1b &= 0x0F;
1298 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x80);
1299 udelay(10);
1300 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x90);
1301 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "under 1.5V\n");
1302 }
1303 rtl_write_byte(rtlpriv, REG_NAV_CTRL+2, ((30000+127)/128));
1304 rtl88e_dm_init(hw);
1305 exit:
1306 local_irq_restore(flags);
1307 rtlpriv->rtlhal.being_init_adapter = false;
1308 return err;
1309 }
1310
1311 static enum version_8188e _rtl88ee_read_chip_version(struct ieee80211_hw *hw)
1312 {
1313 struct rtl_priv *rtlpriv = rtl_priv(hw);
1314 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1315 enum version_8188e version = VERSION_UNKNOWN;
1316 u32 value32;
1317
1318 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
1319 if (value32 & TRP_VAUX_EN) {
1320 version = (enum version_8188e) VERSION_TEST_CHIP_88E;
1321 } else {
1322 version = NORMAL_CHIP;
1323 version = version | ((value32 & TYPE_ID) ? RF_TYPE_2T2R : 0);
1324 version = version | ((value32 & VENDOR_ID) ?
1325 CHIP_VENDOR_UMC : 0);
1326 }
1327
1328 rtlphy->rf_type = RF_1T1R;
1329 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1330 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1331 "RF_2T2R" : "RF_1T1R");
1332
1333 return version;
1334 }
1335
1336 static int _rtl88ee_set_media_status(struct ieee80211_hw *hw,
1337 enum nl80211_iftype type)
1338 {
1339 struct rtl_priv *rtlpriv = rtl_priv(hw);
1340 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1341 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1342 u8 mode = MSR_NOLINK;
1343
1344 switch (type) {
1345 case NL80211_IFTYPE_UNSPECIFIED:
1346 mode = MSR_NOLINK;
1347 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1348 "Set Network type to NO LINK!\n");
1349 break;
1350 case NL80211_IFTYPE_ADHOC:
1351 case NL80211_IFTYPE_MESH_POINT:
1352 mode = MSR_ADHOC;
1353 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1354 "Set Network type to Ad Hoc!\n");
1355 break;
1356 case NL80211_IFTYPE_STATION:
1357 mode = MSR_INFRA;
1358 ledaction = LED_CTL_LINK;
1359 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1360 "Set Network type to STA!\n");
1361 break;
1362 case NL80211_IFTYPE_AP:
1363 mode = MSR_AP;
1364 ledaction = LED_CTL_LINK;
1365 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1366 "Set Network type to AP!\n");
1367 break;
1368 default:
1369 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1370 "Network type %d not support!\n", type);
1371 return 1;
1372 break;
1373 }
1374
1375 /* MSR_INFRA == Link in infrastructure network;
1376 * MSR_ADHOC == Link in ad hoc network;
1377 * Therefore, check link state is necessary.
1378 *
1379 * MSR_AP == AP mode; link state is not cared here.
1380 */
1381 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1382 mode = MSR_NOLINK;
1383 ledaction = LED_CTL_NO_LINK;
1384 }
1385
1386 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1387 _rtl88ee_stop_tx_beacon(hw);
1388 _rtl88ee_enable_bcn_sub_func(hw);
1389 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1390 _rtl88ee_resume_tx_beacon(hw);
1391 _rtl88ee_disable_bcn_sub_func(hw);
1392 } else {
1393 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1394 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1395 mode);
1396 }
1397
1398 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1399 rtlpriv->cfg->ops->led_control(hw, ledaction);
1400 if (mode == MSR_AP)
1401 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1402 else
1403 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1404 return 0;
1405 }
1406
1407 void rtl88ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1408 {
1409 struct rtl_priv *rtlpriv = rtl_priv(hw);
1410 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1411 u32 reg_rcr = rtlpci->receive_config;
1412
1413 if (rtlpriv->psc.rfpwr_state != ERFON)
1414 return;
1415
1416 if (check_bssid == true) {
1417 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1418 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1419 (u8 *)(®_rcr));
1420 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
1421 } else if (check_bssid == false) {
1422 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1423 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
1424 rtlpriv->cfg->ops->set_hw_reg(hw,
1425 HW_VAR_RCR, (u8 *)(®_rcr));
1426 }
1427
1428 }
1429
1430 int rtl88ee_set_network_type(struct ieee80211_hw *hw,
1431 enum nl80211_iftype type)
1432 {
1433 struct rtl_priv *rtlpriv = rtl_priv(hw);
1434
1435 if (_rtl88ee_set_media_status(hw, type))
1436 return -EOPNOTSUPP;
1437
1438 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1439 if (type != NL80211_IFTYPE_AP &&
1440 type != NL80211_IFTYPE_MESH_POINT)
1441 rtl88ee_set_check_bssid(hw, true);
1442 } else {
1443 rtl88ee_set_check_bssid(hw, false);
1444 }
1445
1446 return 0;
1447 }
1448
1449 /* don't set REG_EDCA_BE_PARAM here
1450 * because mac80211 will send pkt when scan
1451 */
1452 void rtl88ee_set_qos(struct ieee80211_hw *hw, int aci)
1453 {
1454 struct rtl_priv *rtlpriv = rtl_priv(hw);
1455 rtl88e_dm_init_edca_turbo(hw);
1456 switch (aci) {
1457 case AC1_BK:
1458 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1459 break;
1460 case AC0_BE:
1461 break;
1462 case AC2_VI:
1463 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1464 break;
1465 case AC3_VO:
1466 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1467 break;
1468 default:
1469 RT_ASSERT(false, "invalid aci: %d !\n", aci);
1470 break;
1471 }
1472 }
1473
1474 void rtl88ee_enable_interrupt(struct ieee80211_hw *hw)
1475 {
1476 struct rtl_priv *rtlpriv = rtl_priv(hw);
1477 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1478
1479 rtl_write_dword(rtlpriv, REG_HIMR,
1480 rtlpci->irq_mask[0] & 0xFFFFFFFF);
1481 rtl_write_dword(rtlpriv, REG_HIMRE,
1482 rtlpci->irq_mask[1] & 0xFFFFFFFF);
1483 rtlpci->irq_enabled = true;
1484 /* there are some C2H CMDs have been sent
1485 * before system interrupt is enabled, e.g., C2H, CPWM.
1486 * So we need to clear all C2H events that FW has notified,
1487 * otherwise FW won't schedule any commands anymore.
1488 */
1489 rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0);
1490 /*enable system interrupt*/
1491 rtl_write_dword(rtlpriv, REG_HSIMR,
1492 rtlpci->sys_irq_mask & 0xFFFFFFFF);
1493 }
1494
1495 void rtl88ee_disable_interrupt(struct ieee80211_hw *hw)
1496 {
1497 struct rtl_priv *rtlpriv = rtl_priv(hw);
1498 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1499
1500 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1501 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1502 rtlpci->irq_enabled = false;
1503 /*synchronize_irq(rtlpci->pdev->irq);*/
1504 }
1505
1506 static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)
1507 {
1508 struct rtl_priv *rtlpriv = rtl_priv(hw);
1509 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1510 u8 u1b_tmp;
1511 u32 count = 0;
1512 rtlhal->mac_func_enable = false;
1513 rtlpriv->intf_ops->enable_aspm(hw);
1514
1515 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "POWER OFF adapter\n");
1516 u1b_tmp = rtl_read_byte(rtlpriv, REG_TX_RPT_CTRL);
1517 rtl_write_byte(rtlpriv, REG_TX_RPT_CTRL, u1b_tmp & (~BIT(1)));
1518
1519 u1b_tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1520 while (!(u1b_tmp & BIT(1)) && (count++ < 100)) {
1521 udelay(10);
1522 u1b_tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1523 count++;
1524 }
1525 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+1, 0xFF);
1526
1527 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1528 PWR_INTF_PCI_MSK,
1529 RTL8188EE_NIC_LPS_ENTER_FLOW);
1530
1531 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1532
1533 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && rtlhal->fw_ready)
1534 rtl88e_firmware_selfreset(hw);
1535
1536 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1537 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1538 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1539
1540 u1b_tmp = rtl_read_byte(rtlpriv, REG_32K_CTRL);
1541 rtl_write_byte(rtlpriv, REG_32K_CTRL, (u1b_tmp & (~BIT(0))));
1542
1543 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1544 PWR_INTF_PCI_MSK, RTL8188EE_NIC_DISABLE_FLOW);
1545
1546 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
1547 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
1548 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
1549 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
1550
1551 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0E);
1552
1553 u1b_tmp = rtl_read_byte(rtlpriv, GPIO_IN);
1554 rtl_write_byte(rtlpriv, GPIO_OUT, u1b_tmp);
1555 rtl_write_byte(rtlpriv, GPIO_IO_SEL, 0x7F);
1556
1557 u1b_tmp = rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL);
1558 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL, (u1b_tmp << 4) | u1b_tmp);
1559 u1b_tmp = rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL+1);
1560 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL+1, u1b_tmp | 0x0F);
1561
1562 rtl_write_dword(rtlpriv, REG_GPIO_IO_SEL_2+2, 0x00080808);
1563 }
1564
1565 void rtl88ee_card_disable(struct ieee80211_hw *hw)
1566 {
1567 struct rtl_priv *rtlpriv = rtl_priv(hw);
1568 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1569 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1570 enum nl80211_iftype opmode;
1571
1572 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RTL8188ee card disable\n");
1573
1574 mac->link_state = MAC80211_NOLINK;
1575 opmode = NL80211_IFTYPE_UNSPECIFIED;
1576
1577 _rtl88ee_set_media_status(hw, opmode);
1578
1579 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1580 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1581 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1582
1583 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1584 _rtl88ee_poweroff_adapter(hw);
1585
1586 /* after power off we should do iqk again */
1587 rtlpriv->phy.iqk_initialized = false;
1588 }
1589
1590 void rtl88ee_interrupt_recognized(struct ieee80211_hw *hw,
1591 u32 *p_inta, u32 *p_intb)
1592 {
1593 struct rtl_priv *rtlpriv = rtl_priv(hw);
1594 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1595
1596 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1597 rtl_write_dword(rtlpriv, ISR, *p_inta);
1598
1599 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
1600 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
1601
1602 }
1603
1604 void rtl88ee_set_beacon_related_registers(struct ieee80211_hw *hw)
1605 {
1606 struct rtl_priv *rtlpriv = rtl_priv(hw);
1607 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1608 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1609 u16 bcn_interval, atim_window;
1610
1611 bcn_interval = mac->beacon_interval;
1612 atim_window = 2; /*FIX MERGE */
1613 rtl88ee_disable_interrupt(hw);
1614 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1615 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1616 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1617 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1618 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1619 rtl_write_byte(rtlpriv, 0x606, 0x30);
1620 rtlpci->reg_bcn_ctrl_val |= BIT(3);
1621 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
1622 /*rtl88ee_enable_interrupt(hw);*/
1623 }
1624
1625 void rtl88ee_set_beacon_interval(struct ieee80211_hw *hw)
1626 {
1627 struct rtl_priv *rtlpriv = rtl_priv(hw);
1628 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1629 u16 bcn_interval = mac->beacon_interval;
1630
1631 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
1632 "beacon_interval:%d\n", bcn_interval);
1633 /*rtl88ee_disable_interrupt(hw);*/
1634 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1635 /*rtl88ee_enable_interrupt(hw);*/
1636 }
1637
1638 void rtl88ee_update_interrupt_mask(struct ieee80211_hw *hw,
1639 u32 add_msr, u32 rm_msr)
1640 {
1641 struct rtl_priv *rtlpriv = rtl_priv(hw);
1642 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1643
1644 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
1645 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1646
1647 if (add_msr)
1648 rtlpci->irq_mask[0] |= add_msr;
1649 if (rm_msr)
1650 rtlpci->irq_mask[0] &= (~rm_msr);
1651 rtl88ee_disable_interrupt(hw);
1652 rtl88ee_enable_interrupt(hw);
1653 }
1654
1655 static u8 _rtl88e_get_chnl_group(u8 chnl)
1656 {
1657 u8 group = 0;
1658
1659 if (chnl < 3)
1660 group = 0;
1661 else if (chnl < 6)
1662 group = 1;
1663 else if (chnl < 9)
1664 group = 2;
1665 else if (chnl < 12)
1666 group = 3;
1667 else if (chnl < 14)
1668 group = 4;
1669 else if (chnl == 14)
1670 group = 5;
1671
1672 return group;
1673 }
1674
1675 static void set_24g_base(struct txpower_info_2g *pwrinfo24g, u32 rfpath)
1676 {
1677 int group, txcnt;
1678
1679 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1680 pwrinfo24g->index_cck_base[rfpath][group] = 0x2D;
1681 pwrinfo24g->index_bw40_base[rfpath][group] = 0x2D;
1682 }
1683 for (txcnt = 0; txcnt < MAX_TX_COUNT; txcnt++) {
1684 if (txcnt == 0) {
1685 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
1686 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
1687 } else {
1688 pwrinfo24g->bw20_diff[rfpath][txcnt] = 0xFE;
1689 pwrinfo24g->bw40_diff[rfpath][txcnt] = 0xFE;
1690 pwrinfo24g->cck_diff[rfpath][txcnt] = 0xFE;
1691 pwrinfo24g->ofdm_diff[rfpath][txcnt] = 0xFE;
1692 }
1693 }
1694 }
1695
1696 static void read_power_value_fromprom(struct ieee80211_hw *hw,
1697 struct txpower_info_2g *pwrinfo24g,
1698 struct txpower_info_5g *pwrinfo5g,
1699 bool autoload_fail, u8 *hwinfo)
1700 {
1701 struct rtl_priv *rtlpriv = rtl_priv(hw);
1702 u32 rfpath, eeaddr = EEPROM_TX_PWR_INX, group, txcnt = 0;
1703
1704 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1705 "hal_ReadPowerValueFromPROM88E():PROMContent[0x%x]=0x%x\n",
1706 (eeaddr+1), hwinfo[eeaddr+1]);
1707 if (0xFF == hwinfo[eeaddr+1]) /*YJ,add,120316*/
1708 autoload_fail = true;
1709
1710 if (autoload_fail) {
1711 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1712 "auto load fail : Use Default value!\n");
1713 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
1714 /* 2.4G default value */
1715 set_24g_base(pwrinfo24g, rfpath);
1716 }
1717 return;
1718 }
1719
1720 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
1721 /*2.4G default value*/
1722 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1723 pwrinfo24g->index_cck_base[rfpath][group] =
1724 hwinfo[eeaddr++];
1725 if (pwrinfo24g->index_cck_base[rfpath][group] == 0xFF)
1726 pwrinfo24g->index_cck_base[rfpath][group] =
1727 0x2D;
1728 }
1729 for (group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++) {
1730 pwrinfo24g->index_bw40_base[rfpath][group] =
1731 hwinfo[eeaddr++];
1732 if (pwrinfo24g->index_bw40_base[rfpath][group] == 0xFF)
1733 pwrinfo24g->index_bw40_base[rfpath][group] =
1734 0x2D;
1735 }
1736 pwrinfo24g->bw40_diff[rfpath][0] = 0;
1737 if (hwinfo[eeaddr] == 0xFF) {
1738 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
1739 } else {
1740 pwrinfo24g->bw20_diff[rfpath][0] =
1741 (hwinfo[eeaddr]&0xf0)>>4;
1742 /*bit sign number to 8 bit sign number*/
1743 if (pwrinfo24g->bw20_diff[rfpath][0] & BIT(3))
1744 pwrinfo24g->bw20_diff[rfpath][0] |= 0xF0;
1745 }
1746
1747 if (hwinfo[eeaddr] == 0xFF) {
1748 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
1749 } else {
1750 pwrinfo24g->ofdm_diff[rfpath][0] =
1751 (hwinfo[eeaddr]&0x0f);
1752 /*bit sign number to 8 bit sign number*/
1753 if (pwrinfo24g->ofdm_diff[rfpath][0] & BIT(3))
1754 pwrinfo24g->ofdm_diff[rfpath][0] |= 0xF0;
1755 }
1756 pwrinfo24g->cck_diff[rfpath][0] = 0;
1757 eeaddr++;
1758 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1759 if (hwinfo[eeaddr] == 0xFF) {
1760 pwrinfo24g->bw40_diff[rfpath][txcnt] = 0xFE;
1761 } else {
1762 pwrinfo24g->bw40_diff[rfpath][txcnt] =
1763 (hwinfo[eeaddr]&0xf0)>>4;
1764 if (pwrinfo24g->bw40_diff[rfpath][txcnt] &
1765 BIT(3))
1766 pwrinfo24g->bw40_diff[rfpath][txcnt] |=
1767 0xF0;
1768 }
1769
1770 if (hwinfo[eeaddr] == 0xFF) {
1771 pwrinfo24g->bw20_diff[rfpath][txcnt] =
1772 0xFE;
1773 } else {
1774 pwrinfo24g->bw20_diff[rfpath][txcnt] =
1775 (hwinfo[eeaddr]&0x0f);
1776 if (pwrinfo24g->bw20_diff[rfpath][txcnt] &
1777 BIT(3))
1778 pwrinfo24g->bw20_diff[rfpath][txcnt] |=
1779 0xF0;
1780 }
1781 eeaddr++;
1782
1783 if (hwinfo[eeaddr] == 0xFF) {
1784 pwrinfo24g->ofdm_diff[rfpath][txcnt] = 0xFE;
1785 } else {
1786 pwrinfo24g->ofdm_diff[rfpath][txcnt] =
1787 (hwinfo[eeaddr]&0xf0)>>4;
1788 if (pwrinfo24g->ofdm_diff[rfpath][txcnt] &
1789 BIT(3))
1790 pwrinfo24g->ofdm_diff[rfpath][txcnt] |=
1791 0xF0;
1792 }
1793
1794 if (hwinfo[eeaddr] == 0xFF) {
1795 pwrinfo24g->cck_diff[rfpath][txcnt] = 0xFE;
1796 } else {
1797 pwrinfo24g->cck_diff[rfpath][txcnt] =
1798 (hwinfo[eeaddr]&0x0f);
1799 if (pwrinfo24g->cck_diff[rfpath][txcnt] &
1800 BIT(3))
1801 pwrinfo24g->cck_diff[rfpath][txcnt] |=
1802 0xF0;
1803 }
1804 eeaddr++;
1805 }
1806
1807 /*5G default value*/
1808 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
1809 pwrinfo5g->index_bw40_base[rfpath][group] =
1810 hwinfo[eeaddr++];
1811 if (pwrinfo5g->index_bw40_base[rfpath][group] == 0xFF)
1812 pwrinfo5g->index_bw40_base[rfpath][group] =
1813 0xFE;
1814 }
1815
1816 pwrinfo5g->bw40_diff[rfpath][0] = 0;
1817
1818 if (hwinfo[eeaddr] == 0xFF) {
1819 pwrinfo5g->bw20_diff[rfpath][0] = 0;
1820 } else {
1821 pwrinfo5g->bw20_diff[rfpath][0] =
1822 (hwinfo[eeaddr]&0xf0)>>4;
1823 if (pwrinfo5g->bw20_diff[rfpath][0] & BIT(3))
1824 pwrinfo5g->bw20_diff[rfpath][0] |= 0xF0;
1825 }
1826
1827 if (hwinfo[eeaddr] == 0xFF) {
1828 pwrinfo5g->ofdm_diff[rfpath][0] = 0x04;
1829 } else {
1830 pwrinfo5g->ofdm_diff[rfpath][0] = (hwinfo[eeaddr]&0x0f);
1831 if (pwrinfo5g->ofdm_diff[rfpath][0] & BIT(3))
1832 pwrinfo5g->ofdm_diff[rfpath][0] |= 0xF0;
1833 }
1834 eeaddr++;
1835 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1836 if (hwinfo[eeaddr] == 0xFF) {
1837 pwrinfo5g->bw40_diff[rfpath][txcnt] = 0xFE;
1838 } else {
1839 pwrinfo5g->bw40_diff[rfpath][txcnt] =
1840 (hwinfo[eeaddr]&0xf0)>>4;
1841 if (pwrinfo5g->bw40_diff[rfpath][txcnt] &
1842 BIT(3))
1843 pwrinfo5g->bw40_diff[rfpath][txcnt] |=
1844 0xF0;
1845 }
1846
1847 if (hwinfo[eeaddr] == 0xFF) {
1848 pwrinfo5g->bw20_diff[rfpath][txcnt] = 0xFE;
1849 } else {
1850 pwrinfo5g->bw20_diff[rfpath][txcnt] =
1851 (hwinfo[eeaddr]&0x0f);
1852 if (pwrinfo5g->bw20_diff[rfpath][txcnt] &
1853 BIT(3))
1854 pwrinfo5g->bw20_diff[rfpath][txcnt] |=
1855 0xF0;
1856 }
1857 eeaddr++;
1858 }
1859
1860 if (hwinfo[eeaddr] == 0xFF) {
1861 pwrinfo5g->ofdm_diff[rfpath][1] = 0xFE;
1862 pwrinfo5g->ofdm_diff[rfpath][2] = 0xFE;
1863 } else {
1864 pwrinfo5g->ofdm_diff[rfpath][1] =
1865 (hwinfo[eeaddr]&0xf0)>>4;
1866 pwrinfo5g->ofdm_diff[rfpath][2] =
1867 (hwinfo[eeaddr]&0x0f);
1868 }
1869 eeaddr++;
1870
1871 if (hwinfo[eeaddr] == 0xFF)
1872 pwrinfo5g->ofdm_diff[rfpath][3] = 0xFE;
1873 else
1874 pwrinfo5g->ofdm_diff[rfpath][3] = (hwinfo[eeaddr]&0x0f);
1875 eeaddr++;
1876
1877 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1878 if (pwrinfo5g->ofdm_diff[rfpath][txcnt] == 0xFF)
1879 pwrinfo5g->ofdm_diff[rfpath][txcnt] = 0xFE;
1880 else if (pwrinfo5g->ofdm_diff[rfpath][txcnt] & BIT(3))
1881 pwrinfo5g->ofdm_diff[rfpath][txcnt] |= 0xF0;
1882 }
1883 }
1884 }
1885
1886 static void _rtl88ee_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1887 bool autoload_fail,
1888 u8 *hwinfo)
1889 {
1890 struct rtl_priv *rtlpriv = rtl_priv(hw);
1891 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1892 struct txpower_info_2g pwrinfo24g;
1893 struct txpower_info_5g pwrinfo5g;
1894 u8 rf_path, index;
1895 u8 i;
1896
1897 read_power_value_fromprom(hw, &pwrinfo24g,
1898 &pwrinfo5g, autoload_fail, hwinfo);
1899
1900 for (rf_path = 0; rf_path < 2; rf_path++) {
1901 for (i = 0; i < 14; i++) {
1902 index = _rtl88e_get_chnl_group(i+1);
1903
1904 rtlefuse->txpwrlevel_cck[rf_path][i] =
1905 pwrinfo24g.index_cck_base[rf_path][index];
1906 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1907 pwrinfo24g.index_bw40_base[rf_path][index];
1908 rtlefuse->txpwr_ht20diff[rf_path][i] =
1909 pwrinfo24g.bw20_diff[rf_path][0];
1910 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
1911 pwrinfo24g.ofdm_diff[rf_path][0];
1912 }
1913
1914 for (i = 0; i < 14; i++) {
1915 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1916 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
1917 rf_path, i,
1918 rtlefuse->txpwrlevel_cck[rf_path][i],
1919 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
1920 }
1921 }
1922
1923 if (!autoload_fail)
1924 rtlefuse->eeprom_thermalmeter =
1925 hwinfo[EEPROM_THERMAL_METER_88E];
1926 else
1927 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1928
1929 if (rtlefuse->eeprom_thermalmeter == 0xff || autoload_fail) {
1930 rtlefuse->apk_thermalmeterignore = true;
1931 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1932 }
1933
1934 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
1935 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1936 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1937
1938 if (!autoload_fail) {
1939 rtlefuse->eeprom_regulatory =
1940 hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/
1941 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
1942 rtlefuse->eeprom_regulatory = 0;
1943 } else {
1944 rtlefuse->eeprom_regulatory = 0;
1945 }
1946 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1947 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
1948 }
1949
1950 static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1951 {
1952 struct rtl_priv *rtlpriv = rtl_priv(hw);
1953 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1954 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1955 u16 i, usvalue;
1956 u8 hwinfo[HWSET_MAX_SIZE];
1957 u16 eeprom_id;
1958
1959 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
1960 rtl_efuse_shadow_map_update(hw);
1961
1962 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
1963 HWSET_MAX_SIZE);
1964 } else if (rtlefuse->epromtype == EEPROM_93C46) {
1965 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1966 "RTL819X Not boot from eeprom, check it !!");
1967 return;
1968 } else {
1969 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1970 "boot from neither eeprom nor efuse, check it !!");
1971 return;
1972 }
1973
1974 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
1975 hwinfo, HWSET_MAX_SIZE);
1976
1977 eeprom_id = *((u16 *)&hwinfo[0]);
1978 if (eeprom_id != RTL8188E_EEPROM_ID) {
1979 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1980 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
1981 rtlefuse->autoload_failflag = true;
1982 } else {
1983 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
1984 rtlefuse->autoload_failflag = false;
1985 }
1986
1987 if (rtlefuse->autoload_failflag == true)
1988 return;
1989 /*VID DID SVID SDID*/
1990 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
1991 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
1992 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
1993 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
1994 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1995 "EEPROMId = 0x%4x\n", eeprom_id);
1996 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1997 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
1998 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1999 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
2000 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2001 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
2002 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2003 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
2004 /*customer ID*/
2005 rtlefuse->eeprom_oemid = hwinfo[EEPROM_CUSTOMER_ID];
2006 if (rtlefuse->eeprom_oemid == 0xFF)
2007 rtlefuse->eeprom_oemid = 0;
2008
2009 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2010 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
2011 /*EEPROM version*/
2012 rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION];
2013 /*mac address*/
2014 for (i = 0; i < 6; i += 2) {
2015 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
2016 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
2017 }
2018
2019 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2020 "dev_addr: %pM\n", rtlefuse->dev_addr);
2021 /*channel plan */
2022 rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];
2023 /* set channel plan from efuse */
2024 rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
2025 /*tx power*/
2026 _rtl88ee_read_txpower_info_from_hwpg(hw,
2027 rtlefuse->autoload_failflag,
2028 hwinfo);
2029 rtlefuse->txpwr_fromeprom = true;
2030
2031 rtl8188ee_read_bt_coexist_info_from_hwpg(hw,
2032 rtlefuse->autoload_failflag,
2033 hwinfo);
2034
2035 /*board type*/
2036 rtlefuse->board_type =
2037 ((hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0xE0) >> 5);
2038 rtlhal->board_type = rtlefuse->board_type;
2039 /*Wake on wlan*/
2040 rtlefuse->wowlan_enable =
2041 ((hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & 0x40) >> 6);
2042 /*parse xtal*/
2043 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_88E];
2044 if (hwinfo[EEPROM_XTAL_88E])
2045 rtlefuse->crystalcap = 0x20;
2046 /*antenna diversity*/
2047 rtlefuse->antenna_div_cfg =
2048 (hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x18) >> 3;
2049 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
2050 rtlefuse->antenna_div_cfg = 0;
2051 if (rtlpriv->btcoexist.eeprom_bt_coexist != 0 &&
2052 rtlpriv->btcoexist.eeprom_bt_ant_num == ANT_X1)
2053 rtlefuse->antenna_div_cfg = 0;
2054
2055 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
2056 if (rtlefuse->antenna_div_type == 0xFF)
2057 rtlefuse->antenna_div_type = 0x01;
2058 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV ||
2059 rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2060 rtlefuse->antenna_div_cfg = 1;
2061
2062 if (rtlhal->oem_id == RT_CID_DEFAULT) {
2063 switch (rtlefuse->eeprom_oemid) {
2064 case EEPROM_CID_DEFAULT:
2065 if (rtlefuse->eeprom_did == 0x8179) {
2066 if (rtlefuse->eeprom_svid == 0x1025) {
2067 rtlhal->oem_id = RT_CID_819X_ACER;
2068 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
2069 rtlefuse->eeprom_smid == 0x0179) ||
2070 (rtlefuse->eeprom_svid == 0x17AA &&
2071 rtlefuse->eeprom_smid == 0x0179)) {
2072 rtlhal->oem_id = RT_CID_819X_LENOVO;
2073 } else if (rtlefuse->eeprom_svid == 0x103c &&
2074 rtlefuse->eeprom_smid == 0x197d) {
2075 rtlhal->oem_id = RT_CID_819X_HP;
2076 } else {
2077 rtlhal->oem_id = RT_CID_DEFAULT;
2078 }
2079 } else {
2080 rtlhal->oem_id = RT_CID_DEFAULT;
2081 }
2082 break;
2083 case EEPROM_CID_TOSHIBA:
2084 rtlhal->oem_id = RT_CID_TOSHIBA;
2085 break;
2086 case EEPROM_CID_QMI:
2087 rtlhal->oem_id = RT_CID_819X_QMI;
2088 break;
2089 case EEPROM_CID_WHQL:
2090 default:
2091 rtlhal->oem_id = RT_CID_DEFAULT;
2092 break;
2093
2094 }
2095 }
2096 }
2097
2098 static void _rtl88ee_hal_customized_behavior(struct ieee80211_hw *hw)
2099 {
2100 struct rtl_priv *rtlpriv = rtl_priv(hw);
2101 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2102 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2103
2104 pcipriv->ledctl.led_opendrain = true;
2105
2106 switch (rtlhal->oem_id) {
2107 case RT_CID_819X_HP:
2108 pcipriv->ledctl.led_opendrain = true;
2109 break;
2110 case RT_CID_819X_LENOVO:
2111 case RT_CID_DEFAULT:
2112 case RT_CID_TOSHIBA:
2113 case RT_CID_CCX:
2114 case RT_CID_819X_ACER:
2115 case RT_CID_WHQL:
2116 default:
2117 break;
2118 }
2119 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2120 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2121 }
2122
2123 void rtl88ee_read_eeprom_info(struct ieee80211_hw *hw)
2124 {
2125 struct rtl_priv *rtlpriv = rtl_priv(hw);
2126 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2127 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2128 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2129 u8 tmp_u1b;
2130
2131 rtlhal->version = _rtl88ee_read_chip_version(hw);
2132 if (get_rf_type(rtlphy) == RF_1T1R)
2133 rtlpriv->dm.rfpath_rxenable[0] = true;
2134 else
2135 rtlpriv->dm.rfpath_rxenable[0] =
2136 rtlpriv->dm.rfpath_rxenable[1] = true;
2137 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2138 rtlhal->version);
2139 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2140 if (tmp_u1b & BIT(4)) {
2141 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2142 rtlefuse->epromtype = EEPROM_93C46;
2143 } else {
2144 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2145 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2146 }
2147 if (tmp_u1b & BIT(5)) {
2148 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2149 rtlefuse->autoload_failflag = false;
2150 _rtl88ee_read_adapter_info(hw);
2151 } else {
2152 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
2153 }
2154 _rtl88ee_hal_customized_behavior(hw);
2155 }
2156
2157 static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
2158 struct ieee80211_sta *sta)
2159 {
2160 struct rtl_priv *rtlpriv = rtl_priv(hw);
2161 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2162 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2163 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2164 u32 ratr_value;
2165 u8 ratr_index = 0;
2166 u8 b_nmode = mac->ht_enable;
2167 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2168 u16 shortgi_rate;
2169 u32 tmp_ratr_value;
2170 u8 curtxbw_40mhz = mac->bw_40;
2171 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2172 1 : 0;
2173 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2174 1 : 0;
2175 enum wireless_mode wirelessmode = mac->mode;
2176 u32 ratr_mask;
2177
2178 if (rtlhal->current_bandtype == BAND_ON_5G)
2179 ratr_value = sta->supp_rates[1] << 4;
2180 else
2181 ratr_value = sta->supp_rates[0];
2182 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2183 ratr_value = 0xfff;
2184 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2185 sta->ht_cap.mcs.rx_mask[0] << 12);
2186 switch (wirelessmode) {
2187 case WIRELESS_MODE_B:
2188 if (ratr_value & 0x0000000c)
2189 ratr_value &= 0x0000000d;
2190 else
2191 ratr_value &= 0x0000000f;
2192 break;
2193 case WIRELESS_MODE_G:
2194 ratr_value &= 0x00000FF5;
2195 break;
2196 case WIRELESS_MODE_N_24G:
2197 case WIRELESS_MODE_N_5G:
2198 b_nmode = 1;
2199 if (get_rf_type(rtlphy) == RF_1T2R ||
2200 get_rf_type(rtlphy) == RF_1T1R)
2201 ratr_mask = 0x000ff005;
2202 else
2203 ratr_mask = 0x0f0ff005;
2204
2205 ratr_value &= ratr_mask;
2206 break;
2207 default:
2208 if (rtlphy->rf_type == RF_1T2R)
2209 ratr_value &= 0x000ff0ff;
2210 else
2211 ratr_value &= 0x0f0ff0ff;
2212
2213 break;
2214 }
2215
2216 if ((rtlpriv->btcoexist.bt_coexistence) &&
2217 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
2218 (rtlpriv->btcoexist.bt_cur_state) &&
2219 (rtlpriv->btcoexist.bt_ant_isolation) &&
2220 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
2221 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
2222 ratr_value &= 0x0fffcfc0;
2223 else
2224 ratr_value &= 0x0FFFFFFF;
2225
2226 if (b_nmode &&
2227 ((curtxbw_40mhz && curshortgi_40mhz) ||
2228 (!curtxbw_40mhz && curshortgi_20mhz))) {
2229 ratr_value |= 0x10000000;
2230 tmp_ratr_value = (ratr_value >> 12);
2231
2232 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
2233 if ((1 << shortgi_rate) & tmp_ratr_value)
2234 break;
2235 }
2236
2237 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
2238 (shortgi_rate << 4) | (shortgi_rate);
2239 }
2240
2241 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
2242
2243 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2244 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
2245 }
2246
2247 static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2248 struct ieee80211_sta *sta, u8 rssi_level)
2249 {
2250 struct rtl_priv *rtlpriv = rtl_priv(hw);
2251 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2252 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2253 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2254 struct rtl_sta_info *sta_entry = NULL;
2255 u32 ratr_bitmap;
2256 u8 ratr_index;
2257 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2258 ? 1 : 0;
2259 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2260 1 : 0;
2261 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2262 1 : 0;
2263 enum wireless_mode wirelessmode = 0;
2264 bool b_shortgi = false;
2265 u8 rate_mask[5];
2266 u8 macid = 0;
2267 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2268
2269 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2270 wirelessmode = sta_entry->wireless_mode;
2271 if (mac->opmode == NL80211_IFTYPE_STATION ||
2272 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2273 curtxbw_40mhz = mac->bw_40;
2274 else if (mac->opmode == NL80211_IFTYPE_AP ||
2275 mac->opmode == NL80211_IFTYPE_ADHOC)
2276 macid = sta->aid + 1;
2277
2278 if (rtlhal->current_bandtype == BAND_ON_5G)
2279 ratr_bitmap = sta->supp_rates[1] << 4;
2280 else
2281 ratr_bitmap = sta->supp_rates[0];
2282 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2283 ratr_bitmap = 0xfff;
2284 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2285 sta->ht_cap.mcs.rx_mask[0] << 12);
2286 switch (wirelessmode) {
2287 case WIRELESS_MODE_B:
2288 ratr_index = RATR_INX_WIRELESS_B;
2289 if (ratr_bitmap & 0x0000000c)
2290 ratr_bitmap &= 0x0000000d;
2291 else
2292 ratr_bitmap &= 0x0000000f;
2293 break;
2294 case WIRELESS_MODE_G:
2295 ratr_index = RATR_INX_WIRELESS_GB;
2296
2297 if (rssi_level == 1)
2298 ratr_bitmap &= 0x00000f00;
2299 else if (rssi_level == 2)
2300 ratr_bitmap &= 0x00000ff0;
2301 else
2302 ratr_bitmap &= 0x00000ff5;
2303 break;
2304 case WIRELESS_MODE_N_24G:
2305 case WIRELESS_MODE_N_5G:
2306 ratr_index = RATR_INX_WIRELESS_NGB;
2307 if (rtlphy->rf_type == RF_1T2R ||
2308 rtlphy->rf_type == RF_1T1R) {
2309 if (curtxbw_40mhz) {
2310 if (rssi_level == 1)
2311 ratr_bitmap &= 0x000f0000;
2312 else if (rssi_level == 2)
2313 ratr_bitmap &= 0x000ff000;
2314 else
2315 ratr_bitmap &= 0x000ff015;
2316 } else {
2317 if (rssi_level == 1)
2318 ratr_bitmap &= 0x000f0000;
2319 else if (rssi_level == 2)
2320 ratr_bitmap &= 0x000ff000;
2321 else
2322 ratr_bitmap &= 0x000ff005;
2323 }
2324 } else {
2325 if (curtxbw_40mhz) {
2326 if (rssi_level == 1)
2327 ratr_bitmap &= 0x0f8f0000;
2328 else if (rssi_level == 2)
2329 ratr_bitmap &= 0x0f8ff000;
2330 else
2331 ratr_bitmap &= 0x0f8ff015;
2332 } else {
2333 if (rssi_level == 1)
2334 ratr_bitmap &= 0x0f8f0000;
2335 else if (rssi_level == 2)
2336 ratr_bitmap &= 0x0f8ff000;
2337 else
2338 ratr_bitmap &= 0x0f8ff005;
2339 }
2340 }
2341 /*}*/
2342
2343 if ((curtxbw_40mhz && curshortgi_40mhz) ||
2344 (!curtxbw_40mhz && curshortgi_20mhz)) {
2345
2346 if (macid == 0)
2347 b_shortgi = true;
2348 else if (macid == 1)
2349 b_shortgi = false;
2350 }
2351 break;
2352 default:
2353 ratr_index = RATR_INX_WIRELESS_NGB;
2354
2355 if (rtlphy->rf_type == RF_1T2R)
2356 ratr_bitmap &= 0x000ff0ff;
2357 else
2358 ratr_bitmap &= 0x0f0ff0ff;
2359 break;
2360 }
2361 sta_entry->ratr_index = ratr_index;
2362
2363 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2364 "ratr_bitmap :%x\n", ratr_bitmap);
2365 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2366 (ratr_index << 28);
2367 rate_mask[4] = macid | (b_shortgi ? 0x20 : 0x00) | 0x80;
2368 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2369 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n",
2370 ratr_index, ratr_bitmap,
2371 rate_mask[0], rate_mask[1],
2372 rate_mask[2], rate_mask[3],
2373 rate_mask[4]);
2374 rtl88e_fill_h2c_cmd(hw, H2C_88E_RA_MASK, 5, rate_mask);
2375 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
2376 }
2377
2378 void rtl88ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
2379 struct ieee80211_sta *sta, u8 rssi_level)
2380 {
2381 struct rtl_priv *rtlpriv = rtl_priv(hw);
2382
2383 if (rtlpriv->dm.useramask)
2384 rtl88ee_update_hal_rate_mask(hw, sta, rssi_level);
2385 else
2386 rtl88ee_update_hal_rate_table(hw, sta);
2387 }
2388
2389 void rtl88ee_update_channel_access_setting(struct ieee80211_hw *hw)
2390 {
2391 struct rtl_priv *rtlpriv = rtl_priv(hw);
2392 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2393 u16 sifs_timer;
2394
2395 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);
2396 if (!mac->ht_enable)
2397 sifs_timer = 0x0a0a;
2398 else
2399 sifs_timer = 0x0e0e;
2400 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2401 }
2402
2403 bool rtl88ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2404 {
2405 struct rtl_priv *rtlpriv = rtl_priv(hw);
2406 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2407 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
2408 u32 u4tmp;
2409 bool b_actuallyset = false;
2410
2411 if (rtlpriv->rtlhal.being_init_adapter)
2412 return false;
2413
2414 if (ppsc->swrf_processing)
2415 return false;
2416
2417 spin_lock(&rtlpriv->locks.rf_ps_lock);
2418 if (ppsc->rfchange_inprogress) {
2419 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2420 return false;
2421 } else {
2422 ppsc->rfchange_inprogress = true;
2423 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2424 }
2425
2426 cur_rfstate = ppsc->rfpwr_state;
2427
2428 u4tmp = rtl_read_dword(rtlpriv, REG_GPIO_OUTPUT);
2429 e_rfpowerstate_toset = (u4tmp & BIT(31)) ? ERFON : ERFOFF;
2430
2431 if (ppsc->hwradiooff && (e_rfpowerstate_toset == ERFON)) {
2432 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2433 "GPIOChangeRF - HW Radio ON, RF ON\n");
2434
2435 e_rfpowerstate_toset = ERFON;
2436 ppsc->hwradiooff = false;
2437 b_actuallyset = true;
2438 } else if ((!ppsc->hwradiooff) &&
2439 (e_rfpowerstate_toset == ERFOFF)) {
2440 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2441 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
2442
2443 e_rfpowerstate_toset = ERFOFF;
2444 ppsc->hwradiooff = true;
2445 b_actuallyset = true;
2446 }
2447
2448 if (b_actuallyset) {
2449 spin_lock(&rtlpriv->locks.rf_ps_lock);
2450 ppsc->rfchange_inprogress = false;
2451 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2452 } else {
2453 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
2454 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2455
2456 spin_lock(&rtlpriv->locks.rf_ps_lock);
2457 ppsc->rfchange_inprogress = false;
2458 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2459 }
2460
2461 *valid = 1;
2462 return !ppsc->hwradiooff;
2463
2464 }
2465
2466 void rtl88ee_set_key(struct ieee80211_hw *hw, u32 key_index,
2467 u8 *p_macaddr, bool is_group, u8 enc_algo,
2468 bool is_wepkey, bool clear_all)
2469 {
2470 struct rtl_priv *rtlpriv = rtl_priv(hw);
2471 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2472 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2473 u8 *macaddr = p_macaddr;
2474 u32 entry_id = 0;
2475 bool is_pairwise = false;
2476 static u8 cam_const_addr[4][6] = {
2477 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2478 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2479 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2480 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2481 };
2482 static u8 cam_const_broad[] = {
2483 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2484 };
2485
2486 if (clear_all) {
2487 u8 idx = 0;
2488 u8 cam_offset = 0;
2489 u8 clear_number = 5;
2490
2491 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2492
2493 for (idx = 0; idx < clear_number; idx++) {
2494 rtl_cam_mark_invalid(hw, cam_offset + idx);
2495 rtl_cam_empty_entry(hw, cam_offset + idx);
2496
2497 if (idx < 5) {
2498 memset(rtlpriv->sec.key_buf[idx], 0,
2499 MAX_KEY_LEN);
2500 rtlpriv->sec.key_len[idx] = 0;
2501 }
2502 }
2503
2504 } else {
2505 switch (enc_algo) {
2506 case WEP40_ENCRYPTION:
2507 enc_algo = CAM_WEP40;
2508 break;
2509 case WEP104_ENCRYPTION:
2510 enc_algo = CAM_WEP104;
2511 break;
2512 case TKIP_ENCRYPTION:
2513 enc_algo = CAM_TKIP;
2514 break;
2515 case AESCCMP_ENCRYPTION:
2516 enc_algo = CAM_AES;
2517 break;
2518 default:
2519 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2520 "switch case not process\n");
2521 enc_algo = CAM_TKIP;
2522 break;
2523 }
2524
2525 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2526 macaddr = cam_const_addr[key_index];
2527 entry_id = key_index;
2528 } else {
2529 if (is_group) {
2530 macaddr = cam_const_broad;
2531 entry_id = key_index;
2532 } else {
2533 if (mac->opmode == NL80211_IFTYPE_AP ||
2534 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
2535 entry_id =
2536 rtl_cam_get_free_entry(hw, p_macaddr);
2537 if (entry_id >= TOTAL_CAM_ENTRY) {
2538 RT_TRACE(rtlpriv, COMP_SEC,
2539 DBG_EMERG,
2540 "Can not find free hw security cam entry\n");
2541 return;
2542 }
2543 } else {
2544 entry_id = CAM_PAIRWISE_KEY_POSITION;
2545 }
2546 key_index = PAIRWISE_KEYIDX;
2547 is_pairwise = true;
2548 }
2549 }
2550
2551 if (rtlpriv->sec.key_len[key_index] == 0) {
2552 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2553 "delete one entry, entry_id is %d\n",
2554 entry_id);
2555 if (mac->opmode == NL80211_IFTYPE_AP ||
2556 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2557 rtl_cam_del_entry(hw, p_macaddr);
2558 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2559 } else {
2560 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2561 "add one entry\n");
2562 if (is_pairwise) {
2563 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2564 "set Pairwise key\n");
2565
2566 rtl_cam_add_one_entry(hw, macaddr, key_index,
2567 entry_id, enc_algo,
2568 CAM_CONFIG_NO_USEDK,
2569 rtlpriv->sec.key_buf[key_index]);
2570 } else {
2571 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2572 "set group key\n");
2573
2574 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2575 rtl_cam_add_one_entry(hw,
2576 rtlefuse->dev_addr,
2577 PAIRWISE_KEYIDX,
2578 CAM_PAIRWISE_KEY_POSITION,
2579 enc_algo,
2580 CAM_CONFIG_NO_USEDK,
2581 rtlpriv->sec.key_buf
2582 [entry_id]);
2583 }
2584
2585 rtl_cam_add_one_entry(hw, macaddr, key_index,
2586 entry_id, enc_algo,
2587 CAM_CONFIG_NO_USEDK,
2588 rtlpriv->sec.key_buf[entry_id]);
2589 }
2590
2591 }
2592 }
2593 }
2594
2595 static void rtl8188ee_bt_var_init(struct ieee80211_hw *hw)
2596 {
2597 struct rtl_priv *rtlpriv = rtl_priv(hw);
2598
2599 rtlpriv->btcoexist.bt_coexistence =
2600 rtlpriv->btcoexist.eeprom_bt_coexist;
2601 rtlpriv->btcoexist.bt_ant_num = rtlpriv->btcoexist.eeprom_bt_ant_num;
2602 rtlpriv->btcoexist.bt_coexist_type = rtlpriv->btcoexist.eeprom_bt_type;
2603
2604 if (rtlpriv->btcoexist.reg_bt_iso == 2)
2605 rtlpriv->btcoexist.bt_ant_isolation =
2606 rtlpriv->btcoexist.eeprom_bt_ant_isol;
2607 else
2608 rtlpriv->btcoexist.bt_ant_isolation =
2609 rtlpriv->btcoexist.reg_bt_iso;
2610
2611 rtlpriv->btcoexist.bt_radio_shared_type =
2612 rtlpriv->btcoexist.eeprom_bt_radio_shared;
2613
2614 if (rtlpriv->btcoexist.bt_coexistence) {
2615 if (rtlpriv->btcoexist.reg_bt_sco == 1)
2616 rtlpriv->btcoexist.bt_service = BT_OTHER_ACTION;
2617 else if (rtlpriv->btcoexist.reg_bt_sco == 2)
2618 rtlpriv->btcoexist.bt_service = BT_SCO;
2619 else if (rtlpriv->btcoexist.reg_bt_sco == 4)
2620 rtlpriv->btcoexist.bt_service = BT_BUSY;
2621 else if (rtlpriv->btcoexist.reg_bt_sco == 5)
2622 rtlpriv->btcoexist.bt_service = BT_OTHERBUSY;
2623 else
2624 rtlpriv->btcoexist.bt_service = BT_IDLE;
2625
2626 rtlpriv->btcoexist.bt_edca_ul = 0;
2627 rtlpriv->btcoexist.bt_edca_dl = 0;
2628 rtlpriv->btcoexist.bt_rssi_state = 0xff;
2629 }
2630 }
2631
2632 void rtl8188ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2633 bool auto_load_fail, u8 *hwinfo)
2634 {
2635 struct rtl_priv *rtlpriv = rtl_priv(hw);
2636 u8 value;
2637
2638 if (!auto_load_fail) {
2639 rtlpriv->btcoexist.eeprom_bt_coexist =
2640 ((hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & 0xe0) >> 5);
2641 if (hwinfo[EEPROM_RF_FEATURE_OPTION_88E] == 0xFF)
2642 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2643 value = hwinfo[EEPROM_RF_BT_SETTING_88E];
2644 rtlpriv->btcoexist.eeprom_bt_type = ((value & 0xe) >> 1);
2645 rtlpriv->btcoexist.eeprom_bt_ant_num = (value & 0x1);
2646 rtlpriv->btcoexist.eeprom_bt_ant_isol = ((value & 0x10) >> 4);
2647 rtlpriv->btcoexist.eeprom_bt_radio_shared =
2648 ((value & 0x20) >> 5);
2649 } else {
2650 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2651 rtlpriv->btcoexist.eeprom_bt_type = BT_2WIRE;
2652 rtlpriv->btcoexist.eeprom_bt_ant_num = ANT_X2;
2653 rtlpriv->btcoexist.eeprom_bt_ant_isol = 0;
2654 rtlpriv->btcoexist.eeprom_bt_radio_shared = BT_RADIO_SHARED;
2655 }
2656
2657 rtl8188ee_bt_var_init(hw);
2658 }
2659
2660 void rtl8188ee_bt_reg_init(struct ieee80211_hw *hw)
2661 {
2662 struct rtl_priv *rtlpriv = rtl_priv(hw);
2663
2664 /* 0:Low, 1:High, 2:From Efuse. */
2665 rtlpriv->btcoexist.reg_bt_iso = 2;
2666 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2667 rtlpriv->btcoexist.reg_bt_sco = 3;
2668 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2669 rtlpriv->btcoexist.reg_bt_sco = 0;
2670 }
2671
2672 void rtl8188ee_bt_hw_init(struct ieee80211_hw *hw)
2673 {
2674 struct rtl_priv *rtlpriv = rtl_priv(hw);
2675 struct rtl_phy *rtlphy = &rtlpriv->phy;
2676 u8 u1_tmp;
2677
2678 if (rtlpriv->btcoexist.bt_coexistence &&
2679 ((rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) ||
2680 rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC8)) {
2681 if (rtlpriv->btcoexist.bt_ant_isolation)
2682 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
2683
2684 u1_tmp = rtl_read_byte(rtlpriv, 0x4fd) &
2685 BIT_OFFSET_LEN_MASK_32(0, 1);
2686 u1_tmp = u1_tmp |
2687 ((rtlpriv->btcoexist.bt_ant_isolation == 1) ?
2688 0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
2689 ((rtlpriv->btcoexist.bt_service == BT_SCO) ?
2690 0 : BIT_OFFSET_LEN_MASK_32(2, 1));
2691 rtl_write_byte(rtlpriv, 0x4fd, u1_tmp);
2692
2693 rtl_write_dword(rtlpriv, REG_BT_COEX_TABLE+4, 0xaaaa9aaa);
2694 rtl_write_dword(rtlpriv, REG_BT_COEX_TABLE+8, 0xffbd0040);
2695 rtl_write_dword(rtlpriv, REG_BT_COEX_TABLE+0xc, 0x40000010);
2696
2697 /* Config to 1T1R. */
2698 if (rtlphy->rf_type == RF_1T1R) {
2699 u1_tmp = rtl_read_byte(rtlpriv, ROFDM0_TRXPATHENABLE);
2700 u1_tmp &= ~(BIT_OFFSET_LEN_MASK_32(1, 1));
2701 rtl_write_byte(rtlpriv, ROFDM0_TRXPATHENABLE, u1_tmp);
2702
2703 u1_tmp = rtl_read_byte(rtlpriv, ROFDM1_TRXPATHENABLE);
2704 u1_tmp &= ~(BIT_OFFSET_LEN_MASK_32(1, 1));
2705 rtl_write_byte(rtlpriv, ROFDM1_TRXPATHENABLE, u1_tmp);
2706 }
2707 }
2708 }
2709
2710 void rtl88ee_suspend(struct ieee80211_hw *hw)
2711 {
2712 }
2713
2714 void rtl88ee_resume(struct ieee80211_hw *hw)
2715 {
2716 }
2717
2718 #line 117 "/work/ldvuser/andrianov/work/current--X--drivers/net/wireless/--X--defaultlinux-4.5-rc7--X--races--X--cpachecker/linux-4.5-rc7/csd_deg_dscv/376/dscv_tempdir/dscv/ri/races/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.o.c.prepared" 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../core.h"
28 #include "../pci.h"
29 #include "reg.h"
30 #include "def.h"
31 #include "phy.h"
32 #include "dm.h"
33 #include "hw.h"
34 #include "sw.h"
35 #include "trx.h"
36 #include "led.h"
37 #include "table.h"
38
39 #include <linux/vmalloc.h>
40 #include <linux/module.h>
41
42 static void rtl88e_init_aspm_vars(struct ieee80211_hw *hw)
43 {
44 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
45
46 /*close ASPM for AMD defaultly */
47 rtlpci->const_amdpci_aspm = 0;
48
49 /* ASPM PS mode.
50 * 0 - Disable ASPM,
51 * 1 - Enable ASPM without Clock Req,
52 * 2 - Enable ASPM with Clock Req,
53 * 3 - Alwyas Enable ASPM with Clock Req,
54 * 4 - Always Enable ASPM without Clock Req.
55 * set defult to RTL8192CE:3 RTL8192E:2
56 */
57 rtlpci->const_pci_aspm = 3;
58
59 /*Setting for PCI-E device */
60 rtlpci->const_devicepci_aspm_setting = 0x03;
61
62 /*Setting for PCI-E bridge */
63 rtlpci->const_hostpci_aspm_setting = 0x02;
64
65 /* In Hw/Sw Radio Off situation.
66 * 0 - Default,
67 * 1 - From ASPM setting without low Mac Pwr,
68 * 2 - From ASPM setting with low Mac Pwr,
69 * 3 - Bus D3
70 * set default to RTL8192CE:0 RTL8192SE:2
71 */
72 rtlpci->const_hwsw_rfoff_d3 = 0;
73
74 /* This setting works for those device with
75 * backdoor ASPM setting such as EPHY setting.
76 * 0 - Not support ASPM,
77 * 1 - Support ASPM,
78 * 2 - According to chipset.
79 */
80 rtlpci->const_support_pciaspm = 1;
81 }
82
83 int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
84 {
85 int err = 0;
86 struct rtl_priv *rtlpriv = rtl_priv(hw);
87 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
88 u8 tid;
89
90 rtl8188ee_bt_reg_init(hw);
91 rtlpriv->dm.dm_initialgain_enable = 1;
92 rtlpriv->dm.dm_flag = 0;
93 rtlpriv->dm.disable_framebursting = 0;
94 rtlpriv->dm.thermalvalue = 0;
95 rtlpci->transmit_config = CFENDFORM | BIT(15);
96
97 /* compatible 5G band 88ce just 2.4G band & smsp */
98 rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G;
99 rtlpriv->rtlhal.bandset = BAND_ON_2_4G;
100 rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY;
101
102 rtlpci->receive_config = (RCR_APPFCS |
103 RCR_APP_MIC |
104 RCR_APP_ICV |
105 RCR_APP_PHYST_RXFF |
106 RCR_HTC_LOC_CTRL |
107 RCR_AMF |
108 RCR_ACF |
109 RCR_ADF |
110 RCR_AICV |
111 RCR_ACRC32 |
112 RCR_AB |
113 RCR_AM |
114 RCR_APM |
115 0);
116
117 rtlpci->irq_mask[0] =
118 (u32)(IMR_PSTIMEOUT |
119 IMR_HSISR_IND_ON_INT |
120 IMR_C2HCMD |
121 IMR_HIGHDOK |
122 IMR_MGNTDOK |
123 IMR_BKDOK |
124 IMR_BEDOK |
125 IMR_VIDOK |
126 IMR_VODOK |
127 IMR_RDU |
128 IMR_ROK |
129 0);
130 rtlpci->irq_mask[1] = (u32) (IMR_RXFOVW | 0);
131 rtlpci->sys_irq_mask = (u32) (HSIMR_PDN_INT_EN | HSIMR_RON_INT_EN);
132
133 /* for debug level */
134 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
135 /* for LPS & IPS */
136 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
137 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
138 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
139 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
140 rtlpriv->cfg->mod_params->sw_crypto =
141 rtlpriv->cfg->mod_params->sw_crypto;
142 rtlpriv->cfg->mod_params->disable_watchdog =
143 rtlpriv->cfg->mod_params->disable_watchdog;
144 if (rtlpriv->cfg->mod_params->disable_watchdog)
145 pr_info("watchdog disabled\n");
146 if (!rtlpriv->psc.inactiveps)
147 pr_info("rtl8188ee: Power Save off (module option)\n");
148 if (!rtlpriv->psc.fwctrl_lps)
149 pr_info("rtl8188ee: FW Power Save off (module option)\n");
150 rtlpriv->psc.reg_fwctrl_lps = 3;
151 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
152 /* for ASPM, you can close aspm through
153 * set const_support_pciaspm = 0
154 */
155 rtl88e_init_aspm_vars(hw);
156
157 if (rtlpriv->psc.reg_fwctrl_lps == 1)
158 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
159 else if (rtlpriv->psc.reg_fwctrl_lps == 2)
160 rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
161 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
162 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
163
164 /* for firmware buf */
165 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
166 if (!rtlpriv->rtlhal.pfirmware) {
167 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
168 "Can't alloc buffer for fw.\n");
169 return 1;
170 }
171
172 rtlpriv->cfg->fw_name = "rtlwifi/rtl8188efw.bin";
173 rtlpriv->max_fw_size = 0x8000;
174 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
175 err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
176 rtlpriv->io.dev, GFP_KERNEL, hw,
177 rtl_fw_cb);
178 if (err) {
179 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
180 "Failed to request firmware!\n");
181 return 1;
182 }
183
184 /* for early mode */
185 rtlpriv->rtlhal.earlymode_enable = false;
186 rtlpriv->rtlhal.max_earlymode_num = 10;
187 for (tid = 0; tid < 8; tid++)
188 skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]);
189
190 /*low power */
191 rtlpriv->psc.low_power_enable = false;
192 if (rtlpriv->psc.low_power_enable) {
193 init_timer(&rtlpriv->works.fw_clockoff_timer);
194 setup_timer(&rtlpriv->works.fw_clockoff_timer,
195 rtl88ee_fw_clk_off_timer_callback,
196 (unsigned long)hw);
197 }
198
199 init_timer(&rtlpriv->works.fast_antenna_training_timer);
200 setup_timer(&rtlpriv->works.fast_antenna_training_timer,
201 rtl88e_dm_fast_antenna_training_callback,
202 (unsigned long)hw);
203 return err;
204 }
205
206 void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
207 {
208 struct rtl_priv *rtlpriv = rtl_priv(hw);
209
210 if (rtlpriv->rtlhal.pfirmware) {
211 vfree(rtlpriv->rtlhal.pfirmware);
212 rtlpriv->rtlhal.pfirmware = NULL;
213 }
214
215 if (rtlpriv->psc.low_power_enable)
216 del_timer_sync(&rtlpriv->works.fw_clockoff_timer);
217
218 del_timer_sync(&rtlpriv->works.fast_antenna_training_timer);
219 }
220
221 /* get bt coexist status */
222 bool rtl88e_get_btc_status(void)
223 {
224 return false;
225 }
226
227 static struct rtl_hal_ops rtl8188ee_hal_ops = {
228 .init_sw_vars = rtl88e_init_sw_vars,
229 .deinit_sw_vars = rtl88e_deinit_sw_vars,
230 .read_eeprom_info = rtl88ee_read_eeprom_info,
231 .interrupt_recognized = rtl88ee_interrupt_recognized,/*need check*/
232 .hw_init = rtl88ee_hw_init,
233 .hw_disable = rtl88ee_card_disable,
234 .hw_suspend = rtl88ee_suspend,
235 .hw_resume = rtl88ee_resume,
236 .enable_interrupt = rtl88ee_enable_interrupt,
237 .disable_interrupt = rtl88ee_disable_interrupt,
238 .set_network_type = rtl88ee_set_network_type,
239 .set_chk_bssid = rtl88ee_set_check_bssid,
240 .set_qos = rtl88ee_set_qos,
241 .set_bcn_reg = rtl88ee_set_beacon_related_registers,
242 .set_bcn_intv = rtl88ee_set_beacon_interval,
243 .update_interrupt_mask = rtl88ee_update_interrupt_mask,
244 .get_hw_reg = rtl88ee_get_hw_reg,
245 .set_hw_reg = rtl88ee_set_hw_reg,
246 .update_rate_tbl = rtl88ee_update_hal_rate_tbl,
247 .fill_tx_desc = rtl88ee_tx_fill_desc,
248 .fill_tx_cmddesc = rtl88ee_tx_fill_cmddesc,
249 .query_rx_desc = rtl88ee_rx_query_desc,
250 .set_channel_access = rtl88ee_update_channel_access_setting,
251 .radio_onoff_checking = rtl88ee_gpio_radio_on_off_checking,
252 .set_bw_mode = rtl88e_phy_set_bw_mode,
253 .switch_channel = rtl88e_phy_sw_chnl,
254 .dm_watchdog = rtl88e_dm_watchdog,
255 .scan_operation_backup = rtl88e_phy_scan_operation_backup,
256 .set_rf_power_state = rtl88e_phy_set_rf_power_state,
257 .led_control = rtl88ee_led_control,
258 .set_desc = rtl88ee_set_desc,
259 .get_desc = rtl88ee_get_desc,
260 .is_tx_desc_closed = rtl88ee_is_tx_desc_closed,
261 .tx_polling = rtl88ee_tx_polling,
262 .enable_hw_sec = rtl88ee_enable_hw_security_config,
263 .set_key = rtl88ee_set_key,
264 .init_sw_leds = rtl88ee_init_sw_leds,
265 .get_bbreg = rtl88e_phy_query_bb_reg,
266 .set_bbreg = rtl88e_phy_set_bb_reg,
267 .get_rfreg = rtl88e_phy_query_rf_reg,
268 .set_rfreg = rtl88e_phy_set_rf_reg,
269 .get_btc_status = rtl88e_get_btc_status,
270 .rx_command_packet = rtl88ee_rx_command_packet,
271
272 };
273
274 static struct rtl_mod_params rtl88ee_mod_params = {
275 .sw_crypto = false,
276 .inactiveps = false,
277 .swctrl_lps = false,
278 .fwctrl_lps = false,
279 .msi_support = true,
280 .debug = DBG_EMERG,
281 };
282
283 static struct rtl_hal_cfg rtl88ee_hal_cfg = {
284 .bar_id = 2,
285 .write_readback = true,
286 .name = "rtl88e_pci",
287 .fw_name = "rtlwifi/rtl8188efw.bin",
288 .ops = &rtl8188ee_hal_ops,
289 .mod_params = &rtl88ee_mod_params,
290
291 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
292 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
293 .maps[SYS_CLK] = REG_SYS_CLKR,
294 .maps[MAC_RCR_AM] = AM,
295 .maps[MAC_RCR_AB] = AB,
296 .maps[MAC_RCR_ACRC32] = ACRC32,
297 .maps[MAC_RCR_ACF] = ACF,
298 .maps[MAC_RCR_AAP] = AAP,
299 .maps[MAC_HIMR] = REG_HIMR,
300 .maps[MAC_HIMRE] = REG_HIMRE,
301 .maps[MAC_HSISR] = REG_HSISR,
302
303 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
304
305 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
306 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
307 .maps[EFUSE_CLK] = 0,
308 .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
309 .maps[EFUSE_PWC_EV12V] = PWC_EV12V,
310 .maps[EFUSE_FEN_ELDR] = FEN_ELDR,
311 .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
312 .maps[EFUSE_ANA8M] = ANA8M,
313 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
314 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
315 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
316 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
317
318 .maps[RWCAM] = REG_CAMCMD,
319 .maps[WCAMI] = REG_CAMWRITE,
320 .maps[RCAMO] = REG_CAMREAD,
321 .maps[CAMDBG] = REG_CAMDBG,
322 .maps[SECR] = REG_SECCFG,
323 .maps[SEC_CAM_NONE] = CAM_NONE,
324 .maps[SEC_CAM_WEP40] = CAM_WEP40,
325 .maps[SEC_CAM_TKIP] = CAM_TKIP,
326 .maps[SEC_CAM_AES] = CAM_AES,
327 .maps[SEC_CAM_WEP104] = CAM_WEP104,
328
329 .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
330 .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
331 .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
332 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
333 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
334 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
335 /* .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, */ /*need check*/
336 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
337 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
338 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
339 .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
340 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
341 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
342 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
343 /* .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,*/
344 /* .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,*/
345
346 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
347 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
348 .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0,
349 .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
350 .maps[RTL_IMR_RDU] = IMR_RDU,
351 .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
352 .maps[RTL_IMR_BDOK] = IMR_BCNDOK0,
353 .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
354 .maps[RTL_IMR_TBDER] = IMR_TBDER,
355 .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
356 .maps[RTL_IMR_TBDOK] = IMR_TBDOK,
357 .maps[RTL_IMR_BKDOK] = IMR_BKDOK,
358 .maps[RTL_IMR_BEDOK] = IMR_BEDOK,
359 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
360 .maps[RTL_IMR_VODOK] = IMR_VODOK,
361 .maps[RTL_IMR_ROK] = IMR_ROK,
362 .maps[RTL_IMR_HSISR_IND] = IMR_HSISR_IND_ON_INT,
363 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
364
365 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
366 .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M,
367 .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M,
368 .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M,
369 .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M,
370 .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M,
371 .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M,
372 .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M,
373 .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M,
374 .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M,
375 .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M,
376 .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M,
377
378 .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7,
379 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
380 };
381
382 static struct pci_device_id rtl88ee_pci_ids[] = {
383 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8179, rtl88ee_hal_cfg)},
384 {},
385 };
386
387 MODULE_DEVICE_TABLE(pci, rtl88ee_pci_ids);
388
389 MODULE_AUTHOR("zhiyuan_yang <zhiyuan_yang@realsil.com.cn>");
390 MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
391 MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
392 MODULE_LICENSE("GPL");
393 MODULE_DESCRIPTION("Realtek 8188E 802.11n PCI wireless");
394 MODULE_FIRMWARE("rtlwifi/rtl8188efw.bin");
395
396 module_param_named(swenc, rtl88ee_mod_params.sw_crypto, bool, 0444);
397 module_param_named(debug, rtl88ee_mod_params.debug, int, 0444);
398 module_param_named(ips, rtl88ee_mod_params.inactiveps, bool, 0444);
399 module_param_named(swlps, rtl88ee_mod_params.swctrl_lps, bool, 0444);
400 module_param_named(fwlps, rtl88ee_mod_params.fwctrl_lps, bool, 0444);
401 module_param_named(msi, rtl88ee_mod_params.msi_support, bool, 0444);
402 module_param_named(disable_watchdog, rtl88ee_mod_params.disable_watchdog,
403 bool, 0444);
404 MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
405 MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
406 MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
407 MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
408 MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
409 MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
410 MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
411
412 static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
413
414 static struct pci_driver rtl88ee_driver = {
415 .name = KBUILD_MODNAME,
416 .id_table = rtl88ee_pci_ids,
417 .probe = rtl_pci_probe,
418 .remove = rtl_pci_disconnect,
419 .driver.pm = &rtlwifi_pm_ops,
420 };
421
422 module_pci_driver(rtl88ee_driver); 1
2 #include <linux/kernel.h>
3 #include <linux/mutex.h>
4 #include <linux/spinlock.h>
5 #include <linux/errno.h>
6 #include <verifier/rcv.h>
7 #include <linux/list.h>
8
9 /* mutexes */
10 extern int mutex_lock_interruptible(struct mutex *lock);
11 extern int mutex_lock_killable(struct mutex *lock);
12 extern void mutex_lock(struct mutex *lock);
13
14 /* mutex model functions */
15 extern void ldv_mutex_lock(struct mutex *lock, char *sign);
16 extern int ldv_mutex_is_locked(struct mutex *lock, char *sign);
17 extern void ldv_mutex_unlock(struct mutex *lock, char *sign);
18
19
20 /* Spin locks */
21 extern void __ldv_spin_lock(spinlock_t *lock);
22 extern void __ldv_spin_unlock(spinlock_t *lock);
23 extern int __ldv_spin_trylock(spinlock_t *lock);
24 extern void __ldv_spin_unlock_wait(spinlock_t *lock);
25 extern void __ldv_spin_can_lock(spinlock_t *lock);
26 extern int __ldv_atomic_dec_and_lock(spinlock_t *lock);
27
28 /* spin model functions */
29 extern void ldv_spin_lock(spinlock_t *lock, char *sign);
30 extern void ldv_spin_unlock(spinlock_t *lock, char *sign);
31 extern int ldv_spin_is_locked(spinlock_t *lock, char *sign);
32
33 /* Support for list binder functions */
34 static inline struct list_head *ldv_list_get_first(struct list_head *head) {
35 return head->next;
36 }
37
38 static inline int ldv_list_is_stop(struct list_head *pos, struct list_head *head) {
39 return pos==head;
40 }
41
42 static inline struct list_head *ldv_list_get_next(struct list_head *pos) {
43 return pos->next;
44 }
45
46 #include <linux/mutex.h>
47 #include <linux/slab.h>
48 #include <verifier/rcv.h>
49 #include <linux/timer.h>
50 #include <linux/gfp.h>
51 struct timer_list * ldv_timer_list_4;
52 int ldv_timer_1_3;
53 int pci_counter;
54 struct timer_list * ldv_timer_list_2_0;
55 struct timer_list * ldv_timer_list_3;
56 int ldv_timer_2_1;
57 int ldv_state_variable_0;
58 int ldv_state_variable_5;
59 int ldv_timer_state_3 = 0;
60 int ldv_timer_2_2;
61 int ldv_timer_2_3;
62 int ldv_timer_1_0;
63 struct pci_dev *rtl88ee_driver_group1;
64 int ldv_timer_state_4 = 0;
65 int ref_cnt;
66 int ldv_state_variable_1;
67 int ldv_state_variable_7;
68 struct timer_list * ldv_timer_list_1_3;
69 struct sk_buff *rtl8188ee_hal_ops_group0;
70 struct timer_list * ldv_timer_list_1_1;
71 struct timer_list * ldv_timer_list_2_1;
72 struct ieee80211_hw *rtl8188ee_hal_ops_group1;
73 struct timer_list * ldv_timer_list_1_0;
74 int ldv_state_variable_6;
75 int ldv_timer_1_2;
76 int ldv_timer_2_0;
77 struct ieee80211_sta *rtl8188ee_hal_ops_group2;
78 int ldv_timer_1_1;
79 int ldv_state_variable_2;
80 struct timer_list * ldv_timer_list_1_2;
81 int LDV_IN_INTERRUPT = 1;
82 int __VERIFIER_nondet_int(void);
83 struct device *rtlwifi_pm_ops_group1;
84 struct mutex fs_mutex;
85 int ldv_state_variable_3;
86 struct timer_list * ldv_timer_list_2_3;
87 struct mutex ar_mutex;
88 struct timer_list * ldv_timer_list_2_2;
89 int ldv_state_variable_4;
90 void ldv_pci_driver_5(void);
91 void choose_timer_2(void);
92 int reg_timer_2(struct timer_list * timer, void (*function)(unsigned long), unsigned long data);
93 void activate_pending_timer_2(struct timer_list * timer, unsigned long data, int pending_flag);
94 void choose_timer_3(struct timer_list * timer);
95 void activate_pending_timer_4(struct timer_list * timer, unsigned long data, int pending_flag);
96 void activate_pending_timer_1(struct timer_list * timer, unsigned long data, int pending_flag);
97 void choose_timer_4(struct timer_list * timer);
98 void timer_init_2(void);
99 void timer_init_1(void);
100 void disable_suitable_timer_3(struct timer_list * timer);
101 void disable_suitable_timer_4(struct timer_list * timer);
102 void ldv_dev_pm_ops_6(void);
103 int reg_timer_1(struct timer_list * timer, void (*function)(unsigned long), unsigned long data);
104 int reg_timer_4(struct timer_list * timer);
105 void disable_suitable_timer_2(struct timer_list * timer);
106 void disable_suitable_timer_1(struct timer_list * timer);
107 void activate_suitable_timer_1(struct timer_list * timer, unsigned long data);
108 void activate_pending_timer_3(struct timer_list * timer, unsigned long data, int pending_flag);
109 int evil_hack_fs_lock(void);
110 int __VERIFIER_nondet_int(void);
111 int reg_timer_3(struct timer_list * timer);
112 void ldv_initialyze_rtl_hal_ops_7(void);
113 void choose_timer_1(void);
114 void ldv_timer_1(int state, struct timer_list * timer);
115 void activate_suitable_timer_2(struct timer_list * timer, unsigned long data);
116 int evil_hack_ar_lock(void);
117 void ldv_timer_2(int state, struct timer_list * timer);
118 #line 1 "/work/ldvuser/andrianov/work/current--X--drivers/net/wireless/--X--defaultlinux-4.5-rc7--X--races--X--cpachecker/linux-4.5-rc7/csd_deg_dscv/376/dscv_tempdir/dscv/ri/races/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c"
119 /******************************************************************************
120 *
121 * Copyright(c) 2009-2013 Realtek Corporation.
122 *
123 * This program is free software; you can redistribute it and/or modify it
124 * under the terms of version 2 of the GNU General Public License as
125 * published by the Free Software Foundation.
126 *
127 * This program is distributed in the hope that it will be useful, but WITHOUT
128 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
129 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
130 * more details.
131 *
132 * The full GNU General Public License is included in this distribution in the
133 * file called LICENSE.
134 *
135 * Contact Information:
136 * wlanfae <wlanfae@realtek.com>
137 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
138 * Hsinchu 300, Taiwan.
139 *
140 * Larry Finger <Larry.Finger@lwfinger.net>
141 *
142 *****************************************************************************/
143
144 #include "../wifi.h"
145 #include "../core.h"
146 #include "../pci.h"
147 #include "reg.h"
148 #include "def.h"
149 #include "phy.h"
150 #include "dm.h"
151 #include "hw.h"
152 #include "sw.h"
153 #include "trx.h"
154 #include "led.h"
155 #include "table.h"
156
157 #include <linux/vmalloc.h>
158 #include <linux/module.h>
159
160 static void rtl88e_init_aspm_vars(struct ieee80211_hw *hw)
161 {
162 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
163
164 /*close ASPM for AMD defaultly */
165 rtlpci->const_amdpci_aspm = 0;
166
167 /* ASPM PS mode.
168 * 0 - Disable ASPM,
169 * 1 - Enable ASPM without Clock Req,
170 * 2 - Enable ASPM with Clock Req,
171 * 3 - Alwyas Enable ASPM with Clock Req,
172 * 4 - Always Enable ASPM without Clock Req.
173 * set defult to RTL8192CE:3 RTL8192E:2
174 */
175 rtlpci->const_pci_aspm = 3;
176
177 /*Setting for PCI-E device */
178 rtlpci->const_devicepci_aspm_setting = 0x03;
179
180 /*Setting for PCI-E bridge */
181 rtlpci->const_hostpci_aspm_setting = 0x02;
182
183 /* In Hw/Sw Radio Off situation.
184 * 0 - Default,
185 * 1 - From ASPM setting without low Mac Pwr,
186 * 2 - From ASPM setting with low Mac Pwr,
187 * 3 - Bus D3
188 * set default to RTL8192CE:0 RTL8192SE:2
189 */
190 rtlpci->const_hwsw_rfoff_d3 = 0;
191
192 /* This setting works for those device with
193 * backdoor ASPM setting such as EPHY setting.
194 * 0 - Not support ASPM,
195 * 1 - Support ASPM,
196 * 2 - According to chipset.
197 */
198 rtlpci->const_support_pciaspm = 1;
199 }
200
201 int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
202 {
203 int err = 0;
204 struct rtl_priv *rtlpriv = rtl_priv(hw);
205 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
206 u8 tid;
207
208 rtl8188ee_bt_reg_init(hw);
209 rtlpriv->dm.dm_initialgain_enable = 1;
210 rtlpriv->dm.dm_flag = 0;
211 rtlpriv->dm.disable_framebursting = 0;
212 rtlpriv->dm.thermalvalue = 0;
213 rtlpci->transmit_config = CFENDFORM | BIT(15);
214
215 /* compatible 5G band 88ce just 2.4G band & smsp */
216 rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G;
217 rtlpriv->rtlhal.bandset = BAND_ON_2_4G;
218 rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY;
219
220 rtlpci->receive_config = (RCR_APPFCS |
221 RCR_APP_MIC |
222 RCR_APP_ICV |
223 RCR_APP_PHYST_RXFF |
224 RCR_HTC_LOC_CTRL |
225 RCR_AMF |
226 RCR_ACF |
227 RCR_ADF |
228 RCR_AICV |
229 RCR_ACRC32 |
230 RCR_AB |
231 RCR_AM |
232 RCR_APM |
233 0);
234
235 rtlpci->irq_mask[0] =
236 (u32)(IMR_PSTIMEOUT |
237 IMR_HSISR_IND_ON_INT |
238 IMR_C2HCMD |
239 IMR_HIGHDOK |
240 IMR_MGNTDOK |
241 IMR_BKDOK |
242 IMR_BEDOK |
243 IMR_VIDOK |
244 IMR_VODOK |
245 IMR_RDU |
246 IMR_ROK |
247 0);
248 rtlpci->irq_mask[1] = (u32) (IMR_RXFOVW | 0);
249 rtlpci->sys_irq_mask = (u32) (HSIMR_PDN_INT_EN | HSIMR_RON_INT_EN);
250
251 /* for debug level */
252 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
253 /* for LPS & IPS */
254 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
255 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
256 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
257 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
258 rtlpriv->cfg->mod_params->sw_crypto =
259 rtlpriv->cfg->mod_params->sw_crypto;
260 rtlpriv->cfg->mod_params->disable_watchdog =
261 rtlpriv->cfg->mod_params->disable_watchdog;
262 if (rtlpriv->cfg->mod_params->disable_watchdog)
263 pr_info("watchdog disabled\n");
264 if (!rtlpriv->psc.inactiveps)
265 pr_info("rtl8188ee: Power Save off (module option)\n");
266 if (!rtlpriv->psc.fwctrl_lps)
267 pr_info("rtl8188ee: FW Power Save off (module option)\n");
268 rtlpriv->psc.reg_fwctrl_lps = 3;
269 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
270 /* for ASPM, you can close aspm through
271 * set const_support_pciaspm = 0
272 */
273 rtl88e_init_aspm_vars(hw);
274
275 if (rtlpriv->psc.reg_fwctrl_lps == 1)
276 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
277 else if (rtlpriv->psc.reg_fwctrl_lps == 2)
278 rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
279 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
280 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
281
282 /* for firmware buf */
283 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
284 if (!rtlpriv->rtlhal.pfirmware) {
285 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
286 "Can't alloc buffer for fw.\n");
287 return 1;
288 }
289
290 rtlpriv->cfg->fw_name = "rtlwifi/rtl8188efw.bin";
291 rtlpriv->max_fw_size = 0x8000;
292 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
293 err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
294 rtlpriv->io.dev, GFP_KERNEL, hw,
295 rtl_fw_cb);
296 if (err) {
297 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
298 "Failed to request firmware!\n");
299 return 1;
300 }
301
302 /* for early mode */
303 rtlpriv->rtlhal.earlymode_enable = false;
304 rtlpriv->rtlhal.max_earlymode_num = 10;
305 for (tid = 0; tid < 8; tid++)
306 skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]);
307
308 /*low power */
309 rtlpriv->psc.low_power_enable = false;
310 if (rtlpriv->psc.low_power_enable) {
311 init_timer(&rtlpriv->works.fw_clockoff_timer);
312 setup_timer(&rtlpriv->works.fw_clockoff_timer,
313 rtl88ee_fw_clk_off_timer_callback,
314 (unsigned long)hw);
315 }
316
317 init_timer(&rtlpriv->works.fast_antenna_training_timer);
318 setup_timer(&rtlpriv->works.fast_antenna_training_timer,
319 rtl88e_dm_fast_antenna_training_callback,
320 (unsigned long)hw);
321 return err;
322 }
323
324 void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
325 {
326 struct rtl_priv *rtlpriv = rtl_priv(hw);
327
328 if (rtlpriv->rtlhal.pfirmware) {
329 vfree(rtlpriv->rtlhal.pfirmware);
330 rtlpriv->rtlhal.pfirmware = NULL;
331 }
332
333 if (rtlpriv->psc.low_power_enable)
334 del_timer_sync(&rtlpriv->works.fw_clockoff_timer);
335
336 del_timer_sync(&rtlpriv->works.fast_antenna_training_timer);
337 }
338
339 /* get bt coexist status */
340 bool rtl88e_get_btc_status(void)
341 {
342 return false;
343 }
344
345 static struct rtl_hal_ops rtl8188ee_hal_ops = {
346 .init_sw_vars = rtl88e_init_sw_vars,
347 .deinit_sw_vars = rtl88e_deinit_sw_vars,
348 .read_eeprom_info = rtl88ee_read_eeprom_info,
349 .interrupt_recognized = rtl88ee_interrupt_recognized,/*need check*/
350 .hw_init = rtl88ee_hw_init,
351 .hw_disable = rtl88ee_card_disable,
352 .hw_suspend = rtl88ee_suspend,
353 .hw_resume = rtl88ee_resume,
354 .enable_interrupt = rtl88ee_enable_interrupt,
355 .disable_interrupt = rtl88ee_disable_interrupt,
356 .set_network_type = rtl88ee_set_network_type,
357 .set_chk_bssid = rtl88ee_set_check_bssid,
358 .set_qos = rtl88ee_set_qos,
359 .set_bcn_reg = rtl88ee_set_beacon_related_registers,
360 .set_bcn_intv = rtl88ee_set_beacon_interval,
361 .update_interrupt_mask = rtl88ee_update_interrupt_mask,
362 .get_hw_reg = rtl88ee_get_hw_reg,
363 .set_hw_reg = rtl88ee_set_hw_reg,
364 .update_rate_tbl = rtl88ee_update_hal_rate_tbl,
365 .fill_tx_desc = rtl88ee_tx_fill_desc,
366 .fill_tx_cmddesc = rtl88ee_tx_fill_cmddesc,
367 .query_rx_desc = rtl88ee_rx_query_desc,
368 .set_channel_access = rtl88ee_update_channel_access_setting,
369 .radio_onoff_checking = rtl88ee_gpio_radio_on_off_checking,
370 .set_bw_mode = rtl88e_phy_set_bw_mode,
371 .switch_channel = rtl88e_phy_sw_chnl,
372 .dm_watchdog = rtl88e_dm_watchdog,
373 .scan_operation_backup = rtl88e_phy_scan_operation_backup,
374 .set_rf_power_state = rtl88e_phy_set_rf_power_state,
375 .led_control = rtl88ee_led_control,
376 .set_desc = rtl88ee_set_desc,
377 .get_desc = rtl88ee_get_desc,
378 .is_tx_desc_closed = rtl88ee_is_tx_desc_closed,
379 .tx_polling = rtl88ee_tx_polling,
380 .enable_hw_sec = rtl88ee_enable_hw_security_config,
381 .set_key = rtl88ee_set_key,
382 .init_sw_leds = rtl88ee_init_sw_leds,
383 .get_bbreg = rtl88e_phy_query_bb_reg,
384 .set_bbreg = rtl88e_phy_set_bb_reg,
385 .get_rfreg = rtl88e_phy_query_rf_reg,
386 .set_rfreg = rtl88e_phy_set_rf_reg,
387 .get_btc_status = rtl88e_get_btc_status,
388 .rx_command_packet = rtl88ee_rx_command_packet,
389
390 };
391
392 static struct rtl_mod_params rtl88ee_mod_params = {
393 .sw_crypto = false,
394 .inactiveps = false,
395 .swctrl_lps = false,
396 .fwctrl_lps = false,
397 .msi_support = true,
398 .debug = DBG_EMERG,
399 };
400
401 static struct rtl_hal_cfg rtl88ee_hal_cfg = {
402 .bar_id = 2,
403 .write_readback = true,
404 .name = "rtl88e_pci",
405 .fw_name = "rtlwifi/rtl8188efw.bin",
406 .ops = &rtl8188ee_hal_ops,
407 .mod_params = &rtl88ee_mod_params,
408
409 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
410 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
411 .maps[SYS_CLK] = REG_SYS_CLKR,
412 .maps[MAC_RCR_AM] = AM,
413 .maps[MAC_RCR_AB] = AB,
414 .maps[MAC_RCR_ACRC32] = ACRC32,
415 .maps[MAC_RCR_ACF] = ACF,
416 .maps[MAC_RCR_AAP] = AAP,
417 .maps[MAC_HIMR] = REG_HIMR,
418 .maps[MAC_HIMRE] = REG_HIMRE,
419 .maps[MAC_HSISR] = REG_HSISR,
420
421 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
422
423 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
424 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
425 .maps[EFUSE_CLK] = 0,
426 .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
427 .maps[EFUSE_PWC_EV12V] = PWC_EV12V,
428 .maps[EFUSE_FEN_ELDR] = FEN_ELDR,
429 .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
430 .maps[EFUSE_ANA8M] = ANA8M,
431 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
432 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
433 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
434 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
435
436 .maps[RWCAM] = REG_CAMCMD,
437 .maps[WCAMI] = REG_CAMWRITE,
438 .maps[RCAMO] = REG_CAMREAD,
439 .maps[CAMDBG] = REG_CAMDBG,
440 .maps[SECR] = REG_SECCFG,
441 .maps[SEC_CAM_NONE] = CAM_NONE,
442 .maps[SEC_CAM_WEP40] = CAM_WEP40,
443 .maps[SEC_CAM_TKIP] = CAM_TKIP,
444 .maps[SEC_CAM_AES] = CAM_AES,
445 .maps[SEC_CAM_WEP104] = CAM_WEP104,
446
447 .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
448 .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
449 .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
450 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
451 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
452 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
453 /* .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, */ /*need check*/
454 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
455 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
456 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
457 .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
458 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
459 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
460 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
461 /* .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,*/
462 /* .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,*/
463
464 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
465 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
466 .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0,
467 .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
468 .maps[RTL_IMR_RDU] = IMR_RDU,
469 .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
470 .maps[RTL_IMR_BDOK] = IMR_BCNDOK0,
471 .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
472 .maps[RTL_IMR_TBDER] = IMR_TBDER,
473 .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
474 .maps[RTL_IMR_TBDOK] = IMR_TBDOK,
475 .maps[RTL_IMR_BKDOK] = IMR_BKDOK,
476 .maps[RTL_IMR_BEDOK] = IMR_BEDOK,
477 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
478 .maps[RTL_IMR_VODOK] = IMR_VODOK,
479 .maps[RTL_IMR_ROK] = IMR_ROK,
480 .maps[RTL_IMR_HSISR_IND] = IMR_HSISR_IND_ON_INT,
481 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
482
483 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
484 .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M,
485 .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M,
486 .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M,
487 .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M,
488 .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M,
489 .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M,
490 .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M,
491 .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M,
492 .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M,
493 .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M,
494 .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M,
495
496 .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7,
497 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
498 };
499
500 static struct pci_device_id rtl88ee_pci_ids[] = {
501 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8179, rtl88ee_hal_cfg)},
502 {},
503 };
504
505 MODULE_DEVICE_TABLE(pci, rtl88ee_pci_ids);
506
507 MODULE_AUTHOR("zhiyuan_yang <zhiyuan_yang@realsil.com.cn>");
508 MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
509 MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
510 MODULE_LICENSE("GPL");
511 MODULE_DESCRIPTION("Realtek 8188E 802.11n PCI wireless");
512 MODULE_FIRMWARE("rtlwifi/rtl8188efw.bin");
513
514 module_param_named(swenc, rtl88ee_mod_params.sw_crypto, bool, 0444);
515 module_param_named(debug, rtl88ee_mod_params.debug, int, 0444);
516 module_param_named(ips, rtl88ee_mod_params.inactiveps, bool, 0444);
517 module_param_named(swlps, rtl88ee_mod_params.swctrl_lps, bool, 0444);
518 module_param_named(fwlps, rtl88ee_mod_params.fwctrl_lps, bool, 0444);
519 module_param_named(msi, rtl88ee_mod_params.msi_support, bool, 0444);
520 module_param_named(disable_watchdog, rtl88ee_mod_params.disable_watchdog,
521 bool, 0444);
522 MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
523 MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
524 MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
525 MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
526 MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
527 MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
528 MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
529
530 static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
531
532 static struct pci_driver rtl88ee_driver = {
533 .name = KBUILD_MODNAME,
534 .id_table = rtl88ee_pci_ids,
535 .probe = rtl_pci_probe,
536 .remove = rtl_pci_disconnect,
537 .driver.pm = &rtlwifi_pm_ops,
538 };
539
540 module_pci_driver(rtl88ee_driver);
541
542 #line 118 "/work/ldvuser/andrianov/work/current--X--drivers/net/wireless/--X--defaultlinux-4.5-rc7--X--races--X--cpachecker/linux-4.5-rc7/csd_deg_dscv/376/dscv_tempdir/dscv/ri/races/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.o.c.prepared"
543
544 int ldv_retval_20;
545 int ldv_retval_18;
546 int ldv_suspend_noirq_6(void);
547 int ldv_retval_2;
548 int ldv_retval_5;
549 int ldv_retval_0;
550 int ldv_retval_11;
551 int ldv_retval_1;
552 int ldv_thaw_noirq_6(void);
553 int ldv_retval_15;
554 int ldv_shutdown_5(void);
555 int ldv_retval_16;
556 int ldv_restore_early_6(void);
557 int ldv_freeze_late_6(void);
558 int ldv_prepare_6(void);
559 int ldv_restore_noirq_6(void);
560 void ldv_check_final_state(void);
561 int ldv_probe_7(void);
562 int ldv_retval_8;
563 int ldv_release_7(void);
564 int ldv_retval_7;
565 int ldv_retval_19;
566 int ldv_freeze_noirq_6(void);
567 int ldv_retval_14;
568 int ldv_poweroff_late_6(void);
569 int ldv_retval_17;
570 int ldv_retval_12;
571 void ldv_initialize(void);
572 int ldv_retval_6;
573 int ldv_complete_6(void);
574 int ldv_poweroff_noirq_6(void);
575 int ldv_thaw_early_6(void);
576 int ldv_retval_13;
577 int ldv_retval_9;
578 int ldv_retval_10;
579 int ldv_resume_early_6(void);
580 int ldv_suspend_late_6(void);
581 int ldv_resume_noirq_6(void);
582 int ldv_retval_4;
583 int ldv_retval_3;
584
585
586 void ldv_pci_driver_5(void){
587 rtl88ee_driver_group1 = ldv_undef_ptr();
588 }
589
590
591 void choose_timer_2(void){
592 switch(__VERIFIER_nondet_int()){
593 case 0: {
594 if(ldv_timer_2_0 == 1){
595 ldv_timer_2_0 = 2;
596 ldv_timer_2(ldv_timer_2_0, ldv_timer_list_2_0);
597 }
598 }
599 break;
600 case 1: {
601 if(ldv_timer_2_1 == 1){
602 ldv_timer_2_1 = 2;
603 ldv_timer_2(ldv_timer_2_1, ldv_timer_list_2_1);
604 }
605 }
606 break;
607 case 2: {
608 if(ldv_timer_2_2 == 1){
609 ldv_timer_2_2 = 2;
610 ldv_timer_2(ldv_timer_2_2, ldv_timer_list_2_2);
611 }
612 }
613 break;
614 case 3: {
615 if(ldv_timer_2_3 == 1){
616 ldv_timer_2_3 = 2;
617 ldv_timer_2(ldv_timer_2_3, ldv_timer_list_2_3);
618 }
619 }
620 break;
621 default: ldv_assume(0);
622 }
623 return;
624 }
625
626
627 int reg_timer_2(struct timer_list * timer, void (*function)(unsigned long), unsigned long data){
628 if(function == rtl88e_dm_fast_antenna_training_callback){
629 activate_suitable_timer_2(timer, data);
630 }
631 }
632
633
634 void activate_pending_timer_2(struct timer_list * timer, unsigned long data, int pending_flag){
635 if(ldv_timer_list_2_0 == timer){
636 if(ldv_timer_2_0 == 2 || pending_flag){
637 ldv_timer_list_2_0 = timer;
638 ldv_timer_list_2_0->data = data;
639 ldv_timer_2_0 = 1;
640 }
641 return;
642 }
643
644 if(ldv_timer_list_2_1 == timer){
645 if(ldv_timer_2_1 == 2 || pending_flag){
646 ldv_timer_list_2_1 = timer;
647 ldv_timer_list_2_1->data = data;
648 ldv_timer_2_1 = 1;
649 }
650 return;
651 }
652
653 if(ldv_timer_list_2_2 == timer){
654 if(ldv_timer_2_2 == 2 || pending_flag){
655 ldv_timer_list_2_2 = timer;
656 ldv_timer_list_2_2->data = data;
657 ldv_timer_2_2= 1;
658 }
659 return;
660 }
661
662 if(ldv_timer_list_2_3 == timer){
663 if(ldv_timer_2_3 == 2 || pending_flag){
664 ldv_timer_list_2_3 = timer;
665 ldv_timer_list_2_3->data = data;
666 ldv_timer_2_3 = 1;
667 }
668 return;
669 }
670 activate_suitable_timer_2(timer, data);
671 }
672
673
674 void choose_timer_3(struct timer_list * timer){
675 LDV_IN_INTERRUPT=2;
676 (timer->function)(timer->data);
677 LDV_IN_INTERRUPT=1;
678 ldv_timer_state_3 = 2;
679 }
680
681
682 void activate_pending_timer_4(struct timer_list * timer, unsigned long data, int pending_flag){ if(ldv_timer_list_4 == timer){
683 if(ldv_timer_state_4 == 2 || pending_flag){
684 ldv_timer_list_4 = timer;
685 ldv_timer_list_4->data = data;
686 ldv_timer_state_4 = 1;
687 }
688 return;
689 }
690 reg_timer_4(timer);
691 ldv_timer_list_4->data = data;
692 }
693
694
695 void activate_pending_timer_1(struct timer_list * timer, unsigned long data, int pending_flag){
696 if(ldv_timer_list_1_0 == timer){
697 if(ldv_timer_1_0 == 2 || pending_flag){
698 ldv_timer_list_1_0 = timer;
699 ldv_timer_list_1_0->data = data;
700 ldv_timer_1_0 = 1;
701 }
702 return;
703 }
704
705 if(ldv_timer_list_1_1 == timer){
706 if(ldv_timer_1_1 == 2 || pending_flag){
707 ldv_timer_list_1_1 = timer;
708 ldv_timer_list_1_1->data = data;
709 ldv_timer_1_1 = 1;
710 }
711 return;
712 }
713
714 if(ldv_timer_list_1_2 == timer){
715 if(ldv_timer_1_2 == 2 || pending_flag){
716 ldv_timer_list_1_2 = timer;
717 ldv_timer_list_1_2->data = data;
718 ldv_timer_1_2= 1;
719 }
720 return;
721 }
722
723 if(ldv_timer_list_1_3 == timer){
724 if(ldv_timer_1_3 == 2 || pending_flag){
725 ldv_timer_list_1_3 = timer;
726 ldv_timer_list_1_3->data = data;
727 ldv_timer_1_3 = 1;
728 }
729 return;
730 }
731 activate_suitable_timer_1(timer, data);
732 }
733
734
735 void choose_timer_4(struct timer_list * timer){
736 LDV_IN_INTERRUPT=2;
737 (timer->function)(timer->data);
738 LDV_IN_INTERRUPT=1;
739 ldv_timer_state_4 = 2;
740 }
741
742
743 void timer_init_2(void){
744 ldv_timer_2_0 = 0;
745 ldv_timer_2_1 = 0;
746 ldv_timer_2_2 = 0;
747 ldv_timer_2_3 = 0;
748 }
749
750
751 void timer_init_1(void){
752 ldv_timer_1_0 = 0;
753 ldv_timer_1_1 = 0;
754 ldv_timer_1_2 = 0;
755 ldv_timer_1_3 = 0;
756 }
757
758
759 void disable_suitable_timer_3(struct timer_list * timer){
760 if(timer == ldv_timer_list_3){
761 ldv_timer_state_3 = 0;
762 return;
763 }
764 }
765
766
767 void disable_suitable_timer_4(struct timer_list * timer){
768 if(timer == ldv_timer_list_4){
769 ldv_timer_state_4 = 0;
770 return;
771 }
772 }
773
774
775 void ldv_dev_pm_ops_6(void){
776 rtlwifi_pm_ops_group1 = ldv_undef_ptr();
777 }
778
779
780 int reg_timer_1(struct timer_list * timer, void (*function)(unsigned long), unsigned long data){
781 if(function == rtl88ee_fw_clk_off_timer_callback){
782 activate_suitable_timer_1(timer, data);
783 }
784 }
785
786
787 int reg_timer_4(struct timer_list * timer){
788 ldv_timer_list_4 = timer;
789 ldv_timer_state_4 = 1;
790 }
791
792
793 void disable_suitable_timer_2(struct timer_list * timer){
794 if(ldv_timer_2_0 != 0 && timer == ldv_timer_list_2_0){
795 ldv_timer_2_0 = 0;
796 return;
797 }
798 if(ldv_timer_2_1 != 0 && timer == ldv_timer_list_2_1){
799 ldv_timer_2_1 = 0;
800 return;
801 }
802 if(ldv_timer_2_2 != 0 && timer == ldv_timer_list_2_2){
803 ldv_timer_2_2 = 0;
804 return;
805 }
806 if(ldv_timer_2_3 != 0 && timer == ldv_timer_list_2_3){
807 ldv_timer_2_3 = 0;
808 return;
809 }
810 return;
811 }
812
813
814 void disable_suitable_timer_1(struct timer_list * timer){
815 if(ldv_timer_1_0 != 0 && timer == ldv_timer_list_1_0){
816 ldv_timer_1_0 = 0;
817 return;
818 }
819 if(ldv_timer_1_1 != 0 && timer == ldv_timer_list_1_1){
820 ldv_timer_1_1 = 0;
821 return;
822 }
823 if(ldv_timer_1_2 != 0 && timer == ldv_timer_list_1_2){
824 ldv_timer_1_2 = 0;
825 return;
826 }
827 if(ldv_timer_1_3 != 0 && timer == ldv_timer_list_1_3){
828 ldv_timer_1_3 = 0;
829 return;
830 }
831 return;
832 }
833
834
835 void activate_suitable_timer_1(struct timer_list * timer, unsigned long data){
836 if(ldv_timer_1_0 == 0 || ldv_timer_1_0 == 2){
837 ldv_timer_list_1_0 = timer;
838 ldv_timer_list_1_0->data = data;
839 ldv_timer_1_0 = 1;
840 return;
841 }
842 if(ldv_timer_1_1 == 0 || ldv_timer_1_1 == 2){
843 ldv_timer_list_1_1 = timer;
844 ldv_timer_list_1_1->data = data;
845 ldv_timer_1_1 = 1;
846 return;
847 }
848 if(ldv_timer_1_2 == 0 || ldv_timer_1_2 == 2){
849 ldv_timer_list_1_2 = timer;
850 ldv_timer_list_1_2->data = data;
851 ldv_timer_1_2 = 1;
852 return;
853 }
854 if(ldv_timer_1_3 == 0 || ldv_timer_1_3 == 2){
855 ldv_timer_list_1_3 = timer;
856 ldv_timer_list_1_3->data = data;
857 ldv_timer_1_3 = 1;
858 return;
859 }
860 return;
861 }
862
863
864 void activate_pending_timer_3(struct timer_list * timer, unsigned long data, int pending_flag){ if(ldv_timer_list_3 == timer){
865 if(ldv_timer_state_3 == 2 || pending_flag){
866 ldv_timer_list_3 = timer;
867 ldv_timer_list_3->data = data;
868 ldv_timer_state_3 = 1;
869 }
870 return;
871 }
872 reg_timer_3(timer);
873 ldv_timer_list_3->data = data;
874 }
875
876
877 int evil_hack_fs_lock(void){
878 mutex_lock(&fs_mutex);
879 return 1;
880 }
881
882 int __VERIFIER_nondet_int(void);
883
884 int reg_timer_3(struct timer_list * timer){
885 ldv_timer_list_3 = timer;
886 ldv_timer_state_3 = 1;
887 }
888
889
890 void ldv_initialyze_rtl_hal_ops_7(void){
891 rtl8188ee_hal_ops_group0 = ldv_undef_ptr();
892 rtl8188ee_hal_ops_group1 = ldv_undef_ptr();
893 rtl8188ee_hal_ops_group2 = ldv_undef_ptr();
894 }
895
896 void choose_timer_1(void){
897 switch(__VERIFIER_nondet_int()){
898 case 0: {
899 if(ldv_timer_1_0 == 1){
900 ldv_timer_1_0 = 2;
901 ldv_timer_1(ldv_timer_1_0, ldv_timer_list_1_0);
902 }
903 }
904 break;
905 case 1: {
906 if(ldv_timer_1_1 == 1){
907 ldv_timer_1_1 = 2;
908 ldv_timer_1(ldv_timer_1_1, ldv_timer_list_1_1);
909 }
910 }
911 break;
912 case 2: {
913 if(ldv_timer_1_2 == 1){
914 ldv_timer_1_2 = 2;
915 ldv_timer_1(ldv_timer_1_2, ldv_timer_list_1_2);
916 }
917 }
918 break;
919 case 3: {
920 if(ldv_timer_1_3 == 1){
921 ldv_timer_1_3 = 2;
922 ldv_timer_1(ldv_timer_1_3, ldv_timer_list_1_3);
923 }
924 }
925 break;
926 default: ldv_assume(0);
927 }
928 return;
929 }
930
931
932 void ldv_timer_1(int state, struct timer_list * timer){
933 LDV_IN_INTERRUPT=2;
934 (rtl88ee_fw_clk_off_timer_callback)(timer->data);
935 LDV_IN_INTERRUPT=1;
936 }
937
938
939 void activate_suitable_timer_2(struct timer_list * timer, unsigned long data){
940 if(ldv_timer_2_0 == 0 || ldv_timer_2_0 == 2){
941 ldv_timer_list_2_0 = timer;
942 ldv_timer_list_2_0->data = data;
943 ldv_timer_2_0 = 1;
944 return;
945 }
946 if(ldv_timer_2_1 == 0 || ldv_timer_2_1 == 2){
947 ldv_timer_list_2_1 = timer;
948 ldv_timer_list_2_1->data = data;
949 ldv_timer_2_1 = 1;
950 return;
951 }
952 if(ldv_timer_2_2 == 0 || ldv_timer_2_2 == 2){
953 ldv_timer_list_2_2 = timer;
954 ldv_timer_list_2_2->data = data;
955 ldv_timer_2_2 = 1;
956 return;
957 }
958 if(ldv_timer_2_3 == 0 || ldv_timer_2_3 == 2){
959 ldv_timer_list_2_3 = timer;
960 ldv_timer_list_2_3->data = data;
961 ldv_timer_2_3 = 1;
962 return;
963 }
964 return;
965 }
966
967
968 int evil_hack_ar_lock(void){
969 mutex_lock(&ar_mutex);
970 return 1;
971 }
972
973
974 void ldv_timer_2(int state, struct timer_list * timer){
975 LDV_IN_INTERRUPT=2;
976 (rtl88e_dm_fast_antenna_training_callback)(timer->data);
977 LDV_IN_INTERRUPT=1;
978 }
979
980
981 /* DEG-ENVIRONMENT-BEGIN */
982 extern void ldv_main_exported_6(void);
983 extern void ldv_main_exported_0(void);
984 extern void ldv_main_exported_7(void);
985 extern void ldv_main_exported_5(void);
986
987 //********************* LDV MAIN *********************
988 //main
989 void entry_point(void){
990 ldv_initialize();
991 //args for callbacks
992 u8 ldvarg18;
993 u32 ldvarg11;
994 bool ldvarg51;
995 u8 ldvarg32;
996 u32 ldvarg7;
997 u32 ldvarg23;
998 u32 *ldvarg43;
999 enum nl80211_iftype ldvarg42;
1000 enum radio_path ldvarg12;
1001 u8 *ldvarg56;
1002 u32 ldvarg50;
1003 u8 ldvarg46;
1004 struct ieee80211_rx_status *ldvarg1;
1005 bool ldvarg37;
1006 u32 ldvarg53;
1007 u8 ldvarg29;
1008 u32 *ldvarg44;
1009 u32 ldvarg24;
1010 u32 ldvarg35;
1011 u8 *ldvarg0;
1012 u8 *ldvarg38;
1013 u8 ldvarg5;
1014 bool ldvarg33;
1015 enum rf_pwrstate ldvarg16;
1016 u32 ldvarg6;
1017 u8 *ldvarg48;
1018 u16 ldvarg4;
1019 u8 ldvarg14;
1020 u8 *ldvarg34;
1021 struct ieee80211_hdr *ldvarg28;
1022 struct rtl_stats *ldvarg2;
1023 bool ldvarg47;
1024 u8 ldvarg39;
1025 bool ldvarg20;
1026 struct ieee80211_tx_info *ldvarg31;
1027 enum led_ctl_mode ldvarg41;
1028 u8 ldvarg3;
1029 bool ldvarg49;
1030 u8 ldvarg57;
1031 enum radio_path ldvarg8;
1032 u32 ldvarg13;
1033 u32 ldvarg55;
1034 u32 ldvarg36;
1035 u32 ldvarg10;
1036 u8 *ldvarg40;
1037 struct rtl_stats ldvarg9;
1038 bool ldvarg45;
1039 u8 *ldvarg26;
1040 struct rtl_tcb_desc *ldvarg27;
1041 enum nl80211_channel_type ldvarg15;
1042 u8 *ldvarg30;
1043 bool ldvarg21;
1044 u32 ldvarg54;
1045 u8 *ldvarg17;
1046 u8 *ldvarg25;
1047 u8 *ldvarg22;
1048 int ldvarg19;
1049 u8 ldvarg52;
1050 struct pci_device_id const *ldvarg58;
1051 //initialization of machine states
1052 ldv_state_variable_6=0;
1053
1054 ldv_state_variable_3=1;
1055 ldv_state_variable_7=0;
1056
1057 timer_init_2();
1058
1059 ldv_state_variable_2=1;
1060
1061 timer_init_1();
1062
1063 ldv_state_variable_1=1;
1064
1065 ldv_state_variable_4=1;
1066 ref_cnt=0;
1067 ldv_state_variable_0=1;
1068 ldv_state_variable_5=0;
1069 while(1){
1070 switch(__VERIFIER_nondet_int()){
1071 case 0:{
1072 /*DEG-struct: handlers from structure rtlwifi_pm_ops*/
1073 /*DEG-CHECK: checking registration of rtlwifi_pm_ops structure*/
1074 if(ldv_state_variable_6 != 0){
1075 switch(__VERIFIER_nondet_int()){
1076 case 0:{
1077 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1078 if(ldv_state_variable_6 == 2){
1079 /*DEG-CALL: handler suspend from rtlwifi_pm_ops*/
1080 ldv_retval_18=(& rtl_pci_suspend)(rtlwifi_pm_ops_group1);
1081 if(ldv_retval_18==0){
1082 ldv_state_variable_6 = 3;
1083 }
1084 }
1085 }
1086 break;
1087 case 1:{
1088 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1089 if(ldv_state_variable_6 == 2){
1090 /*DEG-CALL: handler poweroff from rtlwifi_pm_ops*/
1091 ldv_retval_17=(& rtl_pci_suspend)(rtlwifi_pm_ops_group1);
1092 if(ldv_retval_17==0){
1093 ldv_state_variable_6 = 4;
1094 }
1095 }
1096 }
1097 break;
1098 case 2:{
1099 /*DEG-state: state 12 (look at corresponding state-chart diagram for details)*/
1100 if(ldv_state_variable_6 == 12){
1101 /*DEG-CALL: handler resume from rtlwifi_pm_ops*/
1102 ldv_retval_16=(& rtl_pci_resume)(rtlwifi_pm_ops_group1);
1103 if(ldv_retval_16==0){
1104 ldv_state_variable_6 = 15;
1105 }
1106 }
1107 }
1108 break;
1109 case 3:{
1110 /*DEG-state: state 14 (look at corresponding state-chart diagram for details)*/
1111 if(ldv_state_variable_6 == 14){
1112 /*DEG-CALL: handler thaw from rtlwifi_pm_ops*/
1113 ldv_retval_15=(& rtl_pci_resume)(rtlwifi_pm_ops_group1);
1114 if(ldv_retval_15==0){
1115 ldv_state_variable_6 = 15;
1116 }
1117 }
1118 }
1119 break;
1120 case 4:{
1121 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1122 if(ldv_state_variable_6 == 2){
1123 /*DEG-CALL: handler freeze from rtlwifi_pm_ops*/
1124 ldv_retval_14=(& rtl_pci_suspend)(rtlwifi_pm_ops_group1);
1125 if(ldv_retval_14==0){
1126 ldv_state_variable_6 = 5;
1127 }
1128 }
1129 }
1130 break;
1131 case 5:{
1132 /*DEG-state: state 13 (look at corresponding state-chart diagram for details)*/
1133 if(ldv_state_variable_6 == 13){
1134 /*DEG-CALL: handler restore from rtlwifi_pm_ops*/
1135 ldv_retval_13=(& rtl_pci_resume)(rtlwifi_pm_ops_group1);
1136 if(ldv_retval_13==0){
1137 ldv_state_variable_6 = 15;
1138 }
1139 }
1140 }
1141 break;
1142 case 6:{
1143 /*DEG-state: state 3 (look at corresponding state-chart diagram for details)*/
1144 if(ldv_state_variable_6 == 3){
1145 /*DEG-CALL: handler suspend_late from rtlwifi_pm_ops*/
1146 ldv_retval_12=ldv_suspend_late_6();
1147 if(ldv_retval_12==0){
1148 ldv_state_variable_6 = 6;
1149 }
1150 }
1151 }
1152 break;
1153 case 7:{
1154 /*DEG-state: state 9 (look at corresponding state-chart diagram for details)*/
1155 if(ldv_state_variable_6 == 9){
1156 /*DEG-CALL: handler restore_early from rtlwifi_pm_ops*/
1157 ldv_retval_11=ldv_restore_early_6();
1158 if(ldv_retval_11==0){
1159 ldv_state_variable_6 = 13;
1160 }
1161 }
1162 }
1163 break;
1164 case 8:{
1165 /*DEG-state: state 6 (look at corresponding state-chart diagram for details)*/
1166 if(ldv_state_variable_6 == 6){
1167 /*DEG-CALL: handler resume_early from rtlwifi_pm_ops*/
1168 ldv_retval_10=ldv_resume_early_6();
1169 if(ldv_retval_10==0){
1170 ldv_state_variable_6 = 12;
1171 }
1172 }
1173 }
1174 break;
1175 case 9:{
1176 /*DEG-state: state 11 (look at corresponding state-chart diagram for details)*/
1177 if(ldv_state_variable_6 == 11){
1178 /*DEG-CALL: handler thaw_early from rtlwifi_pm_ops*/
1179 ldv_retval_9=ldv_thaw_early_6();
1180 if(ldv_retval_9==0){
1181 ldv_state_variable_6 = 14;
1182 }
1183 }
1184 }
1185 break;
1186 case 10:{
1187 /*DEG-state: state 7 (look at corresponding state-chart diagram for details)*/
1188 if(ldv_state_variable_6 == 7){
1189 /*DEG-CALL: handler resume_noirq from rtlwifi_pm_ops*/
1190 ldv_retval_8=ldv_resume_noirq_6();
1191 if(ldv_retval_8==0){
1192 ldv_state_variable_6 = 12;
1193 }
1194 }
1195 }
1196 break;
1197 case 11:{
1198 /*DEG-state: state 5 (look at corresponding state-chart diagram for details)*/
1199 if(ldv_state_variable_6 == 5){
1200 /*DEG-CALL: handler freeze_noirq from rtlwifi_pm_ops*/
1201 ldv_retval_7=ldv_freeze_noirq_6();
1202 if(ldv_retval_7==0){
1203 ldv_state_variable_6 = 10;
1204 }
1205 }
1206 }
1207 break;
1208 case 12:{
1209 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1210 if(ldv_state_variable_6 == 1){
1211 /*DEG-CALL: handler prepare from rtlwifi_pm_ops*/
1212 ldv_retval_6=ldv_prepare_6();
1213 if(ldv_retval_6==0){
1214 ldv_state_variable_6 = 2;
1215 ref_cnt++;
1216 }
1217 }
1218 }
1219 break;
1220 case 13:{
1221 /*DEG-state: state 5 (look at corresponding state-chart diagram for details)*/
1222 if(ldv_state_variable_6 == 5){
1223 /*DEG-CALL: handler freeze_late from rtlwifi_pm_ops*/
1224 ldv_retval_5=ldv_freeze_late_6();
1225 if(ldv_retval_5==0){
1226 ldv_state_variable_6 = 11;
1227 }
1228 }
1229 }
1230 break;
1231 case 14:{
1232 /*DEG-state: state 10 (look at corresponding state-chart diagram for details)*/
1233 if(ldv_state_variable_6 == 10){
1234 /*DEG-CALL: handler thaw_noirq from rtlwifi_pm_ops*/
1235 ldv_retval_4=ldv_thaw_noirq_6();
1236 if(ldv_retval_4==0){
1237 ldv_state_variable_6 = 14;
1238 }
1239 }
1240 }
1241 break;
1242 case 15:{
1243 /*DEG-state: state 4 (look at corresponding state-chart diagram for details)*/
1244 if(ldv_state_variable_6 == 4){
1245 /*DEG-CALL: handler poweroff_noirq from rtlwifi_pm_ops*/
1246 ldv_retval_3=ldv_poweroff_noirq_6();
1247 if(ldv_retval_3==0){
1248 ldv_state_variable_6 = 8;
1249 }
1250 }
1251 }
1252 break;
1253 case 16:{
1254 /*DEG-state: state 4 (look at corresponding state-chart diagram for details)*/
1255 if(ldv_state_variable_6 == 4){
1256 /*DEG-CALL: handler poweroff_late from rtlwifi_pm_ops*/
1257 ldv_retval_2=ldv_poweroff_late_6();
1258 if(ldv_retval_2==0){
1259 ldv_state_variable_6 = 9;
1260 }
1261 }
1262 }
1263 break;
1264 case 17:{
1265 /*DEG-state: state 8 (look at corresponding state-chart diagram for details)*/
1266 if(ldv_state_variable_6 == 8){
1267 /*DEG-CALL: handler restore_noirq from rtlwifi_pm_ops*/
1268 ldv_retval_1=ldv_restore_noirq_6();
1269 if(ldv_retval_1==0){
1270 ldv_state_variable_6 = 13;
1271 }
1272 }
1273 }
1274 break;
1275 case 18:{
1276 /*DEG-state: state 3 (look at corresponding state-chart diagram for details)*/
1277 if(ldv_state_variable_6 == 3){
1278 /*DEG-CALL: handler suspend_noirq from rtlwifi_pm_ops*/
1279 ldv_retval_0=ldv_suspend_noirq_6();
1280 if(ldv_retval_0==0){
1281 ldv_state_variable_6 = 7;
1282 }
1283 }
1284 }
1285 break;
1286 case 19:{
1287 /*DEG-state: state 15 (look at corresponding state-chart diagram for details)*/
1288 if(ldv_state_variable_6 == 15){
1289 /*DEG-CALL: handler complete from rtlwifi_pm_ops*/
1290 ldv_complete_6();
1291 ldv_state_variable_6 = 1;
1292 ref_cnt--;
1293 }
1294 }
1295 break;
1296 default: ldv_assume(0);
1297 }
1298 }
1299 }
1300 break;
1301 case 1:{
1302 /*DEG-struct: handlers from structure ldv_init_timer_1*/
1303 /*DEG-CHECK: checking registration of ldv_init_timer_1 structure*/
1304 if(ldv_state_variable_3 != 0){
1305 choose_timer_3(ldv_timer_list_3);
1306 }
1307 }
1308 break;
1309 case 2:{
1310 /*DEG-struct: handlers from structure rtl8188ee_hal_ops*/
1311 /*DEG-CHECK: checking registration of rtl8188ee_hal_ops structure*/
1312 if(ldv_state_variable_7 != 0){
1313 switch(__VERIFIER_nondet_int()){
1314 case 0:{
1315 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1316 if(ldv_state_variable_7 == 2){
1317 /*DEG-CALL: handler get_hw_reg from rtl8188ee_hal_ops*/
1318 (& rtl88ee_get_hw_reg)(rtl8188ee_hal_ops_group1,ldvarg57,ldvarg56);
1319 /*DEG-postcall: default*/
1320 ldv_state_variable_7 = 2;
1321 }
1322 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1323 if(ldv_state_variable_7 == 1){
1324 /*DEG-CALL: handler get_hw_reg from rtl8188ee_hal_ops*/
1325 (& rtl88ee_get_hw_reg)(rtl8188ee_hal_ops_group1,ldvarg57,ldvarg56);
1326 /*DEG-postcall: default*/
1327 ldv_state_variable_7 = 1;
1328 }
1329 }
1330 break;
1331 case 1:{
1332 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1333 if(ldv_state_variable_7 == 2){
1334 /*DEG-CALL: handler set_bbreg from rtl8188ee_hal_ops*/
1335 (& rtl88e_phy_set_bb_reg)(rtl8188ee_hal_ops_group1,ldvarg54,ldvarg53,ldvarg55);
1336 /*DEG-postcall: default*/
1337 ldv_state_variable_7 = 2;
1338 }
1339 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1340 if(ldv_state_variable_7 == 1){
1341 /*DEG-CALL: handler set_bbreg from rtl8188ee_hal_ops*/
1342 (& rtl88e_phy_set_bb_reg)(rtl8188ee_hal_ops_group1,ldvarg54,ldvarg53,ldvarg55);
1343 /*DEG-postcall: default*/
1344 ldv_state_variable_7 = 1;
1345 }
1346 }
1347 break;
1348 case 2:{
1349 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1350 if(ldv_state_variable_7 == 2){
1351 /*DEG-CALL: handler set_key from rtl8188ee_hal_ops*/
1352 (& rtl88ee_set_key)(rtl8188ee_hal_ops_group1,ldvarg50,ldvarg48,ldvarg51,ldvarg52,ldvarg47,ldvarg49);
1353 /*DEG-postcall: default*/
1354 ldv_state_variable_7 = 2;
1355 }
1356 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1357 if(ldv_state_variable_7 == 1){
1358 /*DEG-CALL: handler set_key from rtl8188ee_hal_ops*/
1359 (& rtl88ee_set_key)(rtl8188ee_hal_ops_group1,ldvarg50,ldvarg48,ldvarg51,ldvarg52,ldvarg47,ldvarg49);
1360 /*DEG-postcall: default*/
1361 ldv_state_variable_7 = 1;
1362 }
1363 }
1364 break;
1365 case 3:{
1366 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1367 if(ldv_state_variable_7 == 2){
1368 /*DEG-CALL: handler disable_interrupt from rtl8188ee_hal_ops*/
1369 (& rtl88ee_disable_interrupt)(rtl8188ee_hal_ops_group1);
1370 /*DEG-postcall: default*/
1371 ldv_state_variable_7 = 2;
1372 }
1373 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1374 if(ldv_state_variable_7 == 1){
1375 /*DEG-CALL: handler disable_interrupt from rtl8188ee_hal_ops*/
1376 (& rtl88ee_disable_interrupt)(rtl8188ee_hal_ops_group1);
1377 /*DEG-postcall: default*/
1378 ldv_state_variable_7 = 1;
1379 }
1380 }
1381 break;
1382 case 4:{
1383 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1384 if(ldv_state_variable_7 == 2){
1385 /*DEG-CALL: handler update_rate_tbl from rtl8188ee_hal_ops*/
1386 (& rtl88ee_update_hal_rate_tbl)(rtl8188ee_hal_ops_group1,rtl8188ee_hal_ops_group2,ldvarg46);
1387 /*DEG-postcall: default*/
1388 ldv_state_variable_7 = 2;
1389 }
1390 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1391 if(ldv_state_variable_7 == 1){
1392 /*DEG-CALL: handler update_rate_tbl from rtl8188ee_hal_ops*/
1393 (& rtl88ee_update_hal_rate_tbl)(rtl8188ee_hal_ops_group1,rtl8188ee_hal_ops_group2,ldvarg46);
1394 /*DEG-postcall: default*/
1395 ldv_state_variable_7 = 1;
1396 }
1397 }
1398 break;
1399 case 5:{
1400 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1401 if(ldv_state_variable_7 == 2){
1402 /*DEG-CALL: handler read_eeprom_info from rtl8188ee_hal_ops*/
1403 (& rtl88ee_read_eeprom_info)(rtl8188ee_hal_ops_group1);
1404 /*DEG-postcall: default*/
1405 ldv_state_variable_7 = 2;
1406 }
1407 }
1408 break;
1409 case 6:{
1410 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1411 if(ldv_state_variable_7 == 2){
1412 /*DEG-CALL: handler set_chk_bssid from rtl8188ee_hal_ops*/
1413 (& rtl88ee_set_check_bssid)(rtl8188ee_hal_ops_group1,ldvarg45);
1414 /*DEG-postcall: default*/
1415 ldv_state_variable_7 = 2;
1416 }
1417 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1418 if(ldv_state_variable_7 == 1){
1419 /*DEG-CALL: handler set_chk_bssid from rtl8188ee_hal_ops*/
1420 (& rtl88ee_set_check_bssid)(rtl8188ee_hal_ops_group1,ldvarg45);
1421 /*DEG-postcall: default*/
1422 ldv_state_variable_7 = 1;
1423 }
1424 }
1425 break;
1426 case 7:{
1427 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1428 if(ldv_state_variable_7 == 2){
1429 /*DEG-CALL: handler interrupt_recognized from rtl8188ee_hal_ops*/
1430 (& rtl88ee_interrupt_recognized)(rtl8188ee_hal_ops_group1,ldvarg44,ldvarg43);
1431 /*DEG-postcall: default*/
1432 ldv_state_variable_7 = 2;
1433 }
1434 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1435 if(ldv_state_variable_7 == 1){
1436 /*DEG-CALL: handler interrupt_recognized from rtl8188ee_hal_ops*/
1437 (& rtl88ee_interrupt_recognized)(rtl8188ee_hal_ops_group1,ldvarg44,ldvarg43);
1438 /*DEG-postcall: default*/
1439 ldv_state_variable_7 = 1;
1440 }
1441 }
1442 break;
1443 case 8:{
1444 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1445 if(ldv_state_variable_7 == 2){
1446 /*DEG-CALL: handler set_network_type from rtl8188ee_hal_ops*/
1447 (& rtl88ee_set_network_type)(rtl8188ee_hal_ops_group1,ldvarg42);
1448 /*DEG-postcall: default*/
1449 ldv_state_variable_7 = 2;
1450 }
1451 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1452 if(ldv_state_variable_7 == 1){
1453 /*DEG-CALL: handler set_network_type from rtl8188ee_hal_ops*/
1454 (& rtl88ee_set_network_type)(rtl8188ee_hal_ops_group1,ldvarg42);
1455 /*DEG-postcall: default*/
1456 ldv_state_variable_7 = 1;
1457 }
1458 }
1459 break;
1460 case 9:{
1461 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1462 if(ldv_state_variable_7 == 2){
1463 /*DEG-CALL: handler set_channel_access from rtl8188ee_hal_ops*/
1464 (& rtl88ee_update_channel_access_setting)(rtl8188ee_hal_ops_group1);
1465 /*DEG-postcall: default*/
1466 ldv_state_variable_7 = 2;
1467 }
1468 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1469 if(ldv_state_variable_7 == 1){
1470 /*DEG-CALL: handler set_channel_access from rtl8188ee_hal_ops*/
1471 (& rtl88ee_update_channel_access_setting)(rtl8188ee_hal_ops_group1);
1472 /*DEG-postcall: default*/
1473 ldv_state_variable_7 = 1;
1474 }
1475 }
1476 break;
1477 case 10:{
1478 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1479 if(ldv_state_variable_7 == 2){
1480 /*DEG-CALL: handler hw_resume from rtl8188ee_hal_ops*/
1481 (& rtl88ee_resume)(rtl8188ee_hal_ops_group1);
1482 /*DEG-postcall: default*/
1483 ldv_state_variable_7 = 2;
1484 }
1485 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1486 if(ldv_state_variable_7 == 1){
1487 /*DEG-CALL: handler hw_resume from rtl8188ee_hal_ops*/
1488 (& rtl88ee_resume)(rtl8188ee_hal_ops_group1);
1489 /*DEG-postcall: default*/
1490 ldv_state_variable_7 = 1;
1491 }
1492 }
1493 break;
1494 case 11:{
1495 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1496 if(ldv_state_variable_7 == 2){
1497 /*DEG-CALL: handler hw_init from rtl8188ee_hal_ops*/
1498 (& rtl88ee_hw_init)(rtl8188ee_hal_ops_group1);
1499 /*DEG-postcall: default*/
1500 ldv_state_variable_7 = 2;
1501 }
1502 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1503 if(ldv_state_variable_7 == 1){
1504 /*DEG-CALL: handler hw_init from rtl8188ee_hal_ops*/
1505 (& rtl88ee_hw_init)(rtl8188ee_hal_ops_group1);
1506 /*DEG-postcall: default*/
1507 ldv_state_variable_7 = 1;
1508 }
1509 }
1510 break;
1511 case 12:{
1512 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1513 if(ldv_state_variable_7 == 2){
1514 /*DEG-CALL: handler hw_disable from rtl8188ee_hal_ops*/
1515 (& rtl88ee_card_disable)(rtl8188ee_hal_ops_group1);
1516 /*DEG-postcall: default*/
1517 ldv_state_variable_7 = 2;
1518 }
1519 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1520 if(ldv_state_variable_7 == 1){
1521 /*DEG-CALL: handler hw_disable from rtl8188ee_hal_ops*/
1522 (& rtl88ee_card_disable)(rtl8188ee_hal_ops_group1);
1523 /*DEG-postcall: default*/
1524 ldv_state_variable_7 = 1;
1525 }
1526 }
1527 break;
1528 case 13:{
1529 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1530 if(ldv_state_variable_7 == 2){
1531 /*DEG-CALL: handler led_control from rtl8188ee_hal_ops*/
1532 (& rtl88ee_led_control)(rtl8188ee_hal_ops_group1,ldvarg41);
1533 /*DEG-postcall: default*/
1534 ldv_state_variable_7 = 2;
1535 }
1536 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1537 if(ldv_state_variable_7 == 1){
1538 /*DEG-CALL: handler led_control from rtl8188ee_hal_ops*/
1539 (& rtl88ee_led_control)(rtl8188ee_hal_ops_group1,ldvarg41);
1540 /*DEG-postcall: default*/
1541 ldv_state_variable_7 = 1;
1542 }
1543 }
1544 break;
1545 case 14:{
1546 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1547 if(ldv_state_variable_7 == 2){
1548 /*DEG-CALL: handler set_desc from rtl8188ee_hal_ops*/
1549 (& rtl88ee_set_desc)(rtl8188ee_hal_ops_group1,ldvarg38,ldvarg37,ldvarg39,ldvarg40);
1550 /*DEG-postcall: default*/
1551 ldv_state_variable_7 = 2;
1552 }
1553 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1554 if(ldv_state_variable_7 == 1){
1555 /*DEG-CALL: handler set_desc from rtl8188ee_hal_ops*/
1556 (& rtl88ee_set_desc)(rtl8188ee_hal_ops_group1,ldvarg38,ldvarg37,ldvarg39,ldvarg40);
1557 /*DEG-postcall: default*/
1558 ldv_state_variable_7 = 1;
1559 }
1560 }
1561 break;
1562 case 15:{
1563 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1564 if(ldv_state_variable_7 == 2){
1565 /*DEG-CALL: handler update_interrupt_mask from rtl8188ee_hal_ops*/
1566 (& rtl88ee_update_interrupt_mask)(rtl8188ee_hal_ops_group1,ldvarg36,ldvarg35);
1567 /*DEG-postcall: default*/
1568 ldv_state_variable_7 = 2;
1569 }
1570 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1571 if(ldv_state_variable_7 == 1){
1572 /*DEG-CALL: handler update_interrupt_mask from rtl8188ee_hal_ops*/
1573 (& rtl88ee_update_interrupt_mask)(rtl8188ee_hal_ops_group1,ldvarg36,ldvarg35);
1574 /*DEG-postcall: default*/
1575 ldv_state_variable_7 = 1;
1576 }
1577 }
1578 break;
1579 case 16:{
1580 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1581 if(ldv_state_variable_7 == 2){
1582 /*DEG-CALL: handler get_desc from rtl8188ee_hal_ops*/
1583 (& rtl88ee_get_desc)(ldvarg34,ldvarg33,ldvarg32);
1584 /*DEG-postcall: default*/
1585 ldv_state_variable_7 = 2;
1586 }
1587 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1588 if(ldv_state_variable_7 == 1){
1589 /*DEG-CALL: handler get_desc from rtl8188ee_hal_ops*/
1590 (& rtl88ee_get_desc)(ldvarg34,ldvarg33,ldvarg32);
1591 /*DEG-postcall: default*/
1592 ldv_state_variable_7 = 1;
1593 }
1594 }
1595 break;
1596 case 17:{
1597 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1598 if(ldv_state_variable_7 == 2){
1599 /*DEG-CALL: handler fill_tx_desc from rtl8188ee_hal_ops*/
1600 (& rtl88ee_tx_fill_desc)(rtl8188ee_hal_ops_group1,ldvarg28,ldvarg26,ldvarg30,ldvarg31,rtl8188ee_hal_ops_group2,rtl8188ee_hal_ops_group0,ldvarg29,ldvarg27);
1601 /*DEG-postcall: default*/
1602 ldv_state_variable_7 = 2;
1603 }
1604 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1605 if(ldv_state_variable_7 == 1){
1606 /*DEG-CALL: handler fill_tx_desc from rtl8188ee_hal_ops*/
1607 (& rtl88ee_tx_fill_desc)(rtl8188ee_hal_ops_group1,ldvarg28,ldvarg26,ldvarg30,ldvarg31,rtl8188ee_hal_ops_group2,rtl8188ee_hal_ops_group0,ldvarg29,ldvarg27);
1608 /*DEG-postcall: default*/
1609 ldv_state_variable_7 = 1;
1610 }
1611 }
1612 break;
1613 case 18:{
1614 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1615 if(ldv_state_variable_7 == 2){
1616 /*DEG-CALL: handler deinit_sw_vars from rtl8188ee_hal_ops*/
1617 (& rtl88e_deinit_sw_vars)(rtl8188ee_hal_ops_group1);
1618 /*DEG-postcall: default*/
1619 ldv_state_variable_7 = 2;
1620 }
1621 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1622 if(ldv_state_variable_7 == 1){
1623 /*DEG-CALL: handler deinit_sw_vars from rtl8188ee_hal_ops*/
1624 (& rtl88e_deinit_sw_vars)(rtl8188ee_hal_ops_group1);
1625 /*DEG-postcall: default*/
1626 ldv_state_variable_7 = 1;
1627 }
1628 }
1629 break;
1630 case 19:{
1631 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1632 if(ldv_state_variable_7 == 2){
1633 /*DEG-CALL: handler radio_onoff_checking from rtl8188ee_hal_ops*/
1634 (& rtl88ee_gpio_radio_on_off_checking)(rtl8188ee_hal_ops_group1,ldvarg25);
1635 /*DEG-postcall: default*/
1636 ldv_state_variable_7 = 2;
1637 }
1638 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1639 if(ldv_state_variable_7 == 1){
1640 /*DEG-CALL: handler radio_onoff_checking from rtl8188ee_hal_ops*/
1641 (& rtl88ee_gpio_radio_on_off_checking)(rtl8188ee_hal_ops_group1,ldvarg25);
1642 /*DEG-postcall: default*/
1643 ldv_state_variable_7 = 1;
1644 }
1645 }
1646 break;
1647 case 20:{
1648 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1649 if(ldv_state_variable_7 == 2){
1650 /*DEG-CALL: handler get_bbreg from rtl8188ee_hal_ops*/
1651 (& rtl88e_phy_query_bb_reg)(rtl8188ee_hal_ops_group1,ldvarg24,ldvarg23);
1652 /*DEG-postcall: default*/
1653 ldv_state_variable_7 = 2;
1654 }
1655 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1656 if(ldv_state_variable_7 == 1){
1657 /*DEG-CALL: handler get_bbreg from rtl8188ee_hal_ops*/
1658 (& rtl88e_phy_query_bb_reg)(rtl8188ee_hal_ops_group1,ldvarg24,ldvarg23);
1659 /*DEG-postcall: default*/
1660 ldv_state_variable_7 = 1;
1661 }
1662 }
1663 break;
1664 case 21:{
1665 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1666 if(ldv_state_variable_7 == 2){
1667 /*DEG-CALL: handler fill_tx_cmddesc from rtl8188ee_hal_ops*/
1668 (& rtl88ee_tx_fill_cmddesc)(rtl8188ee_hal_ops_group1,ldvarg22,ldvarg21,ldvarg20,rtl8188ee_hal_ops_group0);
1669 /*DEG-postcall: default*/
1670 ldv_state_variable_7 = 2;
1671 }
1672 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1673 if(ldv_state_variable_7 == 1){
1674 /*DEG-CALL: handler fill_tx_cmddesc from rtl8188ee_hal_ops*/
1675 (& rtl88ee_tx_fill_cmddesc)(rtl8188ee_hal_ops_group1,ldvarg22,ldvarg21,ldvarg20,rtl8188ee_hal_ops_group0);
1676 /*DEG-postcall: default*/
1677 ldv_state_variable_7 = 1;
1678 }
1679 }
1680 break;
1681 case 22:{
1682 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1683 if(ldv_state_variable_7 == 2){
1684 /*DEG-CALL: handler set_qos from rtl8188ee_hal_ops*/
1685 (& rtl88ee_set_qos)(rtl8188ee_hal_ops_group1,ldvarg19);
1686 /*DEG-postcall: default*/
1687 ldv_state_variable_7 = 2;
1688 }
1689 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1690 if(ldv_state_variable_7 == 1){
1691 /*DEG-CALL: handler set_qos from rtl8188ee_hal_ops*/
1692 (& rtl88ee_set_qos)(rtl8188ee_hal_ops_group1,ldvarg19);
1693 /*DEG-postcall: default*/
1694 ldv_state_variable_7 = 1;
1695 }
1696 }
1697 break;
1698 case 23:{
1699 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1700 if(ldv_state_variable_7 == 2){
1701 /*DEG-CALL: handler set_hw_reg from rtl8188ee_hal_ops*/
1702 (& rtl88ee_set_hw_reg)(rtl8188ee_hal_ops_group1,ldvarg18,ldvarg17);
1703 /*DEG-postcall: default*/
1704 ldv_state_variable_7 = 2;
1705 }
1706 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1707 if(ldv_state_variable_7 == 1){
1708 /*DEG-CALL: handler set_hw_reg from rtl8188ee_hal_ops*/
1709 (& rtl88ee_set_hw_reg)(rtl8188ee_hal_ops_group1,ldvarg18,ldvarg17);
1710 /*DEG-postcall: default*/
1711 ldv_state_variable_7 = 1;
1712 }
1713 }
1714 break;
1715 case 24:{
1716 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1717 if(ldv_state_variable_7 == 2){
1718 /*DEG-CALL: handler set_rf_power_state from rtl8188ee_hal_ops*/
1719 (& rtl88e_phy_set_rf_power_state)(rtl8188ee_hal_ops_group1,ldvarg16);
1720 /*DEG-postcall: default*/
1721 ldv_state_variable_7 = 2;
1722 }
1723 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1724 if(ldv_state_variable_7 == 1){
1725 /*DEG-CALL: handler set_rf_power_state from rtl8188ee_hal_ops*/
1726 (& rtl88e_phy_set_rf_power_state)(rtl8188ee_hal_ops_group1,ldvarg16);
1727 /*DEG-postcall: default*/
1728 ldv_state_variable_7 = 1;
1729 }
1730 }
1731 break;
1732 case 25:{
1733 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1734 if(ldv_state_variable_7 == 2){
1735 /*DEG-CALL: handler set_bw_mode from rtl8188ee_hal_ops*/
1736 (& rtl88e_phy_set_bw_mode)(rtl8188ee_hal_ops_group1,ldvarg15);
1737 /*DEG-postcall: default*/
1738 ldv_state_variable_7 = 2;
1739 }
1740 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1741 if(ldv_state_variable_7 == 1){
1742 /*DEG-CALL: handler set_bw_mode from rtl8188ee_hal_ops*/
1743 (& rtl88e_phy_set_bw_mode)(rtl8188ee_hal_ops_group1,ldvarg15);
1744 /*DEG-postcall: default*/
1745 ldv_state_variable_7 = 1;
1746 }
1747 }
1748 break;
1749 case 26:{
1750 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1751 if(ldv_state_variable_7 == 2){
1752 /*DEG-CALL: handler init_sw_leds from rtl8188ee_hal_ops*/
1753 (& rtl88ee_init_sw_leds)(rtl8188ee_hal_ops_group1);
1754 /*DEG-postcall: default*/
1755 ldv_state_variable_7 = 2;
1756 }
1757 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1758 if(ldv_state_variable_7 == 1){
1759 /*DEG-CALL: handler init_sw_leds from rtl8188ee_hal_ops*/
1760 (& rtl88ee_init_sw_leds)(rtl8188ee_hal_ops_group1);
1761 /*DEG-postcall: default*/
1762 ldv_state_variable_7 = 1;
1763 }
1764 }
1765 break;
1766 case 27:{
1767 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1768 if(ldv_state_variable_7 == 2){
1769 /*DEG-CALL: handler enable_interrupt from rtl8188ee_hal_ops*/
1770 (& rtl88ee_enable_interrupt)(rtl8188ee_hal_ops_group1);
1771 /*DEG-postcall: default*/
1772 ldv_state_variable_7 = 2;
1773 }
1774 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1775 if(ldv_state_variable_7 == 1){
1776 /*DEG-CALL: handler enable_interrupt from rtl8188ee_hal_ops*/
1777 (& rtl88ee_enable_interrupt)(rtl8188ee_hal_ops_group1);
1778 /*DEG-postcall: default*/
1779 ldv_state_variable_7 = 1;
1780 }
1781 }
1782 break;
1783 case 28:{
1784 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1785 if(ldv_state_variable_7 == 2){
1786 /*DEG-CALL: handler tx_polling from rtl8188ee_hal_ops*/
1787 (& rtl88ee_tx_polling)(rtl8188ee_hal_ops_group1,ldvarg14);
1788 /*DEG-postcall: default*/
1789 ldv_state_variable_7 = 2;
1790 }
1791 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1792 if(ldv_state_variable_7 == 1){
1793 /*DEG-CALL: handler tx_polling from rtl8188ee_hal_ops*/
1794 (& rtl88ee_tx_polling)(rtl8188ee_hal_ops_group1,ldvarg14);
1795 /*DEG-postcall: default*/
1796 ldv_state_variable_7 = 1;
1797 }
1798 }
1799 break;
1800 case 29:{
1801 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1802 if(ldv_state_variable_7 == 2){
1803 /*DEG-CALL: handler set_bcn_reg from rtl8188ee_hal_ops*/
1804 (& rtl88ee_set_beacon_related_registers)(rtl8188ee_hal_ops_group1);
1805 /*DEG-postcall: default*/
1806 ldv_state_variable_7 = 2;
1807 }
1808 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1809 if(ldv_state_variable_7 == 1){
1810 /*DEG-CALL: handler set_bcn_reg from rtl8188ee_hal_ops*/
1811 (& rtl88ee_set_beacon_related_registers)(rtl8188ee_hal_ops_group1);
1812 /*DEG-postcall: default*/
1813 ldv_state_variable_7 = 1;
1814 }
1815 }
1816 break;
1817 case 30:{
1818 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1819 if(ldv_state_variable_7 == 2){
1820 /*DEG-CALL: handler dm_watchdog from rtl8188ee_hal_ops*/
1821 (& rtl88e_dm_watchdog)(rtl8188ee_hal_ops_group1);
1822 /*DEG-postcall: default*/
1823 ldv_state_variable_7 = 2;
1824 }
1825 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1826 if(ldv_state_variable_7 == 1){
1827 /*DEG-CALL: handler dm_watchdog from rtl8188ee_hal_ops*/
1828 (& rtl88e_dm_watchdog)(rtl8188ee_hal_ops_group1);
1829 /*DEG-postcall: default*/
1830 ldv_state_variable_7 = 1;
1831 }
1832 }
1833 break;
1834 case 31:{
1835 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1836 if(ldv_state_variable_7 == 2){
1837 /*DEG-CALL: handler switch_channel from rtl8188ee_hal_ops*/
1838 (& rtl88e_phy_sw_chnl)(rtl8188ee_hal_ops_group1);
1839 /*DEG-postcall: default*/
1840 ldv_state_variable_7 = 2;
1841 }
1842 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1843 if(ldv_state_variable_7 == 1){
1844 /*DEG-CALL: handler switch_channel from rtl8188ee_hal_ops*/
1845 (& rtl88e_phy_sw_chnl)(rtl8188ee_hal_ops_group1);
1846 /*DEG-postcall: default*/
1847 ldv_state_variable_7 = 1;
1848 }
1849 }
1850 break;
1851 case 32:{
1852 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1853 if(ldv_state_variable_7 == 2){
1854 /*DEG-CALL: handler set_rfreg from rtl8188ee_hal_ops*/
1855 (& rtl88e_phy_set_rf_reg)(rtl8188ee_hal_ops_group1,ldvarg12,ldvarg11,ldvarg10,ldvarg13);
1856 /*DEG-postcall: default*/
1857 ldv_state_variable_7 = 2;
1858 }
1859 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1860 if(ldv_state_variable_7 == 1){
1861 /*DEG-CALL: handler set_rfreg from rtl8188ee_hal_ops*/
1862 (& rtl88e_phy_set_rf_reg)(rtl8188ee_hal_ops_group1,ldvarg12,ldvarg11,ldvarg10,ldvarg13);
1863 /*DEG-postcall: default*/
1864 ldv_state_variable_7 = 1;
1865 }
1866 }
1867 break;
1868 case 33:{
1869 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1870 if(ldv_state_variable_7 == 2){
1871 /*DEG-CALL: handler enable_hw_sec from rtl8188ee_hal_ops*/
1872 (& rtl88ee_enable_hw_security_config)(rtl8188ee_hal_ops_group1);
1873 /*DEG-postcall: default*/
1874 ldv_state_variable_7 = 2;
1875 }
1876 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1877 if(ldv_state_variable_7 == 1){
1878 /*DEG-CALL: handler enable_hw_sec from rtl8188ee_hal_ops*/
1879 (& rtl88ee_enable_hw_security_config)(rtl8188ee_hal_ops_group1);
1880 /*DEG-postcall: default*/
1881 ldv_state_variable_7 = 1;
1882 }
1883 }
1884 break;
1885 case 34:{
1886 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1887 if(ldv_state_variable_7 == 2){
1888 /*DEG-CALL: handler get_btc_status from rtl8188ee_hal_ops*/
1889 (& rtl88e_get_btc_status)();
1890 /*DEG-postcall: default*/
1891 ldv_state_variable_7 = 2;
1892 }
1893 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1894 if(ldv_state_variable_7 == 1){
1895 /*DEG-CALL: handler get_btc_status from rtl8188ee_hal_ops*/
1896 (& rtl88e_get_btc_status)();
1897 /*DEG-postcall: default*/
1898 ldv_state_variable_7 = 1;
1899 }
1900 }
1901 break;
1902 case 35:{
1903 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1904 if(ldv_state_variable_7 == 2){
1905 /*DEG-CALL: handler rx_command_packet from rtl8188ee_hal_ops*/
1906 (& rtl88ee_rx_command_packet)(rtl8188ee_hal_ops_group1,ldvarg9,rtl8188ee_hal_ops_group0);
1907 /*DEG-postcall: default*/
1908 ldv_state_variable_7 = 2;
1909 }
1910 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1911 if(ldv_state_variable_7 == 1){
1912 /*DEG-CALL: handler rx_command_packet from rtl8188ee_hal_ops*/
1913 (& rtl88ee_rx_command_packet)(rtl8188ee_hal_ops_group1,ldvarg9,rtl8188ee_hal_ops_group0);
1914 /*DEG-postcall: default*/
1915 ldv_state_variable_7 = 1;
1916 }
1917 }
1918 break;
1919 case 36:{
1920 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1921 if(ldv_state_variable_7 == 2){
1922 /*DEG-CALL: handler init_sw_vars from rtl8188ee_hal_ops*/
1923 (& rtl88e_init_sw_vars)(rtl8188ee_hal_ops_group1);
1924 /*DEG-postcall: default*/
1925 ldv_state_variable_7 = 2;
1926 }
1927 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1928 if(ldv_state_variable_7 == 1){
1929 /*DEG-CALL: handler init_sw_vars from rtl8188ee_hal_ops*/
1930 (& rtl88e_init_sw_vars)(rtl8188ee_hal_ops_group1);
1931 /*DEG-postcall: default*/
1932 ldv_state_variable_7 = 1;
1933 }
1934 }
1935 break;
1936 case 37:{
1937 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1938 if(ldv_state_variable_7 == 2){
1939 /*DEG-CALL: handler hw_suspend from rtl8188ee_hal_ops*/
1940 (& rtl88ee_suspend)(rtl8188ee_hal_ops_group1);
1941 /*DEG-postcall: default*/
1942 ldv_state_variable_7 = 2;
1943 }
1944 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1945 if(ldv_state_variable_7 == 1){
1946 /*DEG-CALL: handler hw_suspend from rtl8188ee_hal_ops*/
1947 (& rtl88ee_suspend)(rtl8188ee_hal_ops_group1);
1948 /*DEG-postcall: default*/
1949 ldv_state_variable_7 = 1;
1950 }
1951 }
1952 break;
1953 case 38:{
1954 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1955 if(ldv_state_variable_7 == 2){
1956 /*DEG-CALL: handler get_rfreg from rtl8188ee_hal_ops*/
1957 (& rtl88e_phy_query_rf_reg)(rtl8188ee_hal_ops_group1,ldvarg8,ldvarg7,ldvarg6);
1958 /*DEG-postcall: default*/
1959 ldv_state_variable_7 = 2;
1960 }
1961 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1962 if(ldv_state_variable_7 == 1){
1963 /*DEG-CALL: handler get_rfreg from rtl8188ee_hal_ops*/
1964 (& rtl88e_phy_query_rf_reg)(rtl8188ee_hal_ops_group1,ldvarg8,ldvarg7,ldvarg6);
1965 /*DEG-postcall: default*/
1966 ldv_state_variable_7 = 1;
1967 }
1968 }
1969 break;
1970 case 39:{
1971 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1972 if(ldv_state_variable_7 == 2){
1973 /*DEG-CALL: handler set_bcn_intv from rtl8188ee_hal_ops*/
1974 (& rtl88ee_set_beacon_interval)(rtl8188ee_hal_ops_group1);
1975 /*DEG-postcall: default*/
1976 ldv_state_variable_7 = 2;
1977 }
1978 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1979 if(ldv_state_variable_7 == 1){
1980 /*DEG-CALL: handler set_bcn_intv from rtl8188ee_hal_ops*/
1981 (& rtl88ee_set_beacon_interval)(rtl8188ee_hal_ops_group1);
1982 /*DEG-postcall: default*/
1983 ldv_state_variable_7 = 1;
1984 }
1985 }
1986 break;
1987 case 40:{
1988 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
1989 if(ldv_state_variable_7 == 2){
1990 /*DEG-CALL: handler is_tx_desc_closed from rtl8188ee_hal_ops*/
1991 (& rtl88ee_is_tx_desc_closed)(rtl8188ee_hal_ops_group1,ldvarg5,ldvarg4);
1992 /*DEG-postcall: default*/
1993 ldv_state_variable_7 = 2;
1994 }
1995 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
1996 if(ldv_state_variable_7 == 1){
1997 /*DEG-CALL: handler is_tx_desc_closed from rtl8188ee_hal_ops*/
1998 (& rtl88ee_is_tx_desc_closed)(rtl8188ee_hal_ops_group1,ldvarg5,ldvarg4);
1999 /*DEG-postcall: default*/
2000 ldv_state_variable_7 = 1;
2001 }
2002 }
2003 break;
2004 case 41:{
2005 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
2006 if(ldv_state_variable_7 == 2){
2007 /*DEG-CALL: handler scan_operation_backup from rtl8188ee_hal_ops*/
2008 (& rtl88e_phy_scan_operation_backup)(rtl8188ee_hal_ops_group1,ldvarg3);
2009 /*DEG-postcall: default*/
2010 ldv_state_variable_7 = 2;
2011 }
2012 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
2013 if(ldv_state_variable_7 == 1){
2014 /*DEG-CALL: handler scan_operation_backup from rtl8188ee_hal_ops*/
2015 (& rtl88e_phy_scan_operation_backup)(rtl8188ee_hal_ops_group1,ldvarg3);
2016 /*DEG-postcall: default*/
2017 ldv_state_variable_7 = 1;
2018 }
2019 }
2020 break;
2021 case 42:{
2022 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
2023 if(ldv_state_variable_7 == 2){
2024 /*DEG-CALL: handler query_rx_desc from rtl8188ee_hal_ops*/
2025 (& rtl88ee_rx_query_desc)(rtl8188ee_hal_ops_group1,ldvarg2,ldvarg1,ldvarg0,rtl8188ee_hal_ops_group0);
2026 /*DEG-postcall: default*/
2027 ldv_state_variable_7 = 2;
2028 }
2029 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
2030 if(ldv_state_variable_7 == 1){
2031 /*DEG-CALL: handler query_rx_desc from rtl8188ee_hal_ops*/
2032 (& rtl88ee_rx_query_desc)(rtl8188ee_hal_ops_group1,ldvarg2,ldvarg1,ldvarg0,rtl8188ee_hal_ops_group0);
2033 /*DEG-postcall: default*/
2034 ldv_state_variable_7 = 1;
2035 }
2036 }
2037 break;
2038 case 43:{
2039 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
2040 if(ldv_state_variable_7 == 2){
2041 /*DEG-CALL: handler release from rtl8188ee_hal_ops*/
2042 ldv_release_7();
2043 /*DEG-postcall: module put*/
2044 ldv_state_variable_7 = 1;
2045 ref_cnt--;
2046 }
2047 }
2048 break;
2049 case 44:{
2050 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
2051 if(ldv_state_variable_7 == 1){
2052 /*DEG-CALL: handler probe from rtl8188ee_hal_ops*/
2053 ldv_probe_7();
2054 /*DEG-postcall: get module*/
2055 ldv_state_variable_7 = 2;
2056 ref_cnt++;
2057 }
2058 }
2059 break;
2060 default: ldv_assume(0);
2061 }
2062 }
2063 }
2064 break;
2065 case 3:{
2066 /*DEG-struct: handlers from structure ldv_setup_timer_2*/
2067 /*DEG-CHECK: checking registration of ldv_setup_timer_2 structure*/
2068 if(ldv_state_variable_2 != 0){
2069 choose_timer_2();
2070 }
2071 }
2072 break;
2073 case 4:{
2074 /*DEG-struct: handlers from structure ldv_setup_timer_3*/
2075 /*DEG-CHECK: checking registration of ldv_setup_timer_3 structure*/
2076 if(ldv_state_variable_1 != 0){
2077 choose_timer_1();
2078 }
2079 }
2080 break;
2081 case 5:{
2082 /*DEG-struct: handlers from structure ldv_init_timer_0*/
2083 /*DEG-CHECK: checking registration of ldv_init_timer_0 structure*/
2084 if(ldv_state_variable_4 != 0){
2085 choose_timer_4(ldv_timer_list_4);
2086 }
2087 }
2088 break;
2089 case 6:{
2090 /*DEG-struct: handlers from structure module*/
2091 /*DEG-CHECK: checking registration of module structure*/
2092 if(ldv_state_variable_0 != 0){
2093 switch(__VERIFIER_nondet_int()){
2094 case 0:{
2095 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
2096 if(ldv_state_variable_0 == 2 && ref_cnt==0){
2097 /*DEG-CALL: handler module_exit from module*/
2098 rtl88ee_driver_exit();
2099 ldv_state_variable_0 = 3;
2100 goto ldv_final;
2101 }
2102 }
2103 break;
2104 case 1:{
2105 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
2106 if(ldv_state_variable_0 == 1){
2107 /*DEG-CALL: handler module_init from module*/
2108 ldv_retval_19=rtl88ee_driver_init();
2109 if(ldv_retval_19!=0){
2110 ldv_state_variable_0 = 3;
2111 goto ldv_final;
2112 }
2113 /*DEG-postcall: if success*/
2114 if(ldv_retval_19==0){
2115 ldv_state_variable_0 = 2;
2116 ldv_state_variable_7 = 1;
2117 ldv_initialyze_rtl_hal_ops_7();
2118 ldv_state_variable_6 = 1;
2119 ldv_dev_pm_ops_6();
2120 }
2121 }
2122 }
2123 break;
2124 default: ldv_assume(0);
2125 }
2126 }
2127 }
2128 break;
2129 case 7:{
2130 /*DEG-struct: handlers from structure rtl88ee_driver*/
2131 /*DEG-CHECK: checking registration of rtl88ee_driver structure*/
2132 if(ldv_state_variable_5 != 0){
2133 switch(__VERIFIER_nondet_int()){
2134 case 0:{
2135 /*DEG-state: state 1 (look at corresponding state-chart diagram for details)*/
2136 if(ldv_state_variable_5 == 1){
2137 /*DEG-CALL: handler probe from rtl88ee_driver*/
2138 ldv_retval_20=(& rtl_pci_probe)(rtl88ee_driver_group1,ldvarg58);
2139 if(ldv_retval_20==0){
2140 ldv_state_variable_5 = 2;
2141 ref_cnt++;
2142 }
2143 }
2144 }
2145 break;
2146 case 1:{
2147 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
2148 if(ldv_state_variable_5 == 2){
2149 /*DEG-CALL: handler remove from rtl88ee_driver*/
2150 (& rtl_pci_disconnect)(rtl88ee_driver_group1);
2151 ldv_state_variable_5 = 1;
2152 }
2153 }
2154 break;
2155 case 2:{
2156 /*DEG-state: state 2 (look at corresponding state-chart diagram for details)*/
2157 if(ldv_state_variable_5 == 2){
2158 /*DEG-CALL: handler shutdown from rtl88ee_driver*/
2159 ldv_shutdown_5();
2160 ldv_state_variable_5 = 2;
2161 }
2162 }
2163 break;
2164 default: ldv_assume(0);
2165 }
2166 }
2167 }
2168 break;
2169 default: ldv_assume(0);
2170 }
2171 }
2172 ldv_final:
2173 ldv_check_final_state();
2174 return;
2175 }
2176 /* DEG-ENVIRONMENT-END */ 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../pci.h"
28 #include "../base.h"
29 #include "../stats.h"
30 #include "reg.h"
31 #include "def.h"
32 #include "phy.h"
33 #include "trx.h"
34 #include "led.h"
35 #include "dm.h"
36 #include "phy.h"
37
38 static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
39 {
40 __le16 fc = rtl_get_fc(skb);
41
42 if (unlikely(ieee80211_is_beacon(fc)))
43 return QSLT_BEACON;
44 if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))
45 return QSLT_MGNT;
46
47 return skb->priority;
48 }
49
50 static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
51 struct rtl_stats *pstatus, u8 *pdesc,
52 struct rx_fwinfo_88e *p_drvinfo,
53 bool bpacket_match_bssid,
54 bool bpacket_toself, bool packet_beacon)
55 {
56 struct rtl_priv *rtlpriv = rtl_priv(hw);
57 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
58 struct phy_sts_cck_8192s_t *cck_buf;
59 struct phy_status_rpt *phystrpt =
60 (struct phy_status_rpt *)p_drvinfo;
61 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
62 char rx_pwr_all = 0, rx_pwr[4];
63 u8 rf_rx_num = 0, evm, pwdb_all;
64 u8 i, max_spatial_stream;
65 u32 rssi, total_rssi = 0;
66 bool is_cck = pstatus->is_cck;
67 u8 lan_idx, vga_idx;
68
69 /* Record it for next packet processing */
70 pstatus->packet_matchbssid = bpacket_match_bssid;
71 pstatus->packet_toself = bpacket_toself;
72 pstatus->packet_beacon = packet_beacon;
73 pstatus->rx_mimo_signalquality[0] = -1;
74 pstatus->rx_mimo_signalquality[1] = -1;
75
76 if (is_cck) {
77 u8 cck_highpwr;
78 u8 cck_agc_rpt;
79 /* CCK Driver info Structure is not the same as OFDM packet. */
80 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo;
81 cck_agc_rpt = cck_buf->cck_agc_rpt;
82
83 /* (1)Hardware does not provide RSSI for CCK
84 * (2)PWDB, Average PWDB cacluated by
85 * hardware (for rate adaptive)
86 */
87 if (ppsc->rfpwr_state == ERFON)
88 cck_highpwr =
89 (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2,
90 BIT(9));
91 else
92 cck_highpwr = false;
93
94 lan_idx = ((cck_agc_rpt & 0xE0) >> 5);
95 vga_idx = (cck_agc_rpt & 0x1f);
96 switch (lan_idx) {
97 case 7:
98 if (vga_idx <= 27)
99 /*VGA_idx = 27~2*/
100 rx_pwr_all = -100 + 2*(27-vga_idx);
101 else
102 rx_pwr_all = -100;
103 break;
104 case 6:
105 /*VGA_idx = 2~0*/
106 rx_pwr_all = -48 + 2*(2-vga_idx);
107 break;
108 case 5:
109 /*VGA_idx = 7~5*/
110 rx_pwr_all = -42 + 2*(7-vga_idx);
111 break;
112 case 4:
113 /*VGA_idx = 7~4*/
114 rx_pwr_all = -36 + 2*(7-vga_idx);
115 break;
116 case 3:
117 /*VGA_idx = 7~0*/
118 rx_pwr_all = -24 + 2*(7-vga_idx);
119 break;
120 case 2:
121 if (cck_highpwr)
122 /*VGA_idx = 5~0*/
123 rx_pwr_all = -12 + 2*(5-vga_idx);
124 else
125 rx_pwr_all = -6 + 2*(5-vga_idx);
126 break;
127 case 1:
128 rx_pwr_all = 8-2*vga_idx;
129 break;
130 case 0:
131 rx_pwr_all = 14-2*vga_idx;
132 break;
133 default:
134 break;
135 }
136 rx_pwr_all += 6;
137 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
138 /* CCK gain is smaller than OFDM/MCS gain, */
139 /* so we add gain diff by experiences, the val is 6 */
140 pwdb_all += 6;
141 if (pwdb_all > 100)
142 pwdb_all = 100;
143 /* modify the offset to make the same
144 * gain index with OFDM.
145 */
146 if (pwdb_all > 34 && pwdb_all <= 42)
147 pwdb_all -= 2;
148 else if (pwdb_all > 26 && pwdb_all <= 34)
149 pwdb_all -= 6;
150 else if (pwdb_all > 14 && pwdb_all <= 26)
151 pwdb_all -= 8;
152 else if (pwdb_all > 4 && pwdb_all <= 14)
153 pwdb_all -= 4;
154 if (!cck_highpwr) {
155 if (pwdb_all >= 80)
156 pwdb_all = ((pwdb_all-80)<<1) +
157 ((pwdb_all-80)>>1) + 80;
158 else if ((pwdb_all <= 78) && (pwdb_all >= 20))
159 pwdb_all += 3;
160 if (pwdb_all > 100)
161 pwdb_all = 100;
162 }
163
164 pstatus->rx_pwdb_all = pwdb_all;
165 pstatus->recvsignalpower = rx_pwr_all;
166
167 /* (3) Get Signal Quality (EVM) */
168 if (bpacket_match_bssid) {
169 u8 sq;
170
171 if (pstatus->rx_pwdb_all > 40)
172 sq = 100;
173 else {
174 sq = cck_buf->sq_rpt;
175 if (sq > 64)
176 sq = 0;
177 else if (sq < 20)
178 sq = 100;
179 else
180 sq = ((64 - sq) * 100) / 44;
181 }
182
183 pstatus->signalquality = sq;
184 pstatus->rx_mimo_signalquality[0] = sq;
185 pstatus->rx_mimo_signalquality[1] = -1;
186 }
187 } else {
188 rtlpriv->dm.rfpath_rxenable[0] =
189 rtlpriv->dm.rfpath_rxenable[1] = true;
190
191 /* (1)Get RSSI for HT rate */
192 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
193 /* we will judge RF RX path now. */
194 if (rtlpriv->dm.rfpath_rxenable[i])
195 rf_rx_num++;
196
197 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] &
198 0x3f) * 2) - 110;
199
200 /* Translate DBM to percentage. */
201 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
202 total_rssi += rssi;
203
204 /* Get Rx snr value in DB */
205 rtlpriv->stats.rx_snr_db[i] =
206 (long)(p_drvinfo->rxsnr[i] / 2);
207
208 /* Record Signal Strength for next packet */
209 if (bpacket_match_bssid)
210 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
211 }
212
213 /* (2)PWDB, Average PWDB cacluated by
214 * hardware (for rate adaptive)
215 */
216 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110;
217
218 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
219 pstatus->rx_pwdb_all = pwdb_all;
220 pstatus->rxpower = rx_pwr_all;
221 pstatus->recvsignalpower = rx_pwr_all;
222
223 /* (3)EVM of HT rate */
224 if (pstatus->is_ht && pstatus->rate >= DESC92C_RATEMCS8 &&
225 pstatus->rate <= DESC92C_RATEMCS15)
226 max_spatial_stream = 2;
227 else
228 max_spatial_stream = 1;
229
230 for (i = 0; i < max_spatial_stream; i++) {
231 evm = rtl_evm_db_to_percentage(p_drvinfo->rxevm[i]);
232
233 if (bpacket_match_bssid) {
234 /* Fill value in RFD, Get the first
235 * spatial stream onlyi
236 */
237 if (i == 0)
238 pstatus->signalquality =
239 (u8)(evm & 0xff);
240 pstatus->rx_mimo_signalquality[i] =
241 (u8)(evm & 0xff);
242 }
243 }
244 }
245
246 /* UI BSS List signal strength(in percentage),
247 * make it good looking, from 0~100.
248 */
249 if (is_cck)
250 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
251 pwdb_all));
252 else if (rf_rx_num != 0)
253 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
254 total_rssi /= rf_rx_num));
255 /*HW antenna diversity*/
256 rtldm->fat_table.antsel_rx_keep_0 = phystrpt->ant_sel;
257 rtldm->fat_table.antsel_rx_keep_1 = phystrpt->ant_sel_b;
258 rtldm->fat_table.antsel_rx_keep_2 = phystrpt->antsel_rx_keep_2;
259 }
260
261 static void _rtl88ee_smart_antenna(struct ieee80211_hw *hw,
262 struct rtl_stats *pstatus)
263 {
264 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
265 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
266 u8 antsel_tr_mux;
267 struct fast_ant_training *pfat_table = &rtldm->fat_table;
268
269 if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV) {
270 if (pfat_table->fat_state == FAT_TRAINING_STATE) {
271 if (pstatus->packet_toself) {
272 antsel_tr_mux =
273 (pfat_table->antsel_rx_keep_2 << 2) |
274 (pfat_table->antsel_rx_keep_1 << 1) |
275 pfat_table->antsel_rx_keep_0;
276 pfat_table->ant_sum[antsel_tr_mux] +=
277 pstatus->rx_pwdb_all;
278 pfat_table->ant_cnt[antsel_tr_mux]++;
279 }
280 }
281 } else if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
282 (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)) {
283 if (pstatus->packet_toself || pstatus->packet_matchbssid) {
284 antsel_tr_mux = (pfat_table->antsel_rx_keep_2 << 2) |
285 (pfat_table->antsel_rx_keep_1 << 1) |
286 pfat_table->antsel_rx_keep_0;
287 rtl88e_dm_ant_sel_statistics(hw, antsel_tr_mux, 0,
288 pstatus->rx_pwdb_all);
289 }
290
291 }
292 }
293
294 static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
295 struct sk_buff *skb,
296 struct rtl_stats *pstatus,
297 u8 *pdesc,
298 struct rx_fwinfo_88e *p_drvinfo)
299 {
300 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
301 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
302 struct ieee80211_hdr *hdr;
303 u8 *tmp_buf;
304 u8 *praddr;
305 u8 *psaddr;
306 __le16 fc;
307 bool packet_matchbssid, packet_toself, packet_beacon;
308
309 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
310
311 hdr = (struct ieee80211_hdr *)tmp_buf;
312 fc = hdr->frame_control;
313 praddr = hdr->addr1;
314 psaddr = ieee80211_get_SA(hdr);
315 memcpy(pstatus->psaddr, psaddr, ETH_ALEN);
316
317 packet_matchbssid = ((!ieee80211_is_ctl(fc)) &&
318 (ether_addr_equal(mac->bssid, ieee80211_has_tods(fc) ?
319 hdr->addr1 : ieee80211_has_fromds(fc) ?
320 hdr->addr2 : hdr->addr3)) &&
321 (!pstatus->hwerror) &&
322 (!pstatus->crc) && (!pstatus->icv));
323
324 packet_toself = packet_matchbssid &&
325 (ether_addr_equal(praddr, rtlefuse->dev_addr));
326
327 if (ieee80211_is_beacon(hdr->frame_control))
328 packet_beacon = true;
329 else
330 packet_beacon = false;
331
332 _rtl88ee_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
333 packet_matchbssid, packet_toself,
334 packet_beacon);
335 _rtl88ee_smart_antenna(hw, pstatus);
336 rtl_process_phyinfo(hw, tmp_buf, pstatus);
337 }
338
339 static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
340 u8 *virtualaddress)
341 {
342 u32 dwtmp = 0;
343 memset(virtualaddress, 0, 8);
344
345 SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num);
346 if (ptcb_desc->empkt_num == 1) {
347 dwtmp = ptcb_desc->empkt_len[0];
348 } else {
349 dwtmp = ptcb_desc->empkt_len[0];
350 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
351 dwtmp += ptcb_desc->empkt_len[1];
352 }
353 SET_EARLYMODE_LEN0(virtualaddress, dwtmp);
354
355 if (ptcb_desc->empkt_num <= 3) {
356 dwtmp = ptcb_desc->empkt_len[2];
357 } else {
358 dwtmp = ptcb_desc->empkt_len[2];
359 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
360 dwtmp += ptcb_desc->empkt_len[3];
361 }
362 SET_EARLYMODE_LEN1(virtualaddress, dwtmp);
363 if (ptcb_desc->empkt_num <= 5) {
364 dwtmp = ptcb_desc->empkt_len[4];
365 } else {
366 dwtmp = ptcb_desc->empkt_len[4];
367 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
368 dwtmp += ptcb_desc->empkt_len[5];
369 }
370 SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF);
371 SET_EARLYMODE_LEN2_2(virtualaddress, dwtmp >> 4);
372 if (ptcb_desc->empkt_num <= 7) {
373 dwtmp = ptcb_desc->empkt_len[6];
374 } else {
375 dwtmp = ptcb_desc->empkt_len[6];
376 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
377 dwtmp += ptcb_desc->empkt_len[7];
378 }
379 SET_EARLYMODE_LEN3(virtualaddress, dwtmp);
380 if (ptcb_desc->empkt_num <= 9) {
381 dwtmp = ptcb_desc->empkt_len[8];
382 } else {
383 dwtmp = ptcb_desc->empkt_len[8];
384 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
385 dwtmp += ptcb_desc->empkt_len[9];
386 }
387 SET_EARLYMODE_LEN4(virtualaddress, dwtmp);
388 }
389
390 bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
391 struct rtl_stats *status,
392 struct ieee80211_rx_status *rx_status,
393 u8 *pdesc, struct sk_buff *skb)
394 {
395 struct rtl_priv *rtlpriv = rtl_priv(hw);
396 struct rx_fwinfo_88e *p_drvinfo;
397 struct ieee80211_hdr *hdr;
398
399 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
400 status->packet_report_type = (u8)GET_RX_STATUS_DESC_RPT_SEL(pdesc);
401 if (status->packet_report_type == TX_REPORT2)
402 status->length = (u16)GET_RX_RPT2_DESC_PKT_LEN(pdesc);
403 else
404 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
405 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
406 RX_DRV_INFO_SIZE_UNIT;
407 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
408 status->icv = (u16)GET_RX_DESC_ICV(pdesc);
409 status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
410 status->hwerror = (status->crc | status->icv);
411 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
412 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
413 status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
414 status->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1);
415 status->isfirst_ampdu = (bool)((GET_RX_DESC_PAGGR(pdesc) == 1) &&
416 (GET_RX_DESC_FAGGR(pdesc) == 1));
417 if (status->packet_report_type == NORMAL_RX)
418 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
419 status->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
420 status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
421
422 status->is_cck = RTL8188_RX_HAL_IS_CCK_RATE(status->rate);
423
424 status->macid = GET_RX_DESC_MACID(pdesc);
425 if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
426 status->wake_match = BIT(2);
427 else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
428 status->wake_match = BIT(1);
429 else if (GET_RX_STATUS_DESC_UNICAST_MATCH(pdesc))
430 status->wake_match = BIT(0);
431 else
432 status->wake_match = 0;
433 if (status->wake_match)
434 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
435 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n",
436 status->wake_match);
437 rx_status->freq = hw->conf.chandef.chan->center_freq;
438 rx_status->band = hw->conf.chandef.chan->band;
439
440 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
441 + status->rx_bufshift);
442
443 if (status->crc)
444 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
445
446 if (status->rx_is40Mhzpacket)
447 rx_status->flag |= RX_FLAG_40MHZ;
448
449 if (status->is_ht)
450 rx_status->flag |= RX_FLAG_HT;
451
452 rx_status->flag |= RX_FLAG_MACTIME_START;
453
454 /* hw will set status->decrypted true, if it finds the
455 * frame is open data frame or mgmt frame.
456 * So hw will not decryption robust managment frame
457 * for IEEE80211w but still set status->decrypted
458 * true, so here we should set it back to undecrypted
459 * for IEEE80211w frame, and mac80211 sw will help
460 * to decrypt it
461 */
462 if (status->decrypted) {
463 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
464 (ieee80211_has_protected(hdr->frame_control)))
465 rx_status->flag |= RX_FLAG_DECRYPTED;
466 else
467 rx_status->flag &= ~RX_FLAG_DECRYPTED;
468 }
469
470 /* rate_idx: index of data rate into band's
471 * supported rates or MCS index if HT rates
472 * are use (RX_FLAG_HT)
473 * Notice: this is diff with windows define
474 */
475 rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
476 false, status->rate);
477
478 rx_status->mactime = status->timestamp_low;
479 if (phystatus == true) {
480 p_drvinfo = (struct rx_fwinfo_88e *)(skb->data +
481 status->rx_bufshift);
482
483 _rtl88ee_translate_rx_signal_stuff(hw,
484 skb, status, pdesc,
485 p_drvinfo);
486 }
487 rx_status->signal = status->recvsignalpower + 10;
488 if (status->packet_report_type == TX_REPORT2) {
489 status->macid_valid_entry[0] =
490 GET_RX_RPT2_DESC_MACID_VALID_1(pdesc);
491 status->macid_valid_entry[1] =
492 GET_RX_RPT2_DESC_MACID_VALID_2(pdesc);
493 }
494 return true;
495 }
496
497 void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
498 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
499 u8 *txbd, struct ieee80211_tx_info *info,
500 struct ieee80211_sta *sta,
501 struct sk_buff *skb,
502 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
503
504 {
505 struct rtl_priv *rtlpriv = rtl_priv(hw);
506 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
507 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
508 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
509 u8 *pdesc = (u8 *)pdesc_tx;
510 u16 seq_number;
511 __le16 fc = hdr->frame_control;
512 unsigned int buf_len = 0;
513 unsigned int skb_len = skb->len;
514 u8 fw_qsel = _rtl88ee_map_hwqueue_to_fwqueue(skb, hw_queue);
515 bool firstseg = ((hdr->seq_ctrl &
516 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
517 bool lastseg = ((hdr->frame_control &
518 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
519 dma_addr_t mapping;
520 u8 bw_40 = 0;
521 u8 short_gi = 0;
522
523 if (mac->opmode == NL80211_IFTYPE_STATION) {
524 bw_40 = mac->bw_40;
525 } else if (mac->opmode == NL80211_IFTYPE_AP ||
526 mac->opmode == NL80211_IFTYPE_ADHOC) {
527 if (sta)
528 bw_40 = sta->ht_cap.cap &
529 IEEE80211_HT_CAP_SUP_WIDTH_20_40;
530 }
531 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
532 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
533 /* reserve 8 byte for AMPDU early mode */
534 if (rtlhal->earlymode_enable) {
535 skb_push(skb, EM_HDR_LEN);
536 memset(skb->data, 0, EM_HDR_LEN);
537 }
538 buf_len = skb->len;
539 mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
540 PCI_DMA_TODEVICE);
541 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
542 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
543 "DMA mapping error");
544 return;
545 }
546 CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_88e));
547 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
548 firstseg = true;
549 lastseg = true;
550 }
551 if (firstseg) {
552 if (rtlhal->earlymode_enable) {
553 SET_TX_DESC_PKT_OFFSET(pdesc, 1);
554 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN +
555 EM_HDR_LEN);
556 if (ptcb_desc->empkt_num) {
557 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
558 "Insert 8 byte.pTcb->EMPktNum:%d\n",
559 ptcb_desc->empkt_num);
560 _rtl88ee_insert_emcontent(ptcb_desc,
561 (u8 *)(skb->data));
562 }
563 } else {
564 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
565 }
566
567 ptcb_desc->use_driver_rate = true;
568 SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
569 if (ptcb_desc->hw_rate > DESC92C_RATEMCS0)
570 short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
571 else
572 short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
573
574 SET_TX_DESC_DATA_SHORTGI(pdesc, short_gi);
575
576 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
577 SET_TX_DESC_AGG_ENABLE(pdesc, 1);
578 SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x14);
579 }
580 SET_TX_DESC_SEQ(pdesc, seq_number);
581 SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable &&
582 !ptcb_desc->cts_enable) ? 1 : 0));
583 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0);
584 SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
585 SET_TX_DESC_RTS_STBC(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0));
586
587 SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
588 SET_TX_DESC_RTS_BW(pdesc, 0);
589 SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
590 SET_TX_DESC_RTS_SHORT(pdesc,
591 ((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
592 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
593 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
594
595 if (ptcb_desc->tx_enable_sw_calc_duration)
596 SET_TX_DESC_NAV_USE_HDR(pdesc, 1);
597
598 if (bw_40) {
599 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
600 SET_TX_DESC_DATA_BW(pdesc, 1);
601 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
602 } else {
603 SET_TX_DESC_DATA_BW(pdesc, 0);
604 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
605 mac->cur_40_prime_sc);
606 }
607 } else {
608 SET_TX_DESC_DATA_BW(pdesc, 0);
609 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 0);
610 }
611
612 SET_TX_DESC_LINIP(pdesc, 0);
613 SET_TX_DESC_PKT_SIZE(pdesc, (u16)skb_len);
614 if (sta) {
615 u8 ampdu_density = sta->ht_cap.ampdu_density;
616 SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
617 }
618 if (info->control.hw_key) {
619 struct ieee80211_key_conf *keyconf;
620
621 keyconf = info->control.hw_key;
622 switch (keyconf->cipher) {
623 case WLAN_CIPHER_SUITE_WEP40:
624 case WLAN_CIPHER_SUITE_WEP104:
625 case WLAN_CIPHER_SUITE_TKIP:
626 SET_TX_DESC_SEC_TYPE(pdesc, 0x1);
627 break;
628 case WLAN_CIPHER_SUITE_CCMP:
629 SET_TX_DESC_SEC_TYPE(pdesc, 0x3);
630 break;
631 default:
632 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
633 break;
634
635 }
636 }
637
638 SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel);
639 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
640 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
641 SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ?
642 1 : 0);
643 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
644
645 /*SET_TX_DESC_PWR_STATUS(pdesc, pwr_status);*/
646 /* Set TxRate and RTSRate in TxDesc */
647 /* This prevent Tx initial rate of new-coming packets */
648 /* from being overwritten by retried packet rate.*/
649 if (!ptcb_desc->use_driver_rate) {
650 /*SET_TX_DESC_RTS_RATE(pdesc, 0x08); */
651 /* SET_TX_DESC_TX_RATE(pdesc, 0x0b); */
652 }
653 if (ieee80211_is_data_qos(fc)) {
654 if (mac->rdg_en) {
655 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
656 "Enable RDG function.\n");
657 SET_TX_DESC_RDG_ENABLE(pdesc, 1);
658 SET_TX_DESC_HTC(pdesc, 1);
659 }
660 }
661 }
662
663 SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
664 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
665 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)buf_len);
666 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
667 if (rtlpriv->dm.useramask) {
668 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
669 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
670 } else {
671 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
672 SET_TX_DESC_MACID(pdesc, ptcb_desc->ratr_index);
673 }
674 if (ieee80211_is_data_qos(fc))
675 SET_TX_DESC_QOS(pdesc, 1);
676
677 if (!ieee80211_is_data_qos(fc))
678 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
679 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
680 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
681 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
682 SET_TX_DESC_BMC(pdesc, 1);
683 }
684
685 rtl88e_dm_set_tx_ant_by_tx_info(hw, pdesc, ptcb_desc->mac_id);
686 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
687 }
688
689 void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw,
690 u8 *pdesc, bool firstseg,
691 bool lastseg, struct sk_buff *skb)
692 {
693 struct rtl_priv *rtlpriv = rtl_priv(hw);
694 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
695 u8 fw_queue = QSLT_BEACON;
696
697 dma_addr_t mapping = pci_map_single(rtlpci->pdev,
698 skb->data, skb->len,
699 PCI_DMA_TODEVICE);
700
701 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
702 __le16 fc = hdr->frame_control;
703
704 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
705 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
706 "DMA mapping error");
707 return;
708 }
709 CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
710
711 if (firstseg)
712 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
713
714 SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M);
715
716 SET_TX_DESC_SEQ(pdesc, 0);
717
718 SET_TX_DESC_LINIP(pdesc, 0);
719
720 SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
721
722 SET_TX_DESC_FIRST_SEG(pdesc, 1);
723 SET_TX_DESC_LAST_SEG(pdesc, 1);
724
725 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)(skb->len));
726
727 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
728
729 SET_TX_DESC_RATE_ID(pdesc, 7);
730 SET_TX_DESC_MACID(pdesc, 0);
731
732 SET_TX_DESC_OWN(pdesc, 1);
733
734 SET_TX_DESC_PKT_SIZE(pdesc, (u16)(skb->len));
735
736 SET_TX_DESC_FIRST_SEG(pdesc, 1);
737 SET_TX_DESC_LAST_SEG(pdesc, 1);
738
739 SET_TX_DESC_OFFSET(pdesc, 0x20);
740
741 SET_TX_DESC_USE_RATE(pdesc, 1);
742
743 if (!ieee80211_is_data_qos(fc))
744 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
745
746 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
747 "H2C Tx Cmd Content\n",
748 pdesc, TX_DESC_SIZE);
749 }
750
751 void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
752 bool istx, u8 desc_name, u8 *val)
753 {
754 if (istx == true) {
755 switch (desc_name) {
756 case HW_DESC_OWN:
757 SET_TX_DESC_OWN(pdesc, 1);
758 break;
759 case HW_DESC_TX_NEXTDESC_ADDR:
760 SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val);
761 break;
762 default:
763 RT_ASSERT(false, "ERR txdesc :%d not process\n",
764 desc_name);
765 break;
766 }
767 } else {
768 switch (desc_name) {
769 case HW_DESC_RXOWN:
770 SET_RX_DESC_OWN(pdesc, 1);
771 break;
772 case HW_DESC_RXBUFF_ADDR:
773 SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *)val);
774 break;
775 case HW_DESC_RXPKT_LEN:
776 SET_RX_DESC_PKT_LEN(pdesc, *(u32 *)val);
777 break;
778 case HW_DESC_RXERO:
779 SET_RX_DESC_EOR(pdesc, 1);
780 break;
781 default:
782 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
783 desc_name);
784 break;
785 }
786 }
787 }
788
789 u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
790 {
791 u32 ret = 0;
792
793 if (istx == true) {
794 switch (desc_name) {
795 case HW_DESC_OWN:
796 ret = GET_TX_DESC_OWN(pdesc);
797 break;
798 case HW_DESC_TXBUFF_ADDR:
799 ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc);
800 break;
801 default:
802 RT_ASSERT(false, "ERR txdesc :%d not process\n",
803 desc_name);
804 break;
805 }
806 } else {
807 switch (desc_name) {
808 case HW_DESC_OWN:
809 ret = GET_RX_DESC_OWN(pdesc);
810 break;
811 case HW_DESC_RXPKT_LEN:
812 ret = GET_RX_DESC_PKT_LEN(pdesc);
813 break;
814 case HW_DESC_RXBUFF_ADDR:
815 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
816 break;
817 default:
818 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
819 desc_name);
820 break;
821 }
822 }
823 return ret;
824 }
825
826 bool rtl88ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue, u16 index)
827 {
828 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
829 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
830 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
831 u8 own = (u8)rtl88ee_get_desc(entry, true, HW_DESC_OWN);
832
833 /*beacon packet will only use the first
834 *descriptor defautly,and the own may not
835 *be cleared by the hardware
836 */
837 if (own)
838 return false;
839 return true;
840 }
841
842 void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
843 {
844 struct rtl_priv *rtlpriv = rtl_priv(hw);
845 if (hw_queue == BEACON_QUEUE) {
846 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
847 } else {
848 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
849 BIT(0) << (hw_queue));
850 }
851 }
852
853 u32 rtl88ee_rx_command_packet(struct ieee80211_hw *hw,
854 struct rtl_stats status,
855 struct sk_buff *skb)
856 {
857 return 0;
858 } 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2012 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #ifndef __RTL_WIFI_H__
27 #define __RTL_WIFI_H__
28
29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30
31 #include <linux/sched.h>
32 #include <linux/firmware.h>
33 #include <linux/etherdevice.h>
34 #include <linux/vmalloc.h>
35 #include <linux/usb.h>
36 #include <net/mac80211.h>
37 #include <linux/completion.h>
38 #include "debug.h"
39
40 #define MASKBYTE0 0xff
41 #define MASKBYTE1 0xff00
42 #define MASKBYTE2 0xff0000
43 #define MASKBYTE3 0xff000000
44 #define MASKHWORD 0xffff0000
45 #define MASKLWORD 0x0000ffff
46 #define MASKDWORD 0xffffffff
47 #define MASK12BITS 0xfff
48 #define MASKH4BITS 0xf0000000
49 #define MASKOFDM_D 0xffc00000
50 #define MASKCCK 0x3f3f3f3f
51
52 #define MASK4BITS 0x0f
53 #define MASK20BITS 0xfffff
54 #define RFREG_OFFSET_MASK 0xfffff
55
56 #define MASKBYTE0 0xff
57 #define MASKBYTE1 0xff00
58 #define MASKBYTE2 0xff0000
59 #define MASKBYTE3 0xff000000
60 #define MASKHWORD 0xffff0000
61 #define MASKLWORD 0x0000ffff
62 #define MASKDWORD 0xffffffff
63 #define MASK12BITS 0xfff
64 #define MASKH4BITS 0xf0000000
65 #define MASKOFDM_D 0xffc00000
66 #define MASKCCK 0x3f3f3f3f
67
68 #define MASK4BITS 0x0f
69 #define MASK20BITS 0xfffff
70 #define RFREG_OFFSET_MASK 0xfffff
71
72 #define RF_CHANGE_BY_INIT 0
73 #define RF_CHANGE_BY_IPS BIT(28)
74 #define RF_CHANGE_BY_PS BIT(29)
75 #define RF_CHANGE_BY_HW BIT(30)
76 #define RF_CHANGE_BY_SW BIT(31)
77
78 #define IQK_ADDA_REG_NUM 16
79 #define IQK_MAC_REG_NUM 4
80 #define IQK_THRESHOLD 8
81
82 #define MAX_KEY_LEN 61
83 #define KEY_BUF_SIZE 5
84
85 /* QoS related. */
86 /*aci: 0x00 Best Effort*/
87 /*aci: 0x01 Background*/
88 /*aci: 0x10 Video*/
89 /*aci: 0x11 Voice*/
90 /*Max: define total number.*/
91 #define AC0_BE 0
92 #define AC1_BK 1
93 #define AC2_VI 2
94 #define AC3_VO 3
95 #define AC_MAX 4
96 #define QOS_QUEUE_NUM 4
97 #define RTL_MAC80211_NUM_QUEUE 5
98 #define REALTEK_USB_VENQT_MAX_BUF_SIZE 254
99 #define RTL_USB_MAX_RX_COUNT 100
100 #define QBSS_LOAD_SIZE 5
101 #define MAX_WMMELE_LENGTH 64
102
103 #define TOTAL_CAM_ENTRY 32
104
105 /*slot time for 11g. */
106 #define RTL_SLOT_TIME_9 9
107 #define RTL_SLOT_TIME_20 20
108
109 /*related to tcp/ip. */
110 #define SNAP_SIZE 6
111 #define PROTOC_TYPE_SIZE 2
112
113 /*related with 802.11 frame*/
114 #define MAC80211_3ADDR_LEN 24
115 #define MAC80211_4ADDR_LEN 30
116
117 #define CHANNEL_MAX_NUMBER (14 + 24 + 21) /* 14 is the max channel no */
118 #define CHANNEL_MAX_NUMBER_2G 14
119 #define CHANNEL_MAX_NUMBER_5G 54 /* Please refer to
120 *"phy_GetChnlGroup8812A" and
121 * "Hal_ReadTxPowerInfo8812A"
122 */
123 #define CHANNEL_MAX_NUMBER_5G_80M 7
124 #define CHANNEL_GROUP_MAX (3 + 9) /* ch1~3, 4~9, 10~14 = three groups */
125 #define CHANNEL_MAX_NUMBER_5G 54 /* Please refer to
126 *"phy_GetChnlGroup8812A" and
127 * "Hal_ReadTxPowerInfo8812A"
128 */
129 #define CHANNEL_MAX_NUMBER_5G_80M 7
130 #define MAX_PG_GROUP 13
131 #define CHANNEL_GROUP_MAX_2G 3
132 #define CHANNEL_GROUP_IDX_5GL 3
133 #define CHANNEL_GROUP_IDX_5GM 6
134 #define CHANNEL_GROUP_IDX_5GH 9
135 #define CHANNEL_GROUP_MAX_5G 9
136 #define CHANNEL_MAX_NUMBER_2G 14
137 #define AVG_THERMAL_NUM 8
138 #define AVG_THERMAL_NUM_88E 4
139 #define AVG_THERMAL_NUM_8723BE 4
140 #define MAX_TID_COUNT 9
141
142 /* for early mode */
143 #define FCS_LEN 4
144 #define EM_HDR_LEN 8
145
146 enum rtl8192c_h2c_cmd {
147 H2C_AP_OFFLOAD = 0,
148 H2C_SETPWRMODE = 1,
149 H2C_JOINBSSRPT = 2,
150 H2C_RSVDPAGE = 3,
151 H2C_RSSI_REPORT = 5,
152 H2C_RA_MASK = 6,
153 H2C_MACID_PS_MODE = 7,
154 H2C_P2P_PS_OFFLOAD = 8,
155 H2C_MAC_MODE_SEL = 9,
156 H2C_PWRM = 15,
157 H2C_P2P_PS_CTW_CMD = 24,
158 MAX_H2CCMD
159 };
160
161 #define MAX_TX_COUNT 4
162 #define MAX_REGULATION_NUM 4
163 #define MAX_RF_PATH_NUM 4
164 #define MAX_RATE_SECTION_NUM 6
165 #define MAX_2_4G_BANDWITH_NUM 4
166 #define MAX_5G_BANDWITH_NUM 4
167 #define MAX_RF_PATH 4
168 #define MAX_CHNL_GROUP_24G 6
169 #define MAX_CHNL_GROUP_5G 14
170
171 #define TX_PWR_BY_RATE_NUM_BAND 2
172 #define TX_PWR_BY_RATE_NUM_RF 4
173 #define TX_PWR_BY_RATE_NUM_SECTION 12
174 #define MAX_BASE_NUM_IN_PHY_REG_PG_24G 6
175 #define MAX_BASE_NUM_IN_PHY_REG_PG_5G 5
176
177 #define RTL8192EE_SEG_NUM 1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
178
179 #define DEL_SW_IDX_SZ 30
180 #define BAND_NUM 3
181
182 /* For now, it's just for 8192ee
183 * but not OK yet, keep it 0
184 */
185 #define DMA_IS_64BIT 0
186 #define RTL8192EE_SEG_NUM 1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
187
188 enum rf_tx_num {
189 RF_1TX = 0,
190 RF_2TX,
191 RF_MAX_TX_NUM,
192 RF_TX_NUM_NONIMPLEMENT,
193 };
194
195 #define PACKET_NORMAL 0
196 #define PACKET_DHCP 1
197 #define PACKET_ARP 2
198 #define PACKET_EAPOL 3
199
200 #define MAX_SUPPORT_WOL_PATTERN_NUM 16
201 #define RSVD_WOL_PATTERN_NUM 1
202 #define WKFMCAM_ADDR_NUM 6
203 #define WKFMCAM_SIZE 24
204
205 #define MAX_WOL_BIT_MASK_SIZE 16
206 /* MIN LEN keeps 13 here */
207 #define MIN_WOL_PATTERN_SIZE 13
208 #define MAX_WOL_PATTERN_SIZE 128
209
210 #define WAKE_ON_MAGIC_PACKET BIT(0)
211 #define WAKE_ON_PATTERN_MATCH BIT(1)
212
213 #define WOL_REASON_PTK_UPDATE BIT(0)
214 #define WOL_REASON_GTK_UPDATE BIT(1)
215 #define WOL_REASON_DISASSOC BIT(2)
216 #define WOL_REASON_DEAUTH BIT(3)
217 #define WOL_REASON_AP_LOST BIT(4)
218 #define WOL_REASON_MAGIC_PKT BIT(5)
219 #define WOL_REASON_UNICAST_PKT BIT(6)
220 #define WOL_REASON_PATTERN_PKT BIT(7)
221 #define WOL_REASON_RTD3_SSID_MATCH BIT(8)
222 #define WOL_REASON_REALWOW_V2_WAKEUPPKT BIT(9)
223 #define WOL_REASON_REALWOW_V2_ACKLOST BIT(10)
224
225 struct rtlwifi_firmware_header {
226 __le16 signature;
227 u8 category;
228 u8 function;
229 __le16 version;
230 u8 subversion;
231 u8 rsvd1;
232 u8 month;
233 u8 date;
234 u8 hour;
235 u8 minute;
236 __le16 ramcodeSize;
237 __le16 rsvd2;
238 __le32 svnindex;
239 __le32 rsvd3;
240 __le32 rsvd4;
241 __le32 rsvd5;
242 };
243
244 struct txpower_info_2g {
245 u8 index_cck_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
246 u8 index_bw40_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
247 /*If only one tx, only BW20 and OFDM are used.*/
248 u8 cck_diff[MAX_RF_PATH][MAX_TX_COUNT];
249 u8 ofdm_diff[MAX_RF_PATH][MAX_TX_COUNT];
250 u8 bw20_diff[MAX_RF_PATH][MAX_TX_COUNT];
251 u8 bw40_diff[MAX_RF_PATH][MAX_TX_COUNT];
252 u8 bw80_diff[MAX_RF_PATH][MAX_TX_COUNT];
253 u8 bw160_diff[MAX_RF_PATH][MAX_TX_COUNT];
254 };
255
256 struct txpower_info_5g {
257 u8 index_bw40_base[MAX_RF_PATH][MAX_CHNL_GROUP_5G];
258 /*If only one tx, only BW20, OFDM, BW80 and BW160 are used.*/
259 u8 ofdm_diff[MAX_RF_PATH][MAX_TX_COUNT];
260 u8 bw20_diff[MAX_RF_PATH][MAX_TX_COUNT];
261 u8 bw40_diff[MAX_RF_PATH][MAX_TX_COUNT];
262 u8 bw80_diff[MAX_RF_PATH][MAX_TX_COUNT];
263 u8 bw160_diff[MAX_RF_PATH][MAX_TX_COUNT];
264 };
265
266 enum rate_section {
267 CCK = 0,
268 OFDM,
269 HT_MCS0_MCS7,
270 HT_MCS8_MCS15,
271 VHT_1SSMCS0_1SSMCS9,
272 VHT_2SSMCS0_2SSMCS9,
273 };
274
275 enum intf_type {
276 INTF_PCI = 0,
277 INTF_USB = 1,
278 };
279
280 enum radio_path {
281 RF90_PATH_A = 0,
282 RF90_PATH_B = 1,
283 RF90_PATH_C = 2,
284 RF90_PATH_D = 3,
285 };
286
287 enum regulation_txpwr_lmt {
288 TXPWR_LMT_FCC = 0,
289 TXPWR_LMT_MKK = 1,
290 TXPWR_LMT_ETSI = 2,
291 TXPWR_LMT_WW = 3,
292
293 TXPWR_LMT_MAX_REGULATION_NUM = 4
294 };
295
296 enum rt_eeprom_type {
297 EEPROM_93C46,
298 EEPROM_93C56,
299 EEPROM_BOOT_EFUSE,
300 };
301
302 enum ttl_status {
303 RTL_STATUS_INTERFACE_START = 0,
304 };
305
306 enum hardware_type {
307 HARDWARE_TYPE_RTL8192E,
308 HARDWARE_TYPE_RTL8192U,
309 HARDWARE_TYPE_RTL8192SE,
310 HARDWARE_TYPE_RTL8192SU,
311 HARDWARE_TYPE_RTL8192CE,
312 HARDWARE_TYPE_RTL8192CU,
313 HARDWARE_TYPE_RTL8192DE,
314 HARDWARE_TYPE_RTL8192DU,
315 HARDWARE_TYPE_RTL8723AE,
316 HARDWARE_TYPE_RTL8723U,
317 HARDWARE_TYPE_RTL8188EE,
318 HARDWARE_TYPE_RTL8723BE,
319 HARDWARE_TYPE_RTL8192EE,
320 HARDWARE_TYPE_RTL8821AE,
321 HARDWARE_TYPE_RTL8812AE,
322
323 /* keep it last */
324 HARDWARE_TYPE_NUM
325 };
326
327 #define IS_HARDWARE_TYPE_8192SU(rtlhal) \
328 (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SU)
329 #define IS_HARDWARE_TYPE_8192SE(rtlhal) \
330 (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE)
331 #define IS_HARDWARE_TYPE_8192CE(rtlhal) \
332 (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CE)
333 #define IS_HARDWARE_TYPE_8192CU(rtlhal) \
334 (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CU)
335 #define IS_HARDWARE_TYPE_8192DE(rtlhal) \
336 (rtlhal->hw_type == HARDWARE_TYPE_RTL8192DE)
337 #define IS_HARDWARE_TYPE_8192DU(rtlhal) \
338 (rtlhal->hw_type == HARDWARE_TYPE_RTL8192DU)
339 #define IS_HARDWARE_TYPE_8723E(rtlhal) \
340 (rtlhal->hw_type == HARDWARE_TYPE_RTL8723E)
341 #define IS_HARDWARE_TYPE_8723U(rtlhal) \
342 (rtlhal->hw_type == HARDWARE_TYPE_RTL8723U)
343 #define IS_HARDWARE_TYPE_8192S(rtlhal) \
344 (IS_HARDWARE_TYPE_8192SE(rtlhal) || IS_HARDWARE_TYPE_8192SU(rtlhal))
345 #define IS_HARDWARE_TYPE_8192C(rtlhal) \
346 (IS_HARDWARE_TYPE_8192CE(rtlhal) || IS_HARDWARE_TYPE_8192CU(rtlhal))
347 #define IS_HARDWARE_TYPE_8192D(rtlhal) \
348 (IS_HARDWARE_TYPE_8192DE(rtlhal) || IS_HARDWARE_TYPE_8192DU(rtlhal))
349 #define IS_HARDWARE_TYPE_8723(rtlhal) \
350 (IS_HARDWARE_TYPE_8723E(rtlhal) || IS_HARDWARE_TYPE_8723U(rtlhal))
351
352 #define RX_HAL_IS_CCK_RATE(rxmcs) \
353 ((rxmcs) == DESC_RATE1M || \
354 (rxmcs) == DESC_RATE2M || \
355 (rxmcs) == DESC_RATE5_5M || \
356 (rxmcs) == DESC_RATE11M)
357
358 enum scan_operation_backup_opt {
359 SCAN_OPT_BACKUP = 0,
360 SCAN_OPT_BACKUP_BAND0 = 0,
361 SCAN_OPT_BACKUP_BAND1,
362 SCAN_OPT_RESTORE,
363 SCAN_OPT_MAX
364 };
365
366 /*RF state.*/
367 enum rf_pwrstate {
368 ERFON,
369 ERFSLEEP,
370 ERFOFF
371 };
372
373 struct bb_reg_def {
374 u32 rfintfs;
375 u32 rfintfi;
376 u32 rfintfo;
377 u32 rfintfe;
378 u32 rf3wire_offset;
379 u32 rflssi_select;
380 u32 rftxgain_stage;
381 u32 rfhssi_para1;
382 u32 rfhssi_para2;
383 u32 rfsw_ctrl;
384 u32 rfagc_control1;
385 u32 rfagc_control2;
386 u32 rfrxiq_imbal;
387 u32 rfrx_afe;
388 u32 rftxiq_imbal;
389 u32 rftx_afe;
390 u32 rf_rb; /* rflssi_readback */
391 u32 rf_rbpi; /* rflssi_readbackpi */
392 };
393
394 enum io_type {
395 IO_CMD_PAUSE_DM_BY_SCAN = 0,
396 IO_CMD_PAUSE_BAND0_DM_BY_SCAN = 0,
397 IO_CMD_PAUSE_BAND1_DM_BY_SCAN = 1,
398 IO_CMD_RESUME_DM_BY_SCAN = 2,
399 };
400
401 enum hw_variables {
402 HW_VAR_ETHER_ADDR,
403 HW_VAR_MULTICAST_REG,
404 HW_VAR_BASIC_RATE,
405 HW_VAR_BSSID,
406 HW_VAR_MEDIA_STATUS,
407 HW_VAR_SECURITY_CONF,
408 HW_VAR_BEACON_INTERVAL,
409 HW_VAR_ATIM_WINDOW,
410 HW_VAR_LISTEN_INTERVAL,
411 HW_VAR_CS_COUNTER,
412 HW_VAR_DEFAULTKEY0,
413 HW_VAR_DEFAULTKEY1,
414 HW_VAR_DEFAULTKEY2,
415 HW_VAR_DEFAULTKEY3,
416 HW_VAR_SIFS,
417 HW_VAR_R2T_SIFS,
418 HW_VAR_DIFS,
419 HW_VAR_EIFS,
420 HW_VAR_SLOT_TIME,
421 HW_VAR_ACK_PREAMBLE,
422 HW_VAR_CW_CONFIG,
423 HW_VAR_CW_VALUES,
424 HW_VAR_RATE_FALLBACK_CONTROL,
425 HW_VAR_CONTENTION_WINDOW,
426 HW_VAR_RETRY_COUNT,
427 HW_VAR_TR_SWITCH,
428 HW_VAR_COMMAND,
429 HW_VAR_WPA_CONFIG,
430 HW_VAR_AMPDU_MIN_SPACE,
431 HW_VAR_SHORTGI_DENSITY,
432 HW_VAR_AMPDU_FACTOR,
433 HW_VAR_MCS_RATE_AVAILABLE,
434 HW_VAR_AC_PARAM,
435 HW_VAR_ACM_CTRL,
436 HW_VAR_DIS_Req_Qsize,
437 HW_VAR_CCX_CHNL_LOAD,
438 HW_VAR_CCX_NOISE_HISTOGRAM,
439 HW_VAR_CCX_CLM_NHM,
440 HW_VAR_TxOPLimit,
441 HW_VAR_TURBO_MODE,
442 HW_VAR_RF_STATE,
443 HW_VAR_RF_OFF_BY_HW,
444 HW_VAR_BUS_SPEED,
445 HW_VAR_SET_DEV_POWER,
446
447 HW_VAR_RCR,
448 HW_VAR_RATR_0,
449 HW_VAR_RRSR,
450 HW_VAR_CPU_RST,
451 HW_VAR_CHECK_BSSID,
452 HW_VAR_LBK_MODE,
453 HW_VAR_AES_11N_FIX,
454 HW_VAR_USB_RX_AGGR,
455 HW_VAR_USER_CONTROL_TURBO_MODE,
456 HW_VAR_RETRY_LIMIT,
457 HW_VAR_INIT_TX_RATE,
458 HW_VAR_TX_RATE_REG,
459 HW_VAR_EFUSE_USAGE,
460 HW_VAR_EFUSE_BYTES,
461 HW_VAR_AUTOLOAD_STATUS,
462 HW_VAR_RF_2R_DISABLE,
463 HW_VAR_SET_RPWM,
464 HW_VAR_H2C_FW_PWRMODE,
465 HW_VAR_H2C_FW_JOINBSSRPT,
466 HW_VAR_H2C_FW_MEDIASTATUSRPT,
467 HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
468 HW_VAR_FW_PSMODE_STATUS,
469 HW_VAR_INIT_RTS_RATE,
470 HW_VAR_RESUME_CLK_ON,
471 HW_VAR_FW_LPS_ACTION,
472 HW_VAR_1X1_RECV_COMBINE,
473 HW_VAR_STOP_SEND_BEACON,
474 HW_VAR_TSF_TIMER,
475 HW_VAR_IO_CMD,
476
477 HW_VAR_RF_RECOVERY,
478 HW_VAR_H2C_FW_UPDATE_GTK,
479 HW_VAR_WF_MASK,
480 HW_VAR_WF_CRC,
481 HW_VAR_WF_IS_MAC_ADDR,
482 HW_VAR_H2C_FW_OFFLOAD,
483 HW_VAR_RESET_WFCRC,
484
485 HW_VAR_HANDLE_FW_C2H,
486 HW_VAR_DL_FW_RSVD_PAGE,
487 HW_VAR_AID,
488 HW_VAR_HW_SEQ_ENABLE,
489 HW_VAR_CORRECT_TSF,
490 HW_VAR_BCN_VALID,
491 HW_VAR_FWLPS_RF_ON,
492 HW_VAR_DUAL_TSF_RST,
493 HW_VAR_SWITCH_EPHY_WoWLAN,
494 HW_VAR_INT_MIGRATION,
495 HW_VAR_INT_AC,
496 HW_VAR_RF_TIMING,
497
498 HAL_DEF_WOWLAN,
499 HW_VAR_MRC,
500 HW_VAR_KEEP_ALIVE,
501 HW_VAR_NAV_UPPER,
502
503 HW_VAR_MGT_FILTER,
504 HW_VAR_CTRL_FILTER,
505 HW_VAR_DATA_FILTER,
506 };
507
508 enum rt_media_status {
509 RT_MEDIA_DISCONNECT = 0,
510 RT_MEDIA_CONNECT = 1
511 };
512
513 enum rt_oem_id {
514 RT_CID_DEFAULT = 0,
515 RT_CID_8187_ALPHA0 = 1,
516 RT_CID_8187_SERCOMM_PS = 2,
517 RT_CID_8187_HW_LED = 3,
518 RT_CID_8187_NETGEAR = 4,
519 RT_CID_WHQL = 5,
520 RT_CID_819X_CAMEO = 6,
521 RT_CID_819X_RUNTOP = 7,
522 RT_CID_819X_SENAO = 8,
523 RT_CID_TOSHIBA = 9,
524 RT_CID_819X_NETCORE = 10,
525 RT_CID_NETTRONIX = 11,
526 RT_CID_DLINK = 12,
527 RT_CID_PRONET = 13,
528 RT_CID_COREGA = 14,
529 RT_CID_819X_ALPHA = 15,
530 RT_CID_819X_SITECOM = 16,
531 RT_CID_CCX = 17,
532 RT_CID_819X_LENOVO = 18,
533 RT_CID_819X_QMI = 19,
534 RT_CID_819X_EDIMAX_BELKIN = 20,
535 RT_CID_819X_SERCOMM_BELKIN = 21,
536 RT_CID_819X_CAMEO1 = 22,
537 RT_CID_819X_MSI = 23,
538 RT_CID_819X_ACER = 24,
539 RT_CID_819X_HP = 27,
540 RT_CID_819X_CLEVO = 28,
541 RT_CID_819X_ARCADYAN_BELKIN = 29,
542 RT_CID_819X_SAMSUNG = 30,
543 RT_CID_819X_WNC_COREGA = 31,
544 RT_CID_819X_FOXCOON = 32,
545 RT_CID_819X_DELL = 33,
546 RT_CID_819X_PRONETS = 34,
547 RT_CID_819X_EDIMAX_ASUS = 35,
548 RT_CID_NETGEAR = 36,
549 RT_CID_PLANEX = 37,
550 RT_CID_CC_C = 38,
551 };
552
553 enum hw_descs {
554 HW_DESC_OWN,
555 HW_DESC_RXOWN,
556 HW_DESC_TX_NEXTDESC_ADDR,
557 HW_DESC_TXBUFF_ADDR,
558 HW_DESC_RXBUFF_ADDR,
559 HW_DESC_RXPKT_LEN,
560 HW_DESC_RXERO,
561 HW_DESC_RX_PREPARE,
562 };
563
564 enum prime_sc {
565 PRIME_CHNL_OFFSET_DONT_CARE = 0,
566 PRIME_CHNL_OFFSET_LOWER = 1,
567 PRIME_CHNL_OFFSET_UPPER = 2,
568 };
569
570 enum rf_type {
571 RF_1T1R = 0,
572 RF_1T2R = 1,
573 RF_2T2R = 2,
574 RF_2T2R_GREEN = 3,
575 };
576
577 enum ht_channel_width {
578 HT_CHANNEL_WIDTH_20 = 0,
579 HT_CHANNEL_WIDTH_20_40 = 1,
580 HT_CHANNEL_WIDTH_80 = 2,
581 };
582
583 /* Ref: 802.11i sepc D10.0 7.3.2.25.1
584 Cipher Suites Encryption Algorithms */
585 enum rt_enc_alg {
586 NO_ENCRYPTION = 0,
587 WEP40_ENCRYPTION = 1,
588 TKIP_ENCRYPTION = 2,
589 RSERVED_ENCRYPTION = 3,
590 AESCCMP_ENCRYPTION = 4,
591 WEP104_ENCRYPTION = 5,
592 AESCMAC_ENCRYPTION = 6, /*IEEE802.11w */
593 };
594
595 enum rtl_hal_state {
596 _HAL_STATE_STOP = 0,
597 _HAL_STATE_START = 1,
598 };
599
600 enum rtl_desc92_rate {
601 DESC_RATE1M = 0x00,
602 DESC_RATE2M = 0x01,
603 DESC_RATE5_5M = 0x02,
604 DESC_RATE11M = 0x03,
605
606 DESC_RATE6M = 0x04,
607 DESC_RATE9M = 0x05,
608 DESC_RATE12M = 0x06,
609 DESC_RATE18M = 0x07,
610 DESC_RATE24M = 0x08,
611 DESC_RATE36M = 0x09,
612 DESC_RATE48M = 0x0a,
613 DESC_RATE54M = 0x0b,
614
615 DESC_RATEMCS0 = 0x0c,
616 DESC_RATEMCS1 = 0x0d,
617 DESC_RATEMCS2 = 0x0e,
618 DESC_RATEMCS3 = 0x0f,
619 DESC_RATEMCS4 = 0x10,
620 DESC_RATEMCS5 = 0x11,
621 DESC_RATEMCS6 = 0x12,
622 DESC_RATEMCS7 = 0x13,
623 DESC_RATEMCS8 = 0x14,
624 DESC_RATEMCS9 = 0x15,
625 DESC_RATEMCS10 = 0x16,
626 DESC_RATEMCS11 = 0x17,
627 DESC_RATEMCS12 = 0x18,
628 DESC_RATEMCS13 = 0x19,
629 DESC_RATEMCS14 = 0x1a,
630 DESC_RATEMCS15 = 0x1b,
631 DESC_RATEMCS15_SG = 0x1c,
632 DESC_RATEMCS32 = 0x20,
633
634 DESC_RATEVHT1SS_MCS0 = 0x2c,
635 DESC_RATEVHT1SS_MCS1 = 0x2d,
636 DESC_RATEVHT1SS_MCS2 = 0x2e,
637 DESC_RATEVHT1SS_MCS3 = 0x2f,
638 DESC_RATEVHT1SS_MCS4 = 0x30,
639 DESC_RATEVHT1SS_MCS5 = 0x31,
640 DESC_RATEVHT1SS_MCS6 = 0x32,
641 DESC_RATEVHT1SS_MCS7 = 0x33,
642 DESC_RATEVHT1SS_MCS8 = 0x34,
643 DESC_RATEVHT1SS_MCS9 = 0x35,
644 DESC_RATEVHT2SS_MCS0 = 0x36,
645 DESC_RATEVHT2SS_MCS1 = 0x37,
646 DESC_RATEVHT2SS_MCS2 = 0x38,
647 DESC_RATEVHT2SS_MCS3 = 0x39,
648 DESC_RATEVHT2SS_MCS4 = 0x3a,
649 DESC_RATEVHT2SS_MCS5 = 0x3b,
650 DESC_RATEVHT2SS_MCS6 = 0x3c,
651 DESC_RATEVHT2SS_MCS7 = 0x3d,
652 DESC_RATEVHT2SS_MCS8 = 0x3e,
653 DESC_RATEVHT2SS_MCS9 = 0x3f,
654 };
655
656 enum rtl_var_map {
657 /*reg map */
658 SYS_ISO_CTRL = 0,
659 SYS_FUNC_EN,
660 SYS_CLK,
661 MAC_RCR_AM,
662 MAC_RCR_AB,
663 MAC_RCR_ACRC32,
664 MAC_RCR_ACF,
665 MAC_RCR_AAP,
666 MAC_HIMR,
667 MAC_HIMRE,
668 MAC_HSISR,
669
670 /*efuse map */
671 EFUSE_TEST,
672 EFUSE_CTRL,
673 EFUSE_CLK,
674 EFUSE_CLK_CTRL,
675 EFUSE_PWC_EV12V,
676 EFUSE_FEN_ELDR,
677 EFUSE_LOADER_CLK_EN,
678 EFUSE_ANA8M,
679 EFUSE_HWSET_MAX_SIZE,
680 EFUSE_MAX_SECTION_MAP,
681 EFUSE_REAL_CONTENT_SIZE,
682 EFUSE_OOB_PROTECT_BYTES_LEN,
683 EFUSE_ACCESS,
684
685 /*CAM map */
686 RWCAM,
687 WCAMI,
688 RCAMO,
689 CAMDBG,
690 SECR,
691 SEC_CAM_NONE,
692 SEC_CAM_WEP40,
693 SEC_CAM_TKIP,
694 SEC_CAM_AES,
695 SEC_CAM_WEP104,
696
697 /*IMR map */
698 RTL_IMR_BCNDMAINT6, /*Beacon DMA Interrupt 6 */
699 RTL_IMR_BCNDMAINT5, /*Beacon DMA Interrupt 5 */
700 RTL_IMR_BCNDMAINT4, /*Beacon DMA Interrupt 4 */
701 RTL_IMR_BCNDMAINT3, /*Beacon DMA Interrupt 3 */
702 RTL_IMR_BCNDMAINT2, /*Beacon DMA Interrupt 2 */
703 RTL_IMR_BCNDMAINT1, /*Beacon DMA Interrupt 1 */
704 RTL_IMR_BCNDOK8, /*Beacon Queue DMA OK Interrup 8 */
705 RTL_IMR_BCNDOK7, /*Beacon Queue DMA OK Interrup 7 */
706 RTL_IMR_BCNDOK6, /*Beacon Queue DMA OK Interrup 6 */
707 RTL_IMR_BCNDOK5, /*Beacon Queue DMA OK Interrup 5 */
708 RTL_IMR_BCNDOK4, /*Beacon Queue DMA OK Interrup 4 */
709 RTL_IMR_BCNDOK3, /*Beacon Queue DMA OK Interrup 3 */
710 RTL_IMR_BCNDOK2, /*Beacon Queue DMA OK Interrup 2 */
711 RTL_IMR_BCNDOK1, /*Beacon Queue DMA OK Interrup 1 */
712 RTL_IMR_TIMEOUT2, /*Timeout interrupt 2 */
713 RTL_IMR_TIMEOUT1, /*Timeout interrupt 1 */
714 RTL_IMR_TXFOVW, /*Transmit FIFO Overflow */
715 RTL_IMR_PSTIMEOUT, /*Power save time out interrupt */
716 RTL_IMR_BCNINT, /*Beacon DMA Interrupt 0 */
717 RTL_IMR_RXFOVW, /*Receive FIFO Overflow */
718 RTL_IMR_RDU, /*Receive Descriptor Unavailable */
719 RTL_IMR_ATIMEND, /*For 92C,ATIM Window End Interrupt */
720 RTL_IMR_BDOK, /*Beacon Queue DMA OK Interrup */
721 RTL_IMR_HIGHDOK, /*High Queue DMA OK Interrupt */
722 RTL_IMR_COMDOK, /*Command Queue DMA OK Interrupt*/
723 RTL_IMR_TBDOK, /*Transmit Beacon OK interrup */
724 RTL_IMR_MGNTDOK, /*Management Queue DMA OK Interrupt */
725 RTL_IMR_TBDER, /*For 92C,Transmit Beacon Error Interrupt */
726 RTL_IMR_BKDOK, /*AC_BK DMA OK Interrupt */
727 RTL_IMR_BEDOK, /*AC_BE DMA OK Interrupt */
728 RTL_IMR_VIDOK, /*AC_VI DMA OK Interrupt */
729 RTL_IMR_VODOK, /*AC_VO DMA Interrupt */
730 RTL_IMR_ROK, /*Receive DMA OK Interrupt */
731 RTL_IMR_HSISR_IND, /*HSISR Interrupt*/
732 RTL_IBSS_INT_MASKS, /*(RTL_IMR_BCNINT | RTL_IMR_TBDOK |
733 * RTL_IMR_TBDER) */
734 RTL_IMR_C2HCMD, /*fw interrupt*/
735
736 /*CCK Rates, TxHT = 0 */
737 RTL_RC_CCK_RATE1M,
738 RTL_RC_CCK_RATE2M,
739 RTL_RC_CCK_RATE5_5M,
740 RTL_RC_CCK_RATE11M,
741
742 /*OFDM Rates, TxHT = 0 */
743 RTL_RC_OFDM_RATE6M,
744 RTL_RC_OFDM_RATE9M,
745 RTL_RC_OFDM_RATE12M,
746 RTL_RC_OFDM_RATE18M,
747 RTL_RC_OFDM_RATE24M,
748 RTL_RC_OFDM_RATE36M,
749 RTL_RC_OFDM_RATE48M,
750 RTL_RC_OFDM_RATE54M,
751
752 RTL_RC_HT_RATEMCS7,
753 RTL_RC_HT_RATEMCS15,
754
755 RTL_RC_VHT_RATE_1SS_MCS7,
756 RTL_RC_VHT_RATE_1SS_MCS8,
757 RTL_RC_VHT_RATE_1SS_MCS9,
758 RTL_RC_VHT_RATE_2SS_MCS7,
759 RTL_RC_VHT_RATE_2SS_MCS8,
760 RTL_RC_VHT_RATE_2SS_MCS9,
761
762 /*keep it last */
763 RTL_VAR_MAP_MAX,
764 };
765
766 /*Firmware PS mode for control LPS.*/
767 enum _fw_ps_mode {
768 FW_PS_ACTIVE_MODE = 0,
769 FW_PS_MIN_MODE = 1,
770 FW_PS_MAX_MODE = 2,
771 FW_PS_DTIM_MODE = 3,
772 FW_PS_VOIP_MODE = 4,
773 FW_PS_UAPSD_WMM_MODE = 5,
774 FW_PS_UAPSD_MODE = 6,
775 FW_PS_IBSS_MODE = 7,
776 FW_PS_WWLAN_MODE = 8,
777 FW_PS_PM_Radio_Off = 9,
778 FW_PS_PM_Card_Disable = 10,
779 };
780
781 enum rt_psmode {
782 EACTIVE, /*Active/Continuous access. */
783 EMAXPS, /*Max power save mode. */
784 EFASTPS, /*Fast power save mode. */
785 EAUTOPS, /*Auto power save mode. */
786 };
787
788 /*LED related.*/
789 enum led_ctl_mode {
790 LED_CTL_POWER_ON = 1,
791 LED_CTL_LINK = 2,
792 LED_CTL_NO_LINK = 3,
793 LED_CTL_TX = 4,
794 LED_CTL_RX = 5,
795 LED_CTL_SITE_SURVEY = 6,
796 LED_CTL_POWER_OFF = 7,
797 LED_CTL_START_TO_LINK = 8,
798 LED_CTL_START_WPS = 9,
799 LED_CTL_STOP_WPS = 10,
800 };
801
802 enum rtl_led_pin {
803 LED_PIN_GPIO0,
804 LED_PIN_LED0,
805 LED_PIN_LED1,
806 LED_PIN_LED2
807 };
808
809 /*QoS related.*/
810 /*acm implementation method.*/
811 enum acm_method {
812 eAcmWay0_SwAndHw = 0,
813 eAcmWay1_HW = 1,
814 EACMWAY2_SW = 2,
815 };
816
817 enum macphy_mode {
818 SINGLEMAC_SINGLEPHY = 0,
819 DUALMAC_DUALPHY,
820 DUALMAC_SINGLEPHY,
821 };
822
823 enum band_type {
824 BAND_ON_2_4G = 0,
825 BAND_ON_5G,
826 BAND_ON_BOTH,
827 BANDMAX
828 };
829
830 /*aci/aifsn Field.
831 Ref: WMM spec 2.2.2: WME Parameter Element, p.12.*/
832 union aci_aifsn {
833 u8 char_data;
834
835 struct {
836 u8 aifsn:4;
837 u8 acm:1;
838 u8 aci:2;
839 u8 reserved:1;
840 } f; /* Field */
841 };
842
843 /*mlme related.*/
844 enum wireless_mode {
845 WIRELESS_MODE_UNKNOWN = 0x00,
846 WIRELESS_MODE_A = 0x01,
847 WIRELESS_MODE_B = 0x02,
848 WIRELESS_MODE_G = 0x04,
849 WIRELESS_MODE_AUTO = 0x08,
850 WIRELESS_MODE_N_24G = 0x10,
851 WIRELESS_MODE_N_5G = 0x20,
852 WIRELESS_MODE_AC_5G = 0x40,
853 WIRELESS_MODE_AC_24G = 0x80,
854 WIRELESS_MODE_AC_ONLY = 0x100,
855 WIRELESS_MODE_MAX = 0x800
856 };
857
858 #define IS_WIRELESS_MODE_A(wirelessmode) \
859 (wirelessmode == WIRELESS_MODE_A)
860 #define IS_WIRELESS_MODE_B(wirelessmode) \
861 (wirelessmode == WIRELESS_MODE_B)
862 #define IS_WIRELESS_MODE_G(wirelessmode) \
863 (wirelessmode == WIRELESS_MODE_G)
864 #define IS_WIRELESS_MODE_N_24G(wirelessmode) \
865 (wirelessmode == WIRELESS_MODE_N_24G)
866 #define IS_WIRELESS_MODE_N_5G(wirelessmode) \
867 (wirelessmode == WIRELESS_MODE_N_5G)
868
869 enum ratr_table_mode {
870 RATR_INX_WIRELESS_NGB = 0,
871 RATR_INX_WIRELESS_NG = 1,
872 RATR_INX_WIRELESS_NB = 2,
873 RATR_INX_WIRELESS_N = 3,
874 RATR_INX_WIRELESS_GB = 4,
875 RATR_INX_WIRELESS_G = 5,
876 RATR_INX_WIRELESS_B = 6,
877 RATR_INX_WIRELESS_MC = 7,
878 RATR_INX_WIRELESS_A = 8,
879 RATR_INX_WIRELESS_AC_5N = 8,
880 RATR_INX_WIRELESS_AC_24N = 9,
881 };
882
883 enum rtl_link_state {
884 MAC80211_NOLINK = 0,
885 MAC80211_LINKING = 1,
886 MAC80211_LINKED = 2,
887 MAC80211_LINKED_SCANNING = 3,
888 };
889
890 enum act_category {
891 ACT_CAT_QOS = 1,
892 ACT_CAT_DLS = 2,
893 ACT_CAT_BA = 3,
894 ACT_CAT_HT = 7,
895 ACT_CAT_WMM = 17,
896 };
897
898 enum ba_action {
899 ACT_ADDBAREQ = 0,
900 ACT_ADDBARSP = 1,
901 ACT_DELBA = 2,
902 };
903
904 enum rt_polarity_ctl {
905 RT_POLARITY_LOW_ACT = 0,
906 RT_POLARITY_HIGH_ACT = 1,
907 };
908
909 /* After 8188E, we use V2 reason define. 88C/8723A use V1 reason. */
910 enum fw_wow_reason_v2 {
911 FW_WOW_V2_PTK_UPDATE_EVENT = 0x01,
912 FW_WOW_V2_GTK_UPDATE_EVENT = 0x02,
913 FW_WOW_V2_DISASSOC_EVENT = 0x04,
914 FW_WOW_V2_DEAUTH_EVENT = 0x08,
915 FW_WOW_V2_FW_DISCONNECT_EVENT = 0x10,
916 FW_WOW_V2_MAGIC_PKT_EVENT = 0x21,
917 FW_WOW_V2_UNICAST_PKT_EVENT = 0x22,
918 FW_WOW_V2_PATTERN_PKT_EVENT = 0x23,
919 FW_WOW_V2_RTD3_SSID_MATCH_EVENT = 0x24,
920 FW_WOW_V2_REALWOW_V2_WAKEUPPKT = 0x30,
921 FW_WOW_V2_REALWOW_V2_ACKLOST = 0x31,
922 FW_WOW_V2_REASON_MAX = 0xff,
923 };
924
925 enum wolpattern_type {
926 UNICAST_PATTERN = 0,
927 MULTICAST_PATTERN = 1,
928 BROADCAST_PATTERN = 2,
929 DONT_CARE_DA = 3,
930 UNKNOWN_TYPE = 4,
931 };
932
933 struct octet_string {
934 u8 *octet;
935 u16 length;
936 };
937
938 struct rtl_hdr_3addr {
939 __le16 frame_ctl;
940 __le16 duration_id;
941 u8 addr1[ETH_ALEN];
942 u8 addr2[ETH_ALEN];
943 u8 addr3[ETH_ALEN];
944 __le16 seq_ctl;
945 u8 payload[0];
946 } __packed;
947
948 struct rtl_info_element {
949 u8 id;
950 u8 len;
951 u8 data[0];
952 } __packed;
953
954 struct rtl_probe_rsp {
955 struct rtl_hdr_3addr header;
956 u32 time_stamp[2];
957 __le16 beacon_interval;
958 __le16 capability;
959 /*SSID, supported rates, FH params, DS params,
960 CF params, IBSS params, TIM (if beacon), RSN */
961 struct rtl_info_element info_element[0];
962 } __packed;
963
964 /*LED related.*/
965 /*ledpin Identify how to implement this SW led.*/
966 struct rtl_led {
967 void *hw;
968 enum rtl_led_pin ledpin;
969 bool ledon;
970 };
971
972 struct rtl_led_ctl {
973 bool led_opendrain;
974 struct rtl_led sw_led0;
975 struct rtl_led sw_led1;
976 };
977
978 struct rtl_qos_parameters {
979 __le16 cw_min;
980 __le16 cw_max;
981 u8 aifs;
982 u8 flag;
983 __le16 tx_op;
984 } __packed;
985
986 struct rt_smooth_data {
987 u32 elements[100]; /*array to store values */
988 u32 index; /*index to current array to store */
989 u32 total_num; /*num of valid elements */
990 u32 total_val; /*sum of valid elements */
991 };
992
993 struct false_alarm_statistics {
994 u32 cnt_parity_fail;
995 u32 cnt_rate_illegal;
996 u32 cnt_crc8_fail;
997 u32 cnt_mcs_fail;
998 u32 cnt_fast_fsync_fail;
999 u32 cnt_sb_search_fail;
1000 u32 cnt_ofdm_fail;
1001 u32 cnt_cck_fail;
1002 u32 cnt_all;
1003 u32 cnt_ofdm_cca;
1004 u32 cnt_cck_cca;
1005 u32 cnt_cca_all;
1006 u32 cnt_bw_usc;
1007 u32 cnt_bw_lsc;
1008 };
1009
1010 struct init_gain {
1011 u8 xaagccore1;
1012 u8 xbagccore1;
1013 u8 xcagccore1;
1014 u8 xdagccore1;
1015 u8 cca;
1016
1017 };
1018
1019 struct wireless_stats {
1020 unsigned long txbytesunicast;
1021 unsigned long txbytesmulticast;
1022 unsigned long txbytesbroadcast;
1023 unsigned long rxbytesunicast;
1024
1025 long rx_snr_db[4];
1026 /*Correct smoothed ss in Dbm, only used
1027 in driver to report real power now. */
1028 long recv_signal_power;
1029 long signal_quality;
1030 long last_sigstrength_inpercent;
1031
1032 u32 rssi_calculate_cnt;
1033 u32 pwdb_all_cnt;
1034
1035 /*Transformed, in dbm. Beautified signal
1036 strength for UI, not correct. */
1037 long signal_strength;
1038
1039 u8 rx_rssi_percentage[4];
1040 u8 rx_evm_dbm[4];
1041 u8 rx_evm_percentage[2];
1042
1043 u16 rx_cfo_short[4];
1044 u16 rx_cfo_tail[4];
1045
1046 struct rt_smooth_data ui_rssi;
1047 struct rt_smooth_data ui_link_quality;
1048 };
1049
1050 struct rate_adaptive {
1051 u8 rate_adaptive_disabled;
1052 u8 ratr_state;
1053 u16 reserve;
1054
1055 u32 high_rssi_thresh_for_ra;
1056 u32 high2low_rssi_thresh_for_ra;
1057 u8 low2high_rssi_thresh_for_ra40m;
1058 u32 low_rssi_thresh_for_ra40m;
1059 u8 low2high_rssi_thresh_for_ra20m;
1060 u32 low_rssi_thresh_for_ra20m;
1061 u32 upper_rssi_threshold_ratr;
1062 u32 middleupper_rssi_threshold_ratr;
1063 u32 middle_rssi_threshold_ratr;
1064 u32 middlelow_rssi_threshold_ratr;
1065 u32 low_rssi_threshold_ratr;
1066 u32 ultralow_rssi_threshold_ratr;
1067 u32 low_rssi_threshold_ratr_40m;
1068 u32 low_rssi_threshold_ratr_20m;
1069 u8 ping_rssi_enable;
1070 u32 ping_rssi_ratr;
1071 u32 ping_rssi_thresh_for_ra;
1072 u32 last_ratr;
1073 u8 pre_ratr_state;
1074 u8 ldpc_thres;
1075 bool use_ldpc;
1076 bool lower_rts_rate;
1077 bool is_special_data;
1078 };
1079
1080 struct regd_pair_mapping {
1081 u16 reg_dmnenum;
1082 u16 reg_5ghz_ctl;
1083 u16 reg_2ghz_ctl;
1084 };
1085
1086 struct dynamic_primary_cca {
1087 u8 pricca_flag;
1088 u8 intf_flag;
1089 u8 intf_type;
1090 u8 dup_rts_flag;
1091 u8 monitor_flag;
1092 u8 ch_offset;
1093 u8 mf_state;
1094 };
1095
1096 struct rtl_regulatory {
1097 char alpha2[2];
1098 u16 country_code;
1099 u16 max_power_level;
1100 u32 tp_scale;
1101 u16 current_rd;
1102 u16 current_rd_ext;
1103 int16_t power_limit;
1104 struct regd_pair_mapping *regpair;
1105 };
1106
1107 struct rtl_rfkill {
1108 bool rfkill_state; /*0 is off, 1 is on */
1109 };
1110
1111 /*for P2P PS**/
1112 #define P2P_MAX_NOA_NUM 2
1113
1114 enum p2p_role {
1115 P2P_ROLE_DISABLE = 0,
1116 P2P_ROLE_DEVICE = 1,
1117 P2P_ROLE_CLIENT = 2,
1118 P2P_ROLE_GO = 3
1119 };
1120
1121 enum p2p_ps_state {
1122 P2P_PS_DISABLE = 0,
1123 P2P_PS_ENABLE = 1,
1124 P2P_PS_SCAN = 2,
1125 P2P_PS_SCAN_DONE = 3,
1126 P2P_PS_ALLSTASLEEP = 4, /* for P2P GO */
1127 };
1128
1129 enum p2p_ps_mode {
1130 P2P_PS_NONE = 0,
1131 P2P_PS_CTWINDOW = 1,
1132 P2P_PS_NOA = 2,
1133 P2P_PS_MIX = 3, /* CTWindow and NoA */
1134 };
1135
1136 struct rtl_p2p_ps_info {
1137 enum p2p_ps_mode p2p_ps_mode; /* indicate p2p ps mode */
1138 enum p2p_ps_state p2p_ps_state; /* indicate p2p ps state */
1139 u8 noa_index; /* Identifies instance of Notice of Absence timing. */
1140 /* Client traffic window. A period of time in TU after TBTT. */
1141 u8 ctwindow;
1142 u8 opp_ps; /* opportunistic power save. */
1143 u8 noa_num; /* number of NoA descriptor in P2P IE. */
1144 /* Count for owner, Type of client. */
1145 u8 noa_count_type[P2P_MAX_NOA_NUM];
1146 /* Max duration for owner, preferred or min acceptable duration
1147 * for client.
1148 */
1149 u32 noa_duration[P2P_MAX_NOA_NUM];
1150 /* Length of interval for owner, preferred or max acceptable intervali
1151 * of client.
1152 */
1153 u32 noa_interval[P2P_MAX_NOA_NUM];
1154 /* schedule in terms of the lower 4 bytes of the TSF timer. */
1155 u32 noa_start_time[P2P_MAX_NOA_NUM];
1156 };
1157
1158 struct p2p_ps_offload_t {
1159 u8 offload_en:1;
1160 u8 role:1; /* 1: Owner, 0: Client */
1161 u8 ctwindow_en:1;
1162 u8 noa0_en:1;
1163 u8 noa1_en:1;
1164 u8 allstasleep:1;
1165 u8 discovery:1;
1166 u8 reserved:1;
1167 };
1168
1169 #define IQK_MATRIX_REG_NUM 8
1170 #define IQK_MATRIX_SETTINGS_NUM (1 + 24 + 21)
1171
1172 struct iqk_matrix_regs {
1173 bool iqk_done;
1174 long value[1][IQK_MATRIX_REG_NUM];
1175 };
1176
1177 struct phy_parameters {
1178 u16 length;
1179 u32 *pdata;
1180 };
1181
1182 enum hw_param_tab_index {
1183 PHY_REG_2T,
1184 PHY_REG_1T,
1185 PHY_REG_PG,
1186 RADIOA_2T,
1187 RADIOB_2T,
1188 RADIOA_1T,
1189 RADIOB_1T,
1190 MAC_REG,
1191 AGCTAB_2T,
1192 AGCTAB_1T,
1193 MAX_TAB
1194 };
1195
1196 struct rtl_phy {
1197 struct bb_reg_def phyreg_def[4]; /*Radio A/B/C/D */
1198 struct init_gain initgain_backup;
1199 enum io_type current_io_type;
1200
1201 u8 rf_mode;
1202 u8 rf_type;
1203 u8 current_chan_bw;
1204 u8 set_bwmode_inprogress;
1205 u8 sw_chnl_inprogress;
1206 u8 sw_chnl_stage;
1207 u8 sw_chnl_step;
1208 u8 current_channel;
1209 u8 h2c_box_num;
1210 u8 set_io_inprogress;
1211 u8 lck_inprogress;
1212
1213 /* record for power tracking */
1214 s32 reg_e94;
1215 s32 reg_e9c;
1216 s32 reg_ea4;
1217 s32 reg_eac;
1218 s32 reg_eb4;
1219 s32 reg_ebc;
1220 s32 reg_ec4;
1221 s32 reg_ecc;
1222 u8 rfpienable;
1223 u8 reserve_0;
1224 u16 reserve_1;
1225 u32 reg_c04, reg_c08, reg_874;
1226 u32 adda_backup[16];
1227 u32 iqk_mac_backup[IQK_MAC_REG_NUM];
1228 u32 iqk_bb_backup[10];
1229 bool iqk_initialized;
1230
1231 bool rfpath_rx_enable[MAX_RF_PATH];
1232 u8 reg_837;
1233 /* Dual mac */
1234 bool need_iqk;
1235 struct iqk_matrix_regs iqk_matrix[IQK_MATRIX_SETTINGS_NUM];
1236
1237 bool rfpi_enable;
1238 bool iqk_in_progress;
1239
1240 u8 pwrgroup_cnt;
1241 u8 cck_high_power;
1242 /* this is for 88E & 8723A */
1243 u32 mcs_txpwrlevel_origoffset[MAX_PG_GROUP][16];
1244 /* MAX_PG_GROUP groups of pwr diff by rates */
1245 u32 mcs_offset[MAX_PG_GROUP][16];
1246 u32 tx_power_by_rate_offset[TX_PWR_BY_RATE_NUM_BAND]
1247 [TX_PWR_BY_RATE_NUM_RF]
1248 [TX_PWR_BY_RATE_NUM_RF]
1249 [TX_PWR_BY_RATE_NUM_SECTION];
1250 u8 txpwr_by_rate_base_24g[TX_PWR_BY_RATE_NUM_RF]
1251 [TX_PWR_BY_RATE_NUM_RF]
1252 [MAX_BASE_NUM_IN_PHY_REG_PG_24G];
1253 u8 txpwr_by_rate_base_5g[TX_PWR_BY_RATE_NUM_RF]
1254 [TX_PWR_BY_RATE_NUM_RF]
1255 [MAX_BASE_NUM_IN_PHY_REG_PG_5G];
1256 u8 default_initialgain[4];
1257
1258 /* the current Tx power level */
1259 u8 cur_cck_txpwridx;
1260 u8 cur_ofdm24g_txpwridx;
1261 u8 cur_bw20_txpwridx;
1262 u8 cur_bw40_txpwridx;
1263
1264 char txpwr_limit_2_4g[MAX_REGULATION_NUM]
1265 [MAX_2_4G_BANDWITH_NUM]
1266 [MAX_RATE_SECTION_NUM]
1267 [CHANNEL_MAX_NUMBER_2G]
1268 [MAX_RF_PATH_NUM];
1269 char txpwr_limit_5g[MAX_REGULATION_NUM]
1270 [MAX_5G_BANDWITH_NUM]
1271 [MAX_RATE_SECTION_NUM]
1272 [CHANNEL_MAX_NUMBER_5G]
1273 [MAX_RF_PATH_NUM];
1274
1275 u32 rfreg_chnlval[2];
1276 bool apk_done;
1277 u32 reg_rf3c[2]; /* pathA / pathB */
1278
1279 u32 backup_rf_0x1a;/*92ee*/
1280 /* bfsync */
1281 u8 framesync;
1282 u32 framesync_c34;
1283
1284 u8 num_total_rfpath;
1285 struct phy_parameters hwparam_tables[MAX_TAB];
1286 u16 rf_pathmap;
1287
1288 u8 hw_rof_enable; /*Enable GPIO[9] as WL RF HW PDn source*/
1289 enum rt_polarity_ctl polarity_ctl;
1290 };
1291
1292 #define MAX_TID_COUNT 9
1293 #define RTL_AGG_STOP 0
1294 #define RTL_AGG_PROGRESS 1
1295 #define RTL_AGG_START 2
1296 #define RTL_AGG_OPERATIONAL 3
1297 #define RTL_AGG_OFF 0
1298 #define RTL_AGG_ON 1
1299 #define RTL_RX_AGG_START 1
1300 #define RTL_RX_AGG_STOP 0
1301 #define RTL_AGG_EMPTYING_HW_QUEUE_ADDBA 2
1302 #define RTL_AGG_EMPTYING_HW_QUEUE_DELBA 3
1303
1304 struct rtl_ht_agg {
1305 u16 txq_id;
1306 u16 wait_for_ba;
1307 u16 start_idx;
1308 u64 bitmap;
1309 u32 rate_n_flags;
1310 u8 agg_state;
1311 u8 rx_agg_state;
1312 };
1313
1314 struct rssi_sta {
1315 long undec_sm_pwdb;
1316 long undec_sm_cck;
1317 };
1318
1319 struct rtl_tid_data {
1320 u16 seq_number;
1321 struct rtl_ht_agg agg;
1322 };
1323
1324 struct rtl_sta_info {
1325 struct list_head list;
1326 u8 ratr_index;
1327 u8 wireless_mode;
1328 u8 mimo_ps;
1329 u8 mac_addr[ETH_ALEN];
1330 struct rtl_tid_data tids[MAX_TID_COUNT];
1331
1332 /* just used for ap adhoc or mesh*/
1333 struct rssi_sta rssi_stat;
1334 } __packed;
1335
1336 struct rtl_priv;
1337 struct rtl_io {
1338 struct device *dev;
1339 struct mutex bb_mutex;
1340
1341 /*PCI MEM map */
1342 unsigned long pci_mem_end; /*shared mem end */
1343 unsigned long pci_mem_start; /*shared mem start */
1344
1345 /*PCI IO map */
1346 unsigned long pci_base_addr; /*device I/O address */
1347
1348 void (*write8_async) (struct rtl_priv *rtlpriv, u32 addr, u8 val);
1349 void (*write16_async) (struct rtl_priv *rtlpriv, u32 addr, u16 val);
1350 void (*write32_async) (struct rtl_priv *rtlpriv, u32 addr, u32 val);
1351 void (*writeN_sync) (struct rtl_priv *rtlpriv, u32 addr, void *buf,
1352 u16 len);
1353
1354 u8(*read8_sync) (struct rtl_priv *rtlpriv, u32 addr);
1355 u16(*read16_sync) (struct rtl_priv *rtlpriv, u32 addr);
1356 u32(*read32_sync) (struct rtl_priv *rtlpriv, u32 addr);
1357
1358 };
1359
1360 struct rtl_mac {
1361 u8 mac_addr[ETH_ALEN];
1362 u8 mac80211_registered;
1363 u8 beacon_enabled;
1364
1365 u32 tx_ss_num;
1366 u32 rx_ss_num;
1367
1368 struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
1369 struct ieee80211_hw *hw;
1370 struct ieee80211_vif *vif;
1371 enum nl80211_iftype opmode;
1372
1373 /*Probe Beacon management */
1374 struct rtl_tid_data tids[MAX_TID_COUNT];
1375 enum rtl_link_state link_state;
1376
1377 int n_channels;
1378 int n_bitrates;
1379
1380 bool offchan_delay;
1381 u8 p2p; /*using p2p role*/
1382 bool p2p_in_use;
1383
1384 /*filters */
1385 u32 rx_conf;
1386 u16 rx_mgt_filter;
1387 u16 rx_ctrl_filter;
1388 u16 rx_data_filter;
1389
1390 bool act_scanning;
1391 u8 cnt_after_linked;
1392 bool skip_scan;
1393
1394 /* early mode */
1395 /* skb wait queue */
1396 struct sk_buff_head skb_waitq[MAX_TID_COUNT];
1397
1398 u8 ht_stbc_cap;
1399 u8 ht_cur_stbc;
1400
1401 /*vht support*/
1402 u8 vht_enable;
1403 u8 bw_80;
1404 u8 vht_cur_ldpc;
1405 u8 vht_cur_stbc;
1406 u8 vht_stbc_cap;
1407 u8 vht_ldpc_cap;
1408
1409 /*RDG*/
1410 bool rdg_en;
1411
1412 /*AP*/
1413 u8 bssid[ETH_ALEN] __aligned(2);
1414 u32 vendor;
1415 u8 mcs[16]; /* 16 bytes mcs for HT rates. */
1416 u32 basic_rates; /* b/g rates */
1417 u8 ht_enable;
1418 u8 sgi_40;
1419 u8 sgi_20;
1420 u8 bw_40;
1421 u16 mode; /* wireless mode */
1422 u8 slot_time;
1423 u8 short_preamble;
1424 u8 use_cts_protect;
1425 u8 cur_40_prime_sc;
1426 u8 cur_40_prime_sc_bk;
1427 u8 cur_80_prime_sc;
1428 u64 tsf;
1429 u8 retry_short;
1430 u8 retry_long;
1431 u16 assoc_id;
1432 bool hiddenssid;
1433
1434 /*IBSS*/
1435 int beacon_interval;
1436
1437 /*AMPDU*/
1438 u8 min_space_cfg; /*For Min spacing configurations */
1439 u8 max_mss_density;
1440 u8 current_ampdu_factor;
1441 u8 current_ampdu_density;
1442
1443 /*QOS & EDCA */
1444 struct ieee80211_tx_queue_params edca_param[RTL_MAC80211_NUM_QUEUE];
1445 struct rtl_qos_parameters ac[AC_MAX];
1446
1447 /* counters */
1448 u64 last_txok_cnt;
1449 u64 last_rxok_cnt;
1450 u32 last_bt_edca_ul;
1451 u32 last_bt_edca_dl;
1452 };
1453
1454 struct btdm_8723 {
1455 bool all_off;
1456 bool agc_table_en;
1457 bool adc_back_off_on;
1458 bool b2_ant_hid_en;
1459 bool low_penalty_rate_adaptive;
1460 bool rf_rx_lpf_shrink;
1461 bool reject_aggre_pkt;
1462 bool tra_tdma_on;
1463 u8 tra_tdma_nav;
1464 u8 tra_tdma_ant;
1465 bool tdma_on;
1466 u8 tdma_ant;
1467 u8 tdma_nav;
1468 u8 tdma_dac_swing;
1469 u8 fw_dac_swing_lvl;
1470 bool ps_tdma_on;
1471 u8 ps_tdma_byte[5];
1472 bool pta_on;
1473 u32 val_0x6c0;
1474 u32 val_0x6c8;
1475 u32 val_0x6cc;
1476 bool sw_dac_swing_on;
1477 u32 sw_dac_swing_lvl;
1478 u32 wlan_act_hi;
1479 u32 wlan_act_lo;
1480 u32 bt_retry_index;
1481 bool dec_bt_pwr;
1482 bool ignore_wlan_act;
1483 };
1484
1485 struct bt_coexist_8723 {
1486 u32 high_priority_tx;
1487 u32 high_priority_rx;
1488 u32 low_priority_tx;
1489 u32 low_priority_rx;
1490 u8 c2h_bt_info;
1491 bool c2h_bt_info_req_sent;
1492 bool c2h_bt_inquiry_page;
1493 u32 bt_inq_page_start_time;
1494 u8 bt_retry_cnt;
1495 u8 c2h_bt_info_original;
1496 u8 bt_inquiry_page_cnt;
1497 struct btdm_8723 btdm;
1498 };
1499
1500 struct rtl_hal {
1501 struct ieee80211_hw *hw;
1502 bool driver_is_goingto_unload;
1503 bool up_first_time;
1504 bool first_init;
1505 bool being_init_adapter;
1506 bool bbrf_ready;
1507 bool mac_func_enable;
1508 bool pre_edcca_enable;
1509 struct bt_coexist_8723 hal_coex_8723;
1510
1511 enum intf_type interface;
1512 u16 hw_type; /*92c or 92d or 92s and so on */
1513 u8 ic_class;
1514 u8 oem_id;
1515 u32 version; /*version of chip */
1516 u8 state; /*stop 0, start 1 */
1517 u8 board_type;
1518 u8 external_pa;
1519
1520 u8 pa_mode;
1521 u8 pa_type_2g;
1522 u8 pa_type_5g;
1523 u8 lna_type_2g;
1524 u8 lna_type_5g;
1525 u8 external_pa_2g;
1526 u8 external_lna_2g;
1527 u8 external_pa_5g;
1528 u8 external_lna_5g;
1529 u8 rfe_type;
1530
1531 /*firmware */
1532 u32 fwsize;
1533 u8 *pfirmware;
1534 u16 fw_version;
1535 u16 fw_subversion;
1536 bool h2c_setinprogress;
1537 u8 last_hmeboxnum;
1538 bool fw_ready;
1539 /*Reserve page start offset except beacon in TxQ. */
1540 u8 fw_rsvdpage_startoffset;
1541 u8 h2c_txcmd_seq;
1542 u8 current_ra_rate;
1543
1544 /* FW Cmd IO related */
1545 u16 fwcmd_iomap;
1546 u32 fwcmd_ioparam;
1547 bool set_fwcmd_inprogress;
1548 u8 current_fwcmd_io;
1549
1550 struct p2p_ps_offload_t p2p_ps_offload;
1551 bool fw_clk_change_in_progress;
1552 bool allow_sw_to_change_hwclc;
1553 u8 fw_ps_state;
1554 /**/
1555 bool driver_going2unload;
1556
1557 /*AMPDU init min space*/
1558 u8 minspace_cfg; /*For Min spacing configurations */
1559
1560 /* Dual mac */
1561 enum macphy_mode macphymode;
1562 enum band_type current_bandtype; /* 0:2.4G, 1:5G */
1563 enum band_type current_bandtypebackup;
1564 enum band_type bandset;
1565 /* dual MAC 0--Mac0 1--Mac1 */
1566 u32 interfaceindex;
1567 /* just for DualMac S3S4 */
1568 u8 macphyctl_reg;
1569 bool earlymode_enable;
1570 u8 max_earlymode_num;
1571 /* Dual mac*/
1572 bool during_mac0init_radiob;
1573 bool during_mac1init_radioa;
1574 bool reloadtxpowerindex;
1575 /* True if IMR or IQK have done
1576 for 2.4G in scan progress */
1577 bool load_imrandiqk_setting_for2g;
1578
1579 bool disable_amsdu_8k;
1580 bool master_of_dmsp;
1581 bool slave_of_dmsp;
1582
1583 u16 rx_tag;/*for 92ee*/
1584 u8 rts_en;
1585
1586 /*for wowlan*/
1587 bool wow_enable;
1588 bool enter_pnp_sleep;
1589 bool wake_from_pnp_sleep;
1590 bool wow_enabled;
1591 __kernel_time_t last_suspend_sec;
1592 u32 wowlan_fwsize;
1593 u8 *wowlan_firmware;
1594
1595 u8 hw_rof_enable; /*Enable GPIO[9] as WL RF HW PDn source*/
1596
1597 bool real_wow_v2_enable;
1598 bool re_init_llt_table;
1599 };
1600
1601 struct rtl_security {
1602 /*default 0 */
1603 bool use_sw_sec;
1604
1605 bool being_setkey;
1606 bool use_defaultkey;
1607 /*Encryption Algorithm for Unicast Packet */
1608 enum rt_enc_alg pairwise_enc_algorithm;
1609 /*Encryption Algorithm for Brocast/Multicast */
1610 enum rt_enc_alg group_enc_algorithm;
1611 /*Cam Entry Bitmap */
1612 u32 hwsec_cam_bitmap;
1613 u8 hwsec_cam_sta_addr[TOTAL_CAM_ENTRY][ETH_ALEN];
1614 /*local Key buffer, indx 0 is for
1615 pairwise key 1-4 is for agoup key. */
1616 u8 key_buf[KEY_BUF_SIZE][MAX_KEY_LEN];
1617 u8 key_len[KEY_BUF_SIZE];
1618
1619 /*The pointer of Pairwise Key,
1620 it always points to KeyBuf[4] */
1621 u8 *pairwise_key;
1622 };
1623
1624 #define ASSOCIATE_ENTRY_NUM 33
1625
1626 struct fast_ant_training {
1627 u8 bssid[6];
1628 u8 antsel_rx_keep_0;
1629 u8 antsel_rx_keep_1;
1630 u8 antsel_rx_keep_2;
1631 u32 ant_sum[7];
1632 u32 ant_cnt[7];
1633 u32 ant_ave[7];
1634 u8 fat_state;
1635 u32 train_idx;
1636 u8 antsel_a[ASSOCIATE_ENTRY_NUM];
1637 u8 antsel_b[ASSOCIATE_ENTRY_NUM];
1638 u8 antsel_c[ASSOCIATE_ENTRY_NUM];
1639 u32 main_ant_sum[ASSOCIATE_ENTRY_NUM];
1640 u32 aux_ant_sum[ASSOCIATE_ENTRY_NUM];
1641 u32 main_ant_cnt[ASSOCIATE_ENTRY_NUM];
1642 u32 aux_ant_cnt[ASSOCIATE_ENTRY_NUM];
1643 u8 rx_idle_ant;
1644 bool becomelinked;
1645 };
1646
1647 struct dm_phy_dbg_info {
1648 char rx_snrdb[4];
1649 u64 num_qry_phy_status;
1650 u64 num_qry_phy_status_cck;
1651 u64 num_qry_phy_status_ofdm;
1652 u16 num_qry_beacon_pkt;
1653 u16 num_non_be_pkt;
1654 s32 rx_evm[4];
1655 };
1656
1657 struct rtl_dm {
1658 /*PHY status for Dynamic Management */
1659 long entry_min_undec_sm_pwdb;
1660 long undec_sm_cck;
1661 long undec_sm_pwdb; /*out dm */
1662 long entry_max_undec_sm_pwdb;
1663 s32 ofdm_pkt_cnt;
1664 bool dm_initialgain_enable;
1665 bool dynamic_txpower_enable;
1666 bool current_turbo_edca;
1667 bool is_any_nonbepkts; /*out dm */
1668 bool is_cur_rdlstate;
1669 bool txpower_trackinginit;
1670 bool disable_framebursting;
1671 bool cck_inch14;
1672 bool txpower_tracking;
1673 bool useramask;
1674 bool rfpath_rxenable[4];
1675 bool inform_fw_driverctrldm;
1676 bool current_mrc_switch;
1677 u8 txpowercount;
1678 u8 powerindex_backup[6];
1679
1680 u8 thermalvalue_rxgain;
1681 u8 thermalvalue_iqk;
1682 u8 thermalvalue_lck;
1683 u8 thermalvalue;
1684 u8 last_dtp_lvl;
1685 u8 thermalvalue_avg[AVG_THERMAL_NUM];
1686 u8 thermalvalue_avg_index;
1687 u8 tm_trigger;
1688 bool done_txpower;
1689 u8 dynamic_txhighpower_lvl; /*Tx high power level */
1690 u8 dm_flag; /*Indicate each dynamic mechanism's status. */
1691 u8 dm_flag_tmp;
1692 u8 dm_type;
1693 u8 dm_rssi_sel;
1694 u8 txpower_track_control;
1695 bool interrupt_migration;
1696 bool disable_tx_int;
1697 char ofdm_index[MAX_RF_PATH];
1698 u8 default_ofdm_index;
1699 u8 default_cck_index;
1700 char cck_index;
1701 char delta_power_index[MAX_RF_PATH];
1702 char delta_power_index_last[MAX_RF_PATH];
1703 char power_index_offset[MAX_RF_PATH];
1704 char absolute_ofdm_swing_idx[MAX_RF_PATH];
1705 char remnant_ofdm_swing_idx[MAX_RF_PATH];
1706 char remnant_cck_idx;
1707 bool modify_txagc_flag_path_a;
1708 bool modify_txagc_flag_path_b;
1709
1710 bool one_entry_only;
1711 struct dm_phy_dbg_info dbginfo;
1712
1713 /* Dynamic ATC switch */
1714 bool atc_status;
1715 bool large_cfo_hit;
1716 bool is_freeze;
1717 int cfo_tail[2];
1718 int cfo_ave_pre;
1719 int crystal_cap;
1720 u8 cfo_threshold;
1721 u32 packet_count;
1722 u32 packet_count_pre;
1723 u8 tx_rate;
1724
1725 /*88e tx power tracking*/
1726 u8 swing_idx_ofdm[MAX_RF_PATH];
1727 u8 swing_idx_ofdm_cur;
1728 u8 swing_idx_ofdm_base[MAX_RF_PATH];
1729 bool swing_flag_ofdm;
1730 u8 swing_idx_cck;
1731 u8 swing_idx_cck_cur;
1732 u8 swing_idx_cck_base;
1733 bool swing_flag_cck;
1734
1735 char swing_diff_2g;
1736 char swing_diff_5g;
1737
1738 u8 delta_swing_table_idx_24gccka_p[DEL_SW_IDX_SZ];
1739 u8 delta_swing_table_idx_24gccka_n[DEL_SW_IDX_SZ];
1740 u8 delta_swing_table_idx_24gcckb_p[DEL_SW_IDX_SZ];
1741 u8 delta_swing_table_idx_24gcckb_n[DEL_SW_IDX_SZ];
1742 u8 delta_swing_table_idx_24ga_p[DEL_SW_IDX_SZ];
1743 u8 delta_swing_table_idx_24ga_n[DEL_SW_IDX_SZ];
1744 u8 delta_swing_table_idx_24gb_p[DEL_SW_IDX_SZ];
1745 u8 delta_swing_table_idx_24gb_n[DEL_SW_IDX_SZ];
1746 u8 delta_swing_table_idx_5ga_p[BAND_NUM][DEL_SW_IDX_SZ];
1747 u8 delta_swing_table_idx_5ga_n[BAND_NUM][DEL_SW_IDX_SZ];
1748 u8 delta_swing_table_idx_5gb_p[BAND_NUM][DEL_SW_IDX_SZ];
1749 u8 delta_swing_table_idx_5gb_n[BAND_NUM][DEL_SW_IDX_SZ];
1750 u8 delta_swing_table_idx_24ga_p_8188e[DEL_SW_IDX_SZ];
1751 u8 delta_swing_table_idx_24ga_n_8188e[DEL_SW_IDX_SZ];
1752
1753 /* DMSP */
1754 bool supp_phymode_switch;
1755
1756 /* DulMac */
1757 struct fast_ant_training fat_table;
1758
1759 u8 resp_tx_path;
1760 u8 path_sel;
1761 u32 patha_sum;
1762 u32 pathb_sum;
1763 u32 patha_cnt;
1764 u32 pathb_cnt;
1765
1766 u8 pre_channel;
1767 u8 *p_channel;
1768 u8 linked_interval;
1769
1770 u64 last_tx_ok_cnt;
1771 u64 last_rx_ok_cnt;
1772 };
1773
1774 #define EFUSE_MAX_LOGICAL_SIZE 512
1775
1776 struct rtl_efuse {
1777 bool autoLoad_ok;
1778 bool bootfromefuse;
1779 u16 max_physical_size;
1780
1781 u8 efuse_map[2][EFUSE_MAX_LOGICAL_SIZE];
1782 u16 efuse_usedbytes;
1783 u8 efuse_usedpercentage;
1784 #ifdef EFUSE_REPG_WORKAROUND
1785 bool efuse_re_pg_sec1flag;
1786 u8 efuse_re_pg_data[8];
1787 #endif
1788
1789 u8 autoload_failflag;
1790 u8 autoload_status;
1791
1792 short epromtype;
1793 u16 eeprom_vid;
1794 u16 eeprom_did;
1795 u16 eeprom_svid;
1796 u16 eeprom_smid;
1797 u8 eeprom_oemid;
1798 u16 eeprom_channelplan;
1799 u8 eeprom_version;
1800 u8 board_type;
1801 u8 external_pa;
1802
1803 u8 dev_addr[6];
1804 u8 wowlan_enable;
1805 u8 antenna_div_cfg;
1806 u8 antenna_div_type;
1807
1808 bool txpwr_fromeprom;
1809 u8 eeprom_crystalcap;
1810 u8 eeprom_tssi[2];
1811 u8 eeprom_tssi_5g[3][2]; /* for 5GL/5GM/5GH band. */
1812 u8 eeprom_pwrlimit_ht20[CHANNEL_GROUP_MAX];
1813 u8 eeprom_pwrlimit_ht40[CHANNEL_GROUP_MAX];
1814 u8 eeprom_chnlarea_txpwr_cck[MAX_RF_PATH][CHANNEL_GROUP_MAX_2G];
1815 u8 eeprom_chnlarea_txpwr_ht40_1s[MAX_RF_PATH][CHANNEL_GROUP_MAX];
1816 u8 eprom_chnl_txpwr_ht40_2sdf[MAX_RF_PATH][CHANNEL_GROUP_MAX];
1817
1818 u8 internal_pa_5g[2]; /* pathA / pathB */
1819 u8 eeprom_c9;
1820 u8 eeprom_cc;
1821
1822 /*For power group */
1823 u8 eeprom_pwrgroup[2][3];
1824 u8 pwrgroup_ht20[2][CHANNEL_MAX_NUMBER];
1825 u8 pwrgroup_ht40[2][CHANNEL_MAX_NUMBER];
1826
1827 u8 txpwrlevel_cck[MAX_RF_PATH][CHANNEL_MAX_NUMBER_2G];
1828 /*For HT 40MHZ pwr */
1829 u8 txpwrlevel_ht40_1s[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1830 /*For HT 40MHZ pwr */
1831 u8 txpwrlevel_ht40_2s[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1832
1833 /*--------------------------------------------------------*
1834 * 8192CE\8192SE\8192DE\8723AE use the following 4 arrays,
1835 * other ICs (8188EE\8723BE\8192EE\8812AE...)
1836 * define new arrays in Windows code.
1837 * BUT, in linux code, we use the same array for all ICs.
1838 *
1839 * The Correspondance relation between two arrays is:
1840 * txpwr_cckdiff[][] == CCK_24G_Diff[][]
1841 * txpwr_ht20diff[][] == BW20_24G_Diff[][]
1842 * txpwr_ht40diff[][] == BW40_24G_Diff[][]
1843 * txpwr_legacyhtdiff[][] == OFDM_24G_Diff[][]
1844 *
1845 * Sizes of these arrays are decided by the larger ones.
1846 */
1847 char txpwr_cckdiff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1848 char txpwr_ht20diff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1849 char txpwr_ht40diff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1850 char txpwr_legacyhtdiff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1851
1852 u8 txpwr_5g_bw40base[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1853 u8 txpwr_5g_bw80base[MAX_RF_PATH][CHANNEL_MAX_NUMBER_5G_80M];
1854 char txpwr_5g_ofdmdiff[MAX_RF_PATH][MAX_TX_COUNT];
1855 char txpwr_5g_bw20diff[MAX_RF_PATH][MAX_TX_COUNT];
1856 char txpwr_5g_bw40diff[MAX_RF_PATH][MAX_TX_COUNT];
1857 char txpwr_5g_bw80diff[MAX_RF_PATH][MAX_TX_COUNT];
1858
1859 u8 txpwr_safetyflag; /* Band edge enable flag */
1860 u16 eeprom_txpowerdiff;
1861 u8 legacy_httxpowerdiff; /* Legacy to HT rate power diff */
1862 u8 antenna_txpwdiff[3];
1863
1864 u8 eeprom_regulatory;
1865 u8 eeprom_thermalmeter;
1866 u8 thermalmeter[2]; /*ThermalMeter, index 0 for RFIC0, 1 for RFIC1 */
1867 u16 tssi_13dbm;
1868 u8 crystalcap; /* CrystalCap. */
1869 u8 delta_iqk;
1870 u8 delta_lck;
1871
1872 u8 legacy_ht_txpowerdiff; /*Legacy to HT rate power diff */
1873 bool apk_thermalmeterignore;
1874
1875 bool b1x1_recvcombine;
1876 bool b1ss_support;
1877
1878 /*channel plan */
1879 u8 channel_plan;
1880 };
1881
1882 struct rtl_ps_ctl {
1883 bool pwrdomain_protect;
1884 bool in_powersavemode;
1885 bool rfchange_inprogress;
1886 bool swrf_processing;
1887 bool hwradiooff;
1888 /*
1889 * just for PCIE ASPM
1890 * If it supports ASPM, Offset[560h] = 0x40,
1891 * otherwise Offset[560h] = 0x00.
1892 * */
1893 bool support_aspm;
1894 bool support_backdoor;
1895
1896 /*for LPS */
1897 enum rt_psmode dot11_psmode; /*Power save mode configured. */
1898 bool swctrl_lps;
1899 bool leisure_ps;
1900 bool fwctrl_lps;
1901 u8 fwctrl_psmode;
1902 /*For Fw control LPS mode */
1903 u8 reg_fwctrl_lps;
1904 /*Record Fw PS mode status. */
1905 bool fw_current_inpsmode;
1906 u8 reg_max_lps_awakeintvl;
1907 bool report_linked;
1908 bool low_power_enable;/*for 32k*/
1909
1910 /*for IPS */
1911 bool inactiveps;
1912
1913 u32 rfoff_reason;
1914
1915 /*RF OFF Level */
1916 u32 cur_ps_level;
1917 u32 reg_rfps_level;
1918
1919 /*just for PCIE ASPM */
1920 u8 const_amdpci_aspm;
1921 bool pwrdown_mode;
1922
1923 enum rf_pwrstate inactive_pwrstate;
1924 enum rf_pwrstate rfpwr_state; /*cur power state */
1925
1926 /* for SW LPS*/
1927 bool sw_ps_enabled;
1928 bool state;
1929 bool state_inap;
1930 bool multi_buffered;
1931 u16 nullfunc_seq;
1932 unsigned int dtim_counter;
1933 unsigned int sleep_ms;
1934 unsigned long last_sleep_jiffies;
1935 unsigned long last_awake_jiffies;
1936 unsigned long last_delaylps_stamp_jiffies;
1937 unsigned long last_dtim;
1938 unsigned long last_beacon;
1939 unsigned long last_action;
1940 unsigned long last_slept;
1941
1942 /*For P2P PS */
1943 struct rtl_p2p_ps_info p2p_ps_info;
1944 u8 pwr_mode;
1945 u8 smart_ps;
1946
1947 /* wake up on line */
1948 u8 wo_wlan_mode;
1949 u8 arp_offload_enable;
1950 u8 gtk_offload_enable;
1951 /* Used for WOL, indicates the reason for waking event.*/
1952 u32 wakeup_reason;
1953 /* Record the last waking time for comparison with setting key. */
1954 u64 last_wakeup_time;
1955 };
1956
1957 struct rtl_stats {
1958 u8 psaddr[ETH_ALEN];
1959 u32 mac_time[2];
1960 s8 rssi;
1961 u8 signal;
1962 u8 noise;
1963 u8 rate; /* hw desc rate */
1964 u8 received_channel;
1965 u8 control;
1966 u8 mask;
1967 u8 freq;
1968 u16 len;
1969 u64 tsf;
1970 u32 beacon_time;
1971 u8 nic_type;
1972 u16 length;
1973 u8 signalquality; /*in 0-100 index. */
1974 /*
1975 * Real power in dBm for this packet,
1976 * no beautification and aggregation.
1977 * */
1978 s32 recvsignalpower;
1979 s8 rxpower; /*in dBm Translate from PWdB */
1980 u8 signalstrength; /*in 0-100 index. */
1981 u16 hwerror:1;
1982 u16 crc:1;
1983 u16 icv:1;
1984 u16 shortpreamble:1;
1985 u16 antenna:1;
1986 u16 decrypted:1;
1987 u16 wakeup:1;
1988 u32 timestamp_low;
1989 u32 timestamp_high;
1990 bool shift;
1991
1992 u8 rx_drvinfo_size;
1993 u8 rx_bufshift;
1994 bool isampdu;
1995 bool isfirst_ampdu;
1996 bool rx_is40Mhzpacket;
1997 u8 rx_packet_bw;
1998 u32 rx_pwdb_all;
1999 u8 rx_mimo_signalstrength[4]; /*in 0~100 index */
2000 s8 rx_mimo_signalquality[4];
2001 u8 rx_mimo_evm_dbm[4];
2002 u16 cfo_short[4]; /* per-path's Cfo_short */
2003 u16 cfo_tail[4];
2004
2005 s8 rx_mimo_sig_qual[4];
2006 u8 rx_pwr[4]; /* per-path's pwdb */
2007 u8 rx_snr[4]; /* per-path's SNR */
2008 u8 bandwidth;
2009 u8 bt_coex_pwr_adjust;
2010 bool packet_matchbssid;
2011 bool is_cck;
2012 bool is_ht;
2013 bool packet_toself;
2014 bool packet_beacon; /*for rssi */
2015 char cck_adc_pwdb[4]; /*for rx path selection */
2016
2017 bool is_vht;
2018 bool is_short_gi;
2019 u8 vht_nss;
2020
2021 u8 packet_report_type;
2022
2023 u32 macid;
2024 u8 wake_match;
2025 u32 bt_rx_rssi_percentage;
2026 u32 macid_valid_entry[2];
2027 };
2028
2029
2030 struct rt_link_detect {
2031 /* count for roaming */
2032 u32 bcn_rx_inperiod;
2033 u32 roam_times;
2034
2035 u32 num_tx_in4period[4];
2036 u32 num_rx_in4period[4];
2037
2038 u32 num_tx_inperiod;
2039 u32 num_rx_inperiod;
2040
2041 bool busytraffic;
2042 bool tx_busy_traffic;
2043 bool rx_busy_traffic;
2044 bool higher_busytraffic;
2045 bool higher_busyrxtraffic;
2046
2047 u32 tidtx_in4period[MAX_TID_COUNT][4];
2048 u32 tidtx_inperiod[MAX_TID_COUNT];
2049 bool higher_busytxtraffic[MAX_TID_COUNT];
2050 };
2051
2052 struct rtl_tcb_desc {
2053 u8 packet_bw:2;
2054 u8 multicast:1;
2055 u8 broadcast:1;
2056
2057 u8 rts_stbc:1;
2058 u8 rts_enable:1;
2059 u8 cts_enable:1;
2060 u8 rts_use_shortpreamble:1;
2061 u8 rts_use_shortgi:1;
2062 u8 rts_sc:1;
2063 u8 rts_bw:1;
2064 u8 rts_rate;
2065
2066 u8 use_shortgi:1;
2067 u8 use_shortpreamble:1;
2068 u8 use_driver_rate:1;
2069 u8 disable_ratefallback:1;
2070
2071 u8 ratr_index;
2072 u8 mac_id;
2073 u8 hw_rate;
2074
2075 u8 last_inipkt:1;
2076 u8 cmd_or_init:1;
2077 u8 queue_index;
2078
2079 /* early mode */
2080 u8 empkt_num;
2081 /* The max value by HW */
2082 u32 empkt_len[10];
2083 bool tx_enable_sw_calc_duration;
2084 };
2085
2086 struct rtl_wow_pattern {
2087 u8 type;
2088 u16 crc;
2089 u32 mask[4];
2090 };
2091
2092 struct rtl_hal_ops {
2093 int (*init_sw_vars) (struct ieee80211_hw *hw);
2094 void (*deinit_sw_vars) (struct ieee80211_hw *hw);
2095 void (*read_chip_version)(struct ieee80211_hw *hw);
2096 void (*read_eeprom_info) (struct ieee80211_hw *hw);
2097 void (*interrupt_recognized) (struct ieee80211_hw *hw,
2098 u32 *p_inta, u32 *p_intb);
2099 int (*hw_init) (struct ieee80211_hw *hw);
2100 void (*hw_disable) (struct ieee80211_hw *hw);
2101 void (*hw_suspend) (struct ieee80211_hw *hw);
2102 void (*hw_resume) (struct ieee80211_hw *hw);
2103 void (*enable_interrupt) (struct ieee80211_hw *hw);
2104 void (*disable_interrupt) (struct ieee80211_hw *hw);
2105 int (*set_network_type) (struct ieee80211_hw *hw,
2106 enum nl80211_iftype type);
2107 void (*set_chk_bssid)(struct ieee80211_hw *hw,
2108 bool check_bssid);
2109 void (*set_bw_mode) (struct ieee80211_hw *hw,
2110 enum nl80211_channel_type ch_type);
2111 u8(*switch_channel) (struct ieee80211_hw *hw);
2112 void (*set_qos) (struct ieee80211_hw *hw, int aci);
2113 void (*set_bcn_reg) (struct ieee80211_hw *hw);
2114 void (*set_bcn_intv) (struct ieee80211_hw *hw);
2115 void (*update_interrupt_mask) (struct ieee80211_hw *hw,
2116 u32 add_msr, u32 rm_msr);
2117 void (*get_hw_reg) (struct ieee80211_hw *hw, u8 variable, u8 *val);
2118 void (*set_hw_reg) (struct ieee80211_hw *hw, u8 variable, u8 *val);
2119 void (*update_rate_tbl) (struct ieee80211_hw *hw,
2120 struct ieee80211_sta *sta, u8 rssi_level);
2121 void (*pre_fill_tx_bd_desc)(struct ieee80211_hw *hw, u8 *tx_bd_desc,
2122 u8 *desc, u8 queue_index,
2123 struct sk_buff *skb, dma_addr_t addr);
2124 void (*update_rate_mask) (struct ieee80211_hw *hw, u8 rssi_level);
2125 u16 (*rx_desc_buff_remained_cnt)(struct ieee80211_hw *hw,
2126 u8 queue_index);
2127 void (*rx_check_dma_ok)(struct ieee80211_hw *hw, u8 *header_desc,
2128 u8 queue_index);
2129 void (*fill_tx_desc) (struct ieee80211_hw *hw,
2130 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
2131 u8 *pbd_desc_tx,
2132 struct ieee80211_tx_info *info,
2133 struct ieee80211_sta *sta,
2134 struct sk_buff *skb, u8 hw_queue,
2135 struct rtl_tcb_desc *ptcb_desc);
2136 void (*fill_fake_txdesc) (struct ieee80211_hw *hw, u8 *pDesc,
2137 u32 buffer_len, bool bIsPsPoll);
2138 void (*fill_tx_cmddesc) (struct ieee80211_hw *hw, u8 *pdesc,
2139 bool firstseg, bool lastseg,
2140 struct sk_buff *skb);
2141 bool (*query_rx_desc) (struct ieee80211_hw *hw,
2142 struct rtl_stats *stats,
2143 struct ieee80211_rx_status *rx_status,
2144 u8 *pdesc, struct sk_buff *skb);
2145 void (*set_channel_access) (struct ieee80211_hw *hw);
2146 bool (*radio_onoff_checking) (struct ieee80211_hw *hw, u8 *valid);
2147 void (*dm_watchdog) (struct ieee80211_hw *hw);
2148 void (*scan_operation_backup) (struct ieee80211_hw *hw, u8 operation);
2149 bool (*set_rf_power_state) (struct ieee80211_hw *hw,
2150 enum rf_pwrstate rfpwr_state);
2151 void (*led_control) (struct ieee80211_hw *hw,
2152 enum led_ctl_mode ledaction);
2153 void (*set_desc)(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
2154 u8 desc_name, u8 *val);
2155 u32 (*get_desc) (u8 *pdesc, bool istx, u8 desc_name);
2156 bool (*is_tx_desc_closed) (struct ieee80211_hw *hw,
2157 u8 hw_queue, u16 index);
2158 void (*tx_polling) (struct ieee80211_hw *hw, u8 hw_queue);
2159 void (*enable_hw_sec) (struct ieee80211_hw *hw);
2160 void (*set_key) (struct ieee80211_hw *hw, u32 key_index,
2161 u8 *macaddr, bool is_group, u8 enc_algo,
2162 bool is_wepkey, bool clear_all);
2163 void (*init_sw_leds) (struct ieee80211_hw *hw);
2164 void (*deinit_sw_leds) (struct ieee80211_hw *hw);
2165 u32 (*get_bbreg) (struct ieee80211_hw *hw, u32 regaddr, u32 bitmask);
2166 void (*set_bbreg) (struct ieee80211_hw *hw, u32 regaddr, u32 bitmask,
2167 u32 data);
2168 u32 (*get_rfreg) (struct ieee80211_hw *hw, enum radio_path rfpath,
2169 u32 regaddr, u32 bitmask);
2170 void (*set_rfreg) (struct ieee80211_hw *hw, enum radio_path rfpath,
2171 u32 regaddr, u32 bitmask, u32 data);
2172 void (*linked_set_reg) (struct ieee80211_hw *hw);
2173 void (*chk_switch_dmdp) (struct ieee80211_hw *hw);
2174 void (*dualmac_easy_concurrent) (struct ieee80211_hw *hw);
2175 void (*dualmac_switch_to_dmdp) (struct ieee80211_hw *hw);
2176 bool (*phy_rf6052_config) (struct ieee80211_hw *hw);
2177 void (*phy_rf6052_set_cck_txpower) (struct ieee80211_hw *hw,
2178 u8 *powerlevel);
2179 void (*phy_rf6052_set_ofdm_txpower) (struct ieee80211_hw *hw,
2180 u8 *ppowerlevel, u8 channel);
2181 bool (*config_bb_with_headerfile) (struct ieee80211_hw *hw,
2182 u8 configtype);
2183 bool (*config_bb_with_pgheaderfile) (struct ieee80211_hw *hw,
2184 u8 configtype);
2185 void (*phy_lc_calibrate) (struct ieee80211_hw *hw, bool is2t);
2186 void (*phy_set_bw_mode_callback) (struct ieee80211_hw *hw);
2187 void (*dm_dynamic_txpower) (struct ieee80211_hw *hw);
2188 void (*c2h_command_handle) (struct ieee80211_hw *hw);
2189 void (*bt_wifi_media_status_notify) (struct ieee80211_hw *hw,
2190 bool mstate);
2191 void (*bt_coex_off_before_lps) (struct ieee80211_hw *hw);
2192 void (*fill_h2c_cmd) (struct ieee80211_hw *hw, u8 element_id,
2193 u32 cmd_len, u8 *p_cmdbuffer);
2194 bool (*get_btc_status) (void);
2195 bool (*is_fw_header)(struct rtlwifi_firmware_header *hdr);
2196 u32 (*rx_command_packet)(struct ieee80211_hw *hw,
2197 struct rtl_stats status, struct sk_buff *skb);
2198 void (*add_wowlan_pattern)(struct ieee80211_hw *hw,
2199 struct rtl_wow_pattern *rtl_pattern,
2200 u8 index);
2201 u16 (*get_available_desc)(struct ieee80211_hw *hw, u8 q_idx);
2202 };
2203
2204 struct rtl_intf_ops {
2205 /*com */
2206 void (*read_efuse_byte)(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf);
2207 int (*adapter_start) (struct ieee80211_hw *hw);
2208 void (*adapter_stop) (struct ieee80211_hw *hw);
2209 bool (*check_buddy_priv)(struct ieee80211_hw *hw,
2210 struct rtl_priv **buddy_priv);
2211
2212 int (*adapter_tx) (struct ieee80211_hw *hw,
2213 struct ieee80211_sta *sta,
2214 struct sk_buff *skb,
2215 struct rtl_tcb_desc *ptcb_desc);
2216 void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop);
2217 int (*reset_trx_ring) (struct ieee80211_hw *hw);
2218 bool (*waitq_insert) (struct ieee80211_hw *hw,
2219 struct ieee80211_sta *sta,
2220 struct sk_buff *skb);
2221
2222 /*pci */
2223 void (*disable_aspm) (struct ieee80211_hw *hw);
2224 void (*enable_aspm) (struct ieee80211_hw *hw);
2225
2226 /*usb */
2227 };
2228
2229 struct rtl_mod_params {
2230 /* default: 0 = using hardware encryption */
2231 bool sw_crypto;
2232
2233 /* default: 0 = DBG_EMERG (0)*/
2234 int debug;
2235
2236 /* default: 1 = using no linked power save */
2237 bool inactiveps;
2238
2239 /* default: 1 = using linked sw power save */
2240 bool swctrl_lps;
2241
2242 /* default: 1 = using linked fw power save */
2243 bool fwctrl_lps;
2244
2245 /* default: 0 = not using MSI interrupts mode
2246 * submodules should set their own default value
2247 */
2248 bool msi_support;
2249
2250 /* default 0: 1 means disable */
2251 bool disable_watchdog;
2252
2253 /* default 0: 1 means do not disable interrupts */
2254 bool int_clear;
2255 };
2256
2257 struct rtl_hal_usbint_cfg {
2258 /* data - rx */
2259 u32 in_ep_num;
2260 u32 rx_urb_num;
2261 u32 rx_max_size;
2262
2263 /* op - rx */
2264 void (*usb_rx_hdl)(struct ieee80211_hw *, struct sk_buff *);
2265 void (*usb_rx_segregate_hdl)(struct ieee80211_hw *, struct sk_buff *,
2266 struct sk_buff_head *);
2267
2268 /* tx */
2269 void (*usb_tx_cleanup)(struct ieee80211_hw *, struct sk_buff *);
2270 int (*usb_tx_post_hdl)(struct ieee80211_hw *, struct urb *,
2271 struct sk_buff *);
2272 struct sk_buff *(*usb_tx_aggregate_hdl)(struct ieee80211_hw *,
2273 struct sk_buff_head *);
2274
2275 /* endpoint mapping */
2276 int (*usb_endpoint_mapping)(struct ieee80211_hw *hw);
2277 u16 (*usb_mq_to_hwq)(__le16 fc, u16 mac80211_queue_index);
2278 };
2279
2280 struct rtl_hal_cfg {
2281 u8 bar_id;
2282 bool write_readback;
2283 char *name;
2284 char *fw_name;
2285 char *alt_fw_name;
2286 char *wowlan_fw_name;
2287 struct rtl_hal_ops *ops;
2288 struct rtl_mod_params *mod_params;
2289 struct rtl_hal_usbint_cfg *usb_interface_cfg;
2290
2291 /*this map used for some registers or vars
2292 defined int HAL but used in MAIN */
2293 u32 maps[RTL_VAR_MAP_MAX];
2294
2295 };
2296
2297 struct rtl_locks {
2298 /* mutex */
2299 struct mutex conf_mutex;
2300 struct mutex ps_mutex;
2301
2302 /*spin lock */
2303 spinlock_t ips_lock;
2304 spinlock_t irq_th_lock;
2305 spinlock_t irq_pci_lock;
2306 spinlock_t tx_lock;
2307 spinlock_t h2c_lock;
2308 spinlock_t rf_ps_lock;
2309 spinlock_t rf_lock;
2310 spinlock_t lps_lock;
2311 spinlock_t waitq_lock;
2312 spinlock_t entry_list_lock;
2313 spinlock_t usb_lock;
2314
2315 /*FW clock change */
2316 spinlock_t fw_ps_lock;
2317
2318 /*Dual mac*/
2319 spinlock_t cck_and_rw_pagea_lock;
2320
2321 /*Easy concurrent*/
2322 spinlock_t check_sendpkt_lock;
2323
2324 spinlock_t iqk_lock;
2325 };
2326
2327 struct rtl_works {
2328 struct ieee80211_hw *hw;
2329
2330 /*timer */
2331 struct timer_list watchdog_timer;
2332 struct timer_list dualmac_easyconcurrent_retrytimer;
2333 struct timer_list fw_clockoff_timer;
2334 struct timer_list fast_antenna_training_timer;
2335 /*task */
2336 struct tasklet_struct irq_tasklet;
2337 struct tasklet_struct irq_prepare_bcn_tasklet;
2338
2339 /*work queue */
2340 struct workqueue_struct *rtl_wq;
2341 struct delayed_work watchdog_wq;
2342 struct delayed_work ips_nic_off_wq;
2343
2344 /* For SW LPS */
2345 struct delayed_work ps_work;
2346 struct delayed_work ps_rfon_wq;
2347 struct delayed_work fwevt_wq;
2348
2349 struct work_struct lps_change_work;
2350 struct work_struct fill_h2c_cmd;
2351 };
2352
2353 struct rtl_debug {
2354 u32 dbgp_type[DBGP_TYPE_MAX];
2355 int global_debuglevel;
2356 u64 global_debugcomponents;
2357
2358 /* add for proc debug */
2359 struct proc_dir_entry *proc_dir;
2360 char proc_name[20];
2361 };
2362
2363 #define MIMO_PS_STATIC 0
2364 #define MIMO_PS_DYNAMIC 1
2365 #define MIMO_PS_NOLIMIT 3
2366
2367 struct rtl_dualmac_easy_concurrent_ctl {
2368 enum band_type currentbandtype_backfordmdp;
2369 bool close_bbandrf_for_dmsp;
2370 bool change_to_dmdp;
2371 bool change_to_dmsp;
2372 bool switch_in_process;
2373 };
2374
2375 struct rtl_dmsp_ctl {
2376 bool activescan_for_slaveofdmsp;
2377 bool scan_for_anothermac_fordmsp;
2378 bool scan_for_itself_fordmsp;
2379 bool writedig_for_anothermacofdmsp;
2380 u32 curdigvalue_for_anothermacofdmsp;
2381 bool changecckpdstate_for_anothermacofdmsp;
2382 u8 curcckpdstate_for_anothermacofdmsp;
2383 bool changetxhighpowerlvl_for_anothermacofdmsp;
2384 u8 curtxhighlvl_for_anothermacofdmsp;
2385 long rssivalmin_for_anothermacofdmsp;
2386 };
2387
2388 struct ps_t {
2389 u8 pre_ccastate;
2390 u8 cur_ccasate;
2391 u8 pre_rfstate;
2392 u8 cur_rfstate;
2393 u8 initialize;
2394 long rssi_val_min;
2395 };
2396
2397 struct dig_t {
2398 u32 rssi_lowthresh;
2399 u32 rssi_highthresh;
2400 u32 fa_lowthresh;
2401 u32 fa_highthresh;
2402 long last_min_undec_pwdb_for_dm;
2403 long rssi_highpower_lowthresh;
2404 long rssi_highpower_highthresh;
2405 u32 recover_cnt;
2406 u32 pre_igvalue;
2407 u32 cur_igvalue;
2408 long rssi_val;
2409 u8 dig_enable_flag;
2410 u8 dig_ext_port_stage;
2411 u8 dig_algorithm;
2412 u8 dig_twoport_algorithm;
2413 u8 dig_dbgmode;
2414 u8 dig_slgorithm_switch;
2415 u8 cursta_cstate;
2416 u8 presta_cstate;
2417 u8 curmultista_cstate;
2418 u8 stop_dig;
2419 char back_val;
2420 char back_range_max;
2421 char back_range_min;
2422 u8 rx_gain_max;
2423 u8 rx_gain_min;
2424 u8 min_undec_pwdb_for_dm;
2425 u8 rssi_val_min;
2426 u8 pre_cck_cca_thres;
2427 u8 cur_cck_cca_thres;
2428 u8 pre_cck_pd_state;
2429 u8 cur_cck_pd_state;
2430 u8 pre_cck_fa_state;
2431 u8 cur_cck_fa_state;
2432 u8 pre_ccastate;
2433 u8 cur_ccasate;
2434 u8 large_fa_hit;
2435 u8 forbidden_igi;
2436 u8 dig_state;
2437 u8 dig_highpwrstate;
2438 u8 cur_sta_cstate;
2439 u8 pre_sta_cstate;
2440 u8 cur_ap_cstate;
2441 u8 pre_ap_cstate;
2442 u8 cur_pd_thstate;
2443 u8 pre_pd_thstate;
2444 u8 cur_cs_ratiostate;
2445 u8 pre_cs_ratiostate;
2446 u8 backoff_enable_flag;
2447 char backoffval_range_max;
2448 char backoffval_range_min;
2449 u8 dig_min_0;
2450 u8 dig_min_1;
2451 u8 bt30_cur_igi;
2452 bool media_connect_0;
2453 bool media_connect_1;
2454
2455 u32 antdiv_rssi_max;
2456 u32 rssi_max;
2457 };
2458
2459 struct rtl_global_var {
2460 /* from this list we can get
2461 * other adapter's rtl_priv */
2462 struct list_head glb_priv_list;
2463 spinlock_t glb_list_lock;
2464 };
2465
2466 struct rtl_btc_info {
2467 u8 bt_type;
2468 u8 btcoexist;
2469 u8 ant_num;
2470 };
2471
2472 struct bt_coexist_info {
2473 struct rtl_btc_ops *btc_ops;
2474 struct rtl_btc_info btc_info;
2475 /* EEPROM BT info. */
2476 u8 eeprom_bt_coexist;
2477 u8 eeprom_bt_type;
2478 u8 eeprom_bt_ant_num;
2479 u8 eeprom_bt_ant_isol;
2480 u8 eeprom_bt_radio_shared;
2481
2482 u8 bt_coexistence;
2483 u8 bt_ant_num;
2484 u8 bt_coexist_type;
2485 u8 bt_state;
2486 u8 bt_cur_state; /* 0:on, 1:off */
2487 u8 bt_ant_isolation; /* 0:good, 1:bad */
2488 u8 bt_pape_ctrl; /* 0:SW, 1:SW/HW dynamic */
2489 u8 bt_service;
2490 u8 bt_radio_shared_type;
2491 u8 bt_rfreg_origin_1e;
2492 u8 bt_rfreg_origin_1f;
2493 u8 bt_rssi_state;
2494 u32 ratio_tx;
2495 u32 ratio_pri;
2496 u32 bt_edca_ul;
2497 u32 bt_edca_dl;
2498
2499 bool init_set;
2500 bool bt_busy_traffic;
2501 bool bt_traffic_mode_set;
2502 bool bt_non_traffic_mode_set;
2503
2504 bool fw_coexist_all_off;
2505 bool sw_coexist_all_off;
2506 bool hw_coexist_all_off;
2507 u32 cstate;
2508 u32 previous_state;
2509 u32 cstate_h;
2510 u32 previous_state_h;
2511
2512 u8 bt_pre_rssi_state;
2513 u8 bt_pre_rssi_state1;
2514
2515 u8 reg_bt_iso;
2516 u8 reg_bt_sco;
2517 bool balance_on;
2518 u8 bt_active_zero_cnt;
2519 bool cur_bt_disabled;
2520 bool pre_bt_disabled;
2521
2522 u8 bt_profile_case;
2523 u8 bt_profile_action;
2524 bool bt_busy;
2525 bool hold_for_bt_operation;
2526 u8 lps_counter;
2527 };
2528
2529 struct rtl_btc_ops {
2530 void (*btc_init_variables) (struct rtl_priv *rtlpriv);
2531 void (*btc_init_hal_vars) (struct rtl_priv *rtlpriv);
2532 void (*btc_init_hw_config) (struct rtl_priv *rtlpriv);
2533 void (*btc_ips_notify) (struct rtl_priv *rtlpriv, u8 type);
2534 void (*btc_lps_notify)(struct rtl_priv *rtlpriv, u8 type);
2535 void (*btc_scan_notify) (struct rtl_priv *rtlpriv, u8 scantype);
2536 void (*btc_connect_notify) (struct rtl_priv *rtlpriv, u8 action);
2537 void (*btc_mediastatus_notify) (struct rtl_priv *rtlpriv,
2538 enum rt_media_status mstatus);
2539 void (*btc_periodical) (struct rtl_priv *rtlpriv);
2540 void (*btc_halt_notify) (void);
2541 void (*btc_btinfo_notify) (struct rtl_priv *rtlpriv,
2542 u8 *tmp_buf, u8 length);
2543 bool (*btc_is_limited_dig) (struct rtl_priv *rtlpriv);
2544 bool (*btc_is_disable_edca_turbo) (struct rtl_priv *rtlpriv);
2545 bool (*btc_is_bt_disabled) (struct rtl_priv *rtlpriv);
2546 void (*btc_special_packet_notify)(struct rtl_priv *rtlpriv,
2547 u8 pkt_type);
2548 };
2549
2550 struct proxim {
2551 bool proxim_on;
2552
2553 void *proximity_priv;
2554 int (*proxim_rx)(struct ieee80211_hw *hw, struct rtl_stats *status,
2555 struct sk_buff *skb);
2556 u8 (*proxim_get_var)(struct ieee80211_hw *hw, u8 type);
2557 };
2558
2559 struct rtl_priv {
2560 struct ieee80211_hw *hw;
2561 struct completion firmware_loading_complete;
2562 struct list_head list;
2563 struct rtl_priv *buddy_priv;
2564 struct rtl_global_var *glb_var;
2565 struct rtl_dualmac_easy_concurrent_ctl easy_concurrent_ctl;
2566 struct rtl_dmsp_ctl dmsp_ctl;
2567 struct rtl_locks locks;
2568 struct rtl_works works;
2569 struct rtl_mac mac80211;
2570 struct rtl_hal rtlhal;
2571 struct rtl_regulatory regd;
2572 struct rtl_rfkill rfkill;
2573 struct rtl_io io;
2574 struct rtl_phy phy;
2575 struct rtl_dm dm;
2576 struct rtl_security sec;
2577 struct rtl_efuse efuse;
2578
2579 struct rtl_ps_ctl psc;
2580 struct rate_adaptive ra;
2581 struct dynamic_primary_cca primarycca;
2582 struct wireless_stats stats;
2583 struct rt_link_detect link_info;
2584 struct false_alarm_statistics falsealm_cnt;
2585
2586 struct rtl_rate_priv *rate_priv;
2587
2588 /* sta entry list for ap adhoc or mesh */
2589 struct list_head entry_list;
2590
2591 struct rtl_debug dbg;
2592 int max_fw_size;
2593
2594 /*
2595 *hal_cfg : for diff cards
2596 *intf_ops : for diff interrface usb/pcie
2597 */
2598 struct rtl_hal_cfg *cfg;
2599 struct rtl_intf_ops *intf_ops;
2600
2601 /*this var will be set by set_bit,
2602 and was used to indicate status of
2603 interface or hardware */
2604 unsigned long status;
2605
2606 /* tables for dm */
2607 struct dig_t dm_digtable;
2608 struct ps_t dm_pstable;
2609
2610 u32 reg_874;
2611 u32 reg_c70;
2612 u32 reg_85c;
2613 u32 reg_a74;
2614 bool reg_init; /* true if regs saved */
2615 bool bt_operation_on;
2616 __le32 *usb_data;
2617 int usb_data_index;
2618 bool initialized;
2619 bool enter_ps; /* true when entering PS */
2620 u8 rate_mask[5];
2621
2622 /* intel Proximity, should be alloc mem
2623 * in intel Proximity module and can only
2624 * be used in intel Proximity mode
2625 */
2626 struct proxim proximity;
2627
2628 /*for bt coexist use*/
2629 struct bt_coexist_info btcoexist;
2630
2631 /* separate 92ee from other ICs,
2632 * 92ee use new trx flow.
2633 */
2634 bool use_new_trx_flow;
2635
2636 #ifdef CONFIG_PM
2637 struct wiphy_wowlan_support wowlan;
2638 #endif
2639 /*This must be the last item so
2640 that it points to the data allocated
2641 beyond this structure like:
2642 rtl_pci_priv or rtl_usb_priv */
2643 u8 priv[0] __aligned(sizeof(void *));
2644 };
2645
2646 #define rtl_priv(hw) (((struct rtl_priv *)(hw)->priv))
2647 #define rtl_mac(rtlpriv) (&((rtlpriv)->mac80211))
2648 #define rtl_hal(rtlpriv) (&((rtlpriv)->rtlhal))
2649 #define rtl_efuse(rtlpriv) (&((rtlpriv)->efuse))
2650 #define rtl_psc(rtlpriv) (&((rtlpriv)->psc))
2651
2652
2653 /***************************************
2654 Bluetooth Co-existence Related
2655 ****************************************/
2656
2657 enum bt_ant_num {
2658 ANT_X2 = 0,
2659 ANT_X1 = 1,
2660 };
2661
2662 enum bt_co_type {
2663 BT_2WIRE = 0,
2664 BT_ISSC_3WIRE = 1,
2665 BT_ACCEL = 2,
2666 BT_CSR_BC4 = 3,
2667 BT_CSR_BC8 = 4,
2668 BT_RTL8756 = 5,
2669 BT_RTL8723A = 6,
2670 BT_RTL8821A = 7,
2671 BT_RTL8723B = 8,
2672 BT_RTL8192E = 9,
2673 BT_RTL8812A = 11,
2674 };
2675
2676 enum bt_total_ant_num {
2677 ANT_TOTAL_X2 = 0,
2678 ANT_TOTAL_X1 = 1
2679 };
2680
2681 enum bt_cur_state {
2682 BT_OFF = 0,
2683 BT_ON = 1,
2684 };
2685
2686 enum bt_service_type {
2687 BT_SCO = 0,
2688 BT_A2DP = 1,
2689 BT_HID = 2,
2690 BT_HID_IDLE = 3,
2691 BT_SCAN = 4,
2692 BT_IDLE = 5,
2693 BT_OTHER_ACTION = 6,
2694 BT_BUSY = 7,
2695 BT_OTHERBUSY = 8,
2696 BT_PAN = 9,
2697 };
2698
2699 enum bt_radio_shared {
2700 BT_RADIO_SHARED = 0,
2701 BT_RADIO_INDIVIDUAL = 1,
2702 };
2703
2704
2705 /****************************************
2706 mem access macro define start
2707 Call endian free function when
2708 1. Read/write packet content.
2709 2. Before write integer to IO.
2710 3. After read integer from IO.
2711 ****************************************/
2712 /* Convert little data endian to host ordering */
2713 #define EF1BYTE(_val) \
2714 ((u8)(_val))
2715 #define EF2BYTE(_val) \
2716 (le16_to_cpu(_val))
2717 #define EF4BYTE(_val) \
2718 (le32_to_cpu(_val))
2719
2720 /* Read data from memory */
2721 #define READEF1BYTE(_ptr) \
2722 EF1BYTE(*((u8 *)(_ptr)))
2723 /* Read le16 data from memory and convert to host ordering */
2724 #define READEF2BYTE(_ptr) \
2725 EF2BYTE(*(_ptr))
2726 #define READEF4BYTE(_ptr) \
2727 EF4BYTE(*(_ptr))
2728
2729 /* Write data to memory */
2730 #define WRITEEF1BYTE(_ptr, _val) \
2731 (*((u8 *)(_ptr))) = EF1BYTE(_val)
2732 /* Write le16 data to memory in host ordering */
2733 #define WRITEEF2BYTE(_ptr, _val) \
2734 (*((u16 *)(_ptr))) = EF2BYTE(_val)
2735 #define WRITEEF4BYTE(_ptr, _val) \
2736 (*((u32 *)(_ptr))) = EF2BYTE(_val)
2737
2738 /* Create a bit mask
2739 * Examples:
2740 * BIT_LEN_MASK_32(0) => 0x00000000
2741 * BIT_LEN_MASK_32(1) => 0x00000001
2742 * BIT_LEN_MASK_32(2) => 0x00000003
2743 * BIT_LEN_MASK_32(32) => 0xFFFFFFFF
2744 */
2745 #define BIT_LEN_MASK_32(__bitlen) \
2746 (0xFFFFFFFF >> (32 - (__bitlen)))
2747 #define BIT_LEN_MASK_16(__bitlen) \
2748 (0xFFFF >> (16 - (__bitlen)))
2749 #define BIT_LEN_MASK_8(__bitlen) \
2750 (0xFF >> (8 - (__bitlen)))
2751
2752 /* Create an offset bit mask
2753 * Examples:
2754 * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
2755 * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
2756 */
2757 #define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
2758 (BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
2759 #define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
2760 (BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
2761 #define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
2762 (BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
2763
2764 /*Description:
2765 * Return 4-byte value in host byte ordering from
2766 * 4-byte pointer in little-endian system.
2767 */
2768 #define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
2769 (EF4BYTE(*((__le32 *)(__pstart))))
2770 #define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
2771 (EF2BYTE(*((__le16 *)(__pstart))))
2772 #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
2773 (EF1BYTE(*((u8 *)(__pstart))))
2774
2775 /*Description:
2776 Translate subfield (continuous bits in little-endian) of 4-byte
2777 value to host byte ordering.*/
2778 #define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
2779 ( \
2780 (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \
2781 BIT_LEN_MASK_32(__bitlen) \
2782 )
2783 #define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
2784 ( \
2785 (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
2786 BIT_LEN_MASK_16(__bitlen) \
2787 )
2788 #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
2789 ( \
2790 (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
2791 BIT_LEN_MASK_8(__bitlen) \
2792 )
2793
2794 /* Description:
2795 * Mask subfield (continuous bits in little-endian) of 4-byte value
2796 * and return the result in 4-byte value in host byte ordering.
2797 */
2798 #define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
2799 ( \
2800 LE_P4BYTE_TO_HOST_4BYTE(__pstart) & \
2801 (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
2802 )
2803 #define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
2804 ( \
2805 LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
2806 (~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
2807 )
2808 #define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
2809 ( \
2810 LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
2811 (~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
2812 )
2813
2814 /* Description:
2815 * Set subfield of little-endian 4-byte value to specified value.
2816 */
2817 #define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
2818 *((u32 *)(__pstart)) = \
2819 ( \
2820 LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
2821 ((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
2822 );
2823 #define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
2824 *((u16 *)(__pstart)) = \
2825 ( \
2826 LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
2827 ((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
2828 );
2829 #define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
2830 *((u8 *)(__pstart)) = EF1BYTE \
2831 ( \
2832 LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
2833 ((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
2834 );
2835
2836 #define N_BYTE_ALIGMENT(__value, __aligment) ((__aligment == 1) ? \
2837 (__value) : (((__value + __aligment - 1) / __aligment) * __aligment))
2838
2839 /****************************************
2840 mem access macro define end
2841 ****************************************/
2842
2843 #define byte(x, n) ((x >> (8 * n)) & 0xff)
2844
2845 #define packet_get_type(_packet) (EF1BYTE((_packet).octet[0]) & 0xFC)
2846 #define RTL_WATCH_DOG_TIME 2000
2847 #define MSECS(t) msecs_to_jiffies(t)
2848 #define WLAN_FC_GET_VERS(fc) (le16_to_cpu(fc) & IEEE80211_FCTL_VERS)
2849 #define WLAN_FC_GET_TYPE(fc) (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE)
2850 #define WLAN_FC_GET_STYPE(fc) (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE)
2851 #define WLAN_FC_MORE_DATA(fc) (le16_to_cpu(fc) & IEEE80211_FCTL_MOREDATA)
2852 #define rtl_dm(rtlpriv) (&((rtlpriv)->dm))
2853
2854 #define RT_RF_OFF_LEVL_ASPM BIT(0) /*PCI ASPM */
2855 #define RT_RF_OFF_LEVL_CLK_REQ BIT(1) /*PCI clock request */
2856 #define RT_RF_OFF_LEVL_PCI_D3 BIT(2) /*PCI D3 mode */
2857 /*NIC halt, re-initialize hw parameters*/
2858 #define RT_RF_OFF_LEVL_HALT_NIC BIT(3)
2859 #define RT_RF_OFF_LEVL_FREE_FW BIT(4) /*FW free, re-download the FW */
2860 #define RT_RF_OFF_LEVL_FW_32K BIT(5) /*FW in 32k */
2861 /*Always enable ASPM and Clock Req in initialization.*/
2862 #define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6)
2863 /* no matter RFOFF or SLEEP we set PS_ASPM_LEVL*/
2864 #define RT_PS_LEVEL_ASPM BIT(7)
2865 /*When LPS is on, disable 2R if no packet is received or transmittd.*/
2866 #define RT_RF_LPS_DISALBE_2R BIT(30)
2867 #define RT_RF_LPS_LEVEL_ASPM BIT(31) /*LPS with ASPM */
2868 #define RT_IN_PS_LEVEL(ppsc, _ps_flg) \
2869 ((ppsc->cur_ps_level & _ps_flg) ? true : false)
2870 #define RT_CLEAR_PS_LEVEL(ppsc, _ps_flg) \
2871 (ppsc->cur_ps_level &= (~(_ps_flg)))
2872 #define RT_SET_PS_LEVEL(ppsc, _ps_flg) \
2873 (ppsc->cur_ps_level |= _ps_flg)
2874
2875 #define container_of_dwork_rtl(x, y, z) \
2876 container_of(container_of(x, struct delayed_work, work), y, z)
2877
2878 #define FILL_OCTET_STRING(_os, _octet, _len) \
2879 (_os).octet = (u8 *)(_octet); \
2880 (_os).length = (_len);
2881
2882 #define CP_MACADDR(des, src) \
2883 ((des)[0] = (src)[0], (des)[1] = (src)[1],\
2884 (des)[2] = (src)[2], (des)[3] = (src)[3],\
2885 (des)[4] = (src)[4], (des)[5] = (src)[5])
2886
2887 #define LDPC_HT_ENABLE_RX BIT(0)
2888 #define LDPC_HT_ENABLE_TX BIT(1)
2889 #define LDPC_HT_TEST_TX_ENABLE BIT(2)
2890 #define LDPC_HT_CAP_TX BIT(3)
2891
2892 #define STBC_HT_ENABLE_RX BIT(0)
2893 #define STBC_HT_ENABLE_TX BIT(1)
2894 #define STBC_HT_TEST_TX_ENABLE BIT(2)
2895 #define STBC_HT_CAP_TX BIT(3)
2896
2897 #define LDPC_VHT_ENABLE_RX BIT(0)
2898 #define LDPC_VHT_ENABLE_TX BIT(1)
2899 #define LDPC_VHT_TEST_TX_ENABLE BIT(2)
2900 #define LDPC_VHT_CAP_TX BIT(3)
2901
2902 #define STBC_VHT_ENABLE_RX BIT(0)
2903 #define STBC_VHT_ENABLE_TX BIT(1)
2904 #define STBC_VHT_TEST_TX_ENABLE BIT(2)
2905 #define STBC_VHT_CAP_TX BIT(3)
2906
2907 static inline u8 rtl_read_byte(struct rtl_priv *rtlpriv, u32 addr)
2908 {
2909 return rtlpriv->io.read8_sync(rtlpriv, addr);
2910 }
2911
2912 static inline u16 rtl_read_word(struct rtl_priv *rtlpriv, u32 addr)
2913 {
2914 return rtlpriv->io.read16_sync(rtlpriv, addr);
2915 }
2916
2917 static inline u32 rtl_read_dword(struct rtl_priv *rtlpriv, u32 addr)
2918 {
2919 return rtlpriv->io.read32_sync(rtlpriv, addr);
2920 }
2921
2922 static inline void rtl_write_byte(struct rtl_priv *rtlpriv, u32 addr, u8 val8)
2923 {
2924 rtlpriv->io.write8_async(rtlpriv, addr, val8);
2925
2926 if (rtlpriv->cfg->write_readback)
2927 rtlpriv->io.read8_sync(rtlpriv, addr);
2928 }
2929
2930 static inline void rtl_write_word(struct rtl_priv *rtlpriv, u32 addr, u16 val16)
2931 {
2932 rtlpriv->io.write16_async(rtlpriv, addr, val16);
2933
2934 if (rtlpriv->cfg->write_readback)
2935 rtlpriv->io.read16_sync(rtlpriv, addr);
2936 }
2937
2938 static inline void rtl_write_dword(struct rtl_priv *rtlpriv,
2939 u32 addr, u32 val32)
2940 {
2941 rtlpriv->io.write32_async(rtlpriv, addr, val32);
2942
2943 if (rtlpriv->cfg->write_readback)
2944 rtlpriv->io.read32_sync(rtlpriv, addr);
2945 }
2946
2947 static inline u32 rtl_get_bbreg(struct ieee80211_hw *hw,
2948 u32 regaddr, u32 bitmask)
2949 {
2950 struct rtl_priv *rtlpriv = hw->priv;
2951
2952 return rtlpriv->cfg->ops->get_bbreg(hw, regaddr, bitmask);
2953 }
2954
2955 static inline void rtl_set_bbreg(struct ieee80211_hw *hw, u32 regaddr,
2956 u32 bitmask, u32 data)
2957 {
2958 struct rtl_priv *rtlpriv = hw->priv;
2959
2960 rtlpriv->cfg->ops->set_bbreg(hw, regaddr, bitmask, data);
2961 }
2962
2963 static inline u32 rtl_get_rfreg(struct ieee80211_hw *hw,
2964 enum radio_path rfpath, u32 regaddr,
2965 u32 bitmask)
2966 {
2967 struct rtl_priv *rtlpriv = hw->priv;
2968
2969 return rtlpriv->cfg->ops->get_rfreg(hw, rfpath, regaddr, bitmask);
2970 }
2971
2972 static inline void rtl_set_rfreg(struct ieee80211_hw *hw,
2973 enum radio_path rfpath, u32 regaddr,
2974 u32 bitmask, u32 data)
2975 {
2976 struct rtl_priv *rtlpriv = hw->priv;
2977
2978 rtlpriv->cfg->ops->set_rfreg(hw, rfpath, regaddr, bitmask, data);
2979 }
2980
2981 static inline bool is_hal_stop(struct rtl_hal *rtlhal)
2982 {
2983 return (_HAL_STATE_STOP == rtlhal->state);
2984 }
2985
2986 static inline void set_hal_start(struct rtl_hal *rtlhal)
2987 {
2988 rtlhal->state = _HAL_STATE_START;
2989 }
2990
2991 static inline void set_hal_stop(struct rtl_hal *rtlhal)
2992 {
2993 rtlhal->state = _HAL_STATE_STOP;
2994 }
2995
2996 static inline u8 get_rf_type(struct rtl_phy *rtlphy)
2997 {
2998 return rtlphy->rf_type;
2999 }
3000
3001 static inline struct ieee80211_hdr *rtl_get_hdr(struct sk_buff *skb)
3002 {
3003 return (struct ieee80211_hdr *)(skb->data);
3004 }
3005
3006 static inline __le16 rtl_get_fc(struct sk_buff *skb)
3007 {
3008 return rtl_get_hdr(skb)->frame_control;
3009 }
3010
3011 static inline u16 rtl_get_tid_h(struct ieee80211_hdr *hdr)
3012 {
3013 return (ieee80211_get_qos_ctl(hdr))[0] & IEEE80211_QOS_CTL_TID_MASK;
3014 }
3015
3016 static inline u16 rtl_get_tid(struct sk_buff *skb)
3017 {
3018 return rtl_get_tid_h(rtl_get_hdr(skb));
3019 }
3020
3021 static inline struct ieee80211_sta *get_sta(struct ieee80211_hw *hw,
3022 struct ieee80211_vif *vif,
3023 const u8 *bssid)
3024 {
3025 return ieee80211_find_sta(vif, bssid);
3026 }
3027
3028 static inline struct ieee80211_sta *rtl_find_sta(struct ieee80211_hw *hw,
3029 u8 *mac_addr)
3030 {
3031 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3032 return ieee80211_find_sta(mac->vif, mac_addr);
3033 }
3034
3035 #endif 1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28 #ifndef __RTL92CE_TABLE__H_
29 #define __RTL92CE_TABLE__H_
30
31 #include <linux/types.h>
32 #define RTL8188EEPHY_REG_1TARRAYLEN 382
33 extern u32 RTL8188EEPHY_REG_1TARRAY[];
34 #define RTL8188EEPHY_REG_ARRAY_PGLEN 264
35 extern u32 RTL8188EEPHY_REG_ARRAY_PG[];
36 #define RTL8188EE_RADIOA_1TARRAYLEN 190
37 extern u32 RTL8188EE_RADIOA_1TARRAY[];
38 #define RTL8188EEMAC_1T_ARRAYLEN 180
39 extern u32 RTL8188EEMAC_1T_ARRAY[];
40 #define RTL8188EEAGCTAB_1TARRAYLEN 256
41 extern u32 RTL8188EEAGCTAB_1TARRAY[];
42
43 #endif 1 #ifndef _LDV_RCV_H_
2 #define _LDV_RCV_H_
3
4 /* If expr evaluates to zero, ldv_assert() causes a program to reach the error
5 label like the standard assert(). */
6 #define ldv_assert(expr) ((expr) ? 0 : ldv_error())
7
8 /* The error label wrapper. It is used because of some static verifiers (like
9 BLAST) don't accept multiple error labels through a program. */
10 static inline void ldv_error(void)
11 {
12 LDV_ERROR: goto LDV_ERROR;
13 }
14
15 /* If expr evaluates to zero, ldv_assume() causes an infinite loop that is
16 avoided by verifiers. */
17 #define ldv_assume(expr) ((expr) ? 0 : ldv_stop())
18
19 /* Infinite loop, that causes verifiers to skip such paths. */
20 static inline void ldv_stop(void) {
21 LDV_STOP: goto LDV_STOP;
22 }
23
24 /* Special nondeterministic functions. */
25 int ldv_undef_int(void);
26 void *ldv_undef_ptr(void);
27 unsigned long ldv_undef_ulong(void);
28 long ldv_undef_long(void);
29 /* Return nondeterministic negative integer number. */
30 static inline int ldv_undef_int_negative(void)
31 {
32 int ret = ldv_undef_int();
33
34 ldv_assume(ret < 0);
35
36 return ret;
37 }
38 /* Return nondeterministic nonpositive integer number. */
39 static inline int ldv_undef_int_nonpositive(void)
40 {
41 int ret = ldv_undef_int();
42
43 ldv_assume(ret <= 0);
44
45 return ret;
46 }
47
48 /* Add explicit model for __builin_expect GCC function. Without the model a
49 return value will be treated as nondetermined by verifiers. */
50 static inline long __builtin_expect(long exp, long c)
51 {
52 return exp;
53 }
54
55 /* This function causes the program to exit abnormally. GCC implements this
56 function by using a target-dependent mechanism (such as intentionally executing
57 an illegal instruction) or by calling abort. The mechanism used may vary from
58 release to release so you should not rely on any particular implementation.
59 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html */
60 static inline void __builtin_trap(void)
61 {
62 ldv_assert(0);
63 }
64
65 /* The constant is for simulating an error of ldv_undef_ptr() function. */
66 #define LDV_PTR_MAX 2012
67
68 #endif /* _LDV_RCV_H_ */ |
Here is an explanation of a rule violation arisen while checking your driver against a corresponding kernel.
Note that it may be false positive, i.e. there isn't a real error indeed. Please analyze a given error trace and related source code to understand whether there is an error in your driver.
Error trace column contains a path on which the given rule is violated. You can expand/collapse some entity classes by clicking on corresponding checkboxes in a main menu or in an advanced Others menu. Also you can expand/collapse each particular entity by clicking on +/-. In hovering on some entities you can see some tips. Also the error trace is bound with related source code. Line numbers may be shown as links on the left. You can click on them to open corresponding lines in source code.
Source code column contains a content of files related with the error trace. There is source code of your driver (note that there are some LDV modifications at the end), kernel headers and rule model. Tabs show a currently opened file and other available files. In hovering on them you can see full file names. On clicking a corresponding file content will be shown.
Kernel | Module | Rule | Verifier | Verdict | Status | Timestamp | Bug report |
linux-4.5-rc7 | drivers/net/wireless/realtek/rtlwifi/rtl8188ee/rtl8188ee.ko | races | CPAchecker | Bug | Fixed | 2016-03-14 16:42:17 | L0232 |
Comment
rtl8723be_dm_watchdog is called from rtl_watchdog_wq_callback, there are no synchronization primitives. Is it a real bug?
[Home]