1 // SPDX-License-Identifier: GPL-2.0-only
3 * RTL8XXXU mac80211 USB driver - 8188e specific subdriver
5 * Copyright (c) 2014 - 2016 Jes Sorensen <Jes.Sorensen@gmail.com>
7 * Portions, notably calibration code:
8 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
10 * This driver was written as a replacement for the vendor provided
11 * rtl8723au driver. As the Realtek 8xxx chips are very similar in
12 * their programming interface, I have started adding support for
13 * additional 8xxx chips like the 8192cu, 8188cus, etc.
16 #include <linux/init.h>
17 #include <linux/kernel.h>
18 #include <linux/sched.h>
19 #include <linux/errno.h>
20 #include <linux/slab.h>
21 #include <linux/module.h>
22 #include <linux/spinlock.h>
23 #include <linux/list.h>
24 #include <linux/usb.h>
25 #include <linux/netdevice.h>
26 #include <linux/etherdevice.h>
27 #include <linux/ethtool.h>
28 #include <linux/wireless.h>
29 #include <linux/firmware.h>
30 #include <linux/moduleparam.h>
31 #include <net/mac80211.h>
33 #include "rtl8xxxu_regs.h"
35 static const struct rtl8xxxu_reg8val rtl8188e_mac_init_table[] = {
36 {0x026, 0x41}, {0x027, 0x35}, {0x040, 0x00}, {0x421, 0x0f},
37 {0x428, 0x0a}, {0x429, 0x10}, {0x430, 0x00}, {0x431, 0x01},
38 {0x432, 0x02}, {0x433, 0x04}, {0x434, 0x05}, {0x435, 0x06},
39 {0x436, 0x07}, {0x437, 0x08}, {0x438, 0x00}, {0x439, 0x00},
40 {0x43a, 0x01}, {0x43b, 0x02}, {0x43c, 0x04}, {0x43d, 0x05},
41 {0x43e, 0x06}, {0x43f, 0x07}, {0x440, 0x5d}, {0x441, 0x01},
42 {0x442, 0x00}, {0x444, 0x15}, {0x445, 0xf0}, {0x446, 0x0f},
43 {0x447, 0x00}, {0x458, 0x41}, {0x459, 0xa8}, {0x45a, 0x72},
44 {0x45b, 0xb9}, {0x460, 0x66}, {0x461, 0x66}, {0x480, 0x08},
45 {0x4c8, 0xff}, {0x4c9, 0x08}, {0x4cc, 0xff}, {0x4cd, 0xff},
46 {0x4ce, 0x01}, {0x4d3, 0x01}, {0x500, 0x26}, {0x501, 0xa2},
47 {0x502, 0x2f}, {0x503, 0x00}, {0x504, 0x28}, {0x505, 0xa3},
48 {0x506, 0x5e}, {0x507, 0x00}, {0x508, 0x2b}, {0x509, 0xa4},
49 {0x50a, 0x5e}, {0x50b, 0x00}, {0x50c, 0x4f}, {0x50d, 0xa4},
50 {0x50e, 0x00}, {0x50f, 0x00}, {0x512, 0x1c}, {0x514, 0x0a},
51 {0x516, 0x0a}, {0x525, 0x4f}, {0x550, 0x10}, {0x551, 0x10},
52 {0x559, 0x02}, {0x55d, 0xff}, {0x605, 0x30}, {0x608, 0x0e},
53 {0x609, 0x2a}, {0x620, 0xff}, {0x621, 0xff}, {0x622, 0xff},
54 {0x623, 0xff}, {0x624, 0xff}, {0x625, 0xff}, {0x626, 0xff},
55 {0x627, 0xff}, {0x63c, 0x08}, {0x63d, 0x08}, {0x63e, 0x0c},
56 {0x63f, 0x0c}, {0x640, 0x40}, {0x652, 0x20}, {0x66e, 0x05},
57 {0x700, 0x21}, {0x701, 0x43}, {0x702, 0x65}, {0x703, 0x87},
58 {0x708, 0x21}, {0x709, 0x43}, {0x70a, 0x65}, {0x70b, 0x87},
62 static const struct rtl8xxxu_reg32val rtl8188eu_phy_init_table[] = {
63 {0x800, 0x80040000}, {0x804, 0x00000003},
64 {0x808, 0x0000fc00}, {0x80c, 0x0000000a},
65 {0x810, 0x10001331}, {0x814, 0x020c3d10},
66 {0x818, 0x02200385}, {0x81c, 0x00000000},
67 {0x820, 0x01000100}, {0x824, 0x00390204},
68 {0x828, 0x00000000}, {0x82c, 0x00000000},
69 {0x830, 0x00000000}, {0x834, 0x00000000},
70 {0x838, 0x00000000}, {0x83c, 0x00000000},
71 {0x840, 0x00010000}, {0x844, 0x00000000},
72 {0x848, 0x00000000}, {0x84c, 0x00000000},
73 {0x850, 0x00000000}, {0x854, 0x00000000},
74 {0x858, 0x569a11a9}, {0x85c, 0x01000014},
75 {0x860, 0x66f60110}, {0x864, 0x061f0649},
76 {0x868, 0x00000000}, {0x86c, 0x27272700},
77 {0x870, 0x07000760}, {0x874, 0x25004000},
78 {0x878, 0x00000808}, {0x87c, 0x00000000},
79 {0x880, 0xb0000c1c}, {0x884, 0x00000001},
80 {0x888, 0x00000000}, {0x88c, 0xccc000c0},
81 {0x890, 0x00000800}, {0x894, 0xfffffffe},
82 {0x898, 0x40302010}, {0x89c, 0x00706050},
83 {0x900, 0x00000000}, {0x904, 0x00000023},
84 {0x908, 0x00000000}, {0x90c, 0x81121111},
85 {0x910, 0x00000002}, {0x914, 0x00000201},
86 {0xa00, 0x00d047c8}, {0xa04, 0x80ff800c},
87 {0xa08, 0x8c838300}, {0xa0c, 0x2e7f120f},
88 {0xa10, 0x9500bb7e}, {0xa14, 0x1114d028},
89 {0xa18, 0x00881117}, {0xa1c, 0x89140f00},
90 {0xa20, 0x1a1b0000}, {0xa24, 0x090e1317},
91 {0xa28, 0x00000204}, {0xa2c, 0x00d30000},
92 {0xa70, 0x101fbf00}, {0xa74, 0x00000007},
93 {0xa78, 0x00000900}, {0xa7c, 0x225b0606},
94 {0xa80, 0x218075b1}, {0xb2c, 0x80000000},
95 {0xc00, 0x48071d40}, {0xc04, 0x03a05611},
96 {0xc08, 0x000000e4}, {0xc0c, 0x6c6c6c6c},
97 {0xc10, 0x08800000}, {0xc14, 0x40000100},
98 {0xc18, 0x08800000}, {0xc1c, 0x40000100},
99 {0xc20, 0x00000000}, {0xc24, 0x00000000},
100 {0xc28, 0x00000000}, {0xc2c, 0x00000000},
101 {0xc30, 0x69e9ac47}, {0xc34, 0x469652af},
102 {0xc38, 0x49795994}, {0xc3c, 0x0a97971c},
103 {0xc40, 0x1f7c403f}, {0xc44, 0x000100b7},
104 {0xc48, 0xec020107}, {0xc4c, 0x007f037f},
105 {0xc50, 0x69553420}, {0xc54, 0x43bc0094},
106 {0xc58, 0x00013169}, {0xc5c, 0x00250492},
107 {0xc60, 0x00000000}, {0xc64, 0x7112848b},
108 {0xc68, 0x47c00bff}, {0xc6c, 0x00000036},
109 {0xc70, 0x2c7f000d}, {0xc74, 0x020610db},
110 {0xc78, 0x0000001f}, {0xc7c, 0x00b91612},
111 {0xc80, 0x390000e4}, {0xc84, 0x21f60000},
112 {0xc88, 0x40000100}, {0xc8c, 0x20200000},
113 {0xc90, 0x00091521}, {0xc94, 0x00000000},
114 {0xc98, 0x00121820}, {0xc9c, 0x00007f7f},
115 {0xca0, 0x00000000}, {0xca4, 0x000300a0},
116 {0xca8, 0x00000000}, {0xcac, 0x00000000},
117 {0xcb0, 0x00000000}, {0xcb4, 0x00000000},
118 {0xcb8, 0x00000000}, {0xcbc, 0x28000000},
119 {0xcc0, 0x00000000}, {0xcc4, 0x00000000},
120 {0xcc8, 0x00000000}, {0xccc, 0x00000000},
121 {0xcd0, 0x00000000}, {0xcd4, 0x00000000},
122 {0xcd8, 0x64b22427}, {0xcdc, 0x00766932},
123 {0xce0, 0x00222222}, {0xce4, 0x00000000},
124 {0xce8, 0x37644302}, {0xcec, 0x2f97d40c},
125 {0xd00, 0x00000740}, {0xd04, 0x00020401},
126 {0xd08, 0x0000907f}, {0xd0c, 0x20010201},
127 {0xd10, 0xa0633333}, {0xd14, 0x3333bc43},
128 {0xd18, 0x7a8f5b6f}, {0xd2c, 0xcc979975},
129 {0xd30, 0x00000000}, {0xd34, 0x80608000},
130 {0xd38, 0x00000000}, {0xd3c, 0x00127353},
131 {0xd40, 0x00000000}, {0xd44, 0x00000000},
132 {0xd48, 0x00000000}, {0xd4c, 0x00000000},
133 {0xd50, 0x6437140a}, {0xd54, 0x00000000},
134 {0xd58, 0x00000282}, {0xd5c, 0x30032064},
135 {0xd60, 0x4653de68}, {0xd64, 0x04518a3c},
136 {0xd68, 0x00002101}, {0xd6c, 0x2a201c16},
137 {0xd70, 0x1812362e}, {0xd74, 0x322c2220},
138 {0xd78, 0x000e3c24}, {0xe00, 0x2d2d2d2d},
139 {0xe04, 0x2d2d2d2d}, {0xe08, 0x0390272d},
140 {0xe10, 0x2d2d2d2d}, {0xe14, 0x2d2d2d2d},
141 {0xe18, 0x2d2d2d2d}, {0xe1c, 0x2d2d2d2d},
142 {0xe28, 0x00000000}, {0xe30, 0x1000dc1f},
143 {0xe34, 0x10008c1f}, {0xe38, 0x02140102},
144 {0xe3c, 0x681604c2}, {0xe40, 0x01007c00},
145 {0xe44, 0x01004800}, {0xe48, 0xfb000000},
146 {0xe4c, 0x000028d1}, {0xe50, 0x1000dc1f},
147 {0xe54, 0x10008c1f}, {0xe58, 0x02140102},
148 {0xe5c, 0x28160d05}, {0xe60, 0x00000048},
149 {0xe68, 0x001b25a4}, {0xe6c, 0x00c00014},
150 {0xe70, 0x00c00014}, {0xe74, 0x01000014},
151 {0xe78, 0x01000014}, {0xe7c, 0x01000014},
152 {0xe80, 0x01000014}, {0xe84, 0x00c00014},
153 {0xe88, 0x01000014}, {0xe8c, 0x00c00014},
154 {0xed0, 0x00c00014}, {0xed4, 0x00c00014},
155 {0xed8, 0x00c00014}, {0xedc, 0x00000014},
156 {0xee0, 0x00000014}, {0xee8, 0x21555448},
157 {0xeec, 0x01c00014}, {0xf14, 0x00000003},
158 {0xf4c, 0x00000000}, {0xf00, 0x00000300},
159 {0xffff, 0xffffffff},
162 static const struct rtl8xxxu_reg32val rtl8188e_agc_table[] = {
163 {0xc78, 0xfb000001}, {0xc78, 0xfb010001},
164 {0xc78, 0xfb020001}, {0xc78, 0xfb030001},
165 {0xc78, 0xfb040001}, {0xc78, 0xfb050001},
166 {0xc78, 0xfa060001}, {0xc78, 0xf9070001},
167 {0xc78, 0xf8080001}, {0xc78, 0xf7090001},
168 {0xc78, 0xf60a0001}, {0xc78, 0xf50b0001},
169 {0xc78, 0xf40c0001}, {0xc78, 0xf30d0001},
170 {0xc78, 0xf20e0001}, {0xc78, 0xf10f0001},
171 {0xc78, 0xf0100001}, {0xc78, 0xef110001},
172 {0xc78, 0xee120001}, {0xc78, 0xed130001},
173 {0xc78, 0xec140001}, {0xc78, 0xeb150001},
174 {0xc78, 0xea160001}, {0xc78, 0xe9170001},
175 {0xc78, 0xe8180001}, {0xc78, 0xe7190001},
176 {0xc78, 0xe61a0001}, {0xc78, 0xe51b0001},
177 {0xc78, 0xe41c0001}, {0xc78, 0xe31d0001},
178 {0xc78, 0xe21e0001}, {0xc78, 0xe11f0001},
179 {0xc78, 0x8a200001}, {0xc78, 0x89210001},
180 {0xc78, 0x88220001}, {0xc78, 0x87230001},
181 {0xc78, 0x86240001}, {0xc78, 0x85250001},
182 {0xc78, 0x84260001}, {0xc78, 0x83270001},
183 {0xc78, 0x82280001}, {0xc78, 0x6b290001},
184 {0xc78, 0x6a2a0001}, {0xc78, 0x692b0001},
185 {0xc78, 0x682c0001}, {0xc78, 0x672d0001},
186 {0xc78, 0x662e0001}, {0xc78, 0x652f0001},
187 {0xc78, 0x64300001}, {0xc78, 0x63310001},
188 {0xc78, 0x62320001}, {0xc78, 0x61330001},
189 {0xc78, 0x46340001}, {0xc78, 0x45350001},
190 {0xc78, 0x44360001}, {0xc78, 0x43370001},
191 {0xc78, 0x42380001}, {0xc78, 0x41390001},
192 {0xc78, 0x403a0001}, {0xc78, 0x403b0001},
193 {0xc78, 0x403c0001}, {0xc78, 0x403d0001},
194 {0xc78, 0x403e0001}, {0xc78, 0x403f0001},
195 {0xc78, 0xfb400001}, {0xc78, 0xfb410001},
196 {0xc78, 0xfb420001}, {0xc78, 0xfb430001},
197 {0xc78, 0xfb440001}, {0xc78, 0xfb450001},
198 {0xc78, 0xfb460001}, {0xc78, 0xfb470001},
199 {0xc78, 0xfb480001}, {0xc78, 0xfa490001},
200 {0xc78, 0xf94a0001}, {0xc78, 0xf84b0001},
201 {0xc78, 0xf74c0001}, {0xc78, 0xf64d0001},
202 {0xc78, 0xf54e0001}, {0xc78, 0xf44f0001},
203 {0xc78, 0xf3500001}, {0xc78, 0xf2510001},
204 {0xc78, 0xf1520001}, {0xc78, 0xf0530001},
205 {0xc78, 0xef540001}, {0xc78, 0xee550001},
206 {0xc78, 0xed560001}, {0xc78, 0xec570001},
207 {0xc78, 0xeb580001}, {0xc78, 0xea590001},
208 {0xc78, 0xe95a0001}, {0xc78, 0xe85b0001},
209 {0xc78, 0xe75c0001}, {0xc78, 0xe65d0001},
210 {0xc78, 0xe55e0001}, {0xc78, 0xe45f0001},
211 {0xc78, 0xe3600001}, {0xc78, 0xe2610001},
212 {0xc78, 0xc3620001}, {0xc78, 0xc2630001},
213 {0xc78, 0xc1640001}, {0xc78, 0x8b650001},
214 {0xc78, 0x8a660001}, {0xc78, 0x89670001},
215 {0xc78, 0x88680001}, {0xc78, 0x87690001},
216 {0xc78, 0x866a0001}, {0xc78, 0x856b0001},
217 {0xc78, 0x846c0001}, {0xc78, 0x676d0001},
218 {0xc78, 0x666e0001}, {0xc78, 0x656f0001},
219 {0xc78, 0x64700001}, {0xc78, 0x63710001},
220 {0xc78, 0x62720001}, {0xc78, 0x61730001},
221 {0xc78, 0x60740001}, {0xc78, 0x46750001},
222 {0xc78, 0x45760001}, {0xc78, 0x44770001},
223 {0xc78, 0x43780001}, {0xc78, 0x42790001},
224 {0xc78, 0x417a0001}, {0xc78, 0x407b0001},
225 {0xc78, 0x407c0001}, {0xc78, 0x407d0001},
226 {0xc78, 0x407e0001}, {0xc78, 0x407f0001},
227 {0xc50, 0x69553422}, {0xc50, 0x69553420},
231 static const struct rtl8xxxu_rfregval rtl8188eu_radioa_init_table[] = {
232 {0x00, 0x00030000}, {0x08, 0x00084000},
233 {0x18, 0x00000407}, {0x19, 0x00000012},
234 {0x1e, 0x00080009}, {0x1f, 0x00000880},
235 {0x2f, 0x0001a060}, {0x3f, 0x00000000},
236 {0x42, 0x000060c0}, {0x57, 0x000d0000},
237 {0x58, 0x000be180}, {0x67, 0x00001552},
238 {0x83, 0x00000000}, {0xb0, 0x000ff8fc},
239 {0xb1, 0x00054400}, {0xb2, 0x000ccc19},
240 {0xb4, 0x00043003}, {0xb6, 0x0004953e},
241 {0xb7, 0x0001c718}, {0xb8, 0x000060ff},
242 {0xb9, 0x00080001}, {0xba, 0x00040000},
243 {0xbb, 0x00000400}, {0xbf, 0x000c0000},
244 {0xc2, 0x00002400}, {0xc3, 0x00000009},
245 {0xc4, 0x00040c91}, {0xc5, 0x00099999},
246 {0xc6, 0x000000a3}, {0xc7, 0x00088820},
247 {0xc8, 0x00076c06}, {0xc9, 0x00000000},
248 {0xca, 0x00080000}, {0xdf, 0x00000180},
249 {0xef, 0x000001a0}, {0x51, 0x0006b27d},
250 {0x52, 0x0007e49d}, /* Set to 0x0007e4dd for SDIO */
251 {0x53, 0x00000073}, {0x56, 0x00051ff3},
252 {0x35, 0x00000086}, {0x35, 0x00000186},
253 {0x35, 0x00000286}, {0x36, 0x00001c25},
254 {0x36, 0x00009c25}, {0x36, 0x00011c25},
255 {0x36, 0x00019c25}, {0xb6, 0x00048538},
256 {0x18, 0x00000c07}, {0x5a, 0x0004bd00},
257 {0x19, 0x000739d0}, {0x34, 0x0000adf3},
258 {0x34, 0x00009df0}, {0x34, 0x00008ded},
259 {0x34, 0x00007dea}, {0x34, 0x00006de7},
260 {0x34, 0x000054ee}, {0x34, 0x000044eb},
261 {0x34, 0x000034e8}, {0x34, 0x0000246b},
262 {0x34, 0x00001468}, {0x34, 0x0000006d},
263 {0x00, 0x00030159}, {0x84, 0x00068200},
264 {0x86, 0x000000ce}, {0x87, 0x00048a00},
265 {0x8e, 0x00065540}, {0x8f, 0x00088000},
266 {0xef, 0x000020a0}, {0x3b, 0x000f02b0},
267 {0x3b, 0x000ef7b0}, {0x3b, 0x000d4fb0},
268 {0x3b, 0x000cf060}, {0x3b, 0x000b0090},
269 {0x3b, 0x000a0080}, {0x3b, 0x00090080},
270 {0x3b, 0x0008f780}, {0x3b, 0x000722b0},
271 {0x3b, 0x0006f7b0}, {0x3b, 0x00054fb0},
272 {0x3b, 0x0004f060}, {0x3b, 0x00030090},
273 {0x3b, 0x00020080}, {0x3b, 0x00010080},
274 {0x3b, 0x0000f780}, {0xef, 0x000000a0},
275 {0x00, 0x00010159}, {0x18, 0x0000f407},
276 {0xFE, 0x00000000}, {0xFE, 0x00000000},
277 {0x1F, 0x00080003}, {0xFE, 0x00000000},
278 {0xFE, 0x00000000}, {0x1E, 0x00000001},
279 {0x1F, 0x00080000}, {0x00, 0x00033e60},
286 #define TX_RPT2_ITEM_SIZE 8
288 static const u8 retry_penalty[PERENTRY][RETRYSIZE + 1] = {
289 {5, 4, 3, 2, 0, 3}, /* 92 , idx=0 */
290 {6, 5, 4, 3, 0, 4}, /* 86 , idx=1 */
291 {6, 5, 4, 2, 0, 4}, /* 81 , idx=2 */
292 {8, 7, 6, 4, 0, 6}, /* 75 , idx=3 */
293 {10, 9, 8, 6, 0, 8}, /* 71 , idx=4 */
294 {10, 9, 8, 4, 0, 8}, /* 66 , idx=5 */
295 {10, 9, 8, 2, 0, 8}, /* 62 , idx=6 */
296 {10, 9, 8, 0, 0, 8}, /* 59 , idx=7 */
297 {18, 17, 16, 8, 0, 16}, /* 53 , idx=8 */
298 {26, 25, 24, 16, 0, 24}, /* 50 , idx=9 */
299 {34, 33, 32, 24, 0, 32}, /* 47 , idx=0x0a */
300 {34, 31, 28, 20, 0, 32}, /* 43 , idx=0x0b */
301 {34, 31, 27, 18, 0, 32}, /* 40 , idx=0x0c */
302 {34, 31, 26, 16, 0, 32}, /* 37 , idx=0x0d */
303 {34, 30, 22, 16, 0, 32}, /* 32 , idx=0x0e */
304 {34, 30, 24, 16, 0, 32}, /* 26 , idx=0x0f */
305 {49, 46, 40, 16, 0, 48}, /* 20 , idx=0x10 */
306 {49, 45, 32, 0, 0, 48}, /* 17 , idx=0x11 */
307 {49, 45, 22, 18, 0, 48}, /* 15 , idx=0x12 */
308 {49, 40, 24, 16, 0, 48}, /* 12 , idx=0x13 */
309 {49, 32, 18, 12, 0, 48}, /* 9 , idx=0x14 */
310 {49, 22, 18, 14, 0, 48}, /* 6 , idx=0x15 */
311 {49, 16, 16, 0, 0, 48} /* 3, idx=0x16 */
314 static const u8 pt_penalty[RETRYSIZE + 1] = {34, 31, 30, 24, 0, 32};
316 static const u8 retry_penalty_idx_normal[2][RATESIZE] = {
319 4, 4, 5, 7, 7, 7, 8, 0x0a,
320 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
321 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f
324 0x0a, 0x0a, 0x0b, 0x0c,
325 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x13,
326 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x13, 0x13,
327 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13
331 static const u8 retry_penalty_idx_cut_i[2][RATESIZE] = {
334 4, 4, 5, 7, 7, 7, 8, 0x0a,
335 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
336 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f
339 0x0a, 0x0a, 0x0b, 0x0c,
340 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x13,
341 0x06, 0x07, 0x08, 0x0d, 0x0e, 0x11, 0x11, 0x11,
342 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13
346 static const u8 retry_penalty_up_idx_normal[RATESIZE] = {
347 0x0c, 0x0d, 0x0d, 0x0f,
348 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x12, 0x13, 0x14,
349 0x0f, 0x10, 0x10, 0x12, 0x12, 0x13, 0x14, 0x15,
350 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15
353 static const u8 retry_penalty_up_idx_cut_i[RATESIZE] = {
354 0x0c, 0x0d, 0x0d, 0x0f,
355 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x12, 0x13, 0x14,
356 0x0b, 0x0b, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12,
357 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15
360 static const u8 rssi_threshold[RATESIZE] = {
362 0, 0, 0, 0, 0, 0x24, 0x26, 0x2a,
363 0x18, 0x1a, 0x1d, 0x1f, 0x21, 0x27, 0x29, 0x2a,
364 0, 0, 0, 0x1f, 0x23, 0x28, 0x2a, 0x2c
367 static const u16 n_threshold_high[RATESIZE] = {
369 24, 36, 48, 72, 96, 144, 192, 216,
370 60, 80, 100, 160, 240, 400, 600, 800,
371 300, 320, 480, 720, 1000, 1200, 1600, 2000
374 static const u16 n_threshold_low[RATESIZE] = {
376 12, 18, 24, 36, 48, 72, 96, 108,
377 30, 40, 50, 80, 120, 200, 300, 400,
378 150, 160, 240, 360, 500, 600, 800, 1000
381 static const u8 dropping_necessary[RATESIZE] = {
383 1, 2, 3, 4, 5, 6, 7, 8,
384 1, 2, 3, 4, 5, 6, 7, 8,
385 5, 6, 7, 8, 9, 10, 11, 12
388 static const u8 pending_for_rate_up_fail[5] = {2, 10, 24, 40, 60};
390 static const u16 dynamic_tx_rpt_timing[6] = {
391 0x186a, 0x30d4, 0x493e, 0x61a8, 0x7a12, 0x927c /* 200ms-1200ms */
394 enum rtl8188e_tx_rpt_timing {
400 static int rtl8188eu_identify_chip(struct rtl8xxxu_priv *priv)
402 struct device *dev = &priv->udev->dev;
406 strscpy(priv->chip_name, "8188EU", sizeof(priv->chip_name));
407 priv->rtl_chip = RTL8188E;
413 sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
414 priv->chip_cut = u32_get_bits(sys_cfg, SYS_CFG_CHIP_VERSION_MASK);
415 if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
416 dev_info(dev, "Unsupported test chip\n");
421 * TODO: At a glance, I cut requires a different firmware,
422 * different initialisation tables, and no software rate
423 * control. The vendor driver is not configured to handle
424 * I cut chips by default. Are there any in the wild?
426 if (priv->chip_cut == 8) {
427 dev_info(dev, "RTL8188EU cut I is not supported. Please complain about it at linux-wireless@vger.kernel.org.\n");
431 vendor = sys_cfg & SYS_CFG_VENDOR_ID;
432 rtl8xxxu_identify_vendor_1bit(priv, vendor);
434 ret = rtl8xxxu_config_endpoints_no_sie(priv);
439 static void rtl8188eu_config_channel(struct ieee80211_hw *hw)
441 struct rtl8xxxu_priv *priv = hw->priv;
444 int sec_ch_above, channel;
447 opmode = rtl8xxxu_read8(priv, REG_BW_OPMODE);
448 rsr = rtl8xxxu_read32(priv, REG_RESPONSE_RATE_SET);
449 channel = hw->conf.chandef.chan->hw_value;
451 switch (hw->conf.chandef.width) {
452 case NL80211_CHAN_WIDTH_20_NOHT:
453 case NL80211_CHAN_WIDTH_20:
454 opmode |= BW_OPMODE_20MHZ;
455 rtl8xxxu_write8(priv, REG_BW_OPMODE, opmode);
457 val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
458 val32 &= ~FPGA_RF_MODE;
459 rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
461 val32 = rtl8xxxu_read32(priv, REG_FPGA1_RF_MODE);
462 val32 &= ~FPGA_RF_MODE;
463 rtl8xxxu_write32(priv, REG_FPGA1_RF_MODE, val32);
465 case NL80211_CHAN_WIDTH_40:
466 if (hw->conf.chandef.center_freq1 >
467 hw->conf.chandef.chan->center_freq) {
475 opmode &= ~BW_OPMODE_20MHZ;
476 rtl8xxxu_write8(priv, REG_BW_OPMODE, opmode);
477 rsr &= ~RSR_RSC_BANDWIDTH_40M;
479 rsr |= RSR_RSC_LOWER_SUB_CHANNEL;
481 rsr |= RSR_RSC_UPPER_SUB_CHANNEL;
482 rtl8xxxu_write32(priv, REG_RESPONSE_RATE_SET, rsr);
484 val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
485 val32 |= FPGA_RF_MODE;
486 rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
488 val32 = rtl8xxxu_read32(priv, REG_FPGA1_RF_MODE);
489 val32 |= FPGA_RF_MODE;
490 rtl8xxxu_write32(priv, REG_FPGA1_RF_MODE, val32);
493 * Set Control channel to upper or lower. These settings
494 * are required only for 40MHz
496 val32 = rtl8xxxu_read32(priv, REG_CCK0_SYSTEM);
497 val32 &= ~CCK0_SIDEBAND;
499 val32 |= CCK0_SIDEBAND;
500 rtl8xxxu_write32(priv, REG_CCK0_SYSTEM, val32);
502 val32 = rtl8xxxu_read32(priv, REG_OFDM1_LSTF);
503 val32 &= ~OFDM_LSTF_PRIME_CH_MASK; /* 0xc00 */
505 val32 |= OFDM_LSTF_PRIME_CH_LOW;
507 val32 |= OFDM_LSTF_PRIME_CH_HIGH;
508 rtl8xxxu_write32(priv, REG_OFDM1_LSTF, val32);
510 val32 = rtl8xxxu_read32(priv, REG_FPGA0_POWER_SAVE);
511 val32 &= ~(FPGA0_PS_LOWER_CHANNEL | FPGA0_PS_UPPER_CHANNEL);
513 val32 |= FPGA0_PS_UPPER_CHANNEL;
515 val32 |= FPGA0_PS_LOWER_CHANNEL;
516 rtl8xxxu_write32(priv, REG_FPGA0_POWER_SAVE, val32);
523 for (i = RF_A; i < priv->rf_paths; i++) {
524 val32 = rtl8xxxu_read_rfreg(priv, i, RF6052_REG_MODE_AG);
525 u32p_replace_bits(&val32, channel, MODE_AG_CHANNEL_MASK);
526 rtl8xxxu_write_rfreg(priv, i, RF6052_REG_MODE_AG, val32);
529 for (i = RF_A; i < priv->rf_paths; i++) {
530 val32 = rtl8xxxu_read_rfreg(priv, i, RF6052_REG_MODE_AG);
531 val32 &= ~MODE_AG_BW_MASK;
532 if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40)
533 val32 |= MODE_AG_BW_40MHZ_8723B;
535 val32 |= MODE_AG_BW_20MHZ_8723B;
536 rtl8xxxu_write_rfreg(priv, i, RF6052_REG_MODE_AG, val32);
540 static void rtl8188eu_init_aggregation(struct rtl8xxxu_priv *priv)
542 u8 agg_ctrl, usb_spec;
544 usb_spec = rtl8xxxu_read8(priv, REG_USB_SPECIAL_OPTION);
545 usb_spec &= ~USB_SPEC_USB_AGG_ENABLE;
546 rtl8xxxu_write8(priv, REG_USB_SPECIAL_OPTION, usb_spec);
548 agg_ctrl = rtl8xxxu_read8(priv, REG_TRXDMA_CTRL);
549 agg_ctrl &= ~TRXDMA_CTRL_RXDMA_AGG_EN;
550 rtl8xxxu_write8(priv, REG_TRXDMA_CTRL, agg_ctrl);
553 static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
555 struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu;
557 if (efuse->rtl_id != cpu_to_le16(0x8129))
560 ether_addr_copy(priv->mac_addr, efuse->mac_addr);
562 memcpy(priv->cck_tx_power_index_A, efuse->tx_power_index_A.cck_base,
563 sizeof(efuse->tx_power_index_A.cck_base));
565 memcpy(priv->ht40_1s_tx_power_index_A,
566 efuse->tx_power_index_A.ht40_base,
567 sizeof(efuse->tx_power_index_A.ht40_base));
569 priv->default_crystal_cap = efuse->xtal_k & 0x3f;
574 static void rtl8188eu_reset_8051(struct rtl8xxxu_priv *priv)
578 sys_func = rtl8xxxu_read16(priv, REG_SYS_FUNC);
579 sys_func &= ~SYS_FUNC_CPU_ENABLE;
580 rtl8xxxu_write16(priv, REG_SYS_FUNC, sys_func);
582 sys_func |= SYS_FUNC_CPU_ENABLE;
583 rtl8xxxu_write16(priv, REG_SYS_FUNC, sys_func);
586 static int rtl8188eu_load_firmware(struct rtl8xxxu_priv *priv)
591 fw_name = "/*(DEBLOBBED)*/";
593 ret = rtl8xxxu_load_firmware(priv, fw_name);
598 static void rtl8188eu_init_phy_bb(struct rtl8xxxu_priv *priv)
603 val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC);
604 val16 |= SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB | SYS_FUNC_DIO_RF;
605 rtl8xxxu_write16(priv, REG_SYS_FUNC, val16);
608 * Per vendor driver, run power sequence before init of RF
610 val8 = RF_ENABLE | RF_RSTB | RF_SDMRSTB;
611 rtl8xxxu_write8(priv, REG_RF_CTRL, val8);
613 val8 = SYS_FUNC_USBA | SYS_FUNC_USBD |
614 SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB;
615 rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
617 rtl8xxxu_init_phy_regs(priv, rtl8188eu_phy_init_table);
618 rtl8xxxu_init_phy_regs(priv, rtl8188e_agc_table);
621 static int rtl8188eu_init_phy_rf(struct rtl8xxxu_priv *priv)
623 return rtl8xxxu_init_phy_rf(priv, rtl8188eu_radioa_init_table, RF_A);
626 static int rtl8188eu_iqk_path_a(struct rtl8xxxu_priv *priv)
628 u32 reg_eac, reg_e94, reg_e9c;
631 /* Path A IQK setting */
632 rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x10008c1c);
633 rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x30008c1c);
635 rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x8214032a);
636 rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160000);
638 /* LO calibration setting */
639 rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x00462911);
641 /* One shot, path A LOK & IQK */
642 rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000);
643 rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000);
648 reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2);
649 reg_e94 = rtl8xxxu_read32(priv, REG_TX_POWER_BEFORE_IQK_A);
650 reg_e9c = rtl8xxxu_read32(priv, REG_TX_POWER_AFTER_IQK_A);
652 if (!(reg_eac & BIT(28)) &&
653 ((reg_e94 & 0x03ff0000) != 0x01420000) &&
654 ((reg_e9c & 0x03ff0000) != 0x00420000))
660 static int rtl8188eu_rx_iqk_path_a(struct rtl8xxxu_priv *priv)
662 u32 reg_ea4, reg_eac, reg_e94, reg_e9c, val32;
666 val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
667 u32p_replace_bits(&val32, 0, 0xffffff00);
668 rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
670 /* Enable path A PA in TX IQK mode */
671 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, 0x800a0);
672 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x30000);
673 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f);
674 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0xf117b);
677 val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
678 u32p_replace_bits(&val32, 0x808000, 0xffffff00);
679 rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
682 rtl8xxxu_write32(priv, REG_TX_IQK, 0x01007c00);
683 rtl8xxxu_write32(priv, REG_RX_IQK, 0x81004800);
685 /* path-A IQK setting */
686 rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x10008c1c);
687 rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x30008c1c);
689 rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x82160804);
690 rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160000);
692 /* LO calibration setting */
693 rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x0046a911);
695 /* One shot, path A LOK & IQK */
696 rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000);
697 rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000);
702 reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2);
703 reg_e94 = rtl8xxxu_read32(priv, REG_TX_POWER_BEFORE_IQK_A);
704 reg_e9c = rtl8xxxu_read32(priv, REG_TX_POWER_AFTER_IQK_A);
706 if (!(reg_eac & BIT(28)) &&
707 ((reg_e94 & 0x03ff0000) != 0x01420000) &&
708 ((reg_e9c & 0x03ff0000) != 0x00420000))
714 (reg_e94 & 0x03ff0000) | ((reg_e9c >> 16) & 0x03ff);
715 rtl8xxxu_write32(priv, REG_TX_IQK, val32);
717 /* Modify RX IQK mode table */
718 val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
719 u32p_replace_bits(&val32, 0, 0xffffff00);
720 rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
722 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, 0x800a0);
723 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x30000);
724 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f);
725 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0xf7ffa);
728 val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
729 u32p_replace_bits(&val32, 0x808000, 0xffffff00);
730 rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
733 rtl8xxxu_write32(priv, REG_RX_IQK, 0x01004800);
735 /* Path A IQK setting */
736 rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x30008c1c);
737 rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x10008c1c);
739 rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x82160c05);
740 rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160c05);
742 /* LO calibration setting */
743 rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x0046a911);
745 /* One shot, path A LOK & IQK */
746 rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000);
747 rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000);
751 reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2);
752 reg_ea4 = rtl8xxxu_read32(priv, REG_RX_POWER_BEFORE_IQK_A_2);
754 if (!(reg_eac & BIT(27)) &&
755 ((reg_ea4 & 0x03ff0000) != 0x01320000) &&
756 ((reg_eac & 0x03ff0000) != 0x00360000))
759 dev_warn(&priv->udev->dev, "%s: Path A RX IQK failed!\n",
766 static void rtl8188eu_phy_iqcalibrate(struct rtl8xxxu_priv *priv,
767 int result[][8], int t)
769 struct device *dev = &priv->udev->dev;
773 static const u32 adda_regs[RTL8XXXU_ADDA_REGS] = {
774 REG_FPGA0_XCD_SWITCH_CTRL, REG_BLUETOOTH,
775 REG_RX_WAIT_CCA, REG_TX_CCK_RFON,
776 REG_TX_CCK_BBON, REG_TX_OFDM_RFON,
777 REG_TX_OFDM_BBON, REG_TX_TO_RX,
778 REG_TX_TO_TX, REG_RX_CCK,
779 REG_RX_OFDM, REG_RX_WAIT_RIFS,
780 REG_RX_TO_RX, REG_STANDBY,
781 REG_SLEEP, REG_PMPD_ANAEN
783 static const u32 iqk_mac_regs[RTL8XXXU_MAC_REGS] = {
784 REG_TXPAUSE, REG_BEACON_CTRL,
785 REG_BEACON_CTRL_1, REG_GPIO_MUXCFG
787 static const u32 iqk_bb_regs[RTL8XXXU_BB_REGS] = {
788 REG_OFDM0_TRX_PATH_ENABLE, REG_OFDM0_TR_MUX_PAR,
789 REG_FPGA0_XCD_RF_SW_CTRL, REG_CONFIG_ANT_A, REG_CONFIG_ANT_B,
790 REG_FPGA0_XAB_RF_SW_CTRL, REG_FPGA0_XA_RF_INT_OE,
791 REG_FPGA0_XB_RF_INT_OE, REG_CCK0_AFE_SETTING
795 * Note: IQ calibration must be performed after loading
796 * PHY_REG.txt , and radio_a, radio_b.txt
800 /* Save ADDA parameters, turn Path A ADDA on */
801 rtl8xxxu_save_regs(priv, adda_regs, priv->adda_backup,
803 rtl8xxxu_save_mac_regs(priv, iqk_mac_regs, priv->mac_backup);
804 rtl8xxxu_save_regs(priv, iqk_bb_regs,
805 priv->bb_backup, RTL8XXXU_BB_REGS);
808 rtl8xxxu_path_adda_on(priv, adda_regs, true);
811 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_HSSI_PARM1);
812 priv->pi_enabled = u32_get_bits(val32, FPGA0_HSSI_PARM1_PI);
815 if (!priv->pi_enabled) {
816 /* Switch BB to PI mode to do IQ Calibration. */
817 rtl8xxxu_write32(priv, REG_FPGA0_XA_HSSI_PARM1, 0x01000100);
818 rtl8xxxu_write32(priv, REG_FPGA0_XB_HSSI_PARM1, 0x01000100);
822 rtl8xxxu_mac_calibration(priv, iqk_mac_regs, priv->mac_backup);
824 val32 = rtl8xxxu_read32(priv, REG_CCK0_AFE_SETTING);
825 u32p_replace_bits(&val32, 0xf, 0x0f000000);
826 rtl8xxxu_write32(priv, REG_CCK0_AFE_SETTING, val32);
828 rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, 0x03a05600);
829 rtl8xxxu_write32(priv, REG_OFDM0_TR_MUX_PAR, 0x000800e4);
830 rtl8xxxu_write32(priv, REG_FPGA0_XCD_RF_SW_CTRL, 0x22204000);
832 if (!priv->no_pape) {
833 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XAB_RF_SW_CTRL);
834 val32 |= (FPGA0_RF_PAPE |
835 (FPGA0_RF_PAPE << FPGA0_RF_BD_CTRL_SHIFT));
836 rtl8xxxu_write32(priv, REG_FPGA0_XAB_RF_SW_CTRL, val32);
839 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_RF_INT_OE);
841 rtl8xxxu_write32(priv, REG_FPGA0_XA_RF_INT_OE, val32);
842 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XB_RF_INT_OE);
844 rtl8xxxu_write32(priv, REG_FPGA0_XB_RF_INT_OE, val32);
847 rtl8xxxu_write32(priv, REG_CONFIG_ANT_A, 0x0f600000);
849 /* IQ calibration setting */
850 val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
851 u32p_replace_bits(&val32, 0x808000, 0xffffff00);
852 rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
853 rtl8xxxu_write32(priv, REG_TX_IQK, 0x01007c00);
854 rtl8xxxu_write32(priv, REG_RX_IQK, 0x81004800);
856 for (i = 0; i < retry; i++) {
857 path_a_ok = rtl8188eu_iqk_path_a(priv);
858 if (path_a_ok == 0x01) {
859 val32 = rtl8xxxu_read32(priv,
860 REG_TX_POWER_BEFORE_IQK_A);
861 result[t][0] = (val32 >> 16) & 0x3ff;
862 val32 = rtl8xxxu_read32(priv,
863 REG_TX_POWER_AFTER_IQK_A);
864 result[t][1] = (val32 >> 16) & 0x3ff;
870 dev_dbg(dev, "%s: Path A TX IQK failed!\n", __func__);
872 for (i = 0; i < retry; i++) {
873 path_a_ok = rtl8188eu_rx_iqk_path_a(priv);
874 if (path_a_ok == 0x03) {
875 val32 = rtl8xxxu_read32(priv,
876 REG_RX_POWER_BEFORE_IQK_A_2);
877 result[t][2] = (val32 >> 16) & 0x3ff;
878 val32 = rtl8xxxu_read32(priv,
879 REG_RX_POWER_AFTER_IQK_A_2);
880 result[t][3] = (val32 >> 16) & 0x3ff;
887 dev_dbg(dev, "%s: Path A RX IQK failed!\n", __func__);
889 /* Back to BB mode, load original value */
890 val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
891 u32p_replace_bits(&val32, 0, 0xffffff00);
892 rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
897 if (!priv->pi_enabled) {
898 /* Switch back BB to SI mode after finishing IQ Calibration */
899 rtl8xxxu_write32(priv, REG_FPGA0_XA_HSSI_PARM1, 0x01000000);
900 rtl8xxxu_write32(priv, REG_FPGA0_XB_HSSI_PARM1, 0x01000000);
903 /* Reload ADDA power saving parameters */
904 rtl8xxxu_restore_regs(priv, adda_regs, priv->adda_backup,
907 /* Reload MAC parameters */
908 rtl8xxxu_restore_mac_regs(priv, iqk_mac_regs, priv->mac_backup);
910 /* Reload BB parameters */
911 rtl8xxxu_restore_regs(priv, iqk_bb_regs,
912 priv->bb_backup, RTL8XXXU_BB_REGS);
914 /* Restore RX initial gain */
915 rtl8xxxu_write32(priv, REG_FPGA0_XA_LSSI_PARM, 0x00032ed3);
917 /* Load 0xe30 IQC default value */
918 rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x01008c00);
919 rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x01008c00);
922 static void rtl8188eu_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
924 struct device *dev = &priv->udev->dev;
925 int result[4][8]; /* last is final result */
928 u32 reg_e94, reg_e9c, reg_ea4, reg_eac;
929 u32 reg_eb4, reg_ebc, reg_ec4, reg_ecc;
932 memset(result, 0, sizeof(result));
933 result[3][0] = 0x100;
934 result[3][2] = 0x100;
935 result[3][4] = 0x100;
936 result[3][6] = 0x100;
942 for (i = 0; i < 3; i++) {
943 rtl8188eu_phy_iqcalibrate(priv, result, i);
946 simu = rtl8xxxu_simularity_compare(priv,
955 simu = rtl8xxxu_simularity_compare(priv,
962 simu = rtl8xxxu_simularity_compare(priv,
971 if (candidate >= 0) {
972 reg_e94 = result[candidate][0];
973 priv->rege94 = reg_e94;
974 reg_e9c = result[candidate][1];
975 priv->rege9c = reg_e9c;
976 reg_ea4 = result[candidate][2];
977 reg_eac = result[candidate][3];
978 reg_eb4 = result[candidate][4];
979 priv->regeb4 = reg_eb4;
980 reg_ebc = result[candidate][5];
981 priv->regebc = reg_ebc;
982 reg_ec4 = result[candidate][6];
983 reg_ecc = result[candidate][7];
984 dev_dbg(dev, "%s: candidate is %x\n", __func__, candidate);
986 "%s: e94=%x e9c=%x ea4=%x eac=%x eb4=%x ebc=%x ec4=%x ecc=%x\n",
987 __func__, reg_e94, reg_e9c, reg_ea4, reg_eac,
988 reg_eb4, reg_ebc, reg_ec4, reg_ecc);
993 priv->rege94 = 0x100;
994 priv->regeb4 = 0x100;
1001 if (reg_e94 && candidate >= 0)
1002 rtl8xxxu_fill_iqk_matrix_a(priv, path_a_ok, result,
1003 candidate, (reg_ea4 == 0));
1005 rtl8xxxu_save_regs(priv, rtl8xxxu_iqk_phy_iq_bb_reg,
1006 priv->bb_recovery_backup, RTL8XXXU_BB_REGS);
1009 static void rtl8188e_disabled_to_emu(struct rtl8xxxu_priv *priv)
1013 val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
1014 val16 &= ~(APS_FSMCO_HW_SUSPEND | APS_FSMCO_PCIE);
1015 rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
1018 static int rtl8188e_emu_to_active(struct rtl8xxxu_priv *priv)
1025 /* wait till 0x04[17] = 1 power ready*/
1026 for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
1027 val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
1028 if (val32 & BIT(17))
1039 /* reset baseband */
1040 val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC);
1041 val8 &= ~(SYS_FUNC_BBRSTB | SYS_FUNC_BB_GLB_RSTN);
1042 rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
1044 /*0x24[23] = 2b'01 schmit trigger */
1045 val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL);
1047 rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32);
1049 /* 0x04[15] = 0 disable HWPDN (control by DRV)*/
1050 val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
1051 val16 &= ~APS_FSMCO_HW_POWERDOWN;
1052 rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
1054 /*0x04[12:11] = 2b'00 disable WL suspend*/
1055 val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
1056 val16 &= ~(APS_FSMCO_HW_SUSPEND | APS_FSMCO_PCIE);
1057 rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
1059 /* set, then poll until 0 */
1060 val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
1061 val32 |= APS_FSMCO_MAC_ENABLE;
1062 rtl8xxxu_write32(priv, REG_APS_FSMCO, val32);
1064 for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
1065 val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
1066 if ((val32 & APS_FSMCO_MAC_ENABLE) == 0) {
1078 /* LDO normal mode*/
1079 val8 = rtl8xxxu_read8(priv, REG_LPLDO_CTRL);
1081 rtl8xxxu_write8(priv, REG_LPLDO_CTRL, val8);
1087 static int rtl8188eu_active_to_emu(struct rtl8xxxu_priv *priv)
1092 val8 = rtl8xxxu_read8(priv, REG_RF_CTRL);
1094 rtl8xxxu_write8(priv, REG_RF_CTRL, val8);
1096 /* LDO Sleep mode */
1097 val8 = rtl8xxxu_read8(priv, REG_LPLDO_CTRL);
1099 rtl8xxxu_write8(priv, REG_LPLDO_CTRL, val8);
1104 static int rtl8188eu_emu_to_disabled(struct rtl8xxxu_priv *priv)
1110 val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL);
1112 rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32);
1114 val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO);
1115 val16 &= ~APS_FSMCO_PCIE;
1116 val16 |= APS_FSMCO_HW_SUSPEND;
1117 rtl8xxxu_write16(priv, REG_APS_FSMCO, val16);
1119 rtl8xxxu_write8(priv, REG_APS_FSMCO + 3, 0x00);
1121 val8 = rtl8xxxu_read8(priv, REG_GPIO_MUXCFG + 1);
1123 rtl8xxxu_write8(priv, REG_GPIO_MUXCFG + 1, val8);
1125 /* Set USB suspend enable local register 0xfe10[4]=1 */
1126 val8 = rtl8xxxu_read8(priv, 0xfe10);
1128 rtl8xxxu_write8(priv, 0xfe10, val8);
1133 static int rtl8188eu_active_to_lps(struct rtl8xxxu_priv *priv)
1135 struct device *dev = &priv->udev->dev;
1141 rtl8xxxu_write8(priv, REG_TXPAUSE, 0x7f);
1145 /* Poll 32 bit wide REG_SCH_TX_CMD for 0 to ensure no TX is pending. */
1147 val32 = rtl8xxxu_read32(priv, REG_SCH_TX_CMD);
1155 dev_warn(dev, "Failed to flush TX queue\n");
1160 /* Disable CCK and OFDM, clock gated */
1161 val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC);
1162 val8 &= ~SYS_FUNC_BBRSTB;
1163 rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
1168 val16 = rtl8xxxu_read16(priv, REG_CR);
1170 val16 &= ~(CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE | CR_SECURITY_ENABLE);
1171 rtl8xxxu_write16(priv, REG_CR, val16);
1173 val8 = rtl8xxxu_read8(priv, REG_DUAL_TSF_RST);
1174 val8 |= DUAL_TSF_TX_OK;
1175 rtl8xxxu_write8(priv, REG_DUAL_TSF_RST, val8);
1181 static int rtl8188eu_power_on(struct rtl8xxxu_priv *priv)
1186 rtl8188e_disabled_to_emu(priv);
1188 ret = rtl8188e_emu_to_active(priv);
1193 * Enable MAC DMA/WMAC/SCHEDULE/SEC block
1194 * Set CR bit10 to enable 32k calibration.
1195 * We do not set CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE here
1196 * due to a hardware bug in the 88E, requiring those to be
1197 * set after REG_TRXFF_BNDY is set. If not the RXFF bundary
1198 * will get set to a larger buffer size than the real buffer
1201 val16 = (CR_HCI_TXDMA_ENABLE | CR_HCI_RXDMA_ENABLE |
1202 CR_TXDMA_ENABLE | CR_RXDMA_ENABLE |
1203 CR_PROTOCOL_ENABLE | CR_SCHEDULE_ENABLE |
1204 CR_SECURITY_ENABLE | CR_CALTIMER_ENABLE);
1205 rtl8xxxu_write16(priv, REG_CR, val16);
1211 static void rtl8188eu_power_off(struct rtl8xxxu_priv *priv)
1216 rtl8xxxu_flush_fifo(priv);
1218 val8 = rtl8xxxu_read8(priv, REG_TX_REPORT_CTRL);
1219 val8 &= ~TX_REPORT_CTRL_TIMER_ENABLE;
1220 rtl8xxxu_write8(priv, REG_TX_REPORT_CTRL, val8);
1223 rtl8xxxu_write8(priv, REG_RF_CTRL, 0x00);
1225 rtl8188eu_active_to_lps(priv);
1227 /* Reset Firmware if running in RAM */
1228 if (rtl8xxxu_read8(priv, REG_MCU_FW_DL) & MCU_FW_RAM_SEL)
1229 rtl8xxxu_firmware_self_reset(priv);
1232 val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC);
1233 val16 &= ~SYS_FUNC_CPU_ENABLE;
1234 rtl8xxxu_write16(priv, REG_SYS_FUNC, val16);
1236 /* Reset MCU ready status */
1237 rtl8xxxu_write8(priv, REG_MCU_FW_DL, 0x00);
1239 /* 32K_CTRL looks to be very 8188e specific */
1240 val8 = rtl8xxxu_read8(priv, REG_32K_CTRL);
1242 rtl8xxxu_write8(priv, REG_32K_CTRL, val8);
1244 rtl8188eu_active_to_emu(priv);
1245 rtl8188eu_emu_to_disabled(priv);
1247 /* Reset MCU IO Wrapper */
1248 val8 = rtl8xxxu_read8(priv, REG_RSV_CTRL + 1);
1250 rtl8xxxu_write8(priv, REG_RSV_CTRL + 1, val8);
1252 val8 = rtl8xxxu_read8(priv, REG_RSV_CTRL + 1);
1254 rtl8xxxu_write8(priv, REG_RSV_CTRL + 1, val8);
1256 /* Vendor driver refers to GPIO_IN */
1257 val8 = rtl8xxxu_read8(priv, REG_GPIO_PIN_CTRL);
1258 /* Vendor driver refers to GPIO_OUT */
1259 rtl8xxxu_write8(priv, REG_GPIO_PIN_CTRL + 1, val8);
1260 rtl8xxxu_write8(priv, REG_GPIO_PIN_CTRL + 2, 0xff);
1262 val8 = rtl8xxxu_read8(priv, REG_GPIO_IO_SEL);
1263 rtl8xxxu_write8(priv, REG_GPIO_IO_SEL, val8 << 4);
1264 val8 = rtl8xxxu_read8(priv, REG_GPIO_IO_SEL + 1);
1265 rtl8xxxu_write8(priv, REG_GPIO_IO_SEL + 1, val8 | 0x0f);
1268 * Set LNA, TRSW, EX_PA Pin to output mode
1269 * Referred to as REG_BB_PAD_CTRL in 8188eu vendor driver
1271 rtl8xxxu_write32(priv, REG_PAD_CTRL1, 0x00080808);
1273 rtl8xxxu_write8(priv, REG_RSV_CTRL, 0x00);
1275 rtl8xxxu_write32(priv, REG_GPIO_MUXCFG, 0x00000000);
1278 static void rtl8188e_enable_rf(struct rtl8xxxu_priv *priv)
1282 rtl8xxxu_write8(priv, REG_RF_CTRL, RF_ENABLE | RF_RSTB | RF_SDMRSTB);
1284 val32 = rtl8xxxu_read32(priv, REG_OFDM0_TRX_PATH_ENABLE);
1285 val32 &= ~(OFDM_RF_PATH_RX_MASK | OFDM_RF_PATH_TX_MASK);
1286 val32 |= OFDM_RF_PATH_RX_A | OFDM_RF_PATH_TX_A;
1287 rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, val32);
1289 rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00);
1292 static void rtl8188e_disable_rf(struct rtl8xxxu_priv *priv)
1296 val32 = rtl8xxxu_read32(priv, REG_OFDM0_TRX_PATH_ENABLE);
1297 val32 &= ~OFDM_RF_PATH_TX_MASK;
1298 rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, val32);
1300 /* Power down RF module */
1301 rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_AC, 0);
1303 rtl8188eu_active_to_emu(priv);
1306 static void rtl8188e_usb_quirks(struct rtl8xxxu_priv *priv)
1311 * Technically this is not a USB quirk, but a chip quirk.
1312 * This has to be done after REG_TRXFF_BNDY is set, see
1313 * rtl8188eu_power_on() for details.
1315 val16 = rtl8xxxu_read16(priv, REG_CR);
1316 val16 |= (CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE);
1317 rtl8xxxu_write16(priv, REG_CR, val16);
1319 rtl8xxxu_gen2_usb_quirks(priv);
1321 /* Pre-TX enable WEP/TKIP security */
1322 rtl8xxxu_write8(priv, REG_EARLY_MODE_CONTROL_8188E + 3, 0x01);
1325 static s8 rtl8188e_cck_rssi(struct rtl8xxxu_priv *priv, struct rtl8723au_phy_stats *phy_stats)
1327 /* only use lna 0/1/2/3/7 */
1328 static const s8 lna_gain_table_0[8] = {17, -1, -13, -29, -32, -35, -38, -41};
1329 /* only use lna 3/7 */
1330 static const s8 lna_gain_table_1[8] = {29, 20, 12, 3, -6, -15, -24, -33};
1332 u8 cck_agc_rpt = phy_stats->cck_agc_rpt_ofdm_cfosho_a;
1333 s8 rx_pwr_all = 0x00;
1334 u8 vga_idx, lna_idx;
1337 lna_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_LNA_IDX_MASK);
1338 vga_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_VGA_IDX_MASK);
1340 if (priv->chip_cut >= 8) /* cut I */ /* SMIC */
1341 lna_gain = lna_gain_table_0[lna_idx];
1343 lna_gain = lna_gain_table_1[lna_idx];
1345 rx_pwr_all = lna_gain - (2 * vga_idx);
1350 static int rtl8188eu_led_brightness_set(struct led_classdev *led_cdev,
1351 enum led_brightness brightness)
1353 struct rtl8xxxu_priv *priv = container_of(led_cdev,
1354 struct rtl8xxxu_priv,
1356 u8 ledcfg = rtl8xxxu_read8(priv, REG_LEDCFG2);
1358 if (brightness == LED_OFF) {
1359 ledcfg &= ~LEDCFG2_HW_LED_CONTROL;
1360 ledcfg |= LEDCFG2_SW_LED_CONTROL | LEDCFG2_SW_LED_DISABLE;
1361 } else if (brightness == LED_ON) {
1362 ledcfg &= ~(LEDCFG2_HW_LED_CONTROL | LEDCFG2_SW_LED_DISABLE);
1363 ledcfg |= LEDCFG2_SW_LED_CONTROL;
1364 } else if (brightness == RTL8XXXU_HW_LED_CONTROL) {
1365 ledcfg &= ~LEDCFG2_SW_LED_DISABLE;
1366 ledcfg |= LEDCFG2_HW_LED_CONTROL | LEDCFG2_HW_LED_ENABLE;
1369 rtl8xxxu_write8(priv, REG_LEDCFG2, ledcfg);
1374 static void rtl8188e_set_tx_rpt_timing(struct rtl8xxxu_ra_info *ra, u8 timing)
1378 for (idx = 0; idx < 5; idx++)
1379 if (dynamic_tx_rpt_timing[idx] == ra->rpt_time)
1382 if (timing == DEFAULT_TIMING) {
1383 idx = 0; /* 200ms */
1384 } else if (timing == INCREASE_TIMING) {
1387 } else if (timing == DECREASE_TIMING) {
1392 ra->rpt_time = dynamic_tx_rpt_timing[idx];
1395 static void rtl8188e_rate_down(struct rtl8xxxu_ra_info *ra)
1397 u8 rate_id = ra->pre_rate;
1398 u8 lowest_rate = ra->lowest_rate;
1399 u8 highest_rate = ra->highest_rate;
1402 if (rate_id > highest_rate) {
1403 rate_id = highest_rate;
1404 } else if (ra->rate_sgi) {
1406 } else if (rate_id > lowest_rate) {
1408 for (i = rate_id - 1; i >= lowest_rate; i--) {
1409 if (ra->ra_use_rate & BIT(i)) {
1411 goto rate_down_finish;
1415 } else if (rate_id <= lowest_rate) {
1416 rate_id = lowest_rate;
1420 if (ra->ra_waiting_counter == 1) {
1421 ra->ra_waiting_counter++;
1422 ra->ra_pending_counter++;
1423 } else if (ra->ra_waiting_counter > 1) {
1424 ra->ra_waiting_counter = 0;
1425 ra->ra_pending_counter = 0;
1428 if (ra->ra_pending_counter >= 4)
1429 ra->ra_pending_counter = 4;
1431 ra->ra_drop_after_down = 1;
1433 ra->decision_rate = rate_id;
1435 rtl8188e_set_tx_rpt_timing(ra, DECREASE_TIMING);
1438 static void rtl8188e_rate_up(struct rtl8xxxu_ra_info *ra)
1440 u8 rate_id = ra->pre_rate;
1441 u8 highest_rate = ra->highest_rate;
1444 if (ra->ra_waiting_counter == 1) {
1445 ra->ra_waiting_counter = 0;
1446 ra->ra_pending_counter = 0;
1447 } else if (ra->ra_waiting_counter > 1) {
1448 ra->pre_rssi_sta_ra = ra->rssi_sta_ra;
1449 goto rate_up_finish;
1452 rtl8188e_set_tx_rpt_timing(ra, DEFAULT_TIMING);
1454 if (rate_id < highest_rate) {
1455 for (i = rate_id + 1; i <= highest_rate; i++) {
1456 if (ra->ra_use_rate & BIT(i)) {
1458 goto rate_up_finish;
1461 } else if (rate_id == highest_rate) {
1462 if (ra->sgi_enable && !ra->rate_sgi)
1464 else if (!ra->sgi_enable)
1466 } else { /* rate_id > ra->highest_rate */
1467 rate_id = highest_rate;
1471 if (ra->ra_waiting_counter == (4 + pending_for_rate_up_fail[ra->ra_pending_counter]))
1472 ra->ra_waiting_counter = 0;
1474 ra->ra_waiting_counter++;
1476 ra->decision_rate = rate_id;
1479 static void rtl8188e_reset_ra_counter(struct rtl8xxxu_ra_info *ra)
1481 u8 rate_id = ra->decision_rate;
1483 ra->nsc_up = (n_threshold_high[rate_id] + n_threshold_low[rate_id]) >> 1;
1484 ra->nsc_down = (n_threshold_high[rate_id] + n_threshold_low[rate_id]) >> 1;
1487 static void rtl8188e_rate_decision(struct rtl8xxxu_ra_info *ra)
1489 struct rtl8xxxu_priv *priv = container_of(ra, struct rtl8xxxu_priv, ra_info);
1490 const u8 *retry_penalty_idx_0;
1491 const u8 *retry_penalty_idx_1;
1492 const u8 *retry_penalty_up_idx;
1493 u8 rate_id, penalty_id1, penalty_id2;
1499 if (ra->ra_drop_after_down) {
1500 ra->ra_drop_after_down--;
1502 rtl8188e_reset_ra_counter(ra);
1507 if (priv->chip_cut == 8) { /* cut I */
1508 retry_penalty_idx_0 = retry_penalty_idx_cut_i[0];
1509 retry_penalty_idx_1 = retry_penalty_idx_cut_i[1];
1510 retry_penalty_up_idx = retry_penalty_up_idx_cut_i;
1512 retry_penalty_idx_0 = retry_penalty_idx_normal[0];
1513 retry_penalty_idx_1 = retry_penalty_idx_normal[1];
1514 retry_penalty_up_idx = retry_penalty_up_idx_normal;
1517 if (ra->rssi_sta_ra < (ra->pre_rssi_sta_ra - 3) ||
1518 ra->rssi_sta_ra > (ra->pre_rssi_sta_ra + 3)) {
1519 ra->pre_rssi_sta_ra = ra->rssi_sta_ra;
1520 ra->ra_waiting_counter = 0;
1521 ra->ra_pending_counter = 0;
1524 /* Start RA decision */
1525 if (ra->pre_rate > ra->highest_rate)
1526 rate_id = ra->highest_rate;
1528 rate_id = ra->pre_rate;
1531 if (ra->rssi_sta_ra > rssi_threshold[rate_id])
1532 penalty_id1 = retry_penalty_idx_0[rate_id];
1534 penalty_id1 = retry_penalty_idx_1[rate_id];
1536 for (i = 0; i < 5; i++)
1537 ra->nsc_down += ra->retry[i] * retry_penalty[penalty_id1][i];
1539 if (ra->nsc_down > (ra->total * retry_penalty[penalty_id1][5]))
1540 ra->nsc_down -= ra->total * retry_penalty[penalty_id1][5];
1545 penalty_id2 = retry_penalty_up_idx[rate_id];
1547 for (i = 0; i < 5; i++)
1548 ra->nsc_up += ra->retry[i] * retry_penalty[penalty_id2][i];
1550 if (ra->nsc_up > (ra->total * retry_penalty[penalty_id2][5]))
1551 ra->nsc_up -= ra->total * retry_penalty[penalty_id2][5];
1555 if (ra->nsc_down < n_threshold_low[rate_id] ||
1556 ra->drop > dropping_necessary[rate_id]) {
1557 rtl8188e_rate_down(ra);
1559 rtl8xxxu_update_ra_report(&priv->ra_report, ra->decision_rate,
1560 ra->rate_sgi, priv->ra_report.txrate.bw);
1561 } else if (ra->nsc_up > n_threshold_high[rate_id]) {
1562 rtl8188e_rate_up(ra);
1564 rtl8xxxu_update_ra_report(&priv->ra_report, ra->decision_rate,
1565 ra->rate_sgi, priv->ra_report.txrate.bw);
1568 if (ra->decision_rate == ra->pre_rate)
1569 ra->dynamic_tx_rpt_timing_counter++;
1571 ra->dynamic_tx_rpt_timing_counter = 0;
1573 if (ra->dynamic_tx_rpt_timing_counter >= 4) {
1574 /* Rate didn't change 4 times, extend RPT timing */
1575 rtl8188e_set_tx_rpt_timing(ra, INCREASE_TIMING);
1576 ra->dynamic_tx_rpt_timing_counter = 0;
1579 ra->pre_rate = ra->decision_rate;
1581 rtl8188e_reset_ra_counter(ra);
1584 static void rtl8188e_power_training_try_state(struct rtl8xxxu_ra_info *ra)
1586 ra->pt_try_state = 0;
1587 switch (ra->pt_mode_ss) {
1589 if (ra->decision_rate >= DESC_RATE_MCS13)
1590 ra->pt_try_state = 1;
1593 if (ra->decision_rate >= DESC_RATE_MCS5)
1594 ra->pt_try_state = 1;
1597 if (ra->decision_rate >= DESC_RATE_48M)
1598 ra->pt_try_state = 1;
1601 if (ra->decision_rate >= DESC_RATE_11M)
1602 ra->pt_try_state = 1;
1608 if (ra->rssi_sta_ra < 48) {
1610 } else if (ra->pt_try_state == 1) {
1611 if ((ra->pt_stop_count >= 10) ||
1612 (ra->pt_pre_rssi > ra->rssi_sta_ra + 5) ||
1613 (ra->pt_pre_rssi < ra->rssi_sta_ra - 5) ||
1614 (ra->decision_rate != ra->pt_pre_rate)) {
1615 if (ra->pt_stage == 0)
1617 else if (ra->pt_stage == 1)
1622 ra->pt_pre_rssi = ra->rssi_sta_ra;
1623 ra->pt_stop_count = 0;
1626 ra->pt_stop_count++;
1633 ra->pt_pre_rate = ra->decision_rate;
1635 /* TODO: implement the "false alarm" statistics for this */
1636 /* Disable power training when noisy environment */
1637 /* if (p_dm_odm->is_disable_power_training) { */
1641 ra->pt_stop_count = 0;
1645 static void rtl8188e_power_training_decision(struct rtl8xxxu_ra_info *ra)
1654 num_total = ra->total * pt_penalty[5];
1655 for (j = 0; j <= 4; j++) {
1656 numsc += ra->retry[j] * pt_penalty[j];
1658 if (numsc > num_total)
1663 temp_stage = (ra->pt_stage + 1) >> 1;
1665 stage_id = temp_stage - j;
1669 ra->pt_smooth_factor = (ra->pt_smooth_factor >> 1) +
1670 (ra->pt_smooth_factor >> 2) +
1672 if (ra->pt_smooth_factor > 192)
1673 ra->pt_smooth_factor = 192;
1674 stage_id = ra->pt_smooth_factor >> 6;
1675 temp_stage = stage_id * 2;
1676 if (temp_stage != 0)
1680 ra->pt_stage = temp_stage;
1683 void rtl8188e_handle_ra_tx_report2(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
1685 u32 *_rx_desc = (u32 *)(skb->data - sizeof(struct rtl8xxxu_rxdesc16));
1686 struct rtl8xxxu_rxdesc16 *rx_desc = (struct rtl8xxxu_rxdesc16 *)_rx_desc;
1687 struct device *dev = &priv->udev->dev;
1688 struct rtl8xxxu_ra_info *ra = &priv->ra_info;
1689 u32 tx_rpt_len = rx_desc->pktlen & 0x3ff;
1690 u32 items = tx_rpt_len / TX_RPT2_ITEM_SIZE;
1691 u64 macid_valid = ((u64)_rx_desc[5] << 32) | _rx_desc[4];
1693 u8 *rpt = skb->data;
1695 u16 min_rpt_time = 0x927c;
1697 dev_dbg(dev, "%s: len: %d items: %d\n", __func__, tx_rpt_len, items);
1699 /* We only use macid 0, so only the first item is relevant.
1700 * AP mode will use more of them if it's ever implemented.
1702 if (!priv->vif || priv->vif->type == NL80211_IFTYPE_STATION)
1705 for (macid = 0; macid < items; macid++) {
1709 valid = macid_valid & BIT(macid);
1712 ra->retry[0] = le16_to_cpu(*(__le16 *)rpt);
1713 ra->retry[1] = rpt[2];
1714 ra->retry[2] = rpt[3];
1715 ra->retry[3] = rpt[4];
1716 ra->retry[4] = rpt[5];
1718 ra->total = ra->retry[0] + ra->retry[1] + ra->retry[2] +
1719 ra->retry[3] + ra->retry[4] + ra->drop;
1721 if (ra->total > 0) {
1722 if (ra->ra_stage < 5)
1723 rtl8188e_rate_decision(ra);
1724 else if (ra->ra_stage == 5)
1725 rtl8188e_power_training_try_state(ra);
1726 else /* ra->ra_stage == 6 */
1727 rtl8188e_power_training_decision(ra);
1729 if (ra->ra_stage <= 5)
1734 } else if (macid == 0) {
1735 dev_warn(dev, "%s: TX report item 0 not valid\n", __func__);
1738 dev_dbg(dev, "%s: valid: %d retry: %d %d %d %d %d drop: %d\n",
1740 ra->retry[0], ra->retry[1], ra->retry[2],
1741 ra->retry[3], ra->retry[4], ra->drop);
1743 if (min_rpt_time > ra->rpt_time)
1744 min_rpt_time = ra->rpt_time;
1746 rpt += TX_RPT2_ITEM_SIZE;
1749 if (min_rpt_time != ra->pre_min_rpt_time) {
1750 rtl8xxxu_write16(priv, REG_TX_REPORT_TIME, min_rpt_time);
1751 ra->pre_min_rpt_time = min_rpt_time;
1755 static void rtl8188e_arfb_refresh(struct rtl8xxxu_ra_info *ra)
1759 ra->ra_use_rate = ra->rate_mask;
1762 if (ra->ra_use_rate) {
1763 for (i = RATESIZE; i >= 0; i--) {
1764 if (ra->ra_use_rate & BIT(i)) {
1765 ra->highest_rate = i;
1770 ra->highest_rate = 0;
1774 if (ra->ra_use_rate) {
1775 for (i = 0; i < RATESIZE; i++) {
1776 if (ra->ra_use_rate & BIT(i)) {
1777 ra->lowest_rate = i;
1782 ra->lowest_rate = 0;
1785 if (ra->highest_rate > DESC_RATE_MCS7)
1787 else if (ra->highest_rate > DESC_RATE_54M)
1789 else if (ra->highest_rate > DESC_RATE_11M)
1796 rtl8188e_update_rate_mask(struct rtl8xxxu_priv *priv,
1797 u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
1800 struct rtl8xxxu_ra_info *ra = &priv->ra_info;
1802 ra->rate_id = rateid;
1803 ra->rate_mask = ramask;
1804 ra->sgi_enable = sgi;
1806 rtl8188e_arfb_refresh(ra);
1809 static void rtl8188e_ra_set_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi)
1811 priv->ra_info.rssi_sta_ra = rssi;
1814 void rtl8188e_ra_info_init_all(struct rtl8xxxu_ra_info *ra)
1816 ra->decision_rate = DESC_RATE_MCS7;
1817 ra->pre_rate = DESC_RATE_MCS7;
1818 ra->highest_rate = DESC_RATE_MCS7;
1819 ra->lowest_rate = 0;
1821 ra->rate_mask = 0xfffff;
1822 ra->rssi_sta_ra = 0;
1823 ra->pre_rssi_sta_ra = 0;
1825 ra->ra_use_rate = 0xfffff;
1826 ra->nsc_down = (n_threshold_high[DESC_RATE_MCS7] + n_threshold_low[DESC_RATE_MCS7]) / 2;
1827 ra->nsc_up = (n_threshold_high[DESC_RATE_MCS7] + n_threshold_low[DESC_RATE_MCS7]) / 2;
1829 ra->rpt_time = 0x927c;
1837 ra->ra_waiting_counter = 0;
1838 ra->ra_pending_counter = 0;
1839 ra->ra_drop_after_down = 0;
1841 ra->pt_try_state = 0;
1843 ra->pt_smooth_factor = 192;
1844 ra->pt_stop_count = 0;
1845 ra->pt_pre_rate = 0;
1846 ra->pt_pre_rssi = 0;
1851 struct rtl8xxxu_fileops rtl8188eu_fops = {
1852 .identify_chip = rtl8188eu_identify_chip,
1853 .parse_efuse = rtl8188eu_parse_efuse,
1854 .load_firmware = rtl8188eu_load_firmware,
1855 .power_on = rtl8188eu_power_on,
1856 .power_off = rtl8188eu_power_off,
1857 .read_efuse = rtl8xxxu_read_efuse,
1858 .reset_8051 = rtl8188eu_reset_8051,
1859 .llt_init = rtl8xxxu_init_llt_table,
1860 .init_phy_bb = rtl8188eu_init_phy_bb,
1861 .init_phy_rf = rtl8188eu_init_phy_rf,
1862 .phy_lc_calibrate = rtl8723a_phy_lc_calibrate,
1863 .phy_iq_calibrate = rtl8188eu_phy_iq_calibrate,
1864 .config_channel = rtl8188eu_config_channel,
1865 .parse_rx_desc = rtl8xxxu_parse_rxdesc16,
1866 .parse_phystats = rtl8723au_rx_parse_phystats,
1867 .init_aggregation = rtl8188eu_init_aggregation,
1868 .enable_rf = rtl8188e_enable_rf,
1869 .disable_rf = rtl8188e_disable_rf,
1870 .usb_quirks = rtl8188e_usb_quirks,
1871 .set_tx_power = rtl8188f_set_tx_power,
1872 .update_rate_mask = rtl8188e_update_rate_mask,
1873 .report_connect = rtl8xxxu_gen2_report_connect,
1874 .report_rssi = rtl8188e_ra_set_rssi,
1875 .fill_txdesc = rtl8xxxu_fill_txdesc_v3,
1876 .set_crystal_cap = rtl8188f_set_crystal_cap,
1877 .cck_rssi = rtl8188e_cck_rssi,
1878 .led_classdev_brightness_set = rtl8188eu_led_brightness_set,
1879 .writeN_block_size = 128,
1880 .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
1881 .tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
1883 .init_reg_pkt_life_time = 1,
1884 .gen2_thermal_meter = 1,
1885 .adda_1t_init = 0x0b1b25a0,
1886 .adda_1t_path_on = 0x0bdb25a0,
1888 * Use 9K for 8188e normal chip
1889 * Max RX buffer = 10K - max(TxReportSize(64*8), WOLPattern(16*24))
1891 .trxff_boundary = 0x25ff,
1892 .pbp_rx = PBP_PAGE_SIZE_128,
1893 .pbp_tx = PBP_PAGE_SIZE_128,
1894 .mactable = rtl8188e_mac_init_table,
1895 .total_page_num = TX_TOTAL_PAGE_NUM_8188E,
1896 .page_num_hi = TX_PAGE_NUM_HI_PQ_8188E,
1897 .page_num_lo = TX_PAGE_NUM_LO_PQ_8188E,
1898 .page_num_norm = TX_PAGE_NUM_NORM_PQ_8188E,
1899 .last_llt_entry = 175,